{"version":3,"sources":["diff.js","email-obfuscator.js","handlebars-helpers.js","itempicker.js","kendo-grid-utils.js","knock-mapping.js","knockout-isdirty-extender.js","knockout.validation.js","main.js","new-knockout-isdirty.js","parallax.js","question-scripts.js","state-manager.js","theme.js"],"names":["global","factory","exports","module","define","amd","self","Diff","this","buildValues","diff","components","newString","oldString","useLongestToken","componentPos","componentLen","length","newPos","oldPos","component","removed","value","join","slice","count","added","tmp","map","i","oldValue","lastComponent","equals","pop","prototype","options","arguments","undefined","callback","done","setTimeout","castInput","removeEmpty","tokenize","newLen","oldLen","editLength","maxEditLength","bestPath","extractCommon","execEditLength","diagonalPath","basePath","addPath","removePath","_oldPos","canAdd","canRemove","path","pushComponent","exec","ret","last","push","commonCount","left","right","comparator","ignoreCase","toLowerCase","array","split","chars","characterDiff","generateOptions","defaults","name","hasOwnProperty","extendedWordChars","reWhitespace","wordDiff","ignoreWhitespace","test","tokens","splice","lineDiff","diffLines","oldStr","newStr","retLines","linesAndNewlines","line","newlineIsToken","trim","sentenceDiff","cssDiff","_typeof","obj","Symbol","iterator","constructor","_toConsumableArray","arr","Array","isArray","_arrayLikeToArray","_arrayWithoutHoles","iter","from","_iterableToArray","o","minLen","n","Object","toString","call","_unsupportedIterableToArray","TypeError","_nonIterableSpread","len","arr2","objectPrototypeToString","jsonDiff","canonicalize","stack","replacementStack","replacer","key","canonicalizedObj","toJSON","_key","sortedKeys","sort","_this$options","undefinedReplacement","_this$options$stringi","stringifyReplacer","k","v","JSON","stringify","replace","arrayDiff","parsePatch","uniDiff","diffstr","delimiters","match","list","parseIndex","index","header","parseFileHeader","hunks","_line","parseHunk","strict","Error","fileHeader","keyPrefix","data","fileName","substr","chunkHeaderIndex","chunkHeader","hunk","oldStart","oldLines","newStart","newLines","lines","linedelimiters","addCount","removeCount","indexOf","operation","distanceIterator","start","minLine","maxLine","wantForward","backwardExhausted","forwardExhausted","localOffset","applyPatch","source","removeEOFNL","addEOFNL","compareLine","lineNumber","patchContent","errorCount","fuzzFactor","offset","hunkFits","toPos","j","content","diffOffset","_i","_hunk","_toPos","delimiter","previousOperation","_k","structuredPatch","oldFileName","newFileName","oldHeader","newHeader","context","contextLines","entry","oldRangeStart","newRangeStart","curRange","oldLine","newLine","_loop","current","_curRange","prev","apply","_curRange2","_curRange3","contextSize","Math","min","oldEOFNewline","newEOFNewline","noNlBeforeAdds","createTwoFilesPatch","formatPatch","arrayStartsWith","calcLineCount","_calcOldNewLineCount","calcOldNewLineCount","forEach","myCount","mine","theirCount","theirs","loadPatch","param","base","fileNameChanged","patch","selectField","conflict","hunkBefore","check","cloneHunk","mergeLines","mineOffset","mineLines","theirOffset","theirLines","their","insertLeading","mineCurrent","theirCurrent","_hunk$lines","collectChange","_hunk$lines2","removal","mutualChange","insertTrailing","a","b","myChanges","theirChanges","allRemoves","_hunk$lines3","_hunk$lines4","skipRemoveSuperset","_hunk$lines5","swap","_hunk$lines6","state","matchChanges","changes","merged","matchIndex","contextChanges","conflicted","change","collectContext","insert","reduce","removeChanges","delta","changeContent","applyPatches","currentIndex","processIndex","complete","loadFile","err","updatedContent","patched","convertChangesToDMP","convertChangesToXML","s","createPatch","diffArrays","oldArr","newArr","diffChars","diffCss","diffJson","oldObj","newObj","diffSentences","diffTrimmedLines","diffWords","diffWordsWithSpace","merge","mineIndex","theirsIndex","theirsOffset","Infinity","theirsCurrent","mergedHunk","defineProperty","HtmlEncode","result","random","charAt","charCodeAt","UrlEncode","HEX","encoded","charCode","Obfuscate","str","plaintext","e","t","r","u","require","f","code","l","1","2","enumerable","get","styles","modifiers","reset","bold","dim","italic","underline","inverse","hidden","strikethrough","colors","black","red","green","yellow","blue","magenta","cyan","white","gray","bgColors","bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite","grey","keys","groupName","group","styleName","style","open","close","3","cb","thisArg","res","make-iterator","4","flat","cur","5","typeOf","compare","prop","bind","props","opts","args","concat","reverse","get-value","kind-of","6","Buffer","isBuffer","val","Boolean","String","Number","Function","RegExp","Date","type","buffer","is-buffer","7","8","root","attrValueRegex","nameEqualsValueRegex","domainNameRegex","tldRegex","Autolinker","cfg","Util","assign","urls","email","twitter","newWindow","stripPrefix","truncate","className","htmlParser","matchParser","tagBuilder","link","textOrHtml","htmlNodes","getHtmlParser","parse","anchorTagStackCount","resultHtml","node","nodeType","getType","nodeText","getText","getTagName","isClosing","max","linkifiedStr","linkifyStr","getMatchParser","createMatchReturnVal","replaceFnResult","replaceFn","getMatchedText","HtmlTag","getTagBuilder","build","HtmlParser","MatchParser","AnchorTagBuilder","abstractMethod","dest","src","extend","superclass","protoProps","subclass","superclassProto","F","subclassProto","ellipsis","truncateLen","ellipsisChars","substring","element","splitAndCapture","splitRegex","lastIdx","whitespaceRegex","innerHtml","innerHTML","setTagName","tagName","setAttr","attrName","attrValue","getAttrs","getAttr","setAttrs","attrs","tagAttrs","setClass","cssClass","addClass","newClass","classAttr","getClass","classes","newClasses","shift","removeClass","removeClasses","idx","hasClass","setInnerHtml","html","getInnerHtml","attrsStr","buildAttrsStr","attrsArr","createAttrs","getAnchorHref","processAnchorText","getAnchorText","matchType","anchorHref","href","createCssClass","anchorText","doTruncate","POSITIVE_INFINITY","htmlRegex","htmlCharacterEntitiesRegex","currentResult","textAndEntityNodes","lastIndex","nodes","tagText","isClosingTag","inBetweenTagsText","parseTextAndEntityNodes","createElementNode","text","textAndEntityTokens","textToken","entityToken","createTextNode","createEntityNode","ElementNode","closing","EntityNode","TextNode","HtmlNode","matcherRegex","charBeforeProtocolRelMatchRegex","matchValidator","MatchValidator","contextObj","me","matchStr","$1","$2","$3","$4","$5","$6","$7","$8","matchDescObj","processCandidateMatch","replaceStr","prefixStr","suffixStr","twitterMatch","twitterHandlePrefixWhitespaceChar","twitterHandle","emailAddressMatch","urlMatch","protocolUrlMatch","wwwProtocolRelativeMatch","tldProtocolRelativeMatch","protocolRelativeMatch","isValidMatch","matchHasUnbalancedClosingParen","Email","matchedText","Twitter","charBeforeMatch","Url","url","openParensMatch","closeParensMatch","invalidProtocolRelMatchRegex","hasFullProtocolRegex","uriSchemeRegex","hasWordCharAfterProtocolRegex","isValidUriScheme","urlMatchDoesNotHaveProtocolOrDot","urlMatchDoesNotHaveAtLeastOneWordChar","isInvalidProtocolRelativeMatch","uriSchemeMatch","uriScheme","Match","getEmail","getTwitterHandle","urlPrefixRegex","protocolRelativeRegex","protocolPrepended","getUrl","stripProtocolRelativePrefix","stripUrlPrefix","removeTrailingSlash","9","toByteArray","b64","placeHolders","Arr","L","revLookup","fromByteArray","uint8","extraBytes","output","parts","len2","encodeChunk","lookup","Uint8Array","end","num","init","10","braceRe","patternRe","expand","repeat","braces","nodupes","es6","fn","ele","segs","splitWhitespace","esc","exp","pow","exponential","before","segsLength","outter","inner","makeRe","wrap","bash","token","replacement","after","filter","filterEmpty","ch","expand-range","preserve","repeat-element","11","12","base64","ieee754","kMaxLength","TYPED_ARRAY_SUPPORT","createBuffer","that","RangeError","__proto__","arg","encodingOrOffset","allocUnsafe","ArrayBuffer","byteOffset","byteLength","fromArrayLike","fromArrayBuffer","string","encoding","isEncoding","write","fromString","checked","copy","fromObject","assertSize","size","isView","loweredCase","utf8ToBytes","base64ToBytes","m","arrayIndexOf","indexSize","arrLength","valLength","read","buf","readUInt16BE","foundIndex","hexWrite","remaining","strLen","parsed","parseInt","isNaN","asciiWrite","blitBuffer","byteArray","asciiToBytes","base64Slice","utf8Slice","secondByte","thirdByte","fourthByte","tempCodePoint","firstByte","codePoint","bytesPerSequence","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","decodeCodePointsArray","SlowBuffer","alloc","INSPECT_MAX_BYTES","foo","subarray","typedArraySupport","poolSize","_augment","species","configurable","fill","allocUnsafeSlow","_isBuffer","x","y","pos","swap16","swap32","hexSlice","asciiSlice","binarySlice","utf16leSlice","inspect","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","units","c","hi","lo","utf16leToBytes","_arr","out","toHex","bytes","checkOffset","ext","checkInt","objectWriteUInt16","littleEndian","objectWriteUInt32","checkIEEE754","writeFloat","noAssert","writeDouble","newBuf","sliceLen","readUIntLE","mul","readUIntBE","readUInt8","readUInt16LE","readUInt32LE","readUInt32BE","readIntLE","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUIntLE","writeUIntBE","writeUInt8","floor","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","set","INVALID_BASE64_RE","leadSurrogate","base64clean","dst","window","base64-js","isarray","13","process","escapeStringRegexp","ansiStyles","stripAnsi","hasAnsi","supportsColor","defineProps","defineProperties","isSimpleWindowsTerm","platform","env","TERM","Chalk","enabled","closeRe","_styles","proto","builder","argsLen","nestedStyles","originalDim","hasColor","stripColor","_process","ansi-styles","escape-string-regexp","has-ansi","strip-ansi","supports-color","14","utils","frame","_parent","./utils","15","cache","proxy","mod","getter","_","toUpperCase","UNLAZY","16","lazy","lazy-cache","17","./lib/parser","18","date","_changed","clone","changed","second","seconds","update","minute","minutes","hour","hours","day","days","week","weeks","month","d","getDate","setDate","getMonth","setMonth","daysInMonth","yr","leap","getFullYear","year","setFullYear","time","h","meridiem","getHours","getMinutes","getSeconds","setHours","updateDay","getDay","ms","getTime","debug","19","months","rMeridiem","rHourMinute","rAtHour","rDays","rMonths","rPast","rDayMod","rAgo","parser","original","stash","advance","nextTime","tok","eos","space","_next","dayByName","monthByName","timeAgo","ago","yesterday","tomorrow","noon","midnight","night","evening","afternoon","morning","tonight","hourminute","athour","number","other","lookahead","fetch","peek","next","stashed","skip","captures","_meridiem","orig","./date","20","fmt","message","curr","humanize","console","log","names","skips","enable","localStorage","disable","toFixed","21","isDescriptor","writable","is-descriptor","22","punycode","entities","ucs2","encode","hasSemi","withoutSemi","./entities.json","23","revEntities","numeric","named","special","\"","'","<",">","&","decode","cc","./reversed.json","24","Aacute;","Aacute","aacute;","aacute","Abreve;","abreve;","ac;","acd;","acE;","Acirc;","Acirc","acirc;","acirc","acute;","acute","Acy;","acy;","AElig;","AElig","aelig;","aelig","af;","Afr;","afr;","Agrave;","Agrave","agrave;","agrave","alefsym;","aleph;","Alpha;","alpha;","Amacr;","amacr;","amalg;","AMP;","AMP","amp;","amp","And;","and;","andand;","andd;","andslope;","andv;","ang;","ange;","angle;","angmsd;","angmsdaa;","angmsdab;","angmsdac;","angmsdad;","angmsdae;","angmsdaf;","angmsdag;","angmsdah;","angrt;","angrtvb;","angrtvbd;","angsph;","angst;","angzarr;","Aogon;","aogon;","Aopf;","aopf;","ap;","apacir;","apE;","ape;","apid;","apos;","ApplyFunction;","approx;","approxeq;","Aring;","Aring","aring;","aring","Ascr;","ascr;","Assign;","ast;","asymp;","asympeq;","Atilde;","Atilde","atilde;","atilde","Auml;","Auml","auml;","auml","awconint;","awint;","backcong;","backepsilon;","backprime;","backsim;","backsimeq;","Backslash;","Barv;","barvee;","Barwed;","barwed;","barwedge;","bbrk;","bbrktbrk;","bcong;","Bcy;","bcy;","bdquo;","becaus;","Because;","because;","bemptyv;","bepsi;","bernou;","Bernoullis;","Beta;","beta;","beth;","between;","Bfr;","bfr;","bigcap;","bigcirc;","bigcup;","bigodot;","bigoplus;","bigotimes;","bigsqcup;","bigstar;","bigtriangledown;","bigtriangleup;","biguplus;","bigvee;","bigwedge;","bkarow;","blacklozenge;","blacksquare;","blacktriangle;","blacktriangledown;","blacktriangleleft;","blacktriangleright;","blank;","blk12;","blk14;","blk34;","block;","bne;","bnequiv;","bNot;","bnot;","Bopf;","bopf;","bot;","bottom;","bowtie;","boxbox;","boxDL;","boxDl;","boxdL;","boxdl;","boxDR;","boxDr;","boxdR;","boxdr;","boxH;","boxh;","boxHD;","boxHd;","boxhD;","boxhd;","boxHU;","boxHu;","boxhU;","boxhu;","boxminus;","boxplus;","boxtimes;","boxUL;","boxUl;","boxuL;","boxul;","boxUR;","boxUr;","boxuR;","boxur;","boxV;","boxv;","boxVH;","boxVh;","boxvH;","boxvh;","boxVL;","boxVl;","boxvL;","boxvl;","boxVR;","boxVr;","boxvR;","boxvr;","bprime;","Breve;","breve;","brvbar;","brvbar","Bscr;","bscr;","bsemi;","bsim;","bsime;","bsol;","bsolb;","bsolhsub;","bull;","bullet;","bump;","bumpE;","bumpe;","Bumpeq;","bumpeq;","Cacute;","cacute;","Cap;","cap;","capand;","capbrcup;","capcap;","capcup;","capdot;","CapitalDifferentialD;","caps;","caret;","caron;","Cayleys;","ccaps;","Ccaron;","ccaron;","Ccedil;","Ccedil","ccedil;","ccedil","Ccirc;","ccirc;","Cconint;","ccups;","ccupssm;","Cdot;","cdot;","cedil;","cedil","Cedilla;","cemptyv;","cent;","cent","CenterDot;","centerdot;","Cfr;","cfr;","CHcy;","chcy;","check;","checkmark;","Chi;","chi;","cir;","circ;","circeq;","circlearrowleft;","circlearrowright;","circledast;","circledcirc;","circleddash;","CircleDot;","circledR;","circledS;","CircleMinus;","CirclePlus;","CircleTimes;","cirE;","cire;","cirfnint;","cirmid;","cirscir;","ClockwiseContourIntegral;","CloseCurlyDoubleQuote;","CloseCurlyQuote;","clubs;","clubsuit;","Colon;","colon;","Colone;","colone;","coloneq;","comma;","commat;","comp;","compfn;","complement;","complexes;","cong;","congdot;","Congruent;","Conint;","conint;","ContourIntegral;","Copf;","copf;","coprod;","Coproduct;","COPY;","COPY","copy;","copysr;","CounterClockwiseContourIntegral;","crarr;","Cross;","cross;","Cscr;","cscr;","csub;","csube;","csup;","csupe;","ctdot;","cudarrl;","cudarrr;","cuepr;","cuesc;","cularr;","cularrp;","Cup;","cup;","cupbrcap;","CupCap;","cupcap;","cupcup;","cupdot;","cupor;","cups;","curarr;","curarrm;","curlyeqprec;","curlyeqsucc;","curlyvee;","curlywedge;","curren;","curren","curvearrowleft;","curvearrowright;","cuvee;","cuwed;","cwconint;","cwint;","cylcty;","Dagger;","dagger;","daleth;","Darr;","dArr;","darr;","dash;","Dashv;","dashv;","dbkarow;","dblac;","Dcaron;","dcaron;","Dcy;","dcy;","DD;","dd;","ddagger;","ddarr;","DDotrahd;","ddotseq;","deg;","deg","Del;","Delta;","delta;","demptyv;","dfisht;","Dfr;","dfr;","dHar;","dharl;","dharr;","DiacriticalAcute;","DiacriticalDot;","DiacriticalDoubleAcute;","DiacriticalGrave;","DiacriticalTilde;","diam;","Diamond;","diamond;","diamondsuit;","diams;","die;","DifferentialD;","digamma;","disin;","div;","divide;","divide","divideontimes;","divonx;","DJcy;","djcy;","dlcorn;","dlcrop;","dollar;","Dopf;","dopf;","Dot;","dot;","DotDot;","doteq;","doteqdot;","DotEqual;","dotminus;","dotplus;","dotsquare;","doublebarwedge;","DoubleContourIntegral;","DoubleDot;","DoubleDownArrow;","DoubleLeftArrow;","DoubleLeftRightArrow;","DoubleLeftTee;","DoubleLongLeftArrow;","DoubleLongLeftRightArrow;","DoubleLongRightArrow;","DoubleRightArrow;","DoubleRightTee;","DoubleUpArrow;","DoubleUpDownArrow;","DoubleVerticalBar;","DownArrow;","Downarrow;","downarrow;","DownArrowBar;","DownArrowUpArrow;","DownBreve;","downdownarrows;","downharpoonleft;","downharpoonright;","DownLeftRightVector;","DownLeftTeeVector;","DownLeftVector;","DownLeftVectorBar;","DownRightTeeVector;","DownRightVector;","DownRightVectorBar;","DownTee;","DownTeeArrow;","drbkarow;","drcorn;","drcrop;","Dscr;","dscr;","DScy;","dscy;","dsol;","Dstrok;","dstrok;","dtdot;","dtri;","dtrif;","duarr;","duhar;","dwangle;","DZcy;","dzcy;","dzigrarr;","Eacute;","Eacute","eacute;","eacute","easter;","Ecaron;","ecaron;","ecir;","Ecirc;","Ecirc","ecirc;","ecirc","ecolon;","Ecy;","ecy;","eDDot;","Edot;","eDot;","edot;","ee;","efDot;","Efr;","efr;","eg;","Egrave;","Egrave","egrave;","egrave","egs;","egsdot;","el;","Element;","elinters;","ell;","els;","elsdot;","Emacr;","emacr;","empty;","emptyset;","EmptySmallSquare;","emptyv;","EmptyVerySmallSquare;","emsp;","emsp13;","emsp14;","ENG;","eng;","ensp;","Eogon;","eogon;","Eopf;","eopf;","epar;","eparsl;","eplus;","epsi;","Epsilon;","epsilon;","epsiv;","eqcirc;","eqcolon;","eqsim;","eqslantgtr;","eqslantless;","Equal;","equals;","EqualTilde;","equest;","Equilibrium;","equiv;","equivDD;","eqvparsl;","erarr;","erDot;","Escr;","escr;","esdot;","Esim;","esim;","Eta;","eta;","ETH;","ETH","eth;","eth","Euml;","Euml","euml;","euml","euro;","excl;","exist;","Exists;","expectation;","ExponentialE;","exponentiale;","fallingdotseq;","Fcy;","fcy;","female;","ffilig;","fflig;","ffllig;","Ffr;","ffr;","filig;","FilledSmallSquare;","FilledVerySmallSquare;","fjlig;","flat;","fllig;","fltns;","fnof;","Fopf;","fopf;","ForAll;","forall;","fork;","forkv;","Fouriertrf;","fpartint;","frac12;","frac12","frac13;","frac14;","frac14","frac15;","frac16;","frac18;","frac23;","frac25;","frac34;","frac34","frac35;","frac38;","frac45;","frac56;","frac58;","frac78;","frasl;","frown;","Fscr;","fscr;","gacute;","Gamma;","gamma;","Gammad;","gammad;","gap;","Gbreve;","gbreve;","Gcedil;","Gcirc;","gcirc;","Gcy;","gcy;","Gdot;","gdot;","gE;","ge;","gEl;","gel;","geq;","geqq;","geqslant;","ges;","gescc;","gesdot;","gesdoto;","gesdotol;","gesl;","gesles;","Gfr;","gfr;","Gg;","gg;","ggg;","gimel;","GJcy;","gjcy;","gl;","gla;","glE;","glj;","gnap;","gnapprox;","gnE;","gne;","gneq;","gneqq;","gnsim;","Gopf;","gopf;","grave;","GreaterEqual;","GreaterEqualLess;","GreaterFullEqual;","GreaterGreater;","GreaterLess;","GreaterSlantEqual;","GreaterTilde;","Gscr;","gscr;","gsim;","gsime;","gsiml;","GT;","GT","Gt;","gt;","gt","gtcc;","gtcir;","gtdot;","gtlPar;","gtquest;","gtrapprox;","gtrarr;","gtrdot;","gtreqless;","gtreqqless;","gtrless;","gtrsim;","gvertneqq;","gvnE;","Hacek;","hairsp;","half;","hamilt;","HARDcy;","hardcy;","hArr;","harr;","harrcir;","harrw;","Hat;","hbar;","Hcirc;","hcirc;","hearts;","heartsuit;","hellip;","hercon;","Hfr;","hfr;","HilbertSpace;","hksearow;","hkswarow;","hoarr;","homtht;","hookleftarrow;","hookrightarrow;","Hopf;","hopf;","horbar;","HorizontalLine;","Hscr;","hscr;","hslash;","Hstrok;","hstrok;","HumpDownHump;","HumpEqual;","hybull;","hyphen;","Iacute;","Iacute","iacute;","iacute","ic;","Icirc;","Icirc","icirc;","icirc","Icy;","icy;","Idot;","IEcy;","iecy;","iexcl;","iexcl","iff;","Ifr;","ifr;","Igrave;","Igrave","igrave;","igrave","ii;","iiiint;","iiint;","iinfin;","iiota;","IJlig;","ijlig;","Im;","Imacr;","imacr;","image;","ImaginaryI;","imagline;","imagpart;","imath;","imof;","imped;","Implies;","in;","incare;","infin;","infintie;","inodot;","Int;","int;","intcal;","integers;","Integral;","intercal;","Intersection;","intlarhk;","intprod;","InvisibleComma;","InvisibleTimes;","IOcy;","iocy;","Iogon;","iogon;","Iopf;","iopf;","Iota;","iota;","iprod;","iquest;","iquest","Iscr;","iscr;","isin;","isindot;","isinE;","isins;","isinsv;","isinv;","it;","Itilde;","itilde;","Iukcy;","iukcy;","Iuml;","Iuml","iuml;","iuml","Jcirc;","jcirc;","Jcy;","jcy;","Jfr;","jfr;","jmath;","Jopf;","jopf;","Jscr;","jscr;","Jsercy;","jsercy;","Jukcy;","jukcy;","Kappa;","kappa;","kappav;","Kcedil;","kcedil;","Kcy;","kcy;","Kfr;","kfr;","kgreen;","KHcy;","khcy;","KJcy;","kjcy;","Kopf;","kopf;","Kscr;","kscr;","lAarr;","Lacute;","lacute;","laemptyv;","lagran;","Lambda;","lambda;","Lang;","lang;","langd;","langle;","lap;","Laplacetrf;","laquo;","laquo","Larr;","lArr;","larr;","larrb;","larrbfs;","larrfs;","larrhk;","larrlp;","larrpl;","larrsim;","larrtl;","lat;","lAtail;","latail;","late;","lates;","lBarr;","lbarr;","lbbrk;","lbrace;","lbrack;","lbrke;","lbrksld;","lbrkslu;","Lcaron;","lcaron;","Lcedil;","lcedil;","lceil;","lcub;","Lcy;","lcy;","ldca;","ldquo;","ldquor;","ldrdhar;","ldrushar;","ldsh;","lE;","le;","LeftAngleBracket;","LeftArrow;","Leftarrow;","leftarrow;","LeftArrowBar;","LeftArrowRightArrow;","leftarrowtail;","LeftCeiling;","LeftDoubleBracket;","LeftDownTeeVector;","LeftDownVector;","LeftDownVectorBar;","LeftFloor;","leftharpoondown;","leftharpoonup;","leftleftarrows;","LeftRightArrow;","Leftrightarrow;","leftrightarrow;","leftrightarrows;","leftrightharpoons;","leftrightsquigarrow;","LeftRightVector;","LeftTee;","LeftTeeArrow;","LeftTeeVector;","leftthreetimes;","LeftTriangle;","LeftTriangleBar;","LeftTriangleEqual;","LeftUpDownVector;","LeftUpTeeVector;","LeftUpVector;","LeftUpVectorBar;","LeftVector;","LeftVectorBar;","lEg;","leg;","leq;","leqq;","leqslant;","les;","lescc;","lesdot;","lesdoto;","lesdotor;","lesg;","lesges;","lessapprox;","lessdot;","lesseqgtr;","lesseqqgtr;","LessEqualGreater;","LessFullEqual;","LessGreater;","lessgtr;","LessLess;","lesssim;","LessSlantEqual;","LessTilde;","lfisht;","lfloor;","Lfr;","lfr;","lg;","lgE;","lHar;","lhard;","lharu;","lharul;","lhblk;","LJcy;","ljcy;","Ll;","ll;","llarr;","llcorner;","Lleftarrow;","llhard;","lltri;","Lmidot;","lmidot;","lmoust;","lmoustache;","lnap;","lnapprox;","lnE;","lne;","lneq;","lneqq;","lnsim;","loang;","loarr;","lobrk;","LongLeftArrow;","Longleftarrow;","longleftarrow;","LongLeftRightArrow;","Longleftrightarrow;","longleftrightarrow;","longmapsto;","LongRightArrow;","Longrightarrow;","longrightarrow;","looparrowleft;","looparrowright;","lopar;","Lopf;","lopf;","loplus;","lotimes;","lowast;","lowbar;","LowerLeftArrow;","LowerRightArrow;","loz;","lozenge;","lozf;","lpar;","lparlt;","lrarr;","lrcorner;","lrhar;","lrhard;","lrm;","lrtri;","lsaquo;","Lscr;","lscr;","Lsh;","lsh;","lsim;","lsime;","lsimg;","lsqb;","lsquo;","lsquor;","Lstrok;","lstrok;","LT;","LT","Lt;","lt;","lt","ltcc;","ltcir;","ltdot;","lthree;","ltimes;","ltlarr;","ltquest;","ltri;","ltrie;","ltrif;","ltrPar;","lurdshar;","luruhar;","lvertneqq;","lvnE;","macr;","macr","male;","malt;","maltese;","Map;","map;","mapsto;","mapstodown;","mapstoleft;","mapstoup;","marker;","mcomma;","Mcy;","mcy;","mdash;","mDDot;","measuredangle;","MediumSpace;","Mellintrf;","Mfr;","mfr;","mho;","micro;","micro","mid;","midast;","midcir;","middot;","middot","minus;","minusb;","minusd;","minusdu;","MinusPlus;","mlcp;","mldr;","mnplus;","models;","Mopf;","mopf;","mp;","Mscr;","mscr;","mstpos;","Mu;","mu;","multimap;","mumap;","nabla;","Nacute;","nacute;","nang;","nap;","napE;","napid;","napos;","napprox;","natur;","natural;","naturals;","nbsp;","nbsp","nbump;","nbumpe;","ncap;","Ncaron;","ncaron;","Ncedil;","ncedil;","ncong;","ncongdot;","ncup;","Ncy;","ncy;","ndash;","ne;","nearhk;","neArr;","nearr;","nearrow;","nedot;","NegativeMediumSpace;","NegativeThickSpace;","NegativeThinSpace;","NegativeVeryThinSpace;","nequiv;","nesear;","nesim;","NestedGreaterGreater;","NestedLessLess;","NewLine;","nexist;","nexists;","Nfr;","nfr;","ngE;","nge;","ngeq;","ngeqq;","ngeqslant;","nges;","nGg;","ngsim;","nGt;","ngt;","ngtr;","nGtv;","nhArr;","nharr;","nhpar;","ni;","nis;","nisd;","niv;","NJcy;","njcy;","nlArr;","nlarr;","nldr;","nlE;","nle;","nLeftarrow;","nleftarrow;","nLeftrightarrow;","nleftrightarrow;","nleq;","nleqq;","nleqslant;","nles;","nless;","nLl;","nlsim;","nLt;","nlt;","nltri;","nltrie;","nLtv;","nmid;","NoBreak;","NonBreakingSpace;","Nopf;","nopf;","Not;","not;","not","NotCongruent;","NotCupCap;","NotDoubleVerticalBar;","NotElement;","NotEqual;","NotEqualTilde;","NotExists;","NotGreater;","NotGreaterEqual;","NotGreaterFullEqual;","NotGreaterGreater;","NotGreaterLess;","NotGreaterSlantEqual;","NotGreaterTilde;","NotHumpDownHump;","NotHumpEqual;","notin;","notindot;","notinE;","notinva;","notinvb;","notinvc;","NotLeftTriangle;","NotLeftTriangleBar;","NotLeftTriangleEqual;","NotLess;","NotLessEqual;","NotLessGreater;","NotLessLess;","NotLessSlantEqual;","NotLessTilde;","NotNestedGreaterGreater;","NotNestedLessLess;","notni;","notniva;","notnivb;","notnivc;","NotPrecedes;","NotPrecedesEqual;","NotPrecedesSlantEqual;","NotReverseElement;","NotRightTriangle;","NotRightTriangleBar;","NotRightTriangleEqual;","NotSquareSubset;","NotSquareSubsetEqual;","NotSquareSuperset;","NotSquareSupersetEqual;","NotSubset;","NotSubsetEqual;","NotSucceeds;","NotSucceedsEqual;","NotSucceedsSlantEqual;","NotSucceedsTilde;","NotSuperset;","NotSupersetEqual;","NotTilde;","NotTildeEqual;","NotTildeFullEqual;","NotTildeTilde;","NotVerticalBar;","npar;","nparallel;","nparsl;","npart;","npolint;","npr;","nprcue;","npre;","nprec;","npreceq;","nrArr;","nrarr;","nrarrc;","nrarrw;","nRightarrow;","nrightarrow;","nrtri;","nrtrie;","nsc;","nsccue;","nsce;","Nscr;","nscr;","nshortmid;","nshortparallel;","nsim;","nsime;","nsimeq;","nsmid;","nspar;","nsqsube;","nsqsupe;","nsub;","nsubE;","nsube;","nsubset;","nsubseteq;","nsubseteqq;","nsucc;","nsucceq;","nsup;","nsupE;","nsupe;","nsupset;","nsupseteq;","nsupseteqq;","ntgl;","Ntilde;","Ntilde","ntilde;","ntilde","ntlg;","ntriangleleft;","ntrianglelefteq;","ntriangleright;","ntrianglerighteq;","Nu;","nu;","num;","numero;","numsp;","nvap;","nVDash;","nVdash;","nvDash;","nvdash;","nvge;","nvgt;","nvHarr;","nvinfin;","nvlArr;","nvle;","nvlt;","nvltrie;","nvrArr;","nvrtrie;","nvsim;","nwarhk;","nwArr;","nwarr;","nwarrow;","nwnear;","Oacute;","Oacute","oacute;","oacute","oast;","ocir;","Ocirc;","Ocirc","ocirc;","ocirc","Ocy;","ocy;","odash;","Odblac;","odblac;","odiv;","odot;","odsold;","OElig;","oelig;","ofcir;","Ofr;","ofr;","ogon;","Ograve;","Ograve","ograve;","ograve","ogt;","ohbar;","ohm;","oint;","olarr;","olcir;","olcross;","oline;","olt;","Omacr;","omacr;","Omega;","omega;","Omicron;","omicron;","omid;","ominus;","Oopf;","oopf;","opar;","OpenCurlyDoubleQuote;","OpenCurlyQuote;","operp;","oplus;","Or;","or;","orarr;","ord;","order;","orderof;","ordf;","ordf","ordm;","ordm","origof;","oror;","orslope;","orv;","oS;","Oscr;","oscr;","Oslash;","Oslash","oslash;","oslash","osol;","Otilde;","Otilde","otilde;","otilde","Otimes;","otimes;","otimesas;","Ouml;","Ouml","ouml;","ouml","ovbar;","OverBar;","OverBrace;","OverBracket;","OverParenthesis;","par;","para;","para","parallel;","parsim;","parsl;","part;","PartialD;","Pcy;","pcy;","percnt;","period;","permil;","perp;","pertenk;","Pfr;","pfr;","Phi;","phi;","phiv;","phmmat;","phone;","Pi;","pi;","pitchfork;","piv;","planck;","planckh;","plankv;","plus;","plusacir;","plusb;","pluscir;","plusdo;","plusdu;","pluse;","PlusMinus;","plusmn;","plusmn","plussim;","plustwo;","pm;","Poincareplane;","pointint;","Popf;","popf;","pound;","pound","Pr;","pr;","prap;","prcue;","prE;","pre;","prec;","precapprox;","preccurlyeq;","Precedes;","PrecedesEqual;","PrecedesSlantEqual;","PrecedesTilde;","preceq;","precnapprox;","precneqq;","precnsim;","precsim;","Prime;","prime;","primes;","prnap;","prnE;","prnsim;","prod;","Product;","profalar;","profline;","profsurf;","prop;","Proportion;","Proportional;","propto;","prsim;","prurel;","Pscr;","pscr;","Psi;","psi;","puncsp;","Qfr;","qfr;","qint;","Qopf;","qopf;","qprime;","Qscr;","qscr;","quaternions;","quatint;","quest;","questeq;","QUOT;","QUOT","quot;","quot","rAarr;","race;","Racute;","racute;","radic;","raemptyv;","Rang;","rang;","rangd;","range;","rangle;","raquo;","raquo","Rarr;","rArr;","rarr;","rarrap;","rarrb;","rarrbfs;","rarrc;","rarrfs;","rarrhk;","rarrlp;","rarrpl;","rarrsim;","Rarrtl;","rarrtl;","rarrw;","rAtail;","ratail;","ratio;","rationals;","RBarr;","rBarr;","rbarr;","rbbrk;","rbrace;","rbrack;","rbrke;","rbrksld;","rbrkslu;","Rcaron;","rcaron;","Rcedil;","rcedil;","rceil;","rcub;","Rcy;","rcy;","rdca;","rdldhar;","rdquo;","rdquor;","rdsh;","Re;","real;","realine;","realpart;","reals;","rect;","REG;","REG","reg;","reg","ReverseElement;","ReverseEquilibrium;","ReverseUpEquilibrium;","rfisht;","rfloor;","Rfr;","rfr;","rHar;","rhard;","rharu;","rharul;","Rho;","rho;","rhov;","RightAngleBracket;","RightArrow;","Rightarrow;","rightarrow;","RightArrowBar;","RightArrowLeftArrow;","rightarrowtail;","RightCeiling;","RightDoubleBracket;","RightDownTeeVector;","RightDownVector;","RightDownVectorBar;","RightFloor;","rightharpoondown;","rightharpoonup;","rightleftarrows;","rightleftharpoons;","rightrightarrows;","rightsquigarrow;","RightTee;","RightTeeArrow;","RightTeeVector;","rightthreetimes;","RightTriangle;","RightTriangleBar;","RightTriangleEqual;","RightUpDownVector;","RightUpTeeVector;","RightUpVector;","RightUpVectorBar;","RightVector;","RightVectorBar;","ring;","risingdotseq;","rlarr;","rlhar;","rlm;","rmoust;","rmoustache;","rnmid;","roang;","roarr;","robrk;","ropar;","Ropf;","ropf;","roplus;","rotimes;","RoundImplies;","rpar;","rpargt;","rppolint;","rrarr;","Rrightarrow;","rsaquo;","Rscr;","rscr;","Rsh;","rsh;","rsqb;","rsquo;","rsquor;","rthree;","rtimes;","rtri;","rtrie;","rtrif;","rtriltri;","RuleDelayed;","ruluhar;","rx;","Sacute;","sacute;","sbquo;","Sc;","sc;","scap;","Scaron;","scaron;","sccue;","scE;","sce;","Scedil;","scedil;","Scirc;","scirc;","scnap;","scnE;","scnsim;","scpolint;","scsim;","Scy;","scy;","sdot;","sdotb;","sdote;","searhk;","seArr;","searr;","searrow;","sect;","sect","semi;","seswar;","setminus;","setmn;","sext;","Sfr;","sfr;","sfrown;","sharp;","SHCHcy;","shchcy;","SHcy;","shcy;","ShortDownArrow;","ShortLeftArrow;","shortmid;","shortparallel;","ShortRightArrow;","ShortUpArrow;","shy;","shy","Sigma;","sigma;","sigmaf;","sigmav;","sim;","simdot;","sime;","simeq;","simg;","simgE;","siml;","simlE;","simne;","simplus;","simrarr;","slarr;","SmallCircle;","smallsetminus;","smashp;","smeparsl;","smid;","smile;","smt;","smte;","smtes;","SOFTcy;","softcy;","sol;","solb;","solbar;","Sopf;","sopf;","spades;","spadesuit;","spar;","sqcap;","sqcaps;","sqcup;","sqcups;","Sqrt;","sqsub;","sqsube;","sqsubset;","sqsubseteq;","sqsup;","sqsupe;","sqsupset;","sqsupseteq;","squ;","Square;","square;","SquareIntersection;","SquareSubset;","SquareSubsetEqual;","SquareSuperset;","SquareSupersetEqual;","SquareUnion;","squarf;","squf;","srarr;","Sscr;","sscr;","ssetmn;","ssmile;","sstarf;","Star;","star;","starf;","straightepsilon;","straightphi;","strns;","Sub;","sub;","subdot;","subE;","sube;","subedot;","submult;","subnE;","subne;","subplus;","subrarr;","Subset;","subset;","subseteq;","subseteqq;","SubsetEqual;","subsetneq;","subsetneqq;","subsim;","subsub;","subsup;","succ;","succapprox;","succcurlyeq;","Succeeds;","SucceedsEqual;","SucceedsSlantEqual;","SucceedsTilde;","succeq;","succnapprox;","succneqq;","succnsim;","succsim;","SuchThat;","Sum;","sum;","sung;","Sup;","sup;","sup1;","sup1","sup2;","sup2","sup3;","sup3","supdot;","supdsub;","supE;","supe;","supedot;","Superset;","SupersetEqual;","suphsol;","suphsub;","suplarr;","supmult;","supnE;","supne;","supplus;","Supset;","supset;","supseteq;","supseteqq;","supsetneq;","supsetneqq;","supsim;","supsub;","supsup;","swarhk;","swArr;","swarr;","swarrow;","swnwar;","szlig;","szlig","Tab;","target;","Tau;","tau;","tbrk;","Tcaron;","tcaron;","Tcedil;","tcedil;","Tcy;","tcy;","tdot;","telrec;","Tfr;","tfr;","there4;","Therefore;","therefore;","Theta;","theta;","thetasym;","thetav;","thickapprox;","thicksim;","ThickSpace;","thinsp;","ThinSpace;","thkap;","thksim;","THORN;","THORN","thorn;","thorn","Tilde;","tilde;","TildeEqual;","TildeFullEqual;","TildeTilde;","times;","times","timesb;","timesbar;","timesd;","tint;","toea;","top;","topbot;","topcir;","Topf;","topf;","topfork;","tosa;","tprime;","TRADE;","trade;","triangle;","triangledown;","triangleleft;","trianglelefteq;","triangleq;","triangleright;","trianglerighteq;","tridot;","trie;","triminus;","TripleDot;","triplus;","trisb;","tritime;","trpezium;","Tscr;","tscr;","TScy;","tscy;","TSHcy;","tshcy;","Tstrok;","tstrok;","twixt;","twoheadleftarrow;","twoheadrightarrow;","Uacute;","Uacute","uacute;","uacute","Uarr;","uArr;","uarr;","Uarrocir;","Ubrcy;","ubrcy;","Ubreve;","ubreve;","Ucirc;","Ucirc","ucirc;","ucirc","Ucy;","ucy;","udarr;","Udblac;","udblac;","udhar;","ufisht;","Ufr;","ufr;","Ugrave;","Ugrave","ugrave;","ugrave","uHar;","uharl;","uharr;","uhblk;","ulcorn;","ulcorner;","ulcrop;","ultri;","Umacr;","umacr;","uml;","uml","UnderBar;","UnderBrace;","UnderBracket;","UnderParenthesis;","Union;","UnionPlus;","Uogon;","uogon;","Uopf;","uopf;","UpArrow;","Uparrow;","uparrow;","UpArrowBar;","UpArrowDownArrow;","UpDownArrow;","Updownarrow;","updownarrow;","UpEquilibrium;","upharpoonleft;","upharpoonright;","uplus;","UpperLeftArrow;","UpperRightArrow;","Upsi;","upsi;","upsih;","Upsilon;","upsilon;","UpTee;","UpTeeArrow;","upuparrows;","urcorn;","urcorner;","urcrop;","Uring;","uring;","urtri;","Uscr;","uscr;","utdot;","Utilde;","utilde;","utri;","utrif;","uuarr;","Uuml;","Uuml","uuml;","uuml","uwangle;","vangrt;","varepsilon;","varkappa;","varnothing;","varphi;","varpi;","varpropto;","vArr;","varr;","varrho;","varsigma;","varsubsetneq;","varsubsetneqq;","varsupsetneq;","varsupsetneqq;","vartheta;","vartriangleleft;","vartriangleright;","Vbar;","vBar;","vBarv;","Vcy;","vcy;","VDash;","Vdash;","vDash;","vdash;","Vdashl;","Vee;","vee;","veebar;","veeeq;","vellip;","Verbar;","verbar;","Vert;","vert;","VerticalBar;","VerticalLine;","VerticalSeparator;","VerticalTilde;","VeryThinSpace;","Vfr;","vfr;","vltri;","vnsub;","vnsup;","Vopf;","vopf;","vprop;","vrtri;","Vscr;","vscr;","vsubnE;","vsubne;","vsupnE;","vsupne;","Vvdash;","vzigzag;","Wcirc;","wcirc;","wedbar;","Wedge;","wedge;","wedgeq;","weierp;","Wfr;","wfr;","Wopf;","wopf;","wp;","wr;","wreath;","Wscr;","wscr;","xcap;","xcirc;","xcup;","xdtri;","Xfr;","xfr;","xhArr;","xharr;","Xi;","xi;","xlArr;","xlarr;","xmap;","xnis;","xodot;","Xopf;","xopf;","xoplus;","xotime;","xrArr;","xrarr;","Xscr;","xscr;","xsqcup;","xuplus;","xutri;","xvee;","xwedge;","Yacute;","Yacute","yacute;","yacute","YAcy;","yacy;","Ycirc;","ycirc;","Ycy;","ycy;","yen;","yen","Yfr;","yfr;","YIcy;","yicy;","Yopf;","yopf;","Yscr;","yscr;","YUcy;","yucy;","Yuml;","yuml;","yuml","Zacute;","zacute;","Zcaron;","zcaron;","Zcy;","zcy;","Zdot;","zdot;","zeetrf;","ZeroWidthSpace;","Zeta;","zeta;","Zfr;","zfr;","ZHcy;","zhcy;","zigrarr;","Zopf;","zopf;","Zscr;","zscr;","zwj;","zwnj;","25","./decode","./encode","26","33","34","35","36","37","38","39","40","41","42","43","44","46","47","58","59","60","61","62","63","64","91","92","93","94","95","96","123","124","125","160","161","162","163","164","165","166","167","168","169","170","171","172","173","174","175","176","177","178","179","180","181","182","183","184","185","186","187","188","189","190","191","192","193","194","195","196","197","198","199","200","201","202","203","204","205","206","207","208","209","210","211","212","213","214","215","216","217","218","219","220","221","222","223","224","225","226","227","228","229","230","231","232","233","234","235","236","237","238","239","240","241","242","243","244","245","246","247","248","249","250","251","252","253","254","255","256","257","258","259","260","261","262","263","264","265","266","267","268","269","270","271","272","273","274","275","278","279","280","281","282","283","284","285","286","287","288","289","290","292","293","294","295","296","297","298","299","302","303","304","305","306","307","308","309","310","311","312","313","314","315","316","317","318","319","320","321","322","323","324","325","326","327","328","329","330","331","332","333","336","337","338","339","340","341","342","343","344","345","346","347","348","349","350","351","352","353","354","355","356","357","358","359","360","361","362","363","364","365","366","367","368","369","370","371","372","373","374","375","376","377","378","379","380","381","382","402","437","501","567","710","711","728","729","730","731","732","733","785","913","914","915","916","917","918","919","920","921","922","923","924","925","926","927","928","929","931","932","933","934","935","936","937","945","946","947","948","949","950","951","952","953","954","955","956","957","958","959","960","961","962","963","964","965","966","967","968","969","977","978","981","982","988","989","1008","1009","1013","1014","1025","1026","1027","1028","1029","1030","1031","1032","1033","1034","1035","1036","1038","1039","1040","1041","1042","1043","1044","1045","1046","1047","1048","1049","1050","1051","1052","1053","1054","1055","1056","1057","1058","1059","1060","1061","1062","1063","1064","1065","1066","1067","1068","1069","1070","1071","1072","1073","1074","1075","1076","1077","1078","1079","1080","1081","1082","1083","1084","1085","1086","1087","1088","1089","1090","1091","1092","1093","1094","1095","1096","1097","1098","1099","1100","1101","1102","1103","1105","1106","1107","1108","1109","1110","1111","1112","1113","1114","1115","1116","1118","1119","8194","8195","8196","8197","8199","8200","8201","8202","8203","8204","8205","8206","8207","8208","8211","8212","8213","8214","8216","8217","8218","8220","8221","8222","8224","8225","8226","8229","8230","8240","8241","8242","8243","8244","8245","8249","8250","8254","8257","8259","8260","8271","8279","8287","8288","8289","8290","8291","8364","8411","8412","8450","8453","8458","8459","8460","8461","8462","8463","8464","8465","8466","8467","8469","8470","8471","8472","8473","8474","8475","8476","8477","8478","8482","8484","8487","8488","8489","8492","8493","8495","8496","8497","8499","8500","8501","8502","8503","8504","8517","8518","8519","8520","8531","8532","8533","8534","8535","8536","8537","8538","8539","8540","8541","8542","8592","8593","8594","8595","8596","8597","8598","8599","8600","8601","8602","8603","8605","8606","8607","8608","8609","8610","8611","8612","8613","8614","8615","8617","8618","8619","8620","8621","8622","8624","8625","8626","8627","8629","8630","8631","8634","8635","8636","8637","8638","8639","8640","8641","8642","8643","8644","8645","8646","8647","8648","8649","8650","8651","8652","8653","8654","8655","8656","8657","8658","8659","8660","8661","8662","8663","8664","8665","8666","8667","8669","8676","8677","8693","8701","8702","8703","8704","8705","8706","8707","8708","8709","8711","8712","8713","8715","8716","8719","8720","8721","8722","8723","8724","8726","8727","8728","8730","8733","8734","8735","8736","8737","8738","8739","8740","8741","8742","8743","8744","8745","8746","8747","8748","8749","8750","8751","8752","8753","8754","8755","8756","8757","8758","8759","8760","8762","8763","8764","8765","8766","8767","8768","8769","8770","8771","8772","8773","8774","8775","8776","8777","8778","8779","8780","8781","8782","8783","8784","8785","8786","8787","8788","8789","8790","8791","8793","8794","8796","8799","8800","8801","8802","8804","8805","8806","8807","8808","8809","8810","8811","8812","8813","8814","8815","8816","8817","8818","8819","8820","8821","8822","8823","8824","8825","8826","8827","8828","8829","8830","8831","8832","8833","8834","8835","8836","8837","8838","8839","8840","8841","8842","8843","8845","8846","8847","8848","8849","8850","8851","8852","8853","8854","8855","8856","8857","8858","8859","8861","8862","8863","8864","8865","8866","8867","8868","8869","8871","8872","8873","8874","8875","8876","8877","8878","8879","8880","8882","8883","8884","8885","8886","8887","8888","8889","8890","8891","8893","8894","8895","8896","8897","8898","8899","8900","8901","8902","8903","8904","8905","8906","8907","8908","8909","8910","8911","8912","8913","8914","8915","8916","8917","8918","8919","8920","8921","8922","8923","8926","8927","8928","8929","8930","8931","8934","8935","8936","8937","8938","8939","8940","8941","8942","8943","8944","8945","8946","8947","8948","8949","8950","8951","8953","8954","8955","8956","8957","8958","8965","8966","8968","8969","8970","8971","8972","8973","8974","8975","8976","8978","8979","8981","8982","8988","8989","8990","8991","8994","8995","9005","9006","9014","9021","9023","9084","9136","9137","9140","9141","9142","9180","9181","9182","9183","9186","9191","9251","9416","9472","9474","9484","9488","9492","9496","9500","9508","9516","9524","9532","9552","9553","9554","9555","9556","9557","9558","9559","9560","9561","9562","9563","9564","9565","9566","9567","9568","9569","9570","9571","9572","9573","9574","9575","9576","9577","9578","9579","9580","9600","9604","9608","9617","9618","9619","9633","9642","9643","9645","9646","9649","9651","9652","9653","9656","9657","9661","9662","9663","9666","9667","9674","9675","9708","9711","9720","9721","9722","9723","9724","9733","9734","9742","9792","9794","9824","9827","9829","9830","9834","9837","9838","9839","10003","10007","10016","10038","10072","10098","10099","10184","10185","10214","10215","10216","10217","10218","10219","10220","10221","10229","10230","10231","10232","10233","10234","10236","10239","10498","10499","10500","10501","10508","10509","10510","10511","10512","10513","10514","10515","10518","10521","10522","10523","10524","10525","10526","10527","10528","10531","10532","10533","10534","10535","10536","10537","10538","10547","10549","10550","10551","10552","10553","10556","10557","10565","10568","10569","10570","10571","10574","10575","10576","10577","10578","10579","10580","10581","10582","10583","10584","10585","10586","10587","10588","10589","10590","10591","10592","10593","10594","10595","10596","10597","10598","10599","10600","10601","10602","10603","10604","10605","10606","10607","10608","10609","10610","10611","10612","10613","10614","10616","10617","10619","10620","10621","10622","10623","10629","10630","10635","10636","10637","10638","10639","10640","10641","10642","10643","10644","10645","10646","10650","10652","10653","10660","10661","10662","10663","10664","10665","10666","10667","10668","10669","10670","10671","10672","10673","10674","10675","10676","10677","10678","10679","10681","10683","10684","10686","10687","10688","10689","10690","10691","10692","10693","10697","10701","10702","10703","10704","10716","10717","10718","10723","10724","10725","10731","10740","10742","10752","10753","10754","10756","10758","10764","10765","10768","10769","10770","10771","10772","10773","10774","10775","10786","10787","10788","10789","10790","10791","10793","10794","10797","10798","10799","10800","10801","10803","10804","10805","10806","10807","10808","10809","10810","10811","10812","10815","10816","10818","10819","10820","10821","10822","10823","10824","10825","10826","10827","10828","10829","10832","10835","10836","10837","10838","10839","10840","10842","10843","10844","10845","10847","10854","10858","10861","10862","10863","10864","10865","10866","10867","10868","10869","10871","10872","10873","10874","10875","10876","10877","10878","10879","10880","10881","10882","10883","10884","10885","10886","10887","10888","10889","10890","10891","10892","10893","10894","10895","10896","10897","10898","10899","10900","10901","10902","10903","10904","10905","10906","10909","10910","10911","10912","10913","10914","10916","10917","10918","10919","10920","10921","10922","10923","10924","10925","10926","10927","10928","10931","10932","10933","10934","10935","10936","10937","10938","10939","10940","10941","10942","10943","10944","10945","10946","10947","10948","10949","10950","10951","10952","10955","10956","10959","10960","10961","10962","10963","10964","10965","10966","10967","10968","10969","10970","10971","10980","10982","10983","10984","10985","10987","10988","10989","10990","10991","10992","10993","10994","10995","11005","64256","64257","64258","64259","64260","27","matchOperatorsRe","28","isPosixBracket","POSIX","alnum","alpha","blank","cntrl","digit","graph","lower","print","punct","upper","word","xdigit","brackets","negated","imbalanced","beg","prefix","rlen","pattern","isMatch","re","is-posix-bracket","29","fill-range","30","isObject","is-extendable","31","escape","regex","contains","negate","id","isNegated","toRegex","is-extglob","32","isNumber","randomize","repeatStr","sep","pre","regexPrefix","detectSeparator","step","isNum","isDescending","formatPadding","pad","noAlphaNum","hasBoth","zeros","hasZeros","silent","origA","origB","optimize","isNumA","isNumB","abs","padding","alen","blen","isPadded","ii","shouldExpand","noexpand","is-number","isobject","randomatic","repeat-string","forIn","hasOwn","for-in","fs","filepath","accessSync","statSync","parent","isGlob","glob","dirname","glob-parent","is-glob","isglob","lib","groups","hbs","handlebars","registerHelper","helpers","./lib/","./lib/utils","define-property","isUndefined","arrayify","eachIndex","item","results","hash","property","first","createFrame","total","isFirst","isLast","inArray","lengthEqual","tryParse","some","sortBy","withAfter","withBefore","withFirst","parseFloat","withLast","withSort","object","embed","fp","extname","readFileSync","block","gist","jsfiddle","attr","width","height","skin","tabs","allowfullscreen","frameborder","parseAttributes","./object","./utils/html","forOwn","isEmpty","collection","iterate","./array","45","isString","and","operator","startIndex","gte","has","eq","ifEven","isEven","ifNth","ifOdd","isOdd","is","isnt","lte","neither","or","unlessEq","unlessGt","unlessLt","unlessGteq","unlessLteq","./string","moment","helper-date","fileSize","error","readdir","dir","files","readdirSync","isOptions","isRegex","mm","matcher","48","parseAttr","css","assets","js","toAttributes","tag","sanitize","suffix","ul","ol","thumbnailImage","figure","image","full","imageAttributes","alt","thumbnail","figureAttributes","linkAttributes","rel","class","caption","49","i18n","lang","language","50","comparison","inflection","logging","markdown","math","misc","./code","./collection","./comparison","./fs","./html","./i18n","./inflection","./logging","./markdown","./match","./math","./misc","./number","./path","./url","51","inflect","singular","plural","include","ordinalize","round","52","logging-helpers","53","md","helper-markdown","helper-md","54","getArgs","55","add","subtract","multiply","ceil","sum","flatten","avg","56","default","defaultValue","option","noop","withHash","57","addCommas","phoneNumber","toAbbr","precision","abbr","toExponential","digits","toFloat","toInt","toPrecision","getObject","parseJSON","pick","indent","./utils/","basename","relative","segments","normalize","camelcase","changecase","capitalize","capitalizeAll","center","spaces","chop","dashcase","dotcase","hyphenate","lowercase","occurrences","pascalcase","pathcase","plusify","sentence","txt","snakecase","startsWith","titleize","words","uppercase","encodeURI","encodeURIComponent","decodeURI","decodeURIComponent","urlResolve","resolve","urlParse","stripQuerystring","striptags","condense","padcomments","./","identity","app","hopt","arr-filter","arr-flatten","array-sort","create-frame","for-own","get-object","html-tag","index-of","is-even","is-odd","micromatch","mixin-deep","normalize-path","to-gfm-code-block","65","66","requireFn","alias","TRAVIS","set-getter","67","ansiRegex","ansi-regex","68","locale","format","datejs","date.js","extend-shallow","69","70","71","72","Remarkable","config","helper","render","breaks","langPrefix","ctx","remarkable","73","exists","ent","linkify","typographer","xhtmlOut","view","cwd","create","mdfile","find","sync","views","compile","fs-exists-sync","74","75","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","NaN","rt","LN2","76","77","accessor","getOwnPropertyDescriptor","78","79","80","81","82","isAccessor","isData","83","84","is-accessor-descriptor","is-data-descriptor","85","lastIndexOf","86","isPrimitive","numKeysA","numKeysB","is-primitive","87","88","89","90","isExtglob","dup","97","98","99","100","noGlobal","document","class2type","support","jQuery","selector","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","isArrayLike","isWindow","jquery","toArray","pushStack","elems","prevObject","each","elem","copyIsArray","deep","isFunction","isPlainObject","expando","isReady","msg","isNumeric","realStringObj","isEmptyObject","globalEval","script","indirect","eval","createElement","head","appendChild","parentNode","removeChild","camelCase","nodeName","makeArray","grep","invert","matches","callbackExpect","guid","now","Sizzle","Expr","isXML","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","preferredDoc","dirruns","classCache","createCache","tokenCache","compilerCache","sortOrder","push_native","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","escaped","escapedWhitespace","high","unloadHandler","childNodes","els","seed","nid","nidselect","newSelector","newContext","ownerDocument","getElementById","getElementsByTagName","getElementsByClassName","qsa","getAttribute","setAttribute","toSelector","testContext","querySelectorAll","qsaError","removeAttribute","cacheLength","markFunction","assert","div","addHandle","handler","attrHandle","siblingCheck","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","documentElement","hasCompare","doc","defaultView","top","addEventListener","attachEvent","createComment","getById","getElementsByName","attrId","getAttributeNode","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","sortDetached","aup","ap","bp","unshift","expr","elements","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","what","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","useCache","lastChild","uniqueID","pseudo","setFilters","matched","unmatched","innerText","elemLang","location","focus","activeElement","hasFocus","tabIndex","disabled","selected","selectedIndex","empty","button","even","odd","radio","checkbox","file","password","submit","addCombinator","combinator","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","compiled","div1","unique","isXMLDoc","until","siblings","rneedsContext","rsingleTag","risSimple","winnow","qualifier","rootjQuery","ready","parseHTML","rparentsprev","guaranteedUnique","children","contents","sibling","targets","closest","prevAll","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","readyList","rnotwhite","completed","removeEventListener","Callbacks","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","lock","fireWith","Deferred","func","tuples","promise","always","deferred","fail","then","fns","newDefer","tuple","returned","progress","notify","reject","pipe","stateString","when","subordinate","progressValues","progressContexts","resolveContexts","resolveValues","updateFunc","values","notifyWith","resolveWith","readyWait","holdReady","hold","wait","triggerHandler","off","readyState","doScroll","access","chainable","emptyGet","raw","bulk","acceptData","owner","Data","uid","register","initial","stored","camel","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","removeData","_data","_removeData","camelKey","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","defer","pnum","rcssNum","cssExpand","isHidden","el","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","unit","cssNumber","initialInUnit","rcheckableType","rtagName","rscriptType","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","optgroup","tbody","tfoot","colgroup","th","rhtml","buildFragment","scripts","selection","ignored","fragment","createDocumentFragment","htmlPrefilter","checkClone","cloneNode","noCloneChecked","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","safeActiveElement","on","types","one","origFn","event","handleObjIn","eventHandle","events","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","fix","handlerQueue","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","preventDefault","stopPropagation","postDispatch","sel","fixHooks","keyHooks","which","keyCode","mouseHooks","eventDoc","body","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","originalEvent","fixHook","Event","load","noBubble","trigger","blur","click","beforeunload","returnValue","isDefaultPrevented","defaultPrevented","timeStamp","stopImmediatePropagation","mouseenter","mouseleave","pointerenter","pointerleave","related","relatedTarget","rxhtmlTag","rnoInnerhtml","rchecked","rscriptTypeMasked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","pdataOld","pdataCur","udataOld","udataCur","domManip","hasScripts","iNoClone","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","iframe","elemdisplay","HTML","BODY","actualDisplay","display","defaultDisplay","rmargin","rnumnonpx","getStyles","opener","getComputedStyle","old","curCSS","computed","minWidth","maxWidth","getPropertyValue","pixelMarginRight","addGetHookIf","conditionFn","hookFn","pixelPositionVal","boxSizingReliableVal","pixelMarginRightVal","reliableMarginLeftVal","container","computeStyleTests","cssText","divStyle","marginLeft","marginRight","backgroundClip","clearCloneStyle","pixelPosition","boxSizingReliable","reliableMarginLeft","reliableMarginRight","marginDiv","rdisplayswap","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssPrefixes","emptyStyle","vendorPropName","capName","setPositiveNumber","augmentWidthOrHeight","extra","isBorderBox","getWidthOrHeight","valueIsBorderBox","offsetWidth","offsetHeight","msFullscreenElement","getClientRects","getBoundingClientRect","showHide","show","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","lineHeight","order","orphans","widows","zIndex","zoom","cssProps","float","origName","margin","border","expanded","hide","toggle","propHooks","run","percent","eased","duration","fx","linear","p","swing","cos","PI","fxNow","timerId","opt","rfxtypes","rrun","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","tick","currentTime","startTime","tweens","specialEasing","originalProperties","originalOptions","gotoEnd","rejectWith","propFilter","timer","anim","*","tweener","oldfire","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","interval","setInterval","clearInterval","slow","fast","delay","timeout","clearTimeout","checkOn","optSelected","optDisabled","radioValue","boolHook","removeAttr","nType","attrHooks","propName","attrNames","propFix","rfocusable","rclickable","removeProp","tabindex","for","rclass","curValue","clazz","finalValue","toggleClass","stateVal","classNames","rreturn","rspaces","valHooks","optionSet","rfocusMorph","onlyHandlers","bubbleType","ontype","eventPath","isTrigger","parentWindow","simulate","isSimulated","hover","fnOver","fnOut","focusin","attaches","nonce","rquery","parseXML","DOMParser","parseFromString","rhash","rts","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","mimeType","status","abort","statusText","finalText","success","method","crossDomain","host","traditional","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","wrapAll","firstElementChild","wrapInner","unwrap","visible","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","serialize","serializeArray","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","username","xhrFields","onload","onerror","onabort","onreadystatechange","responseType","responseText","binary","text script","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","keepScripts","_load","getWindow","params","animated","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","win","box","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","andSelf","_jQuery","_$","$","noConflict","w","101","102","chalk","info","warn","_inspect","switchOutput","103","containsMatch","deepMatches","matchArray","104","patterns","omit","keep","nonegate","_isMatch","unixify","failglob","nonull","nullglob","unescapeGlob","ignore","matchPath","matchBase","hasFilename","flags","nocase","wrapGlob","reason","SyntaxError","any","braceExpand","patternMatchers","matchKeys","./lib/expand","105","unesc","prepender","reversed","newKey","escapeRegex","?","@","!","(",")","[","]","ESC",",","UNESC","ESC_TEMP","TEMP","106","Glob","collapse","nobraces","star","oneStar","dot","dotfiles","dotfile","dotdirs","dotdir","track","extglob","_replace","nodot","globstar","aarr","qmark","unescape","dotfileGlob","twoStarDot","./glob","107","history","nobrace","nobrackets","noextglob","parseGlob","$0","./chars","108","win32","fileRe","filename","seg","isPath","hasPath","escapePath","escapeRe","arr-diff","array-unique","expand-brackets","filename-regex","object.omit","parse-glob","regex-cache","109","arrays","110","111","isExtendable","mixinDeep","objects","112","hookCallback","utils_hooks__hooks","isDate","hasOwnProp","valueOf","create_utc__createUTC","createLocalOrUTC","utc","getParsingFlags","_pf","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","parsedDateParts","valid__isValid","_isValid","parsedParts","_d","invalidWeekday","_strict","bigHour","valid__createInvalid","fun","momentProperties","copyConfig","_isAMomentObject","_f","_l","_tzm","_isUTC","_offset","_locale","updateInProgress","Moment","updateOffset","isMoment","absFloor","argumentForCoercion","coercedNumber","compareArrays","array1","array2","dontConvert","lengthDiff","diffs","suppressDeprecationWarnings","deprecate","firstTime","deprecationHandler","deprecations","deprecateSimple","mergeConfigs","parentConfig","childConfig","Locale","globalLocale","locales","normalizeLocale","loadLocale","oldLocale","_abbr","locale_locales__getSetGlobalLocale","locale_locales__getLocale","defineLocale","_config","parentLocale","chooseLocale","aliases","addUnitAlias","shorthand","lowerCase","normalizeUnits","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","makeGetSet","keepTime","get_set__set","get_set__get","mom","isValid","getSet","zeroFill","targetLength","forceSign","absNumber","zerosToFill","formattingTokens","localFormattingTokens","formatFunctions","formatTokenFunctions","addFormatToken","padded","ordinal","localeData","formatMoment","expandFormat","makeFormatFunction","invalidDate","replaceLongDateFormatTokens","longDateFormat","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchOffset","matchShortOffset","matchWord","regexes","addRegexToken","strictRegex","isStrict","getParseRegexForToken","regexEscape","p1","p2","p3","p4","addParseToken","addWeekParseToken","_w","YEAR","MONTH","DATE","HOUR","MINUTE","SECOND","MILLISECOND","WEEK","WEEKDAY","UTC","getUTCDate","monthsShort","monthsShortRegex","monthsRegex","monthsParse","MONTHS_IN_FORMAT","defaultLocaleMonths","defaultLocaleMonthsShort","dayOfMonth","getSetMonth","defaultMonthsShortRegex","defaultMonthsRegex","computeMonthsParse","cmpLenRev","shortPieces","longPieces","mixedPieces","_monthsRegex","_monthsShortRegex","_monthsStrictRegex","_monthsShortStrictRegex","checkOverflow","_a","_overflowDayOfYear","_overflowWeeks","_overflowWeekday","extendedIsoRegex","basicIsoRegex","tzRegex","isoDates","isoTimes","aspNetJsonRegex","configFromISO","allowTime","dateFormat","timeFormat","tzFormat","configFromStringAndFormat","createUTCDate","getUTCFullYear","setUTCFullYear","daysInYear","isLeapYear","createFromInputFallback","_useUTC","parseTwoDigitYear","getSetYear","firstWeekOffset","dow","doy","fwd","getUTCDay","dayOfYearFromWeeks","weekday","resYear","resDayOfYear","dayOfYear","weekOfYear","resWeek","weekOffset","weeksInYear","weekOffsetNext","configFromArray","currentDate","yearToUse","nowValue","getUTCMonth","weekYear","weekdayOverflow","GG","W","E","local__createLocal","_week","gg","_dayOfYear","dayOfYearFromWeekInfo","_nextDay","M","setUTCMinutes","getUTCMinutes","ISO_8601","parsedInput","skipped","stringLength","totalParsedInputLength","isPm","meridiemHour","isPM","meridiemFixWrap","prepareConfig","preparse","tempConfig","bestMoment","scoreToBeat","currentScore","score","configFromStringAndArray","millisecond","configFromObject","isUTC","prototypeMin","prototypeMax","pickBy","moments","Duration","years","quarters","quarter","milliseconds","_milliseconds","_days","_months","_bubble","isDuration","separator","utcOffset","sign","offsetFromString","chunkOffset","cloneWithOffset","model","setTime","local","getDateOffset","getTimezoneOffset","isUtc","aspNetRegex","isoRegex","create__createDuration","diffRes","parseIso","isBefore","positiveMomentsDifference","momentsDifference","inp","isAfter","absRound","createAdder","direction","period","add_subtract__addSubtract","isAdding","add_subtract__add","add_subtract__subtract","newLocaleData","defaultFormat","defaultFormatUtc","addWeekYearFormatToken","getSetWeekYearHelper","weeksTarget","dayOfYearData","isoWeekYear","_ordinalParse","_ordinalParseLenient","getSetDayOfMonth","weekdaysMin","weekdaysShort","weekdays","weekdaysMinRegex","weekdaysShortRegex","weekdaysRegex","weekdaysParse","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","defaultWeekdaysRegex","defaultWeekdaysShortRegex","defaultWeekdaysMinRegex","computeWeekdaysParse","minp","shortp","longp","minPieces","_weekdaysRegex","_weekdaysShortRegex","_weekdaysMinRegex","_weekdaysStrictRegex","_weekdaysShortStrictRegex","_weekdaysMinStrictRegex","hFormat","matchMeridiem","_meridiemParse","_isPm","pos1","pos2","getSetHour","getSetMinute","getSetSecond","parseMs","getSetMillisecond","momentPrototype__proto","calendar","formats","sod","startOf","asFloat","zoneDelta","wholeMonthDiff","anchor","adjust","anchor2","endOf","inputString","postformat","withoutSuffix","fromNow","toNow","invalidAt","localInput","isBetween","inclusivity","isSame","inputMs","isSameOrAfter","isSameOrBefore","parsingFlags","isoWeekday","toObject","toDate","toISOString","unix","creationData","isoWeek","isoWeeks","weekInfo","isoWeeksInYear","keepLocalTime","localAdjust","_changeInProgress","parseZone","hasAlignedHourOffset","isDST","isDSTShifted","_isDSTShifted","isUtcOffset","zoneAbbr","zoneName","dates","zone","momentPrototype","preParsePostFormat","prototype__proto","lists__get","field","listMonthsImpl","listWeekdaysImpl","localeSorted","_calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","_longDateFormat","LTS","LL","LLL","LLLL","formatUpper","_invalidDate","_ordinal","_relativeTime","future","past","hh","dd","MM","yy","relativeTime","isFuture","pastFuture","_monthsShort","monthName","_monthsParseExact","llc","toLocaleLowerCase","_monthsParse","_longMonthsParse","_shortMonthsParse","firstDayOfYear","firstDayOfWeek","_weekdays","isFormat","_weekdaysMin","_weekdaysShort","weekdayName","_weekdaysParseExact","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","_fullWeekdaysParse","isLower","ordinalParse","langData","mathAbs","duration_add_subtract__addSubtract","absCeil","daysToMonths","monthsToDays","makeAs","as","asMilliseconds","asSeconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","makeGetter","thresholds","iso_string__abs","iso_string__toISOString","Y","D","duration_prototype__proto","monthsFromDays","withSuffix","posNegDuration","toIsoString","version","invalid","updateLocale","relativeTimeThreshold","threshold","113","stripTrailing","114","115","findBase","parens","exts","glob-base","is-dotfile","116","normalizeArray","allowAboveRoot","up","splitPathRe","splitPath","xs","resolvedPath","resolvedAbsolute","isAbsolute","trailingSlash","paths","fromParts","toParts","samePartsLength","outputParts","117","118","currentQueue","draining","queueIndex","cleanUpNextTick","drainQueue","Item","nextTick","title","browser","argv","versions","addListener","removeListener","removeAllListeners","emit","binding","chdir","umask","119","freeExports","freeModule","freeGlobal","maxInt","tMin","tMax","skew","damp","initialBias","initialN","regexPunycode","regexNonASCII","regexSeparators","errors","not-basic","invalid-input","baseMinusTMin","stringFromCharCode","mapDomain","ucs2decode","counter","ucs2encode","digitToBasic","adapt","numPoints","basic","oldi","baseMinusT","inputLength","bias","handledCPCount","basicLength","q","handledCPCountPlusOne","qMinusT","toASCII","toUnicode","120","qs","regexp","maxKeys","kstr","vstr","121","stringifyPrimitive","objectKeys","ks","122","custom","mask","equal","is-equal-shallow","126","stat","slashA","endsWith","slashB","tryStats","isDirectory","isDir","isFile","noslash","toBase","127","128","Abreve","abreve","ac","acd","acE","Acy","acy","af","Afr","afr","alefsym","aleph","Alpha","Amacr","amacr","amalg","And","andand","andd","andslope","andv","ang","ange","angle","angmsd","angmsdaa","angmsdab","angmsdac","angmsdad","angmsdae","angmsdaf","angmsdag","angmsdah","angrt","angrtvb","angrtvbd","angsph","angst","angzarr","Aogon","aogon","Aopf","aopf","apacir","apE","ape","apid","apos","ApplyFunction","approx","approxeq","Ascr","ascr","Assign","ast","asymp","asympeq","awconint","awint","backcong","backepsilon","backprime","backsim","backsimeq","Backslash","Barv","barvee","Barwed","barwed","barwedge","bbrk","bbrktbrk","bcong","Bcy","bcy","bdquo","becaus","Because","because","bemptyv","bepsi","bernou","Bernoullis","Beta","beta","beth","between","Bfr","bfr","bigcap","bigcirc","bigcup","bigodot","bigoplus","bigotimes","bigsqcup","bigstar","bigtriangledown","bigtriangleup","biguplus","bigvee","bigwedge","bkarow","blacklozenge","blacksquare","blacktriangle","blacktriangledown","blacktriangleleft","blacktriangleright","blk12","blk14","blk34","bne","bnequiv","bNot","bnot","Bopf","bopf","bot","bottom","bowtie","boxbox","boxDL","boxDl","boxdL","boxdl","boxDR","boxDr","boxdR","boxdr","boxH","boxh","boxHD","boxHd","boxhD","boxhd","boxHU","boxHu","boxhU","boxhu","boxminus","boxplus","boxtimes","boxUL","boxUl","boxuL","boxul","boxUR","boxUr","boxuR","boxur","boxV","boxv","boxVH","boxVh","boxvH","boxvh","boxVL","boxVl","boxvL","boxvl","boxVR","boxVr","boxvR","boxvr","bprime","Breve","breve","Bscr","bscr","bsemi","bsim","bsime","bsol","bsolb","bsolhsub","bull","bullet","bump","bumpE","bumpe","Bumpeq","bumpeq","Cacute","cacute","Cap","cap","capand","capbrcup","capcap","capcup","capdot","CapitalDifferentialD","caps","caret","caron","Cayleys","ccaps","Ccaron","ccaron","Ccirc","ccirc","Cconint","ccups","ccupssm","Cdot","cdot","Cedilla","cemptyv","CenterDot","centerdot","Cfr","cfr","CHcy","chcy","checkmark","Chi","chi","cir","circ","circeq","circlearrowleft","circlearrowright","circledast","circledcirc","circleddash","CircleDot","circledR","circledS","CircleMinus","CirclePlus","CircleTimes","cirE","cire","cirfnint","cirmid","cirscir","ClockwiseContourIntegral","CloseCurlyDoubleQuote","CloseCurlyQuote","clubs","clubsuit","Colon","colon","Colone","colone","coloneq","comma","commat","comp","compfn","complement","complexes","cong","congdot","Congruent","Conint","conint","ContourIntegral","Copf","copf","coprod","Coproduct","copysr","CounterClockwiseContourIntegral","crarr","Cross","cross","Cscr","cscr","csub","csube","csup","csupe","ctdot","cudarrl","cudarrr","cuepr","cuesc","cularr","cularrp","Cup","cup","cupbrcap","CupCap","cupcap","cupcup","cupdot","cupor","cups","curarr","curarrm","curlyeqprec","curlyeqsucc","curlyvee","curlywedge","curvearrowleft","curvearrowright","cuvee","cuwed","cwconint","cwint","cylcty","Dagger","dagger","daleth","Darr","dArr","darr","dash","Dashv","dashv","dbkarow","dblac","Dcaron","dcaron","Dcy","dcy","DD","ddagger","ddarr","DDotrahd","ddotseq","Del","Delta","demptyv","dfisht","Dfr","dfr","dHar","dharl","dharr","DiacriticalAcute","DiacriticalDot","DiacriticalDoubleAcute","DiacriticalGrave","DiacriticalTilde","diam","Diamond","diamond","diamondsuit","diams","die","DifferentialD","digamma","disin","divideontimes","divonx","DJcy","djcy","dlcorn","dlcrop","dollar","Dopf","dopf","Dot","DotDot","doteq","doteqdot","DotEqual","dotminus","dotplus","dotsquare","doublebarwedge","DoubleContourIntegral","DoubleDot","DoubleDownArrow","DoubleLeftArrow","DoubleLeftRightArrow","DoubleLeftTee","DoubleLongLeftArrow","DoubleLongLeftRightArrow","DoubleLongRightArrow","DoubleRightArrow","DoubleRightTee","DoubleUpArrow","DoubleUpDownArrow","DoubleVerticalBar","DownArrow","Downarrow","downarrow","DownArrowBar","DownArrowUpArrow","DownBreve","downdownarrows","downharpoonleft","downharpoonright","DownLeftRightVector","DownLeftTeeVector","DownLeftVector","DownLeftVectorBar","DownRightTeeVector","DownRightVector","DownRightVectorBar","DownTee","DownTeeArrow","drbkarow","drcorn","drcrop","Dscr","dscr","DScy","dscy","dsol","Dstrok","dstrok","dtdot","dtri","dtrif","duarr","duhar","dwangle","DZcy","dzcy","dzigrarr","easter","Ecaron","ecaron","ecir","ecolon","Ecy","ecy","eDDot","Edot","eDot","edot","ee","efDot","Efr","efr","eg","egs","egsdot","Element","elinters","ell","elsdot","Emacr","emacr","emptyset","EmptySmallSquare","emptyv","EmptyVerySmallSquare","emsp","emsp13","emsp14","ENG","eng","ensp","Eogon","eogon","Eopf","eopf","epar","eparsl","eplus","epsi","Epsilon","epsilon","epsiv","eqcirc","eqcolon","eqsim","eqslantgtr","eqslantless","Equal","EqualTilde","equest","Equilibrium","equiv","equivDD","eqvparsl","erarr","erDot","Escr","escr","esdot","Esim","esim","Eta","eta","euro","excl","exist","Exists","expectation","ExponentialE","exponentiale","fallingdotseq","Fcy","fcy","female","ffilig","fflig","ffllig","Ffr","ffr","filig","FilledSmallSquare","FilledVerySmallSquare","fjlig","fllig","fltns","fnof","Fopf","fopf","ForAll","forall","fork","forkv","Fouriertrf","fpartint","frac13","frac15","frac16","frac18","frac23","frac25","frac35","frac38","frac45","frac56","frac58","frac78","frasl","frown","Fscr","fscr","gacute","Gamma","gamma","Gammad","gammad","gap","Gbreve","gbreve","Gcedil","Gcirc","gcirc","Gcy","gcy","Gdot","gdot","gE","ge","gEl","gel","geq","geqq","geqslant","ges","gescc","gesdot","gesdoto","gesdotol","gesl","gesles","Gfr","gfr","Gg","ggg","gimel","GJcy","gjcy","gl","gla","glE","glj","gnap","gnapprox","gnE","gne","gneq","gneqq","gnsim","Gopf","gopf","grave","GreaterEqual","GreaterEqualLess","GreaterFullEqual","GreaterGreater","GreaterLess","GreaterSlantEqual","GreaterTilde","Gscr","gscr","gsim","gsime","gsiml","Gt","gtcc","gtcir","gtdot","gtlPar","gtquest","gtrapprox","gtrarr","gtrdot","gtreqless","gtreqqless","gtrless","gtrsim","gvertneqq","gvnE","Hacek","hairsp","half","hamilt","HARDcy","hardcy","hArr","harr","harrcir","harrw","Hat","hbar","Hcirc","hcirc","hearts","heartsuit","hellip","hercon","Hfr","hfr","HilbertSpace","hksearow","hkswarow","hoarr","homtht","hookleftarrow","hookrightarrow","Hopf","hopf","horbar","HorizontalLine","Hscr","hscr","hslash","Hstrok","hstrok","HumpDownHump","HumpEqual","hybull","hyphen","ic","Icy","icy","Idot","IEcy","iecy","iff","Ifr","ifr","iiiint","iiint","iinfin","iiota","IJlig","ijlig","Im","Imacr","imacr","ImaginaryI","imagline","imagpart","imath","imof","imped","Implies","in","incare","infin","infintie","inodot","Int","int","intcal","integers","Integral","intercal","Intersection","intlarhk","intprod","InvisibleComma","InvisibleTimes","IOcy","iocy","Iogon","iogon","Iopf","iopf","Iota","iota","iprod","Iscr","iscr","isin","isindot","isinE","isins","isinsv","isinv","it","Itilde","itilde","Iukcy","iukcy","Jcirc","jcirc","Jcy","jcy","Jfr","jfr","jmath","Jopf","jopf","Jscr","jscr","Jsercy","jsercy","Jukcy","jukcy","Kappa","kappa","kappav","Kcedil","kcedil","Kcy","kcy","Kfr","kfr","kgreen","KHcy","khcy","KJcy","kjcy","Kopf","kopf","Kscr","kscr","lAarr","Lacute","lacute","laemptyv","lagran","Lambda","lambda","Lang","langd","langle","lap","Laplacetrf","Larr","lArr","larr","larrb","larrbfs","larrfs","larrhk","larrlp","larrpl","larrsim","larrtl","lat","lAtail","latail","late","lates","lBarr","lbarr","lbbrk","lbrace","lbrack","lbrke","lbrksld","lbrkslu","Lcaron","lcaron","Lcedil","lcedil","lceil","lcub","Lcy","lcy","ldca","ldquo","ldquor","ldrdhar","ldrushar","ldsh","lE","le","LeftAngleBracket","LeftArrow","Leftarrow","leftarrow","LeftArrowBar","LeftArrowRightArrow","leftarrowtail","LeftCeiling","LeftDoubleBracket","LeftDownTeeVector","LeftDownVector","LeftDownVectorBar","LeftFloor","leftharpoondown","leftharpoonup","leftleftarrows","LeftRightArrow","Leftrightarrow","leftrightarrow","leftrightarrows","leftrightharpoons","leftrightsquigarrow","LeftRightVector","LeftTee","LeftTeeArrow","LeftTeeVector","leftthreetimes","LeftTriangle","LeftTriangleBar","LeftTriangleEqual","LeftUpDownVector","LeftUpTeeVector","LeftUpVector","LeftUpVectorBar","LeftVector","LeftVectorBar","lEg","leg","leq","leqq","leqslant","les","lescc","lesdot","lesdoto","lesdotor","lesg","lesges","lessapprox","lessdot","lesseqgtr","lesseqqgtr","LessEqualGreater","LessFullEqual","LessGreater","lessgtr","LessLess","lesssim","LessSlantEqual","LessTilde","lfisht","lfloor","Lfr","lfr","lg","lgE","lHar","lhard","lharu","lharul","lhblk","LJcy","ljcy","Ll","ll","llarr","llcorner","Lleftarrow","llhard","lltri","Lmidot","lmidot","lmoust","lmoustache","lnap","lnapprox","lnE","lne","lneq","lneqq","lnsim","loang","loarr","lobrk","LongLeftArrow","Longleftarrow","longleftarrow","LongLeftRightArrow","Longleftrightarrow","longleftrightarrow","longmapsto","LongRightArrow","Longrightarrow","longrightarrow","looparrowleft","looparrowright","lopar","Lopf","lopf","loplus","lotimes","lowast","lowbar","LowerLeftArrow","LowerRightArrow","loz","lozenge","lozf","lpar","lparlt","lrarr","lrcorner","lrhar","lrhard","lrm","lrtri","lsaquo","Lscr","lscr","Lsh","lsh","lsim","lsime","lsimg","lsqb","lsquo","lsquor","Lstrok","lstrok","Lt","ltcc","ltcir","ltdot","lthree","ltimes","ltlarr","ltquest","ltri","ltrie","ltrif","ltrPar","lurdshar","luruhar","lvertneqq","lvnE","male","malt","maltese","Map","mapsto","mapstodown","mapstoleft","mapstoup","marker","mcomma","Mcy","mcy","mdash","mDDot","measuredangle","MediumSpace","Mellintrf","Mfr","mfr","mho","mid","midast","midcir","minus","minusb","minusd","minusdu","MinusPlus","mlcp","mldr","mnplus","models","Mopf","mopf","mp","Mscr","mscr","mstpos","Mu","mu","multimap","mumap","nabla","Nacute","nacute","nang","nap","napE","napid","napos","napprox","natur","natural","naturals","nbump","nbumpe","ncap","Ncaron","ncaron","Ncedil","ncedil","ncong","ncongdot","ncup","Ncy","ncy","ndash","ne","nearhk","neArr","nearr","nearrow","nedot","NegativeMediumSpace","NegativeThickSpace","NegativeThinSpace","NegativeVeryThinSpace","nequiv","nesear","nesim","NestedGreaterGreater","NestedLessLess","NewLine","nexist","nexists","Nfr","nfr","ngE","nge","ngeq","ngeqq","ngeqslant","nges","nGg","ngsim","nGt","ngt","ngtr","nGtv","nhArr","nharr","nhpar","ni","nis","nisd","niv","NJcy","njcy","nlArr","nlarr","nldr","nlE","nle","nLeftarrow","nleftarrow","nLeftrightarrow","nleftrightarrow","nleq","nleqq","nleqslant","nles","nless","nLl","nlsim","nLt","nlt","nltri","nltrie","nLtv","nmid","NoBreak","NonBreakingSpace","Nopf","nopf","Not","NotCongruent","NotCupCap","NotDoubleVerticalBar","NotElement","NotEqual","NotEqualTilde","NotExists","NotGreater","NotGreaterEqual","NotGreaterFullEqual","NotGreaterGreater","NotGreaterLess","NotGreaterSlantEqual","NotGreaterTilde","NotHumpDownHump","NotHumpEqual","notin","notindot","notinE","notinva","notinvb","notinvc","NotLeftTriangle","NotLeftTriangleBar","NotLeftTriangleEqual","NotLess","NotLessEqual","NotLessGreater","NotLessLess","NotLessSlantEqual","NotLessTilde","NotNestedGreaterGreater","NotNestedLessLess","notni","notniva","notnivb","notnivc","NotPrecedes","NotPrecedesEqual","NotPrecedesSlantEqual","NotReverseElement","NotRightTriangle","NotRightTriangleBar","NotRightTriangleEqual","NotSquareSubset","NotSquareSubsetEqual","NotSquareSuperset","NotSquareSupersetEqual","NotSubset","NotSubsetEqual","NotSucceeds","NotSucceedsEqual","NotSucceedsSlantEqual","NotSucceedsTilde","NotSuperset","NotSupersetEqual","NotTilde","NotTildeEqual","NotTildeFullEqual","NotTildeTilde","NotVerticalBar","npar","nparallel","nparsl","npart","npolint","npr","nprcue","npre","nprec","npreceq","nrArr","nrarr","nrarrc","nrarrw","nRightarrow","nrightarrow","nrtri","nrtrie","nsc","nsccue","nsce","Nscr","nscr","nshortmid","nshortparallel","nsim","nsime","nsimeq","nsmid","nspar","nsqsube","nsqsupe","nsub","nsubE","nsube","nsubset","nsubseteq","nsubseteqq","nsucc","nsucceq","nsup","nsupE","nsupe","nsupset","nsupseteq","nsupseteqq","ntgl","ntlg","ntriangleleft","ntrianglelefteq","ntriangleright","ntrianglerighteq","Nu","nu","numero","numsp","nvap","nVDash","nVdash","nvDash","nvdash","nvge","nvgt","nvHarr","nvinfin","nvlArr","nvle","nvlt","nvltrie","nvrArr","nvrtrie","nvsim","nwarhk","nwArr","nwarr","nwarrow","nwnear","oast","ocir","Ocy","ocy","odash","Odblac","odblac","odiv","odot","odsold","OElig","oelig","ofcir","Ofr","ofr","ogon","ogt","ohbar","ohm","oint","olarr","olcir","olcross","oline","olt","Omacr","omacr","Omega","omega","Omicron","omicron","omid","ominus","Oopf","oopf","opar","OpenCurlyDoubleQuote","OpenCurlyQuote","operp","oplus","Or","orarr","ord","orderof","origof","oror","orslope","orv","oS","Oscr","oscr","osol","Otimes","otimes","otimesas","ovbar","OverBar","OverBrace","OverBracket","OverParenthesis","par","parallel","parsim","parsl","part","PartialD","Pcy","pcy","percnt","permil","perp","pertenk","Pfr","pfr","Phi","phi","phiv","phmmat","phone","Pi","pi","pitchfork","piv","planck","planckh","plankv","plus","plusacir","plusb","pluscir","plusdo","plusdu","pluse","PlusMinus","plussim","plustwo","pm","Poincareplane","pointint","Popf","popf","Pr","pr","prap","prcue","prE","prec","precapprox","preccurlyeq","Precedes","PrecedesEqual","PrecedesSlantEqual","PrecedesTilde","preceq","precnapprox","precneqq","precnsim","precsim","Prime","prime","primes","prnap","prnE","prnsim","prod","Product","profalar","profline","profsurf","Proportion","Proportional","propto","prsim","prurel","Pscr","pscr","Psi","psi","puncsp","Qfr","qfr","qint","Qopf","qopf","qprime","Qscr","qscr","quaternions","quatint","quest","questeq","rAarr","race","Racute","racute","radic","raemptyv","Rang","rang","rangd","range","rangle","Rarr","rArr","rarr","rarrap","rarrb","rarrbfs","rarrc","rarrfs","rarrhk","rarrlp","rarrpl","rarrsim","Rarrtl","rarrtl","rarrw","rAtail","ratail","ratio","rationals","RBarr","rBarr","rbarr","rbbrk","rbrack","rbrke","rbrksld","rbrkslu","Rcaron","rcaron","Rcedil","rcedil","rceil","rcub","Rcy","rcy","rdca","rdldhar","rdquo","rdquor","rdsh","Re","real","realine","realpart","reals","rect","ReverseElement","ReverseEquilibrium","ReverseUpEquilibrium","rfisht","rfloor","Rfr","rfr","rHar","rhard","rharu","rharul","Rho","rho","rhov","RightAngleBracket","RightArrow","Rightarrow","rightarrow","RightArrowBar","RightArrowLeftArrow","rightarrowtail","RightCeiling","RightDoubleBracket","RightDownTeeVector","RightDownVector","RightDownVectorBar","RightFloor","rightharpoondown","rightharpoonup","rightleftarrows","rightleftharpoons","rightrightarrows","rightsquigarrow","RightTee","RightTeeArrow","RightTeeVector","rightthreetimes","RightTriangle","RightTriangleBar","RightTriangleEqual","RightUpDownVector","RightUpTeeVector","RightUpVector","RightUpVectorBar","RightVector","RightVectorBar","ring","risingdotseq","rlarr","rlhar","rlm","rmoust","rmoustache","rnmid","roang","roarr","robrk","ropar","Ropf","ropf","roplus","rotimes","RoundImplies","rpar","rpargt","rppolint","rrarr","Rrightarrow","rsaquo","Rscr","rscr","Rsh","rsh","rsqb","rsquo","rsquor","rthree","rtimes","rtri","rtrie","rtrif","rtriltri","RuleDelayed","ruluhar","rx","Sacute","sacute","sbquo","Sc","sc","scap","Scaron","scaron","sccue","scE","sce","Scedil","scedil","Scirc","scirc","scnap","scnE","scnsim","scpolint","scsim","Scy","scy","sdot","sdotb","sdote","searhk","seArr","searr","searrow","semi","seswar","setminus","setmn","sext","Sfr","sfr","sfrown","sharp","SHCHcy","shchcy","SHcy","shcy","ShortDownArrow","ShortLeftArrow","shortmid","shortparallel","ShortRightArrow","ShortUpArrow","Sigma","sigma","sigmaf","sigmav","sim","simdot","sime","simeq","simg","simgE","siml","simlE","simne","simplus","simrarr","slarr","SmallCircle","smallsetminus","smashp","smeparsl","smid","smile","smt","smte","smtes","SOFTcy","softcy","sol","solb","solbar","Sopf","sopf","spades","spadesuit","spar","sqcap","sqcaps","sqcup","sqcups","Sqrt","sqsub","sqsube","sqsubset","sqsubseteq","sqsup","sqsupe","sqsupset","sqsupseteq","squ","Square","square","SquareIntersection","SquareSubset","SquareSubsetEqual","SquareSuperset","SquareSupersetEqual","SquareUnion","squarf","squf","srarr","Sscr","sscr","ssetmn","ssmile","sstarf","Star","starf","straightepsilon","straightphi","strns","Sub","subdot","subE","sube","subedot","submult","subnE","subne","subplus","subrarr","Subset","subset","subseteq","subseteqq","SubsetEqual","subsetneq","subsetneqq","subsim","subsub","subsup","succ","succapprox","succcurlyeq","Succeeds","SucceedsEqual","SucceedsSlantEqual","SucceedsTilde","succeq","succnapprox","succneqq","succnsim","succsim","SuchThat","Sum","sung","Sup","sup","supdot","supdsub","supE","supe","supedot","Superset","SupersetEqual","suphsol","suphsub","suplarr","supmult","supnE","supne","supplus","Supset","supset","supseteq","supseteqq","supsetneq","supsetneqq","supsim","supsub","supsup","swarhk","swArr","swarr","swarrow","swnwar","Tab","Tau","tau","tbrk","Tcaron","tcaron","Tcedil","tcedil","Tcy","tcy","tdot","telrec","Tfr","tfr","there4","Therefore","therefore","Theta","theta","thetasym","thetav","thickapprox","thicksim","ThickSpace","thinsp","ThinSpace","thkap","thksim","Tilde","tilde","TildeEqual","TildeFullEqual","TildeTilde","timesb","timesbar","timesd","tint","toea","topbot","topcir","Topf","topf","topfork","tosa","tprime","TRADE","trade","triangle","triangledown","triangleleft","trianglelefteq","triangleq","triangleright","trianglerighteq","tridot","trie","triminus","TripleDot","triplus","trisb","tritime","trpezium","Tscr","tscr","TScy","tscy","TSHcy","tshcy","Tstrok","tstrok","twixt","twoheadleftarrow","twoheadrightarrow","Uarr","uArr","uarr","Uarrocir","Ubrcy","ubrcy","Ubreve","ubreve","Ucy","ucy","udarr","Udblac","udblac","udhar","ufisht","Ufr","ufr","uHar","uharl","uharr","uhblk","ulcorn","ulcorner","ulcrop","ultri","Umacr","umacr","UnderBar","UnderBrace","UnderBracket","UnderParenthesis","Union","UnionPlus","Uogon","uogon","Uopf","uopf","UpArrow","Uparrow","uparrow","UpArrowBar","UpArrowDownArrow","UpDownArrow","Updownarrow","updownarrow","UpEquilibrium","upharpoonleft","upharpoonright","uplus","UpperLeftArrow","UpperRightArrow","Upsi","upsi","upsih","Upsilon","upsilon","UpTee","UpTeeArrow","upuparrows","urcorn","urcorner","urcrop","Uring","uring","urtri","Uscr","uscr","utdot","Utilde","utilde","utri","utrif","uuarr","uwangle","vangrt","varepsilon","varkappa","varnothing","varphi","varpi","varpropto","vArr","varr","varrho","varsigma","varsubsetneq","varsubsetneqq","varsupsetneq","varsupsetneqq","vartheta","vartriangleleft","vartriangleright","Vbar","vBar","vBarv","Vcy","vcy","VDash","Vdash","vDash","vdash","Vdashl","Vee","vee","veebar","veeeq","vellip","Verbar","verbar","Vert","vert","VerticalBar","VerticalLine","VerticalSeparator","VerticalTilde","VeryThinSpace","Vfr","vfr","vltri","vnsub","vnsup","Vopf","vopf","vprop","vrtri","Vscr","vscr","vsubnE","vsubne","vsupnE","vsupne","Vvdash","vzigzag","Wcirc","wcirc","wedbar","Wedge","wedge","wedgeq","weierp","Wfr","wfr","Wopf","wopf","wp","wr","wreath","Wscr","wscr","xcap","xcirc","xcup","xdtri","Xfr","xfr","xhArr","xharr","Xi","xi","xlArr","xlarr","xmap","xnis","xodot","Xopf","xopf","xoplus","xotime","xrArr","xrarr","Xscr","xscr","xsqcup","xuplus","xutri","xvee","xwedge","YAcy","yacy","Ycirc","ycirc","Ycy","ycy","Yfr","yfr","YIcy","yicy","Yopf","yopf","Yscr","yscr","YUcy","yucy","Yuml","Zacute","zacute","Zcaron","zcaron","Zcy","zcy","Zdot","zdot","zeetrf","ZeroWidthSpace","Zeta","zeta","Zfr","zfr","ZHcy","zhcy","zigrarr","Zopf","zopf","Zscr","zscr","zwj","zwnj","129","html_blocks","130","attr_value","attribute","open_tag","HTML_TAG_RE","131","132","UNESCAPE_MD_RE","isValidEntityCode","fromCodePoint","surrogate1","surrogate2","NAMED_ENTITY_RE","DIGITAL_ENTITY_TEST_RE","replaceEntityPattern","HTML_ESCAPE_TEST_RE","HTML_ESCAPE_REPLACE_RE","HTML_REPLACEMENTS","replaceUnsafeChar","unescapeMd","replaceEntities","escapeHtml","./entities","133","linkTarget","quotes","highlight","maxNesting","core","rules","inline","134","135","136","normalized","../common/utils","137","138","normalizeLink","level","posMax","validateLink","linkContent","./normalize_link","139","found","labelEnd","oldFlag","isInLabel","labelUnmatchedScopes","skipToken","140","141","Renderer","ParserCore","ParserBlock","ParserInline","Ruler","commonmark","StateCore","instance","inlineMode","renderer","preset","ruler","configure","presets","use","plugin","parseInline","renderInline","./common/utils","./configs/commonmark","./configs/default","./configs/full","./parser_block","./parser_core","./parser_inline","./renderer","./ruler","142","StateBlock","_rules","startLine","endLine","getRules","hasEmptyLines","skipEmptyLines","tShift","blkIndent","tight","parentType","TABS_SCAN_RE","NEWLINES_RE","SPACES_RE","outTokens","lineStart","lastTabPos","lineMax","./rules_block/blockquote","./rules_block/code","./rules_block/deflist","./rules_block/fences","./rules_block/footnote","./rules_block/heading","./rules_block/hr","./rules_block/htmlblock","./rules_block/lheading","./rules_block/list","./rules_block/paragraph","./rules_block/state_block","./rules_block/table","143","Core","./rules_core/abbr","./rules_core/abbr2","./rules_core/block","./rules_core/footnote_tail","./rules_core/inline","./rules_core/linkify","./rules_core/references","./rules_core/replacements","./rules_core/smartquotes","144","StateInline","cached_pos","cacheGet","cacheSet","ok","pending","pushPending","./rules_inline/autolink","./rules_inline/backticks","./rules_inline/del","./rules_inline/emphasis","./rules_inline/entity","./rules_inline/escape","./rules_inline/footnote_inline","./rules_inline/footnote_ref","./rules_inline/htmltag","./rules_inline/ins","./rules_inline/links","./rules_inline/mark","./rules_inline/newline","./rules_inline/state_inline","./rules_inline/sub","./rules_inline/sup","./rules_inline/text","145","getBreak","./rules","146","__rules__","__cache__","__find__","__compile__","chains","rule","altName","chain","at","beforeName","ruleName","afterName","chainName","147","blockquote_open","blockquote_close","fence","fenceName","langClass","langName","fence_custom","heading_open","hLevel","heading_close","hr","bullet_list_open","bullet_list_close","list_item_open","list_item_close","ordered_list_open","ordered_list_close","paragraph_open","paragraph_close","addBreak","link_open","link_close","table_open","table_close","thead_open","thead_close","tbody_open","tbody_close","tr_open","tr_close","th_open","align","th_close","td_open","td_close","strong_open","strong_close","em_open","em_close","del_open","del_close","ins_open","ins_close","mark_open","mark_close","hardbreak","softbreak","htmlblock","htmltag","abbr_open","abbr_close","footnote_ref","subId","footnote_block_open","footnote_block_close","footnote_open","footnote_close","footnote_anchor","dl_open","dt_open","dd_open","dl_close","dt_close","dd_close","nextToken","148","nextLine","lastLineEmpty","oldTShift","oldBMarks","oldIndent","oldParentType","terminatorRules","terminate","bMarks","eMarks","skipSpaces","149","getLines","150","skipMarker","contentStart","ddLine","dtLine","itemLines","listLines","listTokIdx","oldDDIndent","oldTight","prevEmptyEnd","ddIndent","OUTER","markTightParagraphs","151","mem","haveEndMarker","skipChars","152","oldBMark","label","footnotes","refs","153","skipCharsBack","154","cnt","155","block_names","HTML_TAG_OPEN_RE","HTML_TAG_CLOSE_RE","lc","../common/html_blocks","156","157","skipBulletListMarker","skipOrderedListMarker","posAfterMarker","indentAfterMarker","markerValue","markerCharCode","isOrdered","158","159","indent_found","begin","keepLastLF","getLine","lineText","rows","aligns","tableLines","tbodyLines","parseLinkLabel","parseAbbr","parserInline","abbreviations","../helpers/parse_link_label","../rules_inline/state_inline","PUNCT_CHARS","regEscape","regText","blockTokens","abbrRegExp","lastParagraph","currentLabel","insideRef","refTokens","LINK_SCAN_RE","createLinkifier","links","autolinker","linker","ln","htmlLinkLevel","linkifier","parseLinkDestination","parseLinkTitle","normalizeReference","parseReference","references","../helpers/normalize_reference","../helpers/parse_link_destination","../helpers/parse_link_title","RARE_RE","SCOPED_ABBR_RE","SCOPED_ABBR","tm","inlineTokens","blkIdx","QUOTE_TEST_RE","QUOTE_RE","PUNCT_RE","isLetter","replaceAt","thisLevel","lastSpace","nextSpace","canOpen","canClose","isSingle","single","url_schemas","EMAIL_RE","AUTOLINK_RE","tail","linkMatch","emailMatch","fullUrl","../common/url_schemas","../helpers/normalize_link","matchStart","matchEnd","lastChar","nextChar","isAlphaNum","scanDelims","can_open","can_close","delims","startCount","oldCount","newCount","DIGITAL_RE","NAMED_RE","../common/entities","ESCAPED","labelStart","footnoteId","oldLength","linkLevel","footnoteSubId","../common/html_re","ref","isImage","pmax","pendingLevel","UNESCAPE_RE","isTerminatorChar","toPath","to-object-path","WHITESPACE","ALLOWED_TAGS_REGEX","allowableTags","depth","tagBuffer","inQuote","tagsArray","parseAllowableTags","consumeCharacter","flushTagBuffer","nonWhitespaceSeen","normalizeTagBuffer","terminator","hasFlag","stdout","isTTY","util","slashes","auth","port","hostname","search","query","pathname","resolveObject","protocolPattern","portPattern","simplePathPattern","unwise","autoEscape","nonHostChars","hostEndingChars","hostnamePartPattern","hostnamePartStart","unsafeProtocol","javascript","javascript:","hostlessProtocol","slashedProtocol","http","https","ftp","gopher","http:","https:","ftp:","gopher:","file:","querystring","parseQueryString","slashesDenoteHost","queryIndex","splitter","uSplit","rest","simplePath","lowerProto","atSign","hostEnd","hec","parseHost","ipv6Hostname","hostparts","newpart","validParts","notHost","bit","ae","qm","tkeys","tk","tkey","rkeys","rk","rkey","relPath","isSourceAbs","isRelAbs","mustEndAbs","removeAllDots","srcPath","psychotic","isNullOrUndefined","authInHost","isNull","hasTrailingSlash","./util","Handlebars","handlebars-helpers","itemPicker","comboBox","originalTemplate","kendo","template","extendedQueryOptions","originalText","originalButtonText","extendedTemplate","alternateText","alternateButtonText","originalDataSourceOptions","queryOptions","dataSource","schema","schemaModel","pageSize","virtualizeOptions","serverFiltering","serverSorting","serverPaging","extendedDataSourceOptions","usingMvcForAjax","dataSourcesViewModel","observable","originalDataSource","DataSource","extendedDataSource","extendedSearch","toggleDataSource","setDataSource","setOptions","footerTemplate","returnToOriginalDataSource","comboBoxOptions","dataTextField","dataValueField","displayTemplate","placeholder","placeHolder","dataBound","dropdownHeight","minLength","enforceMinLength","virtual","sender","filtering","hideDropdown","autoBind","allowExtendedQuery","virtualizeResults","itemHeight","valueMapper","convertValues","kendoComboBox","widget","wrapper","clearButton","keydown","keyup","fields","Id","Text","gridPrefix","filterOperatorReadableReplacements","startswith","endswith","doesnotcontain","neq","isempty","isnotempty","showInactive","deleteKendoUiWindowOptions","minHeight","modal","pinned","draggable","resizable","actions","restoreKendoUiWindowOptions","deleteConfirmedKendoUiWindowOptions","autoFocus","saveGridOptionsToSessionStorage","entityType","sessionStorage","setItem","loadGridOptionsFromSessionStorage","getItem","clearAllGridOptions","removeSessionStorageItemsByPrefix","clearAllOtherGridOptions","gridToPreserve","keyToPreserve","removeItem","applyExcelExportEventAnimation","excelExport","gridName","newGrid","kendoGrid","getOptions","columns","column","saveAsExcel","splitStringArrayIntoCommaSeparatedWithAnd","setFilterText","grid","filterTexts","gridFilter","currentFilters","filterIndex","filterText","propertyText","compositeOperator","logic","compositeFilters","compositeFilterText","compositeFilterIndex","compositeFilter","Property","FilterText","sortedFilters","textA","textB","sortedFilterTexts","$toolbar","$clearFilterButton","$filterText","$activeToggleButton","applyClearFilterClickEvent","$gridButton","activeFilter","getActiveFilter","applyGridDataBound","controllerName","toggleGridActiveState","setGridToInactiveDisplay","applyGridDataBindings","stringifiedOptions","applyingFilters","ui","loadedOptions","filterToAdd","showingInactive","deleteGridItem","controller","dataItem","datasource","restoreGridItem","stopScroll","wheelDelta","detail","confirmationWindow","successText","yesButtonText","noButtonText","windowTitle","windowData","genericConfirmTemplate","genericConfirmConfirmedTemplate","$genericConfirmWindow","kendoWindow","$genericConfirmConfirmedWindow","removeItemFromTreeViewDataSource","pageModelPropertyWithItems","textOfItemToRemove","removeItemFromTreeViewRecursively","matchedItem","items","setNewlyAddedOnGrid","gridSelector","cssClassSuffixForIdColumn","keyName","ko","mapping","B","dependentObservable","observe","C","H","G","g","mappedProperties","copiedProperties","arrayGetDistinctValues","J","I","deferEvaluation","K","N","P","Q","isWriteableObservable","O","arrayRemoveItem","R","_wrapper","__DO","unwrapObservable","arrayMap","z","A","save","isMapped","fromJS","ai","T","aj","al","S","an","aa","ao","U","isObservable","observableArray","mappedRemove","mappedRemoveAll","mappedDestroy","destroy","mappedDestroyAll","mappedIndexOf","mappedGet","mappedCreate","ah","ag","am","ad","ak","X","Z","arrayChanged","arrayForEach","ar","aq","V","ab","throttleEvaluation","fromJSON","parseJson","updateFromJS","updateFromJSON","toJS","resetDefaultOptions","visitModel","stringifyJson","defaultOptions","visitedObjects","parentName","globalModel","callingPopup","markedClean","flip","extenders","dirty","startDirty","globalCleanValueJson","cleanValue","dirtyOverride","isDirty","globalCleanValue","globalTargetValue","subscribe","popup","animateCss","onbeforeunload","markClean","markDirty","bindingHandlers","stopBinding","controlsDescendantBindings","bidirectionVisible","valueAccessor","MutationObserver","mutations","mutationRecord","attributeFilter","isCurrentlyVisible","validation","seedId","domData","domDataKey","kv","koUtils","elementNamesWithValidationMessage","registerExtenders","messagesOnModified","errorsAsTitle","errorsAsTitleOnModified","messageTemplate","insertMessages","parseInputAttributes","writeInputAttributes","decorateInputElement","decorateElementOnModified","errorClass","errorElementClass","errorMessageClass","allowHtmlMessages","grouping","live","validate","configuration","html5Attributes","html5InputTypes","isObservableArray","getValue","hasAttribute","isValidatable","isModified","newNode","newId","getConfigOptions","contextFor","setDomData","getDomData","isEmptyVal","getOriginalElementTitle","savedOriginalTitle","currentTitle","setImmediate","api","isInitialized","cleanUpSubscriptions","subscriptions","subscription","dispose","runTraversal","validatables","traverseGraph","objValues","__kv_traversed","flagged","validatable","graphMonitor","valueHasMutated","_destroy","isComputed","collectErrors","force","showAllMessages","isAnyMessageShown","predicate","arrayFilter","arrayFirst","_updateState","newValue","formatMessage","typeAttr","replacements","addRule","addAnonymousRule","ruleObj","onlyIf","condition","addExtender","insertValidationMessage","span","$element","nextIsExplanation","allInputs","skipInsert","parseInputValidationAttributes","currentType","writeInputValidationAttributes","disposeWhenNodeIsRemoved","makeBindingHandlerValidatable","handlerName","allBindingsAccessor","viewModel","bindingContext","setRules","definition","ruleDefinitions","targetValue","unwrappedTargetValue","nonRules","minMaxValidatorFactory","validatorName","isMaxValidation","comparisonValue","valMatches","comparisonValueMatches","validateAsync","isValidating","callBack","valObj","__valid__","validator","required","testVal","maxLength","dif","otherValue","external","externalValue","validationMessageElement","renderTemplate","applyBindingsToNode","validationMessage","validationElement","textInput","obsv","isVisible","setHtml","$input","inputValue","checkedValue","$formGroup","setInputToPass","setInputToFailed","shouldShow","hasModification","data-orig-title","newConfig","validationOptions","throttle","setError","previousError","previousIsValid","notifySubscribers","clearError","h_change","h_obsValidationTrigger","validateObservable","_disposeValidation","removeAll","ruleContexts","_currentLocale","_locales","localize","msgTranslations","applyBindingsWithValidation","rootNode","applyBindings","origApplyBindings","inputsProcessed","validatedObservable","initialValue","getParameterByName","submitProject","projectId","pageModel","oldValues","oldIndexes","getOffset","useAbsolutePositioning","scrollX","scrollY","hideWithScroll","curScroll","prevScroll","prevDirection","toggleHeader","classList","gridExpand","gridId","storedIds","masterRow","storedArrary","gridCollapse","expandStashedSite","savedIds","row","expandRow","confirmAction","showWindow","confirmed","onModalClose","showSuccessOkWindow","dfd","confirmationDialog","showOkWindow","commonPartColor","additionColor","deletionColor","diffSentence","color","showCustomWindow","buttonText","onCloseFunction","defaultButtonText","showWindowWithTwoOptions","firstButtonText","secondButtonText","includeCancel","isSaving","beginSaving","savingText","nonAjaxPost","urlToPostTo","cancelUrl","form","cancelUrlInput","dataInput","endSaving","showValidationErrorWindow","validationErrorDiv","scrollToElement","showLargeErrorWindow","stacktrace","errorDiv","showErrorWindow","showSuccessWindow","showActionButtons","onOpen","showViewListButton","viewListUrl","returnToUrl","returnToText","viewListText","closeText","successDiv","successDialog","wizardValidateAndSubmit","postUrl","manualUrl","previousStepUrl","nextStepUrl","stepData","canSave","viewListButtonUrl","noButtons","stepUrl","validateAndSubmit","KoIsDirtyExtension","markEntirePageClean","validateAndSubmitModal","onSuccess","jsonModel","globalData","Exception","textStatus","errorThrown","validateAndSubmitCustomAction","validateArrary","validateModel","performAjaxPageAction","executingMessage","getSelectedItems","selectedItems","availableItems","propertyComparer","selectedPropertyComparers","matchingValue","stripTags","closeModal","clearIFrame","formatDate","offsetMs","includeOffset","offsetValue","offsetRealValue","SetChangesIconsForGridSelector","unapprovedChanges","unapprovedAddition","unapprovedDeletion","completedQuestions","materialReviewQuestions","questionAnswers","hasReviewQuestions","reviewQuestions","exportGridToExcelByHtmlSelector","kendoGridSelector","exportGridToExcelByKendoGrid","kendoGridObject","bindCustomExportEvent","excel","allPages","deferToPromise","sheet","workbook","sheets","columnMaxCharCounts","rowIndex","heightMultiplier","cellIndex","cells","cellMaxCharLength","cell","stringsSplitByLineBreaks","currentMaxCharCount","ColumnIndex","CharCount","maxCharLength","autoWidth","originalRootKoModels","setupAllObservabletProperties","memberName","member","processKoModelToJson","rootModel","clonedModel","deepCloneToJSWithIgnoresAndSorts","rootIsObservable","rootIsComputed","ignoringDirty","arraySorted","newArray","processedElement","newObject","processedValue","ignoreDirty","defaultSort","sortExpression","expression","referencesToHookedUpModels","modelHasChangesFunction","modelsHaveNoChangesFunction","koDirtyExtensionDebug","modelChangedFunction","currentModelJson","originalRootModelJson","memberThatChanged","hasChanges","checkAllModelsForChanges","executeModelsChangedActions","propIdentifier","markModelClean","modelReference","identifer","modelreference","setDebug","setChangeFunctions","ifModelHasChangesFunction","ifModelsHaveNoChangesFunction","setupKnockoutModel","knockoutRootModel","modelIdentifier","objValue","Parallax","refresh","imageSrc","positions","positionX","positionY","navigator","userAgent","iosFix","backgroundImage","backgroundSize","backgroundPosition","androidFix","$mirror","slider","sliderExisted","$slider","naturalHeight","naturalWidth","aspectRatio","isSetup","sliders","isFresh","requestRender","lastTime","vendors","requestAnimationFrame","cancelAnimationFrame","currTime","timeToCall","bleed","overScrollFix","boxWidth","outerWidth","boxHeight","outerHeight","boxOffsetTop","boxOffsetLeft","boxOffsetBottom","winHeight","docHeight","maxOffset","minOffset","imageHeightMin","imageOffsetMin","imageWidth","imageHeight","offsetBaseTop","offsetLeft","overScroll","scrollBottom","mirrorTop","mirrorLeft","offsetTop","transform","winWidth","docWidth","isBusy","$doc","$win","loadDimensions","loadScrollPosition","winScrollTop","scrollTopMax","scrollLeftMax","parallaxElement","parallax","$this","Constructor","previousDataTriggerItemIds","checkboxes","dropDownLists","activeTriggerQuestions","removeActiveTrigger","triggerControl","updateExistingTriggers","triggersToRemove","questionControl","areAllTriggersOff","HideFromDropDown","updateHeader","checkCheckbox","currentCheckbox","dataTriggerItemIds","dataTriggerItemId","questionToTriggerControl","controlImmediatelyFollows","ShowReviewQuestionsInDropdownFromTriggeredQuestions","HideReviewQuestionsInDropdownFromUntriggeredQuestions","$reviewQuestion","childReviewQuestion","questionId","currentAnswer","checkDropDown","dict","index2","HideReviewQuestionsInDropdownFromUntriggeredQuestionsNew","hided","dropDown","questionControlToCheck","currentDropDownList","firstQuestionRow","secondQuestionRow","firstQuestionRowIndex","secondQuestionRowIndex","_private","fieldValue","$field","fieldSettings","explicitState","currentState","isCheckbox","isChecked","$parent","pass","$fields","fieldPass","states","onPass","onFail","isIgnored","last2Chars","_validations","notEmpty","isAlpha","isAlphaNumeric","hasLength","_init","$form","validations","fillFieldDefaults","publicFields","buildPublicFields","currentPublicFields","getElement","StateManager","clearValidationStyles","$parentElement","$label","$glyphicon","checkedRadio","validateCurrentTab","targetedWizard","currentTabIsValid","currentTabHref","tabResult","templateSelector","templateOutputDivSelector","objectHasProperty","tooltip","inState","popover","slideToggleBool","pathArray","homePageUrl","menuTransformOffSet","setAffixContainerSize","parentPadding","elementPadding","innerWidth","pushState","$anchor","affix","resize","$body","navHeight","scrollspy","backToTop","toBottom","scrollTriggerRemoval","sr","ScrollReveal","reveal","distance","magnificPopup","tLoading","mainClass","gallery","navigateByImgClick","preload","tError","animationName","animationEnd","animations","OAnimation","MozAnimation","WebkitAnimation"],"mappings":"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PC,IAAO,SACPC,IAAO,QACPC,IAAO,UACPC,IAAO,WACPC,IAAO,QACPC,IAAO,QACPC,IAAO,SACPC,IAAO,UACPC,IAAO,QACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,UACPC,IAAO,QACPC,IAAO,SACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,QACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,QACPC,IAAO,OACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,UACPC,IAAO,QACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,QACPC,IAAO,UACPC,IAAO,SACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,UACPC,IAAO,QACPC,IAAO,SACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,QACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,QACPC,IAAO,OACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,UACPC,IAAO,QACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,QACPC,IAAO,UACPC,IAAO,SACPC,IAAO,QACPC,IAAO,SACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,SACPC,IAAO,QACPC,IAAO,QACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,SACPC,IAAO,QACPC,IAAO,QACPC,IAAO,SACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,QACPC,IAAO,QACPC,IAAO,UACPC,IAAO,SACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,SACPC,IAAO,SACPC,IAAO,SACPC,IAAO,QACPC,IAAO,UACPC,IAAO,SACPC,IAAO,SACPC,IAAO,SACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,OACPC,IAAO,OACPC,IAAO,SACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,SACPC,IAAO,UACPC,IAAO,UACPC,IAAO,SACPC,IAAO,SACPC,IAAO,SACPC,IAAO,SACPC,IAAO,SACPC,IAAO,SACPC,IAAO,QACPC,IAAO,UACPC,IAAO,UACPC,IAAO,QACPC,IAAO,QACPC,IAAO,UACPC,IAAO,UACPC,IAAO,QACPC,IAAO,SACPC,IAAO,UACPC,IAAO,SACPC,IAAO,QACPC,IAAO,SACPC,IAAO,SACPC,IAAO,OACPC,IAAO,QACPC,IAAO,QACPC,IAAO,SACPC,IAAO,0BACPC,IAAO,aACPC,IAAO,SACPC,IAAO,QACPC,IAAO,SACPC,IAAO,SACPC,IAAO,WACPC,IAAO,QACPC,IAAO,OACPC,IAAO,SACPC,IAAO,QACPC,IAAO,SACP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aAA,CAEX,aAAc+sQ,EAFH/sQ,GAKZitQ,EAAWjtQ,EAAQ,yCAARA,CACV,YAAagtQ,EADHhtQ,GAUXktQ,EAAcltQ,EAAQ,+DAARA,CACb,WAAYitQ,EADCjtQ,CAEb,YARW,8BAMEA,CAGb,UARS,2BAKIA,CAIb,aARY,cAICA,CAKb,cARa,oBAGAA,CAMb,QARO,6CAEMA,GAUlB1I,EAAOD,QAAQ61Q,YAAcA,GAE9B,IAAKC,IAAK,CAAC,SAAU5gQ,EAASjV,EAAQD,GAIrC,aAGAC,EAAOD,QAAU,CACb,OACA,MACA,aACA,MACA,OACA,QACA,OACA,MACA,MACA,OACA,OACA,MACA,OACA,MACA,OACA,MACA,MACA,KACA,SACA,OACA,OACA,QACA,MACA,OACA,KACA,OACA,OACA,MACA,OACA,YACA,WACA,YACA,WACA,OACA,SACA,MACA,OACA,QACA,OACA,UACA,OACA,MACA,KACA,MACA,OACA,kBACA,MACA,OACA,OACA,UACA,UACA,QACA,QACA,MACA,OACA,MACA,OACA,YACA,aACA,MACA,MACA,SACA,OACA,cACA,SACA,MACA,KACA,MACA,QACA,KACA,MACA,OACA,cACA,cACA,eACA,OACA,UACA,UACA,YACA,MACA,MACA,MACA,MACA,aACA,KACA,UACA,UACA,OACA,SACA,SACA,mBACA,0BACA,UACA,MACA,kBACA,qBACA,MACA,MACA,OACA,WACA,OACA,SACA,OACA,KACA,MACA,eACA,QACA,MACA,OACA,MACA,MACA,OACA,OACA,OACA,MACA,MACA,UACA,SACA,QACA,SACA,OACA,SACA,UACA,MACA,UACA,QACA,SACA,MACA,QACA,MACA,OACA,YACA,WACA,QACA,OACA,QACA,MACA,WACA,MACA,QACA,OACA,aACA,OACA,MACA,QACA,MACA,SACA,UACA,MACA,QACA,MACA,YACA,SACA,MACA,SACA,SACA,WACA,cACA,SACA,OACA,UACA,QACA,MACA,UAGL,IAAK+1Q,IAAK,CAAC,SAAU7gQ,EAASjV,EAAQD,GACrC,aAcA,IAAIwgJ,EAASz5I,OAA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","file":"site.min.js","sourcesContent":["(function (global, factory) {\r\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\r\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\r\n (global = global || self, factory(global.Diff = {}));\r\n}(this, (function (exports) { 'use strict';\r\n\r\n function Diff() {}\r\n Diff.prototype = {\r\n diff: function diff(oldString, newString) {\r\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\r\n var callback = options.callback;\r\n\r\n if (typeof options === 'function') {\r\n callback = options;\r\n options = {};\r\n }\r\n\r\n this.options = options;\r\n var self = this;\r\n\r\n function done(value) {\r\n if (callback) {\r\n setTimeout(function () {\r\n callback(undefined, value);\r\n }, 0);\r\n return true;\r\n } else {\r\n return value;\r\n }\r\n } // Allow subclasses to massage the input prior to running\r\n\r\n\r\n oldString = this.castInput(oldString);\r\n newString = this.castInput(newString);\r\n oldString = this.removeEmpty(this.tokenize(oldString));\r\n newString = this.removeEmpty(this.tokenize(newString));\r\n var newLen = newString.length,\r\n oldLen = oldString.length;\r\n var editLength = 1;\r\n var maxEditLength = newLen + oldLen;\r\n var bestPath = [{\r\n newPos: -1,\r\n components: []\r\n }]; // Seed editLength = 0, i.e. the content starts with the same values\r\n\r\n var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);\r\n\r\n if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {\r\n // Identity per the equality and tokenizer\r\n return done([{\r\n value: this.join(newString),\r\n count: newString.length\r\n }]);\r\n } // Main worker method. checks all permutations of a given edit length for acceptance.\r\n\r\n\r\n function execEditLength() {\r\n for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {\r\n var basePath = void 0;\r\n\r\n var addPath = bestPath[diagonalPath - 1],\r\n removePath = bestPath[diagonalPath + 1],\r\n _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;\r\n\r\n if (addPath) {\r\n // No one else is going to attempt to use this value, clear it\r\n bestPath[diagonalPath - 1] = undefined;\r\n }\r\n\r\n var canAdd = addPath && addPath.newPos + 1 < newLen,\r\n canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen;\r\n\r\n if (!canAdd && !canRemove) {\r\n // If this path is a terminal then prune\r\n bestPath[diagonalPath] = undefined;\r\n continue;\r\n } // Select the diagonal that we want to branch from. We select the prior\r\n // path whose position in the new string is the farthest from the origin\r\n // and does not pass the bounds of the diff graph\r\n\r\n\r\n if (!canAdd || canRemove && addPath.newPos < removePath.newPos) {\r\n basePath = clonePath(removePath);\r\n self.pushComponent(basePath.components, undefined, true);\r\n } else {\r\n basePath = addPath; // No need to clone, we've pulled it from the list\r\n\r\n basePath.newPos++;\r\n self.pushComponent(basePath.components, true, undefined);\r\n }\r\n\r\n _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done\r\n\r\n if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) {\r\n return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken));\r\n } else {\r\n // Otherwise track this path as a potential candidate and continue.\r\n bestPath[diagonalPath] = basePath;\r\n }\r\n }\r\n\r\n editLength++;\r\n } // Performs the length of edit iteration. Is a bit fugly as this has to support the\r\n // sync and async mode which is never fun. Loops over execEditLength until a value\r\n // is produced.\r\n\r\n\r\n if (callback) {\r\n (function exec() {\r\n setTimeout(function () {\r\n // This should not happen, but we want to be safe.\r\n\r\n /* istanbul ignore next */\r\n if (editLength > maxEditLength) {\r\n return callback();\r\n }\r\n\r\n if (!execEditLength()) {\r\n exec();\r\n }\r\n }, 0);\r\n })();\r\n } else {\r\n while (editLength <= maxEditLength) {\r\n var ret = execEditLength();\r\n\r\n if (ret) {\r\n return ret;\r\n }\r\n }\r\n }\r\n },\r\n pushComponent: function pushComponent(components, added, removed) {\r\n var last = components[components.length - 1];\r\n\r\n if (last && last.added === added && last.removed === removed) {\r\n // We need to clone here as the component clone operation is just\r\n // as shallow array clone\r\n components[components.length - 1] = {\r\n count: last.count + 1,\r\n added: added,\r\n removed: removed\r\n };\r\n } else {\r\n components.push({\r\n count: 1,\r\n added: added,\r\n removed: removed\r\n });\r\n }\r\n },\r\n extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) {\r\n var newLen = newString.length,\r\n oldLen = oldString.length,\r\n newPos = basePath.newPos,\r\n oldPos = newPos - diagonalPath,\r\n commonCount = 0;\r\n\r\n while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {\r\n newPos++;\r\n oldPos++;\r\n commonCount++;\r\n }\r\n\r\n if (commonCount) {\r\n basePath.components.push({\r\n count: commonCount\r\n });\r\n }\r\n\r\n basePath.newPos = newPos;\r\n return oldPos;\r\n },\r\n equals: function equals(left, right) {\r\n if (this.options.comparator) {\r\n return this.options.comparator(left, right);\r\n } else {\r\n return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase();\r\n }\r\n },\r\n removeEmpty: function removeEmpty(array) {\r\n var ret = [];\r\n\r\n for (var i = 0; i < array.length; i++) {\r\n if (array[i]) {\r\n ret.push(array[i]);\r\n }\r\n }\r\n\r\n return ret;\r\n },\r\n castInput: function castInput(value) {\r\n return value;\r\n },\r\n tokenize: function tokenize(value) {\r\n return value.split('');\r\n },\r\n join: function join(chars) {\r\n return chars.join('');\r\n }\r\n };\r\n\r\n function buildValues(diff, components, newString, oldString, useLongestToken) {\r\n var componentPos = 0,\r\n componentLen = components.length,\r\n newPos = 0,\r\n oldPos = 0;\r\n\r\n for (; componentPos < componentLen; componentPos++) {\r\n var component = components[componentPos];\r\n\r\n if (!component.removed) {\r\n if (!component.added && useLongestToken) {\r\n var value = newString.slice(newPos, newPos + component.count);\r\n value = value.map(function (value, i) {\r\n var oldValue = oldString[oldPos + i];\r\n return oldValue.length > value.length ? oldValue : value;\r\n });\r\n component.value = diff.join(value);\r\n } else {\r\n component.value = diff.join(newString.slice(newPos, newPos + component.count));\r\n }\r\n\r\n newPos += component.count; // Common case\r\n\r\n if (!component.added) {\r\n oldPos += component.count;\r\n }\r\n } else {\r\n component.value = diff.join(oldString.slice(oldPos, oldPos + component.count));\r\n oldPos += component.count; // Reverse add and remove so removes are output first to match common convention\r\n // The diffing algorithm is tied to add then remove output and this is the simplest\r\n // route to get the desired output with minimal overhead.\r\n\r\n if (componentPos && components[componentPos - 1].added) {\r\n var tmp = components[componentPos - 1];\r\n components[componentPos - 1] = components[componentPos];\r\n components[componentPos] = tmp;\r\n }\r\n }\r\n } // Special case handle for when one terminal is ignored (i.e. whitespace).\r\n // For this case we merge the terminal into the prior string and drop the change.\r\n // This is only available for string mode.\r\n\r\n\r\n var lastComponent = components[componentLen - 1];\r\n\r\n if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) {\r\n components[componentLen - 2].value += lastComponent.value;\r\n components.pop();\r\n }\r\n\r\n return components;\r\n }\r\n\r\n function clonePath(path) {\r\n return {\r\n newPos: path.newPos,\r\n components: path.components.slice(0)\r\n };\r\n }\r\n\r\n var characterDiff = new Diff();\r\n function diffChars(oldStr, newStr, options) {\r\n return characterDiff.diff(oldStr, newStr, options);\r\n }\r\n\r\n function generateOptions(options, defaults) {\r\n if (typeof options === 'function') {\r\n defaults.callback = options;\r\n } else if (options) {\r\n for (var name in options) {\r\n /* istanbul ignore else */\r\n if (options.hasOwnProperty(name)) {\r\n defaults[name] = options[name];\r\n }\r\n }\r\n }\r\n\r\n return defaults;\r\n }\r\n\r\n //\r\n // Ranges and exceptions:\r\n // Latin-1 Supplement, 0080–00FF\r\n // - U+00D7 × Multiplication sign\r\n // - U+00F7 ÷ Division sign\r\n // Latin Extended-A, 0100–017F\r\n // Latin Extended-B, 0180–024F\r\n // IPA Extensions, 0250–02AF\r\n // Spacing Modifier Letters, 02B0–02FF\r\n // - U+02C7 ˇ ˇ Caron\r\n // - U+02D8 ˘ ˘ Breve\r\n // - U+02D9 ˙ ˙ Dot Above\r\n // - U+02DA ˚ ˚ Ring Above\r\n // - U+02DB ˛ ˛ Ogonek\r\n // - U+02DC ˜ ˜ Small Tilde\r\n // - U+02DD ˝ ˝ Double Acute Accent\r\n // Latin Extended Additional, 1E00–1EFF\r\n\r\n var extendedWordChars = /^[A-Za-z\\xC0-\\u02C6\\u02C8-\\u02D7\\u02DE-\\u02FF\\u1E00-\\u1EFF]+$/;\r\n var reWhitespace = /\\S/;\r\n var wordDiff = new Diff();\r\n\r\n wordDiff.equals = function (left, right) {\r\n if (this.options.ignoreCase) {\r\n left = left.toLowerCase();\r\n right = right.toLowerCase();\r\n }\r\n\r\n return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right);\r\n };\r\n\r\n wordDiff.tokenize = function (value) {\r\n // All whitespace symbols except newline group into one token, each newline - in separate token\r\n var tokens = value.split(/([^\\S\\r\\n]+|[()[\\]{}'\"\\r\\n]|\\b)/); // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set.\r\n\r\n for (var i = 0; i < tokens.length - 1; i++) {\r\n // If we have an empty string in the next field and we have only word chars before and after, merge\r\n if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) {\r\n tokens[i] += tokens[i + 2];\r\n tokens.splice(i + 1, 2);\r\n i--;\r\n }\r\n }\r\n\r\n return tokens;\r\n };\r\n\r\n function diffWords(oldStr, newStr, options) {\r\n options = generateOptions(options, {\r\n ignoreWhitespace: true\r\n });\r\n return wordDiff.diff(oldStr, newStr, options);\r\n }\r\n function diffWordsWithSpace(oldStr, newStr, options) {\r\n return wordDiff.diff(oldStr, newStr, options);\r\n }\r\n\r\n var lineDiff = new Diff();\r\n\r\n lineDiff.tokenize = function (value) {\r\n var retLines = [],\r\n linesAndNewlines = value.split(/(\\n|\\r\\n)/); // Ignore the final empty token that occurs if the string ends with a new line\r\n\r\n if (!linesAndNewlines[linesAndNewlines.length - 1]) {\r\n linesAndNewlines.pop();\r\n } // Merge the content and line separators into single tokens\r\n\r\n\r\n for (var i = 0; i < linesAndNewlines.length; i++) {\r\n var line = linesAndNewlines[i];\r\n\r\n if (i % 2 && !this.options.newlineIsToken) {\r\n retLines[retLines.length - 1] += line;\r\n } else {\r\n if (this.options.ignoreWhitespace) {\r\n line = line.trim();\r\n }\r\n\r\n retLines.push(line);\r\n }\r\n }\r\n\r\n return retLines;\r\n };\r\n\r\n function diffLines(oldStr, newStr, callback) {\r\n return lineDiff.diff(oldStr, newStr, callback);\r\n }\r\n function diffTrimmedLines(oldStr, newStr, callback) {\r\n var options = generateOptions(callback, {\r\n ignoreWhitespace: true\r\n });\r\n return lineDiff.diff(oldStr, newStr, options);\r\n }\r\n\r\n var sentenceDiff = new Diff();\r\n\r\n sentenceDiff.tokenize = function (value) {\r\n return value.split(/(\\S.+?[.!?])(?=\\s+|$)/);\r\n };\r\n\r\n function diffSentences(oldStr, newStr, callback) {\r\n return sentenceDiff.diff(oldStr, newStr, callback);\r\n }\r\n\r\n var cssDiff = new Diff();\r\n\r\n cssDiff.tokenize = function (value) {\r\n return value.split(/([{}:;,]|\\s+)/);\r\n };\r\n\r\n function diffCss(oldStr, newStr, callback) {\r\n return cssDiff.diff(oldStr, newStr, callback);\r\n }\r\n\r\n function _typeof(obj) {\r\n \"@babel/helpers - typeof\";\r\n\r\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\r\n _typeof = function (obj) {\r\n return typeof obj;\r\n };\r\n } else {\r\n _typeof = function (obj) {\r\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\r\n };\r\n }\r\n\r\n return _typeof(obj);\r\n }\r\n\r\n function _toConsumableArray(arr) {\r\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\r\n }\r\n\r\n function _arrayWithoutHoles(arr) {\r\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\r\n }\r\n\r\n function _iterableToArray(iter) {\r\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\r\n }\r\n\r\n function _unsupportedIterableToArray(o, minLen) {\r\n if (!o) return;\r\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\r\n var n = Object.prototype.toString.call(o).slice(8, -1);\r\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\r\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\r\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\r\n }\r\n\r\n function _arrayLikeToArray(arr, len) {\r\n if (len == null || len > arr.length) len = arr.length;\r\n\r\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\r\n\r\n return arr2;\r\n }\r\n\r\n function _nonIterableSpread() {\r\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\r\n }\r\n\r\n var objectPrototypeToString = Object.prototype.toString;\r\n var jsonDiff = new Diff(); // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a\r\n // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:\r\n\r\n jsonDiff.useLongestToken = true;\r\n jsonDiff.tokenize = lineDiff.tokenize;\r\n\r\n jsonDiff.castInput = function (value) {\r\n var _this$options = this.options,\r\n undefinedReplacement = _this$options.undefinedReplacement,\r\n _this$options$stringi = _this$options.stringifyReplacer,\r\n stringifyReplacer = _this$options$stringi === void 0 ? function (k, v) {\r\n return typeof v === 'undefined' ? undefinedReplacement : v;\r\n } : _this$options$stringi;\r\n return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, ' ');\r\n };\r\n\r\n jsonDiff.equals = function (left, right) {\r\n return Diff.prototype.equals.call(jsonDiff, left.replace(/,([\\r\\n])/g, '$1'), right.replace(/,([\\r\\n])/g, '$1'));\r\n };\r\n\r\n function diffJson(oldObj, newObj, options) {\r\n return jsonDiff.diff(oldObj, newObj, options);\r\n } // This function handles the presence of circular references by bailing out when encountering an\r\n // object that is already on the \"stack\" of items being processed. Accepts an optional replacer\r\n\r\n function canonicalize(obj, stack, replacementStack, replacer, key) {\r\n stack = stack || [];\r\n replacementStack = replacementStack || [];\r\n\r\n if (replacer) {\r\n obj = replacer(key, obj);\r\n }\r\n\r\n var i;\r\n\r\n for (i = 0; i < stack.length; i += 1) {\r\n if (stack[i] === obj) {\r\n return replacementStack[i];\r\n }\r\n }\r\n\r\n var canonicalizedObj;\r\n\r\n if ('[object Array]' === objectPrototypeToString.call(obj)) {\r\n stack.push(obj);\r\n canonicalizedObj = new Array(obj.length);\r\n replacementStack.push(canonicalizedObj);\r\n\r\n for (i = 0; i < obj.length; i += 1) {\r\n canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key);\r\n }\r\n\r\n stack.pop();\r\n replacementStack.pop();\r\n return canonicalizedObj;\r\n }\r\n\r\n if (obj && obj.toJSON) {\r\n obj = obj.toJSON();\r\n }\r\n\r\n if (_typeof(obj) === 'object' && obj !== null) {\r\n stack.push(obj);\r\n canonicalizedObj = {};\r\n replacementStack.push(canonicalizedObj);\r\n\r\n var sortedKeys = [],\r\n _key;\r\n\r\n for (_key in obj) {\r\n /* istanbul ignore else */\r\n if (obj.hasOwnProperty(_key)) {\r\n sortedKeys.push(_key);\r\n }\r\n }\r\n\r\n sortedKeys.sort();\r\n\r\n for (i = 0; i < sortedKeys.length; i += 1) {\r\n _key = sortedKeys[i];\r\n canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key);\r\n }\r\n\r\n stack.pop();\r\n replacementStack.pop();\r\n } else {\r\n canonicalizedObj = obj;\r\n }\r\n\r\n return canonicalizedObj;\r\n }\r\n\r\n var arrayDiff = new Diff();\r\n\r\n arrayDiff.tokenize = function (value) {\r\n return value.slice();\r\n };\r\n\r\n arrayDiff.join = arrayDiff.removeEmpty = function (value) {\r\n return value;\r\n };\r\n\r\n function diffArrays(oldArr, newArr, callback) {\r\n return arrayDiff.diff(oldArr, newArr, callback);\r\n }\r\n\r\n function parsePatch(uniDiff) {\r\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\r\n var diffstr = uniDiff.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/),\r\n delimiters = uniDiff.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [],\r\n list = [],\r\n i = 0;\r\n\r\n function parseIndex() {\r\n var index = {};\r\n list.push(index); // Parse diff metadata\r\n\r\n while (i < diffstr.length) {\r\n var line = diffstr[i]; // File header found, end parsing diff metadata\r\n\r\n if (/^(\\-\\-\\-|\\+\\+\\+|@@)\\s/.test(line)) {\r\n break;\r\n } // Diff index\r\n\r\n\r\n var header = /^(?:Index:|diff(?: -r \\w+)+)\\s+(.+?)\\s*$/.exec(line);\r\n\r\n if (header) {\r\n index.index = header[1];\r\n }\r\n\r\n i++;\r\n } // Parse file headers if they are defined. Unified diff requires them, but\r\n // there's no technical issues to have an isolated hunk without file header\r\n\r\n\r\n parseFileHeader(index);\r\n parseFileHeader(index); // Parse hunks\r\n\r\n index.hunks = [];\r\n\r\n while (i < diffstr.length) {\r\n var _line = diffstr[i];\r\n\r\n if (/^(Index:|diff|\\-\\-\\-|\\+\\+\\+)\\s/.test(_line)) {\r\n break;\r\n } else if (/^@@/.test(_line)) {\r\n index.hunks.push(parseHunk());\r\n } else if (_line && options.strict) {\r\n // Ignore unexpected content unless in strict mode\r\n throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line));\r\n } else {\r\n i++;\r\n }\r\n }\r\n } // Parses the --- and +++ headers, if none are found, no lines\r\n // are consumed.\r\n\r\n\r\n function parseFileHeader(index) {\r\n var fileHeader = /^(---|\\+\\+\\+)\\s+(.*)$/.exec(diffstr[i]);\r\n\r\n if (fileHeader) {\r\n var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new';\r\n var data = fileHeader[2].split('\\t', 2);\r\n var fileName = data[0].replace(/\\\\\\\\/g, '\\\\');\r\n\r\n if (/^\".*\"$/.test(fileName)) {\r\n fileName = fileName.substr(1, fileName.length - 2);\r\n }\r\n\r\n index[keyPrefix + 'FileName'] = fileName;\r\n index[keyPrefix + 'Header'] = (data[1] || '').trim();\r\n i++;\r\n }\r\n } // Parses a hunk\r\n // This assumes that we are at the start of a hunk.\r\n\r\n\r\n function parseHunk() {\r\n var chunkHeaderIndex = i,\r\n chunkHeaderLine = diffstr[i++],\r\n chunkHeader = chunkHeaderLine.split(/@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\r\n var hunk = {\r\n oldStart: +chunkHeader[1],\r\n oldLines: typeof chunkHeader[2] === 'undefined' ? 1 : +chunkHeader[2],\r\n newStart: +chunkHeader[3],\r\n newLines: typeof chunkHeader[4] === 'undefined' ? 1 : +chunkHeader[4],\r\n lines: [],\r\n linedelimiters: []\r\n }; // Unified Diff Format quirk: If the chunk size is 0,\r\n // the first number is one lower than one would expect.\r\n // https://www.artima.com/weblogs/viewpost.jsp?thread=164293\r\n\r\n if (hunk.oldLines === 0) {\r\n hunk.oldStart += 1;\r\n }\r\n\r\n if (hunk.newLines === 0) {\r\n hunk.newStart += 1;\r\n }\r\n\r\n var addCount = 0,\r\n removeCount = 0;\r\n\r\n for (; i < diffstr.length; i++) {\r\n // Lines starting with '---' could be mistaken for the \"remove line\" operation\r\n // But they could be the header for the next file. Therefore prune such cases out.\r\n if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) {\r\n break;\r\n }\r\n\r\n var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0];\r\n\r\n if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\\\') {\r\n hunk.lines.push(diffstr[i]);\r\n hunk.linedelimiters.push(delimiters[i] || '\\n');\r\n\r\n if (operation === '+') {\r\n addCount++;\r\n } else if (operation === '-') {\r\n removeCount++;\r\n } else if (operation === ' ') {\r\n addCount++;\r\n removeCount++;\r\n }\r\n } else {\r\n break;\r\n }\r\n } // Handle the empty block count case\r\n\r\n\r\n if (!addCount && hunk.newLines === 1) {\r\n hunk.newLines = 0;\r\n }\r\n\r\n if (!removeCount && hunk.oldLines === 1) {\r\n hunk.oldLines = 0;\r\n } // Perform optional sanity checking\r\n\r\n\r\n if (options.strict) {\r\n if (addCount !== hunk.newLines) {\r\n throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\r\n }\r\n\r\n if (removeCount !== hunk.oldLines) {\r\n throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\r\n }\r\n }\r\n\r\n return hunk;\r\n }\r\n\r\n while (i < diffstr.length) {\r\n parseIndex();\r\n }\r\n\r\n return list;\r\n }\r\n\r\n // Iterator that traverses in the range of [min, max], stepping\r\n // by distance from a given start position. I.e. for [0, 4], with\r\n // start of 2, this will iterate 2, 3, 1, 4, 0.\r\n function distanceIterator (start, minLine, maxLine) {\r\n var wantForward = true,\r\n backwardExhausted = false,\r\n forwardExhausted = false,\r\n localOffset = 1;\r\n return function iterator() {\r\n if (wantForward && !forwardExhausted) {\r\n if (backwardExhausted) {\r\n localOffset++;\r\n } else {\r\n wantForward = false;\r\n } // Check if trying to fit beyond text length, and if not, check it fits\r\n // after offset location (or desired location on first iteration)\r\n\r\n\r\n if (start + localOffset <= maxLine) {\r\n return localOffset;\r\n }\r\n\r\n forwardExhausted = true;\r\n }\r\n\r\n if (!backwardExhausted) {\r\n if (!forwardExhausted) {\r\n wantForward = true;\r\n } // Check if trying to fit before text beginning, and if not, check it fits\r\n // before offset location\r\n\r\n\r\n if (minLine <= start - localOffset) {\r\n return -localOffset++;\r\n }\r\n\r\n backwardExhausted = true;\r\n return iterator();\r\n } // We tried to fit hunk before text beginning and beyond text length, then\r\n // hunk can't fit on the text. Return undefined\r\n\r\n };\r\n }\r\n\r\n function applyPatch(source, uniDiff) {\r\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\r\n\r\n if (typeof uniDiff === 'string') {\r\n uniDiff = parsePatch(uniDiff);\r\n }\r\n\r\n if (Array.isArray(uniDiff)) {\r\n if (uniDiff.length > 1) {\r\n throw new Error('applyPatch only works with a single input.');\r\n }\r\n\r\n uniDiff = uniDiff[0];\r\n } // Apply the diff to the input\r\n\r\n\r\n var lines = source.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/),\r\n delimiters = source.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [],\r\n hunks = uniDiff.hunks,\r\n compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) {\r\n return line === patchContent;\r\n },\r\n errorCount = 0,\r\n fuzzFactor = options.fuzzFactor || 0,\r\n minLine = 0,\r\n offset = 0,\r\n removeEOFNL,\r\n addEOFNL;\r\n /**\r\n * Checks if the hunk exactly fits on the provided location\r\n */\r\n\r\n\r\n function hunkFits(hunk, toPos) {\r\n for (var j = 0; j < hunk.lines.length; j++) {\r\n var line = hunk.lines[j],\r\n operation = line.length > 0 ? line[0] : ' ',\r\n content = line.length > 0 ? line.substr(1) : line;\r\n\r\n if (operation === ' ' || operation === '-') {\r\n // Context sanity check\r\n if (!compareLine(toPos + 1, lines[toPos], operation, content)) {\r\n errorCount++;\r\n\r\n if (errorCount > fuzzFactor) {\r\n return false;\r\n }\r\n }\r\n\r\n toPos++;\r\n }\r\n }\r\n\r\n return true;\r\n } // Search best fit offsets for each hunk based on the previous ones\r\n\r\n\r\n for (var i = 0; i < hunks.length; i++) {\r\n var hunk = hunks[i],\r\n maxLine = lines.length - hunk.oldLines,\r\n localOffset = 0,\r\n toPos = offset + hunk.oldStart - 1;\r\n var iterator = distanceIterator(toPos, minLine, maxLine);\r\n\r\n for (; localOffset !== undefined; localOffset = iterator()) {\r\n if (hunkFits(hunk, toPos + localOffset)) {\r\n hunk.offset = offset += localOffset;\r\n break;\r\n }\r\n }\r\n\r\n if (localOffset === undefined) {\r\n return false;\r\n } // Set lower text limit to end of the current hunk, so next ones don't try\r\n // to fit over already patched text\r\n\r\n\r\n minLine = hunk.offset + hunk.oldStart + hunk.oldLines;\r\n } // Apply patch hunks\r\n\r\n\r\n var diffOffset = 0;\r\n\r\n for (var _i = 0; _i < hunks.length; _i++) {\r\n var _hunk = hunks[_i],\r\n _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1;\r\n\r\n diffOffset += _hunk.newLines - _hunk.oldLines;\r\n\r\n for (var j = 0; j < _hunk.lines.length; j++) {\r\n var line = _hunk.lines[j],\r\n operation = line.length > 0 ? line[0] : ' ',\r\n content = line.length > 0 ? line.substr(1) : line,\r\n delimiter = _hunk.linedelimiters[j];\r\n\r\n if (operation === ' ') {\r\n _toPos++;\r\n } else if (operation === '-') {\r\n lines.splice(_toPos, 1);\r\n delimiters.splice(_toPos, 1);\r\n /* istanbul ignore else */\r\n } else if (operation === '+') {\r\n lines.splice(_toPos, 0, content);\r\n delimiters.splice(_toPos, 0, delimiter);\r\n _toPos++;\r\n } else if (operation === '\\\\') {\r\n var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null;\r\n\r\n if (previousOperation === '+') {\r\n removeEOFNL = true;\r\n } else if (previousOperation === '-') {\r\n addEOFNL = true;\r\n }\r\n }\r\n }\r\n } // Handle EOFNL insertion/removal\r\n\r\n\r\n if (removeEOFNL) {\r\n while (!lines[lines.length - 1]) {\r\n lines.pop();\r\n delimiters.pop();\r\n }\r\n } else if (addEOFNL) {\r\n lines.push('');\r\n delimiters.push('\\n');\r\n }\r\n\r\n for (var _k = 0; _k < lines.length - 1; _k++) {\r\n lines[_k] = lines[_k] + delimiters[_k];\r\n }\r\n\r\n return lines.join('');\r\n } // Wrapper that supports multiple file patches via callbacks.\r\n\r\n function applyPatches(uniDiff, options) {\r\n if (typeof uniDiff === 'string') {\r\n uniDiff = parsePatch(uniDiff);\r\n }\r\n\r\n var currentIndex = 0;\r\n\r\n function processIndex() {\r\n var index = uniDiff[currentIndex++];\r\n\r\n if (!index) {\r\n return options.complete();\r\n }\r\n\r\n options.loadFile(index, function (err, data) {\r\n if (err) {\r\n return options.complete(err);\r\n }\r\n\r\n var updatedContent = applyPatch(data, index, options);\r\n options.patched(index, updatedContent, function (err) {\r\n if (err) {\r\n return options.complete(err);\r\n }\r\n\r\n processIndex();\r\n });\r\n });\r\n }\r\n\r\n processIndex();\r\n }\r\n\r\n function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\r\n if (!options) {\r\n options = {};\r\n }\r\n\r\n if (typeof options.context === 'undefined') {\r\n options.context = 4;\r\n }\r\n\r\n var diff = diffLines(oldStr, newStr, options);\r\n diff.push({\r\n value: '',\r\n lines: []\r\n }); // Append an empty value to make cleanup easier\r\n\r\n function contextLines(lines) {\r\n return lines.map(function (entry) {\r\n return ' ' + entry;\r\n });\r\n }\r\n\r\n var hunks = [];\r\n var oldRangeStart = 0,\r\n newRangeStart = 0,\r\n curRange = [],\r\n oldLine = 1,\r\n newLine = 1;\r\n\r\n var _loop = function _loop(i) {\r\n var current = diff[i],\r\n lines = current.lines || current.value.replace(/\\n$/, '').split('\\n');\r\n current.lines = lines;\r\n\r\n if (current.added || current.removed) {\r\n var _curRange;\r\n\r\n // If we have previous context, start with that\r\n if (!oldRangeStart) {\r\n var prev = diff[i - 1];\r\n oldRangeStart = oldLine;\r\n newRangeStart = newLine;\r\n\r\n if (prev) {\r\n curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : [];\r\n oldRangeStart -= curRange.length;\r\n newRangeStart -= curRange.length;\r\n }\r\n } // Output our changes\r\n\r\n\r\n (_curRange = curRange).push.apply(_curRange, _toConsumableArray(lines.map(function (entry) {\r\n return (current.added ? '+' : '-') + entry;\r\n }))); // Track the updated file position\r\n\r\n\r\n if (current.added) {\r\n newLine += lines.length;\r\n } else {\r\n oldLine += lines.length;\r\n }\r\n } else {\r\n // Identical context lines. Track line changes\r\n if (oldRangeStart) {\r\n // Close out any changes that have been output (or join overlapping)\r\n if (lines.length <= options.context * 2 && i < diff.length - 2) {\r\n var _curRange2;\r\n\r\n // Overlapping\r\n (_curRange2 = curRange).push.apply(_curRange2, _toConsumableArray(contextLines(lines)));\r\n } else {\r\n var _curRange3;\r\n\r\n // end the range and output\r\n var contextSize = Math.min(lines.length, options.context);\r\n\r\n (_curRange3 = curRange).push.apply(_curRange3, _toConsumableArray(contextLines(lines.slice(0, contextSize))));\r\n\r\n var hunk = {\r\n oldStart: oldRangeStart,\r\n oldLines: oldLine - oldRangeStart + contextSize,\r\n newStart: newRangeStart,\r\n newLines: newLine - newRangeStart + contextSize,\r\n lines: curRange\r\n };\r\n\r\n if (i >= diff.length - 2 && lines.length <= options.context) {\r\n // EOF is inside this hunk\r\n var oldEOFNewline = /\\n$/.test(oldStr);\r\n var newEOFNewline = /\\n$/.test(newStr);\r\n var noNlBeforeAdds = lines.length == 0 && curRange.length > hunk.oldLines;\r\n\r\n if (!oldEOFNewline && noNlBeforeAdds && oldStr.length > 0) {\r\n // special case: old has no eol and no trailing context; no-nl can end up before adds\r\n // however, if the old file is empty, do not output the no-nl line\r\n curRange.splice(hunk.oldLines, 0, '\\\\ No newline at end of file');\r\n }\r\n\r\n if (!oldEOFNewline && !noNlBeforeAdds || !newEOFNewline) {\r\n curRange.push('\\\\ No newline at end of file');\r\n }\r\n }\r\n\r\n hunks.push(hunk);\r\n oldRangeStart = 0;\r\n newRangeStart = 0;\r\n curRange = [];\r\n }\r\n }\r\n\r\n oldLine += lines.length;\r\n newLine += lines.length;\r\n }\r\n };\r\n\r\n for (var i = 0; i < diff.length; i++) {\r\n _loop(i);\r\n }\r\n\r\n return {\r\n oldFileName: oldFileName,\r\n newFileName: newFileName,\r\n oldHeader: oldHeader,\r\n newHeader: newHeader,\r\n hunks: hunks\r\n };\r\n }\r\n function formatPatch(diff) {\r\n var ret = [];\r\n\r\n if (diff.oldFileName == diff.newFileName) {\r\n ret.push('Index: ' + diff.oldFileName);\r\n }\r\n\r\n ret.push('===================================================================');\r\n ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\\t' + diff.oldHeader));\r\n ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\\t' + diff.newHeader));\r\n\r\n for (var i = 0; i < diff.hunks.length; i++) {\r\n var hunk = diff.hunks[i]; // Unified Diff Format quirk: If the chunk size is 0,\r\n // the first number is one lower than one would expect.\r\n // https://www.artima.com/weblogs/viewpost.jsp?thread=164293\r\n\r\n if (hunk.oldLines === 0) {\r\n hunk.oldStart -= 1;\r\n }\r\n\r\n if (hunk.newLines === 0) {\r\n hunk.newStart -= 1;\r\n }\r\n\r\n ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@');\r\n ret.push.apply(ret, hunk.lines);\r\n }\r\n\r\n return ret.join('\\n') + '\\n';\r\n }\r\n function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\r\n return formatPatch(structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options));\r\n }\r\n function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) {\r\n return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options);\r\n }\r\n\r\n function arrayEqual(a, b) {\r\n if (a.length !== b.length) {\r\n return false;\r\n }\r\n\r\n return arrayStartsWith(a, b);\r\n }\r\n function arrayStartsWith(array, start) {\r\n if (start.length > array.length) {\r\n return false;\r\n }\r\n\r\n for (var i = 0; i < start.length; i++) {\r\n if (start[i] !== array[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function calcLineCount(hunk) {\r\n var _calcOldNewLineCount = calcOldNewLineCount(hunk.lines),\r\n oldLines = _calcOldNewLineCount.oldLines,\r\n newLines = _calcOldNewLineCount.newLines;\r\n\r\n if (oldLines !== undefined) {\r\n hunk.oldLines = oldLines;\r\n } else {\r\n delete hunk.oldLines;\r\n }\r\n\r\n if (newLines !== undefined) {\r\n hunk.newLines = newLines;\r\n } else {\r\n delete hunk.newLines;\r\n }\r\n }\r\n function merge(mine, theirs, base) {\r\n mine = loadPatch(mine, base);\r\n theirs = loadPatch(theirs, base);\r\n var ret = {}; // For index we just let it pass through as it doesn't have any necessary meaning.\r\n // Leaving sanity checks on this to the API consumer that may know more about the\r\n // meaning in their own context.\r\n\r\n if (mine.index || theirs.index) {\r\n ret.index = mine.index || theirs.index;\r\n }\r\n\r\n if (mine.newFileName || theirs.newFileName) {\r\n if (!fileNameChanged(mine)) {\r\n // No header or no change in ours, use theirs (and ours if theirs does not exist)\r\n ret.oldFileName = theirs.oldFileName || mine.oldFileName;\r\n ret.newFileName = theirs.newFileName || mine.newFileName;\r\n ret.oldHeader = theirs.oldHeader || mine.oldHeader;\r\n ret.newHeader = theirs.newHeader || mine.newHeader;\r\n } else if (!fileNameChanged(theirs)) {\r\n // No header or no change in theirs, use ours\r\n ret.oldFileName = mine.oldFileName;\r\n ret.newFileName = mine.newFileName;\r\n ret.oldHeader = mine.oldHeader;\r\n ret.newHeader = mine.newHeader;\r\n } else {\r\n // Both changed... figure it out\r\n ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName);\r\n ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName);\r\n ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader);\r\n ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader);\r\n }\r\n }\r\n\r\n ret.hunks = [];\r\n var mineIndex = 0,\r\n theirsIndex = 0,\r\n mineOffset = 0,\r\n theirsOffset = 0;\r\n\r\n while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) {\r\n var mineCurrent = mine.hunks[mineIndex] || {\r\n oldStart: Infinity\r\n },\r\n theirsCurrent = theirs.hunks[theirsIndex] || {\r\n oldStart: Infinity\r\n };\r\n\r\n if (hunkBefore(mineCurrent, theirsCurrent)) {\r\n // This patch does not overlap with any of the others, yay.\r\n ret.hunks.push(cloneHunk(mineCurrent, mineOffset));\r\n mineIndex++;\r\n theirsOffset += mineCurrent.newLines - mineCurrent.oldLines;\r\n } else if (hunkBefore(theirsCurrent, mineCurrent)) {\r\n // This patch does not overlap with any of the others, yay.\r\n ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset));\r\n theirsIndex++;\r\n mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines;\r\n } else {\r\n // Overlap, merge as best we can\r\n var mergedHunk = {\r\n oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart),\r\n oldLines: 0,\r\n newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset),\r\n newLines: 0,\r\n lines: []\r\n };\r\n mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines);\r\n theirsIndex++;\r\n mineIndex++;\r\n ret.hunks.push(mergedHunk);\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n function loadPatch(param, base) {\r\n if (typeof param === 'string') {\r\n if (/^@@/m.test(param) || /^Index:/m.test(param)) {\r\n return parsePatch(param)[0];\r\n }\r\n\r\n if (!base) {\r\n throw new Error('Must provide a base reference or pass in a patch');\r\n }\r\n\r\n return structuredPatch(undefined, undefined, base, param);\r\n }\r\n\r\n return param;\r\n }\r\n\r\n function fileNameChanged(patch) {\r\n return patch.newFileName && patch.newFileName !== patch.oldFileName;\r\n }\r\n\r\n function selectField(index, mine, theirs) {\r\n if (mine === theirs) {\r\n return mine;\r\n } else {\r\n index.conflict = true;\r\n return {\r\n mine: mine,\r\n theirs: theirs\r\n };\r\n }\r\n }\r\n\r\n function hunkBefore(test, check) {\r\n return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart;\r\n }\r\n\r\n function cloneHunk(hunk, offset) {\r\n return {\r\n oldStart: hunk.oldStart,\r\n oldLines: hunk.oldLines,\r\n newStart: hunk.newStart + offset,\r\n newLines: hunk.newLines,\r\n lines: hunk.lines\r\n };\r\n }\r\n\r\n function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) {\r\n // This will generally result in a conflicted hunk, but there are cases where the context\r\n // is the only overlap where we can successfully merge the content here.\r\n var mine = {\r\n offset: mineOffset,\r\n lines: mineLines,\r\n index: 0\r\n },\r\n their = {\r\n offset: theirOffset,\r\n lines: theirLines,\r\n index: 0\r\n }; // Handle any leading content\r\n\r\n insertLeading(hunk, mine, their);\r\n insertLeading(hunk, their, mine); // Now in the overlap content. Scan through and select the best changes from each.\r\n\r\n while (mine.index < mine.lines.length && their.index < their.lines.length) {\r\n var mineCurrent = mine.lines[mine.index],\r\n theirCurrent = their.lines[their.index];\r\n\r\n if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) {\r\n // Both modified ...\r\n mutualChange(hunk, mine, their);\r\n } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') {\r\n var _hunk$lines;\r\n\r\n // Mine inserted\r\n (_hunk$lines = hunk.lines).push.apply(_hunk$lines, _toConsumableArray(collectChange(mine)));\r\n } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') {\r\n var _hunk$lines2;\r\n\r\n // Theirs inserted\r\n (_hunk$lines2 = hunk.lines).push.apply(_hunk$lines2, _toConsumableArray(collectChange(their)));\r\n } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') {\r\n // Mine removed or edited\r\n removal(hunk, mine, their);\r\n } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') {\r\n // Their removed or edited\r\n removal(hunk, their, mine, true);\r\n } else if (mineCurrent === theirCurrent) {\r\n // Context identity\r\n hunk.lines.push(mineCurrent);\r\n mine.index++;\r\n their.index++;\r\n } else {\r\n // Context mismatch\r\n conflict(hunk, collectChange(mine), collectChange(their));\r\n }\r\n } // Now push anything that may be remaining\r\n\r\n\r\n insertTrailing(hunk, mine);\r\n insertTrailing(hunk, their);\r\n calcLineCount(hunk);\r\n }\r\n\r\n function mutualChange(hunk, mine, their) {\r\n var myChanges = collectChange(mine),\r\n theirChanges = collectChange(their);\r\n\r\n if (allRemoves(myChanges) && allRemoves(theirChanges)) {\r\n // Special case for remove changes that are supersets of one another\r\n if (arrayStartsWith(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) {\r\n var _hunk$lines3;\r\n\r\n (_hunk$lines3 = hunk.lines).push.apply(_hunk$lines3, _toConsumableArray(myChanges));\r\n\r\n return;\r\n } else if (arrayStartsWith(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) {\r\n var _hunk$lines4;\r\n\r\n (_hunk$lines4 = hunk.lines).push.apply(_hunk$lines4, _toConsumableArray(theirChanges));\r\n\r\n return;\r\n }\r\n } else if (arrayEqual(myChanges, theirChanges)) {\r\n var _hunk$lines5;\r\n\r\n (_hunk$lines5 = hunk.lines).push.apply(_hunk$lines5, _toConsumableArray(myChanges));\r\n\r\n return;\r\n }\r\n\r\n conflict(hunk, myChanges, theirChanges);\r\n }\r\n\r\n function removal(hunk, mine, their, swap) {\r\n var myChanges = collectChange(mine),\r\n theirChanges = collectContext(their, myChanges);\r\n\r\n if (theirChanges.merged) {\r\n var _hunk$lines6;\r\n\r\n (_hunk$lines6 = hunk.lines).push.apply(_hunk$lines6, _toConsumableArray(theirChanges.merged));\r\n } else {\r\n conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges);\r\n }\r\n }\r\n\r\n function conflict(hunk, mine, their) {\r\n hunk.conflict = true;\r\n hunk.lines.push({\r\n conflict: true,\r\n mine: mine,\r\n theirs: their\r\n });\r\n }\r\n\r\n function insertLeading(hunk, insert, their) {\r\n while (insert.offset < their.offset && insert.index < insert.lines.length) {\r\n var line = insert.lines[insert.index++];\r\n hunk.lines.push(line);\r\n insert.offset++;\r\n }\r\n }\r\n\r\n function insertTrailing(hunk, insert) {\r\n while (insert.index < insert.lines.length) {\r\n var line = insert.lines[insert.index++];\r\n hunk.lines.push(line);\r\n }\r\n }\r\n\r\n function collectChange(state) {\r\n var ret = [],\r\n operation = state.lines[state.index][0];\r\n\r\n while (state.index < state.lines.length) {\r\n var line = state.lines[state.index]; // Group additions that are immediately after subtractions and treat them as one \"atomic\" modify change.\r\n\r\n if (operation === '-' && line[0] === '+') {\r\n operation = '+';\r\n }\r\n\r\n if (operation === line[0]) {\r\n ret.push(line);\r\n state.index++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n function collectContext(state, matchChanges) {\r\n var changes = [],\r\n merged = [],\r\n matchIndex = 0,\r\n contextChanges = false,\r\n conflicted = false;\r\n\r\n while (matchIndex < matchChanges.length && state.index < state.lines.length) {\r\n var change = state.lines[state.index],\r\n match = matchChanges[matchIndex]; // Once we've hit our add, then we are done\r\n\r\n if (match[0] === '+') {\r\n break;\r\n }\r\n\r\n contextChanges = contextChanges || change[0] !== ' ';\r\n merged.push(match);\r\n matchIndex++; // Consume any additions in the other block as a conflict to attempt\r\n // to pull in the remaining context after this\r\n\r\n if (change[0] === '+') {\r\n conflicted = true;\r\n\r\n while (change[0] === '+') {\r\n changes.push(change);\r\n change = state.lines[++state.index];\r\n }\r\n }\r\n\r\n if (match.substr(1) === change.substr(1)) {\r\n changes.push(change);\r\n state.index++;\r\n } else {\r\n conflicted = true;\r\n }\r\n }\r\n\r\n if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) {\r\n conflicted = true;\r\n }\r\n\r\n if (conflicted) {\r\n return changes;\r\n }\r\n\r\n while (matchIndex < matchChanges.length) {\r\n merged.push(matchChanges[matchIndex++]);\r\n }\r\n\r\n return {\r\n merged: merged,\r\n changes: changes\r\n };\r\n }\r\n\r\n function allRemoves(changes) {\r\n return changes.reduce(function (prev, change) {\r\n return prev && change[0] === '-';\r\n }, true);\r\n }\r\n\r\n function skipRemoveSuperset(state, removeChanges, delta) {\r\n for (var i = 0; i < delta; i++) {\r\n var changeContent = removeChanges[removeChanges.length - delta + i].substr(1);\r\n\r\n if (state.lines[state.index + i] !== ' ' + changeContent) {\r\n return false;\r\n }\r\n }\r\n\r\n state.index += delta;\r\n return true;\r\n }\r\n\r\n function calcOldNewLineCount(lines) {\r\n var oldLines = 0;\r\n var newLines = 0;\r\n lines.forEach(function (line) {\r\n if (typeof line !== 'string') {\r\n var myCount = calcOldNewLineCount(line.mine);\r\n var theirCount = calcOldNewLineCount(line.theirs);\r\n\r\n if (oldLines !== undefined) {\r\n if (myCount.oldLines === theirCount.oldLines) {\r\n oldLines += myCount.oldLines;\r\n } else {\r\n oldLines = undefined;\r\n }\r\n }\r\n\r\n if (newLines !== undefined) {\r\n if (myCount.newLines === theirCount.newLines) {\r\n newLines += myCount.newLines;\r\n } else {\r\n newLines = undefined;\r\n }\r\n }\r\n } else {\r\n if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) {\r\n newLines++;\r\n }\r\n\r\n if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) {\r\n oldLines++;\r\n }\r\n }\r\n });\r\n return {\r\n oldLines: oldLines,\r\n newLines: newLines\r\n };\r\n }\r\n\r\n // See: http://code.google.com/p/google-diff-match-patch/wiki/API\r\n function convertChangesToDMP(changes) {\r\n var ret = [],\r\n change,\r\n operation;\r\n\r\n for (var i = 0; i < changes.length; i++) {\r\n change = changes[i];\r\n\r\n if (change.added) {\r\n operation = 1;\r\n } else if (change.removed) {\r\n operation = -1;\r\n } else {\r\n operation = 0;\r\n }\r\n\r\n ret.push([operation, change.value]);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n function convertChangesToXML(changes) {\r\n var ret = [];\r\n\r\n for (var i = 0; i < changes.length; i++) {\r\n var change = changes[i];\r\n\r\n if (change.added) {\r\n ret.push('');\r\n } else if (change.removed) {\r\n ret.push('');\r\n }\r\n\r\n ret.push(escapeHTML(change.value));\r\n\r\n if (change.added) {\r\n ret.push('');\r\n } else if (change.removed) {\r\n ret.push('');\r\n }\r\n }\r\n\r\n return ret.join('');\r\n }\r\n\r\n function escapeHTML(s) {\r\n var n = s;\r\n n = n.replace(/&/g, '&');\r\n n = n.replace(//g, '>');\r\n n = n.replace(/\"/g, '"');\r\n return n;\r\n }\r\n\r\n exports.Diff = Diff;\r\n exports.applyPatch = applyPatch;\r\n exports.applyPatches = applyPatches;\r\n exports.canonicalize = canonicalize;\r\n exports.convertChangesToDMP = convertChangesToDMP;\r\n exports.convertChangesToXML = convertChangesToXML;\r\n exports.createPatch = createPatch;\r\n exports.createTwoFilesPatch = createTwoFilesPatch;\r\n exports.diffArrays = diffArrays;\r\n exports.diffChars = diffChars;\r\n exports.diffCss = diffCss;\r\n exports.diffJson = diffJson;\r\n exports.diffLines = diffLines;\r\n exports.diffSentences = diffSentences;\r\n exports.diffTrimmedLines = diffTrimmedLines;\r\n exports.diffWords = diffWords;\r\n exports.diffWordsWithSpace = diffWordsWithSpace;\r\n exports.merge = merge;\r\n exports.parsePatch = parsePatch;\r\n exports.structuredPatch = structuredPatch;\r\n\r\n Object.defineProperty(exports, '__esModule', { value: true });\r\n\r\n})));\r\n","\r\n// ====================================================================\r\n// URL Obfuscator functions\r\n//\r\n// Copyright Albion Research Ltd. 2004\r\n// http://www.albionresearch.com/\r\n//\r\n// You may copy these functions providing that \r\n// (a) you leave this copyright notice intact, and \r\n// (b) you include a credit on your web site \r\n// with a link back to http://www.albionresarch.com/\r\n//\r\n// If you find or fix any bugs, please let us know at albionresearch.com\r\n//\r\n// ====================================================================\r\n\r\nfunction HtmlEncode(s) {\r\n var result = \"\";\r\n for (var j = 0; j < s.length; j++) {\r\n // Encode 25% of characters\r\n if (Math.random() < 0.25\r\n || s.charAt(j) == ':'\r\n || s.charAt(j) == '@'\r\n || s.charAt(j) == '.') {\r\n var charCode = s.charCodeAt(j);\r\n result += \"&#\";\r\n result += charCode;\r\n result += \";\"\r\n } else {\r\n result += s.charAt(j);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction UrlEncode(s) {\r\n var HEX = \"0123456789ABCDEF\";\r\n var encoded = \"\";\r\n for (var i = 0; i < s.length; i++) {\r\n // Encode 25% of characters\r\n if (Math.random() < 0.25) {\r\n var charCode = s.charCodeAt(i);\r\n encoded += \"%\";\r\n encoded += HEX.charAt((charCode >> 4) & 0xF);\r\n encoded += HEX.charAt(charCode & 0xF);\r\n } else {\r\n encoded += s.charAt(i);\r\n }\r\n } // for\r\n return encoded;\r\n}\r\n\r\n\r\nfunction Obfuscate(str) {\r\n var plaintext = str;\r\n var result = \"\"\r\n result += HtmlEncode(plaintext)\r\n result += \"\";\r\n\r\n \r\n return result; /* Privacy note: returning false prevents the browser from posting your email address! */\r\n};\r\n","(function e(t, n, r) { function s(o, u) { if (!n[o]) { if (!t[o]) { var a = typeof require == \"function\" && require; if (!u && a) return a(o, !0); if (i) return i(o, !0); var f = new Error(\"Cannot find module '\" + o + \"'\"); throw f.code = \"MODULE_NOT_FOUND\", f } var l = n[o] = { exports: {} }; t[o][0].call(l.exports, function (e) { var n = t[o][1][e]; return s(n ? n : e) }, l, l.exports, e, t, n, r) } return n[o].exports } var i = typeof require == \"function\" && require; for (var o = 0; o < r.length; o++)s(r[o]); return s })({\r\n 1: [function (require, module, exports) {\r\n 'use strict';\r\n module.exports = function () {\r\n return /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;\r\n };\r\n\r\n }, {}], 2: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n function assembleStyles() {\r\n var styles = {\r\n modifiers: {\r\n reset: [0, 0],\r\n bold: [1, 22], // 21 isn't widely supported and 22 does the same thing\r\n dim: [2, 22],\r\n italic: [3, 23],\r\n underline: [4, 24],\r\n inverse: [7, 27],\r\n hidden: [8, 28],\r\n strikethrough: [9, 29]\r\n },\r\n colors: {\r\n black: [30, 39],\r\n red: [31, 39],\r\n green: [32, 39],\r\n yellow: [33, 39],\r\n blue: [34, 39],\r\n magenta: [35, 39],\r\n cyan: [36, 39],\r\n white: [37, 39],\r\n gray: [90, 39]\r\n },\r\n bgColors: {\r\n bgBlack: [40, 49],\r\n bgRed: [41, 49],\r\n bgGreen: [42, 49],\r\n bgYellow: [43, 49],\r\n bgBlue: [44, 49],\r\n bgMagenta: [45, 49],\r\n bgCyan: [46, 49],\r\n bgWhite: [47, 49]\r\n }\r\n };\r\n\r\n // fix humans\r\n styles.colors.grey = styles.colors.gray;\r\n\r\n Object.keys(styles).forEach(function (groupName) {\r\n var group = styles[groupName];\r\n\r\n Object.keys(group).forEach(function (styleName) {\r\n var style = group[styleName];\r\n\r\n styles[styleName] = group[styleName] = {\r\n open: '\\u001b[' + style[0] + 'm',\r\n close: '\\u001b[' + style[1] + 'm'\r\n };\r\n });\r\n\r\n Object.defineProperty(styles, groupName, {\r\n value: group,\r\n enumerable: false\r\n });\r\n });\r\n\r\n return styles;\r\n }\r\n\r\n Object.defineProperty(module, 'exports', {\r\n enumerable: true,\r\n get: assembleStyles\r\n });\r\n\r\n }, {}], 3: [function (require, module, exports) {\r\n /*!\r\n * arr-filter \r\n *\r\n * Copyright (c) 2014-2015, Jon Schlinkert.\r\n * Licensed under the MIT License\r\n */\r\n\r\n 'use strict';\r\n\r\n var iterator = require('make-iterator');\r\n\r\n module.exports = function filter(arr, cb, thisArg) {\r\n if (arr == null) {\r\n return [];\r\n }\r\n\r\n if (typeof cb !== 'function') {\r\n throw new TypeError('arr-filter expects a callback function.');\r\n }\r\n\r\n cb = iterator(cb, thisArg);\r\n var len = arr.length;\r\n var res = arr.slice();\r\n var i = 0;\r\n\r\n while (len--) {\r\n if (!cb(arr[len], i++)) {\r\n res.splice(len, 1);\r\n }\r\n }\r\n\r\n return res;\r\n };\r\n\r\n\r\n }, { \"make-iterator\": 103 }], 4: [function (require, module, exports) {\r\n /*!\r\n * arr-flatten \r\n *\r\n * Copyright (c) 2014-2015, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n module.exports = function flatten(arr) {\r\n return flat(arr, []);\r\n };\r\n\r\n function flat(arr, res) {\r\n var len = arr.length;\r\n var i = -1;\r\n\r\n while (len--) {\r\n var cur = arr[++i];\r\n if (Array.isArray(cur)) {\r\n flat(cur, res);\r\n } else {\r\n res.push(cur);\r\n }\r\n }\r\n return res;\r\n }\r\n }, {}], 5: [function (require, module, exports) {\r\n /*!\r\n * array-sort \r\n *\r\n * Copyright (c) 2015, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n var typeOf = require('kind-of');\r\n var get = require('get-value');\r\n\r\n /**\r\n * Sort an array of objects by one or more properties.\r\n *\r\n * @param {Array} `arr` The Array to sort.\r\n * @param {String|Array|Function} `props` One or more object paths or comparison functions.\r\n * @param {Object} `opts` Pass `{ reverse: true }` to reverse the sort order.\r\n * @return {Array} Returns a sorted array.\r\n * @api public\r\n */\r\n\r\n function arraySort(arr, props, opts) {\r\n if (arr == null) {\r\n return [];\r\n }\r\n\r\n if (!Array.isArray(arr)) {\r\n throw new TypeError('array-sort expects an array.');\r\n }\r\n\r\n if (arguments.length === 1) {\r\n return arr.sort();\r\n }\r\n\r\n var args = flatten([].slice.call(arguments, 1));\r\n\r\n // if the last argument appears to be a plain object,\r\n // it's not a valid `compare` arg, so it must be options.\r\n if (typeOf(args[args.length - 1]) === 'object') {\r\n opts = args.pop();\r\n }\r\n return arr.sort(sortBy(args, opts));\r\n }\r\n\r\n /**\r\n * Iterate over each comparison property or function until `1` or `-1`\r\n * is returned.\r\n *\r\n * @param {String|Array|Function} `props` One or more object paths or comparison functions.\r\n * @param {Object} `opts` Pass `{ reverse: true }` to reverse the sort order.\r\n * @return {Array}\r\n */\r\n\r\n function sortBy(props, opts) {\r\n opts = opts || {};\r\n\r\n return function compareFn(a, b) {\r\n var len = props.length, i = -1;\r\n var result;\r\n\r\n while (++i < len) {\r\n result = compare(props[i], a, b);\r\n if (result !== 0) {\r\n break;\r\n }\r\n }\r\n if (opts.reverse === true) {\r\n return result * -1;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n /**\r\n * Compare `a` to `b`. If an object `prop` is passed, then\r\n * `a[prop]` is compared to `b[prop]`\r\n */\r\n\r\n function compare(prop, a, b) {\r\n if (typeof prop === 'function') {\r\n // expose `compare` to custom function\r\n return prop(a, b, compare.bind(null, null));\r\n }\r\n // compare object values\r\n if (prop && typeof a === 'object' && typeof b === 'object') {\r\n return compare(null, get(a, prop), get(b, prop));\r\n }\r\n return defaultCompare(a, b);\r\n }\r\n\r\n /**\r\n * Default compare function used as a fallback\r\n * for sorting.\r\n */\r\n\r\n function defaultCompare(a, b) {\r\n return a < b ? -1 : (a > b ? 1 : 0);\r\n }\r\n\r\n /**\r\n * Flatten the given array.\r\n */\r\n\r\n function flatten(arr) {\r\n return [].concat.apply([], arr);\r\n }\r\n\r\n /**\r\n * Expose `arraySort`\r\n */\r\n\r\n module.exports = arraySort;\r\n\r\n }, { \"get-value\": 38, \"kind-of\": 6 }], 6: [function (require, module, exports) {\r\n (function (Buffer) {\r\n var isBuffer = require('is-buffer');\r\n var toString = Object.prototype.toString;\r\n\r\n /**\r\n * Get the native `typeof` a value.\r\n *\r\n * @param {*} `val`\r\n * @return {*} Native javascript type\r\n */\r\n\r\n module.exports = function kindOf(val) {\r\n // primitivies\r\n if (typeof val === 'undefined') {\r\n return 'undefined';\r\n }\r\n if (val === null) {\r\n return 'null';\r\n }\r\n if (val === true || val === false || val instanceof Boolean) {\r\n return 'boolean';\r\n }\r\n if (typeof val === 'string' || val instanceof String) {\r\n return 'string';\r\n }\r\n if (typeof val === 'number' || val instanceof Number) {\r\n return 'number';\r\n }\r\n\r\n // functions\r\n if (typeof val === 'function' || val instanceof Function) {\r\n return 'function';\r\n }\r\n\r\n // array\r\n if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) {\r\n return 'array';\r\n }\r\n\r\n // check for instances of RegExp and Date before calling `toString`\r\n if (val instanceof RegExp) {\r\n return 'regexp';\r\n }\r\n if (val instanceof Date) {\r\n return 'date';\r\n }\r\n\r\n // other objects\r\n var type = toString.call(val);\r\n\r\n if (type === '[object RegExp]') {\r\n return 'regexp';\r\n }\r\n if (type === '[object Date]') {\r\n return 'date';\r\n }\r\n if (type === '[object Arguments]') {\r\n return 'arguments';\r\n }\r\n\r\n // buffer\r\n if (typeof Buffer !== 'undefined' && isBuffer(val)) {\r\n return 'buffer';\r\n }\r\n\r\n // es6: Map, WeakMap, Set, WeakSet\r\n if (type === '[object Set]') {\r\n return 'set';\r\n }\r\n if (type === '[object WeakSet]') {\r\n return 'weakset';\r\n }\r\n if (type === '[object Map]') {\r\n return 'map';\r\n }\r\n if (type === '[object WeakMap]') {\r\n return 'weakmap';\r\n }\r\n if (type === '[object Symbol]') {\r\n return 'symbol';\r\n }\r\n\r\n // must be a plain object\r\n return 'object';\r\n };\r\n\r\n }).call(this, require(\"buffer\").Buffer)\r\n\r\n }, { \"buffer\": 12, \"is-buffer\": 79 }], 7: [function (require, module, exports) {\r\n /*!\r\n * array-unique \r\n *\r\n * Copyright (c) 2014-2015, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n module.exports = function unique(arr) {\r\n if (!Array.isArray(arr)) {\r\n throw new TypeError('array-unique expects an array.');\r\n }\r\n\r\n var len = arr.length;\r\n var i = -1;\r\n\r\n while (i++ < len) {\r\n var j = i + 1;\r\n\r\n for (; j < arr.length; ++j) {\r\n if (arr[i] === arr[j]) {\r\n arr.splice(j--, 1);\r\n }\r\n }\r\n }\r\n return arr;\r\n };\r\n\r\n }, {}], 8: [function (require, module, exports) {\r\n (function (root, factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n // AMD. Register as an anonymous module unless amdModuleId is set\r\n define([], function () {\r\n return (root['Autolinker'] = factory());\r\n });\r\n } else if (typeof exports === 'object') {\r\n // Node. Does not work with strict CommonJS, but\r\n // only CommonJS-like environments that support module.exports,\r\n // like Node.\r\n module.exports = factory();\r\n } else {\r\n root['Autolinker'] = factory();\r\n }\r\n }(this, function () {\r\n\r\n /*!\r\n * Autolinker.js\r\n * 0.15.3\r\n *\r\n * Copyright(c) 2015 Gregory Jacobs \r\n * MIT Licensed. http://www.opensource.org/licenses/mit-license.php\r\n *\r\n * https://github.com/gregjacobs/Autolinker.js\r\n */\r\n /**\r\n * @class Autolinker\r\n * @extends Object\r\n * \r\n * Utility class used to process a given string of text, and wrap the URLs, email addresses, and Twitter handles in \r\n * the appropriate anchor (<a>) tags to turn them into links.\r\n * \r\n * Any of the configuration options may be provided in an Object (map) provided to the Autolinker constructor, which\r\n * will configure how the {@link #link link()} method will process the links.\r\n * \r\n * For example:\r\n * \r\n * var autolinker = new Autolinker( {\r\n * newWindow : false,\r\n * truncate : 30\r\n * } );\r\n * \r\n * var html = autolinker.link( \"Joe went to www.yahoo.com\" );\r\n * // produces: 'Joe went to yahoo.com'\r\n * \r\n * \r\n * The {@link #static-link static link()} method may also be used to inline options into a single call, which may\r\n * be more convenient for one-off uses. For example:\r\n * \r\n * var html = Autolinker.link( \"Joe went to www.yahoo.com\", {\r\n * newWindow : false,\r\n * truncate : 30\r\n * } );\r\n * // produces: 'Joe went to yahoo.com'\r\n * \r\n * \r\n * ## Custom Replacements of Links\r\n * \r\n * If the configuration options do not provide enough flexibility, a {@link #replaceFn} may be provided to fully customize\r\n * the output of Autolinker. This function is called once for each URL/Email/Twitter handle match that is encountered.\r\n * \r\n * For example:\r\n * \r\n * var input = \"...\"; // string with URLs, Email Addresses, and Twitter Handles\r\n * \r\n * var linkedText = Autolinker.link( input, {\r\n * replaceFn : function( autolinker, match ) {\r\n * console.log( \"href = \", match.getAnchorHref() );\r\n * console.log( \"text = \", match.getAnchorText() );\r\n * \r\n * switch( match.getType() ) {\r\n * case 'url' : \r\n * console.log( \"url: \", match.getUrl() );\r\n * \r\n * if( match.getUrl().indexOf( 'mysite.com' ) === -1 ) {\r\n * var tag = autolinker.getTagBuilder().build( match ); // returns an `Autolinker.HtmlTag` instance, which provides mutator methods for easy changes\r\n * tag.setAttr( 'rel', 'nofollow' );\r\n * tag.addClass( 'external-link' );\r\n * \r\n * return tag;\r\n * \r\n * } else {\r\n * return true; // let Autolinker perform its normal anchor tag replacement\r\n * }\r\n * \r\n * case 'email' :\r\n * var email = match.getEmail();\r\n * console.log( \"email: \", email );\r\n * \r\n * if( email === \"my@own.address\" ) {\r\n * return false; // don't auto-link this particular email address; leave as-is\r\n * } else {\r\n * return; // no return value will have Autolinker perform its normal anchor tag replacement (same as returning `true`)\r\n * }\r\n * \r\n * case 'twitter' :\r\n * var twitterHandle = match.getTwitterHandle();\r\n * console.log( twitterHandle );\r\n * \r\n * return '' + twitterHandle + '';\r\n * }\r\n * }\r\n * } );\r\n * \r\n * \r\n * The function may return the following values:\r\n * \r\n * - `true` (Boolean): Allow Autolinker to replace the match as it normally would.\r\n * - `false` (Boolean): Do not replace the current match at all - leave as-is.\r\n * - Any String: If a string is returned from the function, the string will be used directly as the replacement HTML for\r\n * the match.\r\n * - An {@link Autolinker.HtmlTag} instance, which can be used to build/modify an HTML tag before writing out its HTML text.\r\n * \r\n * @constructor\r\n * @param {Object} [config] The configuration options for the Autolinker instance, specified in an Object (map).\r\n */\r\n var Autolinker = function (cfg) {\r\n Autolinker.Util.assign(this, cfg); // assign the properties of `cfg` onto the Autolinker instance. Prototype properties will be used for missing configs.\r\n };\r\n\r\n\r\n Autolinker.prototype = {\r\n constructor: Autolinker, // fix constructor property\r\n\r\n /**\r\n * @cfg {Boolean} urls\r\n * \r\n * `true` if miscellaneous URLs should be automatically linked, `false` if they should not be.\r\n */\r\n urls: true,\r\n\r\n /**\r\n * @cfg {Boolean} email\r\n * \r\n * `true` if email addresses should be automatically linked, `false` if they should not be.\r\n */\r\n email: true,\r\n\r\n /**\r\n * @cfg {Boolean} twitter\r\n * \r\n * `true` if Twitter handles (\"@example\") should be automatically linked, `false` if they should not be.\r\n */\r\n twitter: true,\r\n\r\n /**\r\n * @cfg {Boolean} newWindow\r\n * \r\n * `true` if the links should open in a new window, `false` otherwise.\r\n */\r\n newWindow: true,\r\n\r\n /**\r\n * @cfg {Boolean} stripPrefix\r\n * \r\n * `true` if 'http://' or 'https://' and/or the 'www.' should be stripped from the beginning of URL links' text, \r\n * `false` otherwise.\r\n */\r\n stripPrefix: true,\r\n\r\n /**\r\n * @cfg {Number} truncate\r\n * \r\n * A number for how many characters long URLs/emails/twitter handles should be truncated to inside the text of \r\n * a link. If the URL/email/twitter is over this number of characters, it will be truncated to this length by \r\n * adding a two period ellipsis ('..') to the end of the string.\r\n * \r\n * For example: A url like 'http://www.yahoo.com/some/long/path/to/a/file' truncated to 25 characters might look\r\n * something like this: 'yahoo.com/some/long/pat..'\r\n */\r\n truncate: undefined,\r\n\r\n /**\r\n * @cfg {String} className\r\n * \r\n * A CSS class name to add to the generated links. This class will be added to all links, as well as this class\r\n * plus url/email/twitter suffixes for styling url/email/twitter links differently.\r\n * \r\n * For example, if this config is provided as \"myLink\", then:\r\n * \r\n * - URL links will have the CSS classes: \"myLink myLink-url\"\r\n * - Email links will have the CSS classes: \"myLink myLink-email\", and\r\n * - Twitter links will have the CSS classes: \"myLink myLink-twitter\"\r\n */\r\n className: \"\",\r\n\r\n /**\r\n * @cfg {Function} replaceFn\r\n * \r\n * A function to individually process each URL/Email/Twitter match found in the input string.\r\n * \r\n * See the class's description for usage.\r\n * \r\n * This function is called with the following parameters:\r\n * \r\n * @cfg {Autolinker} replaceFn.autolinker The Autolinker instance, which may be used to retrieve child objects from (such\r\n * as the instance's {@link #getTagBuilder tag builder}).\r\n * @cfg {Autolinker.match.Match} replaceFn.match The Match instance which can be used to retrieve information about the\r\n * {@link Autolinker.match.Url URL}/{@link Autolinker.match.Email email}/{@link Autolinker.match.Twitter Twitter}\r\n * match that the `replaceFn` is currently processing.\r\n */\r\n\r\n\r\n /**\r\n * @private\r\n * @property {Autolinker.htmlParser.HtmlParser} htmlParser\r\n * \r\n * The HtmlParser instance used to skip over HTML tags, while finding text nodes to process. This is lazily instantiated\r\n * in the {@link #getHtmlParser} method.\r\n */\r\n htmlParser: undefined,\r\n\r\n /**\r\n * @private\r\n * @property {Autolinker.matchParser.MatchParser} matchParser\r\n * \r\n * The MatchParser instance used to find URL/email/Twitter matches in the text nodes of an input string passed to\r\n * {@link #link}. This is lazily instantiated in the {@link #getMatchParser} method.\r\n */\r\n matchParser: undefined,\r\n\r\n /**\r\n * @private\r\n * @property {Autolinker.AnchorTagBuilder} tagBuilder\r\n * \r\n * The AnchorTagBuilder instance used to build the URL/email/Twitter replacement anchor tags. This is lazily instantiated\r\n * in the {@link #getTagBuilder} method.\r\n */\r\n tagBuilder: undefined,\r\n\r\n\r\n /**\r\n * Automatically links URLs, email addresses, and Twitter handles found in the given chunk of HTML. \r\n * Does not link URLs found within HTML tags.\r\n * \r\n * For instance, if given the text: `You should go to http://www.yahoo.com`, then the result\r\n * will be `You should go to <a href=\"http://www.yahoo.com\">http://www.yahoo.com</a>`\r\n * \r\n * This method finds the text around any HTML elements in the input `textOrHtml`, which will be the text that is processed.\r\n * Any original HTML elements will be left as-is, as well as the text that is already wrapped in anchor (<a>) tags.\r\n * \r\n * @param {String} textOrHtml The HTML or text to link URLs, email addresses, and Twitter handles within (depending on if\r\n * the {@link #urls}, {@link #email}, and {@link #twitter} options are enabled).\r\n * @return {String} The HTML, with URLs/emails/Twitter handles automatically linked.\r\n */\r\n link: function (textOrHtml) {\r\n var htmlParser = this.getHtmlParser(),\r\n htmlNodes = htmlParser.parse(textOrHtml),\r\n anchorTagStackCount = 0, // used to only process text around anchor tags, and any inner text/html they may have\r\n resultHtml = [];\r\n\r\n for (var i = 0, len = htmlNodes.length; i < len; i++) {\r\n var node = htmlNodes[i],\r\n nodeType = node.getType(),\r\n nodeText = node.getText();\r\n\r\n if (nodeType === 'element') {\r\n // Process HTML nodes in the input `textOrHtml`\r\n if (node.getTagName() === 'a') {\r\n if (!node.isClosing()) { // it's the start tag\r\n anchorTagStackCount++;\r\n } else { // it's the end tag\r\n anchorTagStackCount = Math.max(anchorTagStackCount - 1, 0); // attempt to handle extraneous tags by making sure the stack count never goes below 0\r\n }\r\n }\r\n resultHtml.push(nodeText); // now add the text of the tag itself verbatim\r\n\r\n } else if (nodeType === 'entity') {\r\n resultHtml.push(nodeText); // append HTML entity nodes (such as ' ') verbatim\r\n\r\n } else {\r\n // Process text nodes in the input `textOrHtml`\r\n if (anchorTagStackCount === 0) {\r\n // If we're not within an tag, process the text node to linkify\r\n var linkifiedStr = this.linkifyStr(nodeText);\r\n resultHtml.push(linkifiedStr);\r\n\r\n } else {\r\n // `text` is within an tag, simply append the text - we do not want to autolink anything \r\n // already within an ... tag\r\n resultHtml.push(nodeText);\r\n }\r\n }\r\n }\r\n\r\n return resultHtml.join(\"\");\r\n },\r\n\r\n\r\n /**\r\n * Process the text that lies in between HTML tags, performing the anchor tag replacements for matched \r\n * URLs/emails/Twitter handles, and returns the string with the replacements made. \r\n * \r\n * This method does the actual wrapping of URLs/emails/Twitter handles with anchor tags.\r\n * \r\n * @private\r\n * @param {String} str The string of text to auto-link.\r\n * @return {String} The text with anchor tags auto-filled.\r\n */\r\n linkifyStr: function (str) {\r\n return this.getMatchParser().replace(str, this.createMatchReturnVal, this);\r\n },\r\n\r\n\r\n /**\r\n * Creates the return string value for a given match in the input string, for the {@link #processTextNode} method.\r\n * \r\n * This method handles the {@link #replaceFn}, if one was provided.\r\n * \r\n * @private\r\n * @param {Autolinker.match.Match} match The Match object that represents the match.\r\n * @return {String} The string that the `match` should be replaced with. This is usually the anchor tag string, but\r\n * may be the `matchStr` itself if the match is not to be replaced.\r\n */\r\n createMatchReturnVal: function (match) {\r\n // Handle a custom `replaceFn` being provided\r\n var replaceFnResult;\r\n if (this.replaceFn) {\r\n replaceFnResult = this.replaceFn.call(this, this, match); // Autolinker instance is the context, and the first arg\r\n }\r\n\r\n if (typeof replaceFnResult === 'string') {\r\n return replaceFnResult; // `replaceFn` returned a string, use that\r\n\r\n } else if (replaceFnResult === false) {\r\n return match.getMatchedText(); // no replacement for the match\r\n\r\n } else if (replaceFnResult instanceof Autolinker.HtmlTag) {\r\n return replaceFnResult.toString();\r\n\r\n } else { // replaceFnResult === true, or no/unknown return value from function\r\n // Perform Autolinker's default anchor tag generation\r\n var tagBuilder = this.getTagBuilder(),\r\n anchorTag = tagBuilder.build(match); // returns an Autolinker.HtmlTag instance\r\n\r\n return anchorTag.toString();\r\n }\r\n },\r\n\r\n\r\n /**\r\n * Lazily instantiates and returns the {@link #htmlParser} instance for this Autolinker instance.\r\n * \r\n * @protected\r\n * @return {Autolinker.htmlParser.HtmlParser}\r\n */\r\n getHtmlParser: function () {\r\n var htmlParser = this.htmlParser;\r\n\r\n if (!htmlParser) {\r\n htmlParser = this.htmlParser = new Autolinker.htmlParser.HtmlParser();\r\n }\r\n\r\n return htmlParser;\r\n },\r\n\r\n\r\n /**\r\n * Lazily instantiates and returns the {@link #matchParser} instance for this Autolinker instance.\r\n * \r\n * @protected\r\n * @return {Autolinker.matchParser.MatchParser}\r\n */\r\n getMatchParser: function () {\r\n var matchParser = this.matchParser;\r\n\r\n if (!matchParser) {\r\n matchParser = this.matchParser = new Autolinker.matchParser.MatchParser({\r\n urls: this.urls,\r\n email: this.email,\r\n twitter: this.twitter,\r\n stripPrefix: this.stripPrefix\r\n });\r\n }\r\n\r\n return matchParser;\r\n },\r\n\r\n\r\n /**\r\n * Returns the {@link #tagBuilder} instance for this Autolinker instance, lazily instantiating it\r\n * if it does not yet exist.\r\n * \r\n * This method may be used in a {@link #replaceFn} to generate the {@link Autolinker.HtmlTag HtmlTag} instance that \r\n * Autolinker would normally generate, and then allow for modifications before returning it. For example:\r\n * \r\n * var html = Autolinker.link( \"Test google.com\", {\r\n * replaceFn : function( autolinker, match ) {\r\n * var tag = autolinker.getTagBuilder().build( match ); // returns an {@link Autolinker.HtmlTag} instance\r\n * tag.setAttr( 'rel', 'nofollow' );\r\n * \r\n * return tag;\r\n * }\r\n * } );\r\n * \r\n * // generated html:\r\n * // Test google.com\r\n * \r\n * @return {Autolinker.AnchorTagBuilder}\r\n */\r\n getTagBuilder: function () {\r\n var tagBuilder = this.tagBuilder;\r\n\r\n if (!tagBuilder) {\r\n tagBuilder = this.tagBuilder = new Autolinker.AnchorTagBuilder({\r\n newWindow: this.newWindow,\r\n truncate: this.truncate,\r\n className: this.className\r\n });\r\n }\r\n\r\n return tagBuilder;\r\n }\r\n\r\n };\r\n\r\n\r\n /**\r\n * Automatically links URLs, email addresses, and Twitter handles found in the given chunk of HTML. \r\n * Does not link URLs found within HTML tags.\r\n * \r\n * For instance, if given the text: `You should go to http://www.yahoo.com`, then the result\r\n * will be `You should go to <a href=\"http://www.yahoo.com\">http://www.yahoo.com</a>`\r\n * \r\n * Example:\r\n * \r\n * var linkedText = Autolinker.link( \"Go to google.com\", { newWindow: false } );\r\n * // Produces: \"Go to google.com\"\r\n * \r\n * @static\r\n * @param {String} textOrHtml The HTML or text to find URLs, email addresses, and Twitter handles within (depending on if\r\n * the {@link #urls}, {@link #email}, and {@link #twitter} options are enabled).\r\n * @param {Object} [options] Any of the configuration options for the Autolinker class, specified in an Object (map).\r\n * See the class description for an example call.\r\n * @return {String} The HTML text, with URLs automatically linked\r\n */\r\n Autolinker.link = function (textOrHtml, options) {\r\n var autolinker = new Autolinker(options);\r\n return autolinker.link(textOrHtml);\r\n };\r\n\r\n\r\n // Autolinker Namespaces\r\n Autolinker.match = {};\r\n Autolinker.htmlParser = {};\r\n Autolinker.matchParser = {};\r\n /*global Autolinker */\r\n /*jshint eqnull:true, boss:true */\r\n /**\r\n * @class Autolinker.Util\r\n * @singleton\r\n * \r\n * A few utility methods for Autolinker.\r\n */\r\n Autolinker.Util = {\r\n\r\n /**\r\n * @property {Function} abstractMethod\r\n * \r\n * A function object which represents an abstract method.\r\n */\r\n abstractMethod: function () { throw \"abstract\"; },\r\n\r\n\r\n /**\r\n * Assigns (shallow copies) the properties of `src` onto `dest`.\r\n * \r\n * @param {Object} dest The destination object.\r\n * @param {Object} src The source object.\r\n * @return {Object} The destination object (`dest`)\r\n */\r\n assign: function (dest, src) {\r\n for (var prop in src) {\r\n if (src.hasOwnProperty(prop)) {\r\n dest[prop] = src[prop];\r\n }\r\n }\r\n\r\n return dest;\r\n },\r\n\r\n\r\n /**\r\n * Extends `superclass` to create a new subclass, adding the `protoProps` to the new subclass's prototype.\r\n * \r\n * @param {Function} superclass The constructor function for the superclass.\r\n * @param {Object} protoProps The methods/properties to add to the subclass's prototype. This may contain the\r\n * special property `constructor`, which will be used as the new subclass's constructor function.\r\n * @return {Function} The new subclass function.\r\n */\r\n extend: function (superclass, protoProps) {\r\n var superclassProto = superclass.prototype;\r\n\r\n var F = function () { };\r\n F.prototype = superclassProto;\r\n\r\n var subclass;\r\n if (protoProps.hasOwnProperty('constructor')) {\r\n subclass = protoProps.constructor;\r\n } else {\r\n subclass = function () { superclassProto.constructor.apply(this, arguments); };\r\n }\r\n\r\n var subclassProto = subclass.prototype = new F(); // set up prototype chain\r\n subclassProto.constructor = subclass; // fix constructor property\r\n subclassProto.superclass = superclassProto;\r\n\r\n delete protoProps.constructor; // don't re-assign constructor property to the prototype, since a new function may have been created (`subclass`), which is now already there\r\n Autolinker.Util.assign(subclassProto, protoProps);\r\n\r\n return subclass;\r\n },\r\n\r\n\r\n /**\r\n * Truncates the `str` at `len - ellipsisChars.length`, and adds the `ellipsisChars` to the\r\n * end of the string (by default, two periods: '..'). If the `str` length does not exceed \r\n * `len`, the string will be returned unchanged.\r\n * \r\n * @param {String} str The string to truncate and add an ellipsis to.\r\n * @param {Number} truncateLen The length to truncate the string at.\r\n * @param {String} [ellipsisChars=..] The ellipsis character(s) to add to the end of `str`\r\n * when truncated. Defaults to '..'\r\n */\r\n ellipsis: function (str, truncateLen, ellipsisChars) {\r\n if (str.length > truncateLen) {\r\n ellipsisChars = (ellipsisChars == null) ? '..' : ellipsisChars;\r\n str = str.substring(0, truncateLen - ellipsisChars.length) + ellipsisChars;\r\n }\r\n return str;\r\n },\r\n\r\n\r\n /**\r\n * Supports `Array.prototype.indexOf()` functionality for old IE (IE8 and below).\r\n * \r\n * @param {Array} arr The array to find an element of.\r\n * @param {*} element The element to find in the array, and return the index of.\r\n * @return {Number} The index of the `element`, or -1 if it was not found.\r\n */\r\n indexOf: function (arr, element) {\r\n if (Array.prototype.indexOf) {\r\n return arr.indexOf(element);\r\n\r\n } else {\r\n for (var i = 0, len = arr.length; i < len; i++) {\r\n if (arr[i] === element) return i;\r\n }\r\n return -1;\r\n }\r\n },\r\n\r\n\r\n\r\n /**\r\n * Performs the functionality of what modern browsers do when `String.prototype.split()` is called\r\n * with a regular expression that contains capturing parenthesis.\r\n * \r\n * For example:\r\n * \r\n * // Modern browsers: \r\n * \"a,b,c\".split( /(,)/ ); // --> [ 'a', ',', 'b', ',', 'c' ]\r\n * \r\n * // Old IE (including IE8):\r\n * \"a,b,c\".split( /(,)/ ); // --> [ 'a', 'b', 'c' ]\r\n * \r\n * This method emulates the functionality of modern browsers for the old IE case.\r\n * \r\n * @param {String} str The string to split.\r\n * @param {RegExp} splitRegex The regular expression to split the input `str` on. The splitting\r\n * character(s) will be spliced into the array, as in the \"modern browsers\" example in the \r\n * description of this method. \r\n * Note #1: the supplied regular expression **must** have the 'g' flag specified.\r\n * Note #2: for simplicity's sake, the regular expression does not need \r\n * to contain capturing parenthesis - it will be assumed that any match has them.\r\n * @return {String[]} The split array of strings, with the splitting character(s) included.\r\n */\r\n splitAndCapture: function (str, splitRegex) {\r\n if (!splitRegex.global) throw new Error(\"`splitRegex` must have the 'g' flag set\");\r\n\r\n var result = [],\r\n lastIdx = 0,\r\n match;\r\n\r\n while (match = splitRegex.exec(str)) {\r\n result.push(str.substring(lastIdx, match.index));\r\n result.push(match[0]); // push the splitting char(s)\r\n\r\n lastIdx = match.index + match[0].length;\r\n }\r\n result.push(str.substring(lastIdx));\r\n\r\n return result;\r\n }\r\n\r\n };\r\n /*global Autolinker */\r\n /*jshint boss:true */\r\n /**\r\n * @class Autolinker.HtmlTag\r\n * @extends Object\r\n * \r\n * Represents an HTML tag, which can be used to easily build/modify HTML tags programmatically.\r\n * \r\n * Autolinker uses this abstraction to create HTML tags, and then write them out as strings. You may also use\r\n * this class in your code, especially within a {@link Autolinker#replaceFn replaceFn}.\r\n * \r\n * ## Examples\r\n * \r\n * Example instantiation:\r\n * \r\n * var tag = new Autolinker.HtmlTag( {\r\n * tagName : 'a',\r\n * attrs : { 'href': 'http://google.com', 'class': 'external-link' },\r\n * innerHtml : 'Google'\r\n * } );\r\n * \r\n * tag.toString(); // Google\r\n * \r\n * // Individual accessor methods\r\n * tag.getTagName(); // 'a'\r\n * tag.getAttr( 'href' ); // 'http://google.com'\r\n * tag.hasClass( 'external-link' ); // true\r\n * \r\n * \r\n * Using mutator methods (which may be used in combination with instantiation config properties):\r\n * \r\n * var tag = new Autolinker.HtmlTag();\r\n * tag.setTagName( 'a' );\r\n * tag.setAttr( 'href', 'http://google.com' );\r\n * tag.addClass( 'external-link' );\r\n * tag.setInnerHtml( 'Google' );\r\n * \r\n * tag.getTagName(); // 'a'\r\n * tag.getAttr( 'href' ); // 'http://google.com'\r\n * tag.hasClass( 'external-link' ); // true\r\n * \r\n * tag.toString(); // Google\r\n * \r\n * \r\n * ## Example use within a {@link Autolinker#replaceFn replaceFn}\r\n * \r\n * var html = Autolinker.link( \"Test google.com\", {\r\n * replaceFn : function( autolinker, match ) {\r\n * var tag = autolinker.getTagBuilder().build( match ); // returns an {@link Autolinker.HtmlTag} instance, configured with the Match's href and anchor text\r\n * tag.setAttr( 'rel', 'nofollow' );\r\n * \r\n * return tag;\r\n * }\r\n * } );\r\n * \r\n * // generated html:\r\n * // Test google.com\r\n * \r\n * \r\n * ## Example use with a new tag for the replacement\r\n * \r\n * var html = Autolinker.link( \"Test google.com\", {\r\n * replaceFn : function( autolinker, match ) {\r\n * var tag = new Autolinker.HtmlTag( {\r\n * tagName : 'button',\r\n * attrs : { 'title': 'Load URL: ' + match.getAnchorHref() },\r\n * innerHtml : 'Load URL: ' + match.getAnchorText()\r\n * } );\r\n * \r\n * return tag;\r\n * }\r\n * } );\r\n * \r\n * // generated html:\r\n * // Test \r\n */\r\n Autolinker.HtmlTag = Autolinker.Util.extend(Object, {\r\n\r\n /**\r\n * @cfg {String} tagName\r\n * \r\n * The tag name. Ex: 'a', 'button', etc.\r\n * \r\n * Not required at instantiation time, but should be set using {@link #setTagName} before {@link #toString}\r\n * is executed.\r\n */\r\n\r\n /**\r\n * @cfg {Object.} attrs\r\n * \r\n * An key/value Object (map) of attributes to create the tag with. The keys are the attribute names, and the\r\n * values are the attribute values.\r\n */\r\n\r\n /**\r\n * @cfg {String} innerHtml\r\n * \r\n * The inner HTML for the tag. \r\n * \r\n * Note the camel case name on `innerHtml`. Acronyms are camelCased in this utility (such as not to run into the acronym \r\n * naming inconsistency that the DOM developers created with `XMLHttpRequest`). You may alternatively use {@link #innerHTML}\r\n * if you prefer, but this one is recommended.\r\n */\r\n\r\n /**\r\n * @cfg {String} innerHTML\r\n * \r\n * Alias of {@link #innerHtml}, accepted for consistency with the browser DOM api, but prefer the camelCased version\r\n * for acronym names.\r\n */\r\n\r\n\r\n /**\r\n * @protected\r\n * @property {RegExp} whitespaceRegex\r\n * \r\n * Regular expression used to match whitespace in a string of CSS classes.\r\n */\r\n whitespaceRegex: /\\s+/,\r\n\r\n\r\n /**\r\n * @constructor\r\n * @param {Object} [cfg] The configuration properties for this class, in an Object (map)\r\n */\r\n constructor: function (cfg) {\r\n Autolinker.Util.assign(this, cfg);\r\n\r\n this.innerHtml = this.innerHtml || this.innerHTML; // accept either the camelCased form or the fully capitalized acronym\r\n },\r\n\r\n\r\n /**\r\n * Sets the tag name that will be used to generate the tag with.\r\n * \r\n * @param {String} tagName\r\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\r\n */\r\n setTagName: function (tagName) {\r\n this.tagName = tagName;\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Retrieves the tag name.\r\n * \r\n * @return {String}\r\n */\r\n getTagName: function () {\r\n return this.tagName || \"\";\r\n },\r\n\r\n\r\n /**\r\n * Sets an attribute on the HtmlTag.\r\n * \r\n * @param {String} attrName The attribute name to set.\r\n * @param {String} attrValue The attribute value to set.\r\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\r\n */\r\n setAttr: function (attrName, attrValue) {\r\n var tagAttrs = this.getAttrs();\r\n tagAttrs[attrName] = attrValue;\r\n\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Retrieves an attribute from the HtmlTag. If the attribute does not exist, returns `undefined`.\r\n * \r\n * @param {String} name The attribute name to retrieve.\r\n * @return {String} The attribute's value, or `undefined` if it does not exist on the HtmlTag.\r\n */\r\n getAttr: function (attrName) {\r\n return this.getAttrs()[attrName];\r\n },\r\n\r\n\r\n /**\r\n * Sets one or more attributes on the HtmlTag.\r\n * \r\n * @param {Object.} attrs A key/value Object (map) of the attributes to set.\r\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\r\n */\r\n setAttrs: function (attrs) {\r\n var tagAttrs = this.getAttrs();\r\n Autolinker.Util.assign(tagAttrs, attrs);\r\n\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Retrieves the attributes Object (map) for the HtmlTag.\r\n * \r\n * @return {Object.} A key/value object of the attributes for the HtmlTag.\r\n */\r\n getAttrs: function () {\r\n return this.attrs || (this.attrs = {});\r\n },\r\n\r\n\r\n /**\r\n * Sets the provided `cssClass`, overwriting any current CSS classes on the HtmlTag.\r\n * \r\n * @param {String} cssClass One or more space-separated CSS classes to set (overwrite).\r\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\r\n */\r\n setClass: function (cssClass) {\r\n return this.setAttr('class', cssClass);\r\n },\r\n\r\n\r\n /**\r\n * Convenience method to add one or more CSS classes to the HtmlTag. Will not add duplicate CSS classes.\r\n * \r\n * @param {String} cssClass One or more space-separated CSS classes to add.\r\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\r\n */\r\n addClass: function (cssClass) {\r\n var classAttr = this.getClass(),\r\n whitespaceRegex = this.whitespaceRegex,\r\n indexOf = Autolinker.Util.indexOf, // to support IE8 and below\r\n classes = (!classAttr) ? [] : classAttr.split(whitespaceRegex),\r\n newClasses = cssClass.split(whitespaceRegex),\r\n newClass;\r\n\r\n while (newClass = newClasses.shift()) {\r\n if (indexOf(classes, newClass) === -1) {\r\n classes.push(newClass);\r\n }\r\n }\r\n\r\n this.getAttrs()['class'] = classes.join(\" \");\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Convenience method to remove one or more CSS classes from the HtmlTag.\r\n * \r\n * @param {String} cssClass One or more space-separated CSS classes to remove.\r\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\r\n */\r\n removeClass: function (cssClass) {\r\n var classAttr = this.getClass(),\r\n whitespaceRegex = this.whitespaceRegex,\r\n indexOf = Autolinker.Util.indexOf, // to support IE8 and below\r\n classes = (!classAttr) ? [] : classAttr.split(whitespaceRegex),\r\n removeClasses = cssClass.split(whitespaceRegex),\r\n removeClass;\r\n\r\n while (classes.length && (removeClass = removeClasses.shift())) {\r\n var idx = indexOf(classes, removeClass);\r\n if (idx !== -1) {\r\n classes.splice(idx, 1);\r\n }\r\n }\r\n\r\n this.getAttrs()['class'] = classes.join(\" \");\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Convenience method to retrieve the CSS class(es) for the HtmlTag, which will each be separated by spaces when\r\n * there are multiple.\r\n * \r\n * @return {String}\r\n */\r\n getClass: function () {\r\n return this.getAttrs()['class'] || \"\";\r\n },\r\n\r\n\r\n /**\r\n * Convenience method to check if the tag has a CSS class or not.\r\n * \r\n * @param {String} cssClass The CSS class to check for.\r\n * @return {Boolean} `true` if the HtmlTag has the CSS class, `false` otherwise.\r\n */\r\n hasClass: function (cssClass) {\r\n return (' ' + this.getClass() + ' ').indexOf(' ' + cssClass + ' ') !== -1;\r\n },\r\n\r\n\r\n /**\r\n * Sets the inner HTML for the tag.\r\n * \r\n * @param {String} html The inner HTML to set.\r\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\r\n */\r\n setInnerHtml: function (html) {\r\n this.innerHtml = html;\r\n\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Retrieves the inner HTML for the tag.\r\n * \r\n * @return {String}\r\n */\r\n getInnerHtml: function () {\r\n return this.innerHtml || \"\";\r\n },\r\n\r\n\r\n /**\r\n * Override of superclass method used to generate the HTML string for the tag.\r\n * \r\n * @return {String}\r\n */\r\n toString: function () {\r\n var tagName = this.getTagName(),\r\n attrsStr = this.buildAttrsStr();\r\n\r\n attrsStr = (attrsStr) ? ' ' + attrsStr : ''; // prepend a space if there are actually attributes\r\n\r\n return ['<', tagName, attrsStr, '>', this.getInnerHtml(), ''].join(\"\");\r\n },\r\n\r\n\r\n /**\r\n * Support method for {@link #toString}, returns the string space-separated key=\"value\" pairs, used to populate \r\n * the stringified HtmlTag.\r\n * \r\n * @protected\r\n * @return {String} Example return: `attr1=\"value1\" attr2=\"value2\"`\r\n */\r\n buildAttrsStr: function () {\r\n if (!this.attrs) return \"\"; // no `attrs` Object (map) has been set, return empty string\r\n\r\n var attrs = this.getAttrs(),\r\n attrsArr = [];\r\n\r\n for (var prop in attrs) {\r\n if (attrs.hasOwnProperty(prop)) {\r\n attrsArr.push(prop + '=\"' + attrs[prop] + '\"');\r\n }\r\n }\r\n return attrsArr.join(\" \");\r\n }\r\n\r\n });\r\n /*global Autolinker */\r\n /*jshint sub:true */\r\n /**\r\n * @protected\r\n * @class Autolinker.AnchorTagBuilder\r\n * @extends Object\r\n * \r\n * Builds anchor (<a>) tags for the Autolinker utility when a match is found.\r\n * \r\n * Normally this class is instantiated, configured, and used internally by an {@link Autolinker} instance, but may \r\n * actually be retrieved in a {@link Autolinker#replaceFn replaceFn} to create {@link Autolinker.HtmlTag HtmlTag} instances\r\n * which may be modified before returning from the {@link Autolinker#replaceFn replaceFn}. For example:\r\n * \r\n * var html = Autolinker.link( \"Test google.com\", {\r\n * replaceFn : function( autolinker, match ) {\r\n * var tag = autolinker.getTagBuilder().build( match ); // returns an {@link Autolinker.HtmlTag} instance\r\n * tag.setAttr( 'rel', 'nofollow' );\r\n * \r\n * return tag;\r\n * }\r\n * } );\r\n * \r\n * // generated html:\r\n * // Test google.com\r\n */\r\n Autolinker.AnchorTagBuilder = Autolinker.Util.extend(Object, {\r\n\r\n /**\r\n * @cfg {Boolean} newWindow\r\n * @inheritdoc Autolinker#newWindow\r\n */\r\n\r\n /**\r\n * @cfg {Number} truncate\r\n * @inheritdoc Autolinker#truncate\r\n */\r\n\r\n /**\r\n * @cfg {String} className\r\n * @inheritdoc Autolinker#className\r\n */\r\n\r\n\r\n /**\r\n * @constructor\r\n * @param {Object} [cfg] The configuration options for the AnchorTagBuilder instance, specified in an Object (map).\r\n */\r\n constructor: function (cfg) {\r\n Autolinker.Util.assign(this, cfg);\r\n },\r\n\r\n\r\n /**\r\n * Generates the actual anchor (<a>) tag to use in place of the matched URL/email/Twitter text,\r\n * via its `match` object.\r\n * \r\n * @param {Autolinker.match.Match} match The Match instance to generate an anchor tag from.\r\n * @return {Autolinker.HtmlTag} The HtmlTag instance for the anchor tag.\r\n */\r\n build: function (match) {\r\n var tag = new Autolinker.HtmlTag({\r\n tagName: 'a',\r\n attrs: this.createAttrs(match.getType(), match.getAnchorHref()),\r\n innerHtml: this.processAnchorText(match.getAnchorText())\r\n });\r\n\r\n return tag;\r\n },\r\n\r\n\r\n /**\r\n * Creates the Object (map) of the HTML attributes for the anchor (<a>) tag being generated.\r\n * \r\n * @protected\r\n * @param {\"url\"/\"email\"/\"twitter\"} matchType The type of match that an anchor tag is being generated for.\r\n * @param {String} href The href for the anchor tag.\r\n * @return {Object} A key/value Object (map) of the anchor tag's attributes. \r\n */\r\n createAttrs: function (matchType, anchorHref) {\r\n var attrs = {\r\n 'href': anchorHref // we'll always have the `href` attribute\r\n };\r\n\r\n var cssClass = this.createCssClass(matchType);\r\n if (cssClass) {\r\n attrs['class'] = cssClass;\r\n }\r\n if (this.newWindow) {\r\n attrs['target'] = \"_blank\";\r\n }\r\n\r\n return attrs;\r\n },\r\n\r\n\r\n /**\r\n * Creates the CSS class that will be used for a given anchor tag, based on the `matchType` and the {@link #className}\r\n * config.\r\n * \r\n * @private\r\n * @param {\"url\"/\"email\"/\"twitter\"} matchType The type of match that an anchor tag is being generated for.\r\n * @return {String} The CSS class string for the link. Example return: \"myLink myLink-url\". If no {@link #className}\r\n * was configured, returns an empty string.\r\n */\r\n createCssClass: function (matchType) {\r\n var className = this.className;\r\n\r\n if (!className)\r\n return \"\";\r\n else\r\n return className + \" \" + className + \"-\" + matchType; // ex: \"myLink myLink-url\", \"myLink myLink-email\", or \"myLink myLink-twitter\"\r\n },\r\n\r\n\r\n /**\r\n * Processes the `anchorText` by truncating the text according to the {@link #truncate} config.\r\n * \r\n * @private\r\n * @param {String} anchorText The anchor tag's text (i.e. what will be displayed).\r\n * @return {String} The processed `anchorText`.\r\n */\r\n processAnchorText: function (anchorText) {\r\n anchorText = this.doTruncate(anchorText);\r\n\r\n return anchorText;\r\n },\r\n\r\n\r\n /**\r\n * Performs the truncation of the `anchorText`, if the `anchorText` is longer than the {@link #truncate} option.\r\n * Truncates the text to 2 characters fewer than the {@link #truncate} option, and adds \"..\" to the end.\r\n * \r\n * @private\r\n * @param {String} text The anchor tag's text (i.e. what will be displayed).\r\n * @return {String} The truncated anchor text.\r\n */\r\n doTruncate: function (anchorText) {\r\n return Autolinker.Util.ellipsis(anchorText, this.truncate || Number.POSITIVE_INFINITY);\r\n }\r\n\r\n });\r\n /*global Autolinker */\r\n /**\r\n * @private\r\n * @class Autolinker.htmlParser.HtmlParser\r\n * @extends Object\r\n * \r\n * An HTML parser implementation which simply walks an HTML string and returns an array of \r\n * {@link Autolinker.htmlParser.HtmlNode HtmlNodes} that represent the basic HTML structure of the input string.\r\n * \r\n * Autolinker uses this to only link URLs/emails/Twitter handles within text nodes, effectively ignoring / \"walking\r\n * around\" HTML tags.\r\n */\r\n Autolinker.htmlParser.HtmlParser = Autolinker.Util.extend(Object, {\r\n\r\n /**\r\n * @private\r\n * @property {RegExp} htmlRegex\r\n * \r\n * The regular expression used to pull out HTML tags from a string. Handles namespaced HTML tags and\r\n * attribute names, as specified by http://www.w3.org/TR/html-markup/syntax.html.\r\n * \r\n * Capturing groups:\r\n * \r\n * 1. The \"!DOCTYPE\" tag name, if a tag is a <!DOCTYPE> tag.\r\n * 2. If it is an end tag, this group will have the '/'.\r\n * 3. The tag name for all tags (other than the <!DOCTYPE> tag)\r\n */\r\n htmlRegex: (function () {\r\n var tagNameRegex = /[0-9a-zA-Z][0-9a-zA-Z:]*/,\r\n attrNameRegex = /[^\\s\\0\"'>\\/=\\x01-\\x1F\\x7F]+/, // the unicode range accounts for excluding control chars, and the delete char\r\n attrValueRegex = /(?:\"[^\"]*?\"|'[^']*?'|[^'\"=<>`\\s]+)/, // double quoted, single quoted, or unquoted attribute values\r\n nameEqualsValueRegex = attrNameRegex.source + '(?:\\\\s*=\\\\s*' + attrValueRegex.source + ')?'; // optional '=[value]'\r\n\r\n return new RegExp([\r\n // for tag. Ex: ) \r\n '(?:',\r\n '<(!DOCTYPE)', // *** Capturing Group 1 - If it's a doctype tag\r\n\r\n // Zero or more attributes following the tag name\r\n '(?:',\r\n '\\\\s+', // one or more whitespace chars before an attribute\r\n\r\n // Either:\r\n // A. attr=\"value\", or \r\n // B. \"value\" alone (To cover example doctype tag: ) \r\n '(?:', nameEqualsValueRegex, '|', attrValueRegex.source + ')',\r\n ')*',\r\n '>',\r\n ')',\r\n\r\n '|',\r\n\r\n // All other HTML tags (i.e. tags that are not )\r\n '(?:',\r\n '<(/)?', // Beginning of a tag. Either '<' for a start tag, or ''\r\n '>',\r\n ')'\r\n ].join(\"\"), 'gi');\r\n })(),\r\n\r\n /**\r\n * @private\r\n * @property {RegExp} htmlCharacterEntitiesRegex\r\n *\r\n * The regular expression that matches common HTML character entities.\r\n * \r\n * Ignoring & as it could be part of a query string -- handling it separately.\r\n */\r\n htmlCharacterEntitiesRegex: /( | |<|<|>|>|"|"|')/gi,\r\n\r\n\r\n /**\r\n * Parses an HTML string and returns a simple array of {@link Autolinker.htmlParser.HtmlNode HtmlNodes} to represent\r\n * the HTML structure of the input string. \r\n * \r\n * @param {String} html The HTML to parse.\r\n * @return {Autolinker.htmlParser.HtmlNode[]}\r\n */\r\n parse: function (html) {\r\n var htmlRegex = this.htmlRegex,\r\n currentResult,\r\n lastIndex = 0,\r\n textAndEntityNodes,\r\n nodes = []; // will be the result of the method\r\n\r\n while ((currentResult = htmlRegex.exec(html)) !== null) {\r\n var tagText = currentResult[0],\r\n tagName = currentResult[1] || currentResult[3], // The tag (ex: \"!DOCTYPE\"), or another tag (ex: \"a\" or \"img\") \r\n isClosingTag = !!currentResult[2],\r\n inBetweenTagsText = html.substring(lastIndex, currentResult.index);\r\n\r\n // Push TextNodes and EntityNodes for any text found between tags\r\n if (inBetweenTagsText) {\r\n textAndEntityNodes = this.parseTextAndEntityNodes(inBetweenTagsText);\r\n nodes.push.apply(nodes, textAndEntityNodes);\r\n }\r\n\r\n // Push the ElementNode\r\n nodes.push(this.createElementNode(tagText, tagName, isClosingTag));\r\n\r\n lastIndex = currentResult.index + tagText.length;\r\n }\r\n\r\n // Process any remaining text after the last HTML element. Will process all of the text if there were no HTML elements.\r\n if (lastIndex < html.length) {\r\n var text = html.substring(lastIndex);\r\n\r\n // Push TextNodes and EntityNodes for any text found between tags\r\n if (text) {\r\n textAndEntityNodes = this.parseTextAndEntityNodes(text);\r\n nodes.push.apply(nodes, textAndEntityNodes);\r\n }\r\n }\r\n\r\n return nodes;\r\n },\r\n\r\n\r\n /**\r\n * Parses text and HTML entity nodes from a given string. The input string should not have any HTML tags (elements)\r\n * within it.\r\n * \r\n * @private\r\n * @param {String} text The text to parse.\r\n * @return {Autolinker.htmlParser.HtmlNode[]} An array of HtmlNodes to represent the \r\n * {@link Autolinker.htmlParser.TextNode TextNodes} and {@link Autolinker.htmlParser.EntityNode EntityNodes} found.\r\n */\r\n parseTextAndEntityNodes: function (text) {\r\n var nodes = [],\r\n textAndEntityTokens = Autolinker.Util.splitAndCapture(text, this.htmlCharacterEntitiesRegex); // split at HTML entities, but include the HTML entities in the results array\r\n\r\n // Every even numbered token is a TextNode, and every odd numbered token is an EntityNode\r\n // For example: an input `text` of \"Test "this" today\" would turn into the \r\n // `textAndEntityTokens`: [ 'Test ', '"', 'this', '"', ' today' ]\r\n for (var i = 0, len = textAndEntityTokens.length; i < len; i += 2) {\r\n var textToken = textAndEntityTokens[i],\r\n entityToken = textAndEntityTokens[i + 1];\r\n\r\n if (textToken) nodes.push(this.createTextNode(textToken));\r\n if (entityToken) nodes.push(this.createEntityNode(entityToken));\r\n }\r\n return nodes;\r\n },\r\n\r\n\r\n /**\r\n * Factory method to create an {@link Autolinker.htmlParser.ElementNode ElementNode}.\r\n * \r\n * @private\r\n * @param {String} tagText The full text of the tag (element) that was matched, including its attributes.\r\n * @param {String} tagName The name of the tag. Ex: An <img> tag would be passed to this method as \"img\".\r\n * @param {Boolean} isClosingTag `true` if it's a closing tag, false otherwise.\r\n * @return {Autolinker.htmlParser.ElementNode}\r\n */\r\n createElementNode: function (tagText, tagName, isClosingTag) {\r\n return new Autolinker.htmlParser.ElementNode({\r\n text: tagText,\r\n tagName: tagName.toLowerCase(),\r\n closing: isClosingTag\r\n });\r\n },\r\n\r\n\r\n /**\r\n * Factory method to create a {@link Autolinker.htmlParser.EntityNode EntityNode}.\r\n * \r\n * @private\r\n * @param {String} text The text that was matched for the HTML entity (such as '&nbsp;').\r\n * @return {Autolinker.htmlParser.EntityNode}\r\n */\r\n createEntityNode: function (text) {\r\n return new Autolinker.htmlParser.EntityNode({ text: text });\r\n },\r\n\r\n\r\n /**\r\n * Factory method to create a {@link Autolinker.htmlParser.TextNode TextNode}.\r\n * \r\n * @private\r\n * @param {String} text The text that was matched.\r\n * @return {Autolinker.htmlParser.TextNode}\r\n */\r\n createTextNode: function (text) {\r\n return new Autolinker.htmlParser.TextNode({ text: text });\r\n }\r\n\r\n });\r\n /*global Autolinker */\r\n /**\r\n * @abstract\r\n * @class Autolinker.htmlParser.HtmlNode\r\n * \r\n * Represents an HTML node found in an input string. An HTML node is one of the following:\r\n * \r\n * 1. An {@link Autolinker.htmlParser.ElementNode ElementNode}, which represents HTML tags.\r\n * 2. A {@link Autolinker.htmlParser.TextNode TextNode}, which represents text outside or within HTML tags.\r\n * 3. A {@link Autolinker.htmlParser.EntityNode EntityNode}, which represents one of the known HTML\r\n * entities that Autolinker looks for. This includes common ones such as &quot; and &nbsp;\r\n */\r\n Autolinker.htmlParser.HtmlNode = Autolinker.Util.extend(Object, {\r\n\r\n /**\r\n * @cfg {String} text (required)\r\n * \r\n * The original text that was matched for the HtmlNode. \r\n * \r\n * - In the case of an {@link Autolinker.htmlParser.ElementNode ElementNode}, this will be the tag's\r\n * text.\r\n * - In the case of a {@link Autolinker.htmlParser.TextNode TextNode}, this will be the text itself.\r\n * - In the case of a {@link Autolinker.htmlParser.EntityNode EntityNode}, this will be the text of\r\n * the HTML entity.\r\n */\r\n text: \"\",\r\n\r\n\r\n /**\r\n * @constructor\r\n * @param {Object} cfg The configuration properties for the Match instance, specified in an Object (map).\r\n */\r\n constructor: function (cfg) {\r\n Autolinker.Util.assign(this, cfg);\r\n },\r\n\r\n\r\n /**\r\n * Returns a string name for the type of node that this class represents.\r\n * \r\n * @abstract\r\n * @return {String}\r\n */\r\n getType: Autolinker.Util.abstractMethod,\r\n\r\n\r\n /**\r\n * Retrieves the {@link #text} for the HtmlNode.\r\n * \r\n * @return {String}\r\n */\r\n getText: function () {\r\n return this.text;\r\n }\r\n\r\n });\r\n /*global Autolinker */\r\n /**\r\n * @class Autolinker.htmlParser.ElementNode\r\n * @extends Autolinker.htmlParser.HtmlNode\r\n * \r\n * Represents an HTML element node that has been parsed by the {@link Autolinker.htmlParser.HtmlParser}.\r\n * \r\n * See this class's superclass ({@link Autolinker.htmlParser.HtmlNode}) for more details.\r\n */\r\n Autolinker.htmlParser.ElementNode = Autolinker.Util.extend(Autolinker.htmlParser.HtmlNode, {\r\n\r\n /**\r\n * @cfg {String} tagName (required)\r\n * \r\n * The name of the tag that was matched.\r\n */\r\n tagName: '',\r\n\r\n /**\r\n * @cfg {Boolean} closing (required)\r\n * \r\n * `true` if the element (tag) is a closing tag, `false` if its an opening tag.\r\n */\r\n closing: false,\r\n\r\n\r\n /**\r\n * Returns a string name for the type of node that this class represents.\r\n * \r\n * @return {String}\r\n */\r\n getType: function () {\r\n return 'element';\r\n },\r\n\r\n\r\n /**\r\n * Returns the HTML element's (tag's) name. Ex: for an <img> tag, returns \"img\".\r\n * \r\n * @return {String}\r\n */\r\n getTagName: function () {\r\n return this.tagName;\r\n },\r\n\r\n\r\n /**\r\n * Determines if the HTML element (tag) is a closing tag. Ex: <div> returns\r\n * `false`, while </div> returns `true`.\r\n * \r\n * @return {Boolean}\r\n */\r\n isClosing: function () {\r\n return this.closing;\r\n }\r\n\r\n });\r\n /*global Autolinker */\r\n /**\r\n * @class Autolinker.htmlParser.EntityNode\r\n * @extends Autolinker.htmlParser.HtmlNode\r\n * \r\n * Represents a known HTML entity node that has been parsed by the {@link Autolinker.htmlParser.HtmlParser}.\r\n * Ex: '&nbsp;', or '&#160;' (which will be retrievable from the {@link #getText} method.\r\n * \r\n * Note that this class will only be returned from the HtmlParser for the set of checked HTML entity nodes \r\n * defined by the {@link Autolinker.htmlParser.HtmlParser#htmlCharacterEntitiesRegex}.\r\n * \r\n * See this class's superclass ({@link Autolinker.htmlParser.HtmlNode}) for more details.\r\n */\r\n Autolinker.htmlParser.EntityNode = Autolinker.Util.extend(Autolinker.htmlParser.HtmlNode, {\r\n\r\n /**\r\n * Returns a string name for the type of node that this class represents.\r\n * \r\n * @return {String}\r\n */\r\n getType: function () {\r\n return 'entity';\r\n }\r\n\r\n });\r\n /*global Autolinker */\r\n /**\r\n * @class Autolinker.htmlParser.TextNode\r\n * @extends Autolinker.htmlParser.HtmlNode\r\n * \r\n * Represents a text node that has been parsed by the {@link Autolinker.htmlParser.HtmlParser}.\r\n * \r\n * See this class's superclass ({@link Autolinker.htmlParser.HtmlNode}) for more details.\r\n */\r\n Autolinker.htmlParser.TextNode = Autolinker.Util.extend(Autolinker.htmlParser.HtmlNode, {\r\n\r\n /**\r\n * Returns a string name for the type of node that this class represents.\r\n * \r\n * @return {String}\r\n */\r\n getType: function () {\r\n return 'text';\r\n }\r\n\r\n });\r\n /*global Autolinker */\r\n /**\r\n * @private\r\n * @class Autolinker.matchParser.MatchParser\r\n * @extends Object\r\n * \r\n * Used by Autolinker to parse {@link #urls URLs}, {@link #emails email addresses}, and {@link #twitter Twitter handles}, \r\n * given an input string of text.\r\n * \r\n * The MatchParser is fed a non-HTML string in order to search out URLs, email addresses and Twitter handles. Autolinker\r\n * first uses the {@link HtmlParser} to \"walk around\" HTML tags, and then the text around the HTML tags is passed into\r\n * the MatchParser in order to find the actual matches.\r\n */\r\n Autolinker.matchParser.MatchParser = Autolinker.Util.extend(Object, {\r\n\r\n /**\r\n * @cfg {Boolean} urls\r\n * \r\n * `true` if miscellaneous URLs should be automatically linked, `false` if they should not be.\r\n */\r\n urls: true,\r\n\r\n /**\r\n * @cfg {Boolean} email\r\n * \r\n * `true` if email addresses should be automatically linked, `false` if they should not be.\r\n */\r\n email: true,\r\n\r\n /**\r\n * @cfg {Boolean} twitter\r\n * \r\n * `true` if Twitter handles (\"@example\") should be automatically linked, `false` if they should not be.\r\n */\r\n twitter: true,\r\n\r\n /**\r\n * @cfg {Boolean} stripPrefix\r\n * \r\n * `true` if 'http://' or 'https://' and/or the 'www.' should be stripped from the beginning of URL links' text\r\n * in {@link Autolinker.match.Url URL matches}, `false` otherwise.\r\n * \r\n * TODO: Handle this before a URL Match object is instantiated.\r\n */\r\n stripPrefix: true,\r\n\r\n\r\n /**\r\n * @private\r\n * @property {RegExp} matcherRegex\r\n * \r\n * The regular expression that matches URLs, email addresses, and Twitter handles.\r\n * \r\n * This regular expression has the following capturing groups:\r\n * \r\n * 1. Group that is used to determine if there is a Twitter handle match (i.e. \\@someTwitterUser). Simply check for its \r\n * existence to determine if there is a Twitter handle match. The next couple of capturing groups give information \r\n * about the Twitter handle match.\r\n * 2. The whitespace character before the \\@sign in a Twitter handle. This is needed because there are no lookbehinds in\r\n * JS regular expressions, and can be used to reconstruct the original string in a replace().\r\n * 3. The Twitter handle itself in a Twitter match. If the match is '@someTwitterUser', the handle is 'someTwitterUser'.\r\n * 4. Group that matches an email address. Used to determine if the match is an email address, as well as holding the full \r\n * address. Ex: 'me@my.com'\r\n * 5. Group that matches a URL in the input text. Ex: 'http://google.com', 'www.google.com', or just 'google.com'.\r\n * This also includes a path, url parameters, or hash anchors. Ex: google.com/path/to/file?q1=1&q2=2#myAnchor\r\n * 6. Group that matches a protocol URL (i.e. 'http://google.com'). This is used to match protocol URLs with just a single\r\n * word, like 'http://localhost', where we won't double check that the domain name has at least one '.' in it.\r\n * 7. A protocol-relative ('//') match for the case of a 'www.' prefixed URL. Will be an empty string if it is not a \r\n * protocol-relative match. We need to know the character before the '//' in order to determine if it is a valid match\r\n * or the // was in a string we don't want to auto-link.\r\n * 8. A protocol-relative ('//') match for the case of a known TLD prefixed URL. Will be an empty string if it is not a \r\n * protocol-relative match. See #6 for more info. \r\n */\r\n matcherRegex: (function () {\r\n var twitterRegex = /(^|[^\\w])@(\\w{1,15})/, // For matching a twitter handle. Ex: @gregory_jacobs\r\n\r\n emailRegex = /(?:[\\-;:&=\\+\\$,\\w\\.]+@)/, // something@ for email addresses (a.k.a. local-part)\r\n\r\n protocolRegex = /(?:[A-Za-z][-.+A-Za-z0-9]+:(?![A-Za-z][-.+A-Za-z0-9]+:\\/\\/)(?!\\d+\\/?)(?:\\/\\/)?)/, // match protocol, allow in format \"http://\" or \"mailto:\". However, do not match the first part of something like 'link:http://www.google.com' (i.e. don't match \"link:\"). Also, make sure we don't interpret 'google.com:8000' as if 'google.com' was a protocol here (i.e. ignore a trailing port number in this regex)\r\n wwwRegex = /(?:www\\.)/, // starting with 'www.'\r\n domainNameRegex = /[A-Za-z0-9\\.\\-]*[A-Za-z0-9\\-]/, // anything looking at all like a domain, non-unicode domains, not ending in a period\r\n tldRegex = /\\.(?:international|construction|contractors|enterprises|photography|productions|foundation|immobilien|industries|management|properties|technology|christmas|community|directory|education|equipment|institute|marketing|solutions|vacations|bargains|boutique|builders|catering|cleaning|clothing|computer|democrat|diamonds|graphics|holdings|lighting|partners|plumbing|supplies|training|ventures|academy|careers|company|cruises|domains|exposed|flights|florist|gallery|guitars|holiday|kitchen|neustar|okinawa|recipes|rentals|reviews|shiksha|singles|support|systems|agency|berlin|camera|center|coffee|condos|dating|estate|events|expert|futbol|kaufen|luxury|maison|monash|museum|nagoya|photos|repair|report|social|supply|tattoo|tienda|travel|viajes|villas|vision|voting|voyage|actor|build|cards|cheap|codes|dance|email|glass|house|mango|ninja|parts|photo|shoes|solar|today|tokyo|tools|watch|works|aero|arpa|asia|best|bike|blue|buzz|camp|club|cool|coop|farm|fish|gift|guru|info|jobs|kiwi|kred|land|limo|link|menu|mobi|moda|name|pics|pink|post|qpon|rich|ruhr|sexy|tips|vote|voto|wang|wien|wiki|zone|bar|bid|biz|cab|cat|ceo|com|edu|gov|int|kim|mil|net|onl|org|pro|pub|red|tel|uno|wed|xxx|xyz|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)\\b/, // match our known top level domains (TLDs)\r\n\r\n // Allow optional path, query string, and hash anchor, not ending in the following characters: \"?!:,.;\"\r\n // http://blog.codinghorror.com/the-problem-with-urls/\r\n urlSuffixRegex = /[\\-A-Za-z0-9+&@#\\/%=~_()|'$*\\[\\]?!:,.;]*[\\-A-Za-z0-9+&@#\\/%=~_()|'$*\\[\\]]/;\r\n\r\n return new RegExp([\r\n '(', // *** Capturing group $1, which can be used to check for a twitter handle match. Use group $3 for the actual twitter handle though. $2 may be used to reconstruct the original string in a replace() \r\n // *** Capturing group $2, which matches the whitespace character before the '@' sign (needed because of no lookbehinds), and \r\n // *** Capturing group $3, which matches the actual twitter handle\r\n twitterRegex.source,\r\n ')',\r\n\r\n '|',\r\n\r\n '(', // *** Capturing group $4, which is used to determine an email match\r\n emailRegex.source,\r\n domainNameRegex.source,\r\n tldRegex.source,\r\n ')',\r\n\r\n '|',\r\n\r\n '(', // *** Capturing group $5, which is used to match a URL\r\n '(?:', // parens to cover match for protocol (optional), and domain\r\n '(', // *** Capturing group $6, for a protocol-prefixed url (ex: http://google.com)\r\n protocolRegex.source,\r\n domainNameRegex.source,\r\n ')',\r\n\r\n '|',\r\n\r\n '(?:', // non-capturing paren for a 'www.' prefixed url (ex: www.google.com)\r\n '(.?//)?', // *** Capturing group $7 for an optional protocol-relative URL. Must be at the beginning of the string or start with a non-word character\r\n wwwRegex.source,\r\n domainNameRegex.source,\r\n ')',\r\n\r\n '|',\r\n\r\n '(?:', // non-capturing paren for known a TLD url (ex: google.com)\r\n '(.?//)?', // *** Capturing group $8 for an optional protocol-relative URL. Must be at the beginning of the string or start with a non-word character\r\n domainNameRegex.source,\r\n tldRegex.source,\r\n ')',\r\n ')',\r\n\r\n '(?:' + urlSuffixRegex.source + ')?', // match for path, query string, and/or hash anchor - optional\r\n ')'\r\n ].join(\"\"), 'gi');\r\n })(),\r\n\r\n /**\r\n * @private\r\n * @property {RegExp} charBeforeProtocolRelMatchRegex\r\n * \r\n * The regular expression used to retrieve the character before a protocol-relative URL match.\r\n * \r\n * This is used in conjunction with the {@link #matcherRegex}, which needs to grab the character before a protocol-relative\r\n * '//' due to the lack of a negative look-behind in JavaScript regular expressions. The character before the match is stripped\r\n * from the URL.\r\n */\r\n charBeforeProtocolRelMatchRegex: /^(.)?\\/\\//,\r\n\r\n /**\r\n * @private\r\n * @property {Autolinker.MatchValidator} matchValidator\r\n * \r\n * The MatchValidator object, used to filter out any false positives from the {@link #matcherRegex}. See\r\n * {@link Autolinker.MatchValidator} for details.\r\n */\r\n\r\n\r\n /**\r\n * @constructor\r\n * @param {Object} [cfg] The configuration options for the AnchorTagBuilder instance, specified in an Object (map).\r\n */\r\n constructor: function (cfg) {\r\n Autolinker.Util.assign(this, cfg);\r\n\r\n this.matchValidator = new Autolinker.MatchValidator();\r\n },\r\n\r\n\r\n /**\r\n * Parses the input `text` to search for URLs/emails/Twitter handles, and calls the `replaceFn`\r\n * to allow replacements of the matches. Returns the `text` with matches replaced.\r\n * \r\n * @param {String} text The text to search and repace matches in.\r\n * @param {Function} replaceFn The iterator function to handle the replacements. The function takes a\r\n * single argument, a {@link Autolinker.match.Match} object, and should return the text that should\r\n * make the replacement.\r\n * @param {Object} [contextObj=window] The context object (\"scope\") to run the `replaceFn` in.\r\n * @return {String}\r\n */\r\n replace: function (text, replaceFn, contextObj) {\r\n var me = this; // for closure\r\n\r\n return text.replace(this.matcherRegex, function (matchStr, $1, $2, $3, $4, $5, $6, $7, $8) {\r\n var matchDescObj = me.processCandidateMatch(matchStr, $1, $2, $3, $4, $5, $6, $7, $8); // \"match description\" object\r\n\r\n // Return out with no changes for match types that are disabled (url, email, twitter), or for matches that are \r\n // invalid (false positives from the matcherRegex, which can't use look-behinds since they are unavailable in JS).\r\n if (!matchDescObj) {\r\n return matchStr;\r\n\r\n } else {\r\n // Generate replacement text for the match from the `replaceFn`\r\n var replaceStr = replaceFn.call(contextObj, matchDescObj.match);\r\n return matchDescObj.prefixStr + replaceStr + matchDescObj.suffixStr;\r\n }\r\n });\r\n },\r\n\r\n\r\n /**\r\n * Processes a candidate match from the {@link #matcherRegex}. \r\n * \r\n * Not all matches found by the regex are actual URL/email/Twitter matches, as determined by the {@link #matchValidator}. In\r\n * this case, the method returns `null`. Otherwise, a valid Object with `prefixStr`, `match`, and `suffixStr` is returned.\r\n * \r\n * @private\r\n * @param {String} matchStr The full match that was found by the {@link #matcherRegex}.\r\n * @param {String} twitterMatch The matched text of a Twitter handle, if the match is a Twitter match.\r\n * @param {String} twitterHandlePrefixWhitespaceChar The whitespace char before the @ sign in a Twitter handle match. This \r\n * is needed because of no lookbehinds in JS regexes, and is need to re-include the character for the anchor tag replacement.\r\n * @param {String} twitterHandle The actual Twitter user (i.e the word after the @ sign in a Twitter match).\r\n * @param {String} emailAddressMatch The matched email address for an email address match.\r\n * @param {String} urlMatch The matched URL string for a URL match.\r\n * @param {String} protocolUrlMatch The match URL string for a protocol match. Ex: 'http://yahoo.com'. This is used to match\r\n * something like 'http://localhost', where we won't double check that the domain name has at least one '.' in it.\r\n * @param {String} wwwProtocolRelativeMatch The '//' for a protocol-relative match from a 'www' url, with the character that \r\n * comes before the '//'.\r\n * @param {String} tldProtocolRelativeMatch The '//' for a protocol-relative match from a TLD (top level domain) match, with \r\n * the character that comes before the '//'.\r\n * \r\n * @return {Object} A \"match description object\". This will be `null` if the match was invalid, or if a match type is disabled.\r\n * Otherwise, this will be an Object (map) with the following properties:\r\n * @return {String} return.prefixStr The char(s) that should be prepended to the replacement string. These are char(s) that\r\n * were needed to be included from the regex match that were ignored by processing code, and should be re-inserted into \r\n * the replacement stream.\r\n * @return {String} return.suffixStr The char(s) that should be appended to the replacement string. These are char(s) that\r\n * were needed to be included from the regex match that were ignored by processing code, and should be re-inserted into \r\n * the replacement stream.\r\n * @return {Autolinker.match.Match} return.match The Match object that represents the match that was found.\r\n */\r\n processCandidateMatch: function (\r\n matchStr, twitterMatch, twitterHandlePrefixWhitespaceChar, twitterHandle,\r\n emailAddressMatch, urlMatch, protocolUrlMatch, wwwProtocolRelativeMatch, tldProtocolRelativeMatch\r\n ) {\r\n // Note: The `matchStr` variable wil be fixed up to remove characters that are no longer needed (which will \r\n // be added to `prefixStr` and `suffixStr`).\r\n\r\n var protocolRelativeMatch = wwwProtocolRelativeMatch || tldProtocolRelativeMatch,\r\n match, // Will be an Autolinker.match.Match object\r\n\r\n prefixStr = \"\", // A string to use to prefix the anchor tag that is created. This is needed for the Twitter handle match\r\n suffixStr = \"\"; // A string to suffix the anchor tag that is created. This is used if there is a trailing parenthesis that should not be auto-linked.\r\n\r\n\r\n // Return out with `null` for match types that are disabled (url, email, twitter), or for matches that are \r\n // invalid (false positives from the matcherRegex, which can't use look-behinds since they are unavailable in JS).\r\n if (\r\n (twitterMatch && !this.twitter) || (emailAddressMatch && !this.email) || (urlMatch && !this.urls) ||\r\n !this.matchValidator.isValidMatch(urlMatch, protocolUrlMatch, protocolRelativeMatch)\r\n ) {\r\n return null;\r\n }\r\n\r\n // Handle a closing parenthesis at the end of the match, and exclude it if there is not a matching open parenthesis\r\n // in the match itself. \r\n if (this.matchHasUnbalancedClosingParen(matchStr)) {\r\n matchStr = matchStr.substr(0, matchStr.length - 1); // remove the trailing \")\"\r\n suffixStr = \")\"; // this will be added after the generated tag\r\n }\r\n\r\n\r\n if (emailAddressMatch) {\r\n match = new Autolinker.match.Email({ matchedText: matchStr, email: emailAddressMatch });\r\n\r\n } else if (twitterMatch) {\r\n // fix up the `matchStr` if there was a preceding whitespace char, which was needed to determine the match \r\n // itself (since there are no look-behinds in JS regexes)\r\n if (twitterHandlePrefixWhitespaceChar) {\r\n prefixStr = twitterHandlePrefixWhitespaceChar;\r\n matchStr = matchStr.slice(1); // remove the prefixed whitespace char from the match\r\n }\r\n match = new Autolinker.match.Twitter({ matchedText: matchStr, twitterHandle: twitterHandle });\r\n\r\n } else { // url match\r\n // If it's a protocol-relative '//' match, remove the character before the '//' (which the matcherRegex needed\r\n // to match due to the lack of a negative look-behind in JavaScript regular expressions)\r\n if (protocolRelativeMatch) {\r\n var charBeforeMatch = protocolRelativeMatch.match(this.charBeforeProtocolRelMatchRegex)[1] || \"\";\r\n\r\n if (charBeforeMatch) { // fix up the `matchStr` if there was a preceding char before a protocol-relative match, which was needed to determine the match itself (since there are no look-behinds in JS regexes)\r\n prefixStr = charBeforeMatch;\r\n matchStr = matchStr.slice(1); // remove the prefixed char from the match\r\n }\r\n }\r\n\r\n match = new Autolinker.match.Url({\r\n matchedText: matchStr,\r\n url: matchStr,\r\n protocolUrlMatch: !!protocolUrlMatch,\r\n protocolRelativeMatch: !!protocolRelativeMatch,\r\n stripPrefix: this.stripPrefix\r\n });\r\n }\r\n\r\n return {\r\n prefixStr: prefixStr,\r\n suffixStr: suffixStr,\r\n match: match\r\n };\r\n },\r\n\r\n\r\n /**\r\n * Determines if a match found has an unmatched closing parenthesis. If so, this parenthesis will be removed\r\n * from the match itself, and appended after the generated anchor tag in {@link #processTextNode}.\r\n * \r\n * A match may have an extra closing parenthesis at the end of the match because the regular expression must include parenthesis\r\n * for URLs such as \"wikipedia.com/something_(disambiguation)\", which should be auto-linked. \r\n * \r\n * However, an extra parenthesis *will* be included when the URL itself is wrapped in parenthesis, such as in the case of\r\n * \"(wikipedia.com/something_(disambiguation))\". In this case, the last closing parenthesis should *not* be part of the URL \r\n * itself, and this method will return `true`.\r\n * \r\n * @private\r\n * @param {String} matchStr The full match string from the {@link #matcherRegex}.\r\n * @return {Boolean} `true` if there is an unbalanced closing parenthesis at the end of the `matchStr`, `false` otherwise.\r\n */\r\n matchHasUnbalancedClosingParen: function (matchStr) {\r\n var lastChar = matchStr.charAt(matchStr.length - 1);\r\n\r\n if (lastChar === ')') {\r\n var openParensMatch = matchStr.match(/\\(/g),\r\n closeParensMatch = matchStr.match(/\\)/g),\r\n numOpenParens = (openParensMatch && openParensMatch.length) || 0,\r\n numCloseParens = (closeParensMatch && closeParensMatch.length) || 0;\r\n\r\n if (numOpenParens < numCloseParens) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n });\r\n /*global Autolinker */\r\n /*jshint scripturl:true */\r\n /**\r\n * @private\r\n * @class Autolinker.MatchValidator\r\n * @extends Object\r\n * \r\n * Used by Autolinker to filter out false positives from the {@link Autolinker#matcherRegex}.\r\n * \r\n * Due to the limitations of regular expressions (including the missing feature of look-behinds in JS regular expressions),\r\n * we cannot always determine the validity of a given match. This class applies a bit of additional logic to filter out any\r\n * false positives that have been matched by the {@link Autolinker#matcherRegex}.\r\n */\r\n Autolinker.MatchValidator = Autolinker.Util.extend(Object, {\r\n\r\n /**\r\n * @private\r\n * @property {RegExp} invalidProtocolRelMatchRegex\r\n * \r\n * The regular expression used to check a potential protocol-relative URL match, coming from the \r\n * {@link Autolinker#matcherRegex}. A protocol-relative URL is, for example, \"//yahoo.com\"\r\n * \r\n * This regular expression checks to see if there is a word character before the '//' match in order to determine if \r\n * we should actually autolink a protocol-relative URL. This is needed because there is no negative look-behind in \r\n * JavaScript regular expressions. \r\n * \r\n * For instance, we want to autolink something like \"Go to: //google.com\", but we don't want to autolink something \r\n * like \"abc//google.com\"\r\n */\r\n invalidProtocolRelMatchRegex: /^[\\w]\\/\\//,\r\n\r\n /**\r\n * Regex to test for a full protocol, with the two trailing slashes. Ex: 'http://'\r\n * \r\n * @private\r\n * @property {RegExp} hasFullProtocolRegex\r\n */\r\n hasFullProtocolRegex: /^[A-Za-z][-.+A-Za-z0-9]+:\\/\\//,\r\n\r\n /**\r\n * Regex to find the URI scheme, such as 'mailto:'.\r\n * \r\n * This is used to filter out 'javascript:' and 'vbscript:' schemes.\r\n * \r\n * @private\r\n * @property {RegExp} uriSchemeRegex\r\n */\r\n uriSchemeRegex: /^[A-Za-z][-.+A-Za-z0-9]+:/,\r\n\r\n /**\r\n * Regex to determine if at least one word char exists after the protocol (i.e. after the ':')\r\n * \r\n * @private\r\n * @property {RegExp} hasWordCharAfterProtocolRegex\r\n */\r\n hasWordCharAfterProtocolRegex: /:[^\\s]*?[A-Za-z]/,\r\n\r\n\r\n /**\r\n * Determines if a given match found by {@link Autolinker#processTextNode} is valid. Will return `false` for:\r\n * \r\n * 1) URL matches which do not have at least have one period ('.') in the domain name (effectively skipping over \r\n * matches like \"abc:def\"). However, URL matches with a protocol will be allowed (ex: 'http://localhost')\r\n * 2) URL matches which do not have at least one word character in the domain name (effectively skipping over\r\n * matches like \"git:1.0\").\r\n * 3) A protocol-relative url match (a URL beginning with '//') whose previous character is a word character \r\n * (effectively skipping over strings like \"abc//google.com\")\r\n * \r\n * Otherwise, returns `true`.\r\n * \r\n * @param {String} urlMatch The matched URL, if there was one. Will be an empty string if the match is not a URL match.\r\n * @param {String} protocolUrlMatch The match URL string for a protocol match. Ex: 'http://yahoo.com'. This is used to match\r\n * something like 'http://localhost', where we won't double check that the domain name has at least one '.' in it.\r\n * @param {String} protocolRelativeMatch The protocol-relative string for a URL match (i.e. '//'), possibly with a preceding\r\n * character (ex, a space, such as: ' //', or a letter, such as: 'a//'). The match is invalid if there is a word character\r\n * preceding the '//'.\r\n * @return {Boolean} `true` if the match given is valid and should be processed, or `false` if the match is invalid and/or \r\n * should just not be processed.\r\n */\r\n isValidMatch: function (urlMatch, protocolUrlMatch, protocolRelativeMatch) {\r\n if (\r\n (protocolUrlMatch && !this.isValidUriScheme(protocolUrlMatch)) ||\r\n this.urlMatchDoesNotHaveProtocolOrDot(urlMatch, protocolUrlMatch) || // At least one period ('.') must exist in the URL match for us to consider it an actual URL, *unless* it was a full protocol match (like 'http://localhost')\r\n this.urlMatchDoesNotHaveAtLeastOneWordChar(urlMatch, protocolUrlMatch) || // At least one letter character must exist in the domain name after a protocol match. Ex: skip over something like \"git:1.0\"\r\n this.isInvalidProtocolRelativeMatch(protocolRelativeMatch) // A protocol-relative match which has a word character in front of it (so we can skip something like \"abc//google.com\")\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n\r\n\r\n /**\r\n * Determines if the URI scheme is a valid scheme to be autolinked. Returns `false` if the scheme is \r\n * 'javascript:' or 'vbscript:'\r\n * \r\n * @private\r\n * @param {String} uriSchemeMatch The match URL string for a full URI scheme match. Ex: 'http://yahoo.com' \r\n * or 'mailto:a@a.com'.\r\n * @return {Boolean} `true` if the scheme is a valid one, `false` otherwise.\r\n */\r\n isValidUriScheme: function (uriSchemeMatch) {\r\n var uriScheme = uriSchemeMatch.match(this.uriSchemeRegex)[0].toLowerCase();\r\n\r\n return (uriScheme !== 'javascript:' && uriScheme !== 'vbscript:');\r\n },\r\n\r\n\r\n /**\r\n * Determines if a URL match does not have either:\r\n * \r\n * a) a full protocol (i.e. 'http://'), or\r\n * b) at least one dot ('.') in the domain name (for a non-full-protocol match).\r\n * \r\n * Either situation is considered an invalid URL (ex: 'git:d' does not have either the '://' part, or at least one dot\r\n * in the domain name. If the match was 'git:abc.com', we would consider this valid.)\r\n * \r\n * @private\r\n * @param {String} urlMatch The matched URL, if there was one. Will be an empty string if the match is not a URL match.\r\n * @param {String} protocolUrlMatch The match URL string for a protocol match. Ex: 'http://yahoo.com'. This is used to match\r\n * something like 'http://localhost', where we won't double check that the domain name has at least one '.' in it.\r\n * @return {Boolean} `true` if the URL match does not have a full protocol, or at least one dot ('.') in a non-full-protocol\r\n * match.\r\n */\r\n urlMatchDoesNotHaveProtocolOrDot: function (urlMatch, protocolUrlMatch) {\r\n return (!!urlMatch && (!protocolUrlMatch || !this.hasFullProtocolRegex.test(protocolUrlMatch)) && urlMatch.indexOf('.') === -1);\r\n },\r\n\r\n\r\n /**\r\n * Determines if a URL match does not have at least one word character after the protocol (i.e. in the domain name).\r\n * \r\n * At least one letter character must exist in the domain name after a protocol match. Ex: skip over something \r\n * like \"git:1.0\"\r\n * \r\n * @private\r\n * @param {String} urlMatch The matched URL, if there was one. Will be an empty string if the match is not a URL match.\r\n * @param {String} protocolUrlMatch The match URL string for a protocol match. Ex: 'http://yahoo.com'. This is used to\r\n * know whether or not we have a protocol in the URL string, in order to check for a word character after the protocol\r\n * separator (':').\r\n * @return {Boolean} `true` if the URL match does not have at least one word character in it after the protocol, `false`\r\n * otherwise.\r\n */\r\n urlMatchDoesNotHaveAtLeastOneWordChar: function (urlMatch, protocolUrlMatch) {\r\n if (urlMatch && protocolUrlMatch) {\r\n return !this.hasWordCharAfterProtocolRegex.test(urlMatch);\r\n } else {\r\n return false;\r\n }\r\n },\r\n\r\n\r\n /**\r\n * Determines if a protocol-relative match is an invalid one. This method returns `true` if there is a `protocolRelativeMatch`,\r\n * and that match contains a word character before the '//' (i.e. it must contain whitespace or nothing before the '//' in\r\n * order to be considered valid).\r\n * \r\n * @private\r\n * @param {String} protocolRelativeMatch The protocol-relative string for a URL match (i.e. '//'), possibly with a preceding\r\n * character (ex, a space, such as: ' //', or a letter, such as: 'a//'). The match is invalid if there is a word character\r\n * preceding the '//'.\r\n * @return {Boolean} `true` if it is an invalid protocol-relative match, `false` otherwise.\r\n */\r\n isInvalidProtocolRelativeMatch: function (protocolRelativeMatch) {\r\n return (!!protocolRelativeMatch && this.invalidProtocolRelMatchRegex.test(protocolRelativeMatch));\r\n }\r\n\r\n });\r\n /*global Autolinker */\r\n /**\r\n * @abstract\r\n * @class Autolinker.match.Match\r\n * \r\n * Represents a match found in an input string which should be Autolinked. A Match object is what is provided in a \r\n * {@link Autolinker#replaceFn replaceFn}, and may be used to query for details about the match.\r\n * \r\n * For example:\r\n * \r\n * var input = \"...\"; // string with URLs, Email Addresses, and Twitter Handles\r\n * \r\n * var linkedText = Autolinker.link( input, {\r\n * replaceFn : function( autolinker, match ) {\r\n * console.log( \"href = \", match.getAnchorHref() );\r\n * console.log( \"text = \", match.getAnchorText() );\r\n * \r\n * switch( match.getType() ) {\r\n * case 'url' : \r\n * console.log( \"url: \", match.getUrl() );\r\n * \r\n * case 'email' :\r\n * console.log( \"email: \", match.getEmail() );\r\n * \r\n * case 'twitter' :\r\n * console.log( \"twitter: \", match.getTwitterHandle() );\r\n * }\r\n * }\r\n * } );\r\n * \r\n * See the {@link Autolinker} class for more details on using the {@link Autolinker#replaceFn replaceFn}.\r\n */\r\n Autolinker.match.Match = Autolinker.Util.extend(Object, {\r\n\r\n /**\r\n * @cfg {String} matchedText (required)\r\n * \r\n * The original text that was matched.\r\n */\r\n\r\n\r\n /**\r\n * @constructor\r\n * @param {Object} cfg The configuration properties for the Match instance, specified in an Object (map).\r\n */\r\n constructor: function (cfg) {\r\n Autolinker.Util.assign(this, cfg);\r\n },\r\n\r\n\r\n /**\r\n * Returns a string name for the type of match that this class represents.\r\n * \r\n * @abstract\r\n * @return {String}\r\n */\r\n getType: Autolinker.Util.abstractMethod,\r\n\r\n\r\n /**\r\n * Returns the original text that was matched.\r\n * \r\n * @return {String}\r\n */\r\n getMatchedText: function () {\r\n return this.matchedText;\r\n },\r\n\r\n\r\n /**\r\n * Returns the anchor href that should be generated for the match.\r\n * \r\n * @abstract\r\n * @return {String}\r\n */\r\n getAnchorHref: Autolinker.Util.abstractMethod,\r\n\r\n\r\n /**\r\n * Returns the anchor text that should be generated for the match.\r\n * \r\n * @abstract\r\n * @return {String}\r\n */\r\n getAnchorText: Autolinker.Util.abstractMethod\r\n\r\n });\r\n /*global Autolinker */\r\n /**\r\n * @class Autolinker.match.Email\r\n * @extends Autolinker.match.Match\r\n * \r\n * Represents a Email match found in an input string which should be Autolinked.\r\n * \r\n * See this class's superclass ({@link Autolinker.match.Match}) for more details.\r\n */\r\n Autolinker.match.Email = Autolinker.Util.extend(Autolinker.match.Match, {\r\n\r\n /**\r\n * @cfg {String} email (required)\r\n * \r\n * The email address that was matched.\r\n */\r\n\r\n\r\n /**\r\n * Returns a string name for the type of match that this class represents.\r\n * \r\n * @return {String}\r\n */\r\n getType: function () {\r\n return 'email';\r\n },\r\n\r\n\r\n /**\r\n * Returns the email address that was matched.\r\n * \r\n * @return {String}\r\n */\r\n getEmail: function () {\r\n return this.email;\r\n },\r\n\r\n\r\n /**\r\n * Returns the anchor href that should be generated for the match.\r\n * \r\n * @return {String}\r\n */\r\n getAnchorHref: function () {\r\n return 'mailto:' + this.email;\r\n },\r\n\r\n\r\n /**\r\n * Returns the anchor text that should be generated for the match.\r\n * \r\n * @return {String}\r\n */\r\n getAnchorText: function () {\r\n return this.email;\r\n }\r\n\r\n });\r\n /*global Autolinker */\r\n /**\r\n * @class Autolinker.match.Twitter\r\n * @extends Autolinker.match.Match\r\n * \r\n * Represents a Twitter match found in an input string which should be Autolinked.\r\n * \r\n * See this class's superclass ({@link Autolinker.match.Match}) for more details.\r\n */\r\n Autolinker.match.Twitter = Autolinker.Util.extend(Autolinker.match.Match, {\r\n\r\n /**\r\n * @cfg {String} twitterHandle (required)\r\n * \r\n * The Twitter handle that was matched.\r\n */\r\n\r\n\r\n /**\r\n * Returns the type of match that this class represents.\r\n * \r\n * @return {String}\r\n */\r\n getType: function () {\r\n return 'twitter';\r\n },\r\n\r\n\r\n /**\r\n * Returns a string name for the type of match that this class represents.\r\n * \r\n * @return {String}\r\n */\r\n getTwitterHandle: function () {\r\n return this.twitterHandle;\r\n },\r\n\r\n\r\n /**\r\n * Returns the anchor href that should be generated for the match.\r\n * \r\n * @return {String}\r\n */\r\n getAnchorHref: function () {\r\n return 'https://twitter.com/' + this.twitterHandle;\r\n },\r\n\r\n\r\n /**\r\n * Returns the anchor text that should be generated for the match.\r\n * \r\n * @return {String}\r\n */\r\n getAnchorText: function () {\r\n return '@' + this.twitterHandle;\r\n }\r\n\r\n });\r\n /*global Autolinker */\r\n /**\r\n * @class Autolinker.match.Url\r\n * @extends Autolinker.match.Match\r\n * \r\n * Represents a Url match found in an input string which should be Autolinked.\r\n * \r\n * See this class's superclass ({@link Autolinker.match.Match}) for more details.\r\n */\r\n Autolinker.match.Url = Autolinker.Util.extend(Autolinker.match.Match, {\r\n\r\n /**\r\n * @cfg {String} url (required)\r\n * \r\n * The url that was matched.\r\n */\r\n\r\n /**\r\n * @cfg {Boolean} protocolUrlMatch (required)\r\n * \r\n * `true` if the URL is a match which already has a protocol (i.e. 'http://'), `false` if the match was from a 'www' or\r\n * known TLD match.\r\n */\r\n\r\n /**\r\n * @cfg {Boolean} protocolRelativeMatch (required)\r\n * \r\n * `true` if the URL is a protocol-relative match. A protocol-relative match is a URL that starts with '//',\r\n * and will be either http:// or https:// based on the protocol that the site is loaded under.\r\n */\r\n\r\n /**\r\n * @cfg {Boolean} stripPrefix (required)\r\n * @inheritdoc Autolinker#stripPrefix\r\n */\r\n\r\n\r\n /**\r\n * @private\r\n * @property {RegExp} urlPrefixRegex\r\n * \r\n * A regular expression used to remove the 'http://' or 'https://' and/or the 'www.' from URLs.\r\n */\r\n urlPrefixRegex: /^(https?:\\/\\/)?(www\\.)?/i,\r\n\r\n /**\r\n * @private\r\n * @property {RegExp} protocolRelativeRegex\r\n * \r\n * The regular expression used to remove the protocol-relative '//' from the {@link #url} string, for purposes\r\n * of {@link #getAnchorText}. A protocol-relative URL is, for example, \"//yahoo.com\"\r\n */\r\n protocolRelativeRegex: /^\\/\\//,\r\n\r\n /**\r\n * @private\r\n * @property {Boolean} protocolPrepended\r\n * \r\n * Will be set to `true` if the 'http://' protocol has been prepended to the {@link #url} (because the\r\n * {@link #url} did not have a protocol)\r\n */\r\n protocolPrepended: false,\r\n\r\n\r\n /**\r\n * Returns a string name for the type of match that this class represents.\r\n * \r\n * @return {String}\r\n */\r\n getType: function () {\r\n return 'url';\r\n },\r\n\r\n\r\n /**\r\n * Returns the url that was matched, assuming the protocol to be 'http://' if the original\r\n * match was missing a protocol.\r\n * \r\n * @return {String}\r\n */\r\n getUrl: function () {\r\n var url = this.url;\r\n\r\n // if the url string doesn't begin with a protocol, assume 'http://'\r\n if (!this.protocolRelativeMatch && !this.protocolUrlMatch && !this.protocolPrepended) {\r\n url = this.url = 'http://' + url;\r\n\r\n this.protocolPrepended = true;\r\n }\r\n\r\n return url;\r\n },\r\n\r\n\r\n /**\r\n * Returns the anchor href that should be generated for the match.\r\n * \r\n * @return {String}\r\n */\r\n getAnchorHref: function () {\r\n var url = this.getUrl();\r\n\r\n return url.replace(/&/g, '&'); // any &'s in the URL should be converted back to '&' if they were displayed as & in the source html \r\n },\r\n\r\n\r\n /**\r\n * Returns the anchor text that should be generated for the match.\r\n * \r\n * @return {String}\r\n */\r\n getAnchorText: function () {\r\n var anchorText = this.getUrl();\r\n\r\n if (this.protocolRelativeMatch) {\r\n // Strip off any protocol-relative '//' from the anchor text\r\n anchorText = this.stripProtocolRelativePrefix(anchorText);\r\n }\r\n if (this.stripPrefix) {\r\n anchorText = this.stripUrlPrefix(anchorText);\r\n }\r\n anchorText = this.removeTrailingSlash(anchorText); // remove trailing slash, if there is one\r\n\r\n return anchorText;\r\n },\r\n\r\n\r\n // ---------------------------------------\r\n\r\n // Utility Functionality\r\n\r\n /**\r\n * Strips the URL prefix (such as \"http://\" or \"https://\") from the given text.\r\n * \r\n * @private\r\n * @param {String} text The text of the anchor that is being generated, for which to strip off the\r\n * url prefix (such as stripping off \"http://\")\r\n * @return {String} The `anchorText`, with the prefix stripped.\r\n */\r\n stripUrlPrefix: function (text) {\r\n return text.replace(this.urlPrefixRegex, '');\r\n },\r\n\r\n\r\n /**\r\n * Strips any protocol-relative '//' from the anchor text.\r\n * \r\n * @private\r\n * @param {String} text The text of the anchor that is being generated, for which to strip off the\r\n * protocol-relative prefix (such as stripping off \"//\")\r\n * @return {String} The `anchorText`, with the protocol-relative prefix stripped.\r\n */\r\n stripProtocolRelativePrefix: function (text) {\r\n return text.replace(this.protocolRelativeRegex, '');\r\n },\r\n\r\n\r\n /**\r\n * Removes any trailing slash from the given `anchorText`, in preparation for the text to be displayed.\r\n * \r\n * @private\r\n * @param {String} anchorText The text of the anchor that is being generated, for which to remove any trailing\r\n * slash ('/') that may exist.\r\n * @return {String} The `anchorText`, with the trailing slash removed.\r\n */\r\n removeTrailingSlash: function (anchorText) {\r\n if (anchorText.charAt(anchorText.length - 1) === '/') {\r\n anchorText = anchorText.slice(0, -1);\r\n }\r\n return anchorText;\r\n }\r\n\r\n });\r\n return Autolinker;\r\n\r\n }));\r\n\r\n }, {}], 9: [function (require, module, exports) {\r\n 'use strict'\r\n\r\n exports.toByteArray = toByteArray\r\n exports.fromByteArray = fromByteArray\r\n\r\n var lookup = []\r\n var revLookup = []\r\n var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\r\n\r\n function init() {\r\n var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\r\n for (var i = 0, len = code.length; i < len; ++i) {\r\n lookup[i] = code[i]\r\n revLookup[code.charCodeAt(i)] = i\r\n }\r\n\r\n revLookup['-'.charCodeAt(0)] = 62\r\n revLookup['_'.charCodeAt(0)] = 63\r\n }\r\n\r\n init()\r\n\r\n function toByteArray(b64) {\r\n var i, j, l, tmp, placeHolders, arr\r\n var len = b64.length\r\n\r\n if (len % 4 > 0) {\r\n throw new Error('Invalid string. Length must be a multiple of 4')\r\n }\r\n\r\n // the number of equal signs (place holders)\r\n // if there are two placeholders, than the two characters before it\r\n // represent one byte\r\n // if there is only one, then the three characters before it represent 2 bytes\r\n // this is just a cheap hack to not do indexOf twice\r\n placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0\r\n\r\n // base64 is 4/3 + up to two characters of the original data\r\n arr = new Arr(len * 3 / 4 - placeHolders)\r\n\r\n // if there are placeholders, only get up to the last complete 4 chars\r\n l = placeHolders > 0 ? len - 4 : len\r\n\r\n var L = 0\r\n\r\n for (i = 0, j = 0; i < l; i += 4, j += 3) {\r\n tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]\r\n arr[L++] = (tmp >> 16) & 0xFF\r\n arr[L++] = (tmp >> 8) & 0xFF\r\n arr[L++] = tmp & 0xFF\r\n }\r\n\r\n if (placeHolders === 2) {\r\n tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)\r\n arr[L++] = tmp & 0xFF\r\n } else if (placeHolders === 1) {\r\n tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)\r\n arr[L++] = (tmp >> 8) & 0xFF\r\n arr[L++] = tmp & 0xFF\r\n }\r\n\r\n return arr\r\n }\r\n\r\n function tripletToBase64(num) {\r\n return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]\r\n }\r\n\r\n function encodeChunk(uint8, start, end) {\r\n var tmp\r\n var output = []\r\n for (var i = start; i < end; i += 3) {\r\n tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])\r\n output.push(tripletToBase64(tmp))\r\n }\r\n return output.join('')\r\n }\r\n\r\n function fromByteArray(uint8) {\r\n var tmp\r\n var len = uint8.length\r\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\r\n var output = ''\r\n var parts = []\r\n var maxChunkLength = 16383 // must be multiple of 3\r\n\r\n // go through the array every three bytes, we'll deal with trailing stuff later\r\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\r\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\r\n }\r\n\r\n // pad the end with zeros, but make sure to not forget the extra bytes\r\n if (extraBytes === 1) {\r\n tmp = uint8[len - 1]\r\n output += lookup[tmp >> 2]\r\n output += lookup[(tmp << 4) & 0x3F]\r\n output += '=='\r\n } else if (extraBytes === 2) {\r\n tmp = (uint8[len - 2] << 8) + (uint8[len - 1])\r\n output += lookup[tmp >> 10]\r\n output += lookup[(tmp >> 4) & 0x3F]\r\n output += lookup[(tmp << 2) & 0x3F]\r\n output += '='\r\n }\r\n\r\n parts.push(output)\r\n\r\n return parts.join('')\r\n }\r\n\r\n }, {}], 10: [function (require, module, exports) {\r\n /*!\r\n * braces \r\n *\r\n * Copyright (c) 2014-2015, Jon Schlinkert.\r\n * Licensed under the MIT license.\r\n */\r\n\r\n 'use strict';\r\n\r\n /**\r\n * Module dependencies\r\n */\r\n\r\n var expand = require('expand-range');\r\n var repeat = require('repeat-element');\r\n var tokens = require('preserve');\r\n\r\n /**\r\n * Expose `braces`\r\n */\r\n\r\n module.exports = function (str, options) {\r\n if (typeof str !== 'string') {\r\n throw new Error('braces expects a string');\r\n }\r\n return braces(str, options);\r\n };\r\n\r\n /**\r\n * Expand `{foo,bar}` or `{1..5}` braces in the\r\n * given `string`.\r\n *\r\n * @param {String} `str`\r\n * @param {Array} `arr`\r\n * @param {Object} `options`\r\n * @return {Array}\r\n */\r\n\r\n function braces(str, arr, options) {\r\n if (str === '') {\r\n return [];\r\n }\r\n\r\n if (!Array.isArray(arr)) {\r\n options = arr;\r\n arr = [];\r\n }\r\n\r\n var opts = options || {};\r\n arr = arr || [];\r\n\r\n if (typeof opts.nodupes === 'undefined') {\r\n opts.nodupes = true;\r\n }\r\n\r\n var fn = opts.fn;\r\n var es6;\r\n\r\n if (typeof opts === 'function') {\r\n fn = opts;\r\n opts = {};\r\n }\r\n\r\n if (!(patternRe instanceof RegExp)) {\r\n patternRe = patternRegex();\r\n }\r\n\r\n var matches = str.match(patternRe) || [];\r\n var m = matches[0];\r\n\r\n switch (m) {\r\n case '\\\\,':\r\n return escapeCommas(str, arr, opts);\r\n case '\\\\.':\r\n return escapeDots(str, arr, opts);\r\n case '\\/.':\r\n return escapePaths(str, arr, opts);\r\n case ' ':\r\n return splitWhitespace(str);\r\n case '{,}':\r\n return exponential(str, opts, braces);\r\n case '{}':\r\n return emptyBraces(str, arr, opts);\r\n case '\\\\{':\r\n case '\\\\}':\r\n return escapeBraces(str, arr, opts);\r\n case '${':\r\n if (!/\\{[^{]+\\{/.test(str)) {\r\n return arr.concat(str);\r\n } else {\r\n es6 = true;\r\n str = tokens.before(str, es6Regex());\r\n }\r\n }\r\n\r\n if (!(braceRe instanceof RegExp)) {\r\n braceRe = braceRegex();\r\n }\r\n\r\n var match = braceRe.exec(str);\r\n if (match == null) {\r\n return [str];\r\n }\r\n\r\n var outter = match[1];\r\n var inner = match[2];\r\n if (inner === '') { return [str]; }\r\n\r\n var segs, segsLength;\r\n\r\n if (inner.indexOf('..') !== -1) {\r\n segs = expand(inner, opts, fn) || inner.split(',');\r\n segsLength = segs.length;\r\n\r\n } else if (inner[0] === '\"' || inner[0] === '\\'') {\r\n return arr.concat(str.split(/['\"]/).join(''));\r\n\r\n } else {\r\n segs = inner.split(',');\r\n if (opts.makeRe) {\r\n return braces(str.replace(outter, wrap(segs, '|')), opts);\r\n }\r\n\r\n segsLength = segs.length;\r\n if (segsLength === 1 && opts.bash) {\r\n segs[0] = wrap(segs[0], '\\\\');\r\n }\r\n }\r\n\r\n var len = segs.length;\r\n var i = 0, val;\r\n\r\n while (len--) {\r\n var path = segs[i++];\r\n\r\n if (/(\\.[^.\\/])/.test(path)) {\r\n if (segsLength > 1) {\r\n return segs;\r\n } else {\r\n return [str];\r\n }\r\n }\r\n\r\n val = splice(str, outter, path);\r\n\r\n if (/\\{[^{}]+?\\}/.test(val)) {\r\n arr = braces(val, arr, opts);\r\n } else if (val !== '') {\r\n if (opts.nodupes && arr.indexOf(val) !== -1) { continue; }\r\n arr.push(es6 ? tokens.after(val) : val);\r\n }\r\n }\r\n\r\n if (opts.strict) { return filter(arr, filterEmpty); }\r\n return arr;\r\n }\r\n\r\n /**\r\n * Expand exponential ranges\r\n *\r\n * `a{,}{,}` => ['a', 'a', 'a', 'a']\r\n */\r\n\r\n function exponential(str, options, fn) {\r\n if (typeof options === 'function') {\r\n fn = options;\r\n options = null;\r\n }\r\n\r\n var opts = options || {};\r\n var esc = '__ESC_EXP__';\r\n var exp = 0;\r\n var res;\r\n\r\n var parts = str.split('{,}');\r\n if (opts.nodupes) {\r\n return fn(parts.join(''), opts);\r\n }\r\n\r\n exp = parts.length - 1;\r\n res = fn(parts.join(esc), opts);\r\n var len = res.length;\r\n var arr = [];\r\n var i = 0;\r\n\r\n while (len--) {\r\n var ele = res[i++];\r\n var idx = ele.indexOf(esc);\r\n\r\n if (idx === -1) {\r\n arr.push(ele);\r\n\r\n } else {\r\n ele = ele.split('__ESC_EXP__').join('');\r\n if (!!ele && opts.nodupes !== false) {\r\n arr.push(ele);\r\n\r\n } else {\r\n var num = Math.pow(2, exp);\r\n arr.push.apply(arr, repeat(ele, num));\r\n }\r\n }\r\n }\r\n return arr;\r\n }\r\n\r\n /**\r\n * Wrap a value with parens, brackets or braces,\r\n * based on the given character/separator.\r\n *\r\n * @param {String|Array} `val`\r\n * @param {String} `ch`\r\n * @return {String}\r\n */\r\n\r\n function wrap(val, ch) {\r\n if (ch === '|') {\r\n return '(' + val.join(ch) + ')';\r\n }\r\n if (ch === ',') {\r\n return '{' + val.join(ch) + '}';\r\n }\r\n if (ch === '-') {\r\n return '[' + val.join(ch) + ']';\r\n }\r\n if (ch === '\\\\') {\r\n return '\\\\{' + val + '\\\\}';\r\n }\r\n }\r\n\r\n /**\r\n * Handle empty braces: `{}`\r\n */\r\n\r\n function emptyBraces(str, arr, opts) {\r\n return braces(str.split('{}').join('\\\\{\\\\}'), arr, opts);\r\n }\r\n\r\n /**\r\n * Filter out empty-ish values\r\n */\r\n\r\n function filterEmpty(ele) {\r\n return !!ele && ele !== '\\\\';\r\n }\r\n\r\n /**\r\n * Handle patterns with whitespace\r\n */\r\n\r\n function splitWhitespace(str) {\r\n var segs = str.split(' ');\r\n var len = segs.length;\r\n var res = [];\r\n var i = 0;\r\n\r\n while (len--) {\r\n res.push.apply(res, braces(segs[i++]));\r\n }\r\n return res;\r\n }\r\n\r\n /**\r\n * Handle escaped braces: `\\\\{foo,bar}`\r\n */\r\n\r\n function escapeBraces(str, arr, opts) {\r\n if (!/\\{[^{]+\\{/.test(str)) {\r\n return arr.concat(str.split('\\\\').join(''));\r\n } else {\r\n str = str.split('\\\\{').join('__LT_BRACE__');\r\n str = str.split('\\\\}').join('__RT_BRACE__');\r\n return map(braces(str, arr, opts), function (ele) {\r\n ele = ele.split('__LT_BRACE__').join('{');\r\n return ele.split('__RT_BRACE__').join('}');\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Handle escaped dots: `{1\\\\.2}`\r\n */\r\n\r\n function escapeDots(str, arr, opts) {\r\n if (!/[^\\\\]\\..+\\\\\\./.test(str)) {\r\n return arr.concat(str.split('\\\\').join(''));\r\n } else {\r\n str = str.split('\\\\.').join('__ESC_DOT__');\r\n return map(braces(str, arr, opts), function (ele) {\r\n return ele.split('__ESC_DOT__').join('.');\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Handle escaped dots: `{1\\\\.2}`\r\n */\r\n\r\n function escapePaths(str, arr, opts) {\r\n str = str.split('\\/.').join('__ESC_PATH__');\r\n return map(braces(str, arr, opts), function (ele) {\r\n return ele.split('__ESC_PATH__').join('\\/.');\r\n });\r\n }\r\n\r\n /**\r\n * Handle escaped commas: `{a\\\\,b}`\r\n */\r\n\r\n function escapeCommas(str, arr, opts) {\r\n if (!/\\w,/.test(str)) {\r\n return arr.concat(str.split('\\\\').join(''));\r\n } else {\r\n str = str.split('\\\\,').join('__ESC_COMMA__');\r\n return map(braces(str, arr, opts), function (ele) {\r\n return ele.split('__ESC_COMMA__').join(',');\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Regex for common patterns\r\n */\r\n\r\n function patternRegex() {\r\n return /\\$\\{|[ \\t]|{}|{,}|\\\\,(?=.*[{}])|\\/\\.(?=.*[{}])|\\\\\\.(?={)|\\\\{|\\\\}/;\r\n }\r\n\r\n /**\r\n * Braces regex.\r\n */\r\n\r\n function braceRegex() {\r\n return /.*(\\\\?\\{([^}]+)\\})/;\r\n }\r\n\r\n /**\r\n * es6 delimiter regex.\r\n */\r\n\r\n function es6Regex() {\r\n return /\\$\\{([^}]+)\\}/;\r\n }\r\n\r\n var braceRe;\r\n var patternRe;\r\n\r\n /**\r\n * Faster alternative to `String.replace()` when the\r\n * index of the token to be replaces can't be supplied\r\n */\r\n\r\n function splice(str, token, replacement) {\r\n var i = str.indexOf(token);\r\n return str.substr(0, i) + replacement\r\n + str.substr(i + token.length);\r\n }\r\n\r\n /**\r\n * Fast array map\r\n */\r\n\r\n function map(arr, fn) {\r\n if (arr == null) {\r\n return [];\r\n }\r\n\r\n var len = arr.length;\r\n var res = new Array(len);\r\n var i = -1;\r\n\r\n while (++i < len) {\r\n res[i] = fn(arr[i], i, arr);\r\n }\r\n\r\n return res;\r\n }\r\n\r\n /**\r\n * Fast array filter\r\n */\r\n\r\n function filter(arr, cb) {\r\n if (arr == null) return [];\r\n if (typeof cb !== 'function') {\r\n throw new TypeError('braces: filter expects a callback function.');\r\n }\r\n\r\n var len = arr.length;\r\n var res = arr.slice();\r\n var i = 0;\r\n\r\n while (len--) {\r\n if (!cb(arr[len], i++)) {\r\n res.splice(len, 1);\r\n }\r\n }\r\n return res;\r\n }\r\n\r\n }, { \"expand-range\": 29, \"preserve\": 117, \"repeat-element\": 187 }], 11: [function (require, module, exports) {\r\n\r\n }, {}], 12: [function (require, module, exports) {\r\n (function (global) {\r\n /*!\r\n * The buffer module from node.js, for the browser.\r\n *\r\n * @author Feross Aboukhadijeh \r\n * @license MIT\r\n */\r\n /* eslint-disable no-proto */\r\n\r\n 'use strict'\r\n\r\n var base64 = require('base64-js')\r\n var ieee754 = require('ieee754')\r\n var isArray = require('isarray')\r\n\r\n exports.Buffer = Buffer\r\n exports.SlowBuffer = SlowBuffer\r\n exports.INSPECT_MAX_BYTES = 50\r\n\r\n /**\r\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\r\n * === true Use Uint8Array implementation (fastest)\r\n * === false Use Object implementation (most compatible, even IE6)\r\n *\r\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\r\n * Opera 11.6+, iOS 4.2+.\r\n *\r\n * Due to various browser bugs, sometimes the Object implementation will be used even\r\n * when the browser supports typed arrays.\r\n *\r\n * Note:\r\n *\r\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\r\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\r\n *\r\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\r\n *\r\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\r\n * incorrect length in some situations.\r\n \r\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\r\n * get the Object implementation, which is slower but behaves correctly.\r\n */\r\n Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\r\n ? global.TYPED_ARRAY_SUPPORT\r\n : typedArraySupport()\r\n\r\n /*\r\n * Export kMaxLength after typed array support is determined.\r\n */\r\n exports.kMaxLength = kMaxLength()\r\n\r\n function typedArraySupport() {\r\n try {\r\n var arr = new Uint8Array(1)\r\n arr.foo = function () { return 42 }\r\n return arr.foo() === 42 && // typed array instances can be augmented\r\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\r\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\r\n } catch (e) {\r\n return false\r\n }\r\n }\r\n\r\n function kMaxLength() {\r\n return Buffer.TYPED_ARRAY_SUPPORT\r\n ? 0x7fffffff\r\n : 0x3fffffff\r\n }\r\n\r\n function createBuffer(that, length) {\r\n if (kMaxLength() < length) {\r\n throw new RangeError('Invalid typed array length')\r\n }\r\n if (Buffer.TYPED_ARRAY_SUPPORT) {\r\n // Return an augmented `Uint8Array` instance, for best performance\r\n that = new Uint8Array(length)\r\n that.__proto__ = Buffer.prototype\r\n } else {\r\n // Fallback: Return an object instance of the Buffer class\r\n if (that === null) {\r\n that = new Buffer(length)\r\n }\r\n that.length = length\r\n }\r\n\r\n return that\r\n }\r\n\r\n /**\r\n * The Buffer constructor returns instances of `Uint8Array` that have their\r\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\r\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\r\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\r\n * returns a single octet.\r\n *\r\n * The `Uint8Array` prototype remains unmodified.\r\n */\r\n\r\n function Buffer(arg, encodingOrOffset, length) {\r\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\r\n return new Buffer(arg, encodingOrOffset, length)\r\n }\r\n\r\n // Common case.\r\n if (typeof arg === 'number') {\r\n if (typeof encodingOrOffset === 'string') {\r\n throw new Error(\r\n 'If encoding is specified then the first argument must be a string'\r\n )\r\n }\r\n return allocUnsafe(this, arg)\r\n }\r\n return from(this, arg, encodingOrOffset, length)\r\n }\r\n\r\n Buffer.poolSize = 8192 // not used by this implementation\r\n\r\n // TODO: Legacy, not needed anymore. Remove in next major version.\r\n Buffer._augment = function (arr) {\r\n arr.__proto__ = Buffer.prototype\r\n return arr\r\n }\r\n\r\n function from(that, value, encodingOrOffset, length) {\r\n if (typeof value === 'number') {\r\n throw new TypeError('\"value\" argument must not be a number')\r\n }\r\n\r\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\r\n return fromArrayBuffer(that, value, encodingOrOffset, length)\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return fromString(that, value, encodingOrOffset)\r\n }\r\n\r\n return fromObject(that, value)\r\n }\r\n\r\n /**\r\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\r\n * if value is a number.\r\n * Buffer.from(str[, encoding])\r\n * Buffer.from(array)\r\n * Buffer.from(buffer)\r\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\r\n **/\r\n Buffer.from = function (value, encodingOrOffset, length) {\r\n return from(null, value, encodingOrOffset, length)\r\n }\r\n\r\n if (Buffer.TYPED_ARRAY_SUPPORT) {\r\n Buffer.prototype.__proto__ = Uint8Array.prototype\r\n Buffer.__proto__ = Uint8Array\r\n if (typeof Symbol !== 'undefined' && Symbol.species &&\r\n Buffer[Symbol.species] === Buffer) {\r\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\r\n Object.defineProperty(Buffer, Symbol.species, {\r\n value: null,\r\n configurable: true\r\n })\r\n }\r\n }\r\n\r\n function assertSize(size) {\r\n if (typeof size !== 'number') {\r\n throw new TypeError('\"size\" argument must be a number')\r\n }\r\n }\r\n\r\n function alloc(that, size, fill, encoding) {\r\n assertSize(size)\r\n if (size <= 0) {\r\n return createBuffer(that, size)\r\n }\r\n if (fill !== undefined) {\r\n // Only pay attention to encoding if it's a string. This\r\n // prevents accidentally sending in a number that would\r\n // be interpretted as a start offset.\r\n return typeof encoding === 'string'\r\n ? createBuffer(that, size).fill(fill, encoding)\r\n : createBuffer(that, size).fill(fill)\r\n }\r\n return createBuffer(that, size)\r\n }\r\n\r\n /**\r\n * Creates a new filled Buffer instance.\r\n * alloc(size[, fill[, encoding]])\r\n **/\r\n Buffer.alloc = function (size, fill, encoding) {\r\n return alloc(null, size, fill, encoding)\r\n }\r\n\r\n function allocUnsafe(that, size) {\r\n assertSize(size)\r\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\r\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\r\n for (var i = 0; i < size; i++) {\r\n that[i] = 0\r\n }\r\n }\r\n return that\r\n }\r\n\r\n /**\r\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\r\n * */\r\n Buffer.allocUnsafe = function (size) {\r\n return allocUnsafe(null, size)\r\n }\r\n /**\r\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\r\n */\r\n Buffer.allocUnsafeSlow = function (size) {\r\n return allocUnsafe(null, size)\r\n }\r\n\r\n function fromString(that, string, encoding) {\r\n if (typeof encoding !== 'string' || encoding === '') {\r\n encoding = 'utf8'\r\n }\r\n\r\n if (!Buffer.isEncoding(encoding)) {\r\n throw new TypeError('\"encoding\" must be a valid string encoding')\r\n }\r\n\r\n var length = byteLength(string, encoding) | 0\r\n that = createBuffer(that, length)\r\n\r\n that.write(string, encoding)\r\n return that\r\n }\r\n\r\n function fromArrayLike(that, array) {\r\n var length = checked(array.length) | 0\r\n that = createBuffer(that, length)\r\n for (var i = 0; i < length; i += 1) {\r\n that[i] = array[i] & 255\r\n }\r\n return that\r\n }\r\n\r\n function fromArrayBuffer(that, array, byteOffset, length) {\r\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\r\n\r\n if (byteOffset < 0 || array.byteLength < byteOffset) {\r\n throw new RangeError('\\'offset\\' is out of bounds')\r\n }\r\n\r\n if (array.byteLength < byteOffset + (length || 0)) {\r\n throw new RangeError('\\'length\\' is out of bounds')\r\n }\r\n\r\n if (length === undefined) {\r\n array = new Uint8Array(array, byteOffset)\r\n } else {\r\n array = new Uint8Array(array, byteOffset, length)\r\n }\r\n\r\n if (Buffer.TYPED_ARRAY_SUPPORT) {\r\n // Return an augmented `Uint8Array` instance, for best performance\r\n that = array\r\n that.__proto__ = Buffer.prototype\r\n } else {\r\n // Fallback: Return an object instance of the Buffer class\r\n that = fromArrayLike(that, array)\r\n }\r\n return that\r\n }\r\n\r\n function fromObject(that, obj) {\r\n if (Buffer.isBuffer(obj)) {\r\n var len = checked(obj.length) | 0\r\n that = createBuffer(that, len)\r\n\r\n if (that.length === 0) {\r\n return that\r\n }\r\n\r\n obj.copy(that, 0, 0, len)\r\n return that\r\n }\r\n\r\n if (obj) {\r\n if ((typeof ArrayBuffer !== 'undefined' &&\r\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\r\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\r\n return createBuffer(that, 0)\r\n }\r\n return fromArrayLike(that, obj)\r\n }\r\n\r\n if (obj.type === 'Buffer' && isArray(obj.data)) {\r\n return fromArrayLike(that, obj.data)\r\n }\r\n }\r\n\r\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\r\n }\r\n\r\n function checked(length) {\r\n // Note: cannot use `length < kMaxLength` here because that fails when\r\n // length is NaN (which is otherwise coerced to zero.)\r\n if (length >= kMaxLength()) {\r\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\r\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\r\n }\r\n return length | 0\r\n }\r\n\r\n function SlowBuffer(length) {\r\n if (+length != length) { // eslint-disable-line eqeqeq\r\n length = 0\r\n }\r\n return Buffer.alloc(+length)\r\n }\r\n\r\n Buffer.isBuffer = function isBuffer(b) {\r\n return !!(b != null && b._isBuffer)\r\n }\r\n\r\n Buffer.compare = function compare(a, b) {\r\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\r\n throw new TypeError('Arguments must be Buffers')\r\n }\r\n\r\n if (a === b) return 0\r\n\r\n var x = a.length\r\n var y = b.length\r\n\r\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\r\n if (a[i] !== b[i]) {\r\n x = a[i]\r\n y = b[i]\r\n break\r\n }\r\n }\r\n\r\n if (x < y) return -1\r\n if (y < x) return 1\r\n return 0\r\n }\r\n\r\n Buffer.isEncoding = function isEncoding(encoding) {\r\n switch (String(encoding).toLowerCase()) {\r\n case 'hex':\r\n case 'utf8':\r\n case 'utf-8':\r\n case 'ascii':\r\n case 'binary':\r\n case 'base64':\r\n case 'raw':\r\n case 'ucs2':\r\n case 'ucs-2':\r\n case 'utf16le':\r\n case 'utf-16le':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n Buffer.concat = function concat(list, length) {\r\n if (!isArray(list)) {\r\n throw new TypeError('\"list\" argument must be an Array of Buffers')\r\n }\r\n\r\n if (list.length === 0) {\r\n return Buffer.alloc(0)\r\n }\r\n\r\n var i\r\n if (length === undefined) {\r\n length = 0\r\n for (i = 0; i < list.length; i++) {\r\n length += list[i].length\r\n }\r\n }\r\n\r\n var buffer = Buffer.allocUnsafe(length)\r\n var pos = 0\r\n for (i = 0; i < list.length; i++) {\r\n var buf = list[i]\r\n if (!Buffer.isBuffer(buf)) {\r\n throw new TypeError('\"list\" argument must be an Array of Buffers')\r\n }\r\n buf.copy(buffer, pos)\r\n pos += buf.length\r\n }\r\n return buffer\r\n }\r\n\r\n function byteLength(string, encoding) {\r\n if (Buffer.isBuffer(string)) {\r\n return string.length\r\n }\r\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\r\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\r\n return string.byteLength\r\n }\r\n if (typeof string !== 'string') {\r\n string = '' + string\r\n }\r\n\r\n var len = string.length\r\n if (len === 0) return 0\r\n\r\n // Use a for loop to avoid recursion\r\n var loweredCase = false\r\n for (; ;) {\r\n switch (encoding) {\r\n case 'ascii':\r\n case 'binary':\r\n // Deprecated\r\n case 'raw':\r\n case 'raws':\r\n return len\r\n case 'utf8':\r\n case 'utf-8':\r\n case undefined:\r\n return utf8ToBytes(string).length\r\n case 'ucs2':\r\n case 'ucs-2':\r\n case 'utf16le':\r\n case 'utf-16le':\r\n return len * 2\r\n case 'hex':\r\n return len >>> 1\r\n case 'base64':\r\n return base64ToBytes(string).length\r\n default:\r\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\r\n encoding = ('' + encoding).toLowerCase()\r\n loweredCase = true\r\n }\r\n }\r\n }\r\n Buffer.byteLength = byteLength\r\n\r\n function slowToString(encoding, start, end) {\r\n var loweredCase = false\r\n\r\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\r\n // property of a typed array.\r\n\r\n // This behaves neither like String nor Uint8Array in that we set start/end\r\n // to their upper/lower bounds if the value passed is out of range.\r\n // undefined is handled specially as per ECMA-262 6th Edition,\r\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\r\n if (start === undefined || start < 0) {\r\n start = 0\r\n }\r\n // Return early if start > this.length. Done here to prevent potential uint32\r\n // coercion fail below.\r\n if (start > this.length) {\r\n return ''\r\n }\r\n\r\n if (end === undefined || end > this.length) {\r\n end = this.length\r\n }\r\n\r\n if (end <= 0) {\r\n return ''\r\n }\r\n\r\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\r\n end >>>= 0\r\n start >>>= 0\r\n\r\n if (end <= start) {\r\n return ''\r\n }\r\n\r\n if (!encoding) encoding = 'utf8'\r\n\r\n while (true) {\r\n switch (encoding) {\r\n case 'hex':\r\n return hexSlice(this, start, end)\r\n\r\n case 'utf8':\r\n case 'utf-8':\r\n return utf8Slice(this, start, end)\r\n\r\n case 'ascii':\r\n return asciiSlice(this, start, end)\r\n\r\n case 'binary':\r\n return binarySlice(this, start, end)\r\n\r\n case 'base64':\r\n return base64Slice(this, start, end)\r\n\r\n case 'ucs2':\r\n case 'ucs-2':\r\n case 'utf16le':\r\n case 'utf-16le':\r\n return utf16leSlice(this, start, end)\r\n\r\n default:\r\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\r\n encoding = (encoding + '').toLowerCase()\r\n loweredCase = true\r\n }\r\n }\r\n }\r\n\r\n // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\r\n // Buffer instances.\r\n Buffer.prototype._isBuffer = true\r\n\r\n function swap(b, n, m) {\r\n var i = b[n]\r\n b[n] = b[m]\r\n b[m] = i\r\n }\r\n\r\n Buffer.prototype.swap16 = function swap16() {\r\n var len = this.length\r\n if (len % 2 !== 0) {\r\n throw new RangeError('Buffer size must be a multiple of 16-bits')\r\n }\r\n for (var i = 0; i < len; i += 2) {\r\n swap(this, i, i + 1)\r\n }\r\n return this\r\n }\r\n\r\n Buffer.prototype.swap32 = function swap32() {\r\n var len = this.length\r\n if (len % 4 !== 0) {\r\n throw new RangeError('Buffer size must be a multiple of 32-bits')\r\n }\r\n for (var i = 0; i < len; i += 4) {\r\n swap(this, i, i + 3)\r\n swap(this, i + 1, i + 2)\r\n }\r\n return this\r\n }\r\n\r\n Buffer.prototype.toString = function toString() {\r\n var length = this.length | 0\r\n if (length === 0) return ''\r\n if (arguments.length === 0) return utf8Slice(this, 0, length)\r\n return slowToString.apply(this, arguments)\r\n }\r\n\r\n Buffer.prototype.equals = function equals(b) {\r\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\r\n if (this === b) return true\r\n return Buffer.compare(this, b) === 0\r\n }\r\n\r\n Buffer.prototype.inspect = function inspect() {\r\n var str = ''\r\n var max = exports.INSPECT_MAX_BYTES\r\n if (this.length > 0) {\r\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\r\n if (this.length > max) str += ' ... '\r\n }\r\n return ''\r\n }\r\n\r\n Buffer.prototype.compare = function compare(target, start, end, thisStart, thisEnd) {\r\n if (!Buffer.isBuffer(target)) {\r\n throw new TypeError('Argument must be a Buffer')\r\n }\r\n\r\n if (start === undefined) {\r\n start = 0\r\n }\r\n if (end === undefined) {\r\n end = target ? target.length : 0\r\n }\r\n if (thisStart === undefined) {\r\n thisStart = 0\r\n }\r\n if (thisEnd === undefined) {\r\n thisEnd = this.length\r\n }\r\n\r\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\r\n throw new RangeError('out of range index')\r\n }\r\n\r\n if (thisStart >= thisEnd && start >= end) {\r\n return 0\r\n }\r\n if (thisStart >= thisEnd) {\r\n return -1\r\n }\r\n if (start >= end) {\r\n return 1\r\n }\r\n\r\n start >>>= 0\r\n end >>>= 0\r\n thisStart >>>= 0\r\n thisEnd >>>= 0\r\n\r\n if (this === target) return 0\r\n\r\n var x = thisEnd - thisStart\r\n var y = end - start\r\n var len = Math.min(x, y)\r\n\r\n var thisCopy = this.slice(thisStart, thisEnd)\r\n var targetCopy = target.slice(start, end)\r\n\r\n for (var i = 0; i < len; ++i) {\r\n if (thisCopy[i] !== targetCopy[i]) {\r\n x = thisCopy[i]\r\n y = targetCopy[i]\r\n break\r\n }\r\n }\r\n\r\n if (x < y) return -1\r\n if (y < x) return 1\r\n return 0\r\n }\r\n\r\n function arrayIndexOf(arr, val, byteOffset, encoding) {\r\n var indexSize = 1\r\n var arrLength = arr.length\r\n var valLength = val.length\r\n\r\n if (encoding !== undefined) {\r\n encoding = String(encoding).toLowerCase()\r\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\r\n encoding === 'utf16le' || encoding === 'utf-16le') {\r\n if (arr.length < 2 || val.length < 2) {\r\n return -1\r\n }\r\n indexSize = 2\r\n arrLength /= 2\r\n valLength /= 2\r\n byteOffset /= 2\r\n }\r\n }\r\n\r\n function read(buf, i) {\r\n if (indexSize === 1) {\r\n return buf[i]\r\n } else {\r\n return buf.readUInt16BE(i * indexSize)\r\n }\r\n }\r\n\r\n var foundIndex = -1\r\n for (var i = 0; byteOffset + i < arrLength; i++) {\r\n if (read(arr, byteOffset + i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\r\n if (foundIndex === -1) foundIndex = i\r\n if (i - foundIndex + 1 === valLength) return (byteOffset + foundIndex) * indexSize\r\n } else {\r\n if (foundIndex !== -1) i -= i - foundIndex\r\n foundIndex = -1\r\n }\r\n }\r\n return -1\r\n }\r\n\r\n Buffer.prototype.indexOf = function indexOf(val, byteOffset, encoding) {\r\n if (typeof byteOffset === 'string') {\r\n encoding = byteOffset\r\n byteOffset = 0\r\n } else if (byteOffset > 0x7fffffff) {\r\n byteOffset = 0x7fffffff\r\n } else if (byteOffset < -0x80000000) {\r\n byteOffset = -0x80000000\r\n }\r\n byteOffset >>= 0\r\n\r\n if (this.length === 0) return -1\r\n if (byteOffset >= this.length) return -1\r\n\r\n // Negative offsets start from the end of the buffer\r\n if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)\r\n\r\n if (typeof val === 'string') {\r\n val = Buffer.from(val, encoding)\r\n }\r\n\r\n if (Buffer.isBuffer(val)) {\r\n // special case: looking for empty string/buffer always fails\r\n if (val.length === 0) {\r\n return -1\r\n }\r\n return arrayIndexOf(this, val, byteOffset, encoding)\r\n }\r\n if (typeof val === 'number') {\r\n if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {\r\n return Uint8Array.prototype.indexOf.call(this, val, byteOffset)\r\n }\r\n return arrayIndexOf(this, [val], byteOffset, encoding)\r\n }\r\n\r\n throw new TypeError('val must be string, number or Buffer')\r\n }\r\n\r\n Buffer.prototype.includes = function includes(val, byteOffset, encoding) {\r\n return this.indexOf(val, byteOffset, encoding) !== -1\r\n }\r\n\r\n function hexWrite(buf, string, offset, length) {\r\n offset = Number(offset) || 0\r\n var remaining = buf.length - offset\r\n if (!length) {\r\n length = remaining\r\n } else {\r\n length = Number(length)\r\n if (length > remaining) {\r\n length = remaining\r\n }\r\n }\r\n\r\n // must be an even number of digits\r\n var strLen = string.length\r\n if (strLen % 2 !== 0) throw new Error('Invalid hex string')\r\n\r\n if (length > strLen / 2) {\r\n length = strLen / 2\r\n }\r\n for (var i = 0; i < length; i++) {\r\n var parsed = parseInt(string.substr(i * 2, 2), 16)\r\n if (isNaN(parsed)) return i\r\n buf[offset + i] = parsed\r\n }\r\n return i\r\n }\r\n\r\n function utf8Write(buf, string, offset, length) {\r\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\r\n }\r\n\r\n function asciiWrite(buf, string, offset, length) {\r\n return blitBuffer(asciiToBytes(string), buf, offset, length)\r\n }\r\n\r\n function binaryWrite(buf, string, offset, length) {\r\n return asciiWrite(buf, string, offset, length)\r\n }\r\n\r\n function base64Write(buf, string, offset, length) {\r\n return blitBuffer(base64ToBytes(string), buf, offset, length)\r\n }\r\n\r\n function ucs2Write(buf, string, offset, length) {\r\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\r\n }\r\n\r\n Buffer.prototype.write = function write(string, offset, length, encoding) {\r\n // Buffer#write(string)\r\n if (offset === undefined) {\r\n encoding = 'utf8'\r\n length = this.length\r\n offset = 0\r\n // Buffer#write(string, encoding)\r\n } else if (length === undefined && typeof offset === 'string') {\r\n encoding = offset\r\n length = this.length\r\n offset = 0\r\n // Buffer#write(string, offset[, length][, encoding])\r\n } else if (isFinite(offset)) {\r\n offset = offset | 0\r\n if (isFinite(length)) {\r\n length = length | 0\r\n if (encoding === undefined) encoding = 'utf8'\r\n } else {\r\n encoding = length\r\n length = undefined\r\n }\r\n // legacy write(string, encoding, offset, length) - remove in v0.13\r\n } else {\r\n throw new Error(\r\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\r\n )\r\n }\r\n\r\n var remaining = this.length - offset\r\n if (length === undefined || length > remaining) length = remaining\r\n\r\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\r\n throw new RangeError('Attempt to write outside buffer bounds')\r\n }\r\n\r\n if (!encoding) encoding = 'utf8'\r\n\r\n var loweredCase = false\r\n for (; ;) {\r\n switch (encoding) {\r\n case 'hex':\r\n return hexWrite(this, string, offset, length)\r\n\r\n case 'utf8':\r\n case 'utf-8':\r\n return utf8Write(this, string, offset, length)\r\n\r\n case 'ascii':\r\n return asciiWrite(this, string, offset, length)\r\n\r\n case 'binary':\r\n return binaryWrite(this, string, offset, length)\r\n\r\n case 'base64':\r\n // Warning: maxLength not taken into account in base64Write\r\n return base64Write(this, string, offset, length)\r\n\r\n case 'ucs2':\r\n case 'ucs-2':\r\n case 'utf16le':\r\n case 'utf-16le':\r\n return ucs2Write(this, string, offset, length)\r\n\r\n default:\r\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\r\n encoding = ('' + encoding).toLowerCase()\r\n loweredCase = true\r\n }\r\n }\r\n }\r\n\r\n Buffer.prototype.toJSON = function toJSON() {\r\n return {\r\n type: 'Buffer',\r\n data: Array.prototype.slice.call(this._arr || this, 0)\r\n }\r\n }\r\n\r\n function base64Slice(buf, start, end) {\r\n if (start === 0 && end === buf.length) {\r\n return base64.fromByteArray(buf)\r\n } else {\r\n return base64.fromByteArray(buf.slice(start, end))\r\n }\r\n }\r\n\r\n function utf8Slice(buf, start, end) {\r\n end = Math.min(buf.length, end)\r\n var res = []\r\n\r\n var i = start\r\n while (i < end) {\r\n var firstByte = buf[i]\r\n var codePoint = null\r\n var bytesPerSequence = (firstByte > 0xEF) ? 4\r\n : (firstByte > 0xDF) ? 3\r\n : (firstByte > 0xBF) ? 2\r\n : 1\r\n\r\n if (i + bytesPerSequence <= end) {\r\n var secondByte, thirdByte, fourthByte, tempCodePoint\r\n\r\n switch (bytesPerSequence) {\r\n case 1:\r\n if (firstByte < 0x80) {\r\n codePoint = firstByte\r\n }\r\n break\r\n case 2:\r\n secondByte = buf[i + 1]\r\n if ((secondByte & 0xC0) === 0x80) {\r\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\r\n if (tempCodePoint > 0x7F) {\r\n codePoint = tempCodePoint\r\n }\r\n }\r\n break\r\n case 3:\r\n secondByte = buf[i + 1]\r\n thirdByte = buf[i + 2]\r\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\r\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\r\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\r\n codePoint = tempCodePoint\r\n }\r\n }\r\n break\r\n case 4:\r\n secondByte = buf[i + 1]\r\n thirdByte = buf[i + 2]\r\n fourthByte = buf[i + 3]\r\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\r\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\r\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\r\n codePoint = tempCodePoint\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (codePoint === null) {\r\n // we did not generate a valid codePoint so insert a\r\n // replacement char (U+FFFD) and advance only 1 byte\r\n codePoint = 0xFFFD\r\n bytesPerSequence = 1\r\n } else if (codePoint > 0xFFFF) {\r\n // encode to utf16 (surrogate pair dance)\r\n codePoint -= 0x10000\r\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\r\n codePoint = 0xDC00 | codePoint & 0x3FF\r\n }\r\n\r\n res.push(codePoint)\r\n i += bytesPerSequence\r\n }\r\n\r\n return decodeCodePointsArray(res)\r\n }\r\n\r\n // Based on http://stackoverflow.com/a/22747272/680742, the browser with\r\n // the lowest limit is Chrome, with 0x10000 args.\r\n // We go 1 magnitude less, for safety\r\n var MAX_ARGUMENTS_LENGTH = 0x1000\r\n\r\n function decodeCodePointsArray(codePoints) {\r\n var len = codePoints.length\r\n if (len <= MAX_ARGUMENTS_LENGTH) {\r\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\r\n }\r\n\r\n // Decode in chunks to avoid \"call stack size exceeded\".\r\n var res = ''\r\n var i = 0\r\n while (i < len) {\r\n res += String.fromCharCode.apply(\r\n String,\r\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\r\n )\r\n }\r\n return res\r\n }\r\n\r\n function asciiSlice(buf, start, end) {\r\n var ret = ''\r\n end = Math.min(buf.length, end)\r\n\r\n for (var i = start; i < end; i++) {\r\n ret += String.fromCharCode(buf[i] & 0x7F)\r\n }\r\n return ret\r\n }\r\n\r\n function binarySlice(buf, start, end) {\r\n var ret = ''\r\n end = Math.min(buf.length, end)\r\n\r\n for (var i = start; i < end; i++) {\r\n ret += String.fromCharCode(buf[i])\r\n }\r\n return ret\r\n }\r\n\r\n function hexSlice(buf, start, end) {\r\n var len = buf.length\r\n\r\n if (!start || start < 0) start = 0\r\n if (!end || end < 0 || end > len) end = len\r\n\r\n var out = ''\r\n for (var i = start; i < end; i++) {\r\n out += toHex(buf[i])\r\n }\r\n return out\r\n }\r\n\r\n function utf16leSlice(buf, start, end) {\r\n var bytes = buf.slice(start, end)\r\n var res = ''\r\n for (var i = 0; i < bytes.length; i += 2) {\r\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\r\n }\r\n return res\r\n }\r\n\r\n Buffer.prototype.slice = function slice(start, end) {\r\n var len = this.length\r\n start = ~~start\r\n end = end === undefined ? len : ~~end\r\n\r\n if (start < 0) {\r\n start += len\r\n if (start < 0) start = 0\r\n } else if (start > len) {\r\n start = len\r\n }\r\n\r\n if (end < 0) {\r\n end += len\r\n if (end < 0) end = 0\r\n } else if (end > len) {\r\n end = len\r\n }\r\n\r\n if (end < start) end = start\r\n\r\n var newBuf\r\n if (Buffer.TYPED_ARRAY_SUPPORT) {\r\n newBuf = this.subarray(start, end)\r\n newBuf.__proto__ = Buffer.prototype\r\n } else {\r\n var sliceLen = end - start\r\n newBuf = new Buffer(sliceLen, undefined)\r\n for (var i = 0; i < sliceLen; i++) {\r\n newBuf[i] = this[i + start]\r\n }\r\n }\r\n\r\n return newBuf\r\n }\r\n\r\n /*\r\n * Need to make sure that buffer isn't trying to write out of bounds.\r\n */\r\n function checkOffset(offset, ext, length) {\r\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\r\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\r\n }\r\n\r\n Buffer.prototype.readUIntLE = function readUIntLE(offset, byteLength, noAssert) {\r\n offset = offset | 0\r\n byteLength = byteLength | 0\r\n if (!noAssert) checkOffset(offset, byteLength, this.length)\r\n\r\n var val = this[offset]\r\n var mul = 1\r\n var i = 0\r\n while (++i < byteLength && (mul *= 0x100)) {\r\n val += this[offset + i] * mul\r\n }\r\n\r\n return val\r\n }\r\n\r\n Buffer.prototype.readUIntBE = function readUIntBE(offset, byteLength, noAssert) {\r\n offset = offset | 0\r\n byteLength = byteLength | 0\r\n if (!noAssert) {\r\n checkOffset(offset, byteLength, this.length)\r\n }\r\n\r\n var val = this[offset + --byteLength]\r\n var mul = 1\r\n while (byteLength > 0 && (mul *= 0x100)) {\r\n val += this[offset + --byteLength] * mul\r\n }\r\n\r\n return val\r\n }\r\n\r\n Buffer.prototype.readUInt8 = function readUInt8(offset, noAssert) {\r\n if (!noAssert) checkOffset(offset, 1, this.length)\r\n return this[offset]\r\n }\r\n\r\n Buffer.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) {\r\n if (!noAssert) checkOffset(offset, 2, this.length)\r\n return this[offset] | (this[offset + 1] << 8)\r\n }\r\n\r\n Buffer.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) {\r\n if (!noAssert) checkOffset(offset, 2, this.length)\r\n return (this[offset] << 8) | this[offset + 1]\r\n }\r\n\r\n Buffer.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) {\r\n if (!noAssert) checkOffset(offset, 4, this.length)\r\n\r\n return ((this[offset]) |\r\n (this[offset + 1] << 8) |\r\n (this[offset + 2] << 16)) +\r\n (this[offset + 3] * 0x1000000)\r\n }\r\n\r\n Buffer.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) {\r\n if (!noAssert) checkOffset(offset, 4, this.length)\r\n\r\n return (this[offset] * 0x1000000) +\r\n ((this[offset + 1] << 16) |\r\n (this[offset + 2] << 8) |\r\n this[offset + 3])\r\n }\r\n\r\n Buffer.prototype.readIntLE = function readIntLE(offset, byteLength, noAssert) {\r\n offset = offset | 0\r\n byteLength = byteLength | 0\r\n if (!noAssert) checkOffset(offset, byteLength, this.length)\r\n\r\n var val = this[offset]\r\n var mul = 1\r\n var i = 0\r\n while (++i < byteLength && (mul *= 0x100)) {\r\n val += this[offset + i] * mul\r\n }\r\n mul *= 0x80\r\n\r\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\r\n\r\n return val\r\n }\r\n\r\n Buffer.prototype.readIntBE = function readIntBE(offset, byteLength, noAssert) {\r\n offset = offset | 0\r\n byteLength = byteLength | 0\r\n if (!noAssert) checkOffset(offset, byteLength, this.length)\r\n\r\n var i = byteLength\r\n var mul = 1\r\n var val = this[offset + --i]\r\n while (i > 0 && (mul *= 0x100)) {\r\n val += this[offset + --i] * mul\r\n }\r\n mul *= 0x80\r\n\r\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\r\n\r\n return val\r\n }\r\n\r\n Buffer.prototype.readInt8 = function readInt8(offset, noAssert) {\r\n if (!noAssert) checkOffset(offset, 1, this.length)\r\n if (!(this[offset] & 0x80)) return (this[offset])\r\n return ((0xff - this[offset] + 1) * -1)\r\n }\r\n\r\n Buffer.prototype.readInt16LE = function readInt16LE(offset, noAssert) {\r\n if (!noAssert) checkOffset(offset, 2, this.length)\r\n var val = this[offset] | (this[offset + 1] << 8)\r\n return (val & 0x8000) ? val | 0xFFFF0000 : val\r\n }\r\n\r\n Buffer.prototype.readInt16BE = function readInt16BE(offset, noAssert) {\r\n if (!noAssert) checkOffset(offset, 2, this.length)\r\n var val = this[offset + 1] | (this[offset] << 8)\r\n return (val & 0x8000) ? val | 0xFFFF0000 : val\r\n }\r\n\r\n Buffer.prototype.readInt32LE = function readInt32LE(offset, noAssert) {\r\n if (!noAssert) checkOffset(offset, 4, this.length)\r\n\r\n return (this[offset]) |\r\n (this[offset + 1] << 8) |\r\n (this[offset + 2] << 16) |\r\n (this[offset + 3] << 24)\r\n }\r\n\r\n Buffer.prototype.readInt32BE = function readInt32BE(offset, noAssert) {\r\n if (!noAssert) checkOffset(offset, 4, this.length)\r\n\r\n return (this[offset] << 24) |\r\n (this[offset + 1] << 16) |\r\n (this[offset + 2] << 8) |\r\n (this[offset + 3])\r\n }\r\n\r\n Buffer.prototype.readFloatLE = function readFloatLE(offset, noAssert) {\r\n if (!noAssert) checkOffset(offset, 4, this.length)\r\n return ieee754.read(this, offset, true, 23, 4)\r\n }\r\n\r\n Buffer.prototype.readFloatBE = function readFloatBE(offset, noAssert) {\r\n if (!noAssert) checkOffset(offset, 4, this.length)\r\n return ieee754.read(this, offset, false, 23, 4)\r\n }\r\n\r\n Buffer.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) {\r\n if (!noAssert) checkOffset(offset, 8, this.length)\r\n return ieee754.read(this, offset, true, 52, 8)\r\n }\r\n\r\n Buffer.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) {\r\n if (!noAssert) checkOffset(offset, 8, this.length)\r\n return ieee754.read(this, offset, false, 52, 8)\r\n }\r\n\r\n function checkInt(buf, value, offset, ext, max, min) {\r\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\r\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\r\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\r\n }\r\n\r\n Buffer.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength, noAssert) {\r\n value = +value\r\n offset = offset | 0\r\n byteLength = byteLength | 0\r\n if (!noAssert) {\r\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\r\n checkInt(this, value, offset, byteLength, maxBytes, 0)\r\n }\r\n\r\n var mul = 1\r\n var i = 0\r\n this[offset] = value & 0xFF\r\n while (++i < byteLength && (mul *= 0x100)) {\r\n this[offset + i] = (value / mul) & 0xFF\r\n }\r\n\r\n return offset + byteLength\r\n }\r\n\r\n Buffer.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength, noAssert) {\r\n value = +value\r\n offset = offset | 0\r\n byteLength = byteLength | 0\r\n if (!noAssert) {\r\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\r\n checkInt(this, value, offset, byteLength, maxBytes, 0)\r\n }\r\n\r\n var i = byteLength - 1\r\n var mul = 1\r\n this[offset + i] = value & 0xFF\r\n while (--i >= 0 && (mul *= 0x100)) {\r\n this[offset + i] = (value / mul) & 0xFF\r\n }\r\n\r\n return offset + byteLength\r\n }\r\n\r\n Buffer.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) {\r\n value = +value\r\n offset = offset | 0\r\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\r\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\r\n this[offset] = (value & 0xff)\r\n return offset + 1\r\n }\r\n\r\n function objectWriteUInt16(buf, value, offset, littleEndian) {\r\n if (value < 0) value = 0xffff + value + 1\r\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {\r\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\r\n (littleEndian ? i : 1 - i) * 8\r\n }\r\n }\r\n\r\n Buffer.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) {\r\n value = +value\r\n offset = offset | 0\r\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\r\n if (Buffer.TYPED_ARRAY_SUPPORT) {\r\n this[offset] = (value & 0xff)\r\n this[offset + 1] = (value >>> 8)\r\n } else {\r\n objectWriteUInt16(this, value, offset, true)\r\n }\r\n return offset + 2\r\n }\r\n\r\n Buffer.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) {\r\n value = +value\r\n offset = offset | 0\r\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\r\n if (Buffer.TYPED_ARRAY_SUPPORT) {\r\n this[offset] = (value >>> 8)\r\n this[offset + 1] = (value & 0xff)\r\n } else {\r\n objectWriteUInt16(this, value, offset, false)\r\n }\r\n return offset + 2\r\n }\r\n\r\n function objectWriteUInt32(buf, value, offset, littleEndian) {\r\n if (value < 0) value = 0xffffffff + value + 1\r\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {\r\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\r\n }\r\n }\r\n\r\n Buffer.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) {\r\n value = +value\r\n offset = offset | 0\r\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\r\n if (Buffer.TYPED_ARRAY_SUPPORT) {\r\n this[offset + 3] = (value >>> 24)\r\n this[offset + 2] = (value >>> 16)\r\n this[offset + 1] = (value >>> 8)\r\n this[offset] = (value & 0xff)\r\n } else {\r\n objectWriteUInt32(this, value, offset, true)\r\n }\r\n return offset + 4\r\n }\r\n\r\n Buffer.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) {\r\n value = +value\r\n offset = offset | 0\r\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\r\n if (Buffer.TYPED_ARRAY_SUPPORT) {\r\n this[offset] = (value >>> 24)\r\n this[offset + 1] = (value >>> 16)\r\n this[offset + 2] = (value >>> 8)\r\n this[offset + 3] = (value & 0xff)\r\n } else {\r\n objectWriteUInt32(this, value, offset, false)\r\n }\r\n return offset + 4\r\n }\r\n\r\n Buffer.prototype.writeIntLE = function writeIntLE(value, offset, byteLength, noAssert) {\r\n value = +value\r\n offset = offset | 0\r\n if (!noAssert) {\r\n var limit = Math.pow(2, 8 * byteLength - 1)\r\n\r\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\r\n }\r\n\r\n var i = 0\r\n var mul = 1\r\n var sub = 0\r\n this[offset] = value & 0xFF\r\n while (++i < byteLength && (mul *= 0x100)) {\r\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\r\n sub = 1\r\n }\r\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\r\n }\r\n\r\n return offset + byteLength\r\n }\r\n\r\n Buffer.prototype.writeIntBE = function writeIntBE(value, offset, byteLength, noAssert) {\r\n value = +value\r\n offset = offset | 0\r\n if (!noAssert) {\r\n var limit = Math.pow(2, 8 * byteLength - 1)\r\n\r\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\r\n }\r\n\r\n var i = byteLength - 1\r\n var mul = 1\r\n var sub = 0\r\n this[offset + i] = value & 0xFF\r\n while (--i >= 0 && (mul *= 0x100)) {\r\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\r\n sub = 1\r\n }\r\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\r\n }\r\n\r\n return offset + byteLength\r\n }\r\n\r\n Buffer.prototype.writeInt8 = function writeInt8(value, offset, noAssert) {\r\n value = +value\r\n offset = offset | 0\r\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\r\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\r\n if (value < 0) value = 0xff + value + 1\r\n this[offset] = (value & 0xff)\r\n return offset + 1\r\n }\r\n\r\n Buffer.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) {\r\n value = +value\r\n offset = offset | 0\r\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\r\n if (Buffer.TYPED_ARRAY_SUPPORT) {\r\n this[offset] = (value & 0xff)\r\n this[offset + 1] = (value >>> 8)\r\n } else {\r\n objectWriteUInt16(this, value, offset, true)\r\n }\r\n return offset + 2\r\n }\r\n\r\n Buffer.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) {\r\n value = +value\r\n offset = offset | 0\r\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\r\n if (Buffer.TYPED_ARRAY_SUPPORT) {\r\n this[offset] = (value >>> 8)\r\n this[offset + 1] = (value & 0xff)\r\n } else {\r\n objectWriteUInt16(this, value, offset, false)\r\n }\r\n return offset + 2\r\n }\r\n\r\n Buffer.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) {\r\n value = +value\r\n offset = offset | 0\r\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\r\n if (Buffer.TYPED_ARRAY_SUPPORT) {\r\n this[offset] = (value & 0xff)\r\n this[offset + 1] = (value >>> 8)\r\n this[offset + 2] = (value >>> 16)\r\n this[offset + 3] = (value >>> 24)\r\n } else {\r\n objectWriteUInt32(this, value, offset, true)\r\n }\r\n return offset + 4\r\n }\r\n\r\n Buffer.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) {\r\n value = +value\r\n offset = offset | 0\r\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\r\n if (value < 0) value = 0xffffffff + value + 1\r\n if (Buffer.TYPED_ARRAY_SUPPORT) {\r\n this[offset] = (value >>> 24)\r\n this[offset + 1] = (value >>> 16)\r\n this[offset + 2] = (value >>> 8)\r\n this[offset + 3] = (value & 0xff)\r\n } else {\r\n objectWriteUInt32(this, value, offset, false)\r\n }\r\n return offset + 4\r\n }\r\n\r\n function checkIEEE754(buf, value, offset, ext, max, min) {\r\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\r\n if (offset < 0) throw new RangeError('Index out of range')\r\n }\r\n\r\n function writeFloat(buf, value, offset, littleEndian, noAssert) {\r\n if (!noAssert) {\r\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\r\n }\r\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\r\n return offset + 4\r\n }\r\n\r\n Buffer.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) {\r\n return writeFloat(this, value, offset, true, noAssert)\r\n }\r\n\r\n Buffer.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) {\r\n return writeFloat(this, value, offset, false, noAssert)\r\n }\r\n\r\n function writeDouble(buf, value, offset, littleEndian, noAssert) {\r\n if (!noAssert) {\r\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\r\n }\r\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\r\n return offset + 8\r\n }\r\n\r\n Buffer.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) {\r\n return writeDouble(this, value, offset, true, noAssert)\r\n }\r\n\r\n Buffer.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) {\r\n return writeDouble(this, value, offset, false, noAssert)\r\n }\r\n\r\n // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\r\n Buffer.prototype.copy = function copy(target, targetStart, start, end) {\r\n if (!start) start = 0\r\n if (!end && end !== 0) end = this.length\r\n if (targetStart >= target.length) targetStart = target.length\r\n if (!targetStart) targetStart = 0\r\n if (end > 0 && end < start) end = start\r\n\r\n // Copy 0 bytes; we're done\r\n if (end === start) return 0\r\n if (target.length === 0 || this.length === 0) return 0\r\n\r\n // Fatal error conditions\r\n if (targetStart < 0) {\r\n throw new RangeError('targetStart out of bounds')\r\n }\r\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\r\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\r\n\r\n // Are we oob?\r\n if (end > this.length) end = this.length\r\n if (target.length - targetStart < end - start) {\r\n end = target.length - targetStart + start\r\n }\r\n\r\n var len = end - start\r\n var i\r\n\r\n if (this === target && start < targetStart && targetStart < end) {\r\n // descending copy from end\r\n for (i = len - 1; i >= 0; i--) {\r\n target[i + targetStart] = this[i + start]\r\n }\r\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\r\n // ascending copy from start\r\n for (i = 0; i < len; i++) {\r\n target[i + targetStart] = this[i + start]\r\n }\r\n } else {\r\n Uint8Array.prototype.set.call(\r\n target,\r\n this.subarray(start, start + len),\r\n targetStart\r\n )\r\n }\r\n\r\n return len\r\n }\r\n\r\n // Usage:\r\n // buffer.fill(number[, offset[, end]])\r\n // buffer.fill(buffer[, offset[, end]])\r\n // buffer.fill(string[, offset[, end]][, encoding])\r\n Buffer.prototype.fill = function fill(val, start, end, encoding) {\r\n // Handle string cases:\r\n if (typeof val === 'string') {\r\n if (typeof start === 'string') {\r\n encoding = start\r\n start = 0\r\n end = this.length\r\n } else if (typeof end === 'string') {\r\n encoding = end\r\n end = this.length\r\n }\r\n if (val.length === 1) {\r\n var code = val.charCodeAt(0)\r\n if (code < 256) {\r\n val = code\r\n }\r\n }\r\n if (encoding !== undefined && typeof encoding !== 'string') {\r\n throw new TypeError('encoding must be a string')\r\n }\r\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\r\n throw new TypeError('Unknown encoding: ' + encoding)\r\n }\r\n } else if (typeof val === 'number') {\r\n val = val & 255\r\n }\r\n\r\n // Invalid ranges are not set to a default, so can range check early.\r\n if (start < 0 || this.length < start || this.length < end) {\r\n throw new RangeError('Out of range index')\r\n }\r\n\r\n if (end <= start) {\r\n return this\r\n }\r\n\r\n start = start >>> 0\r\n end = end === undefined ? this.length : end >>> 0\r\n\r\n if (!val) val = 0\r\n\r\n var i\r\n if (typeof val === 'number') {\r\n for (i = start; i < end; i++) {\r\n this[i] = val\r\n }\r\n } else {\r\n var bytes = Buffer.isBuffer(val)\r\n ? val\r\n : utf8ToBytes(new Buffer(val, encoding).toString())\r\n var len = bytes.length\r\n for (i = 0; i < end - start; i++) {\r\n this[i + start] = bytes[i % len]\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n // HELPER FUNCTIONS\r\n // ================\r\n\r\n var INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\r\n\r\n function base64clean(str) {\r\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\r\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\r\n // Node converts strings with length < 2 to ''\r\n if (str.length < 2) return ''\r\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\r\n while (str.length % 4 !== 0) {\r\n str = str + '='\r\n }\r\n return str\r\n }\r\n\r\n function stringtrim(str) {\r\n if (str.trim) return str.trim()\r\n return str.replace(/^\\s+|\\s+$/g, '')\r\n }\r\n\r\n function toHex(n) {\r\n if (n < 16) return '0' + n.toString(16)\r\n return n.toString(16)\r\n }\r\n\r\n function utf8ToBytes(string, units) {\r\n units = units || Infinity\r\n var codePoint\r\n var length = string.length\r\n var leadSurrogate = null\r\n var bytes = []\r\n\r\n for (var i = 0; i < length; i++) {\r\n codePoint = string.charCodeAt(i)\r\n\r\n // is surrogate component\r\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\r\n // last char was a lead\r\n if (!leadSurrogate) {\r\n // no lead yet\r\n if (codePoint > 0xDBFF) {\r\n // unexpected trail\r\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\r\n continue\r\n } else if (i + 1 === length) {\r\n // unpaired lead\r\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\r\n continue\r\n }\r\n\r\n // valid lead\r\n leadSurrogate = codePoint\r\n\r\n continue\r\n }\r\n\r\n // 2 leads in a row\r\n if (codePoint < 0xDC00) {\r\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\r\n leadSurrogate = codePoint\r\n continue\r\n }\r\n\r\n // valid surrogate pair\r\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\r\n } else if (leadSurrogate) {\r\n // valid bmp char, but last char was a lead\r\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\r\n }\r\n\r\n leadSurrogate = null\r\n\r\n // encode utf8\r\n if (codePoint < 0x80) {\r\n if ((units -= 1) < 0) break\r\n bytes.push(codePoint)\r\n } else if (codePoint < 0x800) {\r\n if ((units -= 2) < 0) break\r\n bytes.push(\r\n codePoint >> 0x6 | 0xC0,\r\n codePoint & 0x3F | 0x80\r\n )\r\n } else if (codePoint < 0x10000) {\r\n if ((units -= 3) < 0) break\r\n bytes.push(\r\n codePoint >> 0xC | 0xE0,\r\n codePoint >> 0x6 & 0x3F | 0x80,\r\n codePoint & 0x3F | 0x80\r\n )\r\n } else if (codePoint < 0x110000) {\r\n if ((units -= 4) < 0) break\r\n bytes.push(\r\n codePoint >> 0x12 | 0xF0,\r\n codePoint >> 0xC & 0x3F | 0x80,\r\n codePoint >> 0x6 & 0x3F | 0x80,\r\n codePoint & 0x3F | 0x80\r\n )\r\n } else {\r\n throw new Error('Invalid code point')\r\n }\r\n }\r\n\r\n return bytes\r\n }\r\n\r\n function asciiToBytes(str) {\r\n var byteArray = []\r\n for (var i = 0; i < str.length; i++) {\r\n // Node's code seems to be doing this and not & 0x7F..\r\n byteArray.push(str.charCodeAt(i) & 0xFF)\r\n }\r\n return byteArray\r\n }\r\n\r\n function utf16leToBytes(str, units) {\r\n var c, hi, lo\r\n var byteArray = []\r\n for (var i = 0; i < str.length; i++) {\r\n if ((units -= 2) < 0) break\r\n\r\n c = str.charCodeAt(i)\r\n hi = c >> 8\r\n lo = c % 256\r\n byteArray.push(lo)\r\n byteArray.push(hi)\r\n }\r\n\r\n return byteArray\r\n }\r\n\r\n function base64ToBytes(str) {\r\n return base64.toByteArray(base64clean(str))\r\n }\r\n\r\n function blitBuffer(src, dst, offset, length) {\r\n for (var i = 0; i < length; i++) {\r\n if ((i + offset >= dst.length) || (i >= src.length)) break\r\n dst[i + offset] = src[i]\r\n }\r\n return i\r\n }\r\n\r\n function isnan(val) {\r\n return val !== val // eslint-disable-line no-self-compare\r\n }\r\n\r\n }).call(this, typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n\r\n }, { \"base64-js\": 9, \"ieee754\": 75, \"isarray\": 98 }], 13: [function (require, module, exports) {\r\n (function (process) {\r\n 'use strict';\r\n var escapeStringRegexp = require('escape-string-regexp');\r\n var ansiStyles = require('ansi-styles');\r\n var stripAnsi = require('strip-ansi');\r\n var hasAnsi = require('has-ansi');\r\n var supportsColor = require('supports-color');\r\n var defineProps = Object.defineProperties;\r\n var isSimpleWindowsTerm = process.platform === 'win32' && !/^xterm/i.test(process.env.TERM);\r\n\r\n function Chalk(options) {\r\n // detect mode if not set manually\r\n this.enabled = !options || options.enabled === undefined ? supportsColor : options.enabled;\r\n }\r\n\r\n // use bright blue on Windows as the normal blue color is illegible\r\n if (isSimpleWindowsTerm) {\r\n ansiStyles.blue.open = '\\u001b[94m';\r\n }\r\n\r\n var styles = (function () {\r\n var ret = {};\r\n\r\n Object.keys(ansiStyles).forEach(function (key) {\r\n ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');\r\n\r\n ret[key] = {\r\n get: function () {\r\n return build.call(this, this._styles.concat(key));\r\n }\r\n };\r\n });\r\n\r\n return ret;\r\n })();\r\n\r\n var proto = defineProps(function chalk() { }, styles);\r\n\r\n function build(_styles) {\r\n var builder = function () {\r\n return applyStyle.apply(builder, arguments);\r\n };\r\n\r\n builder._styles = _styles;\r\n builder.enabled = this.enabled;\r\n // __proto__ is used because we must return a function, but there is\r\n // no way to create a function with a different prototype.\r\n /* eslint-disable no-proto */\r\n builder.__proto__ = proto;\r\n\r\n return builder;\r\n }\r\n\r\n function applyStyle() {\r\n // support varags, but simply cast to string in case there's only one arg\r\n var args = arguments;\r\n var argsLen = args.length;\r\n var str = argsLen !== 0 && String(arguments[0]);\r\n\r\n if (argsLen > 1) {\r\n // don't slice `arguments`, it prevents v8 optimizations\r\n for (var a = 1; a < argsLen; a++) {\r\n str += ' ' + args[a];\r\n }\r\n }\r\n\r\n if (!this.enabled || !str) {\r\n return str;\r\n }\r\n\r\n var nestedStyles = this._styles;\r\n var i = nestedStyles.length;\r\n\r\n // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,\r\n // see https://github.com/chalk/chalk/issues/58\r\n // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.\r\n var originalDim = ansiStyles.dim.open;\r\n if (isSimpleWindowsTerm && (nestedStyles.indexOf('gray') !== -1 || nestedStyles.indexOf('grey') !== -1)) {\r\n ansiStyles.dim.open = '';\r\n }\r\n\r\n while (i--) {\r\n var code = ansiStyles[nestedStyles[i]];\r\n\r\n // Replace any instances already present with a re-opening code\r\n // otherwise only the part of the string until said closing code\r\n // will be colored, and the rest will simply be 'plain'.\r\n str = code.open + str.replace(code.closeRe, code.open) + code.close;\r\n }\r\n\r\n // Reset the original 'dim' if we changed it to work around the Windows dimmed gray issue.\r\n ansiStyles.dim.open = originalDim;\r\n\r\n return str;\r\n }\r\n\r\n function init() {\r\n var ret = {};\r\n\r\n Object.keys(styles).forEach(function (name) {\r\n ret[name] = {\r\n get: function () {\r\n return build.call(this, [name]);\r\n }\r\n };\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n defineProps(Chalk.prototype, init());\r\n\r\n module.exports = new Chalk();\r\n module.exports.styles = ansiStyles;\r\n module.exports.hasColor = hasAnsi;\r\n module.exports.stripColor = stripAnsi;\r\n module.exports.supportsColor = supportsColor;\r\n\r\n }).call(this, require('_process'))\r\n\r\n }, { \"_process\": 118, \"ansi-styles\": 2, \"escape-string-regexp\": 27, \"has-ansi\": 67, \"strip-ansi\": 190, \"supports-color\": 192 }], 14: [function (require, module, exports) {\r\n /*!\r\n * create-frame \r\n *\r\n * Copyright (c) 2015, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n var utils = require('./utils');\r\n\r\n module.exports = function createFrame(data) {\r\n if (data == null || typeof data !== 'object') {\r\n throw new TypeError('createFrame expects data to be an object');\r\n }\r\n\r\n var extend = utils.extend;\r\n var frame = extend({}, data);\r\n frame._parent = data;\r\n\r\n utils.define(frame, 'extend', function (data) {\r\n extend(this, data);\r\n });\r\n\r\n if (arguments.length > 1) {\r\n var args = [].slice.call(arguments, 1);\r\n var len = args.length, i = -1;\r\n while (++i < len) {\r\n frame.extend(args[i] || {});\r\n }\r\n }\r\n return frame;\r\n };\r\n\r\n }, { \"./utils\": 16 }], 15: [function (require, module, exports) {\r\n (function (process) {\r\n 'use strict';\r\n\r\n /**\r\n * Cache results of the first function call to ensure only calling once.\r\n *\r\n * ```js\r\n * var utils = require('lazy-cache')(require);\r\n * // cache the call to `require('ansi-yellow')`\r\n * utils('ansi-yellow', 'yellow');\r\n * // use `ansi-yellow`\r\n * console.log(utils.yellow('this is yellow'));\r\n * ```\r\n *\r\n * @param {Function} `fn` Function that will be called only once.\r\n * @return {Function} Function that can be called to get the cached function\r\n * @api public\r\n */\r\n\r\n function lazyCache(fn) {\r\n var cache = {};\r\n var proxy = function (mod, name) {\r\n name = name || camelcase(mod);\r\n\r\n // check both boolean and string in case `process.env` cases to string\r\n if (process.env.UNLAZY === 'true' || process.env.UNLAZY === true) {\r\n cache[name] = fn(mod);\r\n }\r\n\r\n Object.defineProperty(proxy, name, {\r\n enumerable: true,\r\n configurable: true,\r\n get: getter\r\n });\r\n\r\n function getter() {\r\n if (cache.hasOwnProperty(name)) {\r\n return cache[name];\r\n }\r\n return (cache[name] = fn(mod));\r\n }\r\n return getter;\r\n };\r\n return proxy;\r\n }\r\n\r\n /**\r\n * Used to camelcase the name to be stored on the `lazy` object.\r\n *\r\n * @param {String} `str` String containing `_`, `.`, `-` or whitespace that will be camelcased.\r\n * @return {String} camelcased string.\r\n */\r\n\r\n function camelcase(str) {\r\n if (str.length === 1) {\r\n return str.toLowerCase();\r\n }\r\n str = str.replace(/^[\\W_]+|[\\W_]+$/g, '').toLowerCase();\r\n return str.replace(/[\\W_]+(\\w|$)/g, function (_, ch) {\r\n return ch.toUpperCase();\r\n });\r\n }\r\n\r\n /**\r\n * Expose `lazyCache`\r\n */\r\n\r\n module.exports = lazyCache;\r\n\r\n }).call(this, require('_process'))\r\n\r\n }, { \"_process\": 118 }], 16: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var lazy = require('lazy-cache')(require);\r\n\r\n lazy('extend-shallow', 'extend');\r\n lazy('define-property', 'define');\r\n\r\n module.exports = lazy;\r\n\r\n }, { \"lazy-cache\": 15 }], 17: [function (require, module, exports) {\r\n /**\r\n * Expose `Date`\r\n */\r\n\r\n module.exports = require('./lib/parser');\r\n\r\n }, { \"./lib/parser\": 19 }], 18: [function (require, module, exports) {\r\n /**\r\n * Module Dependencies\r\n */\r\n\r\n var debug = require('debug')('date:date');\r\n\r\n /**\r\n * Time constants\r\n */\r\n\r\n var _second = 1000;\r\n var _minute = 60 * _second;\r\n var _hour = 60 * _minute;\r\n var _day = 24 * _hour;\r\n var _week = 7 * _day;\r\n var _year = 56 * _week;\r\n var _daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\n\r\n /**\r\n * Expose `date`\r\n */\r\n\r\n module.exports = date;\r\n\r\n /**\r\n * Initialize `date`\r\n *\r\n * @param {Date} offset (optional)\r\n * @return {Date}\r\n * @api publics\r\n */\r\n\r\n function date(offset) {\r\n if (!(this instanceof date)) return new date(offset);\r\n this._changed = {};\r\n this.date = new Date(offset);\r\n };\r\n\r\n /**\r\n * Clone the current date\r\n */\r\n\r\n date.prototype.clone = function () {\r\n return new Date(this.date);\r\n }\r\n\r\n /**\r\n * Has changed\r\n *\r\n * @param {String} str\r\n * @return {Boolean}\r\n */\r\n\r\n date.prototype.changed = function (str) {\r\n if (this._changed[str] === undefined) return false;\r\n return this._changed[str];\r\n };\r\n\r\n /**\r\n * add or subtract seconds\r\n *\r\n * @param {Number} n\r\n * @return {date}\r\n */\r\n\r\n date.prototype.second = function (n) {\r\n var seconds = +n * _second;\r\n this.update(seconds);\r\n this._changed['seconds'] = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * add or subtract minutes\r\n *\r\n * @param {Number} n\r\n * @return {date}\r\n */\r\n\r\n date.prototype.minute = function (n) {\r\n var minutes = +n * _minute;\r\n this.update(minutes);\r\n this._changed['minutes'] = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * add or subtract hours\r\n *\r\n * @param {Number} n\r\n * @return {date}\r\n */\r\n\r\n date.prototype.hour = function (n) {\r\n var hours = +n * _hour;\r\n this.update(hours);\r\n this._changed['hours'] = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * add or subtract days\r\n *\r\n * @param {Number} n\r\n * @return {date}\r\n */\r\n\r\n date.prototype.day = function (n) {\r\n var days = +n * _day;\r\n this.update(days);\r\n this._changed['days'] = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * add or subtract weeks\r\n *\r\n * @param {Number} n\r\n * @return {date}\r\n */\r\n\r\n date.prototype.week = function (n) {\r\n var weeks = +n * _week;\r\n this.update(weeks);\r\n this._changed['weeks'] = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * add or subtract months\r\n *\r\n * @param {Number} n\r\n * @return {Date}\r\n */\r\n\r\n date.prototype.month = function (n) {\r\n var d = this.date;\r\n var day = d.getDate();\r\n d.setDate(1);\r\n var month = +n + d.getMonth();\r\n d.setMonth(month);\r\n\r\n // Handle dates with less days\r\n var dim = this.daysInMonth(month)\r\n d.setDate(Math.min(dim, day));\r\n return this;\r\n };\r\n\r\n /**\r\n * get the days in the month\r\n */\r\n\r\n date.prototype.daysInMonth = function (m) {\r\n var dim = _daysInMonth[m];\r\n var leap = leapyear(this.date.getFullYear());\r\n return (1 == m && leap) ? 29 : 28;\r\n };\r\n\r\n /**\r\n * add or subtract years\r\n *\r\n * @param {Number} n\r\n * @return {date}\r\n */\r\n\r\n date.prototype.year = function (n) {\r\n var yr = this.date.getFullYear();\r\n yr += +n;\r\n this.date.setFullYear(yr);\r\n this._changed['years'] = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the time\r\n *\r\n * @param {String} h\r\n * @param {String} m\r\n * @param {String} s\r\n * @return {date}\r\n */\r\n\r\n date.prototype.time = function (h, m, s, meridiem) {\r\n if (h === false) {\r\n h = this.date.getHours();\r\n } else {\r\n h = +h || 0;\r\n this._changed['hours'] = h;\r\n }\r\n\r\n if (m === false) {\r\n m = this.date.getMinutes();\r\n } else {\r\n m = +m || 0;\r\n this._changed['minutes'] = m;\r\n }\r\n\r\n if (s === false) {\r\n s = this.date.getSeconds();\r\n } else {\r\n s = +s || 0;\r\n this._changed['seconds'] = s;\r\n }\r\n\r\n this.date.setHours(h, m, s);\r\n return this;\r\n };\r\n\r\n /**\r\n * Dynamically create day functions (sunday(n), monday(n), etc.)\r\n */\r\n\r\n var days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];\r\n days.forEach(function (day, i) {\r\n date.prototype[days[i]] = function (n) {\r\n this._changed['days'] = true;\r\n this.updateDay(i, n);\r\n };\r\n });\r\n\r\n /**\r\n * go to day of week\r\n *\r\n * @param {Number} day\r\n * @param {Number} n\r\n * @return {date}\r\n */\r\n\r\n date.prototype.updateDay = function (d, n) {\r\n n = +(n || 1);\r\n var diff = (d - this.date.getDay() + 7) % 7;\r\n if (n > 0)--n;\r\n diff += (7 * n);\r\n this.update(diff * _day);\r\n return this;\r\n }\r\n\r\n /**\r\n * Update the date\r\n *\r\n * @param {Number} ms\r\n * @return {Date}\r\n * @api private\r\n */\r\n\r\n date.prototype.update = function (ms) {\r\n this.date = new Date(this.date.getTime() + ms);\r\n return this;\r\n };\r\n\r\n /**\r\n * leap year\r\n *\r\n * @param {Number} yr\r\n * @return {Boolean}\r\n */\r\n\r\n function leapyear(yr) {\r\n return (yr % 4 === 0 && yr % 100 !== 0) || yr % 400 === 0;\r\n }\r\n\r\n }, { \"debug\": 20 }], 19: [function (require, module, exports) {\r\n /**\r\n * Module Dependencies\r\n */\r\n\r\n var date = require('./date');\r\n var debug = require('debug')('date:parser');\r\n\r\n /**\r\n * Days\r\n */\r\n\r\n var days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];\r\n var months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september',\r\n 'october', 'november', 'december']\r\n\r\n /**\r\n * Regexs\r\n */\r\n\r\n // 5, 05, 5:30, 5.30, 05:30:10, 05:30.10, 05.30.10, at 5\r\n var rMeridiem = /^(\\d{1,2})([:.](\\d{1,2}))?([:.](\\d{1,2}))?\\s*([ap]m)/;\r\n var rHourMinute = /^(\\d{1,2})([:.](\\d{1,2}))([:.](\\d{1,2}))?/;\r\n var rAtHour = /^at\\s?(\\d{1,2})$/;\r\n var rDays = /\\b(sun(day)?|mon(day)?|tues(day)?|wed(nesday)?|thur(sday|s)?|fri(day)?|sat(urday)?)s?\\b/;\r\n var rMonths = /^((\\d{1,2})(st|nd|rd|th))\\sof\\s(january|february|march|april|may|june|july|august|september|october|november|december)/i;\r\n var rPast = /\\b(last|yesterday|ago)\\b/;\r\n var rDayMod = /\\b(morning|noon|afternoon|night|evening|midnight)\\b/;\r\n var rAgo = /^(\\d*)\\s?\\b(second|minute|hour|day|week|month|year)[s]?\\b\\s?ago$/;\r\n\r\n /**\r\n * Expose `parser`\r\n */\r\n\r\n module.exports = parser;\r\n\r\n /**\r\n * Initialize `parser`\r\n *\r\n * @param {String} str\r\n * @return {Date}\r\n * @api publics\r\n */\r\n\r\n function parser(str, offset) {\r\n if (!(this instanceof parser)) return new parser(str, offset);\r\n if (typeof offset == 'string') offset = parser(offset);\r\n var d = offset || new Date;\r\n this.date = new date(d);\r\n this.original = str;\r\n this.str = str.toLowerCase();\r\n this.stash = [];\r\n this.tokens = [];\r\n while (this.advance() !== 'eos');\r\n debug('tokens %j', this.tokens)\r\n this.nextTime(d);\r\n if (this.date.date == d) throw new Error('Invalid date');\r\n return this.date.date;\r\n };\r\n\r\n /**\r\n * Advance a token\r\n */\r\n\r\n parser.prototype.advance = function () {\r\n var tok = this.eos()\r\n || this.space()\r\n || this._next()\r\n || this.last()\r\n || this.dayByName()\r\n || this.monthByName()\r\n || this.timeAgo()\r\n || this.ago()\r\n || this.yesterday()\r\n || this.tomorrow()\r\n || this.noon()\r\n || this.midnight()\r\n || this.night()\r\n || this.evening()\r\n || this.afternoon()\r\n || this.morning()\r\n || this.tonight()\r\n || this.meridiem()\r\n || this.hourminute()\r\n || this.athour()\r\n || this.week()\r\n || this.month()\r\n || this.year()\r\n || this.second()\r\n || this.minute()\r\n || this.hour()\r\n || this.day()\r\n || this.number()\r\n || this.string()\r\n || this.other();\r\n\r\n this.tokens.push(tok);\r\n return tok;\r\n };\r\n\r\n /**\r\n * Lookahead `n` tokens.\r\n *\r\n * @param {Number} n\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\n parser.prototype.lookahead = function (n) {\r\n var fetch = n - this.stash.length;\r\n if (fetch == 0) return this.lookahead(++n);\r\n while (fetch-- > 0) this.stash.push(this.advance());\r\n return this.stash[--n];\r\n };\r\n\r\n /**\r\n * Lookahead a single token.\r\n *\r\n * @return {Token}\r\n * @api private\r\n */\r\n\r\n parser.prototype.peek = function () {\r\n return this.lookahead(1);\r\n };\r\n\r\n /**\r\n * Fetch next token including those stashed by peek.\r\n *\r\n * @return {Token}\r\n * @api private\r\n */\r\n\r\n parser.prototype.next = function () {\r\n var tok = this.stashed() || this.advance();\r\n return tok;\r\n };\r\n\r\n /**\r\n * Return the next possibly stashed token.\r\n *\r\n * @return {Token}\r\n * @api private\r\n */\r\n\r\n parser.prototype.stashed = function () {\r\n var stashed = this.stash.shift();\r\n return stashed;\r\n };\r\n\r\n /**\r\n * Consume the given `len`.\r\n *\r\n * @param {Number|Array} len\r\n * @api private\r\n */\r\n\r\n parser.prototype.skip = function (len) {\r\n this.str = this.str.substr(Array.isArray(len)\r\n ? len[0].length\r\n : len);\r\n };\r\n\r\n /**\r\n * EOS\r\n */\r\n\r\n parser.prototype.eos = function () {\r\n if (this.str.length) return;\r\n return 'eos';\r\n };\r\n\r\n /**\r\n * Space\r\n */\r\n\r\n parser.prototype.space = function () {\r\n var captures;\r\n if (captures = /^([ \\t]+)/.exec(this.str)) {\r\n this.skip(captures);\r\n return this.advance();\r\n }\r\n };\r\n\r\n /**\r\n * Second\r\n */\r\n\r\n parser.prototype.second = function () {\r\n var captures;\r\n if (captures = /^s(ec|econd)?s?/.exec(this.str)) {\r\n this.skip(captures);\r\n return 'second';\r\n }\r\n };\r\n\r\n /**\r\n * Minute\r\n */\r\n\r\n parser.prototype.minute = function () {\r\n var captures;\r\n if (captures = /^m(in|inute)?s?/.exec(this.str)) {\r\n this.skip(captures);\r\n return 'minute';\r\n }\r\n };\r\n\r\n /**\r\n * Hour\r\n */\r\n\r\n parser.prototype.hour = function () {\r\n var captures;\r\n if (captures = /^h(r|our)s?/.exec(this.str)) {\r\n this.skip(captures);\r\n return 'hour';\r\n }\r\n };\r\n\r\n /**\r\n * Day\r\n */\r\n\r\n parser.prototype.day = function () {\r\n var captures;\r\n if (captures = /^d(ay)?s?/.exec(this.str)) {\r\n this.skip(captures);\r\n return 'day';\r\n }\r\n };\r\n\r\n /**\r\n * Day by name\r\n */\r\n\r\n parser.prototype.dayByName = function () {\r\n var captures;\r\n var r = new RegExp('^' + rDays.source);\r\n if (captures = r.exec(this.str)) {\r\n var day = captures[1];\r\n this.skip(captures);\r\n this.date[day](1);\r\n return captures[1];\r\n }\r\n };\r\n\r\n\r\n /**\r\n * Month by name\r\n */\r\n\r\n parser.prototype.monthByName = function () {\r\n var captures;\r\n if (captures = rMonths.exec(this.str)) {\r\n var day = captures[2]\r\n var month = captures[4];\r\n this.date.date.setMonth((months.indexOf(month)));\r\n if (day) this.date.date.setDate(parseInt(day));\r\n this.skip(captures);\r\n return captures[0];\r\n }\r\n };\r\n\r\n\r\n parser.prototype.timeAgo = function () {\r\n var captures;\r\n if (captures = rAgo.exec(this.str)) {\r\n var num = captures[1];\r\n var mod = captures[2];\r\n this.date[mod](-num);\r\n this.skip(captures);\r\n return 'timeAgo';\r\n }\r\n };\r\n\r\n /**\r\n * Week\r\n */\r\n\r\n parser.prototype.week = function () {\r\n var captures;\r\n if (captures = /^w(k|eek)s?/.exec(this.str)) {\r\n this.skip(captures);\r\n return 'week';\r\n }\r\n };\r\n\r\n /**\r\n * Month\r\n */\r\n\r\n parser.prototype.month = function () {\r\n var captures;\r\n if (captures = /^mon(th)?(es|s)?\\b/.exec(this.str)) {\r\n this.skip(captures);\r\n return 'month';\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Week\r\n */\r\n\r\n parser.prototype.year = function () {\r\n var captures;\r\n if (captures = /^y(r|ear)s?/.exec(this.str)) {\r\n this.skip(captures);\r\n return 'year';\r\n }\r\n };\r\n\r\n /**\r\n * Meridiem am/pm\r\n */\r\n\r\n parser.prototype.meridiem = function () {\r\n var captures;\r\n if (captures = rMeridiem.exec(this.str)) {\r\n this.skip(captures);\r\n this.time(captures[1], captures[3], captures[5], captures[6]);\r\n return 'meridiem';\r\n }\r\n };\r\n\r\n /**\r\n * Hour Minute (ex. 12:30)\r\n */\r\n\r\n parser.prototype.hourminute = function () {\r\n var captures;\r\n if (captures = rHourMinute.exec(this.str)) {\r\n this.skip(captures);\r\n this.time(captures[1], captures[3], captures[5], this._meridiem);\r\n return 'hourminute';\r\n }\r\n };\r\n\r\n /**\r\n * At Hour (ex. at 5)\r\n */\r\n\r\n parser.prototype.athour = function () {\r\n var captures;\r\n if (captures = rAtHour.exec(this.str)) {\r\n this.skip(captures);\r\n this.time(captures[1], 0, 0, this._meridiem);\r\n this._meridiem = null;\r\n return 'athour';\r\n }\r\n };\r\n\r\n /**\r\n * Time set helper\r\n */\r\n\r\n parser.prototype.time = function (h, m, s, meridiem) {\r\n var d = this.date;\r\n var before = d.clone();\r\n\r\n if (meridiem) {\r\n // convert to 24 hour\r\n h = ('pm' == meridiem && 12 > h) ? +h + 12 : h; // 6pm => 18\r\n h = ('am' == meridiem && 12 == h) ? 0 : h; // 12am => 0\r\n }\r\n\r\n m = (!m && d.changed('minutes')) ? false : m;\r\n s = (!s && d.changed('seconds')) ? false : s;\r\n d.time(h, m, s);\r\n };\r\n\r\n /**\r\n * Best attempt to pick the next time this date will occur\r\n *\r\n * TODO: place at the end of the parsing\r\n */\r\n\r\n parser.prototype.nextTime = function (before) {\r\n var d = this.date;\r\n var orig = this.original;\r\n\r\n if (before <= d.date || rPast.test(orig)) return this;\r\n\r\n // If time is in the past, we need to guess at the next time\r\n if (rDays.test(orig)) {\r\n d.day(7);\r\n } else if ((before - d.date) / 1000 > 60) {\r\n // If it is a month in the past, don't add a day\r\n if (rMonths.test(orig)) {\r\n d.day(0);\r\n } else {\r\n d.day(1);\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n /**\r\n * Yesterday\r\n */\r\n\r\n parser.prototype.yesterday = function () {\r\n var captures;\r\n if (captures = /^(yes(terday)?)/.exec(this.str)) {\r\n this.skip(captures);\r\n this.date.day(-1);\r\n return 'yesterday';\r\n }\r\n };\r\n\r\n /**\r\n * Tomorrow\r\n */\r\n\r\n parser.prototype.tomorrow = function () {\r\n var captures;\r\n if (captures = /^tom(orrow)?/.exec(this.str)) {\r\n this.skip(captures);\r\n this.date.day(1);\r\n return 'tomorrow';\r\n }\r\n };\r\n\r\n /**\r\n * Noon\r\n */\r\n\r\n parser.prototype.noon = function () {\r\n var captures;\r\n if (captures = /^noon\\b/.exec(this.str)) {\r\n this.skip(captures);\r\n var before = this.date.clone();\r\n this.date.date.setHours(12, 0, 0);\r\n return 'noon';\r\n }\r\n };\r\n\r\n /**\r\n * Midnight\r\n */\r\n\r\n parser.prototype.midnight = function () {\r\n var captures;\r\n if (captures = /^midnight\\b/.exec(this.str)) {\r\n this.skip(captures);\r\n var before = this.date.clone();\r\n this.date.date.setHours(0, 0, 0);\r\n return 'midnight';\r\n }\r\n };\r\n\r\n /**\r\n * Night (arbitrarily set at 7pm)\r\n */\r\n\r\n parser.prototype.night = function () {\r\n var captures;\r\n if (captures = /^night\\b/.exec(this.str)) {\r\n this.skip(captures);\r\n this._meridiem = 'pm';\r\n var before = this.date.clone();\r\n this.date.date.setHours(19, 0, 0);\r\n return 'night'\r\n }\r\n };\r\n\r\n /**\r\n * Evening (arbitrarily set at 5pm)\r\n */\r\n\r\n parser.prototype.evening = function () {\r\n var captures;\r\n if (captures = /^evening\\b/.exec(this.str)) {\r\n this.skip(captures);\r\n this._meridiem = 'pm';\r\n var before = this.date.clone();\r\n this.date.date.setHours(17, 0, 0);\r\n return 'evening'\r\n }\r\n };\r\n\r\n /**\r\n * Afternoon (arbitrarily set at 2pm)\r\n */\r\n\r\n parser.prototype.afternoon = function () {\r\n var captures;\r\n if (captures = /^afternoon\\b/.exec(this.str)) {\r\n this.skip(captures);\r\n this._meridiem = 'pm';\r\n var before = this.date.clone();\r\n\r\n if (this.date.changed('hours')) return 'afternoon';\r\n\r\n this.date.date.setHours(14, 0, 0);\r\n return 'afternoon';\r\n }\r\n };\r\n\r\n\r\n /**\r\n * Morning (arbitrarily set at 8am)\r\n */\r\n\r\n parser.prototype.morning = function () {\r\n var captures;\r\n if (captures = /^morning\\b/.exec(this.str)) {\r\n this.skip(captures);\r\n this._meridiem = 'am';\r\n var before = this.date.clone();\r\n if (!this.date.changed('hours')) this.date.date.setHours(8, 0, 0);\r\n return 'morning';\r\n }\r\n };\r\n\r\n /**\r\n * Tonight\r\n */\r\n\r\n parser.prototype.tonight = function () {\r\n var captures;\r\n if (captures = /^tonight\\b/.exec(this.str)) {\r\n this.skip(captures);\r\n this._meridiem = 'pm';\r\n return 'tonight';\r\n }\r\n };\r\n\r\n /**\r\n * Next time\r\n */\r\n\r\n parser.prototype._next = function () {\r\n var captures;\r\n if (captures = /^next/.exec(this.str)) {\r\n this.skip(captures);\r\n var d = new Date(this.date.date);\r\n var mod = this.peek();\r\n\r\n // If we have a defined modifier, then update\r\n if (this.date[mod]) {\r\n this.next();\r\n // slight hack to modify already modified\r\n this.date = date(d);\r\n this.date[mod](1);\r\n } else if (rDayMod.test(mod)) {\r\n this.date.day(1);\r\n }\r\n\r\n return 'next';\r\n }\r\n };\r\n\r\n /**\r\n * Last time\r\n */\r\n\r\n parser.prototype.last = function () {\r\n var captures;\r\n if (captures = /^last/.exec(this.str)) {\r\n this.skip(captures);\r\n var d = new Date(this.date.date);\r\n var mod = this.peek();\r\n\r\n // If we have a defined modifier, then update\r\n if (this.date[mod]) {\r\n this.next();\r\n // slight hack to modify already modified\r\n this.date = date(d);\r\n this.date[mod](-1);\r\n } else if (rDayMod.test(mod)) {\r\n this.date.day(-1);\r\n }\r\n\r\n return 'last';\r\n }\r\n };\r\n\r\n /**\r\n * Ago\r\n */\r\n\r\n parser.prototype.ago = function () {\r\n var captures;\r\n if (captures = /^ago\\b/.exec(this.str)) {\r\n this.skip(captures);\r\n return 'ago';\r\n }\r\n };\r\n\r\n /**\r\n * Number\r\n */\r\n\r\n parser.prototype.number = function () {\r\n var captures;\r\n if (captures = /^(\\d+)/.exec(this.str)) {\r\n var n = captures[1];\r\n this.skip(captures);\r\n var mod = this.peek();\r\n\r\n // If we have a defined modifier, then update\r\n if (this.date[mod]) {\r\n if ('ago' == this.peek()) n = -n;\r\n this.date[mod](n);\r\n } else if (this._meridiem) {\r\n // when we don't have meridiem, possibly use context to guess\r\n this.time(n, 0, 0, this._meridiem);\r\n this._meridiem = null;\r\n } else if (this.original.indexOf('at') > -1) {\r\n this.time(n, 0, 0, this._meridiem);\r\n this._meridiem = null;\r\n }\r\n\r\n return 'number';\r\n }\r\n };\r\n\r\n /**\r\n * String\r\n */\r\n\r\n parser.prototype.string = function () {\r\n var captures;\r\n if (captures = /^\\w+/.exec(this.str)) {\r\n this.skip(captures);\r\n return 'string';\r\n }\r\n };\r\n\r\n /**\r\n * Other\r\n */\r\n\r\n parser.prototype.other = function () {\r\n var captures;\r\n if (captures = /^./.exec(this.str)) {\r\n this.skip(captures);\r\n return 'other';\r\n }\r\n };\r\n\r\n }, { \"./date\": 18, \"debug\": 20 }], 20: [function (require, module, exports) {\r\n\r\n /**\r\n * Expose `debug()` as the module.\r\n */\r\n\r\n module.exports = debug;\r\n\r\n /**\r\n * Create a debugger with the given `name`.\r\n *\r\n * @param {String} name\r\n * @return {Type}\r\n * @api public\r\n */\r\n\r\n function debug(name) {\r\n if (!debug.enabled(name)) return function () { };\r\n\r\n return function (fmt) {\r\n fmt = coerce(fmt);\r\n\r\n var curr = new Date;\r\n var ms = curr - (debug[name] || curr);\r\n debug[name] = curr;\r\n\r\n fmt = name\r\n + ' '\r\n + fmt\r\n + ' +' + debug.humanize(ms);\r\n\r\n // This hackery is required for IE8\r\n // where `console.log` doesn't have 'apply'\r\n window.console\r\n && console.log\r\n && Function.prototype.apply.call(console.log, console, arguments);\r\n }\r\n }\r\n\r\n /**\r\n * The currently active debug mode names.\r\n */\r\n\r\n debug.names = [];\r\n debug.skips = [];\r\n\r\n /**\r\n * Enables a debug mode by name. This can include modes\r\n * separated by a colon and wildcards.\r\n *\r\n * @param {String} name\r\n * @api public\r\n */\r\n\r\n debug.enable = function (name) {\r\n try {\r\n localStorage.debug = name;\r\n } catch (e) { }\r\n\r\n var split = (name || '').split(/[\\s,]+/)\r\n , len = split.length;\r\n\r\n for (var i = 0; i < len; i++) {\r\n name = split[i].replace('*', '.*?');\r\n if (name[0] === '-') {\r\n debug.skips.push(new RegExp('^' + name.substr(1) + '$'));\r\n }\r\n else {\r\n debug.names.push(new RegExp('^' + name + '$'));\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Disable debug output.\r\n *\r\n * @api public\r\n */\r\n\r\n debug.disable = function () {\r\n debug.enable('');\r\n };\r\n\r\n /**\r\n * Humanize the given `ms`.\r\n *\r\n * @param {Number} m\r\n * @return {String}\r\n * @api private\r\n */\r\n\r\n debug.humanize = function (ms) {\r\n var sec = 1000\r\n , min = 60 * 1000\r\n , hour = 60 * min;\r\n\r\n if (ms >= hour) return (ms / hour).toFixed(1) + 'h';\r\n if (ms >= min) return (ms / min).toFixed(1) + 'm';\r\n if (ms >= sec) return (ms / sec | 0) + 's';\r\n return ms + 'ms';\r\n };\r\n\r\n /**\r\n * Returns true if the given mode name is enabled, false otherwise.\r\n *\r\n * @param {String} name\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\n debug.enabled = function (name) {\r\n for (var i = 0, len = debug.skips.length; i < len; i++) {\r\n if (debug.skips[i].test(name)) {\r\n return false;\r\n }\r\n }\r\n for (var i = 0, len = debug.names.length; i < len; i++) {\r\n if (debug.names[i].test(name)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n /**\r\n * Coerce `val`.\r\n */\r\n\r\n function coerce(val) {\r\n if (val instanceof Error) return val.stack || val.message;\r\n return val;\r\n }\r\n\r\n // persist\r\n\r\n try {\r\n if (window.localStorage) debug.enable(localStorage.debug);\r\n } catch (e) { }\r\n\r\n }, {}], 21: [function (require, module, exports) {\r\n /*!\r\n * define-property \r\n *\r\n * Copyright (c) 2015, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n var isDescriptor = require('is-descriptor');\r\n\r\n module.exports = function defineProperty(obj, prop, val) {\r\n if (typeof obj !== 'object' && typeof obj !== 'function') {\r\n throw new TypeError('expected an object or function.');\r\n }\r\n\r\n if (typeof prop !== 'string') {\r\n throw new TypeError('expected `prop` to be a string.');\r\n }\r\n\r\n if (isDescriptor(val) && ('set' in val || 'get' in val)) {\r\n return Object.defineProperty(obj, prop, val);\r\n }\r\n\r\n return Object.defineProperty(obj, prop, {\r\n configurable: true,\r\n enumerable: false,\r\n writable: true,\r\n value: val\r\n });\r\n };\r\n\r\n }, { \"is-descriptor\": 82 }], 22: [function (require, module, exports) {\r\n var punycode = require('punycode');\r\n var entities = require('./entities.json');\r\n\r\n module.exports = decode;\r\n\r\n function decode(str) {\r\n if (typeof str !== 'string') {\r\n throw new TypeError('Expected a String');\r\n }\r\n\r\n return str.replace(/&(#?[^;\\W]+;?)/g, function (_, match) {\r\n var m;\r\n if (m = /^#(\\d+);?$/.exec(match)) {\r\n return punycode.ucs2.encode([parseInt(m[1], 10)]);\r\n } else if (m = /^#[Xx]([A-Fa-f0-9]+);?/.exec(match)) {\r\n return punycode.ucs2.encode([parseInt(m[1], 16)]);\r\n } else {\r\n // named entity\r\n var hasSemi = /;$/.test(match);\r\n var withoutSemi = hasSemi ? match.replace(/;$/, '') : match;\r\n var target = entities[withoutSemi] || (hasSemi && entities[match]);\r\n\r\n if (typeof target === 'number') {\r\n return punycode.ucs2.encode([target]);\r\n } else if (typeof target === 'string') {\r\n return target;\r\n } else {\r\n return '&' + match;\r\n }\r\n }\r\n });\r\n }\r\n\r\n }, { \"./entities.json\": 24, \"punycode\": 119 }], 23: [function (require, module, exports) {\r\n var punycode = require('punycode');\r\n var revEntities = require('./reversed.json');\r\n\r\n module.exports = encode;\r\n\r\n function encode(str, opts) {\r\n if (typeof str !== 'string') {\r\n throw new TypeError('Expected a String');\r\n }\r\n if (!opts) opts = {};\r\n\r\n var numeric = true;\r\n if (opts.named) numeric = false;\r\n if (opts.numeric !== undefined) numeric = opts.numeric;\r\n\r\n var special = opts.special || {\r\n '\"': true, \"'\": true,\r\n '<': true, '>': true,\r\n '&': true\r\n };\r\n\r\n var codePoints = punycode.ucs2.decode(str);\r\n var chars = [];\r\n for (var i = 0; i < codePoints.length; i++) {\r\n var cc = codePoints[i];\r\n var c = punycode.ucs2.encode([cc]);\r\n var e = revEntities[cc];\r\n if (e && (cc >= 127 || special[c]) && !numeric) {\r\n chars.push('&' + (/;$/.test(e) ? e : e + ';'));\r\n }\r\n else if (cc < 32 || cc >= 127 || special[c]) {\r\n chars.push('&#' + cc + ';');\r\n }\r\n else {\r\n chars.push(c);\r\n }\r\n }\r\n return chars.join('');\r\n }\r\n\r\n }, { \"./reversed.json\": 26, \"punycode\": 119 }], 24: [function (require, module, exports) {\r\n module.exports = {\r\n \"Aacute;\": \"\\u00C1\",\r\n \"Aacute\": \"\\u00C1\",\r\n \"aacute;\": \"\\u00E1\",\r\n \"aacute\": \"\\u00E1\",\r\n \"Abreve;\": \"\\u0102\",\r\n \"abreve;\": \"\\u0103\",\r\n \"ac;\": \"\\u223E\",\r\n \"acd;\": \"\\u223F\",\r\n \"acE;\": \"\\u223E\\u0333\",\r\n \"Acirc;\": \"\\u00C2\",\r\n \"Acirc\": \"\\u00C2\",\r\n \"acirc;\": \"\\u00E2\",\r\n \"acirc\": \"\\u00E2\",\r\n \"acute;\": \"\\u00B4\",\r\n \"acute\": \"\\u00B4\",\r\n \"Acy;\": \"\\u0410\",\r\n \"acy;\": \"\\u0430\",\r\n \"AElig;\": \"\\u00C6\",\r\n \"AElig\": \"\\u00C6\",\r\n \"aelig;\": \"\\u00E6\",\r\n \"aelig\": \"\\u00E6\",\r\n \"af;\": \"\\u2061\",\r\n \"Afr;\": \"\\uD835\\uDD04\",\r\n \"afr;\": \"\\uD835\\uDD1E\",\r\n \"Agrave;\": \"\\u00C0\",\r\n \"Agrave\": \"\\u00C0\",\r\n \"agrave;\": \"\\u00E0\",\r\n \"agrave\": \"\\u00E0\",\r\n \"alefsym;\": \"\\u2135\",\r\n \"aleph;\": \"\\u2135\",\r\n \"Alpha;\": \"\\u0391\",\r\n \"alpha;\": \"\\u03B1\",\r\n \"Amacr;\": \"\\u0100\",\r\n \"amacr;\": \"\\u0101\",\r\n \"amalg;\": \"\\u2A3F\",\r\n \"AMP;\": \"&\",\r\n \"AMP\": \"&\",\r\n \"amp;\": \"&\",\r\n \"amp\": \"&\",\r\n \"And;\": \"\\u2A53\",\r\n \"and;\": \"\\u2227\",\r\n \"andand;\": \"\\u2A55\",\r\n \"andd;\": \"\\u2A5C\",\r\n \"andslope;\": \"\\u2A58\",\r\n \"andv;\": \"\\u2A5A\",\r\n \"ang;\": \"\\u2220\",\r\n \"ange;\": \"\\u29A4\",\r\n \"angle;\": \"\\u2220\",\r\n \"angmsd;\": \"\\u2221\",\r\n \"angmsdaa;\": \"\\u29A8\",\r\n \"angmsdab;\": \"\\u29A9\",\r\n \"angmsdac;\": \"\\u29AA\",\r\n \"angmsdad;\": \"\\u29AB\",\r\n \"angmsdae;\": \"\\u29AC\",\r\n \"angmsdaf;\": \"\\u29AD\",\r\n \"angmsdag;\": \"\\u29AE\",\r\n \"angmsdah;\": \"\\u29AF\",\r\n \"angrt;\": \"\\u221F\",\r\n \"angrtvb;\": \"\\u22BE\",\r\n \"angrtvbd;\": \"\\u299D\",\r\n \"angsph;\": \"\\u2222\",\r\n \"angst;\": \"\\u00C5\",\r\n \"angzarr;\": \"\\u237C\",\r\n \"Aogon;\": \"\\u0104\",\r\n \"aogon;\": \"\\u0105\",\r\n \"Aopf;\": \"\\uD835\\uDD38\",\r\n \"aopf;\": \"\\uD835\\uDD52\",\r\n \"ap;\": \"\\u2248\",\r\n \"apacir;\": \"\\u2A6F\",\r\n \"apE;\": \"\\u2A70\",\r\n \"ape;\": \"\\u224A\",\r\n \"apid;\": \"\\u224B\",\r\n \"apos;\": \"'\",\r\n \"ApplyFunction;\": \"\\u2061\",\r\n \"approx;\": \"\\u2248\",\r\n \"approxeq;\": \"\\u224A\",\r\n \"Aring;\": \"\\u00C5\",\r\n \"Aring\": \"\\u00C5\",\r\n \"aring;\": \"\\u00E5\",\r\n \"aring\": \"\\u00E5\",\r\n \"Ascr;\": \"\\uD835\\uDC9C\",\r\n \"ascr;\": \"\\uD835\\uDCB6\",\r\n \"Assign;\": \"\\u2254\",\r\n \"ast;\": \"*\",\r\n \"asymp;\": \"\\u2248\",\r\n \"asympeq;\": \"\\u224D\",\r\n \"Atilde;\": \"\\u00C3\",\r\n \"Atilde\": \"\\u00C3\",\r\n \"atilde;\": \"\\u00E3\",\r\n \"atilde\": \"\\u00E3\",\r\n \"Auml;\": \"\\u00C4\",\r\n \"Auml\": \"\\u00C4\",\r\n \"auml;\": \"\\u00E4\",\r\n \"auml\": \"\\u00E4\",\r\n \"awconint;\": \"\\u2233\",\r\n \"awint;\": \"\\u2A11\",\r\n \"backcong;\": \"\\u224C\",\r\n \"backepsilon;\": \"\\u03F6\",\r\n \"backprime;\": \"\\u2035\",\r\n \"backsim;\": \"\\u223D\",\r\n \"backsimeq;\": \"\\u22CD\",\r\n \"Backslash;\": \"\\u2216\",\r\n \"Barv;\": \"\\u2AE7\",\r\n \"barvee;\": \"\\u22BD\",\r\n \"Barwed;\": \"\\u2306\",\r\n \"barwed;\": \"\\u2305\",\r\n \"barwedge;\": \"\\u2305\",\r\n \"bbrk;\": \"\\u23B5\",\r\n \"bbrktbrk;\": \"\\u23B6\",\r\n \"bcong;\": \"\\u224C\",\r\n \"Bcy;\": \"\\u0411\",\r\n \"bcy;\": \"\\u0431\",\r\n \"bdquo;\": \"\\u201E\",\r\n \"becaus;\": \"\\u2235\",\r\n \"Because;\": \"\\u2235\",\r\n \"because;\": \"\\u2235\",\r\n \"bemptyv;\": \"\\u29B0\",\r\n \"bepsi;\": \"\\u03F6\",\r\n \"bernou;\": \"\\u212C\",\r\n \"Bernoullis;\": \"\\u212C\",\r\n \"Beta;\": \"\\u0392\",\r\n \"beta;\": \"\\u03B2\",\r\n \"beth;\": \"\\u2136\",\r\n \"between;\": \"\\u226C\",\r\n \"Bfr;\": \"\\uD835\\uDD05\",\r\n \"bfr;\": \"\\uD835\\uDD1F\",\r\n \"bigcap;\": \"\\u22C2\",\r\n \"bigcirc;\": \"\\u25EF\",\r\n \"bigcup;\": \"\\u22C3\",\r\n \"bigodot;\": \"\\u2A00\",\r\n \"bigoplus;\": \"\\u2A01\",\r\n \"bigotimes;\": \"\\u2A02\",\r\n \"bigsqcup;\": \"\\u2A06\",\r\n \"bigstar;\": \"\\u2605\",\r\n \"bigtriangledown;\": \"\\u25BD\",\r\n \"bigtriangleup;\": \"\\u25B3\",\r\n \"biguplus;\": \"\\u2A04\",\r\n \"bigvee;\": \"\\u22C1\",\r\n \"bigwedge;\": \"\\u22C0\",\r\n \"bkarow;\": \"\\u290D\",\r\n \"blacklozenge;\": \"\\u29EB\",\r\n \"blacksquare;\": \"\\u25AA\",\r\n \"blacktriangle;\": \"\\u25B4\",\r\n \"blacktriangledown;\": \"\\u25BE\",\r\n \"blacktriangleleft;\": \"\\u25C2\",\r\n \"blacktriangleright;\": \"\\u25B8\",\r\n \"blank;\": \"\\u2423\",\r\n \"blk12;\": \"\\u2592\",\r\n \"blk14;\": \"\\u2591\",\r\n \"blk34;\": \"\\u2593\",\r\n \"block;\": \"\\u2588\",\r\n \"bne;\": \"=\\u20E5\",\r\n \"bnequiv;\": \"\\u2261\\u20E5\",\r\n \"bNot;\": \"\\u2AED\",\r\n \"bnot;\": \"\\u2310\",\r\n \"Bopf;\": \"\\uD835\\uDD39\",\r\n \"bopf;\": \"\\uD835\\uDD53\",\r\n \"bot;\": \"\\u22A5\",\r\n \"bottom;\": \"\\u22A5\",\r\n \"bowtie;\": \"\\u22C8\",\r\n \"boxbox;\": \"\\u29C9\",\r\n \"boxDL;\": \"\\u2557\",\r\n \"boxDl;\": \"\\u2556\",\r\n \"boxdL;\": \"\\u2555\",\r\n \"boxdl;\": \"\\u2510\",\r\n \"boxDR;\": \"\\u2554\",\r\n \"boxDr;\": \"\\u2553\",\r\n \"boxdR;\": \"\\u2552\",\r\n \"boxdr;\": \"\\u250C\",\r\n \"boxH;\": \"\\u2550\",\r\n \"boxh;\": \"\\u2500\",\r\n \"boxHD;\": \"\\u2566\",\r\n \"boxHd;\": \"\\u2564\",\r\n \"boxhD;\": \"\\u2565\",\r\n \"boxhd;\": \"\\u252C\",\r\n \"boxHU;\": \"\\u2569\",\r\n \"boxHu;\": \"\\u2567\",\r\n \"boxhU;\": \"\\u2568\",\r\n \"boxhu;\": \"\\u2534\",\r\n \"boxminus;\": \"\\u229F\",\r\n \"boxplus;\": \"\\u229E\",\r\n \"boxtimes;\": \"\\u22A0\",\r\n \"boxUL;\": \"\\u255D\",\r\n \"boxUl;\": \"\\u255C\",\r\n \"boxuL;\": \"\\u255B\",\r\n \"boxul;\": \"\\u2518\",\r\n \"boxUR;\": \"\\u255A\",\r\n \"boxUr;\": \"\\u2559\",\r\n \"boxuR;\": \"\\u2558\",\r\n \"boxur;\": \"\\u2514\",\r\n \"boxV;\": \"\\u2551\",\r\n \"boxv;\": \"\\u2502\",\r\n \"boxVH;\": \"\\u256C\",\r\n \"boxVh;\": \"\\u256B\",\r\n \"boxvH;\": \"\\u256A\",\r\n \"boxvh;\": \"\\u253C\",\r\n \"boxVL;\": \"\\u2563\",\r\n \"boxVl;\": \"\\u2562\",\r\n \"boxvL;\": \"\\u2561\",\r\n \"boxvl;\": \"\\u2524\",\r\n \"boxVR;\": \"\\u2560\",\r\n \"boxVr;\": \"\\u255F\",\r\n \"boxvR;\": \"\\u255E\",\r\n \"boxvr;\": \"\\u251C\",\r\n \"bprime;\": \"\\u2035\",\r\n \"Breve;\": \"\\u02D8\",\r\n \"breve;\": \"\\u02D8\",\r\n \"brvbar;\": \"\\u00A6\",\r\n \"brvbar\": \"\\u00A6\",\r\n \"Bscr;\": \"\\u212C\",\r\n \"bscr;\": \"\\uD835\\uDCB7\",\r\n \"bsemi;\": \"\\u204F\",\r\n \"bsim;\": \"\\u223D\",\r\n \"bsime;\": \"\\u22CD\",\r\n \"bsol;\": \"\\\\\",\r\n \"bsolb;\": \"\\u29C5\",\r\n \"bsolhsub;\": \"\\u27C8\",\r\n \"bull;\": \"\\u2022\",\r\n \"bullet;\": \"\\u2022\",\r\n \"bump;\": \"\\u224E\",\r\n \"bumpE;\": \"\\u2AAE\",\r\n \"bumpe;\": \"\\u224F\",\r\n \"Bumpeq;\": \"\\u224E\",\r\n \"bumpeq;\": \"\\u224F\",\r\n \"Cacute;\": \"\\u0106\",\r\n \"cacute;\": \"\\u0107\",\r\n \"Cap;\": \"\\u22D2\",\r\n \"cap;\": \"\\u2229\",\r\n \"capand;\": \"\\u2A44\",\r\n \"capbrcup;\": \"\\u2A49\",\r\n \"capcap;\": \"\\u2A4B\",\r\n \"capcup;\": \"\\u2A47\",\r\n \"capdot;\": \"\\u2A40\",\r\n \"CapitalDifferentialD;\": \"\\u2145\",\r\n \"caps;\": \"\\u2229\\uFE00\",\r\n \"caret;\": \"\\u2041\",\r\n \"caron;\": \"\\u02C7\",\r\n \"Cayleys;\": \"\\u212D\",\r\n \"ccaps;\": \"\\u2A4D\",\r\n \"Ccaron;\": \"\\u010C\",\r\n \"ccaron;\": \"\\u010D\",\r\n \"Ccedil;\": \"\\u00C7\",\r\n \"Ccedil\": \"\\u00C7\",\r\n \"ccedil;\": \"\\u00E7\",\r\n \"ccedil\": \"\\u00E7\",\r\n \"Ccirc;\": \"\\u0108\",\r\n \"ccirc;\": \"\\u0109\",\r\n \"Cconint;\": \"\\u2230\",\r\n \"ccups;\": \"\\u2A4C\",\r\n \"ccupssm;\": \"\\u2A50\",\r\n \"Cdot;\": \"\\u010A\",\r\n \"cdot;\": \"\\u010B\",\r\n \"cedil;\": \"\\u00B8\",\r\n \"cedil\": \"\\u00B8\",\r\n \"Cedilla;\": \"\\u00B8\",\r\n \"cemptyv;\": \"\\u29B2\",\r\n \"cent;\": \"\\u00A2\",\r\n \"cent\": \"\\u00A2\",\r\n \"CenterDot;\": \"\\u00B7\",\r\n \"centerdot;\": \"\\u00B7\",\r\n \"Cfr;\": \"\\u212D\",\r\n \"cfr;\": \"\\uD835\\uDD20\",\r\n \"CHcy;\": \"\\u0427\",\r\n \"chcy;\": \"\\u0447\",\r\n \"check;\": \"\\u2713\",\r\n \"checkmark;\": \"\\u2713\",\r\n \"Chi;\": \"\\u03A7\",\r\n \"chi;\": \"\\u03C7\",\r\n \"cir;\": \"\\u25CB\",\r\n \"circ;\": \"\\u02C6\",\r\n \"circeq;\": \"\\u2257\",\r\n \"circlearrowleft;\": \"\\u21BA\",\r\n \"circlearrowright;\": \"\\u21BB\",\r\n \"circledast;\": \"\\u229B\",\r\n \"circledcirc;\": \"\\u229A\",\r\n \"circleddash;\": \"\\u229D\",\r\n \"CircleDot;\": \"\\u2299\",\r\n \"circledR;\": \"\\u00AE\",\r\n \"circledS;\": \"\\u24C8\",\r\n \"CircleMinus;\": \"\\u2296\",\r\n \"CirclePlus;\": \"\\u2295\",\r\n \"CircleTimes;\": \"\\u2297\",\r\n \"cirE;\": \"\\u29C3\",\r\n \"cire;\": \"\\u2257\",\r\n \"cirfnint;\": \"\\u2A10\",\r\n \"cirmid;\": \"\\u2AEF\",\r\n \"cirscir;\": \"\\u29C2\",\r\n \"ClockwiseContourIntegral;\": \"\\u2232\",\r\n \"CloseCurlyDoubleQuote;\": \"\\u201D\",\r\n \"CloseCurlyQuote;\": \"\\u2019\",\r\n \"clubs;\": \"\\u2663\",\r\n \"clubsuit;\": \"\\u2663\",\r\n \"Colon;\": \"\\u2237\",\r\n \"colon;\": \":\",\r\n \"Colone;\": \"\\u2A74\",\r\n \"colone;\": \"\\u2254\",\r\n \"coloneq;\": \"\\u2254\",\r\n \"comma;\": \",\",\r\n \"commat;\": \"@\",\r\n \"comp;\": \"\\u2201\",\r\n \"compfn;\": \"\\u2218\",\r\n \"complement;\": \"\\u2201\",\r\n \"complexes;\": \"\\u2102\",\r\n \"cong;\": \"\\u2245\",\r\n \"congdot;\": \"\\u2A6D\",\r\n \"Congruent;\": \"\\u2261\",\r\n \"Conint;\": \"\\u222F\",\r\n \"conint;\": \"\\u222E\",\r\n \"ContourIntegral;\": \"\\u222E\",\r\n \"Copf;\": \"\\u2102\",\r\n \"copf;\": \"\\uD835\\uDD54\",\r\n \"coprod;\": \"\\u2210\",\r\n \"Coproduct;\": \"\\u2210\",\r\n \"COPY;\": \"\\u00A9\",\r\n \"COPY\": \"\\u00A9\",\r\n \"copy;\": \"\\u00A9\",\r\n \"copy\": \"\\u00A9\",\r\n \"copysr;\": \"\\u2117\",\r\n \"CounterClockwiseContourIntegral;\": \"\\u2233\",\r\n \"crarr;\": \"\\u21B5\",\r\n \"Cross;\": \"\\u2A2F\",\r\n \"cross;\": \"\\u2717\",\r\n \"Cscr;\": \"\\uD835\\uDC9E\",\r\n \"cscr;\": \"\\uD835\\uDCB8\",\r\n \"csub;\": \"\\u2ACF\",\r\n \"csube;\": \"\\u2AD1\",\r\n \"csup;\": \"\\u2AD0\",\r\n \"csupe;\": \"\\u2AD2\",\r\n \"ctdot;\": \"\\u22EF\",\r\n \"cudarrl;\": \"\\u2938\",\r\n \"cudarrr;\": \"\\u2935\",\r\n \"cuepr;\": \"\\u22DE\",\r\n \"cuesc;\": \"\\u22DF\",\r\n \"cularr;\": \"\\u21B6\",\r\n \"cularrp;\": \"\\u293D\",\r\n \"Cup;\": \"\\u22D3\",\r\n \"cup;\": \"\\u222A\",\r\n \"cupbrcap;\": \"\\u2A48\",\r\n \"CupCap;\": \"\\u224D\",\r\n \"cupcap;\": \"\\u2A46\",\r\n \"cupcup;\": \"\\u2A4A\",\r\n \"cupdot;\": \"\\u228D\",\r\n \"cupor;\": \"\\u2A45\",\r\n \"cups;\": \"\\u222A\\uFE00\",\r\n \"curarr;\": \"\\u21B7\",\r\n \"curarrm;\": \"\\u293C\",\r\n \"curlyeqprec;\": \"\\u22DE\",\r\n \"curlyeqsucc;\": \"\\u22DF\",\r\n \"curlyvee;\": \"\\u22CE\",\r\n \"curlywedge;\": \"\\u22CF\",\r\n \"curren;\": \"\\u00A4\",\r\n \"curren\": \"\\u00A4\",\r\n \"curvearrowleft;\": \"\\u21B6\",\r\n \"curvearrowright;\": \"\\u21B7\",\r\n \"cuvee;\": \"\\u22CE\",\r\n \"cuwed;\": \"\\u22CF\",\r\n \"cwconint;\": \"\\u2232\",\r\n \"cwint;\": \"\\u2231\",\r\n \"cylcty;\": \"\\u232D\",\r\n \"Dagger;\": \"\\u2021\",\r\n \"dagger;\": \"\\u2020\",\r\n \"daleth;\": \"\\u2138\",\r\n \"Darr;\": \"\\u21A1\",\r\n \"dArr;\": \"\\u21D3\",\r\n \"darr;\": \"\\u2193\",\r\n \"dash;\": \"\\u2010\",\r\n \"Dashv;\": \"\\u2AE4\",\r\n \"dashv;\": \"\\u22A3\",\r\n \"dbkarow;\": \"\\u290F\",\r\n \"dblac;\": \"\\u02DD\",\r\n \"Dcaron;\": \"\\u010E\",\r\n \"dcaron;\": \"\\u010F\",\r\n \"Dcy;\": \"\\u0414\",\r\n \"dcy;\": \"\\u0434\",\r\n \"DD;\": \"\\u2145\",\r\n \"dd;\": \"\\u2146\",\r\n \"ddagger;\": \"\\u2021\",\r\n \"ddarr;\": \"\\u21CA\",\r\n \"DDotrahd;\": \"\\u2911\",\r\n \"ddotseq;\": \"\\u2A77\",\r\n \"deg;\": \"\\u00B0\",\r\n \"deg\": \"\\u00B0\",\r\n \"Del;\": \"\\u2207\",\r\n \"Delta;\": \"\\u0394\",\r\n \"delta;\": \"\\u03B4\",\r\n \"demptyv;\": \"\\u29B1\",\r\n \"dfisht;\": \"\\u297F\",\r\n \"Dfr;\": \"\\uD835\\uDD07\",\r\n \"dfr;\": \"\\uD835\\uDD21\",\r\n \"dHar;\": \"\\u2965\",\r\n \"dharl;\": \"\\u21C3\",\r\n \"dharr;\": \"\\u21C2\",\r\n \"DiacriticalAcute;\": \"\\u00B4\",\r\n \"DiacriticalDot;\": \"\\u02D9\",\r\n \"DiacriticalDoubleAcute;\": \"\\u02DD\",\r\n \"DiacriticalGrave;\": \"`\",\r\n \"DiacriticalTilde;\": \"\\u02DC\",\r\n \"diam;\": \"\\u22C4\",\r\n \"Diamond;\": \"\\u22C4\",\r\n \"diamond;\": \"\\u22C4\",\r\n \"diamondsuit;\": \"\\u2666\",\r\n \"diams;\": \"\\u2666\",\r\n \"die;\": \"\\u00A8\",\r\n \"DifferentialD;\": \"\\u2146\",\r\n \"digamma;\": \"\\u03DD\",\r\n \"disin;\": \"\\u22F2\",\r\n \"div;\": \"\\u00F7\",\r\n \"divide;\": \"\\u00F7\",\r\n \"divide\": \"\\u00F7\",\r\n \"divideontimes;\": \"\\u22C7\",\r\n \"divonx;\": \"\\u22C7\",\r\n \"DJcy;\": \"\\u0402\",\r\n \"djcy;\": \"\\u0452\",\r\n \"dlcorn;\": \"\\u231E\",\r\n \"dlcrop;\": \"\\u230D\",\r\n \"dollar;\": \"$\",\r\n \"Dopf;\": \"\\uD835\\uDD3B\",\r\n \"dopf;\": \"\\uD835\\uDD55\",\r\n \"Dot;\": \"\\u00A8\",\r\n \"dot;\": \"\\u02D9\",\r\n \"DotDot;\": \"\\u20DC\",\r\n \"doteq;\": \"\\u2250\",\r\n \"doteqdot;\": \"\\u2251\",\r\n \"DotEqual;\": \"\\u2250\",\r\n \"dotminus;\": \"\\u2238\",\r\n \"dotplus;\": \"\\u2214\",\r\n \"dotsquare;\": \"\\u22A1\",\r\n \"doublebarwedge;\": \"\\u2306\",\r\n \"DoubleContourIntegral;\": \"\\u222F\",\r\n \"DoubleDot;\": \"\\u00A8\",\r\n \"DoubleDownArrow;\": \"\\u21D3\",\r\n \"DoubleLeftArrow;\": \"\\u21D0\",\r\n \"DoubleLeftRightArrow;\": \"\\u21D4\",\r\n \"DoubleLeftTee;\": \"\\u2AE4\",\r\n \"DoubleLongLeftArrow;\": \"\\u27F8\",\r\n \"DoubleLongLeftRightArrow;\": \"\\u27FA\",\r\n \"DoubleLongRightArrow;\": \"\\u27F9\",\r\n \"DoubleRightArrow;\": \"\\u21D2\",\r\n \"DoubleRightTee;\": \"\\u22A8\",\r\n \"DoubleUpArrow;\": \"\\u21D1\",\r\n \"DoubleUpDownArrow;\": \"\\u21D5\",\r\n \"DoubleVerticalBar;\": \"\\u2225\",\r\n \"DownArrow;\": \"\\u2193\",\r\n \"Downarrow;\": \"\\u21D3\",\r\n \"downarrow;\": \"\\u2193\",\r\n \"DownArrowBar;\": \"\\u2913\",\r\n \"DownArrowUpArrow;\": \"\\u21F5\",\r\n \"DownBreve;\": \"\\u0311\",\r\n \"downdownarrows;\": \"\\u21CA\",\r\n \"downharpoonleft;\": \"\\u21C3\",\r\n \"downharpoonright;\": \"\\u21C2\",\r\n \"DownLeftRightVector;\": \"\\u2950\",\r\n \"DownLeftTeeVector;\": \"\\u295E\",\r\n \"DownLeftVector;\": \"\\u21BD\",\r\n \"DownLeftVectorBar;\": \"\\u2956\",\r\n \"DownRightTeeVector;\": \"\\u295F\",\r\n \"DownRightVector;\": \"\\u21C1\",\r\n \"DownRightVectorBar;\": \"\\u2957\",\r\n \"DownTee;\": \"\\u22A4\",\r\n \"DownTeeArrow;\": \"\\u21A7\",\r\n \"drbkarow;\": \"\\u2910\",\r\n \"drcorn;\": \"\\u231F\",\r\n \"drcrop;\": \"\\u230C\",\r\n \"Dscr;\": \"\\uD835\\uDC9F\",\r\n \"dscr;\": \"\\uD835\\uDCB9\",\r\n \"DScy;\": \"\\u0405\",\r\n \"dscy;\": \"\\u0455\",\r\n \"dsol;\": \"\\u29F6\",\r\n \"Dstrok;\": \"\\u0110\",\r\n \"dstrok;\": \"\\u0111\",\r\n \"dtdot;\": \"\\u22F1\",\r\n \"dtri;\": \"\\u25BF\",\r\n \"dtrif;\": \"\\u25BE\",\r\n \"duarr;\": \"\\u21F5\",\r\n \"duhar;\": \"\\u296F\",\r\n \"dwangle;\": \"\\u29A6\",\r\n \"DZcy;\": \"\\u040F\",\r\n \"dzcy;\": \"\\u045F\",\r\n \"dzigrarr;\": \"\\u27FF\",\r\n \"Eacute;\": \"\\u00C9\",\r\n \"Eacute\": \"\\u00C9\",\r\n \"eacute;\": \"\\u00E9\",\r\n \"eacute\": \"\\u00E9\",\r\n \"easter;\": \"\\u2A6E\",\r\n \"Ecaron;\": \"\\u011A\",\r\n \"ecaron;\": \"\\u011B\",\r\n \"ecir;\": \"\\u2256\",\r\n \"Ecirc;\": \"\\u00CA\",\r\n \"Ecirc\": \"\\u00CA\",\r\n \"ecirc;\": \"\\u00EA\",\r\n \"ecirc\": \"\\u00EA\",\r\n \"ecolon;\": \"\\u2255\",\r\n \"Ecy;\": \"\\u042D\",\r\n \"ecy;\": \"\\u044D\",\r\n \"eDDot;\": \"\\u2A77\",\r\n \"Edot;\": \"\\u0116\",\r\n \"eDot;\": \"\\u2251\",\r\n \"edot;\": \"\\u0117\",\r\n \"ee;\": \"\\u2147\",\r\n \"efDot;\": \"\\u2252\",\r\n \"Efr;\": \"\\uD835\\uDD08\",\r\n \"efr;\": \"\\uD835\\uDD22\",\r\n \"eg;\": \"\\u2A9A\",\r\n \"Egrave;\": \"\\u00C8\",\r\n \"Egrave\": \"\\u00C8\",\r\n \"egrave;\": \"\\u00E8\",\r\n \"egrave\": \"\\u00E8\",\r\n \"egs;\": \"\\u2A96\",\r\n \"egsdot;\": \"\\u2A98\",\r\n \"el;\": \"\\u2A99\",\r\n \"Element;\": \"\\u2208\",\r\n \"elinters;\": \"\\u23E7\",\r\n \"ell;\": \"\\u2113\",\r\n \"els;\": \"\\u2A95\",\r\n \"elsdot;\": \"\\u2A97\",\r\n \"Emacr;\": \"\\u0112\",\r\n \"emacr;\": \"\\u0113\",\r\n \"empty;\": \"\\u2205\",\r\n \"emptyset;\": \"\\u2205\",\r\n \"EmptySmallSquare;\": \"\\u25FB\",\r\n \"emptyv;\": \"\\u2205\",\r\n \"EmptyVerySmallSquare;\": \"\\u25AB\",\r\n \"emsp;\": \"\\u2003\",\r\n \"emsp13;\": \"\\u2004\",\r\n \"emsp14;\": \"\\u2005\",\r\n \"ENG;\": \"\\u014A\",\r\n \"eng;\": \"\\u014B\",\r\n \"ensp;\": \"\\u2002\",\r\n \"Eogon;\": \"\\u0118\",\r\n \"eogon;\": \"\\u0119\",\r\n \"Eopf;\": \"\\uD835\\uDD3C\",\r\n \"eopf;\": \"\\uD835\\uDD56\",\r\n \"epar;\": \"\\u22D5\",\r\n \"eparsl;\": \"\\u29E3\",\r\n \"eplus;\": \"\\u2A71\",\r\n \"epsi;\": \"\\u03B5\",\r\n \"Epsilon;\": \"\\u0395\",\r\n \"epsilon;\": \"\\u03B5\",\r\n \"epsiv;\": \"\\u03F5\",\r\n \"eqcirc;\": \"\\u2256\",\r\n \"eqcolon;\": \"\\u2255\",\r\n \"eqsim;\": \"\\u2242\",\r\n \"eqslantgtr;\": \"\\u2A96\",\r\n \"eqslantless;\": \"\\u2A95\",\r\n \"Equal;\": \"\\u2A75\",\r\n \"equals;\": \"=\",\r\n \"EqualTilde;\": \"\\u2242\",\r\n \"equest;\": \"\\u225F\",\r\n \"Equilibrium;\": \"\\u21CC\",\r\n \"equiv;\": \"\\u2261\",\r\n \"equivDD;\": \"\\u2A78\",\r\n \"eqvparsl;\": \"\\u29E5\",\r\n \"erarr;\": \"\\u2971\",\r\n \"erDot;\": \"\\u2253\",\r\n \"Escr;\": \"\\u2130\",\r\n \"escr;\": \"\\u212F\",\r\n \"esdot;\": \"\\u2250\",\r\n \"Esim;\": \"\\u2A73\",\r\n \"esim;\": \"\\u2242\",\r\n \"Eta;\": \"\\u0397\",\r\n \"eta;\": \"\\u03B7\",\r\n \"ETH;\": \"\\u00D0\",\r\n \"ETH\": \"\\u00D0\",\r\n \"eth;\": \"\\u00F0\",\r\n \"eth\": \"\\u00F0\",\r\n \"Euml;\": \"\\u00CB\",\r\n \"Euml\": \"\\u00CB\",\r\n \"euml;\": \"\\u00EB\",\r\n \"euml\": \"\\u00EB\",\r\n \"euro;\": \"\\u20AC\",\r\n \"excl;\": \"!\",\r\n \"exist;\": \"\\u2203\",\r\n \"Exists;\": \"\\u2203\",\r\n \"expectation;\": \"\\u2130\",\r\n \"ExponentialE;\": \"\\u2147\",\r\n \"exponentiale;\": \"\\u2147\",\r\n \"fallingdotseq;\": \"\\u2252\",\r\n \"Fcy;\": \"\\u0424\",\r\n \"fcy;\": \"\\u0444\",\r\n \"female;\": \"\\u2640\",\r\n \"ffilig;\": \"\\uFB03\",\r\n \"fflig;\": \"\\uFB00\",\r\n \"ffllig;\": \"\\uFB04\",\r\n \"Ffr;\": \"\\uD835\\uDD09\",\r\n \"ffr;\": \"\\uD835\\uDD23\",\r\n \"filig;\": \"\\uFB01\",\r\n \"FilledSmallSquare;\": \"\\u25FC\",\r\n \"FilledVerySmallSquare;\": \"\\u25AA\",\r\n \"fjlig;\": \"fj\",\r\n \"flat;\": \"\\u266D\",\r\n \"fllig;\": \"\\uFB02\",\r\n \"fltns;\": \"\\u25B1\",\r\n \"fnof;\": \"\\u0192\",\r\n \"Fopf;\": \"\\uD835\\uDD3D\",\r\n \"fopf;\": \"\\uD835\\uDD57\",\r\n \"ForAll;\": \"\\u2200\",\r\n \"forall;\": \"\\u2200\",\r\n \"fork;\": \"\\u22D4\",\r\n \"forkv;\": \"\\u2AD9\",\r\n \"Fouriertrf;\": \"\\u2131\",\r\n \"fpartint;\": \"\\u2A0D\",\r\n \"frac12;\": \"\\u00BD\",\r\n \"frac12\": \"\\u00BD\",\r\n \"frac13;\": \"\\u2153\",\r\n \"frac14;\": \"\\u00BC\",\r\n \"frac14\": \"\\u00BC\",\r\n \"frac15;\": \"\\u2155\",\r\n \"frac16;\": \"\\u2159\",\r\n \"frac18;\": \"\\u215B\",\r\n \"frac23;\": \"\\u2154\",\r\n \"frac25;\": \"\\u2156\",\r\n \"frac34;\": \"\\u00BE\",\r\n \"frac34\": \"\\u00BE\",\r\n \"frac35;\": \"\\u2157\",\r\n \"frac38;\": \"\\u215C\",\r\n \"frac45;\": \"\\u2158\",\r\n \"frac56;\": \"\\u215A\",\r\n \"frac58;\": \"\\u215D\",\r\n \"frac78;\": \"\\u215E\",\r\n \"frasl;\": \"\\u2044\",\r\n \"frown;\": \"\\u2322\",\r\n \"Fscr;\": \"\\u2131\",\r\n \"fscr;\": \"\\uD835\\uDCBB\",\r\n \"gacute;\": \"\\u01F5\",\r\n \"Gamma;\": \"\\u0393\",\r\n \"gamma;\": \"\\u03B3\",\r\n \"Gammad;\": \"\\u03DC\",\r\n \"gammad;\": \"\\u03DD\",\r\n \"gap;\": \"\\u2A86\",\r\n \"Gbreve;\": \"\\u011E\",\r\n \"gbreve;\": \"\\u011F\",\r\n \"Gcedil;\": \"\\u0122\",\r\n \"Gcirc;\": \"\\u011C\",\r\n \"gcirc;\": \"\\u011D\",\r\n \"Gcy;\": \"\\u0413\",\r\n \"gcy;\": \"\\u0433\",\r\n \"Gdot;\": \"\\u0120\",\r\n \"gdot;\": \"\\u0121\",\r\n \"gE;\": \"\\u2267\",\r\n \"ge;\": \"\\u2265\",\r\n \"gEl;\": \"\\u2A8C\",\r\n \"gel;\": \"\\u22DB\",\r\n \"geq;\": \"\\u2265\",\r\n \"geqq;\": \"\\u2267\",\r\n \"geqslant;\": \"\\u2A7E\",\r\n \"ges;\": \"\\u2A7E\",\r\n \"gescc;\": \"\\u2AA9\",\r\n \"gesdot;\": \"\\u2A80\",\r\n \"gesdoto;\": \"\\u2A82\",\r\n \"gesdotol;\": \"\\u2A84\",\r\n \"gesl;\": \"\\u22DB\\uFE00\",\r\n \"gesles;\": \"\\u2A94\",\r\n \"Gfr;\": \"\\uD835\\uDD0A\",\r\n \"gfr;\": \"\\uD835\\uDD24\",\r\n \"Gg;\": \"\\u22D9\",\r\n \"gg;\": \"\\u226B\",\r\n \"ggg;\": \"\\u22D9\",\r\n \"gimel;\": \"\\u2137\",\r\n \"GJcy;\": \"\\u0403\",\r\n \"gjcy;\": \"\\u0453\",\r\n \"gl;\": \"\\u2277\",\r\n \"gla;\": \"\\u2AA5\",\r\n \"glE;\": \"\\u2A92\",\r\n \"glj;\": \"\\u2AA4\",\r\n \"gnap;\": \"\\u2A8A\",\r\n \"gnapprox;\": \"\\u2A8A\",\r\n \"gnE;\": \"\\u2269\",\r\n \"gne;\": \"\\u2A88\",\r\n \"gneq;\": \"\\u2A88\",\r\n \"gneqq;\": \"\\u2269\",\r\n \"gnsim;\": \"\\u22E7\",\r\n \"Gopf;\": \"\\uD835\\uDD3E\",\r\n \"gopf;\": \"\\uD835\\uDD58\",\r\n \"grave;\": \"`\",\r\n \"GreaterEqual;\": \"\\u2265\",\r\n \"GreaterEqualLess;\": \"\\u22DB\",\r\n \"GreaterFullEqual;\": \"\\u2267\",\r\n \"GreaterGreater;\": \"\\u2AA2\",\r\n \"GreaterLess;\": \"\\u2277\",\r\n \"GreaterSlantEqual;\": \"\\u2A7E\",\r\n \"GreaterTilde;\": \"\\u2273\",\r\n \"Gscr;\": \"\\uD835\\uDCA2\",\r\n \"gscr;\": \"\\u210A\",\r\n \"gsim;\": \"\\u2273\",\r\n \"gsime;\": \"\\u2A8E\",\r\n \"gsiml;\": \"\\u2A90\",\r\n \"GT;\": \">\",\r\n \"GT\": \">\",\r\n \"Gt;\": \"\\u226B\",\r\n \"gt;\": \">\",\r\n \"gt\": \">\",\r\n \"gtcc;\": \"\\u2AA7\",\r\n \"gtcir;\": \"\\u2A7A\",\r\n \"gtdot;\": \"\\u22D7\",\r\n \"gtlPar;\": \"\\u2995\",\r\n \"gtquest;\": \"\\u2A7C\",\r\n \"gtrapprox;\": \"\\u2A86\",\r\n \"gtrarr;\": \"\\u2978\",\r\n \"gtrdot;\": \"\\u22D7\",\r\n \"gtreqless;\": \"\\u22DB\",\r\n \"gtreqqless;\": \"\\u2A8C\",\r\n \"gtrless;\": \"\\u2277\",\r\n \"gtrsim;\": \"\\u2273\",\r\n \"gvertneqq;\": \"\\u2269\\uFE00\",\r\n \"gvnE;\": \"\\u2269\\uFE00\",\r\n \"Hacek;\": \"\\u02C7\",\r\n \"hairsp;\": \"\\u200A\",\r\n \"half;\": \"\\u00BD\",\r\n \"hamilt;\": \"\\u210B\",\r\n \"HARDcy;\": \"\\u042A\",\r\n \"hardcy;\": \"\\u044A\",\r\n \"hArr;\": \"\\u21D4\",\r\n \"harr;\": \"\\u2194\",\r\n \"harrcir;\": \"\\u2948\",\r\n \"harrw;\": \"\\u21AD\",\r\n \"Hat;\": \"^\",\r\n \"hbar;\": \"\\u210F\",\r\n \"Hcirc;\": \"\\u0124\",\r\n \"hcirc;\": \"\\u0125\",\r\n \"hearts;\": \"\\u2665\",\r\n \"heartsuit;\": \"\\u2665\",\r\n \"hellip;\": \"\\u2026\",\r\n \"hercon;\": \"\\u22B9\",\r\n \"Hfr;\": \"\\u210C\",\r\n \"hfr;\": \"\\uD835\\uDD25\",\r\n \"HilbertSpace;\": \"\\u210B\",\r\n \"hksearow;\": \"\\u2925\",\r\n \"hkswarow;\": \"\\u2926\",\r\n \"hoarr;\": \"\\u21FF\",\r\n \"homtht;\": \"\\u223B\",\r\n \"hookleftarrow;\": \"\\u21A9\",\r\n \"hookrightarrow;\": \"\\u21AA\",\r\n \"Hopf;\": \"\\u210D\",\r\n \"hopf;\": \"\\uD835\\uDD59\",\r\n \"horbar;\": \"\\u2015\",\r\n \"HorizontalLine;\": \"\\u2500\",\r\n \"Hscr;\": \"\\u210B\",\r\n \"hscr;\": \"\\uD835\\uDCBD\",\r\n \"hslash;\": \"\\u210F\",\r\n \"Hstrok;\": \"\\u0126\",\r\n \"hstrok;\": \"\\u0127\",\r\n \"HumpDownHump;\": \"\\u224E\",\r\n \"HumpEqual;\": \"\\u224F\",\r\n \"hybull;\": \"\\u2043\",\r\n \"hyphen;\": \"\\u2010\",\r\n \"Iacute;\": \"\\u00CD\",\r\n \"Iacute\": \"\\u00CD\",\r\n \"iacute;\": \"\\u00ED\",\r\n \"iacute\": \"\\u00ED\",\r\n \"ic;\": \"\\u2063\",\r\n \"Icirc;\": \"\\u00CE\",\r\n \"Icirc\": \"\\u00CE\",\r\n \"icirc;\": \"\\u00EE\",\r\n \"icirc\": \"\\u00EE\",\r\n \"Icy;\": \"\\u0418\",\r\n \"icy;\": \"\\u0438\",\r\n \"Idot;\": \"\\u0130\",\r\n \"IEcy;\": \"\\u0415\",\r\n \"iecy;\": \"\\u0435\",\r\n \"iexcl;\": \"\\u00A1\",\r\n \"iexcl\": \"\\u00A1\",\r\n \"iff;\": \"\\u21D4\",\r\n \"Ifr;\": \"\\u2111\",\r\n \"ifr;\": \"\\uD835\\uDD26\",\r\n \"Igrave;\": \"\\u00CC\",\r\n \"Igrave\": \"\\u00CC\",\r\n \"igrave;\": \"\\u00EC\",\r\n \"igrave\": \"\\u00EC\",\r\n \"ii;\": \"\\u2148\",\r\n \"iiiint;\": \"\\u2A0C\",\r\n \"iiint;\": \"\\u222D\",\r\n \"iinfin;\": \"\\u29DC\",\r\n \"iiota;\": \"\\u2129\",\r\n \"IJlig;\": \"\\u0132\",\r\n \"ijlig;\": \"\\u0133\",\r\n \"Im;\": \"\\u2111\",\r\n \"Imacr;\": \"\\u012A\",\r\n \"imacr;\": \"\\u012B\",\r\n \"image;\": \"\\u2111\",\r\n \"ImaginaryI;\": \"\\u2148\",\r\n \"imagline;\": \"\\u2110\",\r\n \"imagpart;\": \"\\u2111\",\r\n \"imath;\": \"\\u0131\",\r\n \"imof;\": \"\\u22B7\",\r\n \"imped;\": \"\\u01B5\",\r\n \"Implies;\": \"\\u21D2\",\r\n \"in;\": \"\\u2208\",\r\n \"incare;\": \"\\u2105\",\r\n \"infin;\": \"\\u221E\",\r\n \"infintie;\": \"\\u29DD\",\r\n \"inodot;\": \"\\u0131\",\r\n \"Int;\": \"\\u222C\",\r\n \"int;\": \"\\u222B\",\r\n \"intcal;\": \"\\u22BA\",\r\n \"integers;\": \"\\u2124\",\r\n \"Integral;\": \"\\u222B\",\r\n \"intercal;\": \"\\u22BA\",\r\n \"Intersection;\": \"\\u22C2\",\r\n \"intlarhk;\": \"\\u2A17\",\r\n \"intprod;\": \"\\u2A3C\",\r\n \"InvisibleComma;\": \"\\u2063\",\r\n \"InvisibleTimes;\": \"\\u2062\",\r\n \"IOcy;\": \"\\u0401\",\r\n \"iocy;\": \"\\u0451\",\r\n \"Iogon;\": \"\\u012E\",\r\n \"iogon;\": \"\\u012F\",\r\n \"Iopf;\": \"\\uD835\\uDD40\",\r\n \"iopf;\": \"\\uD835\\uDD5A\",\r\n \"Iota;\": \"\\u0399\",\r\n \"iota;\": \"\\u03B9\",\r\n \"iprod;\": \"\\u2A3C\",\r\n \"iquest;\": \"\\u00BF\",\r\n \"iquest\": \"\\u00BF\",\r\n \"Iscr;\": \"\\u2110\",\r\n \"iscr;\": \"\\uD835\\uDCBE\",\r\n \"isin;\": \"\\u2208\",\r\n \"isindot;\": \"\\u22F5\",\r\n \"isinE;\": \"\\u22F9\",\r\n \"isins;\": \"\\u22F4\",\r\n \"isinsv;\": \"\\u22F3\",\r\n \"isinv;\": \"\\u2208\",\r\n \"it;\": \"\\u2062\",\r\n \"Itilde;\": \"\\u0128\",\r\n \"itilde;\": \"\\u0129\",\r\n \"Iukcy;\": \"\\u0406\",\r\n \"iukcy;\": \"\\u0456\",\r\n \"Iuml;\": \"\\u00CF\",\r\n \"Iuml\": \"\\u00CF\",\r\n \"iuml;\": \"\\u00EF\",\r\n \"iuml\": \"\\u00EF\",\r\n \"Jcirc;\": \"\\u0134\",\r\n \"jcirc;\": \"\\u0135\",\r\n \"Jcy;\": \"\\u0419\",\r\n \"jcy;\": \"\\u0439\",\r\n \"Jfr;\": \"\\uD835\\uDD0D\",\r\n \"jfr;\": \"\\uD835\\uDD27\",\r\n \"jmath;\": \"\\u0237\",\r\n \"Jopf;\": \"\\uD835\\uDD41\",\r\n \"jopf;\": \"\\uD835\\uDD5B\",\r\n \"Jscr;\": \"\\uD835\\uDCA5\",\r\n \"jscr;\": \"\\uD835\\uDCBF\",\r\n \"Jsercy;\": \"\\u0408\",\r\n \"jsercy;\": \"\\u0458\",\r\n \"Jukcy;\": \"\\u0404\",\r\n \"jukcy;\": \"\\u0454\",\r\n \"Kappa;\": \"\\u039A\",\r\n \"kappa;\": \"\\u03BA\",\r\n \"kappav;\": \"\\u03F0\",\r\n \"Kcedil;\": \"\\u0136\",\r\n \"kcedil;\": \"\\u0137\",\r\n \"Kcy;\": \"\\u041A\",\r\n \"kcy;\": \"\\u043A\",\r\n \"Kfr;\": \"\\uD835\\uDD0E\",\r\n \"kfr;\": \"\\uD835\\uDD28\",\r\n \"kgreen;\": \"\\u0138\",\r\n \"KHcy;\": \"\\u0425\",\r\n \"khcy;\": \"\\u0445\",\r\n \"KJcy;\": \"\\u040C\",\r\n \"kjcy;\": \"\\u045C\",\r\n \"Kopf;\": \"\\uD835\\uDD42\",\r\n \"kopf;\": \"\\uD835\\uDD5C\",\r\n \"Kscr;\": \"\\uD835\\uDCA6\",\r\n \"kscr;\": \"\\uD835\\uDCC0\",\r\n \"lAarr;\": \"\\u21DA\",\r\n \"Lacute;\": \"\\u0139\",\r\n \"lacute;\": \"\\u013A\",\r\n \"laemptyv;\": \"\\u29B4\",\r\n \"lagran;\": \"\\u2112\",\r\n \"Lambda;\": \"\\u039B\",\r\n \"lambda;\": \"\\u03BB\",\r\n \"Lang;\": \"\\u27EA\",\r\n \"lang;\": \"\\u27E8\",\r\n \"langd;\": \"\\u2991\",\r\n \"langle;\": \"\\u27E8\",\r\n \"lap;\": \"\\u2A85\",\r\n \"Laplacetrf;\": \"\\u2112\",\r\n \"laquo;\": \"\\u00AB\",\r\n \"laquo\": \"\\u00AB\",\r\n \"Larr;\": \"\\u219E\",\r\n \"lArr;\": \"\\u21D0\",\r\n \"larr;\": \"\\u2190\",\r\n \"larrb;\": \"\\u21E4\",\r\n \"larrbfs;\": \"\\u291F\",\r\n \"larrfs;\": \"\\u291D\",\r\n \"larrhk;\": \"\\u21A9\",\r\n \"larrlp;\": \"\\u21AB\",\r\n \"larrpl;\": \"\\u2939\",\r\n \"larrsim;\": \"\\u2973\",\r\n \"larrtl;\": \"\\u21A2\",\r\n \"lat;\": \"\\u2AAB\",\r\n \"lAtail;\": \"\\u291B\",\r\n \"latail;\": \"\\u2919\",\r\n \"late;\": \"\\u2AAD\",\r\n \"lates;\": \"\\u2AAD\\uFE00\",\r\n \"lBarr;\": \"\\u290E\",\r\n \"lbarr;\": \"\\u290C\",\r\n \"lbbrk;\": \"\\u2772\",\r\n \"lbrace;\": \"{\",\r\n \"lbrack;\": \"[\",\r\n \"lbrke;\": \"\\u298B\",\r\n \"lbrksld;\": \"\\u298F\",\r\n \"lbrkslu;\": \"\\u298D\",\r\n \"Lcaron;\": \"\\u013D\",\r\n \"lcaron;\": \"\\u013E\",\r\n \"Lcedil;\": \"\\u013B\",\r\n \"lcedil;\": \"\\u013C\",\r\n \"lceil;\": \"\\u2308\",\r\n \"lcub;\": \"{\",\r\n \"Lcy;\": \"\\u041B\",\r\n \"lcy;\": \"\\u043B\",\r\n \"ldca;\": \"\\u2936\",\r\n \"ldquo;\": \"\\u201C\",\r\n \"ldquor;\": \"\\u201E\",\r\n \"ldrdhar;\": \"\\u2967\",\r\n \"ldrushar;\": \"\\u294B\",\r\n \"ldsh;\": \"\\u21B2\",\r\n \"lE;\": \"\\u2266\",\r\n \"le;\": \"\\u2264\",\r\n \"LeftAngleBracket;\": \"\\u27E8\",\r\n \"LeftArrow;\": \"\\u2190\",\r\n \"Leftarrow;\": \"\\u21D0\",\r\n \"leftarrow;\": \"\\u2190\",\r\n \"LeftArrowBar;\": \"\\u21E4\",\r\n \"LeftArrowRightArrow;\": \"\\u21C6\",\r\n \"leftarrowtail;\": \"\\u21A2\",\r\n \"LeftCeiling;\": \"\\u2308\",\r\n \"LeftDoubleBracket;\": \"\\u27E6\",\r\n \"LeftDownTeeVector;\": \"\\u2961\",\r\n \"LeftDownVector;\": \"\\u21C3\",\r\n \"LeftDownVectorBar;\": \"\\u2959\",\r\n \"LeftFloor;\": \"\\u230A\",\r\n \"leftharpoondown;\": \"\\u21BD\",\r\n \"leftharpoonup;\": \"\\u21BC\",\r\n \"leftleftarrows;\": \"\\u21C7\",\r\n \"LeftRightArrow;\": \"\\u2194\",\r\n \"Leftrightarrow;\": \"\\u21D4\",\r\n \"leftrightarrow;\": \"\\u2194\",\r\n \"leftrightarrows;\": \"\\u21C6\",\r\n \"leftrightharpoons;\": \"\\u21CB\",\r\n \"leftrightsquigarrow;\": \"\\u21AD\",\r\n \"LeftRightVector;\": \"\\u294E\",\r\n \"LeftTee;\": \"\\u22A3\",\r\n \"LeftTeeArrow;\": \"\\u21A4\",\r\n \"LeftTeeVector;\": \"\\u295A\",\r\n \"leftthreetimes;\": \"\\u22CB\",\r\n \"LeftTriangle;\": \"\\u22B2\",\r\n \"LeftTriangleBar;\": \"\\u29CF\",\r\n \"LeftTriangleEqual;\": \"\\u22B4\",\r\n \"LeftUpDownVector;\": \"\\u2951\",\r\n \"LeftUpTeeVector;\": \"\\u2960\",\r\n \"LeftUpVector;\": \"\\u21BF\",\r\n \"LeftUpVectorBar;\": \"\\u2958\",\r\n \"LeftVector;\": \"\\u21BC\",\r\n \"LeftVectorBar;\": \"\\u2952\",\r\n \"lEg;\": \"\\u2A8B\",\r\n \"leg;\": \"\\u22DA\",\r\n \"leq;\": \"\\u2264\",\r\n \"leqq;\": \"\\u2266\",\r\n \"leqslant;\": \"\\u2A7D\",\r\n \"les;\": \"\\u2A7D\",\r\n \"lescc;\": \"\\u2AA8\",\r\n \"lesdot;\": \"\\u2A7F\",\r\n \"lesdoto;\": \"\\u2A81\",\r\n \"lesdotor;\": \"\\u2A83\",\r\n \"lesg;\": \"\\u22DA\\uFE00\",\r\n \"lesges;\": \"\\u2A93\",\r\n \"lessapprox;\": \"\\u2A85\",\r\n \"lessdot;\": \"\\u22D6\",\r\n \"lesseqgtr;\": \"\\u22DA\",\r\n \"lesseqqgtr;\": \"\\u2A8B\",\r\n \"LessEqualGreater;\": \"\\u22DA\",\r\n \"LessFullEqual;\": \"\\u2266\",\r\n \"LessGreater;\": \"\\u2276\",\r\n \"lessgtr;\": \"\\u2276\",\r\n \"LessLess;\": \"\\u2AA1\",\r\n \"lesssim;\": \"\\u2272\",\r\n \"LessSlantEqual;\": \"\\u2A7D\",\r\n \"LessTilde;\": \"\\u2272\",\r\n \"lfisht;\": \"\\u297C\",\r\n \"lfloor;\": \"\\u230A\",\r\n \"Lfr;\": \"\\uD835\\uDD0F\",\r\n \"lfr;\": \"\\uD835\\uDD29\",\r\n \"lg;\": \"\\u2276\",\r\n \"lgE;\": \"\\u2A91\",\r\n \"lHar;\": \"\\u2962\",\r\n \"lhard;\": \"\\u21BD\",\r\n \"lharu;\": \"\\u21BC\",\r\n \"lharul;\": \"\\u296A\",\r\n \"lhblk;\": \"\\u2584\",\r\n \"LJcy;\": \"\\u0409\",\r\n \"ljcy;\": \"\\u0459\",\r\n \"Ll;\": \"\\u22D8\",\r\n \"ll;\": \"\\u226A\",\r\n \"llarr;\": \"\\u21C7\",\r\n \"llcorner;\": \"\\u231E\",\r\n \"Lleftarrow;\": \"\\u21DA\",\r\n \"llhard;\": \"\\u296B\",\r\n \"lltri;\": \"\\u25FA\",\r\n \"Lmidot;\": \"\\u013F\",\r\n \"lmidot;\": \"\\u0140\",\r\n \"lmoust;\": \"\\u23B0\",\r\n \"lmoustache;\": \"\\u23B0\",\r\n \"lnap;\": \"\\u2A89\",\r\n \"lnapprox;\": \"\\u2A89\",\r\n \"lnE;\": \"\\u2268\",\r\n \"lne;\": \"\\u2A87\",\r\n \"lneq;\": \"\\u2A87\",\r\n \"lneqq;\": \"\\u2268\",\r\n \"lnsim;\": \"\\u22E6\",\r\n \"loang;\": \"\\u27EC\",\r\n \"loarr;\": \"\\u21FD\",\r\n \"lobrk;\": \"\\u27E6\",\r\n \"LongLeftArrow;\": \"\\u27F5\",\r\n \"Longleftarrow;\": \"\\u27F8\",\r\n \"longleftarrow;\": \"\\u27F5\",\r\n \"LongLeftRightArrow;\": \"\\u27F7\",\r\n \"Longleftrightarrow;\": \"\\u27FA\",\r\n \"longleftrightarrow;\": \"\\u27F7\",\r\n \"longmapsto;\": \"\\u27FC\",\r\n \"LongRightArrow;\": \"\\u27F6\",\r\n \"Longrightarrow;\": \"\\u27F9\",\r\n \"longrightarrow;\": \"\\u27F6\",\r\n \"looparrowleft;\": \"\\u21AB\",\r\n \"looparrowright;\": \"\\u21AC\",\r\n \"lopar;\": \"\\u2985\",\r\n \"Lopf;\": \"\\uD835\\uDD43\",\r\n \"lopf;\": \"\\uD835\\uDD5D\",\r\n \"loplus;\": \"\\u2A2D\",\r\n \"lotimes;\": \"\\u2A34\",\r\n \"lowast;\": \"\\u2217\",\r\n \"lowbar;\": \"_\",\r\n \"LowerLeftArrow;\": \"\\u2199\",\r\n \"LowerRightArrow;\": \"\\u2198\",\r\n \"loz;\": \"\\u25CA\",\r\n \"lozenge;\": \"\\u25CA\",\r\n \"lozf;\": \"\\u29EB\",\r\n \"lpar;\": \"(\",\r\n \"lparlt;\": \"\\u2993\",\r\n \"lrarr;\": \"\\u21C6\",\r\n \"lrcorner;\": \"\\u231F\",\r\n \"lrhar;\": \"\\u21CB\",\r\n \"lrhard;\": \"\\u296D\",\r\n \"lrm;\": \"\\u200E\",\r\n \"lrtri;\": \"\\u22BF\",\r\n \"lsaquo;\": \"\\u2039\",\r\n \"Lscr;\": \"\\u2112\",\r\n \"lscr;\": \"\\uD835\\uDCC1\",\r\n \"Lsh;\": \"\\u21B0\",\r\n \"lsh;\": \"\\u21B0\",\r\n \"lsim;\": \"\\u2272\",\r\n \"lsime;\": \"\\u2A8D\",\r\n \"lsimg;\": \"\\u2A8F\",\r\n \"lsqb;\": \"[\",\r\n \"lsquo;\": \"\\u2018\",\r\n \"lsquor;\": \"\\u201A\",\r\n \"Lstrok;\": \"\\u0141\",\r\n \"lstrok;\": \"\\u0142\",\r\n \"LT;\": \"<\",\r\n \"LT\": \"<\",\r\n \"Lt;\": \"\\u226A\",\r\n \"lt;\": \"<\",\r\n \"lt\": \"<\",\r\n \"ltcc;\": \"\\u2AA6\",\r\n \"ltcir;\": \"\\u2A79\",\r\n \"ltdot;\": \"\\u22D6\",\r\n \"lthree;\": \"\\u22CB\",\r\n \"ltimes;\": \"\\u22C9\",\r\n \"ltlarr;\": \"\\u2976\",\r\n \"ltquest;\": \"\\u2A7B\",\r\n \"ltri;\": \"\\u25C3\",\r\n \"ltrie;\": \"\\u22B4\",\r\n \"ltrif;\": \"\\u25C2\",\r\n \"ltrPar;\": \"\\u2996\",\r\n \"lurdshar;\": \"\\u294A\",\r\n \"luruhar;\": \"\\u2966\",\r\n \"lvertneqq;\": \"\\u2268\\uFE00\",\r\n \"lvnE;\": \"\\u2268\\uFE00\",\r\n \"macr;\": \"\\u00AF\",\r\n \"macr\": \"\\u00AF\",\r\n \"male;\": \"\\u2642\",\r\n \"malt;\": \"\\u2720\",\r\n \"maltese;\": \"\\u2720\",\r\n \"Map;\": \"\\u2905\",\r\n \"map;\": \"\\u21A6\",\r\n \"mapsto;\": \"\\u21A6\",\r\n \"mapstodown;\": \"\\u21A7\",\r\n \"mapstoleft;\": \"\\u21A4\",\r\n \"mapstoup;\": \"\\u21A5\",\r\n \"marker;\": \"\\u25AE\",\r\n \"mcomma;\": \"\\u2A29\",\r\n \"Mcy;\": \"\\u041C\",\r\n \"mcy;\": \"\\u043C\",\r\n \"mdash;\": \"\\u2014\",\r\n \"mDDot;\": \"\\u223A\",\r\n \"measuredangle;\": \"\\u2221\",\r\n \"MediumSpace;\": \"\\u205F\",\r\n \"Mellintrf;\": \"\\u2133\",\r\n \"Mfr;\": \"\\uD835\\uDD10\",\r\n \"mfr;\": \"\\uD835\\uDD2A\",\r\n \"mho;\": \"\\u2127\",\r\n \"micro;\": \"\\u00B5\",\r\n \"micro\": \"\\u00B5\",\r\n \"mid;\": \"\\u2223\",\r\n \"midast;\": \"*\",\r\n \"midcir;\": \"\\u2AF0\",\r\n \"middot;\": \"\\u00B7\",\r\n \"middot\": \"\\u00B7\",\r\n \"minus;\": \"\\u2212\",\r\n \"minusb;\": \"\\u229F\",\r\n \"minusd;\": \"\\u2238\",\r\n \"minusdu;\": \"\\u2A2A\",\r\n \"MinusPlus;\": \"\\u2213\",\r\n \"mlcp;\": \"\\u2ADB\",\r\n \"mldr;\": \"\\u2026\",\r\n \"mnplus;\": \"\\u2213\",\r\n \"models;\": \"\\u22A7\",\r\n \"Mopf;\": \"\\uD835\\uDD44\",\r\n \"mopf;\": \"\\uD835\\uDD5E\",\r\n \"mp;\": \"\\u2213\",\r\n \"Mscr;\": \"\\u2133\",\r\n \"mscr;\": \"\\uD835\\uDCC2\",\r\n \"mstpos;\": \"\\u223E\",\r\n \"Mu;\": \"\\u039C\",\r\n \"mu;\": \"\\u03BC\",\r\n \"multimap;\": \"\\u22B8\",\r\n \"mumap;\": \"\\u22B8\",\r\n \"nabla;\": \"\\u2207\",\r\n \"Nacute;\": \"\\u0143\",\r\n \"nacute;\": \"\\u0144\",\r\n \"nang;\": \"\\u2220\\u20D2\",\r\n \"nap;\": \"\\u2249\",\r\n \"napE;\": \"\\u2A70\\u0338\",\r\n \"napid;\": \"\\u224B\\u0338\",\r\n \"napos;\": \"\\u0149\",\r\n \"napprox;\": \"\\u2249\",\r\n \"natur;\": \"\\u266E\",\r\n \"natural;\": \"\\u266E\",\r\n \"naturals;\": \"\\u2115\",\r\n \"nbsp;\": \"\\u00A0\",\r\n \"nbsp\": \"\\u00A0\",\r\n \"nbump;\": \"\\u224E\\u0338\",\r\n \"nbumpe;\": \"\\u224F\\u0338\",\r\n \"ncap;\": \"\\u2A43\",\r\n \"Ncaron;\": \"\\u0147\",\r\n \"ncaron;\": \"\\u0148\",\r\n \"Ncedil;\": \"\\u0145\",\r\n \"ncedil;\": \"\\u0146\",\r\n \"ncong;\": \"\\u2247\",\r\n \"ncongdot;\": \"\\u2A6D\\u0338\",\r\n \"ncup;\": \"\\u2A42\",\r\n \"Ncy;\": \"\\u041D\",\r\n \"ncy;\": \"\\u043D\",\r\n \"ndash;\": \"\\u2013\",\r\n \"ne;\": \"\\u2260\",\r\n \"nearhk;\": \"\\u2924\",\r\n \"neArr;\": \"\\u21D7\",\r\n \"nearr;\": \"\\u2197\",\r\n \"nearrow;\": \"\\u2197\",\r\n \"nedot;\": \"\\u2250\\u0338\",\r\n \"NegativeMediumSpace;\": \"\\u200B\",\r\n \"NegativeThickSpace;\": \"\\u200B\",\r\n \"NegativeThinSpace;\": \"\\u200B\",\r\n \"NegativeVeryThinSpace;\": \"\\u200B\",\r\n \"nequiv;\": \"\\u2262\",\r\n \"nesear;\": \"\\u2928\",\r\n \"nesim;\": \"\\u2242\\u0338\",\r\n \"NestedGreaterGreater;\": \"\\u226B\",\r\n \"NestedLessLess;\": \"\\u226A\",\r\n \"NewLine;\": \"\\n\",\r\n \"nexist;\": \"\\u2204\",\r\n \"nexists;\": \"\\u2204\",\r\n \"Nfr;\": \"\\uD835\\uDD11\",\r\n \"nfr;\": \"\\uD835\\uDD2B\",\r\n \"ngE;\": \"\\u2267\\u0338\",\r\n \"nge;\": \"\\u2271\",\r\n \"ngeq;\": \"\\u2271\",\r\n \"ngeqq;\": \"\\u2267\\u0338\",\r\n \"ngeqslant;\": \"\\u2A7E\\u0338\",\r\n \"nges;\": \"\\u2A7E\\u0338\",\r\n \"nGg;\": \"\\u22D9\\u0338\",\r\n \"ngsim;\": \"\\u2275\",\r\n \"nGt;\": \"\\u226B\\u20D2\",\r\n \"ngt;\": \"\\u226F\",\r\n \"ngtr;\": \"\\u226F\",\r\n \"nGtv;\": \"\\u226B\\u0338\",\r\n \"nhArr;\": \"\\u21CE\",\r\n \"nharr;\": \"\\u21AE\",\r\n \"nhpar;\": \"\\u2AF2\",\r\n \"ni;\": \"\\u220B\",\r\n \"nis;\": \"\\u22FC\",\r\n \"nisd;\": \"\\u22FA\",\r\n \"niv;\": \"\\u220B\",\r\n \"NJcy;\": \"\\u040A\",\r\n \"njcy;\": \"\\u045A\",\r\n \"nlArr;\": \"\\u21CD\",\r\n \"nlarr;\": \"\\u219A\",\r\n \"nldr;\": \"\\u2025\",\r\n \"nlE;\": \"\\u2266\\u0338\",\r\n \"nle;\": \"\\u2270\",\r\n \"nLeftarrow;\": \"\\u21CD\",\r\n \"nleftarrow;\": \"\\u219A\",\r\n \"nLeftrightarrow;\": \"\\u21CE\",\r\n \"nleftrightarrow;\": \"\\u21AE\",\r\n \"nleq;\": \"\\u2270\",\r\n \"nleqq;\": \"\\u2266\\u0338\",\r\n \"nleqslant;\": \"\\u2A7D\\u0338\",\r\n \"nles;\": \"\\u2A7D\\u0338\",\r\n \"nless;\": \"\\u226E\",\r\n \"nLl;\": \"\\u22D8\\u0338\",\r\n \"nlsim;\": \"\\u2274\",\r\n \"nLt;\": \"\\u226A\\u20D2\",\r\n \"nlt;\": \"\\u226E\",\r\n \"nltri;\": \"\\u22EA\",\r\n \"nltrie;\": \"\\u22EC\",\r\n \"nLtv;\": \"\\u226A\\u0338\",\r\n \"nmid;\": \"\\u2224\",\r\n \"NoBreak;\": \"\\u2060\",\r\n \"NonBreakingSpace;\": \"\\u00A0\",\r\n \"Nopf;\": \"\\u2115\",\r\n \"nopf;\": \"\\uD835\\uDD5F\",\r\n \"Not;\": \"\\u2AEC\",\r\n \"not;\": \"\\u00AC\",\r\n \"not\": \"\\u00AC\",\r\n \"NotCongruent;\": \"\\u2262\",\r\n \"NotCupCap;\": \"\\u226D\",\r\n \"NotDoubleVerticalBar;\": \"\\u2226\",\r\n \"NotElement;\": \"\\u2209\",\r\n \"NotEqual;\": \"\\u2260\",\r\n \"NotEqualTilde;\": \"\\u2242\\u0338\",\r\n \"NotExists;\": \"\\u2204\",\r\n \"NotGreater;\": \"\\u226F\",\r\n \"NotGreaterEqual;\": \"\\u2271\",\r\n \"NotGreaterFullEqual;\": \"\\u2267\\u0338\",\r\n \"NotGreaterGreater;\": \"\\u226B\\u0338\",\r\n \"NotGreaterLess;\": \"\\u2279\",\r\n \"NotGreaterSlantEqual;\": \"\\u2A7E\\u0338\",\r\n \"NotGreaterTilde;\": \"\\u2275\",\r\n \"NotHumpDownHump;\": \"\\u224E\\u0338\",\r\n \"NotHumpEqual;\": \"\\u224F\\u0338\",\r\n \"notin;\": \"\\u2209\",\r\n \"notindot;\": \"\\u22F5\\u0338\",\r\n \"notinE;\": \"\\u22F9\\u0338\",\r\n \"notinva;\": \"\\u2209\",\r\n \"notinvb;\": \"\\u22F7\",\r\n \"notinvc;\": \"\\u22F6\",\r\n \"NotLeftTriangle;\": \"\\u22EA\",\r\n \"NotLeftTriangleBar;\": \"\\u29CF\\u0338\",\r\n \"NotLeftTriangleEqual;\": \"\\u22EC\",\r\n \"NotLess;\": \"\\u226E\",\r\n \"NotLessEqual;\": \"\\u2270\",\r\n \"NotLessGreater;\": \"\\u2278\",\r\n \"NotLessLess;\": \"\\u226A\\u0338\",\r\n \"NotLessSlantEqual;\": \"\\u2A7D\\u0338\",\r\n \"NotLessTilde;\": \"\\u2274\",\r\n \"NotNestedGreaterGreater;\": \"\\u2AA2\\u0338\",\r\n \"NotNestedLessLess;\": \"\\u2AA1\\u0338\",\r\n \"notni;\": \"\\u220C\",\r\n \"notniva;\": \"\\u220C\",\r\n \"notnivb;\": \"\\u22FE\",\r\n \"notnivc;\": \"\\u22FD\",\r\n \"NotPrecedes;\": \"\\u2280\",\r\n \"NotPrecedesEqual;\": \"\\u2AAF\\u0338\",\r\n \"NotPrecedesSlantEqual;\": \"\\u22E0\",\r\n \"NotReverseElement;\": \"\\u220C\",\r\n \"NotRightTriangle;\": \"\\u22EB\",\r\n \"NotRightTriangleBar;\": \"\\u29D0\\u0338\",\r\n \"NotRightTriangleEqual;\": \"\\u22ED\",\r\n \"NotSquareSubset;\": \"\\u228F\\u0338\",\r\n \"NotSquareSubsetEqual;\": \"\\u22E2\",\r\n \"NotSquareSuperset;\": \"\\u2290\\u0338\",\r\n \"NotSquareSupersetEqual;\": \"\\u22E3\",\r\n \"NotSubset;\": \"\\u2282\\u20D2\",\r\n \"NotSubsetEqual;\": \"\\u2288\",\r\n \"NotSucceeds;\": \"\\u2281\",\r\n \"NotSucceedsEqual;\": \"\\u2AB0\\u0338\",\r\n \"NotSucceedsSlantEqual;\": \"\\u22E1\",\r\n \"NotSucceedsTilde;\": \"\\u227F\\u0338\",\r\n \"NotSuperset;\": \"\\u2283\\u20D2\",\r\n \"NotSupersetEqual;\": \"\\u2289\",\r\n \"NotTilde;\": \"\\u2241\",\r\n \"NotTildeEqual;\": \"\\u2244\",\r\n \"NotTildeFullEqual;\": \"\\u2247\",\r\n \"NotTildeTilde;\": \"\\u2249\",\r\n \"NotVerticalBar;\": \"\\u2224\",\r\n \"npar;\": \"\\u2226\",\r\n \"nparallel;\": \"\\u2226\",\r\n \"nparsl;\": \"\\u2AFD\\u20E5\",\r\n \"npart;\": \"\\u2202\\u0338\",\r\n \"npolint;\": \"\\u2A14\",\r\n \"npr;\": \"\\u2280\",\r\n \"nprcue;\": \"\\u22E0\",\r\n \"npre;\": \"\\u2AAF\\u0338\",\r\n \"nprec;\": \"\\u2280\",\r\n \"npreceq;\": \"\\u2AAF\\u0338\",\r\n \"nrArr;\": \"\\u21CF\",\r\n \"nrarr;\": \"\\u219B\",\r\n \"nrarrc;\": \"\\u2933\\u0338\",\r\n \"nrarrw;\": \"\\u219D\\u0338\",\r\n \"nRightarrow;\": \"\\u21CF\",\r\n \"nrightarrow;\": \"\\u219B\",\r\n \"nrtri;\": \"\\u22EB\",\r\n \"nrtrie;\": \"\\u22ED\",\r\n \"nsc;\": \"\\u2281\",\r\n \"nsccue;\": \"\\u22E1\",\r\n \"nsce;\": \"\\u2AB0\\u0338\",\r\n \"Nscr;\": \"\\uD835\\uDCA9\",\r\n \"nscr;\": \"\\uD835\\uDCC3\",\r\n \"nshortmid;\": \"\\u2224\",\r\n \"nshortparallel;\": \"\\u2226\",\r\n \"nsim;\": \"\\u2241\",\r\n \"nsime;\": \"\\u2244\",\r\n \"nsimeq;\": \"\\u2244\",\r\n \"nsmid;\": \"\\u2224\",\r\n \"nspar;\": \"\\u2226\",\r\n \"nsqsube;\": \"\\u22E2\",\r\n \"nsqsupe;\": \"\\u22E3\",\r\n \"nsub;\": \"\\u2284\",\r\n \"nsubE;\": \"\\u2AC5\\u0338\",\r\n \"nsube;\": \"\\u2288\",\r\n \"nsubset;\": \"\\u2282\\u20D2\",\r\n \"nsubseteq;\": \"\\u2288\",\r\n \"nsubseteqq;\": \"\\u2AC5\\u0338\",\r\n \"nsucc;\": \"\\u2281\",\r\n \"nsucceq;\": \"\\u2AB0\\u0338\",\r\n \"nsup;\": \"\\u2285\",\r\n \"nsupE;\": \"\\u2AC6\\u0338\",\r\n \"nsupe;\": \"\\u2289\",\r\n \"nsupset;\": \"\\u2283\\u20D2\",\r\n \"nsupseteq;\": \"\\u2289\",\r\n \"nsupseteqq;\": \"\\u2AC6\\u0338\",\r\n \"ntgl;\": \"\\u2279\",\r\n \"Ntilde;\": \"\\u00D1\",\r\n \"Ntilde\": \"\\u00D1\",\r\n \"ntilde;\": \"\\u00F1\",\r\n \"ntilde\": \"\\u00F1\",\r\n \"ntlg;\": \"\\u2278\",\r\n \"ntriangleleft;\": \"\\u22EA\",\r\n \"ntrianglelefteq;\": \"\\u22EC\",\r\n \"ntriangleright;\": \"\\u22EB\",\r\n \"ntrianglerighteq;\": \"\\u22ED\",\r\n \"Nu;\": \"\\u039D\",\r\n \"nu;\": \"\\u03BD\",\r\n \"num;\": \"#\",\r\n \"numero;\": \"\\u2116\",\r\n \"numsp;\": \"\\u2007\",\r\n \"nvap;\": \"\\u224D\\u20D2\",\r\n \"nVDash;\": \"\\u22AF\",\r\n \"nVdash;\": \"\\u22AE\",\r\n \"nvDash;\": \"\\u22AD\",\r\n \"nvdash;\": \"\\u22AC\",\r\n \"nvge;\": \"\\u2265\\u20D2\",\r\n \"nvgt;\": \">\\u20D2\",\r\n \"nvHarr;\": \"\\u2904\",\r\n \"nvinfin;\": \"\\u29DE\",\r\n \"nvlArr;\": \"\\u2902\",\r\n \"nvle;\": \"\\u2264\\u20D2\",\r\n \"nvlt;\": \"<\\u20D2\",\r\n \"nvltrie;\": \"\\u22B4\\u20D2\",\r\n \"nvrArr;\": \"\\u2903\",\r\n \"nvrtrie;\": \"\\u22B5\\u20D2\",\r\n \"nvsim;\": \"\\u223C\\u20D2\",\r\n \"nwarhk;\": \"\\u2923\",\r\n \"nwArr;\": \"\\u21D6\",\r\n \"nwarr;\": \"\\u2196\",\r\n \"nwarrow;\": \"\\u2196\",\r\n \"nwnear;\": \"\\u2927\",\r\n \"Oacute;\": \"\\u00D3\",\r\n \"Oacute\": \"\\u00D3\",\r\n \"oacute;\": \"\\u00F3\",\r\n \"oacute\": \"\\u00F3\",\r\n \"oast;\": \"\\u229B\",\r\n \"ocir;\": \"\\u229A\",\r\n \"Ocirc;\": \"\\u00D4\",\r\n \"Ocirc\": \"\\u00D4\",\r\n \"ocirc;\": \"\\u00F4\",\r\n \"ocirc\": \"\\u00F4\",\r\n \"Ocy;\": \"\\u041E\",\r\n \"ocy;\": \"\\u043E\",\r\n \"odash;\": \"\\u229D\",\r\n \"Odblac;\": \"\\u0150\",\r\n \"odblac;\": \"\\u0151\",\r\n \"odiv;\": \"\\u2A38\",\r\n \"odot;\": \"\\u2299\",\r\n \"odsold;\": \"\\u29BC\",\r\n \"OElig;\": \"\\u0152\",\r\n \"oelig;\": \"\\u0153\",\r\n \"ofcir;\": \"\\u29BF\",\r\n \"Ofr;\": \"\\uD835\\uDD12\",\r\n \"ofr;\": \"\\uD835\\uDD2C\",\r\n \"ogon;\": \"\\u02DB\",\r\n \"Ograve;\": \"\\u00D2\",\r\n \"Ograve\": \"\\u00D2\",\r\n \"ograve;\": \"\\u00F2\",\r\n \"ograve\": \"\\u00F2\",\r\n \"ogt;\": \"\\u29C1\",\r\n \"ohbar;\": \"\\u29B5\",\r\n \"ohm;\": \"\\u03A9\",\r\n \"oint;\": \"\\u222E\",\r\n \"olarr;\": \"\\u21BA\",\r\n \"olcir;\": \"\\u29BE\",\r\n \"olcross;\": \"\\u29BB\",\r\n \"oline;\": \"\\u203E\",\r\n \"olt;\": \"\\u29C0\",\r\n \"Omacr;\": \"\\u014C\",\r\n \"omacr;\": \"\\u014D\",\r\n \"Omega;\": \"\\u03A9\",\r\n \"omega;\": \"\\u03C9\",\r\n \"Omicron;\": \"\\u039F\",\r\n \"omicron;\": \"\\u03BF\",\r\n \"omid;\": \"\\u29B6\",\r\n \"ominus;\": \"\\u2296\",\r\n \"Oopf;\": \"\\uD835\\uDD46\",\r\n \"oopf;\": \"\\uD835\\uDD60\",\r\n \"opar;\": \"\\u29B7\",\r\n \"OpenCurlyDoubleQuote;\": \"\\u201C\",\r\n \"OpenCurlyQuote;\": \"\\u2018\",\r\n \"operp;\": \"\\u29B9\",\r\n \"oplus;\": \"\\u2295\",\r\n \"Or;\": \"\\u2A54\",\r\n \"or;\": \"\\u2228\",\r\n \"orarr;\": \"\\u21BB\",\r\n \"ord;\": \"\\u2A5D\",\r\n \"order;\": \"\\u2134\",\r\n \"orderof;\": \"\\u2134\",\r\n \"ordf;\": \"\\u00AA\",\r\n \"ordf\": \"\\u00AA\",\r\n \"ordm;\": \"\\u00BA\",\r\n \"ordm\": \"\\u00BA\",\r\n \"origof;\": \"\\u22B6\",\r\n \"oror;\": \"\\u2A56\",\r\n \"orslope;\": \"\\u2A57\",\r\n \"orv;\": \"\\u2A5B\",\r\n \"oS;\": \"\\u24C8\",\r\n \"Oscr;\": \"\\uD835\\uDCAA\",\r\n \"oscr;\": \"\\u2134\",\r\n \"Oslash;\": \"\\u00D8\",\r\n \"Oslash\": \"\\u00D8\",\r\n \"oslash;\": \"\\u00F8\",\r\n \"oslash\": \"\\u00F8\",\r\n \"osol;\": \"\\u2298\",\r\n \"Otilde;\": \"\\u00D5\",\r\n \"Otilde\": \"\\u00D5\",\r\n \"otilde;\": \"\\u00F5\",\r\n \"otilde\": \"\\u00F5\",\r\n \"Otimes;\": \"\\u2A37\",\r\n \"otimes;\": \"\\u2297\",\r\n \"otimesas;\": \"\\u2A36\",\r\n \"Ouml;\": \"\\u00D6\",\r\n \"Ouml\": \"\\u00D6\",\r\n \"ouml;\": \"\\u00F6\",\r\n \"ouml\": \"\\u00F6\",\r\n \"ovbar;\": \"\\u233D\",\r\n \"OverBar;\": \"\\u203E\",\r\n \"OverBrace;\": \"\\u23DE\",\r\n \"OverBracket;\": \"\\u23B4\",\r\n \"OverParenthesis;\": \"\\u23DC\",\r\n \"par;\": \"\\u2225\",\r\n \"para;\": \"\\u00B6\",\r\n \"para\": \"\\u00B6\",\r\n \"parallel;\": \"\\u2225\",\r\n \"parsim;\": \"\\u2AF3\",\r\n \"parsl;\": \"\\u2AFD\",\r\n \"part;\": \"\\u2202\",\r\n \"PartialD;\": \"\\u2202\",\r\n \"Pcy;\": \"\\u041F\",\r\n \"pcy;\": \"\\u043F\",\r\n \"percnt;\": \"%\",\r\n \"period;\": \".\",\r\n \"permil;\": \"\\u2030\",\r\n \"perp;\": \"\\u22A5\",\r\n \"pertenk;\": \"\\u2031\",\r\n \"Pfr;\": \"\\uD835\\uDD13\",\r\n \"pfr;\": \"\\uD835\\uDD2D\",\r\n \"Phi;\": \"\\u03A6\",\r\n \"phi;\": \"\\u03C6\",\r\n \"phiv;\": \"\\u03D5\",\r\n \"phmmat;\": \"\\u2133\",\r\n \"phone;\": \"\\u260E\",\r\n \"Pi;\": \"\\u03A0\",\r\n \"pi;\": \"\\u03C0\",\r\n \"pitchfork;\": \"\\u22D4\",\r\n \"piv;\": \"\\u03D6\",\r\n \"planck;\": \"\\u210F\",\r\n \"planckh;\": \"\\u210E\",\r\n \"plankv;\": \"\\u210F\",\r\n \"plus;\": \"+\",\r\n \"plusacir;\": \"\\u2A23\",\r\n \"plusb;\": \"\\u229E\",\r\n \"pluscir;\": \"\\u2A22\",\r\n \"plusdo;\": \"\\u2214\",\r\n \"plusdu;\": \"\\u2A25\",\r\n \"pluse;\": \"\\u2A72\",\r\n \"PlusMinus;\": \"\\u00B1\",\r\n \"plusmn;\": \"\\u00B1\",\r\n \"plusmn\": \"\\u00B1\",\r\n \"plussim;\": \"\\u2A26\",\r\n \"plustwo;\": \"\\u2A27\",\r\n \"pm;\": \"\\u00B1\",\r\n \"Poincareplane;\": \"\\u210C\",\r\n \"pointint;\": \"\\u2A15\",\r\n \"Popf;\": \"\\u2119\",\r\n \"popf;\": \"\\uD835\\uDD61\",\r\n \"pound;\": \"\\u00A3\",\r\n \"pound\": \"\\u00A3\",\r\n \"Pr;\": \"\\u2ABB\",\r\n \"pr;\": \"\\u227A\",\r\n \"prap;\": \"\\u2AB7\",\r\n \"prcue;\": \"\\u227C\",\r\n \"prE;\": \"\\u2AB3\",\r\n \"pre;\": \"\\u2AAF\",\r\n \"prec;\": \"\\u227A\",\r\n \"precapprox;\": \"\\u2AB7\",\r\n \"preccurlyeq;\": \"\\u227C\",\r\n \"Precedes;\": \"\\u227A\",\r\n \"PrecedesEqual;\": \"\\u2AAF\",\r\n \"PrecedesSlantEqual;\": \"\\u227C\",\r\n \"PrecedesTilde;\": \"\\u227E\",\r\n \"preceq;\": \"\\u2AAF\",\r\n \"precnapprox;\": \"\\u2AB9\",\r\n \"precneqq;\": \"\\u2AB5\",\r\n \"precnsim;\": \"\\u22E8\",\r\n \"precsim;\": \"\\u227E\",\r\n \"Prime;\": \"\\u2033\",\r\n \"prime;\": \"\\u2032\",\r\n \"primes;\": \"\\u2119\",\r\n \"prnap;\": \"\\u2AB9\",\r\n \"prnE;\": \"\\u2AB5\",\r\n \"prnsim;\": \"\\u22E8\",\r\n \"prod;\": \"\\u220F\",\r\n \"Product;\": \"\\u220F\",\r\n \"profalar;\": \"\\u232E\",\r\n \"profline;\": \"\\u2312\",\r\n \"profsurf;\": \"\\u2313\",\r\n \"prop;\": \"\\u221D\",\r\n \"Proportion;\": \"\\u2237\",\r\n \"Proportional;\": \"\\u221D\",\r\n \"propto;\": \"\\u221D\",\r\n \"prsim;\": \"\\u227E\",\r\n \"prurel;\": \"\\u22B0\",\r\n \"Pscr;\": \"\\uD835\\uDCAB\",\r\n \"pscr;\": \"\\uD835\\uDCC5\",\r\n \"Psi;\": \"\\u03A8\",\r\n \"psi;\": \"\\u03C8\",\r\n \"puncsp;\": \"\\u2008\",\r\n \"Qfr;\": \"\\uD835\\uDD14\",\r\n \"qfr;\": \"\\uD835\\uDD2E\",\r\n \"qint;\": \"\\u2A0C\",\r\n \"Qopf;\": \"\\u211A\",\r\n \"qopf;\": \"\\uD835\\uDD62\",\r\n \"qprime;\": \"\\u2057\",\r\n \"Qscr;\": \"\\uD835\\uDCAC\",\r\n \"qscr;\": \"\\uD835\\uDCC6\",\r\n \"quaternions;\": \"\\u210D\",\r\n \"quatint;\": \"\\u2A16\",\r\n \"quest;\": \"?\",\r\n \"questeq;\": \"\\u225F\",\r\n \"QUOT;\": \"\\\"\",\r\n \"QUOT\": \"\\\"\",\r\n \"quot;\": \"\\\"\",\r\n \"quot\": \"\\\"\",\r\n \"rAarr;\": \"\\u21DB\",\r\n \"race;\": \"\\u223D\\u0331\",\r\n \"Racute;\": \"\\u0154\",\r\n \"racute;\": \"\\u0155\",\r\n \"radic;\": \"\\u221A\",\r\n \"raemptyv;\": \"\\u29B3\",\r\n \"Rang;\": \"\\u27EB\",\r\n \"rang;\": \"\\u27E9\",\r\n \"rangd;\": \"\\u2992\",\r\n \"range;\": \"\\u29A5\",\r\n \"rangle;\": \"\\u27E9\",\r\n \"raquo;\": \"\\u00BB\",\r\n \"raquo\": \"\\u00BB\",\r\n \"Rarr;\": \"\\u21A0\",\r\n \"rArr;\": \"\\u21D2\",\r\n \"rarr;\": \"\\u2192\",\r\n \"rarrap;\": \"\\u2975\",\r\n \"rarrb;\": \"\\u21E5\",\r\n \"rarrbfs;\": \"\\u2920\",\r\n \"rarrc;\": \"\\u2933\",\r\n \"rarrfs;\": \"\\u291E\",\r\n \"rarrhk;\": \"\\u21AA\",\r\n \"rarrlp;\": \"\\u21AC\",\r\n \"rarrpl;\": \"\\u2945\",\r\n \"rarrsim;\": \"\\u2974\",\r\n \"Rarrtl;\": \"\\u2916\",\r\n \"rarrtl;\": \"\\u21A3\",\r\n \"rarrw;\": \"\\u219D\",\r\n \"rAtail;\": \"\\u291C\",\r\n \"ratail;\": \"\\u291A\",\r\n \"ratio;\": \"\\u2236\",\r\n \"rationals;\": \"\\u211A\",\r\n \"RBarr;\": \"\\u2910\",\r\n \"rBarr;\": \"\\u290F\",\r\n \"rbarr;\": \"\\u290D\",\r\n \"rbbrk;\": \"\\u2773\",\r\n \"rbrace;\": \"}\",\r\n \"rbrack;\": \"]\",\r\n \"rbrke;\": \"\\u298C\",\r\n \"rbrksld;\": \"\\u298E\",\r\n \"rbrkslu;\": \"\\u2990\",\r\n \"Rcaron;\": \"\\u0158\",\r\n \"rcaron;\": \"\\u0159\",\r\n \"Rcedil;\": \"\\u0156\",\r\n \"rcedil;\": \"\\u0157\",\r\n \"rceil;\": \"\\u2309\",\r\n \"rcub;\": \"}\",\r\n \"Rcy;\": \"\\u0420\",\r\n \"rcy;\": \"\\u0440\",\r\n \"rdca;\": \"\\u2937\",\r\n \"rdldhar;\": \"\\u2969\",\r\n \"rdquo;\": \"\\u201D\",\r\n \"rdquor;\": \"\\u201D\",\r\n \"rdsh;\": \"\\u21B3\",\r\n \"Re;\": \"\\u211C\",\r\n \"real;\": \"\\u211C\",\r\n \"realine;\": \"\\u211B\",\r\n \"realpart;\": \"\\u211C\",\r\n \"reals;\": \"\\u211D\",\r\n \"rect;\": \"\\u25AD\",\r\n \"REG;\": \"\\u00AE\",\r\n \"REG\": \"\\u00AE\",\r\n \"reg;\": \"\\u00AE\",\r\n \"reg\": \"\\u00AE\",\r\n \"ReverseElement;\": \"\\u220B\",\r\n \"ReverseEquilibrium;\": \"\\u21CB\",\r\n \"ReverseUpEquilibrium;\": \"\\u296F\",\r\n \"rfisht;\": \"\\u297D\",\r\n \"rfloor;\": \"\\u230B\",\r\n \"Rfr;\": \"\\u211C\",\r\n \"rfr;\": \"\\uD835\\uDD2F\",\r\n \"rHar;\": \"\\u2964\",\r\n \"rhard;\": \"\\u21C1\",\r\n \"rharu;\": \"\\u21C0\",\r\n \"rharul;\": \"\\u296C\",\r\n \"Rho;\": \"\\u03A1\",\r\n \"rho;\": \"\\u03C1\",\r\n \"rhov;\": \"\\u03F1\",\r\n \"RightAngleBracket;\": \"\\u27E9\",\r\n \"RightArrow;\": \"\\u2192\",\r\n \"Rightarrow;\": \"\\u21D2\",\r\n \"rightarrow;\": \"\\u2192\",\r\n \"RightArrowBar;\": \"\\u21E5\",\r\n \"RightArrowLeftArrow;\": \"\\u21C4\",\r\n \"rightarrowtail;\": \"\\u21A3\",\r\n \"RightCeiling;\": \"\\u2309\",\r\n \"RightDoubleBracket;\": \"\\u27E7\",\r\n \"RightDownTeeVector;\": \"\\u295D\",\r\n \"RightDownVector;\": \"\\u21C2\",\r\n \"RightDownVectorBar;\": \"\\u2955\",\r\n \"RightFloor;\": \"\\u230B\",\r\n \"rightharpoondown;\": \"\\u21C1\",\r\n \"rightharpoonup;\": \"\\u21C0\",\r\n \"rightleftarrows;\": \"\\u21C4\",\r\n \"rightleftharpoons;\": \"\\u21CC\",\r\n \"rightrightarrows;\": \"\\u21C9\",\r\n \"rightsquigarrow;\": \"\\u219D\",\r\n \"RightTee;\": \"\\u22A2\",\r\n \"RightTeeArrow;\": \"\\u21A6\",\r\n \"RightTeeVector;\": \"\\u295B\",\r\n \"rightthreetimes;\": \"\\u22CC\",\r\n \"RightTriangle;\": \"\\u22B3\",\r\n \"RightTriangleBar;\": \"\\u29D0\",\r\n \"RightTriangleEqual;\": \"\\u22B5\",\r\n \"RightUpDownVector;\": \"\\u294F\",\r\n \"RightUpTeeVector;\": \"\\u295C\",\r\n \"RightUpVector;\": \"\\u21BE\",\r\n \"RightUpVectorBar;\": \"\\u2954\",\r\n \"RightVector;\": \"\\u21C0\",\r\n \"RightVectorBar;\": \"\\u2953\",\r\n \"ring;\": \"\\u02DA\",\r\n \"risingdotseq;\": \"\\u2253\",\r\n \"rlarr;\": \"\\u21C4\",\r\n \"rlhar;\": \"\\u21CC\",\r\n \"rlm;\": \"\\u200F\",\r\n \"rmoust;\": \"\\u23B1\",\r\n \"rmoustache;\": \"\\u23B1\",\r\n \"rnmid;\": \"\\u2AEE\",\r\n \"roang;\": \"\\u27ED\",\r\n \"roarr;\": \"\\u21FE\",\r\n \"robrk;\": \"\\u27E7\",\r\n \"ropar;\": \"\\u2986\",\r\n \"Ropf;\": \"\\u211D\",\r\n \"ropf;\": \"\\uD835\\uDD63\",\r\n \"roplus;\": \"\\u2A2E\",\r\n \"rotimes;\": \"\\u2A35\",\r\n \"RoundImplies;\": \"\\u2970\",\r\n \"rpar;\": \")\",\r\n \"rpargt;\": \"\\u2994\",\r\n \"rppolint;\": \"\\u2A12\",\r\n \"rrarr;\": \"\\u21C9\",\r\n \"Rrightarrow;\": \"\\u21DB\",\r\n \"rsaquo;\": \"\\u203A\",\r\n \"Rscr;\": \"\\u211B\",\r\n \"rscr;\": \"\\uD835\\uDCC7\",\r\n \"Rsh;\": \"\\u21B1\",\r\n \"rsh;\": \"\\u21B1\",\r\n \"rsqb;\": \"]\",\r\n \"rsquo;\": \"\\u2019\",\r\n \"rsquor;\": \"\\u2019\",\r\n \"rthree;\": \"\\u22CC\",\r\n \"rtimes;\": \"\\u22CA\",\r\n \"rtri;\": \"\\u25B9\",\r\n \"rtrie;\": \"\\u22B5\",\r\n \"rtrif;\": \"\\u25B8\",\r\n \"rtriltri;\": \"\\u29CE\",\r\n \"RuleDelayed;\": \"\\u29F4\",\r\n \"ruluhar;\": \"\\u2968\",\r\n \"rx;\": \"\\u211E\",\r\n \"Sacute;\": \"\\u015A\",\r\n \"sacute;\": \"\\u015B\",\r\n \"sbquo;\": \"\\u201A\",\r\n \"Sc;\": \"\\u2ABC\",\r\n \"sc;\": \"\\u227B\",\r\n \"scap;\": \"\\u2AB8\",\r\n \"Scaron;\": \"\\u0160\",\r\n \"scaron;\": \"\\u0161\",\r\n \"sccue;\": \"\\u227D\",\r\n \"scE;\": \"\\u2AB4\",\r\n \"sce;\": \"\\u2AB0\",\r\n \"Scedil;\": \"\\u015E\",\r\n \"scedil;\": \"\\u015F\",\r\n \"Scirc;\": \"\\u015C\",\r\n \"scirc;\": \"\\u015D\",\r\n \"scnap;\": \"\\u2ABA\",\r\n \"scnE;\": \"\\u2AB6\",\r\n \"scnsim;\": \"\\u22E9\",\r\n \"scpolint;\": \"\\u2A13\",\r\n \"scsim;\": \"\\u227F\",\r\n \"Scy;\": \"\\u0421\",\r\n \"scy;\": \"\\u0441\",\r\n \"sdot;\": \"\\u22C5\",\r\n \"sdotb;\": \"\\u22A1\",\r\n \"sdote;\": \"\\u2A66\",\r\n \"searhk;\": \"\\u2925\",\r\n \"seArr;\": \"\\u21D8\",\r\n \"searr;\": \"\\u2198\",\r\n \"searrow;\": \"\\u2198\",\r\n \"sect;\": \"\\u00A7\",\r\n \"sect\": \"\\u00A7\",\r\n \"semi;\": \";\",\r\n \"seswar;\": \"\\u2929\",\r\n \"setminus;\": \"\\u2216\",\r\n \"setmn;\": \"\\u2216\",\r\n \"sext;\": \"\\u2736\",\r\n \"Sfr;\": \"\\uD835\\uDD16\",\r\n \"sfr;\": \"\\uD835\\uDD30\",\r\n \"sfrown;\": \"\\u2322\",\r\n \"sharp;\": \"\\u266F\",\r\n \"SHCHcy;\": \"\\u0429\",\r\n \"shchcy;\": \"\\u0449\",\r\n \"SHcy;\": \"\\u0428\",\r\n \"shcy;\": \"\\u0448\",\r\n \"ShortDownArrow;\": \"\\u2193\",\r\n \"ShortLeftArrow;\": \"\\u2190\",\r\n \"shortmid;\": \"\\u2223\",\r\n \"shortparallel;\": \"\\u2225\",\r\n \"ShortRightArrow;\": \"\\u2192\",\r\n \"ShortUpArrow;\": \"\\u2191\",\r\n \"shy;\": \"\\u00AD\",\r\n \"shy\": \"\\u00AD\",\r\n \"Sigma;\": \"\\u03A3\",\r\n \"sigma;\": \"\\u03C3\",\r\n \"sigmaf;\": \"\\u03C2\",\r\n \"sigmav;\": \"\\u03C2\",\r\n \"sim;\": \"\\u223C\",\r\n \"simdot;\": \"\\u2A6A\",\r\n \"sime;\": \"\\u2243\",\r\n \"simeq;\": \"\\u2243\",\r\n \"simg;\": \"\\u2A9E\",\r\n \"simgE;\": \"\\u2AA0\",\r\n \"siml;\": \"\\u2A9D\",\r\n \"simlE;\": \"\\u2A9F\",\r\n \"simne;\": \"\\u2246\",\r\n \"simplus;\": \"\\u2A24\",\r\n \"simrarr;\": \"\\u2972\",\r\n \"slarr;\": \"\\u2190\",\r\n \"SmallCircle;\": \"\\u2218\",\r\n \"smallsetminus;\": \"\\u2216\",\r\n \"smashp;\": \"\\u2A33\",\r\n \"smeparsl;\": \"\\u29E4\",\r\n \"smid;\": \"\\u2223\",\r\n \"smile;\": \"\\u2323\",\r\n \"smt;\": \"\\u2AAA\",\r\n \"smte;\": \"\\u2AAC\",\r\n \"smtes;\": \"\\u2AAC\\uFE00\",\r\n \"SOFTcy;\": \"\\u042C\",\r\n \"softcy;\": \"\\u044C\",\r\n \"sol;\": \"/\",\r\n \"solb;\": \"\\u29C4\",\r\n \"solbar;\": \"\\u233F\",\r\n \"Sopf;\": \"\\uD835\\uDD4A\",\r\n \"sopf;\": \"\\uD835\\uDD64\",\r\n \"spades;\": \"\\u2660\",\r\n \"spadesuit;\": \"\\u2660\",\r\n \"spar;\": \"\\u2225\",\r\n \"sqcap;\": \"\\u2293\",\r\n \"sqcaps;\": \"\\u2293\\uFE00\",\r\n \"sqcup;\": \"\\u2294\",\r\n \"sqcups;\": \"\\u2294\\uFE00\",\r\n \"Sqrt;\": \"\\u221A\",\r\n \"sqsub;\": \"\\u228F\",\r\n \"sqsube;\": \"\\u2291\",\r\n \"sqsubset;\": \"\\u228F\",\r\n \"sqsubseteq;\": \"\\u2291\",\r\n \"sqsup;\": \"\\u2290\",\r\n \"sqsupe;\": \"\\u2292\",\r\n \"sqsupset;\": \"\\u2290\",\r\n \"sqsupseteq;\": \"\\u2292\",\r\n \"squ;\": \"\\u25A1\",\r\n \"Square;\": \"\\u25A1\",\r\n \"square;\": \"\\u25A1\",\r\n \"SquareIntersection;\": \"\\u2293\",\r\n \"SquareSubset;\": \"\\u228F\",\r\n \"SquareSubsetEqual;\": \"\\u2291\",\r\n \"SquareSuperset;\": \"\\u2290\",\r\n \"SquareSupersetEqual;\": \"\\u2292\",\r\n \"SquareUnion;\": \"\\u2294\",\r\n \"squarf;\": \"\\u25AA\",\r\n \"squf;\": \"\\u25AA\",\r\n \"srarr;\": \"\\u2192\",\r\n \"Sscr;\": \"\\uD835\\uDCAE\",\r\n \"sscr;\": \"\\uD835\\uDCC8\",\r\n \"ssetmn;\": \"\\u2216\",\r\n \"ssmile;\": \"\\u2323\",\r\n \"sstarf;\": \"\\u22C6\",\r\n \"Star;\": \"\\u22C6\",\r\n \"star;\": \"\\u2606\",\r\n \"starf;\": \"\\u2605\",\r\n \"straightepsilon;\": \"\\u03F5\",\r\n \"straightphi;\": \"\\u03D5\",\r\n \"strns;\": \"\\u00AF\",\r\n \"Sub;\": \"\\u22D0\",\r\n \"sub;\": \"\\u2282\",\r\n \"subdot;\": \"\\u2ABD\",\r\n \"subE;\": \"\\u2AC5\",\r\n \"sube;\": \"\\u2286\",\r\n \"subedot;\": \"\\u2AC3\",\r\n \"submult;\": \"\\u2AC1\",\r\n \"subnE;\": \"\\u2ACB\",\r\n \"subne;\": \"\\u228A\",\r\n \"subplus;\": \"\\u2ABF\",\r\n \"subrarr;\": \"\\u2979\",\r\n \"Subset;\": \"\\u22D0\",\r\n \"subset;\": \"\\u2282\",\r\n \"subseteq;\": \"\\u2286\",\r\n \"subseteqq;\": \"\\u2AC5\",\r\n \"SubsetEqual;\": \"\\u2286\",\r\n \"subsetneq;\": \"\\u228A\",\r\n \"subsetneqq;\": \"\\u2ACB\",\r\n \"subsim;\": \"\\u2AC7\",\r\n \"subsub;\": \"\\u2AD5\",\r\n \"subsup;\": \"\\u2AD3\",\r\n \"succ;\": \"\\u227B\",\r\n \"succapprox;\": \"\\u2AB8\",\r\n \"succcurlyeq;\": \"\\u227D\",\r\n \"Succeeds;\": \"\\u227B\",\r\n \"SucceedsEqual;\": \"\\u2AB0\",\r\n \"SucceedsSlantEqual;\": \"\\u227D\",\r\n \"SucceedsTilde;\": \"\\u227F\",\r\n \"succeq;\": \"\\u2AB0\",\r\n \"succnapprox;\": \"\\u2ABA\",\r\n \"succneqq;\": \"\\u2AB6\",\r\n \"succnsim;\": \"\\u22E9\",\r\n \"succsim;\": \"\\u227F\",\r\n \"SuchThat;\": \"\\u220B\",\r\n \"Sum;\": \"\\u2211\",\r\n \"sum;\": \"\\u2211\",\r\n \"sung;\": \"\\u266A\",\r\n \"Sup;\": \"\\u22D1\",\r\n \"sup;\": \"\\u2283\",\r\n \"sup1;\": \"\\u00B9\",\r\n \"sup1\": \"\\u00B9\",\r\n \"sup2;\": \"\\u00B2\",\r\n \"sup2\": \"\\u00B2\",\r\n \"sup3;\": \"\\u00B3\",\r\n \"sup3\": \"\\u00B3\",\r\n \"supdot;\": \"\\u2ABE\",\r\n \"supdsub;\": \"\\u2AD8\",\r\n \"supE;\": \"\\u2AC6\",\r\n \"supe;\": \"\\u2287\",\r\n \"supedot;\": \"\\u2AC4\",\r\n \"Superset;\": \"\\u2283\",\r\n \"SupersetEqual;\": \"\\u2287\",\r\n \"suphsol;\": \"\\u27C9\",\r\n \"suphsub;\": \"\\u2AD7\",\r\n \"suplarr;\": \"\\u297B\",\r\n \"supmult;\": \"\\u2AC2\",\r\n \"supnE;\": \"\\u2ACC\",\r\n \"supne;\": \"\\u228B\",\r\n \"supplus;\": \"\\u2AC0\",\r\n \"Supset;\": \"\\u22D1\",\r\n \"supset;\": \"\\u2283\",\r\n \"supseteq;\": \"\\u2287\",\r\n \"supseteqq;\": \"\\u2AC6\",\r\n \"supsetneq;\": \"\\u228B\",\r\n \"supsetneqq;\": \"\\u2ACC\",\r\n \"supsim;\": \"\\u2AC8\",\r\n \"supsub;\": \"\\u2AD4\",\r\n \"supsup;\": \"\\u2AD6\",\r\n \"swarhk;\": \"\\u2926\",\r\n \"swArr;\": \"\\u21D9\",\r\n \"swarr;\": \"\\u2199\",\r\n \"swarrow;\": \"\\u2199\",\r\n \"swnwar;\": \"\\u292A\",\r\n \"szlig;\": \"\\u00DF\",\r\n \"szlig\": \"\\u00DF\",\r\n \"Tab;\": \"\\t\",\r\n \"target;\": \"\\u2316\",\r\n \"Tau;\": \"\\u03A4\",\r\n \"tau;\": \"\\u03C4\",\r\n \"tbrk;\": \"\\u23B4\",\r\n \"Tcaron;\": \"\\u0164\",\r\n \"tcaron;\": \"\\u0165\",\r\n \"Tcedil;\": \"\\u0162\",\r\n \"tcedil;\": \"\\u0163\",\r\n \"Tcy;\": \"\\u0422\",\r\n \"tcy;\": \"\\u0442\",\r\n \"tdot;\": \"\\u20DB\",\r\n \"telrec;\": \"\\u2315\",\r\n \"Tfr;\": \"\\uD835\\uDD17\",\r\n \"tfr;\": \"\\uD835\\uDD31\",\r\n \"there4;\": \"\\u2234\",\r\n \"Therefore;\": \"\\u2234\",\r\n \"therefore;\": \"\\u2234\",\r\n \"Theta;\": \"\\u0398\",\r\n \"theta;\": \"\\u03B8\",\r\n \"thetasym;\": \"\\u03D1\",\r\n \"thetav;\": \"\\u03D1\",\r\n \"thickapprox;\": \"\\u2248\",\r\n \"thicksim;\": \"\\u223C\",\r\n \"ThickSpace;\": \"\\u205F\\u200A\",\r\n \"thinsp;\": \"\\u2009\",\r\n \"ThinSpace;\": \"\\u2009\",\r\n \"thkap;\": \"\\u2248\",\r\n \"thksim;\": \"\\u223C\",\r\n \"THORN;\": \"\\u00DE\",\r\n \"THORN\": \"\\u00DE\",\r\n \"thorn;\": \"\\u00FE\",\r\n \"thorn\": \"\\u00FE\",\r\n \"Tilde;\": \"\\u223C\",\r\n \"tilde;\": \"\\u02DC\",\r\n \"TildeEqual;\": \"\\u2243\",\r\n \"TildeFullEqual;\": \"\\u2245\",\r\n \"TildeTilde;\": \"\\u2248\",\r\n \"times;\": \"\\u00D7\",\r\n \"times\": \"\\u00D7\",\r\n \"timesb;\": \"\\u22A0\",\r\n \"timesbar;\": \"\\u2A31\",\r\n \"timesd;\": \"\\u2A30\",\r\n \"tint;\": \"\\u222D\",\r\n \"toea;\": \"\\u2928\",\r\n \"top;\": \"\\u22A4\",\r\n \"topbot;\": \"\\u2336\",\r\n \"topcir;\": \"\\u2AF1\",\r\n \"Topf;\": \"\\uD835\\uDD4B\",\r\n \"topf;\": \"\\uD835\\uDD65\",\r\n \"topfork;\": \"\\u2ADA\",\r\n \"tosa;\": \"\\u2929\",\r\n \"tprime;\": \"\\u2034\",\r\n \"TRADE;\": \"\\u2122\",\r\n \"trade;\": \"\\u2122\",\r\n \"triangle;\": \"\\u25B5\",\r\n \"triangledown;\": \"\\u25BF\",\r\n \"triangleleft;\": \"\\u25C3\",\r\n \"trianglelefteq;\": \"\\u22B4\",\r\n \"triangleq;\": \"\\u225C\",\r\n \"triangleright;\": \"\\u25B9\",\r\n \"trianglerighteq;\": \"\\u22B5\",\r\n \"tridot;\": \"\\u25EC\",\r\n \"trie;\": \"\\u225C\",\r\n \"triminus;\": \"\\u2A3A\",\r\n \"TripleDot;\": \"\\u20DB\",\r\n \"triplus;\": \"\\u2A39\",\r\n \"trisb;\": \"\\u29CD\",\r\n \"tritime;\": \"\\u2A3B\",\r\n \"trpezium;\": \"\\u23E2\",\r\n \"Tscr;\": \"\\uD835\\uDCAF\",\r\n \"tscr;\": \"\\uD835\\uDCC9\",\r\n \"TScy;\": \"\\u0426\",\r\n \"tscy;\": \"\\u0446\",\r\n \"TSHcy;\": \"\\u040B\",\r\n \"tshcy;\": \"\\u045B\",\r\n \"Tstrok;\": \"\\u0166\",\r\n \"tstrok;\": \"\\u0167\",\r\n \"twixt;\": \"\\u226C\",\r\n \"twoheadleftarrow;\": \"\\u219E\",\r\n \"twoheadrightarrow;\": \"\\u21A0\",\r\n \"Uacute;\": \"\\u00DA\",\r\n \"Uacute\": \"\\u00DA\",\r\n \"uacute;\": \"\\u00FA\",\r\n \"uacute\": \"\\u00FA\",\r\n \"Uarr;\": \"\\u219F\",\r\n \"uArr;\": \"\\u21D1\",\r\n \"uarr;\": \"\\u2191\",\r\n \"Uarrocir;\": \"\\u2949\",\r\n \"Ubrcy;\": \"\\u040E\",\r\n \"ubrcy;\": \"\\u045E\",\r\n \"Ubreve;\": \"\\u016C\",\r\n \"ubreve;\": \"\\u016D\",\r\n \"Ucirc;\": \"\\u00DB\",\r\n \"Ucirc\": \"\\u00DB\",\r\n \"ucirc;\": \"\\u00FB\",\r\n \"ucirc\": \"\\u00FB\",\r\n \"Ucy;\": \"\\u0423\",\r\n \"ucy;\": \"\\u0443\",\r\n \"udarr;\": \"\\u21C5\",\r\n \"Udblac;\": \"\\u0170\",\r\n \"udblac;\": \"\\u0171\",\r\n \"udhar;\": \"\\u296E\",\r\n \"ufisht;\": \"\\u297E\",\r\n \"Ufr;\": \"\\uD835\\uDD18\",\r\n \"ufr;\": \"\\uD835\\uDD32\",\r\n \"Ugrave;\": \"\\u00D9\",\r\n \"Ugrave\": \"\\u00D9\",\r\n \"ugrave;\": \"\\u00F9\",\r\n \"ugrave\": \"\\u00F9\",\r\n \"uHar;\": \"\\u2963\",\r\n \"uharl;\": \"\\u21BF\",\r\n \"uharr;\": \"\\u21BE\",\r\n \"uhblk;\": \"\\u2580\",\r\n \"ulcorn;\": \"\\u231C\",\r\n \"ulcorner;\": \"\\u231C\",\r\n \"ulcrop;\": \"\\u230F\",\r\n \"ultri;\": \"\\u25F8\",\r\n \"Umacr;\": \"\\u016A\",\r\n \"umacr;\": \"\\u016B\",\r\n \"uml;\": \"\\u00A8\",\r\n \"uml\": \"\\u00A8\",\r\n \"UnderBar;\": \"_\",\r\n \"UnderBrace;\": \"\\u23DF\",\r\n \"UnderBracket;\": \"\\u23B5\",\r\n \"UnderParenthesis;\": \"\\u23DD\",\r\n \"Union;\": \"\\u22C3\",\r\n \"UnionPlus;\": \"\\u228E\",\r\n \"Uogon;\": \"\\u0172\",\r\n \"uogon;\": \"\\u0173\",\r\n \"Uopf;\": \"\\uD835\\uDD4C\",\r\n \"uopf;\": \"\\uD835\\uDD66\",\r\n \"UpArrow;\": \"\\u2191\",\r\n \"Uparrow;\": \"\\u21D1\",\r\n \"uparrow;\": \"\\u2191\",\r\n \"UpArrowBar;\": \"\\u2912\",\r\n \"UpArrowDownArrow;\": \"\\u21C5\",\r\n \"UpDownArrow;\": \"\\u2195\",\r\n \"Updownarrow;\": \"\\u21D5\",\r\n \"updownarrow;\": \"\\u2195\",\r\n \"UpEquilibrium;\": \"\\u296E\",\r\n \"upharpoonleft;\": \"\\u21BF\",\r\n \"upharpoonright;\": \"\\u21BE\",\r\n \"uplus;\": \"\\u228E\",\r\n \"UpperLeftArrow;\": \"\\u2196\",\r\n \"UpperRightArrow;\": \"\\u2197\",\r\n \"Upsi;\": \"\\u03D2\",\r\n \"upsi;\": \"\\u03C5\",\r\n \"upsih;\": \"\\u03D2\",\r\n \"Upsilon;\": \"\\u03A5\",\r\n \"upsilon;\": \"\\u03C5\",\r\n \"UpTee;\": \"\\u22A5\",\r\n \"UpTeeArrow;\": \"\\u21A5\",\r\n \"upuparrows;\": \"\\u21C8\",\r\n \"urcorn;\": \"\\u231D\",\r\n \"urcorner;\": \"\\u231D\",\r\n \"urcrop;\": \"\\u230E\",\r\n \"Uring;\": \"\\u016E\",\r\n \"uring;\": \"\\u016F\",\r\n \"urtri;\": \"\\u25F9\",\r\n \"Uscr;\": \"\\uD835\\uDCB0\",\r\n \"uscr;\": \"\\uD835\\uDCCA\",\r\n \"utdot;\": \"\\u22F0\",\r\n \"Utilde;\": \"\\u0168\",\r\n \"utilde;\": \"\\u0169\",\r\n \"utri;\": \"\\u25B5\",\r\n \"utrif;\": \"\\u25B4\",\r\n \"uuarr;\": \"\\u21C8\",\r\n \"Uuml;\": \"\\u00DC\",\r\n \"Uuml\": \"\\u00DC\",\r\n \"uuml;\": \"\\u00FC\",\r\n \"uuml\": \"\\u00FC\",\r\n \"uwangle;\": \"\\u29A7\",\r\n \"vangrt;\": \"\\u299C\",\r\n \"varepsilon;\": \"\\u03F5\",\r\n \"varkappa;\": \"\\u03F0\",\r\n \"varnothing;\": \"\\u2205\",\r\n \"varphi;\": \"\\u03D5\",\r\n \"varpi;\": \"\\u03D6\",\r\n \"varpropto;\": \"\\u221D\",\r\n \"vArr;\": \"\\u21D5\",\r\n \"varr;\": \"\\u2195\",\r\n \"varrho;\": \"\\u03F1\",\r\n \"varsigma;\": \"\\u03C2\",\r\n \"varsubsetneq;\": \"\\u228A\\uFE00\",\r\n \"varsubsetneqq;\": \"\\u2ACB\\uFE00\",\r\n \"varsupsetneq;\": \"\\u228B\\uFE00\",\r\n \"varsupsetneqq;\": \"\\u2ACC\\uFE00\",\r\n \"vartheta;\": \"\\u03D1\",\r\n \"vartriangleleft;\": \"\\u22B2\",\r\n \"vartriangleright;\": \"\\u22B3\",\r\n \"Vbar;\": \"\\u2AEB\",\r\n \"vBar;\": \"\\u2AE8\",\r\n \"vBarv;\": \"\\u2AE9\",\r\n \"Vcy;\": \"\\u0412\",\r\n \"vcy;\": \"\\u0432\",\r\n \"VDash;\": \"\\u22AB\",\r\n \"Vdash;\": \"\\u22A9\",\r\n \"vDash;\": \"\\u22A8\",\r\n \"vdash;\": \"\\u22A2\",\r\n \"Vdashl;\": \"\\u2AE6\",\r\n \"Vee;\": \"\\u22C1\",\r\n \"vee;\": \"\\u2228\",\r\n \"veebar;\": \"\\u22BB\",\r\n \"veeeq;\": \"\\u225A\",\r\n \"vellip;\": \"\\u22EE\",\r\n \"Verbar;\": \"\\u2016\",\r\n \"verbar;\": \"|\",\r\n \"Vert;\": \"\\u2016\",\r\n \"vert;\": \"|\",\r\n \"VerticalBar;\": \"\\u2223\",\r\n \"VerticalLine;\": \"|\",\r\n \"VerticalSeparator;\": \"\\u2758\",\r\n \"VerticalTilde;\": \"\\u2240\",\r\n \"VeryThinSpace;\": \"\\u200A\",\r\n \"Vfr;\": \"\\uD835\\uDD19\",\r\n \"vfr;\": \"\\uD835\\uDD33\",\r\n \"vltri;\": \"\\u22B2\",\r\n \"vnsub;\": \"\\u2282\\u20D2\",\r\n \"vnsup;\": \"\\u2283\\u20D2\",\r\n \"Vopf;\": \"\\uD835\\uDD4D\",\r\n \"vopf;\": \"\\uD835\\uDD67\",\r\n \"vprop;\": \"\\u221D\",\r\n \"vrtri;\": \"\\u22B3\",\r\n \"Vscr;\": \"\\uD835\\uDCB1\",\r\n \"vscr;\": \"\\uD835\\uDCCB\",\r\n \"vsubnE;\": \"\\u2ACB\\uFE00\",\r\n \"vsubne;\": \"\\u228A\\uFE00\",\r\n \"vsupnE;\": \"\\u2ACC\\uFE00\",\r\n \"vsupne;\": \"\\u228B\\uFE00\",\r\n \"Vvdash;\": \"\\u22AA\",\r\n \"vzigzag;\": \"\\u299A\",\r\n \"Wcirc;\": \"\\u0174\",\r\n \"wcirc;\": \"\\u0175\",\r\n \"wedbar;\": \"\\u2A5F\",\r\n \"Wedge;\": \"\\u22C0\",\r\n \"wedge;\": \"\\u2227\",\r\n \"wedgeq;\": \"\\u2259\",\r\n \"weierp;\": \"\\u2118\",\r\n \"Wfr;\": \"\\uD835\\uDD1A\",\r\n \"wfr;\": \"\\uD835\\uDD34\",\r\n \"Wopf;\": \"\\uD835\\uDD4E\",\r\n \"wopf;\": \"\\uD835\\uDD68\",\r\n \"wp;\": \"\\u2118\",\r\n \"wr;\": \"\\u2240\",\r\n \"wreath;\": \"\\u2240\",\r\n \"Wscr;\": \"\\uD835\\uDCB2\",\r\n \"wscr;\": \"\\uD835\\uDCCC\",\r\n \"xcap;\": \"\\u22C2\",\r\n \"xcirc;\": \"\\u25EF\",\r\n \"xcup;\": \"\\u22C3\",\r\n \"xdtri;\": \"\\u25BD\",\r\n \"Xfr;\": \"\\uD835\\uDD1B\",\r\n \"xfr;\": \"\\uD835\\uDD35\",\r\n \"xhArr;\": \"\\u27FA\",\r\n \"xharr;\": \"\\u27F7\",\r\n \"Xi;\": \"\\u039E\",\r\n \"xi;\": \"\\u03BE\",\r\n \"xlArr;\": \"\\u27F8\",\r\n \"xlarr;\": \"\\u27F5\",\r\n \"xmap;\": \"\\u27FC\",\r\n \"xnis;\": \"\\u22FB\",\r\n \"xodot;\": \"\\u2A00\",\r\n \"Xopf;\": \"\\uD835\\uDD4F\",\r\n \"xopf;\": \"\\uD835\\uDD69\",\r\n \"xoplus;\": \"\\u2A01\",\r\n \"xotime;\": \"\\u2A02\",\r\n \"xrArr;\": \"\\u27F9\",\r\n \"xrarr;\": \"\\u27F6\",\r\n \"Xscr;\": \"\\uD835\\uDCB3\",\r\n \"xscr;\": \"\\uD835\\uDCCD\",\r\n \"xsqcup;\": \"\\u2A06\",\r\n \"xuplus;\": \"\\u2A04\",\r\n \"xutri;\": \"\\u25B3\",\r\n \"xvee;\": \"\\u22C1\",\r\n \"xwedge;\": \"\\u22C0\",\r\n \"Yacute;\": \"\\u00DD\",\r\n \"Yacute\": \"\\u00DD\",\r\n \"yacute;\": \"\\u00FD\",\r\n \"yacute\": \"\\u00FD\",\r\n \"YAcy;\": \"\\u042F\",\r\n \"yacy;\": \"\\u044F\",\r\n \"Ycirc;\": \"\\u0176\",\r\n \"ycirc;\": \"\\u0177\",\r\n \"Ycy;\": \"\\u042B\",\r\n \"ycy;\": \"\\u044B\",\r\n \"yen;\": \"\\u00A5\",\r\n \"yen\": \"\\u00A5\",\r\n \"Yfr;\": \"\\uD835\\uDD1C\",\r\n \"yfr;\": \"\\uD835\\uDD36\",\r\n \"YIcy;\": \"\\u0407\",\r\n \"yicy;\": \"\\u0457\",\r\n \"Yopf;\": \"\\uD835\\uDD50\",\r\n \"yopf;\": \"\\uD835\\uDD6A\",\r\n \"Yscr;\": \"\\uD835\\uDCB4\",\r\n \"yscr;\": \"\\uD835\\uDCCE\",\r\n \"YUcy;\": \"\\u042E\",\r\n \"yucy;\": \"\\u044E\",\r\n \"Yuml;\": \"\\u0178\",\r\n \"yuml;\": \"\\u00FF\",\r\n \"yuml\": \"\\u00FF\",\r\n \"Zacute;\": \"\\u0179\",\r\n \"zacute;\": \"\\u017A\",\r\n \"Zcaron;\": \"\\u017D\",\r\n \"zcaron;\": \"\\u017E\",\r\n \"Zcy;\": \"\\u0417\",\r\n \"zcy;\": \"\\u0437\",\r\n \"Zdot;\": \"\\u017B\",\r\n \"zdot;\": \"\\u017C\",\r\n \"zeetrf;\": \"\\u2128\",\r\n \"ZeroWidthSpace;\": \"\\u200B\",\r\n \"Zeta;\": \"\\u0396\",\r\n \"zeta;\": \"\\u03B6\",\r\n \"Zfr;\": \"\\u2128\",\r\n \"zfr;\": \"\\uD835\\uDD37\",\r\n \"ZHcy;\": \"\\u0416\",\r\n \"zhcy;\": \"\\u0436\",\r\n \"zigrarr;\": \"\\u21DD\",\r\n \"Zopf;\": \"\\u2124\",\r\n \"zopf;\": \"\\uD835\\uDD6B\",\r\n \"Zscr;\": \"\\uD835\\uDCB5\",\r\n \"zscr;\": \"\\uD835\\uDCCF\",\r\n \"zwj;\": \"\\u200D\",\r\n \"zwnj;\": \"\\u200C\"\r\n }\r\n }, {}], 25: [function (require, module, exports) {\r\n exports.encode = require('./encode');\r\n exports.decode = require('./decode');\r\n\r\n }, { \"./decode\": 22, \"./encode\": 23 }], 26: [function (require, module, exports) {\r\n module.exports = {\r\n \"9\": \"Tab;\",\r\n \"10\": \"NewLine;\",\r\n \"33\": \"excl;\",\r\n \"34\": \"quot;\",\r\n \"35\": \"num;\",\r\n \"36\": \"dollar;\",\r\n \"37\": \"percnt;\",\r\n \"38\": \"amp;\",\r\n \"39\": \"apos;\",\r\n \"40\": \"lpar;\",\r\n \"41\": \"rpar;\",\r\n \"42\": \"midast;\",\r\n \"43\": \"plus;\",\r\n \"44\": \"comma;\",\r\n \"46\": \"period;\",\r\n \"47\": \"sol;\",\r\n \"58\": \"colon;\",\r\n \"59\": \"semi;\",\r\n \"60\": \"lt;\",\r\n \"61\": \"equals;\",\r\n \"62\": \"gt;\",\r\n \"63\": \"quest;\",\r\n \"64\": \"commat;\",\r\n \"91\": \"lsqb;\",\r\n \"92\": \"bsol;\",\r\n \"93\": \"rsqb;\",\r\n \"94\": \"Hat;\",\r\n \"95\": \"UnderBar;\",\r\n \"96\": \"grave;\",\r\n \"123\": \"lcub;\",\r\n \"124\": \"VerticalLine;\",\r\n \"125\": \"rcub;\",\r\n \"160\": \"NonBreakingSpace;\",\r\n \"161\": \"iexcl;\",\r\n \"162\": \"cent;\",\r\n \"163\": \"pound;\",\r\n \"164\": \"curren;\",\r\n \"165\": \"yen;\",\r\n \"166\": \"brvbar;\",\r\n \"167\": \"sect;\",\r\n \"168\": \"uml;\",\r\n \"169\": \"copy;\",\r\n \"170\": \"ordf;\",\r\n \"171\": \"laquo;\",\r\n \"172\": \"not;\",\r\n \"173\": \"shy;\",\r\n \"174\": \"reg;\",\r\n \"175\": \"strns;\",\r\n \"176\": \"deg;\",\r\n \"177\": \"pm;\",\r\n \"178\": \"sup2;\",\r\n \"179\": \"sup3;\",\r\n \"180\": \"DiacriticalAcute;\",\r\n \"181\": \"micro;\",\r\n \"182\": \"para;\",\r\n \"183\": \"middot;\",\r\n \"184\": \"Cedilla;\",\r\n \"185\": \"sup1;\",\r\n \"186\": \"ordm;\",\r\n \"187\": \"raquo;\",\r\n \"188\": \"frac14;\",\r\n \"189\": \"half;\",\r\n \"190\": \"frac34;\",\r\n \"191\": \"iquest;\",\r\n \"192\": \"Agrave;\",\r\n \"193\": \"Aacute;\",\r\n \"194\": \"Acirc;\",\r\n \"195\": \"Atilde;\",\r\n \"196\": \"Auml;\",\r\n \"197\": \"Aring;\",\r\n \"198\": \"AElig;\",\r\n \"199\": \"Ccedil;\",\r\n \"200\": \"Egrave;\",\r\n \"201\": \"Eacute;\",\r\n \"202\": \"Ecirc;\",\r\n \"203\": \"Euml;\",\r\n \"204\": \"Igrave;\",\r\n \"205\": \"Iacute;\",\r\n \"206\": \"Icirc;\",\r\n \"207\": \"Iuml;\",\r\n \"208\": \"ETH;\",\r\n \"209\": \"Ntilde;\",\r\n \"210\": \"Ograve;\",\r\n \"211\": \"Oacute;\",\r\n \"212\": \"Ocirc;\",\r\n \"213\": \"Otilde;\",\r\n \"214\": \"Ouml;\",\r\n \"215\": \"times;\",\r\n \"216\": \"Oslash;\",\r\n \"217\": \"Ugrave;\",\r\n \"218\": \"Uacute;\",\r\n \"219\": \"Ucirc;\",\r\n \"220\": \"Uuml;\",\r\n \"221\": \"Yacute;\",\r\n \"222\": \"THORN;\",\r\n \"223\": \"szlig;\",\r\n \"224\": \"agrave;\",\r\n \"225\": \"aacute;\",\r\n \"226\": \"acirc;\",\r\n \"227\": \"atilde;\",\r\n \"228\": \"auml;\",\r\n \"229\": \"aring;\",\r\n \"230\": \"aelig;\",\r\n \"231\": \"ccedil;\",\r\n \"232\": \"egrave;\",\r\n \"233\": \"eacute;\",\r\n \"234\": \"ecirc;\",\r\n \"235\": \"euml;\",\r\n \"236\": \"igrave;\",\r\n \"237\": \"iacute;\",\r\n \"238\": \"icirc;\",\r\n \"239\": \"iuml;\",\r\n \"240\": \"eth;\",\r\n \"241\": \"ntilde;\",\r\n \"242\": \"ograve;\",\r\n \"243\": \"oacute;\",\r\n \"244\": \"ocirc;\",\r\n \"245\": \"otilde;\",\r\n \"246\": \"ouml;\",\r\n \"247\": \"divide;\",\r\n \"248\": \"oslash;\",\r\n \"249\": \"ugrave;\",\r\n \"250\": \"uacute;\",\r\n \"251\": \"ucirc;\",\r\n \"252\": \"uuml;\",\r\n \"253\": \"yacute;\",\r\n \"254\": \"thorn;\",\r\n \"255\": \"yuml;\",\r\n \"256\": \"Amacr;\",\r\n \"257\": \"amacr;\",\r\n \"258\": \"Abreve;\",\r\n \"259\": \"abreve;\",\r\n \"260\": \"Aogon;\",\r\n \"261\": \"aogon;\",\r\n \"262\": \"Cacute;\",\r\n \"263\": \"cacute;\",\r\n \"264\": \"Ccirc;\",\r\n \"265\": \"ccirc;\",\r\n \"266\": \"Cdot;\",\r\n \"267\": \"cdot;\",\r\n \"268\": \"Ccaron;\",\r\n \"269\": \"ccaron;\",\r\n \"270\": \"Dcaron;\",\r\n \"271\": \"dcaron;\",\r\n \"272\": \"Dstrok;\",\r\n \"273\": \"dstrok;\",\r\n \"274\": \"Emacr;\",\r\n \"275\": \"emacr;\",\r\n \"278\": \"Edot;\",\r\n \"279\": \"edot;\",\r\n \"280\": \"Eogon;\",\r\n \"281\": \"eogon;\",\r\n \"282\": \"Ecaron;\",\r\n \"283\": \"ecaron;\",\r\n \"284\": \"Gcirc;\",\r\n \"285\": \"gcirc;\",\r\n \"286\": \"Gbreve;\",\r\n \"287\": \"gbreve;\",\r\n \"288\": \"Gdot;\",\r\n \"289\": \"gdot;\",\r\n \"290\": \"Gcedil;\",\r\n \"292\": \"Hcirc;\",\r\n \"293\": \"hcirc;\",\r\n \"294\": \"Hstrok;\",\r\n \"295\": \"hstrok;\",\r\n \"296\": \"Itilde;\",\r\n \"297\": \"itilde;\",\r\n \"298\": \"Imacr;\",\r\n \"299\": \"imacr;\",\r\n \"302\": \"Iogon;\",\r\n \"303\": \"iogon;\",\r\n \"304\": \"Idot;\",\r\n \"305\": \"inodot;\",\r\n \"306\": \"IJlig;\",\r\n \"307\": \"ijlig;\",\r\n \"308\": \"Jcirc;\",\r\n \"309\": \"jcirc;\",\r\n \"310\": \"Kcedil;\",\r\n \"311\": \"kcedil;\",\r\n \"312\": \"kgreen;\",\r\n \"313\": \"Lacute;\",\r\n \"314\": \"lacute;\",\r\n \"315\": \"Lcedil;\",\r\n \"316\": \"lcedil;\",\r\n \"317\": \"Lcaron;\",\r\n \"318\": \"lcaron;\",\r\n \"319\": \"Lmidot;\",\r\n \"320\": \"lmidot;\",\r\n \"321\": \"Lstrok;\",\r\n \"322\": \"lstrok;\",\r\n \"323\": \"Nacute;\",\r\n \"324\": \"nacute;\",\r\n \"325\": \"Ncedil;\",\r\n \"326\": \"ncedil;\",\r\n \"327\": \"Ncaron;\",\r\n \"328\": \"ncaron;\",\r\n \"329\": \"napos;\",\r\n \"330\": \"ENG;\",\r\n \"331\": \"eng;\",\r\n \"332\": \"Omacr;\",\r\n \"333\": \"omacr;\",\r\n \"336\": \"Odblac;\",\r\n \"337\": \"odblac;\",\r\n \"338\": \"OElig;\",\r\n \"339\": \"oelig;\",\r\n \"340\": \"Racute;\",\r\n \"341\": \"racute;\",\r\n \"342\": \"Rcedil;\",\r\n \"343\": \"rcedil;\",\r\n \"344\": \"Rcaron;\",\r\n \"345\": \"rcaron;\",\r\n \"346\": \"Sacute;\",\r\n \"347\": \"sacute;\",\r\n \"348\": \"Scirc;\",\r\n \"349\": \"scirc;\",\r\n \"350\": \"Scedil;\",\r\n \"351\": \"scedil;\",\r\n \"352\": \"Scaron;\",\r\n \"353\": \"scaron;\",\r\n \"354\": \"Tcedil;\",\r\n \"355\": \"tcedil;\",\r\n \"356\": \"Tcaron;\",\r\n \"357\": \"tcaron;\",\r\n \"358\": \"Tstrok;\",\r\n \"359\": \"tstrok;\",\r\n \"360\": \"Utilde;\",\r\n \"361\": \"utilde;\",\r\n \"362\": \"Umacr;\",\r\n \"363\": \"umacr;\",\r\n \"364\": \"Ubreve;\",\r\n \"365\": \"ubreve;\",\r\n \"366\": \"Uring;\",\r\n \"367\": \"uring;\",\r\n \"368\": \"Udblac;\",\r\n \"369\": \"udblac;\",\r\n \"370\": \"Uogon;\",\r\n \"371\": \"uogon;\",\r\n \"372\": \"Wcirc;\",\r\n \"373\": \"wcirc;\",\r\n \"374\": \"Ycirc;\",\r\n \"375\": \"ycirc;\",\r\n \"376\": \"Yuml;\",\r\n \"377\": \"Zacute;\",\r\n \"378\": \"zacute;\",\r\n \"379\": \"Zdot;\",\r\n \"380\": \"zdot;\",\r\n \"381\": \"Zcaron;\",\r\n \"382\": \"zcaron;\",\r\n \"402\": \"fnof;\",\r\n \"437\": \"imped;\",\r\n \"501\": \"gacute;\",\r\n \"567\": \"jmath;\",\r\n \"710\": \"circ;\",\r\n \"711\": \"Hacek;\",\r\n \"728\": \"breve;\",\r\n \"729\": \"dot;\",\r\n \"730\": \"ring;\",\r\n \"731\": \"ogon;\",\r\n \"732\": \"tilde;\",\r\n \"733\": \"DiacriticalDoubleAcute;\",\r\n \"785\": \"DownBreve;\",\r\n \"913\": \"Alpha;\",\r\n \"914\": \"Beta;\",\r\n \"915\": \"Gamma;\",\r\n \"916\": \"Delta;\",\r\n \"917\": \"Epsilon;\",\r\n \"918\": \"Zeta;\",\r\n \"919\": \"Eta;\",\r\n \"920\": \"Theta;\",\r\n \"921\": \"Iota;\",\r\n \"922\": \"Kappa;\",\r\n \"923\": \"Lambda;\",\r\n \"924\": \"Mu;\",\r\n \"925\": \"Nu;\",\r\n \"926\": \"Xi;\",\r\n \"927\": \"Omicron;\",\r\n \"928\": \"Pi;\",\r\n \"929\": \"Rho;\",\r\n \"931\": \"Sigma;\",\r\n \"932\": \"Tau;\",\r\n \"933\": \"Upsilon;\",\r\n \"934\": \"Phi;\",\r\n \"935\": \"Chi;\",\r\n \"936\": \"Psi;\",\r\n \"937\": \"Omega;\",\r\n \"945\": \"alpha;\",\r\n \"946\": \"beta;\",\r\n \"947\": \"gamma;\",\r\n \"948\": \"delta;\",\r\n \"949\": \"epsilon;\",\r\n \"950\": \"zeta;\",\r\n \"951\": \"eta;\",\r\n \"952\": \"theta;\",\r\n \"953\": \"iota;\",\r\n \"954\": \"kappa;\",\r\n \"955\": \"lambda;\",\r\n \"956\": \"mu;\",\r\n \"957\": \"nu;\",\r\n \"958\": \"xi;\",\r\n \"959\": \"omicron;\",\r\n \"960\": \"pi;\",\r\n \"961\": \"rho;\",\r\n \"962\": \"varsigma;\",\r\n \"963\": \"sigma;\",\r\n \"964\": \"tau;\",\r\n \"965\": \"upsilon;\",\r\n \"966\": \"phi;\",\r\n \"967\": \"chi;\",\r\n \"968\": \"psi;\",\r\n \"969\": \"omega;\",\r\n \"977\": \"vartheta;\",\r\n \"978\": \"upsih;\",\r\n \"981\": \"varphi;\",\r\n \"982\": \"varpi;\",\r\n \"988\": \"Gammad;\",\r\n \"989\": \"gammad;\",\r\n \"1008\": \"varkappa;\",\r\n \"1009\": \"varrho;\",\r\n \"1013\": \"varepsilon;\",\r\n \"1014\": \"bepsi;\",\r\n \"1025\": \"IOcy;\",\r\n \"1026\": \"DJcy;\",\r\n \"1027\": \"GJcy;\",\r\n \"1028\": \"Jukcy;\",\r\n \"1029\": \"DScy;\",\r\n \"1030\": \"Iukcy;\",\r\n \"1031\": \"YIcy;\",\r\n \"1032\": \"Jsercy;\",\r\n \"1033\": \"LJcy;\",\r\n \"1034\": \"NJcy;\",\r\n \"1035\": \"TSHcy;\",\r\n \"1036\": \"KJcy;\",\r\n \"1038\": \"Ubrcy;\",\r\n \"1039\": \"DZcy;\",\r\n \"1040\": \"Acy;\",\r\n \"1041\": \"Bcy;\",\r\n \"1042\": \"Vcy;\",\r\n \"1043\": \"Gcy;\",\r\n \"1044\": \"Dcy;\",\r\n \"1045\": \"IEcy;\",\r\n \"1046\": \"ZHcy;\",\r\n \"1047\": \"Zcy;\",\r\n \"1048\": \"Icy;\",\r\n \"1049\": \"Jcy;\",\r\n \"1050\": \"Kcy;\",\r\n \"1051\": \"Lcy;\",\r\n \"1052\": \"Mcy;\",\r\n \"1053\": \"Ncy;\",\r\n \"1054\": \"Ocy;\",\r\n \"1055\": \"Pcy;\",\r\n \"1056\": \"Rcy;\",\r\n \"1057\": \"Scy;\",\r\n \"1058\": \"Tcy;\",\r\n \"1059\": \"Ucy;\",\r\n \"1060\": \"Fcy;\",\r\n \"1061\": \"KHcy;\",\r\n \"1062\": \"TScy;\",\r\n \"1063\": \"CHcy;\",\r\n \"1064\": \"SHcy;\",\r\n \"1065\": \"SHCHcy;\",\r\n \"1066\": \"HARDcy;\",\r\n \"1067\": \"Ycy;\",\r\n \"1068\": \"SOFTcy;\",\r\n \"1069\": \"Ecy;\",\r\n \"1070\": \"YUcy;\",\r\n \"1071\": \"YAcy;\",\r\n \"1072\": \"acy;\",\r\n \"1073\": \"bcy;\",\r\n \"1074\": \"vcy;\",\r\n \"1075\": \"gcy;\",\r\n \"1076\": \"dcy;\",\r\n \"1077\": \"iecy;\",\r\n \"1078\": \"zhcy;\",\r\n \"1079\": \"zcy;\",\r\n \"1080\": \"icy;\",\r\n \"1081\": \"jcy;\",\r\n \"1082\": \"kcy;\",\r\n \"1083\": \"lcy;\",\r\n \"1084\": \"mcy;\",\r\n \"1085\": \"ncy;\",\r\n \"1086\": \"ocy;\",\r\n \"1087\": \"pcy;\",\r\n \"1088\": \"rcy;\",\r\n \"1089\": \"scy;\",\r\n \"1090\": \"tcy;\",\r\n \"1091\": \"ucy;\",\r\n \"1092\": \"fcy;\",\r\n \"1093\": \"khcy;\",\r\n \"1094\": \"tscy;\",\r\n \"1095\": \"chcy;\",\r\n \"1096\": \"shcy;\",\r\n \"1097\": \"shchcy;\",\r\n \"1098\": \"hardcy;\",\r\n \"1099\": \"ycy;\",\r\n \"1100\": \"softcy;\",\r\n \"1101\": \"ecy;\",\r\n \"1102\": \"yucy;\",\r\n \"1103\": \"yacy;\",\r\n \"1105\": \"iocy;\",\r\n \"1106\": \"djcy;\",\r\n \"1107\": \"gjcy;\",\r\n \"1108\": \"jukcy;\",\r\n \"1109\": \"dscy;\",\r\n \"1110\": \"iukcy;\",\r\n \"1111\": \"yicy;\",\r\n \"1112\": \"jsercy;\",\r\n \"1113\": \"ljcy;\",\r\n \"1114\": \"njcy;\",\r\n \"1115\": \"tshcy;\",\r\n \"1116\": \"kjcy;\",\r\n \"1118\": \"ubrcy;\",\r\n \"1119\": \"dzcy;\",\r\n \"8194\": \"ensp;\",\r\n \"8195\": \"emsp;\",\r\n \"8196\": \"emsp13;\",\r\n \"8197\": \"emsp14;\",\r\n \"8199\": \"numsp;\",\r\n \"8200\": \"puncsp;\",\r\n \"8201\": \"ThinSpace;\",\r\n \"8202\": \"VeryThinSpace;\",\r\n \"8203\": \"ZeroWidthSpace;\",\r\n \"8204\": \"zwnj;\",\r\n \"8205\": \"zwj;\",\r\n \"8206\": \"lrm;\",\r\n \"8207\": \"rlm;\",\r\n \"8208\": \"hyphen;\",\r\n \"8211\": \"ndash;\",\r\n \"8212\": \"mdash;\",\r\n \"8213\": \"horbar;\",\r\n \"8214\": \"Vert;\",\r\n \"8216\": \"OpenCurlyQuote;\",\r\n \"8217\": \"rsquor;\",\r\n \"8218\": \"sbquo;\",\r\n \"8220\": \"OpenCurlyDoubleQuote;\",\r\n \"8221\": \"rdquor;\",\r\n \"8222\": \"ldquor;\",\r\n \"8224\": \"dagger;\",\r\n \"8225\": \"ddagger;\",\r\n \"8226\": \"bullet;\",\r\n \"8229\": \"nldr;\",\r\n \"8230\": \"mldr;\",\r\n \"8240\": \"permil;\",\r\n \"8241\": \"pertenk;\",\r\n \"8242\": \"prime;\",\r\n \"8243\": \"Prime;\",\r\n \"8244\": \"tprime;\",\r\n \"8245\": \"bprime;\",\r\n \"8249\": \"lsaquo;\",\r\n \"8250\": \"rsaquo;\",\r\n \"8254\": \"OverBar;\",\r\n \"8257\": \"caret;\",\r\n \"8259\": \"hybull;\",\r\n \"8260\": \"frasl;\",\r\n \"8271\": \"bsemi;\",\r\n \"8279\": \"qprime;\",\r\n \"8287\": \"MediumSpace;\",\r\n \"8288\": \"NoBreak;\",\r\n \"8289\": \"ApplyFunction;\",\r\n \"8290\": \"it;\",\r\n \"8291\": \"InvisibleComma;\",\r\n \"8364\": \"euro;\",\r\n \"8411\": \"TripleDot;\",\r\n \"8412\": \"DotDot;\",\r\n \"8450\": \"Copf;\",\r\n \"8453\": \"incare;\",\r\n \"8458\": \"gscr;\",\r\n \"8459\": \"Hscr;\",\r\n \"8460\": \"Poincareplane;\",\r\n \"8461\": \"quaternions;\",\r\n \"8462\": \"planckh;\",\r\n \"8463\": \"plankv;\",\r\n \"8464\": \"Iscr;\",\r\n \"8465\": \"imagpart;\",\r\n \"8466\": \"Lscr;\",\r\n \"8467\": \"ell;\",\r\n \"8469\": \"Nopf;\",\r\n \"8470\": \"numero;\",\r\n \"8471\": \"copysr;\",\r\n \"8472\": \"wp;\",\r\n \"8473\": \"primes;\",\r\n \"8474\": \"rationals;\",\r\n \"8475\": \"Rscr;\",\r\n \"8476\": \"Rfr;\",\r\n \"8477\": \"Ropf;\",\r\n \"8478\": \"rx;\",\r\n \"8482\": \"trade;\",\r\n \"8484\": \"Zopf;\",\r\n \"8487\": \"mho;\",\r\n \"8488\": \"Zfr;\",\r\n \"8489\": \"iiota;\",\r\n \"8492\": \"Bscr;\",\r\n \"8493\": \"Cfr;\",\r\n \"8495\": \"escr;\",\r\n \"8496\": \"expectation;\",\r\n \"8497\": \"Fscr;\",\r\n \"8499\": \"phmmat;\",\r\n \"8500\": \"oscr;\",\r\n \"8501\": \"aleph;\",\r\n \"8502\": \"beth;\",\r\n \"8503\": \"gimel;\",\r\n \"8504\": \"daleth;\",\r\n \"8517\": \"DD;\",\r\n \"8518\": \"DifferentialD;\",\r\n \"8519\": \"exponentiale;\",\r\n \"8520\": \"ImaginaryI;\",\r\n \"8531\": \"frac13;\",\r\n \"8532\": \"frac23;\",\r\n \"8533\": \"frac15;\",\r\n \"8534\": \"frac25;\",\r\n \"8535\": \"frac35;\",\r\n \"8536\": \"frac45;\",\r\n \"8537\": \"frac16;\",\r\n \"8538\": \"frac56;\",\r\n \"8539\": \"frac18;\",\r\n \"8540\": \"frac38;\",\r\n \"8541\": \"frac58;\",\r\n \"8542\": \"frac78;\",\r\n \"8592\": \"slarr;\",\r\n \"8593\": \"uparrow;\",\r\n \"8594\": \"srarr;\",\r\n \"8595\": \"ShortDownArrow;\",\r\n \"8596\": \"leftrightarrow;\",\r\n \"8597\": \"varr;\",\r\n \"8598\": \"UpperLeftArrow;\",\r\n \"8599\": \"UpperRightArrow;\",\r\n \"8600\": \"searrow;\",\r\n \"8601\": \"swarrow;\",\r\n \"8602\": \"nleftarrow;\",\r\n \"8603\": \"nrightarrow;\",\r\n \"8605\": \"rightsquigarrow;\",\r\n \"8606\": \"twoheadleftarrow;\",\r\n \"8607\": \"Uarr;\",\r\n \"8608\": \"twoheadrightarrow;\",\r\n \"8609\": \"Darr;\",\r\n \"8610\": \"leftarrowtail;\",\r\n \"8611\": \"rightarrowtail;\",\r\n \"8612\": \"mapstoleft;\",\r\n \"8613\": \"UpTeeArrow;\",\r\n \"8614\": \"RightTeeArrow;\",\r\n \"8615\": \"mapstodown;\",\r\n \"8617\": \"larrhk;\",\r\n \"8618\": \"rarrhk;\",\r\n \"8619\": \"looparrowleft;\",\r\n \"8620\": \"rarrlp;\",\r\n \"8621\": \"leftrightsquigarrow;\",\r\n \"8622\": \"nleftrightarrow;\",\r\n \"8624\": \"lsh;\",\r\n \"8625\": \"rsh;\",\r\n \"8626\": \"ldsh;\",\r\n \"8627\": \"rdsh;\",\r\n \"8629\": \"crarr;\",\r\n \"8630\": \"curvearrowleft;\",\r\n \"8631\": \"curvearrowright;\",\r\n \"8634\": \"olarr;\",\r\n \"8635\": \"orarr;\",\r\n \"8636\": \"lharu;\",\r\n \"8637\": \"lhard;\",\r\n \"8638\": \"upharpoonright;\",\r\n \"8639\": \"upharpoonleft;\",\r\n \"8640\": \"RightVector;\",\r\n \"8641\": \"rightharpoondown;\",\r\n \"8642\": \"RightDownVector;\",\r\n \"8643\": \"LeftDownVector;\",\r\n \"8644\": \"rlarr;\",\r\n \"8645\": \"UpArrowDownArrow;\",\r\n \"8646\": \"lrarr;\",\r\n \"8647\": \"llarr;\",\r\n \"8648\": \"uuarr;\",\r\n \"8649\": \"rrarr;\",\r\n \"8650\": \"downdownarrows;\",\r\n \"8651\": \"ReverseEquilibrium;\",\r\n \"8652\": \"rlhar;\",\r\n \"8653\": \"nLeftarrow;\",\r\n \"8654\": \"nLeftrightarrow;\",\r\n \"8655\": \"nRightarrow;\",\r\n \"8656\": \"Leftarrow;\",\r\n \"8657\": \"Uparrow;\",\r\n \"8658\": \"Rightarrow;\",\r\n \"8659\": \"Downarrow;\",\r\n \"8660\": \"Leftrightarrow;\",\r\n \"8661\": \"vArr;\",\r\n \"8662\": \"nwArr;\",\r\n \"8663\": \"neArr;\",\r\n \"8664\": \"seArr;\",\r\n \"8665\": \"swArr;\",\r\n \"8666\": \"Lleftarrow;\",\r\n \"8667\": \"Rrightarrow;\",\r\n \"8669\": \"zigrarr;\",\r\n \"8676\": \"LeftArrowBar;\",\r\n \"8677\": \"RightArrowBar;\",\r\n \"8693\": \"duarr;\",\r\n \"8701\": \"loarr;\",\r\n \"8702\": \"roarr;\",\r\n \"8703\": \"hoarr;\",\r\n \"8704\": \"forall;\",\r\n \"8705\": \"complement;\",\r\n \"8706\": \"PartialD;\",\r\n \"8707\": \"Exists;\",\r\n \"8708\": \"NotExists;\",\r\n \"8709\": \"varnothing;\",\r\n \"8711\": \"nabla;\",\r\n \"8712\": \"isinv;\",\r\n \"8713\": \"notinva;\",\r\n \"8715\": \"SuchThat;\",\r\n \"8716\": \"NotReverseElement;\",\r\n \"8719\": \"Product;\",\r\n \"8720\": \"Coproduct;\",\r\n \"8721\": \"sum;\",\r\n \"8722\": \"minus;\",\r\n \"8723\": \"mp;\",\r\n \"8724\": \"plusdo;\",\r\n \"8726\": \"ssetmn;\",\r\n \"8727\": \"lowast;\",\r\n \"8728\": \"SmallCircle;\",\r\n \"8730\": \"Sqrt;\",\r\n \"8733\": \"vprop;\",\r\n \"8734\": \"infin;\",\r\n \"8735\": \"angrt;\",\r\n \"8736\": \"angle;\",\r\n \"8737\": \"measuredangle;\",\r\n \"8738\": \"angsph;\",\r\n \"8739\": \"VerticalBar;\",\r\n \"8740\": \"nsmid;\",\r\n \"8741\": \"spar;\",\r\n \"8742\": \"nspar;\",\r\n \"8743\": \"wedge;\",\r\n \"8744\": \"vee;\",\r\n \"8745\": \"cap;\",\r\n \"8746\": \"cup;\",\r\n \"8747\": \"Integral;\",\r\n \"8748\": \"Int;\",\r\n \"8749\": \"tint;\",\r\n \"8750\": \"oint;\",\r\n \"8751\": \"DoubleContourIntegral;\",\r\n \"8752\": \"Cconint;\",\r\n \"8753\": \"cwint;\",\r\n \"8754\": \"cwconint;\",\r\n \"8755\": \"CounterClockwiseContourIntegral;\",\r\n \"8756\": \"therefore;\",\r\n \"8757\": \"because;\",\r\n \"8758\": \"ratio;\",\r\n \"8759\": \"Proportion;\",\r\n \"8760\": \"minusd;\",\r\n \"8762\": \"mDDot;\",\r\n \"8763\": \"homtht;\",\r\n \"8764\": \"Tilde;\",\r\n \"8765\": \"bsim;\",\r\n \"8766\": \"mstpos;\",\r\n \"8767\": \"acd;\",\r\n \"8768\": \"wreath;\",\r\n \"8769\": \"nsim;\",\r\n \"8770\": \"esim;\",\r\n \"8771\": \"TildeEqual;\",\r\n \"8772\": \"nsimeq;\",\r\n \"8773\": \"TildeFullEqual;\",\r\n \"8774\": \"simne;\",\r\n \"8775\": \"NotTildeFullEqual;\",\r\n \"8776\": \"TildeTilde;\",\r\n \"8777\": \"NotTildeTilde;\",\r\n \"8778\": \"approxeq;\",\r\n \"8779\": \"apid;\",\r\n \"8780\": \"bcong;\",\r\n \"8781\": \"CupCap;\",\r\n \"8782\": \"HumpDownHump;\",\r\n \"8783\": \"HumpEqual;\",\r\n \"8784\": \"esdot;\",\r\n \"8785\": \"eDot;\",\r\n \"8786\": \"fallingdotseq;\",\r\n \"8787\": \"risingdotseq;\",\r\n \"8788\": \"coloneq;\",\r\n \"8789\": \"eqcolon;\",\r\n \"8790\": \"eqcirc;\",\r\n \"8791\": \"cire;\",\r\n \"8793\": \"wedgeq;\",\r\n \"8794\": \"veeeq;\",\r\n \"8796\": \"trie;\",\r\n \"8799\": \"questeq;\",\r\n \"8800\": \"NotEqual;\",\r\n \"8801\": \"equiv;\",\r\n \"8802\": \"NotCongruent;\",\r\n \"8804\": \"leq;\",\r\n \"8805\": \"GreaterEqual;\",\r\n \"8806\": \"LessFullEqual;\",\r\n \"8807\": \"GreaterFullEqual;\",\r\n \"8808\": \"lneqq;\",\r\n \"8809\": \"gneqq;\",\r\n \"8810\": \"NestedLessLess;\",\r\n \"8811\": \"NestedGreaterGreater;\",\r\n \"8812\": \"twixt;\",\r\n \"8813\": \"NotCupCap;\",\r\n \"8814\": \"NotLess;\",\r\n \"8815\": \"NotGreater;\",\r\n \"8816\": \"NotLessEqual;\",\r\n \"8817\": \"NotGreaterEqual;\",\r\n \"8818\": \"lsim;\",\r\n \"8819\": \"gtrsim;\",\r\n \"8820\": \"NotLessTilde;\",\r\n \"8821\": \"NotGreaterTilde;\",\r\n \"8822\": \"lg;\",\r\n \"8823\": \"gtrless;\",\r\n \"8824\": \"ntlg;\",\r\n \"8825\": \"ntgl;\",\r\n \"8826\": \"Precedes;\",\r\n \"8827\": \"Succeeds;\",\r\n \"8828\": \"PrecedesSlantEqual;\",\r\n \"8829\": \"SucceedsSlantEqual;\",\r\n \"8830\": \"prsim;\",\r\n \"8831\": \"succsim;\",\r\n \"8832\": \"nprec;\",\r\n \"8833\": \"nsucc;\",\r\n \"8834\": \"subset;\",\r\n \"8835\": \"supset;\",\r\n \"8836\": \"nsub;\",\r\n \"8837\": \"nsup;\",\r\n \"8838\": \"SubsetEqual;\",\r\n \"8839\": \"supseteq;\",\r\n \"8840\": \"nsubseteq;\",\r\n \"8841\": \"nsupseteq;\",\r\n \"8842\": \"subsetneq;\",\r\n \"8843\": \"supsetneq;\",\r\n \"8845\": \"cupdot;\",\r\n \"8846\": \"uplus;\",\r\n \"8847\": \"SquareSubset;\",\r\n \"8848\": \"SquareSuperset;\",\r\n \"8849\": \"SquareSubsetEqual;\",\r\n \"8850\": \"SquareSupersetEqual;\",\r\n \"8851\": \"SquareIntersection;\",\r\n \"8852\": \"SquareUnion;\",\r\n \"8853\": \"oplus;\",\r\n \"8854\": \"ominus;\",\r\n \"8855\": \"otimes;\",\r\n \"8856\": \"osol;\",\r\n \"8857\": \"odot;\",\r\n \"8858\": \"ocir;\",\r\n \"8859\": \"oast;\",\r\n \"8861\": \"odash;\",\r\n \"8862\": \"plusb;\",\r\n \"8863\": \"minusb;\",\r\n \"8864\": \"timesb;\",\r\n \"8865\": \"sdotb;\",\r\n \"8866\": \"vdash;\",\r\n \"8867\": \"LeftTee;\",\r\n \"8868\": \"top;\",\r\n \"8869\": \"UpTee;\",\r\n \"8871\": \"models;\",\r\n \"8872\": \"vDash;\",\r\n \"8873\": \"Vdash;\",\r\n \"8874\": \"Vvdash;\",\r\n \"8875\": \"VDash;\",\r\n \"8876\": \"nvdash;\",\r\n \"8877\": \"nvDash;\",\r\n \"8878\": \"nVdash;\",\r\n \"8879\": \"nVDash;\",\r\n \"8880\": \"prurel;\",\r\n \"8882\": \"vltri;\",\r\n \"8883\": \"vrtri;\",\r\n \"8884\": \"trianglelefteq;\",\r\n \"8885\": \"trianglerighteq;\",\r\n \"8886\": \"origof;\",\r\n \"8887\": \"imof;\",\r\n \"8888\": \"mumap;\",\r\n \"8889\": \"hercon;\",\r\n \"8890\": \"intercal;\",\r\n \"8891\": \"veebar;\",\r\n \"8893\": \"barvee;\",\r\n \"8894\": \"angrtvb;\",\r\n \"8895\": \"lrtri;\",\r\n \"8896\": \"xwedge;\",\r\n \"8897\": \"xvee;\",\r\n \"8898\": \"xcap;\",\r\n \"8899\": \"xcup;\",\r\n \"8900\": \"diamond;\",\r\n \"8901\": \"sdot;\",\r\n \"8902\": \"Star;\",\r\n \"8903\": \"divonx;\",\r\n \"8904\": \"bowtie;\",\r\n \"8905\": \"ltimes;\",\r\n \"8906\": \"rtimes;\",\r\n \"8907\": \"lthree;\",\r\n \"8908\": \"rthree;\",\r\n \"8909\": \"bsime;\",\r\n \"8910\": \"cuvee;\",\r\n \"8911\": \"cuwed;\",\r\n \"8912\": \"Subset;\",\r\n \"8913\": \"Supset;\",\r\n \"8914\": \"Cap;\",\r\n \"8915\": \"Cup;\",\r\n \"8916\": \"pitchfork;\",\r\n \"8917\": \"epar;\",\r\n \"8918\": \"ltdot;\",\r\n \"8919\": \"gtrdot;\",\r\n \"8920\": \"Ll;\",\r\n \"8921\": \"ggg;\",\r\n \"8922\": \"LessEqualGreater;\",\r\n \"8923\": \"gtreqless;\",\r\n \"8926\": \"curlyeqprec;\",\r\n \"8927\": \"curlyeqsucc;\",\r\n \"8928\": \"nprcue;\",\r\n \"8929\": \"nsccue;\",\r\n \"8930\": \"nsqsube;\",\r\n \"8931\": \"nsqsupe;\",\r\n \"8934\": \"lnsim;\",\r\n \"8935\": \"gnsim;\",\r\n \"8936\": \"prnsim;\",\r\n \"8937\": \"succnsim;\",\r\n \"8938\": \"ntriangleleft;\",\r\n \"8939\": \"ntriangleright;\",\r\n \"8940\": \"ntrianglelefteq;\",\r\n \"8941\": \"ntrianglerighteq;\",\r\n \"8942\": \"vellip;\",\r\n \"8943\": \"ctdot;\",\r\n \"8944\": \"utdot;\",\r\n \"8945\": \"dtdot;\",\r\n \"8946\": \"disin;\",\r\n \"8947\": \"isinsv;\",\r\n \"8948\": \"isins;\",\r\n \"8949\": \"isindot;\",\r\n \"8950\": \"notinvc;\",\r\n \"8951\": \"notinvb;\",\r\n \"8953\": \"isinE;\",\r\n \"8954\": \"nisd;\",\r\n \"8955\": \"xnis;\",\r\n \"8956\": \"nis;\",\r\n \"8957\": \"notnivc;\",\r\n \"8958\": \"notnivb;\",\r\n \"8965\": \"barwedge;\",\r\n \"8966\": \"doublebarwedge;\",\r\n \"8968\": \"LeftCeiling;\",\r\n \"8969\": \"RightCeiling;\",\r\n \"8970\": \"lfloor;\",\r\n \"8971\": \"RightFloor;\",\r\n \"8972\": \"drcrop;\",\r\n \"8973\": \"dlcrop;\",\r\n \"8974\": \"urcrop;\",\r\n \"8975\": \"ulcrop;\",\r\n \"8976\": \"bnot;\",\r\n \"8978\": \"profline;\",\r\n \"8979\": \"profsurf;\",\r\n \"8981\": \"telrec;\",\r\n \"8982\": \"target;\",\r\n \"8988\": \"ulcorner;\",\r\n \"8989\": \"urcorner;\",\r\n \"8990\": \"llcorner;\",\r\n \"8991\": \"lrcorner;\",\r\n \"8994\": \"sfrown;\",\r\n \"8995\": \"ssmile;\",\r\n \"9005\": \"cylcty;\",\r\n \"9006\": \"profalar;\",\r\n \"9014\": \"topbot;\",\r\n \"9021\": \"ovbar;\",\r\n \"9023\": \"solbar;\",\r\n \"9084\": \"angzarr;\",\r\n \"9136\": \"lmoustache;\",\r\n \"9137\": \"rmoustache;\",\r\n \"9140\": \"tbrk;\",\r\n \"9141\": \"UnderBracket;\",\r\n \"9142\": \"bbrktbrk;\",\r\n \"9180\": \"OverParenthesis;\",\r\n \"9181\": \"UnderParenthesis;\",\r\n \"9182\": \"OverBrace;\",\r\n \"9183\": \"UnderBrace;\",\r\n \"9186\": \"trpezium;\",\r\n \"9191\": \"elinters;\",\r\n \"9251\": \"blank;\",\r\n \"9416\": \"oS;\",\r\n \"9472\": \"HorizontalLine;\",\r\n \"9474\": \"boxv;\",\r\n \"9484\": \"boxdr;\",\r\n \"9488\": \"boxdl;\",\r\n \"9492\": \"boxur;\",\r\n \"9496\": \"boxul;\",\r\n \"9500\": \"boxvr;\",\r\n \"9508\": \"boxvl;\",\r\n \"9516\": \"boxhd;\",\r\n \"9524\": \"boxhu;\",\r\n \"9532\": \"boxvh;\",\r\n \"9552\": \"boxH;\",\r\n \"9553\": \"boxV;\",\r\n \"9554\": \"boxdR;\",\r\n \"9555\": \"boxDr;\",\r\n \"9556\": \"boxDR;\",\r\n \"9557\": \"boxdL;\",\r\n \"9558\": \"boxDl;\",\r\n \"9559\": \"boxDL;\",\r\n \"9560\": \"boxuR;\",\r\n \"9561\": \"boxUr;\",\r\n \"9562\": \"boxUR;\",\r\n \"9563\": \"boxuL;\",\r\n \"9564\": \"boxUl;\",\r\n \"9565\": \"boxUL;\",\r\n \"9566\": \"boxvR;\",\r\n \"9567\": \"boxVr;\",\r\n \"9568\": \"boxVR;\",\r\n \"9569\": \"boxvL;\",\r\n \"9570\": \"boxVl;\",\r\n \"9571\": \"boxVL;\",\r\n \"9572\": \"boxHd;\",\r\n \"9573\": \"boxhD;\",\r\n \"9574\": \"boxHD;\",\r\n \"9575\": \"boxHu;\",\r\n \"9576\": \"boxhU;\",\r\n \"9577\": \"boxHU;\",\r\n \"9578\": \"boxvH;\",\r\n \"9579\": \"boxVh;\",\r\n \"9580\": \"boxVH;\",\r\n \"9600\": \"uhblk;\",\r\n \"9604\": \"lhblk;\",\r\n \"9608\": \"block;\",\r\n \"9617\": \"blk14;\",\r\n \"9618\": \"blk12;\",\r\n \"9619\": \"blk34;\",\r\n \"9633\": \"square;\",\r\n \"9642\": \"squf;\",\r\n \"9643\": \"EmptyVerySmallSquare;\",\r\n \"9645\": \"rect;\",\r\n \"9646\": \"marker;\",\r\n \"9649\": \"fltns;\",\r\n \"9651\": \"xutri;\",\r\n \"9652\": \"utrif;\",\r\n \"9653\": \"utri;\",\r\n \"9656\": \"rtrif;\",\r\n \"9657\": \"triangleright;\",\r\n \"9661\": \"xdtri;\",\r\n \"9662\": \"dtrif;\",\r\n \"9663\": \"triangledown;\",\r\n \"9666\": \"ltrif;\",\r\n \"9667\": \"triangleleft;\",\r\n \"9674\": \"lozenge;\",\r\n \"9675\": \"cir;\",\r\n \"9708\": \"tridot;\",\r\n \"9711\": \"xcirc;\",\r\n \"9720\": \"ultri;\",\r\n \"9721\": \"urtri;\",\r\n \"9722\": \"lltri;\",\r\n \"9723\": \"EmptySmallSquare;\",\r\n \"9724\": \"FilledSmallSquare;\",\r\n \"9733\": \"starf;\",\r\n \"9734\": \"star;\",\r\n \"9742\": \"phone;\",\r\n \"9792\": \"female;\",\r\n \"9794\": \"male;\",\r\n \"9824\": \"spadesuit;\",\r\n \"9827\": \"clubsuit;\",\r\n \"9829\": \"heartsuit;\",\r\n \"9830\": \"diams;\",\r\n \"9834\": \"sung;\",\r\n \"9837\": \"flat;\",\r\n \"9838\": \"natural;\",\r\n \"9839\": \"sharp;\",\r\n \"10003\": \"checkmark;\",\r\n \"10007\": \"cross;\",\r\n \"10016\": \"maltese;\",\r\n \"10038\": \"sext;\",\r\n \"10072\": \"VerticalSeparator;\",\r\n \"10098\": \"lbbrk;\",\r\n \"10099\": \"rbbrk;\",\r\n \"10184\": \"bsolhsub;\",\r\n \"10185\": \"suphsol;\",\r\n \"10214\": \"lobrk;\",\r\n \"10215\": \"robrk;\",\r\n \"10216\": \"LeftAngleBracket;\",\r\n \"10217\": \"RightAngleBracket;\",\r\n \"10218\": \"Lang;\",\r\n \"10219\": \"Rang;\",\r\n \"10220\": \"loang;\",\r\n \"10221\": \"roang;\",\r\n \"10229\": \"xlarr;\",\r\n \"10230\": \"xrarr;\",\r\n \"10231\": \"xharr;\",\r\n \"10232\": \"xlArr;\",\r\n \"10233\": \"xrArr;\",\r\n \"10234\": \"xhArr;\",\r\n \"10236\": \"xmap;\",\r\n \"10239\": \"dzigrarr;\",\r\n \"10498\": \"nvlArr;\",\r\n \"10499\": \"nvrArr;\",\r\n \"10500\": \"nvHarr;\",\r\n \"10501\": \"Map;\",\r\n \"10508\": \"lbarr;\",\r\n \"10509\": \"rbarr;\",\r\n \"10510\": \"lBarr;\",\r\n \"10511\": \"rBarr;\",\r\n \"10512\": \"RBarr;\",\r\n \"10513\": \"DDotrahd;\",\r\n \"10514\": \"UpArrowBar;\",\r\n \"10515\": \"DownArrowBar;\",\r\n \"10518\": \"Rarrtl;\",\r\n \"10521\": \"latail;\",\r\n \"10522\": \"ratail;\",\r\n \"10523\": \"lAtail;\",\r\n \"10524\": \"rAtail;\",\r\n \"10525\": \"larrfs;\",\r\n \"10526\": \"rarrfs;\",\r\n \"10527\": \"larrbfs;\",\r\n \"10528\": \"rarrbfs;\",\r\n \"10531\": \"nwarhk;\",\r\n \"10532\": \"nearhk;\",\r\n \"10533\": \"searhk;\",\r\n \"10534\": \"swarhk;\",\r\n \"10535\": \"nwnear;\",\r\n \"10536\": \"toea;\",\r\n \"10537\": \"tosa;\",\r\n \"10538\": \"swnwar;\",\r\n \"10547\": \"rarrc;\",\r\n \"10549\": \"cudarrr;\",\r\n \"10550\": \"ldca;\",\r\n \"10551\": \"rdca;\",\r\n \"10552\": \"cudarrl;\",\r\n \"10553\": \"larrpl;\",\r\n \"10556\": \"curarrm;\",\r\n \"10557\": \"cularrp;\",\r\n \"10565\": \"rarrpl;\",\r\n \"10568\": \"harrcir;\",\r\n \"10569\": \"Uarrocir;\",\r\n \"10570\": \"lurdshar;\",\r\n \"10571\": \"ldrushar;\",\r\n \"10574\": \"LeftRightVector;\",\r\n \"10575\": \"RightUpDownVector;\",\r\n \"10576\": \"DownLeftRightVector;\",\r\n \"10577\": \"LeftUpDownVector;\",\r\n \"10578\": \"LeftVectorBar;\",\r\n \"10579\": \"RightVectorBar;\",\r\n \"10580\": \"RightUpVectorBar;\",\r\n \"10581\": \"RightDownVectorBar;\",\r\n \"10582\": \"DownLeftVectorBar;\",\r\n \"10583\": \"DownRightVectorBar;\",\r\n \"10584\": \"LeftUpVectorBar;\",\r\n \"10585\": \"LeftDownVectorBar;\",\r\n \"10586\": \"LeftTeeVector;\",\r\n \"10587\": \"RightTeeVector;\",\r\n \"10588\": \"RightUpTeeVector;\",\r\n \"10589\": \"RightDownTeeVector;\",\r\n \"10590\": \"DownLeftTeeVector;\",\r\n \"10591\": \"DownRightTeeVector;\",\r\n \"10592\": \"LeftUpTeeVector;\",\r\n \"10593\": \"LeftDownTeeVector;\",\r\n \"10594\": \"lHar;\",\r\n \"10595\": \"uHar;\",\r\n \"10596\": \"rHar;\",\r\n \"10597\": \"dHar;\",\r\n \"10598\": \"luruhar;\",\r\n \"10599\": \"ldrdhar;\",\r\n \"10600\": \"ruluhar;\",\r\n \"10601\": \"rdldhar;\",\r\n \"10602\": \"lharul;\",\r\n \"10603\": \"llhard;\",\r\n \"10604\": \"rharul;\",\r\n \"10605\": \"lrhard;\",\r\n \"10606\": \"UpEquilibrium;\",\r\n \"10607\": \"ReverseUpEquilibrium;\",\r\n \"10608\": \"RoundImplies;\",\r\n \"10609\": \"erarr;\",\r\n \"10610\": \"simrarr;\",\r\n \"10611\": \"larrsim;\",\r\n \"10612\": \"rarrsim;\",\r\n \"10613\": \"rarrap;\",\r\n \"10614\": \"ltlarr;\",\r\n \"10616\": \"gtrarr;\",\r\n \"10617\": \"subrarr;\",\r\n \"10619\": \"suplarr;\",\r\n \"10620\": \"lfisht;\",\r\n \"10621\": \"rfisht;\",\r\n \"10622\": \"ufisht;\",\r\n \"10623\": \"dfisht;\",\r\n \"10629\": \"lopar;\",\r\n \"10630\": \"ropar;\",\r\n \"10635\": \"lbrke;\",\r\n \"10636\": \"rbrke;\",\r\n \"10637\": \"lbrkslu;\",\r\n \"10638\": \"rbrksld;\",\r\n \"10639\": \"lbrksld;\",\r\n \"10640\": \"rbrkslu;\",\r\n \"10641\": \"langd;\",\r\n \"10642\": \"rangd;\",\r\n \"10643\": \"lparlt;\",\r\n \"10644\": \"rpargt;\",\r\n \"10645\": \"gtlPar;\",\r\n \"10646\": \"ltrPar;\",\r\n \"10650\": \"vzigzag;\",\r\n \"10652\": \"vangrt;\",\r\n \"10653\": \"angrtvbd;\",\r\n \"10660\": \"ange;\",\r\n \"10661\": \"range;\",\r\n \"10662\": \"dwangle;\",\r\n \"10663\": \"uwangle;\",\r\n \"10664\": \"angmsdaa;\",\r\n \"10665\": \"angmsdab;\",\r\n \"10666\": \"angmsdac;\",\r\n \"10667\": \"angmsdad;\",\r\n \"10668\": \"angmsdae;\",\r\n \"10669\": \"angmsdaf;\",\r\n \"10670\": \"angmsdag;\",\r\n \"10671\": \"angmsdah;\",\r\n \"10672\": \"bemptyv;\",\r\n \"10673\": \"demptyv;\",\r\n \"10674\": \"cemptyv;\",\r\n \"10675\": \"raemptyv;\",\r\n \"10676\": \"laemptyv;\",\r\n \"10677\": \"ohbar;\",\r\n \"10678\": \"omid;\",\r\n \"10679\": \"opar;\",\r\n \"10681\": \"operp;\",\r\n \"10683\": \"olcross;\",\r\n \"10684\": \"odsold;\",\r\n \"10686\": \"olcir;\",\r\n \"10687\": \"ofcir;\",\r\n \"10688\": \"olt;\",\r\n \"10689\": \"ogt;\",\r\n \"10690\": \"cirscir;\",\r\n \"10691\": \"cirE;\",\r\n \"10692\": \"solb;\",\r\n \"10693\": \"bsolb;\",\r\n \"10697\": \"boxbox;\",\r\n \"10701\": \"trisb;\",\r\n \"10702\": \"rtriltri;\",\r\n \"10703\": \"LeftTriangleBar;\",\r\n \"10704\": \"RightTriangleBar;\",\r\n \"10716\": \"iinfin;\",\r\n \"10717\": \"infintie;\",\r\n \"10718\": \"nvinfin;\",\r\n \"10723\": \"eparsl;\",\r\n \"10724\": \"smeparsl;\",\r\n \"10725\": \"eqvparsl;\",\r\n \"10731\": \"lozf;\",\r\n \"10740\": \"RuleDelayed;\",\r\n \"10742\": \"dsol;\",\r\n \"10752\": \"xodot;\",\r\n \"10753\": \"xoplus;\",\r\n \"10754\": \"xotime;\",\r\n \"10756\": \"xuplus;\",\r\n \"10758\": \"xsqcup;\",\r\n \"10764\": \"qint;\",\r\n \"10765\": \"fpartint;\",\r\n \"10768\": \"cirfnint;\",\r\n \"10769\": \"awint;\",\r\n \"10770\": \"rppolint;\",\r\n \"10771\": \"scpolint;\",\r\n \"10772\": \"npolint;\",\r\n \"10773\": \"pointint;\",\r\n \"10774\": \"quatint;\",\r\n \"10775\": \"intlarhk;\",\r\n \"10786\": \"pluscir;\",\r\n \"10787\": \"plusacir;\",\r\n \"10788\": \"simplus;\",\r\n \"10789\": \"plusdu;\",\r\n \"10790\": \"plussim;\",\r\n \"10791\": \"plustwo;\",\r\n \"10793\": \"mcomma;\",\r\n \"10794\": \"minusdu;\",\r\n \"10797\": \"loplus;\",\r\n \"10798\": \"roplus;\",\r\n \"10799\": \"Cross;\",\r\n \"10800\": \"timesd;\",\r\n \"10801\": \"timesbar;\",\r\n \"10803\": \"smashp;\",\r\n \"10804\": \"lotimes;\",\r\n \"10805\": \"rotimes;\",\r\n \"10806\": \"otimesas;\",\r\n \"10807\": \"Otimes;\",\r\n \"10808\": \"odiv;\",\r\n \"10809\": \"triplus;\",\r\n \"10810\": \"triminus;\",\r\n \"10811\": \"tritime;\",\r\n \"10812\": \"iprod;\",\r\n \"10815\": \"amalg;\",\r\n \"10816\": \"capdot;\",\r\n \"10818\": \"ncup;\",\r\n \"10819\": \"ncap;\",\r\n \"10820\": \"capand;\",\r\n \"10821\": \"cupor;\",\r\n \"10822\": \"cupcap;\",\r\n \"10823\": \"capcup;\",\r\n \"10824\": \"cupbrcap;\",\r\n \"10825\": \"capbrcup;\",\r\n \"10826\": \"cupcup;\",\r\n \"10827\": \"capcap;\",\r\n \"10828\": \"ccups;\",\r\n \"10829\": \"ccaps;\",\r\n \"10832\": \"ccupssm;\",\r\n \"10835\": \"And;\",\r\n \"10836\": \"Or;\",\r\n \"10837\": \"andand;\",\r\n \"10838\": \"oror;\",\r\n \"10839\": \"orslope;\",\r\n \"10840\": \"andslope;\",\r\n \"10842\": \"andv;\",\r\n \"10843\": \"orv;\",\r\n \"10844\": \"andd;\",\r\n \"10845\": \"ord;\",\r\n \"10847\": \"wedbar;\",\r\n \"10854\": \"sdote;\",\r\n \"10858\": \"simdot;\",\r\n \"10861\": \"congdot;\",\r\n \"10862\": \"easter;\",\r\n \"10863\": \"apacir;\",\r\n \"10864\": \"apE;\",\r\n \"10865\": \"eplus;\",\r\n \"10866\": \"pluse;\",\r\n \"10867\": \"Esim;\",\r\n \"10868\": \"Colone;\",\r\n \"10869\": \"Equal;\",\r\n \"10871\": \"eDDot;\",\r\n \"10872\": \"equivDD;\",\r\n \"10873\": \"ltcir;\",\r\n \"10874\": \"gtcir;\",\r\n \"10875\": \"ltquest;\",\r\n \"10876\": \"gtquest;\",\r\n \"10877\": \"LessSlantEqual;\",\r\n \"10878\": \"GreaterSlantEqual;\",\r\n \"10879\": \"lesdot;\",\r\n \"10880\": \"gesdot;\",\r\n \"10881\": \"lesdoto;\",\r\n \"10882\": \"gesdoto;\",\r\n \"10883\": \"lesdotor;\",\r\n \"10884\": \"gesdotol;\",\r\n \"10885\": \"lessapprox;\",\r\n \"10886\": \"gtrapprox;\",\r\n \"10887\": \"lneq;\",\r\n \"10888\": \"gneq;\",\r\n \"10889\": \"lnapprox;\",\r\n \"10890\": \"gnapprox;\",\r\n \"10891\": \"lesseqqgtr;\",\r\n \"10892\": \"gtreqqless;\",\r\n \"10893\": \"lsime;\",\r\n \"10894\": \"gsime;\",\r\n \"10895\": \"lsimg;\",\r\n \"10896\": \"gsiml;\",\r\n \"10897\": \"lgE;\",\r\n \"10898\": \"glE;\",\r\n \"10899\": \"lesges;\",\r\n \"10900\": \"gesles;\",\r\n \"10901\": \"eqslantless;\",\r\n \"10902\": \"eqslantgtr;\",\r\n \"10903\": \"elsdot;\",\r\n \"10904\": \"egsdot;\",\r\n \"10905\": \"el;\",\r\n \"10906\": \"eg;\",\r\n \"10909\": \"siml;\",\r\n \"10910\": \"simg;\",\r\n \"10911\": \"simlE;\",\r\n \"10912\": \"simgE;\",\r\n \"10913\": \"LessLess;\",\r\n \"10914\": \"GreaterGreater;\",\r\n \"10916\": \"glj;\",\r\n \"10917\": \"gla;\",\r\n \"10918\": \"ltcc;\",\r\n \"10919\": \"gtcc;\",\r\n \"10920\": \"lescc;\",\r\n \"10921\": \"gescc;\",\r\n \"10922\": \"smt;\",\r\n \"10923\": \"lat;\",\r\n \"10924\": \"smte;\",\r\n \"10925\": \"late;\",\r\n \"10926\": \"bumpE;\",\r\n \"10927\": \"preceq;\",\r\n \"10928\": \"succeq;\",\r\n \"10931\": \"prE;\",\r\n \"10932\": \"scE;\",\r\n \"10933\": \"prnE;\",\r\n \"10934\": \"succneqq;\",\r\n \"10935\": \"precapprox;\",\r\n \"10936\": \"succapprox;\",\r\n \"10937\": \"prnap;\",\r\n \"10938\": \"succnapprox;\",\r\n \"10939\": \"Pr;\",\r\n \"10940\": \"Sc;\",\r\n \"10941\": \"subdot;\",\r\n \"10942\": \"supdot;\",\r\n \"10943\": \"subplus;\",\r\n \"10944\": \"supplus;\",\r\n \"10945\": \"submult;\",\r\n \"10946\": \"supmult;\",\r\n \"10947\": \"subedot;\",\r\n \"10948\": \"supedot;\",\r\n \"10949\": \"subseteqq;\",\r\n \"10950\": \"supseteqq;\",\r\n \"10951\": \"subsim;\",\r\n \"10952\": \"supsim;\",\r\n \"10955\": \"subsetneqq;\",\r\n \"10956\": \"supsetneqq;\",\r\n \"10959\": \"csub;\",\r\n \"10960\": \"csup;\",\r\n \"10961\": \"csube;\",\r\n \"10962\": \"csupe;\",\r\n \"10963\": \"subsup;\",\r\n \"10964\": \"supsub;\",\r\n \"10965\": \"subsub;\",\r\n \"10966\": \"supsup;\",\r\n \"10967\": \"suphsub;\",\r\n \"10968\": \"supdsub;\",\r\n \"10969\": \"forkv;\",\r\n \"10970\": \"topfork;\",\r\n \"10971\": \"mlcp;\",\r\n \"10980\": \"DoubleLeftTee;\",\r\n \"10982\": \"Vdashl;\",\r\n \"10983\": \"Barv;\",\r\n \"10984\": \"vBar;\",\r\n \"10985\": \"vBarv;\",\r\n \"10987\": \"Vbar;\",\r\n \"10988\": \"Not;\",\r\n \"10989\": \"bNot;\",\r\n \"10990\": \"rnmid;\",\r\n \"10991\": \"cirmid;\",\r\n \"10992\": \"midcir;\",\r\n \"10993\": \"topcir;\",\r\n \"10994\": \"nhpar;\",\r\n \"10995\": \"parsim;\",\r\n \"11005\": \"parsl;\",\r\n \"64256\": \"fflig;\",\r\n \"64257\": \"filig;\",\r\n \"64258\": \"fllig;\",\r\n \"64259\": \"ffilig;\",\r\n \"64260\": \"ffllig;\"\r\n }\r\n }, {}], 27: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var matchOperatorsRe = /[|\\\\{}()[\\]^$+*?.]/g;\r\n\r\n module.exports = function (str) {\r\n if (typeof str !== 'string') {\r\n throw new TypeError('Expected a string');\r\n }\r\n\r\n return str.replace(matchOperatorsRe, '\\\\$&');\r\n };\r\n\r\n }, {}], 28: [function (require, module, exports) {\r\n /*!\r\n * expand-brackets \r\n *\r\n * Copyright (c) 2015 Jon Schlinkert.\r\n * Licensed under the MIT license.\r\n */\r\n\r\n 'use strict';\r\n\r\n var isPosixBracket = require('is-posix-bracket');\r\n\r\n /**\r\n * POSIX character classes\r\n */\r\n\r\n var POSIX = {\r\n alnum: 'a-zA-Z0-9',\r\n alpha: 'a-zA-Z',\r\n blank: ' \\\\t',\r\n cntrl: '\\\\x00-\\\\x1F\\\\x7F',\r\n digit: '0-9',\r\n graph: '\\\\x21-\\\\x7E',\r\n lower: 'a-z',\r\n print: '\\\\x20-\\\\x7E',\r\n punct: '-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\r\n space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\r\n upper: 'A-Z',\r\n word: 'A-Za-z0-9_',\r\n xdigit: 'A-Fa-f0-9',\r\n };\r\n\r\n /**\r\n * Expose `brackets`\r\n */\r\n\r\n module.exports = brackets;\r\n\r\n function brackets(str) {\r\n if (!isPosixBracket(str)) {\r\n return str;\r\n }\r\n\r\n var negated = false;\r\n if (str.indexOf('[^') !== -1) {\r\n negated = true;\r\n str = str.split('[^').join('[');\r\n }\r\n if (str.indexOf('[!') !== -1) {\r\n negated = true;\r\n str = str.split('[!').join('[');\r\n }\r\n\r\n var a = str.split('[');\r\n var b = str.split(']');\r\n var imbalanced = a.length !== b.length;\r\n\r\n var parts = str.split(/(?::\\]\\[:|\\[?\\[:|:\\]\\]?)/);\r\n var len = parts.length, i = 0;\r\n var end = '', beg = '';\r\n var res = [];\r\n\r\n // start at the end (innermost) first\r\n while (len--) {\r\n var inner = parts[i++];\r\n if (inner === '^[!' || inner === '[!') {\r\n inner = '';\r\n negated = true;\r\n }\r\n\r\n var prefix = negated ? '^' : '';\r\n var ch = POSIX[inner];\r\n\r\n if (ch) {\r\n res.push('[' + prefix + ch + ']');\r\n } else if (inner) {\r\n if (/^\\[?\\w-\\w\\]?$/.test(inner)) {\r\n if (i === parts.length) {\r\n res.push('[' + prefix + inner);\r\n } else if (i === 1) {\r\n res.push(prefix + inner + ']');\r\n } else {\r\n res.push(prefix + inner);\r\n }\r\n } else {\r\n if (i === 1) {\r\n beg += inner;\r\n } else if (i === parts.length) {\r\n end += inner;\r\n } else {\r\n res.push('[' + prefix + inner + ']');\r\n }\r\n }\r\n }\r\n }\r\n\r\n var result = res.join('|');\r\n var rlen = res.length || 1;\r\n if (rlen > 1) {\r\n result = '(?:' + result + ')';\r\n rlen = 1;\r\n }\r\n if (beg) {\r\n rlen++;\r\n if (beg.charAt(0) === '[') {\r\n if (imbalanced) {\r\n beg = '\\\\[' + beg.slice(1);\r\n } else {\r\n beg += ']';\r\n }\r\n }\r\n result = beg + result;\r\n }\r\n if (end) {\r\n rlen++;\r\n if (end.slice(-1) === ']') {\r\n if (imbalanced) {\r\n end = end.slice(0, end.length - 1) + '\\\\]';\r\n } else {\r\n end = '[' + end;\r\n }\r\n }\r\n result += end;\r\n }\r\n\r\n if (rlen > 1) {\r\n result = result.split('][').join(']|[');\r\n if (result.indexOf('|') !== -1 && !/\\(\\?/.test(result)) {\r\n result = '(?:' + result + ')';\r\n }\r\n }\r\n\r\n result = result.replace(/\\[+=|=\\]+/g, '\\\\b');\r\n return result;\r\n }\r\n\r\n brackets.makeRe = function (pattern) {\r\n try {\r\n return new RegExp(brackets(pattern));\r\n } catch (err) { }\r\n };\r\n\r\n brackets.isMatch = function (str, pattern) {\r\n try {\r\n return brackets.makeRe(pattern).test(str);\r\n } catch (err) {\r\n return false;\r\n }\r\n };\r\n\r\n brackets.match = function (arr, pattern) {\r\n var len = arr.length, i = 0;\r\n var res = arr.slice();\r\n\r\n var re = brackets.makeRe(pattern);\r\n while (i < len) {\r\n var ele = arr[i++];\r\n if (!re.test(ele)) {\r\n continue;\r\n }\r\n res.splice(i, 1);\r\n }\r\n return res;\r\n };\r\n\r\n }, { \"is-posix-bracket\": 96 }], 29: [function (require, module, exports) {\r\n /*!\r\n * expand-range \r\n *\r\n * Copyright (c) 2014-2015, Jon Schlinkert.\r\n * Licensed under the MIT license.\r\n */\r\n\r\n 'use strict';\r\n\r\n var fill = require('fill-range');\r\n\r\n module.exports = function expandRange(str, options, fn) {\r\n if (typeof str !== 'string') {\r\n throw new TypeError('expand-range expects a string.');\r\n }\r\n\r\n if (typeof options === 'function') {\r\n fn = options;\r\n options = {};\r\n }\r\n\r\n if (typeof options === 'boolean') {\r\n options = {};\r\n options.makeRe = true;\r\n }\r\n\r\n // create arguments to pass to fill-range\r\n var opts = options || {};\r\n var args = str.split('..');\r\n var len = args.length;\r\n if (len > 3) { return str; }\r\n\r\n // if only one argument, it can't expand so return it\r\n if (len === 1) { return args; }\r\n\r\n // if `true`, tell fill-range to regexify the string\r\n if (typeof fn === 'boolean' && fn === true) {\r\n opts.makeRe = true;\r\n }\r\n\r\n args.push(opts);\r\n return fill.apply(null, args.concat(fn));\r\n };\r\n\r\n }, { \"fill-range\": 33 }], 30: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var isObject = require('is-extendable');\r\n\r\n module.exports = function extend(o/*, objects*/) {\r\n if (!isObject(o)) { o = {}; }\r\n\r\n var len = arguments.length;\r\n for (var i = 1; i < len; i++) {\r\n var obj = arguments[i];\r\n\r\n if (isObject(obj)) {\r\n assign(o, obj);\r\n }\r\n }\r\n return o;\r\n };\r\n\r\n function assign(a, b) {\r\n for (var key in b) {\r\n if (hasOwn(b, key)) {\r\n a[key] = b[key];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if the given `key` is an own property of `obj`.\r\n */\r\n\r\n function hasOwn(obj, key) {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n }\r\n\r\n }, { \"is-extendable\": 89 }], 31: [function (require, module, exports) {\r\n /*!\r\n * extglob \r\n *\r\n * Copyright (c) 2015, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n /**\r\n * Module dependencies\r\n */\r\n\r\n var isExtglob = require('is-extglob');\r\n var re, cache = {};\r\n\r\n /**\r\n * Expose `extglob`\r\n */\r\n\r\n module.exports = extglob;\r\n\r\n /**\r\n * Convert the given extglob `string` to a regex-compatible\r\n * string.\r\n *\r\n * ```js\r\n * var extglob = require('extglob');\r\n * extglob('!(a?(b))');\r\n * //=> '(?!a(?:b)?)[^/]*?'\r\n * ```\r\n *\r\n * @param {String} `str` The string to convert.\r\n * @param {Object} `options`\r\n * @option {Boolean} [options] `esc` If `false` special characters will not be escaped. Defaults to `true`.\r\n * @option {Boolean} [options] `regex` If `true` a regular expression is returned instead of a string.\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n\r\n function extglob(str, opts) {\r\n opts = opts || {};\r\n var o = {}, i = 0;\r\n\r\n // fix common character reversals\r\n // '*!(.js)' => '*.!(js)'\r\n str = str.replace(/!\\(([^\\w*()])/g, '$1!(');\r\n\r\n // support file extension negation\r\n str = str.replace(/([*\\/])\\.!\\([*]\\)/g, function (m, ch) {\r\n if (ch === '/') {\r\n return escape('\\\\/[^.]+');\r\n }\r\n return escape('[^.]+');\r\n });\r\n\r\n // create a unique key for caching by\r\n // combining the string and options\r\n var key = str\r\n + String(!!opts.regex)\r\n + String(!!opts.contains)\r\n + String(!!opts.escape);\r\n\r\n if (cache.hasOwnProperty(key)) {\r\n return cache[key];\r\n }\r\n\r\n if (!(re instanceof RegExp)) {\r\n re = regex();\r\n }\r\n\r\n opts.negate = false;\r\n var m;\r\n\r\n while (m = re.exec(str)) {\r\n var prefix = m[1];\r\n var inner = m[3];\r\n if (prefix === '!') {\r\n opts.negate = true;\r\n }\r\n\r\n var id = '__EXTGLOB_' + (i++) + '__';\r\n // use the prefix of the _last_ (outtermost) pattern\r\n o[id] = wrap(inner, prefix, opts.escape);\r\n str = str.split(m[0]).join(id);\r\n }\r\n\r\n var keys = Object.keys(o);\r\n var len = keys.length;\r\n\r\n // we have to loop again to allow us to convert\r\n // patterns in reverse order (starting with the\r\n // innermost/last pattern first)\r\n while (len--) {\r\n var prop = keys[len];\r\n str = str.split(prop).join(o[prop]);\r\n }\r\n\r\n var result = opts.regex\r\n ? toRegex(str, opts.contains, opts.negate)\r\n : str;\r\n\r\n result = result.split('.').join('\\\\.');\r\n\r\n // cache the result and return it\r\n return (cache[key] = result);\r\n }\r\n\r\n /**\r\n * Convert `string` to a regex string.\r\n *\r\n * @param {String} `str`\r\n * @param {String} `prefix` Character that determines how to wrap the string.\r\n * @param {Boolean} `esc` If `false` special characters will not be escaped. Defaults to `true`.\r\n * @return {String}\r\n */\r\n\r\n function wrap(inner, prefix, esc) {\r\n if (esc) inner = escape(inner);\r\n\r\n switch (prefix) {\r\n case '!':\r\n return '(?!' + inner + ')[^/]' + (esc ? '%%%~' : '*?');\r\n case '@':\r\n return '(?:' + inner + ')';\r\n case '+':\r\n return '(?:' + inner + ')+';\r\n case '*':\r\n return '(?:' + inner + ')' + (esc ? '%%' : '*')\r\n case '?':\r\n return '(?:' + inner + '|)';\r\n default:\r\n return inner;\r\n }\r\n }\r\n\r\n function escape(str) {\r\n str = str.split('*').join('[^/]%%%~');\r\n str = str.split('.').join('\\\\.');\r\n return str;\r\n }\r\n\r\n /**\r\n * extglob regex.\r\n */\r\n\r\n function regex() {\r\n return /(\\\\?[@?!+*$]\\\\?)(\\(([^()]*?)\\))/;\r\n }\r\n\r\n /**\r\n * Negation regex\r\n */\r\n\r\n function negate(str) {\r\n return '(?!^' + str + ').*$';\r\n }\r\n\r\n /**\r\n * Create the regex to do the matching. If\r\n * the leading character in the `pattern` is `!`\r\n * a negation regex is returned.\r\n *\r\n * @param {String} `pattern`\r\n * @param {Boolean} `contains` Allow loose matching.\r\n * @param {Boolean} `isNegated` True if the pattern is a negation pattern.\r\n */\r\n\r\n function toRegex(pattern, contains, isNegated) {\r\n var prefix = contains ? '^' : '';\r\n var after = contains ? '$' : '';\r\n pattern = ('(?:' + pattern + ')' + after);\r\n if (isNegated) {\r\n pattern = prefix + negate(pattern);\r\n }\r\n return new RegExp(prefix + pattern);\r\n }\r\n\r\n }, { \"is-extglob\": 90 }], 32: [function (require, module, exports) {\r\n /*!\r\n * filename-regex \r\n *\r\n * Copyright (c) 2014-2015, Jon Schlinkert\r\n * Licensed under the MIT license.\r\n */\r\n\r\n module.exports = function filenameRegex() {\r\n return /([^\\\\\\/]+)$/;\r\n };\r\n\r\n }, {}], 33: [function (require, module, exports) {\r\n /*!\r\n * fill-range \r\n *\r\n * Copyright (c) 2014-2015, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n var isObject = require('isobject');\r\n var isNumber = require('is-number');\r\n var randomize = require('randomatic');\r\n var repeatStr = require('repeat-string');\r\n var repeat = require('repeat-element');\r\n\r\n /**\r\n * Expose `fillRange`\r\n */\r\n\r\n module.exports = fillRange;\r\n\r\n /**\r\n * Return a range of numbers or letters.\r\n *\r\n * @param {String} `a` Start of the range\r\n * @param {String} `b` End of the range\r\n * @param {String} `step` Increment or decrement to use.\r\n * @param {Function} `fn` Custom function to modify each element in the range.\r\n * @return {Array}\r\n */\r\n\r\n function fillRange(a, b, step, options, fn) {\r\n if (a == null || b == null) {\r\n throw new Error('fill-range expects the first and second args to be strings.');\r\n }\r\n\r\n if (typeof step === 'function') {\r\n fn = step; options = {}; step = null;\r\n }\r\n\r\n if (typeof options === 'function') {\r\n fn = options; options = {};\r\n }\r\n\r\n if (isObject(step)) {\r\n options = step; step = '';\r\n }\r\n\r\n var expand, regex = false, sep = '';\r\n var opts = options || {};\r\n\r\n if (typeof opts.silent === 'undefined') {\r\n opts.silent = true;\r\n }\r\n\r\n step = step || opts.step;\r\n\r\n // store a ref to unmodified arg\r\n var origA = a, origB = b;\r\n\r\n b = (b.toString() === '-0') ? 0 : b;\r\n\r\n if (opts.optimize || opts.makeRe) {\r\n step = step ? (step += '~') : step;\r\n expand = true;\r\n regex = true;\r\n sep = '~';\r\n }\r\n\r\n // handle special step characters\r\n if (typeof step === 'string') {\r\n var match = stepRe().exec(step);\r\n\r\n if (match) {\r\n var i = match.index;\r\n var m = match[0];\r\n\r\n // repeat string\r\n if (m === '+') {\r\n return repeat(a, b);\r\n\r\n // randomize a, `b` times\r\n } else if (m === '?') {\r\n return [randomize(a, b)];\r\n\r\n // expand right, no regex reduction\r\n } else if (m === '>') {\r\n step = step.substr(0, i) + step.substr(i + 1);\r\n expand = true;\r\n\r\n // expand to an array, or if valid create a reduced\r\n // string for a regex logic `or`\r\n } else if (m === '|') {\r\n step = step.substr(0, i) + step.substr(i + 1);\r\n expand = true;\r\n regex = true;\r\n sep = m;\r\n\r\n // expand to an array, or if valid create a reduced\r\n // string for a regex range\r\n } else if (m === '~') {\r\n step = step.substr(0, i) + step.substr(i + 1);\r\n expand = true;\r\n regex = true;\r\n sep = m;\r\n }\r\n } else if (!isNumber(step)) {\r\n if (!opts.silent) {\r\n throw new TypeError('fill-range: invalid step.');\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n if (/[.&*()[\\]^%$#@!]/.test(a) || /[.&*()[\\]^%$#@!]/.test(b)) {\r\n if (!opts.silent) {\r\n throw new RangeError('fill-range: invalid range arguments.');\r\n }\r\n return null;\r\n }\r\n\r\n // has neither a letter nor number, or has both letters and numbers\r\n // this needs to be after the step logic\r\n if (!noAlphaNum(a) || !noAlphaNum(b) || hasBoth(a) || hasBoth(b)) {\r\n if (!opts.silent) {\r\n throw new RangeError('fill-range: invalid range arguments.');\r\n }\r\n return null;\r\n }\r\n\r\n // validate arguments\r\n var isNumA = isNumber(zeros(a));\r\n var isNumB = isNumber(zeros(b));\r\n\r\n if ((!isNumA && isNumB) || (isNumA && !isNumB)) {\r\n if (!opts.silent) {\r\n throw new TypeError('fill-range: first range argument is incompatible with second.');\r\n }\r\n return null;\r\n }\r\n\r\n // by this point both are the same, so we\r\n // can use A to check going forward.\r\n var isNum = isNumA;\r\n var num = formatStep(step);\r\n\r\n // is the range alphabetical? or numeric?\r\n if (isNum) {\r\n // if numeric, coerce to an integer\r\n a = +a; b = +b;\r\n } else {\r\n // otherwise, get the charCode to expand alpha ranges\r\n a = a.charCodeAt(0);\r\n b = b.charCodeAt(0);\r\n }\r\n\r\n // is the pattern descending?\r\n var isDescending = a > b;\r\n\r\n // don't create a character class if the args are < 0\r\n if (a < 0 || b < 0) {\r\n expand = false;\r\n regex = false;\r\n }\r\n\r\n // detect padding\r\n var padding = isPadded(origA, origB);\r\n var res, pad, arr = [];\r\n var ii = 0;\r\n\r\n // character classes, ranges and logical `or`\r\n if (regex) {\r\n if (shouldExpand(a, b, num, isNum, padding, opts)) {\r\n // make sure the correct separator is used\r\n if (sep === '|' || sep === '~') {\r\n sep = detectSeparator(a, b, num, isNum, isDescending);\r\n }\r\n return wrap([origA, origB], sep, opts);\r\n }\r\n }\r\n\r\n while (isDescending ? (a >= b) : (a <= b)) {\r\n if (padding && isNum) {\r\n pad = padding(a);\r\n }\r\n\r\n // custom function\r\n if (typeof fn === 'function') {\r\n res = fn(a, isNum, pad, ii++);\r\n\r\n // letters\r\n } else if (!isNum) {\r\n if (regex && isInvalidChar(a)) {\r\n res = null;\r\n } else {\r\n res = String.fromCharCode(a);\r\n }\r\n\r\n // numbers\r\n } else {\r\n res = formatPadding(a, pad);\r\n }\r\n\r\n // add result to the array, filtering any nulled values\r\n if (res !== null) arr.push(res);\r\n\r\n // increment or decrement\r\n if (isDescending) {\r\n a -= num;\r\n } else {\r\n a += num;\r\n }\r\n }\r\n\r\n // now that the array is expanded, we need to handle regex\r\n // character classes, ranges or logical `or` that wasn't\r\n // already handled before the loop\r\n if ((regex || expand) && !opts.noexpand) {\r\n // make sure the correct separator is used\r\n if (sep === '|' || sep === '~') {\r\n sep = detectSeparator(a, b, num, isNum, isDescending);\r\n }\r\n if (arr.length === 1 || a < 0 || b < 0) { return arr; }\r\n return wrap(arr, sep, opts);\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n /**\r\n * Wrap the string with the correct regex\r\n * syntax.\r\n */\r\n\r\n function wrap(arr, sep, opts) {\r\n if (sep === '~') { sep = '-'; }\r\n var str = arr.join(sep);\r\n var pre = opts && opts.regexPrefix;\r\n\r\n // regex logical `or`\r\n if (sep === '|') {\r\n str = pre ? pre + str : str;\r\n str = '(' + str + ')';\r\n }\r\n\r\n // regex character class\r\n if (sep === '-') {\r\n str = (pre && pre === '^')\r\n ? pre + str\r\n : str;\r\n str = '[' + str + ']';\r\n }\r\n return [str];\r\n }\r\n\r\n /**\r\n * Check for invalid characters\r\n */\r\n\r\n function isCharClass(a, b, step, isNum, isDescending) {\r\n if (isDescending) { return false; }\r\n if (isNum) { return a <= 9 && b <= 9; }\r\n if (a < b) { return step === 1; }\r\n return false;\r\n }\r\n\r\n /**\r\n * Detect the correct separator to use\r\n */\r\n\r\n function shouldExpand(a, b, num, isNum, padding, opts) {\r\n if (isNum && (a > 9 || b > 9)) { return false; }\r\n return !padding && num === 1 && a < b;\r\n }\r\n\r\n /**\r\n * Detect the correct separator to use\r\n */\r\n\r\n function detectSeparator(a, b, step, isNum, isDescending) {\r\n var isChar = isCharClass(a, b, step, isNum, isDescending);\r\n if (!isChar) {\r\n return '|';\r\n }\r\n return '~';\r\n }\r\n\r\n /**\r\n * Correctly format the step based on type\r\n */\r\n\r\n function formatStep(step) {\r\n return Math.abs(step >> 0) || 1;\r\n }\r\n\r\n /**\r\n * Format padding, taking leading `-` into account\r\n */\r\n\r\n function formatPadding(ch, pad) {\r\n var res = pad ? pad + ch : ch;\r\n if (pad && ch.toString().charAt(0) === '-') {\r\n res = '-' + pad + ch.toString().substr(1);\r\n }\r\n return res.toString();\r\n }\r\n\r\n /**\r\n * Check for invalid characters\r\n */\r\n\r\n function isInvalidChar(str) {\r\n var ch = toStr(str);\r\n return ch === '\\\\'\r\n || ch === '['\r\n || ch === ']'\r\n || ch === '^'\r\n || ch === '('\r\n || ch === ')'\r\n || ch === '`';\r\n }\r\n\r\n /**\r\n * Convert to a string from a charCode\r\n */\r\n\r\n function toStr(ch) {\r\n return String.fromCharCode(ch);\r\n }\r\n\r\n\r\n /**\r\n * Step regex\r\n */\r\n\r\n function stepRe() {\r\n return /\\?|>|\\||\\+|\\~/g;\r\n }\r\n\r\n /**\r\n * Return true if `val` has either a letter\r\n * or a number\r\n */\r\n\r\n function noAlphaNum(val) {\r\n return /[a-z0-9]/i.test(val);\r\n }\r\n\r\n /**\r\n * Return true if `val` has both a letter and\r\n * a number (invalid)\r\n */\r\n\r\n function hasBoth(val) {\r\n return /[a-z][0-9]|[0-9][a-z]/i.test(val);\r\n }\r\n\r\n /**\r\n * Normalize zeros for checks\r\n */\r\n\r\n function zeros(val) {\r\n if (/^-*0+$/.test(val.toString())) {\r\n return '0';\r\n }\r\n return val;\r\n }\r\n\r\n /**\r\n * Return true if `val` has leading zeros,\r\n * or a similar valid pattern.\r\n */\r\n\r\n function hasZeros(val) {\r\n return /[^.]\\.|^-*0+[0-9]/.test(val);\r\n }\r\n\r\n /**\r\n * If the string is padded, returns a curried function with\r\n * the a cached padding string, or `false` if no padding.\r\n *\r\n * @param {*} `origA` String or number.\r\n * @return {String|Boolean}\r\n */\r\n\r\n function isPadded(origA, origB) {\r\n if (hasZeros(origA) || hasZeros(origB)) {\r\n var alen = length(origA);\r\n var blen = length(origB);\r\n\r\n var len = alen >= blen\r\n ? alen\r\n : blen;\r\n\r\n return function (a) {\r\n return repeatStr('0', len - length(a));\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Get the string length of `val`\r\n */\r\n\r\n function length(val) {\r\n return val.toString().length;\r\n }\r\n\r\n }, { \"is-number\": 92, \"isobject\": 99, \"randomatic\": 123, \"repeat-element\": 187, \"repeat-string\": 188 }], 34: [function (require, module, exports) {\r\n /*!\r\n * for-in \r\n *\r\n * Copyright (c) 2014-2016, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n module.exports = function forIn(o, fn, thisArg) {\r\n for (var key in o) {\r\n if (fn.call(thisArg, o[key], key, o) === false) {\r\n break;\r\n }\r\n }\r\n };\r\n\r\n }, {}], 35: [function (require, module, exports) {\r\n /*!\r\n * for-own \r\n *\r\n * Copyright (c) 2014-2016, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n var forIn = require('for-in');\r\n var hasOwn = Object.prototype.hasOwnProperty;\r\n\r\n module.exports = function forOwn(o, fn, thisArg) {\r\n forIn(o, function (val, key) {\r\n if (hasOwn.call(o, key)) {\r\n return fn.call(thisArg, o[key], key, o);\r\n }\r\n });\r\n };\r\n\r\n }, { \"for-in\": 34 }], 36: [function (require, module, exports) {\r\n /*!\r\n * fs-exists-sync (https://github.com/jonschlinkert/fs-exists-sync)\r\n *\r\n * Copyright (c) 2016, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n var fs = require('fs');\r\n\r\n module.exports = function (filepath) {\r\n try {\r\n (fs.accessSync || fs.statSync)(filepath);\r\n return true;\r\n } catch (err) { }\r\n return false;\r\n };\r\n\r\n }, { \"fs\": 11 }], 37: [function (require, module, exports) {\r\n /*!\r\n * get-object \r\n *\r\n * Copyright (c) 2014 Jon Schlinkert, contributors.\r\n * Licensed under the MIT License\r\n */\r\n\r\n 'use strict';\r\n\r\n var isNumber = require('is-number');\r\n\r\n module.exports = function getObject(obj, prop) {\r\n if (!prop) return obj;\r\n if (!obj) return {};\r\n var segs = String(prop).split(/[[.\\]]/).filter(Boolean);\r\n var last = segs[segs.length - 1], res = {};\r\n while (prop = segs.shift()) {\r\n obj = obj[prop];\r\n if (!obj) return {};\r\n }\r\n if (isNumber(last)) return [obj];\r\n res[last] = obj;\r\n return res;\r\n };\r\n\r\n }, { \"is-number\": 92 }], 38: [function (require, module, exports) {\r\n /*!\r\n * get-value \r\n *\r\n * Copyright (c) 2014-2015, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n module.exports = function (obj, prop, a, b, c) {\r\n if (!isObject(obj) || !prop) {\r\n return obj;\r\n }\r\n\r\n prop = toString(prop);\r\n\r\n // allowing for multiple properties to be passed as\r\n // a string or array, but much faster (3-4x) than doing\r\n // `[].slice.call(arguments)`\r\n if (a) prop += '.' + toString(a);\r\n if (b) prop += '.' + toString(b);\r\n if (c) prop += '.' + toString(c);\r\n\r\n if (prop in obj) {\r\n return obj[prop];\r\n }\r\n\r\n var segs = prop.split('.');\r\n var len = segs.length;\r\n var i = -1;\r\n\r\n while (obj && (++i < len)) {\r\n var key = segs[i];\r\n while (key[key.length - 1] === '\\\\') {\r\n key = key.slice(0, -1) + '.' + segs[++i];\r\n }\r\n obj = obj[key];\r\n }\r\n return obj;\r\n };\r\n\r\n function isObject(val) {\r\n return val !== null && (typeof val === 'object' || typeof val === 'function');\r\n }\r\n\r\n function toString(val) {\r\n if (!val) return '';\r\n if (Array.isArray(val)) {\r\n return val.join('.');\r\n }\r\n return val;\r\n }\r\n\r\n }, {}], 39: [function (require, module, exports) {\r\n /*!\r\n * glob-base \r\n *\r\n * Copyright (c) 2015, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n var path = require('path');\r\n var parent = require('glob-parent');\r\n var isGlob = require('is-glob');\r\n\r\n module.exports = function globBase(pattern) {\r\n if (typeof pattern !== 'string') {\r\n throw new TypeError('glob-base expects a string.');\r\n }\r\n\r\n var res = {};\r\n res.base = parent(pattern);\r\n res.isGlob = isGlob(pattern);\r\n\r\n if (res.base !== '.') {\r\n res.glob = pattern.substr(res.base.length);\r\n if (res.glob.charAt(0) === '/') {\r\n res.glob = res.glob.substr(1);\r\n }\r\n } else {\r\n res.glob = pattern;\r\n }\r\n\r\n if (!res.isGlob) {\r\n res.base = dirname(pattern);\r\n res.glob = res.base !== '.'\r\n ? pattern.substr(res.base.length)\r\n : pattern;\r\n }\r\n\r\n if (res.glob.substr(0, 2) === './') {\r\n res.glob = res.glob.substr(2);\r\n }\r\n if (res.glob.charAt(0) === '/') {\r\n res.glob = res.glob.substr(1);\r\n }\r\n return res;\r\n };\r\n\r\n function dirname(glob) {\r\n if (glob.slice(-1) === '/') return glob;\r\n return path.dirname(glob);\r\n }\r\n\r\n }, { \"glob-parent\": 40, \"is-glob\": 91, \"path\": 116 }], 40: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var path = require('path');\r\n var isglob = require('is-glob');\r\n\r\n module.exports = function globParent(str) {\r\n str += 'a'; // preserves full path in case of trailing path separator\r\n do { str = path.dirname(str) } while (isglob(str));\r\n return str;\r\n };\r\n\r\n }, { \"is-glob\": 91, \"path\": 116 }], 41: [function (require, module, exports) {\r\n /*!\r\n * handlebars-helpers \r\n *\r\n * Copyright (c) 2013-2016 Jon Schlinkert, Brian Woodward.\r\n * Licensed under the MIT license.\r\n */\r\n\r\n 'use strict';\r\n\r\n var forIn = require('for-in');\r\n var define = require('define-property');\r\n var lib = require('./lib/');\r\n\r\n /**\r\n * Expose helpers\r\n */\r\n\r\n module.exports = function helpers(groups, options) {\r\n if (typeof groups === 'string') {\r\n groups = [groups];\r\n } else if (!Array.isArray(groups)) {\r\n options = groups;\r\n groups = null;\r\n }\r\n\r\n options = options || {};\r\n var hbs = options.handlebars || require('handlebars');\r\n\r\n define(module.exports, 'handlebars', hbs);\r\n\r\n if (groups) {\r\n groups.forEach(function (key) {\r\n hbs.registerHelper(lib[key]);\r\n });\r\n } else {\r\n forIn(lib, function (group, key) {\r\n hbs.registerHelper(group);\r\n });\r\n }\r\n return hbs.helpers;\r\n };\r\n\r\n /**\r\n * Expose helper groups\r\n */\r\n\r\n forIn(lib, function (group, key) {\r\n define(module.exports, key, function (options) {\r\n options = options || {};\r\n var hbs = options.hbs || require('handlebars');\r\n define(module.exports, 'handlebars', hbs);\r\n hbs.registerHelper(group);\r\n return hbs.helpers;\r\n });\r\n });\r\n\r\n /**\r\n * Expose `utils`\r\n */\r\n\r\n module.exports.utils = require('./lib/utils');\r\n\r\n }, { \"./lib/\": 50, \"./lib/utils\": 63, \"define-property\": 21, \"for-in\": 34, \"handlebars\": 11 }], 42: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var utils = require('./utils');\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * Returns all of the items in an array after the specified index.\r\n * Opposite of [before](#before).\r\n *\r\n * ```handlebars\r\n * {{after \"['a', 'b', 'c']\" 1}}\r\n * //=> '[\"c\"]'\r\n * ```\r\n *\r\n * @param {Array} `array` Collection\r\n * @param {Number} `n` Starting index (number of items to exclude)\r\n * @return {Array} Array exluding `n` items.\r\n * @api public\r\n */\r\n\r\n helpers.after = function (array, n) {\r\n if (utils.isUndefined(array)) return '';\r\n return array.slice(n);\r\n };\r\n\r\n /**\r\n * Cast the given `value` to an array.\r\n *\r\n * ```handlebars\r\n * {{arrayify \"foo\"}}\r\n * //=> '[\"foo\"]'\r\n * ```\r\n * @param {any} `value`\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\n helpers.arrayify = function (value) {\r\n return value ? (Array.isArray(value) ? value : [value]) : [];\r\n };\r\n\r\n /**\r\n * Return all of the items in the collection before the specified\r\n * count. Opposite of [after](#after).\r\n *\r\n * ```handlebars\r\n * {{before \"['a', 'b', 'c']\" 2}}\r\n * //=> '[\"a\", \"b\"]'\r\n * ```\r\n *\r\n * @param {Array} `array`\r\n * @param {Number} `n`\r\n * @return {Array} Array excluding items after the given number.\r\n * @api public\r\n */\r\n\r\n helpers.before = function (array, n) {\r\n if (utils.isUndefined(array)) return '';\r\n return array.slice(0, -n);\r\n };\r\n\r\n /**\r\n * ```handlebars\r\n * {{#eachIndex collection}}\r\n * {{item}} is {{index}}\r\n * {{/eachIndex}}\r\n * ```\r\n * @param {Array} `array`\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.eachIndex = function (array, options) {\r\n var result = '';\r\n for (var i = 0; i < array.length; i++) {\r\n result += options.fn({ item: array[i], index: i });\r\n }\r\n return result;\r\n };\r\n\r\n /**\r\n * Block helper that filters the given array and renders the block for values that\r\n * evaluate to `true`, otherwise the inverse block is returned.\r\n *\r\n * ```handlebars\r\n * {{#filter array \"foo\"}}AAA{{else}}BBB{{/filter}}\r\n * //=> 'BBB\r\n * ```\r\n *\r\n * @name .filter\r\n * @param {Array} `array`\r\n * @param {any} `value`\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.filter = function (array, value, options) {\r\n var content = '';\r\n var results = [];\r\n\r\n // filter on a specific property\r\n var prop = options.hash && options.hash.property;\r\n if (prop) {\r\n results = utils.filter(array, function (val) {\r\n return utils.get(val, prop) === value;\r\n });\r\n } else {\r\n\r\n // filter on a string value\r\n results = utils.filter(array, function (v) {\r\n return value === v;\r\n });\r\n }\r\n\r\n if (results && results.length > 0) {\r\n for (var i = 0; i < results.length; i++) {\r\n content += options.fn(results[i]);\r\n }\r\n return content;\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Returns the first item, or first `n` items of an array.\r\n *\r\n * ```handlebars\r\n * {{first \"['a', 'b', 'c', 'd', 'e']\" 2}}\r\n * //=> '[\"a\", \"b\"]'\r\n * ```\r\n *\r\n * @param {Array} `array`\r\n * @param {Number} `n` Number of items to return, starting at `0`.\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\n helpers.first = function (array, n) {\r\n if (utils.isUndefined(array)) return '';\r\n if (!utils.isNumber(n)) {\r\n return array[0];\r\n }\r\n return array.slice(0, n);\r\n };\r\n\r\n /**\r\n * Iterates over each item in an array and exposes the current item\r\n * in the array as context to the inner block. In addition to\r\n * the current array item, the helper exposes the following variables\r\n * to the inner block:\r\n *\r\n * - `index`\r\n * - `total`\r\n * - `isFirst`\r\n * - `isLast`\r\n *\r\n * Also, `@index` is exposed as a private variable, and additional\r\n * private variables may be defined as hash arguments.\r\n *\r\n * ```js\r\n * var accounts = [\r\n * {'name': 'John', 'email': 'john@example.com'},\r\n * {'name': 'Malcolm', 'email': 'malcolm@example.com'},\r\n * {'name': 'David', 'email': 'david@example.com'}\r\n * ];\r\n *\r\n * // example usage\r\n * // {{#forEach accounts}}\r\n * // \r\n * // {{ name }}\r\n * // {{#unless isLast}}, {{/unless}}\r\n * // {{/forEach}}\r\n * ```\r\n * @source \r\n * @param {Array} `array`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.forEach = function (array, options) {\r\n var data = utils.createFrame(options, options.hash);\r\n var len = array.length;\r\n var buffer = '';\r\n var i = -1;\r\n\r\n while (++i < len) {\r\n var item = array[i];\r\n data.index = i;\r\n item.index = i + 1;\r\n item.total = len;\r\n item.isFirst = i === 0;\r\n item.isLast = i === (len - 1);\r\n buffer += options.fn(item, { data: data });\r\n }\r\n return buffer;\r\n };\r\n\r\n /**\r\n * Block helper that renders the block if an array has the\r\n * given `value`. Optionally specify an inverse block to render\r\n * when the array does not have the given value.\r\n *\r\n * Given the array `['a', 'b', 'c']`:\r\n *\r\n * ```handlebars\r\n * {{#inArray array \"d\"}}\r\n * foo\r\n * {{else}}\r\n * bar\r\n * {{/inArray}}\r\n * ```\r\n *\r\n * @name .inArray\r\n * @param {Array} `array`\r\n * @param {any} `value`\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.inArray = function (array, value, options) {\r\n if (utils.indexOf(array, value) > -1) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Returns true if `value` is an es5 array.\r\n *\r\n * ```handlebars\r\n * {{isArray \"abc\"}}\r\n * //=> 'false'\r\n * ```\r\n *\r\n * @param {any} `value` The value to test.\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\n helpers.isArray = function (value) {\r\n return Array.isArray(value);\r\n };\r\n\r\n /**\r\n * Join all elements of array into a string, optionally using a\r\n * given separator.\r\n *\r\n * ```handlebars\r\n * {{join \"['a', 'b', 'c']\"}}\r\n * //=> 'a, b, c'\r\n *\r\n * {{join \"['a', 'b', 'c']\" '-'}}\r\n * //=> 'a-b-c'\r\n * ```\r\n *\r\n * @param {Array} `array`\r\n * @param {String} `sep` The separator to use.\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.join = function (array, sep) {\r\n if (utils.isUndefined(array)) return '';\r\n sep = typeof sep !== 'string'\r\n ? ', '\r\n : sep;\r\n return array.join(sep);\r\n };\r\n\r\n /**\r\n * Returns the last item, or last `n` items of an array.\r\n * Opposite of [first](#first).\r\n *\r\n * ```handlebars\r\n * {{last \"['a', 'b', 'c', 'd', 'e']\" 2}}\r\n * //=> '[\"d\", \"e\"]'\r\n * ```\r\n * @param {Array} `array`\r\n * @param {Number} `n` Number of items to return, starting with the last item.\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\n helpers.last = function (array, n) {\r\n if (!utils.isNumber(n)) {\r\n return array[array.length - 1];\r\n }\r\n return array.slice(-n);\r\n };\r\n\r\n /**\r\n * Block helper that compares the length of the given array to\r\n * the number passed as the second argument. If the array length\r\n * is equal to the given `length`, the block is returned,\r\n * otherwise an inverse block may optionally be returned.\r\n *\r\n * @name .lengthEqual\r\n * @param {Array} `array`\r\n * @param {Number} `length`\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.lengthEqual = function (array, length, options) {\r\n if (array.length === length) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Returns a new array, created by calling `function`\r\n * on each element of the given `array`.\r\n *\r\n * ```js\r\n * // register `double` as a helper\r\n * function double(str) {\r\n * return str + str;\r\n * }\r\n * // then used like this:\r\n * // {{map \"['a', 'b', 'c']\" double}}\r\n * //=> '[\"aa\", \"bb\", \"cc\"]'\r\n * ```\r\n *\r\n * @param {Array} `array`\r\n * @param {Function} `fn`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.map = function (array, fn) {\r\n if (utils.isUndefined(array)) return '';\r\n if (typeof array === 'string' && /[[]/.test(array)) {\r\n array = utils.tryParse(array) || [];\r\n }\r\n var len = array.length;\r\n var res = new Array(len);\r\n var i = -1;\r\n\r\n while (++i < len) {\r\n res[i] = fn(array[i], i, array);\r\n }\r\n return res;\r\n };\r\n\r\n /**\r\n * Block helper that returns the block if the callback returns true\r\n * for some value in the given array.\r\n *\r\n * ```handlebars\r\n * {{#some array isString}}\r\n * Render me if the array has a string.\r\n * {{else}}\r\n * Render me if it doesn't.\r\n * {{/some}}\r\n * ```\r\n * @name .some\r\n * @param {Array} `array`\r\n * @param {Function} `cb` callback function\r\n * @param {Options} Handlebars provided options object\r\n * @return {Array}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.some = function (arr, cb, options) {\r\n cb = utils.iterator(cb, this);\r\n if (arr == null) {\r\n return options.inverse(this);\r\n }\r\n var len = arr.length, i = -1;\r\n while (++i < len) {\r\n if (cb(arr[i], i, arr)) {\r\n return options.fn(this);\r\n }\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Sort the given `array`. If an array of objects is passed,\r\n * you may optionally pass a `key` to sort on as the second\r\n * argument. You may alternatively pass a sorting function as\r\n * the second argument.\r\n *\r\n * ```handlebars\r\n * {{sort \"['b', 'a', 'c']\"}}\r\n * //=> 'a,b,c'\r\n * ```\r\n *\r\n * @param {Array} `array` the array to sort.\r\n * @param {String|Function} `key` The object key to sort by, or sorting function.\r\n * @api public\r\n */\r\n\r\n helpers.sort = function (arr, options) {\r\n if (utils.isUndefined(arr)) return '';\r\n if (utils.get(options, 'hash.reverse')) {\r\n return arr.sort().reverse();\r\n }\r\n return arr.sort();\r\n };\r\n\r\n /**\r\n * Sort an `array`. If an array of objects is passed,\r\n * you may optionally pass a `key` to sort on as the second\r\n * argument. You may alternatively pass a sorting function as\r\n * the second argument.\r\n *\r\n * ```handlebars\r\n * {{sortBy '[\"b\", \"a\", \"c\"]'}}\r\n * //=> 'a,b,c'\r\n *\r\n * {{sortBy '[{a: \"zzz\"}, {a: \"aaa\"}]' \"a\"}}\r\n * //=> '[{\"a\":\"aaa\"},{\"a\":\"zzz\"}]'\r\n * ```\r\n *\r\n * @param {Array} `array` the array to sort.\r\n * @param {String|Function} `props` One or more properties to sort by, or sorting functions to use.\r\n * @api public\r\n */\r\n\r\n helpers.sortBy = function (arr/*, prop*/) {\r\n if (utils.isUndefined(arr)) return '';\r\n var args = [].slice.call(arguments);\r\n args.pop(); // remove hbs options object\r\n\r\n if (typeof args[0] === 'string' && /[[]/.test(args[0])) {\r\n args[0] = utils.tryParse(args[0]) || [];\r\n }\r\n if (utils.isUndefined(args[1])) {\r\n return args[0].sort();\r\n }\r\n return utils.sortBy.apply(null, args);\r\n };\r\n\r\n /**\r\n * Use the items in the array _after_ the specified index\r\n * as context inside a block. Opposite of [withBefore](#withBefore).\r\n *\r\n * @param {Array} `array`\r\n * @param {Number} `idx`\r\n * @param {Object} `options`\r\n * @return {Array}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.withAfter = function (array, idx, options) {\r\n array = array.slice(idx);\r\n var result = '';\r\n\r\n var len = array.length, i = -1;\r\n while (++i < len) {\r\n result += options.fn(array[i]);\r\n }\r\n return result;\r\n };\r\n\r\n /**\r\n * Use the items in the array _before_ the specified index\r\n * as context inside a block.Opposite of [withAfter](#withAfter).\r\n *\r\n * ```handlebars\r\n * {{#withBefore array 3}}\r\n * {{this}}\r\n * {{/withBefore}}\r\n * ```\r\n * @param {Array} `array`\r\n * @param {Number} `idx`\r\n * @param {Object} `options`\r\n * @return {Array}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.withBefore = function (array, idx, options) {\r\n array = array.slice(0, -idx);\r\n var result = '';\r\n\r\n var len = array.length, i = -1;\r\n while (++i < len) {\r\n result += options.fn(array[i]);\r\n }\r\n return result;\r\n };\r\n\r\n /**\r\n * Use the first item in a collection inside a handlebars\r\n * block expression. Opposite of [withLast](#withLast).\r\n *\r\n * @param {Array} `array`\r\n * @param {Number} `idx`\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.withFirst = function (arr, idx, options) {\r\n if (utils.isUndefined(arr)) return '';\r\n arr = utils.result(arr);\r\n\r\n if (!utils.isUndefined(idx)) {\r\n idx = parseFloat(utils.result(idx));\r\n }\r\n\r\n if (utils.isUndefined(idx)) {\r\n options = idx;\r\n return options.fn(arr[0]);\r\n }\r\n\r\n arr = arr.slice(0, idx);\r\n var len = arr.length, i = -1;\r\n var result = '';\r\n while (++i < len) {\r\n result += options.fn(arr[i]);\r\n }\r\n return result;\r\n };\r\n\r\n /**\r\n * Use the last item or `n` items in an array as context inside a block.\r\n * Opposite of [withFirst](#withFirst).\r\n *\r\n * @param {Array} `array`\r\n * @param {Number} `idx` The starting index.\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.withLast = function (array, idx, options) {\r\n if (utils.isUndefined(array)) return '';\r\n array = utils.result(array);\r\n\r\n if (!utils.isUndefined(idx)) {\r\n idx = parseFloat(utils.result(idx));\r\n }\r\n\r\n if (utils.isUndefined(idx)) {\r\n options = idx;\r\n return options.fn(array[array.length - 1]);\r\n }\r\n\r\n array = array.slice(-idx);\r\n var len = array.length, i = -1;\r\n var result = '';\r\n while (++i < len) {\r\n result += options.fn(array[i]);\r\n }\r\n return result;\r\n };\r\n\r\n /**\r\n * Block helper that sorts a collection and exposes the sorted\r\n * collection as context inside the block.\r\n *\r\n * @name .withSort\r\n * @param {Array} `array`\r\n * @param {String} `prop`\r\n * @param {Object} `options` Specify `reverse=\"true\"` to reverse the array.\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.withSort = function (array, prop, options) {\r\n if (utils.isUndefined(array)) return '';\r\n var result = '';\r\n\r\n if (utils.isUndefined(prop)) {\r\n options = prop;\r\n\r\n array = array.sort();\r\n if (utils.get(options, 'hash.reverse')) {\r\n array = array.reverse();\r\n }\r\n\r\n for (var i = 0, len = array.length; i < len; i++) {\r\n result += options.fn(array[i]);\r\n }\r\n return result;\r\n }\r\n\r\n array.sort(function (a, b) {\r\n a = utils.get(a, prop);\r\n b = utils.get(b, prop);\r\n return a > b;\r\n });\r\n\r\n if (utils.get(options, 'hash.reverse')) {\r\n array = array.reverse();\r\n }\r\n\r\n var alen = array.length, j = -1;\r\n while (++j < alen) {\r\n result += options.fn(array[j]);\r\n }\r\n return result;\r\n };\r\n\r\n }, { \"./utils\": 63 }], 43: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var fs = require('fs');\r\n var path = require('path');\r\n var html = require('./utils/html');\r\n var object = require('./object');\r\n var utils = require('./utils');\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * Embed code from an external file as preformatted text.\r\n *\r\n * ```handlebars\r\n * {{embed 'path/to/file.js'}}\r\n *\r\n * // specify the language to use\r\n * {{embed 'path/to/file.hbs' 'html')}}\r\n * ```\r\n *\r\n * @param {String} `fp` filepath to the file to embed.\r\n * @param {String} `language` Optionally specify the language to use for syntax highlighting.\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.embed = function embed(fp, ext) {\r\n ext = typeof ext !== 'string'\r\n ? path.extname(fp).slice(1)\r\n : ext;\r\n\r\n var code = fs.readFileSync(fp, 'utf8');\r\n if (ext === 'markdown' || ext === 'md') {\r\n ext = 'markdown';\r\n // if the string is markdown, escape backticks\r\n code = code.split('`').join('`');\r\n }\r\n return utils.block(code, ext).trim() + '\\n';\r\n };\r\n\r\n /**\r\n * Embed a GitHub Gist using only the id of the Gist\r\n *\r\n * ```handlebars\r\n * {{gist 12345}}\r\n * ```\r\n * @param {String} `id`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.gist = function (id) {\r\n return '';\r\n };\r\n\r\n /**\r\n * Generate the HTML for a jsFiddle link with the given `params`\r\n *\r\n * ```handlebars\r\n * {{jsfiddle id=\"0dfk10ks\" tabs=\"true\"}}\r\n * ```\r\n *\r\n * @param {Object} `params`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.jsfiddle = function jsFiddle(attr) {\r\n attr = object.merge({}, attr, attr.hash);\r\n delete attr.name;\r\n delete attr.hash;\r\n delete attr.data;\r\n\r\n if (typeof attr.id === 'undefined') {\r\n throw new Error('jsfiddle helper expects an `id`');\r\n }\r\n\r\n attr.id = 'http://jsfiddle.net/' + attr.id;\r\n attr.width = attr.width || '100%';\r\n attr.height = attr.height || '300';\r\n attr.skin = attr.skin || '/presentation/';\r\n attr.tabs = (attr.tabs || 'result,js,html,css') + attr.skin;\r\n attr.src = attr.id + '/embedded/' + attr.tabs;\r\n attr.allowfullscreen = attr.allowfullscreen || 'allowfullscreen';\r\n attr.frameborder = attr.frameborder || '0';\r\n\r\n delete attr.tabs;\r\n delete attr.skin;\r\n delete attr.id;\r\n return '';\r\n };\r\n\r\n }, { \"./object\": 58, \"./utils\": 63, \"./utils/html\": 62, \"fs\": 11, \"path\": 116 }], 44: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var array = require('./array');\r\n var object = require('./object');\r\n var utils = require('./utils');\r\n var forEach = array.forEach;\r\n var forOwn = object.forOwn;\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * Block helper that returns a block if the given collection is\r\n * empty. If the collection is not empty the inverse block is returned\r\n * (if supplied).\r\n *\r\n * @name .isEmpty\r\n * @param {Object} `collection`\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.isEmpty = function (collection, options) {\r\n if (options == null) {\r\n options = collection;\r\n return options.fn(this);\r\n }\r\n\r\n if (Array.isArray(collection) && !collection.length) {\r\n return options.fn(this);\r\n }\r\n\r\n var keys = Object.keys(collection);\r\n if (typeof collection === 'object' && !keys.length) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Iterate over an array or object,\r\n *\r\n * @name .iterate\r\n * @param {Object|Array} `context` The collection to iterate over\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.iterate = function (context, options) {\r\n if (Array.isArray(context)) {\r\n return forEach.apply(forEach, arguments);\r\n } else if (utils.isObject(context)) {\r\n return forOwn.apply(forOwn, arguments);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Returns the length of the given collection.\r\n *\r\n * ```handlebars\r\n * {{length \"['a', 'b', 'c']\"}}\r\n * //=> 3\r\n * ```\r\n * @param {Array|Object|String} `value`\r\n * @return {Number} The length of the value.\r\n * @api public\r\n */\r\n\r\n helpers.length = function (value) {\r\n if (utils.isUndefined(value)) return '';\r\n if (typeof value === 'string' && /[[]/.test(value)) {\r\n value = utils.tryParse(value) || [];\r\n }\r\n if (utils.isObject(value)) {\r\n value = Object.keys(value);\r\n }\r\n return value.length;\r\n };\r\n\r\n }, { \"./array\": 42, \"./object\": 58, \"./utils\": 63 }], 45: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var isObject = require('./object').isObject;\r\n var isString = require('./string').isString;\r\n var utils = require('./utils');\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * Block helper that renders the block if **both** of the given values\r\n * are truthy. If an inverse block is specified it will be rendered\r\n * when falsy.\r\n *\r\n * @param {any} `a`\r\n * @param {any} `b`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.and = function (a, b, options) {\r\n if (a && b) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Render a block when a comparison of the first and third\r\n * arguments returns true. The second argument is\r\n * the [arithemetic operator][operators] to use. You may also\r\n * optionally specify an inverse block to render when falsy.\r\n *\r\n * @param `a`\r\n * @param `operator` The operator to use. Operators must be enclosed in quotes: `\">\"`, `\"=\"`, `\"<=\"`, and so on.\r\n * @param `b`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String} Block, or if specified the inverse block is rendered if falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.compare = function (a, operator, b, options) {\r\n /*eslint eqeqeq: 0*/\r\n\r\n if (arguments.length < 4) {\r\n throw new Error('handlebars Helper {{compare}} expects 4 arguments');\r\n }\r\n\r\n var result;\r\n switch (operator) {\r\n case '==':\r\n result = a == b;\r\n break;\r\n case '===':\r\n result = a === b;\r\n break;\r\n case '!=':\r\n result = a != b;\r\n break;\r\n case '!==':\r\n result = a !== b;\r\n break;\r\n case '<':\r\n result = a < b;\r\n break;\r\n case '>':\r\n result = a > b;\r\n break;\r\n case '<=':\r\n result = a <= b;\r\n break;\r\n case '>=':\r\n result = a >= b;\r\n break;\r\n case 'typeof':\r\n result = typeof a === b;\r\n break;\r\n default: {\r\n throw new Error('helper {{compare}}: invalid operator: `' + operator + '`');\r\n }\r\n }\r\n\r\n if (result === false) {\r\n return options.inverse(this);\r\n }\r\n return options.fn(this);\r\n };\r\n\r\n /**\r\n * Block helper that renders the block if `collection` has the\r\n * given `value`, using strict equality (`===`) for comparison,\r\n * otherwise the inverse block is rendered (if specified). If a\r\n * `startIndex` is specified and is negative, it is used as the\r\n * offset from the end of the collection.\r\n *\r\n * Given the array `['a', 'b', 'c']`:\r\n *\r\n * ```handlebars\r\n * {{#contains array \"d\"}}\r\n * This will not be rendered.\r\n * {{else}}\r\n * This will be rendered.\r\n * {{/contains}}\r\n * ```\r\n * @param {Array|Object|String} `collection` The collection to iterate over.\r\n * @param {any} `value` The value to check for.\r\n * @param {Number} `[startIndex=0]` Optionally define the starting index.\r\n * @param {Object} `options` Handlebars provided options object.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.contains = function (collection, value, startIndex, options) {\r\n if (typeof startIndex === 'object') {\r\n options = startIndex;\r\n startIndex = undefined;\r\n }\r\n if (utils.contains(collection, value, startIndex)) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Block helper that renders a block if `a` is **greater than** `b`.\r\n *\r\n * If an inverse block is specified it will be rendered when falsy.\r\n * You may optionally use the `compare=\"\"` hash argument for the\r\n * second value.\r\n *\r\n * @name .gt\r\n * @param {String} `a`\r\n * @param {String} `b`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String} Block, or inverse block if specified and falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.gt = function (a, b, options) {\r\n if (arguments.length === 2) {\r\n options = b;\r\n b = options.hash.compare;\r\n }\r\n if (a > b) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Block helper that renders a block if `a` is **greater than or\r\n * equal to** `b`.\r\n *\r\n * If an inverse block is specified it will be rendered when falsy.\r\n * You may optionally use the `compare=\"\"` hash argument for the\r\n * second value.\r\n *\r\n * @name .gte\r\n * @param {String} `a`\r\n * @param {String} `b`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String} Block, or inverse block if specified and falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.gte = function (a, b, options) {\r\n if (arguments.length === 2) {\r\n options = b;\r\n b = options.hash.compare;\r\n }\r\n if (a >= b) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Block helper that renders a block if `value` has `pattern`.\r\n * If an inverse block is specified it will be rendered when falsy.\r\n *\r\n * @param {any} `val` The value to check.\r\n * @param {any} `pattern` The pattern to check for.\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.has = function (value, pattern, options) {\r\n if (arguments.length === 2) {\r\n return pattern.inverse(this);\r\n }\r\n\r\n if (arguments.length === 1) {\r\n return value.inverse(this);\r\n }\r\n\r\n if ((Array.isArray(value) || isString(value)) && isString(pattern)) {\r\n if (value.indexOf(pattern) > -1) {\r\n return options.fn(this);\r\n }\r\n }\r\n if (isObject(value) && isString(pattern) && pattern in value) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Block helper that renders a block if `a` is **equal to** `b`.\r\n * If an inverse block is specified it will be rendered when falsy.\r\n * You may optionally use the `compare=\"\"` hash argument for the\r\n * second value.\r\n *\r\n * @name .eq\r\n * @param {String} `a`\r\n * @param {String} `b`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String} Block, or inverse block if specified and falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.eq = function (a, b, options) {\r\n if (arguments.length === 2) {\r\n options = b;\r\n b = options.hash.compare;\r\n }\r\n if (a === b) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Return true if the given vaue is an even number.\r\n *\r\n * ```handlebars\r\n * {{#ifEven value}}\r\n * render A\r\n * {{else}}\r\n * render B\r\n * {{/ifEven}}\r\n * ```\r\n * @param {Number} `number`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String} Block, or inverse block if specified and falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.ifEven = function (num, options) {\r\n return utils.isEven(num)\r\n ? options.fn(this)\r\n : options.inverse(this);\r\n };\r\n\r\n /**\r\n * Conditionally renders a block if the remainder is zero when\r\n * `a` operand is divided by `b`. If an inverse block is specified\r\n * it will be rendered when the remainder is **not zero**.\r\n *\r\n * @param {Number}\r\n * @param {Number}\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String} Block, or inverse block if specified and falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.ifNth = function (a, b, options) {\r\n if (++b % a === 0) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Block helper that renders a block if `value` is **an odd number**.\r\n * If an inverse block is specified it will be rendered when falsy.\r\n *\r\n * ```handlebars\r\n * {{#ifOdd value}}\r\n * render A\r\n * {{else}}\r\n * render B\r\n * {{/ifOdd}}\r\n * ```\r\n * @param {Object} `value`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String} Block, or inverse block if specified and falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.ifOdd = function (val, options) {\r\n return utils.isOdd(val)\r\n ? options.fn(this)\r\n : options.inverse(this);\r\n };\r\n\r\n /**\r\n * Block helper that renders a block if `a` is **equal to** `b`.\r\n * If an inverse block is specified it will be rendered when falsy.\r\n *\r\n * @name .is\r\n * @param {any} `a`\r\n * @param {any} `b`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.is = function (a, b, options) {\r\n if (arguments.length === 2) {\r\n options = b;\r\n b = options.hash.compare;\r\n }\r\n if (a === b) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Block helper that renders a block if `a` is **not equal to** `b`.\r\n * If an inverse block is specified it will be rendered when falsy.\r\n *\r\n * @name .isnt\r\n * @param {String} `a`\r\n * @param {String} `b`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.isnt = function (a, b, options) {\r\n if (arguments.length === 2) {\r\n options = b;\r\n b = options.hash.compare;\r\n }\r\n if (a !== b) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Block helper that renders a block if `a` is **less than** `b`.\r\n *\r\n * If an inverse block is specified it will be rendered when falsy.\r\n * You may optionally use the `compare=\"\"` hash argument for the\r\n * second value.\r\n *\r\n * @name .lt\r\n * @param {Object} `context`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String} Block, or inverse block if specified and falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.lt = function (a, b, options) {\r\n if (arguments.length === 2) {\r\n options = b;\r\n b = options.hash.compare;\r\n }\r\n if (a < b) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Block helper that renders a block if `a` is **less than or\r\n * equal to** `b`.\r\n *\r\n * If an inverse block is specified it will be rendered when falsy.\r\n * You may optionally use the `compare=\"\"` hash argument for the\r\n * second value.\r\n *\r\n * @name .lte\r\n * @param {Sring} `a`\r\n * @param {Sring} `b`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String} Block, or inverse block if specified and falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.lte = function (a, b, options) {\r\n if (arguments.length === 2) {\r\n options = b;\r\n b = options.hash.compare;\r\n }\r\n if (a <= b) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Block helper that renders a block if **neither of** the given values\r\n * are truthy. If an inverse block is specified it will be rendered\r\n * when falsy.\r\n *\r\n * @name .neither\r\n * @param {any} `a`\r\n * @param {any} `b`\r\n * @param `options` Handlebars options object\r\n * @return {String} Block, or inverse block if specified and falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.neither = function (a, b, options) {\r\n if (!a && !b) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Block helper that renders a block if **either of** the given values\r\n * is truthy. If an inverse block is specified it will be rendered\r\n * when falsy.\r\n *\r\n * @name .or\r\n * @param {any} `a`\r\n * @param {any} `b`\r\n * @param `options` Handlebars options object\r\n * @return {String} Block, or inverse block if specified and falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.or = function (a, b, options) {\r\n if (a === true || b === true) {\r\n return options.fn(this);\r\n }\r\n return options.inverse(this);\r\n };\r\n\r\n /**\r\n * Block helper that always renders the inverse block **unless `a` is\r\n * is equal to `b`**.\r\n *\r\n * @name .unlessEq\r\n * @param {String} `a`\r\n * @param {String} `b`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String} Inverse block by default, or block if falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.unlessEq = function (context, options) {\r\n if (context === options.hash.compare) {\r\n return options.inverse(this);\r\n }\r\n return options.fn(this);\r\n };\r\n\r\n /**\r\n * Block helper that always renders the inverse block **unless `a` is\r\n * is greater than `b`**.\r\n *\r\n * @name .unlessGt\r\n * @param {Object} `context`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String} Inverse block by default, or block if falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.unlessGt = function (context, options) {\r\n if (context > options.hash.compare) {\r\n return options.inverse(this);\r\n }\r\n return options.fn(this);\r\n };\r\n\r\n /**\r\n * Block helper that always renders the inverse block **unless `a` is\r\n * is less than `b`**.\r\n *\r\n * @name .unlessLt\r\n * @param {Object} `context`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String} Block, or inverse block if specified and falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.unlessLt = function (context, options) {\r\n if (context < options.hash.compare) {\r\n return options.inverse(this);\r\n }\r\n return options.fn(this);\r\n };\r\n\r\n /**\r\n * Block helper that always renders the inverse block **unless `a` is\r\n * is greater than or equal to `b`**.\r\n *\r\n * @name .unlessGteq\r\n * @param {Object} `context`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String} Block, or inverse block if specified and falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.unlessGteq = function (context, options) {\r\n if (context >= options.hash.compare) {\r\n return options.inverse(this);\r\n }\r\n return options.fn(this);\r\n };\r\n\r\n /**\r\n * Block helper that always renders the inverse block **unless `a` is\r\n * is less than or equal to `b`**.\r\n *\r\n * @name .unlessLteq\r\n * @param {Object} `context`\r\n * @param {Object} `options` Handlebars provided options object\r\n * @return {String} Block, or inverse block if specified and falsey.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.unlessLteq = function (context, options) {\r\n if (context <= options.hash.compare) {\r\n return options.inverse(this);\r\n }\r\n return options.fn(this);\r\n };\r\n\r\n }, { \"./object\": 58, \"./string\": 60, \"./utils\": 63 }], 46: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * Expose `moment` helper\r\n * @exposes helper-date as moment\r\n * @api public\r\n */\r\n\r\n helpers.moment = require('helper-date');\r\n\r\n }, { \"helper-date\": 68 }], 47: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var fs = require('fs');\r\n var path = require('path');\r\n var utils = require('./utils');\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * Converts bytes into a nice representation with unit.\r\n *\r\n * **Examples:**\r\n *\r\n * - `13661855 => 13.7 MB`\r\n * - `825399 => 825 KB`\r\n * - `1396 => 1 KB`\r\n *\r\n * @param {String} `value`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.fileSize = function (num) {\r\n var bytes = parseInt(num, 10);\r\n\r\n if (!utils.isNumber(bytes)) {\r\n console.error('helper {{fileSize}} cannot parse: \"' + num + '\"');\r\n return num.toString(); // Graceful degradation\r\n }\r\n\r\n // KB is technically a Kilobit, but it seems more readable.\r\n var metric = ['byte', 'bytes', 'KB', 'MB', 'GB'];\r\n\r\n var res;\r\n if (bytes === 0) {\r\n return '0 bytes';\r\n } else {\r\n // Base 1000 (rather than 1024) matches Mac OS X\r\n res = Math.floor(Math.log(bytes) / Math.log(1000));\r\n\r\n // No decimals for anything smaller than 1 MB\r\n num = (bytes / Math.pow(1000, Math.floor(res))).toFixed(res < 2 ? 0 : 1);\r\n\r\n if (bytes === 1) {\r\n res = -1; // special case: 1 byte (singular)\r\n }\r\n }\r\n return num + ' ' + metric[res + 1];\r\n };\r\n\r\n /**\r\n * Read a file from the file system.\r\n *\r\n * @param {String} `filepath`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.read = function (filepath) {\r\n return fs.readFileSync(filepath, 'utf8');\r\n };\r\n\r\n /**\r\n * Return an array of files from the given\r\n * directory.\r\n *\r\n * @param {String} `directory`\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\n helpers.readdir = function (dir, filter) {\r\n var files = fs.readdirSync(dir);\r\n files = files.map(function (fp) {\r\n return path.join(dir, fp);\r\n });\r\n if (utils.isOptions(filter)) {\r\n return files;\r\n }\r\n if (typeof filter === 'function') {\r\n return filter(files);\r\n }\r\n if (utils.isRegex(filter)) {\r\n var re = utils.toRegex(filter);\r\n return files.filter(function (fp) {\r\n return re.test(fp);\r\n });\r\n }\r\n if (utils.isGlob(filter)) {\r\n var isMatch = utils.mm.matcher(filter);\r\n return files.filter(function (fp) {\r\n return isMatch(fp);\r\n });\r\n }\r\n if (['isFile', 'isDirectory'].indexOf(filter) !== -1) {\r\n return files.filter(function (fp) {\r\n var stat = fs.statSync(fp);\r\n return stat[filter]();\r\n });\r\n }\r\n return files;\r\n };\r\n\r\n }, { \"./utils\": 63, \"fs\": 11, \"path\": 116 }], 48: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var path = require('path');\r\n var html = require('./utils/html');\r\n var utils = require('./utils');\r\n var parseAttr = html.parseAttributes;\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * Add an array of `` tags. Automatically resolves\r\n * relative paths to `options.assets` if passed on the context.\r\n *\r\n * @param {Object} `context`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.css = function (array, options) {\r\n if (arguments.length < 2) {\r\n options = array;\r\n array = undefined;\r\n }\r\n\r\n var styles = utils.arrayify(array || []);\r\n var assets = '';\r\n\r\n if (this && this.options) {\r\n assets = this.options.assets || '';\r\n }\r\n\r\n if (options.hash.href) {\r\n styles = utils.arrayify(options.hash.href);\r\n }\r\n\r\n return styles.map(function (item) {\r\n var ext = path.extname(item);\r\n var fp = path.join(assets, item);\r\n\r\n if (ext === '.less') {\r\n return '';\r\n }\r\n return '';\r\n }).join('\\n');\r\n };\r\n\r\n /**\r\n * Truncates a string to the specified `length`, and appends\r\n * it with an elipsis, `…`.\r\n *\r\n * ```js\r\n * {{ellipsis \"foo bar baz\", 7}}\r\n * //=> 'foo bar…'\r\n * ```\r\n * @name .ellipsis\r\n * @param {String} `str`\r\n * @param {Number} `length` The desired length of the returned string.\r\n * @return {String} The truncated string.\r\n * @api public\r\n */\r\n\r\n helpers.ellipsis = function (str, limit) {\r\n if (str && typeof str === 'string') {\r\n if (str.length <= limit) {\r\n return str;\r\n }\r\n return helpers.truncate(str, limit) + '…';\r\n }\r\n };\r\n\r\n /**\r\n * Generate one or more `` tags with paths/urls to\r\n * javascript or coffeescript files.\r\n *\r\n * ```handlebars\r\n * {{js scripts}}\r\n * ```\r\n *\r\n * @param {Object} `context`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.js = function (context) {\r\n if (utils.typeOf(context) === 'object') {\r\n var attr = html.toAttributes(context.hash);\r\n return '';\r\n }\r\n\r\n if (utils.typeOf(context) === 'string') {\r\n return '';\r\n }\r\n\r\n context = utils.arrayify(context);\r\n return context.map(function (fp) {\r\n return (path.extname(fp) === '.coffee')\r\n ? utils.tag('script', { type: 'text/coffeescript', src: fp })\r\n : utils.tag('script', { src: fp }, true);\r\n }).join('\\n');\r\n };\r\n\r\n /**\r\n * Strip HTML tags from a string, so that only the text nodes\r\n * are preserved.\r\n *\r\n * ```js\r\n * {{sanitize \"foo\"}}\r\n * //=> 'foo'\r\n * ```\r\n *\r\n * @param {String} `str` The string of HTML to sanitize.\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.sanitize = function (str) {\r\n return html.sanitize(str);\r\n };\r\n\r\n /**\r\n * Truncate a string by removing all HTML tags and limiting the result\r\n * to the specified `length`. Aslo see [ellipsis](#ellipsis).\r\n *\r\n * ```js\r\n * truncate(\"foo bar baz\", 7);\r\n * //=> 'foo bar'\r\n * ```\r\n *\r\n * @name .truncate\r\n * @param {String} `str`\r\n * @param {Number} `limit` The desired length of the returned string.\r\n * @param {String} `suffix` Optionally supply a string to use as a suffix to\r\n * denote when the string has been truncated.\r\n * @return {String} The truncated string.\r\n * @api public\r\n */\r\n\r\n helpers.truncate = function (str, limit, suffix) {\r\n if (str && typeof str === 'string') {\r\n var ch = typeof suffix === 'string' ? suffix : '';\r\n if (str.length > limit) {\r\n return html.sanitize(str).slice(0, limit - ch.length) + ch;\r\n }\r\n return str;\r\n }\r\n };\r\n\r\n /**\r\n * Block helper for creating unordered lists (`
    `)\r\n *\r\n * @param {Object} `context`\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.ul = function (context, options) {\r\n return ('
      ') + context.map(function (item) {\r\n return '
    • ' + (options.fn(item)) + '
    • ';\r\n }).join('\\n') + '
    ';\r\n };\r\n\r\n /**\r\n * Block helper for creating ordered lists (`
      `)\r\n *\r\n * @param {Object} `context`\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.ol = function (context, options) {\r\n return ('
        ') + context.map(function (item) {\r\n return '
      1. ' + (options.fn(item)) + '
      2. ';\r\n }).join('\\n') + '
      ';\r\n };\r\n\r\n /**\r\n * Returns a `
      ` with a thumbnail linked to a full picture\r\n *\r\n * @param {Object} `context` Object with values/attributes to add to the generated elements:\r\n * @param {String} `context.alt`\r\n * @param {String} `context.src`\r\n * @param {Number} `context.width`\r\n * @param {Number} `context.height`\r\n * @return {String} HTML `
      ` element with image and optional caption/link.\r\n * @contributor: Marie Hogebrandt \r\n * @api public\r\n */\r\n\r\n helpers.thumbnailImage = function (context) {\r\n var figure = '';\r\n var image = '';\r\n\r\n var link = context.full || false;\r\n var imageAttributes = {\r\n alt: context.alt,\r\n src: context.thumbnail,\r\n width: context.size.width,\r\n height: context.size.height\r\n };\r\n\r\n var figureAttributes = { id: 'image-' + context.id };\r\n var linkAttributes = { href: link, rel: 'thumbnail' };\r\n\r\n if (context.classes) {\r\n if (context.classes.image) {\r\n imageAttributes.class = context.classes.image.join(' ');\r\n }\r\n if (context.classes.figure) {\r\n figureAttributes.class = context.classes.figure.join(' ');\r\n }\r\n if (context.classes.link) {\r\n linkAttributes.class = context.classes.link.join(' ');\r\n }\r\n }\r\n\r\n figure += '
      \\n';\r\n image += '\\n';\r\n\r\n if (link) {\r\n figure += '\\n' + image + '\\n';\r\n } else {\r\n figure += image;\r\n }\r\n\r\n if (context.caption) {\r\n figure += '
      ' + context.caption + '
      \\n';\r\n }\r\n\r\n figure += '
      ';\r\n return figure;\r\n };\r\n\r\n }, { \"./utils\": 63, \"./utils/html\": 62, \"path\": 116 }], 49: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var utils = require('./utils');\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * i18n helper. See [button-i18n](https://github.com/assemble/buttons)\r\n * for a working example.\r\n *\r\n * @contributor Laurent Goderre \r\n * @param {String} `key`\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.i18n = function (prop, context, options) {\r\n if (utils.isOptions(context)) {\r\n options = context;\r\n context = {};\r\n }\r\n\r\n if (typeof prop !== 'string') {\r\n throw new Error('{{i18n}} helper expected \"key\" to be a string');\r\n }\r\n\r\n var opts = utils.merge({}, this, options.hash);\r\n\r\n // account for `options` being passed on the context\r\n if (opts.options) {\r\n opts = utils.merge({}, opts, opts.options);\r\n delete opts.options;\r\n }\r\n\r\n var lang = opts.language || opts.lang;\r\n\r\n if (typeof lang !== 'string') {\r\n throw new Error('{{i18n}} helper expected \"language\" parameter to be a string');\r\n }\r\n\r\n var value = utils.get(opts, lang);\r\n if (typeof value === 'undefined') {\r\n throw new Error('{{i18n}} helper cannot find language \"' + lang + '\"');\r\n }\r\n\r\n var result = utils.get(value, prop);\r\n if (typeof result === 'undefined') {\r\n throw new Error('{{i18n}} helper cannot find property \"' + prop + '\" for language \"' + lang + '\"');\r\n }\r\n\r\n return result;\r\n };\r\n\r\n }, { \"./utils\": 63 }], 50: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n module.exports = {\r\n array: require('./array'),\r\n code: require('./code'),\r\n collection: require('./collection'),\r\n comparison: require('./comparison'),\r\n date: require('./date'),\r\n fs: require('./fs'),\r\n html: require('./html'),\r\n i18n: require('./i18n'),\r\n inflection: require('./inflection'),\r\n logging: require('./logging'),\r\n markdown: require('./markdown'),\r\n match: require('./match'),\r\n math: require('./math'),\r\n misc: require('./misc'),\r\n number: require('./number'),\r\n object: require('./object'),\r\n path: require('./path'),\r\n string: require('./string'),\r\n url: require('./url')\r\n };\r\n\r\n }, { \"./array\": 42, \"./code\": 43, \"./collection\": 44, \"./comparison\": 45, \"./date\": 46, \"./fs\": 47, \"./html\": 48, \"./i18n\": 49, \"./inflection\": 51, \"./logging\": 52, \"./markdown\": 53, \"./match\": 54, \"./math\": 55, \"./misc\": 56, \"./number\": 57, \"./object\": 58, \"./path\": 59, \"./string\": 60, \"./url\": 61 }], 51: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var utils = require('./utils');\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * @name .inflect\r\n * @param {Number} `count`\r\n * @param {String} `singular` The singular form\r\n * @param {String} `plural` The plural form\r\n * @param {String} `include`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.inflect = function (count, singular, plural, include) {\r\n var word = (count > 1 || count === 0) ? plural : singular;\r\n\r\n if (utils.isUndefined(include) || include === false) {\r\n return word;\r\n } else {\r\n return String(count) + ' ' + word;\r\n }\r\n };\r\n\r\n /**\r\n * Returns an ordinalized number (as a string).\r\n *\r\n * ```handlebars\r\n * {{ordinalize 1}}\r\n * //=> '1st'\r\n * {{ordinalize 21}}\r\n * //=> '21st'\r\n * {{ordinalize 29}}\r\n * //=> '29th'\r\n * {{ordinalize 22}}\r\n * //=> '22nd'\r\n * ```\r\n *\r\n * @param {String} `val` The value to ordinalize.\r\n * @return {String} The ordinalized number\r\n * @api public\r\n */\r\n\r\n helpers.ordinalize = function (val) {\r\n var num = Math.abs(Math.round(val));\r\n var res = num % 100;\r\n\r\n if (utils.indexOf([11, 12, 13], res) >= 0) {\r\n return '' + val + 'th';\r\n }\r\n\r\n switch (num % 10) {\r\n case 1:\r\n return '' + val + 'st';\r\n case 2:\r\n return '' + val + 'nd';\r\n case 3:\r\n return '' + val + 'rd';\r\n default: {\r\n return '' + val + 'th';\r\n }\r\n }\r\n };\r\n\r\n }, { \"./utils\": 63 }], 52: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n /**\r\n * [logging-helpers](https://github.com/helpers/logging-helpers).\r\n * @api public\r\n */\r\n\r\n module.exports = require('logging-helpers');\r\n\r\n }, { \"logging-helpers\": 102 }], 53: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n /**\r\n * Expose markdown `helpers` (for performance we're using getters so\r\n * that the helpers are only loaded if called)\r\n */\r\n\r\n var helpers = module.exports;\r\n var markdown;\r\n var md;\r\n\r\n /**\r\n * Block helper that converts a string of inline markdown to HTML.\r\n *\r\n * ```html\r\n * {{#markdown}}\r\n * # Foo\r\n * {{/markdown}}\r\n * //=>

      Foo

      \r\n * ```\r\n * @name .markdown\r\n * @param {Object} `context`\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n Object.defineProperty(helpers, 'markdown', {\r\n configurable: true,\r\n set: function (val) {\r\n markdown = val;\r\n },\r\n get: function () {\r\n return markdown || (markdown = require('helper-markdown')());\r\n }\r\n });\r\n\r\n /**\r\n * Read a markdown file from the file system and inject its contents after\r\n * converting it to HTML.\r\n *\r\n * ```html\r\n * {{md \"foo/bar.md\"}}\r\n * ```\r\n * @name .md\r\n * @param {Object} `context`\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n Object.defineProperty(helpers, 'md', {\r\n configurable: true,\r\n set: function (val) {\r\n md = val;\r\n },\r\n get: function () {\r\n return md || (md = require('helper-md'));\r\n }\r\n });\r\n\r\n }, { \"helper-markdown\": 72, \"helper-md\": 73 }], 54: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var utils = require('./utils');\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * The main function. Pass an array of filepaths,\r\n * and a string or array of glob patterns. Options may\r\n * be passed on the hash or on `this.options`.\r\n *\r\n * ```handlebars\r\n * {{match (readdir \"foo\") \"*.js\"}}\r\n * ```\r\n * @param {Array|String} `files`\r\n * @param {Array|String} `patterns` One or more glob patterns.\r\n * @param {Object} `options`\r\n * @return {Array} Array of matches\r\n * @api public\r\n */\r\n\r\n helpers.mm = function () {\r\n var args = utils.getArgs(this, arguments);\r\n return utils.mm.apply(utils.mm, args);\r\n };\r\n\r\n /**\r\n * Returns an array of files that match the given glob pattern.\r\n * Options may be passed on the hash or on `this.options`.\r\n *\r\n * ```handlebars\r\n * {{match (readdir \"foo\") \"*.js\"}}\r\n * ```\r\n * @param {Array} `files`\r\n * @param {String} `pattern`\r\n * @param {Object} `options`\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\n helpers.match = function () {\r\n var args = utils.getArgs(this, arguments);\r\n return utils.mm.match.apply(utils.mm, args);\r\n };\r\n\r\n /**\r\n * Returns true if a filepath contains the given pattern.\r\n * Options may be passed on the hash or on `this.options`.\r\n *\r\n * ```js\r\n * {{isMatch \"foo.md\" \"*.md\"}}\r\n * //=> true\r\n * ```\r\n *\r\n * @param {String} `filepath`\r\n * @param {String} `pattern`\r\n * @param {Object} `options`\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\n helpers.isMatch = function () {\r\n var args = utils.getArgs(this, arguments);\r\n return utils.mm.isMatch.apply(utils.mm, args);\r\n };\r\n\r\n }, { \"./utils\": 63 }], 55: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var utils = require('./utils');\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * Return the product of `a` plus `b`.\r\n *\r\n * @param {Number} `a`\r\n * @param {Number} `b`\r\n * @api public\r\n */\r\n\r\n helpers.add = function (a, b) {\r\n return a + b;\r\n };\r\n\r\n /**\r\n * Return the product of `a` minus `b`.\r\n *\r\n * @param {Number} a\r\n * @api public\r\n */\r\n\r\n helpers.subtract = function (a, b) {\r\n return a - b;\r\n };\r\n\r\n /**\r\n * Divide `a` by `b`\r\n *\r\n * @param {Number} `a` numerator\r\n * @param {Number} `b` denominator\r\n * @api public\r\n */\r\n\r\n helpers.divide = function (a, b) {\r\n return a / b;\r\n };\r\n\r\n /**\r\n * Multiply `a` by `b`.\r\n *\r\n * @param {Number} `a` factor\r\n * @param {Number} `b` multiplier\r\n * @api public\r\n */\r\n\r\n helpers.multiply = function (a, b) {\r\n return a * b;\r\n };\r\n\r\n /**\r\n * Get the `Math.floor()` of the given value.\r\n *\r\n * @param {Number} `value`\r\n * @api public\r\n */\r\n\r\n helpers.floor = function (value) {\r\n return Math.floor(value);\r\n };\r\n\r\n /**\r\n * Get the `Math.ceil()` of the given value.\r\n *\r\n * @param {Number} `value`\r\n * @api public\r\n */\r\n\r\n helpers.ceil = function (value) {\r\n return Math.ceil(value);\r\n };\r\n\r\n /**\r\n * Round the given value.\r\n *\r\n * @param {Number} `value`\r\n * @api public\r\n */\r\n\r\n helpers.round = function (value) {\r\n return Math.round(value);\r\n };\r\n\r\n /**\r\n * Returns the sum of all numbers in the given array.\r\n *\r\n * ```handlebars\r\n * {{sum \"[1, 2, 3, 4, 5]\"}}\r\n * //=> '15'\r\n * ```\r\n *\r\n * @name .sum\r\n * @param {Array} `array` Array of numbers to add up.\r\n * @return {Number}\r\n * @api public\r\n */\r\n\r\n helpers.sum = function () {\r\n var args = utils.flatten([].concat.apply([], arguments));\r\n var i = args.length, sum = 0;\r\n while (i--) {\r\n if (!utils.isNumber(args[i])) {\r\n continue;\r\n }\r\n sum += (+args[i]);\r\n }\r\n return sum;\r\n };\r\n\r\n /**\r\n * Returns the average of all numbers in the given array.\r\n *\r\n * ```handlebars\r\n * {{avg \"[1, 2, 3, 4, 5]\"}}\r\n * //=> '3'\r\n * ```\r\n *\r\n * @name .avg\r\n * @param {Array} `array` Array of numbers to add up.\r\n * @return {Number}\r\n * @api public\r\n */\r\n\r\n helpers.avg = function () {\r\n var args = utils.flatten([].concat.apply([], arguments));\r\n // remove handlebars options object\r\n args.pop();\r\n return exports.sum(args) / args.length;\r\n };\r\n\r\n }, { \"./utils\": 63 }], 56: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var utils = require('./utils');\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * Returns the first value if defined, otherwise the \"default\" value is returned.\r\n *\r\n * @param {any} `value`\r\n * @param {any} `defaultValue`\r\n * @return {String}\r\n * @alias .or\r\n * @api public\r\n */\r\n\r\n helpers.default = function (value, defaultValue) {\r\n return value == null\r\n ? defaultValue\r\n : value;\r\n };\r\n\r\n /**\r\n * Return the given value of `prop` from `this.options`. Given the context `{options: {a: {b: {c: 'ddd'}}}}`\r\n *\r\n * ```handlebars\r\n * {{option \"a.b.c\"}}\r\n * \r\n * ```\r\n *\r\n * @param {String} `prop`\r\n * @return {any}\r\n * @api public\r\n */\r\n\r\n helpers.option = function (prop) {\r\n var opts = (this && this.options) || {};\r\n return utils.get(opts, prop);\r\n };\r\n\r\n /**\r\n * Block helper that renders the block without taking any arguments.\r\n *\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.noop = function (options) {\r\n return options.fn(this);\r\n };\r\n\r\n /**\r\n * Block helper that builds the context for the block\r\n * from the options hash.\r\n *\r\n * @param {Object} `options` Handlebars provided options object.\r\n * @contributor Vladimir Kuznetsov \r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.withHash = function (options) {\r\n if (options.hash && Object.keys(options.hash).length) {\r\n return options.fn(options.hash);\r\n } else {\r\n return options.inverse(this);\r\n }\r\n };\r\n\r\n }, { \"./utils\": 63 }], 57: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var utils = require('./utils');\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * Add commas to numbers\r\n *\r\n * @param {Number} `num`\r\n * @return {Number}\r\n * @api public\r\n */\r\n\r\n helpers.addCommas = function (num) {\r\n return num.toString().replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, '$1,');\r\n };\r\n\r\n /**\r\n * Convert a string or number to a formatted phone number.\r\n *\r\n * @param {Number|String} `num` The phone number to format, e.g. `8005551212`\r\n * @return {Number} Formatted phone number: `(800) 555-1212`\r\n * @source http://bit.ly/QlPmPr\r\n * @api public\r\n */\r\n\r\n helpers.phoneNumber = function (num) {\r\n num = num.toString();\r\n\r\n return '(' + num.substr(0, 3) + ') '\r\n + num.substr(3, 3) + '-'\r\n + num.substr(6, 4);\r\n };\r\n\r\n /**\r\n * Generate a random number between two values\r\n *\r\n * @param {Number} `min`\r\n * @param {Number} `max`\r\n * @contributor Tim Douglas \r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.random = function (min, max) {\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n };\r\n\r\n /**\r\n * Abbreviate numbers to the given number of `precision`.\r\n *\r\n * @param {String} `number`\r\n * @param {String} `precision`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.toAbbr = function (number, precision) {\r\n if (utils.isUndefined(precision)) {\r\n precision = 2;\r\n }\r\n\r\n // 2 decimal places => 100, 3 => 1000, etc.\r\n precision = Math.pow(10, precision);\r\n var abbr = ['k', 'm', 'b', 't', 'q'];\r\n var len = abbr.length - 1;\r\n\r\n while (len >= 0) {\r\n var size = Math.pow(10, (len + 1) * 3);\r\n if (size <= (number + 1)) {\r\n number = Math.round(number * precision / size) / precision;\r\n number += abbr[len];\r\n break;\r\n }\r\n len--;\r\n }\r\n return number;\r\n };\r\n\r\n /**\r\n * Returns a string representing the given number in exponential notation.\r\n *\r\n * ```js\r\n * {{toExponential number digits}};\r\n * ```\r\n * @param {Number} `number`\r\n * @param {Number} `fractionDigits` Optional. An integer specifying the number of digits to use after the decimal point. Defaults to as many digits as necessary to specify the number.\r\n * @return {Number}\r\n * @api public\r\n */\r\n\r\n helpers.toExponential = function (number, digits) {\r\n if (utils.isUndefined(digits)) {\r\n digits = 0;\r\n }\r\n return number.toExponential(digits);\r\n };\r\n\r\n /**\r\n * Formats the given number using fixed-point notation.\r\n *\r\n * @param {Number} `number`\r\n * @param {Number} `digits` Optional. The number of digits to use after the decimal point; this may be a value between 0 and 20, inclusive, and implementations may optionally support a larger range of values. If this argument is omitted, it is treated as 0.\r\n * @return {Number}\r\n * @api public\r\n */\r\n\r\n helpers.toFixed = function (number, digits) {\r\n if (utils.isUndefined(digits)) {\r\n digits = 0;\r\n }\r\n return number.toFixed(digits);\r\n };\r\n\r\n /**\r\n * @param {Number} `number`\r\n * @return {Number}\r\n * @api public\r\n */\r\n\r\n helpers.toFloat = function (number) {\r\n return parseFloat(number);\r\n };\r\n\r\n /**\r\n * @param {Number} `number`\r\n * @return {Number}\r\n * @api public\r\n */\r\n\r\n helpers.toInt = function (number) {\r\n return parseInt(number, 10);\r\n };\r\n\r\n /**\r\n * @param {Number} `number`\r\n * @return {Number}\r\n * @api public\r\n */\r\n\r\n helpers.toPrecision = function (number, precision) {\r\n if (utils.isUndefined(precision)) {\r\n precision = 1;\r\n }\r\n return number.toPrecision(precision);\r\n };\r\n\r\n }, { \"./utils\": 63 }], 58: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var array = require('./array');\r\n var utils = require('./utils/');\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * Extend the context with the properties of other objects.\r\n * A shallow merge is performed to avoid mutating the context.\r\n *\r\n * @param {Object} `objects` One or more objects to extend.\r\n * @return {Object}\r\n * @api public\r\n */\r\n\r\n helpers.extend = function (/*objects*/) {\r\n var args = [].slice.call(arguments);\r\n var last = args[args.length - 1];\r\n\r\n if (last && typeof last === 'object' && last.hash) {\r\n last = last.hash;\r\n args.pop(); // remove handlebars options object\r\n args.push(last);\r\n }\r\n\r\n var len = args.length;\r\n var context = {};\r\n var i = -1;\r\n\r\n while (++i < len) {\r\n var obj = args[i];\r\n // skip over sparse arguments\r\n if (obj != null) {\r\n utils.forOwn(obj, function (val, key) {\r\n this[key] = val;\r\n }, context);\r\n }\r\n }\r\n return context;\r\n };\r\n\r\n /**\r\n * Block helper that iterates over the properties of\r\n * an object, exposing each key and value on the context.\r\n *\r\n * @name .forIn\r\n * @param {Object} `context`\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.forIn = function (obj, options) {\r\n if (!utils.isOptions(options)) {\r\n return obj.inverse(this);\r\n }\r\n\r\n var data = utils.createFrame(options, options.hash);\r\n var result = '';\r\n\r\n for (var key in obj) {\r\n data.key = key;\r\n result += options.fn(obj[key], { data: data });\r\n }\r\n return result;\r\n };\r\n\r\n /**\r\n * Block helper that iterates over the **own** properties of\r\n * an object, exposing each key and value on the context.\r\n *\r\n * @name .forOwn\r\n * @param {Object} `obj` The object to iterate over.\r\n * @param {Object} `options`\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.forOwn = function (obj, options) {\r\n if (!utils.isOptions(options)) {\r\n return obj.inverse(this);\r\n }\r\n\r\n var data = utils.createFrame(options, options.hash);\r\n var result = '';\r\n\r\n for (var key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n data.key = key;\r\n result += options.fn(obj[key], { data: data });\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n /**\r\n * Use property paths (`a.b.c`) to get a value or nested value from\r\n * the context. Works as a regular helper or block helper.\r\n *\r\n * @name .get\r\n * @param {String} `prop` The property to get, optionally using dot notation for nested properties.\r\n * @param {Object} `context` The context object\r\n * @param {Object} `options` The handlebars options object, if used as a block helper.\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.get = function (prop, context, options) {\r\n var val = utils.get(context, prop);\r\n if (options && options.fn) {\r\n return val ? options.fn(val) : options.inverse(context);\r\n }\r\n return val;\r\n };\r\n\r\n /**\r\n * Use property paths (`a.b.c`) to get an object from\r\n * the context. Differs from the `get` helper in that this\r\n * helper will return the actual object, including the\r\n * given property key. Also, this helper does not work as a\r\n * block helper.\r\n *\r\n * @name .getObject\r\n * @param {String} `prop` The property to get, optionally using dot notation for nested properties.\r\n * @param {Object} `context` The context object\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.getObject = function (prop, context) {\r\n return utils.getObject(context, prop);\r\n };\r\n\r\n /**\r\n * Return true if `key` is an own, enumerable property\r\n * of the given `context` object.\r\n *\r\n * ```handlebars\r\n * {{hasOwn context key}}\r\n * ```\r\n *\r\n * @name .hasOwn\r\n * @param {String} `key`\r\n * @param {Object} `context` The context object.\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\n helpers.hasOwn = function (context, key) {\r\n return {}.hasOwnProperty.call(context, key);\r\n };\r\n\r\n /**\r\n * Return true if `value` is an object.\r\n *\r\n * ```handlebars\r\n * {{isObject \"foo\"}}\r\n * //=> false\r\n * ```\r\n * @name .isObject\r\n * @param {String} `value`\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\n helpers.isObject = function (value) {\r\n return value && typeof value === 'object'\r\n && !Array.isArray(value);\r\n };\r\n\r\n /**\r\n * Deeply merge the properties of the given `objects` with the\r\n * context object.\r\n *\r\n * @name .merge\r\n * @param {Object} `object` The target object. Pass an empty object to shallow clone.\r\n * @param {Object} `objects`\r\n * @return {Object}\r\n * @api public\r\n */\r\n\r\n helpers.merge = function (context/*, objects, options*/) {\r\n var args = [].slice.call(arguments);\r\n var last = args[args.length - 1];\r\n\r\n if (last && typeof last === 'object' && last.hash) {\r\n last = last.hash;\r\n args.pop(); // remove handlebars options object\r\n args.push(last);\r\n }\r\n\r\n context = utils.merge.apply(utils.merge, args);\r\n return context;\r\n };\r\n\r\n /**\r\n * Block helper that parses a string using `JSON.parse`,\r\n * then passes the parsed object to the block as context.\r\n *\r\n * @param {String} `string` The string to parse\r\n * @param {Object} `options` Handlebars options object\r\n * @contributor github.com/keeganstreet\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.parseJSON = function (str, options) {\r\n return options.fn(JSON.parse(str));\r\n };\r\n\r\n /**\r\n * Pick properties from the context object.\r\n *\r\n * @param {Array|String} `properties` One or more proeperties to pick.\r\n * @param {Object} `context`\r\n * @param {Object} `options` Handlebars options object.\r\n * @return {Object} Returns an object with the picked values. If used as a block helper, the values are passed as context to the inner block. If no values are found, the context is passed to the inverse block.\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.pick = function (props, context, options) {\r\n var keys = array.arrayify(props);\r\n var len = keys.length, i = -1;\r\n var result = {};\r\n\r\n while (++i < len) {\r\n result = helpers.extend(result, utils.getObject(context, keys[i]));\r\n }\r\n\r\n if (options.fn) {\r\n if (Object.keys(result).length) {\r\n return options.fn(result);\r\n } else {\r\n return options.inverse(context);\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n /**\r\n * Stringify an object using `JSON.stringify`.\r\n *\r\n * @param {Object} `obj` Object to stringify\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.stringify = function (obj, indent) {\r\n if (!utils.isNumber(indent)) {\r\n indent = 0;\r\n }\r\n return JSON.stringify(obj, null, indent);\r\n };\r\n\r\n }, { \"./array\": 42, \"./utils/\": 63 }], 59: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var path = require('path');\r\n var utils = require('./utils');\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * Get the file extension from the given `filepath`.\r\n *\r\n * ```handlebars\r\n * {{basename \"docs/toc.md\"}}\r\n * //=> 'toc.md'\r\n * ```\r\n * @param {String} `ext`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.basename = function (filepath) {\r\n return path.basename(filepath);\r\n };\r\n\r\n /**\r\n * Get the directory path segment from the given `filepath`.\r\n *\r\n * ```handlebars\r\n * {{dirname \"docs/toc.md\"}}\r\n * //=> 'docs'\r\n * ```\r\n * @param {String} `ext`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.dirname = function (filepath) {\r\n return path.dirname(filepath);\r\n };\r\n\r\n /**\r\n * Get the file extension from the given `filepath`.\r\n *\r\n * ```handlebars\r\n * {{extname \"docs/toc.md\"}}\r\n * //=> '.md'\r\n * ```\r\n * @param {String} `filepath`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.extname = function (filepath) {\r\n return path.extname(filepath);\r\n };\r\n\r\n /**\r\n * Get the relative filepath from `a` to `b`.\r\n *\r\n * ```handlebars\r\n * {{relative a b}}\r\n * ```\r\n *\r\n * @param {String} `a`\r\n * @param {String} `b`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.relative = function (a, b) {\r\n return utils.relative(a, b);\r\n };\r\n\r\n /**\r\n * Get specific (joined) segments of a file path by passing a\r\n * range of array indices.\r\n *\r\n * ```js\r\n * {{segments \"a/b/c/d\" \"2\" \"3\"}}\r\n * //=> 'c/d'\r\n *\r\n * {{segments \"a/b/c/d\" \"1\" \"3\"}}\r\n * //=> 'b/c/d'\r\n *\r\n * {{segments \"a/b/c/d\" \"1\" \"2\"}}\r\n * //=> 'b/c'\r\n * ```\r\n *\r\n * @param {String} `filepath` The file path to split into segments.\r\n * @return {String} Returns a single, joined file path.\r\n * @api public\r\n */\r\n\r\n helpers.segments = function (fp, a, b) {\r\n return utils.normalize(fp).split('/').slice(a, b).join('/');\r\n };\r\n\r\n }, { \"./utils\": 63, \"path\": 116 }], 60: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var utils = require('./utils');\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * camelCase the characters in the given `string`.\r\n *\r\n * ```js\r\n * {{camelcase \"foo bar baz\"}};\r\n * //=> 'fooBarBaz'\r\n * ```\r\n *\r\n * @name .camelcase\r\n * @param {String} `string` The string to camelcase.\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.camelcase = function (str) {\r\n return utils.changecase(str, function (ch) {\r\n return ch.toUpperCase();\r\n });\r\n };\r\n\r\n /**\r\n * Capitalize the first word in a sentence.\r\n *\r\n * ```handlebars\r\n * {{capitalize \"foo bar baz\"}}\r\n * //=> \"Foo bar baz\"\r\n * ```\r\n * @param {String} `str`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.capitalize = function (str) {\r\n if (str && typeof str === 'string') {\r\n return str.charAt(0).toUpperCase()\r\n + str.slice(1);\r\n }\r\n };\r\n\r\n /**\r\n * Capitalize all words in a string.\r\n *\r\n * ```handlebars\r\n * {{capitalize \"foo bar baz\"}}\r\n * //=> \"Foo Bar Baz\"\r\n * ```\r\n * @param {String} `str`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.capitalizeAll = function (str) {\r\n if (str && typeof str === 'string') {\r\n return str.replace(/\\w\\S*/g, function (word) {\r\n return exports.capitalize(word);\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Center a string using non-breaking spaces\r\n *\r\n * @param {String} `str`\r\n * @param {String} `spaces`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.center = function (str, spaces) {\r\n if (str && typeof str === 'string') {\r\n var space = '';\r\n var i = 0;\r\n while (i < spaces) {\r\n space += ' ';\r\n i++;\r\n }\r\n return space + str + space;\r\n }\r\n };\r\n\r\n /**\r\n * Like trim, but removes both extraneous whitespace **and\r\n * non-word characters** from the beginning and end of a string.\r\n *\r\n * ```js\r\n * {{chop \"_ABC_\"}}\r\n * //=> 'ABC'\r\n *\r\n * {{chop \"-ABC-\"}}\r\n * //=> 'ABC'\r\n *\r\n * {{chop \" ABC \"}}\r\n * //=> 'ABC'\r\n * ```\r\n *\r\n * @name .chop\r\n * @param {String} `string` The string to chop.\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.chop = function (str) {\r\n return utils.chop(str);\r\n };\r\n\r\n /**\r\n * dash-case the characters in `string`. Replaces non-word\r\n * characters and periods with hyphens.\r\n *\r\n * ```js\r\n * {{dashcase \"a-b-c d_e\"}}\r\n * //=> 'a-b-c-d-e'\r\n * ```\r\n *\r\n * @param {String} `string`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.dashcase = function (str) {\r\n return utils.changecase(str, function (ch) {\r\n return '-' + ch;\r\n });\r\n };\r\n\r\n /**\r\n * dot.case the characters in `string`.\r\n *\r\n * ```js\r\n * {{dotcase \"a-b-c d_e\"}}\r\n * //=> 'a.b.c.d.e'\r\n * ```\r\n *\r\n * @param {String} `string`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.dotcase = function (str) {\r\n return utils.changecase(str, function (ch) {\r\n return '.' + ch;\r\n });\r\n };\r\n\r\n /**\r\n * Replace spaces in a string with hyphens.\r\n *\r\n * ```handlebars\r\n * {{hyphenate \"foo bar baz qux\"}}\r\n * //=> \"foo-bar-baz-qux\"\r\n * ```\r\n * @param {String} `str`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.hyphenate = function (str) {\r\n if (str && typeof str === 'string') {\r\n return str.split(' ').join('-');\r\n }\r\n };\r\n\r\n /**\r\n * Return true if `value` is a string.\r\n *\r\n * ```handlebars\r\n * {{isString \"foo\"}}\r\n * //=> 'true'\r\n * ```\r\n * @param {String} `value`\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\n helpers.isString = function (value) {\r\n return utils.isString(value);\r\n };\r\n\r\n /**\r\n * Lowercase all characters in the given string.\r\n *\r\n * ```handlebars\r\n * {{lowercase \"Foo BAR baZ\"}}\r\n * //=> 'foo bar baz'\r\n * ```\r\n * @param {String} `str`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.lowercase = function (str) {\r\n if (str && typeof str === 'string') {\r\n return str.toLowerCase();\r\n }\r\n };\r\n\r\n /**\r\n * Return the number of occurrances of `substring` within the\r\n * given `string`.\r\n *\r\n * ```handlebars\r\n * {{occurrances \"foo bar foo bar baz\" \"foo\"}}\r\n * //=> 2\r\n * ```\r\n * @param {String} `str`\r\n * @param {String} `substring`\r\n * @return {Number} Number of occurrances\r\n * @api public\r\n */\r\n\r\n helpers.occurrences = function (str, substring) {\r\n if (str && typeof str === 'string') {\r\n var len = substring.length;\r\n var pos = 0;\r\n var n = 0;\r\n\r\n while ((pos = str.indexOf(substring, pos))) {\r\n if (pos > -1) {\r\n n++;\r\n pos += len;\r\n } else {\r\n break;\r\n }\r\n }\r\n return n;\r\n }\r\n };\r\n\r\n /**\r\n * PascalCase the characters in `string`.\r\n *\r\n * ```js\r\n * {{pascalcase \"foo bar baz\"}}\r\n * //=> 'FooBarBaz'\r\n * ```\r\n *\r\n * @name .pascalcase\r\n * @param {String} `string`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.pascalcase = function (str) {\r\n str = utils.changecase(str, function (ch) {\r\n return ch.toUpperCase();\r\n });\r\n return str.charAt(0).toUpperCase()\r\n + str.slice(1);\r\n };\r\n\r\n /**\r\n * path/case the characters in `string`.\r\n *\r\n * ```js\r\n * {{pathcase \"a-b-c d_e\"}}\r\n * //=> 'a/b/c/d/e'\r\n * ```\r\n *\r\n * @param {String} `string`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.pathcase = function (str) {\r\n return utils.changecase(str, function (ch) {\r\n return '/' + ch;\r\n });\r\n };\r\n\r\n /**\r\n * Replace spaces in the given string with pluses.\r\n *\r\n * ```handlebars\r\n * {{plusify \"foo bar baz\"}}\r\n * //=> 'foo+bar+baz'\r\n * ```\r\n * @param {String} `str` The input string\r\n * @return {String} Input string with spaces replaced by plus signs\r\n * @source Stephen Way \r\n * @api public\r\n */\r\n\r\n helpers.plusify = function (str) {\r\n if (str && typeof str === 'string') {\r\n return str.split(' ').join('+');\r\n }\r\n };\r\n\r\n /**\r\n * Reverse a string.\r\n *\r\n * ```handlebars\r\n * {{reverse \"abcde\"}}\r\n * //=> 'edcba'\r\n * ```\r\n * @name .reverse\r\n * @param {String} `str`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.reverse = function (str) {\r\n if (str && typeof str === 'string') {\r\n return str.split('').reverse().join('');\r\n }\r\n };\r\n\r\n /**\r\n * Replace all occurrences of `a` with `b`.\r\n *\r\n * ```handlebars\r\n * {{replace \"a b a b a b\" \"a\" \"z\"}}\r\n * //=> 'z b z b z b'\r\n * ```\r\n * @param {String} `str`\r\n * @param {String} `a`\r\n * @param {String} `b`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.replace = function (str, a, b) {\r\n if (str && typeof str === 'string') {\r\n if (!a || typeof a !== 'string') return str;\r\n if (!b || typeof b !== 'string') b = '';\r\n return str.split(a).join(b);\r\n }\r\n };\r\n\r\n /**\r\n * Sentence case the given string\r\n *\r\n * ```handlebars\r\n * {{sentence \"hello world. goodbye world.\"}}\r\n * //=> 'Hello world. Goodbye world.'\r\n * ```\r\n * @param {String} `str`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.sentence = function (str) {\r\n if (str && typeof str === 'string') {\r\n var re = /((?:\\S[^\\.\\?\\!]*)[\\.\\?\\!]*)/g;\r\n return str.replace(re, function (txt) {\r\n return txt.charAt(0).toUpperCase()\r\n + txt.substr(1).toLowerCase();\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * snake_case the characters in the given `string`.\r\n *\r\n * ```js\r\n * {{snakecase \"a-b-c d_e\"}}\r\n * //=> 'a_b_c_d_e'\r\n * ```\r\n *\r\n * @param {String} `string`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.snakecase = function (str) {\r\n return utils.changecase(str, function (ch) {\r\n return '_' + ch;\r\n });\r\n };\r\n\r\n /**\r\n * Split `string` by the given `character`.\r\n *\r\n * ```js\r\n * {{split \"a,b,c\" \",\"}}\r\n * //=> ['a', 'b', 'c']\r\n * ```\r\n *\r\n * @param {String} `string` The string to split.\r\n * @return {String} `character` Default is `,`\r\n * @api public\r\n */\r\n\r\n helpers.split = function (str, ch) {\r\n if (!helpers.isString(str)) return '';\r\n if (typeof ch !== 'string') ch = ',';\r\n return str.split(ch);\r\n };\r\n\r\n /**\r\n * Tests whether a string begins with the given prefix.\r\n *\r\n * ```handlebars\r\n * {{#startsWith \"Goodbye\" \"Hello, world!\"}}\r\n * Whoops\r\n * {{else}}\r\n * Bro, do you even hello world?\r\n * {{/startsWith}}\r\n * ```\r\n * @param {String} `prefix`\r\n * @param {String} `testString`\r\n * @param {String} `options`\r\n * @contributor Dan Fox \r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.startsWith = function (prefix, str, options) {\r\n var args = [].slice.call(arguments);\r\n options = args.pop();\r\n if (str && typeof str === 'string') {\r\n if (str.indexOf(prefix) === 0) {\r\n return options.fn(this);\r\n }\r\n }\r\n if (typeof options.inverse === 'function') {\r\n return options.inverse(this);\r\n }\r\n return '';\r\n };\r\n\r\n /**\r\n * Title case the given string.\r\n *\r\n * ```handlebars\r\n * {{titleize \"this is title case\"}}\r\n * //=> 'This Is Title Case'\r\n * ```\r\n * @param {String} `str`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.titleize = function (str) {\r\n if (str && typeof str === 'string') {\r\n var title = str.replace(/[ \\-_]+/g, ' ');\r\n var words = title.match(/\\w+/g);\r\n var len = words.length;\r\n var res = [];\r\n var i = 0;\r\n while (len--) {\r\n var word = words[i++];\r\n res.push(exports.capitalize(word));\r\n }\r\n return res.join(' ');\r\n }\r\n };\r\n\r\n /**\r\n * Removes extraneous whitespace from the beginning and end\r\n * of a string.\r\n *\r\n * ```js\r\n * {{trim \" ABC \"}}\r\n * //=> 'ABC'\r\n * ```\r\n *\r\n * @name .trim\r\n * @param {String} `string` The string to trim.\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.trim = function (str) {\r\n if (!helpers.isString(str)) return '';\r\n return str.trim();\r\n };\r\n\r\n /**\r\n * Uppercase all of the characters in the given string. If used as a\r\n * block helper it will uppercase the entire block. This helper\r\n * does not support inverse blocks.\r\n *\r\n * @name .uppercase\r\n * @related capitalize capitalizeAll\r\n * @param {String} `str` The string to uppercase\r\n * @param {Object} `options` Handlebars options object\r\n * @return {String}\r\n * @block\r\n * @api public\r\n */\r\n\r\n helpers.uppercase = function (str, options) {\r\n if (str && typeof str === 'string') {\r\n return str.toUpperCase();\r\n } else {\r\n options = str;\r\n }\r\n if (typeof options === 'object' && options.fn) {\r\n return options.fn(this).toUpperCase();\r\n }\r\n return '';\r\n };\r\n\r\n }, { \"./utils\": 63 }], 61: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var url = require('url');\r\n\r\n /**\r\n * Expose `helpers`\r\n */\r\n\r\n var helpers = module.exports;\r\n\r\n /**\r\n * Encodes a Uniform Resource Identifier (URI) component\r\n * by replacing each instance of certain characters by\r\n * one, two, three, or four escape sequences representing\r\n * the UTF-8 encoding of the character.\r\n *\r\n * @param {String} `str` The un-encoded string\r\n * @return {String} The endcoded string\r\n * @api public\r\n */\r\n\r\n helpers.encodeURI = function (str) {\r\n return encodeURIComponent(str);\r\n };\r\n\r\n /**\r\n * Decode a Uniform Resource Identifier (URI) component.\r\n *\r\n * @param {String} `str`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.decodeURI = function (str) {\r\n return decodeURIComponent(str);\r\n };\r\n\r\n /**\r\n * Take a base URL, and a href URL, and resolve them as a\r\n * browser would for an anchor tag.\r\n *\r\n * @param {String} `base`\r\n * @param {String} `href`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.urlResolve = function (base, href) {\r\n return url.resolve(base, href);\r\n };\r\n\r\n /**\r\n * Parses a `url` string into an object.\r\n *\r\n * @param {String} `str` URL string\r\n * @return {String} Returns stringified JSON\r\n * @api public\r\n */\r\n\r\n helpers.urlParse = function (str) {\r\n return JSON.stringify(url.parse(str));\r\n };\r\n\r\n /**\r\n * Strip the query string from the give `url`.\r\n *\r\n * @name .stripQuerystring\r\n * @param {String} `url`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n helpers.stripQuerystring = function (url) {\r\n return url.split('?')[0];\r\n };\r\n\r\n }, { \"url\": 196 }], 62: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var striptags = require('striptags');\r\n var typeOf = require('kind-of');\r\n var utils = require('./');\r\n\r\n /**\r\n * Expose `utils`\r\n */\r\n\r\n var html = module.exports;\r\n\r\n /**\r\n * Remove extra newlines from HTML, respect indentation.\r\n *\r\n * @param {String} html\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n html.condense = function (str) {\r\n return str.replace(/(\\r\\n|\\r|\\n|\\u2028|\\u2029) {2,}/g, '\\n');\r\n };\r\n\r\n /**\r\n * Add a single newline above code comments in HTML\r\n *\r\n * @param {String} `html`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n html.padcomments = function (str) {\r\n return str.replace(/(\\s*\r\n // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\r\n // +0200, so we adjust the time as needed, to be valid.\r\n //\r\n // Keeping the time actually adds/subtracts (one hour)\r\n // from the actual represented time. That is why we call updateOffset\r\n // a second time. In case it wants us to change the offset again\r\n // _changeInProgress == true case, then we have to adjust, because\r\n // there is no such time in the given timezone.\r\n function getSetOffset(input, keepLocalTime) {\r\n var offset = this._offset || 0,\r\n localAdjust;\r\n if (!this.isValid()) {\r\n return input != null ? this : NaN;\r\n }\r\n if (input != null) {\r\n if (typeof input === 'string') {\r\n input = offsetFromString(matchShortOffset, input);\r\n } else if (Math.abs(input) < 16) {\r\n input = input * 60;\r\n }\r\n if (!this._isUTC && keepLocalTime) {\r\n localAdjust = getDateOffset(this);\r\n }\r\n this._offset = input;\r\n this._isUTC = true;\r\n if (localAdjust != null) {\r\n this.add(localAdjust, 'm');\r\n }\r\n if (offset !== input) {\r\n if (!keepLocalTime || this._changeInProgress) {\r\n add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false);\r\n } else if (!this._changeInProgress) {\r\n this._changeInProgress = true;\r\n utils_hooks__hooks.updateOffset(this, true);\r\n this._changeInProgress = null;\r\n }\r\n }\r\n return this;\r\n } else {\r\n return this._isUTC ? offset : getDateOffset(this);\r\n }\r\n }\r\n\r\n function getSetZone(input, keepLocalTime) {\r\n if (input != null) {\r\n if (typeof input !== 'string') {\r\n input = -input;\r\n }\r\n\r\n this.utcOffset(input, keepLocalTime);\r\n\r\n return this;\r\n } else {\r\n return -this.utcOffset();\r\n }\r\n }\r\n\r\n function setOffsetToUTC(keepLocalTime) {\r\n return this.utcOffset(0, keepLocalTime);\r\n }\r\n\r\n function setOffsetToLocal(keepLocalTime) {\r\n if (this._isUTC) {\r\n this.utcOffset(0, keepLocalTime);\r\n this._isUTC = false;\r\n\r\n if (keepLocalTime) {\r\n this.subtract(getDateOffset(this), 'm');\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n function setOffsetToParsedOffset() {\r\n if (this._tzm) {\r\n this.utcOffset(this._tzm);\r\n } else if (typeof this._i === 'string') {\r\n this.utcOffset(offsetFromString(matchOffset, this._i));\r\n }\r\n return this;\r\n }\r\n\r\n function hasAlignedHourOffset(input) {\r\n if (!this.isValid()) {\r\n return false;\r\n }\r\n input = input ? local__createLocal(input).utcOffset() : 0;\r\n\r\n return (this.utcOffset() - input) % 60 === 0;\r\n }\r\n\r\n function isDaylightSavingTime() {\r\n return (\r\n this.utcOffset() > this.clone().month(0).utcOffset() ||\r\n this.utcOffset() > this.clone().month(5).utcOffset()\r\n );\r\n }\r\n\r\n function isDaylightSavingTimeShifted() {\r\n if (!isUndefined(this._isDSTShifted)) {\r\n return this._isDSTShifted;\r\n }\r\n\r\n var c = {};\r\n\r\n copyConfig(c, this);\r\n c = prepareConfig(c);\r\n\r\n if (c._a) {\r\n var other = c._isUTC ? create_utc__createUTC(c._a) : local__createLocal(c._a);\r\n this._isDSTShifted = this.isValid() &&\r\n compareArrays(c._a, other.toArray()) > 0;\r\n } else {\r\n this._isDSTShifted = false;\r\n }\r\n\r\n return this._isDSTShifted;\r\n }\r\n\r\n function isLocal() {\r\n return this.isValid() ? !this._isUTC : false;\r\n }\r\n\r\n function isUtcOffset() {\r\n return this.isValid() ? this._isUTC : false;\r\n }\r\n\r\n function isUtc() {\r\n return this.isValid() ? this._isUTC && this._offset === 0 : false;\r\n }\r\n\r\n // ASP.NET json date format regex\r\n var aspNetRegex = /^(\\-)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)\\.?(\\d{3})?\\d*)?$/;\r\n\r\n // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\r\n // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\r\n // and further modified to allow for strings containing both week and day\r\n var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;\r\n\r\n function create__createDuration(input, key) {\r\n var duration = input,\r\n // matching against regexp is expensive, do it on demand\r\n match = null,\r\n sign,\r\n ret,\r\n diffRes;\r\n\r\n if (isDuration(input)) {\r\n duration = {\r\n ms: input._milliseconds,\r\n d: input._days,\r\n M: input._months\r\n };\r\n } else if (typeof input === 'number') {\r\n duration = {};\r\n if (key) {\r\n duration[key] = input;\r\n } else {\r\n duration.milliseconds = input;\r\n }\r\n } else if (!!(match = aspNetRegex.exec(input))) {\r\n sign = (match[1] === '-') ? -1 : 1;\r\n duration = {\r\n y: 0,\r\n d: toInt(match[DATE]) * sign,\r\n h: toInt(match[HOUR]) * sign,\r\n m: toInt(match[MINUTE]) * sign,\r\n s: toInt(match[SECOND]) * sign,\r\n ms: toInt(match[MILLISECOND]) * sign\r\n };\r\n } else if (!!(match = isoRegex.exec(input))) {\r\n sign = (match[1] === '-') ? -1 : 1;\r\n duration = {\r\n y: parseIso(match[2], sign),\r\n M: parseIso(match[3], sign),\r\n w: parseIso(match[4], sign),\r\n d: parseIso(match[5], sign),\r\n h: parseIso(match[6], sign),\r\n m: parseIso(match[7], sign),\r\n s: parseIso(match[8], sign)\r\n };\r\n } else if (duration == null) {// checks for null or undefined\r\n duration = {};\r\n } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\r\n diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to));\r\n\r\n duration = {};\r\n duration.ms = diffRes.milliseconds;\r\n duration.M = diffRes.months;\r\n }\r\n\r\n ret = new Duration(duration);\r\n\r\n if (isDuration(input) && hasOwnProp(input, '_locale')) {\r\n ret._locale = input._locale;\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n create__createDuration.fn = Duration.prototype;\r\n\r\n function parseIso(inp, sign) {\r\n // We'd normally use ~~inp for this, but unfortunately it also\r\n // converts floats to ints.\r\n // inp may be undefined, so careful calling replace on it.\r\n var res = inp && parseFloat(inp.replace(',', '.'));\r\n // apply sign while we're at it\r\n return (isNaN(res) ? 0 : res) * sign;\r\n }\r\n\r\n function positiveMomentsDifference(base, other) {\r\n var res = { milliseconds: 0, months: 0 };\r\n\r\n res.months = other.month() - base.month() +\r\n (other.year() - base.year()) * 12;\r\n if (base.clone().add(res.months, 'M').isAfter(other)) {\r\n --res.months;\r\n }\r\n\r\n res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\r\n\r\n return res;\r\n }\r\n\r\n function momentsDifference(base, other) {\r\n var res;\r\n if (!(base.isValid() && other.isValid())) {\r\n return { milliseconds: 0, months: 0 };\r\n }\r\n\r\n other = cloneWithOffset(other, base);\r\n if (base.isBefore(other)) {\r\n res = positiveMomentsDifference(base, other);\r\n } else {\r\n res = positiveMomentsDifference(other, base);\r\n res.milliseconds = -res.milliseconds;\r\n res.months = -res.months;\r\n }\r\n\r\n return res;\r\n }\r\n\r\n function absRound(number) {\r\n if (number < 0) {\r\n return Math.round(-1 * number) * -1;\r\n } else {\r\n return Math.round(number);\r\n }\r\n }\r\n\r\n // TODO: remove 'name' arg after deprecation is removed\r\n function createAdder(direction, name) {\r\n return function (val, period) {\r\n var dur, tmp;\r\n //invert the arguments, but complain about it\r\n if (period !== null && !isNaN(+period)) {\r\n deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).');\r\n tmp = val; val = period; period = tmp;\r\n }\r\n\r\n val = typeof val === 'string' ? +val : val;\r\n dur = create__createDuration(val, period);\r\n add_subtract__addSubtract(this, dur, direction);\r\n return this;\r\n };\r\n }\r\n\r\n function add_subtract__addSubtract(mom, duration, isAdding, updateOffset) {\r\n var milliseconds = duration._milliseconds,\r\n days = absRound(duration._days),\r\n months = absRound(duration._months);\r\n\r\n if (!mom.isValid()) {\r\n // No op\r\n return;\r\n }\r\n\r\n updateOffset = updateOffset == null ? true : updateOffset;\r\n\r\n if (milliseconds) {\r\n mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\r\n }\r\n if (days) {\r\n get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding);\r\n }\r\n if (months) {\r\n setMonth(mom, get_set__get(mom, 'Month') + months * isAdding);\r\n }\r\n if (updateOffset) {\r\n utils_hooks__hooks.updateOffset(mom, days || months);\r\n }\r\n }\r\n\r\n var add_subtract__add = createAdder(1, 'add');\r\n var add_subtract__subtract = createAdder(-1, 'subtract');\r\n\r\n function moment_calendar__calendar(time, formats) {\r\n // We want to compare the start of today, vs this.\r\n // Getting start-of-today depends on whether we're local/utc/offset or not.\r\n var now = time || local__createLocal(),\r\n sod = cloneWithOffset(now, this).startOf('day'),\r\n diff = this.diff(sod, 'days', true),\r\n format = diff < -6 ? 'sameElse' :\r\n diff < -1 ? 'lastWeek' :\r\n diff < 0 ? 'lastDay' :\r\n diff < 1 ? 'sameDay' :\r\n diff < 2 ? 'nextDay' :\r\n diff < 7 ? 'nextWeek' : 'sameElse';\r\n\r\n var output = formats && (isFunction(formats[format]) ? formats[format]() : formats[format]);\r\n\r\n return this.format(output || this.localeData().calendar(format, this, local__createLocal(now)));\r\n }\r\n\r\n function clone() {\r\n return new Moment(this);\r\n }\r\n\r\n function isAfter(input, units) {\r\n var localInput = isMoment(input) ? input : local__createLocal(input);\r\n if (!(this.isValid() && localInput.isValid())) {\r\n return false;\r\n }\r\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\r\n if (units === 'millisecond') {\r\n return this.valueOf() > localInput.valueOf();\r\n } else {\r\n return localInput.valueOf() < this.clone().startOf(units).valueOf();\r\n }\r\n }\r\n\r\n function isBefore(input, units) {\r\n var localInput = isMoment(input) ? input : local__createLocal(input);\r\n if (!(this.isValid() && localInput.isValid())) {\r\n return false;\r\n }\r\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\r\n if (units === 'millisecond') {\r\n return this.valueOf() < localInput.valueOf();\r\n } else {\r\n return this.clone().endOf(units).valueOf() < localInput.valueOf();\r\n }\r\n }\r\n\r\n function isBetween(from, to, units, inclusivity) {\r\n inclusivity = inclusivity || '()';\r\n return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\r\n (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\r\n }\r\n\r\n function isSame(input, units) {\r\n var localInput = isMoment(input) ? input : local__createLocal(input),\r\n inputMs;\r\n if (!(this.isValid() && localInput.isValid())) {\r\n return false;\r\n }\r\n units = normalizeUnits(units || 'millisecond');\r\n if (units === 'millisecond') {\r\n return this.valueOf() === localInput.valueOf();\r\n } else {\r\n inputMs = localInput.valueOf();\r\n return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\r\n }\r\n }\r\n\r\n function isSameOrAfter(input, units) {\r\n return this.isSame(input, units) || this.isAfter(input, units);\r\n }\r\n\r\n function isSameOrBefore(input, units) {\r\n return this.isSame(input, units) || this.isBefore(input, units);\r\n }\r\n\r\n function diff(input, units, asFloat) {\r\n var that,\r\n zoneDelta,\r\n delta, output;\r\n\r\n if (!this.isValid()) {\r\n return NaN;\r\n }\r\n\r\n that = cloneWithOffset(input, this);\r\n\r\n if (!that.isValid()) {\r\n return NaN;\r\n }\r\n\r\n zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\r\n\r\n units = normalizeUnits(units);\r\n\r\n if (units === 'year' || units === 'month' || units === 'quarter') {\r\n output = monthDiff(this, that);\r\n if (units === 'quarter') {\r\n output = output / 3;\r\n } else if (units === 'year') {\r\n output = output / 12;\r\n }\r\n } else {\r\n delta = this - that;\r\n output = units === 'second' ? delta / 1e3 : // 1000\r\n units === 'minute' ? delta / 6e4 : // 1000 * 60\r\n units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60\r\n units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst\r\n units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst\r\n delta;\r\n }\r\n return asFloat ? output : absFloor(output);\r\n }\r\n\r\n function monthDiff(a, b) {\r\n // difference in months\r\n var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\r\n // b is in (anchor - 1 month, anchor + 1 month)\r\n anchor = a.clone().add(wholeMonthDiff, 'months'),\r\n anchor2, adjust;\r\n\r\n if (b - anchor < 0) {\r\n anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\r\n // linear across the month\r\n adjust = (b - anchor) / (anchor - anchor2);\r\n } else {\r\n anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\r\n // linear across the month\r\n adjust = (b - anchor) / (anchor2 - anchor);\r\n }\r\n\r\n //check for negative zero, return zero if negative zero\r\n return -(wholeMonthDiff + adjust) || 0;\r\n }\r\n\r\n utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\r\n utils_hooks__hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\r\n\r\n function toString() {\r\n return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\r\n }\r\n\r\n function moment_format__toISOString() {\r\n var m = this.clone().utc();\r\n if (0 < m.year() && m.year() <= 9999) {\r\n if (isFunction(Date.prototype.toISOString)) {\r\n // native implementation is ~50x faster, use it when we can\r\n return this.toDate().toISOString();\r\n } else {\r\n return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\r\n }\r\n } else {\r\n return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\r\n }\r\n }\r\n\r\n function format(inputString) {\r\n if (!inputString) {\r\n inputString = this.isUtc() ? utils_hooks__hooks.defaultFormatUtc : utils_hooks__hooks.defaultFormat;\r\n }\r\n var output = formatMoment(this, inputString);\r\n return this.localeData().postformat(output);\r\n }\r\n\r\n function from(time, withoutSuffix) {\r\n if (this.isValid() &&\r\n ((isMoment(time) && time.isValid()) ||\r\n local__createLocal(time).isValid())) {\r\n return create__createDuration({ to: this, from: time }).locale(this.locale()).humanize(!withoutSuffix);\r\n } else {\r\n return this.localeData().invalidDate();\r\n }\r\n }\r\n\r\n function fromNow(withoutSuffix) {\r\n return this.from(local__createLocal(), withoutSuffix);\r\n }\r\n\r\n function to(time, withoutSuffix) {\r\n if (this.isValid() &&\r\n ((isMoment(time) && time.isValid()) ||\r\n local__createLocal(time).isValid())) {\r\n return create__createDuration({ from: this, to: time }).locale(this.locale()).humanize(!withoutSuffix);\r\n } else {\r\n return this.localeData().invalidDate();\r\n }\r\n }\r\n\r\n function toNow(withoutSuffix) {\r\n return this.to(local__createLocal(), withoutSuffix);\r\n }\r\n\r\n // If passed a locale key, it will set the locale for this\r\n // instance. Otherwise, it will return the locale configuration\r\n // variables for this instance.\r\n function locale(key) {\r\n var newLocaleData;\r\n\r\n if (key === undefined) {\r\n return this._locale._abbr;\r\n } else {\r\n newLocaleData = locale_locales__getLocale(key);\r\n if (newLocaleData != null) {\r\n this._locale = newLocaleData;\r\n }\r\n return this;\r\n }\r\n }\r\n\r\n var lang = deprecate(\r\n 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\r\n function (key) {\r\n if (key === undefined) {\r\n return this.localeData();\r\n } else {\r\n return this.locale(key);\r\n }\r\n }\r\n );\r\n\r\n function localeData() {\r\n return this._locale;\r\n }\r\n\r\n function startOf(units) {\r\n units = normalizeUnits(units);\r\n // the following switch intentionally omits break keywords\r\n // to utilize falling through the cases.\r\n switch (units) {\r\n case 'year':\r\n this.month(0);\r\n /* falls through */\r\n case 'quarter':\r\n case 'month':\r\n this.date(1);\r\n /* falls through */\r\n case 'week':\r\n case 'isoWeek':\r\n case 'day':\r\n case 'date':\r\n this.hours(0);\r\n /* falls through */\r\n case 'hour':\r\n this.minutes(0);\r\n /* falls through */\r\n case 'minute':\r\n this.seconds(0);\r\n /* falls through */\r\n case 'second':\r\n this.milliseconds(0);\r\n }\r\n\r\n // weeks are a special case\r\n if (units === 'week') {\r\n this.weekday(0);\r\n }\r\n if (units === 'isoWeek') {\r\n this.isoWeekday(1);\r\n }\r\n\r\n // quarters are also special\r\n if (units === 'quarter') {\r\n this.month(Math.floor(this.month() / 3) * 3);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n function endOf(units) {\r\n units = normalizeUnits(units);\r\n if (units === undefined || units === 'millisecond') {\r\n return this;\r\n }\r\n\r\n // 'date' is an alias for 'day', so it should be considered as such.\r\n if (units === 'date') {\r\n units = 'day';\r\n }\r\n\r\n return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\r\n }\r\n\r\n function to_type__valueOf() {\r\n return this._d.valueOf() - ((this._offset || 0) * 60000);\r\n }\r\n\r\n function unix() {\r\n return Math.floor(this.valueOf() / 1000);\r\n }\r\n\r\n function toDate() {\r\n return this._offset ? new Date(this.valueOf()) : this._d;\r\n }\r\n\r\n function toArray() {\r\n var m = this;\r\n return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\r\n }\r\n\r\n function toObject() {\r\n var m = this;\r\n return {\r\n years: m.year(),\r\n months: m.month(),\r\n date: m.date(),\r\n hours: m.hours(),\r\n minutes: m.minutes(),\r\n seconds: m.seconds(),\r\n milliseconds: m.milliseconds()\r\n };\r\n }\r\n\r\n function toJSON() {\r\n // new Date(NaN).toJSON() === null\r\n return this.isValid() ? this.toISOString() : null;\r\n }\r\n\r\n function moment_valid__isValid() {\r\n return valid__isValid(this);\r\n }\r\n\r\n function parsingFlags() {\r\n return extend({}, getParsingFlags(this));\r\n }\r\n\r\n function invalidAt() {\r\n return getParsingFlags(this).overflow;\r\n }\r\n\r\n function creationData() {\r\n return {\r\n input: this._i,\r\n format: this._f,\r\n locale: this._locale,\r\n isUTC: this._isUTC,\r\n strict: this._strict\r\n };\r\n }\r\n\r\n // FORMATTING\r\n\r\n addFormatToken(0, ['gg', 2], 0, function () {\r\n return this.weekYear() % 100;\r\n });\r\n\r\n addFormatToken(0, ['GG', 2], 0, function () {\r\n return this.isoWeekYear() % 100;\r\n });\r\n\r\n function addWeekYearFormatToken(token, getter) {\r\n addFormatToken(0, [token, token.length], 0, getter);\r\n }\r\n\r\n addWeekYearFormatToken('gggg', 'weekYear');\r\n addWeekYearFormatToken('ggggg', 'weekYear');\r\n addWeekYearFormatToken('GGGG', 'isoWeekYear');\r\n addWeekYearFormatToken('GGGGG', 'isoWeekYear');\r\n\r\n // ALIASES\r\n\r\n addUnitAlias('weekYear', 'gg');\r\n addUnitAlias('isoWeekYear', 'GG');\r\n\r\n // PARSING\r\n\r\n addRegexToken('G', matchSigned);\r\n addRegexToken('g', matchSigned);\r\n addRegexToken('GG', match1to2, match2);\r\n addRegexToken('gg', match1to2, match2);\r\n addRegexToken('GGGG', match1to4, match4);\r\n addRegexToken('gggg', match1to4, match4);\r\n addRegexToken('GGGGG', match1to6, match6);\r\n addRegexToken('ggggg', match1to6, match6);\r\n\r\n addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\r\n week[token.substr(0, 2)] = toInt(input);\r\n });\r\n\r\n addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\r\n week[token] = utils_hooks__hooks.parseTwoDigitYear(input);\r\n });\r\n\r\n // MOMENTS\r\n\r\n function getSetWeekYear(input) {\r\n return getSetWeekYearHelper.call(this,\r\n input,\r\n this.week(),\r\n this.weekday(),\r\n this.localeData()._week.dow,\r\n this.localeData()._week.doy);\r\n }\r\n\r\n function getSetISOWeekYear(input) {\r\n return getSetWeekYearHelper.call(this,\r\n input, this.isoWeek(), this.isoWeekday(), 1, 4);\r\n }\r\n\r\n function getISOWeeksInYear() {\r\n return weeksInYear(this.year(), 1, 4);\r\n }\r\n\r\n function getWeeksInYear() {\r\n var weekInfo = this.localeData()._week;\r\n return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\r\n }\r\n\r\n function getSetWeekYearHelper(input, week, weekday, dow, doy) {\r\n var weeksTarget;\r\n if (input == null) {\r\n return weekOfYear(this, dow, doy).year;\r\n } else {\r\n weeksTarget = weeksInYear(input, dow, doy);\r\n if (week > weeksTarget) {\r\n week = weeksTarget;\r\n }\r\n return setWeekAll.call(this, input, week, weekday, dow, doy);\r\n }\r\n }\r\n\r\n function setWeekAll(weekYear, week, weekday, dow, doy) {\r\n var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\r\n date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\r\n\r\n this.year(date.getUTCFullYear());\r\n this.month(date.getUTCMonth());\r\n this.date(date.getUTCDate());\r\n return this;\r\n }\r\n\r\n // FORMATTING\r\n\r\n addFormatToken('Q', 0, 'Qo', 'quarter');\r\n\r\n // ALIASES\r\n\r\n addUnitAlias('quarter', 'Q');\r\n\r\n // PARSING\r\n\r\n addRegexToken('Q', match1);\r\n addParseToken('Q', function (input, array) {\r\n array[MONTH] = (toInt(input) - 1) * 3;\r\n });\r\n\r\n // MOMENTS\r\n\r\n function getSetQuarter(input) {\r\n return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\r\n }\r\n\r\n // FORMATTING\r\n\r\n addFormatToken('w', ['ww', 2], 'wo', 'week');\r\n addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\r\n\r\n // ALIASES\r\n\r\n addUnitAlias('week', 'w');\r\n addUnitAlias('isoWeek', 'W');\r\n\r\n // PARSING\r\n\r\n addRegexToken('w', match1to2);\r\n addRegexToken('ww', match1to2, match2);\r\n addRegexToken('W', match1to2);\r\n addRegexToken('WW', match1to2, match2);\r\n\r\n addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\r\n week[token.substr(0, 1)] = toInt(input);\r\n });\r\n\r\n // HELPERS\r\n\r\n // LOCALES\r\n\r\n function localeWeek(mom) {\r\n return weekOfYear(mom, this._week.dow, this._week.doy).week;\r\n }\r\n\r\n var defaultLocaleWeek = {\r\n dow: 0, // Sunday is the first day of the week.\r\n doy: 6 // The week that contains Jan 1st is the first week of the year.\r\n };\r\n\r\n function localeFirstDayOfWeek() {\r\n return this._week.dow;\r\n }\r\n\r\n function localeFirstDayOfYear() {\r\n return this._week.doy;\r\n }\r\n\r\n // MOMENTS\r\n\r\n function getSetWeek(input) {\r\n var week = this.localeData().week(this);\r\n return input == null ? week : this.add((input - week) * 7, 'd');\r\n }\r\n\r\n function getSetISOWeek(input) {\r\n var week = weekOfYear(this, 1, 4).week;\r\n return input == null ? week : this.add((input - week) * 7, 'd');\r\n }\r\n\r\n // FORMATTING\r\n\r\n addFormatToken('D', ['DD', 2], 'Do', 'date');\r\n\r\n // ALIASES\r\n\r\n addUnitAlias('date', 'D');\r\n\r\n // PARSING\r\n\r\n addRegexToken('D', match1to2);\r\n addRegexToken('DD', match1to2, match2);\r\n addRegexToken('Do', function (isStrict, locale) {\r\n return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;\r\n });\r\n\r\n addParseToken(['D', 'DD'], DATE);\r\n addParseToken('Do', function (input, array) {\r\n array[DATE] = toInt(input.match(match1to2)[0], 10);\r\n });\r\n\r\n // MOMENTS\r\n\r\n var getSetDayOfMonth = makeGetSet('Date', true);\r\n\r\n // FORMATTING\r\n\r\n addFormatToken('d', 0, 'do', 'day');\r\n\r\n addFormatToken('dd', 0, 0, function (format) {\r\n return this.localeData().weekdaysMin(this, format);\r\n });\r\n\r\n addFormatToken('ddd', 0, 0, function (format) {\r\n return this.localeData().weekdaysShort(this, format);\r\n });\r\n\r\n addFormatToken('dddd', 0, 0, function (format) {\r\n return this.localeData().weekdays(this, format);\r\n });\r\n\r\n addFormatToken('e', 0, 0, 'weekday');\r\n addFormatToken('E', 0, 0, 'isoWeekday');\r\n\r\n // ALIASES\r\n\r\n addUnitAlias('day', 'd');\r\n addUnitAlias('weekday', 'e');\r\n addUnitAlias('isoWeekday', 'E');\r\n\r\n // PARSING\r\n\r\n addRegexToken('d', match1to2);\r\n addRegexToken('e', match1to2);\r\n addRegexToken('E', match1to2);\r\n addRegexToken('dd', function (isStrict, locale) {\r\n return locale.weekdaysMinRegex(isStrict);\r\n });\r\n addRegexToken('ddd', function (isStrict, locale) {\r\n return locale.weekdaysShortRegex(isStrict);\r\n });\r\n addRegexToken('dddd', function (isStrict, locale) {\r\n return locale.weekdaysRegex(isStrict);\r\n });\r\n\r\n addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\r\n var weekday = config._locale.weekdaysParse(input, token, config._strict);\r\n // if we didn't get a weekday name, mark the date as invalid\r\n if (weekday != null) {\r\n week.d = weekday;\r\n } else {\r\n getParsingFlags(config).invalidWeekday = input;\r\n }\r\n });\r\n\r\n addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\r\n week[token] = toInt(input);\r\n });\r\n\r\n // HELPERS\r\n\r\n function parseWeekday(input, locale) {\r\n if (typeof input !== 'string') {\r\n return input;\r\n }\r\n\r\n if (!isNaN(input)) {\r\n return parseInt(input, 10);\r\n }\r\n\r\n input = locale.weekdaysParse(input);\r\n if (typeof input === 'number') {\r\n return input;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // LOCALES\r\n\r\n var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\r\n function localeWeekdays(m, format) {\r\n return isArray(this._weekdays) ? this._weekdays[m.day()] :\r\n this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\r\n }\r\n\r\n var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\r\n function localeWeekdaysShort(m) {\r\n return this._weekdaysShort[m.day()];\r\n }\r\n\r\n var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\r\n function localeWeekdaysMin(m) {\r\n return this._weekdaysMin[m.day()];\r\n }\r\n\r\n function day_of_week__handleStrictParse(weekdayName, format, strict) {\r\n var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\r\n if (!this._weekdaysParse) {\r\n this._weekdaysParse = [];\r\n this._shortWeekdaysParse = [];\r\n this._minWeekdaysParse = [];\r\n\r\n for (i = 0; i < 7; ++i) {\r\n mom = create_utc__createUTC([2000, 1]).day(i);\r\n this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\r\n this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\r\n this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\r\n }\r\n }\r\n\r\n if (strict) {\r\n if (format === 'dddd') {\r\n ii = indexOf.call(this._weekdaysParse, llc);\r\n return ii !== -1 ? ii : null;\r\n } else if (format === 'ddd') {\r\n ii = indexOf.call(this._shortWeekdaysParse, llc);\r\n return ii !== -1 ? ii : null;\r\n } else {\r\n ii = indexOf.call(this._minWeekdaysParse, llc);\r\n return ii !== -1 ? ii : null;\r\n }\r\n } else {\r\n if (format === 'dddd') {\r\n ii = indexOf.call(this._weekdaysParse, llc);\r\n if (ii !== -1) {\r\n return ii;\r\n }\r\n ii = indexOf.call(this._shortWeekdaysParse, llc);\r\n if (ii !== -1) {\r\n return ii;\r\n }\r\n ii = indexOf.call(this._minWeekdaysParse, llc);\r\n return ii !== -1 ? ii : null;\r\n } else if (format === 'ddd') {\r\n ii = indexOf.call(this._shortWeekdaysParse, llc);\r\n if (ii !== -1) {\r\n return ii;\r\n }\r\n ii = indexOf.call(this._weekdaysParse, llc);\r\n if (ii !== -1) {\r\n return ii;\r\n }\r\n ii = indexOf.call(this._minWeekdaysParse, llc);\r\n return ii !== -1 ? ii : null;\r\n } else {\r\n ii = indexOf.call(this._minWeekdaysParse, llc);\r\n if (ii !== -1) {\r\n return ii;\r\n }\r\n ii = indexOf.call(this._weekdaysParse, llc);\r\n if (ii !== -1) {\r\n return ii;\r\n }\r\n ii = indexOf.call(this._shortWeekdaysParse, llc);\r\n return ii !== -1 ? ii : null;\r\n }\r\n }\r\n }\r\n\r\n function localeWeekdaysParse(weekdayName, format, strict) {\r\n var i, mom, regex;\r\n\r\n if (this._weekdaysParseExact) {\r\n return day_of_week__handleStrictParse.call(this, weekdayName, format, strict);\r\n }\r\n\r\n if (!this._weekdaysParse) {\r\n this._weekdaysParse = [];\r\n this._minWeekdaysParse = [];\r\n this._shortWeekdaysParse = [];\r\n this._fullWeekdaysParse = [];\r\n }\r\n\r\n for (i = 0; i < 7; i++) {\r\n // make the regex if we don't have it already\r\n\r\n mom = create_utc__createUTC([2000, 1]).day(i);\r\n if (strict && !this._fullWeekdaysParse[i]) {\r\n this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\r\n this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\r\n this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\r\n }\r\n if (!this._weekdaysParse[i]) {\r\n regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\r\n this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\r\n }\r\n // test the regex\r\n if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\r\n return i;\r\n } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\r\n return i;\r\n } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\r\n return i;\r\n } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n // MOMENTS\r\n\r\n function getSetDayOfWeek(input) {\r\n if (!this.isValid()) {\r\n return input != null ? this : NaN;\r\n }\r\n var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\r\n if (input != null) {\r\n input = parseWeekday(input, this.localeData());\r\n return this.add(input - day, 'd');\r\n } else {\r\n return day;\r\n }\r\n }\r\n\r\n function getSetLocaleDayOfWeek(input) {\r\n if (!this.isValid()) {\r\n return input != null ? this : NaN;\r\n }\r\n var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\r\n return input == null ? weekday : this.add(input - weekday, 'd');\r\n }\r\n\r\n function getSetISODayOfWeek(input) {\r\n if (!this.isValid()) {\r\n return input != null ? this : NaN;\r\n }\r\n // behaves the same as moment#day except\r\n // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\r\n // as a setter, sunday should belong to the previous week.\r\n return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);\r\n }\r\n\r\n var defaultWeekdaysRegex = matchWord;\r\n function weekdaysRegex(isStrict) {\r\n if (this._weekdaysParseExact) {\r\n if (!hasOwnProp(this, '_weekdaysRegex')) {\r\n computeWeekdaysParse.call(this);\r\n }\r\n if (isStrict) {\r\n return this._weekdaysStrictRegex;\r\n } else {\r\n return this._weekdaysRegex;\r\n }\r\n } else {\r\n return this._weekdaysStrictRegex && isStrict ?\r\n this._weekdaysStrictRegex : this._weekdaysRegex;\r\n }\r\n }\r\n\r\n var defaultWeekdaysShortRegex = matchWord;\r\n function weekdaysShortRegex(isStrict) {\r\n if (this._weekdaysParseExact) {\r\n if (!hasOwnProp(this, '_weekdaysRegex')) {\r\n computeWeekdaysParse.call(this);\r\n }\r\n if (isStrict) {\r\n return this._weekdaysShortStrictRegex;\r\n } else {\r\n return this._weekdaysShortRegex;\r\n }\r\n } else {\r\n return this._weekdaysShortStrictRegex && isStrict ?\r\n this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\r\n }\r\n }\r\n\r\n var defaultWeekdaysMinRegex = matchWord;\r\n function weekdaysMinRegex(isStrict) {\r\n if (this._weekdaysParseExact) {\r\n if (!hasOwnProp(this, '_weekdaysRegex')) {\r\n computeWeekdaysParse.call(this);\r\n }\r\n if (isStrict) {\r\n return this._weekdaysMinStrictRegex;\r\n } else {\r\n return this._weekdaysMinRegex;\r\n }\r\n } else {\r\n return this._weekdaysMinStrictRegex && isStrict ?\r\n this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\r\n }\r\n }\r\n\r\n\r\n function computeWeekdaysParse() {\r\n function cmpLenRev(a, b) {\r\n return b.length - a.length;\r\n }\r\n\r\n var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\r\n i, mom, minp, shortp, longp;\r\n for (i = 0; i < 7; i++) {\r\n // make the regex if we don't have it already\r\n mom = create_utc__createUTC([2000, 1]).day(i);\r\n minp = this.weekdaysMin(mom, '');\r\n shortp = this.weekdaysShort(mom, '');\r\n longp = this.weekdays(mom, '');\r\n minPieces.push(minp);\r\n shortPieces.push(shortp);\r\n longPieces.push(longp);\r\n mixedPieces.push(minp);\r\n mixedPieces.push(shortp);\r\n mixedPieces.push(longp);\r\n }\r\n // Sorting makes sure if one weekday (or abbr) is a prefix of another it\r\n // will match the longer piece.\r\n minPieces.sort(cmpLenRev);\r\n shortPieces.sort(cmpLenRev);\r\n longPieces.sort(cmpLenRev);\r\n mixedPieces.sort(cmpLenRev);\r\n for (i = 0; i < 7; i++) {\r\n shortPieces[i] = regexEscape(shortPieces[i]);\r\n longPieces[i] = regexEscape(longPieces[i]);\r\n mixedPieces[i] = regexEscape(mixedPieces[i]);\r\n }\r\n\r\n this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\r\n this._weekdaysShortRegex = this._weekdaysRegex;\r\n this._weekdaysMinRegex = this._weekdaysRegex;\r\n\r\n this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\r\n this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\r\n this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\r\n }\r\n\r\n // FORMATTING\r\n\r\n addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\r\n\r\n // ALIASES\r\n\r\n addUnitAlias('dayOfYear', 'DDD');\r\n\r\n // PARSING\r\n\r\n addRegexToken('DDD', match1to3);\r\n addRegexToken('DDDD', match3);\r\n addParseToken(['DDD', 'DDDD'], function (input, array, config) {\r\n config._dayOfYear = toInt(input);\r\n });\r\n\r\n // HELPERS\r\n\r\n // MOMENTS\r\n\r\n function getSetDayOfYear(input) {\r\n var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\r\n return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\r\n }\r\n\r\n // FORMATTING\r\n\r\n function hFormat() {\r\n return this.hours() % 12 || 12;\r\n }\r\n\r\n function kFormat() {\r\n return this.hours() || 24;\r\n }\r\n\r\n addFormatToken('H', ['HH', 2], 0, 'hour');\r\n addFormatToken('h', ['hh', 2], 0, hFormat);\r\n addFormatToken('k', ['kk', 2], 0, kFormat);\r\n\r\n addFormatToken('hmm', 0, 0, function () {\r\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\r\n });\r\n\r\n addFormatToken('hmmss', 0, 0, function () {\r\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\r\n zeroFill(this.seconds(), 2);\r\n });\r\n\r\n addFormatToken('Hmm', 0, 0, function () {\r\n return '' + this.hours() + zeroFill(this.minutes(), 2);\r\n });\r\n\r\n addFormatToken('Hmmss', 0, 0, function () {\r\n return '' + this.hours() + zeroFill(this.minutes(), 2) +\r\n zeroFill(this.seconds(), 2);\r\n });\r\n\r\n function meridiem(token, lowercase) {\r\n addFormatToken(token, 0, 0, function () {\r\n return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\r\n });\r\n }\r\n\r\n meridiem('a', true);\r\n meridiem('A', false);\r\n\r\n // ALIASES\r\n\r\n addUnitAlias('hour', 'h');\r\n\r\n // PARSING\r\n\r\n function matchMeridiem(isStrict, locale) {\r\n return locale._meridiemParse;\r\n }\r\n\r\n addRegexToken('a', matchMeridiem);\r\n addRegexToken('A', matchMeridiem);\r\n addRegexToken('H', match1to2);\r\n addRegexToken('h', match1to2);\r\n addRegexToken('HH', match1to2, match2);\r\n addRegexToken('hh', match1to2, match2);\r\n\r\n addRegexToken('hmm', match3to4);\r\n addRegexToken('hmmss', match5to6);\r\n addRegexToken('Hmm', match3to4);\r\n addRegexToken('Hmmss', match5to6);\r\n\r\n addParseToken(['H', 'HH'], HOUR);\r\n addParseToken(['a', 'A'], function (input, array, config) {\r\n config._isPm = config._locale.isPM(input);\r\n config._meridiem = input;\r\n });\r\n addParseToken(['h', 'hh'], function (input, array, config) {\r\n array[HOUR] = toInt(input);\r\n getParsingFlags(config).bigHour = true;\r\n });\r\n addParseToken('hmm', function (input, array, config) {\r\n var pos = input.length - 2;\r\n array[HOUR] = toInt(input.substr(0, pos));\r\n array[MINUTE] = toInt(input.substr(pos));\r\n getParsingFlags(config).bigHour = true;\r\n });\r\n addParseToken('hmmss', function (input, array, config) {\r\n var pos1 = input.length - 4;\r\n var pos2 = input.length - 2;\r\n array[HOUR] = toInt(input.substr(0, pos1));\r\n array[MINUTE] = toInt(input.substr(pos1, 2));\r\n array[SECOND] = toInt(input.substr(pos2));\r\n getParsingFlags(config).bigHour = true;\r\n });\r\n addParseToken('Hmm', function (input, array, config) {\r\n var pos = input.length - 2;\r\n array[HOUR] = toInt(input.substr(0, pos));\r\n array[MINUTE] = toInt(input.substr(pos));\r\n });\r\n addParseToken('Hmmss', function (input, array, config) {\r\n var pos1 = input.length - 4;\r\n var pos2 = input.length - 2;\r\n array[HOUR] = toInt(input.substr(0, pos1));\r\n array[MINUTE] = toInt(input.substr(pos1, 2));\r\n array[SECOND] = toInt(input.substr(pos2));\r\n });\r\n\r\n // LOCALES\r\n\r\n function localeIsPM(input) {\r\n // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\r\n // Using charAt should be more compatible.\r\n return ((input + '').toLowerCase().charAt(0) === 'p');\r\n }\r\n\r\n var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\r\n function localeMeridiem(hours, minutes, isLower) {\r\n if (hours > 11) {\r\n return isLower ? 'pm' : 'PM';\r\n } else {\r\n return isLower ? 'am' : 'AM';\r\n }\r\n }\r\n\r\n\r\n // MOMENTS\r\n\r\n // Setting the hour should keep the time, because the user explicitly\r\n // specified which hour he wants. So trying to maintain the same hour (in\r\n // a new timezone) makes sense. Adding/subtracting hours does not follow\r\n // this rule.\r\n var getSetHour = makeGetSet('Hours', true);\r\n\r\n // FORMATTING\r\n\r\n addFormatToken('m', ['mm', 2], 0, 'minute');\r\n\r\n // ALIASES\r\n\r\n addUnitAlias('minute', 'm');\r\n\r\n // PARSING\r\n\r\n addRegexToken('m', match1to2);\r\n addRegexToken('mm', match1to2, match2);\r\n addParseToken(['m', 'mm'], MINUTE);\r\n\r\n // MOMENTS\r\n\r\n var getSetMinute = makeGetSet('Minutes', false);\r\n\r\n // FORMATTING\r\n\r\n addFormatToken('s', ['ss', 2], 0, 'second');\r\n\r\n // ALIASES\r\n\r\n addUnitAlias('second', 's');\r\n\r\n // PARSING\r\n\r\n addRegexToken('s', match1to2);\r\n addRegexToken('ss', match1to2, match2);\r\n addParseToken(['s', 'ss'], SECOND);\r\n\r\n // MOMENTS\r\n\r\n var getSetSecond = makeGetSet('Seconds', false);\r\n\r\n // FORMATTING\r\n\r\n addFormatToken('S', 0, 0, function () {\r\n return ~~(this.millisecond() / 100);\r\n });\r\n\r\n addFormatToken(0, ['SS', 2], 0, function () {\r\n return ~~(this.millisecond() / 10);\r\n });\r\n\r\n addFormatToken(0, ['SSS', 3], 0, 'millisecond');\r\n addFormatToken(0, ['SSSS', 4], 0, function () {\r\n return this.millisecond() * 10;\r\n });\r\n addFormatToken(0, ['SSSSS', 5], 0, function () {\r\n return this.millisecond() * 100;\r\n });\r\n addFormatToken(0, ['SSSSSS', 6], 0, function () {\r\n return this.millisecond() * 1000;\r\n });\r\n addFormatToken(0, ['SSSSSSS', 7], 0, function () {\r\n return this.millisecond() * 10000;\r\n });\r\n addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\r\n return this.millisecond() * 100000;\r\n });\r\n addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\r\n return this.millisecond() * 1000000;\r\n });\r\n\r\n\r\n // ALIASES\r\n\r\n addUnitAlias('millisecond', 'ms');\r\n\r\n // PARSING\r\n\r\n addRegexToken('S', match1to3, match1);\r\n addRegexToken('SS', match1to3, match2);\r\n addRegexToken('SSS', match1to3, match3);\r\n\r\n var token;\r\n for (token = 'SSSS'; token.length <= 9; token += 'S') {\r\n addRegexToken(token, matchUnsigned);\r\n }\r\n\r\n function parseMs(input, array) {\r\n array[MILLISECOND] = toInt(('0.' + input) * 1000);\r\n }\r\n\r\n for (token = 'S'; token.length <= 9; token += 'S') {\r\n addParseToken(token, parseMs);\r\n }\r\n // MOMENTS\r\n\r\n var getSetMillisecond = makeGetSet('Milliseconds', false);\r\n\r\n // FORMATTING\r\n\r\n addFormatToken('z', 0, 0, 'zoneAbbr');\r\n addFormatToken('zz', 0, 0, 'zoneName');\r\n\r\n // MOMENTS\r\n\r\n function getZoneAbbr() {\r\n return this._isUTC ? 'UTC' : '';\r\n }\r\n\r\n function getZoneName() {\r\n return this._isUTC ? 'Coordinated Universal Time' : '';\r\n }\r\n\r\n var momentPrototype__proto = Moment.prototype;\r\n\r\n momentPrototype__proto.add = add_subtract__add;\r\n momentPrototype__proto.calendar = moment_calendar__calendar;\r\n momentPrototype__proto.clone = clone;\r\n momentPrototype__proto.diff = diff;\r\n momentPrototype__proto.endOf = endOf;\r\n momentPrototype__proto.format = format;\r\n momentPrototype__proto.from = from;\r\n momentPrototype__proto.fromNow = fromNow;\r\n momentPrototype__proto.to = to;\r\n momentPrototype__proto.toNow = toNow;\r\n momentPrototype__proto.get = getSet;\r\n momentPrototype__proto.invalidAt = invalidAt;\r\n momentPrototype__proto.isAfter = isAfter;\r\n momentPrototype__proto.isBefore = isBefore;\r\n momentPrototype__proto.isBetween = isBetween;\r\n momentPrototype__proto.isSame = isSame;\r\n momentPrototype__proto.isSameOrAfter = isSameOrAfter;\r\n momentPrototype__proto.isSameOrBefore = isSameOrBefore;\r\n momentPrototype__proto.isValid = moment_valid__isValid;\r\n momentPrototype__proto.lang = lang;\r\n momentPrototype__proto.locale = locale;\r\n momentPrototype__proto.localeData = localeData;\r\n momentPrototype__proto.max = prototypeMax;\r\n momentPrototype__proto.min = prototypeMin;\r\n momentPrototype__proto.parsingFlags = parsingFlags;\r\n momentPrototype__proto.set = getSet;\r\n momentPrototype__proto.startOf = startOf;\r\n momentPrototype__proto.subtract = add_subtract__subtract;\r\n momentPrototype__proto.toArray = toArray;\r\n momentPrototype__proto.toObject = toObject;\r\n momentPrototype__proto.toDate = toDate;\r\n momentPrototype__proto.toISOString = moment_format__toISOString;\r\n momentPrototype__proto.toJSON = toJSON;\r\n momentPrototype__proto.toString = toString;\r\n momentPrototype__proto.unix = unix;\r\n momentPrototype__proto.valueOf = to_type__valueOf;\r\n momentPrototype__proto.creationData = creationData;\r\n\r\n // Year\r\n momentPrototype__proto.year = getSetYear;\r\n momentPrototype__proto.isLeapYear = getIsLeapYear;\r\n\r\n // Week Year\r\n momentPrototype__proto.weekYear = getSetWeekYear;\r\n momentPrototype__proto.isoWeekYear = getSetISOWeekYear;\r\n\r\n // Quarter\r\n momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter;\r\n\r\n // Month\r\n momentPrototype__proto.month = getSetMonth;\r\n momentPrototype__proto.daysInMonth = getDaysInMonth;\r\n\r\n // Week\r\n momentPrototype__proto.week = momentPrototype__proto.weeks = getSetWeek;\r\n momentPrototype__proto.isoWeek = momentPrototype__proto.isoWeeks = getSetISOWeek;\r\n momentPrototype__proto.weeksInYear = getWeeksInYear;\r\n momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear;\r\n\r\n // Day\r\n momentPrototype__proto.date = getSetDayOfMonth;\r\n momentPrototype__proto.day = momentPrototype__proto.days = getSetDayOfWeek;\r\n momentPrototype__proto.weekday = getSetLocaleDayOfWeek;\r\n momentPrototype__proto.isoWeekday = getSetISODayOfWeek;\r\n momentPrototype__proto.dayOfYear = getSetDayOfYear;\r\n\r\n // Hour\r\n momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour;\r\n\r\n // Minute\r\n momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute;\r\n\r\n // Second\r\n momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond;\r\n\r\n // Millisecond\r\n momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond;\r\n\r\n // Offset\r\n momentPrototype__proto.utcOffset = getSetOffset;\r\n momentPrototype__proto.utc = setOffsetToUTC;\r\n momentPrototype__proto.local = setOffsetToLocal;\r\n momentPrototype__proto.parseZone = setOffsetToParsedOffset;\r\n momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset;\r\n momentPrototype__proto.isDST = isDaylightSavingTime;\r\n momentPrototype__proto.isDSTShifted = isDaylightSavingTimeShifted;\r\n momentPrototype__proto.isLocal = isLocal;\r\n momentPrototype__proto.isUtcOffset = isUtcOffset;\r\n momentPrototype__proto.isUtc = isUtc;\r\n momentPrototype__proto.isUTC = isUtc;\r\n\r\n // Timezone\r\n momentPrototype__proto.zoneAbbr = getZoneAbbr;\r\n momentPrototype__proto.zoneName = getZoneName;\r\n\r\n // Deprecations\r\n momentPrototype__proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\r\n momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\r\n momentPrototype__proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\r\n momentPrototype__proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779', getSetZone);\r\n\r\n var momentPrototype = momentPrototype__proto;\r\n\r\n function moment__createUnix(input) {\r\n return local__createLocal(input * 1000);\r\n }\r\n\r\n function moment__createInZone() {\r\n return local__createLocal.apply(null, arguments).parseZone();\r\n }\r\n\r\n var defaultCalendar = {\r\n sameDay: '[Today at] LT',\r\n nextDay: '[Tomorrow at] LT',\r\n nextWeek: 'dddd [at] LT',\r\n lastDay: '[Yesterday at] LT',\r\n lastWeek: '[Last] dddd [at] LT',\r\n sameElse: 'L'\r\n };\r\n\r\n function locale_calendar__calendar(key, mom, now) {\r\n var output = this._calendar[key];\r\n return isFunction(output) ? output.call(mom, now) : output;\r\n }\r\n\r\n var defaultLongDateFormat = {\r\n LTS: 'h:mm:ss A',\r\n LT: 'h:mm A',\r\n L: 'MM/DD/YYYY',\r\n LL: 'MMMM D, YYYY',\r\n LLL: 'MMMM D, YYYY h:mm A',\r\n LLLL: 'dddd, MMMM D, YYYY h:mm A'\r\n };\r\n\r\n function longDateFormat(key) {\r\n var format = this._longDateFormat[key],\r\n formatUpper = this._longDateFormat[key.toUpperCase()];\r\n\r\n if (format || !formatUpper) {\r\n return format;\r\n }\r\n\r\n this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\r\n return val.slice(1);\r\n });\r\n\r\n return this._longDateFormat[key];\r\n }\r\n\r\n var defaultInvalidDate = 'Invalid date';\r\n\r\n function invalidDate() {\r\n return this._invalidDate;\r\n }\r\n\r\n var defaultOrdinal = '%d';\r\n var defaultOrdinalParse = /\\d{1,2}/;\r\n\r\n function ordinal(number) {\r\n return this._ordinal.replace('%d', number);\r\n }\r\n\r\n function preParsePostFormat(string) {\r\n return string;\r\n }\r\n\r\n var defaultRelativeTime = {\r\n future: 'in %s',\r\n past: '%s ago',\r\n s: 'a few seconds',\r\n m: 'a minute',\r\n mm: '%d minutes',\r\n h: 'an hour',\r\n hh: '%d hours',\r\n d: 'a day',\r\n dd: '%d days',\r\n M: 'a month',\r\n MM: '%d months',\r\n y: 'a year',\r\n yy: '%d years'\r\n };\r\n\r\n function relative__relativeTime(number, withoutSuffix, string, isFuture) {\r\n var output = this._relativeTime[string];\r\n return (isFunction(output)) ?\r\n output(number, withoutSuffix, string, isFuture) :\r\n output.replace(/%d/i, number);\r\n }\r\n\r\n function pastFuture(diff, output) {\r\n var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\r\n return isFunction(format) ? format(output) : format.replace(/%s/i, output);\r\n }\r\n\r\n var prototype__proto = Locale.prototype;\r\n\r\n prototype__proto._calendar = defaultCalendar;\r\n prototype__proto.calendar = locale_calendar__calendar;\r\n prototype__proto._longDateFormat = defaultLongDateFormat;\r\n prototype__proto.longDateFormat = longDateFormat;\r\n prototype__proto._invalidDate = defaultInvalidDate;\r\n prototype__proto.invalidDate = invalidDate;\r\n prototype__proto._ordinal = defaultOrdinal;\r\n prototype__proto.ordinal = ordinal;\r\n prototype__proto._ordinalParse = defaultOrdinalParse;\r\n prototype__proto.preparse = preParsePostFormat;\r\n prototype__proto.postformat = preParsePostFormat;\r\n prototype__proto._relativeTime = defaultRelativeTime;\r\n prototype__proto.relativeTime = relative__relativeTime;\r\n prototype__proto.pastFuture = pastFuture;\r\n prototype__proto.set = locale_set__set;\r\n\r\n // Month\r\n prototype__proto.months = localeMonths;\r\n prototype__proto._months = defaultLocaleMonths;\r\n prototype__proto.monthsShort = localeMonthsShort;\r\n prototype__proto._monthsShort = defaultLocaleMonthsShort;\r\n prototype__proto.monthsParse = localeMonthsParse;\r\n prototype__proto._monthsRegex = defaultMonthsRegex;\r\n prototype__proto.monthsRegex = monthsRegex;\r\n prototype__proto._monthsShortRegex = defaultMonthsShortRegex;\r\n prototype__proto.monthsShortRegex = monthsShortRegex;\r\n\r\n // Week\r\n prototype__proto.week = localeWeek;\r\n prototype__proto._week = defaultLocaleWeek;\r\n prototype__proto.firstDayOfYear = localeFirstDayOfYear;\r\n prototype__proto.firstDayOfWeek = localeFirstDayOfWeek;\r\n\r\n // Day of Week\r\n prototype__proto.weekdays = localeWeekdays;\r\n prototype__proto._weekdays = defaultLocaleWeekdays;\r\n prototype__proto.weekdaysMin = localeWeekdaysMin;\r\n prototype__proto._weekdaysMin = defaultLocaleWeekdaysMin;\r\n prototype__proto.weekdaysShort = localeWeekdaysShort;\r\n prototype__proto._weekdaysShort = defaultLocaleWeekdaysShort;\r\n prototype__proto.weekdaysParse = localeWeekdaysParse;\r\n\r\n prototype__proto._weekdaysRegex = defaultWeekdaysRegex;\r\n prototype__proto.weekdaysRegex = weekdaysRegex;\r\n prototype__proto._weekdaysShortRegex = defaultWeekdaysShortRegex;\r\n prototype__proto.weekdaysShortRegex = weekdaysShortRegex;\r\n prototype__proto._weekdaysMinRegex = defaultWeekdaysMinRegex;\r\n prototype__proto.weekdaysMinRegex = weekdaysMinRegex;\r\n\r\n // Hours\r\n prototype__proto.isPM = localeIsPM;\r\n prototype__proto._meridiemParse = defaultLocaleMeridiemParse;\r\n prototype__proto.meridiem = localeMeridiem;\r\n\r\n function lists__get(format, index, field, setter) {\r\n var locale = locale_locales__getLocale();\r\n var utc = create_utc__createUTC().set(setter, index);\r\n return locale[field](utc, format);\r\n }\r\n\r\n function listMonthsImpl(format, index, field) {\r\n if (typeof format === 'number') {\r\n index = format;\r\n format = undefined;\r\n }\r\n\r\n format = format || '';\r\n\r\n if (index != null) {\r\n return lists__get(format, index, field, 'month');\r\n }\r\n\r\n var i;\r\n var out = [];\r\n for (i = 0; i < 12; i++) {\r\n out[i] = lists__get(format, i, field, 'month');\r\n }\r\n return out;\r\n }\r\n\r\n // ()\r\n // (5)\r\n // (fmt, 5)\r\n // (fmt)\r\n // (true)\r\n // (true, 5)\r\n // (true, fmt, 5)\r\n // (true, fmt)\r\n function listWeekdaysImpl(localeSorted, format, index, field) {\r\n if (typeof localeSorted === 'boolean') {\r\n if (typeof format === 'number') {\r\n index = format;\r\n format = undefined;\r\n }\r\n\r\n format = format || '';\r\n } else {\r\n format = localeSorted;\r\n index = format;\r\n localeSorted = false;\r\n\r\n if (typeof format === 'number') {\r\n index = format;\r\n format = undefined;\r\n }\r\n\r\n format = format || '';\r\n }\r\n\r\n var locale = locale_locales__getLocale(),\r\n shift = localeSorted ? locale._week.dow : 0;\r\n\r\n if (index != null) {\r\n return lists__get(format, (index + shift) % 7, field, 'day');\r\n }\r\n\r\n var i;\r\n var out = [];\r\n for (i = 0; i < 7; i++) {\r\n out[i] = lists__get(format, (i + shift) % 7, field, 'day');\r\n }\r\n return out;\r\n }\r\n\r\n function lists__listMonths(format, index) {\r\n return listMonthsImpl(format, index, 'months');\r\n }\r\n\r\n function lists__listMonthsShort(format, index) {\r\n return listMonthsImpl(format, index, 'monthsShort');\r\n }\r\n\r\n function lists__listWeekdays(localeSorted, format, index) {\r\n return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\r\n }\r\n\r\n function lists__listWeekdaysShort(localeSorted, format, index) {\r\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\r\n }\r\n\r\n function lists__listWeekdaysMin(localeSorted, format, index) {\r\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\r\n }\r\n\r\n locale_locales__getSetGlobalLocale('en', {\r\n ordinalParse: /\\d{1,2}(th|st|nd|rd)/,\r\n ordinal: function (number) {\r\n var b = number % 10,\r\n output = (toInt(number % 100 / 10) === 1) ? 'th' :\r\n (b === 1) ? 'st' :\r\n (b === 2) ? 'nd' :\r\n (b === 3) ? 'rd' : 'th';\r\n return number + output;\r\n }\r\n });\r\n\r\n // Side effect imports\r\n utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale);\r\n utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale);\r\n\r\n var mathAbs = Math.abs;\r\n\r\n function duration_abs__abs() {\r\n var data = this._data;\r\n\r\n this._milliseconds = mathAbs(this._milliseconds);\r\n this._days = mathAbs(this._days);\r\n this._months = mathAbs(this._months);\r\n\r\n data.milliseconds = mathAbs(data.milliseconds);\r\n data.seconds = mathAbs(data.seconds);\r\n data.minutes = mathAbs(data.minutes);\r\n data.hours = mathAbs(data.hours);\r\n data.months = mathAbs(data.months);\r\n data.years = mathAbs(data.years);\r\n\r\n return this;\r\n }\r\n\r\n function duration_add_subtract__addSubtract(duration, input, value, direction) {\r\n var other = create__createDuration(input, value);\r\n\r\n duration._milliseconds += direction * other._milliseconds;\r\n duration._days += direction * other._days;\r\n duration._months += direction * other._months;\r\n\r\n return duration._bubble();\r\n }\r\n\r\n // supports only 2.0-style add(1, 's') or add(duration)\r\n function duration_add_subtract__add(input, value) {\r\n return duration_add_subtract__addSubtract(this, input, value, 1);\r\n }\r\n\r\n // supports only 2.0-style subtract(1, 's') or subtract(duration)\r\n function duration_add_subtract__subtract(input, value) {\r\n return duration_add_subtract__addSubtract(this, input, value, -1);\r\n }\r\n\r\n function absCeil(number) {\r\n if (number < 0) {\r\n return Math.floor(number);\r\n } else {\r\n return Math.ceil(number);\r\n }\r\n }\r\n\r\n function bubble() {\r\n var milliseconds = this._milliseconds;\r\n var days = this._days;\r\n var months = this._months;\r\n var data = this._data;\r\n var seconds, minutes, hours, years, monthsFromDays;\r\n\r\n // if we have a mix of positive and negative values, bubble down first\r\n // check: https://github.com/moment/moment/issues/2166\r\n if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\r\n (milliseconds <= 0 && days <= 0 && months <= 0))) {\r\n milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\r\n days = 0;\r\n months = 0;\r\n }\r\n\r\n // The following code bubbles up values, see the tests for\r\n // examples of what that means.\r\n data.milliseconds = milliseconds % 1000;\r\n\r\n seconds = absFloor(milliseconds / 1000);\r\n data.seconds = seconds % 60;\r\n\r\n minutes = absFloor(seconds / 60);\r\n data.minutes = minutes % 60;\r\n\r\n hours = absFloor(minutes / 60);\r\n data.hours = hours % 24;\r\n\r\n days += absFloor(hours / 24);\r\n\r\n // convert days to months\r\n monthsFromDays = absFloor(daysToMonths(days));\r\n months += monthsFromDays;\r\n days -= absCeil(monthsToDays(monthsFromDays));\r\n\r\n // 12 months -> 1 year\r\n years = absFloor(months / 12);\r\n months %= 12;\r\n\r\n data.days = days;\r\n data.months = months;\r\n data.years = years;\r\n\r\n return this;\r\n }\r\n\r\n function daysToMonths(days) {\r\n // 400 years have 146097 days (taking into account leap year rules)\r\n // 400 years have 12 months === 4800\r\n return days * 4800 / 146097;\r\n }\r\n\r\n function monthsToDays(months) {\r\n // the reverse of daysToMonths\r\n return months * 146097 / 4800;\r\n }\r\n\r\n function as(units) {\r\n var days;\r\n var months;\r\n var milliseconds = this._milliseconds;\r\n\r\n units = normalizeUnits(units);\r\n\r\n if (units === 'month' || units === 'year') {\r\n days = this._days + milliseconds / 864e5;\r\n months = this._months + daysToMonths(days);\r\n return units === 'month' ? months : months / 12;\r\n } else {\r\n // handle milliseconds separately because of floating point math errors (issue #1867)\r\n days = this._days + Math.round(monthsToDays(this._months));\r\n switch (units) {\r\n case 'week': return days / 7 + milliseconds / 6048e5;\r\n case 'day': return days + milliseconds / 864e5;\r\n case 'hour': return days * 24 + milliseconds / 36e5;\r\n case 'minute': return days * 1440 + milliseconds / 6e4;\r\n case 'second': return days * 86400 + milliseconds / 1000;\r\n // Math.floor prevents floating point math errors here\r\n case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\r\n default: throw new Error('Unknown unit ' + units);\r\n }\r\n }\r\n }\r\n\r\n // TODO: Use this.as('ms')?\r\n function duration_as__valueOf() {\r\n return (\r\n this._milliseconds +\r\n this._days * 864e5 +\r\n (this._months % 12) * 2592e6 +\r\n toInt(this._months / 12) * 31536e6\r\n );\r\n }\r\n\r\n function makeAs(alias) {\r\n return function () {\r\n return this.as(alias);\r\n };\r\n }\r\n\r\n var asMilliseconds = makeAs('ms');\r\n var asSeconds = makeAs('s');\r\n var asMinutes = makeAs('m');\r\n var asHours = makeAs('h');\r\n var asDays = makeAs('d');\r\n var asWeeks = makeAs('w');\r\n var asMonths = makeAs('M');\r\n var asYears = makeAs('y');\r\n\r\n function duration_get__get(units) {\r\n units = normalizeUnits(units);\r\n return this[units + 's']();\r\n }\r\n\r\n function makeGetter(name) {\r\n return function () {\r\n return this._data[name];\r\n };\r\n }\r\n\r\n var milliseconds = makeGetter('milliseconds');\r\n var seconds = makeGetter('seconds');\r\n var minutes = makeGetter('minutes');\r\n var hours = makeGetter('hours');\r\n var days = makeGetter('days');\r\n var months = makeGetter('months');\r\n var years = makeGetter('years');\r\n\r\n function weeks() {\r\n return absFloor(this.days() / 7);\r\n }\r\n\r\n var round = Math.round;\r\n var thresholds = {\r\n s: 45, // seconds to minute\r\n m: 45, // minutes to hour\r\n h: 22, // hours to day\r\n d: 26, // days to month\r\n M: 11 // months to year\r\n };\r\n\r\n // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\r\n function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\r\n return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\r\n }\r\n\r\n function duration_humanize__relativeTime(posNegDuration, withoutSuffix, locale) {\r\n var duration = create__createDuration(posNegDuration).abs();\r\n var seconds = round(duration.as('s'));\r\n var minutes = round(duration.as('m'));\r\n var hours = round(duration.as('h'));\r\n var days = round(duration.as('d'));\r\n var months = round(duration.as('M'));\r\n var years = round(duration.as('y'));\r\n\r\n var a = seconds < thresholds.s && ['s', seconds] ||\r\n minutes <= 1 && ['m'] ||\r\n minutes < thresholds.m && ['mm', minutes] ||\r\n hours <= 1 && ['h'] ||\r\n hours < thresholds.h && ['hh', hours] ||\r\n days <= 1 && ['d'] ||\r\n days < thresholds.d && ['dd', days] ||\r\n months <= 1 && ['M'] ||\r\n months < thresholds.M && ['MM', months] ||\r\n years <= 1 && ['y'] || ['yy', years];\r\n\r\n a[2] = withoutSuffix;\r\n a[3] = +posNegDuration > 0;\r\n a[4] = locale;\r\n return substituteTimeAgo.apply(null, a);\r\n }\r\n\r\n // This function allows you to set a threshold for relative time strings\r\n function duration_humanize__getSetRelativeTimeThreshold(threshold, limit) {\r\n if (thresholds[threshold] === undefined) {\r\n return false;\r\n }\r\n if (limit === undefined) {\r\n return thresholds[threshold];\r\n }\r\n thresholds[threshold] = limit;\r\n return true;\r\n }\r\n\r\n function humanize(withSuffix) {\r\n var locale = this.localeData();\r\n var output = duration_humanize__relativeTime(this, !withSuffix, locale);\r\n\r\n if (withSuffix) {\r\n output = locale.pastFuture(+this, output);\r\n }\r\n\r\n return locale.postformat(output);\r\n }\r\n\r\n var iso_string__abs = Math.abs;\r\n\r\n function iso_string__toISOString() {\r\n // for ISO strings we do not use the normal bubbling rules:\r\n // * milliseconds bubble up until they become hours\r\n // * days do not bubble at all\r\n // * months bubble up until they become years\r\n // This is because there is no context-free conversion between hours and days\r\n // (think of clock changes)\r\n // and also not between days and months (28-31 days per month)\r\n var seconds = iso_string__abs(this._milliseconds) / 1000;\r\n var days = iso_string__abs(this._days);\r\n var months = iso_string__abs(this._months);\r\n var minutes, hours, years;\r\n\r\n // 3600 seconds -> 60 minutes -> 1 hour\r\n minutes = absFloor(seconds / 60);\r\n hours = absFloor(minutes / 60);\r\n seconds %= 60;\r\n minutes %= 60;\r\n\r\n // 12 months -> 1 year\r\n years = absFloor(months / 12);\r\n months %= 12;\r\n\r\n\r\n // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\r\n var Y = years;\r\n var M = months;\r\n var D = days;\r\n var h = hours;\r\n var m = minutes;\r\n var s = seconds;\r\n var total = this.asSeconds();\r\n\r\n if (!total) {\r\n // this is the same as C#'s (Noda) and python (isodate)...\r\n // but not other JS (goog.date)\r\n return 'P0D';\r\n }\r\n\r\n return (total < 0 ? '-' : '') +\r\n 'P' +\r\n (Y ? Y + 'Y' : '') +\r\n (M ? M + 'M' : '') +\r\n (D ? D + 'D' : '') +\r\n ((h || m || s) ? 'T' : '') +\r\n (h ? h + 'H' : '') +\r\n (m ? m + 'M' : '') +\r\n (s ? s + 'S' : '');\r\n }\r\n\r\n var duration_prototype__proto = Duration.prototype;\r\n\r\n duration_prototype__proto.abs = duration_abs__abs;\r\n duration_prototype__proto.add = duration_add_subtract__add;\r\n duration_prototype__proto.subtract = duration_add_subtract__subtract;\r\n duration_prototype__proto.as = as;\r\n duration_prototype__proto.asMilliseconds = asMilliseconds;\r\n duration_prototype__proto.asSeconds = asSeconds;\r\n duration_prototype__proto.asMinutes = asMinutes;\r\n duration_prototype__proto.asHours = asHours;\r\n duration_prototype__proto.asDays = asDays;\r\n duration_prototype__proto.asWeeks = asWeeks;\r\n duration_prototype__proto.asMonths = asMonths;\r\n duration_prototype__proto.asYears = asYears;\r\n duration_prototype__proto.valueOf = duration_as__valueOf;\r\n duration_prototype__proto._bubble = bubble;\r\n duration_prototype__proto.get = duration_get__get;\r\n duration_prototype__proto.milliseconds = milliseconds;\r\n duration_prototype__proto.seconds = seconds;\r\n duration_prototype__proto.minutes = minutes;\r\n duration_prototype__proto.hours = hours;\r\n duration_prototype__proto.days = days;\r\n duration_prototype__proto.weeks = weeks;\r\n duration_prototype__proto.months = months;\r\n duration_prototype__proto.years = years;\r\n duration_prototype__proto.humanize = humanize;\r\n duration_prototype__proto.toISOString = iso_string__toISOString;\r\n duration_prototype__proto.toString = iso_string__toISOString;\r\n duration_prototype__proto.toJSON = iso_string__toISOString;\r\n duration_prototype__proto.locale = locale;\r\n duration_prototype__proto.localeData = localeData;\r\n\r\n // Deprecations\r\n duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString);\r\n duration_prototype__proto.lang = lang;\r\n\r\n // Side effect imports\r\n\r\n // FORMATTING\r\n\r\n addFormatToken('X', 0, 0, 'unix');\r\n addFormatToken('x', 0, 0, 'valueOf');\r\n\r\n // PARSING\r\n\r\n addRegexToken('x', matchSigned);\r\n addRegexToken('X', matchTimestamp);\r\n addParseToken('X', function (input, array, config) {\r\n config._d = new Date(parseFloat(input, 10) * 1000);\r\n });\r\n addParseToken('x', function (input, array, config) {\r\n config._d = new Date(toInt(input));\r\n });\r\n\r\n // Side effect imports\r\n\r\n\r\n utils_hooks__hooks.version = '2.13.0';\r\n\r\n setHookCallback(local__createLocal);\r\n\r\n utils_hooks__hooks.fn = momentPrototype;\r\n utils_hooks__hooks.min = min;\r\n utils_hooks__hooks.max = max;\r\n utils_hooks__hooks.now = now;\r\n utils_hooks__hooks.utc = create_utc__createUTC;\r\n utils_hooks__hooks.unix = moment__createUnix;\r\n utils_hooks__hooks.months = lists__listMonths;\r\n utils_hooks__hooks.isDate = isDate;\r\n utils_hooks__hooks.locale = locale_locales__getSetGlobalLocale;\r\n utils_hooks__hooks.invalid = valid__createInvalid;\r\n utils_hooks__hooks.duration = create__createDuration;\r\n utils_hooks__hooks.isMoment = isMoment;\r\n utils_hooks__hooks.weekdays = lists__listWeekdays;\r\n utils_hooks__hooks.parseZone = moment__createInZone;\r\n utils_hooks__hooks.localeData = locale_locales__getLocale;\r\n utils_hooks__hooks.isDuration = isDuration;\r\n utils_hooks__hooks.monthsShort = lists__listMonthsShort;\r\n utils_hooks__hooks.weekdaysMin = lists__listWeekdaysMin;\r\n utils_hooks__hooks.defineLocale = defineLocale;\r\n utils_hooks__hooks.updateLocale = updateLocale;\r\n utils_hooks__hooks.locales = locale_locales__listLocales;\r\n utils_hooks__hooks.weekdaysShort = lists__listWeekdaysShort;\r\n utils_hooks__hooks.normalizeUnits = normalizeUnits;\r\n utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold;\r\n utils_hooks__hooks.prototype = momentPrototype;\r\n\r\n var _moment = utils_hooks__hooks;\r\n\r\n return _moment;\r\n\r\n }));\r\n }, {}], 113: [function (require, module, exports) {\r\n /*!\r\n * normalize-path \r\n *\r\n * Copyright (c) 2014-2015, Jon Schlinkert.\r\n * Licensed under the MIT License\r\n */\r\n\r\n module.exports = function normalizePath(str, stripTrailing) {\r\n if (typeof str !== 'string') {\r\n throw new TypeError('expected a string');\r\n }\r\n str = str.replace(/[\\\\\\/]+/g, '/');\r\n if (stripTrailing !== false) {\r\n str = str.replace(/\\/$/, '');\r\n }\r\n return str;\r\n };\r\n\r\n }, {}], 114: [function (require, module, exports) {\r\n /*!\r\n * object.omit \r\n *\r\n * Copyright (c) 2014-2015, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n var isObject = require('is-extendable');\r\n var forOwn = require('for-own');\r\n\r\n module.exports = function omit(obj, keys) {\r\n if (!isObject(obj)) return {};\r\n\r\n var keys = [].concat.apply([], [].slice.call(arguments, 1));\r\n var last = keys[keys.length - 1];\r\n var res = {}, fn;\r\n\r\n if (typeof last === 'function') {\r\n fn = keys.pop();\r\n }\r\n\r\n var isFunction = typeof fn === 'function';\r\n if (!keys.length && !isFunction) {\r\n return obj;\r\n }\r\n\r\n forOwn(obj, function (value, key) {\r\n if (keys.indexOf(key) === -1) {\r\n\r\n if (!isFunction) {\r\n res[key] = value;\r\n } else if (fn(value, key, obj)) {\r\n res[key] = value;\r\n }\r\n }\r\n });\r\n return res;\r\n };\r\n\r\n }, { \"for-own\": 35, \"is-extendable\": 89 }], 115: [function (require, module, exports) {\r\n /*!\r\n * parse-glob \r\n *\r\n * Copyright (c) 2015, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n var isGlob = require('is-glob');\r\n var findBase = require('glob-base');\r\n var extglob = require('is-extglob');\r\n var dotfile = require('is-dotfile');\r\n\r\n /**\r\n * Expose `cache`\r\n */\r\n\r\n var cache = module.exports.cache = {};\r\n\r\n /**\r\n * Parse a glob pattern into tokens.\r\n *\r\n * When no paths or '**' are in the glob, we use a\r\n * different strategy for parsing the filename, since\r\n * file names can contain braces and other difficult\r\n * patterns. such as:\r\n *\r\n * - `*.{a,b}`\r\n * - `(**|*.js)`\r\n */\r\n\r\n module.exports = function parseGlob(glob) {\r\n if (cache.hasOwnProperty(glob)) {\r\n return cache[glob];\r\n }\r\n\r\n var tok = {};\r\n tok.orig = glob;\r\n tok.is = {};\r\n\r\n // unescape dots and slashes in braces/brackets\r\n glob = escape(glob);\r\n\r\n var parsed = findBase(glob);\r\n tok.is.glob = parsed.isGlob;\r\n\r\n tok.glob = parsed.glob;\r\n tok.base = parsed.base;\r\n var segs = /([^\\/]*)$/.exec(glob);\r\n\r\n tok.path = {};\r\n tok.path.dirname = '';\r\n tok.path.basename = segs[1] || '';\r\n tok.path.dirname = glob.split(tok.path.basename).join('') || '';\r\n var basename = (tok.path.basename || '').split('.') || '';\r\n tok.path.filename = basename[0] || '';\r\n tok.path.extname = basename.slice(1).join('.') || '';\r\n tok.path.ext = '';\r\n\r\n if (isGlob(tok.path.dirname) && !tok.path.basename) {\r\n if (!/\\/$/.test(tok.glob)) {\r\n tok.path.basename = tok.glob;\r\n }\r\n tok.path.dirname = tok.base;\r\n }\r\n\r\n if (glob.indexOf('/') === -1 && !tok.is.globstar) {\r\n tok.path.dirname = '';\r\n tok.path.basename = tok.orig;\r\n }\r\n\r\n var dot = tok.path.basename.indexOf('.');\r\n if (dot !== -1) {\r\n tok.path.filename = tok.path.basename.slice(0, dot);\r\n tok.path.extname = tok.path.basename.slice(dot);\r\n }\r\n\r\n if (tok.path.extname.charAt(0) === '.') {\r\n var exts = tok.path.extname.split('.');\r\n tok.path.ext = exts[exts.length - 1];\r\n }\r\n\r\n // unescape dots and slashes in braces/brackets\r\n tok.glob = unescape(tok.glob);\r\n tok.path.dirname = unescape(tok.path.dirname);\r\n tok.path.basename = unescape(tok.path.basename);\r\n tok.path.filename = unescape(tok.path.filename);\r\n tok.path.extname = unescape(tok.path.extname);\r\n\r\n // Booleans\r\n var is = (glob && tok.is.glob);\r\n tok.is.negated = glob && glob.charAt(0) === '!';\r\n tok.is.extglob = glob && extglob(glob);\r\n tok.is.braces = has(is, glob, '{');\r\n tok.is.brackets = has(is, glob, '[:');\r\n tok.is.globstar = has(is, glob, '**');\r\n tok.is.dotfile = dotfile(tok.path.basename) || dotfile(tok.path.filename);\r\n tok.is.dotdir = dotdir(tok.path.dirname);\r\n return (cache[glob] = tok);\r\n }\r\n\r\n /**\r\n * Returns true if the glob matches dot-directories.\r\n *\r\n * @param {Object} `tok` The tokens object\r\n * @param {Object} `path` The path object\r\n * @return {Object}\r\n */\r\n\r\n function dotdir(base) {\r\n if (base.indexOf('/.') !== -1) {\r\n return true;\r\n }\r\n if (base.charAt(0) === '.' && base.charAt(1) !== '/') {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns true if the pattern has the given `ch`aracter(s)\r\n *\r\n * @param {Object} `glob` The glob pattern.\r\n * @param {Object} `ch` The character to test for\r\n * @return {Object}\r\n */\r\n\r\n function has(is, glob, ch) {\r\n return is && glob.indexOf(ch) !== -1;\r\n }\r\n\r\n /**\r\n * Escape/unescape utils\r\n */\r\n\r\n function escape(str) {\r\n var re = /\\{([^{}]*?)}|\\(([^()]*?)\\)|\\[([^\\[\\]]*?)\\]/g;\r\n return str.replace(re, function (outter, braces, parens, brackets) {\r\n var inner = braces || parens || brackets;\r\n if (!inner) { return outter; }\r\n return outter.split(inner).join(esc(inner));\r\n });\r\n }\r\n\r\n function esc(str) {\r\n str = str.split('/').join('__SLASH__');\r\n str = str.split('.').join('__DOT__');\r\n return str;\r\n }\r\n\r\n function unescape(str) {\r\n str = str.split('__SLASH__').join('/');\r\n str = str.split('__DOT__').join('.');\r\n return str;\r\n }\r\n\r\n }, { \"glob-base\": 39, \"is-dotfile\": 85, \"is-extglob\": 90, \"is-glob\": 91 }], 116: [function (require, module, exports) {\r\n (function (process) {\r\n // Copyright Joyent, Inc. and other Node contributors.\r\n //\r\n // Permission is hereby granted, free of charge, to any person obtaining a\r\n // copy of this software and associated documentation files (the\r\n // \"Software\"), to deal in the Software without restriction, including\r\n // without limitation the rights to use, copy, modify, merge, publish,\r\n // distribute, sublicense, and/or sell copies of the Software, and to permit\r\n // persons to whom the Software is furnished to do so, subject to the\r\n // following conditions:\r\n //\r\n // The above copyright notice and this permission notice shall be included\r\n // in all copies or substantial portions of the Software.\r\n //\r\n // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\n // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\r\n // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r\n // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\r\n // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\r\n // USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n // resolves . and .. elements in a path array with directory names there\r\n // must be no slashes, empty elements, or device names (c:\\) in the array\r\n // (so also no leading and trailing slashes - it does not distinguish\r\n // relative and absolute paths)\r\n function normalizeArray(parts, allowAboveRoot) {\r\n // if the path tries to go above the root, `up` ends up > 0\r\n var up = 0;\r\n for (var i = parts.length - 1; i >= 0; i--) {\r\n var last = parts[i];\r\n if (last === '.') {\r\n parts.splice(i, 1);\r\n } else if (last === '..') {\r\n parts.splice(i, 1);\r\n up++;\r\n } else if (up) {\r\n parts.splice(i, 1);\r\n up--;\r\n }\r\n }\r\n\r\n // if the path is allowed to go above the root, restore leading ..s\r\n if (allowAboveRoot) {\r\n for (; up--; up) {\r\n parts.unshift('..');\r\n }\r\n }\r\n\r\n return parts;\r\n }\r\n\r\n // Split a filename into [root, dir, basename, ext], unix version\r\n // 'root' is just a slash, or nothing.\r\n var splitPathRe =\r\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\r\n var splitPath = function (filename) {\r\n return splitPathRe.exec(filename).slice(1);\r\n };\r\n\r\n // path.resolve([from ...], to)\r\n // posix version\r\n exports.resolve = function () {\r\n var resolvedPath = '',\r\n resolvedAbsolute = false;\r\n\r\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\r\n var path = (i >= 0) ? arguments[i] : process.cwd();\r\n\r\n // Skip empty and invalid entries\r\n if (typeof path !== 'string') {\r\n throw new TypeError('Arguments to path.resolve must be strings');\r\n } else if (!path) {\r\n continue;\r\n }\r\n\r\n resolvedPath = path + '/' + resolvedPath;\r\n resolvedAbsolute = path.charAt(0) === '/';\r\n }\r\n\r\n // At this point the path should be resolved to a full absolute path, but\r\n // handle relative paths to be safe (might happen when process.cwd() fails)\r\n\r\n // Normalize the path\r\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function (p) {\r\n return !!p;\r\n }), !resolvedAbsolute).join('/');\r\n\r\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\r\n };\r\n\r\n // path.normalize(path)\r\n // posix version\r\n exports.normalize = function (path) {\r\n var isAbsolute = exports.isAbsolute(path),\r\n trailingSlash = substr(path, -1) === '/';\r\n\r\n // Normalize the path\r\n path = normalizeArray(filter(path.split('/'), function (p) {\r\n return !!p;\r\n }), !isAbsolute).join('/');\r\n\r\n if (!path && !isAbsolute) {\r\n path = '.';\r\n }\r\n if (path && trailingSlash) {\r\n path += '/';\r\n }\r\n\r\n return (isAbsolute ? '/' : '') + path;\r\n };\r\n\r\n // posix version\r\n exports.isAbsolute = function (path) {\r\n return path.charAt(0) === '/';\r\n };\r\n\r\n // posix version\r\n exports.join = function () {\r\n var paths = Array.prototype.slice.call(arguments, 0);\r\n return exports.normalize(filter(paths, function (p, index) {\r\n if (typeof p !== 'string') {\r\n throw new TypeError('Arguments to path.join must be strings');\r\n }\r\n return p;\r\n }).join('/'));\r\n };\r\n\r\n\r\n // path.relative(from, to)\r\n // posix version\r\n exports.relative = function (from, to) {\r\n from = exports.resolve(from).substr(1);\r\n to = exports.resolve(to).substr(1);\r\n\r\n function trim(arr) {\r\n var start = 0;\r\n for (; start < arr.length; start++) {\r\n if (arr[start] !== '') break;\r\n }\r\n\r\n var end = arr.length - 1;\r\n for (; end >= 0; end--) {\r\n if (arr[end] !== '') break;\r\n }\r\n\r\n if (start > end) return [];\r\n return arr.slice(start, end - start + 1);\r\n }\r\n\r\n var fromParts = trim(from.split('/'));\r\n var toParts = trim(to.split('/'));\r\n\r\n var length = Math.min(fromParts.length, toParts.length);\r\n var samePartsLength = length;\r\n for (var i = 0; i < length; i++) {\r\n if (fromParts[i] !== toParts[i]) {\r\n samePartsLength = i;\r\n break;\r\n }\r\n }\r\n\r\n var outputParts = [];\r\n for (var i = samePartsLength; i < fromParts.length; i++) {\r\n outputParts.push('..');\r\n }\r\n\r\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\r\n\r\n return outputParts.join('/');\r\n };\r\n\r\n exports.sep = '/';\r\n exports.delimiter = ':';\r\n\r\n exports.dirname = function (path) {\r\n var result = splitPath(path),\r\n root = result[0],\r\n dir = result[1];\r\n\r\n if (!root && !dir) {\r\n // No dirname whatsoever\r\n return '.';\r\n }\r\n\r\n if (dir) {\r\n // It has a dirname, strip trailing slash\r\n dir = dir.substr(0, dir.length - 1);\r\n }\r\n\r\n return root + dir;\r\n };\r\n\r\n\r\n exports.basename = function (path, ext) {\r\n var f = splitPath(path)[2];\r\n // TODO: make this comparison case-insensitive on windows?\r\n if (ext && f.substr(-1 * ext.length) === ext) {\r\n f = f.substr(0, f.length - ext.length);\r\n }\r\n return f;\r\n };\r\n\r\n\r\n exports.extname = function (path) {\r\n return splitPath(path)[3];\r\n };\r\n\r\n function filter(xs, f) {\r\n if (xs.filter) return xs.filter(f);\r\n var res = [];\r\n for (var i = 0; i < xs.length; i++) {\r\n if (f(xs[i], i, xs)) res.push(xs[i]);\r\n }\r\n return res;\r\n }\r\n\r\n // String.prototype.substr - negative index don't work in IE8\r\n var substr = 'ab'.substr(-1) === 'b'\r\n ? function (str, start, len) { return str.substr(start, len) }\r\n : function (str, start, len) {\r\n if (start < 0) start = str.length + start;\r\n return str.substr(start, len);\r\n }\r\n ;\r\n\r\n }).call(this, require('_process'))\r\n\r\n }, { \"_process\": 118 }], 117: [function (require, module, exports) {\r\n /*!\r\n * preserve \r\n *\r\n * Copyright (c) 2014-2015, Jon Schlinkert.\r\n * Licensed under the MIT license.\r\n */\r\n\r\n 'use strict';\r\n\r\n /**\r\n * Replace tokens in `str` with a temporary, heuristic placeholder.\r\n *\r\n * ```js\r\n * tokens.before('{a\\\\,b}');\r\n * //=> '{__ID1__}'\r\n * ```\r\n *\r\n * @param {String} `str`\r\n * @return {String} String with placeholders.\r\n * @api public\r\n */\r\n\r\n exports.before = function before(str, re) {\r\n return str.replace(re, function (match) {\r\n var id = randomize();\r\n cache[id] = match;\r\n return '__ID' + id + '__';\r\n });\r\n };\r\n\r\n /**\r\n * Replace placeholders in `str` with original tokens.\r\n *\r\n * ```js\r\n * tokens.after('{__ID1__}');\r\n * //=> '{a\\\\,b}'\r\n * ```\r\n *\r\n * @param {String} `str` String with placeholders\r\n * @return {String} `str` String with original tokens.\r\n * @api public\r\n */\r\n\r\n exports.after = function after(str) {\r\n return str.replace(/__ID(.{5})__/g, function (_, id) {\r\n return cache[id];\r\n });\r\n };\r\n\r\n function randomize() {\r\n return Math.random().toString().slice(2, 7);\r\n }\r\n\r\n var cache = {};\r\n }, {}], 118: [function (require, module, exports) {\r\n // shim for using process in browser\r\n\r\n var process = module.exports = {};\r\n var queue = [];\r\n var draining = false;\r\n var currentQueue;\r\n var queueIndex = -1;\r\n\r\n function cleanUpNextTick() {\r\n if (!draining || !currentQueue) {\r\n return;\r\n }\r\n draining = false;\r\n if (currentQueue.length) {\r\n queue = currentQueue.concat(queue);\r\n } else {\r\n queueIndex = -1;\r\n }\r\n if (queue.length) {\r\n drainQueue();\r\n }\r\n }\r\n\r\n function drainQueue() {\r\n if (draining) {\r\n return;\r\n }\r\n var timeout = setTimeout(cleanUpNextTick);\r\n draining = true;\r\n\r\n var len = queue.length;\r\n while (len) {\r\n currentQueue = queue;\r\n queue = [];\r\n while (++queueIndex < len) {\r\n if (currentQueue) {\r\n currentQueue[queueIndex].run();\r\n }\r\n }\r\n queueIndex = -1;\r\n len = queue.length;\r\n }\r\n currentQueue = null;\r\n draining = false;\r\n clearTimeout(timeout);\r\n }\r\n\r\n process.nextTick = function (fun) {\r\n var args = new Array(arguments.length - 1);\r\n if (arguments.length > 1) {\r\n for (var i = 1; i < arguments.length; i++) {\r\n args[i - 1] = arguments[i];\r\n }\r\n }\r\n queue.push(new Item(fun, args));\r\n if (queue.length === 1 && !draining) {\r\n setTimeout(drainQueue, 0);\r\n }\r\n };\r\n\r\n // v8 likes predictible objects\r\n function Item(fun, array) {\r\n this.fun = fun;\r\n this.array = array;\r\n }\r\n Item.prototype.run = function () {\r\n this.fun.apply(null, this.array);\r\n };\r\n process.title = 'browser';\r\n process.browser = true;\r\n process.env = {};\r\n process.argv = [];\r\n process.version = ''; // empty string to avoid regexp issues\r\n process.versions = {};\r\n\r\n function noop() { }\r\n\r\n process.on = noop;\r\n process.addListener = noop;\r\n process.once = noop;\r\n process.off = noop;\r\n process.removeListener = noop;\r\n process.removeAllListeners = noop;\r\n process.emit = noop;\r\n\r\n process.binding = function (name) {\r\n throw new Error('process.binding is not supported');\r\n };\r\n\r\n process.cwd = function () { return '/' };\r\n process.chdir = function (dir) {\r\n throw new Error('process.chdir is not supported');\r\n };\r\n process.umask = function () { return 0; };\r\n\r\n }, {}], 119: [function (require, module, exports) {\r\n (function (global) {\r\n /*! https://mths.be/punycode v1.4.1 by @mathias */\r\n ; (function (root) {\r\n\r\n /** Detect free variables */\r\n var freeExports = typeof exports == 'object' && exports &&\r\n !exports.nodeType && exports;\r\n var freeModule = typeof module == 'object' && module &&\r\n !module.nodeType && module;\r\n var freeGlobal = typeof global == 'object' && global;\r\n if (\r\n freeGlobal.global === freeGlobal ||\r\n freeGlobal.window === freeGlobal ||\r\n freeGlobal.self === freeGlobal\r\n ) {\r\n root = freeGlobal;\r\n }\r\n\r\n /**\r\n * The `punycode` object.\r\n * @name punycode\r\n * @type Object\r\n */\r\n var punycode,\r\n\r\n /** Highest positive signed 32-bit float value */\r\n maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\r\n\r\n /** Bootstring parameters */\r\n base = 36,\r\n tMin = 1,\r\n tMax = 26,\r\n skew = 38,\r\n damp = 700,\r\n initialBias = 72,\r\n initialN = 128, // 0x80\r\n delimiter = '-', // '\\x2D'\r\n\r\n /** Regular expressions */\r\n regexPunycode = /^xn--/,\r\n regexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\r\n regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\r\n\r\n /** Error messages */\r\n errors = {\r\n 'overflow': 'Overflow: input needs wider integers to process',\r\n 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\r\n 'invalid-input': 'Invalid input'\r\n },\r\n\r\n /** Convenience shortcuts */\r\n baseMinusTMin = base - tMin,\r\n floor = Math.floor,\r\n stringFromCharCode = String.fromCharCode,\r\n\r\n /** Temporary variable */\r\n key;\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * A generic error utility function.\r\n * @private\r\n * @param {String} type The error type.\r\n * @returns {Error} Throws a `RangeError` with the applicable error message.\r\n */\r\n function error(type) {\r\n throw new RangeError(errors[type]);\r\n }\r\n\r\n /**\r\n * A generic `Array#map` utility function.\r\n * @private\r\n * @param {Array} array The array to iterate over.\r\n * @param {Function} callback The function that gets called for every array\r\n * item.\r\n * @returns {Array} A new array of values returned by the callback function.\r\n */\r\n function map(array, fn) {\r\n var length = array.length;\r\n var result = [];\r\n while (length--) {\r\n result[length] = fn(array[length]);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * A simple `Array#map`-like wrapper to work with domain name strings or email\r\n * addresses.\r\n * @private\r\n * @param {String} domain The domain name or email address.\r\n * @param {Function} callback The function that gets called for every\r\n * character.\r\n * @returns {Array} A new string of characters returned by the callback\r\n * function.\r\n */\r\n function mapDomain(string, fn) {\r\n var parts = string.split('@');\r\n var result = '';\r\n if (parts.length > 1) {\r\n // In email addresses, only the domain name should be punycoded. Leave\r\n // the local part (i.e. everything up to `@`) intact.\r\n result = parts[0] + '@';\r\n string = parts[1];\r\n }\r\n // Avoid `split(regex)` for IE8 compatibility. See #17.\r\n string = string.replace(regexSeparators, '\\x2E');\r\n var labels = string.split('.');\r\n var encoded = map(labels, fn).join('.');\r\n return result + encoded;\r\n }\r\n\r\n /**\r\n * Creates an array containing the numeric code points of each Unicode\r\n * character in the string. While JavaScript uses UCS-2 internally,\r\n * this function will convert a pair of surrogate halves (each of which\r\n * UCS-2 exposes as separate characters) into a single code point,\r\n * matching UTF-16.\r\n * @see `punycode.ucs2.encode`\r\n * @see \r\n * @memberOf punycode.ucs2\r\n * @name decode\r\n * @param {String} string The Unicode input string (UCS-2).\r\n * @returns {Array} The new array of code points.\r\n */\r\n function ucs2decode(string) {\r\n var output = [],\r\n counter = 0,\r\n length = string.length,\r\n value,\r\n extra;\r\n while (counter < length) {\r\n value = string.charCodeAt(counter++);\r\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\r\n // high surrogate, and there is a next character\r\n extra = string.charCodeAt(counter++);\r\n if ((extra & 0xFC00) == 0xDC00) { // low surrogate\r\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\r\n } else {\r\n // unmatched surrogate; only append this code unit, in case the next\r\n // code unit is the high surrogate of a surrogate pair\r\n output.push(value);\r\n counter--;\r\n }\r\n } else {\r\n output.push(value);\r\n }\r\n }\r\n return output;\r\n }\r\n\r\n /**\r\n * Creates a string based on an array of numeric code points.\r\n * @see `punycode.ucs2.decode`\r\n * @memberOf punycode.ucs2\r\n * @name encode\r\n * @param {Array} codePoints The array of numeric code points.\r\n * @returns {String} The new Unicode string (UCS-2).\r\n */\r\n function ucs2encode(array) {\r\n return map(array, function (value) {\r\n var output = '';\r\n if (value > 0xFFFF) {\r\n value -= 0x10000;\r\n output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\r\n value = 0xDC00 | value & 0x3FF;\r\n }\r\n output += stringFromCharCode(value);\r\n return output;\r\n }).join('');\r\n }\r\n\r\n /**\r\n * Converts a basic code point into a digit/integer.\r\n * @see `digitToBasic()`\r\n * @private\r\n * @param {Number} codePoint The basic numeric code point value.\r\n * @returns {Number} The numeric value of a basic code point (for use in\r\n * representing integers) in the range `0` to `base - 1`, or `base` if\r\n * the code point does not represent a value.\r\n */\r\n function basicToDigit(codePoint) {\r\n if (codePoint - 48 < 10) {\r\n return codePoint - 22;\r\n }\r\n if (codePoint - 65 < 26) {\r\n return codePoint - 65;\r\n }\r\n if (codePoint - 97 < 26) {\r\n return codePoint - 97;\r\n }\r\n return base;\r\n }\r\n\r\n /**\r\n * Converts a digit/integer into a basic code point.\r\n * @see `basicToDigit()`\r\n * @private\r\n * @param {Number} digit The numeric value of a basic code point.\r\n * @returns {Number} The basic code point whose value (when used for\r\n * representing integers) is `digit`, which needs to be in the range\r\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\r\n * used; else, the lowercase form is used. The behavior is undefined\r\n * if `flag` is non-zero and `digit` has no uppercase form.\r\n */\r\n function digitToBasic(digit, flag) {\r\n // 0..25 map to ASCII a..z or A..Z\r\n // 26..35 map to ASCII 0..9\r\n return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\r\n }\r\n\r\n /**\r\n * Bias adaptation function as per section 3.4 of RFC 3492.\r\n * https://tools.ietf.org/html/rfc3492#section-3.4\r\n * @private\r\n */\r\n function adapt(delta, numPoints, firstTime) {\r\n var k = 0;\r\n delta = firstTime ? floor(delta / damp) : delta >> 1;\r\n delta += floor(delta / numPoints);\r\n for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\r\n delta = floor(delta / baseMinusTMin);\r\n }\r\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\r\n }\r\n\r\n /**\r\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\r\n * symbols.\r\n * @memberOf punycode\r\n * @param {String} input The Punycode string of ASCII-only symbols.\r\n * @returns {String} The resulting string of Unicode symbols.\r\n */\r\n function decode(input) {\r\n // Don't use UCS-2\r\n var output = [],\r\n inputLength = input.length,\r\n out,\r\n i = 0,\r\n n = initialN,\r\n bias = initialBias,\r\n basic,\r\n j,\r\n index,\r\n oldi,\r\n w,\r\n k,\r\n digit,\r\n t,\r\n /** Cached calculation results */\r\n baseMinusT;\r\n\r\n // Handle the basic code points: let `basic` be the number of input code\r\n // points before the last delimiter, or `0` if there is none, then copy\r\n // the first basic code points to the output.\r\n\r\n basic = input.lastIndexOf(delimiter);\r\n if (basic < 0) {\r\n basic = 0;\r\n }\r\n\r\n for (j = 0; j < basic; ++j) {\r\n // if it's not a basic code point\r\n if (input.charCodeAt(j) >= 0x80) {\r\n error('not-basic');\r\n }\r\n output.push(input.charCodeAt(j));\r\n }\r\n\r\n // Main decoding loop: start just after the last delimiter if any basic code\r\n // points were copied; start at the beginning otherwise.\r\n\r\n for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\r\n\r\n // `index` is the index of the next character to be consumed.\r\n // Decode a generalized variable-length integer into `delta`,\r\n // which gets added to `i`. The overflow checking is easier\r\n // if we increase `i` as we go, then subtract off its starting\r\n // value at the end to obtain `delta`.\r\n for (oldi = i, w = 1, k = base; /* no condition */; k += base) {\r\n\r\n if (index >= inputLength) {\r\n error('invalid-input');\r\n }\r\n\r\n digit = basicToDigit(input.charCodeAt(index++));\r\n\r\n if (digit >= base || digit > floor((maxInt - i) / w)) {\r\n error('overflow');\r\n }\r\n\r\n i += digit * w;\r\n t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\r\n\r\n if (digit < t) {\r\n break;\r\n }\r\n\r\n baseMinusT = base - t;\r\n if (w > floor(maxInt / baseMinusT)) {\r\n error('overflow');\r\n }\r\n\r\n w *= baseMinusT;\r\n\r\n }\r\n\r\n out = output.length + 1;\r\n bias = adapt(i - oldi, out, oldi == 0);\r\n\r\n // `i` was supposed to wrap around from `out` to `0`,\r\n // incrementing `n` each time, so we'll fix that now:\r\n if (floor(i / out) > maxInt - n) {\r\n error('overflow');\r\n }\r\n\r\n n += floor(i / out);\r\n i %= out;\r\n\r\n // Insert `n` at position `i` of the output\r\n output.splice(i++, 0, n);\r\n\r\n }\r\n\r\n return ucs2encode(output);\r\n }\r\n\r\n /**\r\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\r\n * Punycode string of ASCII-only symbols.\r\n * @memberOf punycode\r\n * @param {String} input The string of Unicode symbols.\r\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\r\n */\r\n function encode(input) {\r\n var n,\r\n delta,\r\n handledCPCount,\r\n basicLength,\r\n bias,\r\n j,\r\n m,\r\n q,\r\n k,\r\n t,\r\n currentValue,\r\n output = [],\r\n /** `inputLength` will hold the number of code points in `input`. */\r\n inputLength,\r\n /** Cached calculation results */\r\n handledCPCountPlusOne,\r\n baseMinusT,\r\n qMinusT;\r\n\r\n // Convert the input in UCS-2 to Unicode\r\n input = ucs2decode(input);\r\n\r\n // Cache the length\r\n inputLength = input.length;\r\n\r\n // Initialize the state\r\n n = initialN;\r\n delta = 0;\r\n bias = initialBias;\r\n\r\n // Handle the basic code points\r\n for (j = 0; j < inputLength; ++j) {\r\n currentValue = input[j];\r\n if (currentValue < 0x80) {\r\n output.push(stringFromCharCode(currentValue));\r\n }\r\n }\r\n\r\n handledCPCount = basicLength = output.length;\r\n\r\n // `handledCPCount` is the number of code points that have been handled;\r\n // `basicLength` is the number of basic code points.\r\n\r\n // Finish the basic string - if it is not empty - with a delimiter\r\n if (basicLength) {\r\n output.push(delimiter);\r\n }\r\n\r\n // Main encoding loop:\r\n while (handledCPCount < inputLength) {\r\n\r\n // All non-basic code points < n have been handled already. Find the next\r\n // larger one:\r\n for (m = maxInt, j = 0; j < inputLength; ++j) {\r\n currentValue = input[j];\r\n if (currentValue >= n && currentValue < m) {\r\n m = currentValue;\r\n }\r\n }\r\n\r\n // Increase `delta` enough to advance the decoder's state to ,\r\n // but guard against overflow\r\n handledCPCountPlusOne = handledCPCount + 1;\r\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\r\n error('overflow');\r\n }\r\n\r\n delta += (m - n) * handledCPCountPlusOne;\r\n n = m;\r\n\r\n for (j = 0; j < inputLength; ++j) {\r\n currentValue = input[j];\r\n\r\n if (currentValue < n && ++delta > maxInt) {\r\n error('overflow');\r\n }\r\n\r\n if (currentValue == n) {\r\n // Represent delta as a generalized variable-length integer\r\n for (q = delta, k = base; /* no condition */; k += base) {\r\n t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\r\n if (q < t) {\r\n break;\r\n }\r\n qMinusT = q - t;\r\n baseMinusT = base - t;\r\n output.push(\r\n stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\r\n );\r\n q = floor(qMinusT / baseMinusT);\r\n }\r\n\r\n output.push(stringFromCharCode(digitToBasic(q, 0)));\r\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\r\n delta = 0;\r\n ++handledCPCount;\r\n }\r\n }\r\n\r\n ++delta;\r\n ++n;\r\n\r\n }\r\n return output.join('');\r\n }\r\n\r\n /**\r\n * Converts a Punycode string representing a domain name or an email address\r\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\r\n * it doesn't matter if you call it on a string that has already been\r\n * converted to Unicode.\r\n * @memberOf punycode\r\n * @param {String} input The Punycoded domain name or email address to\r\n * convert to Unicode.\r\n * @returns {String} The Unicode representation of the given Punycode\r\n * string.\r\n */\r\n function toUnicode(input) {\r\n return mapDomain(input, function (string) {\r\n return regexPunycode.test(string)\r\n ? decode(string.slice(4).toLowerCase())\r\n : string;\r\n });\r\n }\r\n\r\n /**\r\n * Converts a Unicode string representing a domain name or an email address to\r\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\r\n * i.e. it doesn't matter if you call it with a domain that's already in\r\n * ASCII.\r\n * @memberOf punycode\r\n * @param {String} input The domain name or email address to convert, as a\r\n * Unicode string.\r\n * @returns {String} The Punycode representation of the given domain name or\r\n * email address.\r\n */\r\n function toASCII(input) {\r\n return mapDomain(input, function (string) {\r\n return regexNonASCII.test(string)\r\n ? 'xn--' + encode(string)\r\n : string;\r\n });\r\n }\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /** Define the public API */\r\n punycode = {\r\n /**\r\n * A string representing the current Punycode.js version number.\r\n * @memberOf punycode\r\n * @type String\r\n */\r\n 'version': '1.4.1',\r\n /**\r\n * An object of methods to convert from JavaScript's internal character\r\n * representation (UCS-2) to Unicode code points, and back.\r\n * @see \r\n * @memberOf punycode\r\n * @type Object\r\n */\r\n 'ucs2': {\r\n 'decode': ucs2decode,\r\n 'encode': ucs2encode\r\n },\r\n 'decode': decode,\r\n 'encode': encode,\r\n 'toASCII': toASCII,\r\n 'toUnicode': toUnicode\r\n };\r\n\r\n /** Expose `punycode` */\r\n // Some AMD build optimizers, like r.js, check for specific condition patterns\r\n // like the following:\r\n if (\r\n typeof define == 'function' &&\r\n typeof define.amd == 'object' &&\r\n define.amd\r\n ) {\r\n define('punycode', function () {\r\n return punycode;\r\n });\r\n } else if (freeExports && freeModule) {\r\n if (module.exports == freeExports) {\r\n // in Node.js, io.js, or RingoJS v0.8.0+\r\n freeModule.exports = punycode;\r\n } else {\r\n // in Narwhal or RingoJS v0.7.0-\r\n for (key in punycode) {\r\n punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\r\n }\r\n }\r\n } else {\r\n // in Rhino or a web browser\r\n root.punycode = punycode;\r\n }\r\n\r\n }(this));\r\n\r\n }).call(this, typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n\r\n }, {}], 120: [function (require, module, exports) {\r\n // Copyright Joyent, Inc. and other Node contributors.\r\n //\r\n // Permission is hereby granted, free of charge, to any person obtaining a\r\n // copy of this software and associated documentation files (the\r\n // \"Software\"), to deal in the Software without restriction, including\r\n // without limitation the rights to use, copy, modify, merge, publish,\r\n // distribute, sublicense, and/or sell copies of the Software, and to permit\r\n // persons to whom the Software is furnished to do so, subject to the\r\n // following conditions:\r\n //\r\n // The above copyright notice and this permission notice shall be included\r\n // in all copies or substantial portions of the Software.\r\n //\r\n // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\n // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\r\n // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r\n // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\r\n // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\r\n // USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n 'use strict';\r\n\r\n // If obj.hasOwnProperty has been overridden, then calling\r\n // obj.hasOwnProperty(prop) will break.\r\n // See: https://github.com/joyent/node/issues/1707\r\n function hasOwnProperty(obj, prop) {\r\n return Object.prototype.hasOwnProperty.call(obj, prop);\r\n }\r\n\r\n module.exports = function (qs, sep, eq, options) {\r\n sep = sep || '&';\r\n eq = eq || '=';\r\n var obj = {};\r\n\r\n if (typeof qs !== 'string' || qs.length === 0) {\r\n return obj;\r\n }\r\n\r\n var regexp = /\\+/g;\r\n qs = qs.split(sep);\r\n\r\n var maxKeys = 1000;\r\n if (options && typeof options.maxKeys === 'number') {\r\n maxKeys = options.maxKeys;\r\n }\r\n\r\n var len = qs.length;\r\n // maxKeys <= 0 means that we should not limit keys count\r\n if (maxKeys > 0 && len > maxKeys) {\r\n len = maxKeys;\r\n }\r\n\r\n for (var i = 0; i < len; ++i) {\r\n var x = qs[i].replace(regexp, '%20'),\r\n idx = x.indexOf(eq),\r\n kstr, vstr, k, v;\r\n\r\n if (idx >= 0) {\r\n kstr = x.substr(0, idx);\r\n vstr = x.substr(idx + 1);\r\n } else {\r\n kstr = x;\r\n vstr = '';\r\n }\r\n\r\n k = decodeURIComponent(kstr);\r\n v = decodeURIComponent(vstr);\r\n\r\n if (!hasOwnProperty(obj, k)) {\r\n obj[k] = v;\r\n } else if (isArray(obj[k])) {\r\n obj[k].push(v);\r\n } else {\r\n obj[k] = [obj[k], v];\r\n }\r\n }\r\n\r\n return obj;\r\n };\r\n\r\n var isArray = Array.isArray || function (xs) {\r\n return Object.prototype.toString.call(xs) === '[object Array]';\r\n };\r\n\r\n }, {}], 121: [function (require, module, exports) {\r\n // Copyright Joyent, Inc. and other Node contributors.\r\n //\r\n // Permission is hereby granted, free of charge, to any person obtaining a\r\n // copy of this software and associated documentation files (the\r\n // \"Software\"), to deal in the Software without restriction, including\r\n // without limitation the rights to use, copy, modify, merge, publish,\r\n // distribute, sublicense, and/or sell copies of the Software, and to permit\r\n // persons to whom the Software is furnished to do so, subject to the\r\n // following conditions:\r\n //\r\n // The above copyright notice and this permission notice shall be included\r\n // in all copies or substantial portions of the Software.\r\n //\r\n // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\n // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\r\n // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r\n // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\r\n // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\r\n // USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n 'use strict';\r\n\r\n var stringifyPrimitive = function (v) {\r\n switch (typeof v) {\r\n case 'string':\r\n return v;\r\n\r\n case 'boolean':\r\n return v ? 'true' : 'false';\r\n\r\n case 'number':\r\n return isFinite(v) ? v : '';\r\n\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n module.exports = function (obj, sep, eq, name) {\r\n sep = sep || '&';\r\n eq = eq || '=';\r\n if (obj === null) {\r\n obj = undefined;\r\n }\r\n\r\n if (typeof obj === 'object') {\r\n return map(objectKeys(obj), function (k) {\r\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\r\n if (isArray(obj[k])) {\r\n return map(obj[k], function (v) {\r\n return ks + encodeURIComponent(stringifyPrimitive(v));\r\n }).join(sep);\r\n } else {\r\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\r\n }\r\n }).join(sep);\r\n\r\n }\r\n\r\n if (!name) return '';\r\n return encodeURIComponent(stringifyPrimitive(name)) + eq +\r\n encodeURIComponent(stringifyPrimitive(obj));\r\n };\r\n\r\n var isArray = Array.isArray || function (xs) {\r\n return Object.prototype.toString.call(xs) === '[object Array]';\r\n };\r\n\r\n function map(xs, f) {\r\n if (xs.map) return xs.map(f);\r\n var res = [];\r\n for (var i = 0; i < xs.length; i++) {\r\n res.push(f(xs[i], i));\r\n }\r\n return res;\r\n }\r\n\r\n var objectKeys = Object.keys || function (obj) {\r\n var res = [];\r\n for (var key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);\r\n }\r\n return res;\r\n };\r\n\r\n }, {}], 122: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n exports.decode = exports.parse = require('./decode');\r\n exports.encode = exports.stringify = require('./encode');\r\n\r\n }, { \"./decode\": 120, \"./encode\": 121 }], 123: [function (require, module, exports) {\r\n /*!\r\n * randomatic \r\n *\r\n * This was originally inspired by \r\n * Copyright (c) 2014-2015, Jon Schlinkert.\r\n * Licensed under the MIT License (MIT)\r\n */\r\n\r\n 'use strict';\r\n\r\n var isNumber = require('is-number');\r\n var typeOf = require('kind-of');\r\n\r\n /**\r\n * Expose `randomatic`\r\n */\r\n\r\n module.exports = randomatic;\r\n\r\n /**\r\n * Available mask characters\r\n */\r\n\r\n var type = {\r\n lower: 'abcdefghijklmnopqrstuvwxyz',\r\n upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\r\n number: '0123456789',\r\n special: '~!@#$%^&()_+-={}[];\\',.'\r\n };\r\n\r\n type.all = type.lower + type.upper + type.number;\r\n\r\n /**\r\n * Generate random character sequences of a specified `length`,\r\n * based on the given `pattern`.\r\n *\r\n * @param {String} `pattern` The pattern to use for generating the random string.\r\n * @param {String} `length` The length of the string to generate.\r\n * @param {String} `options`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n function randomatic(pattern, length, options) {\r\n if (typeof pattern === 'undefined') {\r\n throw new Error('randomatic expects a string or number.');\r\n }\r\n\r\n var custom = false;\r\n if (arguments.length === 1) {\r\n if (typeof pattern === 'string') {\r\n length = pattern.length;\r\n\r\n } else if (isNumber(pattern)) {\r\n options = {}; length = pattern; pattern = '*';\r\n }\r\n }\r\n\r\n if (typeOf(length) === 'object' && length.hasOwnProperty('chars')) {\r\n options = length;\r\n pattern = options.chars;\r\n length = pattern.length;\r\n custom = true;\r\n }\r\n\r\n var opts = options || {};\r\n var mask = '';\r\n var res = '';\r\n\r\n // Characters to be used\r\n if (pattern.indexOf('?') !== -1) mask += opts.chars;\r\n if (pattern.indexOf('a') !== -1) mask += type.lower;\r\n if (pattern.indexOf('A') !== -1) mask += type.upper;\r\n if (pattern.indexOf('0') !== -1) mask += type.number;\r\n if (pattern.indexOf('!') !== -1) mask += type.special;\r\n if (pattern.indexOf('*') !== -1) mask += type.all;\r\n if (custom) mask += pattern;\r\n\r\n while (length--) {\r\n res += mask.charAt(parseInt(Math.random() * mask.length, 10));\r\n }\r\n return res;\r\n };\r\n\r\n }, { \"is-number\": 92, \"kind-of\": 124 }], 124: [function (require, module, exports) {\r\n (function (Buffer) {\r\n var isBuffer = require('is-buffer');\r\n var toString = Object.prototype.toString;\r\n\r\n /**\r\n * Get the native `typeof` a value.\r\n *\r\n * @param {*} `val`\r\n * @return {*} Native javascript type\r\n */\r\n\r\n module.exports = function kindOf(val) {\r\n // primitivies\r\n if (typeof val === 'undefined') {\r\n return 'undefined';\r\n }\r\n if (val === null) {\r\n return 'null';\r\n }\r\n if (val === true || val === false || val instanceof Boolean) {\r\n return 'boolean';\r\n }\r\n if (typeof val === 'string' || val instanceof String) {\r\n return 'string';\r\n }\r\n if (typeof val === 'number' || val instanceof Number) {\r\n return 'number';\r\n }\r\n\r\n // functions\r\n if (typeof val === 'function' || val instanceof Function) {\r\n return 'function';\r\n }\r\n\r\n // array\r\n if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) {\r\n return 'array';\r\n }\r\n\r\n // check for instances of RegExp and Date before calling `toString`\r\n if (val instanceof RegExp) {\r\n return 'regexp';\r\n }\r\n if (val instanceof Date) {\r\n return 'date';\r\n }\r\n\r\n // other objects\r\n var type = toString.call(val);\r\n\r\n if (type === '[object RegExp]') {\r\n return 'regexp';\r\n }\r\n if (type === '[object Date]') {\r\n return 'date';\r\n }\r\n if (type === '[object Arguments]') {\r\n return 'arguments';\r\n }\r\n\r\n // buffer\r\n if (typeof Buffer !== 'undefined' && isBuffer(val)) {\r\n return 'buffer';\r\n }\r\n\r\n // es6: Map, WeakMap, Set, WeakSet\r\n if (type === '[object Set]') {\r\n return 'set';\r\n }\r\n if (type === '[object WeakSet]') {\r\n return 'weakset';\r\n }\r\n if (type === '[object Map]') {\r\n return 'map';\r\n }\r\n if (type === '[object WeakMap]') {\r\n return 'weakmap';\r\n }\r\n if (type === '[object Symbol]') {\r\n return 'symbol';\r\n }\r\n\r\n // typed arrays\r\n if (type === '[object Int8Array]') {\r\n return 'int8array';\r\n }\r\n if (type === '[object Uint8Array]') {\r\n return 'uint8array';\r\n }\r\n if (type === '[object Uint8ClampedArray]') {\r\n return 'uint8clampedarray';\r\n }\r\n if (type === '[object Int16Array]') {\r\n return 'int16array';\r\n }\r\n if (type === '[object Uint16Array]') {\r\n return 'uint16array';\r\n }\r\n if (type === '[object Int32Array]') {\r\n return 'int32array';\r\n }\r\n if (type === '[object Uint32Array]') {\r\n return 'uint32array';\r\n }\r\n if (type === '[object Float32Array]') {\r\n return 'float32array';\r\n }\r\n if (type === '[object Float64Array]') {\r\n return 'float64array';\r\n }\r\n\r\n // must be a plain object\r\n return 'object';\r\n };\r\n\r\n }).call(this, require(\"buffer\").Buffer)\r\n\r\n }, { \"buffer\": 12, \"is-buffer\": 79 }], 125: [function (require, module, exports) {\r\n /*!\r\n * regex-cache \r\n *\r\n * Copyright (c) 2015 Jon Schlinkert.\r\n * Licensed under the MIT license.\r\n */\r\n\r\n 'use strict';\r\n\r\n var isPrimitive = require('is-primitive');\r\n var equal = require('is-equal-shallow');\r\n var basic = {};\r\n var cache = {};\r\n\r\n /**\r\n * Expose `regexCache`\r\n */\r\n\r\n module.exports = regexCache;\r\n\r\n /**\r\n * Memoize the results of a call to the new RegExp constructor.\r\n *\r\n * @param {Function} fn [description]\r\n * @param {String} str [description]\r\n * @param {Options} options [description]\r\n * @param {Boolean} nocompare [description]\r\n * @return {RegExp}\r\n */\r\n\r\n function regexCache(fn, str, opts) {\r\n var key = '_default_', regex, cached;\r\n\r\n if (!str && !opts) {\r\n if (typeof fn !== 'function') {\r\n return fn;\r\n }\r\n return basic[key] || (basic[key] = fn(str));\r\n }\r\n\r\n var isString = typeof str === 'string';\r\n if (isString) {\r\n if (!opts) {\r\n return basic[str] || (basic[str] = fn(str));\r\n }\r\n key = str;\r\n } else {\r\n opts = str;\r\n }\r\n\r\n cached = cache[key];\r\n if (cached && equal(cached.opts, opts)) {\r\n return cached.regex;\r\n }\r\n\r\n memo(key, opts, (regex = fn(str, opts)));\r\n return regex;\r\n }\r\n\r\n function memo(key, opts, regex) {\r\n cache[key] = { regex: regex, opts: opts };\r\n }\r\n\r\n /**\r\n * Expose `cache`\r\n */\r\n\r\n module.exports.cache = cache;\r\n module.exports.basic = basic;\r\n\r\n }, { \"is-equal-shallow\": 86, \"is-primitive\": 97 }], 126: [function (require, module, exports) {\r\n (function (process) {\r\n 'use strict';\r\n\r\n var isObject = require('isobject');\r\n var path = require('path');\r\n var fs = require('fs');\r\n\r\n /**\r\n * Expose `relative`\r\n */\r\n\r\n module.exports = relative;\r\n\r\n /**\r\n * Get the relative path from `a` to `b`.\r\n */\r\n\r\n function relative(a, b, stat) {\r\n if (typeof a !== 'string') {\r\n throw new TypeError('relative expects a string.');\r\n }\r\n\r\n if (a == '' && !b) return a;\r\n\r\n var len = arguments.length;\r\n if (len === 1) {\r\n b = a; a = process.cwd(); stat = null;\r\n }\r\n\r\n if (len === 2 && typeof b === 'boolean') {\r\n b = a; a = process.cwd(); stat = true;\r\n }\r\n\r\n if (len === 2 && typeof b === 'object') {\r\n stat = b; b = a; a = process.cwd();\r\n }\r\n\r\n var origB = b;\r\n\r\n // see if a slash exists before normalizing\r\n var slashA = endsWith(a, '/');\r\n var slashB = endsWith(b, '/');\r\n\r\n a = unixify(a);\r\n b = unixify(b);\r\n\r\n // if `a` had a slash, add it back\r\n if (slashA) { a = a + '/'; }\r\n\r\n if (isFile(a, stat)) {\r\n a = path.dirname(a);\r\n }\r\n\r\n var res = path.relative(a, b);\r\n if (res === '') {\r\n return '.';\r\n }\r\n\r\n // if `b` originally had a slash, and the path ends\r\n // with `b` missing a slash, then re-add the slash.\r\n var noslash = trimEnd(origB, '/');\r\n if (slashB && (res === noslash || endsWith(res, noslash))) {\r\n res = res + '/';\r\n }\r\n return res;\r\n }\r\n\r\n /**\r\n * Get the path relative to the given base path.\r\n */\r\n\r\n relative.toBase = function toBase(base, fp) {\r\n base = unixify(base);\r\n fp = unixify(fp);\r\n\r\n var res = fp.slice(base.length);\r\n if (res.charAt(0) === '/') {\r\n res = res.slice(1);\r\n }\r\n return res;\r\n };\r\n\r\n /**\r\n * Normalize slashes in paths to unix slashes. This is necessary since\r\n * paths are not calculated the same by node.js when\r\n * windows paths are used.\r\n */\r\n\r\n function unixify(str) {\r\n return str.replace(/[\\\\\\/]+/g, '/');\r\n }\r\n\r\n /**\r\n * Remove the given character from the path.\r\n */\r\n\r\n function trimEnd(fp, ch) {\r\n return fp.slice(0, fp.length - ch.length);\r\n }\r\n\r\n /**\r\n * Does the path end with the given `ch`aracter?\r\n */\r\n\r\n function endsWith(fp, ch) {\r\n return fp.slice(-ch.length)[0] === ch;\r\n }\r\n\r\n /**\r\n * If `fp` exists, return a `stat` object,\r\n * otherwise return `null`.\r\n */\r\n\r\n function tryStats(fp) {\r\n try {\r\n return fs.statSync(fp);\r\n } catch (err) { }\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns true if `fp` is a directory. To use a `fs`\r\n * stat object to actually check the file system,\r\n * either pass `true` as the second arg, or pass your\r\n * own stat object as the second arg.\r\n *\r\n * @param {String} `fp`\r\n * @param {Boolean|Object} `stat`\r\n * @return {Boolean}\r\n */\r\n\r\n function isDir(fp, stat) {\r\n if (endsWith(fp, '/')) {\r\n return true;\r\n }\r\n\r\n if (stat === null) {\r\n // try to get the directory info if it hasn't been done yet\r\n // to ensure directories containing dots are well handle\r\n stat = tryStats(fp);\r\n }\r\n\r\n if (isObject(stat) && typeof stat.isDirectory === 'function') {\r\n return stat.isDirectory();\r\n }\r\n\r\n var segs = fp.split('/');\r\n var last = segs[segs.length - 1];\r\n if (last && last.indexOf('.') !== -1) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Return true if `fp` looks like a file, or\r\n * actually is a file if fs.stat is used.\r\n */\r\n\r\n function isFile(fp, stat) {\r\n if (stat === true) {\r\n stat = tryStats(fp);\r\n }\r\n return !isDir(fp, stat);\r\n }\r\n\r\n }).call(this, require('_process'))\r\n\r\n }, { \"_process\": 118, \"fs\": 11, \"isobject\": 99, \"path\": 116 }], 127: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n\r\n module.exports = require('./lib/');\r\n\r\n }, { \"./lib/\": 141 }], 128: [function (require, module, exports) {\r\n // List of valid entities\r\n //\r\n // Generate with ./support/entities.js script\r\n //\r\n 'use strict';\r\n\r\n /*eslint quotes:0*/\r\n module.exports = {\r\n \"Aacute\": \"\\u00C1\",\r\n \"aacute\": \"\\u00E1\",\r\n \"Abreve\": \"\\u0102\",\r\n \"abreve\": \"\\u0103\",\r\n \"ac\": \"\\u223E\",\r\n \"acd\": \"\\u223F\",\r\n \"acE\": \"\\u223E\\u0333\",\r\n \"Acirc\": \"\\u00C2\",\r\n \"acirc\": \"\\u00E2\",\r\n \"acute\": \"\\u00B4\",\r\n \"Acy\": \"\\u0410\",\r\n \"acy\": \"\\u0430\",\r\n \"AElig\": \"\\u00C6\",\r\n \"aelig\": \"\\u00E6\",\r\n \"af\": \"\\u2061\",\r\n \"Afr\": \"\\uD835\\uDD04\",\r\n \"afr\": \"\\uD835\\uDD1E\",\r\n \"Agrave\": \"\\u00C0\",\r\n \"agrave\": \"\\u00E0\",\r\n \"alefsym\": \"\\u2135\",\r\n \"aleph\": \"\\u2135\",\r\n \"Alpha\": \"\\u0391\",\r\n \"alpha\": \"\\u03B1\",\r\n \"Amacr\": \"\\u0100\",\r\n \"amacr\": \"\\u0101\",\r\n \"amalg\": \"\\u2A3F\",\r\n \"AMP\": \"\\u0026\",\r\n \"amp\": \"\\u0026\",\r\n \"And\": \"\\u2A53\",\r\n \"and\": \"\\u2227\",\r\n \"andand\": \"\\u2A55\",\r\n \"andd\": \"\\u2A5C\",\r\n \"andslope\": \"\\u2A58\",\r\n \"andv\": \"\\u2A5A\",\r\n \"ang\": \"\\u2220\",\r\n \"ange\": \"\\u29A4\",\r\n \"angle\": \"\\u2220\",\r\n \"angmsd\": \"\\u2221\",\r\n \"angmsdaa\": \"\\u29A8\",\r\n \"angmsdab\": \"\\u29A9\",\r\n \"angmsdac\": \"\\u29AA\",\r\n \"angmsdad\": \"\\u29AB\",\r\n \"angmsdae\": \"\\u29AC\",\r\n \"angmsdaf\": \"\\u29AD\",\r\n \"angmsdag\": \"\\u29AE\",\r\n \"angmsdah\": \"\\u29AF\",\r\n \"angrt\": \"\\u221F\",\r\n \"angrtvb\": \"\\u22BE\",\r\n \"angrtvbd\": \"\\u299D\",\r\n \"angsph\": \"\\u2222\",\r\n \"angst\": \"\\u00C5\",\r\n \"angzarr\": \"\\u237C\",\r\n \"Aogon\": \"\\u0104\",\r\n \"aogon\": \"\\u0105\",\r\n \"Aopf\": \"\\uD835\\uDD38\",\r\n \"aopf\": \"\\uD835\\uDD52\",\r\n \"ap\": \"\\u2248\",\r\n \"apacir\": \"\\u2A6F\",\r\n \"apE\": \"\\u2A70\",\r\n \"ape\": \"\\u224A\",\r\n \"apid\": \"\\u224B\",\r\n \"apos\": \"\\u0027\",\r\n \"ApplyFunction\": \"\\u2061\",\r\n \"approx\": \"\\u2248\",\r\n \"approxeq\": \"\\u224A\",\r\n \"Aring\": \"\\u00C5\",\r\n \"aring\": \"\\u00E5\",\r\n \"Ascr\": \"\\uD835\\uDC9C\",\r\n \"ascr\": \"\\uD835\\uDCB6\",\r\n \"Assign\": \"\\u2254\",\r\n \"ast\": \"\\u002A\",\r\n \"asymp\": \"\\u2248\",\r\n \"asympeq\": \"\\u224D\",\r\n \"Atilde\": \"\\u00C3\",\r\n \"atilde\": \"\\u00E3\",\r\n \"Auml\": \"\\u00C4\",\r\n \"auml\": \"\\u00E4\",\r\n \"awconint\": \"\\u2233\",\r\n \"awint\": \"\\u2A11\",\r\n \"backcong\": \"\\u224C\",\r\n \"backepsilon\": \"\\u03F6\",\r\n \"backprime\": \"\\u2035\",\r\n \"backsim\": \"\\u223D\",\r\n \"backsimeq\": \"\\u22CD\",\r\n \"Backslash\": \"\\u2216\",\r\n \"Barv\": \"\\u2AE7\",\r\n \"barvee\": \"\\u22BD\",\r\n \"Barwed\": \"\\u2306\",\r\n \"barwed\": \"\\u2305\",\r\n \"barwedge\": \"\\u2305\",\r\n \"bbrk\": \"\\u23B5\",\r\n \"bbrktbrk\": \"\\u23B6\",\r\n \"bcong\": \"\\u224C\",\r\n \"Bcy\": \"\\u0411\",\r\n \"bcy\": \"\\u0431\",\r\n \"bdquo\": \"\\u201E\",\r\n \"becaus\": \"\\u2235\",\r\n \"Because\": \"\\u2235\",\r\n \"because\": \"\\u2235\",\r\n \"bemptyv\": \"\\u29B0\",\r\n \"bepsi\": \"\\u03F6\",\r\n \"bernou\": \"\\u212C\",\r\n \"Bernoullis\": \"\\u212C\",\r\n \"Beta\": \"\\u0392\",\r\n \"beta\": \"\\u03B2\",\r\n \"beth\": \"\\u2136\",\r\n \"between\": \"\\u226C\",\r\n \"Bfr\": \"\\uD835\\uDD05\",\r\n \"bfr\": \"\\uD835\\uDD1F\",\r\n \"bigcap\": \"\\u22C2\",\r\n \"bigcirc\": \"\\u25EF\",\r\n \"bigcup\": \"\\u22C3\",\r\n \"bigodot\": \"\\u2A00\",\r\n \"bigoplus\": \"\\u2A01\",\r\n \"bigotimes\": \"\\u2A02\",\r\n \"bigsqcup\": \"\\u2A06\",\r\n \"bigstar\": \"\\u2605\",\r\n \"bigtriangledown\": \"\\u25BD\",\r\n \"bigtriangleup\": \"\\u25B3\",\r\n \"biguplus\": \"\\u2A04\",\r\n \"bigvee\": \"\\u22C1\",\r\n \"bigwedge\": \"\\u22C0\",\r\n \"bkarow\": \"\\u290D\",\r\n \"blacklozenge\": \"\\u29EB\",\r\n \"blacksquare\": \"\\u25AA\",\r\n \"blacktriangle\": \"\\u25B4\",\r\n \"blacktriangledown\": \"\\u25BE\",\r\n \"blacktriangleleft\": \"\\u25C2\",\r\n \"blacktriangleright\": \"\\u25B8\",\r\n \"blank\": \"\\u2423\",\r\n \"blk12\": \"\\u2592\",\r\n \"blk14\": \"\\u2591\",\r\n \"blk34\": \"\\u2593\",\r\n \"block\": \"\\u2588\",\r\n \"bne\": \"\\u003D\\u20E5\",\r\n \"bnequiv\": \"\\u2261\\u20E5\",\r\n \"bNot\": \"\\u2AED\",\r\n \"bnot\": \"\\u2310\",\r\n \"Bopf\": \"\\uD835\\uDD39\",\r\n \"bopf\": \"\\uD835\\uDD53\",\r\n \"bot\": \"\\u22A5\",\r\n \"bottom\": \"\\u22A5\",\r\n \"bowtie\": \"\\u22C8\",\r\n \"boxbox\": \"\\u29C9\",\r\n \"boxDL\": \"\\u2557\",\r\n \"boxDl\": \"\\u2556\",\r\n \"boxdL\": \"\\u2555\",\r\n \"boxdl\": \"\\u2510\",\r\n \"boxDR\": \"\\u2554\",\r\n \"boxDr\": \"\\u2553\",\r\n \"boxdR\": \"\\u2552\",\r\n \"boxdr\": \"\\u250C\",\r\n \"boxH\": \"\\u2550\",\r\n \"boxh\": \"\\u2500\",\r\n \"boxHD\": \"\\u2566\",\r\n \"boxHd\": \"\\u2564\",\r\n \"boxhD\": \"\\u2565\",\r\n \"boxhd\": \"\\u252C\",\r\n \"boxHU\": \"\\u2569\",\r\n \"boxHu\": \"\\u2567\",\r\n \"boxhU\": \"\\u2568\",\r\n \"boxhu\": \"\\u2534\",\r\n \"boxminus\": \"\\u229F\",\r\n \"boxplus\": \"\\u229E\",\r\n \"boxtimes\": \"\\u22A0\",\r\n \"boxUL\": \"\\u255D\",\r\n \"boxUl\": \"\\u255C\",\r\n \"boxuL\": \"\\u255B\",\r\n \"boxul\": \"\\u2518\",\r\n \"boxUR\": \"\\u255A\",\r\n \"boxUr\": \"\\u2559\",\r\n \"boxuR\": \"\\u2558\",\r\n \"boxur\": \"\\u2514\",\r\n \"boxV\": \"\\u2551\",\r\n \"boxv\": \"\\u2502\",\r\n \"boxVH\": \"\\u256C\",\r\n \"boxVh\": \"\\u256B\",\r\n \"boxvH\": \"\\u256A\",\r\n \"boxvh\": \"\\u253C\",\r\n \"boxVL\": \"\\u2563\",\r\n \"boxVl\": \"\\u2562\",\r\n \"boxvL\": \"\\u2561\",\r\n \"boxvl\": \"\\u2524\",\r\n \"boxVR\": \"\\u2560\",\r\n \"boxVr\": \"\\u255F\",\r\n \"boxvR\": \"\\u255E\",\r\n \"boxvr\": \"\\u251C\",\r\n \"bprime\": \"\\u2035\",\r\n \"Breve\": \"\\u02D8\",\r\n \"breve\": \"\\u02D8\",\r\n \"brvbar\": \"\\u00A6\",\r\n \"Bscr\": \"\\u212C\",\r\n \"bscr\": \"\\uD835\\uDCB7\",\r\n \"bsemi\": \"\\u204F\",\r\n \"bsim\": \"\\u223D\",\r\n \"bsime\": \"\\u22CD\",\r\n \"bsol\": \"\\u005C\",\r\n \"bsolb\": \"\\u29C5\",\r\n \"bsolhsub\": \"\\u27C8\",\r\n \"bull\": \"\\u2022\",\r\n \"bullet\": \"\\u2022\",\r\n \"bump\": \"\\u224E\",\r\n \"bumpE\": \"\\u2AAE\",\r\n \"bumpe\": \"\\u224F\",\r\n \"Bumpeq\": \"\\u224E\",\r\n \"bumpeq\": \"\\u224F\",\r\n \"Cacute\": \"\\u0106\",\r\n \"cacute\": \"\\u0107\",\r\n \"Cap\": \"\\u22D2\",\r\n \"cap\": \"\\u2229\",\r\n \"capand\": \"\\u2A44\",\r\n \"capbrcup\": \"\\u2A49\",\r\n \"capcap\": \"\\u2A4B\",\r\n \"capcup\": \"\\u2A47\",\r\n \"capdot\": \"\\u2A40\",\r\n \"CapitalDifferentialD\": \"\\u2145\",\r\n \"caps\": \"\\u2229\\uFE00\",\r\n \"caret\": \"\\u2041\",\r\n \"caron\": \"\\u02C7\",\r\n \"Cayleys\": \"\\u212D\",\r\n \"ccaps\": \"\\u2A4D\",\r\n \"Ccaron\": \"\\u010C\",\r\n \"ccaron\": \"\\u010D\",\r\n \"Ccedil\": \"\\u00C7\",\r\n \"ccedil\": \"\\u00E7\",\r\n \"Ccirc\": \"\\u0108\",\r\n \"ccirc\": \"\\u0109\",\r\n \"Cconint\": \"\\u2230\",\r\n \"ccups\": \"\\u2A4C\",\r\n \"ccupssm\": \"\\u2A50\",\r\n \"Cdot\": \"\\u010A\",\r\n \"cdot\": \"\\u010B\",\r\n \"cedil\": \"\\u00B8\",\r\n \"Cedilla\": \"\\u00B8\",\r\n \"cemptyv\": \"\\u29B2\",\r\n \"cent\": \"\\u00A2\",\r\n \"CenterDot\": \"\\u00B7\",\r\n \"centerdot\": \"\\u00B7\",\r\n \"Cfr\": \"\\u212D\",\r\n \"cfr\": \"\\uD835\\uDD20\",\r\n \"CHcy\": \"\\u0427\",\r\n \"chcy\": \"\\u0447\",\r\n \"check\": \"\\u2713\",\r\n \"checkmark\": \"\\u2713\",\r\n \"Chi\": \"\\u03A7\",\r\n \"chi\": \"\\u03C7\",\r\n \"cir\": \"\\u25CB\",\r\n \"circ\": \"\\u02C6\",\r\n \"circeq\": \"\\u2257\",\r\n \"circlearrowleft\": \"\\u21BA\",\r\n \"circlearrowright\": \"\\u21BB\",\r\n \"circledast\": \"\\u229B\",\r\n \"circledcirc\": \"\\u229A\",\r\n \"circleddash\": \"\\u229D\",\r\n \"CircleDot\": \"\\u2299\",\r\n \"circledR\": \"\\u00AE\",\r\n \"circledS\": \"\\u24C8\",\r\n \"CircleMinus\": \"\\u2296\",\r\n \"CirclePlus\": \"\\u2295\",\r\n \"CircleTimes\": \"\\u2297\",\r\n \"cirE\": \"\\u29C3\",\r\n \"cire\": \"\\u2257\",\r\n \"cirfnint\": \"\\u2A10\",\r\n \"cirmid\": \"\\u2AEF\",\r\n \"cirscir\": \"\\u29C2\",\r\n \"ClockwiseContourIntegral\": \"\\u2232\",\r\n \"CloseCurlyDoubleQuote\": \"\\u201D\",\r\n \"CloseCurlyQuote\": \"\\u2019\",\r\n \"clubs\": \"\\u2663\",\r\n \"clubsuit\": \"\\u2663\",\r\n \"Colon\": \"\\u2237\",\r\n \"colon\": \"\\u003A\",\r\n \"Colone\": \"\\u2A74\",\r\n \"colone\": \"\\u2254\",\r\n \"coloneq\": \"\\u2254\",\r\n \"comma\": \"\\u002C\",\r\n \"commat\": \"\\u0040\",\r\n \"comp\": \"\\u2201\",\r\n \"compfn\": \"\\u2218\",\r\n \"complement\": \"\\u2201\",\r\n \"complexes\": \"\\u2102\",\r\n \"cong\": \"\\u2245\",\r\n \"congdot\": \"\\u2A6D\",\r\n \"Congruent\": \"\\u2261\",\r\n \"Conint\": \"\\u222F\",\r\n \"conint\": \"\\u222E\",\r\n \"ContourIntegral\": \"\\u222E\",\r\n \"Copf\": \"\\u2102\",\r\n \"copf\": \"\\uD835\\uDD54\",\r\n \"coprod\": \"\\u2210\",\r\n \"Coproduct\": \"\\u2210\",\r\n \"COPY\": \"\\u00A9\",\r\n \"copy\": \"\\u00A9\",\r\n \"copysr\": \"\\u2117\",\r\n \"CounterClockwiseContourIntegral\": \"\\u2233\",\r\n \"crarr\": \"\\u21B5\",\r\n \"Cross\": \"\\u2A2F\",\r\n \"cross\": \"\\u2717\",\r\n \"Cscr\": \"\\uD835\\uDC9E\",\r\n \"cscr\": \"\\uD835\\uDCB8\",\r\n \"csub\": \"\\u2ACF\",\r\n \"csube\": \"\\u2AD1\",\r\n \"csup\": \"\\u2AD0\",\r\n \"csupe\": \"\\u2AD2\",\r\n \"ctdot\": \"\\u22EF\",\r\n \"cudarrl\": \"\\u2938\",\r\n \"cudarrr\": \"\\u2935\",\r\n \"cuepr\": \"\\u22DE\",\r\n \"cuesc\": \"\\u22DF\",\r\n \"cularr\": \"\\u21B6\",\r\n \"cularrp\": \"\\u293D\",\r\n \"Cup\": \"\\u22D3\",\r\n \"cup\": \"\\u222A\",\r\n \"cupbrcap\": \"\\u2A48\",\r\n \"CupCap\": \"\\u224D\",\r\n \"cupcap\": \"\\u2A46\",\r\n \"cupcup\": \"\\u2A4A\",\r\n \"cupdot\": \"\\u228D\",\r\n \"cupor\": \"\\u2A45\",\r\n \"cups\": \"\\u222A\\uFE00\",\r\n \"curarr\": \"\\u21B7\",\r\n \"curarrm\": \"\\u293C\",\r\n \"curlyeqprec\": \"\\u22DE\",\r\n \"curlyeqsucc\": \"\\u22DF\",\r\n \"curlyvee\": \"\\u22CE\",\r\n \"curlywedge\": \"\\u22CF\",\r\n \"curren\": \"\\u00A4\",\r\n \"curvearrowleft\": \"\\u21B6\",\r\n \"curvearrowright\": \"\\u21B7\",\r\n \"cuvee\": \"\\u22CE\",\r\n \"cuwed\": \"\\u22CF\",\r\n \"cwconint\": \"\\u2232\",\r\n \"cwint\": \"\\u2231\",\r\n \"cylcty\": \"\\u232D\",\r\n \"Dagger\": \"\\u2021\",\r\n \"dagger\": \"\\u2020\",\r\n \"daleth\": \"\\u2138\",\r\n \"Darr\": \"\\u21A1\",\r\n \"dArr\": \"\\u21D3\",\r\n \"darr\": \"\\u2193\",\r\n \"dash\": \"\\u2010\",\r\n \"Dashv\": \"\\u2AE4\",\r\n \"dashv\": \"\\u22A3\",\r\n \"dbkarow\": \"\\u290F\",\r\n \"dblac\": \"\\u02DD\",\r\n \"Dcaron\": \"\\u010E\",\r\n \"dcaron\": \"\\u010F\",\r\n \"Dcy\": \"\\u0414\",\r\n \"dcy\": \"\\u0434\",\r\n \"DD\": \"\\u2145\",\r\n \"dd\": \"\\u2146\",\r\n \"ddagger\": \"\\u2021\",\r\n \"ddarr\": \"\\u21CA\",\r\n \"DDotrahd\": \"\\u2911\",\r\n \"ddotseq\": \"\\u2A77\",\r\n \"deg\": \"\\u00B0\",\r\n \"Del\": \"\\u2207\",\r\n \"Delta\": \"\\u0394\",\r\n \"delta\": \"\\u03B4\",\r\n \"demptyv\": \"\\u29B1\",\r\n \"dfisht\": \"\\u297F\",\r\n \"Dfr\": \"\\uD835\\uDD07\",\r\n \"dfr\": \"\\uD835\\uDD21\",\r\n \"dHar\": \"\\u2965\",\r\n \"dharl\": \"\\u21C3\",\r\n \"dharr\": \"\\u21C2\",\r\n \"DiacriticalAcute\": \"\\u00B4\",\r\n \"DiacriticalDot\": \"\\u02D9\",\r\n \"DiacriticalDoubleAcute\": \"\\u02DD\",\r\n \"DiacriticalGrave\": \"\\u0060\",\r\n \"DiacriticalTilde\": \"\\u02DC\",\r\n \"diam\": \"\\u22C4\",\r\n \"Diamond\": \"\\u22C4\",\r\n \"diamond\": \"\\u22C4\",\r\n \"diamondsuit\": \"\\u2666\",\r\n \"diams\": \"\\u2666\",\r\n \"die\": \"\\u00A8\",\r\n \"DifferentialD\": \"\\u2146\",\r\n \"digamma\": \"\\u03DD\",\r\n \"disin\": \"\\u22F2\",\r\n \"div\": \"\\u00F7\",\r\n \"divide\": \"\\u00F7\",\r\n \"divideontimes\": \"\\u22C7\",\r\n \"divonx\": \"\\u22C7\",\r\n \"DJcy\": \"\\u0402\",\r\n \"djcy\": \"\\u0452\",\r\n \"dlcorn\": \"\\u231E\",\r\n \"dlcrop\": \"\\u230D\",\r\n \"dollar\": \"\\u0024\",\r\n \"Dopf\": \"\\uD835\\uDD3B\",\r\n \"dopf\": \"\\uD835\\uDD55\",\r\n \"Dot\": \"\\u00A8\",\r\n \"dot\": \"\\u02D9\",\r\n \"DotDot\": \"\\u20DC\",\r\n \"doteq\": \"\\u2250\",\r\n \"doteqdot\": \"\\u2251\",\r\n \"DotEqual\": \"\\u2250\",\r\n \"dotminus\": \"\\u2238\",\r\n \"dotplus\": \"\\u2214\",\r\n \"dotsquare\": \"\\u22A1\",\r\n \"doublebarwedge\": \"\\u2306\",\r\n \"DoubleContourIntegral\": \"\\u222F\",\r\n \"DoubleDot\": \"\\u00A8\",\r\n \"DoubleDownArrow\": \"\\u21D3\",\r\n \"DoubleLeftArrow\": \"\\u21D0\",\r\n \"DoubleLeftRightArrow\": \"\\u21D4\",\r\n \"DoubleLeftTee\": \"\\u2AE4\",\r\n \"DoubleLongLeftArrow\": \"\\u27F8\",\r\n \"DoubleLongLeftRightArrow\": \"\\u27FA\",\r\n \"DoubleLongRightArrow\": \"\\u27F9\",\r\n \"DoubleRightArrow\": \"\\u21D2\",\r\n \"DoubleRightTee\": \"\\u22A8\",\r\n \"DoubleUpArrow\": \"\\u21D1\",\r\n \"DoubleUpDownArrow\": \"\\u21D5\",\r\n \"DoubleVerticalBar\": \"\\u2225\",\r\n \"DownArrow\": \"\\u2193\",\r\n \"Downarrow\": \"\\u21D3\",\r\n \"downarrow\": \"\\u2193\",\r\n \"DownArrowBar\": \"\\u2913\",\r\n \"DownArrowUpArrow\": \"\\u21F5\",\r\n \"DownBreve\": \"\\u0311\",\r\n \"downdownarrows\": \"\\u21CA\",\r\n \"downharpoonleft\": \"\\u21C3\",\r\n \"downharpoonright\": \"\\u21C2\",\r\n \"DownLeftRightVector\": \"\\u2950\",\r\n \"DownLeftTeeVector\": \"\\u295E\",\r\n \"DownLeftVector\": \"\\u21BD\",\r\n \"DownLeftVectorBar\": \"\\u2956\",\r\n \"DownRightTeeVector\": \"\\u295F\",\r\n \"DownRightVector\": \"\\u21C1\",\r\n \"DownRightVectorBar\": \"\\u2957\",\r\n \"DownTee\": \"\\u22A4\",\r\n \"DownTeeArrow\": \"\\u21A7\",\r\n \"drbkarow\": \"\\u2910\",\r\n \"drcorn\": \"\\u231F\",\r\n \"drcrop\": \"\\u230C\",\r\n \"Dscr\": \"\\uD835\\uDC9F\",\r\n \"dscr\": \"\\uD835\\uDCB9\",\r\n \"DScy\": \"\\u0405\",\r\n \"dscy\": \"\\u0455\",\r\n \"dsol\": \"\\u29F6\",\r\n \"Dstrok\": \"\\u0110\",\r\n \"dstrok\": \"\\u0111\",\r\n \"dtdot\": \"\\u22F1\",\r\n \"dtri\": \"\\u25BF\",\r\n \"dtrif\": \"\\u25BE\",\r\n \"duarr\": \"\\u21F5\",\r\n \"duhar\": \"\\u296F\",\r\n \"dwangle\": \"\\u29A6\",\r\n \"DZcy\": \"\\u040F\",\r\n \"dzcy\": \"\\u045F\",\r\n \"dzigrarr\": \"\\u27FF\",\r\n \"Eacute\": \"\\u00C9\",\r\n \"eacute\": \"\\u00E9\",\r\n \"easter\": \"\\u2A6E\",\r\n \"Ecaron\": \"\\u011A\",\r\n \"ecaron\": \"\\u011B\",\r\n \"ecir\": \"\\u2256\",\r\n \"Ecirc\": \"\\u00CA\",\r\n \"ecirc\": \"\\u00EA\",\r\n \"ecolon\": \"\\u2255\",\r\n \"Ecy\": \"\\u042D\",\r\n \"ecy\": \"\\u044D\",\r\n \"eDDot\": \"\\u2A77\",\r\n \"Edot\": \"\\u0116\",\r\n \"eDot\": \"\\u2251\",\r\n \"edot\": \"\\u0117\",\r\n \"ee\": \"\\u2147\",\r\n \"efDot\": \"\\u2252\",\r\n \"Efr\": \"\\uD835\\uDD08\",\r\n \"efr\": \"\\uD835\\uDD22\",\r\n \"eg\": \"\\u2A9A\",\r\n \"Egrave\": \"\\u00C8\",\r\n \"egrave\": \"\\u00E8\",\r\n \"egs\": \"\\u2A96\",\r\n \"egsdot\": \"\\u2A98\",\r\n \"el\": \"\\u2A99\",\r\n \"Element\": \"\\u2208\",\r\n \"elinters\": \"\\u23E7\",\r\n \"ell\": \"\\u2113\",\r\n \"els\": \"\\u2A95\",\r\n \"elsdot\": \"\\u2A97\",\r\n \"Emacr\": \"\\u0112\",\r\n \"emacr\": \"\\u0113\",\r\n \"empty\": \"\\u2205\",\r\n \"emptyset\": \"\\u2205\",\r\n \"EmptySmallSquare\": \"\\u25FB\",\r\n \"emptyv\": \"\\u2205\",\r\n \"EmptyVerySmallSquare\": \"\\u25AB\",\r\n \"emsp\": \"\\u2003\",\r\n \"emsp13\": \"\\u2004\",\r\n \"emsp14\": \"\\u2005\",\r\n \"ENG\": \"\\u014A\",\r\n \"eng\": \"\\u014B\",\r\n \"ensp\": \"\\u2002\",\r\n \"Eogon\": \"\\u0118\",\r\n \"eogon\": \"\\u0119\",\r\n \"Eopf\": \"\\uD835\\uDD3C\",\r\n \"eopf\": \"\\uD835\\uDD56\",\r\n \"epar\": \"\\u22D5\",\r\n \"eparsl\": \"\\u29E3\",\r\n \"eplus\": \"\\u2A71\",\r\n \"epsi\": \"\\u03B5\",\r\n \"Epsilon\": \"\\u0395\",\r\n \"epsilon\": \"\\u03B5\",\r\n \"epsiv\": \"\\u03F5\",\r\n \"eqcirc\": \"\\u2256\",\r\n \"eqcolon\": \"\\u2255\",\r\n \"eqsim\": \"\\u2242\",\r\n \"eqslantgtr\": \"\\u2A96\",\r\n \"eqslantless\": \"\\u2A95\",\r\n \"Equal\": \"\\u2A75\",\r\n \"equals\": \"\\u003D\",\r\n \"EqualTilde\": \"\\u2242\",\r\n \"equest\": \"\\u225F\",\r\n \"Equilibrium\": \"\\u21CC\",\r\n \"equiv\": \"\\u2261\",\r\n \"equivDD\": \"\\u2A78\",\r\n \"eqvparsl\": \"\\u29E5\",\r\n \"erarr\": \"\\u2971\",\r\n \"erDot\": \"\\u2253\",\r\n \"Escr\": \"\\u2130\",\r\n \"escr\": \"\\u212F\",\r\n \"esdot\": \"\\u2250\",\r\n \"Esim\": \"\\u2A73\",\r\n \"esim\": \"\\u2242\",\r\n \"Eta\": \"\\u0397\",\r\n \"eta\": \"\\u03B7\",\r\n \"ETH\": \"\\u00D0\",\r\n \"eth\": \"\\u00F0\",\r\n \"Euml\": \"\\u00CB\",\r\n \"euml\": \"\\u00EB\",\r\n \"euro\": \"\\u20AC\",\r\n \"excl\": \"\\u0021\",\r\n \"exist\": \"\\u2203\",\r\n \"Exists\": \"\\u2203\",\r\n \"expectation\": \"\\u2130\",\r\n \"ExponentialE\": \"\\u2147\",\r\n \"exponentiale\": \"\\u2147\",\r\n \"fallingdotseq\": \"\\u2252\",\r\n \"Fcy\": \"\\u0424\",\r\n \"fcy\": \"\\u0444\",\r\n \"female\": \"\\u2640\",\r\n \"ffilig\": \"\\uFB03\",\r\n \"fflig\": \"\\uFB00\",\r\n \"ffllig\": \"\\uFB04\",\r\n \"Ffr\": \"\\uD835\\uDD09\",\r\n \"ffr\": \"\\uD835\\uDD23\",\r\n \"filig\": \"\\uFB01\",\r\n \"FilledSmallSquare\": \"\\u25FC\",\r\n \"FilledVerySmallSquare\": \"\\u25AA\",\r\n \"fjlig\": \"\\u0066\\u006A\",\r\n \"flat\": \"\\u266D\",\r\n \"fllig\": \"\\uFB02\",\r\n \"fltns\": \"\\u25B1\",\r\n \"fnof\": \"\\u0192\",\r\n \"Fopf\": \"\\uD835\\uDD3D\",\r\n \"fopf\": \"\\uD835\\uDD57\",\r\n \"ForAll\": \"\\u2200\",\r\n \"forall\": \"\\u2200\",\r\n \"fork\": \"\\u22D4\",\r\n \"forkv\": \"\\u2AD9\",\r\n \"Fouriertrf\": \"\\u2131\",\r\n \"fpartint\": \"\\u2A0D\",\r\n \"frac12\": \"\\u00BD\",\r\n \"frac13\": \"\\u2153\",\r\n \"frac14\": \"\\u00BC\",\r\n \"frac15\": \"\\u2155\",\r\n \"frac16\": \"\\u2159\",\r\n \"frac18\": \"\\u215B\",\r\n \"frac23\": \"\\u2154\",\r\n \"frac25\": \"\\u2156\",\r\n \"frac34\": \"\\u00BE\",\r\n \"frac35\": \"\\u2157\",\r\n \"frac38\": \"\\u215C\",\r\n \"frac45\": \"\\u2158\",\r\n \"frac56\": \"\\u215A\",\r\n \"frac58\": \"\\u215D\",\r\n \"frac78\": \"\\u215E\",\r\n \"frasl\": \"\\u2044\",\r\n \"frown\": \"\\u2322\",\r\n \"Fscr\": \"\\u2131\",\r\n \"fscr\": \"\\uD835\\uDCBB\",\r\n \"gacute\": \"\\u01F5\",\r\n \"Gamma\": \"\\u0393\",\r\n \"gamma\": \"\\u03B3\",\r\n \"Gammad\": \"\\u03DC\",\r\n \"gammad\": \"\\u03DD\",\r\n \"gap\": \"\\u2A86\",\r\n \"Gbreve\": \"\\u011E\",\r\n \"gbreve\": \"\\u011F\",\r\n \"Gcedil\": \"\\u0122\",\r\n \"Gcirc\": \"\\u011C\",\r\n \"gcirc\": \"\\u011D\",\r\n \"Gcy\": \"\\u0413\",\r\n \"gcy\": \"\\u0433\",\r\n \"Gdot\": \"\\u0120\",\r\n \"gdot\": \"\\u0121\",\r\n \"gE\": \"\\u2267\",\r\n \"ge\": \"\\u2265\",\r\n \"gEl\": \"\\u2A8C\",\r\n \"gel\": \"\\u22DB\",\r\n \"geq\": \"\\u2265\",\r\n \"geqq\": \"\\u2267\",\r\n \"geqslant\": \"\\u2A7E\",\r\n \"ges\": \"\\u2A7E\",\r\n \"gescc\": \"\\u2AA9\",\r\n \"gesdot\": \"\\u2A80\",\r\n \"gesdoto\": \"\\u2A82\",\r\n \"gesdotol\": \"\\u2A84\",\r\n \"gesl\": \"\\u22DB\\uFE00\",\r\n \"gesles\": \"\\u2A94\",\r\n \"Gfr\": \"\\uD835\\uDD0A\",\r\n \"gfr\": \"\\uD835\\uDD24\",\r\n \"Gg\": \"\\u22D9\",\r\n \"gg\": \"\\u226B\",\r\n \"ggg\": \"\\u22D9\",\r\n \"gimel\": \"\\u2137\",\r\n \"GJcy\": \"\\u0403\",\r\n \"gjcy\": \"\\u0453\",\r\n \"gl\": \"\\u2277\",\r\n \"gla\": \"\\u2AA5\",\r\n \"glE\": \"\\u2A92\",\r\n \"glj\": \"\\u2AA4\",\r\n \"gnap\": \"\\u2A8A\",\r\n \"gnapprox\": \"\\u2A8A\",\r\n \"gnE\": \"\\u2269\",\r\n \"gne\": \"\\u2A88\",\r\n \"gneq\": \"\\u2A88\",\r\n \"gneqq\": \"\\u2269\",\r\n \"gnsim\": \"\\u22E7\",\r\n \"Gopf\": \"\\uD835\\uDD3E\",\r\n \"gopf\": \"\\uD835\\uDD58\",\r\n \"grave\": \"\\u0060\",\r\n \"GreaterEqual\": \"\\u2265\",\r\n \"GreaterEqualLess\": \"\\u22DB\",\r\n \"GreaterFullEqual\": \"\\u2267\",\r\n \"GreaterGreater\": \"\\u2AA2\",\r\n \"GreaterLess\": \"\\u2277\",\r\n \"GreaterSlantEqual\": \"\\u2A7E\",\r\n \"GreaterTilde\": \"\\u2273\",\r\n \"Gscr\": \"\\uD835\\uDCA2\",\r\n \"gscr\": \"\\u210A\",\r\n \"gsim\": \"\\u2273\",\r\n \"gsime\": \"\\u2A8E\",\r\n \"gsiml\": \"\\u2A90\",\r\n \"GT\": \"\\u003E\",\r\n \"Gt\": \"\\u226B\",\r\n \"gt\": \"\\u003E\",\r\n \"gtcc\": \"\\u2AA7\",\r\n \"gtcir\": \"\\u2A7A\",\r\n \"gtdot\": \"\\u22D7\",\r\n \"gtlPar\": \"\\u2995\",\r\n \"gtquest\": \"\\u2A7C\",\r\n \"gtrapprox\": \"\\u2A86\",\r\n \"gtrarr\": \"\\u2978\",\r\n \"gtrdot\": \"\\u22D7\",\r\n \"gtreqless\": \"\\u22DB\",\r\n \"gtreqqless\": \"\\u2A8C\",\r\n \"gtrless\": \"\\u2277\",\r\n \"gtrsim\": \"\\u2273\",\r\n \"gvertneqq\": \"\\u2269\\uFE00\",\r\n \"gvnE\": \"\\u2269\\uFE00\",\r\n \"Hacek\": \"\\u02C7\",\r\n \"hairsp\": \"\\u200A\",\r\n \"half\": \"\\u00BD\",\r\n \"hamilt\": \"\\u210B\",\r\n \"HARDcy\": \"\\u042A\",\r\n \"hardcy\": \"\\u044A\",\r\n \"hArr\": \"\\u21D4\",\r\n \"harr\": \"\\u2194\",\r\n \"harrcir\": \"\\u2948\",\r\n \"harrw\": \"\\u21AD\",\r\n \"Hat\": \"\\u005E\",\r\n \"hbar\": \"\\u210F\",\r\n \"Hcirc\": \"\\u0124\",\r\n \"hcirc\": \"\\u0125\",\r\n \"hearts\": \"\\u2665\",\r\n \"heartsuit\": \"\\u2665\",\r\n \"hellip\": \"\\u2026\",\r\n \"hercon\": \"\\u22B9\",\r\n \"Hfr\": \"\\u210C\",\r\n \"hfr\": \"\\uD835\\uDD25\",\r\n \"HilbertSpace\": \"\\u210B\",\r\n \"hksearow\": \"\\u2925\",\r\n \"hkswarow\": \"\\u2926\",\r\n \"hoarr\": \"\\u21FF\",\r\n \"homtht\": \"\\u223B\",\r\n \"hookleftarrow\": \"\\u21A9\",\r\n \"hookrightarrow\": \"\\u21AA\",\r\n \"Hopf\": \"\\u210D\",\r\n \"hopf\": \"\\uD835\\uDD59\",\r\n \"horbar\": \"\\u2015\",\r\n \"HorizontalLine\": \"\\u2500\",\r\n \"Hscr\": \"\\u210B\",\r\n \"hscr\": \"\\uD835\\uDCBD\",\r\n \"hslash\": \"\\u210F\",\r\n \"Hstrok\": \"\\u0126\",\r\n \"hstrok\": \"\\u0127\",\r\n \"HumpDownHump\": \"\\u224E\",\r\n \"HumpEqual\": \"\\u224F\",\r\n \"hybull\": \"\\u2043\",\r\n \"hyphen\": \"\\u2010\",\r\n \"Iacute\": \"\\u00CD\",\r\n \"iacute\": \"\\u00ED\",\r\n \"ic\": \"\\u2063\",\r\n \"Icirc\": \"\\u00CE\",\r\n \"icirc\": \"\\u00EE\",\r\n \"Icy\": \"\\u0418\",\r\n \"icy\": \"\\u0438\",\r\n \"Idot\": \"\\u0130\",\r\n \"IEcy\": \"\\u0415\",\r\n \"iecy\": \"\\u0435\",\r\n \"iexcl\": \"\\u00A1\",\r\n \"iff\": \"\\u21D4\",\r\n \"Ifr\": \"\\u2111\",\r\n \"ifr\": \"\\uD835\\uDD26\",\r\n \"Igrave\": \"\\u00CC\",\r\n \"igrave\": \"\\u00EC\",\r\n \"ii\": \"\\u2148\",\r\n \"iiiint\": \"\\u2A0C\",\r\n \"iiint\": \"\\u222D\",\r\n \"iinfin\": \"\\u29DC\",\r\n \"iiota\": \"\\u2129\",\r\n \"IJlig\": \"\\u0132\",\r\n \"ijlig\": \"\\u0133\",\r\n \"Im\": \"\\u2111\",\r\n \"Imacr\": \"\\u012A\",\r\n \"imacr\": \"\\u012B\",\r\n \"image\": \"\\u2111\",\r\n \"ImaginaryI\": \"\\u2148\",\r\n \"imagline\": \"\\u2110\",\r\n \"imagpart\": \"\\u2111\",\r\n \"imath\": \"\\u0131\",\r\n \"imof\": \"\\u22B7\",\r\n \"imped\": \"\\u01B5\",\r\n \"Implies\": \"\\u21D2\",\r\n \"in\": \"\\u2208\",\r\n \"incare\": \"\\u2105\",\r\n \"infin\": \"\\u221E\",\r\n \"infintie\": \"\\u29DD\",\r\n \"inodot\": \"\\u0131\",\r\n \"Int\": \"\\u222C\",\r\n \"int\": \"\\u222B\",\r\n \"intcal\": \"\\u22BA\",\r\n \"integers\": \"\\u2124\",\r\n \"Integral\": \"\\u222B\",\r\n \"intercal\": \"\\u22BA\",\r\n \"Intersection\": \"\\u22C2\",\r\n \"intlarhk\": \"\\u2A17\",\r\n \"intprod\": \"\\u2A3C\",\r\n \"InvisibleComma\": \"\\u2063\",\r\n \"InvisibleTimes\": \"\\u2062\",\r\n \"IOcy\": \"\\u0401\",\r\n \"iocy\": \"\\u0451\",\r\n \"Iogon\": \"\\u012E\",\r\n \"iogon\": \"\\u012F\",\r\n \"Iopf\": \"\\uD835\\uDD40\",\r\n \"iopf\": \"\\uD835\\uDD5A\",\r\n \"Iota\": \"\\u0399\",\r\n \"iota\": \"\\u03B9\",\r\n \"iprod\": \"\\u2A3C\",\r\n \"iquest\": \"\\u00BF\",\r\n \"Iscr\": \"\\u2110\",\r\n \"iscr\": \"\\uD835\\uDCBE\",\r\n \"isin\": \"\\u2208\",\r\n \"isindot\": \"\\u22F5\",\r\n \"isinE\": \"\\u22F9\",\r\n \"isins\": \"\\u22F4\",\r\n \"isinsv\": \"\\u22F3\",\r\n \"isinv\": \"\\u2208\",\r\n \"it\": \"\\u2062\",\r\n \"Itilde\": \"\\u0128\",\r\n \"itilde\": \"\\u0129\",\r\n \"Iukcy\": \"\\u0406\",\r\n \"iukcy\": \"\\u0456\",\r\n \"Iuml\": \"\\u00CF\",\r\n \"iuml\": \"\\u00EF\",\r\n \"Jcirc\": \"\\u0134\",\r\n \"jcirc\": \"\\u0135\",\r\n \"Jcy\": \"\\u0419\",\r\n \"jcy\": \"\\u0439\",\r\n \"Jfr\": \"\\uD835\\uDD0D\",\r\n \"jfr\": \"\\uD835\\uDD27\",\r\n \"jmath\": \"\\u0237\",\r\n \"Jopf\": \"\\uD835\\uDD41\",\r\n \"jopf\": \"\\uD835\\uDD5B\",\r\n \"Jscr\": \"\\uD835\\uDCA5\",\r\n \"jscr\": \"\\uD835\\uDCBF\",\r\n \"Jsercy\": \"\\u0408\",\r\n \"jsercy\": \"\\u0458\",\r\n \"Jukcy\": \"\\u0404\",\r\n \"jukcy\": \"\\u0454\",\r\n \"Kappa\": \"\\u039A\",\r\n \"kappa\": \"\\u03BA\",\r\n \"kappav\": \"\\u03F0\",\r\n \"Kcedil\": \"\\u0136\",\r\n \"kcedil\": \"\\u0137\",\r\n \"Kcy\": \"\\u041A\",\r\n \"kcy\": \"\\u043A\",\r\n \"Kfr\": \"\\uD835\\uDD0E\",\r\n \"kfr\": \"\\uD835\\uDD28\",\r\n \"kgreen\": \"\\u0138\",\r\n \"KHcy\": \"\\u0425\",\r\n \"khcy\": \"\\u0445\",\r\n \"KJcy\": \"\\u040C\",\r\n \"kjcy\": \"\\u045C\",\r\n \"Kopf\": \"\\uD835\\uDD42\",\r\n \"kopf\": \"\\uD835\\uDD5C\",\r\n \"Kscr\": \"\\uD835\\uDCA6\",\r\n \"kscr\": \"\\uD835\\uDCC0\",\r\n \"lAarr\": \"\\u21DA\",\r\n \"Lacute\": \"\\u0139\",\r\n \"lacute\": \"\\u013A\",\r\n \"laemptyv\": \"\\u29B4\",\r\n \"lagran\": \"\\u2112\",\r\n \"Lambda\": \"\\u039B\",\r\n \"lambda\": \"\\u03BB\",\r\n \"Lang\": \"\\u27EA\",\r\n \"lang\": \"\\u27E8\",\r\n \"langd\": \"\\u2991\",\r\n \"langle\": \"\\u27E8\",\r\n \"lap\": \"\\u2A85\",\r\n \"Laplacetrf\": \"\\u2112\",\r\n \"laquo\": \"\\u00AB\",\r\n \"Larr\": \"\\u219E\",\r\n \"lArr\": \"\\u21D0\",\r\n \"larr\": \"\\u2190\",\r\n \"larrb\": \"\\u21E4\",\r\n \"larrbfs\": \"\\u291F\",\r\n \"larrfs\": \"\\u291D\",\r\n \"larrhk\": \"\\u21A9\",\r\n \"larrlp\": \"\\u21AB\",\r\n \"larrpl\": \"\\u2939\",\r\n \"larrsim\": \"\\u2973\",\r\n \"larrtl\": \"\\u21A2\",\r\n \"lat\": \"\\u2AAB\",\r\n \"lAtail\": \"\\u291B\",\r\n \"latail\": \"\\u2919\",\r\n \"late\": \"\\u2AAD\",\r\n \"lates\": \"\\u2AAD\\uFE00\",\r\n \"lBarr\": \"\\u290E\",\r\n \"lbarr\": \"\\u290C\",\r\n \"lbbrk\": \"\\u2772\",\r\n \"lbrace\": \"\\u007B\",\r\n \"lbrack\": \"\\u005B\",\r\n \"lbrke\": \"\\u298B\",\r\n \"lbrksld\": \"\\u298F\",\r\n \"lbrkslu\": \"\\u298D\",\r\n \"Lcaron\": \"\\u013D\",\r\n \"lcaron\": \"\\u013E\",\r\n \"Lcedil\": \"\\u013B\",\r\n \"lcedil\": \"\\u013C\",\r\n \"lceil\": \"\\u2308\",\r\n \"lcub\": \"\\u007B\",\r\n \"Lcy\": \"\\u041B\",\r\n \"lcy\": \"\\u043B\",\r\n \"ldca\": \"\\u2936\",\r\n \"ldquo\": \"\\u201C\",\r\n \"ldquor\": \"\\u201E\",\r\n \"ldrdhar\": \"\\u2967\",\r\n \"ldrushar\": \"\\u294B\",\r\n \"ldsh\": \"\\u21B2\",\r\n \"lE\": \"\\u2266\",\r\n \"le\": \"\\u2264\",\r\n \"LeftAngleBracket\": \"\\u27E8\",\r\n \"LeftArrow\": \"\\u2190\",\r\n \"Leftarrow\": \"\\u21D0\",\r\n \"leftarrow\": \"\\u2190\",\r\n \"LeftArrowBar\": \"\\u21E4\",\r\n \"LeftArrowRightArrow\": \"\\u21C6\",\r\n \"leftarrowtail\": \"\\u21A2\",\r\n \"LeftCeiling\": \"\\u2308\",\r\n \"LeftDoubleBracket\": \"\\u27E6\",\r\n \"LeftDownTeeVector\": \"\\u2961\",\r\n \"LeftDownVector\": \"\\u21C3\",\r\n \"LeftDownVectorBar\": \"\\u2959\",\r\n \"LeftFloor\": \"\\u230A\",\r\n \"leftharpoondown\": \"\\u21BD\",\r\n \"leftharpoonup\": \"\\u21BC\",\r\n \"leftleftarrows\": \"\\u21C7\",\r\n \"LeftRightArrow\": \"\\u2194\",\r\n \"Leftrightarrow\": \"\\u21D4\",\r\n \"leftrightarrow\": \"\\u2194\",\r\n \"leftrightarrows\": \"\\u21C6\",\r\n \"leftrightharpoons\": \"\\u21CB\",\r\n \"leftrightsquigarrow\": \"\\u21AD\",\r\n \"LeftRightVector\": \"\\u294E\",\r\n \"LeftTee\": \"\\u22A3\",\r\n \"LeftTeeArrow\": \"\\u21A4\",\r\n \"LeftTeeVector\": \"\\u295A\",\r\n \"leftthreetimes\": \"\\u22CB\",\r\n \"LeftTriangle\": \"\\u22B2\",\r\n \"LeftTriangleBar\": \"\\u29CF\",\r\n \"LeftTriangleEqual\": \"\\u22B4\",\r\n \"LeftUpDownVector\": \"\\u2951\",\r\n \"LeftUpTeeVector\": \"\\u2960\",\r\n \"LeftUpVector\": \"\\u21BF\",\r\n \"LeftUpVectorBar\": \"\\u2958\",\r\n \"LeftVector\": \"\\u21BC\",\r\n \"LeftVectorBar\": \"\\u2952\",\r\n \"lEg\": \"\\u2A8B\",\r\n \"leg\": \"\\u22DA\",\r\n \"leq\": \"\\u2264\",\r\n \"leqq\": \"\\u2266\",\r\n \"leqslant\": \"\\u2A7D\",\r\n \"les\": \"\\u2A7D\",\r\n \"lescc\": \"\\u2AA8\",\r\n \"lesdot\": \"\\u2A7F\",\r\n \"lesdoto\": \"\\u2A81\",\r\n \"lesdotor\": \"\\u2A83\",\r\n \"lesg\": \"\\u22DA\\uFE00\",\r\n \"lesges\": \"\\u2A93\",\r\n \"lessapprox\": \"\\u2A85\",\r\n \"lessdot\": \"\\u22D6\",\r\n \"lesseqgtr\": \"\\u22DA\",\r\n \"lesseqqgtr\": \"\\u2A8B\",\r\n \"LessEqualGreater\": \"\\u22DA\",\r\n \"LessFullEqual\": \"\\u2266\",\r\n \"LessGreater\": \"\\u2276\",\r\n \"lessgtr\": \"\\u2276\",\r\n \"LessLess\": \"\\u2AA1\",\r\n \"lesssim\": \"\\u2272\",\r\n \"LessSlantEqual\": \"\\u2A7D\",\r\n \"LessTilde\": \"\\u2272\",\r\n \"lfisht\": \"\\u297C\",\r\n \"lfloor\": \"\\u230A\",\r\n \"Lfr\": \"\\uD835\\uDD0F\",\r\n \"lfr\": \"\\uD835\\uDD29\",\r\n \"lg\": \"\\u2276\",\r\n \"lgE\": \"\\u2A91\",\r\n \"lHar\": \"\\u2962\",\r\n \"lhard\": \"\\u21BD\",\r\n \"lharu\": \"\\u21BC\",\r\n \"lharul\": \"\\u296A\",\r\n \"lhblk\": \"\\u2584\",\r\n \"LJcy\": \"\\u0409\",\r\n \"ljcy\": \"\\u0459\",\r\n \"Ll\": \"\\u22D8\",\r\n \"ll\": \"\\u226A\",\r\n \"llarr\": \"\\u21C7\",\r\n \"llcorner\": \"\\u231E\",\r\n \"Lleftarrow\": \"\\u21DA\",\r\n \"llhard\": \"\\u296B\",\r\n \"lltri\": \"\\u25FA\",\r\n \"Lmidot\": \"\\u013F\",\r\n \"lmidot\": \"\\u0140\",\r\n \"lmoust\": \"\\u23B0\",\r\n \"lmoustache\": \"\\u23B0\",\r\n \"lnap\": \"\\u2A89\",\r\n \"lnapprox\": \"\\u2A89\",\r\n \"lnE\": \"\\u2268\",\r\n \"lne\": \"\\u2A87\",\r\n \"lneq\": \"\\u2A87\",\r\n \"lneqq\": \"\\u2268\",\r\n \"lnsim\": \"\\u22E6\",\r\n \"loang\": \"\\u27EC\",\r\n \"loarr\": \"\\u21FD\",\r\n \"lobrk\": \"\\u27E6\",\r\n \"LongLeftArrow\": \"\\u27F5\",\r\n \"Longleftarrow\": \"\\u27F8\",\r\n \"longleftarrow\": \"\\u27F5\",\r\n \"LongLeftRightArrow\": \"\\u27F7\",\r\n \"Longleftrightarrow\": \"\\u27FA\",\r\n \"longleftrightarrow\": \"\\u27F7\",\r\n \"longmapsto\": \"\\u27FC\",\r\n \"LongRightArrow\": \"\\u27F6\",\r\n \"Longrightarrow\": \"\\u27F9\",\r\n \"longrightarrow\": \"\\u27F6\",\r\n \"looparrowleft\": \"\\u21AB\",\r\n \"looparrowright\": \"\\u21AC\",\r\n \"lopar\": \"\\u2985\",\r\n \"Lopf\": \"\\uD835\\uDD43\",\r\n \"lopf\": \"\\uD835\\uDD5D\",\r\n \"loplus\": \"\\u2A2D\",\r\n \"lotimes\": \"\\u2A34\",\r\n \"lowast\": \"\\u2217\",\r\n \"lowbar\": \"\\u005F\",\r\n \"LowerLeftArrow\": \"\\u2199\",\r\n \"LowerRightArrow\": \"\\u2198\",\r\n \"loz\": \"\\u25CA\",\r\n \"lozenge\": \"\\u25CA\",\r\n \"lozf\": \"\\u29EB\",\r\n \"lpar\": \"\\u0028\",\r\n \"lparlt\": \"\\u2993\",\r\n \"lrarr\": \"\\u21C6\",\r\n \"lrcorner\": \"\\u231F\",\r\n \"lrhar\": \"\\u21CB\",\r\n \"lrhard\": \"\\u296D\",\r\n \"lrm\": \"\\u200E\",\r\n \"lrtri\": \"\\u22BF\",\r\n \"lsaquo\": \"\\u2039\",\r\n \"Lscr\": \"\\u2112\",\r\n \"lscr\": \"\\uD835\\uDCC1\",\r\n \"Lsh\": \"\\u21B0\",\r\n \"lsh\": \"\\u21B0\",\r\n \"lsim\": \"\\u2272\",\r\n \"lsime\": \"\\u2A8D\",\r\n \"lsimg\": \"\\u2A8F\",\r\n \"lsqb\": \"\\u005B\",\r\n \"lsquo\": \"\\u2018\",\r\n \"lsquor\": \"\\u201A\",\r\n \"Lstrok\": \"\\u0141\",\r\n \"lstrok\": \"\\u0142\",\r\n \"LT\": \"\\u003C\",\r\n \"Lt\": \"\\u226A\",\r\n \"lt\": \"\\u003C\",\r\n \"ltcc\": \"\\u2AA6\",\r\n \"ltcir\": \"\\u2A79\",\r\n \"ltdot\": \"\\u22D6\",\r\n \"lthree\": \"\\u22CB\",\r\n \"ltimes\": \"\\u22C9\",\r\n \"ltlarr\": \"\\u2976\",\r\n \"ltquest\": \"\\u2A7B\",\r\n \"ltri\": \"\\u25C3\",\r\n \"ltrie\": \"\\u22B4\",\r\n \"ltrif\": \"\\u25C2\",\r\n \"ltrPar\": \"\\u2996\",\r\n \"lurdshar\": \"\\u294A\",\r\n \"luruhar\": \"\\u2966\",\r\n \"lvertneqq\": \"\\u2268\\uFE00\",\r\n \"lvnE\": \"\\u2268\\uFE00\",\r\n \"macr\": \"\\u00AF\",\r\n \"male\": \"\\u2642\",\r\n \"malt\": \"\\u2720\",\r\n \"maltese\": \"\\u2720\",\r\n \"Map\": \"\\u2905\",\r\n \"map\": \"\\u21A6\",\r\n \"mapsto\": \"\\u21A6\",\r\n \"mapstodown\": \"\\u21A7\",\r\n \"mapstoleft\": \"\\u21A4\",\r\n \"mapstoup\": \"\\u21A5\",\r\n \"marker\": \"\\u25AE\",\r\n \"mcomma\": \"\\u2A29\",\r\n \"Mcy\": \"\\u041C\",\r\n \"mcy\": \"\\u043C\",\r\n \"mdash\": \"\\u2014\",\r\n \"mDDot\": \"\\u223A\",\r\n \"measuredangle\": \"\\u2221\",\r\n \"MediumSpace\": \"\\u205F\",\r\n \"Mellintrf\": \"\\u2133\",\r\n \"Mfr\": \"\\uD835\\uDD10\",\r\n \"mfr\": \"\\uD835\\uDD2A\",\r\n \"mho\": \"\\u2127\",\r\n \"micro\": \"\\u00B5\",\r\n \"mid\": \"\\u2223\",\r\n \"midast\": \"\\u002A\",\r\n \"midcir\": \"\\u2AF0\",\r\n \"middot\": \"\\u00B7\",\r\n \"minus\": \"\\u2212\",\r\n \"minusb\": \"\\u229F\",\r\n \"minusd\": \"\\u2238\",\r\n \"minusdu\": \"\\u2A2A\",\r\n \"MinusPlus\": \"\\u2213\",\r\n \"mlcp\": \"\\u2ADB\",\r\n \"mldr\": \"\\u2026\",\r\n \"mnplus\": \"\\u2213\",\r\n \"models\": \"\\u22A7\",\r\n \"Mopf\": \"\\uD835\\uDD44\",\r\n \"mopf\": \"\\uD835\\uDD5E\",\r\n \"mp\": \"\\u2213\",\r\n \"Mscr\": \"\\u2133\",\r\n \"mscr\": \"\\uD835\\uDCC2\",\r\n \"mstpos\": \"\\u223E\",\r\n \"Mu\": \"\\u039C\",\r\n \"mu\": \"\\u03BC\",\r\n \"multimap\": \"\\u22B8\",\r\n \"mumap\": \"\\u22B8\",\r\n \"nabla\": \"\\u2207\",\r\n \"Nacute\": \"\\u0143\",\r\n \"nacute\": \"\\u0144\",\r\n \"nang\": \"\\u2220\\u20D2\",\r\n \"nap\": \"\\u2249\",\r\n \"napE\": \"\\u2A70\\u0338\",\r\n \"napid\": \"\\u224B\\u0338\",\r\n \"napos\": \"\\u0149\",\r\n \"napprox\": \"\\u2249\",\r\n \"natur\": \"\\u266E\",\r\n \"natural\": \"\\u266E\",\r\n \"naturals\": \"\\u2115\",\r\n \"nbsp\": \"\\u00A0\",\r\n \"nbump\": \"\\u224E\\u0338\",\r\n \"nbumpe\": \"\\u224F\\u0338\",\r\n \"ncap\": \"\\u2A43\",\r\n \"Ncaron\": \"\\u0147\",\r\n \"ncaron\": \"\\u0148\",\r\n \"Ncedil\": \"\\u0145\",\r\n \"ncedil\": \"\\u0146\",\r\n \"ncong\": \"\\u2247\",\r\n \"ncongdot\": \"\\u2A6D\\u0338\",\r\n \"ncup\": \"\\u2A42\",\r\n \"Ncy\": \"\\u041D\",\r\n \"ncy\": \"\\u043D\",\r\n \"ndash\": \"\\u2013\",\r\n \"ne\": \"\\u2260\",\r\n \"nearhk\": \"\\u2924\",\r\n \"neArr\": \"\\u21D7\",\r\n \"nearr\": \"\\u2197\",\r\n \"nearrow\": \"\\u2197\",\r\n \"nedot\": \"\\u2250\\u0338\",\r\n \"NegativeMediumSpace\": \"\\u200B\",\r\n \"NegativeThickSpace\": \"\\u200B\",\r\n \"NegativeThinSpace\": \"\\u200B\",\r\n \"NegativeVeryThinSpace\": \"\\u200B\",\r\n \"nequiv\": \"\\u2262\",\r\n \"nesear\": \"\\u2928\",\r\n \"nesim\": \"\\u2242\\u0338\",\r\n \"NestedGreaterGreater\": \"\\u226B\",\r\n \"NestedLessLess\": \"\\u226A\",\r\n \"NewLine\": \"\\u000A\",\r\n \"nexist\": \"\\u2204\",\r\n \"nexists\": \"\\u2204\",\r\n \"Nfr\": \"\\uD835\\uDD11\",\r\n \"nfr\": \"\\uD835\\uDD2B\",\r\n \"ngE\": \"\\u2267\\u0338\",\r\n \"nge\": \"\\u2271\",\r\n \"ngeq\": \"\\u2271\",\r\n \"ngeqq\": \"\\u2267\\u0338\",\r\n \"ngeqslant\": \"\\u2A7E\\u0338\",\r\n \"nges\": \"\\u2A7E\\u0338\",\r\n \"nGg\": \"\\u22D9\\u0338\",\r\n \"ngsim\": \"\\u2275\",\r\n \"nGt\": \"\\u226B\\u20D2\",\r\n \"ngt\": \"\\u226F\",\r\n \"ngtr\": \"\\u226F\",\r\n \"nGtv\": \"\\u226B\\u0338\",\r\n \"nhArr\": \"\\u21CE\",\r\n \"nharr\": \"\\u21AE\",\r\n \"nhpar\": \"\\u2AF2\",\r\n \"ni\": \"\\u220B\",\r\n \"nis\": \"\\u22FC\",\r\n \"nisd\": \"\\u22FA\",\r\n \"niv\": \"\\u220B\",\r\n \"NJcy\": \"\\u040A\",\r\n \"njcy\": \"\\u045A\",\r\n \"nlArr\": \"\\u21CD\",\r\n \"nlarr\": \"\\u219A\",\r\n \"nldr\": \"\\u2025\",\r\n \"nlE\": \"\\u2266\\u0338\",\r\n \"nle\": \"\\u2270\",\r\n \"nLeftarrow\": \"\\u21CD\",\r\n \"nleftarrow\": \"\\u219A\",\r\n \"nLeftrightarrow\": \"\\u21CE\",\r\n \"nleftrightarrow\": \"\\u21AE\",\r\n \"nleq\": \"\\u2270\",\r\n \"nleqq\": \"\\u2266\\u0338\",\r\n \"nleqslant\": \"\\u2A7D\\u0338\",\r\n \"nles\": \"\\u2A7D\\u0338\",\r\n \"nless\": \"\\u226E\",\r\n \"nLl\": \"\\u22D8\\u0338\",\r\n \"nlsim\": \"\\u2274\",\r\n \"nLt\": \"\\u226A\\u20D2\",\r\n \"nlt\": \"\\u226E\",\r\n \"nltri\": \"\\u22EA\",\r\n \"nltrie\": \"\\u22EC\",\r\n \"nLtv\": \"\\u226A\\u0338\",\r\n \"nmid\": \"\\u2224\",\r\n \"NoBreak\": \"\\u2060\",\r\n \"NonBreakingSpace\": \"\\u00A0\",\r\n \"Nopf\": \"\\u2115\",\r\n \"nopf\": \"\\uD835\\uDD5F\",\r\n \"Not\": \"\\u2AEC\",\r\n \"not\": \"\\u00AC\",\r\n \"NotCongruent\": \"\\u2262\",\r\n \"NotCupCap\": \"\\u226D\",\r\n \"NotDoubleVerticalBar\": \"\\u2226\",\r\n \"NotElement\": \"\\u2209\",\r\n \"NotEqual\": \"\\u2260\",\r\n \"NotEqualTilde\": \"\\u2242\\u0338\",\r\n \"NotExists\": \"\\u2204\",\r\n \"NotGreater\": \"\\u226F\",\r\n \"NotGreaterEqual\": \"\\u2271\",\r\n \"NotGreaterFullEqual\": \"\\u2267\\u0338\",\r\n \"NotGreaterGreater\": \"\\u226B\\u0338\",\r\n \"NotGreaterLess\": \"\\u2279\",\r\n \"NotGreaterSlantEqual\": \"\\u2A7E\\u0338\",\r\n \"NotGreaterTilde\": \"\\u2275\",\r\n \"NotHumpDownHump\": \"\\u224E\\u0338\",\r\n \"NotHumpEqual\": \"\\u224F\\u0338\",\r\n \"notin\": \"\\u2209\",\r\n \"notindot\": \"\\u22F5\\u0338\",\r\n \"notinE\": \"\\u22F9\\u0338\",\r\n \"notinva\": \"\\u2209\",\r\n \"notinvb\": \"\\u22F7\",\r\n \"notinvc\": \"\\u22F6\",\r\n \"NotLeftTriangle\": \"\\u22EA\",\r\n \"NotLeftTriangleBar\": \"\\u29CF\\u0338\",\r\n \"NotLeftTriangleEqual\": \"\\u22EC\",\r\n \"NotLess\": \"\\u226E\",\r\n \"NotLessEqual\": \"\\u2270\",\r\n \"NotLessGreater\": \"\\u2278\",\r\n \"NotLessLess\": \"\\u226A\\u0338\",\r\n \"NotLessSlantEqual\": \"\\u2A7D\\u0338\",\r\n \"NotLessTilde\": \"\\u2274\",\r\n \"NotNestedGreaterGreater\": \"\\u2AA2\\u0338\",\r\n \"NotNestedLessLess\": \"\\u2AA1\\u0338\",\r\n \"notni\": \"\\u220C\",\r\n \"notniva\": \"\\u220C\",\r\n \"notnivb\": \"\\u22FE\",\r\n \"notnivc\": \"\\u22FD\",\r\n \"NotPrecedes\": \"\\u2280\",\r\n \"NotPrecedesEqual\": \"\\u2AAF\\u0338\",\r\n \"NotPrecedesSlantEqual\": \"\\u22E0\",\r\n \"NotReverseElement\": \"\\u220C\",\r\n \"NotRightTriangle\": \"\\u22EB\",\r\n \"NotRightTriangleBar\": \"\\u29D0\\u0338\",\r\n \"NotRightTriangleEqual\": \"\\u22ED\",\r\n \"NotSquareSubset\": \"\\u228F\\u0338\",\r\n \"NotSquareSubsetEqual\": \"\\u22E2\",\r\n \"NotSquareSuperset\": \"\\u2290\\u0338\",\r\n \"NotSquareSupersetEqual\": \"\\u22E3\",\r\n \"NotSubset\": \"\\u2282\\u20D2\",\r\n \"NotSubsetEqual\": \"\\u2288\",\r\n \"NotSucceeds\": \"\\u2281\",\r\n \"NotSucceedsEqual\": \"\\u2AB0\\u0338\",\r\n \"NotSucceedsSlantEqual\": \"\\u22E1\",\r\n \"NotSucceedsTilde\": \"\\u227F\\u0338\",\r\n \"NotSuperset\": \"\\u2283\\u20D2\",\r\n \"NotSupersetEqual\": \"\\u2289\",\r\n \"NotTilde\": \"\\u2241\",\r\n \"NotTildeEqual\": \"\\u2244\",\r\n \"NotTildeFullEqual\": \"\\u2247\",\r\n \"NotTildeTilde\": \"\\u2249\",\r\n \"NotVerticalBar\": \"\\u2224\",\r\n \"npar\": \"\\u2226\",\r\n \"nparallel\": \"\\u2226\",\r\n \"nparsl\": \"\\u2AFD\\u20E5\",\r\n \"npart\": \"\\u2202\\u0338\",\r\n \"npolint\": \"\\u2A14\",\r\n \"npr\": \"\\u2280\",\r\n \"nprcue\": \"\\u22E0\",\r\n \"npre\": \"\\u2AAF\\u0338\",\r\n \"nprec\": \"\\u2280\",\r\n \"npreceq\": \"\\u2AAF\\u0338\",\r\n \"nrArr\": \"\\u21CF\",\r\n \"nrarr\": \"\\u219B\",\r\n \"nrarrc\": \"\\u2933\\u0338\",\r\n \"nrarrw\": \"\\u219D\\u0338\",\r\n \"nRightarrow\": \"\\u21CF\",\r\n \"nrightarrow\": \"\\u219B\",\r\n \"nrtri\": \"\\u22EB\",\r\n \"nrtrie\": \"\\u22ED\",\r\n \"nsc\": \"\\u2281\",\r\n \"nsccue\": \"\\u22E1\",\r\n \"nsce\": \"\\u2AB0\\u0338\",\r\n \"Nscr\": \"\\uD835\\uDCA9\",\r\n \"nscr\": \"\\uD835\\uDCC3\",\r\n \"nshortmid\": \"\\u2224\",\r\n \"nshortparallel\": \"\\u2226\",\r\n \"nsim\": \"\\u2241\",\r\n \"nsime\": \"\\u2244\",\r\n \"nsimeq\": \"\\u2244\",\r\n \"nsmid\": \"\\u2224\",\r\n \"nspar\": \"\\u2226\",\r\n \"nsqsube\": \"\\u22E2\",\r\n \"nsqsupe\": \"\\u22E3\",\r\n \"nsub\": \"\\u2284\",\r\n \"nsubE\": \"\\u2AC5\\u0338\",\r\n \"nsube\": \"\\u2288\",\r\n \"nsubset\": \"\\u2282\\u20D2\",\r\n \"nsubseteq\": \"\\u2288\",\r\n \"nsubseteqq\": \"\\u2AC5\\u0338\",\r\n \"nsucc\": \"\\u2281\",\r\n \"nsucceq\": \"\\u2AB0\\u0338\",\r\n \"nsup\": \"\\u2285\",\r\n \"nsupE\": \"\\u2AC6\\u0338\",\r\n \"nsupe\": \"\\u2289\",\r\n \"nsupset\": \"\\u2283\\u20D2\",\r\n \"nsupseteq\": \"\\u2289\",\r\n \"nsupseteqq\": \"\\u2AC6\\u0338\",\r\n \"ntgl\": \"\\u2279\",\r\n \"Ntilde\": \"\\u00D1\",\r\n \"ntilde\": \"\\u00F1\",\r\n \"ntlg\": \"\\u2278\",\r\n \"ntriangleleft\": \"\\u22EA\",\r\n \"ntrianglelefteq\": \"\\u22EC\",\r\n \"ntriangleright\": \"\\u22EB\",\r\n \"ntrianglerighteq\": \"\\u22ED\",\r\n \"Nu\": \"\\u039D\",\r\n \"nu\": \"\\u03BD\",\r\n \"num\": \"\\u0023\",\r\n \"numero\": \"\\u2116\",\r\n \"numsp\": \"\\u2007\",\r\n \"nvap\": \"\\u224D\\u20D2\",\r\n \"nVDash\": \"\\u22AF\",\r\n \"nVdash\": \"\\u22AE\",\r\n \"nvDash\": \"\\u22AD\",\r\n \"nvdash\": \"\\u22AC\",\r\n \"nvge\": \"\\u2265\\u20D2\",\r\n \"nvgt\": \"\\u003E\\u20D2\",\r\n \"nvHarr\": \"\\u2904\",\r\n \"nvinfin\": \"\\u29DE\",\r\n \"nvlArr\": \"\\u2902\",\r\n \"nvle\": \"\\u2264\\u20D2\",\r\n \"nvlt\": \"\\u003C\\u20D2\",\r\n \"nvltrie\": \"\\u22B4\\u20D2\",\r\n \"nvrArr\": \"\\u2903\",\r\n \"nvrtrie\": \"\\u22B5\\u20D2\",\r\n \"nvsim\": \"\\u223C\\u20D2\",\r\n \"nwarhk\": \"\\u2923\",\r\n \"nwArr\": \"\\u21D6\",\r\n \"nwarr\": \"\\u2196\",\r\n \"nwarrow\": \"\\u2196\",\r\n \"nwnear\": \"\\u2927\",\r\n \"Oacute\": \"\\u00D3\",\r\n \"oacute\": \"\\u00F3\",\r\n \"oast\": \"\\u229B\",\r\n \"ocir\": \"\\u229A\",\r\n \"Ocirc\": \"\\u00D4\",\r\n \"ocirc\": \"\\u00F4\",\r\n \"Ocy\": \"\\u041E\",\r\n \"ocy\": \"\\u043E\",\r\n \"odash\": \"\\u229D\",\r\n \"Odblac\": \"\\u0150\",\r\n \"odblac\": \"\\u0151\",\r\n \"odiv\": \"\\u2A38\",\r\n \"odot\": \"\\u2299\",\r\n \"odsold\": \"\\u29BC\",\r\n \"OElig\": \"\\u0152\",\r\n \"oelig\": \"\\u0153\",\r\n \"ofcir\": \"\\u29BF\",\r\n \"Ofr\": \"\\uD835\\uDD12\",\r\n \"ofr\": \"\\uD835\\uDD2C\",\r\n \"ogon\": \"\\u02DB\",\r\n \"Ograve\": \"\\u00D2\",\r\n \"ograve\": \"\\u00F2\",\r\n \"ogt\": \"\\u29C1\",\r\n \"ohbar\": \"\\u29B5\",\r\n \"ohm\": \"\\u03A9\",\r\n \"oint\": \"\\u222E\",\r\n \"olarr\": \"\\u21BA\",\r\n \"olcir\": \"\\u29BE\",\r\n \"olcross\": \"\\u29BB\",\r\n \"oline\": \"\\u203E\",\r\n \"olt\": \"\\u29C0\",\r\n \"Omacr\": \"\\u014C\",\r\n \"omacr\": \"\\u014D\",\r\n \"Omega\": \"\\u03A9\",\r\n \"omega\": \"\\u03C9\",\r\n \"Omicron\": \"\\u039F\",\r\n \"omicron\": \"\\u03BF\",\r\n \"omid\": \"\\u29B6\",\r\n \"ominus\": \"\\u2296\",\r\n \"Oopf\": \"\\uD835\\uDD46\",\r\n \"oopf\": \"\\uD835\\uDD60\",\r\n \"opar\": \"\\u29B7\",\r\n \"OpenCurlyDoubleQuote\": \"\\u201C\",\r\n \"OpenCurlyQuote\": \"\\u2018\",\r\n \"operp\": \"\\u29B9\",\r\n \"oplus\": \"\\u2295\",\r\n \"Or\": \"\\u2A54\",\r\n \"or\": \"\\u2228\",\r\n \"orarr\": \"\\u21BB\",\r\n \"ord\": \"\\u2A5D\",\r\n \"order\": \"\\u2134\",\r\n \"orderof\": \"\\u2134\",\r\n \"ordf\": \"\\u00AA\",\r\n \"ordm\": \"\\u00BA\",\r\n \"origof\": \"\\u22B6\",\r\n \"oror\": \"\\u2A56\",\r\n \"orslope\": \"\\u2A57\",\r\n \"orv\": \"\\u2A5B\",\r\n \"oS\": \"\\u24C8\",\r\n \"Oscr\": \"\\uD835\\uDCAA\",\r\n \"oscr\": \"\\u2134\",\r\n \"Oslash\": \"\\u00D8\",\r\n \"oslash\": \"\\u00F8\",\r\n \"osol\": \"\\u2298\",\r\n \"Otilde\": \"\\u00D5\",\r\n \"otilde\": \"\\u00F5\",\r\n \"Otimes\": \"\\u2A37\",\r\n \"otimes\": \"\\u2297\",\r\n \"otimesas\": \"\\u2A36\",\r\n \"Ouml\": \"\\u00D6\",\r\n \"ouml\": \"\\u00F6\",\r\n \"ovbar\": \"\\u233D\",\r\n \"OverBar\": \"\\u203E\",\r\n \"OverBrace\": \"\\u23DE\",\r\n \"OverBracket\": \"\\u23B4\",\r\n \"OverParenthesis\": \"\\u23DC\",\r\n \"par\": \"\\u2225\",\r\n \"para\": \"\\u00B6\",\r\n \"parallel\": \"\\u2225\",\r\n \"parsim\": \"\\u2AF3\",\r\n \"parsl\": \"\\u2AFD\",\r\n \"part\": \"\\u2202\",\r\n \"PartialD\": \"\\u2202\",\r\n \"Pcy\": \"\\u041F\",\r\n \"pcy\": \"\\u043F\",\r\n \"percnt\": \"\\u0025\",\r\n \"period\": \"\\u002E\",\r\n \"permil\": \"\\u2030\",\r\n \"perp\": \"\\u22A5\",\r\n \"pertenk\": \"\\u2031\",\r\n \"Pfr\": \"\\uD835\\uDD13\",\r\n \"pfr\": \"\\uD835\\uDD2D\",\r\n \"Phi\": \"\\u03A6\",\r\n \"phi\": \"\\u03C6\",\r\n \"phiv\": \"\\u03D5\",\r\n \"phmmat\": \"\\u2133\",\r\n \"phone\": \"\\u260E\",\r\n \"Pi\": \"\\u03A0\",\r\n \"pi\": \"\\u03C0\",\r\n \"pitchfork\": \"\\u22D4\",\r\n \"piv\": \"\\u03D6\",\r\n \"planck\": \"\\u210F\",\r\n \"planckh\": \"\\u210E\",\r\n \"plankv\": \"\\u210F\",\r\n \"plus\": \"\\u002B\",\r\n \"plusacir\": \"\\u2A23\",\r\n \"plusb\": \"\\u229E\",\r\n \"pluscir\": \"\\u2A22\",\r\n \"plusdo\": \"\\u2214\",\r\n \"plusdu\": \"\\u2A25\",\r\n \"pluse\": \"\\u2A72\",\r\n \"PlusMinus\": \"\\u00B1\",\r\n \"plusmn\": \"\\u00B1\",\r\n \"plussim\": \"\\u2A26\",\r\n \"plustwo\": \"\\u2A27\",\r\n \"pm\": \"\\u00B1\",\r\n \"Poincareplane\": \"\\u210C\",\r\n \"pointint\": \"\\u2A15\",\r\n \"Popf\": \"\\u2119\",\r\n \"popf\": \"\\uD835\\uDD61\",\r\n \"pound\": \"\\u00A3\",\r\n \"Pr\": \"\\u2ABB\",\r\n \"pr\": \"\\u227A\",\r\n \"prap\": \"\\u2AB7\",\r\n \"prcue\": \"\\u227C\",\r\n \"prE\": \"\\u2AB3\",\r\n \"pre\": \"\\u2AAF\",\r\n \"prec\": \"\\u227A\",\r\n \"precapprox\": \"\\u2AB7\",\r\n \"preccurlyeq\": \"\\u227C\",\r\n \"Precedes\": \"\\u227A\",\r\n \"PrecedesEqual\": \"\\u2AAF\",\r\n \"PrecedesSlantEqual\": \"\\u227C\",\r\n \"PrecedesTilde\": \"\\u227E\",\r\n \"preceq\": \"\\u2AAF\",\r\n \"precnapprox\": \"\\u2AB9\",\r\n \"precneqq\": \"\\u2AB5\",\r\n \"precnsim\": \"\\u22E8\",\r\n \"precsim\": \"\\u227E\",\r\n \"Prime\": \"\\u2033\",\r\n \"prime\": \"\\u2032\",\r\n \"primes\": \"\\u2119\",\r\n \"prnap\": \"\\u2AB9\",\r\n \"prnE\": \"\\u2AB5\",\r\n \"prnsim\": \"\\u22E8\",\r\n \"prod\": \"\\u220F\",\r\n \"Product\": \"\\u220F\",\r\n \"profalar\": \"\\u232E\",\r\n \"profline\": \"\\u2312\",\r\n \"profsurf\": \"\\u2313\",\r\n \"prop\": \"\\u221D\",\r\n \"Proportion\": \"\\u2237\",\r\n \"Proportional\": \"\\u221D\",\r\n \"propto\": \"\\u221D\",\r\n \"prsim\": \"\\u227E\",\r\n \"prurel\": \"\\u22B0\",\r\n \"Pscr\": \"\\uD835\\uDCAB\",\r\n \"pscr\": \"\\uD835\\uDCC5\",\r\n \"Psi\": \"\\u03A8\",\r\n \"psi\": \"\\u03C8\",\r\n \"puncsp\": \"\\u2008\",\r\n \"Qfr\": \"\\uD835\\uDD14\",\r\n \"qfr\": \"\\uD835\\uDD2E\",\r\n \"qint\": \"\\u2A0C\",\r\n \"Qopf\": \"\\u211A\",\r\n \"qopf\": \"\\uD835\\uDD62\",\r\n \"qprime\": \"\\u2057\",\r\n \"Qscr\": \"\\uD835\\uDCAC\",\r\n \"qscr\": \"\\uD835\\uDCC6\",\r\n \"quaternions\": \"\\u210D\",\r\n \"quatint\": \"\\u2A16\",\r\n \"quest\": \"\\u003F\",\r\n \"questeq\": \"\\u225F\",\r\n \"QUOT\": \"\\u0022\",\r\n \"quot\": \"\\u0022\",\r\n \"rAarr\": \"\\u21DB\",\r\n \"race\": \"\\u223D\\u0331\",\r\n \"Racute\": \"\\u0154\",\r\n \"racute\": \"\\u0155\",\r\n \"radic\": \"\\u221A\",\r\n \"raemptyv\": \"\\u29B3\",\r\n \"Rang\": \"\\u27EB\",\r\n \"rang\": \"\\u27E9\",\r\n \"rangd\": \"\\u2992\",\r\n \"range\": \"\\u29A5\",\r\n \"rangle\": \"\\u27E9\",\r\n \"raquo\": \"\\u00BB\",\r\n \"Rarr\": \"\\u21A0\",\r\n \"rArr\": \"\\u21D2\",\r\n \"rarr\": \"\\u2192\",\r\n \"rarrap\": \"\\u2975\",\r\n \"rarrb\": \"\\u21E5\",\r\n \"rarrbfs\": \"\\u2920\",\r\n \"rarrc\": \"\\u2933\",\r\n \"rarrfs\": \"\\u291E\",\r\n \"rarrhk\": \"\\u21AA\",\r\n \"rarrlp\": \"\\u21AC\",\r\n \"rarrpl\": \"\\u2945\",\r\n \"rarrsim\": \"\\u2974\",\r\n \"Rarrtl\": \"\\u2916\",\r\n \"rarrtl\": \"\\u21A3\",\r\n \"rarrw\": \"\\u219D\",\r\n \"rAtail\": \"\\u291C\",\r\n \"ratail\": \"\\u291A\",\r\n \"ratio\": \"\\u2236\",\r\n \"rationals\": \"\\u211A\",\r\n \"RBarr\": \"\\u2910\",\r\n \"rBarr\": \"\\u290F\",\r\n \"rbarr\": \"\\u290D\",\r\n \"rbbrk\": \"\\u2773\",\r\n \"rbrace\": \"\\u007D\",\r\n \"rbrack\": \"\\u005D\",\r\n \"rbrke\": \"\\u298C\",\r\n \"rbrksld\": \"\\u298E\",\r\n \"rbrkslu\": \"\\u2990\",\r\n \"Rcaron\": \"\\u0158\",\r\n \"rcaron\": \"\\u0159\",\r\n \"Rcedil\": \"\\u0156\",\r\n \"rcedil\": \"\\u0157\",\r\n \"rceil\": \"\\u2309\",\r\n \"rcub\": \"\\u007D\",\r\n \"Rcy\": \"\\u0420\",\r\n \"rcy\": \"\\u0440\",\r\n \"rdca\": \"\\u2937\",\r\n \"rdldhar\": \"\\u2969\",\r\n \"rdquo\": \"\\u201D\",\r\n \"rdquor\": \"\\u201D\",\r\n \"rdsh\": \"\\u21B3\",\r\n \"Re\": \"\\u211C\",\r\n \"real\": \"\\u211C\",\r\n \"realine\": \"\\u211B\",\r\n \"realpart\": \"\\u211C\",\r\n \"reals\": \"\\u211D\",\r\n \"rect\": \"\\u25AD\",\r\n \"REG\": \"\\u00AE\",\r\n \"reg\": \"\\u00AE\",\r\n \"ReverseElement\": \"\\u220B\",\r\n \"ReverseEquilibrium\": \"\\u21CB\",\r\n \"ReverseUpEquilibrium\": \"\\u296F\",\r\n \"rfisht\": \"\\u297D\",\r\n \"rfloor\": \"\\u230B\",\r\n \"Rfr\": \"\\u211C\",\r\n \"rfr\": \"\\uD835\\uDD2F\",\r\n \"rHar\": \"\\u2964\",\r\n \"rhard\": \"\\u21C1\",\r\n \"rharu\": \"\\u21C0\",\r\n \"rharul\": \"\\u296C\",\r\n \"Rho\": \"\\u03A1\",\r\n \"rho\": \"\\u03C1\",\r\n \"rhov\": \"\\u03F1\",\r\n \"RightAngleBracket\": \"\\u27E9\",\r\n \"RightArrow\": \"\\u2192\",\r\n \"Rightarrow\": \"\\u21D2\",\r\n \"rightarrow\": \"\\u2192\",\r\n \"RightArrowBar\": \"\\u21E5\",\r\n \"RightArrowLeftArrow\": \"\\u21C4\",\r\n \"rightarrowtail\": \"\\u21A3\",\r\n \"RightCeiling\": \"\\u2309\",\r\n \"RightDoubleBracket\": \"\\u27E7\",\r\n \"RightDownTeeVector\": \"\\u295D\",\r\n \"RightDownVector\": \"\\u21C2\",\r\n \"RightDownVectorBar\": \"\\u2955\",\r\n \"RightFloor\": \"\\u230B\",\r\n \"rightharpoondown\": \"\\u21C1\",\r\n \"rightharpoonup\": \"\\u21C0\",\r\n \"rightleftarrows\": \"\\u21C4\",\r\n \"rightleftharpoons\": \"\\u21CC\",\r\n \"rightrightarrows\": \"\\u21C9\",\r\n \"rightsquigarrow\": \"\\u219D\",\r\n \"RightTee\": \"\\u22A2\",\r\n \"RightTeeArrow\": \"\\u21A6\",\r\n \"RightTeeVector\": \"\\u295B\",\r\n \"rightthreetimes\": \"\\u22CC\",\r\n \"RightTriangle\": \"\\u22B3\",\r\n \"RightTriangleBar\": \"\\u29D0\",\r\n \"RightTriangleEqual\": \"\\u22B5\",\r\n \"RightUpDownVector\": \"\\u294F\",\r\n \"RightUpTeeVector\": \"\\u295C\",\r\n \"RightUpVector\": \"\\u21BE\",\r\n \"RightUpVectorBar\": \"\\u2954\",\r\n \"RightVector\": \"\\u21C0\",\r\n \"RightVectorBar\": \"\\u2953\",\r\n \"ring\": \"\\u02DA\",\r\n \"risingdotseq\": \"\\u2253\",\r\n \"rlarr\": \"\\u21C4\",\r\n \"rlhar\": \"\\u21CC\",\r\n \"rlm\": \"\\u200F\",\r\n \"rmoust\": \"\\u23B1\",\r\n \"rmoustache\": \"\\u23B1\",\r\n \"rnmid\": \"\\u2AEE\",\r\n \"roang\": \"\\u27ED\",\r\n \"roarr\": \"\\u21FE\",\r\n \"robrk\": \"\\u27E7\",\r\n \"ropar\": \"\\u2986\",\r\n \"Ropf\": \"\\u211D\",\r\n \"ropf\": \"\\uD835\\uDD63\",\r\n \"roplus\": \"\\u2A2E\",\r\n \"rotimes\": \"\\u2A35\",\r\n \"RoundImplies\": \"\\u2970\",\r\n \"rpar\": \"\\u0029\",\r\n \"rpargt\": \"\\u2994\",\r\n \"rppolint\": \"\\u2A12\",\r\n \"rrarr\": \"\\u21C9\",\r\n \"Rrightarrow\": \"\\u21DB\",\r\n \"rsaquo\": \"\\u203A\",\r\n \"Rscr\": \"\\u211B\",\r\n \"rscr\": \"\\uD835\\uDCC7\",\r\n \"Rsh\": \"\\u21B1\",\r\n \"rsh\": \"\\u21B1\",\r\n \"rsqb\": \"\\u005D\",\r\n \"rsquo\": \"\\u2019\",\r\n \"rsquor\": \"\\u2019\",\r\n \"rthree\": \"\\u22CC\",\r\n \"rtimes\": \"\\u22CA\",\r\n \"rtri\": \"\\u25B9\",\r\n \"rtrie\": \"\\u22B5\",\r\n \"rtrif\": \"\\u25B8\",\r\n \"rtriltri\": \"\\u29CE\",\r\n \"RuleDelayed\": \"\\u29F4\",\r\n \"ruluhar\": \"\\u2968\",\r\n \"rx\": \"\\u211E\",\r\n \"Sacute\": \"\\u015A\",\r\n \"sacute\": \"\\u015B\",\r\n \"sbquo\": \"\\u201A\",\r\n \"Sc\": \"\\u2ABC\",\r\n \"sc\": \"\\u227B\",\r\n \"scap\": \"\\u2AB8\",\r\n \"Scaron\": \"\\u0160\",\r\n \"scaron\": \"\\u0161\",\r\n \"sccue\": \"\\u227D\",\r\n \"scE\": \"\\u2AB4\",\r\n \"sce\": \"\\u2AB0\",\r\n \"Scedil\": \"\\u015E\",\r\n \"scedil\": \"\\u015F\",\r\n \"Scirc\": \"\\u015C\",\r\n \"scirc\": \"\\u015D\",\r\n \"scnap\": \"\\u2ABA\",\r\n \"scnE\": \"\\u2AB6\",\r\n \"scnsim\": \"\\u22E9\",\r\n \"scpolint\": \"\\u2A13\",\r\n \"scsim\": \"\\u227F\",\r\n \"Scy\": \"\\u0421\",\r\n \"scy\": \"\\u0441\",\r\n \"sdot\": \"\\u22C5\",\r\n \"sdotb\": \"\\u22A1\",\r\n \"sdote\": \"\\u2A66\",\r\n \"searhk\": \"\\u2925\",\r\n \"seArr\": \"\\u21D8\",\r\n \"searr\": \"\\u2198\",\r\n \"searrow\": \"\\u2198\",\r\n \"sect\": \"\\u00A7\",\r\n \"semi\": \"\\u003B\",\r\n \"seswar\": \"\\u2929\",\r\n \"setminus\": \"\\u2216\",\r\n \"setmn\": \"\\u2216\",\r\n \"sext\": \"\\u2736\",\r\n \"Sfr\": \"\\uD835\\uDD16\",\r\n \"sfr\": \"\\uD835\\uDD30\",\r\n \"sfrown\": \"\\u2322\",\r\n \"sharp\": \"\\u266F\",\r\n \"SHCHcy\": \"\\u0429\",\r\n \"shchcy\": \"\\u0449\",\r\n \"SHcy\": \"\\u0428\",\r\n \"shcy\": \"\\u0448\",\r\n \"ShortDownArrow\": \"\\u2193\",\r\n \"ShortLeftArrow\": \"\\u2190\",\r\n \"shortmid\": \"\\u2223\",\r\n \"shortparallel\": \"\\u2225\",\r\n \"ShortRightArrow\": \"\\u2192\",\r\n \"ShortUpArrow\": \"\\u2191\",\r\n \"shy\": \"\\u00AD\",\r\n \"Sigma\": \"\\u03A3\",\r\n \"sigma\": \"\\u03C3\",\r\n \"sigmaf\": \"\\u03C2\",\r\n \"sigmav\": \"\\u03C2\",\r\n \"sim\": \"\\u223C\",\r\n \"simdot\": \"\\u2A6A\",\r\n \"sime\": \"\\u2243\",\r\n \"simeq\": \"\\u2243\",\r\n \"simg\": \"\\u2A9E\",\r\n \"simgE\": \"\\u2AA0\",\r\n \"siml\": \"\\u2A9D\",\r\n \"simlE\": \"\\u2A9F\",\r\n \"simne\": \"\\u2246\",\r\n \"simplus\": \"\\u2A24\",\r\n \"simrarr\": \"\\u2972\",\r\n \"slarr\": \"\\u2190\",\r\n \"SmallCircle\": \"\\u2218\",\r\n \"smallsetminus\": \"\\u2216\",\r\n \"smashp\": \"\\u2A33\",\r\n \"smeparsl\": \"\\u29E4\",\r\n \"smid\": \"\\u2223\",\r\n \"smile\": \"\\u2323\",\r\n \"smt\": \"\\u2AAA\",\r\n \"smte\": \"\\u2AAC\",\r\n \"smtes\": \"\\u2AAC\\uFE00\",\r\n \"SOFTcy\": \"\\u042C\",\r\n \"softcy\": \"\\u044C\",\r\n \"sol\": \"\\u002F\",\r\n \"solb\": \"\\u29C4\",\r\n \"solbar\": \"\\u233F\",\r\n \"Sopf\": \"\\uD835\\uDD4A\",\r\n \"sopf\": \"\\uD835\\uDD64\",\r\n \"spades\": \"\\u2660\",\r\n \"spadesuit\": \"\\u2660\",\r\n \"spar\": \"\\u2225\",\r\n \"sqcap\": \"\\u2293\",\r\n \"sqcaps\": \"\\u2293\\uFE00\",\r\n \"sqcup\": \"\\u2294\",\r\n \"sqcups\": \"\\u2294\\uFE00\",\r\n \"Sqrt\": \"\\u221A\",\r\n \"sqsub\": \"\\u228F\",\r\n \"sqsube\": \"\\u2291\",\r\n \"sqsubset\": \"\\u228F\",\r\n \"sqsubseteq\": \"\\u2291\",\r\n \"sqsup\": \"\\u2290\",\r\n \"sqsupe\": \"\\u2292\",\r\n \"sqsupset\": \"\\u2290\",\r\n \"sqsupseteq\": \"\\u2292\",\r\n \"squ\": \"\\u25A1\",\r\n \"Square\": \"\\u25A1\",\r\n \"square\": \"\\u25A1\",\r\n \"SquareIntersection\": \"\\u2293\",\r\n \"SquareSubset\": \"\\u228F\",\r\n \"SquareSubsetEqual\": \"\\u2291\",\r\n \"SquareSuperset\": \"\\u2290\",\r\n \"SquareSupersetEqual\": \"\\u2292\",\r\n \"SquareUnion\": \"\\u2294\",\r\n \"squarf\": \"\\u25AA\",\r\n \"squf\": \"\\u25AA\",\r\n \"srarr\": \"\\u2192\",\r\n \"Sscr\": \"\\uD835\\uDCAE\",\r\n \"sscr\": \"\\uD835\\uDCC8\",\r\n \"ssetmn\": \"\\u2216\",\r\n \"ssmile\": \"\\u2323\",\r\n \"sstarf\": \"\\u22C6\",\r\n \"Star\": \"\\u22C6\",\r\n \"star\": \"\\u2606\",\r\n \"starf\": \"\\u2605\",\r\n \"straightepsilon\": \"\\u03F5\",\r\n \"straightphi\": \"\\u03D5\",\r\n \"strns\": \"\\u00AF\",\r\n \"Sub\": \"\\u22D0\",\r\n \"sub\": \"\\u2282\",\r\n \"subdot\": \"\\u2ABD\",\r\n \"subE\": \"\\u2AC5\",\r\n \"sube\": \"\\u2286\",\r\n \"subedot\": \"\\u2AC3\",\r\n \"submult\": \"\\u2AC1\",\r\n \"subnE\": \"\\u2ACB\",\r\n \"subne\": \"\\u228A\",\r\n \"subplus\": \"\\u2ABF\",\r\n \"subrarr\": \"\\u2979\",\r\n \"Subset\": \"\\u22D0\",\r\n \"subset\": \"\\u2282\",\r\n \"subseteq\": \"\\u2286\",\r\n \"subseteqq\": \"\\u2AC5\",\r\n \"SubsetEqual\": \"\\u2286\",\r\n \"subsetneq\": \"\\u228A\",\r\n \"subsetneqq\": \"\\u2ACB\",\r\n \"subsim\": \"\\u2AC7\",\r\n \"subsub\": \"\\u2AD5\",\r\n \"subsup\": \"\\u2AD3\",\r\n \"succ\": \"\\u227B\",\r\n \"succapprox\": \"\\u2AB8\",\r\n \"succcurlyeq\": \"\\u227D\",\r\n \"Succeeds\": \"\\u227B\",\r\n \"SucceedsEqual\": \"\\u2AB0\",\r\n \"SucceedsSlantEqual\": \"\\u227D\",\r\n \"SucceedsTilde\": \"\\u227F\",\r\n \"succeq\": \"\\u2AB0\",\r\n \"succnapprox\": \"\\u2ABA\",\r\n \"succneqq\": \"\\u2AB6\",\r\n \"succnsim\": \"\\u22E9\",\r\n \"succsim\": \"\\u227F\",\r\n \"SuchThat\": \"\\u220B\",\r\n \"Sum\": \"\\u2211\",\r\n \"sum\": \"\\u2211\",\r\n \"sung\": \"\\u266A\",\r\n \"Sup\": \"\\u22D1\",\r\n \"sup\": \"\\u2283\",\r\n \"sup1\": \"\\u00B9\",\r\n \"sup2\": \"\\u00B2\",\r\n \"sup3\": \"\\u00B3\",\r\n \"supdot\": \"\\u2ABE\",\r\n \"supdsub\": \"\\u2AD8\",\r\n \"supE\": \"\\u2AC6\",\r\n \"supe\": \"\\u2287\",\r\n \"supedot\": \"\\u2AC4\",\r\n \"Superset\": \"\\u2283\",\r\n \"SupersetEqual\": \"\\u2287\",\r\n \"suphsol\": \"\\u27C9\",\r\n \"suphsub\": \"\\u2AD7\",\r\n \"suplarr\": \"\\u297B\",\r\n \"supmult\": \"\\u2AC2\",\r\n \"supnE\": \"\\u2ACC\",\r\n \"supne\": \"\\u228B\",\r\n \"supplus\": \"\\u2AC0\",\r\n \"Supset\": \"\\u22D1\",\r\n \"supset\": \"\\u2283\",\r\n \"supseteq\": \"\\u2287\",\r\n \"supseteqq\": \"\\u2AC6\",\r\n \"supsetneq\": \"\\u228B\",\r\n \"supsetneqq\": \"\\u2ACC\",\r\n \"supsim\": \"\\u2AC8\",\r\n \"supsub\": \"\\u2AD4\",\r\n \"supsup\": \"\\u2AD6\",\r\n \"swarhk\": \"\\u2926\",\r\n \"swArr\": \"\\u21D9\",\r\n \"swarr\": \"\\u2199\",\r\n \"swarrow\": \"\\u2199\",\r\n \"swnwar\": \"\\u292A\",\r\n \"szlig\": \"\\u00DF\",\r\n \"Tab\": \"\\u0009\",\r\n \"target\": \"\\u2316\",\r\n \"Tau\": \"\\u03A4\",\r\n \"tau\": \"\\u03C4\",\r\n \"tbrk\": \"\\u23B4\",\r\n \"Tcaron\": \"\\u0164\",\r\n \"tcaron\": \"\\u0165\",\r\n \"Tcedil\": \"\\u0162\",\r\n \"tcedil\": \"\\u0163\",\r\n \"Tcy\": \"\\u0422\",\r\n \"tcy\": \"\\u0442\",\r\n \"tdot\": \"\\u20DB\",\r\n \"telrec\": \"\\u2315\",\r\n \"Tfr\": \"\\uD835\\uDD17\",\r\n \"tfr\": \"\\uD835\\uDD31\",\r\n \"there4\": \"\\u2234\",\r\n \"Therefore\": \"\\u2234\",\r\n \"therefore\": \"\\u2234\",\r\n \"Theta\": \"\\u0398\",\r\n \"theta\": \"\\u03B8\",\r\n \"thetasym\": \"\\u03D1\",\r\n \"thetav\": \"\\u03D1\",\r\n \"thickapprox\": \"\\u2248\",\r\n \"thicksim\": \"\\u223C\",\r\n \"ThickSpace\": \"\\u205F\\u200A\",\r\n \"thinsp\": \"\\u2009\",\r\n \"ThinSpace\": \"\\u2009\",\r\n \"thkap\": \"\\u2248\",\r\n \"thksim\": \"\\u223C\",\r\n \"THORN\": \"\\u00DE\",\r\n \"thorn\": \"\\u00FE\",\r\n \"Tilde\": \"\\u223C\",\r\n \"tilde\": \"\\u02DC\",\r\n \"TildeEqual\": \"\\u2243\",\r\n \"TildeFullEqual\": \"\\u2245\",\r\n \"TildeTilde\": \"\\u2248\",\r\n \"times\": \"\\u00D7\",\r\n \"timesb\": \"\\u22A0\",\r\n \"timesbar\": \"\\u2A31\",\r\n \"timesd\": \"\\u2A30\",\r\n \"tint\": \"\\u222D\",\r\n \"toea\": \"\\u2928\",\r\n \"top\": \"\\u22A4\",\r\n \"topbot\": \"\\u2336\",\r\n \"topcir\": \"\\u2AF1\",\r\n \"Topf\": \"\\uD835\\uDD4B\",\r\n \"topf\": \"\\uD835\\uDD65\",\r\n \"topfork\": \"\\u2ADA\",\r\n \"tosa\": \"\\u2929\",\r\n \"tprime\": \"\\u2034\",\r\n \"TRADE\": \"\\u2122\",\r\n \"trade\": \"\\u2122\",\r\n \"triangle\": \"\\u25B5\",\r\n \"triangledown\": \"\\u25BF\",\r\n \"triangleleft\": \"\\u25C3\",\r\n \"trianglelefteq\": \"\\u22B4\",\r\n \"triangleq\": \"\\u225C\",\r\n \"triangleright\": \"\\u25B9\",\r\n \"trianglerighteq\": \"\\u22B5\",\r\n \"tridot\": \"\\u25EC\",\r\n \"trie\": \"\\u225C\",\r\n \"triminus\": \"\\u2A3A\",\r\n \"TripleDot\": \"\\u20DB\",\r\n \"triplus\": \"\\u2A39\",\r\n \"trisb\": \"\\u29CD\",\r\n \"tritime\": \"\\u2A3B\",\r\n \"trpezium\": \"\\u23E2\",\r\n \"Tscr\": \"\\uD835\\uDCAF\",\r\n \"tscr\": \"\\uD835\\uDCC9\",\r\n \"TScy\": \"\\u0426\",\r\n \"tscy\": \"\\u0446\",\r\n \"TSHcy\": \"\\u040B\",\r\n \"tshcy\": \"\\u045B\",\r\n \"Tstrok\": \"\\u0166\",\r\n \"tstrok\": \"\\u0167\",\r\n \"twixt\": \"\\u226C\",\r\n \"twoheadleftarrow\": \"\\u219E\",\r\n \"twoheadrightarrow\": \"\\u21A0\",\r\n \"Uacute\": \"\\u00DA\",\r\n \"uacute\": \"\\u00FA\",\r\n \"Uarr\": \"\\u219F\",\r\n \"uArr\": \"\\u21D1\",\r\n \"uarr\": \"\\u2191\",\r\n \"Uarrocir\": \"\\u2949\",\r\n \"Ubrcy\": \"\\u040E\",\r\n \"ubrcy\": \"\\u045E\",\r\n \"Ubreve\": \"\\u016C\",\r\n \"ubreve\": \"\\u016D\",\r\n \"Ucirc\": \"\\u00DB\",\r\n \"ucirc\": \"\\u00FB\",\r\n \"Ucy\": \"\\u0423\",\r\n \"ucy\": \"\\u0443\",\r\n \"udarr\": \"\\u21C5\",\r\n \"Udblac\": \"\\u0170\",\r\n \"udblac\": \"\\u0171\",\r\n \"udhar\": \"\\u296E\",\r\n \"ufisht\": \"\\u297E\",\r\n \"Ufr\": \"\\uD835\\uDD18\",\r\n \"ufr\": \"\\uD835\\uDD32\",\r\n \"Ugrave\": \"\\u00D9\",\r\n \"ugrave\": \"\\u00F9\",\r\n \"uHar\": \"\\u2963\",\r\n \"uharl\": \"\\u21BF\",\r\n \"uharr\": \"\\u21BE\",\r\n \"uhblk\": \"\\u2580\",\r\n \"ulcorn\": \"\\u231C\",\r\n \"ulcorner\": \"\\u231C\",\r\n \"ulcrop\": \"\\u230F\",\r\n \"ultri\": \"\\u25F8\",\r\n \"Umacr\": \"\\u016A\",\r\n \"umacr\": \"\\u016B\",\r\n \"uml\": \"\\u00A8\",\r\n \"UnderBar\": \"\\u005F\",\r\n \"UnderBrace\": \"\\u23DF\",\r\n \"UnderBracket\": \"\\u23B5\",\r\n \"UnderParenthesis\": \"\\u23DD\",\r\n \"Union\": \"\\u22C3\",\r\n \"UnionPlus\": \"\\u228E\",\r\n \"Uogon\": \"\\u0172\",\r\n \"uogon\": \"\\u0173\",\r\n \"Uopf\": \"\\uD835\\uDD4C\",\r\n \"uopf\": \"\\uD835\\uDD66\",\r\n \"UpArrow\": \"\\u2191\",\r\n \"Uparrow\": \"\\u21D1\",\r\n \"uparrow\": \"\\u2191\",\r\n \"UpArrowBar\": \"\\u2912\",\r\n \"UpArrowDownArrow\": \"\\u21C5\",\r\n \"UpDownArrow\": \"\\u2195\",\r\n \"Updownarrow\": \"\\u21D5\",\r\n \"updownarrow\": \"\\u2195\",\r\n \"UpEquilibrium\": \"\\u296E\",\r\n \"upharpoonleft\": \"\\u21BF\",\r\n \"upharpoonright\": \"\\u21BE\",\r\n \"uplus\": \"\\u228E\",\r\n \"UpperLeftArrow\": \"\\u2196\",\r\n \"UpperRightArrow\": \"\\u2197\",\r\n \"Upsi\": \"\\u03D2\",\r\n \"upsi\": \"\\u03C5\",\r\n \"upsih\": \"\\u03D2\",\r\n \"Upsilon\": \"\\u03A5\",\r\n \"upsilon\": \"\\u03C5\",\r\n \"UpTee\": \"\\u22A5\",\r\n \"UpTeeArrow\": \"\\u21A5\",\r\n \"upuparrows\": \"\\u21C8\",\r\n \"urcorn\": \"\\u231D\",\r\n \"urcorner\": \"\\u231D\",\r\n \"urcrop\": \"\\u230E\",\r\n \"Uring\": \"\\u016E\",\r\n \"uring\": \"\\u016F\",\r\n \"urtri\": \"\\u25F9\",\r\n \"Uscr\": \"\\uD835\\uDCB0\",\r\n \"uscr\": \"\\uD835\\uDCCA\",\r\n \"utdot\": \"\\u22F0\",\r\n \"Utilde\": \"\\u0168\",\r\n \"utilde\": \"\\u0169\",\r\n \"utri\": \"\\u25B5\",\r\n \"utrif\": \"\\u25B4\",\r\n \"uuarr\": \"\\u21C8\",\r\n \"Uuml\": \"\\u00DC\",\r\n \"uuml\": \"\\u00FC\",\r\n \"uwangle\": \"\\u29A7\",\r\n \"vangrt\": \"\\u299C\",\r\n \"varepsilon\": \"\\u03F5\",\r\n \"varkappa\": \"\\u03F0\",\r\n \"varnothing\": \"\\u2205\",\r\n \"varphi\": \"\\u03D5\",\r\n \"varpi\": \"\\u03D6\",\r\n \"varpropto\": \"\\u221D\",\r\n \"vArr\": \"\\u21D5\",\r\n \"varr\": \"\\u2195\",\r\n \"varrho\": \"\\u03F1\",\r\n \"varsigma\": \"\\u03C2\",\r\n \"varsubsetneq\": \"\\u228A\\uFE00\",\r\n \"varsubsetneqq\": \"\\u2ACB\\uFE00\",\r\n \"varsupsetneq\": \"\\u228B\\uFE00\",\r\n \"varsupsetneqq\": \"\\u2ACC\\uFE00\",\r\n \"vartheta\": \"\\u03D1\",\r\n \"vartriangleleft\": \"\\u22B2\",\r\n \"vartriangleright\": \"\\u22B3\",\r\n \"Vbar\": \"\\u2AEB\",\r\n \"vBar\": \"\\u2AE8\",\r\n \"vBarv\": \"\\u2AE9\",\r\n \"Vcy\": \"\\u0412\",\r\n \"vcy\": \"\\u0432\",\r\n \"VDash\": \"\\u22AB\",\r\n \"Vdash\": \"\\u22A9\",\r\n \"vDash\": \"\\u22A8\",\r\n \"vdash\": \"\\u22A2\",\r\n \"Vdashl\": \"\\u2AE6\",\r\n \"Vee\": \"\\u22C1\",\r\n \"vee\": \"\\u2228\",\r\n \"veebar\": \"\\u22BB\",\r\n \"veeeq\": \"\\u225A\",\r\n \"vellip\": \"\\u22EE\",\r\n \"Verbar\": \"\\u2016\",\r\n \"verbar\": \"\\u007C\",\r\n \"Vert\": \"\\u2016\",\r\n \"vert\": \"\\u007C\",\r\n \"VerticalBar\": \"\\u2223\",\r\n \"VerticalLine\": \"\\u007C\",\r\n \"VerticalSeparator\": \"\\u2758\",\r\n \"VerticalTilde\": \"\\u2240\",\r\n \"VeryThinSpace\": \"\\u200A\",\r\n \"Vfr\": \"\\uD835\\uDD19\",\r\n \"vfr\": \"\\uD835\\uDD33\",\r\n \"vltri\": \"\\u22B2\",\r\n \"vnsub\": \"\\u2282\\u20D2\",\r\n \"vnsup\": \"\\u2283\\u20D2\",\r\n \"Vopf\": \"\\uD835\\uDD4D\",\r\n \"vopf\": \"\\uD835\\uDD67\",\r\n \"vprop\": \"\\u221D\",\r\n \"vrtri\": \"\\u22B3\",\r\n \"Vscr\": \"\\uD835\\uDCB1\",\r\n \"vscr\": \"\\uD835\\uDCCB\",\r\n \"vsubnE\": \"\\u2ACB\\uFE00\",\r\n \"vsubne\": \"\\u228A\\uFE00\",\r\n \"vsupnE\": \"\\u2ACC\\uFE00\",\r\n \"vsupne\": \"\\u228B\\uFE00\",\r\n \"Vvdash\": \"\\u22AA\",\r\n \"vzigzag\": \"\\u299A\",\r\n \"Wcirc\": \"\\u0174\",\r\n \"wcirc\": \"\\u0175\",\r\n \"wedbar\": \"\\u2A5F\",\r\n \"Wedge\": \"\\u22C0\",\r\n \"wedge\": \"\\u2227\",\r\n \"wedgeq\": \"\\u2259\",\r\n \"weierp\": \"\\u2118\",\r\n \"Wfr\": \"\\uD835\\uDD1A\",\r\n \"wfr\": \"\\uD835\\uDD34\",\r\n \"Wopf\": \"\\uD835\\uDD4E\",\r\n \"wopf\": \"\\uD835\\uDD68\",\r\n \"wp\": \"\\u2118\",\r\n \"wr\": \"\\u2240\",\r\n \"wreath\": \"\\u2240\",\r\n \"Wscr\": \"\\uD835\\uDCB2\",\r\n \"wscr\": \"\\uD835\\uDCCC\",\r\n \"xcap\": \"\\u22C2\",\r\n \"xcirc\": \"\\u25EF\",\r\n \"xcup\": \"\\u22C3\",\r\n \"xdtri\": \"\\u25BD\",\r\n \"Xfr\": \"\\uD835\\uDD1B\",\r\n \"xfr\": \"\\uD835\\uDD35\",\r\n \"xhArr\": \"\\u27FA\",\r\n \"xharr\": \"\\u27F7\",\r\n \"Xi\": \"\\u039E\",\r\n \"xi\": \"\\u03BE\",\r\n \"xlArr\": \"\\u27F8\",\r\n \"xlarr\": \"\\u27F5\",\r\n \"xmap\": \"\\u27FC\",\r\n \"xnis\": \"\\u22FB\",\r\n \"xodot\": \"\\u2A00\",\r\n \"Xopf\": \"\\uD835\\uDD4F\",\r\n \"xopf\": \"\\uD835\\uDD69\",\r\n \"xoplus\": \"\\u2A01\",\r\n \"xotime\": \"\\u2A02\",\r\n \"xrArr\": \"\\u27F9\",\r\n \"xrarr\": \"\\u27F6\",\r\n \"Xscr\": \"\\uD835\\uDCB3\",\r\n \"xscr\": \"\\uD835\\uDCCD\",\r\n \"xsqcup\": \"\\u2A06\",\r\n \"xuplus\": \"\\u2A04\",\r\n \"xutri\": \"\\u25B3\",\r\n \"xvee\": \"\\u22C1\",\r\n \"xwedge\": \"\\u22C0\",\r\n \"Yacute\": \"\\u00DD\",\r\n \"yacute\": \"\\u00FD\",\r\n \"YAcy\": \"\\u042F\",\r\n \"yacy\": \"\\u044F\",\r\n \"Ycirc\": \"\\u0176\",\r\n \"ycirc\": \"\\u0177\",\r\n \"Ycy\": \"\\u042B\",\r\n \"ycy\": \"\\u044B\",\r\n \"yen\": \"\\u00A5\",\r\n \"Yfr\": \"\\uD835\\uDD1C\",\r\n \"yfr\": \"\\uD835\\uDD36\",\r\n \"YIcy\": \"\\u0407\",\r\n \"yicy\": \"\\u0457\",\r\n \"Yopf\": \"\\uD835\\uDD50\",\r\n \"yopf\": \"\\uD835\\uDD6A\",\r\n \"Yscr\": \"\\uD835\\uDCB4\",\r\n \"yscr\": \"\\uD835\\uDCCE\",\r\n \"YUcy\": \"\\u042E\",\r\n \"yucy\": \"\\u044E\",\r\n \"Yuml\": \"\\u0178\",\r\n \"yuml\": \"\\u00FF\",\r\n \"Zacute\": \"\\u0179\",\r\n \"zacute\": \"\\u017A\",\r\n \"Zcaron\": \"\\u017D\",\r\n \"zcaron\": \"\\u017E\",\r\n \"Zcy\": \"\\u0417\",\r\n \"zcy\": \"\\u0437\",\r\n \"Zdot\": \"\\u017B\",\r\n \"zdot\": \"\\u017C\",\r\n \"zeetrf\": \"\\u2128\",\r\n \"ZeroWidthSpace\": \"\\u200B\",\r\n \"Zeta\": \"\\u0396\",\r\n \"zeta\": \"\\u03B6\",\r\n \"Zfr\": \"\\u2128\",\r\n \"zfr\": \"\\uD835\\uDD37\",\r\n \"ZHcy\": \"\\u0416\",\r\n \"zhcy\": \"\\u0436\",\r\n \"zigrarr\": \"\\u21DD\",\r\n \"Zopf\": \"\\u2124\",\r\n \"zopf\": \"\\uD835\\uDD6B\",\r\n \"Zscr\": \"\\uD835\\uDCB5\",\r\n \"zscr\": \"\\uD835\\uDCCF\",\r\n \"zwj\": \"\\u200D\",\r\n \"zwnj\": \"\\u200C\"\r\n };\r\n\r\n }, {}], 129: [function (require, module, exports) {\r\n // List of valid html blocks names, accorting to commonmark spec\r\n // http://jgm.github.io/CommonMark/spec.html#html-blocks\r\n\r\n 'use strict';\r\n\r\n var html_blocks = {};\r\n\r\n [\r\n 'article',\r\n 'aside',\r\n 'button',\r\n 'blockquote',\r\n 'body',\r\n 'canvas',\r\n 'caption',\r\n 'col',\r\n 'colgroup',\r\n 'dd',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'iframe',\r\n 'li',\r\n 'map',\r\n 'object',\r\n 'ol',\r\n 'output',\r\n 'p',\r\n 'pre',\r\n 'progress',\r\n 'script',\r\n 'section',\r\n 'style',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'tr',\r\n 'thead',\r\n 'ul',\r\n 'video'\r\n ].forEach(function (name) { html_blocks[name] = true; });\r\n\r\n\r\n module.exports = html_blocks;\r\n\r\n }, {}], 130: [function (require, module, exports) {\r\n // Regexps to match html elements\r\n\r\n 'use strict';\r\n\r\n\r\n function replace(regex, options) {\r\n regex = regex.source;\r\n options = options || '';\r\n\r\n return function self(name, val) {\r\n if (!name) {\r\n return new RegExp(regex, options);\r\n }\r\n val = val.source || val;\r\n regex = regex.replace(name, val);\r\n return self;\r\n };\r\n }\r\n\r\n\r\n var attr_name = /[a-zA-Z_:][a-zA-Z0-9:._-]*/;\r\n\r\n var unquoted = /[^\"'=<>`\\x00-\\x20]+/;\r\n var single_quoted = /'[^']*'/;\r\n var double_quoted = /\"[^\"]*\"/;\r\n\r\n /*eslint no-spaced-func:0*/\r\n var attr_value = replace(/(?:unquoted|single_quoted|double_quoted)/)\r\n ('unquoted', unquoted)\r\n ('single_quoted', single_quoted)\r\n ('double_quoted', double_quoted)\r\n ();\r\n\r\n var attribute = replace(/(?:\\s+attr_name(?:\\s*=\\s*attr_value)?)/)\r\n ('attr_name', attr_name)\r\n ('attr_value', attr_value)\r\n ();\r\n\r\n var open_tag = replace(/<[A-Za-z][A-Za-z0-9]*attribute*\\s*\\/?>/)\r\n ('attribute', attribute)\r\n ();\r\n\r\n var close_tag = /<\\/[A-Za-z][A-Za-z0-9]*\\s*>/;\r\n var comment = //;\r\n var processing = /<[?].*?[?]>/;\r\n var declaration = /]*>/;\r\n var cdata = /])*\\]\\]>/;\r\n\r\n var HTML_TAG_RE = replace(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)\r\n ('open_tag', open_tag)\r\n ('close_tag', close_tag)\r\n ('comment', comment)\r\n ('processing', processing)\r\n ('declaration', declaration)\r\n ('cdata', cdata)\r\n ();\r\n\r\n\r\n module.exports.HTML_TAG_RE = HTML_TAG_RE;\r\n\r\n }, {}], 131: [function (require, module, exports) {\r\n // List of valid url schemas, accorting to commonmark spec\r\n // http://jgm.github.io/CommonMark/spec.html#autolinks\r\n\r\n 'use strict';\r\n\r\n\r\n module.exports = [\r\n 'coap',\r\n 'doi',\r\n 'javascript',\r\n 'aaa',\r\n 'aaas',\r\n 'about',\r\n 'acap',\r\n 'cap',\r\n 'cid',\r\n 'crid',\r\n 'data',\r\n 'dav',\r\n 'dict',\r\n 'dns',\r\n 'file',\r\n 'ftp',\r\n 'geo',\r\n 'go',\r\n 'gopher',\r\n 'h323',\r\n 'http',\r\n 'https',\r\n 'iax',\r\n 'icap',\r\n 'im',\r\n 'imap',\r\n 'info',\r\n 'ipp',\r\n 'iris',\r\n 'iris.beep',\r\n 'iris.xpc',\r\n 'iris.xpcs',\r\n 'iris.lwz',\r\n 'ldap',\r\n 'mailto',\r\n 'mid',\r\n 'msrp',\r\n 'msrps',\r\n 'mtqp',\r\n 'mupdate',\r\n 'news',\r\n 'nfs',\r\n 'ni',\r\n 'nih',\r\n 'nntp',\r\n 'opaquelocktoken',\r\n 'pop',\r\n 'pres',\r\n 'rtsp',\r\n 'service',\r\n 'session',\r\n 'shttp',\r\n 'sieve',\r\n 'sip',\r\n 'sips',\r\n 'sms',\r\n 'snmp',\r\n 'soap.beep',\r\n 'soap.beeps',\r\n 'tag',\r\n 'tel',\r\n 'telnet',\r\n 'tftp',\r\n 'thismessage',\r\n 'tn3270',\r\n 'tip',\r\n 'tv',\r\n 'urn',\r\n 'vemmi',\r\n 'ws',\r\n 'wss',\r\n 'xcon',\r\n 'xcon-userid',\r\n 'xmlrpc.beep',\r\n 'xmlrpc.beeps',\r\n 'xmpp',\r\n 'z39.50r',\r\n 'z39.50s',\r\n 'adiumxtra',\r\n 'afp',\r\n 'afs',\r\n 'aim',\r\n 'apt',\r\n 'attachment',\r\n 'aw',\r\n 'beshare',\r\n 'bitcoin',\r\n 'bolo',\r\n 'callto',\r\n 'chrome',\r\n 'chrome-extension',\r\n 'com-eventbrite-attendee',\r\n 'content',\r\n 'cvs',\r\n 'dlna-playsingle',\r\n 'dlna-playcontainer',\r\n 'dtn',\r\n 'dvb',\r\n 'ed2k',\r\n 'facetime',\r\n 'feed',\r\n 'finger',\r\n 'fish',\r\n 'gg',\r\n 'git',\r\n 'gizmoproject',\r\n 'gtalk',\r\n 'hcp',\r\n 'icon',\r\n 'ipn',\r\n 'irc',\r\n 'irc6',\r\n 'ircs',\r\n 'itms',\r\n 'jar',\r\n 'jms',\r\n 'keyparc',\r\n 'lastfm',\r\n 'ldaps',\r\n 'magnet',\r\n 'maps',\r\n 'market',\r\n 'message',\r\n 'mms',\r\n 'ms-help',\r\n 'msnim',\r\n 'mumble',\r\n 'mvn',\r\n 'notes',\r\n 'oid',\r\n 'palm',\r\n 'paparazzi',\r\n 'platform',\r\n 'proxy',\r\n 'psyc',\r\n 'query',\r\n 'res',\r\n 'resource',\r\n 'rmi',\r\n 'rsync',\r\n 'rtmp',\r\n 'secondlife',\r\n 'sftp',\r\n 'sgn',\r\n 'skype',\r\n 'smb',\r\n 'soldat',\r\n 'spotify',\r\n 'ssh',\r\n 'steam',\r\n 'svn',\r\n 'teamspeak',\r\n 'things',\r\n 'udp',\r\n 'unreal',\r\n 'ut2004',\r\n 'ventrilo',\r\n 'view-source',\r\n 'webcal',\r\n 'wtai',\r\n 'wyciwyg',\r\n 'xfire',\r\n 'xri',\r\n 'ymsgr'\r\n ];\r\n\r\n }, {}], 132: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n /**\r\n * Utility functions\r\n */\r\n\r\n function typeOf(obj) {\r\n return Object.prototype.toString.call(obj);\r\n }\r\n\r\n function isString(obj) {\r\n return typeOf(obj) === '[object String]';\r\n }\r\n\r\n var hasOwn = Object.prototype.hasOwnProperty;\r\n\r\n function has(object, key) {\r\n return object\r\n ? hasOwn.call(object, key)\r\n : false;\r\n }\r\n\r\n // Extend objects\r\n //\r\n function assign(obj /*from1, from2, from3, ...*/) {\r\n var sources = [].slice.call(arguments, 1);\r\n\r\n sources.forEach(function (source) {\r\n if (!source) { return; }\r\n\r\n if (typeof source !== 'object') {\r\n throw new TypeError(source + 'must be object');\r\n }\r\n\r\n Object.keys(source).forEach(function (key) {\r\n obj[key] = source[key];\r\n });\r\n });\r\n\r\n return obj;\r\n }\r\n\r\n ////////////////////////////////////////////////////////////////////////////////\r\n\r\n var UNESCAPE_MD_RE = /\\\\([\\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;\r\n\r\n function unescapeMd(str) {\r\n if (str.indexOf('\\\\') < 0) { return str; }\r\n return str.replace(UNESCAPE_MD_RE, '$1');\r\n }\r\n\r\n ////////////////////////////////////////////////////////////////////////////////\r\n\r\n function isValidEntityCode(c) {\r\n /*eslint no-bitwise:0*/\r\n // broken sequence\r\n if (c >= 0xD800 && c <= 0xDFFF) { return false; }\r\n // never used\r\n if (c >= 0xFDD0 && c <= 0xFDEF) { return false; }\r\n if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false; }\r\n // control codes\r\n if (c >= 0x00 && c <= 0x08) { return false; }\r\n if (c === 0x0B) { return false; }\r\n if (c >= 0x0E && c <= 0x1F) { return false; }\r\n if (c >= 0x7F && c <= 0x9F) { return false; }\r\n // out of range\r\n if (c > 0x10FFFF) { return false; }\r\n return true;\r\n }\r\n\r\n function fromCodePoint(c) {\r\n /*eslint no-bitwise:0*/\r\n if (c > 0xffff) {\r\n c -= 0x10000;\r\n var surrogate1 = 0xd800 + (c >> 10),\r\n surrogate2 = 0xdc00 + (c & 0x3ff);\r\n\r\n return String.fromCharCode(surrogate1, surrogate2);\r\n }\r\n return String.fromCharCode(c);\r\n }\r\n\r\n var NAMED_ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi;\r\n var DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;\r\n var entities = require('./entities');\r\n\r\n function replaceEntityPattern(match, name) {\r\n var code = 0;\r\n\r\n if (has(entities, name)) {\r\n return entities[name];\r\n } else if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {\r\n code = name[1].toLowerCase() === 'x' ?\r\n parseInt(name.slice(2), 16)\r\n :\r\n parseInt(name.slice(1), 10);\r\n if (isValidEntityCode(code)) {\r\n return fromCodePoint(code);\r\n }\r\n }\r\n return match;\r\n }\r\n\r\n function replaceEntities(str) {\r\n if (str.indexOf('&') < 0) { return str; }\r\n\r\n return str.replace(NAMED_ENTITY_RE, replaceEntityPattern);\r\n }\r\n\r\n ////////////////////////////////////////////////////////////////////////////////\r\n\r\n var HTML_ESCAPE_TEST_RE = /[&<>\"]/;\r\n var HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g;\r\n var HTML_REPLACEMENTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '\"': '"'\r\n };\r\n\r\n function replaceUnsafeChar(ch) {\r\n return HTML_REPLACEMENTS[ch];\r\n }\r\n\r\n function escapeHtml(str) {\r\n if (HTML_ESCAPE_TEST_RE.test(str)) {\r\n return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar);\r\n }\r\n return str;\r\n }\r\n\r\n ////////////////////////////////////////////////////////////////////////////////\r\n\r\n exports.assign = assign;\r\n exports.isString = isString;\r\n exports.has = has;\r\n exports.unescapeMd = unescapeMd;\r\n exports.isValidEntityCode = isValidEntityCode;\r\n exports.fromCodePoint = fromCodePoint;\r\n exports.replaceEntities = replaceEntities;\r\n exports.escapeHtml = escapeHtml;\r\n\r\n }, { \"./entities\": 128 }], 133: [function (require, module, exports) {\r\n // Commonmark default options\r\n\r\n 'use strict';\r\n\r\n\r\n module.exports = {\r\n options: {\r\n html: true, // Enable HTML tags in source\r\n xhtmlOut: true, // Use '/' to close single tags (
      )\r\n breaks: false, // Convert '\\n' in paragraphs into
      \r\n langPrefix: 'language-', // CSS language prefix for fenced blocks\r\n linkify: false, // autoconvert URL-like texts to links\r\n linkTarget: '', // set target to open link in\r\n\r\n // Enable some language-neutral replacements + quotes beautification\r\n typographer: false,\r\n\r\n // Double + single quotes replacement pairs, when typographer enabled,\r\n // and smartquotes on. Set doubles to '«»' for Russian, '„“' for German.\r\n quotes: '“”‘’',\r\n\r\n // Highlighter function. Should return escaped HTML,\r\n // or '' if input not changed\r\n //\r\n // function (/*str, lang*/) { return ''; }\r\n //\r\n highlight: null,\r\n\r\n maxNesting: 20 // Internal protection, recursion limit\r\n },\r\n\r\n components: {\r\n\r\n core: {\r\n rules: [\r\n 'block',\r\n 'inline',\r\n 'references',\r\n 'abbr2'\r\n ]\r\n },\r\n\r\n block: {\r\n rules: [\r\n 'blockquote',\r\n 'code',\r\n 'fences',\r\n 'heading',\r\n 'hr',\r\n 'htmlblock',\r\n 'lheading',\r\n 'list',\r\n 'paragraph'\r\n ]\r\n },\r\n\r\n inline: {\r\n rules: [\r\n 'autolink',\r\n 'backticks',\r\n 'emphasis',\r\n 'entity',\r\n 'escape',\r\n 'htmltag',\r\n 'links',\r\n 'newline',\r\n 'text'\r\n ]\r\n }\r\n }\r\n };\r\n\r\n }, {}], 134: [function (require, module, exports) {\r\n // Remarkable default options\r\n\r\n 'use strict';\r\n\r\n\r\n module.exports = {\r\n options: {\r\n html: false, // Enable HTML tags in source\r\n xhtmlOut: false, // Use '/' to close single tags (
      )\r\n breaks: false, // Convert '\\n' in paragraphs into
      \r\n langPrefix: 'language-', // CSS language prefix for fenced blocks\r\n linkify: false, // autoconvert URL-like texts to links\r\n linkTarget: '', // set target to open link in\r\n\r\n // Enable some language-neutral replacements + quotes beautification\r\n typographer: false,\r\n\r\n // Double + single quotes replacement pairs, when typographer enabled,\r\n // and smartquotes on. Set doubles to '«»' for Russian, '„“' for German.\r\n quotes: '“”‘’',\r\n\r\n // Highlighter function. Should return escaped HTML,\r\n // or '' if input not changed\r\n //\r\n // function (/*str, lang*/) { return ''; }\r\n //\r\n highlight: null,\r\n\r\n maxNesting: 20 // Internal protection, recursion limit\r\n },\r\n\r\n components: {\r\n\r\n core: {\r\n rules: [\r\n 'block',\r\n 'inline',\r\n 'references',\r\n 'replacements',\r\n 'linkify',\r\n 'smartquotes',\r\n 'references',\r\n 'abbr2',\r\n 'footnote_tail'\r\n ]\r\n },\r\n\r\n block: {\r\n rules: [\r\n 'blockquote',\r\n 'code',\r\n 'fences',\r\n 'heading',\r\n 'hr',\r\n 'htmlblock',\r\n 'lheading',\r\n 'list',\r\n 'paragraph',\r\n 'table'\r\n ]\r\n },\r\n\r\n inline: {\r\n rules: [\r\n 'autolink',\r\n 'backticks',\r\n 'del',\r\n 'emphasis',\r\n 'entity',\r\n 'escape',\r\n 'footnote_ref',\r\n 'htmltag',\r\n 'links',\r\n 'newline',\r\n 'text'\r\n ]\r\n }\r\n }\r\n };\r\n\r\n }, {}], 135: [function (require, module, exports) {\r\n // Remarkable default options\r\n\r\n 'use strict';\r\n\r\n\r\n module.exports = {\r\n options: {\r\n html: false, // Enable HTML tags in source\r\n xhtmlOut: false, // Use '/' to close single tags (
      )\r\n breaks: false, // Convert '\\n' in paragraphs into
      \r\n langPrefix: 'language-', // CSS language prefix for fenced blocks\r\n linkify: false, // autoconvert URL-like texts to links\r\n linkTarget: '', // set target to open link in\r\n\r\n // Enable some language-neutral replacements + quotes beautification\r\n typographer: false,\r\n\r\n // Double + single quotes replacement pairs, when typographer enabled,\r\n // and smartquotes on. Set doubles to '«»' for Russian, '„“' for German.\r\n quotes: '“”‘’',\r\n\r\n // Highlighter function. Should return escaped HTML,\r\n // or '' if input not changed\r\n //\r\n // function (/*str, lang*/) { return ''; }\r\n //\r\n highlight: null,\r\n\r\n maxNesting: 20 // Internal protection, recursion limit\r\n },\r\n\r\n components: {\r\n // Don't restrict core/block/inline rules\r\n core: {},\r\n block: {},\r\n inline: {}\r\n }\r\n };\r\n\r\n }, {}], 136: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n var replaceEntities = require('../common/utils').replaceEntities;\r\n\r\n module.exports = function normalizeLink(url) {\r\n var normalized = replaceEntities(url);\r\n // We shouldn't care about the result of malformed URIs,\r\n // and should not throw an exception.\r\n try {\r\n normalized = decodeURI(normalized);\r\n } catch (err) { }\r\n return encodeURI(normalized);\r\n };\r\n\r\n }, { \"../common/utils\": 132 }], 137: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n module.exports = function normalizeReference(str) {\r\n // use .toUpperCase() instead of .toLowerCase()\r\n // here to avoid a conflict with Object.prototype\r\n // members (most notably, `__proto__`)\r\n return str.trim().replace(/\\s+/g, ' ').toUpperCase();\r\n };\r\n\r\n }, {}], 138: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n\r\n var normalizeLink = require('./normalize_link');\r\n var unescapeMd = require('../common/utils').unescapeMd;\r\n\r\n /**\r\n * Parse link destination\r\n *\r\n * - on success it returns a string and updates state.pos;\r\n * - on failure it returns null\r\n *\r\n * @param {Object} state\r\n * @param {Number} pos\r\n * @api private\r\n */\r\n\r\n module.exports = function parseLinkDestination(state, pos) {\r\n var code, level, link,\r\n start = pos,\r\n max = state.posMax;\r\n\r\n if (state.src.charCodeAt(pos) === 0x3C /* < */) {\r\n pos++;\r\n while (pos < max) {\r\n code = state.src.charCodeAt(pos);\r\n if (code === 0x0A /* \\n */) { return false; }\r\n if (code === 0x3E /* > */) {\r\n link = normalizeLink(unescapeMd(state.src.slice(start + 1, pos)));\r\n if (!state.parser.validateLink(link)) { return false; }\r\n state.pos = pos + 1;\r\n state.linkContent = link;\r\n return true;\r\n }\r\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\r\n pos += 2;\r\n continue;\r\n }\r\n\r\n pos++;\r\n }\r\n\r\n // no closing '>'\r\n return false;\r\n }\r\n\r\n // this should be ... } else { ... branch\r\n\r\n level = 0;\r\n while (pos < max) {\r\n code = state.src.charCodeAt(pos);\r\n\r\n if (code === 0x20) { break; }\r\n\r\n if (code > 0x08 && code < 0x0e) { break; }\r\n\r\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\r\n pos += 2;\r\n continue;\r\n }\r\n\r\n if (code === 0x28 /* ( */) {\r\n level++;\r\n if (level > 1) { break; }\r\n }\r\n\r\n if (code === 0x29 /* ) */) {\r\n level--;\r\n if (level < 0) { break; }\r\n }\r\n\r\n pos++;\r\n }\r\n\r\n if (start === pos) { return false; }\r\n\r\n link = unescapeMd(state.src.slice(start, pos));\r\n if (!state.parser.validateLink(link)) { return false; }\r\n\r\n state.linkContent = link;\r\n state.pos = pos;\r\n return true;\r\n };\r\n\r\n }, { \"../common/utils\": 132, \"./normalize_link\": 136 }], 139: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n /**\r\n * Parse link labels\r\n *\r\n * This function assumes that first character (`[`) already matches;\r\n * returns the end of the label.\r\n *\r\n * @param {Object} state\r\n * @param {Number} start\r\n * @api private\r\n */\r\n\r\n module.exports = function parseLinkLabel(state, start) {\r\n var level, found, marker,\r\n labelEnd = -1,\r\n max = state.posMax,\r\n oldPos = state.pos,\r\n oldFlag = state.isInLabel;\r\n\r\n if (state.isInLabel) { return -1; }\r\n\r\n if (state.labelUnmatchedScopes) {\r\n state.labelUnmatchedScopes--;\r\n return -1;\r\n }\r\n\r\n state.pos = start + 1;\r\n state.isInLabel = true;\r\n level = 1;\r\n\r\n while (state.pos < max) {\r\n marker = state.src.charCodeAt(state.pos);\r\n if (marker === 0x5B /* [ */) {\r\n level++;\r\n } else if (marker === 0x5D /* ] */) {\r\n level--;\r\n if (level === 0) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n state.parser.skipToken(state);\r\n }\r\n\r\n if (found) {\r\n labelEnd = state.pos;\r\n state.labelUnmatchedScopes = 0;\r\n } else {\r\n state.labelUnmatchedScopes = level - 1;\r\n }\r\n\r\n // restore old state\r\n state.pos = oldPos;\r\n state.isInLabel = oldFlag;\r\n\r\n return labelEnd;\r\n };\r\n\r\n }, {}], 140: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n\r\n var unescapeMd = require('../common/utils').unescapeMd;\r\n\r\n /**\r\n * Parse link title\r\n *\r\n * - on success it returns a string and updates state.pos;\r\n * - on failure it returns null\r\n *\r\n * @param {Object} state\r\n * @param {Number} pos\r\n * @api private\r\n */\r\n\r\n module.exports = function parseLinkTitle(state, pos) {\r\n var code,\r\n start = pos,\r\n max = state.posMax,\r\n marker = state.src.charCodeAt(pos);\r\n\r\n if (marker !== 0x22 /* \" */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { return false; }\r\n\r\n pos++;\r\n\r\n // if opening marker is \"(\", switch it to closing marker \")\"\r\n if (marker === 0x28) { marker = 0x29; }\r\n\r\n while (pos < max) {\r\n code = state.src.charCodeAt(pos);\r\n if (code === marker) {\r\n state.pos = pos + 1;\r\n state.linkContent = unescapeMd(state.src.slice(start + 1, pos));\r\n return true;\r\n }\r\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\r\n pos += 2;\r\n continue;\r\n }\r\n\r\n pos++;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n }, { \"../common/utils\": 132 }], 141: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n /**\r\n * Local dependencies\r\n */\r\n\r\n var assign = require('./common/utils').assign;\r\n var Renderer = require('./renderer');\r\n var ParserCore = require('./parser_core');\r\n var ParserBlock = require('./parser_block');\r\n var ParserInline = require('./parser_inline');\r\n var Ruler = require('./ruler');\r\n\r\n /**\r\n * Preset configs\r\n */\r\n\r\n var config = {\r\n 'default': require('./configs/default'),\r\n 'full': require('./configs/full'),\r\n 'commonmark': require('./configs/commonmark')\r\n };\r\n\r\n /**\r\n * The `StateCore` class manages state.\r\n *\r\n * @param {Object} `instance` Remarkable instance\r\n * @param {String} `str` Markdown string\r\n * @param {Object} `env`\r\n */\r\n\r\n function StateCore(instance, str, env) {\r\n this.src = str;\r\n this.env = env;\r\n this.options = instance.options;\r\n this.tokens = [];\r\n this.inlineMode = false;\r\n\r\n this.inline = instance.inline;\r\n this.block = instance.block;\r\n this.renderer = instance.renderer;\r\n this.typographer = instance.typographer;\r\n }\r\n\r\n /**\r\n * The main `Remarkable` class. Create an instance of\r\n * `Remarkable` with a `preset` and/or `options`.\r\n *\r\n * @param {String} `preset` If no preset is given, `default` is used.\r\n * @param {Object} `options`\r\n */\r\n\r\n function Remarkable(preset, options) {\r\n if (typeof preset !== 'string') {\r\n options = preset;\r\n preset = 'default';\r\n }\r\n\r\n this.inline = new ParserInline();\r\n this.block = new ParserBlock();\r\n this.core = new ParserCore();\r\n this.renderer = new Renderer();\r\n this.ruler = new Ruler();\r\n\r\n this.options = {};\r\n this.configure(config[preset]);\r\n this.set(options || {});\r\n }\r\n\r\n /**\r\n * Set options as an alternative to passing them\r\n * to the constructor.\r\n *\r\n * ```js\r\n * md.set({typographer: true});\r\n * ```\r\n * @param {Object} `options`\r\n * @api public\r\n */\r\n\r\n Remarkable.prototype.set = function (options) {\r\n assign(this.options, options);\r\n };\r\n\r\n /**\r\n * Batch loader for components rules states, and options\r\n *\r\n * @param {Object} `presets`\r\n */\r\n\r\n Remarkable.prototype.configure = function (presets) {\r\n var self = this;\r\n\r\n if (!presets) { throw new Error('Wrong `remarkable` preset, check name/content'); }\r\n if (presets.options) { self.set(presets.options); }\r\n if (presets.components) {\r\n Object.keys(presets.components).forEach(function (name) {\r\n if (presets.components[name].rules) {\r\n self[name].ruler.enable(presets.components[name].rules, true);\r\n }\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Use a plugin.\r\n *\r\n * ```js\r\n * var md = new Remarkable();\r\n *\r\n * md.use(plugin1)\r\n * .use(plugin2, opts)\r\n * .use(plugin3);\r\n * ```\r\n *\r\n * @param {Function} `plugin`\r\n * @param {Object} `options`\r\n * @return {Object} `Remarkable` for chaining\r\n */\r\n\r\n Remarkable.prototype.use = function (plugin, options) {\r\n plugin(this, options);\r\n return this;\r\n };\r\n\r\n\r\n /**\r\n * Parse the input `string` and return a tokens array.\r\n * Modifies `env` with definitions data.\r\n *\r\n * @param {String} `string`\r\n * @param {Object} `env`\r\n * @return {Array} Array of tokens\r\n */\r\n\r\n Remarkable.prototype.parse = function (str, env) {\r\n var state = new StateCore(this, str, env);\r\n this.core.process(state);\r\n return state.tokens;\r\n };\r\n\r\n /**\r\n * The main `.render()` method that does all the magic :)\r\n *\r\n * @param {String} `string`\r\n * @param {Object} `env`\r\n * @return {String} Rendered HTML.\r\n */\r\n\r\n Remarkable.prototype.render = function (str, env) {\r\n env = env || {};\r\n return this.renderer.render(this.parse(str, env), this.options, env);\r\n };\r\n\r\n /**\r\n * Parse the given content `string` as a single string.\r\n *\r\n * @param {String} `string`\r\n * @param {Object} `env`\r\n * @return {Array} Array of tokens\r\n */\r\n\r\n Remarkable.prototype.parseInline = function (str, env) {\r\n var state = new StateCore(this, str, env);\r\n state.inlineMode = true;\r\n this.core.process(state);\r\n return state.tokens;\r\n };\r\n\r\n /**\r\n * Render a single content `string`, without wrapping it\r\n * to paragraphs\r\n *\r\n * @param {String} `str`\r\n * @param {Object} `env`\r\n * @return {String}\r\n */\r\n\r\n Remarkable.prototype.renderInline = function (str, env) {\r\n env = env || {};\r\n return this.renderer.render(this.parseInline(str, env), this.options, env);\r\n };\r\n\r\n /**\r\n * Expose `Remarkable`\r\n */\r\n\r\n module.exports = Remarkable;\r\n\r\n /**\r\n * Expose `utils`, Useful helper functions for custom\r\n * rendering.\r\n */\r\n\r\n module.exports.utils = require('./common/utils');\r\n\r\n }, { \"./common/utils\": 132, \"./configs/commonmark\": 133, \"./configs/default\": 134, \"./configs/full\": 135, \"./parser_block\": 142, \"./parser_core\": 143, \"./parser_inline\": 144, \"./renderer\": 145, \"./ruler\": 146 }], 142: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n /**\r\n * Local dependencies\r\n */\r\n\r\n var Ruler = require('./ruler');\r\n var StateBlock = require('./rules_block/state_block');\r\n\r\n /**\r\n * Parser rules\r\n */\r\n\r\n var _rules = [\r\n ['code', require('./rules_block/code')],\r\n ['fences', require('./rules_block/fences'), ['paragraph', 'blockquote', 'list']],\r\n ['blockquote', require('./rules_block/blockquote'), ['paragraph', 'blockquote', 'list']],\r\n ['hr', require('./rules_block/hr'), ['paragraph', 'blockquote', 'list']],\r\n ['list', require('./rules_block/list'), ['paragraph', 'blockquote']],\r\n ['footnote', require('./rules_block/footnote'), ['paragraph']],\r\n ['heading', require('./rules_block/heading'), ['paragraph', 'blockquote']],\r\n ['lheading', require('./rules_block/lheading')],\r\n ['htmlblock', require('./rules_block/htmlblock'), ['paragraph', 'blockquote']],\r\n ['table', require('./rules_block/table'), ['paragraph']],\r\n ['deflist', require('./rules_block/deflist'), ['paragraph']],\r\n ['paragraph', require('./rules_block/paragraph')]\r\n ];\r\n\r\n /**\r\n * Block Parser class\r\n *\r\n * @api private\r\n */\r\n\r\n function ParserBlock() {\r\n this.ruler = new Ruler();\r\n for (var i = 0; i < _rules.length; i++) {\r\n this.ruler.push(_rules[i][0], _rules[i][1], {\r\n alt: (_rules[i][2] || []).slice()\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Generate tokens for the given input range.\r\n *\r\n * @param {Object} `state` Has properties like `src`, `parser`, `options` etc\r\n * @param {Number} `startLine`\r\n * @param {Number} `endLine`\r\n * @api private\r\n */\r\n\r\n ParserBlock.prototype.tokenize = function (state, startLine, endLine) {\r\n var rules = this.ruler.getRules('');\r\n var len = rules.length;\r\n var line = startLine;\r\n var hasEmptyLines = false;\r\n var ok, i;\r\n\r\n while (line < endLine) {\r\n state.line = line = state.skipEmptyLines(line);\r\n if (line >= endLine) {\r\n break;\r\n }\r\n\r\n // Termination condition for nested calls.\r\n // Nested calls currently used for blockquotes & lists\r\n if (state.tShift[line] < state.blkIndent) {\r\n break;\r\n }\r\n\r\n // Try all possible rules.\r\n // On success, rule should:\r\n //\r\n // - update `state.line`\r\n // - update `state.tokens`\r\n // - return true\r\n\r\n for (i = 0; i < len; i++) {\r\n ok = rules[i](state, line, endLine, false);\r\n if (ok) {\r\n break;\r\n }\r\n }\r\n\r\n // set state.tight iff we had an empty line before current tag\r\n // i.e. latest empty line should not count\r\n state.tight = !hasEmptyLines;\r\n\r\n // paragraph might \"eat\" one newline after it in nested lists\r\n if (state.isEmpty(state.line - 1)) {\r\n hasEmptyLines = true;\r\n }\r\n\r\n line = state.line;\r\n\r\n if (line < endLine && state.isEmpty(line)) {\r\n hasEmptyLines = true;\r\n line++;\r\n\r\n // two empty lines should stop the parser in list mode\r\n if (line < endLine && state.parentType === 'list' && state.isEmpty(line)) { break; }\r\n state.line = line;\r\n }\r\n }\r\n };\r\n\r\n var TABS_SCAN_RE = /[\\n\\t]/g;\r\n var NEWLINES_RE = /\\r[\\n\\u0085]|[\\u2424\\u2028\\u0085]/g;\r\n var SPACES_RE = /\\u00a0/g;\r\n\r\n /**\r\n * Tokenize the given `str`.\r\n *\r\n * @param {String} `str` Source string\r\n * @param {Object} `options`\r\n * @param {Object} `env`\r\n * @param {Array} `outTokens`\r\n * @api private\r\n */\r\n\r\n ParserBlock.prototype.parse = function (str, options, env, outTokens) {\r\n var state, lineStart = 0, lastTabPos = 0;\r\n if (!str) { return []; }\r\n\r\n // Normalize spaces\r\n str = str.replace(SPACES_RE, ' ');\r\n\r\n // Normalize newlines\r\n str = str.replace(NEWLINES_RE, '\\n');\r\n\r\n // Replace tabs with proper number of spaces (1..4)\r\n if (str.indexOf('\\t') >= 0) {\r\n str = str.replace(TABS_SCAN_RE, function (match, offset) {\r\n var result;\r\n if (str.charCodeAt(offset) === 0x0A) {\r\n lineStart = offset + 1;\r\n lastTabPos = 0;\r\n return match;\r\n }\r\n result = ' '.slice((offset - lineStart - lastTabPos) % 4);\r\n lastTabPos = offset - lineStart + 1;\r\n return result;\r\n });\r\n }\r\n\r\n state = new StateBlock(str, this, options, env, outTokens);\r\n this.tokenize(state, state.line, state.lineMax);\r\n };\r\n\r\n /**\r\n * Expose `ParserBlock`\r\n */\r\n\r\n module.exports = ParserBlock;\r\n\r\n }, { \"./ruler\": 146, \"./rules_block/blockquote\": 148, \"./rules_block/code\": 149, \"./rules_block/deflist\": 150, \"./rules_block/fences\": 151, \"./rules_block/footnote\": 152, \"./rules_block/heading\": 153, \"./rules_block/hr\": 154, \"./rules_block/htmlblock\": 155, \"./rules_block/lheading\": 156, \"./rules_block/list\": 157, \"./rules_block/paragraph\": 158, \"./rules_block/state_block\": 159, \"./rules_block/table\": 160 }], 143: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n /**\r\n * Local dependencies\r\n */\r\n\r\n var Ruler = require('./ruler');\r\n\r\n /**\r\n * Core parser `rules`\r\n */\r\n\r\n var _rules = [\r\n ['block', require('./rules_core/block')],\r\n ['abbr', require('./rules_core/abbr')],\r\n ['references', require('./rules_core/references')],\r\n ['inline', require('./rules_core/inline')],\r\n ['footnote_tail', require('./rules_core/footnote_tail')],\r\n ['abbr2', require('./rules_core/abbr2')],\r\n ['replacements', require('./rules_core/replacements')],\r\n ['smartquotes', require('./rules_core/smartquotes')],\r\n ['linkify', require('./rules_core/linkify')]\r\n ];\r\n\r\n /**\r\n * Class for top level (`core`) parser rules\r\n *\r\n * @api private\r\n */\r\n\r\n function Core() {\r\n this.options = {};\r\n this.ruler = new Ruler();\r\n for (var i = 0; i < _rules.length; i++) {\r\n this.ruler.push(_rules[i][0], _rules[i][1]);\r\n }\r\n }\r\n\r\n /**\r\n * Process rules with the given `state`\r\n *\r\n * @param {Object} `state`\r\n * @api private\r\n */\r\n\r\n Core.prototype.process = function (state) {\r\n var i, l, rules;\r\n rules = this.ruler.getRules('');\r\n for (i = 0, l = rules.length; i < l; i++) {\r\n rules[i](state);\r\n }\r\n };\r\n\r\n /**\r\n * Expose `Core`\r\n */\r\n\r\n module.exports = Core;\r\n\r\n }, { \"./ruler\": 146, \"./rules_core/abbr\": 161, \"./rules_core/abbr2\": 162, \"./rules_core/block\": 163, \"./rules_core/footnote_tail\": 164, \"./rules_core/inline\": 165, \"./rules_core/linkify\": 166, \"./rules_core/references\": 167, \"./rules_core/replacements\": 168, \"./rules_core/smartquotes\": 169 }], 144: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n /**\r\n * Local dependencies\r\n */\r\n\r\n var Ruler = require('./ruler');\r\n var StateInline = require('./rules_inline/state_inline');\r\n var utils = require('./common/utils');\r\n\r\n /**\r\n * Inline Parser `rules`\r\n */\r\n\r\n var _rules = [\r\n ['text', require('./rules_inline/text')],\r\n ['newline', require('./rules_inline/newline')],\r\n ['escape', require('./rules_inline/escape')],\r\n ['backticks', require('./rules_inline/backticks')],\r\n ['del', require('./rules_inline/del')],\r\n ['ins', require('./rules_inline/ins')],\r\n ['mark', require('./rules_inline/mark')],\r\n ['emphasis', require('./rules_inline/emphasis')],\r\n ['sub', require('./rules_inline/sub')],\r\n ['sup', require('./rules_inline/sup')],\r\n ['links', require('./rules_inline/links')],\r\n ['footnote_inline', require('./rules_inline/footnote_inline')],\r\n ['footnote_ref', require('./rules_inline/footnote_ref')],\r\n ['autolink', require('./rules_inline/autolink')],\r\n ['htmltag', require('./rules_inline/htmltag')],\r\n ['entity', require('./rules_inline/entity')]\r\n ];\r\n\r\n /**\r\n * Inline Parser class. Note that link validation is stricter\r\n * in Remarkable than what is specified by CommonMark. If you\r\n * want to change this you can use a custom validator.\r\n *\r\n * @api private\r\n */\r\n\r\n function ParserInline() {\r\n this.ruler = new Ruler();\r\n for (var i = 0; i < _rules.length; i++) {\r\n this.ruler.push(_rules[i][0], _rules[i][1]);\r\n }\r\n\r\n // Can be overridden with a custom validator\r\n this.validateLink = validateLink;\r\n }\r\n\r\n /**\r\n * Skip a single token by running all rules in validation mode.\r\n * Returns `true` if any rule reports success.\r\n *\r\n * @param {Object} `state`\r\n * @api privage\r\n */\r\n\r\n ParserInline.prototype.skipToken = function (state) {\r\n var rules = this.ruler.getRules('');\r\n var len = rules.length;\r\n var pos = state.pos;\r\n var i, cached_pos;\r\n\r\n if ((cached_pos = state.cacheGet(pos)) > 0) {\r\n state.pos = cached_pos;\r\n return;\r\n }\r\n\r\n for (i = 0; i < len; i++) {\r\n if (rules[i](state, true)) {\r\n state.cacheSet(pos, state.pos);\r\n return;\r\n }\r\n }\r\n\r\n state.pos++;\r\n state.cacheSet(pos, state.pos);\r\n };\r\n\r\n /**\r\n * Generate tokens for the given input range.\r\n *\r\n * @param {Object} `state`\r\n * @api private\r\n */\r\n\r\n ParserInline.prototype.tokenize = function (state) {\r\n var rules = this.ruler.getRules('');\r\n var len = rules.length;\r\n var end = state.posMax;\r\n var ok, i;\r\n\r\n while (state.pos < end) {\r\n\r\n // Try all possible rules.\r\n // On success, the rule should:\r\n //\r\n // - update `state.pos`\r\n // - update `state.tokens`\r\n // - return true\r\n for (i = 0; i < len; i++) {\r\n ok = rules[i](state, false);\r\n\r\n if (ok) {\r\n break;\r\n }\r\n }\r\n\r\n if (ok) {\r\n if (state.pos >= end) { break; }\r\n continue;\r\n }\r\n\r\n state.pending += state.src[state.pos++];\r\n }\r\n\r\n if (state.pending) {\r\n state.pushPending();\r\n }\r\n };\r\n\r\n /**\r\n * Parse the given input string.\r\n *\r\n * @param {String} `str`\r\n * @param {Object} `options`\r\n * @param {Object} `env`\r\n * @param {Array} `outTokens`\r\n * @api private\r\n */\r\n\r\n ParserInline.prototype.parse = function (str, options, env, outTokens) {\r\n var state = new StateInline(str, this, options, env, outTokens);\r\n this.tokenize(state);\r\n };\r\n\r\n /**\r\n * Validate the given `url` by checking for bad protocols.\r\n *\r\n * @param {String} `url`\r\n * @return {Boolean}\r\n */\r\n\r\n function validateLink(url) {\r\n var BAD_PROTOCOLS = ['vbscript', 'javascript', 'file'];\r\n var str = url.trim().toLowerCase();\r\n // Care about digital entities \"javascript:alert(1)\"\r\n str = utils.replaceEntities(str);\r\n if (str.indexOf(':') !== -1 && BAD_PROTOCOLS.indexOf(str.split(':')[0]) !== -1) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Expose `ParserInline`\r\n */\r\n\r\n module.exports = ParserInline;\r\n\r\n }, { \"./common/utils\": 132, \"./ruler\": 146, \"./rules_inline/autolink\": 170, \"./rules_inline/backticks\": 171, \"./rules_inline/del\": 172, \"./rules_inline/emphasis\": 173, \"./rules_inline/entity\": 174, \"./rules_inline/escape\": 175, \"./rules_inline/footnote_inline\": 176, \"./rules_inline/footnote_ref\": 177, \"./rules_inline/htmltag\": 178, \"./rules_inline/ins\": 179, \"./rules_inline/links\": 180, \"./rules_inline/mark\": 181, \"./rules_inline/newline\": 182, \"./rules_inline/state_inline\": 183, \"./rules_inline/sub\": 184, \"./rules_inline/sup\": 185, \"./rules_inline/text\": 186 }], 145: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n /**\r\n * Local dependencies\r\n */\r\n\r\n var utils = require('./common/utils');\r\n var rules = require('./rules');\r\n\r\n /**\r\n * Expose `Renderer`\r\n */\r\n\r\n module.exports = Renderer;\r\n\r\n /**\r\n * Renderer class. Renders HTML and exposes `rules` to allow\r\n * local modifications.\r\n */\r\n\r\n function Renderer() {\r\n this.rules = utils.assign({}, rules);\r\n\r\n // exported helper, for custom rules only\r\n this.getBreak = rules.getBreak;\r\n }\r\n\r\n /**\r\n * Render a string of inline HTML with the given `tokens` and\r\n * `options`.\r\n *\r\n * @param {Array} `tokens`\r\n * @param {Object} `options`\r\n * @param {Object} `env`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n Renderer.prototype.renderInline = function (tokens, options, env) {\r\n var _rules = this.rules;\r\n var len = tokens.length, i = 0;\r\n var result = '';\r\n\r\n while (len--) {\r\n result += _rules[tokens[i].type](tokens, i++, options, env, this);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * Render a string of HTML with the given `tokens` and\r\n * `options`.\r\n *\r\n * @param {Array} `tokens`\r\n * @param {Object} `options`\r\n * @param {Object} `env`\r\n * @return {String}\r\n * @api public\r\n */\r\n\r\n Renderer.prototype.render = function (tokens, options, env) {\r\n var _rules = this.rules;\r\n var len = tokens.length, i = -1;\r\n var result = '';\r\n\r\n while (++i < len) {\r\n if (tokens[i].type === 'inline') {\r\n result += this.renderInline(tokens[i].children, options, env);\r\n } else {\r\n result += _rules[tokens[i].type](tokens, i, options, env, this);\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n }, { \"./common/utils\": 132, \"./rules\": 147 }], 146: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n /**\r\n * Ruler is a helper class for building responsibility chains from\r\n * parse rules. It allows:\r\n *\r\n * - easy stack rules chains\r\n * - getting main chain and named chains content (as arrays of functions)\r\n *\r\n * Helper methods, should not be used directly.\r\n * @api private\r\n */\r\n\r\n function Ruler() {\r\n // List of added rules. Each element is:\r\n //\r\n // { name: XXX,\r\n // enabled: Boolean,\r\n // fn: Function(),\r\n // alt: [ name2, name3 ] }\r\n //\r\n this.__rules__ = [];\r\n\r\n // Cached rule chains.\r\n //\r\n // First level - chain name, '' for default.\r\n // Second level - digital anchor for fast filtering by charcodes.\r\n //\r\n this.__cache__ = null;\r\n }\r\n\r\n /**\r\n * Find the index of a rule by `name`.\r\n *\r\n * @param {String} `name`\r\n * @return {Number} Index of the given `name`\r\n * @api private\r\n */\r\n\r\n Ruler.prototype.__find__ = function (name) {\r\n var len = this.__rules__.length;\r\n var i = -1;\r\n\r\n while (len--) {\r\n if (this.__rules__[++i].name === name) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n };\r\n\r\n /**\r\n * Build the rules lookup cache\r\n *\r\n * @api private\r\n */\r\n\r\n Ruler.prototype.__compile__ = function () {\r\n var self = this;\r\n var chains = [''];\r\n\r\n // collect unique names\r\n self.__rules__.forEach(function (rule) {\r\n if (!rule.enabled) {\r\n return;\r\n }\r\n\r\n rule.alt.forEach(function (altName) {\r\n if (chains.indexOf(altName) < 0) {\r\n chains.push(altName);\r\n }\r\n });\r\n });\r\n\r\n self.__cache__ = {};\r\n\r\n chains.forEach(function (chain) {\r\n self.__cache__[chain] = [];\r\n self.__rules__.forEach(function (rule) {\r\n if (!rule.enabled) {\r\n return;\r\n }\r\n\r\n if (chain && rule.alt.indexOf(chain) < 0) {\r\n return;\r\n }\r\n self.__cache__[chain].push(rule.fn);\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * Ruler public methods\r\n * ------------------------------------------------\r\n */\r\n\r\n /**\r\n * Replace rule function\r\n *\r\n * @param {String} `name` Rule name\r\n * @param {Function `fn`\r\n * @param {Object} `options`\r\n * @api private\r\n */\r\n\r\n Ruler.prototype.at = function (name, fn, options) {\r\n var idx = this.__find__(name);\r\n var opt = options || {};\r\n\r\n if (idx === -1) {\r\n throw new Error('Parser rule not found: ' + name);\r\n }\r\n\r\n this.__rules__[idx].fn = fn;\r\n this.__rules__[idx].alt = opt.alt || [];\r\n this.__cache__ = null;\r\n };\r\n\r\n /**\r\n * Add a rule to the chain before given the `ruleName`.\r\n *\r\n * @param {String} `beforeName`\r\n * @param {String} `ruleName`\r\n * @param {Function} `fn`\r\n * @param {Object} `options`\r\n * @api private\r\n */\r\n\r\n Ruler.prototype.before = function (beforeName, ruleName, fn, options) {\r\n var idx = this.__find__(beforeName);\r\n var opt = options || {};\r\n\r\n if (idx === -1) {\r\n throw new Error('Parser rule not found: ' + beforeName);\r\n }\r\n\r\n this.__rules__.splice(idx, 0, {\r\n name: ruleName,\r\n enabled: true,\r\n fn: fn,\r\n alt: opt.alt || []\r\n });\r\n\r\n this.__cache__ = null;\r\n };\r\n\r\n /**\r\n * Add a rule to the chain after the given `ruleName`.\r\n *\r\n * @param {String} `afterName`\r\n * @param {String} `ruleName`\r\n * @param {Function} `fn`\r\n * @param {Object} `options`\r\n * @api private\r\n */\r\n\r\n Ruler.prototype.after = function (afterName, ruleName, fn, options) {\r\n var idx = this.__find__(afterName);\r\n var opt = options || {};\r\n\r\n if (idx === -1) {\r\n throw new Error('Parser rule not found: ' + afterName);\r\n }\r\n\r\n this.__rules__.splice(idx + 1, 0, {\r\n name: ruleName,\r\n enabled: true,\r\n fn: fn,\r\n alt: opt.alt || []\r\n });\r\n\r\n this.__cache__ = null;\r\n };\r\n\r\n /**\r\n * Add a rule to the end of chain.\r\n *\r\n * @param {String} `ruleName`\r\n * @param {Function} `fn`\r\n * @param {Object} `options`\r\n * @return {String}\r\n */\r\n\r\n Ruler.prototype.push = function (ruleName, fn, options) {\r\n var opt = options || {};\r\n\r\n this.__rules__.push({\r\n name: ruleName,\r\n enabled: true,\r\n fn: fn,\r\n alt: opt.alt || []\r\n });\r\n\r\n this.__cache__ = null;\r\n };\r\n\r\n /**\r\n * Enable a rule or list of rules.\r\n *\r\n * @param {String|Array} `list` Name or array of rule names to enable\r\n * @param {Boolean} `strict` If `true`, all non listed rules will be disabled.\r\n * @api private\r\n */\r\n\r\n Ruler.prototype.enable = function (list, strict) {\r\n list = !Array.isArray(list)\r\n ? [list]\r\n : list;\r\n\r\n // In strict mode disable all existing rules first\r\n if (strict) {\r\n this.__rules__.forEach(function (rule) {\r\n rule.enabled = false;\r\n });\r\n }\r\n\r\n // Search by name and enable\r\n list.forEach(function (name) {\r\n var idx = this.__find__(name);\r\n if (idx < 0) {\r\n throw new Error('Rules manager: invalid rule name ' + name);\r\n }\r\n this.__rules__[idx].enabled = true;\r\n }, this);\r\n\r\n this.__cache__ = null;\r\n };\r\n\r\n\r\n /**\r\n * Disable a rule or list of rules.\r\n *\r\n * @param {String|Array} `list` Name or array of rule names to disable\r\n * @api private\r\n */\r\n\r\n Ruler.prototype.disable = function (list) {\r\n list = !Array.isArray(list)\r\n ? [list]\r\n : list;\r\n\r\n // Search by name and disable\r\n list.forEach(function (name) {\r\n var idx = this.__find__(name);\r\n if (idx < 0) {\r\n throw new Error('Rules manager: invalid rule name ' + name);\r\n }\r\n this.__rules__[idx].enabled = false;\r\n }, this);\r\n\r\n this.__cache__ = null;\r\n };\r\n\r\n /**\r\n * Get a rules list as an array of functions.\r\n *\r\n * @param {String} `chainName`\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\n Ruler.prototype.getRules = function (chainName) {\r\n if (this.__cache__ === null) {\r\n this.__compile__();\r\n }\r\n return this.__cache__[chainName];\r\n };\r\n\r\n /**\r\n * Expose `Ruler`\r\n */\r\n\r\n module.exports = Ruler;\r\n\r\n }, {}], 147: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n /**\r\n * Local dependencies\r\n */\r\n\r\n var has = require('./common/utils').has;\r\n var unescapeMd = require('./common/utils').unescapeMd;\r\n var replaceEntities = require('./common/utils').replaceEntities;\r\n var escapeHtml = require('./common/utils').escapeHtml;\r\n\r\n /**\r\n * Renderer rules cache\r\n */\r\n\r\n var rules = {};\r\n\r\n /**\r\n * Blockquotes\r\n */\r\n\r\n rules.blockquote_open = function (/* tokens, idx, options, env */) {\r\n return '
      \\n';\r\n };\r\n\r\n rules.blockquote_close = function (tokens, idx /*, options, env */) {\r\n return '
      ' + getBreak(tokens, idx);\r\n };\r\n\r\n /**\r\n * Code\r\n */\r\n\r\n rules.code = function (tokens, idx /*, options, env */) {\r\n if (tokens[idx].block) {\r\n return '
      ' + escapeHtml(tokens[idx].content) + '
      ' + getBreak(tokens, idx);\r\n }\r\n return '' + escapeHtml(tokens[idx].content) + '';\r\n };\r\n\r\n /**\r\n * Fenced code blocks\r\n */\r\n\r\n rules.fence = function (tokens, idx, options, env, instance) {\r\n var token = tokens[idx];\r\n var langClass = '';\r\n var langPrefix = options.langPrefix;\r\n var langName = '', fenceName;\r\n var highlighted;\r\n\r\n if (token.params) {\r\n\r\n //\r\n // ```foo bar\r\n //\r\n // Try custom renderer \"foo\" first. That will simplify overwrite\r\n // for diagrams, latex, and any other fenced block with custom look\r\n //\r\n\r\n fenceName = token.params.split(/\\s+/g)[0];\r\n\r\n if (has(instance.rules.fence_custom, fenceName)) {\r\n return instance.rules.fence_custom[fenceName](tokens, idx, options, env, instance);\r\n }\r\n\r\n langName = escapeHtml(replaceEntities(unescapeMd(fenceName)));\r\n langClass = ' class=\"' + langPrefix + langName + '\"';\r\n }\r\n\r\n if (options.highlight) {\r\n highlighted = options.highlight(token.content, langName) || escapeHtml(token.content);\r\n } else {\r\n highlighted = escapeHtml(token.content);\r\n }\r\n\r\n return '
      '\r\n                + highlighted\r\n                + '
      '\r\n + getBreak(tokens, idx);\r\n };\r\n\r\n rules.fence_custom = {};\r\n\r\n /**\r\n * Headings\r\n */\r\n\r\n rules.heading_open = function (tokens, idx /*, options, env */) {\r\n return '';\r\n };\r\n rules.heading_close = function (tokens, idx /*, options, env */) {\r\n return '\\n';\r\n };\r\n\r\n /**\r\n * Horizontal rules\r\n */\r\n\r\n rules.hr = function (tokens, idx, options /*, env */) {\r\n return (options.xhtmlOut ? '
      ' : '
      ') + getBreak(tokens, idx);\r\n };\r\n\r\n /**\r\n * Bullets\r\n */\r\n\r\n rules.bullet_list_open = function (/* tokens, idx, options, env */) {\r\n return '
        \\n';\r\n };\r\n rules.bullet_list_close = function (tokens, idx /*, options, env */) {\r\n return '
      ' + getBreak(tokens, idx);\r\n };\r\n\r\n /**\r\n * List items\r\n */\r\n\r\n rules.list_item_open = function (/* tokens, idx, options, env */) {\r\n return '
    1. ';\r\n };\r\n rules.list_item_close = function (/* tokens, idx, options, env */) {\r\n return '
    2. \\n';\r\n };\r\n\r\n /**\r\n * Ordered list items\r\n */\r\n\r\n rules.ordered_list_open = function (tokens, idx /*, options, env */) {\r\n var token = tokens[idx];\r\n var order = token.order > 1 ? ' start=\"' + token.order + '\"' : '';\r\n return '\\n';\r\n };\r\n rules.ordered_list_close = function (tokens, idx /*, options, env */) {\r\n return '' + getBreak(tokens, idx);\r\n };\r\n\r\n /**\r\n * Paragraphs\r\n */\r\n\r\n rules.paragraph_open = function (tokens, idx /*, options, env */) {\r\n return tokens[idx].tight ? '' : '

      ';\r\n };\r\n rules.paragraph_close = function (tokens, idx /*, options, env */) {\r\n var addBreak = !(tokens[idx].tight && idx && tokens[idx - 1].type === 'inline' && !tokens[idx - 1].content);\r\n return (tokens[idx].tight ? '' : '

      ') + (addBreak ? getBreak(tokens, idx) : '');\r\n };\r\n\r\n /**\r\n * Links\r\n */\r\n\r\n rules.link_open = function (tokens, idx, options /* env */) {\r\n var title = tokens[idx].title ? (' title=\"' + escapeHtml(replaceEntities(tokens[idx].title)) + '\"') : '';\r\n var target = options.linkTarget ? (' target=\"' + options.linkTarget + '\"') : '';\r\n return '';\r\n };\r\n rules.link_close = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n\r\n /**\r\n * Images\r\n */\r\n\r\n rules.image = function (tokens, idx, options /*, env */) {\r\n var src = ' src=\"' + escapeHtml(tokens[idx].src) + '\"';\r\n var title = tokens[idx].title ? (' title=\"' + escapeHtml(replaceEntities(tokens[idx].title)) + '\"') : '';\r\n var alt = ' alt=\"' + (tokens[idx].alt ? escapeHtml(replaceEntities(tokens[idx].alt)) : '') + '\"';\r\n var suffix = options.xhtmlOut ? ' /' : '';\r\n return '';\r\n };\r\n\r\n /**\r\n * Tables\r\n */\r\n\r\n rules.table_open = function (/* tokens, idx, options, env */) {\r\n return '\\n';\r\n };\r\n rules.table_close = function (/* tokens, idx, options, env */) {\r\n return '
      \\n';\r\n };\r\n rules.thead_open = function (/* tokens, idx, options, env */) {\r\n return '\\n';\r\n };\r\n rules.thead_close = function (/* tokens, idx, options, env */) {\r\n return '\\n';\r\n };\r\n rules.tbody_open = function (/* tokens, idx, options, env */) {\r\n return '\\n';\r\n };\r\n rules.tbody_close = function (/* tokens, idx, options, env */) {\r\n return '\\n';\r\n };\r\n rules.tr_open = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n rules.tr_close = function (/* tokens, idx, options, env */) {\r\n return '\\n';\r\n };\r\n rules.th_open = function (tokens, idx /*, options, env */) {\r\n var token = tokens[idx];\r\n return '';\r\n };\r\n rules.th_close = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n rules.td_open = function (tokens, idx /*, options, env */) {\r\n var token = tokens[idx];\r\n return '';\r\n };\r\n rules.td_close = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n\r\n /**\r\n * Bold\r\n */\r\n\r\n rules.strong_open = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n rules.strong_close = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n\r\n /**\r\n * Italicize\r\n */\r\n\r\n rules.em_open = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n rules.em_close = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n\r\n /**\r\n * Strikethrough\r\n */\r\n\r\n rules.del_open = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n rules.del_close = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n\r\n /**\r\n * Insert\r\n */\r\n\r\n rules.ins_open = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n rules.ins_close = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n\r\n /**\r\n * Highlight\r\n */\r\n\r\n rules.mark_open = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n rules.mark_close = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n\r\n /**\r\n * Super- and sub-script\r\n */\r\n\r\n rules.sub = function (tokens, idx /*, options, env */) {\r\n return '' + escapeHtml(tokens[idx].content) + '';\r\n };\r\n rules.sup = function (tokens, idx /*, options, env */) {\r\n return '' + escapeHtml(tokens[idx].content) + '';\r\n };\r\n\r\n /**\r\n * Breaks\r\n */\r\n\r\n rules.hardbreak = function (tokens, idx, options /*, env */) {\r\n return options.xhtmlOut ? '
      \\n' : '
      \\n';\r\n };\r\n rules.softbreak = function (tokens, idx, options /*, env */) {\r\n return options.breaks ? (options.xhtmlOut ? '
      \\n' : '
      \\n') : '\\n';\r\n };\r\n\r\n /**\r\n * Text\r\n */\r\n\r\n rules.text = function (tokens, idx /*, options, env */) {\r\n return escapeHtml(tokens[idx].content);\r\n };\r\n\r\n /**\r\n * Content\r\n */\r\n\r\n rules.htmlblock = function (tokens, idx /*, options, env */) {\r\n return tokens[idx].content;\r\n };\r\n rules.htmltag = function (tokens, idx /*, options, env */) {\r\n return tokens[idx].content;\r\n };\r\n\r\n /**\r\n * Abbreviations, initialism\r\n */\r\n\r\n rules.abbr_open = function (tokens, idx /*, options, env */) {\r\n return '';\r\n };\r\n rules.abbr_close = function (/* tokens, idx, options, env */) {\r\n return '';\r\n };\r\n\r\n /**\r\n * Footnotes\r\n */\r\n\r\n rules.footnote_ref = function (tokens, idx) {\r\n var n = Number(tokens[idx].id + 1).toString();\r\n var id = 'fnref' + n;\r\n if (tokens[idx].subId > 0) {\r\n id += ':' + tokens[idx].subId;\r\n }\r\n return '[' + n + ']';\r\n };\r\n rules.footnote_block_open = function (tokens, idx, options) {\r\n var hr = options.xhtmlOut\r\n ? '
      \\n'\r\n : '
      \\n';\r\n return hr + '
      \\n
        \\n';\r\n };\r\n rules.footnote_block_close = function () {\r\n return '
      \\n
      \\n';\r\n };\r\n rules.footnote_open = function (tokens, idx) {\r\n var id = Number(tokens[idx].id + 1).toString();\r\n return '
    3. ';\r\n };\r\n rules.footnote_close = function () {\r\n return '
    4. \\n';\r\n };\r\n rules.footnote_anchor = function (tokens, idx) {\r\n var n = Number(tokens[idx].id + 1).toString();\r\n var id = 'fnref' + n;\r\n if (tokens[idx].subId > 0) {\r\n id += ':' + tokens[idx].subId;\r\n }\r\n return ' ';\r\n };\r\n\r\n /**\r\n * Definition lists\r\n */\r\n\r\n rules.dl_open = function () {\r\n return '
      \\n';\r\n };\r\n rules.dt_open = function () {\r\n return '
      ';\r\n };\r\n rules.dd_open = function () {\r\n return '
      ';\r\n };\r\n rules.dl_close = function () {\r\n return '
      \\n';\r\n };\r\n rules.dt_close = function () {\r\n return '\\n';\r\n };\r\n rules.dd_close = function () {\r\n return '\\n';\r\n };\r\n\r\n /**\r\n * Helper functions\r\n */\r\n\r\n function nextToken(tokens, idx) {\r\n if (++idx >= tokens.length - 2) {\r\n return idx;\r\n }\r\n if ((tokens[idx].type === 'paragraph_open' && tokens[idx].tight) &&\r\n (tokens[idx + 1].type === 'inline' && tokens[idx + 1].content.length === 0) &&\r\n (tokens[idx + 2].type === 'paragraph_close' && tokens[idx + 2].tight)) {\r\n return nextToken(tokens, idx + 2);\r\n }\r\n return idx;\r\n }\r\n\r\n /**\r\n * Check to see if `\\n` is needed before the next token.\r\n *\r\n * @param {Array} `tokens`\r\n * @param {Number} `idx`\r\n * @return {String} Empty string or newline\r\n * @api private\r\n */\r\n\r\n var getBreak = rules.getBreak = function getBreak(tokens, idx) {\r\n idx = nextToken(tokens, idx);\r\n if (idx < tokens.length && tokens[idx].type === 'list_item_close') {\r\n return '';\r\n }\r\n return '\\n';\r\n };\r\n\r\n /**\r\n * Expose `rules`\r\n */\r\n\r\n module.exports = rules;\r\n\r\n }, { \"./common/utils\": 132 }], 148: [function (require, module, exports) {\r\n // Block quotes\r\n\r\n 'use strict';\r\n\r\n\r\n module.exports = function blockquote(state, startLine, endLine, silent) {\r\n var nextLine, lastLineEmpty, oldTShift, oldBMarks, oldIndent, oldParentType, lines,\r\n terminatorRules,\r\n i, l, terminate,\r\n pos = state.bMarks[startLine] + state.tShift[startLine],\r\n max = state.eMarks[startLine];\r\n\r\n if (pos > max) { return false; }\r\n\r\n // check the block quote marker\r\n if (state.src.charCodeAt(pos++) !== 0x3E/* > */) { return false; }\r\n\r\n if (state.level >= state.options.maxNesting) { return false; }\r\n\r\n // we know that it's going to be a valid blockquote,\r\n // so no point trying to find the end of it in silent mode\r\n if (silent) { return true; }\r\n\r\n // skip one optional space after '>'\r\n if (state.src.charCodeAt(pos) === 0x20) { pos++; }\r\n\r\n oldIndent = state.blkIndent;\r\n state.blkIndent = 0;\r\n\r\n oldBMarks = [state.bMarks[startLine]];\r\n state.bMarks[startLine] = pos;\r\n\r\n // check if we have an empty blockquote\r\n pos = pos < max ? state.skipSpaces(pos) : pos;\r\n lastLineEmpty = pos >= max;\r\n\r\n oldTShift = [state.tShift[startLine]];\r\n state.tShift[startLine] = pos - state.bMarks[startLine];\r\n\r\n terminatorRules = state.parser.ruler.getRules('blockquote');\r\n\r\n // Search the end of the block\r\n //\r\n // Block ends with either:\r\n // 1. an empty line outside:\r\n // ```\r\n // > test\r\n //\r\n // ```\r\n // 2. an empty line inside:\r\n // ```\r\n // >\r\n // test\r\n // ```\r\n // 3. another tag\r\n // ```\r\n // > test\r\n // - - -\r\n // ```\r\n for (nextLine = startLine + 1; nextLine < endLine; nextLine++) {\r\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\r\n max = state.eMarks[nextLine];\r\n\r\n if (pos >= max) {\r\n // Case 1: line is not inside the blockquote, and this line is empty.\r\n break;\r\n }\r\n\r\n if (state.src.charCodeAt(pos++) === 0x3E/* > */) {\r\n // This line is inside the blockquote.\r\n\r\n // skip one optional space after '>'\r\n if (state.src.charCodeAt(pos) === 0x20) { pos++; }\r\n\r\n oldBMarks.push(state.bMarks[nextLine]);\r\n state.bMarks[nextLine] = pos;\r\n\r\n pos = pos < max ? state.skipSpaces(pos) : pos;\r\n lastLineEmpty = pos >= max;\r\n\r\n oldTShift.push(state.tShift[nextLine]);\r\n state.tShift[nextLine] = pos - state.bMarks[nextLine];\r\n continue;\r\n }\r\n\r\n // Case 2: line is not inside the blockquote, and the last line was empty.\r\n if (lastLineEmpty) { break; }\r\n\r\n // Case 3: another tag found.\r\n terminate = false;\r\n for (i = 0, l = terminatorRules.length; i < l; i++) {\r\n if (terminatorRules[i](state, nextLine, endLine, true)) {\r\n terminate = true;\r\n break;\r\n }\r\n }\r\n if (terminate) { break; }\r\n\r\n oldBMarks.push(state.bMarks[nextLine]);\r\n oldTShift.push(state.tShift[nextLine]);\r\n\r\n // A negative number means that this is a paragraph continuation;\r\n //\r\n // Any negative number will do the job here, but it's better for it\r\n // to be large enough to make any bugs obvious.\r\n state.tShift[nextLine] = -1337;\r\n }\r\n\r\n oldParentType = state.parentType;\r\n state.parentType = 'blockquote';\r\n state.tokens.push({\r\n type: 'blockquote_open',\r\n lines: lines = [startLine, 0],\r\n level: state.level++\r\n });\r\n state.parser.tokenize(state, startLine, nextLine);\r\n state.tokens.push({\r\n type: 'blockquote_close',\r\n level: --state.level\r\n });\r\n state.parentType = oldParentType;\r\n lines[1] = state.line;\r\n\r\n // Restore original tShift; this might not be necessary since the parser\r\n // has already been here, but just to make sure we can do that.\r\n for (i = 0; i < oldTShift.length; i++) {\r\n state.bMarks[i + startLine] = oldBMarks[i];\r\n state.tShift[i + startLine] = oldTShift[i];\r\n }\r\n state.blkIndent = oldIndent;\r\n\r\n return true;\r\n };\r\n\r\n }, {}], 149: [function (require, module, exports) {\r\n // Code block (4 spaces padded)\r\n\r\n 'use strict';\r\n\r\n\r\n module.exports = function code(state, startLine, endLine/*, silent*/) {\r\n var nextLine, last;\r\n\r\n if (state.tShift[startLine] - state.blkIndent < 4) { return false; }\r\n\r\n last = nextLine = startLine + 1;\r\n\r\n while (nextLine < endLine) {\r\n if (state.isEmpty(nextLine)) {\r\n nextLine++;\r\n continue;\r\n }\r\n if (state.tShift[nextLine] - state.blkIndent >= 4) {\r\n nextLine++;\r\n last = nextLine;\r\n continue;\r\n }\r\n break;\r\n }\r\n\r\n state.line = nextLine;\r\n state.tokens.push({\r\n type: 'code',\r\n content: state.getLines(startLine, last, 4 + state.blkIndent, true),\r\n block: true,\r\n lines: [startLine, state.line],\r\n level: state.level\r\n });\r\n\r\n return true;\r\n };\r\n\r\n }, {}], 150: [function (require, module, exports) {\r\n // Definition lists\r\n\r\n 'use strict';\r\n\r\n\r\n // Search `[:~][\\n ]`, returns next pos after marker on success\r\n // or -1 on fail.\r\n function skipMarker(state, line) {\r\n var pos, marker,\r\n start = state.bMarks[line] + state.tShift[line],\r\n max = state.eMarks[line];\r\n\r\n if (start >= max) { return -1; }\r\n\r\n // Check bullet\r\n marker = state.src.charCodeAt(start++);\r\n if (marker !== 0x7E/* ~ */ && marker !== 0x3A/* : */) { return -1; }\r\n\r\n pos = state.skipSpaces(start);\r\n\r\n // require space after \":\"\r\n if (start === pos) { return -1; }\r\n\r\n // no empty definitions, e.g. \" : \"\r\n if (pos >= max) { return -1; }\r\n\r\n return pos;\r\n }\r\n\r\n function markTightParagraphs(state, idx) {\r\n var i, l,\r\n level = state.level + 2;\r\n\r\n for (i = idx + 2, l = state.tokens.length - 2; i < l; i++) {\r\n if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') {\r\n state.tokens[i + 2].tight = true;\r\n state.tokens[i].tight = true;\r\n i += 2;\r\n }\r\n }\r\n }\r\n\r\n module.exports = function deflist(state, startLine, endLine, silent) {\r\n var contentStart,\r\n ddLine,\r\n dtLine,\r\n itemLines,\r\n listLines,\r\n listTokIdx,\r\n nextLine,\r\n oldIndent,\r\n oldDDIndent,\r\n oldParentType,\r\n oldTShift,\r\n oldTight,\r\n prevEmptyEnd,\r\n tight;\r\n\r\n if (silent) {\r\n // quirk: validation mode validates a dd block only, not a whole deflist\r\n if (state.ddIndent < 0) { return false; }\r\n return skipMarker(state, startLine) >= 0;\r\n }\r\n\r\n nextLine = startLine + 1;\r\n if (state.isEmpty(nextLine)) {\r\n if (++nextLine > endLine) { return false; }\r\n }\r\n\r\n if (state.tShift[nextLine] < state.blkIndent) { return false; }\r\n contentStart = skipMarker(state, nextLine);\r\n if (contentStart < 0) { return false; }\r\n\r\n if (state.level >= state.options.maxNesting) { return false; }\r\n\r\n // Start list\r\n listTokIdx = state.tokens.length;\r\n\r\n state.tokens.push({\r\n type: 'dl_open',\r\n lines: listLines = [startLine, 0],\r\n level: state.level++\r\n });\r\n\r\n //\r\n // Iterate list items\r\n //\r\n\r\n dtLine = startLine;\r\n ddLine = nextLine;\r\n\r\n // One definition list can contain multiple DTs,\r\n // and one DT can be followed by multiple DDs.\r\n //\r\n // Thus, there is two loops here, and label is\r\n // needed to break out of the second one\r\n //\r\n /*eslint no-labels:0,block-scoped-var:0*/\r\n OUTER:\r\n for (; ;) {\r\n tight = true;\r\n prevEmptyEnd = false;\r\n\r\n state.tokens.push({\r\n type: 'dt_open',\r\n lines: [dtLine, dtLine],\r\n level: state.level++\r\n });\r\n state.tokens.push({\r\n type: 'inline',\r\n content: state.getLines(dtLine, dtLine + 1, state.blkIndent, false).trim(),\r\n level: state.level + 1,\r\n lines: [dtLine, dtLine],\r\n children: []\r\n });\r\n state.tokens.push({\r\n type: 'dt_close',\r\n level: --state.level\r\n });\r\n\r\n for (; ;) {\r\n state.tokens.push({\r\n type: 'dd_open',\r\n lines: itemLines = [nextLine, 0],\r\n level: state.level++\r\n });\r\n\r\n oldTight = state.tight;\r\n oldDDIndent = state.ddIndent;\r\n oldIndent = state.blkIndent;\r\n oldTShift = state.tShift[ddLine];\r\n oldParentType = state.parentType;\r\n state.blkIndent = state.ddIndent = state.tShift[ddLine] + 2;\r\n state.tShift[ddLine] = contentStart - state.bMarks[ddLine];\r\n state.tight = true;\r\n state.parentType = 'deflist';\r\n\r\n state.parser.tokenize(state, ddLine, endLine, true);\r\n\r\n // If any of list item is tight, mark list as tight\r\n if (!state.tight || prevEmptyEnd) {\r\n tight = false;\r\n }\r\n // Item become loose if finish with empty line,\r\n // but we should filter last element, because it means list finish\r\n prevEmptyEnd = (state.line - ddLine) > 1 && state.isEmpty(state.line - 1);\r\n\r\n state.tShift[ddLine] = oldTShift;\r\n state.tight = oldTight;\r\n state.parentType = oldParentType;\r\n state.blkIndent = oldIndent;\r\n state.ddIndent = oldDDIndent;\r\n\r\n state.tokens.push({\r\n type: 'dd_close',\r\n level: --state.level\r\n });\r\n\r\n itemLines[1] = nextLine = state.line;\r\n\r\n if (nextLine >= endLine) { break OUTER; }\r\n\r\n if (state.tShift[nextLine] < state.blkIndent) { break OUTER; }\r\n contentStart = skipMarker(state, nextLine);\r\n if (contentStart < 0) { break; }\r\n\r\n ddLine = nextLine;\r\n\r\n // go to the next loop iteration:\r\n // insert DD tag and repeat checking\r\n }\r\n\r\n if (nextLine >= endLine) { break; }\r\n dtLine = nextLine;\r\n\r\n if (state.isEmpty(dtLine)) { break; }\r\n if (state.tShift[dtLine] < state.blkIndent) { break; }\r\n\r\n ddLine = dtLine + 1;\r\n if (ddLine >= endLine) { break; }\r\n if (state.isEmpty(ddLine)) { ddLine++; }\r\n if (ddLine >= endLine) { break; }\r\n\r\n if (state.tShift[ddLine] < state.blkIndent) { break; }\r\n contentStart = skipMarker(state, ddLine);\r\n if (contentStart < 0) { break; }\r\n\r\n // go to the next loop iteration:\r\n // insert DT and DD tags and repeat checking\r\n }\r\n\r\n // Finilize list\r\n state.tokens.push({\r\n type: 'dl_close',\r\n level: --state.level\r\n });\r\n listLines[1] = nextLine;\r\n\r\n state.line = nextLine;\r\n\r\n // mark paragraphs tight if needed\r\n if (tight) {\r\n markTightParagraphs(state, listTokIdx);\r\n }\r\n\r\n return true;\r\n };\r\n\r\n }, {}], 151: [function (require, module, exports) {\r\n // fences (``` lang, ~~~ lang)\r\n\r\n 'use strict';\r\n\r\n\r\n module.exports = function fences(state, startLine, endLine, silent) {\r\n var marker, len, params, nextLine, mem,\r\n haveEndMarker = false,\r\n pos = state.bMarks[startLine] + state.tShift[startLine],\r\n max = state.eMarks[startLine];\r\n\r\n if (pos + 3 > max) { return false; }\r\n\r\n marker = state.src.charCodeAt(pos);\r\n\r\n if (marker !== 0x7E/* ~ */ && marker !== 0x60 /* ` */) {\r\n return false;\r\n }\r\n\r\n // scan marker length\r\n mem = pos;\r\n pos = state.skipChars(pos, marker);\r\n\r\n len = pos - mem;\r\n\r\n if (len < 3) { return false; }\r\n\r\n params = state.src.slice(pos, max).trim();\r\n\r\n if (params.indexOf('`') >= 0) { return false; }\r\n\r\n // Since start is found, we can report success here in validation mode\r\n if (silent) { return true; }\r\n\r\n // search end of block\r\n nextLine = startLine;\r\n\r\n for (; ;) {\r\n nextLine++;\r\n if (nextLine >= endLine) {\r\n // unclosed block should be autoclosed by end of document.\r\n // also block seems to be autoclosed by end of parent\r\n break;\r\n }\r\n\r\n pos = mem = state.bMarks[nextLine] + state.tShift[nextLine];\r\n max = state.eMarks[nextLine];\r\n\r\n if (pos < max && state.tShift[nextLine] < state.blkIndent) {\r\n // non-empty line with negative indent should stop the list:\r\n // - ```\r\n // test\r\n break;\r\n }\r\n\r\n if (state.src.charCodeAt(pos) !== marker) { continue; }\r\n\r\n if (state.tShift[nextLine] - state.blkIndent >= 4) {\r\n // closing fence should be indented less than 4 spaces\r\n continue;\r\n }\r\n\r\n pos = state.skipChars(pos, marker);\r\n\r\n // closing code fence must be at least as long as the opening one\r\n if (pos - mem < len) { continue; }\r\n\r\n // make sure tail has spaces only\r\n pos = state.skipSpaces(pos);\r\n\r\n if (pos < max) { continue; }\r\n\r\n haveEndMarker = true;\r\n // found!\r\n break;\r\n }\r\n\r\n // If a fence has heading spaces, they should be removed from its inner block\r\n len = state.tShift[startLine];\r\n\r\n state.line = nextLine + (haveEndMarker ? 1 : 0);\r\n state.tokens.push({\r\n type: 'fence',\r\n params: params,\r\n content: state.getLines(startLine + 1, nextLine, len, true),\r\n lines: [startLine, state.line],\r\n level: state.level\r\n });\r\n\r\n return true;\r\n };\r\n\r\n }, {}], 152: [function (require, module, exports) {\r\n // Process footnote reference list\r\n\r\n 'use strict';\r\n\r\n\r\n module.exports = function footnote(state, startLine, endLine, silent) {\r\n var oldBMark, oldTShift, oldParentType, pos, label,\r\n start = state.bMarks[startLine] + state.tShift[startLine],\r\n max = state.eMarks[startLine];\r\n\r\n // line should be at least 5 chars - \"[^x]:\"\r\n if (start + 4 > max) { return false; }\r\n\r\n if (state.src.charCodeAt(start) !== 0x5B/* [ */) { return false; }\r\n if (state.src.charCodeAt(start + 1) !== 0x5E/* ^ */) { return false; }\r\n if (state.level >= state.options.maxNesting) { return false; }\r\n\r\n for (pos = start + 2; pos < max; pos++) {\r\n if (state.src.charCodeAt(pos) === 0x20) { return false; }\r\n if (state.src.charCodeAt(pos) === 0x5D /* ] */) {\r\n break;\r\n }\r\n }\r\n\r\n if (pos === start + 2) { return false; } // no empty footnote labels\r\n if (pos + 1 >= max || state.src.charCodeAt(++pos) !== 0x3A /* : */) { return false; }\r\n if (silent) { return true; }\r\n pos++;\r\n\r\n if (!state.env.footnotes) { state.env.footnotes = {}; }\r\n if (!state.env.footnotes.refs) { state.env.footnotes.refs = {}; }\r\n label = state.src.slice(start + 2, pos - 2);\r\n state.env.footnotes.refs[':' + label] = -1;\r\n\r\n state.tokens.push({\r\n type: 'footnote_reference_open',\r\n label: label,\r\n level: state.level++\r\n });\r\n\r\n oldBMark = state.bMarks[startLine];\r\n oldTShift = state.tShift[startLine];\r\n oldParentType = state.parentType;\r\n state.tShift[startLine] = state.skipSpaces(pos) - pos;\r\n state.bMarks[startLine] = pos;\r\n state.blkIndent += 4;\r\n state.parentType = 'footnote';\r\n\r\n if (state.tShift[startLine] < state.blkIndent) {\r\n state.tShift[startLine] += state.blkIndent;\r\n state.bMarks[startLine] -= state.blkIndent;\r\n }\r\n\r\n state.parser.tokenize(state, startLine, endLine, true);\r\n\r\n state.parentType = oldParentType;\r\n state.blkIndent -= 4;\r\n state.tShift[startLine] = oldTShift;\r\n state.bMarks[startLine] = oldBMark;\r\n\r\n state.tokens.push({\r\n type: 'footnote_reference_close',\r\n level: --state.level\r\n });\r\n\r\n return true;\r\n };\r\n\r\n }, {}], 153: [function (require, module, exports) {\r\n // heading (#, ##, ...)\r\n\r\n 'use strict';\r\n\r\n\r\n module.exports = function heading(state, startLine, endLine, silent) {\r\n var ch, level, tmp,\r\n pos = state.bMarks[startLine] + state.tShift[startLine],\r\n max = state.eMarks[startLine];\r\n\r\n if (pos >= max) { return false; }\r\n\r\n ch = state.src.charCodeAt(pos);\r\n\r\n if (ch !== 0x23/* # */ || pos >= max) { return false; }\r\n\r\n // count heading level\r\n level = 1;\r\n ch = state.src.charCodeAt(++pos);\r\n while (ch === 0x23/* # */ && pos < max && level <= 6) {\r\n level++;\r\n ch = state.src.charCodeAt(++pos);\r\n }\r\n\r\n if (level > 6 || (pos < max && ch !== 0x20/* space */)) { return false; }\r\n\r\n if (silent) { return true; }\r\n\r\n // Let's cut tails like ' ### ' from the end of string\r\n\r\n max = state.skipCharsBack(max, 0x20, pos); // space\r\n tmp = state.skipCharsBack(max, 0x23, pos); // #\r\n if (tmp > pos && state.src.charCodeAt(tmp - 1) === 0x20/* space */) {\r\n max = tmp;\r\n }\r\n\r\n state.line = startLine + 1;\r\n\r\n state.tokens.push({\r\n type: 'heading_open',\r\n hLevel: level,\r\n lines: [startLine, state.line],\r\n level: state.level\r\n });\r\n\r\n // only if header is not empty\r\n if (pos < max) {\r\n state.tokens.push({\r\n type: 'inline',\r\n content: state.src.slice(pos, max).trim(),\r\n level: state.level + 1,\r\n lines: [startLine, state.line],\r\n children: []\r\n });\r\n }\r\n state.tokens.push({ type: 'heading_close', hLevel: level, level: state.level });\r\n\r\n return true;\r\n };\r\n\r\n }, {}], 154: [function (require, module, exports) {\r\n // Horizontal rule\r\n\r\n 'use strict';\r\n\r\n\r\n module.exports = function hr(state, startLine, endLine, silent) {\r\n var marker, cnt, ch,\r\n pos = state.bMarks[startLine],\r\n max = state.eMarks[startLine];\r\n\r\n pos += state.tShift[startLine];\r\n\r\n if (pos > max) { return false; }\r\n\r\n marker = state.src.charCodeAt(pos++);\r\n\r\n // Check hr marker\r\n if (marker !== 0x2A/* * */ &&\r\n marker !== 0x2D/* - */ &&\r\n marker !== 0x5F/* _ */) {\r\n return false;\r\n }\r\n\r\n // markers can be mixed with spaces, but there should be at least 3 one\r\n\r\n cnt = 1;\r\n while (pos < max) {\r\n ch = state.src.charCodeAt(pos++);\r\n if (ch !== marker && ch !== 0x20/* space */) { return false; }\r\n if (ch === marker) { cnt++; }\r\n }\r\n\r\n if (cnt < 3) { return false; }\r\n\r\n if (silent) { return true; }\r\n\r\n state.line = startLine + 1;\r\n state.tokens.push({\r\n type: 'hr',\r\n lines: [startLine, state.line],\r\n level: state.level\r\n });\r\n\r\n return true;\r\n };\r\n\r\n }, {}], 155: [function (require, module, exports) {\r\n // HTML block\r\n\r\n 'use strict';\r\n\r\n\r\n var block_names = require('../common/html_blocks');\r\n\r\n\r\n var HTML_TAG_OPEN_RE = /^<([a-zA-Z]{1,15})[\\s\\/>]/;\r\n var HTML_TAG_CLOSE_RE = /^<\\/([a-zA-Z]{1,15})[\\s>]/;\r\n\r\n function isLetter(ch) {\r\n /*eslint no-bitwise:0*/\r\n var lc = ch | 0x20; // to lower case\r\n return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */);\r\n }\r\n\r\n module.exports = function htmlblock(state, startLine, endLine, silent) {\r\n var ch, match, nextLine,\r\n pos = state.bMarks[startLine],\r\n max = state.eMarks[startLine],\r\n shift = state.tShift[startLine];\r\n\r\n pos += shift;\r\n\r\n if (!state.options.html) { return false; }\r\n\r\n if (shift > 3 || pos + 2 >= max) { return false; }\r\n\r\n if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }\r\n\r\n ch = state.src.charCodeAt(pos + 1);\r\n\r\n if (ch === 0x21/* ! */ || ch === 0x3F/* ? */) {\r\n // Directive start / comment start / processing instruction start\r\n if (silent) { return true; }\r\n\r\n } else if (ch === 0x2F/* / */ || isLetter(ch)) {\r\n\r\n // Probably start or end of tag\r\n if (ch === 0x2F/* \\ */) {\r\n // closing tag\r\n match = state.src.slice(pos, max).match(HTML_TAG_CLOSE_RE);\r\n if (!match) { return false; }\r\n } else {\r\n // opening tag\r\n match = state.src.slice(pos, max).match(HTML_TAG_OPEN_RE);\r\n if (!match) { return false; }\r\n }\r\n // Make sure tag name is valid\r\n if (block_names[match[1].toLowerCase()] !== true) { return false; }\r\n if (silent) { return true; }\r\n\r\n } else {\r\n return false;\r\n }\r\n\r\n // If we are here - we detected HTML block.\r\n // Let's roll down till empty line (block end).\r\n nextLine = startLine + 1;\r\n while (nextLine < state.lineMax && !state.isEmpty(nextLine)) {\r\n nextLine++;\r\n }\r\n\r\n state.line = nextLine;\r\n state.tokens.push({\r\n type: 'htmlblock',\r\n level: state.level,\r\n lines: [startLine, state.line],\r\n content: state.getLines(startLine, nextLine, 0, true)\r\n });\r\n\r\n return true;\r\n };\r\n\r\n }, { \"../common/html_blocks\": 129 }], 156: [function (require, module, exports) {\r\n // lheading (---, ===)\r\n\r\n 'use strict';\r\n\r\n\r\n module.exports = function lheading(state, startLine, endLine/*, silent*/) {\r\n var marker, pos, max,\r\n next = startLine + 1;\r\n\r\n if (next >= endLine) { return false; }\r\n if (state.tShift[next] < state.blkIndent) { return false; }\r\n\r\n // Scan next line\r\n\r\n if (state.tShift[next] - state.blkIndent > 3) { return false; }\r\n\r\n pos = state.bMarks[next] + state.tShift[next];\r\n max = state.eMarks[next];\r\n\r\n if (pos >= max) { return false; }\r\n\r\n marker = state.src.charCodeAt(pos);\r\n\r\n if (marker !== 0x2D/* - */ && marker !== 0x3D/* = */) { return false; }\r\n\r\n pos = state.skipChars(pos, marker);\r\n\r\n pos = state.skipSpaces(pos);\r\n\r\n if (pos < max) { return false; }\r\n\r\n pos = state.bMarks[startLine] + state.tShift[startLine];\r\n\r\n state.line = next + 1;\r\n state.tokens.push({\r\n type: 'heading_open',\r\n hLevel: marker === 0x3D/* = */ ? 1 : 2,\r\n lines: [startLine, state.line],\r\n level: state.level\r\n });\r\n state.tokens.push({\r\n type: 'inline',\r\n content: state.src.slice(pos, state.eMarks[startLine]).trim(),\r\n level: state.level + 1,\r\n lines: [startLine, state.line - 1],\r\n children: []\r\n });\r\n state.tokens.push({\r\n type: 'heading_close',\r\n hLevel: marker === 0x3D/* = */ ? 1 : 2,\r\n level: state.level\r\n });\r\n\r\n return true;\r\n };\r\n\r\n }, {}], 157: [function (require, module, exports) {\r\n // Lists\r\n\r\n 'use strict';\r\n\r\n\r\n // Search `[-+*][\\n ]`, returns next pos arter marker on success\r\n // or -1 on fail.\r\n function skipBulletListMarker(state, startLine) {\r\n var marker, pos, max;\r\n\r\n pos = state.bMarks[startLine] + state.tShift[startLine];\r\n max = state.eMarks[startLine];\r\n\r\n if (pos >= max) { return -1; }\r\n\r\n marker = state.src.charCodeAt(pos++);\r\n // Check bullet\r\n if (marker !== 0x2A/* * */ &&\r\n marker !== 0x2D/* - */ &&\r\n marker !== 0x2B/* + */) {\r\n return -1;\r\n }\r\n\r\n if (pos < max && state.src.charCodeAt(pos) !== 0x20) {\r\n // \" 1.test \" - is not a list item\r\n return -1;\r\n }\r\n\r\n return pos;\r\n }\r\n\r\n // Search `\\d+[.)][\\n ]`, returns next pos arter marker on success\r\n // or -1 on fail.\r\n function skipOrderedListMarker(state, startLine) {\r\n var ch,\r\n pos = state.bMarks[startLine] + state.tShift[startLine],\r\n max = state.eMarks[startLine];\r\n\r\n if (pos + 1 >= max) { return -1; }\r\n\r\n ch = state.src.charCodeAt(pos++);\r\n\r\n if (ch < 0x30/* 0 */ || ch > 0x39/* 9 */) { return -1; }\r\n\r\n for (; ;) {\r\n // EOL -> fail\r\n if (pos >= max) { return -1; }\r\n\r\n ch = state.src.charCodeAt(pos++);\r\n\r\n if (ch >= 0x30/* 0 */ && ch <= 0x39/* 9 */) {\r\n continue;\r\n }\r\n\r\n // found valid marker\r\n if (ch === 0x29/* ) */ || ch === 0x2e/* . */) {\r\n break;\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n\r\n if (pos < max && state.src.charCodeAt(pos) !== 0x20/* space */) {\r\n // \" 1.test \" - is not a list item\r\n return -1;\r\n }\r\n return pos;\r\n }\r\n\r\n function markTightParagraphs(state, idx) {\r\n var i, l,\r\n level = state.level + 2;\r\n\r\n for (i = idx + 2, l = state.tokens.length - 2; i < l; i++) {\r\n if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') {\r\n state.tokens[i + 2].tight = true;\r\n state.tokens[i].tight = true;\r\n i += 2;\r\n }\r\n }\r\n }\r\n\r\n\r\n module.exports = function list(state, startLine, endLine, silent) {\r\n var nextLine,\r\n indent,\r\n oldTShift,\r\n oldIndent,\r\n oldTight,\r\n oldParentType,\r\n start,\r\n posAfterMarker,\r\n max,\r\n indentAfterMarker,\r\n markerValue,\r\n markerCharCode,\r\n isOrdered,\r\n contentStart,\r\n listTokIdx,\r\n prevEmptyEnd,\r\n listLines,\r\n itemLines,\r\n tight = true,\r\n terminatorRules,\r\n i, l, terminate;\r\n\r\n // Detect list type and position after marker\r\n if ((posAfterMarker = skipOrderedListMarker(state, startLine)) >= 0) {\r\n isOrdered = true;\r\n } else if ((posAfterMarker = skipBulletListMarker(state, startLine)) >= 0) {\r\n isOrdered = false;\r\n } else {\r\n return false;\r\n }\r\n\r\n if (state.level >= state.options.maxNesting) { return false; }\r\n\r\n // We should terminate list on style change. Remember first one to compare.\r\n markerCharCode = state.src.charCodeAt(posAfterMarker - 1);\r\n\r\n // For validation mode we can terminate immediately\r\n if (silent) { return true; }\r\n\r\n // Start list\r\n listTokIdx = state.tokens.length;\r\n\r\n if (isOrdered) {\r\n start = state.bMarks[startLine] + state.tShift[startLine];\r\n markerValue = Number(state.src.substr(start, posAfterMarker - start - 1));\r\n\r\n state.tokens.push({\r\n type: 'ordered_list_open',\r\n order: markerValue,\r\n lines: listLines = [startLine, 0],\r\n level: state.level++\r\n });\r\n\r\n } else {\r\n state.tokens.push({\r\n type: 'bullet_list_open',\r\n lines: listLines = [startLine, 0],\r\n level: state.level++\r\n });\r\n }\r\n\r\n //\r\n // Iterate list items\r\n //\r\n\r\n nextLine = startLine;\r\n prevEmptyEnd = false;\r\n terminatorRules = state.parser.ruler.getRules('list');\r\n\r\n while (nextLine < endLine) {\r\n contentStart = state.skipSpaces(posAfterMarker);\r\n max = state.eMarks[nextLine];\r\n\r\n if (contentStart >= max) {\r\n // trimming space in \"- \\n 3\" case, indent is 1 here\r\n indentAfterMarker = 1;\r\n } else {\r\n indentAfterMarker = contentStart - posAfterMarker;\r\n }\r\n\r\n // If we have more than 4 spaces, the indent is 1\r\n // (the rest is just indented code block)\r\n if (indentAfterMarker > 4) { indentAfterMarker = 1; }\r\n\r\n // If indent is less than 1, assume that it's one, example:\r\n // \"-\\n test\"\r\n if (indentAfterMarker < 1) { indentAfterMarker = 1; }\r\n\r\n // \" - test\"\r\n // ^^^^^ - calculating total length of this thing\r\n indent = (posAfterMarker - state.bMarks[nextLine]) + indentAfterMarker;\r\n\r\n // Run subparser & write tokens\r\n state.tokens.push({\r\n type: 'list_item_open',\r\n lines: itemLines = [startLine, 0],\r\n level: state.level++\r\n });\r\n\r\n oldIndent = state.blkIndent;\r\n oldTight = state.tight;\r\n oldTShift = state.tShift[startLine];\r\n oldParentType = state.parentType;\r\n state.tShift[startLine] = contentStart - state.bMarks[startLine];\r\n state.blkIndent = indent;\r\n state.tight = true;\r\n state.parentType = 'list';\r\n\r\n state.parser.tokenize(state, startLine, endLine, true);\r\n\r\n // If any of list item is tight, mark list as tight\r\n if (!state.tight || prevEmptyEnd) {\r\n tight = false;\r\n }\r\n // Item become loose if finish with empty line,\r\n // but we should filter last element, because it means list finish\r\n prevEmptyEnd = (state.line - startLine) > 1 && state.isEmpty(state.line - 1);\r\n\r\n state.blkIndent = oldIndent;\r\n state.tShift[startLine] = oldTShift;\r\n state.tight = oldTight;\r\n state.parentType = oldParentType;\r\n\r\n state.tokens.push({\r\n type: 'list_item_close',\r\n level: --state.level\r\n });\r\n\r\n nextLine = startLine = state.line;\r\n itemLines[1] = nextLine;\r\n contentStart = state.bMarks[startLine];\r\n\r\n if (nextLine >= endLine) { break; }\r\n\r\n if (state.isEmpty(nextLine)) {\r\n break;\r\n }\r\n\r\n //\r\n // Try to check if list is terminated or continued.\r\n //\r\n if (state.tShift[nextLine] < state.blkIndent) { break; }\r\n\r\n // fail if terminating block found\r\n terminate = false;\r\n for (i = 0, l = terminatorRules.length; i < l; i++) {\r\n if (terminatorRules[i](state, nextLine, endLine, true)) {\r\n terminate = true;\r\n break;\r\n }\r\n }\r\n if (terminate) { break; }\r\n\r\n // fail if list has another type\r\n if (isOrdered) {\r\n posAfterMarker = skipOrderedListMarker(state, nextLine);\r\n if (posAfterMarker < 0) { break; }\r\n } else {\r\n posAfterMarker = skipBulletListMarker(state, nextLine);\r\n if (posAfterMarker < 0) { break; }\r\n }\r\n\r\n if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { break; }\r\n }\r\n\r\n // Finilize list\r\n state.tokens.push({\r\n type: isOrdered ? 'ordered_list_close' : 'bullet_list_close',\r\n level: --state.level\r\n });\r\n listLines[1] = nextLine;\r\n\r\n state.line = nextLine;\r\n\r\n // mark paragraphs tight if needed\r\n if (tight) {\r\n markTightParagraphs(state, listTokIdx);\r\n }\r\n\r\n return true;\r\n };\r\n\r\n }, {}], 158: [function (require, module, exports) {\r\n // Paragraph\r\n\r\n 'use strict';\r\n\r\n\r\n module.exports = function paragraph(state, startLine/*, endLine*/) {\r\n var endLine, content, terminate, i, l,\r\n nextLine = startLine + 1,\r\n terminatorRules;\r\n\r\n endLine = state.lineMax;\r\n\r\n // jump line-by-line until empty one or EOF\r\n if (nextLine < endLine && !state.isEmpty(nextLine)) {\r\n terminatorRules = state.parser.ruler.getRules('paragraph');\r\n\r\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\r\n // this would be a code block normally, but after paragraph\r\n // it's considered a lazy continuation regardless of what's there\r\n if (state.tShift[nextLine] - state.blkIndent > 3) { continue; }\r\n\r\n // Some tags can terminate paragraph without empty line.\r\n terminate = false;\r\n for (i = 0, l = terminatorRules.length; i < l; i++) {\r\n if (terminatorRules[i](state, nextLine, endLine, true)) {\r\n terminate = true;\r\n break;\r\n }\r\n }\r\n if (terminate) { break; }\r\n }\r\n }\r\n\r\n content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\r\n\r\n state.line = nextLine;\r\n if (content.length) {\r\n state.tokens.push({\r\n type: 'paragraph_open',\r\n tight: false,\r\n lines: [startLine, state.line],\r\n level: state.level\r\n });\r\n state.tokens.push({\r\n type: 'inline',\r\n content: content,\r\n level: state.level + 1,\r\n lines: [startLine, state.line],\r\n children: []\r\n });\r\n state.tokens.push({\r\n type: 'paragraph_close',\r\n tight: false,\r\n level: state.level\r\n });\r\n }\r\n\r\n return true;\r\n };\r\n\r\n }, {}], 159: [function (require, module, exports) {\r\n // Parser state class\r\n\r\n 'use strict';\r\n\r\n\r\n function StateBlock(src, parser, options, env, tokens) {\r\n var ch, s, start, pos, len, indent, indent_found;\r\n\r\n this.src = src;\r\n\r\n // Shortcuts to simplify nested calls\r\n this.parser = parser;\r\n\r\n this.options = options;\r\n\r\n this.env = env;\r\n\r\n //\r\n // Internal state vartiables\r\n //\r\n\r\n this.tokens = tokens;\r\n\r\n this.bMarks = []; // line begin offsets for fast jumps\r\n this.eMarks = []; // line end offsets for fast jumps\r\n this.tShift = []; // indent for each line\r\n\r\n // block parser variables\r\n this.blkIndent = 0; // required block content indent\r\n // (for example, if we are in list)\r\n this.line = 0; // line index in src\r\n this.lineMax = 0; // lines count\r\n this.tight = false; // loose/tight mode for lists\r\n this.parentType = 'root'; // if `list`, block parser stops on two newlines\r\n this.ddIndent = -1; // indent of the current dd block (-1 if there isn't any)\r\n\r\n this.level = 0;\r\n\r\n // renderer\r\n this.result = '';\r\n\r\n // Create caches\r\n // Generate markers.\r\n s = this.src;\r\n indent = 0;\r\n indent_found = false;\r\n\r\n for (start = pos = indent = 0, len = s.length; pos < len; pos++) {\r\n ch = s.charCodeAt(pos);\r\n\r\n if (!indent_found) {\r\n if (ch === 0x20/* space */) {\r\n indent++;\r\n continue;\r\n } else {\r\n indent_found = true;\r\n }\r\n }\r\n\r\n if (ch === 0x0A || pos === len - 1) {\r\n if (ch !== 0x0A) { pos++; }\r\n this.bMarks.push(start);\r\n this.eMarks.push(pos);\r\n this.tShift.push(indent);\r\n\r\n indent_found = false;\r\n indent = 0;\r\n start = pos + 1;\r\n }\r\n }\r\n\r\n // Push fake entry to simplify cache bounds checks\r\n this.bMarks.push(s.length);\r\n this.eMarks.push(s.length);\r\n this.tShift.push(0);\r\n\r\n this.lineMax = this.bMarks.length - 1; // don't count last fake line\r\n }\r\n\r\n StateBlock.prototype.isEmpty = function isEmpty(line) {\r\n return this.bMarks[line] + this.tShift[line] >= this.eMarks[line];\r\n };\r\n\r\n StateBlock.prototype.skipEmptyLines = function skipEmptyLines(from) {\r\n for (var max = this.lineMax; from < max; from++) {\r\n if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) {\r\n break;\r\n }\r\n }\r\n return from;\r\n };\r\n\r\n // Skip spaces from given position.\r\n StateBlock.prototype.skipSpaces = function skipSpaces(pos) {\r\n for (var max = this.src.length; pos < max; pos++) {\r\n if (this.src.charCodeAt(pos) !== 0x20/* space */) { break; }\r\n }\r\n return pos;\r\n };\r\n\r\n // Skip char codes from given position\r\n StateBlock.prototype.skipChars = function skipChars(pos, code) {\r\n for (var max = this.src.length; pos < max; pos++) {\r\n if (this.src.charCodeAt(pos) !== code) { break; }\r\n }\r\n return pos;\r\n };\r\n\r\n // Skip char codes reverse from given position - 1\r\n StateBlock.prototype.skipCharsBack = function skipCharsBack(pos, code, min) {\r\n if (pos <= min) { return pos; }\r\n\r\n while (pos > min) {\r\n if (code !== this.src.charCodeAt(--pos)) { return pos + 1; }\r\n }\r\n return pos;\r\n };\r\n\r\n // cut lines range from source.\r\n StateBlock.prototype.getLines = function getLines(begin, end, indent, keepLastLF) {\r\n var i, first, last, queue, shift,\r\n line = begin;\r\n\r\n if (begin >= end) {\r\n return '';\r\n }\r\n\r\n // Opt: don't use push queue for single line;\r\n if (line + 1 === end) {\r\n first = this.bMarks[line] + Math.min(this.tShift[line], indent);\r\n last = keepLastLF ? this.eMarks[line] + 1 : this.eMarks[line];\r\n return this.src.slice(first, last);\r\n }\r\n\r\n queue = new Array(end - begin);\r\n\r\n for (i = 0; line < end; line++ , i++) {\r\n shift = this.tShift[line];\r\n if (shift > indent) { shift = indent; }\r\n if (shift < 0) { shift = 0; }\r\n\r\n first = this.bMarks[line] + shift;\r\n\r\n if (line + 1 < end || keepLastLF) {\r\n // No need for bounds check because we have fake entry on tail.\r\n last = this.eMarks[line] + 1;\r\n } else {\r\n last = this.eMarks[line];\r\n }\r\n\r\n queue[i] = this.src.slice(first, last);\r\n }\r\n\r\n return queue.join('');\r\n };\r\n\r\n\r\n module.exports = StateBlock;\r\n\r\n }, {}], 160: [function (require, module, exports) {\r\n // GFM table, non-standard\r\n\r\n 'use strict';\r\n\r\n\r\n function getLine(state, line) {\r\n var pos = state.bMarks[line] + state.blkIndent,\r\n max = state.eMarks[line];\r\n\r\n return state.src.substr(pos, max - pos);\r\n }\r\n\r\n\r\n module.exports = function table(state, startLine, endLine, silent) {\r\n var ch, lineText, pos, i, nextLine, rows,\r\n aligns, t, tableLines, tbodyLines;\r\n\r\n // should have at least three lines\r\n if (startLine + 2 > endLine) { return false; }\r\n\r\n nextLine = startLine + 1;\r\n\r\n if (state.tShift[nextLine] < state.blkIndent) { return false; }\r\n\r\n // first character of the second line should be '|' or '-'\r\n\r\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\r\n if (pos >= state.eMarks[nextLine]) { return false; }\r\n\r\n ch = state.src.charCodeAt(pos);\r\n if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */) { return false; }\r\n\r\n lineText = getLine(state, startLine + 1);\r\n if (!/^[-:| ]+$/.test(lineText)) { return false; }\r\n\r\n rows = lineText.split('|');\r\n if (rows <= 2) { return false; }\r\n aligns = [];\r\n for (i = 0; i < rows.length; i++) {\r\n t = rows[i].trim();\r\n if (!t) {\r\n // allow empty columns before and after table, but not in between columns;\r\n // e.g. allow ` |---| `, disallow ` ---||--- `\r\n if (i === 0 || i === rows.length - 1) {\r\n continue;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n if (!/^:?-+:?$/.test(t)) { return false; }\r\n if (t.charCodeAt(t.length - 1) === 0x3A/* : */) {\r\n aligns.push(t.charCodeAt(0) === 0x3A/* : */ ? 'center' : 'right');\r\n } else if (t.charCodeAt(0) === 0x3A/* : */) {\r\n aligns.push('left');\r\n } else {\r\n aligns.push('');\r\n }\r\n }\r\n\r\n lineText = getLine(state, startLine).trim();\r\n if (lineText.indexOf('|') === -1) { return false; }\r\n rows = lineText.replace(/^\\||\\|$/g, '').split('|');\r\n if (aligns.length !== rows.length) { return false; }\r\n if (silent) { return true; }\r\n\r\n state.tokens.push({\r\n type: 'table_open',\r\n lines: tableLines = [startLine, 0],\r\n level: state.level++\r\n });\r\n state.tokens.push({\r\n type: 'thead_open',\r\n lines: [startLine, startLine + 1],\r\n level: state.level++\r\n });\r\n\r\n state.tokens.push({\r\n type: 'tr_open',\r\n lines: [startLine, startLine + 1],\r\n level: state.level++\r\n });\r\n for (i = 0; i < rows.length; i++) {\r\n state.tokens.push({\r\n type: 'th_open',\r\n align: aligns[i],\r\n lines: [startLine, startLine + 1],\r\n level: state.level++\r\n });\r\n state.tokens.push({\r\n type: 'inline',\r\n content: rows[i].trim(),\r\n lines: [startLine, startLine + 1],\r\n level: state.level,\r\n children: []\r\n });\r\n state.tokens.push({ type: 'th_close', level: --state.level });\r\n }\r\n state.tokens.push({ type: 'tr_close', level: --state.level });\r\n state.tokens.push({ type: 'thead_close', level: --state.level });\r\n\r\n state.tokens.push({\r\n type: 'tbody_open',\r\n lines: tbodyLines = [startLine + 2, 0],\r\n level: state.level++\r\n });\r\n\r\n for (nextLine = startLine + 2; nextLine < endLine; nextLine++) {\r\n if (state.tShift[nextLine] < state.blkIndent) { break; }\r\n\r\n lineText = getLine(state, nextLine).trim();\r\n if (lineText.indexOf('|') === -1) { break; }\r\n rows = lineText.replace(/^\\||\\|$/g, '').split('|');\r\n\r\n state.tokens.push({ type: 'tr_open', level: state.level++ });\r\n for (i = 0; i < rows.length; i++) {\r\n state.tokens.push({ type: 'td_open', align: aligns[i], level: state.level++ });\r\n state.tokens.push({\r\n type: 'inline',\r\n content: rows[i].replace(/^\\|? *| *\\|?$/g, ''),\r\n level: state.level,\r\n children: []\r\n });\r\n state.tokens.push({ type: 'td_close', level: --state.level });\r\n }\r\n state.tokens.push({ type: 'tr_close', level: --state.level });\r\n }\r\n state.tokens.push({ type: 'tbody_close', level: --state.level });\r\n state.tokens.push({ type: 'table_close', level: --state.level });\r\n\r\n tableLines[1] = tbodyLines[1] = nextLine;\r\n state.line = nextLine;\r\n return true;\r\n };\r\n\r\n }, {}], 161: [function (require, module, exports) {\r\n // Parse abbreviation definitions, i.e. `*[abbr]: description`\r\n //\r\n\r\n 'use strict';\r\n\r\n\r\n var StateInline = require('../rules_inline/state_inline');\r\n var parseLinkLabel = require('../helpers/parse_link_label');\r\n\r\n\r\n function parseAbbr(str, parserInline, options, env) {\r\n var state, labelEnd, pos, max, label, title;\r\n\r\n if (str.charCodeAt(0) !== 0x2A/* * */) { return -1; }\r\n if (str.charCodeAt(1) !== 0x5B/* [ */) { return -1; }\r\n\r\n if (str.indexOf(']:') === -1) { return -1; }\r\n\r\n state = new StateInline(str, parserInline, options, env, []);\r\n labelEnd = parseLinkLabel(state, 1);\r\n\r\n if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return -1; }\r\n\r\n max = state.posMax;\r\n\r\n // abbr title is always one line, so looking for ending \"\\n\" here\r\n for (pos = labelEnd + 2; pos < max; pos++) {\r\n if (state.src.charCodeAt(pos) === 0x0A) { break; }\r\n }\r\n\r\n label = str.slice(2, labelEnd);\r\n title = str.slice(labelEnd + 2, pos).trim();\r\n if (title.length === 0) { return -1; }\r\n if (!env.abbreviations) { env.abbreviations = {}; }\r\n // prepend ':' to avoid conflict with Object.prototype members\r\n if (typeof env.abbreviations[':' + label] === 'undefined') {\r\n env.abbreviations[':' + label] = title;\r\n }\r\n\r\n return pos;\r\n }\r\n\r\n module.exports = function abbr(state) {\r\n var tokens = state.tokens, i, l, content, pos;\r\n\r\n if (state.inlineMode) {\r\n return;\r\n }\r\n\r\n // Parse inlines\r\n for (i = 1, l = tokens.length - 1; i < l; i++) {\r\n if (tokens[i - 1].type === 'paragraph_open' &&\r\n tokens[i].type === 'inline' &&\r\n tokens[i + 1].type === 'paragraph_close') {\r\n\r\n content = tokens[i].content;\r\n while (content.length) {\r\n pos = parseAbbr(content, state.inline, state.options, state.env);\r\n if (pos < 0) { break; }\r\n content = content.slice(pos).trim();\r\n }\r\n\r\n tokens[i].content = content;\r\n if (!content.length) {\r\n tokens[i - 1].tight = true;\r\n tokens[i + 1].tight = true;\r\n }\r\n }\r\n }\r\n };\r\n\r\n }, { \"../helpers/parse_link_label\": 139, \"../rules_inline/state_inline\": 183 }], 162: [function (require, module, exports) {\r\n // Enclose abbreviations in tags\r\n //\r\n 'use strict';\r\n\r\n\r\n var PUNCT_CHARS = ' \\n()[]\\'\".,!?-';\r\n\r\n\r\n // from Google closure library\r\n // http://closure-library.googlecode.com/git-history/docs/local_closure_goog_string_string.js.source.html#line1021\r\n function regEscape(s) {\r\n return s.replace(/([-()\\[\\]{}+?*.$\\^|,:#= 0; i--) {\r\n token = tokens[i];\r\n if (token.type !== 'text') { continue; }\r\n\r\n pos = 0;\r\n text = token.content;\r\n reg.lastIndex = 0;\r\n level = token.level;\r\n nodes = [];\r\n\r\n while ((m = reg.exec(text))) {\r\n if (reg.lastIndex > pos) {\r\n nodes.push({\r\n type: 'text',\r\n content: text.slice(pos, m.index + m[1].length),\r\n level: level\r\n });\r\n }\r\n\r\n nodes.push({\r\n type: 'abbr_open',\r\n title: state.env.abbreviations[':' + m[2]],\r\n level: level++\r\n });\r\n nodes.push({\r\n type: 'text',\r\n content: m[2],\r\n level: level\r\n });\r\n nodes.push({\r\n type: 'abbr_close',\r\n level: --level\r\n });\r\n pos = reg.lastIndex - m[3].length;\r\n }\r\n\r\n if (!nodes.length) { continue; }\r\n\r\n if (pos < text.length) {\r\n nodes.push({\r\n type: 'text',\r\n content: text.slice(pos),\r\n level: level\r\n });\r\n }\r\n\r\n // replace current node\r\n blockTokens[j].children = tokens = [].concat(tokens.slice(0, i), nodes, tokens.slice(i + 1));\r\n }\r\n }\r\n };\r\n\r\n }, {}], 163: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n module.exports = function block(state) {\r\n\r\n if (state.inlineMode) {\r\n state.tokens.push({\r\n type: 'inline',\r\n content: state.src.replace(/\\n/g, ' ').trim(),\r\n level: 0,\r\n lines: [0, 1],\r\n children: []\r\n });\r\n\r\n } else {\r\n state.block.parse(state.src, state.options, state.env, state.tokens);\r\n }\r\n };\r\n\r\n }, {}], 164: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n\r\n module.exports = function footnote_block(state) {\r\n var i, l, j, t, lastParagraph, list, tokens, current, currentLabel,\r\n level = 0,\r\n insideRef = false,\r\n refTokens = {};\r\n\r\n if (!state.env.footnotes) { return; }\r\n\r\n state.tokens = state.tokens.filter(function (tok) {\r\n if (tok.type === 'footnote_reference_open') {\r\n insideRef = true;\r\n current = [];\r\n currentLabel = tok.label;\r\n return false;\r\n }\r\n if (tok.type === 'footnote_reference_close') {\r\n insideRef = false;\r\n // prepend ':' to avoid conflict with Object.prototype members\r\n refTokens[':' + currentLabel] = current;\r\n return false;\r\n }\r\n if (insideRef) { current.push(tok); }\r\n return !insideRef;\r\n });\r\n\r\n if (!state.env.footnotes.list) { return; }\r\n list = state.env.footnotes.list;\r\n\r\n state.tokens.push({\r\n type: 'footnote_block_open',\r\n level: level++\r\n });\r\n for (i = 0, l = list.length; i < l; i++) {\r\n state.tokens.push({\r\n type: 'footnote_open',\r\n id: i,\r\n level: level++\r\n });\r\n\r\n if (list[i].tokens) {\r\n tokens = [];\r\n tokens.push({\r\n type: 'paragraph_open',\r\n tight: false,\r\n level: level++\r\n });\r\n tokens.push({\r\n type: 'inline',\r\n content: '',\r\n level: level,\r\n children: list[i].tokens\r\n });\r\n tokens.push({\r\n type: 'paragraph_close',\r\n tight: false,\r\n level: --level\r\n });\r\n } else if (list[i].label) {\r\n tokens = refTokens[':' + list[i].label];\r\n }\r\n\r\n state.tokens = state.tokens.concat(tokens);\r\n if (state.tokens[state.tokens.length - 1].type === 'paragraph_close') {\r\n lastParagraph = state.tokens.pop();\r\n } else {\r\n lastParagraph = null;\r\n }\r\n\r\n t = list[i].count > 0 ? list[i].count : 1;\r\n for (j = 0; j < t; j++) {\r\n state.tokens.push({\r\n type: 'footnote_anchor',\r\n id: i,\r\n subId: j,\r\n level: level\r\n });\r\n }\r\n\r\n if (lastParagraph) {\r\n state.tokens.push(lastParagraph);\r\n }\r\n\r\n state.tokens.push({\r\n type: 'footnote_close',\r\n level: --level\r\n });\r\n }\r\n state.tokens.push({\r\n type: 'footnote_block_close',\r\n level: --level\r\n });\r\n };\r\n\r\n }, {}], 165: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n module.exports = function inline(state) {\r\n var tokens = state.tokens, tok, i, l;\r\n\r\n // Parse inlines\r\n for (i = 0, l = tokens.length; i < l; i++) {\r\n tok = tokens[i];\r\n if (tok.type === 'inline') {\r\n state.inline.parse(tok.content, state.options, state.env, tok.children);\r\n }\r\n }\r\n };\r\n\r\n }, {}], 166: [function (require, module, exports) {\r\n // Replace link-like texts with link nodes.\r\n //\r\n // Currently restricted by `inline.validateLink()` to http/https/ftp\r\n //\r\n 'use strict';\r\n\r\n\r\n var Autolinker = require('autolinker');\r\n\r\n\r\n var LINK_SCAN_RE = /www|@|\\:\\/\\//;\r\n\r\n\r\n function isLinkOpen(str) {\r\n return /^\\s]/i.test(str);\r\n }\r\n function isLinkClose(str) {\r\n return /^<\\/a\\s*>/i.test(str);\r\n }\r\n\r\n // Stupid fabric to avoid singletons, for thread safety.\r\n // Required for engines like Nashorn.\r\n //\r\n function createLinkifier() {\r\n var links = [];\r\n var autolinker = new Autolinker({\r\n stripPrefix: false,\r\n url: true,\r\n email: true,\r\n twitter: false,\r\n replaceFn: function (linker, match) {\r\n // Only collect matched strings but don't change anything.\r\n switch (match.getType()) {\r\n /*eslint default-case:0*/\r\n case 'url':\r\n links.push({\r\n text: match.matchedText,\r\n url: match.getUrl()\r\n });\r\n break;\r\n case 'email':\r\n links.push({\r\n text: match.matchedText,\r\n // normalize email protocol\r\n url: 'mailto:' + match.getEmail().replace(/^mailto:/i, '')\r\n });\r\n break;\r\n }\r\n return false;\r\n }\r\n });\r\n\r\n return {\r\n links: links,\r\n autolinker: autolinker\r\n };\r\n }\r\n\r\n\r\n module.exports = function linkify(state) {\r\n var i, j, l, tokens, token, text, nodes, ln, pos, level, htmlLinkLevel,\r\n blockTokens = state.tokens,\r\n linkifier = null, links, autolinker;\r\n\r\n if (!state.options.linkify) { return; }\r\n\r\n for (j = 0, l = blockTokens.length; j < l; j++) {\r\n if (blockTokens[j].type !== 'inline') { continue; }\r\n tokens = blockTokens[j].children;\r\n\r\n htmlLinkLevel = 0;\r\n\r\n // We scan from the end, to keep position when new tags added.\r\n // Use reversed logic in links start/end match\r\n for (i = tokens.length - 1; i >= 0; i--) {\r\n token = tokens[i];\r\n\r\n // Skip content of markdown links\r\n if (token.type === 'link_close') {\r\n i--;\r\n while (tokens[i].level !== token.level && tokens[i].type !== 'link_open') {\r\n i--;\r\n }\r\n continue;\r\n }\r\n\r\n // Skip content of html tag links\r\n if (token.type === 'htmltag') {\r\n if (isLinkOpen(token.content) && htmlLinkLevel > 0) {\r\n htmlLinkLevel--;\r\n }\r\n if (isLinkClose(token.content)) {\r\n htmlLinkLevel++;\r\n }\r\n }\r\n if (htmlLinkLevel > 0) { continue; }\r\n\r\n if (token.type === 'text' && LINK_SCAN_RE.test(token.content)) {\r\n\r\n // Init linkifier in lazy manner, only if required.\r\n if (!linkifier) {\r\n linkifier = createLinkifier();\r\n links = linkifier.links;\r\n autolinker = linkifier.autolinker;\r\n }\r\n\r\n text = token.content;\r\n links.length = 0;\r\n autolinker.link(text);\r\n\r\n if (!links.length) { continue; }\r\n\r\n // Now split string to nodes\r\n nodes = [];\r\n level = token.level;\r\n\r\n for (ln = 0; ln < links.length; ln++) {\r\n\r\n if (!state.inline.validateLink(links[ln].url)) { continue; }\r\n\r\n pos = text.indexOf(links[ln].text);\r\n\r\n if (pos) {\r\n level = level;\r\n nodes.push({\r\n type: 'text',\r\n content: text.slice(0, pos),\r\n level: level\r\n });\r\n }\r\n nodes.push({\r\n type: 'link_open',\r\n href: links[ln].url,\r\n title: '',\r\n level: level++\r\n });\r\n nodes.push({\r\n type: 'text',\r\n content: links[ln].text,\r\n level: level\r\n });\r\n nodes.push({\r\n type: 'link_close',\r\n level: --level\r\n });\r\n text = text.slice(pos + links[ln].text.length);\r\n }\r\n if (text.length) {\r\n nodes.push({\r\n type: 'text',\r\n content: text,\r\n level: level\r\n });\r\n }\r\n\r\n // replace current node\r\n blockTokens[j].children = tokens = [].concat(tokens.slice(0, i), nodes, tokens.slice(i + 1));\r\n }\r\n }\r\n }\r\n };\r\n\r\n }, { \"autolinker\": 8 }], 167: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n\r\n var StateInline = require('../rules_inline/state_inline');\r\n var parseLinkLabel = require('../helpers/parse_link_label');\r\n var parseLinkDestination = require('../helpers/parse_link_destination');\r\n var parseLinkTitle = require('../helpers/parse_link_title');\r\n var normalizeReference = require('../helpers/normalize_reference');\r\n\r\n\r\n function parseReference(str, parser, options, env) {\r\n var state, labelEnd, pos, max, code, start, href, title, label;\r\n\r\n if (str.charCodeAt(0) !== 0x5B/* [ */) { return -1; }\r\n\r\n if (str.indexOf(']:') === -1) { return -1; }\r\n\r\n state = new StateInline(str, parser, options, env, []);\r\n labelEnd = parseLinkLabel(state, 0);\r\n\r\n if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return -1; }\r\n\r\n max = state.posMax;\r\n\r\n // [label]: destination 'title'\r\n // ^^^ skip optional whitespace here\r\n for (pos = labelEnd + 2; pos < max; pos++) {\r\n code = state.src.charCodeAt(pos);\r\n if (code !== 0x20 && code !== 0x0A) { break; }\r\n }\r\n\r\n // [label]: destination 'title'\r\n // ^^^^^^^^^^^ parse this\r\n if (!parseLinkDestination(state, pos)) { return -1; }\r\n href = state.linkContent;\r\n pos = state.pos;\r\n\r\n // [label]: destination 'title'\r\n // ^^^ skipping those spaces\r\n start = pos;\r\n for (pos = pos + 1; pos < max; pos++) {\r\n code = state.src.charCodeAt(pos);\r\n if (code !== 0x20 && code !== 0x0A) { break; }\r\n }\r\n\r\n // [label]: destination 'title'\r\n // ^^^^^^^ parse this\r\n if (pos < max && start !== pos && parseLinkTitle(state, pos)) {\r\n title = state.linkContent;\r\n pos = state.pos;\r\n } else {\r\n title = '';\r\n pos = start;\r\n }\r\n\r\n // ensure that the end of the line is empty\r\n while (pos < max && state.src.charCodeAt(pos) === 0x20/* space */) { pos++; }\r\n if (pos < max && state.src.charCodeAt(pos) !== 0x0A) { return -1; }\r\n\r\n label = normalizeReference(str.slice(1, labelEnd));\r\n if (typeof env.references[label] === 'undefined') {\r\n env.references[label] = { title: title, href: href };\r\n }\r\n\r\n return pos;\r\n }\r\n\r\n\r\n module.exports = function references(state) {\r\n var tokens = state.tokens, i, l, content, pos;\r\n\r\n state.env.references = state.env.references || {};\r\n\r\n if (state.inlineMode) {\r\n return;\r\n }\r\n\r\n // Scan definitions in paragraph inlines\r\n for (i = 1, l = tokens.length - 1; i < l; i++) {\r\n if (tokens[i].type === 'inline' &&\r\n tokens[i - 1].type === 'paragraph_open' &&\r\n tokens[i + 1].type === 'paragraph_close') {\r\n\r\n content = tokens[i].content;\r\n while (content.length) {\r\n pos = parseReference(content, state.inline, state.options, state.env);\r\n if (pos < 0) { break; }\r\n content = content.slice(pos).trim();\r\n }\r\n\r\n tokens[i].content = content;\r\n if (!content.length) {\r\n tokens[i - 1].tight = true;\r\n tokens[i + 1].tight = true;\r\n }\r\n }\r\n }\r\n };\r\n\r\n }, { \"../helpers/normalize_reference\": 137, \"../helpers/parse_link_destination\": 138, \"../helpers/parse_link_label\": 139, \"../helpers/parse_link_title\": 140, \"../rules_inline/state_inline\": 183 }], 168: [function (require, module, exports) {\r\n // Simple typographical replacements\r\n //\r\n 'use strict';\r\n\r\n // TODO:\r\n // - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾\r\n // - miltiplication 2 x 4 -> 2 × 4\r\n\r\n var RARE_RE = /\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/;\r\n\r\n var SCOPED_ABBR_RE = /\\((c|tm|r|p)\\)/ig;\r\n var SCOPED_ABBR = {\r\n 'c': '©',\r\n 'r': '®',\r\n 'p': '§',\r\n 'tm': '™'\r\n };\r\n\r\n function replaceScopedAbbr(str) {\r\n if (str.indexOf('(') < 0) { return str; }\r\n\r\n return str.replace(SCOPED_ABBR_RE, function (match, name) {\r\n return SCOPED_ABBR[name.toLowerCase()];\r\n });\r\n }\r\n\r\n\r\n module.exports = function replace(state) {\r\n var i, token, text, inlineTokens, blkIdx;\r\n\r\n if (!state.options.typographer) { return; }\r\n\r\n for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\r\n\r\n if (state.tokens[blkIdx].type !== 'inline') { continue; }\r\n\r\n inlineTokens = state.tokens[blkIdx].children;\r\n\r\n for (i = inlineTokens.length - 1; i >= 0; i--) {\r\n token = inlineTokens[i];\r\n if (token.type === 'text') {\r\n text = token.content;\r\n\r\n text = replaceScopedAbbr(text);\r\n\r\n if (RARE_RE.test(text)) {\r\n text = text\r\n .replace(/\\+-/g, '±')\r\n // .., ..., ....... -> …\r\n // but ?..... & !..... -> ?.. & !..\r\n .replace(/\\.{2,}/g, '…').replace(/([?!])…/g, '$1..')\r\n .replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',')\r\n // em-dash\r\n .replace(/(^|[^-])---([^-]|$)/mg, '$1\\u2014$2')\r\n // en-dash\r\n .replace(/(^|\\s)--(\\s|$)/mg, '$1\\u2013$2')\r\n .replace(/(^|[^-\\s])--([^-\\s]|$)/mg, '$1\\u2013$2');\r\n }\r\n\r\n token.content = text;\r\n }\r\n }\r\n }\r\n };\r\n\r\n }, {}], 169: [function (require, module, exports) {\r\n // Convert straight quotation marks to typographic ones\r\n //\r\n 'use strict';\r\n\r\n\r\n var QUOTE_TEST_RE = /['\"]/;\r\n var QUOTE_RE = /['\"]/g;\r\n var PUNCT_RE = /[-\\s()\\[\\]]/;\r\n var APOSTROPHE = '’';\r\n\r\n // This function returns true if the character at `pos`\r\n // could be inside a word.\r\n function isLetter(str, pos) {\r\n if (pos < 0 || pos >= str.length) { return false; }\r\n return !PUNCT_RE.test(str[pos]);\r\n }\r\n\r\n\r\n function replaceAt(str, index, ch) {\r\n return str.substr(0, index) + ch + str.substr(index + 1);\r\n }\r\n\r\n\r\n module.exports = function smartquotes(state) {\r\n /*eslint max-depth:0*/\r\n var i, token, text, t, pos, max, thisLevel, lastSpace, nextSpace, item,\r\n canOpen, canClose, j, isSingle, blkIdx, tokens,\r\n stack;\r\n\r\n if (!state.options.typographer) { return; }\r\n\r\n stack = [];\r\n\r\n for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\r\n\r\n if (state.tokens[blkIdx].type !== 'inline') { continue; }\r\n\r\n tokens = state.tokens[blkIdx].children;\r\n stack.length = 0;\r\n\r\n for (i = 0; i < tokens.length; i++) {\r\n token = tokens[i];\r\n\r\n if (token.type !== 'text' || QUOTE_TEST_RE.test(token.text)) { continue; }\r\n\r\n thisLevel = tokens[i].level;\r\n\r\n for (j = stack.length - 1; j >= 0; j--) {\r\n if (stack[j].level <= thisLevel) { break; }\r\n }\r\n stack.length = j + 1;\r\n\r\n text = token.content;\r\n pos = 0;\r\n max = text.length;\r\n\r\n /*eslint no-labels:0,block-scoped-var:0*/\r\n OUTER:\r\n while (pos < max) {\r\n QUOTE_RE.lastIndex = pos;\r\n t = QUOTE_RE.exec(text);\r\n if (!t) { break; }\r\n\r\n lastSpace = !isLetter(text, t.index - 1);\r\n pos = t.index + 1;\r\n isSingle = (t[0] === \"'\");\r\n nextSpace = !isLetter(text, pos);\r\n\r\n if (!nextSpace && !lastSpace) {\r\n // middle of word\r\n if (isSingle) {\r\n token.content = replaceAt(token.content, t.index, APOSTROPHE);\r\n }\r\n continue;\r\n }\r\n\r\n canOpen = !nextSpace;\r\n canClose = !lastSpace;\r\n\r\n if (canClose) {\r\n // this could be a closing quote, rewind the stack to get a match\r\n for (j = stack.length - 1; j >= 0; j--) {\r\n item = stack[j];\r\n if (stack[j].level < thisLevel) { break; }\r\n if (item.single === isSingle && stack[j].level === thisLevel) {\r\n item = stack[j];\r\n if (isSingle) {\r\n tokens[item.token].content = replaceAt(tokens[item.token].content, item.pos, state.options.quotes[2]);\r\n token.content = replaceAt(token.content, t.index, state.options.quotes[3]);\r\n } else {\r\n tokens[item.token].content = replaceAt(tokens[item.token].content, item.pos, state.options.quotes[0]);\r\n token.content = replaceAt(token.content, t.index, state.options.quotes[1]);\r\n }\r\n stack.length = j;\r\n continue OUTER;\r\n }\r\n }\r\n }\r\n\r\n if (canOpen) {\r\n stack.push({\r\n token: i,\r\n pos: t.index,\r\n single: isSingle,\r\n level: thisLevel\r\n });\r\n } else if (canClose && isSingle) {\r\n token.content = replaceAt(token.content, t.index, APOSTROPHE);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n }, {}], 170: [function (require, module, exports) {\r\n // Process autolinks ''\r\n\r\n 'use strict';\r\n\r\n var url_schemas = require('../common/url_schemas');\r\n var normalizeLink = require('../helpers/normalize_link');\r\n\r\n\r\n /*eslint max-len:0*/\r\n var EMAIL_RE = /^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/;\r\n var AUTOLINK_RE = /^<([a-zA-Z.\\-]{1,25}):([^<>\\x00-\\x20]*)>/;\r\n\r\n\r\n module.exports = function autolink(state, silent) {\r\n var tail, linkMatch, emailMatch, url, fullUrl, pos = state.pos;\r\n\r\n if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }\r\n\r\n tail = state.src.slice(pos);\r\n\r\n if (tail.indexOf('>') < 0) { return false; }\r\n\r\n linkMatch = tail.match(AUTOLINK_RE);\r\n\r\n if (linkMatch) {\r\n if (url_schemas.indexOf(linkMatch[1].toLowerCase()) < 0) { return false; }\r\n\r\n url = linkMatch[0].slice(1, -1);\r\n fullUrl = normalizeLink(url);\r\n if (!state.parser.validateLink(url)) { return false; }\r\n\r\n if (!silent) {\r\n state.push({\r\n type: 'link_open',\r\n href: fullUrl,\r\n level: state.level\r\n });\r\n state.push({\r\n type: 'text',\r\n content: url,\r\n level: state.level + 1\r\n });\r\n state.push({ type: 'link_close', level: state.level });\r\n }\r\n\r\n state.pos += linkMatch[0].length;\r\n return true;\r\n }\r\n\r\n emailMatch = tail.match(EMAIL_RE);\r\n\r\n if (emailMatch) {\r\n\r\n url = emailMatch[0].slice(1, -1);\r\n\r\n fullUrl = normalizeLink('mailto:' + url);\r\n if (!state.parser.validateLink(fullUrl)) { return false; }\r\n\r\n if (!silent) {\r\n state.push({\r\n type: 'link_open',\r\n href: fullUrl,\r\n level: state.level\r\n });\r\n state.push({\r\n type: 'text',\r\n content: url,\r\n level: state.level + 1\r\n });\r\n state.push({ type: 'link_close', level: state.level });\r\n }\r\n\r\n state.pos += emailMatch[0].length;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n }, { \"../common/url_schemas\": 131, \"../helpers/normalize_link\": 136 }], 171: [function (require, module, exports) {\r\n // Parse backticks\r\n\r\n 'use strict';\r\n\r\n module.exports = function backticks(state, silent) {\r\n var start, max, marker, matchStart, matchEnd,\r\n pos = state.pos,\r\n ch = state.src.charCodeAt(pos);\r\n\r\n if (ch !== 0x60/* ` */) { return false; }\r\n\r\n start = pos;\r\n pos++;\r\n max = state.posMax;\r\n\r\n while (pos < max && state.src.charCodeAt(pos) === 0x60/* ` */) { pos++; }\r\n\r\n marker = state.src.slice(start, pos);\r\n\r\n matchStart = matchEnd = pos;\r\n\r\n while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) {\r\n matchEnd = matchStart + 1;\r\n\r\n while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60/* ` */) { matchEnd++; }\r\n\r\n if (matchEnd - matchStart === marker.length) {\r\n if (!silent) {\r\n state.push({\r\n type: 'code',\r\n content: state.src.slice(pos, matchStart)\r\n .replace(/[ \\n]+/g, ' ')\r\n .trim(),\r\n block: false,\r\n level: state.level\r\n });\r\n }\r\n state.pos = matchEnd;\r\n return true;\r\n }\r\n }\r\n\r\n if (!silent) { state.pending += marker; }\r\n state.pos += marker.length;\r\n return true;\r\n };\r\n\r\n }, {}], 172: [function (require, module, exports) {\r\n // Process ~~deleted text~~\r\n\r\n 'use strict';\r\n\r\n module.exports = function del(state, silent) {\r\n var found,\r\n pos,\r\n stack,\r\n max = state.posMax,\r\n start = state.pos,\r\n lastChar,\r\n nextChar;\r\n\r\n if (state.src.charCodeAt(start) !== 0x7E/* ~ */) { return false; }\r\n if (silent) { return false; } // don't run any pairs in validation mode\r\n if (start + 4 >= max) { return false; }\r\n if (state.src.charCodeAt(start + 1) !== 0x7E/* ~ */) { return false; }\r\n if (state.level >= state.options.maxNesting) { return false; }\r\n\r\n lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1;\r\n nextChar = state.src.charCodeAt(start + 2);\r\n\r\n if (lastChar === 0x7E/* ~ */) { return false; }\r\n if (nextChar === 0x7E/* ~ */) { return false; }\r\n if (nextChar === 0x20 || nextChar === 0x0A) { return false; }\r\n\r\n pos = start + 2;\r\n while (pos < max && state.src.charCodeAt(pos) === 0x7E/* ~ */) { pos++; }\r\n if (pos > start + 3) {\r\n // sequence of 4+ markers taking as literal, same as in a emphasis\r\n state.pos += pos - start;\r\n if (!silent) { state.pending += state.src.slice(start, pos); }\r\n return true;\r\n }\r\n\r\n state.pos = start + 2;\r\n stack = 1;\r\n\r\n while (state.pos + 1 < max) {\r\n if (state.src.charCodeAt(state.pos) === 0x7E/* ~ */) {\r\n if (state.src.charCodeAt(state.pos + 1) === 0x7E/* ~ */) {\r\n lastChar = state.src.charCodeAt(state.pos - 1);\r\n nextChar = state.pos + 2 < max ? state.src.charCodeAt(state.pos + 2) : -1;\r\n if (nextChar !== 0x7E/* ~ */ && lastChar !== 0x7E/* ~ */) {\r\n if (lastChar !== 0x20 && lastChar !== 0x0A) {\r\n // closing '~~'\r\n stack--;\r\n } else if (nextChar !== 0x20 && nextChar !== 0x0A) {\r\n // opening '~~'\r\n stack++;\r\n } // else {\r\n // // standalone ' ~~ ' indented with spaces\r\n // }\r\n if (stack <= 0) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n state.parser.skipToken(state);\r\n }\r\n\r\n if (!found) {\r\n // parser failed to find ending tag, so it's not valid emphasis\r\n state.pos = start;\r\n return false;\r\n }\r\n\r\n // found!\r\n state.posMax = state.pos;\r\n state.pos = start + 2;\r\n\r\n if (!silent) {\r\n state.push({ type: 'del_open', level: state.level++ });\r\n state.parser.tokenize(state);\r\n state.push({ type: 'del_close', level: --state.level });\r\n }\r\n\r\n state.pos = state.posMax + 2;\r\n state.posMax = max;\r\n return true;\r\n };\r\n\r\n }, {}], 173: [function (require, module, exports) {\r\n // Process *this* and _that_\r\n\r\n 'use strict';\r\n\r\n\r\n function isAlphaNum(code) {\r\n return (code >= 0x30 /* 0 */ && code <= 0x39 /* 9 */) ||\r\n (code >= 0x41 /* A */ && code <= 0x5A /* Z */) ||\r\n (code >= 0x61 /* a */ && code <= 0x7A /* z */);\r\n }\r\n\r\n // parse sequence of emphasis markers,\r\n // \"start\" should point at a valid marker\r\n function scanDelims(state, start) {\r\n var pos = start, lastChar, nextChar, count,\r\n can_open = true,\r\n can_close = true,\r\n max = state.posMax,\r\n marker = state.src.charCodeAt(start);\r\n\r\n lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1;\r\n\r\n while (pos < max && state.src.charCodeAt(pos) === marker) { pos++; }\r\n if (pos >= max) { can_open = false; }\r\n count = pos - start;\r\n\r\n if (count >= 4) {\r\n // sequence of four or more unescaped markers can't start/end an emphasis\r\n can_open = can_close = false;\r\n } else {\r\n nextChar = pos < max ? state.src.charCodeAt(pos) : -1;\r\n\r\n // check whitespace conditions\r\n if (nextChar === 0x20 || nextChar === 0x0A) { can_open = false; }\r\n if (lastChar === 0x20 || lastChar === 0x0A) { can_close = false; }\r\n\r\n if (marker === 0x5F /* _ */) {\r\n // check if we aren't inside the word\r\n if (isAlphaNum(lastChar)) { can_open = false; }\r\n if (isAlphaNum(nextChar)) { can_close = false; }\r\n }\r\n }\r\n\r\n return {\r\n can_open: can_open,\r\n can_close: can_close,\r\n delims: count\r\n };\r\n }\r\n\r\n module.exports = function emphasis(state, silent) {\r\n var startCount,\r\n count,\r\n found,\r\n oldCount,\r\n newCount,\r\n stack,\r\n res,\r\n max = state.posMax,\r\n start = state.pos,\r\n marker = state.src.charCodeAt(start);\r\n\r\n if (marker !== 0x5F/* _ */ && marker !== 0x2A /* * */) { return false; }\r\n if (silent) { return false; } // don't run any pairs in validation mode\r\n\r\n res = scanDelims(state, start);\r\n startCount = res.delims;\r\n if (!res.can_open) {\r\n state.pos += startCount;\r\n if (!silent) { state.pending += state.src.slice(start, state.pos); }\r\n return true;\r\n }\r\n\r\n if (state.level >= state.options.maxNesting) { return false; }\r\n\r\n state.pos = start + startCount;\r\n stack = [startCount];\r\n\r\n while (state.pos < max) {\r\n if (state.src.charCodeAt(state.pos) === marker) {\r\n res = scanDelims(state, state.pos);\r\n count = res.delims;\r\n if (res.can_close) {\r\n oldCount = stack.pop();\r\n newCount = count;\r\n\r\n while (oldCount !== newCount) {\r\n if (newCount < oldCount) {\r\n stack.push(oldCount - newCount);\r\n break;\r\n }\r\n\r\n // assert(newCount > oldCount)\r\n newCount -= oldCount;\r\n\r\n if (stack.length === 0) { break; }\r\n state.pos += oldCount;\r\n oldCount = stack.pop();\r\n }\r\n\r\n if (stack.length === 0) {\r\n startCount = oldCount;\r\n found = true;\r\n break;\r\n }\r\n state.pos += count;\r\n continue;\r\n }\r\n\r\n if (res.can_open) { stack.push(count); }\r\n state.pos += count;\r\n continue;\r\n }\r\n\r\n state.parser.skipToken(state);\r\n }\r\n\r\n if (!found) {\r\n // parser failed to find ending tag, so it's not valid emphasis\r\n state.pos = start;\r\n return false;\r\n }\r\n\r\n // found!\r\n state.posMax = state.pos;\r\n state.pos = start + startCount;\r\n\r\n if (!silent) {\r\n if (startCount === 2 || startCount === 3) {\r\n state.push({ type: 'strong_open', level: state.level++ });\r\n }\r\n if (startCount === 1 || startCount === 3) {\r\n state.push({ type: 'em_open', level: state.level++ });\r\n }\r\n\r\n state.parser.tokenize(state);\r\n\r\n if (startCount === 1 || startCount === 3) {\r\n state.push({ type: 'em_close', level: --state.level });\r\n }\r\n if (startCount === 2 || startCount === 3) {\r\n state.push({ type: 'strong_close', level: --state.level });\r\n }\r\n }\r\n\r\n state.pos = state.posMax + startCount;\r\n state.posMax = max;\r\n return true;\r\n };\r\n\r\n }, {}], 174: [function (require, module, exports) {\r\n // Process html entity - {, ¯, ", ...\r\n\r\n 'use strict';\r\n\r\n var entities = require('../common/entities');\r\n var has = require('../common/utils').has;\r\n var isValidEntityCode = require('../common/utils').isValidEntityCode;\r\n var fromCodePoint = require('../common/utils').fromCodePoint;\r\n\r\n\r\n var DIGITAL_RE = /^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i;\r\n var NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i;\r\n\r\n\r\n module.exports = function entity(state, silent) {\r\n var ch, code, match, pos = state.pos, max = state.posMax;\r\n\r\n if (state.src.charCodeAt(pos) !== 0x26/* & */) { return false; }\r\n\r\n if (pos + 1 < max) {\r\n ch = state.src.charCodeAt(pos + 1);\r\n\r\n if (ch === 0x23 /* # */) {\r\n match = state.src.slice(pos).match(DIGITAL_RE);\r\n if (match) {\r\n if (!silent) {\r\n code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10);\r\n state.pending += isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD);\r\n }\r\n state.pos += match[0].length;\r\n return true;\r\n }\r\n } else {\r\n match = state.src.slice(pos).match(NAMED_RE);\r\n if (match) {\r\n if (has(entities, match[1])) {\r\n if (!silent) { state.pending += entities[match[1]]; }\r\n state.pos += match[0].length;\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!silent) { state.pending += '&'; }\r\n state.pos++;\r\n return true;\r\n };\r\n\r\n }, { \"../common/entities\": 128, \"../common/utils\": 132 }], 175: [function (require, module, exports) {\r\n // Proceess escaped chars and hardbreaks\r\n\r\n 'use strict';\r\n\r\n var ESCAPED = [];\r\n\r\n for (var i = 0; i < 256; i++) { ESCAPED.push(0); }\r\n\r\n '\\\\!\"#$%&\\'()*+,./:;<=>?@[]^_`{|}~-'\r\n .split('').forEach(function (ch) { ESCAPED[ch.charCodeAt(0)] = 1; });\r\n\r\n\r\n module.exports = function escape(state, silent) {\r\n var ch, pos = state.pos, max = state.posMax;\r\n\r\n if (state.src.charCodeAt(pos) !== 0x5C/* \\ */) { return false; }\r\n\r\n pos++;\r\n\r\n if (pos < max) {\r\n ch = state.src.charCodeAt(pos);\r\n\r\n if (ch < 256 && ESCAPED[ch] !== 0) {\r\n if (!silent) { state.pending += state.src[pos]; }\r\n state.pos += 2;\r\n return true;\r\n }\r\n\r\n if (ch === 0x0A) {\r\n if (!silent) {\r\n state.push({\r\n type: 'hardbreak',\r\n level: state.level\r\n });\r\n }\r\n\r\n pos++;\r\n // skip leading whitespaces from next line\r\n while (pos < max && state.src.charCodeAt(pos) === 0x20) { pos++; }\r\n\r\n state.pos = pos;\r\n return true;\r\n }\r\n }\r\n\r\n if (!silent) { state.pending += '\\\\'; }\r\n state.pos++;\r\n return true;\r\n };\r\n\r\n }, {}], 176: [function (require, module, exports) {\r\n // Process inline footnotes (^[...])\r\n\r\n 'use strict';\r\n\r\n var parseLinkLabel = require('../helpers/parse_link_label');\r\n\r\n\r\n module.exports = function footnote_inline(state, silent) {\r\n var labelStart,\r\n labelEnd,\r\n footnoteId,\r\n oldLength,\r\n max = state.posMax,\r\n start = state.pos;\r\n\r\n if (start + 2 >= max) { return false; }\r\n if (state.src.charCodeAt(start) !== 0x5E/* ^ */) { return false; }\r\n if (state.src.charCodeAt(start + 1) !== 0x5B/* [ */) { return false; }\r\n if (state.level >= state.options.maxNesting) { return false; }\r\n\r\n labelStart = start + 2;\r\n labelEnd = parseLinkLabel(state, start + 1);\r\n\r\n // parser failed to find ']', so it's not a valid note\r\n if (labelEnd < 0) { return false; }\r\n\r\n // We found the end of the link, and know for a fact it's a valid link;\r\n // so all that's left to do is to call tokenizer.\r\n //\r\n if (!silent) {\r\n if (!state.env.footnotes) { state.env.footnotes = {}; }\r\n if (!state.env.footnotes.list) { state.env.footnotes.list = []; }\r\n footnoteId = state.env.footnotes.list.length;\r\n\r\n state.pos = labelStart;\r\n state.posMax = labelEnd;\r\n\r\n state.push({\r\n type: 'footnote_ref',\r\n id: footnoteId,\r\n level: state.level\r\n });\r\n state.linkLevel++;\r\n oldLength = state.tokens.length;\r\n state.parser.tokenize(state);\r\n state.env.footnotes.list[footnoteId] = { tokens: state.tokens.splice(oldLength) };\r\n state.linkLevel--;\r\n }\r\n\r\n state.pos = labelEnd + 1;\r\n state.posMax = max;\r\n return true;\r\n };\r\n\r\n }, { \"../helpers/parse_link_label\": 139 }], 177: [function (require, module, exports) {\r\n // Process footnote references ([^...])\r\n\r\n 'use strict';\r\n\r\n\r\n module.exports = function footnote_ref(state, silent) {\r\n var label,\r\n pos,\r\n footnoteId,\r\n footnoteSubId,\r\n max = state.posMax,\r\n start = state.pos;\r\n\r\n // should be at least 4 chars - \"[^x]\"\r\n if (start + 3 > max) { return false; }\r\n\r\n if (!state.env.footnotes || !state.env.footnotes.refs) { return false; }\r\n if (state.src.charCodeAt(start) !== 0x5B/* [ */) { return false; }\r\n if (state.src.charCodeAt(start + 1) !== 0x5E/* ^ */) { return false; }\r\n if (state.level >= state.options.maxNesting) { return false; }\r\n\r\n for (pos = start + 2; pos < max; pos++) {\r\n if (state.src.charCodeAt(pos) === 0x20) { return false; }\r\n if (state.src.charCodeAt(pos) === 0x0A) { return false; }\r\n if (state.src.charCodeAt(pos) === 0x5D /* ] */) {\r\n break;\r\n }\r\n }\r\n\r\n if (pos === start + 2) { return false; } // no empty footnote labels\r\n if (pos >= max) { return false; }\r\n pos++;\r\n\r\n label = state.src.slice(start + 2, pos - 1);\r\n if (typeof state.env.footnotes.refs[':' + label] === 'undefined') { return false; }\r\n\r\n if (!silent) {\r\n if (!state.env.footnotes.list) { state.env.footnotes.list = []; }\r\n\r\n if (state.env.footnotes.refs[':' + label] < 0) {\r\n footnoteId = state.env.footnotes.list.length;\r\n state.env.footnotes.list[footnoteId] = { label: label, count: 0 };\r\n state.env.footnotes.refs[':' + label] = footnoteId;\r\n } else {\r\n footnoteId = state.env.footnotes.refs[':' + label];\r\n }\r\n\r\n footnoteSubId = state.env.footnotes.list[footnoteId].count;\r\n state.env.footnotes.list[footnoteId].count++;\r\n\r\n state.push({\r\n type: 'footnote_ref',\r\n id: footnoteId,\r\n subId: footnoteSubId,\r\n level: state.level\r\n });\r\n }\r\n\r\n state.pos = pos;\r\n state.posMax = max;\r\n return true;\r\n };\r\n\r\n }, {}], 178: [function (require, module, exports) {\r\n // Process html tags\r\n\r\n 'use strict';\r\n\r\n\r\n var HTML_TAG_RE = require('../common/html_re').HTML_TAG_RE;\r\n\r\n\r\n function isLetter(ch) {\r\n /*eslint no-bitwise:0*/\r\n var lc = ch | 0x20; // to lower case\r\n return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */);\r\n }\r\n\r\n\r\n module.exports = function htmltag(state, silent) {\r\n var ch, match, max, pos = state.pos;\r\n\r\n if (!state.options.html) { return false; }\r\n\r\n // Check start\r\n max = state.posMax;\r\n if (state.src.charCodeAt(pos) !== 0x3C/* < */ ||\r\n pos + 2 >= max) {\r\n return false;\r\n }\r\n\r\n // Quick fail on second char\r\n ch = state.src.charCodeAt(pos + 1);\r\n if (ch !== 0x21/* ! */ &&\r\n ch !== 0x3F/* ? */ &&\r\n ch !== 0x2F/* / */ &&\r\n !isLetter(ch)) {\r\n return false;\r\n }\r\n\r\n match = state.src.slice(pos).match(HTML_TAG_RE);\r\n if (!match) { return false; }\r\n\r\n if (!silent) {\r\n state.push({\r\n type: 'htmltag',\r\n content: state.src.slice(pos, pos + match[0].length),\r\n level: state.level\r\n });\r\n }\r\n state.pos += match[0].length;\r\n return true;\r\n };\r\n\r\n }, { \"../common/html_re\": 130 }], 179: [function (require, module, exports) {\r\n // Process ++inserted text++\r\n\r\n 'use strict';\r\n\r\n module.exports = function ins(state, silent) {\r\n var found,\r\n pos,\r\n stack,\r\n max = state.posMax,\r\n start = state.pos,\r\n lastChar,\r\n nextChar;\r\n\r\n if (state.src.charCodeAt(start) !== 0x2B/* + */) { return false; }\r\n if (silent) { return false; } // don't run any pairs in validation mode\r\n if (start + 4 >= max) { return false; }\r\n if (state.src.charCodeAt(start + 1) !== 0x2B/* + */) { return false; }\r\n if (state.level >= state.options.maxNesting) { return false; }\r\n\r\n lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1;\r\n nextChar = state.src.charCodeAt(start + 2);\r\n\r\n if (lastChar === 0x2B/* + */) { return false; }\r\n if (nextChar === 0x2B/* + */) { return false; }\r\n if (nextChar === 0x20 || nextChar === 0x0A) { return false; }\r\n\r\n pos = start + 2;\r\n while (pos < max && state.src.charCodeAt(pos) === 0x2B/* + */) { pos++; }\r\n if (pos !== start + 2) {\r\n // sequence of 3+ markers taking as literal, same as in a emphasis\r\n state.pos += pos - start;\r\n if (!silent) { state.pending += state.src.slice(start, pos); }\r\n return true;\r\n }\r\n\r\n state.pos = start + 2;\r\n stack = 1;\r\n\r\n while (state.pos + 1 < max) {\r\n if (state.src.charCodeAt(state.pos) === 0x2B/* + */) {\r\n if (state.src.charCodeAt(state.pos + 1) === 0x2B/* + */) {\r\n lastChar = state.src.charCodeAt(state.pos - 1);\r\n nextChar = state.pos + 2 < max ? state.src.charCodeAt(state.pos + 2) : -1;\r\n if (nextChar !== 0x2B/* + */ && lastChar !== 0x2B/* + */) {\r\n if (lastChar !== 0x20 && lastChar !== 0x0A) {\r\n // closing '++'\r\n stack--;\r\n } else if (nextChar !== 0x20 && nextChar !== 0x0A) {\r\n // opening '++'\r\n stack++;\r\n } // else {\r\n // // standalone ' ++ ' indented with spaces\r\n // }\r\n if (stack <= 0) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n state.parser.skipToken(state);\r\n }\r\n\r\n if (!found) {\r\n // parser failed to find ending tag, so it's not valid emphasis\r\n state.pos = start;\r\n return false;\r\n }\r\n\r\n // found!\r\n state.posMax = state.pos;\r\n state.pos = start + 2;\r\n\r\n if (!silent) {\r\n state.push({ type: 'ins_open', level: state.level++ });\r\n state.parser.tokenize(state);\r\n state.push({ type: 'ins_close', level: --state.level });\r\n }\r\n\r\n state.pos = state.posMax + 2;\r\n state.posMax = max;\r\n return true;\r\n };\r\n\r\n }, {}], 180: [function (require, module, exports) {\r\n // Process [links]( \"stuff\")\r\n\r\n 'use strict';\r\n\r\n var parseLinkLabel = require('../helpers/parse_link_label');\r\n var parseLinkDestination = require('../helpers/parse_link_destination');\r\n var parseLinkTitle = require('../helpers/parse_link_title');\r\n var normalizeReference = require('../helpers/normalize_reference');\r\n\r\n\r\n module.exports = function links(state, silent) {\r\n var labelStart,\r\n labelEnd,\r\n label,\r\n href,\r\n title,\r\n pos,\r\n ref,\r\n code,\r\n isImage = false,\r\n oldPos = state.pos,\r\n max = state.posMax,\r\n start = state.pos,\r\n marker = state.src.charCodeAt(start);\r\n\r\n if (marker === 0x21/* ! */) {\r\n isImage = true;\r\n marker = state.src.charCodeAt(++start);\r\n }\r\n\r\n if (marker !== 0x5B/* [ */) { return false; }\r\n if (state.level >= state.options.maxNesting) { return false; }\r\n\r\n labelStart = start + 1;\r\n labelEnd = parseLinkLabel(state, start);\r\n\r\n // parser failed to find ']', so it's not a valid link\r\n if (labelEnd < 0) { return false; }\r\n\r\n pos = labelEnd + 1;\r\n if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\r\n //\r\n // Inline link\r\n //\r\n\r\n // [link]( \"title\" )\r\n // ^^ skipping these spaces\r\n pos++;\r\n for (; pos < max; pos++) {\r\n code = state.src.charCodeAt(pos);\r\n if (code !== 0x20 && code !== 0x0A) { break; }\r\n }\r\n if (pos >= max) { return false; }\r\n\r\n // [link]( \"title\" )\r\n // ^^^^^^ parsing link destination\r\n start = pos;\r\n if (parseLinkDestination(state, pos)) {\r\n href = state.linkContent;\r\n pos = state.pos;\r\n } else {\r\n href = '';\r\n }\r\n\r\n // [link]( \"title\" )\r\n // ^^ skipping these spaces\r\n start = pos;\r\n for (; pos < max; pos++) {\r\n code = state.src.charCodeAt(pos);\r\n if (code !== 0x20 && code !== 0x0A) { break; }\r\n }\r\n\r\n // [link]( \"title\" )\r\n // ^^^^^^^ parsing link title\r\n if (pos < max && start !== pos && parseLinkTitle(state, pos)) {\r\n title = state.linkContent;\r\n pos = state.pos;\r\n\r\n // [link]( \"title\" )\r\n // ^^ skipping these spaces\r\n for (; pos < max; pos++) {\r\n code = state.src.charCodeAt(pos);\r\n if (code !== 0x20 && code !== 0x0A) { break; }\r\n }\r\n } else {\r\n title = '';\r\n }\r\n\r\n if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\r\n state.pos = oldPos;\r\n return false;\r\n }\r\n pos++;\r\n } else {\r\n //\r\n // Link reference\r\n //\r\n\r\n // do not allow nested reference links\r\n if (state.linkLevel > 0) { return false; }\r\n\r\n // [foo] [bar]\r\n // ^^ optional whitespace (can include newlines)\r\n for (; pos < max; pos++) {\r\n code = state.src.charCodeAt(pos);\r\n if (code !== 0x20 && code !== 0x0A) { break; }\r\n }\r\n\r\n if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\r\n start = pos + 1;\r\n pos = parseLinkLabel(state, pos);\r\n if (pos >= 0) {\r\n label = state.src.slice(start, pos++);\r\n } else {\r\n pos = start - 1;\r\n }\r\n }\r\n\r\n // covers label === '' and label === undefined\r\n // (collapsed reference link and shortcut reference link respectively)\r\n if (!label) {\r\n if (typeof label === 'undefined') {\r\n pos = labelEnd + 1;\r\n }\r\n label = state.src.slice(labelStart, labelEnd);\r\n }\r\n\r\n ref = state.env.references[normalizeReference(label)];\r\n if (!ref) {\r\n state.pos = oldPos;\r\n return false;\r\n }\r\n href = ref.href;\r\n title = ref.title;\r\n }\r\n\r\n //\r\n // We found the end of the link, and know for a fact it's a valid link;\r\n // so all that's left to do is to call tokenizer.\r\n //\r\n if (!silent) {\r\n state.pos = labelStart;\r\n state.posMax = labelEnd;\r\n\r\n if (isImage) {\r\n state.push({\r\n type: 'image',\r\n src: href,\r\n title: title,\r\n alt: state.src.substr(labelStart, labelEnd - labelStart),\r\n level: state.level\r\n });\r\n } else {\r\n state.push({\r\n type: 'link_open',\r\n href: href,\r\n title: title,\r\n level: state.level++\r\n });\r\n state.linkLevel++;\r\n state.parser.tokenize(state);\r\n state.linkLevel--;\r\n state.push({ type: 'link_close', level: --state.level });\r\n }\r\n }\r\n\r\n state.pos = pos;\r\n state.posMax = max;\r\n return true;\r\n };\r\n\r\n }, { \"../helpers/normalize_reference\": 137, \"../helpers/parse_link_destination\": 138, \"../helpers/parse_link_label\": 139, \"../helpers/parse_link_title\": 140 }], 181: [function (require, module, exports) {\r\n // Process ==highlighted text==\r\n\r\n 'use strict';\r\n\r\n module.exports = function del(state, silent) {\r\n var found,\r\n pos,\r\n stack,\r\n max = state.posMax,\r\n start = state.pos,\r\n lastChar,\r\n nextChar;\r\n\r\n if (state.src.charCodeAt(start) !== 0x3D/* = */) { return false; }\r\n if (silent) { return false; } // don't run any pairs in validation mode\r\n if (start + 4 >= max) { return false; }\r\n if (state.src.charCodeAt(start + 1) !== 0x3D/* = */) { return false; }\r\n if (state.level >= state.options.maxNesting) { return false; }\r\n\r\n lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1;\r\n nextChar = state.src.charCodeAt(start + 2);\r\n\r\n if (lastChar === 0x3D/* = */) { return false; }\r\n if (nextChar === 0x3D/* = */) { return false; }\r\n if (nextChar === 0x20 || nextChar === 0x0A) { return false; }\r\n\r\n pos = start + 2;\r\n while (pos < max && state.src.charCodeAt(pos) === 0x3D/* = */) { pos++; }\r\n if (pos !== start + 2) {\r\n // sequence of 3+ markers taking as literal, same as in a emphasis\r\n state.pos += pos - start;\r\n if (!silent) { state.pending += state.src.slice(start, pos); }\r\n return true;\r\n }\r\n\r\n state.pos = start + 2;\r\n stack = 1;\r\n\r\n while (state.pos + 1 < max) {\r\n if (state.src.charCodeAt(state.pos) === 0x3D/* = */) {\r\n if (state.src.charCodeAt(state.pos + 1) === 0x3D/* = */) {\r\n lastChar = state.src.charCodeAt(state.pos - 1);\r\n nextChar = state.pos + 2 < max ? state.src.charCodeAt(state.pos + 2) : -1;\r\n if (nextChar !== 0x3D/* = */ && lastChar !== 0x3D/* = */) {\r\n if (lastChar !== 0x20 && lastChar !== 0x0A) {\r\n // closing '=='\r\n stack--;\r\n } else if (nextChar !== 0x20 && nextChar !== 0x0A) {\r\n // opening '=='\r\n stack++;\r\n } // else {\r\n // // standalone ' == ' indented with spaces\r\n // }\r\n if (stack <= 0) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n state.parser.skipToken(state);\r\n }\r\n\r\n if (!found) {\r\n // parser failed to find ending tag, so it's not valid emphasis\r\n state.pos = start;\r\n return false;\r\n }\r\n\r\n // found!\r\n state.posMax = state.pos;\r\n state.pos = start + 2;\r\n\r\n if (!silent) {\r\n state.push({ type: 'mark_open', level: state.level++ });\r\n state.parser.tokenize(state);\r\n state.push({ type: 'mark_close', level: --state.level });\r\n }\r\n\r\n state.pos = state.posMax + 2;\r\n state.posMax = max;\r\n return true;\r\n };\r\n\r\n }, {}], 182: [function (require, module, exports) {\r\n // Proceess '\\n'\r\n\r\n 'use strict';\r\n\r\n module.exports = function newline(state, silent) {\r\n var pmax, max, pos = state.pos;\r\n\r\n if (state.src.charCodeAt(pos) !== 0x0A/* \\n */) { return false; }\r\n\r\n pmax = state.pending.length - 1;\r\n max = state.posMax;\r\n\r\n // ' \\n' -> hardbreak\r\n // Lookup in pending chars is bad practice! Don't copy to other rules!\r\n // Pending string is stored in concat mode, indexed lookups will cause\r\n // convertion to flat mode.\r\n if (!silent) {\r\n if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) {\r\n if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) {\r\n state.pending = state.pending.replace(/ +$/, '');\r\n state.push({\r\n type: 'hardbreak',\r\n level: state.level\r\n });\r\n } else {\r\n state.pending = state.pending.slice(0, -1);\r\n state.push({\r\n type: 'softbreak',\r\n level: state.level\r\n });\r\n }\r\n\r\n } else {\r\n state.push({\r\n type: 'softbreak',\r\n level: state.level\r\n });\r\n }\r\n }\r\n\r\n pos++;\r\n\r\n // skip heading spaces for next line\r\n while (pos < max && state.src.charCodeAt(pos) === 0x20) { pos++; }\r\n\r\n state.pos = pos;\r\n return true;\r\n };\r\n\r\n }, {}], 183: [function (require, module, exports) {\r\n // Inline parser state\r\n\r\n 'use strict';\r\n\r\n\r\n function StateInline(src, parserInline, options, env, outTokens) {\r\n this.src = src;\r\n this.env = env;\r\n this.options = options;\r\n this.parser = parserInline;\r\n this.tokens = outTokens;\r\n this.pos = 0;\r\n this.posMax = this.src.length;\r\n this.level = 0;\r\n this.pending = '';\r\n this.pendingLevel = 0;\r\n\r\n this.cache = []; // Stores { start: end } pairs. Useful for backtrack\r\n // optimization of pairs parse (emphasis, strikes).\r\n\r\n // Link parser state vars\r\n\r\n this.isInLabel = false; // Set true when seek link label - we should disable\r\n // \"paired\" rules (emphasis, strikes) to not skip\r\n // tailing `]`\r\n\r\n this.linkLevel = 0; // Increment for each nesting link. Used to prevent\r\n // nesting in definitions\r\n\r\n this.linkContent = ''; // Temporary storage for link url\r\n\r\n this.labelUnmatchedScopes = 0; // Track unpaired `[` for link labels\r\n // (backtrack optimization)\r\n }\r\n\r\n\r\n // Flush pending text\r\n //\r\n StateInline.prototype.pushPending = function () {\r\n this.tokens.push({\r\n type: 'text',\r\n content: this.pending,\r\n level: this.pendingLevel\r\n });\r\n this.pending = '';\r\n };\r\n\r\n\r\n // Push new token to \"stream\".\r\n // If pending text exists - flush it as text token\r\n //\r\n StateInline.prototype.push = function (token) {\r\n if (this.pending) {\r\n this.pushPending();\r\n }\r\n\r\n this.tokens.push(token);\r\n this.pendingLevel = this.level;\r\n };\r\n\r\n\r\n // Store value to cache.\r\n // !!! Implementation has parser-specific optimizations\r\n // !!! keys MUST be integer, >= 0; values MUST be integer, > 0\r\n //\r\n StateInline.prototype.cacheSet = function (key, val) {\r\n for (var i = this.cache.length; i <= key; i++) {\r\n this.cache.push(0);\r\n }\r\n\r\n this.cache[key] = val;\r\n };\r\n\r\n\r\n // Get cache value\r\n //\r\n StateInline.prototype.cacheGet = function (key) {\r\n return key < this.cache.length ? this.cache[key] : 0;\r\n };\r\n\r\n\r\n module.exports = StateInline;\r\n\r\n }, {}], 184: [function (require, module, exports) {\r\n // Process ~subscript~\r\n\r\n 'use strict';\r\n\r\n // same as UNESCAPE_MD_RE plus a space\r\n var UNESCAPE_RE = /\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;\r\n\r\n module.exports = function sub(state, silent) {\r\n var found,\r\n content,\r\n max = state.posMax,\r\n start = state.pos;\r\n\r\n if (state.src.charCodeAt(start) !== 0x7E/* ~ */) { return false; }\r\n if (silent) { return false; } // don't run any pairs in validation mode\r\n if (start + 2 >= max) { return false; }\r\n if (state.level >= state.options.maxNesting) { return false; }\r\n\r\n state.pos = start + 1;\r\n\r\n while (state.pos < max) {\r\n if (state.src.charCodeAt(state.pos) === 0x7E/* ~ */) {\r\n found = true;\r\n break;\r\n }\r\n\r\n state.parser.skipToken(state);\r\n }\r\n\r\n if (!found || start + 1 === state.pos) {\r\n state.pos = start;\r\n return false;\r\n }\r\n\r\n content = state.src.slice(start + 1, state.pos);\r\n\r\n // don't allow unescaped spaces/newlines inside\r\n if (content.match(/(^|[^\\\\])(\\\\\\\\)*\\s/)) {\r\n state.pos = start;\r\n return false;\r\n }\r\n\r\n // found!\r\n state.posMax = state.pos;\r\n state.pos = start + 1;\r\n\r\n if (!silent) {\r\n state.push({\r\n type: 'sub',\r\n level: state.level,\r\n content: content.replace(UNESCAPE_RE, '$1')\r\n });\r\n }\r\n\r\n state.pos = state.posMax + 1;\r\n state.posMax = max;\r\n return true;\r\n };\r\n\r\n }, {}], 185: [function (require, module, exports) {\r\n // Process ^superscript^\r\n\r\n 'use strict';\r\n\r\n // same as UNESCAPE_MD_RE plus a space\r\n var UNESCAPE_RE = /\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;\r\n\r\n module.exports = function sup(state, silent) {\r\n var found,\r\n content,\r\n max = state.posMax,\r\n start = state.pos;\r\n\r\n if (state.src.charCodeAt(start) !== 0x5E/* ^ */) { return false; }\r\n if (silent) { return false; } // don't run any pairs in validation mode\r\n if (start + 2 >= max) { return false; }\r\n if (state.level >= state.options.maxNesting) { return false; }\r\n\r\n state.pos = start + 1;\r\n\r\n while (state.pos < max) {\r\n if (state.src.charCodeAt(state.pos) === 0x5E/* ^ */) {\r\n found = true;\r\n break;\r\n }\r\n\r\n state.parser.skipToken(state);\r\n }\r\n\r\n if (!found || start + 1 === state.pos) {\r\n state.pos = start;\r\n return false;\r\n }\r\n\r\n content = state.src.slice(start + 1, state.pos);\r\n\r\n // don't allow unescaped spaces/newlines inside\r\n if (content.match(/(^|[^\\\\])(\\\\\\\\)*\\s/)) {\r\n state.pos = start;\r\n return false;\r\n }\r\n\r\n // found!\r\n state.posMax = state.pos;\r\n state.pos = start + 1;\r\n\r\n if (!silent) {\r\n state.push({\r\n type: 'sup',\r\n level: state.level,\r\n content: content.replace(UNESCAPE_RE, '$1')\r\n });\r\n }\r\n\r\n state.pos = state.posMax + 1;\r\n state.posMax = max;\r\n return true;\r\n };\r\n\r\n }, {}], 186: [function (require, module, exports) {\r\n // Skip text characters for text token, place those to pending buffer\r\n // and increment current pos\r\n\r\n 'use strict';\r\n\r\n\r\n // Rule to skip pure text\r\n // '{}$%@~+=:' reserved for extentions\r\n\r\n function isTerminatorChar(ch) {\r\n switch (ch) {\r\n case 0x0A/* \\n */:\r\n case 0x5C/* \\ */:\r\n case 0x60/* ` */:\r\n case 0x2A/* * */:\r\n case 0x5F/* _ */:\r\n case 0x5E/* ^ */:\r\n case 0x5B/* [ */:\r\n case 0x5D/* ] */:\r\n case 0x21/* ! */:\r\n case 0x26/* & */:\r\n case 0x3C/* < */:\r\n case 0x3E/* > */:\r\n case 0x7B/* { */:\r\n case 0x7D/* } */:\r\n case 0x24/* $ */:\r\n case 0x25/* % */:\r\n case 0x40/* @ */:\r\n case 0x7E/* ~ */:\r\n case 0x2B/* + */:\r\n case 0x3D/* = */:\r\n case 0x3A/* : */:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n module.exports = function text(state, silent) {\r\n var pos = state.pos;\r\n\r\n while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\r\n pos++;\r\n }\r\n\r\n if (pos === state.pos) { return false; }\r\n\r\n if (!silent) { state.pending += state.src.slice(state.pos, pos); }\r\n\r\n state.pos = pos;\r\n\r\n return true;\r\n };\r\n\r\n }, {}], 187: [function (require, module, exports) {\r\n /*!\r\n * repeat-element \r\n *\r\n * Copyright (c) 2015 Jon Schlinkert.\r\n * Licensed under the MIT license.\r\n */\r\n\r\n 'use strict';\r\n\r\n module.exports = function repeat(ele, num) {\r\n var arr = new Array(num);\r\n\r\n for (var i = 0; i < num; i++) {\r\n arr[i] = ele;\r\n }\r\n\r\n return arr;\r\n };\r\n\r\n }, {}], 188: [function (require, module, exports) {\r\n /*!\r\n * repeat-string \r\n *\r\n * Copyright (c) 2014-2015, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n /**\r\n * Results cache\r\n */\r\n\r\n var res = '';\r\n var cache;\r\n\r\n /**\r\n * Expose `repeat`\r\n */\r\n\r\n module.exports = repeat;\r\n\r\n /**\r\n * Repeat the given `string` the specified `number`\r\n * of times.\r\n *\r\n * **Example:**\r\n *\r\n * ```js\r\n * var repeat = require('repeat-string');\r\n * repeat('A', 5);\r\n * //=> AAAAA\r\n * ```\r\n *\r\n * @param {String} `string` The string to repeat\r\n * @param {Number} `number` The number of times to repeat the string\r\n * @return {String} Repeated string\r\n * @api public\r\n */\r\n\r\n function repeat(str, num) {\r\n if (typeof str !== 'string') {\r\n throw new TypeError('repeat-string expects a string.');\r\n }\r\n\r\n // cover common, quick use cases\r\n if (num === 1) return str;\r\n if (num === 2) return str + str;\r\n\r\n var max = str.length * num;\r\n if (cache !== str || typeof cache === 'undefined') {\r\n cache = str;\r\n res = '';\r\n }\r\n\r\n while (max > res.length && num > 0) {\r\n if (num & 1) {\r\n res += str;\r\n }\r\n\r\n num >>= 1;\r\n if (!num) break;\r\n str += str;\r\n }\r\n\r\n return res.substr(0, max);\r\n }\r\n\r\n\r\n }, {}], 189: [function (require, module, exports) {\r\n /*!\r\n * set-getter (https://github.com/doowb/set-getter)\r\n *\r\n * Copyright (c) 2016, Brian Woodward.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n var toPath = require('to-object-path');\r\n\r\n /**\r\n * Defines a getter function on an object using property path notation.\r\n *\r\n * ```js\r\n * var obj = {};\r\n * getter(obj, 'foo', function() {\r\n * return 'bar';\r\n * });\r\n * ```\r\n * @param {Object} `obj` Object to add property to.\r\n * @param {String|Array} `prop` Property string or array to add.\r\n * @param {Function} `getter` Getter function to add as a property.\r\n * @api public\r\n */\r\n\r\n function setGetter(obj, prop, getter) {\r\n var key = toPath(arguments);\r\n return define(obj, key, getter);\r\n }\r\n\r\n /**\r\n * Define getter function on object or object hierarchy using dot notation.\r\n *\r\n * @param {Object} `obj` Object to define getter property on.\r\n * @param {String} `prop` Property string to define.\r\n * @param {Function} `getter` Getter function to define.\r\n * @return {Object} Returns original object.\r\n */\r\n\r\n function define(obj, prop, getter) {\r\n if (!~prop.indexOf('.')) {\r\n defineProperty(obj, prop, getter);\r\n return obj;\r\n }\r\n\r\n var keys = prop.split('.');\r\n var last = keys.pop();\r\n var target = obj;\r\n var key;\r\n\r\n while ((key = keys.shift())) {\r\n while (key.slice(-1) === '\\\\') {\r\n key = key.slice(0, -1) + '.' + keys.shift();\r\n }\r\n target = target[key] || (target[key] = {});\r\n }\r\n\r\n defineProperty(target, last, getter);\r\n return obj;\r\n }\r\n\r\n /**\r\n * Define getter function on object as a configurable and enumerable property.\r\n *\r\n * @param {Object} `obj` Object to define property on.\r\n * @param {String} `prop` Property to define.\r\n * @param {Function} `getter` Getter function to define.\r\n */\r\n\r\n function defineProperty(obj, prop, getter) {\r\n Object.defineProperty(obj, prop, {\r\n configurable: true,\r\n enumerable: true,\r\n get: getter\r\n });\r\n }\r\n\r\n /**\r\n * Expose `setGetter`\r\n */\r\n\r\n module.exports = setGetter;\r\n\r\n }, { \"to-object-path\": 194 }], 190: [function (require, module, exports) {\r\n 'use strict';\r\n var ansiRegex = require('ansi-regex')();\r\n\r\n module.exports = function (str) {\r\n return typeof str === 'string' ? str.replace(ansiRegex, '') : str;\r\n };\r\n\r\n }, { \"ansi-regex\": 1 }], 191: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n (function (root, factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n // AMD. Register as an anonymous module.\r\n define([], factory);\r\n } else if (typeof module === 'object' && module.exports) {\r\n // Node. Does not work with strict CommonJS, but\r\n // only CommonJS-like environments that support module.exports,\r\n // like Node.\r\n module.exports = factory();\r\n } else {\r\n // Browser globals (root is window)\r\n root.striptags = factory();\r\n }\r\n }(this, function () {\r\n var STATE_OUTPUT = 0,\r\n STATE_HTML = 1,\r\n STATE_PRE_COMMENT = 2,\r\n STATE_COMMENT = 3,\r\n WHITESPACE = /\\s/,\r\n ALLOWED_TAGS_REGEX = /<(\\w*)>/g;\r\n\r\n function striptags(html, allowableTags) {\r\n var html = html || '',\r\n state = STATE_OUTPUT,\r\n depth = 0,\r\n output = '',\r\n tagBuffer = '',\r\n inQuote = false,\r\n i, length, c;\r\n\r\n if (typeof allowableTags === 'string') {\r\n // Parse the string into an array of tags\r\n allowableTags = parseAllowableTags(allowableTags);\r\n } else if (!Array.isArray(allowableTags)) {\r\n // If it is not an array, explicitly set to null\r\n allowableTags = null;\r\n }\r\n\r\n for (i = 0, length = html.length; i < length; i++) {\r\n c = html[i];\r\n\r\n switch (c) {\r\n case '<': {\r\n // ignore '<' if inside a quote\r\n if (inQuote) {\r\n break;\r\n }\r\n\r\n // '<' followed by a space is not a valid tag, continue\r\n if (html[i + 1] == ' ') {\r\n consumeCharacter(c);\r\n break;\r\n }\r\n\r\n // change to STATE_HTML\r\n if (state == STATE_OUTPUT) {\r\n state = STATE_HTML;\r\n\r\n consumeCharacter(c);\r\n break;\r\n }\r\n\r\n // ignore additional '<' characters when inside a tag\r\n if (state == STATE_HTML) {\r\n depth++;\r\n break;\r\n }\r\n\r\n consumeCharacter(c);\r\n break;\r\n }\r\n\r\n case '>': {\r\n // something like this is happening: '<<>>'\r\n if (depth) {\r\n depth--;\r\n break;\r\n }\r\n\r\n // ignore '>' if inside a quote\r\n if (inQuote) {\r\n break;\r\n }\r\n\r\n // an HTML tag was closed\r\n if (state == STATE_HTML) {\r\n inQuote = state = 0;\r\n\r\n if (allowableTags) {\r\n tagBuffer += '>';\r\n flushTagBuffer();\r\n }\r\n\r\n break;\r\n }\r\n\r\n // ''\r\n if (state == STATE_PRE_COMMENT) {\r\n inQuote = state = 0;\r\n tagBuffer = '';\r\n break;\r\n }\r\n\r\n // if last two characters were '--', then end comment\r\n if (state == STATE_COMMENT &&\r\n html[i - 1] == '-' &&\r\n html[i - 2] == '-') {\r\n\r\n inQuote = state = 0;\r\n tagBuffer = '';\r\n break;\r\n }\r\n\r\n consumeCharacter(c);\r\n break;\r\n }\r\n\r\n // catch both single and double quotes\r\n case '\"':\r\n case '\\'': {\r\n if (state == STATE_HTML) {\r\n if (inQuote == c) {\r\n // end quote found\r\n inQuote = false;\r\n } else if (!inQuote) {\r\n // start quote only if not already in one\r\n inQuote = c;\r\n }\r\n }\r\n\r\n consumeCharacter(c);\r\n break;\r\n }\r\n\r\n case '!': {\r\n if (state == STATE_HTML &&\r\n html[i - 1] == '<') {\r\n\r\n // looks like we might be starting a comment\r\n state = STATE_PRE_COMMENT;\r\n break;\r\n }\r\n\r\n consumeCharacter(c);\r\n break;\r\n }\r\n\r\n case '-': {\r\n // if the previous two characters were '!-', this is a comment\r\n if (state == STATE_PRE_COMMENT &&\r\n html[i - 1] == '-' &&\r\n html[i - 2] == '!') {\r\n\r\n state = STATE_COMMENT;\r\n break;\r\n }\r\n\r\n consumeCharacter(c);\r\n break;\r\n }\r\n\r\n case 'E':\r\n case 'e': {\r\n // check for DOCTYPE, because it looks like a comment and isn't\r\n if (state == STATE_PRE_COMMENT &&\r\n html.substr(i - 6, 7).toLowerCase() == 'doctype') {\r\n\r\n state = STATE_HTML;\r\n break;\r\n }\r\n\r\n consumeCharacter(c);\r\n break;\r\n }\r\n\r\n default: {\r\n consumeCharacter(c);\r\n }\r\n }\r\n }\r\n\r\n function consumeCharacter(c) {\r\n if (state == STATE_OUTPUT) {\r\n output += c;\r\n } else if (allowableTags && state == STATE_HTML) {\r\n tagBuffer += c;\r\n }\r\n }\r\n\r\n function flushTagBuffer() {\r\n var normalized = '',\r\n nonWhitespaceSeen = false,\r\n i, length, c;\r\n\r\n normalizeTagBuffer:\r\n for (i = 0, length = tagBuffer.length; i < length; i++) {\r\n c = tagBuffer[i].toLowerCase();\r\n\r\n switch (c) {\r\n case '<': {\r\n break;\r\n }\r\n\r\n case '>': {\r\n break normalizeTagBuffer;\r\n }\r\n\r\n case '/': {\r\n nonWhitespaceSeen = true;\r\n break;\r\n }\r\n\r\n default: {\r\n if (!c.match(WHITESPACE)) {\r\n nonWhitespaceSeen = true;\r\n normalized += c;\r\n } else if (nonWhitespaceSeen) {\r\n break normalizeTagBuffer;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (allowableTags.indexOf(normalized) !== -1) {\r\n output += tagBuffer;\r\n }\r\n\r\n tagBuffer = '';\r\n }\r\n\r\n return output;\r\n }\r\n\r\n /**\r\n * Return an array containing tags that are allowed to pass through the\r\n * algorithm.\r\n *\r\n * @param string allowableTags A string of tags to allow (e.g. \"\").\r\n * @return array|null An array of allowed tags or null if none.\r\n */\r\n function parseAllowableTags(allowableTags) {\r\n var tagsArray = [],\r\n match;\r\n\r\n while ((match = ALLOWED_TAGS_REGEX.exec(allowableTags)) !== null) {\r\n tagsArray.push(match[1]);\r\n }\r\n\r\n return tagsArray.length !== 0 ? tagsArray : null;\r\n }\r\n\r\n return striptags;\r\n }));\r\n\r\n }, {}], 192: [function (require, module, exports) {\r\n (function (process) {\r\n 'use strict';\r\n var argv = process.argv;\r\n\r\n var terminator = argv.indexOf('--');\r\n var hasFlag = function (flag) {\r\n flag = '--' + flag;\r\n var pos = argv.indexOf(flag);\r\n return pos !== -1 && (terminator !== -1 ? pos < terminator : true);\r\n };\r\n\r\n module.exports = (function () {\r\n if ('FORCE_COLOR' in process.env) {\r\n return true;\r\n }\r\n\r\n if (hasFlag('no-color') ||\r\n hasFlag('no-colors') ||\r\n hasFlag('color=false')) {\r\n return false;\r\n }\r\n\r\n if (hasFlag('color') ||\r\n hasFlag('colors') ||\r\n hasFlag('color=true') ||\r\n hasFlag('color=always')) {\r\n return true;\r\n }\r\n\r\n if (process.stdout && !process.stdout.isTTY) {\r\n return false;\r\n }\r\n\r\n if (process.platform === 'win32') {\r\n return true;\r\n }\r\n\r\n if ('COLORTERM' in process.env) {\r\n return true;\r\n }\r\n\r\n if (process.env.TERM === 'dumb') {\r\n return false;\r\n }\r\n\r\n if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n })();\r\n\r\n }).call(this, require('_process'))\r\n\r\n }, { \"_process\": 118 }], 193: [function (require, module, exports) {\r\n /*!\r\n * to-gfm-code-block \r\n *\r\n * Copyright (c) 2015, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n module.exports = function pre(str, lang) {\r\n if (typeof str !== 'string') {\r\n throw new TypeError('markdown-pre expects a string.');\r\n }\r\n\r\n var code = '';\r\n code += '```' + (typeof lang === 'string' ? lang : '');\r\n code += '\\n';\r\n code += str;\r\n code += '\\n';\r\n code += '```';\r\n return code;\r\n };\r\n\r\n }, {}], 194: [function (require, module, exports) {\r\n /*!\r\n * to-object-path \r\n *\r\n * Copyright (c) 2015, Jon Schlinkert.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n 'use strict';\r\n\r\n var typeOf = require('kind-of');\r\n\r\n module.exports = function toPath(args) {\r\n if (typeOf(args) !== 'arguments') {\r\n args = arguments;\r\n }\r\n return filter(args).join('.');\r\n };\r\n\r\n function filter(arr) {\r\n var len = arr.length;\r\n var idx = -1;\r\n var res = [];\r\n\r\n while (++idx < len) {\r\n var ele = arr[idx];\r\n if (typeOf(ele) === 'arguments' || Array.isArray(ele)) {\r\n res.push.apply(res, filter(ele));\r\n } else if (typeof ele === 'string') {\r\n res.push(ele);\r\n }\r\n }\r\n return res;\r\n }\r\n\r\n }, { \"kind-of\": 195 }], 195: [function (require, module, exports) {\r\n (function (Buffer) {\r\n var isBuffer = require('is-buffer');\r\n var toString = Object.prototype.toString;\r\n\r\n /**\r\n * Get the native `typeof` a value.\r\n *\r\n * @param {*} `val`\r\n * @return {*} Native javascript type\r\n */\r\n\r\n module.exports = function kindOf(val) {\r\n // primitivies\r\n if (typeof val === 'undefined') {\r\n return 'undefined';\r\n }\r\n if (val === null) {\r\n return 'null';\r\n }\r\n if (val === true || val === false || val instanceof Boolean) {\r\n return 'boolean';\r\n }\r\n if (typeof val === 'string' || val instanceof String) {\r\n return 'string';\r\n }\r\n if (typeof val === 'number' || val instanceof Number) {\r\n return 'number';\r\n }\r\n\r\n // functions\r\n if (typeof val === 'function' || val instanceof Function) {\r\n return 'function';\r\n }\r\n\r\n // array\r\n if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) {\r\n return 'array';\r\n }\r\n\r\n // check for instances of RegExp and Date before calling `toString`\r\n if (val instanceof RegExp) {\r\n return 'regexp';\r\n }\r\n if (val instanceof Date) {\r\n return 'date';\r\n }\r\n\r\n // other objects\r\n var type = toString.call(val);\r\n\r\n if (type === '[object RegExp]') {\r\n return 'regexp';\r\n }\r\n if (type === '[object Date]') {\r\n return 'date';\r\n }\r\n if (type === '[object Arguments]') {\r\n return 'arguments';\r\n }\r\n\r\n // buffer\r\n if (typeof Buffer !== 'undefined' && isBuffer(val)) {\r\n return 'buffer';\r\n }\r\n\r\n // es6: Map, WeakMap, Set, WeakSet\r\n if (type === '[object Set]') {\r\n return 'set';\r\n }\r\n if (type === '[object WeakSet]') {\r\n return 'weakset';\r\n }\r\n if (type === '[object Map]') {\r\n return 'map';\r\n }\r\n if (type === '[object WeakMap]') {\r\n return 'weakmap';\r\n }\r\n if (type === '[object Symbol]') {\r\n return 'symbol';\r\n }\r\n\r\n // typed arrays\r\n if (type === '[object Int8Array]') {\r\n return 'int8array';\r\n }\r\n if (type === '[object Uint8Array]') {\r\n return 'uint8array';\r\n }\r\n if (type === '[object Uint8ClampedArray]') {\r\n return 'uint8clampedarray';\r\n }\r\n if (type === '[object Int16Array]') {\r\n return 'int16array';\r\n }\r\n if (type === '[object Uint16Array]') {\r\n return 'uint16array';\r\n }\r\n if (type === '[object Int32Array]') {\r\n return 'int32array';\r\n }\r\n if (type === '[object Uint32Array]') {\r\n return 'uint32array';\r\n }\r\n if (type === '[object Float32Array]') {\r\n return 'float32array';\r\n }\r\n if (type === '[object Float64Array]') {\r\n return 'float64array';\r\n }\r\n\r\n // must be a plain object\r\n return 'object';\r\n };\r\n\r\n }).call(this, require(\"buffer\").Buffer)\r\n\r\n }, { \"buffer\": 12, \"is-buffer\": 79 }], 196: [function (require, module, exports) {\r\n // Copyright Joyent, Inc. and other Node contributors.\r\n //\r\n // Permission is hereby granted, free of charge, to any person obtaining a\r\n // copy of this software and associated documentation files (the\r\n // \"Software\"), to deal in the Software without restriction, including\r\n // without limitation the rights to use, copy, modify, merge, publish,\r\n // distribute, sublicense, and/or sell copies of the Software, and to permit\r\n // persons to whom the Software is furnished to do so, subject to the\r\n // following conditions:\r\n //\r\n // The above copyright notice and this permission notice shall be included\r\n // in all copies or substantial portions of the Software.\r\n //\r\n // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\n // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\r\n // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r\n // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\r\n // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\r\n // USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n 'use strict';\r\n\r\n var punycode = require('punycode');\r\n var util = require('./util');\r\n\r\n exports.parse = urlParse;\r\n exports.resolve = urlResolve;\r\n exports.resolveObject = urlResolveObject;\r\n exports.format = urlFormat;\r\n\r\n exports.Url = Url;\r\n\r\n function Url() {\r\n this.protocol = null;\r\n this.slashes = null;\r\n this.auth = null;\r\n this.host = null;\r\n this.port = null;\r\n this.hostname = null;\r\n this.hash = null;\r\n this.search = null;\r\n this.query = null;\r\n this.pathname = null;\r\n this.path = null;\r\n this.href = null;\r\n }\r\n\r\n // Reference: RFC 3986, RFC 1808, RFC 2396\r\n\r\n // define these here so at least they only have to be\r\n // compiled once on the first module load.\r\n var protocolPattern = /^([a-z0-9.+-]+:)/i,\r\n portPattern = /:[0-9]*$/,\r\n\r\n // Special case for a simple path URL\r\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\r\n\r\n // RFC 2396: characters reserved for delimiting URLs.\r\n // We actually just auto-escape these.\r\n delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t'],\r\n\r\n // RFC 2396: characters not allowed for various reasons.\r\n unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims),\r\n\r\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\r\n autoEscape = ['\\''].concat(unwise),\r\n // Characters that are never ever allowed in a hostname.\r\n // Note that any invalid chars are also handled, but these\r\n // are the ones that are *expected* to be seen, so we fast-path\r\n // them.\r\n nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),\r\n hostEndingChars = ['/', '?', '#'],\r\n hostnameMaxLen = 255,\r\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\r\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\r\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\r\n unsafeProtocol = {\r\n 'javascript': true,\r\n 'javascript:': true\r\n },\r\n // protocols that never have a hostname.\r\n hostlessProtocol = {\r\n 'javascript': true,\r\n 'javascript:': true\r\n },\r\n // protocols that always contain a // bit.\r\n slashedProtocol = {\r\n 'http': true,\r\n 'https': true,\r\n 'ftp': true,\r\n 'gopher': true,\r\n 'file': true,\r\n 'http:': true,\r\n 'https:': true,\r\n 'ftp:': true,\r\n 'gopher:': true,\r\n 'file:': true\r\n },\r\n querystring = require('querystring');\r\n\r\n function urlParse(url, parseQueryString, slashesDenoteHost) {\r\n if (url && util.isObject(url) && url instanceof Url) return url;\r\n\r\n var u = new Url;\r\n u.parse(url, parseQueryString, slashesDenoteHost);\r\n return u;\r\n }\r\n\r\n Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {\r\n if (!util.isString(url)) {\r\n throw new TypeError(\"Parameter 'url' must be a string, not \" + typeof url);\r\n }\r\n\r\n // Copy chrome, IE, opera backslash-handling behavior.\r\n // Back slashes before the query string get converted to forward slashes\r\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\r\n var queryIndex = url.indexOf('?'),\r\n splitter =\r\n (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',\r\n uSplit = url.split(splitter),\r\n slashRegex = /\\\\/g;\r\n uSplit[0] = uSplit[0].replace(slashRegex, '/');\r\n url = uSplit.join(splitter);\r\n\r\n var rest = url;\r\n\r\n // trim before proceeding.\r\n // This is to support parse stuff like \" http://foo.com \\n\"\r\n rest = rest.trim();\r\n\r\n if (!slashesDenoteHost && url.split('#').length === 1) {\r\n // Try fast path regexp\r\n var simplePath = simplePathPattern.exec(rest);\r\n if (simplePath) {\r\n this.path = rest;\r\n this.href = rest;\r\n this.pathname = simplePath[1];\r\n if (simplePath[2]) {\r\n this.search = simplePath[2];\r\n if (parseQueryString) {\r\n this.query = querystring.parse(this.search.substr(1));\r\n } else {\r\n this.query = this.search.substr(1);\r\n }\r\n } else if (parseQueryString) {\r\n this.search = '';\r\n this.query = {};\r\n }\r\n return this;\r\n }\r\n }\r\n\r\n var proto = protocolPattern.exec(rest);\r\n if (proto) {\r\n proto = proto[0];\r\n var lowerProto = proto.toLowerCase();\r\n this.protocol = lowerProto;\r\n rest = rest.substr(proto.length);\r\n }\r\n\r\n // figure out if it's got a host\r\n // user@server is *always* interpreted as a hostname, and url\r\n // resolution will treat //foo/bar as host=foo,path=bar because that's\r\n // how the browser resolves relative URLs.\r\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\r\n var slashes = rest.substr(0, 2) === '//';\r\n if (slashes && !(proto && hostlessProtocol[proto])) {\r\n rest = rest.substr(2);\r\n this.slashes = true;\r\n }\r\n }\r\n\r\n if (!hostlessProtocol[proto] &&\r\n (slashes || (proto && !slashedProtocol[proto]))) {\r\n\r\n // there's a hostname.\r\n // the first instance of /, ?, ;, or # ends the host.\r\n //\r\n // If there is an @ in the hostname, then non-host chars *are* allowed\r\n // to the left of the last @ sign, unless some host-ending character\r\n // comes *before* the @-sign.\r\n // URLs are obnoxious.\r\n //\r\n // ex:\r\n // http://a@b@c/ => user:a@b host:c\r\n // http://a@b?@c => user:a host:c path:/?@c\r\n\r\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\r\n // Review our test case against browsers more comprehensively.\r\n\r\n // find the first instance of any hostEndingChars\r\n var hostEnd = -1;\r\n for (var i = 0; i < hostEndingChars.length; i++) {\r\n var hec = rest.indexOf(hostEndingChars[i]);\r\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\r\n hostEnd = hec;\r\n }\r\n\r\n // at this point, either we have an explicit point where the\r\n // auth portion cannot go past, or the last @ char is the decider.\r\n var auth, atSign;\r\n if (hostEnd === -1) {\r\n // atSign can be anywhere.\r\n atSign = rest.lastIndexOf('@');\r\n } else {\r\n // atSign must be in auth portion.\r\n // http://a@b/c@d => host:b auth:a path:/c@d\r\n atSign = rest.lastIndexOf('@', hostEnd);\r\n }\r\n\r\n // Now we have a portion which is definitely the auth.\r\n // Pull that off.\r\n if (atSign !== -1) {\r\n auth = rest.slice(0, atSign);\r\n rest = rest.slice(atSign + 1);\r\n this.auth = decodeURIComponent(auth);\r\n }\r\n\r\n // the host is the remaining to the left of the first non-host char\r\n hostEnd = -1;\r\n for (var i = 0; i < nonHostChars.length; i++) {\r\n var hec = rest.indexOf(nonHostChars[i]);\r\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\r\n hostEnd = hec;\r\n }\r\n // if we still have not hit it, then the entire thing is a host.\r\n if (hostEnd === -1)\r\n hostEnd = rest.length;\r\n\r\n this.host = rest.slice(0, hostEnd);\r\n rest = rest.slice(hostEnd);\r\n\r\n // pull out port.\r\n this.parseHost();\r\n\r\n // we've indicated that there is a hostname,\r\n // so even if it's empty, it has to be present.\r\n this.hostname = this.hostname || '';\r\n\r\n // if hostname begins with [ and ends with ]\r\n // assume that it's an IPv6 address.\r\n var ipv6Hostname = this.hostname[0] === '[' &&\r\n this.hostname[this.hostname.length - 1] === ']';\r\n\r\n // validate a little.\r\n if (!ipv6Hostname) {\r\n var hostparts = this.hostname.split(/\\./);\r\n for (var i = 0, l = hostparts.length; i < l; i++) {\r\n var part = hostparts[i];\r\n if (!part) continue;\r\n if (!part.match(hostnamePartPattern)) {\r\n var newpart = '';\r\n for (var j = 0, k = part.length; j < k; j++) {\r\n if (part.charCodeAt(j) > 127) {\r\n // we replace non-ASCII char with a temporary placeholder\r\n // we need this to make sure size of hostname is not\r\n // broken by replacing non-ASCII by nothing\r\n newpart += 'x';\r\n } else {\r\n newpart += part[j];\r\n }\r\n }\r\n // we test again with ASCII char only\r\n if (!newpart.match(hostnamePartPattern)) {\r\n var validParts = hostparts.slice(0, i);\r\n var notHost = hostparts.slice(i + 1);\r\n var bit = part.match(hostnamePartStart);\r\n if (bit) {\r\n validParts.push(bit[1]);\r\n notHost.unshift(bit[2]);\r\n }\r\n if (notHost.length) {\r\n rest = '/' + notHost.join('.') + rest;\r\n }\r\n this.hostname = validParts.join('.');\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (this.hostname.length > hostnameMaxLen) {\r\n this.hostname = '';\r\n } else {\r\n // hostnames are always lower case.\r\n this.hostname = this.hostname.toLowerCase();\r\n }\r\n\r\n if (!ipv6Hostname) {\r\n // IDNA Support: Returns a punycoded representation of \"domain\".\r\n // It only converts parts of the domain name that\r\n // have non-ASCII characters, i.e. it doesn't matter if\r\n // you call it with a domain that already is ASCII-only.\r\n this.hostname = punycode.toASCII(this.hostname);\r\n }\r\n\r\n var p = this.port ? ':' + this.port : '';\r\n var h = this.hostname || '';\r\n this.host = h + p;\r\n this.href += this.host;\r\n\r\n // strip [ and ] from the hostname\r\n // the host field still retains them, though\r\n if (ipv6Hostname) {\r\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\r\n if (rest[0] !== '/') {\r\n rest = '/' + rest;\r\n }\r\n }\r\n }\r\n\r\n // now rest is set to the post-host stuff.\r\n // chop off any delim chars.\r\n if (!unsafeProtocol[lowerProto]) {\r\n\r\n // First, make 100% sure that any \"autoEscape\" chars get\r\n // escaped, even if encodeURIComponent doesn't think they\r\n // need to be.\r\n for (var i = 0, l = autoEscape.length; i < l; i++) {\r\n var ae = autoEscape[i];\r\n if (rest.indexOf(ae) === -1)\r\n continue;\r\n var esc = encodeURIComponent(ae);\r\n if (esc === ae) {\r\n esc = escape(ae);\r\n }\r\n rest = rest.split(ae).join(esc);\r\n }\r\n }\r\n\r\n\r\n // chop off from the tail first.\r\n var hash = rest.indexOf('#');\r\n if (hash !== -1) {\r\n // got a fragment string.\r\n this.hash = rest.substr(hash);\r\n rest = rest.slice(0, hash);\r\n }\r\n var qm = rest.indexOf('?');\r\n if (qm !== -1) {\r\n this.search = rest.substr(qm);\r\n this.query = rest.substr(qm + 1);\r\n if (parseQueryString) {\r\n this.query = querystring.parse(this.query);\r\n }\r\n rest = rest.slice(0, qm);\r\n } else if (parseQueryString) {\r\n // no query string, but parseQueryString still requested\r\n this.search = '';\r\n this.query = {};\r\n }\r\n if (rest) this.pathname = rest;\r\n if (slashedProtocol[lowerProto] &&\r\n this.hostname && !this.pathname) {\r\n this.pathname = '/';\r\n }\r\n\r\n //to support http.request\r\n if (this.pathname || this.search) {\r\n var p = this.pathname || '';\r\n var s = this.search || '';\r\n this.path = p + s;\r\n }\r\n\r\n // finally, reconstruct the href based on what has been validated.\r\n this.href = this.format();\r\n return this;\r\n };\r\n\r\n // format a parsed object into a url string\r\n function urlFormat(obj) {\r\n // ensure it's an object, and not a string url.\r\n // If it's an obj, this is a no-op.\r\n // this way, you can call url_format() on strings\r\n // to clean up potentially wonky urls.\r\n if (util.isString(obj)) obj = urlParse(obj);\r\n if (!(obj instanceof Url)) return Url.prototype.format.call(obj);\r\n return obj.format();\r\n }\r\n\r\n Url.prototype.format = function () {\r\n var auth = this.auth || '';\r\n if (auth) {\r\n auth = encodeURIComponent(auth);\r\n auth = auth.replace(/%3A/i, ':');\r\n auth += '@';\r\n }\r\n\r\n var protocol = this.protocol || '',\r\n pathname = this.pathname || '',\r\n hash = this.hash || '',\r\n host = false,\r\n query = '';\r\n\r\n if (this.host) {\r\n host = auth + this.host;\r\n } else if (this.hostname) {\r\n host = auth + (this.hostname.indexOf(':') === -1 ?\r\n this.hostname :\r\n '[' + this.hostname + ']');\r\n if (this.port) {\r\n host += ':' + this.port;\r\n }\r\n }\r\n\r\n if (this.query &&\r\n util.isObject(this.query) &&\r\n Object.keys(this.query).length) {\r\n query = querystring.stringify(this.query);\r\n }\r\n\r\n var search = this.search || (query && ('?' + query)) || '';\r\n\r\n if (protocol && protocol.substr(-1) !== ':') protocol += ':';\r\n\r\n // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.\r\n // unless they had them to begin with.\r\n if (this.slashes ||\r\n (!protocol || slashedProtocol[protocol]) && host !== false) {\r\n host = '//' + (host || '');\r\n if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;\r\n } else if (!host) {\r\n host = '';\r\n }\r\n\r\n if (hash && hash.charAt(0) !== '#') hash = '#' + hash;\r\n if (search && search.charAt(0) !== '?') search = '?' + search;\r\n\r\n pathname = pathname.replace(/[?#]/g, function (match) {\r\n return encodeURIComponent(match);\r\n });\r\n search = search.replace('#', '%23');\r\n\r\n return protocol + host + pathname + search + hash;\r\n };\r\n\r\n function urlResolve(source, relative) {\r\n return urlParse(source, false, true).resolve(relative);\r\n }\r\n\r\n Url.prototype.resolve = function (relative) {\r\n return this.resolveObject(urlParse(relative, false, true)).format();\r\n };\r\n\r\n function urlResolveObject(source, relative) {\r\n if (!source) return relative;\r\n return urlParse(source, false, true).resolveObject(relative);\r\n }\r\n\r\n Url.prototype.resolveObject = function (relative) {\r\n if (util.isString(relative)) {\r\n var rel = new Url();\r\n rel.parse(relative, false, true);\r\n relative = rel;\r\n }\r\n\r\n var result = new Url();\r\n var tkeys = Object.keys(this);\r\n for (var tk = 0; tk < tkeys.length; tk++) {\r\n var tkey = tkeys[tk];\r\n result[tkey] = this[tkey];\r\n }\r\n\r\n // hash is always overridden, no matter what.\r\n // even href=\"\" will remove it.\r\n result.hash = relative.hash;\r\n\r\n // if the relative url is empty, then there's nothing left to do here.\r\n if (relative.href === '') {\r\n result.href = result.format();\r\n return result;\r\n }\r\n\r\n // hrefs like //foo/bar always cut to the protocol.\r\n if (relative.slashes && !relative.protocol) {\r\n // take everything except the protocol from relative\r\n var rkeys = Object.keys(relative);\r\n for (var rk = 0; rk < rkeys.length; rk++) {\r\n var rkey = rkeys[rk];\r\n if (rkey !== 'protocol')\r\n result[rkey] = relative[rkey];\r\n }\r\n\r\n //urlParse appends trailing / to urls like http://www.example.com\r\n if (slashedProtocol[result.protocol] &&\r\n result.hostname && !result.pathname) {\r\n result.path = result.pathname = '/';\r\n }\r\n\r\n result.href = result.format();\r\n return result;\r\n }\r\n\r\n if (relative.protocol && relative.protocol !== result.protocol) {\r\n // if it's a known url protocol, then changing\r\n // the protocol does weird things\r\n // first, if it's not file:, then we MUST have a host,\r\n // and if there was a path\r\n // to begin with, then we MUST have a path.\r\n // if it is file:, then the host is dropped,\r\n // because that's known to be hostless.\r\n // anything else is assumed to be absolute.\r\n if (!slashedProtocol[relative.protocol]) {\r\n var keys = Object.keys(relative);\r\n for (var v = 0; v < keys.length; v++) {\r\n var k = keys[v];\r\n result[k] = relative[k];\r\n }\r\n result.href = result.format();\r\n return result;\r\n }\r\n\r\n result.protocol = relative.protocol;\r\n if (!relative.host && !hostlessProtocol[relative.protocol]) {\r\n var relPath = (relative.pathname || '').split('/');\r\n while (relPath.length && !(relative.host = relPath.shift()));\r\n if (!relative.host) relative.host = '';\r\n if (!relative.hostname) relative.hostname = '';\r\n if (relPath[0] !== '') relPath.unshift('');\r\n if (relPath.length < 2) relPath.unshift('');\r\n result.pathname = relPath.join('/');\r\n } else {\r\n result.pathname = relative.pathname;\r\n }\r\n result.search = relative.search;\r\n result.query = relative.query;\r\n result.host = relative.host || '';\r\n result.auth = relative.auth;\r\n result.hostname = relative.hostname || relative.host;\r\n result.port = relative.port;\r\n // to support http.request\r\n if (result.pathname || result.search) {\r\n var p = result.pathname || '';\r\n var s = result.search || '';\r\n result.path = p + s;\r\n }\r\n result.slashes = result.slashes || relative.slashes;\r\n result.href = result.format();\r\n return result;\r\n }\r\n\r\n var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),\r\n isRelAbs = (\r\n relative.host ||\r\n relative.pathname && relative.pathname.charAt(0) === '/'\r\n ),\r\n mustEndAbs = (isRelAbs || isSourceAbs ||\r\n (result.host && relative.pathname)),\r\n removeAllDots = mustEndAbs,\r\n srcPath = result.pathname && result.pathname.split('/') || [],\r\n relPath = relative.pathname && relative.pathname.split('/') || [],\r\n psychotic = result.protocol && !slashedProtocol[result.protocol];\r\n\r\n // if the url is a non-slashed url, then relative\r\n // links like ../.. should be able\r\n // to crawl up to the hostname, as well. This is strange.\r\n // result.protocol has already been set by now.\r\n // Later on, put the first path part into the host field.\r\n if (psychotic) {\r\n result.hostname = '';\r\n result.port = null;\r\n if (result.host) {\r\n if (srcPath[0] === '') srcPath[0] = result.host;\r\n else srcPath.unshift(result.host);\r\n }\r\n result.host = '';\r\n if (relative.protocol) {\r\n relative.hostname = null;\r\n relative.port = null;\r\n if (relative.host) {\r\n if (relPath[0] === '') relPath[0] = relative.host;\r\n else relPath.unshift(relative.host);\r\n }\r\n relative.host = null;\r\n }\r\n mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');\r\n }\r\n\r\n if (isRelAbs) {\r\n // it's absolute.\r\n result.host = (relative.host || relative.host === '') ?\r\n relative.host : result.host;\r\n result.hostname = (relative.hostname || relative.hostname === '') ?\r\n relative.hostname : result.hostname;\r\n result.search = relative.search;\r\n result.query = relative.query;\r\n srcPath = relPath;\r\n // fall through to the dot-handling below.\r\n } else if (relPath.length) {\r\n // it's relative\r\n // throw away the existing file, and take the new path instead.\r\n if (!srcPath) srcPath = [];\r\n srcPath.pop();\r\n srcPath = srcPath.concat(relPath);\r\n result.search = relative.search;\r\n result.query = relative.query;\r\n } else if (!util.isNullOrUndefined(relative.search)) {\r\n // just pull out the search.\r\n // like href='?foo'.\r\n // Put this after the other two cases because it simplifies the booleans\r\n if (psychotic) {\r\n result.hostname = result.host = srcPath.shift();\r\n //occationaly the auth can get stuck only in host\r\n //this especially happens in cases like\r\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\r\n var authInHost = result.host && result.host.indexOf('@') > 0 ?\r\n result.host.split('@') : false;\r\n if (authInHost) {\r\n result.auth = authInHost.shift();\r\n result.host = result.hostname = authInHost.shift();\r\n }\r\n }\r\n result.search = relative.search;\r\n result.query = relative.query;\r\n //to support http.request\r\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\r\n result.path = (result.pathname ? result.pathname : '') +\r\n (result.search ? result.search : '');\r\n }\r\n result.href = result.format();\r\n return result;\r\n }\r\n\r\n if (!srcPath.length) {\r\n // no path at all. easy.\r\n // we've already handled the other stuff above.\r\n result.pathname = null;\r\n //to support http.request\r\n if (result.search) {\r\n result.path = '/' + result.search;\r\n } else {\r\n result.path = null;\r\n }\r\n result.href = result.format();\r\n return result;\r\n }\r\n\r\n // if a url ENDs in . or .., then it must get a trailing slash.\r\n // however, if it ends in anything else non-slashy,\r\n // then it must NOT get a trailing slash.\r\n var last = srcPath.slice(-1)[0];\r\n var hasTrailingSlash = (\r\n (result.host || relative.host || srcPath.length > 1) &&\r\n (last === '.' || last === '..') || last === '');\r\n\r\n // strip single dots, resolve double dots to parent dir\r\n // if the path tries to go above the root, `up` ends up > 0\r\n var up = 0;\r\n for (var i = srcPath.length; i >= 0; i--) {\r\n last = srcPath[i];\r\n if (last === '.') {\r\n srcPath.splice(i, 1);\r\n } else if (last === '..') {\r\n srcPath.splice(i, 1);\r\n up++;\r\n } else if (up) {\r\n srcPath.splice(i, 1);\r\n up--;\r\n }\r\n }\r\n\r\n // if the path is allowed to go above the root, restore leading ..s\r\n if (!mustEndAbs && !removeAllDots) {\r\n for (; up--; up) {\r\n srcPath.unshift('..');\r\n }\r\n }\r\n\r\n if (mustEndAbs && srcPath[0] !== '' &&\r\n (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {\r\n srcPath.unshift('');\r\n }\r\n\r\n if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {\r\n srcPath.push('');\r\n }\r\n\r\n var isAbsolute = srcPath[0] === '' ||\r\n (srcPath[0] && srcPath[0].charAt(0) === '/');\r\n\r\n // put the host back\r\n if (psychotic) {\r\n result.hostname = result.host = isAbsolute ? '' :\r\n srcPath.length ? srcPath.shift() : '';\r\n //occationaly the auth can get stuck only in host\r\n //this especially happens in cases like\r\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\r\n var authInHost = result.host && result.host.indexOf('@') > 0 ?\r\n result.host.split('@') : false;\r\n if (authInHost) {\r\n result.auth = authInHost.shift();\r\n result.host = result.hostname = authInHost.shift();\r\n }\r\n }\r\n\r\n mustEndAbs = mustEndAbs || (result.host && srcPath.length);\r\n\r\n if (mustEndAbs && !isAbsolute) {\r\n srcPath.unshift('');\r\n }\r\n\r\n if (!srcPath.length) {\r\n result.pathname = null;\r\n result.path = null;\r\n } else {\r\n result.pathname = srcPath.join('/');\r\n }\r\n\r\n //to support request.http\r\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\r\n result.path = (result.pathname ? result.pathname : '') +\r\n (result.search ? result.search : '');\r\n }\r\n result.auth = relative.auth || result.auth;\r\n result.slashes = result.slashes || relative.slashes;\r\n result.href = result.format();\r\n return result;\r\n };\r\n\r\n Url.prototype.parseHost = function () {\r\n var host = this.host;\r\n var port = portPattern.exec(host);\r\n if (port) {\r\n port = port[0];\r\n if (port !== ':') {\r\n this.port = port.substr(1);\r\n }\r\n host = host.substr(0, host.length - port.length);\r\n }\r\n if (host) this.hostname = host;\r\n };\r\n\r\n }, { \"./util\": 197, \"punycode\": 119, \"querystring\": 122 }], 197: [function (require, module, exports) {\r\n 'use strict';\r\n\r\n module.exports = {\r\n isString: function (arg) {\r\n return typeof (arg) === 'string';\r\n },\r\n isObject: function (arg) {\r\n return typeof (arg) === 'object' && arg !== null;\r\n },\r\n isNull: function (arg) {\r\n return arg === null;\r\n },\r\n isNullOrUndefined: function (arg) {\r\n return arg == null;\r\n }\r\n };\r\n\r\n }, {}], 198: [function (require, module, exports) {\r\n\r\n var $ = require('jquery');\r\n var helpers = require('handlebars-helpers')({\r\n handlebars: Handlebars\r\n });\r\n\r\n $(function () {\r\n var name = $('#name').on('keyup', function (e) {\r\n if (name.val().length > 1) {\r\n var data = { name: name.val() };\r\n render(data);\r\n }\r\n });\r\n\r\n name.focus();\r\n\r\n function render(data) {\r\n var tmpl = \"

      {{dashcase name}}

      \";\r\n var fn = Handlebars.compile(tmpl);\r\n var content = fn(data);\r\n $('#content').html(content);\r\n }\r\n });\r\n\r\n }, { \"handlebars-helpers\": 41, \"jquery\": 100 }]\r\n}, {}, [198])\r\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYW5zaS1yZWdleC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnNpLXN0eWxlcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hcnItZmlsdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Fyci1mbGF0dGVuL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FycmF5LXNvcnQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYXJyYXktc29ydC9ub2RlX21vZHVsZXMva2luZC1vZi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hcnJheS11bmlxdWUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYXV0b2xpbmtlci9kaXN0L0F1dG9saW5rZXIuanMiLCJub2RlX21vZHVsZXMvYmFzZTY0LWpzL2xpYi9iNjQuanMiLCJub2RlX21vZHVsZXMvYnJhY2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbGliL19lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2hhbGsvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY3JlYXRlLWZyYW1lL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NyZWF0ZS1mcmFtZS9ub2RlX21vZHVsZXMvbGF6eS1jYWNoZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jcmVhdGUtZnJhbWUvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvZGF0ZS5qcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9kYXRlLmpzL2xpYi9kYXRlLmpzIiwibm9kZV9tb2R1bGVzL2RhdGUuanMvbGliL3BhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9kZWJ1Zy9kZWJ1Zy5qcyIsIm5vZGVfbW9kdWxlcy9kZWZpbmUtcHJvcGVydHkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZW50L2RlY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9lbnQvZW5jb2RlLmpzIiwibm9kZV9tb2R1bGVzL2VudC9lbnRpdGllcy5qc29uIiwibm9kZV9tb2R1bGVzL2VudC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9lbnQvcmV2ZXJzZWQuanNvbiIsIm5vZGVfbW9kdWxlcy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9leHBhbmQtYnJhY2tldHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZXhwYW5kLXJhbmdlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2V4dGVuZC1zaGFsbG93L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2V4dGdsb2IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZmlsZW5hbWUtcmVnZXgvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZmlsbC1yYW5nZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3ItaW4vaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9yLW93bi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mcy1leGlzdHMtc3luYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nZXQtb2JqZWN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2dldC12YWx1ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nbG9iLWJhc2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZ2xvYi1wYXJlbnQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy1oZWxwZXJzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMtaGVscGVycy9saWIvYXJyYXkuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy1oZWxwZXJzL2xpYi9jb2RlLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMtaGVscGVycy9saWIvY29sbGVjdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzLWhlbHBlcnMvbGliL2NvbXBhcmlzb24uanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy1oZWxwZXJzL2xpYi9kYXRlLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMtaGVscGVycy9saWIvZnMuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy1oZWxwZXJzL2xpYi9odG1sLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMtaGVscGVycy9saWIvaTE4bi5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzLWhlbHBlcnMvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMtaGVscGVycy9saWIvaW5mbGVjdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzLWhlbHBlcnMvbGliL2xvZ2dpbmcuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy1oZWxwZXJzL2xpYi9tYXJrZG93bi5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzLWhlbHBlcnMvbGliL21hdGNoLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMtaGVscGVycy9saWIvbWF0aC5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzLWhlbHBlcnMvbGliL21pc2MuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy1oZWxwZXJzL2xpYi9udW1iZXIuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy1oZWxwZXJzL2xpYi9vYmplY3QuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy1oZWxwZXJzL2xpYi9wYXRoLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMtaGVscGVycy9saWIvc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMtaGVscGVycy9saWIvdXJsLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMtaGVscGVycy9saWIvdXRpbHMvaHRtbC5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzLWhlbHBlcnMvbGliL3V0aWxzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMtaGVscGVycy9saWIvdXRpbHMvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy1oZWxwZXJzL25vZGVfbW9kdWxlcy9raW5kLW9mL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMtaGVscGVycy9ub2RlX21vZHVsZXMvbGF6eS1jYWNoZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oYXMtYW5zaS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oZWxwZXItZGF0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oZWxwZXItZGF0ZS9ub2RlX21vZHVsZXMvZXh0ZW5kLXNoYWxsb3cvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaGVscGVyLWRhdGUvbm9kZV9tb2R1bGVzL2V4dGVuZC1zaGFsbG93L25vZGVfbW9kdWxlcy9raW5kLW9mL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2hlbHBlci1kYXRlL25vZGVfbW9kdWxlcy9raW5kLW9mL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2hlbHBlci1tYXJrZG93bi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oZWxwZXItbWQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaHRtbC10YWcvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbmRleC1vZi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3Ivbm9kZV9tb2R1bGVzL2tpbmQtb2YvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXMtYnVmZmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLWRhdGEtZGVzY3JpcHRvci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1kYXRhLWRlc2NyaXB0b3Ivbm9kZV9tb2R1bGVzL2tpbmQtb2YvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXMtZGVzY3JpcHRvci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1kZXNjcmlwdG9yL25vZGVfbW9kdWxlcy9raW5kLW9mL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLWRlc2NyaXB0b3IvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvaXMtZG90ZmlsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1lcXVhbC1zaGFsbG93L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLWV2ZW4vaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXMtZXZlbi9ub2RlX21vZHVsZXMvaXMtbnVtYmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLWV4dGVuZGFibGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXMtZXh0Z2xvYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1nbG9iL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLW51bWJlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1udW1iZXIvbm9kZV9tb2R1bGVzL2tpbmQtb2YvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXMtb2RkL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLXBvc2l4LWJyYWNrZXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXMtcHJpbWl0aXZlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXNvYmplY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzIiwibm9kZV9tb2R1bGVzL2xhenktY2FjaGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbG9nZ2luZy1oZWxwZXJzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21ha2UtaXRlcmF0b3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWljcm9tYXRjaC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9taWNyb21hdGNoL2xpYi9jaGFycy5qcyIsIm5vZGVfbW9kdWxlcy9taWNyb21hdGNoL2xpYi9leHBhbmQuanMiLCJub2RlX21vZHVsZXMvbWljcm9tYXRjaC9saWIvZ2xvYi5qcyIsIm5vZGVfbW9kdWxlcy9taWNyb21hdGNoL2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9taWNyb21hdGNoL25vZGVfbW9kdWxlcy9hcnItZGlmZi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9taWNyb21hdGNoL25vZGVfbW9kdWxlcy9raW5kLW9mL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21peGluLWRlZXAvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbW9tZW50L21vbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9ub3JtYWxpemUtcGF0aC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9vYmplY3Qub21pdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZS1nbG9iL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcmVzZXJ2ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiLCJub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2RlY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZW5jb2RlLmpzIiwibm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYW5kb21hdGljL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JhbmRvbWF0aWMvbm9kZV9tb2R1bGVzL2tpbmQtb2YvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVnZXgtY2FjaGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVsYXRpdmUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmthYmxlL2xpYi9jb21tb24vZW50aXRpZXMuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvY29tbW9uL2h0bWxfYmxvY2tzLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL2NvbW1vbi9odG1sX3JlLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL2NvbW1vbi91cmxfc2NoZW1hcy5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmthYmxlL2xpYi9jb21tb24vdXRpbHMuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvY29uZmlncy9jb21tb25tYXJrLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL2NvbmZpZ3MvZGVmYXVsdC5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmthYmxlL2xpYi9jb25maWdzL2Z1bGwuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvaGVscGVycy9ub3JtYWxpemVfbGluay5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmthYmxlL2xpYi9oZWxwZXJzL25vcm1hbGl6ZV9yZWZlcmVuY2UuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvaGVscGVycy9wYXJzZV9saW5rX2Rlc3RpbmF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL2hlbHBlcnMvcGFyc2VfbGlua19sYWJlbC5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmthYmxlL2xpYi9oZWxwZXJzL3BhcnNlX2xpbmtfdGl0bGUuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcGFyc2VyX2Jsb2NrLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3BhcnNlcl9jb3JlLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3BhcnNlcl9pbmxpbmUuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcmVuZGVyZXIuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcnVsZXIuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcnVsZXMuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcnVsZXNfYmxvY2svYmxvY2txdW90ZS5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmthYmxlL2xpYi9ydWxlc19ibG9jay9jb2RlLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2Jsb2NrL2RlZmxpc3QuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcnVsZXNfYmxvY2svZmVuY2VzLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2Jsb2NrL2Zvb3Rub3RlLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2Jsb2NrL2hlYWRpbmcuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcnVsZXNfYmxvY2svaHIuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcnVsZXNfYmxvY2svaHRtbGJsb2NrLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2Jsb2NrL2xoZWFkaW5nLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2Jsb2NrL2xpc3QuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcnVsZXNfYmxvY2svcGFyYWdyYXBoLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2Jsb2NrL3N0YXRlX2Jsb2NrLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2Jsb2NrL3RhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2NvcmUvYWJici5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmthYmxlL2xpYi9ydWxlc19jb3JlL2FiYnIyLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2NvcmUvYmxvY2suanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcnVsZXNfY29yZS9mb290bm90ZV90YWlsLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2NvcmUvaW5saW5lLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2NvcmUvbGlua2lmeS5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmthYmxlL2xpYi9ydWxlc19jb3JlL3JlZmVyZW5jZXMuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcnVsZXNfY29yZS9yZXBsYWNlbWVudHMuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcnVsZXNfY29yZS9zbWFydHF1b3Rlcy5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmthYmxlL2xpYi9ydWxlc19pbmxpbmUvYXV0b2xpbmsuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcnVsZXNfaW5saW5lL2JhY2t0aWNrcy5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmthYmxlL2xpYi9ydWxlc19pbmxpbmUvZGVsLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2lubGluZS9lbXBoYXNpcy5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmthYmxlL2xpYi9ydWxlc19pbmxpbmUvZW50aXR5LmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2lubGluZS9lc2NhcGUuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcnVsZXNfaW5saW5lL2Zvb3Rub3RlX2lubGluZS5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmthYmxlL2xpYi9ydWxlc19pbmxpbmUvZm9vdG5vdGVfcmVmLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2lubGluZS9odG1sdGFnLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2lubGluZS9pbnMuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcnVsZXNfaW5saW5lL2xpbmtzLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2lubGluZS9tYXJrLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2lubGluZS9uZXdsaW5lLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2lubGluZS9zdGF0ZV9pbmxpbmUuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrYWJsZS9saWIvcnVsZXNfaW5saW5lL3N1Yi5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmthYmxlL2xpYi9ydWxlc19pbmxpbmUvc3VwLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFya2FibGUvbGliL3J1bGVzX2lubGluZS90ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JlcGVhdC1lbGVtZW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlcGVhdC1zdHJpbmcvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2V0LWdldHRlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zdHJpcC1hbnNpL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N0cmlwdGFncy9zdHJpcHRhZ3MuanMiLCJub2RlX21vZHVsZXMvc3VwcG9ydHMtY29sb3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdG8tZ2ZtLWNvZGUtYmxvY2svaW5kZXguanMiLCJub2RlX21vZHVsZXMvdG8tb2JqZWN0LXBhdGgvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdG8tb2JqZWN0LXBhdGgvbm9kZV9tb2R1bGVzL2tpbmQtb2YvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdXJsL3VybC5qcyIsIm5vZGVfbW9kdWxlcy91cmwvdXRpbC5qcyIsInNyYy9hcHAuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ254RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1lBOzs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQy9xREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbG9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hyRUE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2x5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3haQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4bUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcGlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL09BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeGZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNqSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3JIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNqSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDakhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNqSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbG5UQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNqTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3Y4SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDNUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2hPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNyaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3BLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdGxFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM2FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNySkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDL1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1dEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIC9bXFx1MDAxYlxcdTAwOWJdW1soKSM7P10qKD86WzAtOV17MSw0fSg/OjtbMC05XXswLDR9KSopP1swLTlBLU9SWmNmLW5xcnk9PjxdL2c7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBhc3NlbWJsZVN0eWxlcyAoKSB7XG5cdHZhciBzdHlsZXMgPSB7XG5cdFx0bW9kaWZpZXJzOiB7XG5cdFx0XHRyZXNldDogWzAsIDBdLFxuXHRcdFx0Ym9sZDogWzEsIDIyXSwgLy8gMjEgaXNuJ3Qgd2lkZWx5IHN1cHBvcnRlZCBhbmQgMjIgZG9lcyB0aGUgc2FtZSB0aGluZ1xuXHRcdFx0ZGltOiBbMiwgMjJdLFxuXHRcdFx0aXRhbGljOiBbMywgMjNdLFxuXHRcdFx0dW5kZXJsaW5lOiBbNCwgMjRdLFxuXHRcdFx0aW52ZXJzZTogWzcsIDI3XSxcblx0XHRcdGhpZGRlbjogWzgsIDI4XSxcblx0XHRcdHN0cmlrZXRocm91Z2g6IFs5LCAyOV1cblx0XHR9LFxuXHRcdGNvbG9yczoge1xuXHRcdFx0YmxhY2s6IFszMCwgMzldLFxuXHRcdFx0cmVkOiBbMzEsIDM5XSxcblx0XHRcdGdyZWVuOiBbMzIsIDM5XSxcblx0XHRcdHllbGxvdzogWzMzLCAzOV0sXG5cdFx0XHRibHVlOiBbMzQsIDM5XSxcblx0XHRcdG1hZ2VudGE6IFszNSwgMzldLFxuXHRcdFx0Y3lhbjogWzM2LCAzOV0sXG5cdFx0XHR3aGl0ZTogWzM3LCAzOV0sXG5cdFx0XHRncmF5OiBbOTAsIDM5XVxuXHRcdH0sXG5cdFx0YmdDb2xvcnM6IHtcblx0XHRcdGJnQmxhY2s6IFs0MCwgNDldLFxuXHRcdFx0YmdSZWQ6IFs0MSwgNDldLFxuXHRcdFx0YmdHcmVlbjogWzQyLCA0OV0sXG5cdFx0XHRiZ1llbGxvdzogWzQzLCA0OV0sXG5cdFx0XHRiZ0JsdWU6IFs0NCwgNDldLFxuXHRcdFx0YmdNYWdlbnRhOiBbNDUsIDQ5XSxcblx0XHRcdGJnQ3lhbjogWzQ2LCA0OV0sXG5cdFx0XHRiZ1doaXRlOiBbNDcsIDQ5XVxuXHRcdH1cblx0fTtcblxuXHQvLyBmaXggaHVtYW5zXG5cdHN0eWxlcy5jb2xvcnMuZ3JleSA9IHN0eWxlcy5jb2xvcnMuZ3JheTtcblxuXHRPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwTmFtZSkge1xuXHRcdHZhciBncm91cCA9IHN0eWxlc1tncm91cE5hbWVdO1xuXG5cdFx0T2JqZWN0LmtleXMoZ3JvdXApLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlTmFtZSkge1xuXHRcdFx0dmFyIHN0eWxlID0gZ3JvdXBbc3R5bGVOYW1lXTtcblxuXHRcdFx0c3R5bGVzW3N0eWxlTmFtZV0gPSBncm91cFtzdHlsZU5hbWVdID0ge1xuXHRcdFx0XHRvcGVuOiAnXFx1MDAxYlsnICsgc3R5bGVbMF0gKyAnbScsXG5cdFx0XHRcdGNsb3NlOiAnXFx1MDAxYlsnICsgc3R5bGVbMV0gKyAnbSdcblx0XHRcdH07XG5cdFx0fSk7XG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCBncm91cE5hbWUsIHtcblx0XHRcdHZhbHVlOiBncm91cCxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fSk7XG5cdH0pO1xuXG5cdHJldHVybiBzdHlsZXM7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsICdleHBvcnRzJywge1xuXHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRnZXQ6IGFzc2VtYmxlU3R5bGVzXG59KTtcbiIsIi8qIVxuICogYXJyLWZpbHRlciA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvYXJyLWZpbHRlcj5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2VcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpdGVyYXRvciA9IHJlcXVpcmUoJ21ha2UtaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmaWx0ZXIoYXJyLCBjYiwgdGhpc0FyZykge1xuICBpZiAoYXJyID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJyLWZpbHRlciBleHBlY3RzIGEgY2FsbGJhY2sgZnVuY3Rpb24uJyk7XG4gIH1cblxuICBjYiA9IGl0ZXJhdG9yKGNiLCB0aGlzQXJnKTtcbiAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XG4gIHZhciByZXMgPSBhcnIuc2xpY2UoKTtcbiAgdmFyIGkgPSAwO1xuXG4gIHdoaWxlIChsZW4tLSkge1xuICAgIGlmICghY2IoYXJyW2xlbl0sIGkrKykpIHtcbiAgICAgIHJlcy5zcGxpY2UobGVuLCAxKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblxuIiwiLyohXG4gKiBhcnItZmxhdHRlbiA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvYXJyLWZsYXR0ZW4+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmbGF0dGVuKGFycikge1xuICByZXR1cm4gZmxhdChhcnIsIFtdKTtcbn07XG5cbmZ1bmN0aW9uIGZsYXQoYXJyLCByZXMpIHtcbiAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XG4gIHZhciBpID0gLTE7XG5cbiAgd2hpbGUgKGxlbi0tKSB7XG4gICAgdmFyIGN1ciA9IGFyclsrK2ldO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGN1cikpIHtcbiAgICAgIGZsYXQoY3VyLCByZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMucHVzaChjdXIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufSIsIi8qIVxuICogYXJyYXktc29ydCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvYXJyYXktc29ydD5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHR5cGVPZiA9IHJlcXVpcmUoJ2tpbmQtb2YnKTtcbnZhciBnZXQgPSByZXF1aXJlKCdnZXQtdmFsdWUnKTtcblxuLyoqXG4gKiBTb3J0IGFuIGFycmF5IG9mIG9iamVjdHMgYnkgb25lIG9yIG1vcmUgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0gIHtBcnJheX0gYGFycmAgVGhlIEFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0gIHtTdHJpbmd8QXJyYXl8RnVuY3Rpb259IGBwcm9wc2AgT25lIG9yIG1vcmUgb2JqZWN0IHBhdGhzIG9yIGNvbXBhcmlzb24gZnVuY3Rpb25zLlxuICogQHBhcmFtICB7T2JqZWN0fSBgb3B0c2AgUGFzcyBgeyByZXZlcnNlOiB0cnVlIH1gIHRvIHJldmVyc2UgdGhlIHNvcnQgb3JkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhIHNvcnRlZCBhcnJheS5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gYXJyYXlTb3J0KGFyciwgcHJvcHMsIG9wdHMpIHtcbiAgaWYgKGFyciA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcnJheS1zb3J0IGV4cGVjdHMgYW4gYXJyYXkuJyk7XG4gIH1cblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBhcnIuc29ydCgpO1xuICB9XG5cbiAgdmFyIGFyZ3MgPSBmbGF0dGVuKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG5cbiAgLy8gaWYgdGhlIGxhc3QgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdCxcbiAgLy8gaXQncyBub3QgYSB2YWxpZCBgY29tcGFyZWAgYXJnLCBzbyBpdCBtdXN0IGJlIG9wdGlvbnMuXG4gIGlmICh0eXBlT2YoYXJnc1thcmdzLmxlbmd0aCAtIDFdKSA9PT0gJ29iamVjdCcpIHtcbiAgICBvcHRzID0gYXJncy5wb3AoKTtcbiAgfVxuICByZXR1cm4gYXJyLnNvcnQoc29ydEJ5KGFyZ3MsIG9wdHMpKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgZWFjaCBjb21wYXJpc29uIHByb3BlcnR5IG9yIGZ1bmN0aW9uIHVudGlsIGAxYCBvciBgLTFgXG4gKiBpcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd8QXJyYXl8RnVuY3Rpb259IGBwcm9wc2AgT25lIG9yIG1vcmUgb2JqZWN0IHBhdGhzIG9yIGNvbXBhcmlzb24gZnVuY3Rpb25zLlxuICogQHBhcmFtICB7T2JqZWN0fSBgb3B0c2AgUGFzcyBgeyByZXZlcnNlOiB0cnVlIH1gIHRvIHJldmVyc2UgdGhlIHNvcnQgb3JkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuXG5mdW5jdGlvbiBzb3J0QnkocHJvcHMsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXBhcmVGbihhLCBiKSB7XG4gICAgdmFyIGxlbiA9IHByb3BzLmxlbmd0aCwgaSA9IC0xO1xuICAgIHZhciByZXN1bHQ7XG5cbiAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICByZXN1bHQgPSBjb21wYXJlKHByb3BzW2ldLCBhLCBiKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRzLnJldmVyc2UgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDb21wYXJlIGBhYCB0byBgYmAuIElmIGFuIG9iamVjdCBgcHJvcGAgaXMgcGFzc2VkLCB0aGVuXG4gKiBgYVtwcm9wXWAgaXMgY29tcGFyZWQgdG8gYGJbcHJvcF1gXG4gKi9cblxuZnVuY3Rpb24gY29tcGFyZShwcm9wLCBhLCBiKSB7XG4gIGlmICh0eXBlb2YgcHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIGV4cG9zZSBgY29tcGFyZWAgdG8gY3VzdG9tIGZ1bmN0aW9uXG4gICAgcmV0dXJuIHByb3AoYSwgYiwgY29tcGFyZS5iaW5kKG51bGwsIG51bGwpKTtcbiAgfVxuICAvLyBjb21wYXJlIG9iamVjdCB2YWx1ZXNcbiAgaWYgKHByb3AgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBjb21wYXJlKG51bGwsIGdldChhLCBwcm9wKSwgZ2V0KGIsIHByb3ApKTtcbiAgfVxuICByZXR1cm4gZGVmYXVsdENvbXBhcmUoYSwgYik7XG59XG5cbi8qKlxuICogRGVmYXVsdCBjb21wYXJlIGZ1bmN0aW9uIHVzZWQgYXMgYSBmYWxsYmFja1xuICogZm9yIHNvcnRpbmcuXG4gKi9cblxuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUoYSwgYikge1xuICByZXR1cm4gYSA8IGIgPyAtMSA6IChhID4gYiA/IDEgOiAwKTtcbn1cblxuLyoqXG4gKiBGbGF0dGVuIHRoZSBnaXZlbiBhcnJheS5cbiAqL1xuXG5mdW5jdGlvbiBmbGF0dGVuKGFycikge1xuICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBhcnIpO1xufVxuXG4vKipcbiAqIEV4cG9zZSBgYXJyYXlTb3J0YFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlTb3J0O1xuIiwidmFyIGlzQnVmZmVyID0gcmVxdWlyZSgnaXMtYnVmZmVyJyk7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIEdldCB0aGUgbmF0aXZlIGB0eXBlb2ZgIGEgdmFsdWUuXG4gKlxuICogQHBhcmFtICB7Kn0gYHZhbGBcbiAqIEByZXR1cm4geyp9IE5hdGl2ZSBqYXZhc2NyaXB0IHR5cGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcbiAgLy8gcHJpbWl0aXZpZXNcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICB9XG4gIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG4gIGlmICh2YWwgPT09IHRydWUgfHwgdmFsID09PSBmYWxzZSB8fCB2YWwgaW5zdGFuY2VvZiBCb29sZWFuKSB7XG4gICAgcmV0dXJuICdib29sZWFuJztcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdmFsIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgcmV0dXJuICdzdHJpbmcnO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyB8fCB2YWwgaW5zdGFuY2VvZiBOdW1iZXIpIHtcbiAgICByZXR1cm4gJ251bWJlcic7XG4gIH1cblxuICAvLyBmdW5jdGlvbnNcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicgfHwgdmFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIC8vIGFycmF5XG4gIGlmICh0eXBlb2YgQXJyYXkuaXNBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgcmV0dXJuICdhcnJheSc7XG4gIH1cblxuICAvLyBjaGVjayBmb3IgaW5zdGFuY2VzIG9mIFJlZ0V4cCBhbmQgRGF0ZSBiZWZvcmUgY2FsbGluZyBgdG9TdHJpbmdgXG4gIGlmICh2YWwgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gIH1cbiAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gJ2RhdGUnO1xuICB9XG5cbiAgLy8gb3RoZXIgb2JqZWN0c1xuICB2YXIgdHlwZSA9IHRvU3RyaW5nLmNhbGwodmFsKTtcblxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcbiAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIHJldHVybiAnZGF0ZSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nKSB7XG4gICAgcmV0dXJuICdhcmd1bWVudHMnO1xuICB9XG5cbiAgLy8gYnVmZmVyXG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBpc0J1ZmZlcih2YWwpKSB7XG4gICAgcmV0dXJuICdidWZmZXInO1xuICB9XG5cbiAgLy8gZXM2OiBNYXAsIFdlYWtNYXAsIFNldCwgV2Vha1NldFxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgU2V0XScpIHtcbiAgICByZXR1cm4gJ3NldCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFdlYWtTZXRdJykge1xuICAgIHJldHVybiAnd2Vha3NldCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IE1hcF0nKSB7XG4gICAgcmV0dXJuICdtYXAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBXZWFrTWFwXScpIHtcbiAgICByZXR1cm4gJ3dlYWttYXAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBTeW1ib2xdJykge1xuICAgIHJldHVybiAnc3ltYm9sJztcbiAgfVxuXG4gIC8vIG11c3QgYmUgYSBwbGFpbiBvYmplY3RcbiAgcmV0dXJuICdvYmplY3QnO1xufTtcbiIsIi8qIVxuICogYXJyYXktdW5pcXVlIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9hcnJheS11bmlxdWU+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB1bmlxdWUoYXJyKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJyYXktdW5pcXVlIGV4cGVjdHMgYW4gYXJyYXkuJyk7XG4gIH1cblxuICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcbiAgdmFyIGkgPSAtMTtcblxuICB3aGlsZSAoaSsrIDwgbGVuKSB7XG4gICAgdmFyIGogPSBpICsgMTtcblxuICAgIGZvciAoOyBqIDwgYXJyLmxlbmd0aDsgKytqKSB7XG4gICAgICBpZiAoYXJyW2ldID09PSBhcnJbal0pIHtcbiAgICAgICAgYXJyLnNwbGljZShqLS0sIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyO1xufTtcbiIsIihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlIHVubGVzcyBhbWRNb2R1bGVJZCBpcyBzZXRcbiAgICBkZWZpbmUoW10sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAocm9vdFsnQXV0b2xpbmtlciddID0gZmFjdG9yeSgpKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXRcbiAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAvLyBsaWtlIE5vZGUuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdFsnQXV0b2xpbmtlciddID0gZmFjdG9yeSgpO1xuICB9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcblxuLyohXG4gKiBBdXRvbGlua2VyLmpzXG4gKiAwLjE1LjNcbiAqXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBHcmVnb3J5IEphY29icyA8Z3JlZ0BncmVnLWphY29icy5jb20+XG4gKiBNSVQgTGljZW5zZWQuIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2dyZWdqYWNvYnMvQXV0b2xpbmtlci5qc1xuICovXG4vKipcbiAqIEBjbGFzcyBBdXRvbGlua2VyXG4gKiBAZXh0ZW5kcyBPYmplY3RcbiAqIFxuICogVXRpbGl0eSBjbGFzcyB1c2VkIHRvIHByb2Nlc3MgYSBnaXZlbiBzdHJpbmcgb2YgdGV4dCwgYW5kIHdyYXAgdGhlIFVSTHMsIGVtYWlsIGFkZHJlc3NlcywgYW5kIFR3aXR0ZXIgaGFuZGxlcyBpbiBcbiAqIHRoZSBhcHByb3ByaWF0ZSBhbmNob3IgKCZsdDthJmd0OykgdGFncyB0byB0dXJuIHRoZW0gaW50byBsaW5rcy5cbiAqIFxuICogQW55IG9mIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWF5IGJlIHByb3ZpZGVkIGluIGFuIE9iamVjdCAobWFwKSBwcm92aWRlZCB0byB0aGUgQXV0b2xpbmtlciBjb25zdHJ1Y3Rvciwgd2hpY2hcbiAqIHdpbGwgY29uZmlndXJlIGhvdyB0aGUge0BsaW5rICNsaW5rIGxpbmsoKX0gbWV0aG9kIHdpbGwgcHJvY2VzcyB0aGUgbGlua3MuXG4gKiBcbiAqIEZvciBleGFtcGxlOlxuICogXG4gKiAgICAgdmFyIGF1dG9saW5rZXIgPSBuZXcgQXV0b2xpbmtlcigge1xuICogICAgICAgICBuZXdXaW5kb3cgOiBmYWxzZSxcbiAqICAgICAgICAgdHJ1bmNhdGUgIDogMzBcbiAqICAgICB9ICk7XG4gKiAgICAgXG4gKiAgICAgdmFyIGh0bWwgPSBhdXRvbGlua2VyLmxpbmsoIFwiSm9lIHdlbnQgdG8gd3d3LnlhaG9vLmNvbVwiICk7XG4gKiAgICAgLy8gcHJvZHVjZXM6ICdKb2Ugd2VudCB0byA8YSBocmVmPVwiaHR0cDovL3d3dy55YWhvby5jb21cIj55YWhvby5jb208L2E+J1xuICogXG4gKiBcbiAqIFRoZSB7QGxpbmsgI3N0YXRpYy1saW5rIHN0YXRpYyBsaW5rKCl9IG1ldGhvZCBtYXkgYWxzbyBiZSB1c2VkIHRvIGlubGluZSBvcHRpb25zIGludG8gYSBzaW5nbGUgY2FsbCwgd2hpY2ggbWF5XG4gKiBiZSBtb3JlIGNvbnZlbmllbnQgZm9yIG9uZS1vZmYgdXNlcy4gRm9yIGV4YW1wbGU6XG4gKiBcbiAqICAgICB2YXIgaHRtbCA9IEF1dG9saW5rZXIubGluayggXCJKb2Ugd2VudCB0byB3d3cueWFob28uY29tXCIsIHtcbiAqICAgICAgICAgbmV3V2luZG93IDogZmFsc2UsXG4gKiAgICAgICAgIHRydW5jYXRlICA6IDMwXG4gKiAgICAgfSApO1xuICogICAgIC8vIHByb2R1Y2VzOiAnSm9lIHdlbnQgdG8gPGEgaHJlZj1cImh0dHA6Ly93d3cueWFob28uY29tXCI+eWFob28uY29tPC9hPidcbiAqIFxuICogXG4gKiAjIyBDdXN0b20gUmVwbGFjZW1lbnRzIG9mIExpbmtzXG4gKiBcbiAqIElmIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZG8gbm90IHByb3ZpZGUgZW5vdWdoIGZsZXhpYmlsaXR5LCBhIHtAbGluayAjcmVwbGFjZUZufSBtYXkgYmUgcHJvdmlkZWQgdG8gZnVsbHkgY3VzdG9taXplXG4gKiB0aGUgb3V0cHV0IG9mIEF1dG9saW5rZXIuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggVVJML0VtYWlsL1R3aXR0ZXIgaGFuZGxlIG1hdGNoIHRoYXQgaXMgZW5jb3VudGVyZWQuXG4gKiBcbiAqIEZvciBleGFtcGxlOlxuICogXG4gKiAgICAgdmFyIGlucHV0ID0gXCIuLi5cIjsgIC8vIHN0cmluZyB3aXRoIFVSTHMsIEVtYWlsIEFkZHJlc3NlcywgYW5kIFR3aXR0ZXIgSGFuZGxlc1xuICogICAgIFxuICogICAgIHZhciBsaW5rZWRUZXh0ID0gQXV0b2xpbmtlci5saW5rKCBpbnB1dCwge1xuICogICAgICAgICByZXBsYWNlRm4gOiBmdW5jdGlvbiggYXV0b2xpbmtlciwgbWF0Y2ggKSB7XG4gKiAgICAgICAgICAgICBjb25zb2xlLmxvZyggXCJocmVmID0gXCIsIG1hdGNoLmdldEFuY2hvckhyZWYoKSApO1xuICogICAgICAgICAgICAgY29uc29sZS5sb2coIFwidGV4dCA9IFwiLCBtYXRjaC5nZXRBbmNob3JUZXh0KCkgKTtcbiAqICAgICAgICAgXG4gKiAgICAgICAgICAgICBzd2l0Y2goIG1hdGNoLmdldFR5cGUoKSApIHtcbiAqICAgICAgICAgICAgICAgICBjYXNlICd1cmwnIDogXG4gKiAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCBcInVybDogXCIsIG1hdGNoLmdldFVybCgpICk7XG4gKiAgICAgICAgICAgICAgICAgICAgIFxuICogICAgICAgICAgICAgICAgICAgICBpZiggbWF0Y2guZ2V0VXJsKCkuaW5kZXhPZiggJ215c2l0ZS5jb20nICkgPT09IC0xICkge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IGF1dG9saW5rZXIuZ2V0VGFnQnVpbGRlcigpLmJ1aWxkKCBtYXRjaCApOyAgLy8gcmV0dXJucyBhbiBgQXV0b2xpbmtlci5IdG1sVGFnYCBpbnN0YW5jZSwgd2hpY2ggcHJvdmlkZXMgbXV0YXRvciBtZXRob2RzIGZvciBlYXN5IGNoYW5nZXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zZXRBdHRyKCAncmVsJywgJ25vZm9sbG93JyApO1xuICogICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmFkZENsYXNzKCAnZXh0ZXJuYWwtbGluaycgKTtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFxuICogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFxuICogICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBsZXQgQXV0b2xpbmtlciBwZXJmb3JtIGl0cyBub3JtYWwgYW5jaG9yIHRhZyByZXBsYWNlbWVudFxuICogICAgICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICAgICAgIFxuICogICAgICAgICAgICAgICAgIGNhc2UgJ2VtYWlsJyA6XG4gKiAgICAgICAgICAgICAgICAgICAgIHZhciBlbWFpbCA9IG1hdGNoLmdldEVtYWlsKCk7XG4gKiAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCBcImVtYWlsOiBcIiwgZW1haWwgKTtcbiAqICAgICAgICAgICAgICAgICAgICAgXG4gKiAgICAgICAgICAgICAgICAgICAgIGlmKCBlbWFpbCA9PT0gXCJteUBvd24uYWRkcmVzc1wiICkge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG9uJ3QgYXV0by1saW5rIHRoaXMgcGFydGljdWxhciBlbWFpbCBhZGRyZXNzOyBsZWF2ZSBhcy1pc1xuICogICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgLy8gbm8gcmV0dXJuIHZhbHVlIHdpbGwgaGF2ZSBBdXRvbGlua2VyIHBlcmZvcm0gaXRzIG5vcm1hbCBhbmNob3IgdGFnIHJlcGxhY2VtZW50IChzYW1lIGFzIHJldHVybmluZyBgdHJ1ZWApXG4gKiAgICAgICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgICAgICBcbiAqICAgICAgICAgICAgICAgICBjYXNlICd0d2l0dGVyJyA6XG4gKiAgICAgICAgICAgICAgICAgICAgIHZhciB0d2l0dGVySGFuZGxlID0gbWF0Y2guZ2V0VHdpdHRlckhhbmRsZSgpO1xuICogICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyggdHdpdHRlckhhbmRsZSApO1xuICogICAgICAgICAgICAgICAgICAgICBcbiAqICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8YSBocmVmPVwiaHR0cDovL25ld3BsYWNlLnRvLmxpbmsudHdpdHRlci5oYW5kbGVzLnRvL1wiPicgKyB0d2l0dGVySGFuZGxlICsgJzwvYT4nO1xuICogICAgICAgICAgICAgfVxuICogICAgICAgICB9XG4gKiAgICAgfSApO1xuICogXG4gKiBcbiAqIFRoZSBmdW5jdGlvbiBtYXkgcmV0dXJuIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuICogXG4gKiAtIGB0cnVlYCAoQm9vbGVhbik6IEFsbG93IEF1dG9saW5rZXIgdG8gcmVwbGFjZSB0aGUgbWF0Y2ggYXMgaXQgbm9ybWFsbHkgd291bGQuXG4gKiAtIGBmYWxzZWAgKEJvb2xlYW4pOiBEbyBub3QgcmVwbGFjZSB0aGUgY3VycmVudCBtYXRjaCBhdCBhbGwgLSBsZWF2ZSBhcy1pcy5cbiAqIC0gQW55IFN0cmluZzogSWYgYSBzdHJpbmcgaXMgcmV0dXJuZWQgZnJvbSB0aGUgZnVuY3Rpb24sIHRoZSBzdHJpbmcgd2lsbCBiZSB1c2VkIGRpcmVjdGx5IGFzIHRoZSByZXBsYWNlbWVudCBIVE1MIGZvclxuICogICB0aGUgbWF0Y2guXG4gKiAtIEFuIHtAbGluayBBdXRvbGlua2VyLkh0bWxUYWd9IGluc3RhbmNlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBidWlsZC9tb2RpZnkgYW4gSFRNTCB0YWcgYmVmb3JlIHdyaXRpbmcgb3V0IGl0cyBIVE1MIHRleHQuXG4gKiBcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IFtjb25maWddIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvbGlua2VyIGluc3RhbmNlLCBzcGVjaWZpZWQgaW4gYW4gT2JqZWN0IChtYXApLlxuICovXG52YXIgQXV0b2xpbmtlciA9IGZ1bmN0aW9uKCBjZmcgKSB7XG5cdEF1dG9saW5rZXIuVXRpbC5hc3NpZ24oIHRoaXMsIGNmZyApOyAgLy8gYXNzaWduIHRoZSBwcm9wZXJ0aWVzIG9mIGBjZmdgIG9udG8gdGhlIEF1dG9saW5rZXIgaW5zdGFuY2UuIFByb3RvdHlwZSBwcm9wZXJ0aWVzIHdpbGwgYmUgdXNlZCBmb3IgbWlzc2luZyBjb25maWdzLlxufTtcblxuXG5BdXRvbGlua2VyLnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3IgOiBBdXRvbGlua2VyLCAgLy8gZml4IGNvbnN0cnVjdG9yIHByb3BlcnR5XG5cdFxuXHQvKipcblx0ICogQGNmZyB7Qm9vbGVhbn0gdXJsc1xuXHQgKiBcblx0ICogYHRydWVgIGlmIG1pc2NlbGxhbmVvdXMgVVJMcyBzaG91bGQgYmUgYXV0b21hdGljYWxseSBsaW5rZWQsIGBmYWxzZWAgaWYgdGhleSBzaG91bGQgbm90IGJlLlxuXHQgKi9cblx0dXJscyA6IHRydWUsXG5cdFxuXHQvKipcblx0ICogQGNmZyB7Qm9vbGVhbn0gZW1haWxcblx0ICogXG5cdCAqIGB0cnVlYCBpZiBlbWFpbCBhZGRyZXNzZXMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgbGlua2VkLCBgZmFsc2VgIGlmIHRoZXkgc2hvdWxkIG5vdCBiZS5cblx0ICovXG5cdGVtYWlsIDogdHJ1ZSxcblx0XG5cdC8qKlxuXHQgKiBAY2ZnIHtCb29sZWFufSB0d2l0dGVyXG5cdCAqIFxuXHQgKiBgdHJ1ZWAgaWYgVHdpdHRlciBoYW5kbGVzIChcIkBleGFtcGxlXCIpIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGxpbmtlZCwgYGZhbHNlYCBpZiB0aGV5IHNob3VsZCBub3QgYmUuXG5cdCAqL1xuXHR0d2l0dGVyIDogdHJ1ZSxcblx0XG5cdC8qKlxuXHQgKiBAY2ZnIHtCb29sZWFufSBuZXdXaW5kb3dcblx0ICogXG5cdCAqIGB0cnVlYCBpZiB0aGUgbGlua3Mgc2hvdWxkIG9wZW4gaW4gYSBuZXcgd2luZG93LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdG5ld1dpbmRvdyA6IHRydWUsXG5cdFxuXHQvKipcblx0ICogQGNmZyB7Qm9vbGVhbn0gc3RyaXBQcmVmaXhcblx0ICogXG5cdCAqIGB0cnVlYCBpZiAnaHR0cDovLycgb3IgJ2h0dHBzOi8vJyBhbmQvb3IgdGhlICd3d3cuJyBzaG91bGQgYmUgc3RyaXBwZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIFVSTCBsaW5rcycgdGV4dCwgXG5cdCAqIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0c3RyaXBQcmVmaXggOiB0cnVlLFxuXHRcblx0LyoqXG5cdCAqIEBjZmcge051bWJlcn0gdHJ1bmNhdGVcblx0ICogXG5cdCAqIEEgbnVtYmVyIGZvciBob3cgbWFueSBjaGFyYWN0ZXJzIGxvbmcgVVJMcy9lbWFpbHMvdHdpdHRlciBoYW5kbGVzIHNob3VsZCBiZSB0cnVuY2F0ZWQgdG8gaW5zaWRlIHRoZSB0ZXh0IG9mIFxuXHQgKiBhIGxpbmsuIElmIHRoZSBVUkwvZW1haWwvdHdpdHRlciBpcyBvdmVyIHRoaXMgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIGl0IHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHRoaXMgbGVuZ3RoIGJ5IFxuXHQgKiBhZGRpbmcgYSB0d28gcGVyaW9kIGVsbGlwc2lzICgnLi4nKSB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG5cdCAqIFxuXHQgKiBGb3IgZXhhbXBsZTogQSB1cmwgbGlrZSAnaHR0cDovL3d3dy55YWhvby5jb20vc29tZS9sb25nL3BhdGgvdG8vYS9maWxlJyB0cnVuY2F0ZWQgdG8gMjUgY2hhcmFjdGVycyBtaWdodCBsb29rXG5cdCAqIHNvbWV0aGluZyBsaWtlIHRoaXM6ICd5YWhvby5jb20vc29tZS9sb25nL3BhdC4uJ1xuXHQgKi9cblx0dHJ1bmNhdGUgOiB1bmRlZmluZWQsXG5cdFxuXHQvKipcblx0ICogQGNmZyB7U3RyaW5nfSBjbGFzc05hbWVcblx0ICogXG5cdCAqIEEgQ1NTIGNsYXNzIG5hbWUgdG8gYWRkIHRvIHRoZSBnZW5lcmF0ZWQgbGlua3MuIFRoaXMgY2xhc3Mgd2lsbCBiZSBhZGRlZCB0byBhbGwgbGlua3MsIGFzIHdlbGwgYXMgdGhpcyBjbGFzc1xuXHQgKiBwbHVzIHVybC9lbWFpbC90d2l0dGVyIHN1ZmZpeGVzIGZvciBzdHlsaW5nIHVybC9lbWFpbC90d2l0dGVyIGxpbmtzIGRpZmZlcmVudGx5LlxuXHQgKiBcblx0ICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgY29uZmlnIGlzIHByb3ZpZGVkIGFzIFwibXlMaW5rXCIsIHRoZW46XG5cdCAqIFxuXHQgKiAtIFVSTCBsaW5rcyB3aWxsIGhhdmUgdGhlIENTUyBjbGFzc2VzOiBcIm15TGluayBteUxpbmstdXJsXCJcblx0ICogLSBFbWFpbCBsaW5rcyB3aWxsIGhhdmUgdGhlIENTUyBjbGFzc2VzOiBcIm15TGluayBteUxpbmstZW1haWxcIiwgYW5kXG5cdCAqIC0gVHdpdHRlciBsaW5rcyB3aWxsIGhhdmUgdGhlIENTUyBjbGFzc2VzOiBcIm15TGluayBteUxpbmstdHdpdHRlclwiXG5cdCAqL1xuXHRjbGFzc05hbWUgOiBcIlwiLFxuXHRcblx0LyoqXG5cdCAqIEBjZmcge0Z1bmN0aW9ufSByZXBsYWNlRm5cblx0ICogXG5cdCAqIEEgZnVuY3Rpb24gdG8gaW5kaXZpZHVhbGx5IHByb2Nlc3MgZWFjaCBVUkwvRW1haWwvVHdpdHRlciBtYXRjaCBmb3VuZCBpbiB0aGUgaW5wdXQgc3RyaW5nLlxuXHQgKiBcblx0ICogU2VlIHRoZSBjbGFzcydzIGRlc2NyaXB0aW9uIGZvciB1c2FnZS5cblx0ICogXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuXHQgKiBcblx0ICogQGNmZyB7QXV0b2xpbmtlcn0gcmVwbGFjZUZuLmF1dG9saW5rZXIgVGhlIEF1dG9saW5rZXIgaW5zdGFuY2UsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHJldHJpZXZlIGNoaWxkIG9iamVjdHMgZnJvbSAoc3VjaFxuXHQgKiAgIGFzIHRoZSBpbnN0YW5jZSdzIHtAbGluayAjZ2V0VGFnQnVpbGRlciB0YWcgYnVpbGRlcn0pLlxuXHQgKiBAY2ZnIHtBdXRvbGlua2VyLm1hdGNoLk1hdGNofSByZXBsYWNlRm4ubWF0Y2ggVGhlIE1hdGNoIGluc3RhbmNlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZVxuXHQgKiAgIHtAbGluayBBdXRvbGlua2VyLm1hdGNoLlVybCBVUkx9L3tAbGluayBBdXRvbGlua2VyLm1hdGNoLkVtYWlsIGVtYWlsfS97QGxpbmsgQXV0b2xpbmtlci5tYXRjaC5Ud2l0dGVyIFR3aXR0ZXJ9XG5cdCAqICAgbWF0Y2ggdGhhdCB0aGUgYHJlcGxhY2VGbmAgaXMgY3VycmVudGx5IHByb2Nlc3NpbmcuXG5cdCAqL1xuXHRcblx0XG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcHJvcGVydHkge0F1dG9saW5rZXIuaHRtbFBhcnNlci5IdG1sUGFyc2VyfSBodG1sUGFyc2VyXG5cdCAqIFxuXHQgKiBUaGUgSHRtbFBhcnNlciBpbnN0YW5jZSB1c2VkIHRvIHNraXAgb3ZlciBIVE1MIHRhZ3MsIHdoaWxlIGZpbmRpbmcgdGV4dCBub2RlcyB0byBwcm9jZXNzLiBUaGlzIGlzIGxhemlseSBpbnN0YW50aWF0ZWRcblx0ICogaW4gdGhlIHtAbGluayAjZ2V0SHRtbFBhcnNlcn0gbWV0aG9kLlxuXHQgKi9cblx0aHRtbFBhcnNlciA6IHVuZGVmaW5lZCxcblx0XG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcHJvcGVydHkge0F1dG9saW5rZXIubWF0Y2hQYXJzZXIuTWF0Y2hQYXJzZXJ9IG1hdGNoUGFyc2VyXG5cdCAqIFxuXHQgKiBUaGUgTWF0Y2hQYXJzZXIgaW5zdGFuY2UgdXNlZCB0byBmaW5kIFVSTC9lbWFpbC9Ud2l0dGVyIG1hdGNoZXMgaW4gdGhlIHRleHQgbm9kZXMgb2YgYW4gaW5wdXQgc3RyaW5nIHBhc3NlZCB0b1xuXHQgKiB7QGxpbmsgI2xpbmt9LiBUaGlzIGlzIGxhemlseSBpbnN0YW50aWF0ZWQgaW4gdGhlIHtAbGluayAjZ2V0TWF0Y2hQYXJzZXJ9IG1ldGhvZC5cblx0ICovXG5cdG1hdGNoUGFyc2VyIDogdW5kZWZpbmVkLFxuXHRcblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwcm9wZXJ0eSB7QXV0b2xpbmtlci5BbmNob3JUYWdCdWlsZGVyfSB0YWdCdWlsZGVyXG5cdCAqIFxuXHQgKiBUaGUgQW5jaG9yVGFnQnVpbGRlciBpbnN0YW5jZSB1c2VkIHRvIGJ1aWxkIHRoZSBVUkwvZW1haWwvVHdpdHRlciByZXBsYWNlbWVudCBhbmNob3IgdGFncy4gVGhpcyBpcyBsYXppbHkgaW5zdGFudGlhdGVkXG5cdCAqIGluIHRoZSB7QGxpbmsgI2dldFRhZ0J1aWxkZXJ9IG1ldGhvZC5cblx0ICovXG5cdHRhZ0J1aWxkZXIgOiB1bmRlZmluZWQsXG5cdFxuXHRcblx0LyoqXG5cdCAqIEF1dG9tYXRpY2FsbHkgbGlua3MgVVJMcywgZW1haWwgYWRkcmVzc2VzLCBhbmQgVHdpdHRlciBoYW5kbGVzIGZvdW5kIGluIHRoZSBnaXZlbiBjaHVuayBvZiBIVE1MLiBcblx0ICogRG9lcyBub3QgbGluayBVUkxzIGZvdW5kIHdpdGhpbiBIVE1MIHRhZ3MuXG5cdCAqIFxuXHQgKiBGb3IgaW5zdGFuY2UsIGlmIGdpdmVuIHRoZSB0ZXh0OiBgWW91IHNob3VsZCBnbyB0byBodHRwOi8vd3d3LnlhaG9vLmNvbWAsIHRoZW4gdGhlIHJlc3VsdFxuXHQgKiB3aWxsIGJlIGBZb3Ugc2hvdWxkIGdvIHRvICZsdDthIGhyZWY9XCJodHRwOi8vd3d3LnlhaG9vLmNvbVwiJmd0O2h0dHA6Ly93d3cueWFob28uY29tJmx0Oy9hJmd0O2Bcblx0ICogXG5cdCAqIFRoaXMgbWV0aG9kIGZpbmRzIHRoZSB0ZXh0IGFyb3VuZCBhbnkgSFRNTCBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYHRleHRPckh0bWxgLCB3aGljaCB3aWxsIGJlIHRoZSB0ZXh0IHRoYXQgaXMgcHJvY2Vzc2VkLlxuXHQgKiBBbnkgb3JpZ2luYWwgSFRNTCBlbGVtZW50cyB3aWxsIGJlIGxlZnQgYXMtaXMsIGFzIHdlbGwgYXMgdGhlIHRleHQgdGhhdCBpcyBhbHJlYWR5IHdyYXBwZWQgaW4gYW5jaG9yICgmbHQ7YSZndDspIHRhZ3MuXG5cdCAqIFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdGV4dE9ySHRtbCBUaGUgSFRNTCBvciB0ZXh0IHRvIGxpbmsgVVJMcywgZW1haWwgYWRkcmVzc2VzLCBhbmQgVHdpdHRlciBoYW5kbGVzIHdpdGhpbiAoZGVwZW5kaW5nIG9uIGlmXG5cdCAqICAgdGhlIHtAbGluayAjdXJsc30sIHtAbGluayAjZW1haWx9LCBhbmQge0BsaW5rICN0d2l0dGVyfSBvcHRpb25zIGFyZSBlbmFibGVkKS5cblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgSFRNTCwgd2l0aCBVUkxzL2VtYWlscy9Ud2l0dGVyIGhhbmRsZXMgYXV0b21hdGljYWxseSBsaW5rZWQuXG5cdCAqL1xuXHRsaW5rIDogZnVuY3Rpb24oIHRleHRPckh0bWwgKSB7XG5cdFx0dmFyIGh0bWxQYXJzZXIgPSB0aGlzLmdldEh0bWxQYXJzZXIoKSxcblx0XHQgICAgaHRtbE5vZGVzID0gaHRtbFBhcnNlci5wYXJzZSggdGV4dE9ySHRtbCApLFxuXHRcdCAgICBhbmNob3JUYWdTdGFja0NvdW50ID0gMCwgIC8vIHVzZWQgdG8gb25seSBwcm9jZXNzIHRleHQgYXJvdW5kIGFuY2hvciB0YWdzLCBhbmQgYW55IGlubmVyIHRleHQvaHRtbCB0aGV5IG1heSBoYXZlXG5cdFx0ICAgIHJlc3VsdEh0bWwgPSBbXTtcblx0XHRcblx0XHRmb3IoIHZhciBpID0gMCwgbGVuID0gaHRtbE5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0dmFyIG5vZGUgPSBodG1sTm9kZXNbIGkgXSxcblx0XHRcdCAgICBub2RlVHlwZSA9IG5vZGUuZ2V0VHlwZSgpLFxuXHRcdFx0ICAgIG5vZGVUZXh0ID0gbm9kZS5nZXRUZXh0KCk7XG5cdFx0XHRcblx0XHRcdGlmKCBub2RlVHlwZSA9PT0gJ2VsZW1lbnQnICkge1xuXHRcdFx0XHQvLyBQcm9jZXNzIEhUTUwgbm9kZXMgaW4gdGhlIGlucHV0IGB0ZXh0T3JIdG1sYFxuXHRcdFx0XHRpZiggbm9kZS5nZXRUYWdOYW1lKCkgPT09ICdhJyApIHtcblx0XHRcdFx0XHRpZiggIW5vZGUuaXNDbG9zaW5nKCkgKSB7ICAvLyBpdCdzIHRoZSBzdGFydCA8YT4gdGFnXG5cdFx0XHRcdFx0XHRhbmNob3JUYWdTdGFja0NvdW50Kys7XG5cdFx0XHRcdFx0fSBlbHNlIHsgICAvLyBpdCdzIHRoZSBlbmQgPC9hPiB0YWdcblx0XHRcdFx0XHRcdGFuY2hvclRhZ1N0YWNrQ291bnQgPSBNYXRoLm1heCggYW5jaG9yVGFnU3RhY2tDb3VudCAtIDEsIDAgKTsgIC8vIGF0dGVtcHQgdG8gaGFuZGxlIGV4dHJhbmVvdXMgPC9hPiB0YWdzIGJ5IG1ha2luZyBzdXJlIHRoZSBzdGFjayBjb3VudCBuZXZlciBnb2VzIGJlbG93IDBcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVzdWx0SHRtbC5wdXNoKCBub2RlVGV4dCApOyAgLy8gbm93IGFkZCB0aGUgdGV4dCBvZiB0aGUgdGFnIGl0c2VsZiB2ZXJiYXRpbVxuXHRcdFx0XHRcblx0XHRcdH0gZWxzZSBpZiggbm9kZVR5cGUgPT09ICdlbnRpdHknICkge1xuXHRcdFx0XHRyZXN1bHRIdG1sLnB1c2goIG5vZGVUZXh0ICk7ICAvLyBhcHBlbmQgSFRNTCBlbnRpdHkgbm9kZXMgKHN1Y2ggYXMgJyZuYnNwOycpIHZlcmJhdGltXG5cdFx0XHRcdFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gUHJvY2VzcyB0ZXh0IG5vZGVzIGluIHRoZSBpbnB1dCBgdGV4dE9ySHRtbGBcblx0XHRcdFx0aWYoIGFuY2hvclRhZ1N0YWNrQ291bnQgPT09IDAgKSB7XG5cdFx0XHRcdFx0Ly8gSWYgd2UncmUgbm90IHdpdGhpbiBhbiA8YT4gdGFnLCBwcm9jZXNzIHRoZSB0ZXh0IG5vZGUgdG8gbGlua2lmeVxuXHRcdFx0XHRcdHZhciBsaW5raWZpZWRTdHIgPSB0aGlzLmxpbmtpZnlTdHIoIG5vZGVUZXh0ICk7XG5cdFx0XHRcdFx0cmVzdWx0SHRtbC5wdXNoKCBsaW5raWZpZWRTdHIgKTtcblx0XHRcdFx0XHRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBgdGV4dGAgaXMgd2l0aGluIGFuIDxhPiB0YWcsIHNpbXBseSBhcHBlbmQgdGhlIHRleHQgLSB3ZSBkbyBub3Qgd2FudCB0byBhdXRvbGluayBhbnl0aGluZyBcblx0XHRcdFx0XHQvLyBhbHJlYWR5IHdpdGhpbiBhbiA8YT4uLi48L2E+IHRhZ1xuXHRcdFx0XHRcdHJlc3VsdEh0bWwucHVzaCggbm9kZVRleHQgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRcblx0XHRyZXR1cm4gcmVzdWx0SHRtbC5qb2luKCBcIlwiICk7XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIFByb2Nlc3MgdGhlIHRleHQgdGhhdCBsaWVzIGluIGJldHdlZW4gSFRNTCB0YWdzLCBwZXJmb3JtaW5nIHRoZSBhbmNob3IgdGFnIHJlcGxhY2VtZW50cyBmb3IgbWF0Y2hlZCBcblx0ICogVVJMcy9lbWFpbHMvVHdpdHRlciBoYW5kbGVzLCBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIHdpdGggdGhlIHJlcGxhY2VtZW50cyBtYWRlLiBcblx0ICogXG5cdCAqIFRoaXMgbWV0aG9kIGRvZXMgdGhlIGFjdHVhbCB3cmFwcGluZyBvZiBVUkxzL2VtYWlscy9Ud2l0dGVyIGhhbmRsZXMgd2l0aCBhbmNob3IgdGFncy5cblx0ICogXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyBvZiB0ZXh0IHRvIGF1dG8tbGluay5cblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgdGV4dCB3aXRoIGFuY2hvciB0YWdzIGF1dG8tZmlsbGVkLlxuXHQgKi9cblx0bGlua2lmeVN0ciA6IGZ1bmN0aW9uKCBzdHIgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0TWF0Y2hQYXJzZXIoKS5yZXBsYWNlKCBzdHIsIHRoaXMuY3JlYXRlTWF0Y2hSZXR1cm5WYWwsIHRoaXMgKTtcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgcmV0dXJuIHN0cmluZyB2YWx1ZSBmb3IgYSBnaXZlbiBtYXRjaCBpbiB0aGUgaW5wdXQgc3RyaW5nLCBmb3IgdGhlIHtAbGluayAjcHJvY2Vzc1RleHROb2RlfSBtZXRob2QuXG5cdCAqIFxuXHQgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSB7QGxpbmsgI3JlcGxhY2VGbn0sIGlmIG9uZSB3YXMgcHJvdmlkZWQuXG5cdCAqIFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0F1dG9saW5rZXIubWF0Y2guTWF0Y2h9IG1hdGNoIFRoZSBNYXRjaCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBtYXRjaC5cblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgc3RyaW5nIHRoYXQgdGhlIGBtYXRjaGAgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGguIFRoaXMgaXMgdXN1YWxseSB0aGUgYW5jaG9yIHRhZyBzdHJpbmcsIGJ1dFxuXHQgKiAgIG1heSBiZSB0aGUgYG1hdGNoU3RyYCBpdHNlbGYgaWYgdGhlIG1hdGNoIGlzIG5vdCB0byBiZSByZXBsYWNlZC5cblx0ICovXG5cdGNyZWF0ZU1hdGNoUmV0dXJuVmFsIDogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdC8vIEhhbmRsZSBhIGN1c3RvbSBgcmVwbGFjZUZuYCBiZWluZyBwcm92aWRlZFxuXHRcdHZhciByZXBsYWNlRm5SZXN1bHQ7XG5cdFx0aWYoIHRoaXMucmVwbGFjZUZuICkge1xuXHRcdFx0cmVwbGFjZUZuUmVzdWx0ID0gdGhpcy5yZXBsYWNlRm4uY2FsbCggdGhpcywgdGhpcywgbWF0Y2ggKTsgIC8vIEF1dG9saW5rZXIgaW5zdGFuY2UgaXMgdGhlIGNvbnRleHQsIGFuZCB0aGUgZmlyc3QgYXJnXG5cdFx0fVxuXHRcdFxuXHRcdGlmKCB0eXBlb2YgcmVwbGFjZUZuUmVzdWx0ID09PSAnc3RyaW5nJyApIHtcblx0XHRcdHJldHVybiByZXBsYWNlRm5SZXN1bHQ7ICAvLyBgcmVwbGFjZUZuYCByZXR1cm5lZCBhIHN0cmluZywgdXNlIHRoYXRcblx0XHRcdFxuXHRcdH0gZWxzZSBpZiggcmVwbGFjZUZuUmVzdWx0ID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybiBtYXRjaC5nZXRNYXRjaGVkVGV4dCgpOyAgLy8gbm8gcmVwbGFjZW1lbnQgZm9yIHRoZSBtYXRjaFxuXHRcdFx0XG5cdFx0fSBlbHNlIGlmKCByZXBsYWNlRm5SZXN1bHQgaW5zdGFuY2VvZiBBdXRvbGlua2VyLkh0bWxUYWcgKSB7XG5cdFx0XHRyZXR1cm4gcmVwbGFjZUZuUmVzdWx0LnRvU3RyaW5nKCk7XG5cdFx0XG5cdFx0fSBlbHNlIHsgIC8vIHJlcGxhY2VGblJlc3VsdCA9PT0gdHJ1ZSwgb3Igbm8vdW5rbm93biByZXR1cm4gdmFsdWUgZnJvbSBmdW5jdGlvblxuXHRcdFx0Ly8gUGVyZm9ybSBBdXRvbGlua2VyJ3MgZGVmYXVsdCBhbmNob3IgdGFnIGdlbmVyYXRpb25cblx0XHRcdHZhciB0YWdCdWlsZGVyID0gdGhpcy5nZXRUYWdCdWlsZGVyKCksXG5cdFx0XHQgICAgYW5jaG9yVGFnID0gdGFnQnVpbGRlci5idWlsZCggbWF0Y2ggKTsgIC8vIHJldHVybnMgYW4gQXV0b2xpbmtlci5IdG1sVGFnIGluc3RhbmNlXG5cdFx0XHRcblx0XHRcdHJldHVybiBhbmNob3JUYWcudG9TdHJpbmcoKTtcblx0XHR9XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIExhemlseSBpbnN0YW50aWF0ZXMgYW5kIHJldHVybnMgdGhlIHtAbGluayAjaHRtbFBhcnNlcn0gaW5zdGFuY2UgZm9yIHRoaXMgQXV0b2xpbmtlciBpbnN0YW5jZS5cblx0ICogXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHJldHVybiB7QXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxQYXJzZXJ9XG5cdCAqL1xuXHRnZXRIdG1sUGFyc2VyIDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGh0bWxQYXJzZXIgPSB0aGlzLmh0bWxQYXJzZXI7XG5cdFx0XG5cdFx0aWYoICFodG1sUGFyc2VyICkge1xuXHRcdFx0aHRtbFBhcnNlciA9IHRoaXMuaHRtbFBhcnNlciA9IG5ldyBBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbFBhcnNlcigpO1xuXHRcdH1cblx0XHRcblx0XHRyZXR1cm4gaHRtbFBhcnNlcjtcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogTGF6aWx5IGluc3RhbnRpYXRlcyBhbmQgcmV0dXJucyB0aGUge0BsaW5rICNtYXRjaFBhcnNlcn0gaW5zdGFuY2UgZm9yIHRoaXMgQXV0b2xpbmtlciBpbnN0YW5jZS5cblx0ICogXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHJldHVybiB7QXV0b2xpbmtlci5tYXRjaFBhcnNlci5NYXRjaFBhcnNlcn1cblx0ICovXG5cdGdldE1hdGNoUGFyc2VyIDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1hdGNoUGFyc2VyID0gdGhpcy5tYXRjaFBhcnNlcjtcblx0XHRcblx0XHRpZiggIW1hdGNoUGFyc2VyICkge1xuXHRcdFx0bWF0Y2hQYXJzZXIgPSB0aGlzLm1hdGNoUGFyc2VyID0gbmV3IEF1dG9saW5rZXIubWF0Y2hQYXJzZXIuTWF0Y2hQYXJzZXIoIHtcblx0XHRcdFx0dXJscyA6IHRoaXMudXJscyxcblx0XHRcdFx0ZW1haWwgOiB0aGlzLmVtYWlsLFxuXHRcdFx0XHR0d2l0dGVyIDogdGhpcy50d2l0dGVyLFxuXHRcdFx0XHRzdHJpcFByZWZpeCA6IHRoaXMuc3RyaXBQcmVmaXhcblx0XHRcdH0gKTtcblx0XHR9XG5cdFx0XG5cdFx0cmV0dXJuIG1hdGNoUGFyc2VyO1xuXHR9LFxuXHRcblx0XG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB7QGxpbmsgI3RhZ0J1aWxkZXJ9IGluc3RhbmNlIGZvciB0aGlzIEF1dG9saW5rZXIgaW5zdGFuY2UsIGxhemlseSBpbnN0YW50aWF0aW5nIGl0XG5cdCAqIGlmIGl0IGRvZXMgbm90IHlldCBleGlzdC5cblx0ICogXG5cdCAqIFRoaXMgbWV0aG9kIG1heSBiZSB1c2VkIGluIGEge0BsaW5rICNyZXBsYWNlRm59IHRvIGdlbmVyYXRlIHRoZSB7QGxpbmsgQXV0b2xpbmtlci5IdG1sVGFnIEh0bWxUYWd9IGluc3RhbmNlIHRoYXQgXG5cdCAqIEF1dG9saW5rZXIgd291bGQgbm9ybWFsbHkgZ2VuZXJhdGUsIGFuZCB0aGVuIGFsbG93IGZvciBtb2RpZmljYXRpb25zIGJlZm9yZSByZXR1cm5pbmcgaXQuIEZvciBleGFtcGxlOlxuXHQgKiBcblx0ICogICAgIHZhciBodG1sID0gQXV0b2xpbmtlci5saW5rKCBcIlRlc3QgZ29vZ2xlLmNvbVwiLCB7XG5cdCAqICAgICAgICAgcmVwbGFjZUZuIDogZnVuY3Rpb24oIGF1dG9saW5rZXIsIG1hdGNoICkge1xuXHQgKiAgICAgICAgICAgICB2YXIgdGFnID0gYXV0b2xpbmtlci5nZXRUYWdCdWlsZGVyKCkuYnVpbGQoIG1hdGNoICk7ICAvLyByZXR1cm5zIGFuIHtAbGluayBBdXRvbGlua2VyLkh0bWxUYWd9IGluc3RhbmNlXG5cdCAqICAgICAgICAgICAgIHRhZy5zZXRBdHRyKCAncmVsJywgJ25vZm9sbG93JyApO1xuXHQgKiAgICAgICAgICAgICBcblx0ICogICAgICAgICAgICAgcmV0dXJuIHRhZztcblx0ICogICAgICAgICB9XG5cdCAqICAgICB9ICk7XG5cdCAqICAgICBcblx0ICogICAgIC8vIGdlbmVyYXRlZCBodG1sOlxuXHQgKiAgICAgLy8gICBUZXN0IDxhIGhyZWY9XCJodHRwOi8vZ29vZ2xlLmNvbVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vZm9sbG93XCI+Z29vZ2xlLmNvbTwvYT5cblx0ICogXG5cdCAqIEByZXR1cm4ge0F1dG9saW5rZXIuQW5jaG9yVGFnQnVpbGRlcn1cblx0ICovXG5cdGdldFRhZ0J1aWxkZXIgOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdGFnQnVpbGRlciA9IHRoaXMudGFnQnVpbGRlcjtcblx0XHRcblx0XHRpZiggIXRhZ0J1aWxkZXIgKSB7XG5cdFx0XHR0YWdCdWlsZGVyID0gdGhpcy50YWdCdWlsZGVyID0gbmV3IEF1dG9saW5rZXIuQW5jaG9yVGFnQnVpbGRlcigge1xuXHRcdFx0XHRuZXdXaW5kb3cgICA6IHRoaXMubmV3V2luZG93LFxuXHRcdFx0XHR0cnVuY2F0ZSAgICA6IHRoaXMudHJ1bmNhdGUsXG5cdFx0XHRcdGNsYXNzTmFtZSAgIDogdGhpcy5jbGFzc05hbWVcblx0XHRcdH0gKTtcblx0XHR9XG5cdFx0XG5cdFx0cmV0dXJuIHRhZ0J1aWxkZXI7XG5cdH1cblxufTtcblxuXG4vKipcbiAqIEF1dG9tYXRpY2FsbHkgbGlua3MgVVJMcywgZW1haWwgYWRkcmVzc2VzLCBhbmQgVHdpdHRlciBoYW5kbGVzIGZvdW5kIGluIHRoZSBnaXZlbiBjaHVuayBvZiBIVE1MLiBcbiAqIERvZXMgbm90IGxpbmsgVVJMcyBmb3VuZCB3aXRoaW4gSFRNTCB0YWdzLlxuICogXG4gKiBGb3IgaW5zdGFuY2UsIGlmIGdpdmVuIHRoZSB0ZXh0OiBgWW91IHNob3VsZCBnbyB0byBodHRwOi8vd3d3LnlhaG9vLmNvbWAsIHRoZW4gdGhlIHJlc3VsdFxuICogd2lsbCBiZSBgWW91IHNob3VsZCBnbyB0byAmbHQ7YSBocmVmPVwiaHR0cDovL3d3dy55YWhvby5jb21cIiZndDtodHRwOi8vd3d3LnlhaG9vLmNvbSZsdDsvYSZndDtgXG4gKiBcbiAqIEV4YW1wbGU6XG4gKiBcbiAqICAgICB2YXIgbGlua2VkVGV4dCA9IEF1dG9saW5rZXIubGluayggXCJHbyB0byBnb29nbGUuY29tXCIsIHsgbmV3V2luZG93OiBmYWxzZSB9ICk7XG4gKiAgICAgLy8gUHJvZHVjZXM6IFwiR28gdG8gPGEgaHJlZj1cImh0dHA6Ly9nb29nbGUuY29tXCI+Z29vZ2xlLmNvbTwvYT5cIlxuICogXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge1N0cmluZ30gdGV4dE9ySHRtbCBUaGUgSFRNTCBvciB0ZXh0IHRvIGZpbmQgVVJMcywgZW1haWwgYWRkcmVzc2VzLCBhbmQgVHdpdHRlciBoYW5kbGVzIHdpdGhpbiAoZGVwZW5kaW5nIG9uIGlmXG4gKiAgIHRoZSB7QGxpbmsgI3VybHN9LCB7QGxpbmsgI2VtYWlsfSwgYW5kIHtAbGluayAjdHdpdHRlcn0gb3B0aW9ucyBhcmUgZW5hYmxlZCkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIEFueSBvZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXV0b2xpbmtlciBjbGFzcywgc3BlY2lmaWVkIGluIGFuIE9iamVjdCAobWFwKS5cbiAqICAgU2VlIHRoZSBjbGFzcyBkZXNjcmlwdGlvbiBmb3IgYW4gZXhhbXBsZSBjYWxsLlxuICogQHJldHVybiB7U3RyaW5nfSBUaGUgSFRNTCB0ZXh0LCB3aXRoIFVSTHMgYXV0b21hdGljYWxseSBsaW5rZWRcbiAqL1xuQXV0b2xpbmtlci5saW5rID0gZnVuY3Rpb24oIHRleHRPckh0bWwsIG9wdGlvbnMgKSB7XG5cdHZhciBhdXRvbGlua2VyID0gbmV3IEF1dG9saW5rZXIoIG9wdGlvbnMgKTtcblx0cmV0dXJuIGF1dG9saW5rZXIubGluayggdGV4dE9ySHRtbCApO1xufTtcblxuXG4vLyBBdXRvbGlua2VyIE5hbWVzcGFjZXNcbkF1dG9saW5rZXIubWF0Y2ggPSB7fTtcbkF1dG9saW5rZXIuaHRtbFBhcnNlciA9IHt9O1xuQXV0b2xpbmtlci5tYXRjaFBhcnNlciA9IHt9O1xuLypnbG9iYWwgQXV0b2xpbmtlciAqL1xuLypqc2hpbnQgZXFudWxsOnRydWUsIGJvc3M6dHJ1ZSAqL1xuLyoqXG4gKiBAY2xhc3MgQXV0b2xpbmtlci5VdGlsXG4gKiBAc2luZ2xldG9uXG4gKiBcbiAqIEEgZmV3IHV0aWxpdHkgbWV0aG9kcyBmb3IgQXV0b2xpbmtlci5cbiAqL1xuQXV0b2xpbmtlci5VdGlsID0ge1xuXHRcblx0LyoqXG5cdCAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGFic3RyYWN0TWV0aG9kXG5cdCAqIFxuXHQgKiBBIGZ1bmN0aW9uIG9iamVjdCB3aGljaCByZXByZXNlbnRzIGFuIGFic3RyYWN0IG1ldGhvZC5cblx0ICovXG5cdGFic3RyYWN0TWV0aG9kIDogZnVuY3Rpb24oKSB7IHRocm93IFwiYWJzdHJhY3RcIjsgfSxcblx0XG5cdFxuXHQvKipcblx0ICogQXNzaWducyAoc2hhbGxvdyBjb3BpZXMpIHRoZSBwcm9wZXJ0aWVzIG9mIGBzcmNgIG9udG8gYGRlc3RgLlxuXHQgKiBcblx0ICogQHBhcmFtIHtPYmplY3R9IGRlc3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cblx0ICogQHBhcmFtIHtPYmplY3R9IHNyYyBUaGUgc291cmNlIG9iamVjdC5cblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgZGVzdGluYXRpb24gb2JqZWN0IChgZGVzdGApXG5cdCAqL1xuXHRhc3NpZ24gOiBmdW5jdGlvbiggZGVzdCwgc3JjICkge1xuXHRcdGZvciggdmFyIHByb3AgaW4gc3JjICkge1xuXHRcdFx0aWYoIHNyYy5oYXNPd25Qcm9wZXJ0eSggcHJvcCApICkge1xuXHRcdFx0XHRkZXN0WyBwcm9wIF0gPSBzcmNbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0cmV0dXJuIGRlc3Q7XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIEV4dGVuZHMgYHN1cGVyY2xhc3NgIHRvIGNyZWF0ZSBhIG5ldyBzdWJjbGFzcywgYWRkaW5nIHRoZSBgcHJvdG9Qcm9wc2AgdG8gdGhlIG5ldyBzdWJjbGFzcydzIHByb3RvdHlwZS5cblx0ICogXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyY2xhc3MgVGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciB0aGUgc3VwZXJjbGFzcy5cblx0ICogQHBhcmFtIHtPYmplY3R9IHByb3RvUHJvcHMgVGhlIG1ldGhvZHMvcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIHN1YmNsYXNzJ3MgcHJvdG90eXBlLiBUaGlzIG1heSBjb250YWluIHRoZVxuXHQgKiAgIHNwZWNpYWwgcHJvcGVydHkgYGNvbnN0cnVjdG9yYCwgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBuZXcgc3ViY2xhc3MncyBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cblx0ICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBuZXcgc3ViY2xhc3MgZnVuY3Rpb24uXG5cdCAqL1xuXHRleHRlbmQgOiBmdW5jdGlvbiggc3VwZXJjbGFzcywgcHJvdG9Qcm9wcyApIHtcblx0XHR2YXIgc3VwZXJjbGFzc1Byb3RvID0gc3VwZXJjbGFzcy5wcm90b3R5cGU7XG5cdFx0XG5cdFx0dmFyIEYgPSBmdW5jdGlvbigpIHt9O1xuXHRcdEYucHJvdG90eXBlID0gc3VwZXJjbGFzc1Byb3RvO1xuXHRcdFxuXHRcdHZhciBzdWJjbGFzcztcblx0XHRpZiggcHJvdG9Qcm9wcy5oYXNPd25Qcm9wZXJ0eSggJ2NvbnN0cnVjdG9yJyApICkge1xuXHRcdFx0c3ViY2xhc3MgPSBwcm90b1Byb3BzLmNvbnN0cnVjdG9yO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdWJjbGFzcyA9IGZ1bmN0aW9uKCkgeyBzdXBlcmNsYXNzUHJvdG8uY29uc3RydWN0b3IuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOyB9O1xuXHRcdH1cblx0XHRcblx0XHR2YXIgc3ViY2xhc3NQcm90byA9IHN1YmNsYXNzLnByb3RvdHlwZSA9IG5ldyBGKCk7ICAvLyBzZXQgdXAgcHJvdG90eXBlIGNoYWluXG5cdFx0c3ViY2xhc3NQcm90by5jb25zdHJ1Y3RvciA9IHN1YmNsYXNzOyAgLy8gZml4IGNvbnN0cnVjdG9yIHByb3BlcnR5XG5cdFx0c3ViY2xhc3NQcm90by5zdXBlcmNsYXNzID0gc3VwZXJjbGFzc1Byb3RvO1xuXHRcdFxuXHRcdGRlbGV0ZSBwcm90b1Byb3BzLmNvbnN0cnVjdG9yOyAgLy8gZG9uJ3QgcmUtYXNzaWduIGNvbnN0cnVjdG9yIHByb3BlcnR5IHRvIHRoZSBwcm90b3R5cGUsIHNpbmNlIGEgbmV3IGZ1bmN0aW9uIG1heSBoYXZlIGJlZW4gY3JlYXRlZCAoYHN1YmNsYXNzYCksIHdoaWNoIGlzIG5vdyBhbHJlYWR5IHRoZXJlXG5cdFx0QXV0b2xpbmtlci5VdGlsLmFzc2lnbiggc3ViY2xhc3NQcm90bywgcHJvdG9Qcm9wcyApO1xuXHRcdFxuXHRcdHJldHVybiBzdWJjbGFzcztcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogVHJ1bmNhdGVzIHRoZSBgc3RyYCBhdCBgbGVuIC0gZWxsaXBzaXNDaGFycy5sZW5ndGhgLCBhbmQgYWRkcyB0aGUgYGVsbGlwc2lzQ2hhcnNgIHRvIHRoZVxuXHQgKiBlbmQgb2YgdGhlIHN0cmluZyAoYnkgZGVmYXVsdCwgdHdvIHBlcmlvZHM6ICcuLicpLiBJZiB0aGUgYHN0cmAgbGVuZ3RoIGRvZXMgbm90IGV4Y2VlZCBcblx0ICogYGxlbmAsIHRoZSBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZCB1bmNoYW5nZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gdHJ1bmNhdGUgYW5kIGFkZCBhbiBlbGxpcHNpcyB0by5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IHRydW5jYXRlTGVuIFRoZSBsZW5ndGggdG8gdHJ1bmNhdGUgdGhlIHN0cmluZyBhdC5cblx0ICogQHBhcmFtIHtTdHJpbmd9IFtlbGxpcHNpc0NoYXJzPS4uXSBUaGUgZWxsaXBzaXMgY2hhcmFjdGVyKHMpIHRvIGFkZCB0byB0aGUgZW5kIG9mIGBzdHJgXG5cdCAqICAgd2hlbiB0cnVuY2F0ZWQuIERlZmF1bHRzIHRvICcuLidcblx0ICovXG5cdGVsbGlwc2lzIDogZnVuY3Rpb24oIHN0ciwgdHJ1bmNhdGVMZW4sIGVsbGlwc2lzQ2hhcnMgKSB7XG5cdFx0aWYoIHN0ci5sZW5ndGggPiB0cnVuY2F0ZUxlbiApIHtcblx0XHRcdGVsbGlwc2lzQ2hhcnMgPSAoIGVsbGlwc2lzQ2hhcnMgPT0gbnVsbCApID8gJy4uJyA6IGVsbGlwc2lzQ2hhcnM7XG5cdFx0XHRzdHIgPSBzdHIuc3Vic3RyaW5nKCAwLCB0cnVuY2F0ZUxlbiAtIGVsbGlwc2lzQ2hhcnMubGVuZ3RoICkgKyBlbGxpcHNpc0NoYXJzO1xuXHRcdH1cblx0XHRyZXR1cm4gc3RyO1xuXHR9LFxuXHRcblx0XG5cdC8qKlxuXHQgKiBTdXBwb3J0cyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2YoKWAgZnVuY3Rpb25hbGl0eSBmb3Igb2xkIElFIChJRTggYW5kIGJlbG93KS5cblx0ICogXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFyciBUaGUgYXJyYXkgdG8gZmluZCBhbiBlbGVtZW50IG9mLlxuXHQgKiBAcGFyYW0geyp9IGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gZmluZCBpbiB0aGUgYXJyYXksIGFuZCByZXR1cm4gdGhlIGluZGV4IG9mLlxuXHQgKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgYGVsZW1lbnRgLCBvciAtMSBpZiBpdCB3YXMgbm90IGZvdW5kLlxuXHQgKi9cblx0aW5kZXhPZiA6IGZ1bmN0aW9uKCBhcnIsIGVsZW1lbnQgKSB7XG5cdFx0aWYoIEFycmF5LnByb3RvdHlwZS5pbmRleE9mICkge1xuXHRcdFx0cmV0dXJuIGFyci5pbmRleE9mKCBlbGVtZW50ICk7XG5cdFx0XHRcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yKCB2YXIgaSA9IDAsIGxlbiA9IGFyci5sZW5ndGg7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0aWYoIGFyclsgaSBdID09PSBlbGVtZW50ICkgcmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gLTE7XG5cdFx0fVxuXHR9LFxuXHRcblx0XG5cdFxuXHQvKipcblx0ICogUGVyZm9ybXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2Ygd2hhdCBtb2Rlcm4gYnJvd3NlcnMgZG8gd2hlbiBgU3RyaW5nLnByb3RvdHlwZS5zcGxpdCgpYCBpcyBjYWxsZWRcblx0ICogd2l0aCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGNvbnRhaW5zIGNhcHR1cmluZyBwYXJlbnRoZXNpcy5cblx0ICogXG5cdCAqIEZvciBleGFtcGxlOlxuXHQgKiBcblx0ICogICAgIC8vIE1vZGVybiBicm93c2VyczogXG5cdCAqICAgICBcImEsYixjXCIuc3BsaXQoIC8oLCkvICk7ICAvLyAtLT4gWyAnYScsICcsJywgJ2InLCAnLCcsICdjJyBdXG5cdCAqICAgICBcblx0ICogICAgIC8vIE9sZCBJRSAoaW5jbHVkaW5nIElFOCk6XG5cdCAqICAgICBcImEsYixjXCIuc3BsaXQoIC8oLCkvICk7ICAvLyAtLT4gWyAnYScsICdiJywgJ2MnIF1cblx0ICogICAgIFxuXHQgKiBUaGlzIG1ldGhvZCBlbXVsYXRlcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBtb2Rlcm4gYnJvd3NlcnMgZm9yIHRoZSBvbGQgSUUgY2FzZS5cblx0ICogXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBzcGxpdC5cblx0ICogQHBhcmFtIHtSZWdFeHB9IHNwbGl0UmVnZXggVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzcGxpdCB0aGUgaW5wdXQgYHN0cmAgb24uIFRoZSBzcGxpdHRpbmdcblx0ICogICBjaGFyYWN0ZXIocykgd2lsbCBiZSBzcGxpY2VkIGludG8gdGhlIGFycmF5LCBhcyBpbiB0aGUgXCJtb2Rlcm4gYnJvd3NlcnNcIiBleGFtcGxlIGluIHRoZSBcblx0ICogICBkZXNjcmlwdGlvbiBvZiB0aGlzIG1ldGhvZC4gXG5cdCAqICAgTm90ZSAjMTogdGhlIHN1cHBsaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiAqKm11c3QqKiBoYXZlIHRoZSAnZycgZmxhZyBzcGVjaWZpZWQuXG5cdCAqICAgTm90ZSAjMjogZm9yIHNpbXBsaWNpdHkncyBzYWtlLCB0aGUgcmVndWxhciBleHByZXNzaW9uIGRvZXMgbm90IG5lZWQgXG5cdCAqICAgdG8gY29udGFpbiBjYXB0dXJpbmcgcGFyZW50aGVzaXMgLSBpdCB3aWxsIGJlIGFzc3VtZWQgdGhhdCBhbnkgbWF0Y2ggaGFzIHRoZW0uXG5cdCAqIEByZXR1cm4ge1N0cmluZ1tdfSBUaGUgc3BsaXQgYXJyYXkgb2Ygc3RyaW5ncywgd2l0aCB0aGUgc3BsaXR0aW5nIGNoYXJhY3RlcihzKSBpbmNsdWRlZC5cblx0ICovXG5cdHNwbGl0QW5kQ2FwdHVyZSA6IGZ1bmN0aW9uKCBzdHIsIHNwbGl0UmVnZXggKSB7XG5cdFx0aWYoICFzcGxpdFJlZ2V4Lmdsb2JhbCApIHRocm93IG5ldyBFcnJvciggXCJgc3BsaXRSZWdleGAgbXVzdCBoYXZlIHRoZSAnZycgZmxhZyBzZXRcIiApO1xuXHRcdFxuXHRcdHZhciByZXN1bHQgPSBbXSxcblx0XHQgICAgbGFzdElkeCA9IDAsXG5cdFx0ICAgIG1hdGNoO1xuXHRcdFxuXHRcdHdoaWxlKCBtYXRjaCA9IHNwbGl0UmVnZXguZXhlYyggc3RyICkgKSB7XG5cdFx0XHRyZXN1bHQucHVzaCggc3RyLnN1YnN0cmluZyggbGFzdElkeCwgbWF0Y2guaW5kZXggKSApO1xuXHRcdFx0cmVzdWx0LnB1c2goIG1hdGNoWyAwIF0gKTsgIC8vIHB1c2ggdGhlIHNwbGl0dGluZyBjaGFyKHMpXG5cdFx0XHRcblx0XHRcdGxhc3RJZHggPSBtYXRjaC5pbmRleCArIG1hdGNoWyAwIF0ubGVuZ3RoO1xuXHRcdH1cblx0XHRyZXN1bHQucHVzaCggc3RyLnN1YnN0cmluZyggbGFzdElkeCApICk7XG5cdFx0XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXHRcbn07XG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKmpzaGludCBib3NzOnRydWUgKi9cbi8qKlxuICogQGNsYXNzIEF1dG9saW5rZXIuSHRtbFRhZ1xuICogQGV4dGVuZHMgT2JqZWN0XG4gKiBcbiAqIFJlcHJlc2VudHMgYW4gSFRNTCB0YWcsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGVhc2lseSBidWlsZC9tb2RpZnkgSFRNTCB0YWdzIHByb2dyYW1tYXRpY2FsbHkuXG4gKiBcbiAqIEF1dG9saW5rZXIgdXNlcyB0aGlzIGFic3RyYWN0aW9uIHRvIGNyZWF0ZSBIVE1MIHRhZ3MsIGFuZCB0aGVuIHdyaXRlIHRoZW0gb3V0IGFzIHN0cmluZ3MuIFlvdSBtYXkgYWxzbyB1c2VcbiAqIHRoaXMgY2xhc3MgaW4geW91ciBjb2RlLCBlc3BlY2lhbGx5IHdpdGhpbiBhIHtAbGluayBBdXRvbGlua2VyI3JlcGxhY2VGbiByZXBsYWNlRm59LlxuICogXG4gKiAjIyBFeGFtcGxlc1xuICogXG4gKiBFeGFtcGxlIGluc3RhbnRpYXRpb246XG4gKiBcbiAqICAgICB2YXIgdGFnID0gbmV3IEF1dG9saW5rZXIuSHRtbFRhZygge1xuICogICAgICAgICB0YWdOYW1lIDogJ2EnLFxuICogICAgICAgICBhdHRycyAgIDogeyAnaHJlZic6ICdodHRwOi8vZ29vZ2xlLmNvbScsICdjbGFzcyc6ICdleHRlcm5hbC1saW5rJyB9LFxuICogICAgICAgICBpbm5lckh0bWwgOiAnR29vZ2xlJ1xuICogICAgIH0gKTtcbiAqICAgICBcbiAqICAgICB0YWcudG9TdHJpbmcoKTsgIC8vIDxhIGhyZWY9XCJodHRwOi8vZ29vZ2xlLmNvbVwiIGNsYXNzPVwiZXh0ZXJuYWwtbGlua1wiPkdvb2dsZTwvYT5cbiAqICAgICBcbiAqICAgICAvLyBJbmRpdmlkdWFsIGFjY2Vzc29yIG1ldGhvZHNcbiAqICAgICB0YWcuZ2V0VGFnTmFtZSgpOyAgICAgICAgICAgICAgICAgLy8gJ2EnXG4gKiAgICAgdGFnLmdldEF0dHIoICdocmVmJyApOyAgICAgICAgICAgIC8vICdodHRwOi8vZ29vZ2xlLmNvbSdcbiAqICAgICB0YWcuaGFzQ2xhc3MoICdleHRlcm5hbC1saW5rJyApOyAgLy8gdHJ1ZVxuICogXG4gKiBcbiAqIFVzaW5nIG11dGF0b3IgbWV0aG9kcyAod2hpY2ggbWF5IGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBpbnN0YW50aWF0aW9uIGNvbmZpZyBwcm9wZXJ0aWVzKTpcbiAqIFxuICogICAgIHZhciB0YWcgPSBuZXcgQXV0b2xpbmtlci5IdG1sVGFnKCk7XG4gKiAgICAgdGFnLnNldFRhZ05hbWUoICdhJyApO1xuICogICAgIHRhZy5zZXRBdHRyKCAnaHJlZicsICdodHRwOi8vZ29vZ2xlLmNvbScgKTtcbiAqICAgICB0YWcuYWRkQ2xhc3MoICdleHRlcm5hbC1saW5rJyApO1xuICogICAgIHRhZy5zZXRJbm5lckh0bWwoICdHb29nbGUnICk7XG4gKiAgICAgXG4gKiAgICAgdGFnLmdldFRhZ05hbWUoKTsgICAgICAgICAgICAgICAgIC8vICdhJ1xuICogICAgIHRhZy5nZXRBdHRyKCAnaHJlZicgKTsgICAgICAgICAgICAvLyAnaHR0cDovL2dvb2dsZS5jb20nXG4gKiAgICAgdGFnLmhhc0NsYXNzKCAnZXh0ZXJuYWwtbGluaycgKTsgIC8vIHRydWVcbiAqICAgICBcbiAqICAgICB0YWcudG9TdHJpbmcoKTsgIC8vIDxhIGhyZWY9XCJodHRwOi8vZ29vZ2xlLmNvbVwiIGNsYXNzPVwiZXh0ZXJuYWwtbGlua1wiPkdvb2dsZTwvYT5cbiAqICAgICBcbiAqIFxuICogIyMgRXhhbXBsZSB1c2Ugd2l0aGluIGEge0BsaW5rIEF1dG9saW5rZXIjcmVwbGFjZUZuIHJlcGxhY2VGbn1cbiAqIFxuICogICAgIHZhciBodG1sID0gQXV0b2xpbmtlci5saW5rKCBcIlRlc3QgZ29vZ2xlLmNvbVwiLCB7XG4gKiAgICAgICAgIHJlcGxhY2VGbiA6IGZ1bmN0aW9uKCBhdXRvbGlua2VyLCBtYXRjaCApIHtcbiAqICAgICAgICAgICAgIHZhciB0YWcgPSBhdXRvbGlua2VyLmdldFRhZ0J1aWxkZXIoKS5idWlsZCggbWF0Y2ggKTsgIC8vIHJldHVybnMgYW4ge0BsaW5rIEF1dG9saW5rZXIuSHRtbFRhZ30gaW5zdGFuY2UsIGNvbmZpZ3VyZWQgd2l0aCB0aGUgTWF0Y2gncyBocmVmIGFuZCBhbmNob3IgdGV4dFxuICogICAgICAgICAgICAgdGFnLnNldEF0dHIoICdyZWwnLCAnbm9mb2xsb3cnICk7XG4gKiAgICAgICAgICAgICBcbiAqICAgICAgICAgICAgIHJldHVybiB0YWc7XG4gKiAgICAgICAgIH1cbiAqICAgICB9ICk7XG4gKiAgICAgXG4gKiAgICAgLy8gZ2VuZXJhdGVkIGh0bWw6XG4gKiAgICAgLy8gICBUZXN0IDxhIGhyZWY9XCJodHRwOi8vZ29vZ2xlLmNvbVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vZm9sbG93XCI+Z29vZ2xlLmNvbTwvYT5cbiAqICAgICBcbiAqICAgICBcbiAqICMjIEV4YW1wbGUgdXNlIHdpdGggYSBuZXcgdGFnIGZvciB0aGUgcmVwbGFjZW1lbnRcbiAqIFxuICogICAgIHZhciBodG1sID0gQXV0b2xpbmtlci5saW5rKCBcIlRlc3QgZ29vZ2xlLmNvbVwiLCB7XG4gKiAgICAgICAgIHJlcGxhY2VGbiA6IGZ1bmN0aW9uKCBhdXRvbGlua2VyLCBtYXRjaCApIHtcbiAqICAgICAgICAgICAgIHZhciB0YWcgPSBuZXcgQXV0b2xpbmtlci5IdG1sVGFnKCB7XG4gKiAgICAgICAgICAgICAgICAgdGFnTmFtZSA6ICdidXR0b24nLFxuICogICAgICAgICAgICAgICAgIGF0dHJzICAgOiB7ICd0aXRsZSc6ICdMb2FkIFVSTDogJyArIG1hdGNoLmdldEFuY2hvckhyZWYoKSB9LFxuICogICAgICAgICAgICAgICAgIGlubmVySHRtbCA6ICdMb2FkIFVSTDogJyArIG1hdGNoLmdldEFuY2hvclRleHQoKVxuICogICAgICAgICAgICAgfSApO1xuICogICAgICAgICAgICAgXG4gKiAgICAgICAgICAgICByZXR1cm4gdGFnO1xuICogICAgICAgICB9XG4gKiAgICAgfSApO1xuICogICAgIFxuICogICAgIC8vIGdlbmVyYXRlZCBodG1sOlxuICogICAgIC8vICAgVGVzdCA8YnV0dG9uIHRpdGxlPVwiTG9hZCBVUkw6IGh0dHA6Ly9nb29nbGUuY29tXCI+TG9hZCBVUkw6IGdvb2dsZS5jb208L2J1dHRvbj5cbiAqL1xuQXV0b2xpbmtlci5IdG1sVGFnID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggT2JqZWN0LCB7XG5cdFxuXHQvKipcblx0ICogQGNmZyB7U3RyaW5nfSB0YWdOYW1lXG5cdCAqIFxuXHQgKiBUaGUgdGFnIG5hbWUuIEV4OiAnYScsICdidXR0b24nLCBldGMuXG5cdCAqIFxuXHQgKiBOb3QgcmVxdWlyZWQgYXQgaW5zdGFudGlhdGlvbiB0aW1lLCBidXQgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldFRhZ05hbWV9IGJlZm9yZSB7QGxpbmsgI3RvU3RyaW5nfVxuXHQgKiBpcyBleGVjdXRlZC5cblx0ICovXG5cdFxuXHQvKipcblx0ICogQGNmZyB7T2JqZWN0LjxTdHJpbmcsIFN0cmluZz59IGF0dHJzXG5cdCAqIFxuXHQgKiBBbiBrZXkvdmFsdWUgT2JqZWN0IChtYXApIG9mIGF0dHJpYnV0ZXMgdG8gY3JlYXRlIHRoZSB0YWcgd2l0aC4gVGhlIGtleXMgYXJlIHRoZSBhdHRyaWJ1dGUgbmFtZXMsIGFuZCB0aGVcblx0ICogdmFsdWVzIGFyZSB0aGUgYXR0cmlidXRlIHZhbHVlcy5cblx0ICovXG5cdFxuXHQvKipcblx0ICogQGNmZyB7U3RyaW5nfSBpbm5lckh0bWxcblx0ICogXG5cdCAqIFRoZSBpbm5lciBIVE1MIGZvciB0aGUgdGFnLiBcblx0ICogXG5cdCAqIE5vdGUgdGhlIGNhbWVsIGNhc2UgbmFtZSBvbiBgaW5uZXJIdG1sYC4gQWNyb255bXMgYXJlIGNhbWVsQ2FzZWQgaW4gdGhpcyB1dGlsaXR5IChzdWNoIGFzIG5vdCB0byBydW4gaW50byB0aGUgYWNyb255bSBcblx0ICogbmFtaW5nIGluY29uc2lzdGVuY3kgdGhhdCB0aGUgRE9NIGRldmVsb3BlcnMgY3JlYXRlZCB3aXRoIGBYTUxIdHRwUmVxdWVzdGApLiBZb3UgbWF5IGFsdGVybmF0aXZlbHkgdXNlIHtAbGluayAjaW5uZXJIVE1MfVxuXHQgKiBpZiB5b3UgcHJlZmVyLCBidXQgdGhpcyBvbmUgaXMgcmVjb21tZW5kZWQuXG5cdCAqL1xuXHRcblx0LyoqXG5cdCAqIEBjZmcge1N0cmluZ30gaW5uZXJIVE1MXG5cdCAqIFxuXHQgKiBBbGlhcyBvZiB7QGxpbmsgI2lubmVySHRtbH0sIGFjY2VwdGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBicm93c2VyIERPTSBhcGksIGJ1dCBwcmVmZXIgdGhlIGNhbWVsQ2FzZWQgdmVyc2lvblxuXHQgKiBmb3IgYWNyb255bSBuYW1lcy5cblx0ICovXG5cdFxuXHRcblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHByb3BlcnR5IHtSZWdFeHB9IHdoaXRlc3BhY2VSZWdleFxuXHQgKiBcblx0ICogUmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gbWF0Y2ggd2hpdGVzcGFjZSBpbiBhIHN0cmluZyBvZiBDU1MgY2xhc3Nlcy5cblx0ICovXG5cdHdoaXRlc3BhY2VSZWdleCA6IC9cXHMrLyxcblx0XG5cdFxuXHQvKipcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbY2ZnXSBUaGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGlzIGNsYXNzLCBpbiBhbiBPYmplY3QgKG1hcClcblx0ICovXG5cdGNvbnN0cnVjdG9yIDogZnVuY3Rpb24oIGNmZyApIHtcblx0XHRBdXRvbGlua2VyLlV0aWwuYXNzaWduKCB0aGlzLCBjZmcgKTtcblx0XHRcblx0XHR0aGlzLmlubmVySHRtbCA9IHRoaXMuaW5uZXJIdG1sIHx8IHRoaXMuaW5uZXJIVE1MOyAgLy8gYWNjZXB0IGVpdGhlciB0aGUgY2FtZWxDYXNlZCBmb3JtIG9yIHRoZSBmdWxseSBjYXBpdGFsaXplZCBhY3JvbnltXG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIFNldHMgdGhlIHRhZyBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSB0YWcgd2l0aC5cblx0ICogXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0YWdOYW1lXG5cdCAqIEByZXR1cm4ge0F1dG9saW5rZXIuSHRtbFRhZ30gVGhpcyBIdG1sVGFnIGluc3RhbmNlLCBzbyB0aGF0IG1ldGhvZCBjYWxscyBtYXkgYmUgY2hhaW5lZC5cblx0ICovXG5cdHNldFRhZ05hbWUgOiBmdW5jdGlvbiggdGFnTmFtZSApIHtcblx0XHR0aGlzLnRhZ05hbWUgPSB0YWdOYW1lO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHRcblx0XG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHRhZyBuYW1lLlxuXHQgKiBcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0VGFnTmFtZSA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnRhZ05hbWUgfHwgXCJcIjtcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogU2V0cyBhbiBhdHRyaWJ1dGUgb24gdGhlIEh0bWxUYWcuXG5cdCAqIFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gYXR0ck5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHNldC5cblx0ICogQHBhcmFtIHtTdHJpbmd9IGF0dHJWYWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlIHRvIHNldC5cblx0ICogQHJldHVybiB7QXV0b2xpbmtlci5IdG1sVGFnfSBUaGlzIEh0bWxUYWcgaW5zdGFuY2UsIHNvIHRoYXQgbWV0aG9kIGNhbGxzIG1heSBiZSBjaGFpbmVkLlxuXHQgKi9cblx0c2V0QXR0ciA6IGZ1bmN0aW9uKCBhdHRyTmFtZSwgYXR0clZhbHVlICkge1xuXHRcdHZhciB0YWdBdHRycyA9IHRoaXMuZ2V0QXR0cnMoKTtcblx0XHR0YWdBdHRyc1sgYXR0ck5hbWUgXSA9IGF0dHJWYWx1ZTtcblx0XHRcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogUmV0cmlldmVzIGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSBIdG1sVGFnLiBJZiB0aGUgYXR0cmlidXRlIGRvZXMgbm90IGV4aXN0LCByZXR1cm5zIGB1bmRlZmluZWRgLlxuXHQgKiBcblx0ICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBhdHRyaWJ1dGUncyB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgaWYgaXQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIEh0bWxUYWcuXG5cdCAqL1xuXHRnZXRBdHRyIDogZnVuY3Rpb24oIGF0dHJOYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmdldEF0dHJzKClbIGF0dHJOYW1lIF07XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIFNldHMgb25lIG9yIG1vcmUgYXR0cmlidXRlcyBvbiB0aGUgSHRtbFRhZy5cblx0ICogXG5cdCAqIEBwYXJhbSB7T2JqZWN0LjxTdHJpbmcsIFN0cmluZz59IGF0dHJzIEEga2V5L3ZhbHVlIE9iamVjdCAobWFwKSBvZiB0aGUgYXR0cmlidXRlcyB0byBzZXQuXG5cdCAqIEByZXR1cm4ge0F1dG9saW5rZXIuSHRtbFRhZ30gVGhpcyBIdG1sVGFnIGluc3RhbmNlLCBzbyB0aGF0IG1ldGhvZCBjYWxscyBtYXkgYmUgY2hhaW5lZC5cblx0ICovXG5cdHNldEF0dHJzIDogZnVuY3Rpb24oIGF0dHJzICkge1xuXHRcdHZhciB0YWdBdHRycyA9IHRoaXMuZ2V0QXR0cnMoKTtcblx0XHRBdXRvbGlua2VyLlV0aWwuYXNzaWduKCB0YWdBdHRycywgYXR0cnMgKTtcblx0XHRcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBhdHRyaWJ1dGVzIE9iamVjdCAobWFwKSBmb3IgdGhlIEh0bWxUYWcuXG5cdCAqIFxuXHQgKiBAcmV0dXJuIHtPYmplY3QuPFN0cmluZywgU3RyaW5nPn0gQSBrZXkvdmFsdWUgb2JqZWN0IG9mIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgSHRtbFRhZy5cblx0ICovXG5cdGdldEF0dHJzIDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuYXR0cnMgfHwgKCB0aGlzLmF0dHJzID0ge30gKTtcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogU2V0cyB0aGUgcHJvdmlkZWQgYGNzc0NsYXNzYCwgb3ZlcndyaXRpbmcgYW55IGN1cnJlbnQgQ1NTIGNsYXNzZXMgb24gdGhlIEh0bWxUYWcuXG5cdCAqIFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gY3NzQ2xhc3MgT25lIG9yIG1vcmUgc3BhY2Utc2VwYXJhdGVkIENTUyBjbGFzc2VzIHRvIHNldCAob3ZlcndyaXRlKS5cblx0ICogQHJldHVybiB7QXV0b2xpbmtlci5IdG1sVGFnfSBUaGlzIEh0bWxUYWcgaW5zdGFuY2UsIHNvIHRoYXQgbWV0aG9kIGNhbGxzIG1heSBiZSBjaGFpbmVkLlxuXHQgKi9cblx0c2V0Q2xhc3MgOiBmdW5jdGlvbiggY3NzQ2xhc3MgKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0QXR0ciggJ2NsYXNzJywgY3NzQ2xhc3MgKTtcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFkZCBvbmUgb3IgbW9yZSBDU1MgY2xhc3NlcyB0byB0aGUgSHRtbFRhZy4gV2lsbCBub3QgYWRkIGR1cGxpY2F0ZSBDU1MgY2xhc3Nlcy5cblx0ICogXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBjc3NDbGFzcyBPbmUgb3IgbW9yZSBzcGFjZS1zZXBhcmF0ZWQgQ1NTIGNsYXNzZXMgdG8gYWRkLlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLkh0bWxUYWd9IFRoaXMgSHRtbFRhZyBpbnN0YW5jZSwgc28gdGhhdCBtZXRob2QgY2FsbHMgbWF5IGJlIGNoYWluZWQuXG5cdCAqL1xuXHRhZGRDbGFzcyA6IGZ1bmN0aW9uKCBjc3NDbGFzcyApIHtcblx0XHR2YXIgY2xhc3NBdHRyID0gdGhpcy5nZXRDbGFzcygpLFxuXHRcdCAgICB3aGl0ZXNwYWNlUmVnZXggPSB0aGlzLndoaXRlc3BhY2VSZWdleCxcblx0XHQgICAgaW5kZXhPZiA9IEF1dG9saW5rZXIuVXRpbC5pbmRleE9mLCAgLy8gdG8gc3VwcG9ydCBJRTggYW5kIGJlbG93XG5cdFx0ICAgIGNsYXNzZXMgPSAoICFjbGFzc0F0dHIgKSA/IFtdIDogY2xhc3NBdHRyLnNwbGl0KCB3aGl0ZXNwYWNlUmVnZXggKSxcblx0XHQgICAgbmV3Q2xhc3NlcyA9IGNzc0NsYXNzLnNwbGl0KCB3aGl0ZXNwYWNlUmVnZXggKSxcblx0XHQgICAgbmV3Q2xhc3M7XG5cdFx0XG5cdFx0d2hpbGUoIG5ld0NsYXNzID0gbmV3Q2xhc3Nlcy5zaGlmdCgpICkge1xuXHRcdFx0aWYoIGluZGV4T2YoIGNsYXNzZXMsIG5ld0NsYXNzICkgPT09IC0xICkge1xuXHRcdFx0XHRjbGFzc2VzLnB1c2goIG5ld0NsYXNzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdFxuXHRcdHRoaXMuZ2V0QXR0cnMoKVsgJ2NsYXNzJyBdID0gY2xhc3Nlcy5qb2luKCBcIiBcIiApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHRcblx0XG5cdC8qKlxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmVtb3ZlIG9uZSBvciBtb3JlIENTUyBjbGFzc2VzIGZyb20gdGhlIEh0bWxUYWcuXG5cdCAqIFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gY3NzQ2xhc3MgT25lIG9yIG1vcmUgc3BhY2Utc2VwYXJhdGVkIENTUyBjbGFzc2VzIHRvIHJlbW92ZS5cblx0ICogQHJldHVybiB7QXV0b2xpbmtlci5IdG1sVGFnfSBUaGlzIEh0bWxUYWcgaW5zdGFuY2UsIHNvIHRoYXQgbWV0aG9kIGNhbGxzIG1heSBiZSBjaGFpbmVkLlxuXHQgKi9cblx0cmVtb3ZlQ2xhc3MgOiBmdW5jdGlvbiggY3NzQ2xhc3MgKSB7XG5cdFx0dmFyIGNsYXNzQXR0ciA9IHRoaXMuZ2V0Q2xhc3MoKSxcblx0XHQgICAgd2hpdGVzcGFjZVJlZ2V4ID0gdGhpcy53aGl0ZXNwYWNlUmVnZXgsXG5cdFx0ICAgIGluZGV4T2YgPSBBdXRvbGlua2VyLlV0aWwuaW5kZXhPZiwgIC8vIHRvIHN1cHBvcnQgSUU4IGFuZCBiZWxvd1xuXHRcdCAgICBjbGFzc2VzID0gKCAhY2xhc3NBdHRyICkgPyBbXSA6IGNsYXNzQXR0ci5zcGxpdCggd2hpdGVzcGFjZVJlZ2V4ICksXG5cdFx0ICAgIHJlbW92ZUNsYXNzZXMgPSBjc3NDbGFzcy5zcGxpdCggd2hpdGVzcGFjZVJlZ2V4ICksXG5cdFx0ICAgIHJlbW92ZUNsYXNzO1xuXHRcdFxuXHRcdHdoaWxlKCBjbGFzc2VzLmxlbmd0aCAmJiAoIHJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3Nlcy5zaGlmdCgpICkgKSB7XG5cdFx0XHR2YXIgaWR4ID0gaW5kZXhPZiggY2xhc3NlcywgcmVtb3ZlQ2xhc3MgKTtcblx0XHRcdGlmKCBpZHggIT09IC0xICkge1xuXHRcdFx0XHRjbGFzc2VzLnNwbGljZSggaWR4LCAxICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdFxuXHRcdHRoaXMuZ2V0QXR0cnMoKVsgJ2NsYXNzJyBdID0gY2xhc3Nlcy5qb2luKCBcIiBcIiApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHRcblx0XG5cdC8qKlxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmV0cmlldmUgdGhlIENTUyBjbGFzcyhlcykgZm9yIHRoZSBIdG1sVGFnLCB3aGljaCB3aWxsIGVhY2ggYmUgc2VwYXJhdGVkIGJ5IHNwYWNlcyB3aGVuXG5cdCAqIHRoZXJlIGFyZSBtdWx0aXBsZS5cblx0ICogXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldENsYXNzIDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cnMoKVsgJ2NsYXNzJyBdIHx8IFwiXCI7XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjaGVjayBpZiB0aGUgdGFnIGhhcyBhIENTUyBjbGFzcyBvciBub3QuXG5cdCAqIFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gY3NzQ2xhc3MgVGhlIENTUyBjbGFzcyB0byBjaGVjayBmb3IuXG5cdCAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgSHRtbFRhZyBoYXMgdGhlIENTUyBjbGFzcywgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRoYXNDbGFzcyA6IGZ1bmN0aW9uKCBjc3NDbGFzcyApIHtcblx0XHRyZXR1cm4gKCAnICcgKyB0aGlzLmdldENsYXNzKCkgKyAnICcgKS5pbmRleE9mKCAnICcgKyBjc3NDbGFzcyArICcgJyApICE9PSAtMTtcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogU2V0cyB0aGUgaW5uZXIgSFRNTCBmb3IgdGhlIHRhZy5cblx0ICogXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBodG1sIFRoZSBpbm5lciBIVE1MIHRvIHNldC5cblx0ICogQHJldHVybiB7QXV0b2xpbmtlci5IdG1sVGFnfSBUaGlzIEh0bWxUYWcgaW5zdGFuY2UsIHNvIHRoYXQgbWV0aG9kIGNhbGxzIG1heSBiZSBjaGFpbmVkLlxuXHQgKi9cblx0c2V0SW5uZXJIdG1sIDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dGhpcy5pbm5lckh0bWwgPSBodG1sO1xuXHRcdFxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHRcblx0XG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGlubmVyIEhUTUwgZm9yIHRoZSB0YWcuXG5cdCAqIFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRJbm5lckh0bWwgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5pbm5lckh0bWwgfHwgXCJcIjtcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogT3ZlcnJpZGUgb2Ygc3VwZXJjbGFzcyBtZXRob2QgdXNlZCB0byBnZW5lcmF0ZSB0aGUgSFRNTCBzdHJpbmcgZm9yIHRoZSB0YWcuXG5cdCAqIFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHR0b1N0cmluZyA6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB0YWdOYW1lID0gdGhpcy5nZXRUYWdOYW1lKCksXG5cdFx0ICAgIGF0dHJzU3RyID0gdGhpcy5idWlsZEF0dHJzU3RyKCk7XG5cdFx0XG5cdFx0YXR0cnNTdHIgPSAoIGF0dHJzU3RyICkgPyAnICcgKyBhdHRyc1N0ciA6ICcnOyAgLy8gcHJlcGVuZCBhIHNwYWNlIGlmIHRoZXJlIGFyZSBhY3R1YWxseSBhdHRyaWJ1dGVzXG5cdFx0XG5cdFx0cmV0dXJuIFsgJzwnLCB0YWdOYW1lLCBhdHRyc1N0ciwgJz4nLCB0aGlzLmdldElubmVySHRtbCgpLCAnPC8nLCB0YWdOYW1lLCAnPicgXS5qb2luKCBcIlwiICk7XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIFN1cHBvcnQgbWV0aG9kIGZvciB7QGxpbmsgI3RvU3RyaW5nfSwgcmV0dXJucyB0aGUgc3RyaW5nIHNwYWNlLXNlcGFyYXRlZCBrZXk9XCJ2YWx1ZVwiIHBhaXJzLCB1c2VkIHRvIHBvcHVsYXRlIFxuXHQgKiB0aGUgc3RyaW5naWZpZWQgSHRtbFRhZy5cblx0ICogXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHJldHVybiB7U3RyaW5nfSBFeGFtcGxlIHJldHVybjogYGF0dHIxPVwidmFsdWUxXCIgYXR0cjI9XCJ2YWx1ZTJcImBcblx0ICovXG5cdGJ1aWxkQXR0cnNTdHIgOiBmdW5jdGlvbigpIHtcblx0XHRpZiggIXRoaXMuYXR0cnMgKSByZXR1cm4gXCJcIjsgIC8vIG5vIGBhdHRyc2AgT2JqZWN0IChtYXApIGhhcyBiZWVuIHNldCwgcmV0dXJuIGVtcHR5IHN0cmluZ1xuXHRcdFxuXHRcdHZhciBhdHRycyA9IHRoaXMuZ2V0QXR0cnMoKSxcblx0XHQgICAgYXR0cnNBcnIgPSBbXTtcblx0XHRcblx0XHRmb3IoIHZhciBwcm9wIGluIGF0dHJzICkge1xuXHRcdFx0aWYoIGF0dHJzLmhhc093blByb3BlcnR5KCBwcm9wICkgKSB7XG5cdFx0XHRcdGF0dHJzQXJyLnB1c2goIHByb3AgKyAnPVwiJyArIGF0dHJzWyBwcm9wIF0gKyAnXCInICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBhdHRyc0Fyci5qb2luKCBcIiBcIiApO1xuXHR9XG5cdFxufSApO1xuLypnbG9iYWwgQXV0b2xpbmtlciAqL1xuLypqc2hpbnQgc3ViOnRydWUgKi9cbi8qKlxuICogQHByb3RlY3RlZFxuICogQGNsYXNzIEF1dG9saW5rZXIuQW5jaG9yVGFnQnVpbGRlclxuICogQGV4dGVuZHMgT2JqZWN0XG4gKiBcbiAqIEJ1aWxkcyBhbmNob3IgKCZsdDthJmd0OykgdGFncyBmb3IgdGhlIEF1dG9saW5rZXIgdXRpbGl0eSB3aGVuIGEgbWF0Y2ggaXMgZm91bmQuXG4gKiBcbiAqIE5vcm1hbGx5IHRoaXMgY2xhc3MgaXMgaW5zdGFudGlhdGVkLCBjb25maWd1cmVkLCBhbmQgdXNlZCBpbnRlcm5hbGx5IGJ5IGFuIHtAbGluayBBdXRvbGlua2VyfSBpbnN0YW5jZSwgYnV0IG1heSBcbiAqIGFjdHVhbGx5IGJlIHJldHJpZXZlZCBpbiBhIHtAbGluayBBdXRvbGlua2VyI3JlcGxhY2VGbiByZXBsYWNlRm59IHRvIGNyZWF0ZSB7QGxpbmsgQXV0b2xpbmtlci5IdG1sVGFnIEh0bWxUYWd9IGluc3RhbmNlc1xuICogd2hpY2ggbWF5IGJlIG1vZGlmaWVkIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGUge0BsaW5rIEF1dG9saW5rZXIjcmVwbGFjZUZuIHJlcGxhY2VGbn0uIEZvciBleGFtcGxlOlxuICogXG4gKiAgICAgdmFyIGh0bWwgPSBBdXRvbGlua2VyLmxpbmsoIFwiVGVzdCBnb29nbGUuY29tXCIsIHtcbiAqICAgICAgICAgcmVwbGFjZUZuIDogZnVuY3Rpb24oIGF1dG9saW5rZXIsIG1hdGNoICkge1xuICogICAgICAgICAgICAgdmFyIHRhZyA9IGF1dG9saW5rZXIuZ2V0VGFnQnVpbGRlcigpLmJ1aWxkKCBtYXRjaCApOyAgLy8gcmV0dXJucyBhbiB7QGxpbmsgQXV0b2xpbmtlci5IdG1sVGFnfSBpbnN0YW5jZVxuICogICAgICAgICAgICAgdGFnLnNldEF0dHIoICdyZWwnLCAnbm9mb2xsb3cnICk7XG4gKiAgICAgICAgICAgICBcbiAqICAgICAgICAgICAgIHJldHVybiB0YWc7XG4gKiAgICAgICAgIH1cbiAqICAgICB9ICk7XG4gKiAgICAgXG4gKiAgICAgLy8gZ2VuZXJhdGVkIGh0bWw6XG4gKiAgICAgLy8gICBUZXN0IDxhIGhyZWY9XCJodHRwOi8vZ29vZ2xlLmNvbVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vZm9sbG93XCI+Z29vZ2xlLmNvbTwvYT5cbiAqL1xuQXV0b2xpbmtlci5BbmNob3JUYWdCdWlsZGVyID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggT2JqZWN0LCB7XG5cdFxuXHQvKipcblx0ICogQGNmZyB7Qm9vbGVhbn0gbmV3V2luZG93XG5cdCAqIEBpbmhlcml0ZG9jIEF1dG9saW5rZXIjbmV3V2luZG93XG5cdCAqL1xuXHRcblx0LyoqXG5cdCAqIEBjZmcge051bWJlcn0gdHJ1bmNhdGVcblx0ICogQGluaGVyaXRkb2MgQXV0b2xpbmtlciN0cnVuY2F0ZVxuXHQgKi9cblx0XG5cdC8qKlxuXHQgKiBAY2ZnIHtTdHJpbmd9IGNsYXNzTmFtZVxuXHQgKiBAaW5oZXJpdGRvYyBBdXRvbGlua2VyI2NsYXNzTmFtZVxuXHQgKi9cblx0XG5cdFxuXHQvKipcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbY2ZnXSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQW5jaG9yVGFnQnVpbGRlciBpbnN0YW5jZSwgc3BlY2lmaWVkIGluIGFuIE9iamVjdCAobWFwKS5cblx0ICovXG5cdGNvbnN0cnVjdG9yIDogZnVuY3Rpb24oIGNmZyApIHtcblx0XHRBdXRvbGlua2VyLlV0aWwuYXNzaWduKCB0aGlzLCBjZmcgKTtcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBhY3R1YWwgYW5jaG9yICgmbHQ7YSZndDspIHRhZyB0byB1c2UgaW4gcGxhY2Ugb2YgdGhlIG1hdGNoZWQgVVJML2VtYWlsL1R3aXR0ZXIgdGV4dCxcblx0ICogdmlhIGl0cyBgbWF0Y2hgIG9iamVjdC5cblx0ICogXG5cdCAqIEBwYXJhbSB7QXV0b2xpbmtlci5tYXRjaC5NYXRjaH0gbWF0Y2ggVGhlIE1hdGNoIGluc3RhbmNlIHRvIGdlbmVyYXRlIGFuIGFuY2hvciB0YWcgZnJvbS5cblx0ICogQHJldHVybiB7QXV0b2xpbmtlci5IdG1sVGFnfSBUaGUgSHRtbFRhZyBpbnN0YW5jZSBmb3IgdGhlIGFuY2hvciB0YWcuXG5cdCAqL1xuXHRidWlsZCA6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHR2YXIgdGFnID0gbmV3IEF1dG9saW5rZXIuSHRtbFRhZygge1xuXHRcdFx0dGFnTmFtZSAgIDogJ2EnLFxuXHRcdFx0YXR0cnMgICAgIDogdGhpcy5jcmVhdGVBdHRycyggbWF0Y2guZ2V0VHlwZSgpLCBtYXRjaC5nZXRBbmNob3JIcmVmKCkgKSxcblx0XHRcdGlubmVySHRtbCA6IHRoaXMucHJvY2Vzc0FuY2hvclRleHQoIG1hdGNoLmdldEFuY2hvclRleHQoKSApXG5cdFx0fSApO1xuXHRcdFxuXHRcdHJldHVybiB0YWc7XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIE9iamVjdCAobWFwKSBvZiB0aGUgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgYW5jaG9yICgmbHQ7YSZndDspIHRhZyBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqIFxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7XCJ1cmxcIi9cImVtYWlsXCIvXCJ0d2l0dGVyXCJ9IG1hdGNoVHlwZSBUaGUgdHlwZSBvZiBtYXRjaCB0aGF0IGFuIGFuY2hvciB0YWcgaXMgYmVpbmcgZ2VuZXJhdGVkIGZvci5cblx0ICogQHBhcmFtIHtTdHJpbmd9IGhyZWYgVGhlIGhyZWYgZm9yIHRoZSBhbmNob3IgdGFnLlxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEga2V5L3ZhbHVlIE9iamVjdCAobWFwKSBvZiB0aGUgYW5jaG9yIHRhZydzIGF0dHJpYnV0ZXMuIFxuXHQgKi9cblx0Y3JlYXRlQXR0cnMgOiBmdW5jdGlvbiggbWF0Y2hUeXBlLCBhbmNob3JIcmVmICkge1xuXHRcdHZhciBhdHRycyA9IHtcblx0XHRcdCdocmVmJyA6IGFuY2hvckhyZWYgIC8vIHdlJ2xsIGFsd2F5cyBoYXZlIHRoZSBgaHJlZmAgYXR0cmlidXRlXG5cdFx0fTtcblx0XHRcblx0XHR2YXIgY3NzQ2xhc3MgPSB0aGlzLmNyZWF0ZUNzc0NsYXNzKCBtYXRjaFR5cGUgKTtcblx0XHRpZiggY3NzQ2xhc3MgKSB7XG5cdFx0XHRhdHRyc1sgJ2NsYXNzJyBdID0gY3NzQ2xhc3M7XG5cdFx0fVxuXHRcdGlmKCB0aGlzLm5ld1dpbmRvdyApIHtcblx0XHRcdGF0dHJzWyAndGFyZ2V0JyBdID0gXCJfYmxhbmtcIjtcblx0XHR9XG5cdFx0XG5cdFx0cmV0dXJuIGF0dHJzO1xuXHR9LFxuXHRcblx0XG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBDU1MgY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGEgZ2l2ZW4gYW5jaG9yIHRhZywgYmFzZWQgb24gdGhlIGBtYXRjaFR5cGVgIGFuZCB0aGUge0BsaW5rICNjbGFzc05hbWV9XG5cdCAqIGNvbmZpZy5cblx0ICogXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7XCJ1cmxcIi9cImVtYWlsXCIvXCJ0d2l0dGVyXCJ9IG1hdGNoVHlwZSBUaGUgdHlwZSBvZiBtYXRjaCB0aGF0IGFuIGFuY2hvciB0YWcgaXMgYmVpbmcgZ2VuZXJhdGVkIGZvci5cblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgQ1NTIGNsYXNzIHN0cmluZyBmb3IgdGhlIGxpbmsuIEV4YW1wbGUgcmV0dXJuOiBcIm15TGluayBteUxpbmstdXJsXCIuIElmIG5vIHtAbGluayAjY2xhc3NOYW1lfVxuXHQgKiAgIHdhcyBjb25maWd1cmVkLCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy5cblx0ICovXG5cdGNyZWF0ZUNzc0NsYXNzIDogZnVuY3Rpb24oIG1hdGNoVHlwZSApIHtcblx0XHR2YXIgY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWU7XG5cdFx0XG5cdFx0aWYoICFjbGFzc05hbWUgKSBcblx0XHRcdHJldHVybiBcIlwiO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBjbGFzc05hbWUgKyBcIiBcIiArIGNsYXNzTmFtZSArIFwiLVwiICsgbWF0Y2hUeXBlOyAgLy8gZXg6IFwibXlMaW5rIG15TGluay11cmxcIiwgXCJteUxpbmsgbXlMaW5rLWVtYWlsXCIsIG9yIFwibXlMaW5rIG15TGluay10d2l0dGVyXCJcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogUHJvY2Vzc2VzIHRoZSBgYW5jaG9yVGV4dGAgYnkgdHJ1bmNhdGluZyB0aGUgdGV4dCBhY2NvcmRpbmcgdG8gdGhlIHtAbGluayAjdHJ1bmNhdGV9IGNvbmZpZy5cblx0ICogXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBhbmNob3JUZXh0IFRoZSBhbmNob3IgdGFnJ3MgdGV4dCAoaS5lLiB3aGF0IHdpbGwgYmUgZGlzcGxheWVkKS5cblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgcHJvY2Vzc2VkIGBhbmNob3JUZXh0YC5cblx0ICovXG5cdHByb2Nlc3NBbmNob3JUZXh0IDogZnVuY3Rpb24oIGFuY2hvclRleHQgKSB7XG5cdFx0YW5jaG9yVGV4dCA9IHRoaXMuZG9UcnVuY2F0ZSggYW5jaG9yVGV4dCApO1xuXHRcdFxuXHRcdHJldHVybiBhbmNob3JUZXh0O1xuXHR9LFxuXHRcblx0XG5cdC8qKlxuXHQgKiBQZXJmb3JtcyB0aGUgdHJ1bmNhdGlvbiBvZiB0aGUgYGFuY2hvclRleHRgLCBpZiB0aGUgYGFuY2hvclRleHRgIGlzIGxvbmdlciB0aGFuIHRoZSB7QGxpbmsgI3RydW5jYXRlfSBvcHRpb24uXG5cdCAqIFRydW5jYXRlcyB0aGUgdGV4dCB0byAyIGNoYXJhY3RlcnMgZmV3ZXIgdGhhbiB0aGUge0BsaW5rICN0cnVuY2F0ZX0gb3B0aW9uLCBhbmQgYWRkcyBcIi4uXCIgdG8gdGhlIGVuZC5cblx0ICogXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBhbmNob3IgdGFnJ3MgdGV4dCAoaS5lLiB3aGF0IHdpbGwgYmUgZGlzcGxheWVkKS5cblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgdHJ1bmNhdGVkIGFuY2hvciB0ZXh0LlxuXHQgKi9cblx0ZG9UcnVuY2F0ZSA6IGZ1bmN0aW9uKCBhbmNob3JUZXh0ICkge1xuXHRcdHJldHVybiBBdXRvbGlua2VyLlV0aWwuZWxsaXBzaXMoIGFuY2hvclRleHQsIHRoaXMudHJ1bmNhdGUgfHwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZICk7XG5cdH1cblx0XG59ICk7XG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAY2xhc3MgQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxQYXJzZXJcbiAqIEBleHRlbmRzIE9iamVjdFxuICogXG4gKiBBbiBIVE1MIHBhcnNlciBpbXBsZW1lbnRhdGlvbiB3aGljaCBzaW1wbHkgd2Fsa3MgYW4gSFRNTCBzdHJpbmcgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgXG4gKiB7QGxpbmsgQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxOb2RlIEh0bWxOb2Rlc30gdGhhdCByZXByZXNlbnQgdGhlIGJhc2ljIEhUTUwgc3RydWN0dXJlIG9mIHRoZSBpbnB1dCBzdHJpbmcuXG4gKiBcbiAqIEF1dG9saW5rZXIgdXNlcyB0aGlzIHRvIG9ubHkgbGluayBVUkxzL2VtYWlscy9Ud2l0dGVyIGhhbmRsZXMgd2l0aGluIHRleHQgbm9kZXMsIGVmZmVjdGl2ZWx5IGlnbm9yaW5nIC8gXCJ3YWxraW5nXG4gKiBhcm91bmRcIiBIVE1MIHRhZ3MuXG4gKi9cbkF1dG9saW5rZXIuaHRtbFBhcnNlci5IdG1sUGFyc2VyID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggT2JqZWN0LCB7XG5cdFxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtSZWdFeHB9IGh0bWxSZWdleFxuXHQgKiBcblx0ICogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIHB1bGwgb3V0IEhUTUwgdGFncyBmcm9tIGEgc3RyaW5nLiBIYW5kbGVzIG5hbWVzcGFjZWQgSFRNTCB0YWdzIGFuZFxuXHQgKiBhdHRyaWJ1dGUgbmFtZXMsIGFzIHNwZWNpZmllZCBieSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sLW1hcmt1cC9zeW50YXguaHRtbC5cblx0ICogXG5cdCAqIENhcHR1cmluZyBncm91cHM6XG5cdCAqIFxuXHQgKiAxLiBUaGUgXCIhRE9DVFlQRVwiIHRhZyBuYW1lLCBpZiBhIHRhZyBpcyBhICZsdDshRE9DVFlQRSZndDsgdGFnLlxuXHQgKiAyLiBJZiBpdCBpcyBhbiBlbmQgdGFnLCB0aGlzIGdyb3VwIHdpbGwgaGF2ZSB0aGUgJy8nLlxuXHQgKiAzLiBUaGUgdGFnIG5hbWUgZm9yIGFsbCB0YWdzIChvdGhlciB0aGFuIHRoZSAmbHQ7IURPQ1RZUEUmZ3Q7IHRhZylcblx0ICovXG5cdGh0bWxSZWdleCA6IChmdW5jdGlvbigpIHtcblx0XHR2YXIgdGFnTmFtZVJlZ2V4ID0gL1swLTlhLXpBLVpdWzAtOWEtekEtWjpdKi8sXG5cdFx0ICAgIGF0dHJOYW1lUmVnZXggPSAvW15cXHNcXDBcIic+XFwvPVxceDAxLVxceDFGXFx4N0ZdKy8sICAgLy8gdGhlIHVuaWNvZGUgcmFuZ2UgYWNjb3VudHMgZm9yIGV4Y2x1ZGluZyBjb250cm9sIGNoYXJzLCBhbmQgdGhlIGRlbGV0ZSBjaGFyXG5cdFx0ICAgIGF0dHJWYWx1ZVJlZ2V4ID0gLyg/OlwiW15cIl0qP1wifCdbXiddKj8nfFteJ1wiPTw+YFxcc10rKS8sIC8vIGRvdWJsZSBxdW90ZWQsIHNpbmdsZSBxdW90ZWQsIG9yIHVucXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZXNcblx0XHQgICAgbmFtZUVxdWFsc1ZhbHVlUmVnZXggPSBhdHRyTmFtZVJlZ2V4LnNvdXJjZSArICcoPzpcXFxccyo9XFxcXHMqJyArIGF0dHJWYWx1ZVJlZ2V4LnNvdXJjZSArICcpPyc7ICAvLyBvcHRpb25hbCAnPVt2YWx1ZV0nXG5cdFx0XG5cdFx0cmV0dXJuIG5ldyBSZWdFeHAoIFtcblx0XHRcdC8vIGZvciA8IURPQ1RZUEU+IHRhZy4gRXg6IDwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkXCI+KSBcblx0XHRcdCcoPzonLFxuXHRcdFx0XHQnPCghRE9DVFlQRSknLCAgLy8gKioqIENhcHR1cmluZyBHcm91cCAxIC0gSWYgaXQncyBhIGRvY3R5cGUgdGFnXG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0Ly8gWmVybyBvciBtb3JlIGF0dHJpYnV0ZXMgZm9sbG93aW5nIHRoZSB0YWcgbmFtZVxuXHRcdFx0XHRcdCcoPzonLFxuXHRcdFx0XHRcdFx0J1xcXFxzKycsICAvLyBvbmUgb3IgbW9yZSB3aGl0ZXNwYWNlIGNoYXJzIGJlZm9yZSBhbiBhdHRyaWJ1dGVcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0Ly8gRWl0aGVyOlxuXHRcdFx0XHRcdFx0Ly8gQS4gYXR0cj1cInZhbHVlXCIsIG9yIFxuXHRcdFx0XHRcdFx0Ly8gQi4gXCJ2YWx1ZVwiIGFsb25lIChUbyBjb3ZlciBleGFtcGxlIGRvY3R5cGUgdGFnOiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZFwiPikgXG5cdFx0XHRcdFx0XHQnKD86JywgbmFtZUVxdWFsc1ZhbHVlUmVnZXgsICd8JywgYXR0clZhbHVlUmVnZXguc291cmNlICsgJyknLFxuXHRcdFx0XHRcdCcpKicsXG5cdFx0XHRcdCc+Jyxcblx0XHRcdCcpJyxcblx0XHRcdFxuXHRcdFx0J3wnLFxuXHRcdFx0XG5cdFx0XHQvLyBBbGwgb3RoZXIgSFRNTCB0YWdzIChpLmUuIHRhZ3MgdGhhdCBhcmUgbm90IDwhRE9DVFlQRT4pXG5cdFx0XHQnKD86Jyxcblx0XHRcdFx0JzwoLyk/JywgIC8vIEJlZ2lubmluZyBvZiBhIHRhZy4gRWl0aGVyICc8JyBmb3IgYSBzdGFydCB0YWcsIG9yICc8LycgZm9yIGFuIGVuZCB0YWcuIFxuXHRcdFx0XHQgICAgICAgICAgLy8gKioqIENhcHR1cmluZyBHcm91cCAyOiBUaGUgc2xhc2ggb3IgYW4gZW1wdHkgc3RyaW5nLiBTbGFzaCAoJy8nKSBmb3IgZW5kIHRhZywgZW1wdHkgc3RyaW5nIGZvciBzdGFydCBvciBzZWxmLWNsb3NpbmcgdGFnLlxuXHRcdFx0XG5cdFx0XHRcdFx0Ly8gKioqIENhcHR1cmluZyBHcm91cCAzIC0gVGhlIHRhZyBuYW1lXG5cdFx0XHRcdFx0JygnICsgdGFnTmFtZVJlZ2V4LnNvdXJjZSArICcpJyxcblx0XHRcdFx0XHRcblx0XHRcdFx0XHQvLyBaZXJvIG9yIG1vcmUgYXR0cmlidXRlcyBmb2xsb3dpbmcgdGhlIHRhZyBuYW1lXG5cdFx0XHRcdFx0Jyg/OicsXG5cdFx0XHRcdFx0XHQnXFxcXHMrJywgICAgICAgICAgICAgICAgLy8gb25lIG9yIG1vcmUgd2hpdGVzcGFjZSBjaGFycyBiZWZvcmUgYW4gYXR0cmlidXRlXG5cdFx0XHRcdFx0XHRuYW1lRXF1YWxzVmFsdWVSZWdleCwgIC8vIGF0dHI9XCJ2YWx1ZVwiICh3aXRoIG9wdGlvbmFsID1cInZhbHVlXCIgcGFydClcblx0XHRcdFx0XHQnKSonLFxuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdCdcXFxccyovPycsICAvLyBhbnkgdHJhaWxpbmcgc3BhY2VzIGFuZCBvcHRpb25hbCAnLycgYmVmb3JlIHRoZSBjbG9zaW5nICc+J1xuXHRcdFx0XHQnPicsXG5cdFx0XHQnKSdcblx0XHRdLmpvaW4oIFwiXCIgKSwgJ2dpJyApO1xuXHR9ICkoKSxcblx0XG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcHJvcGVydHkge1JlZ0V4cH0gaHRtbENoYXJhY3RlckVudGl0aWVzUmVnZXhcblx0ICpcblx0ICogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgY29tbW9uIEhUTUwgY2hhcmFjdGVyIGVudGl0aWVzLlxuXHQgKiBcblx0ICogSWdub3JpbmcgJmFtcDsgYXMgaXQgY291bGQgYmUgcGFydCBvZiBhIHF1ZXJ5IHN0cmluZyAtLSBoYW5kbGluZyBpdCBzZXBhcmF0ZWx5LlxuXHQgKi9cblx0aHRtbENoYXJhY3RlckVudGl0aWVzUmVnZXg6IC8oJm5ic3A7fCYjMTYwO3wmbHQ7fCYjNjA7fCZndDt8JiM2Mjt8JnF1b3Q7fCYjMzQ7fCYjMzk7KS9naSxcblx0XG5cdFxuXHQvKipcblx0ICogUGFyc2VzIGFuIEhUTUwgc3RyaW5nIGFuZCByZXR1cm5zIGEgc2ltcGxlIGFycmF5IG9mIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbE5vZGUgSHRtbE5vZGVzfSB0byByZXByZXNlbnRcblx0ICogdGhlIEhUTUwgc3RydWN0dXJlIG9mIHRoZSBpbnB1dCBzdHJpbmcuIFxuXHQgKiBcblx0ICogQHBhcmFtIHtTdHJpbmd9IGh0bWwgVGhlIEhUTUwgdG8gcGFyc2UuXG5cdCAqIEByZXR1cm4ge0F1dG9saW5rZXIuaHRtbFBhcnNlci5IdG1sTm9kZVtdfVxuXHQgKi9cblx0cGFyc2UgOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaHRtbFJlZ2V4ID0gdGhpcy5odG1sUmVnZXgsXG5cdFx0ICAgIGN1cnJlbnRSZXN1bHQsXG5cdFx0ICAgIGxhc3RJbmRleCA9IDAsXG5cdFx0ICAgIHRleHRBbmRFbnRpdHlOb2Rlcyxcblx0XHQgICAgbm9kZXMgPSBbXTsgIC8vIHdpbGwgYmUgdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kXG5cdFx0XG5cdFx0d2hpbGUoICggY3VycmVudFJlc3VsdCA9IGh0bWxSZWdleC5leGVjKCBodG1sICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHZhciB0YWdUZXh0ID0gY3VycmVudFJlc3VsdFsgMCBdLFxuXHRcdFx0ICAgIHRhZ05hbWUgPSBjdXJyZW50UmVzdWx0WyAxIF0gfHwgY3VycmVudFJlc3VsdFsgMyBdLCAgLy8gVGhlIDwhRE9DVFlQRT4gdGFnIChleDogXCIhRE9DVFlQRVwiKSwgb3IgYW5vdGhlciB0YWcgKGV4OiBcImFcIiBvciBcImltZ1wiKSBcblx0XHRcdCAgICBpc0Nsb3NpbmdUYWcgPSAhIWN1cnJlbnRSZXN1bHRbIDIgXSxcblx0XHRcdCAgICBpbkJldHdlZW5UYWdzVGV4dCA9IGh0bWwuc3Vic3RyaW5nKCBsYXN0SW5kZXgsIGN1cnJlbnRSZXN1bHQuaW5kZXggKTtcblx0XHRcdFxuXHRcdFx0Ly8gUHVzaCBUZXh0Tm9kZXMgYW5kIEVudGl0eU5vZGVzIGZvciBhbnkgdGV4dCBmb3VuZCBiZXR3ZWVuIHRhZ3Ncblx0XHRcdGlmKCBpbkJldHdlZW5UYWdzVGV4dCApIHtcblx0XHRcdFx0dGV4dEFuZEVudGl0eU5vZGVzID0gdGhpcy5wYXJzZVRleHRBbmRFbnRpdHlOb2RlcyggaW5CZXR3ZWVuVGFnc1RleHQgKTtcblx0XHRcdFx0bm9kZXMucHVzaC5hcHBseSggbm9kZXMsIHRleHRBbmRFbnRpdHlOb2RlcyApO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHQvLyBQdXNoIHRoZSBFbGVtZW50Tm9kZVxuXHRcdFx0bm9kZXMucHVzaCggdGhpcy5jcmVhdGVFbGVtZW50Tm9kZSggdGFnVGV4dCwgdGFnTmFtZSwgaXNDbG9zaW5nVGFnICkgKTtcblx0XHRcdFxuXHRcdFx0bGFzdEluZGV4ID0gY3VycmVudFJlc3VsdC5pbmRleCArIHRhZ1RleHQubGVuZ3RoO1xuXHRcdH1cblx0XHRcblx0XHQvLyBQcm9jZXNzIGFueSByZW1haW5pbmcgdGV4dCBhZnRlciB0aGUgbGFzdCBIVE1MIGVsZW1lbnQuIFdpbGwgcHJvY2VzcyBhbGwgb2YgdGhlIHRleHQgaWYgdGhlcmUgd2VyZSBubyBIVE1MIGVsZW1lbnRzLlxuXHRcdGlmKCBsYXN0SW5kZXggPCBodG1sLmxlbmd0aCApIHtcblx0XHRcdHZhciB0ZXh0ID0gaHRtbC5zdWJzdHJpbmcoIGxhc3RJbmRleCApO1xuXHRcdFx0XG5cdFx0XHQvLyBQdXNoIFRleHROb2RlcyBhbmQgRW50aXR5Tm9kZXMgZm9yIGFueSB0ZXh0IGZvdW5kIGJldHdlZW4gdGFnc1xuXHRcdFx0aWYoIHRleHQgKSB7XG5cdFx0XHRcdHRleHRBbmRFbnRpdHlOb2RlcyA9IHRoaXMucGFyc2VUZXh0QW5kRW50aXR5Tm9kZXMoIHRleHQgKTtcblx0XHRcdFx0bm9kZXMucHVzaC5hcHBseSggbm9kZXMsIHRleHRBbmRFbnRpdHlOb2RlcyApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRcblx0XHRyZXR1cm4gbm9kZXM7XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIFBhcnNlcyB0ZXh0IGFuZCBIVE1MIGVudGl0eSBub2RlcyBmcm9tIGEgZ2l2ZW4gc3RyaW5nLiBUaGUgaW5wdXQgc3RyaW5nIHNob3VsZCBub3QgaGF2ZSBhbnkgSFRNTCB0YWdzIChlbGVtZW50cylcblx0ICogd2l0aGluIGl0LlxuXHQgKiBcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHRleHQgdG8gcGFyc2UuXG5cdCAqIEByZXR1cm4ge0F1dG9saW5rZXIuaHRtbFBhcnNlci5IdG1sTm9kZVtdfSBBbiBhcnJheSBvZiBIdG1sTm9kZXMgdG8gcmVwcmVzZW50IHRoZSBcblx0ICogICB7QGxpbmsgQXV0b2xpbmtlci5odG1sUGFyc2VyLlRleHROb2RlIFRleHROb2Rlc30gYW5kIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuRW50aXR5Tm9kZSBFbnRpdHlOb2Rlc30gZm91bmQuXG5cdCAqL1xuXHRwYXJzZVRleHRBbmRFbnRpdHlOb2RlcyA6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHZhciBub2RlcyA9IFtdLFxuXHRcdCAgICB0ZXh0QW5kRW50aXR5VG9rZW5zID0gQXV0b2xpbmtlci5VdGlsLnNwbGl0QW5kQ2FwdHVyZSggdGV4dCwgdGhpcy5odG1sQ2hhcmFjdGVyRW50aXRpZXNSZWdleCApOyAgLy8gc3BsaXQgYXQgSFRNTCBlbnRpdGllcywgYnV0IGluY2x1ZGUgdGhlIEhUTUwgZW50aXRpZXMgaW4gdGhlIHJlc3VsdHMgYXJyYXlcblx0XHRcblx0XHQvLyBFdmVyeSBldmVuIG51bWJlcmVkIHRva2VuIGlzIGEgVGV4dE5vZGUsIGFuZCBldmVyeSBvZGQgbnVtYmVyZWQgdG9rZW4gaXMgYW4gRW50aXR5Tm9kZVxuXHRcdC8vIEZvciBleGFtcGxlOiBhbiBpbnB1dCBgdGV4dGAgb2YgXCJUZXN0ICZxdW90O3RoaXMmcXVvdDsgdG9kYXlcIiB3b3VsZCB0dXJuIGludG8gdGhlIFxuXHRcdC8vICAgYHRleHRBbmRFbnRpdHlUb2tlbnNgOiBbICdUZXN0ICcsICcmcXVvdDsnLCAndGhpcycsICcmcXVvdDsnLCAnIHRvZGF5JyBdXG5cdFx0Zm9yKCB2YXIgaSA9IDAsIGxlbiA9IHRleHRBbmRFbnRpdHlUb2tlbnMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDIgKSB7XG5cdFx0XHR2YXIgdGV4dFRva2VuID0gdGV4dEFuZEVudGl0eVRva2Vuc1sgaSBdLFxuXHRcdFx0ICAgIGVudGl0eVRva2VuID0gdGV4dEFuZEVudGl0eVRva2Vuc1sgaSArIDEgXTtcblx0XHRcdFxuXHRcdFx0aWYoIHRleHRUb2tlbiApIG5vZGVzLnB1c2goIHRoaXMuY3JlYXRlVGV4dE5vZGUoIHRleHRUb2tlbiApICk7XG5cdFx0XHRpZiggZW50aXR5VG9rZW4gKSBub2Rlcy5wdXNoKCB0aGlzLmNyZWF0ZUVudGl0eU5vZGUoIGVudGl0eVRva2VuICkgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5vZGVzO1xuXHR9LFxuXHRcblx0XG5cdC8qKlxuXHQgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4ge0BsaW5rIEF1dG9saW5rZXIuaHRtbFBhcnNlci5FbGVtZW50Tm9kZSBFbGVtZW50Tm9kZX0uXG5cdCAqIFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdGFnVGV4dCBUaGUgZnVsbCB0ZXh0IG9mIHRoZSB0YWcgKGVsZW1lbnQpIHRoYXQgd2FzIG1hdGNoZWQsIGluY2x1ZGluZyBpdHMgYXR0cmlidXRlcy5cblx0ICogQHBhcmFtIHtTdHJpbmd9IHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhlIHRhZy4gRXg6IEFuICZsdDtpbWcmZ3Q7IHRhZyB3b3VsZCBiZSBwYXNzZWQgdG8gdGhpcyBtZXRob2QgYXMgXCJpbWdcIi5cblx0ICogQHBhcmFtIHtCb29sZWFufSBpc0Nsb3NpbmdUYWcgYHRydWVgIGlmIGl0J3MgYSBjbG9zaW5nIHRhZywgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLmh0bWxQYXJzZXIuRWxlbWVudE5vZGV9XG5cdCAqL1xuXHRjcmVhdGVFbGVtZW50Tm9kZSA6IGZ1bmN0aW9uKCB0YWdUZXh0LCB0YWdOYW1lLCBpc0Nsb3NpbmdUYWcgKSB7XG5cdFx0cmV0dXJuIG5ldyBBdXRvbGlua2VyLmh0bWxQYXJzZXIuRWxlbWVudE5vZGUoIHtcblx0XHRcdHRleHQgICAgOiB0YWdUZXh0LFxuXHRcdFx0dGFnTmFtZSA6IHRhZ05hbWUudG9Mb3dlckNhc2UoKSxcblx0XHRcdGNsb3NpbmcgOiBpc0Nsb3NpbmdUYWdcblx0XHR9ICk7XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuRW50aXR5Tm9kZSBFbnRpdHlOb2RlfS5cblx0ICogXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRoYXQgd2FzIG1hdGNoZWQgZm9yIHRoZSBIVE1MIGVudGl0eSAoc3VjaCBhcyAnJmFtcDtuYnNwOycpLlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLmh0bWxQYXJzZXIuRW50aXR5Tm9kZX1cblx0ICovXG5cdGNyZWF0ZUVudGl0eU5vZGUgOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRyZXR1cm4gbmV3IEF1dG9saW5rZXIuaHRtbFBhcnNlci5FbnRpdHlOb2RlKCB7IHRleHQ6IHRleHQgfSApO1xuXHR9LFxuXHRcblx0XG5cdC8qKlxuXHQgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSB7QGxpbmsgQXV0b2xpbmtlci5odG1sUGFyc2VyLlRleHROb2RlIFRleHROb2RlfS5cblx0ICogXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRoYXQgd2FzIG1hdGNoZWQuXG5cdCAqIEByZXR1cm4ge0F1dG9saW5rZXIuaHRtbFBhcnNlci5UZXh0Tm9kZX1cblx0ICovXG5cdGNyZWF0ZVRleHROb2RlIDogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0cmV0dXJuIG5ldyBBdXRvbGlua2VyLmh0bWxQYXJzZXIuVGV4dE5vZGUoIHsgdGV4dDogdGV4dCB9ICk7XG5cdH1cblx0XG59ICk7XG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKipcbiAqIEBhYnN0cmFjdFxuICogQGNsYXNzIEF1dG9saW5rZXIuaHRtbFBhcnNlci5IdG1sTm9kZVxuICogXG4gKiBSZXByZXNlbnRzIGFuIEhUTUwgbm9kZSBmb3VuZCBpbiBhbiBpbnB1dCBzdHJpbmcuIEFuIEhUTUwgbm9kZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAqIFxuICogMS4gQW4ge0BsaW5rIEF1dG9saW5rZXIuaHRtbFBhcnNlci5FbGVtZW50Tm9kZSBFbGVtZW50Tm9kZX0sIHdoaWNoIHJlcHJlc2VudHMgSFRNTCB0YWdzLlxuICogMi4gQSB7QGxpbmsgQXV0b2xpbmtlci5odG1sUGFyc2VyLlRleHROb2RlIFRleHROb2RlfSwgd2hpY2ggcmVwcmVzZW50cyB0ZXh0IG91dHNpZGUgb3Igd2l0aGluIEhUTUwgdGFncy5cbiAqIDMuIEEge0BsaW5rIEF1dG9saW5rZXIuaHRtbFBhcnNlci5FbnRpdHlOb2RlIEVudGl0eU5vZGV9LCB3aGljaCByZXByZXNlbnRzIG9uZSBvZiB0aGUga25vd24gSFRNTFxuICogICAgZW50aXRpZXMgdGhhdCBBdXRvbGlua2VyIGxvb2tzIGZvci4gVGhpcyBpbmNsdWRlcyBjb21tb24gb25lcyBzdWNoIGFzICZhbXA7cXVvdDsgYW5kICZhbXA7bmJzcDtcbiAqL1xuQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxOb2RlID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggT2JqZWN0LCB7XG5cdFxuXHQvKipcblx0ICogQGNmZyB7U3RyaW5nfSB0ZXh0IChyZXF1aXJlZClcblx0ICogXG5cdCAqIFRoZSBvcmlnaW5hbCB0ZXh0IHRoYXQgd2FzIG1hdGNoZWQgZm9yIHRoZSBIdG1sTm9kZS4gXG5cdCAqIFxuXHQgKiAtIEluIHRoZSBjYXNlIG9mIGFuIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuRWxlbWVudE5vZGUgRWxlbWVudE5vZGV9LCB0aGlzIHdpbGwgYmUgdGhlIHRhZydzXG5cdCAqICAgdGV4dC5cblx0ICogLSBJbiB0aGUgY2FzZSBvZiBhIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuVGV4dE5vZGUgVGV4dE5vZGV9LCB0aGlzIHdpbGwgYmUgdGhlIHRleHQgaXRzZWxmLlxuXHQgKiAtIEluIHRoZSBjYXNlIG9mIGEge0BsaW5rIEF1dG9saW5rZXIuaHRtbFBhcnNlci5FbnRpdHlOb2RlIEVudGl0eU5vZGV9LCB0aGlzIHdpbGwgYmUgdGhlIHRleHQgb2Zcblx0ICogICB0aGUgSFRNTCBlbnRpdHkuXG5cdCAqL1xuXHR0ZXh0IDogXCJcIixcblx0XG5cdFxuXHQvKipcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgVGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIE1hdGNoIGluc3RhbmNlLCBzcGVjaWZpZWQgaW4gYW4gT2JqZWN0IChtYXApLlxuXHQgKi9cblx0Y29uc3RydWN0b3IgOiBmdW5jdGlvbiggY2ZnICkge1xuXHRcdEF1dG9saW5rZXIuVXRpbC5hc3NpZ24oIHRoaXMsIGNmZyApO1xuXHR9LFxuXG5cdFxuXHQvKipcblx0ICogUmV0dXJucyBhIHN0cmluZyBuYW1lIGZvciB0aGUgdHlwZSBvZiBub2RlIHRoYXQgdGhpcyBjbGFzcyByZXByZXNlbnRzLlxuXHQgKiBcblx0ICogQGFic3RyYWN0XG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldFR5cGUgOiBBdXRvbGlua2VyLlV0aWwuYWJzdHJhY3RNZXRob2QsXG5cdFxuXHRcblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUge0BsaW5rICN0ZXh0fSBmb3IgdGhlIEh0bWxOb2RlLlxuXHQgKiBcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0VGV4dCA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnRleHQ7XG5cdH1cblxufSApO1xuLypnbG9iYWwgQXV0b2xpbmtlciAqL1xuLyoqXG4gKiBAY2xhc3MgQXV0b2xpbmtlci5odG1sUGFyc2VyLkVsZW1lbnROb2RlXG4gKiBAZXh0ZW5kcyBBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbE5vZGVcbiAqIFxuICogUmVwcmVzZW50cyBhbiBIVE1MIGVsZW1lbnQgbm9kZSB0aGF0IGhhcyBiZWVuIHBhcnNlZCBieSB0aGUge0BsaW5rIEF1dG9saW5rZXIuaHRtbFBhcnNlci5IdG1sUGFyc2VyfS5cbiAqIFxuICogU2VlIHRoaXMgY2xhc3MncyBzdXBlcmNsYXNzICh7QGxpbmsgQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxOb2RlfSkgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuQXV0b2xpbmtlci5odG1sUGFyc2VyLkVsZW1lbnROb2RlID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxOb2RlLCB7XG5cdFxuXHQvKipcblx0ICogQGNmZyB7U3RyaW5nfSB0YWdOYW1lIChyZXF1aXJlZClcblx0ICogXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0YWcgdGhhdCB3YXMgbWF0Y2hlZC5cblx0ICovXG5cdHRhZ05hbWUgOiAnJyxcblx0XG5cdC8qKlxuXHQgKiBAY2ZnIHtCb29sZWFufSBjbG9zaW5nIChyZXF1aXJlZClcblx0ICogXG5cdCAqIGB0cnVlYCBpZiB0aGUgZWxlbWVudCAodGFnKSBpcyBhIGNsb3NpbmcgdGFnLCBgZmFsc2VgIGlmIGl0cyBhbiBvcGVuaW5nIHRhZy5cblx0ICovXG5cdGNsb3NpbmcgOiBmYWxzZSxcblxuXHRcblx0LyoqXG5cdCAqIFJldHVybnMgYSBzdHJpbmcgbmFtZSBmb3IgdGhlIHR5cGUgb2Ygbm9kZSB0aGF0IHRoaXMgY2xhc3MgcmVwcmVzZW50cy5cblx0ICogXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldFR5cGUgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gJ2VsZW1lbnQnO1xuXHR9LFxuXHRcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgSFRNTCBlbGVtZW50J3MgKHRhZydzKSBuYW1lLiBFeDogZm9yIGFuICZsdDtpbWcmZ3Q7IHRhZywgcmV0dXJucyBcImltZ1wiLlxuXHQgKiBcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0VGFnTmFtZSA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnRhZ05hbWU7XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIERldGVybWluZXMgaWYgdGhlIEhUTUwgZWxlbWVudCAodGFnKSBpcyBhIGNsb3NpbmcgdGFnLiBFeDogJmx0O2RpdiZndDsgcmV0dXJuc1xuXHQgKiBgZmFsc2VgLCB3aGlsZSAmbHQ7L2RpdiZndDsgcmV0dXJucyBgdHJ1ZWAuXG5cdCAqIFxuXHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHQgKi9cblx0aXNDbG9zaW5nIDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuY2xvc2luZztcblx0fVxuXHRcbn0gKTtcbi8qZ2xvYmFsIEF1dG9saW5rZXIgKi9cbi8qKlxuICogQGNsYXNzIEF1dG9saW5rZXIuaHRtbFBhcnNlci5FbnRpdHlOb2RlXG4gKiBAZXh0ZW5kcyBBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbE5vZGVcbiAqIFxuICogUmVwcmVzZW50cyBhIGtub3duIEhUTUwgZW50aXR5IG5vZGUgdGhhdCBoYXMgYmVlbiBwYXJzZWQgYnkgdGhlIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbFBhcnNlcn0uXG4gKiBFeDogJyZhbXA7bmJzcDsnLCBvciAnJmFtcCMxNjA7JyAod2hpY2ggd2lsbCBiZSByZXRyaWV2YWJsZSBmcm9tIHRoZSB7QGxpbmsgI2dldFRleHR9IG1ldGhvZC5cbiAqIFxuICogTm90ZSB0aGF0IHRoaXMgY2xhc3Mgd2lsbCBvbmx5IGJlIHJldHVybmVkIGZyb20gdGhlIEh0bWxQYXJzZXIgZm9yIHRoZSBzZXQgb2YgY2hlY2tlZCBIVE1MIGVudGl0eSBub2RlcyBcbiAqIGRlZmluZWQgYnkgdGhlIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbFBhcnNlciNodG1sQ2hhcmFjdGVyRW50aXRpZXNSZWdleH0uXG4gKiBcbiAqIFNlZSB0aGlzIGNsYXNzJ3Mgc3VwZXJjbGFzcyAoe0BsaW5rIEF1dG9saW5rZXIuaHRtbFBhcnNlci5IdG1sTm9kZX0pIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cbkF1dG9saW5rZXIuaHRtbFBhcnNlci5FbnRpdHlOb2RlID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxOb2RlLCB7XG5cdFxuXHQvKipcblx0ICogUmV0dXJucyBhIHN0cmluZyBuYW1lIGZvciB0aGUgdHlwZSBvZiBub2RlIHRoYXQgdGhpcyBjbGFzcyByZXByZXNlbnRzLlxuXHQgKiBcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0VHlwZSA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAnZW50aXR5Jztcblx0fVxuXHRcbn0gKTtcbi8qZ2xvYmFsIEF1dG9saW5rZXIgKi9cbi8qKlxuICogQGNsYXNzIEF1dG9saW5rZXIuaHRtbFBhcnNlci5UZXh0Tm9kZVxuICogQGV4dGVuZHMgQXV0b2xpbmtlci5odG1sUGFyc2VyLkh0bWxOb2RlXG4gKiBcbiAqIFJlcHJlc2VudHMgYSB0ZXh0IG5vZGUgdGhhdCBoYXMgYmVlbiBwYXJzZWQgYnkgdGhlIHtAbGluayBBdXRvbGlua2VyLmh0bWxQYXJzZXIuSHRtbFBhcnNlcn0uXG4gKiBcbiAqIFNlZSB0aGlzIGNsYXNzJ3Mgc3VwZXJjbGFzcyAoe0BsaW5rIEF1dG9saW5rZXIuaHRtbFBhcnNlci5IdG1sTm9kZX0pIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cbkF1dG9saW5rZXIuaHRtbFBhcnNlci5UZXh0Tm9kZSA9IEF1dG9saW5rZXIuVXRpbC5leHRlbmQoIEF1dG9saW5rZXIuaHRtbFBhcnNlci5IdG1sTm9kZSwge1xuXHRcblx0LyoqXG5cdCAqIFJldHVybnMgYSBzdHJpbmcgbmFtZSBmb3IgdGhlIHR5cGUgb2Ygbm9kZSB0aGF0IHRoaXMgY2xhc3MgcmVwcmVzZW50cy5cblx0ICogXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldFR5cGUgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gJ3RleHQnO1xuXHR9XG5cdFxufSApO1xuLypnbG9iYWwgQXV0b2xpbmtlciAqL1xuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGNsYXNzIEF1dG9saW5rZXIubWF0Y2hQYXJzZXIuTWF0Y2hQYXJzZXJcbiAqIEBleHRlbmRzIE9iamVjdFxuICogXG4gKiBVc2VkIGJ5IEF1dG9saW5rZXIgdG8gcGFyc2Uge0BsaW5rICN1cmxzIFVSTHN9LCB7QGxpbmsgI2VtYWlscyBlbWFpbCBhZGRyZXNzZXN9LCBhbmQge0BsaW5rICN0d2l0dGVyIFR3aXR0ZXIgaGFuZGxlc30sIFxuICogZ2l2ZW4gYW4gaW5wdXQgc3RyaW5nIG9mIHRleHQuXG4gKiBcbiAqIFRoZSBNYXRjaFBhcnNlciBpcyBmZWQgYSBub24tSFRNTCBzdHJpbmcgaW4gb3JkZXIgdG8gc2VhcmNoIG91dCBVUkxzLCBlbWFpbCBhZGRyZXNzZXMgYW5kIFR3aXR0ZXIgaGFuZGxlcy4gQXV0b2xpbmtlclxuICogZmlyc3QgdXNlcyB0aGUge0BsaW5rIEh0bWxQYXJzZXJ9IHRvIFwid2FsayBhcm91bmRcIiBIVE1MIHRhZ3MsIGFuZCB0aGVuIHRoZSB0ZXh0IGFyb3VuZCB0aGUgSFRNTCB0YWdzIGlzIHBhc3NlZCBpbnRvXG4gKiB0aGUgTWF0Y2hQYXJzZXIgaW4gb3JkZXIgdG8gZmluZCB0aGUgYWN0dWFsIG1hdGNoZXMuXG4gKi9cbkF1dG9saW5rZXIubWF0Y2hQYXJzZXIuTWF0Y2hQYXJzZXIgPSBBdXRvbGlua2VyLlV0aWwuZXh0ZW5kKCBPYmplY3QsIHtcblx0XG5cdC8qKlxuXHQgKiBAY2ZnIHtCb29sZWFufSB1cmxzXG5cdCAqIFxuXHQgKiBgdHJ1ZWAgaWYgbWlzY2VsbGFuZW91cyBVUkxzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGxpbmtlZCwgYGZhbHNlYCBpZiB0aGV5IHNob3VsZCBub3QgYmUuXG5cdCAqL1xuXHR1cmxzIDogdHJ1ZSxcblx0XG5cdC8qKlxuXHQgKiBAY2ZnIHtCb29sZWFufSBlbWFpbFxuXHQgKiBcblx0ICogYHRydWVgIGlmIGVtYWlsIGFkZHJlc3NlcyBzaG91bGQgYmUgYXV0b21hdGljYWxseSBsaW5rZWQsIGBmYWxzZWAgaWYgdGhleSBzaG91bGQgbm90IGJlLlxuXHQgKi9cblx0ZW1haWwgOiB0cnVlLFxuXHRcblx0LyoqXG5cdCAqIEBjZmcge0Jvb2xlYW59IHR3aXR0ZXJcblx0ICogXG5cdCAqIGB0cnVlYCBpZiBUd2l0dGVyIGhhbmRsZXMgKFwiQGV4YW1wbGVcIikgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgbGlua2VkLCBgZmFsc2VgIGlmIHRoZXkgc2hvdWxkIG5vdCBiZS5cblx0ICovXG5cdHR3aXR0ZXIgOiB0cnVlLFxuXHRcblx0LyoqXG5cdCAqIEBjZmcge0Jvb2xlYW59IHN0cmlwUHJlZml4XG5cdCAqIFxuXHQgKiBgdHJ1ZWAgaWYgJ2h0dHA6Ly8nIG9yICdodHRwczovLycgYW5kL29yIHRoZSAnd3d3Licgc2hvdWxkIGJlIHN0cmlwcGVkIGZyb20gdGhlIGJlZ2lubmluZyBvZiBVUkwgbGlua3MnIHRleHRcblx0ICogaW4ge0BsaW5rIEF1dG9saW5rZXIubWF0Y2guVXJsIFVSTCBtYXRjaGVzfSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqIFxuXHQgKiBUT0RPOiBIYW5kbGUgdGhpcyBiZWZvcmUgYSBVUkwgTWF0Y2ggb2JqZWN0IGlzIGluc3RhbnRpYXRlZC5cblx0ICovXG5cdHN0cmlwUHJlZml4IDogdHJ1ZSxcblx0XG5cdFxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtSZWdFeHB9IG1hdGNoZXJSZWdleFxuXHQgKiBcblx0ICogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgVVJMcywgZW1haWwgYWRkcmVzc2VzLCBhbmQgVHdpdHRlciBoYW5kbGVzLlxuXHQgKiBcblx0ICogVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaGFzIHRoZSBmb2xsb3dpbmcgY2FwdHVyaW5nIGdyb3Vwczpcblx0ICogXG5cdCAqIDEuIEdyb3VwIHRoYXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBUd2l0dGVyIGhhbmRsZSBtYXRjaCAoaS5lLiBcXEBzb21lVHdpdHRlclVzZXIpLiBTaW1wbHkgY2hlY2sgZm9yIGl0cyBcblx0ICogICAgZXhpc3RlbmNlIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIFR3aXR0ZXIgaGFuZGxlIG1hdGNoLiBUaGUgbmV4dCBjb3VwbGUgb2YgY2FwdHVyaW5nIGdyb3VwcyBnaXZlIGluZm9ybWF0aW9uIFxuXHQgKiAgICBhYm91dCB0aGUgVHdpdHRlciBoYW5kbGUgbWF0Y2guXG5cdCAqIDIuIFRoZSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBiZWZvcmUgdGhlIFxcQHNpZ24gaW4gYSBUd2l0dGVyIGhhbmRsZS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGVyZSBhcmUgbm8gbG9va2JlaGluZHMgaW5cblx0ICogICAgSlMgcmVndWxhciBleHByZXNzaW9ucywgYW5kIGNhbiBiZSB1c2VkIHRvIHJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCBzdHJpbmcgaW4gYSByZXBsYWNlKCkuXG5cdCAqIDMuIFRoZSBUd2l0dGVyIGhhbmRsZSBpdHNlbGYgaW4gYSBUd2l0dGVyIG1hdGNoLiBJZiB0aGUgbWF0Y2ggaXMgJ0Bzb21lVHdpdHRlclVzZXInLCB0aGUgaGFuZGxlIGlzICdzb21lVHdpdHRlclVzZXInLlxuXHQgKiA0LiBHcm91cCB0aGF0IG1hdGNoZXMgYW4gZW1haWwgYWRkcmVzcy4gVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1hdGNoIGlzIGFuIGVtYWlsIGFkZHJlc3MsIGFzIHdlbGwgYXMgaG9sZGluZyB0aGUgZnVsbCBcblx0ICogICAgYWRkcmVzcy4gRXg6ICdtZUBteS5jb20nXG5cdCAqIDUuIEdyb3VwIHRoYXQgbWF0Y2hlcyBhIFVSTCBpbiB0aGUgaW5wdXQgdGV4dC4gRXg6ICdodHRwOi8vZ29vZ2xlLmNvbScsICd3d3cuZ29vZ2xlLmNvbScsIG9yIGp1c3QgJ2dvb2dsZS5jb20nLlxuXHQgKiAgICBUaGlzIGFsc28gaW5jbHVkZXMgYSBwYXRoLCB1cmwgcGFyYW1ldGVycywgb3IgaGFzaCBhbmNob3JzLiBFeDogZ29vZ2xlLmNvbS9wYXRoL3RvL2ZpbGU/cTE9MSZxMj0yI215QW5jaG9yXG5cdCAqIDYuIEdyb3VwIHRoYXQgbWF0Y2hlcyBhIHByb3RvY29sIFVSTCAoaS5lLiAnaHR0cDovL2dvb2dsZS5jb20nKS4gVGhpcyBpcyB1c2VkIHRvIG1hdGNoIHByb3RvY29sIFVSTHMgd2l0aCBqdXN0IGEgc2luZ2xlXG5cdCAqICAgIHdvcmQsIGxpa2UgJ2h0dHA6Ly9sb2NhbGhvc3QnLCB3aGVyZSB3ZSB3b24ndCBkb3VibGUgY2hlY2sgdGhhdCB0aGUgZG9tYWluIG5hbWUgaGFzIGF0IGxlYXN0IG9uZSAnLicgaW4gaXQuXG5cdCAqIDcuIEEgcHJvdG9jb2wtcmVsYXRpdmUgKCcvLycpIG1hdGNoIGZvciB0aGUgY2FzZSBvZiBhICd3d3cuJyBwcmVmaXhlZCBVUkwuIFdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nIGlmIGl0IGlzIG5vdCBhIFxuXHQgKiAgICBwcm90b2NvbC1yZWxhdGl2ZSBtYXRjaC4gV2UgbmVlZCB0byBrbm93IHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSAnLy8nIGluIG9yZGVyIHRvIGRldGVybWluZSBpZiBpdCBpcyBhIHZhbGlkIG1hdGNoXG5cdCAqICAgIG9yIHRoZSAvLyB3YXMgaW4gYSBzdHJpbmcgd2UgZG9uJ3Qgd2FudCB0byBhdXRvLWxpbmsuXG5cdCAqIDguIEEgcHJvdG9jb2wtcmVsYXRpdmUgKCcvLycpIG1hdGNoIGZvciB0aGUgY2FzZSBvZiBhIGtub3duIFRMRCBwcmVmaXhlZCBVUkwuIFdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nIGlmIGl0IGlzIG5vdCBhIFxuXHQgKiAgICBwcm90b2NvbC1yZWxhdGl2ZSBtYXRjaC4gU2VlICM2IGZvciBtb3JlIGluZm8uIFxuXHQgKi9cblx0bWF0Y2hlclJlZ2V4IDogKGZ1bmN0aW9uKCkge1xuXHRcdHZhciB0d2l0dGVyUmVnZXggPSAvKF58W15cXHddKUAoXFx3ezEsMTV9KS8sICAgICAgICAgICAgICAvLyBGb3IgbWF0Y2hpbmcgYSB0d2l0dGVyIGhhbmRsZS4gRXg6IEBncmVnb3J5X2phY29ic1xuXHRcdCAgICBcblx0XHQgICAgZW1haWxSZWdleCA9IC8oPzpbXFwtOzomPVxcK1xcJCxcXHdcXC5dK0ApLywgICAgICAgICAgICAgLy8gc29tZXRoaW5nQCBmb3IgZW1haWwgYWRkcmVzc2VzIChhLmsuYS4gbG9jYWwtcGFydClcblx0XHQgICAgXG5cdFx0ICAgIHByb3RvY29sUmVnZXggPSAvKD86W0EtWmEtel1bLS4rQS1aYS16MC05XSs6KD8hW0EtWmEtel1bLS4rQS1aYS16MC05XSs6XFwvXFwvKSg/IVxcZCtcXC8/KSg/OlxcL1xcLyk/KS8sICAvLyBtYXRjaCBwcm90b2NvbCwgYWxsb3cgaW4gZm9ybWF0IFwiaHR0cDovL1wiIG9yIFwibWFpbHRvOlwiLiBIb3dldmVyLCBkbyBub3QgbWF0Y2ggdGhlIGZpcnN0IHBhcnQgb2Ygc29tZXRoaW5nIGxpa2UgJ2xpbms6aHR0cDovL3d3dy5nb29nbGUuY29tJyAoaS5lLiBkb24ndCBtYXRjaCBcImxpbms6XCIpLiBBbHNvLCBtYWtlIHN1cmUgd2UgZG9uJ3QgaW50ZXJwcmV0ICdnb29nbGUuY29tOjgwMDAnIGFzIGlmICdnb29nbGUuY29tJyB3YXMgYSBwcm90b2NvbCBoZXJlIChpLmUuIGlnbm9yZSBhIHRyYWlsaW5nIHBvcnQgbnVtYmVyIGluIHRoaXMgcmVnZXgpXG5cdFx0ICAgIHd3d1JlZ2V4ID0gLyg/Ond3d1xcLikvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRpbmcgd2l0aCAnd3d3Lidcblx0XHQgICAgZG9tYWluTmFtZVJlZ2V4ID0gL1tBLVphLXowLTlcXC5cXC1dKltBLVphLXowLTlcXC1dLywgIC8vIGFueXRoaW5nIGxvb2tpbmcgYXQgYWxsIGxpa2UgYSBkb21haW4sIG5vbi11bmljb2RlIGRvbWFpbnMsIG5vdCBlbmRpbmcgaW4gYSBwZXJpb2Rcblx0XHQgICAgdGxkUmVnZXggPSAvXFwuKD86aW50ZXJuYXRpb25hbHxjb25zdHJ1Y3Rpb258Y29udHJhY3RvcnN8ZW50ZXJwcmlzZXN8cGhvdG9ncmFwaHl8cHJvZHVjdGlvbnN8Zm91bmRhdGlvbnxpbW1vYmlsaWVufGluZHVzdHJpZXN8bWFuYWdlbWVudHxwcm9wZXJ0aWVzfHRlY2hub2xvZ3l8Y2hyaXN0bWFzfGNvbW11bml0eXxkaXJlY3Rvcnl8ZWR1Y2F0aW9ufGVxdWlwbWVudHxpbnN0aXR1dGV8bWFya2V0aW5nfHNvbHV0aW9uc3x2YWNhdGlvbnN8YmFyZ2FpbnN8Ym91dGlxdWV8YnVpbGRlcnN8Y2F0ZXJpbmd8Y2xlYW5pbmd8Y2xvdGhpbmd8Y29tcHV0ZXJ8ZGVtb2NyYXR8ZGlhbW9uZHN8Z3JhcGhpY3N8aG9sZGluZ3N8bGlnaHRpbmd8cGFydG5lcnN8cGx1bWJpbmd8c3VwcGxpZXN8dHJhaW5pbmd8dmVudHVyZXN8YWNhZGVteXxjYXJlZXJzfGNvbXBhbnl8Y3J1aXNlc3xkb21haW5zfGV4cG9zZWR8ZmxpZ2h0c3xmbG9yaXN0fGdhbGxlcnl8Z3VpdGFyc3xob2xpZGF5fGtpdGNoZW58bmV1c3Rhcnxva2luYXdhfHJlY2lwZXN8cmVudGFsc3xyZXZpZXdzfHNoaWtzaGF8c2luZ2xlc3xzdXBwb3J0fHN5c3RlbXN8YWdlbmN5fGJlcmxpbnxjYW1lcmF8Y2VudGVyfGNvZmZlZXxjb25kb3N8ZGF0aW5nfGVzdGF0ZXxldmVudHN8ZXhwZXJ0fGZ1dGJvbHxrYXVmZW58bHV4dXJ5fG1haXNvbnxtb25hc2h8bXVzZXVtfG5hZ295YXxwaG90b3N8cmVwYWlyfHJlcG9ydHxzb2NpYWx8c3VwcGx5fHRhdHRvb3x0aWVuZGF8dHJhdmVsfHZpYWplc3x2aWxsYXN8dmlzaW9ufHZvdGluZ3x2b3lhZ2V8YWN0b3J8YnVpbGR8Y2FyZHN8Y2hlYXB8Y29kZXN8ZGFuY2V8ZW1haWx8Z2xhc3N8aG91c2V8bWFuZ298bmluamF8cGFydHN8cGhvdG98c2hvZXN8c29sYXJ8dG9kYXl8dG9reW98dG9vbHN8d2F0Y2h8d29ya3N8YWVyb3xhcnBhfGFzaWF8YmVzdHxiaWtlfGJsdWV8YnV6enxjYW1wfGNsdWJ8Y29vbHxjb29wfGZhcm18ZmlzaHxnaWZ0fGd1cnV8aW5mb3xqb2JzfGtpd2l8a3JlZHxsYW5kfGxpbW98bGlua3xtZW51fG1vYml8bW9kYXxuYW1lfHBpY3N8cGlua3xwb3N0fHFwb258cmljaHxydWhyfHNleHl8dGlwc3x2b3RlfHZvdG98d2FuZ3x3aWVufHdpa2l8em9uZXxiYXJ8YmlkfGJpenxjYWJ8Y2F0fGNlb3xjb218ZWR1fGdvdnxpbnR8a2ltfG1pbHxuZXR8b25sfG9yZ3xwcm98cHVifHJlZHx0ZWx8dW5vfHdlZHx4eHh8eHl6fGFjfGFkfGFlfGFmfGFnfGFpfGFsfGFtfGFufGFvfGFxfGFyfGFzfGF0fGF1fGF3fGF4fGF6fGJhfGJifGJkfGJlfGJmfGJnfGJofGJpfGJqfGJtfGJufGJvfGJyfGJzfGJ0fGJ2fGJ3fGJ5fGJ6fGNhfGNjfGNkfGNmfGNnfGNofGNpfGNrfGNsfGNtfGNufGNvfGNyfGN1fGN2fGN3fGN4fGN5fGN6fGRlfGRqfGRrfGRtfGRvfGR6fGVjfGVlfGVnfGVyfGVzfGV0fGV1fGZpfGZqfGZrfGZtfGZvfGZyfGdhfGdifGdkfGdlfGdmfGdnfGdofGdpfGdsfGdtfGdufGdwfGdxfGdyfGdzfGd0fGd1fGd3fGd5fGhrfGhtfGhufGhyfGh0fGh1fGlkfGllfGlsfGltfGlufGlvfGlxfGlyfGlzfGl0fGplfGptfGpvfGpwfGtlfGtnfGtofGtpfGttfGtufGtwfGtyfGt3fGt5fGt6fGxhfGxifGxjfGxpfGxrfGxyfGxzfGx0fGx1fGx2fGx5fG1hfG1jfG1kfG1lfG1nfG1ofG1rfG1sfG1tfG1ufG1vfG1wfG1xfG1yfG1zfG10fG11fG12fG13fG14fG15fG16fG5hfG5jfG5lfG5mfG5nfG5pfG5sfG5vfG5wfG5yfG51fG56fG9tfHBhfHBlfHBmfHBnfHBofHBrfHBsfHBtfHBufHByfHBzfHB0fHB3fHB5fHFhfHJlfHJvfHJzfHJ1fHJ3fHNhfHNifHNjfHNkfHNlfHNnfHNofHNpfHNqfHNrfHNsfHNtfHNufHNvfHNyfHN0fHN1fHN2fHN4fHN5fHN6fHRjfHRkfHRmfHRnfHRofHRqfHRrfHRsfHRtfHRufHRvfHRwfHRyfHR0fHR2fHR3fHR6fHVhfHVnfHVrfHVzfHV5fHV6fHZhfHZjfHZlfHZnfHZpfHZufHZ1fHdmfHdzfHllfHl0fHphfHptfHp3KVxcYi8sICAgLy8gbWF0Y2ggb3VyIGtub3duIHRvcCBsZXZlbCBkb21haW5zIChUTERzKVxuXHRcdCAgICBcblx0XHQgICAgLy8gQWxsb3cgb3B0aW9uYWwgcGF0aCwgcXVlcnkgc3RyaW5nLCBhbmQgaGFzaCBhbmNob3IsIG5vdCBlbmRpbmcgaW4gdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOiBcIj8hOiwuO1wiXG5cdFx0ICAgIC8vIGh0dHA6Ly9ibG9nLmNvZGluZ2hvcnJvci5jb20vdGhlLXByb2JsZW0td2l0aC11cmxzL1xuXHRcdCAgICB1cmxTdWZmaXhSZWdleCA9IC9bXFwtQS1aYS16MC05KyZAI1xcLyU9fl8oKXwnJCpcXFtcXF0/ITosLjtdKltcXC1BLVphLXowLTkrJkAjXFwvJT1+XygpfCckKlxcW1xcXV0vO1xuXHRcdFxuXHRcdHJldHVybiBuZXcgUmVnRXhwKCBbXG5cdFx0XHQnKCcsICAvLyAqKiogQ2FwdHVyaW5nIGdyb3VwICQxLCB3aGljaCBjYW4gYmUgdXNlZCB0byBjaGVjayBmb3IgYSB0d2l0dGVyIGhhbmRsZSBtYXRjaC4gVXNlIGdyb3VwICQzIGZvciB0aGUgYWN0dWFsIHR3aXR0ZXIgaGFuZGxlIHRob3VnaC4gJDIgbWF5IGJlIHVzZWQgdG8gcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIHN0cmluZyBpbiBhIHJlcGxhY2UoKSBcblx0XHRcdFx0Ly8gKioqIENhcHR1cmluZyBncm91cCAkMiwgd2hpY2ggbWF0Y2hlcyB0aGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSAnQCcgc2lnbiAobmVlZGVkIGJlY2F1c2Ugb2Ygbm8gbG9va2JlaGluZHMpLCBhbmQgXG5cdFx0XHRcdC8vICoqKiBDYXB0dXJpbmcgZ3JvdXAgJDMsIHdoaWNoIG1hdGNoZXMgdGhlIGFjdHVhbCB0d2l0dGVyIGhhbmRsZVxuXHRcdFx0XHR0d2l0dGVyUmVnZXguc291cmNlLFxuXHRcdFx0JyknLFxuXHRcdFx0XG5cdFx0XHQnfCcsXG5cdFx0XHRcblx0XHRcdCcoJywgIC8vICoqKiBDYXB0dXJpbmcgZ3JvdXAgJDQsIHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGFuIGVtYWlsIG1hdGNoXG5cdFx0XHRcdGVtYWlsUmVnZXguc291cmNlLFxuXHRcdFx0XHRkb21haW5OYW1lUmVnZXguc291cmNlLFxuXHRcdFx0XHR0bGRSZWdleC5zb3VyY2UsXG5cdFx0XHQnKScsXG5cdFx0XHRcblx0XHRcdCd8Jyxcblx0XHRcdFxuXHRcdFx0JygnLCAgLy8gKioqIENhcHR1cmluZyBncm91cCAkNSwgd2hpY2ggaXMgdXNlZCB0byBtYXRjaCBhIFVSTFxuXHRcdFx0XHQnKD86JywgLy8gcGFyZW5zIHRvIGNvdmVyIG1hdGNoIGZvciBwcm90b2NvbCAob3B0aW9uYWwpLCBhbmQgZG9tYWluXG5cdFx0XHRcdFx0JygnLCAgLy8gKioqIENhcHR1cmluZyBncm91cCAkNiwgZm9yIGEgcHJvdG9jb2wtcHJlZml4ZWQgdXJsIChleDogaHR0cDovL2dvb2dsZS5jb20pXG5cdFx0XHRcdFx0XHRwcm90b2NvbFJlZ2V4LnNvdXJjZSxcblx0XHRcdFx0XHRcdGRvbWFpbk5hbWVSZWdleC5zb3VyY2UsXG5cdFx0XHRcdFx0JyknLFxuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdCd8Jyxcblx0XHRcdFx0XHRcblx0XHRcdFx0XHQnKD86JywgIC8vIG5vbi1jYXB0dXJpbmcgcGFyZW4gZm9yIGEgJ3d3dy4nIHByZWZpeGVkIHVybCAoZXg6IHd3dy5nb29nbGUuY29tKVxuXHRcdFx0XHRcdFx0JyguPy8vKT8nLCAgLy8gKioqIENhcHR1cmluZyBncm91cCAkNyBmb3IgYW4gb3B0aW9uYWwgcHJvdG9jb2wtcmVsYXRpdmUgVVJMLiBNdXN0IGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyBvciBzdGFydCB3aXRoIGEgbm9uLXdvcmQgY2hhcmFjdGVyXG5cdFx0XHRcdFx0XHR3d3dSZWdleC5zb3VyY2UsXG5cdFx0XHRcdFx0XHRkb21haW5OYW1lUmVnZXguc291cmNlLFxuXHRcdFx0XHRcdCcpJyxcblx0XHRcdFx0XHRcblx0XHRcdFx0XHQnfCcsXG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0Jyg/OicsICAvLyBub24tY2FwdHVyaW5nIHBhcmVuIGZvciBrbm93biBhIFRMRCB1cmwgKGV4OiBnb29nbGUuY29tKVxuXHRcdFx0XHRcdFx0JyguPy8vKT8nLCAgLy8gKioqIENhcHR1cmluZyBncm91cCAkOCBmb3IgYW4gb3B0aW9uYWwgcHJvdG9jb2wtcmVsYXRpdmUgVVJMLiBNdXN0IGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyBvciBzdGFydCB3aXRoIGEgbm9uLXdvcmQgY2hhcmFjdGVyXG5cdFx0XHRcdFx0XHRkb21haW5OYW1lUmVnZXguc291cmNlLFxuXHRcdFx0XHRcdFx0dGxkUmVnZXguc291cmNlLFxuXHRcdFx0XHRcdCcpJyxcblx0XHRcdFx0JyknLFxuXHRcdFx0XHRcblx0XHRcdFx0Jyg/OicgKyB1cmxTdWZmaXhSZWdleC5zb3VyY2UgKyAnKT8nLCAgLy8gbWF0Y2ggZm9yIHBhdGgsIHF1ZXJ5IHN0cmluZywgYW5kL29yIGhhc2ggYW5jaG9yIC0gb3B0aW9uYWxcblx0XHRcdCcpJ1xuXHRcdF0uam9pbiggXCJcIiApLCAnZ2knICk7XG5cdH0gKSgpLFxuXHRcblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBjaGFyQmVmb3JlUHJvdG9jb2xSZWxNYXRjaFJlZ2V4XG5cdCAqIFxuXHQgKiBUaGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gcmV0cmlldmUgdGhlIGNoYXJhY3RlciBiZWZvcmUgYSBwcm90b2NvbC1yZWxhdGl2ZSBVUkwgbWF0Y2guXG5cdCAqIFxuXHQgKiBUaGlzIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUge0BsaW5rICNtYXRjaGVyUmVnZXh9LCB3aGljaCBuZWVkcyB0byBncmFiIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIGEgcHJvdG9jb2wtcmVsYXRpdmVcblx0ICogJy8vJyBkdWUgdG8gdGhlIGxhY2sgb2YgYSBuZWdhdGl2ZSBsb29rLWJlaGluZCBpbiBKYXZhU2NyaXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMuIFRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBtYXRjaCBpcyBzdHJpcHBlZFxuXHQgKiBmcm9tIHRoZSBVUkwuXG5cdCAqL1xuXHRjaGFyQmVmb3JlUHJvdG9jb2xSZWxNYXRjaFJlZ2V4IDogL14oLik/XFwvXFwvLyxcblx0XG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcHJvcGVydHkge0F1dG9saW5rZXIuTWF0Y2hWYWxpZGF0b3J9IG1hdGNoVmFsaWRhdG9yXG5cdCAqIFxuXHQgKiBUaGUgTWF0Y2hWYWxpZGF0b3Igb2JqZWN0LCB1c2VkIHRvIGZpbHRlciBvdXQgYW55IGZhbHNlIHBvc2l0aXZlcyBmcm9tIHRoZSB7QGxpbmsgI21hdGNoZXJSZWdleH0uIFNlZVxuXHQgKiB7QGxpbmsgQXV0b2xpbmtlci5NYXRjaFZhbGlkYXRvcn0gZm9yIGRldGFpbHMuXG5cdCAqL1xuXHRcblx0XG5cdC8qKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICogQHBhcmFtIHtPYmplY3R9IFtjZmddIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBbmNob3JUYWdCdWlsZGVyIGluc3RhbmNlLCBzcGVjaWZpZWQgaW4gYW4gT2JqZWN0IChtYXApLlxuXHQgKi9cblx0Y29uc3RydWN0b3IgOiBmdW5jdGlvbiggY2ZnICkge1xuXHRcdEF1dG9saW5rZXIuVXRpbC5hc3NpZ24oIHRoaXMsIGNmZyApO1xuXHRcblx0XHR0aGlzLm1hdGNoVmFsaWRhdG9yID0gbmV3IEF1dG9saW5rZXIuTWF0Y2hWYWxpZGF0b3IoKTtcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogUGFyc2VzIHRoZSBpbnB1dCBgdGV4dGAgdG8gc2VhcmNoIGZvciBVUkxzL2VtYWlscy9Ud2l0dGVyIGhhbmRsZXMsIGFuZCBjYWxscyB0aGUgYHJlcGxhY2VGbmBcblx0ICogdG8gYWxsb3cgcmVwbGFjZW1lbnRzIG9mIHRoZSBtYXRjaGVzLiBSZXR1cm5zIHRoZSBgdGV4dGAgd2l0aCBtYXRjaGVzIHJlcGxhY2VkLlxuXHQgKiBcblx0ICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHRleHQgdG8gc2VhcmNoIGFuZCByZXBhY2UgbWF0Y2hlcyBpbi5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gcmVwbGFjZUZuIFRoZSBpdGVyYXRvciBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHJlcGxhY2VtZW50cy4gVGhlIGZ1bmN0aW9uIHRha2VzIGFcblx0ICogICBzaW5nbGUgYXJndW1lbnQsIGEge0BsaW5rIEF1dG9saW5rZXIubWF0Y2guTWF0Y2h9IG9iamVjdCwgYW5kIHNob3VsZCByZXR1cm4gdGhlIHRleHQgdGhhdCBzaG91bGRcblx0ICogICBtYWtlIHRoZSByZXBsYWNlbWVudC5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0T2JqPXdpbmRvd10gVGhlIGNvbnRleHQgb2JqZWN0IChcInNjb3BlXCIpIHRvIHJ1biB0aGUgYHJlcGxhY2VGbmAgaW4uXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdHJlcGxhY2UgOiBmdW5jdGlvbiggdGV4dCwgcmVwbGFjZUZuLCBjb250ZXh0T2JqICkge1xuXHRcdHZhciBtZSA9IHRoaXM7ICAvLyBmb3IgY2xvc3VyZVxuXHRcdFxuXHRcdHJldHVybiB0ZXh0LnJlcGxhY2UoIHRoaXMubWF0Y2hlclJlZ2V4LCBmdW5jdGlvbiggbWF0Y2hTdHIsICQxLCAkMiwgJDMsICQ0LCAkNSwgJDYsICQ3LCAkOCApIHtcblx0XHRcdHZhciBtYXRjaERlc2NPYmogPSBtZS5wcm9jZXNzQ2FuZGlkYXRlTWF0Y2goIG1hdGNoU3RyLCAkMSwgJDIsICQzLCAkNCwgJDUsICQ2LCAkNywgJDggKTsgIC8vIFwibWF0Y2ggZGVzY3JpcHRpb25cIiBvYmplY3Rcblx0XHRcdFxuXHRcdFx0Ly8gUmV0dXJuIG91dCB3aXRoIG5vIGNoYW5nZXMgZm9yIG1hdGNoIHR5cGVzIHRoYXQgYXJlIGRpc2FibGVkICh1cmwsIGVtYWlsLCB0d2l0dGVyKSwgb3IgZm9yIG1hdGNoZXMgdGhhdCBhcmUgXG5cdFx0XHQvLyBpbnZhbGlkIChmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGUgbWF0Y2hlclJlZ2V4LCB3aGljaCBjYW4ndCB1c2UgbG9vay1iZWhpbmRzIHNpbmNlIHRoZXkgYXJlIHVuYXZhaWxhYmxlIGluIEpTKS5cblx0XHRcdGlmKCAhbWF0Y2hEZXNjT2JqICkge1xuXHRcdFx0XHRyZXR1cm4gbWF0Y2hTdHI7XG5cdFx0XHRcdFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gR2VuZXJhdGUgcmVwbGFjZW1lbnQgdGV4dCBmb3IgdGhlIG1hdGNoIGZyb20gdGhlIGByZXBsYWNlRm5gXG5cdFx0XHRcdHZhciByZXBsYWNlU3RyID0gcmVwbGFjZUZuLmNhbGwoIGNvbnRleHRPYmosIG1hdGNoRGVzY09iai5tYXRjaCApO1xuXHRcdFx0XHRyZXR1cm4gbWF0Y2hEZXNjT2JqLnByZWZpeFN0ciArIHJlcGxhY2VTdHIgKyBtYXRjaERlc2NPYmouc3VmZml4U3RyO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogUHJvY2Vzc2VzIGEgY2FuZGlkYXRlIG1hdGNoIGZyb20gdGhlIHtAbGluayAjbWF0Y2hlclJlZ2V4fS4gXG5cdCAqIFxuXHQgKiBOb3QgYWxsIG1hdGNoZXMgZm91bmQgYnkgdGhlIHJlZ2V4IGFyZSBhY3R1YWwgVVJML2VtYWlsL1R3aXR0ZXIgbWF0Y2hlcywgYXMgZGV0ZXJtaW5lZCBieSB0aGUge0BsaW5rICNtYXRjaFZhbGlkYXRvcn0uIEluXG5cdCAqIHRoaXMgY2FzZSwgdGhlIG1ldGhvZCByZXR1cm5zIGBudWxsYC4gT3RoZXJ3aXNlLCBhIHZhbGlkIE9iamVjdCB3aXRoIGBwcmVmaXhTdHJgLCBgbWF0Y2hgLCBhbmQgYHN1ZmZpeFN0cmAgaXMgcmV0dXJuZWQuXG5cdCAqIFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gbWF0Y2hTdHIgVGhlIGZ1bGwgbWF0Y2ggdGhhdCB3YXMgZm91bmQgYnkgdGhlIHtAbGluayAjbWF0Y2hlclJlZ2V4fS5cblx0ICogQHBhcmFtIHtTdHJpbmd9IHR3aXR0ZXJNYXRjaCBUaGUgbWF0Y2hlZCB0ZXh0IG9mIGEgVHdpdHRlciBoYW5kbGUsIGlmIHRoZSBtYXRjaCBpcyBhIFR3aXR0ZXIgbWF0Y2guXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0d2l0dGVySGFuZGxlUHJlZml4V2hpdGVzcGFjZUNoYXIgVGhlIHdoaXRlc3BhY2UgY2hhciBiZWZvcmUgdGhlIEAgc2lnbiBpbiBhIFR3aXR0ZXIgaGFuZGxlIG1hdGNoLiBUaGlzIFxuXHQgKiAgIGlzIG5lZWRlZCBiZWNhdXNlIG9mIG5vIGxvb2tiZWhpbmRzIGluIEpTIHJlZ2V4ZXMsIGFuZCBpcyBuZWVkIHRvIHJlLWluY2x1ZGUgdGhlIGNoYXJhY3RlciBmb3IgdGhlIGFuY2hvciB0YWcgcmVwbGFjZW1lbnQuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0d2l0dGVySGFuZGxlIFRoZSBhY3R1YWwgVHdpdHRlciB1c2VyIChpLmUgdGhlIHdvcmQgYWZ0ZXIgdGhlIEAgc2lnbiBpbiBhIFR3aXR0ZXIgbWF0Y2gpLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZW1haWxBZGRyZXNzTWF0Y2ggVGhlIG1hdGNoZWQgZW1haWwgYWRkcmVzcyBmb3IgYW4gZW1haWwgYWRkcmVzcyBtYXRjaC5cblx0ICogQHBhcmFtIHtTdHJpbmd9IHVybE1hdGNoIFRoZSBtYXRjaGVkIFVSTCBzdHJpbmcgZm9yIGEgVVJMIG1hdGNoLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gcHJvdG9jb2xVcmxNYXRjaCBUaGUgbWF0Y2ggVVJMIHN0cmluZyBmb3IgYSBwcm90b2NvbCBtYXRjaC4gRXg6ICdodHRwOi8veWFob28uY29tJy4gVGhpcyBpcyB1c2VkIHRvIG1hdGNoXG5cdCAqICAgc29tZXRoaW5nIGxpa2UgJ2h0dHA6Ly9sb2NhbGhvc3QnLCB3aGVyZSB3ZSB3b24ndCBkb3VibGUgY2hlY2sgdGhhdCB0aGUgZG9tYWluIG5hbWUgaGFzIGF0IGxlYXN0IG9uZSAnLicgaW4gaXQuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB3d3dQcm90b2NvbFJlbGF0aXZlTWF0Y2ggVGhlICcvLycgZm9yIGEgcHJvdG9jb2wtcmVsYXRpdmUgbWF0Y2ggZnJvbSBhICd3d3cnIHVybCwgd2l0aCB0aGUgY2hhcmFjdGVyIHRoYXQgXG5cdCAqICAgY29tZXMgYmVmb3JlIHRoZSAnLy8nLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdGxkUHJvdG9jb2xSZWxhdGl2ZU1hdGNoIFRoZSAnLy8nIGZvciBhIHByb3RvY29sLXJlbGF0aXZlIG1hdGNoIGZyb20gYSBUTEQgKHRvcCBsZXZlbCBkb21haW4pIG1hdGNoLCB3aXRoIFxuXHQgKiAgIHRoZSBjaGFyYWN0ZXIgdGhhdCBjb21lcyBiZWZvcmUgdGhlICcvLycuXG5cdCAqICAgXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSBcIm1hdGNoIGRlc2NyaXB0aW9uIG9iamVjdFwiLiBUaGlzIHdpbGwgYmUgYG51bGxgIGlmIHRoZSBtYXRjaCB3YXMgaW52YWxpZCwgb3IgaWYgYSBtYXRjaCB0eXBlIGlzIGRpc2FibGVkLlxuXHQgKiAgIE90aGVyd2lzZSwgdGhpcyB3aWxsIGJlIGFuIE9iamVjdCAobWFwKSB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcblx0ICogQHJldHVybiB7U3RyaW5nfSByZXR1cm4ucHJlZml4U3RyIFRoZSBjaGFyKHMpIHRoYXQgc2hvdWxkIGJlIHByZXBlbmRlZCB0byB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nLiBUaGVzZSBhcmUgY2hhcihzKSB0aGF0XG5cdCAqICAgd2VyZSBuZWVkZWQgdG8gYmUgaW5jbHVkZWQgZnJvbSB0aGUgcmVnZXggbWF0Y2ggdGhhdCB3ZXJlIGlnbm9yZWQgYnkgcHJvY2Vzc2luZyBjb2RlLCBhbmQgc2hvdWxkIGJlIHJlLWluc2VydGVkIGludG8gXG5cdCAqICAgdGhlIHJlcGxhY2VtZW50IHN0cmVhbS5cblx0ICogQHJldHVybiB7U3RyaW5nfSByZXR1cm4uc3VmZml4U3RyIFRoZSBjaGFyKHMpIHRoYXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSByZXBsYWNlbWVudCBzdHJpbmcuIFRoZXNlIGFyZSBjaGFyKHMpIHRoYXRcblx0ICogICB3ZXJlIG5lZWRlZCB0byBiZSBpbmNsdWRlZCBmcm9tIHRoZSByZWdleCBtYXRjaCB0aGF0IHdlcmUgaWdub3JlZCBieSBwcm9jZXNzaW5nIGNvZGUsIGFuZCBzaG91bGQgYmUgcmUtaW5zZXJ0ZWQgaW50byBcblx0ICogICB0aGUgcmVwbGFjZW1lbnQgc3RyZWFtLlxuXHQgKiBAcmV0dXJuIHtBdXRvbGlua2VyLm1hdGNoLk1hdGNofSByZXR1cm4ubWF0Y2ggVGhlIE1hdGNoIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG1hdGNoIHRoYXQgd2FzIGZvdW5kLlxuXHQgKi9cblx0cHJvY2Vzc0NhbmRpZGF0ZU1hdGNoIDogZnVuY3Rpb24oIFxuXHRcdG1hdGNoU3RyLCB0d2l0dGVyTWF0Y2gsIHR3aXR0ZXJIYW5kbGVQcmVmaXhXaGl0ZXNwYWNlQ2hhciwgdHdpdHRlckhhbmRsZSwgXG5cdFx0ZW1haWxBZGRyZXNzTWF0Y2gsIHVybE1hdGNoLCBwcm90b2NvbFVybE1hdGNoLCB3d3dQcm90b2NvbFJlbGF0aXZlTWF0Y2gsIHRsZFByb3RvY29sUmVsYXRpdmVNYXRjaFxuXHQpIHtcblx0XHQvLyBOb3RlOiBUaGUgYG1hdGNoU3RyYCB2YXJpYWJsZSB3aWwgYmUgZml4ZWQgdXAgdG8gcmVtb3ZlIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZCAod2hpY2ggd2lsbCBcblx0XHQvLyBiZSBhZGRlZCB0byBgcHJlZml4U3RyYCBhbmQgYHN1ZmZpeFN0cmApLlxuXHRcdFxuXHRcdHZhciBwcm90b2NvbFJlbGF0aXZlTWF0Y2ggPSB3d3dQcm90b2NvbFJlbGF0aXZlTWF0Y2ggfHwgdGxkUHJvdG9jb2xSZWxhdGl2ZU1hdGNoLFxuXHRcdCAgICBtYXRjaCwgIC8vIFdpbGwgYmUgYW4gQXV0b2xpbmtlci5tYXRjaC5NYXRjaCBvYmplY3Rcblx0XHQgICAgXG5cdFx0ICAgIHByZWZpeFN0ciA9IFwiXCIsICAgICAgIC8vIEEgc3RyaW5nIHRvIHVzZSB0byBwcmVmaXggdGhlIGFuY2hvciB0YWcgdGhhdCBpcyBjcmVhdGVkLiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIFR3aXR0ZXIgaGFuZGxlIG1hdGNoXG5cdFx0ICAgIHN1ZmZpeFN0ciA9IFwiXCI7ICAgICAgIC8vIEEgc3RyaW5nIHRvIHN1ZmZpeCB0aGUgYW5jaG9yIHRhZyB0aGF0IGlzIGNyZWF0ZWQuIFRoaXMgaXMgdXNlZCBpZiB0aGVyZSBpcyBhIHRyYWlsaW5nIHBhcmVudGhlc2lzIHRoYXQgc2hvdWxkIG5vdCBiZSBhdXRvLWxpbmtlZC5cblx0XHQgICAgXG5cdFx0XG5cdFx0Ly8gUmV0dXJuIG91dCB3aXRoIGBudWxsYCBmb3IgbWF0Y2ggdHlwZXMgdGhhdCBhcmUgZGlzYWJsZWQgKHVybCwgZW1haWwsIHR3aXR0ZXIpLCBvciBmb3IgbWF0Y2hlcyB0aGF0IGFyZSBcblx0XHQvLyBpbnZhbGlkIChmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGUgbWF0Y2hlclJlZ2V4LCB3aGljaCBjYW4ndCB1c2UgbG9vay1iZWhpbmRzIHNpbmNlIHRoZXkgYXJlIHVuYXZhaWxhYmxlIGluIEpTKS5cblx0XHRpZihcblx0XHRcdCggdHdpdHRlck1hdGNoICYmICF0aGlzLnR3aXR0ZXIgKSB8fCAoIGVtYWlsQWRkcmVzc01hdGNoICYmICF0aGlzLmVtYWlsICkgfHwgKCB1cmxNYXRjaCAmJiAhdGhpcy51cmxzICkgfHxcblx0XHRcdCF0aGlzLm1hdGNoVmFsaWRhdG9yLmlzVmFsaWRNYXRjaCggdXJsTWF0Y2gsIHByb3RvY29sVXJsTWF0Y2gsIHByb3RvY29sUmVsYXRpdmVNYXRjaCApIFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIEhhbmRsZSBhIGNsb3NpbmcgcGFyZW50aGVzaXMgYXQgdGhlIGVuZCBvZiB0aGUgbWF0Y2gsIGFuZCBleGNsdWRlIGl0IGlmIHRoZXJlIGlzIG5vdCBhIG1hdGNoaW5nIG9wZW4gcGFyZW50aGVzaXNcblx0XHQvLyBpbiB0aGUgbWF0Y2ggaXRzZWxmLiBcblx0XHRpZiggdGhpcy5tYXRjaEhhc1VuYmFsYW5jZWRDbG9zaW5nUGFyZW4oIG1hdGNoU3RyICkgKSB7XG5cdFx0XHRtYXRjaFN0ciA9IG1hdGNoU3RyLnN1YnN0ciggMCwgbWF0Y2hTdHIubGVuZ3RoIC0gMSApOyAgLy8gcmVtb3ZlIHRoZSB0cmFpbGluZyBcIilcIlxuXHRcdFx0c3VmZml4U3RyID0gXCIpXCI7ICAvLyB0aGlzIHdpbGwgYmUgYWRkZWQgYWZ0ZXIgdGhlIGdlbmVyYXRlZCA8YT4gdGFnXG5cdFx0fVxuXHRcdFxuXHRcdFxuXHRcdGlmKCBlbWFpbEFkZHJlc3NNYXRjaCApIHtcblx0XHRcdG1hdGNoID0gbmV3IEF1dG9saW5rZXIubWF0Y2guRW1haWwoIHsgbWF0Y2hlZFRleHQ6IG1hdGNoU3RyLCBlbWFpbDogZW1haWxBZGRyZXNzTWF0Y2ggfSApO1xuXHRcdFx0XG5cdFx0fSBlbHNlIGlmKCB0d2l0dGVyTWF0Y2ggKSB7XG5cdFx0XHQvLyBmaXggdXAgdGhlIGBtYXRjaFN0cmAgaWYgdGhlcmUgd2FzIGEgcHJlY2VkaW5nIHdoaXRlc3BhY2UgY2hhciwgd2hpY2ggd2FzIG5lZWRlZCB0byBkZXRlcm1pbmUgdGhlIG1hdGNoIFxuXHRcdFx0Ly8gaXRzZWxmIChzaW5jZSB0aGVyZSBhcmUgbm8gbG9vay1iZWhpbmRzIGluIEpTIHJlZ2V4ZXMpXG5cdFx0XHRpZiggdHdpdHRlckhhbmRsZVByZWZpeFdoaXRlc3BhY2VDaGFyICkge1xuXHRcdFx0XHRwcmVmaXhTdHIgPSB0d2l0dGVySGFuZGxlUHJlZml4V2hpdGVzcGFjZUNoYXI7XG5cdFx0XHRcdG1hdGNoU3RyID0gbWF0Y2hTdHIuc2xpY2UoIDEgKTsgIC8vIHJlbW92ZSB0aGUgcHJlZml4ZWQgd2hpdGVzcGFjZSBjaGFyIGZyb20gdGhlIG1hdGNoXG5cdFx0XHR9XG5cdFx0XHRtYXRjaCA9IG5ldyBBdXRvbGlua2VyLm1hdGNoLlR3aXR0ZXIoIHsgbWF0Y2hlZFRleHQ6IG1hdGNoU3RyLCB0d2l0dGVySGFuZGxlOiB0d2l0dGVySGFuZGxlIH0gKTtcblx0XHRcdFxuXHRcdH0gZWxzZSB7ICAvLyB1cmwgbWF0Y2hcblx0XHRcdC8vIElmIGl0J3MgYSBwcm90b2NvbC1yZWxhdGl2ZSAnLy8nIG1hdGNoLCByZW1vdmUgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlICcvLycgKHdoaWNoIHRoZSBtYXRjaGVyUmVnZXggbmVlZGVkXG5cdFx0XHQvLyB0byBtYXRjaCBkdWUgdG8gdGhlIGxhY2sgb2YgYSBuZWdhdGl2ZSBsb29rLWJlaGluZCBpbiBKYXZhU2NyaXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMpXG5cdFx0XHRpZiggcHJvdG9jb2xSZWxhdGl2ZU1hdGNoICkge1xuXHRcdFx0XHR2YXIgY2hhckJlZm9yZU1hdGNoID0gcHJvdG9jb2xSZWxhdGl2ZU1hdGNoLm1hdGNoKCB0aGlzLmNoYXJCZWZvcmVQcm90b2NvbFJlbE1hdGNoUmVnZXggKVsgMSBdIHx8IFwiXCI7XG5cdFx0XHRcdFxuXHRcdFx0XHRpZiggY2hhckJlZm9yZU1hdGNoICkgeyAgLy8gZml4IHVwIHRoZSBgbWF0Y2hTdHJgIGlmIHRoZXJlIHdhcyBhIHByZWNlZGluZyBjaGFyIGJlZm9yZSBhIHByb3RvY29sLXJlbGF0aXZlIG1hdGNoLCB3aGljaCB3YXMgbmVlZGVkIHRvIGRldGVybWluZSB0aGUgbWF0Y2ggaXRzZWxmIChzaW5jZSB0aGVyZSBhcmUgbm8gbG9vay1iZWhpbmRzIGluIEpTIHJlZ2V4ZXMpXG5cdFx0XHRcdFx0cHJlZml4U3RyID0gY2hhckJlZm9yZU1hdGNoO1xuXHRcdFx0XHRcdG1hdGNoU3RyID0gbWF0Y2hTdHIuc2xpY2UoIDEgKTsgIC8vIHJlbW92ZSB0aGUgcHJlZml4ZWQgY2hhciBmcm9tIHRoZSBtYXRjaFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdG1hdGNoID0gbmV3IEF1dG9saW5rZXIubWF0Y2guVXJsKCB7XG5cdFx0XHRcdG1hdGNoZWRUZXh0IDogbWF0Y2hTdHIsXG5cdFx0XHRcdHVybCA6IG1hdGNoU3RyLFxuXHRcdFx0XHRwcm90b2NvbFVybE1hdGNoIDogISFwcm90b2NvbFVybE1hdGNoLFxuXHRcdFx0XHRwcm90b2NvbFJlbGF0aXZlTWF0Y2ggOiAhIXByb3RvY29sUmVsYXRpdmVNYXRjaCxcblx0XHRcdFx0c3RyaXBQcmVmaXggOiB0aGlzLnN0cmlwUHJlZml4XG5cdFx0XHR9ICk7XG5cdFx0fVxuXHRcdFxuXHRcdHJldHVybiB7XG5cdFx0XHRwcmVmaXhTdHIgOiBwcmVmaXhTdHIsXG5cdFx0XHRzdWZmaXhTdHIgOiBzdWZmaXhTdHIsXG5cdFx0XHRtYXRjaCAgICAgOiBtYXRjaFxuXHRcdH07XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIERldGVybWluZXMgaWYgYSBtYXRjaCBmb3VuZCBoYXMgYW4gdW5tYXRjaGVkIGNsb3NpbmcgcGFyZW50aGVzaXMuIElmIHNvLCB0aGlzIHBhcmVudGhlc2lzIHdpbGwgYmUgcmVtb3ZlZFxuXHQgKiBmcm9tIHRoZSBtYXRjaCBpdHNlbGYsIGFuZCBhcHBlbmRlZCBhZnRlciB0aGUgZ2VuZXJhdGVkIGFuY2hvciB0YWcgaW4ge0BsaW5rICNwcm9jZXNzVGV4dE5vZGV9LlxuXHQgKiBcblx0ICogQSBtYXRjaCBtYXkgaGF2ZSBhbiBleHRyYSBjbG9zaW5nIHBhcmVudGhlc2lzIGF0IHRoZSBlbmQgb2YgdGhlIG1hdGNoIGJlY2F1c2UgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtdXN0IGluY2x1ZGUgcGFyZW50aGVzaXNcblx0ICogZm9yIFVSTHMgc3VjaCBhcyBcIndpa2lwZWRpYS5jb20vc29tZXRoaW5nXyhkaXNhbWJpZ3VhdGlvbilcIiwgd2hpY2ggc2hvdWxkIGJlIGF1dG8tbGlua2VkLiBcblx0ICogXG5cdCAqIEhvd2V2ZXIsIGFuIGV4dHJhIHBhcmVudGhlc2lzICp3aWxsKiBiZSBpbmNsdWRlZCB3aGVuIHRoZSBVUkwgaXRzZWxmIGlzIHdyYXBwZWQgaW4gcGFyZW50aGVzaXMsIHN1Y2ggYXMgaW4gdGhlIGNhc2Ugb2Zcblx0ICogXCIod2lraXBlZGlhLmNvbS9zb21ldGhpbmdfKGRpc2FtYmlndWF0aW9uKSlcIi4gSW4gdGhpcyBjYXNlLCB0aGUgbGFzdCBjbG9zaW5nIHBhcmVudGhlc2lzIHNob3VsZCAqbm90KiBiZSBwYXJ0IG9mIHRoZSBVUkwgXG5cdCAqIGl0c2VsZiwgYW5kIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGB0cnVlYC5cblx0ICogXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBtYXRjaFN0ciBUaGUgZnVsbCBtYXRjaCBzdHJpbmcgZnJvbSB0aGUge0BsaW5rICNtYXRjaGVyUmVnZXh9LlxuXHQgKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlcmUgaXMgYW4gdW5iYWxhbmNlZCBjbG9zaW5nIHBhcmVudGhlc2lzIGF0IHRoZSBlbmQgb2YgdGhlIGBtYXRjaFN0cmAsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0bWF0Y2hIYXNVbmJhbGFuY2VkQ2xvc2luZ1BhcmVuIDogZnVuY3Rpb24oIG1hdGNoU3RyICkge1xuXHRcdHZhciBsYXN0Q2hhciA9IG1hdGNoU3RyLmNoYXJBdCggbWF0Y2hTdHIubGVuZ3RoIC0gMSApO1xuXHRcdFxuXHRcdGlmKCBsYXN0Q2hhciA9PT0gJyknICkge1xuXHRcdFx0dmFyIG9wZW5QYXJlbnNNYXRjaCA9IG1hdGNoU3RyLm1hdGNoKCAvXFwoL2cgKSxcblx0XHRcdCAgICBjbG9zZVBhcmVuc01hdGNoID0gbWF0Y2hTdHIubWF0Y2goIC9cXCkvZyApLFxuXHRcdFx0ICAgIG51bU9wZW5QYXJlbnMgPSAoIG9wZW5QYXJlbnNNYXRjaCAmJiBvcGVuUGFyZW5zTWF0Y2gubGVuZ3RoICkgfHwgMCxcblx0XHRcdCAgICBudW1DbG9zZVBhcmVucyA9ICggY2xvc2VQYXJlbnNNYXRjaCAmJiBjbG9zZVBhcmVuc01hdGNoLmxlbmd0aCApIHx8IDA7XG5cdFx0XHRcblx0XHRcdGlmKCBudW1PcGVuUGFyZW5zIDwgbnVtQ2xvc2VQYXJlbnMgKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0XG59ICk7XG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKmpzaGludCBzY3JpcHR1cmw6dHJ1ZSAqL1xuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGNsYXNzIEF1dG9saW5rZXIuTWF0Y2hWYWxpZGF0b3JcbiAqIEBleHRlbmRzIE9iamVjdFxuICogXG4gKiBVc2VkIGJ5IEF1dG9saW5rZXIgdG8gZmlsdGVyIG91dCBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGUge0BsaW5rIEF1dG9saW5rZXIjbWF0Y2hlclJlZ2V4fS5cbiAqIFxuICogRHVlIHRvIHRoZSBsaW1pdGF0aW9ucyBvZiByZWd1bGFyIGV4cHJlc3Npb25zIChpbmNsdWRpbmcgdGhlIG1pc3NpbmcgZmVhdHVyZSBvZiBsb29rLWJlaGluZHMgaW4gSlMgcmVndWxhciBleHByZXNzaW9ucyksXG4gKiB3ZSBjYW5ub3QgYWx3YXlzIGRldGVybWluZSB0aGUgdmFsaWRpdHkgb2YgYSBnaXZlbiBtYXRjaC4gVGhpcyBjbGFzcyBhcHBsaWVzIGEgYml0IG9mIGFkZGl0aW9uYWwgbG9naWMgdG8gZmlsdGVyIG91dCBhbnlcbiAqIGZhbHNlIHBvc2l0aXZlcyB0aGF0IGhhdmUgYmVlbiBtYXRjaGVkIGJ5IHRoZSB7QGxpbmsgQXV0b2xpbmtlciNtYXRjaGVyUmVnZXh9LlxuICovXG5BdXRvbGlua2VyLk1hdGNoVmFsaWRhdG9yID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggT2JqZWN0LCB7XG5cdFxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtSZWdFeHB9IGludmFsaWRQcm90b2NvbFJlbE1hdGNoUmVnZXhcblx0ICogXG5cdCAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCB0byBjaGVjayBhIHBvdGVudGlhbCBwcm90b2NvbC1yZWxhdGl2ZSBVUkwgbWF0Y2gsIGNvbWluZyBmcm9tIHRoZSBcblx0ICoge0BsaW5rIEF1dG9saW5rZXIjbWF0Y2hlclJlZ2V4fS4gQSBwcm90b2NvbC1yZWxhdGl2ZSBVUkwgaXMsIGZvciBleGFtcGxlLCBcIi8veWFob28uY29tXCJcblx0ICogXG5cdCAqIFRoaXMgcmVndWxhciBleHByZXNzaW9uIGNoZWNrcyB0byBzZWUgaWYgdGhlcmUgaXMgYSB3b3JkIGNoYXJhY3RlciBiZWZvcmUgdGhlICcvLycgbWF0Y2ggaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIFxuXHQgKiB3ZSBzaG91bGQgYWN0dWFsbHkgYXV0b2xpbmsgYSBwcm90b2NvbC1yZWxhdGl2ZSBVUkwuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlcmUgaXMgbm8gbmVnYXRpdmUgbG9vay1iZWhpbmQgaW4gXG5cdCAqIEphdmFTY3JpcHQgcmVndWxhciBleHByZXNzaW9ucy4gXG5cdCAqIFxuXHQgKiBGb3IgaW5zdGFuY2UsIHdlIHdhbnQgdG8gYXV0b2xpbmsgc29tZXRoaW5nIGxpa2UgXCJHbyB0bzogLy9nb29nbGUuY29tXCIsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGF1dG9saW5rIHNvbWV0aGluZyBcblx0ICogbGlrZSBcImFiYy8vZ29vZ2xlLmNvbVwiXG5cdCAqL1xuXHRpbnZhbGlkUHJvdG9jb2xSZWxNYXRjaFJlZ2V4IDogL15bXFx3XVxcL1xcLy8sXG5cdFxuXHQvKipcblx0ICogUmVnZXggdG8gdGVzdCBmb3IgYSBmdWxsIHByb3RvY29sLCB3aXRoIHRoZSB0d28gdHJhaWxpbmcgc2xhc2hlcy4gRXg6ICdodHRwOi8vJ1xuXHQgKiBcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtSZWdFeHB9IGhhc0Z1bGxQcm90b2NvbFJlZ2V4XG5cdCAqL1xuXHRoYXNGdWxsUHJvdG9jb2xSZWdleCA6IC9eW0EtWmEtel1bLS4rQS1aYS16MC05XSs6XFwvXFwvLyxcblx0XG5cdC8qKlxuXHQgKiBSZWdleCB0byBmaW5kIHRoZSBVUkkgc2NoZW1lLCBzdWNoIGFzICdtYWlsdG86Jy5cblx0ICogXG5cdCAqIFRoaXMgaXMgdXNlZCB0byBmaWx0ZXIgb3V0ICdqYXZhc2NyaXB0OicgYW5kICd2YnNjcmlwdDonIHNjaGVtZXMuXG5cdCAqIFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcHJvcGVydHkge1JlZ0V4cH0gdXJpU2NoZW1lUmVnZXhcblx0ICovXG5cdHVyaVNjaGVtZVJlZ2V4IDogL15bQS1aYS16XVstLitBLVphLXowLTldKzovLFxuXHRcblx0LyoqXG5cdCAqIFJlZ2V4IHRvIGRldGVybWluZSBpZiBhdCBsZWFzdCBvbmUgd29yZCBjaGFyIGV4aXN0cyBhZnRlciB0aGUgcHJvdG9jb2wgKGkuZS4gYWZ0ZXIgdGhlICc6Jylcblx0ICogXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBoYXNXb3JkQ2hhckFmdGVyUHJvdG9jb2xSZWdleFxuXHQgKi9cblx0aGFzV29yZENoYXJBZnRlclByb3RvY29sUmVnZXggOiAvOlteXFxzXSo/W0EtWmEtel0vLFxuXHRcblx0XG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gbWF0Y2ggZm91bmQgYnkge0BsaW5rIEF1dG9saW5rZXIjcHJvY2Vzc1RleHROb2RlfSBpcyB2YWxpZC4gV2lsbCByZXR1cm4gYGZhbHNlYCBmb3I6XG5cdCAqIFxuXHQgKiAxKSBVUkwgbWF0Y2hlcyB3aGljaCBkbyBub3QgaGF2ZSBhdCBsZWFzdCBoYXZlIG9uZSBwZXJpb2QgKCcuJykgaW4gdGhlIGRvbWFpbiBuYW1lIChlZmZlY3RpdmVseSBza2lwcGluZyBvdmVyIFxuXHQgKiAgICBtYXRjaGVzIGxpa2UgXCJhYmM6ZGVmXCIpLiBIb3dldmVyLCBVUkwgbWF0Y2hlcyB3aXRoIGEgcHJvdG9jb2wgd2lsbCBiZSBhbGxvd2VkIChleDogJ2h0dHA6Ly9sb2NhbGhvc3QnKVxuXHQgKiAyKSBVUkwgbWF0Y2hlcyB3aGljaCBkbyBub3QgaGF2ZSBhdCBsZWFzdCBvbmUgd29yZCBjaGFyYWN0ZXIgaW4gdGhlIGRvbWFpbiBuYW1lIChlZmZlY3RpdmVseSBza2lwcGluZyBvdmVyXG5cdCAqICAgIG1hdGNoZXMgbGlrZSBcImdpdDoxLjBcIikuXG5cdCAqIDMpIEEgcHJvdG9jb2wtcmVsYXRpdmUgdXJsIG1hdGNoIChhIFVSTCBiZWdpbm5pbmcgd2l0aCAnLy8nKSB3aG9zZSBwcmV2aW91cyBjaGFyYWN0ZXIgaXMgYSB3b3JkIGNoYXJhY3RlciBcblx0ICogICAgKGVmZmVjdGl2ZWx5IHNraXBwaW5nIG92ZXIgc3RyaW5ncyBsaWtlIFwiYWJjLy9nb29nbGUuY29tXCIpXG5cdCAqIFxuXHQgKiBPdGhlcndpc2UsIHJldHVybnMgYHRydWVgLlxuXHQgKiBcblx0ICogQHBhcmFtIHtTdHJpbmd9IHVybE1hdGNoIFRoZSBtYXRjaGVkIFVSTCwgaWYgdGhlcmUgd2FzIG9uZS4gV2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIG1hdGNoIGlzIG5vdCBhIFVSTCBtYXRjaC5cblx0ICogQHBhcmFtIHtTdHJpbmd9IHByb3RvY29sVXJsTWF0Y2ggVGhlIG1hdGNoIFVSTCBzdHJpbmcgZm9yIGEgcHJvdG9jb2wgbWF0Y2guIEV4OiAnaHR0cDovL3lhaG9vLmNvbScuIFRoaXMgaXMgdXNlZCB0byBtYXRjaFxuXHQgKiAgIHNvbWV0aGluZyBsaWtlICdodHRwOi8vbG9jYWxob3N0Jywgd2hlcmUgd2Ugd29uJ3QgZG91YmxlIGNoZWNrIHRoYXQgdGhlIGRvbWFpbiBuYW1lIGhhcyBhdCBsZWFzdCBvbmUgJy4nIGluIGl0LlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gcHJvdG9jb2xSZWxhdGl2ZU1hdGNoIFRoZSBwcm90b2NvbC1yZWxhdGl2ZSBzdHJpbmcgZm9yIGEgVVJMIG1hdGNoIChpLmUuICcvLycpLCBwb3NzaWJseSB3aXRoIGEgcHJlY2VkaW5nXG5cdCAqICAgY2hhcmFjdGVyIChleCwgYSBzcGFjZSwgc3VjaCBhczogJyAvLycsIG9yIGEgbGV0dGVyLCBzdWNoIGFzOiAnYS8vJykuIFRoZSBtYXRjaCBpcyBpbnZhbGlkIGlmIHRoZXJlIGlzIGEgd29yZCBjaGFyYWN0ZXJcblx0ICogICBwcmVjZWRpbmcgdGhlICcvLycuXG5cdCAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgbWF0Y2ggZ2l2ZW4gaXMgdmFsaWQgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQsIG9yIGBmYWxzZWAgaWYgdGhlIG1hdGNoIGlzIGludmFsaWQgYW5kL29yIFxuXHQgKiAgIHNob3VsZCBqdXN0IG5vdCBiZSBwcm9jZXNzZWQuXG5cdCAqL1xuXHRpc1ZhbGlkTWF0Y2ggOiBmdW5jdGlvbiggdXJsTWF0Y2gsIHByb3RvY29sVXJsTWF0Y2gsIHByb3RvY29sUmVsYXRpdmVNYXRjaCApIHtcblx0XHRpZihcblx0XHRcdCggcHJvdG9jb2xVcmxNYXRjaCAmJiAhdGhpcy5pc1ZhbGlkVXJpU2NoZW1lKCBwcm90b2NvbFVybE1hdGNoICkgKSB8fFxuXHRcdFx0dGhpcy51cmxNYXRjaERvZXNOb3RIYXZlUHJvdG9jb2xPckRvdCggdXJsTWF0Y2gsIHByb3RvY29sVXJsTWF0Y2ggKSB8fCAgICAgICAvLyBBdCBsZWFzdCBvbmUgcGVyaW9kICgnLicpIG11c3QgZXhpc3QgaW4gdGhlIFVSTCBtYXRjaCBmb3IgdXMgdG8gY29uc2lkZXIgaXQgYW4gYWN0dWFsIFVSTCwgKnVubGVzcyogaXQgd2FzIGEgZnVsbCBwcm90b2NvbCBtYXRjaCAobGlrZSAnaHR0cDovL2xvY2FsaG9zdCcpXG5cdFx0XHR0aGlzLnVybE1hdGNoRG9lc05vdEhhdmVBdExlYXN0T25lV29yZENoYXIoIHVybE1hdGNoLCBwcm90b2NvbFVybE1hdGNoICkgfHwgIC8vIEF0IGxlYXN0IG9uZSBsZXR0ZXIgY2hhcmFjdGVyIG11c3QgZXhpc3QgaW4gdGhlIGRvbWFpbiBuYW1lIGFmdGVyIGEgcHJvdG9jb2wgbWF0Y2guIEV4OiBza2lwIG92ZXIgc29tZXRoaW5nIGxpa2UgXCJnaXQ6MS4wXCJcblx0XHRcdHRoaXMuaXNJbnZhbGlkUHJvdG9jb2xSZWxhdGl2ZU1hdGNoKCBwcm90b2NvbFJlbGF0aXZlTWF0Y2ggKSAgICAgICAgICAgICAgICAgLy8gQSBwcm90b2NvbC1yZWxhdGl2ZSBtYXRjaCB3aGljaCBoYXMgYSB3b3JkIGNoYXJhY3RlciBpbiBmcm9udCBvZiBpdCAoc28gd2UgY2FuIHNraXAgc29tZXRoaW5nIGxpa2UgXCJhYmMvL2dvb2dsZS5jb21cIilcblx0XHQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIERldGVybWluZXMgaWYgdGhlIFVSSSBzY2hlbWUgaXMgYSB2YWxpZCBzY2hlbWUgdG8gYmUgYXV0b2xpbmtlZC4gUmV0dXJucyBgZmFsc2VgIGlmIHRoZSBzY2hlbWUgaXMgXG5cdCAqICdqYXZhc2NyaXB0Oicgb3IgJ3Zic2NyaXB0Oidcblx0ICogXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB1cmlTY2hlbWVNYXRjaCBUaGUgbWF0Y2ggVVJMIHN0cmluZyBmb3IgYSBmdWxsIFVSSSBzY2hlbWUgbWF0Y2guIEV4OiAnaHR0cDovL3lhaG9vLmNvbScgXG5cdCAqICAgb3IgJ21haWx0bzphQGEuY29tJy5cblx0ICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBzY2hlbWUgaXMgYSB2YWxpZCBvbmUsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0aXNWYWxpZFVyaVNjaGVtZSA6IGZ1bmN0aW9uKCB1cmlTY2hlbWVNYXRjaCApIHtcblx0XHR2YXIgdXJpU2NoZW1lID0gdXJpU2NoZW1lTWF0Y2gubWF0Y2goIHRoaXMudXJpU2NoZW1lUmVnZXggKVsgMCBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XG5cdFx0cmV0dXJuICggdXJpU2NoZW1lICE9PSAnamF2YXNjcmlwdDonICYmIHVyaVNjaGVtZSAhPT0gJ3Zic2NyaXB0OicgKTtcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyBpZiBhIFVSTCBtYXRjaCBkb2VzIG5vdCBoYXZlIGVpdGhlcjpcblx0ICogXG5cdCAqIGEpIGEgZnVsbCBwcm90b2NvbCAoaS5lLiAnaHR0cDovLycpLCBvclxuXHQgKiBiKSBhdCBsZWFzdCBvbmUgZG90ICgnLicpIGluIHRoZSBkb21haW4gbmFtZSAoZm9yIGEgbm9uLWZ1bGwtcHJvdG9jb2wgbWF0Y2gpLlxuXHQgKiBcblx0ICogRWl0aGVyIHNpdHVhdGlvbiBpcyBjb25zaWRlcmVkIGFuIGludmFsaWQgVVJMIChleDogJ2dpdDpkJyBkb2VzIG5vdCBoYXZlIGVpdGhlciB0aGUgJzovLycgcGFydCwgb3IgYXQgbGVhc3Qgb25lIGRvdFxuXHQgKiBpbiB0aGUgZG9tYWluIG5hbWUuIElmIHRoZSBtYXRjaCB3YXMgJ2dpdDphYmMuY29tJywgd2Ugd291bGQgY29uc2lkZXIgdGhpcyB2YWxpZC4pXG5cdCAqIFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdXJsTWF0Y2ggVGhlIG1hdGNoZWQgVVJMLCBpZiB0aGVyZSB3YXMgb25lLiBXaWxsIGJlIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgbWF0Y2ggaXMgbm90IGEgVVJMIG1hdGNoLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gcHJvdG9jb2xVcmxNYXRjaCBUaGUgbWF0Y2ggVVJMIHN0cmluZyBmb3IgYSBwcm90b2NvbCBtYXRjaC4gRXg6ICdodHRwOi8veWFob28uY29tJy4gVGhpcyBpcyB1c2VkIHRvIG1hdGNoXG5cdCAqICAgc29tZXRoaW5nIGxpa2UgJ2h0dHA6Ly9sb2NhbGhvc3QnLCB3aGVyZSB3ZSB3b24ndCBkb3VibGUgY2hlY2sgdGhhdCB0aGUgZG9tYWluIG5hbWUgaGFzIGF0IGxlYXN0IG9uZSAnLicgaW4gaXQuXG5cdCAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgVVJMIG1hdGNoIGRvZXMgbm90IGhhdmUgYSBmdWxsIHByb3RvY29sLCBvciBhdCBsZWFzdCBvbmUgZG90ICgnLicpIGluIGEgbm9uLWZ1bGwtcHJvdG9jb2xcblx0ICogICBtYXRjaC5cblx0ICovXG5cdHVybE1hdGNoRG9lc05vdEhhdmVQcm90b2NvbE9yRG90IDogZnVuY3Rpb24oIHVybE1hdGNoLCBwcm90b2NvbFVybE1hdGNoICkge1xuXHRcdHJldHVybiAoICEhdXJsTWF0Y2ggJiYgKCAhcHJvdG9jb2xVcmxNYXRjaCB8fCAhdGhpcy5oYXNGdWxsUHJvdG9jb2xSZWdleC50ZXN0KCBwcm90b2NvbFVybE1hdGNoICkgKSAmJiB1cmxNYXRjaC5pbmRleE9mKCAnLicgKSA9PT0gLTEgKTtcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyBpZiBhIFVSTCBtYXRjaCBkb2VzIG5vdCBoYXZlIGF0IGxlYXN0IG9uZSB3b3JkIGNoYXJhY3RlciBhZnRlciB0aGUgcHJvdG9jb2wgKGkuZS4gaW4gdGhlIGRvbWFpbiBuYW1lKS5cblx0ICogXG5cdCAqIEF0IGxlYXN0IG9uZSBsZXR0ZXIgY2hhcmFjdGVyIG11c3QgZXhpc3QgaW4gdGhlIGRvbWFpbiBuYW1lIGFmdGVyIGEgcHJvdG9jb2wgbWF0Y2guIEV4OiBza2lwIG92ZXIgc29tZXRoaW5nIFxuXHQgKiBsaWtlIFwiZ2l0OjEuMFwiXG5cdCAqIFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdXJsTWF0Y2ggVGhlIG1hdGNoZWQgVVJMLCBpZiB0aGVyZSB3YXMgb25lLiBXaWxsIGJlIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgbWF0Y2ggaXMgbm90IGEgVVJMIG1hdGNoLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gcHJvdG9jb2xVcmxNYXRjaCBUaGUgbWF0Y2ggVVJMIHN0cmluZyBmb3IgYSBwcm90b2NvbCBtYXRjaC4gRXg6ICdodHRwOi8veWFob28uY29tJy4gVGhpcyBpcyB1c2VkIHRvXG5cdCAqICAga25vdyB3aGV0aGVyIG9yIG5vdCB3ZSBoYXZlIGEgcHJvdG9jb2wgaW4gdGhlIFVSTCBzdHJpbmcsIGluIG9yZGVyIHRvIGNoZWNrIGZvciBhIHdvcmQgY2hhcmFjdGVyIGFmdGVyIHRoZSBwcm90b2NvbFxuXHQgKiAgIHNlcGFyYXRvciAoJzonKS5cblx0ICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBVUkwgbWF0Y2ggZG9lcyBub3QgaGF2ZSBhdCBsZWFzdCBvbmUgd29yZCBjaGFyYWN0ZXIgaW4gaXQgYWZ0ZXIgdGhlIHByb3RvY29sLCBgZmFsc2VgXG5cdCAqICAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0dXJsTWF0Y2hEb2VzTm90SGF2ZUF0TGVhc3RPbmVXb3JkQ2hhciA6IGZ1bmN0aW9uKCB1cmxNYXRjaCwgcHJvdG9jb2xVcmxNYXRjaCApIHtcblx0XHRpZiggdXJsTWF0Y2ggJiYgcHJvdG9jb2xVcmxNYXRjaCApIHtcblx0XHRcdHJldHVybiAhdGhpcy5oYXNXb3JkQ2hhckFmdGVyUHJvdG9jb2xSZWdleC50ZXN0KCB1cmxNYXRjaCApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXHRcblx0XG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIGlmIGEgcHJvdG9jb2wtcmVsYXRpdmUgbWF0Y2ggaXMgYW4gaW52YWxpZCBvbmUuIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgIGlmIHRoZXJlIGlzIGEgYHByb3RvY29sUmVsYXRpdmVNYXRjaGAsXG5cdCAqIGFuZCB0aGF0IG1hdGNoIGNvbnRhaW5zIGEgd29yZCBjaGFyYWN0ZXIgYmVmb3JlIHRoZSAnLy8nIChpLmUuIGl0IG11c3QgY29udGFpbiB3aGl0ZXNwYWNlIG9yIG5vdGhpbmcgYmVmb3JlIHRoZSAnLy8nIGluXG5cdCAqIG9yZGVyIHRvIGJlIGNvbnNpZGVyZWQgdmFsaWQpLlxuXHQgKiBcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHByb3RvY29sUmVsYXRpdmVNYXRjaCBUaGUgcHJvdG9jb2wtcmVsYXRpdmUgc3RyaW5nIGZvciBhIFVSTCBtYXRjaCAoaS5lLiAnLy8nKSwgcG9zc2libHkgd2l0aCBhIHByZWNlZGluZ1xuXHQgKiAgIGNoYXJhY3RlciAoZXgsIGEgc3BhY2UsIHN1Y2ggYXM6ICcgLy8nLCBvciBhIGxldHRlciwgc3VjaCBhczogJ2EvLycpLiBUaGUgbWF0Y2ggaXMgaW52YWxpZCBpZiB0aGVyZSBpcyBhIHdvcmQgY2hhcmFjdGVyXG5cdCAqICAgcHJlY2VkaW5nIHRoZSAnLy8nLlxuXHQgKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgaXQgaXMgYW4gaW52YWxpZCBwcm90b2NvbC1yZWxhdGl2ZSBtYXRjaCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRpc0ludmFsaWRQcm90b2NvbFJlbGF0aXZlTWF0Y2ggOiBmdW5jdGlvbiggcHJvdG9jb2xSZWxhdGl2ZU1hdGNoICkge1xuXHRcdHJldHVybiAoICEhcHJvdG9jb2xSZWxhdGl2ZU1hdGNoICYmIHRoaXMuaW52YWxpZFByb3RvY29sUmVsTWF0Y2hSZWdleC50ZXN0KCBwcm90b2NvbFJlbGF0aXZlTWF0Y2ggKSApO1xuXHR9XG5cbn0gKTtcbi8qZ2xvYmFsIEF1dG9saW5rZXIgKi9cbi8qKlxuICogQGFic3RyYWN0XG4gKiBAY2xhc3MgQXV0b2xpbmtlci5tYXRjaC5NYXRjaFxuICogXG4gKiBSZXByZXNlbnRzIGEgbWF0Y2ggZm91bmQgaW4gYW4gaW5wdXQgc3RyaW5nIHdoaWNoIHNob3VsZCBiZSBBdXRvbGlua2VkLiBBIE1hdGNoIG9iamVjdCBpcyB3aGF0IGlzIHByb3ZpZGVkIGluIGEgXG4gKiB7QGxpbmsgQXV0b2xpbmtlciNyZXBsYWNlRm4gcmVwbGFjZUZufSwgYW5kIG1heSBiZSB1c2VkIHRvIHF1ZXJ5IGZvciBkZXRhaWxzIGFib3V0IHRoZSBtYXRjaC5cbiAqIFxuICogRm9yIGV4YW1wbGU6XG4gKiBcbiAqICAgICB2YXIgaW5wdXQgPSBcIi4uLlwiOyAgLy8gc3RyaW5nIHdpdGggVVJMcywgRW1haWwgQWRkcmVzc2VzLCBhbmQgVHdpdHRlciBIYW5kbGVzXG4gKiAgICAgXG4gKiAgICAgdmFyIGxpbmtlZFRleHQgPSBBdXRvbGlua2VyLmxpbmsoIGlucHV0LCB7XG4gKiAgICAgICAgIHJlcGxhY2VGbiA6IGZ1bmN0aW9uKCBhdXRvbGlua2VyLCBtYXRjaCApIHtcbiAqICAgICAgICAgICAgIGNvbnNvbGUubG9nKCBcImhyZWYgPSBcIiwgbWF0Y2guZ2V0QW5jaG9ySHJlZigpICk7XG4gKiAgICAgICAgICAgICBjb25zb2xlLmxvZyggXCJ0ZXh0ID0gXCIsIG1hdGNoLmdldEFuY2hvclRleHQoKSApO1xuICogICAgICAgICBcbiAqICAgICAgICAgICAgIHN3aXRjaCggbWF0Y2guZ2V0VHlwZSgpICkge1xuICogICAgICAgICAgICAgICAgIGNhc2UgJ3VybCcgOiBcbiAqICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIFwidXJsOiBcIiwgbWF0Y2guZ2V0VXJsKCkgKTtcbiAqICAgICAgICAgICAgICAgICAgICAgXG4gKiAgICAgICAgICAgICAgICAgY2FzZSAnZW1haWwnIDpcbiAqICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIFwiZW1haWw6IFwiLCBtYXRjaC5nZXRFbWFpbCgpICk7XG4gKiAgICAgICAgICAgICAgICAgICAgIFxuICogICAgICAgICAgICAgICAgIGNhc2UgJ3R3aXR0ZXInIDpcbiAqICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIFwidHdpdHRlcjogXCIsIG1hdGNoLmdldFR3aXR0ZXJIYW5kbGUoKSApO1xuICogICAgICAgICAgICAgfVxuICogICAgICAgICB9XG4gKiAgICAgfSApO1xuICogICAgIFxuICogU2VlIHRoZSB7QGxpbmsgQXV0b2xpbmtlcn0gY2xhc3MgZm9yIG1vcmUgZGV0YWlscyBvbiB1c2luZyB0aGUge0BsaW5rIEF1dG9saW5rZXIjcmVwbGFjZUZuIHJlcGxhY2VGbn0uXG4gKi9cbkF1dG9saW5rZXIubWF0Y2guTWF0Y2ggPSBBdXRvbGlua2VyLlV0aWwuZXh0ZW5kKCBPYmplY3QsIHtcblx0XG5cdC8qKlxuXHQgKiBAY2ZnIHtTdHJpbmd9IG1hdGNoZWRUZXh0IChyZXF1aXJlZClcblx0ICogXG5cdCAqIFRoZSBvcmlnaW5hbCB0ZXh0IHRoYXQgd2FzIG1hdGNoZWQuXG5cdCAqL1xuXHRcblx0XG5cdC8qKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICogQHBhcmFtIHtPYmplY3R9IGNmZyBUaGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgTWF0Y2ggaW5zdGFuY2UsIHNwZWNpZmllZCBpbiBhbiBPYmplY3QgKG1hcCkuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvciA6IGZ1bmN0aW9uKCBjZmcgKSB7XG5cdFx0QXV0b2xpbmtlci5VdGlsLmFzc2lnbiggdGhpcywgY2ZnICk7XG5cdH0sXG5cblx0XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgc3RyaW5nIG5hbWUgZm9yIHRoZSB0eXBlIG9mIG1hdGNoIHRoYXQgdGhpcyBjbGFzcyByZXByZXNlbnRzLlxuXHQgKiBcblx0ICogQGFic3RyYWN0XG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldFR5cGUgOiBBdXRvbGlua2VyLlV0aWwuYWJzdHJhY3RNZXRob2QsXG5cdFxuXHRcblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHRleHQgdGhhdCB3YXMgbWF0Y2hlZC5cblx0ICogXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldE1hdGNoZWRUZXh0IDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWF0Y2hlZFRleHQ7XG5cdH0sXG5cdFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhbmNob3IgaHJlZiB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBtYXRjaC5cblx0ICogXG5cdCAqIEBhYnN0cmFjdFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRBbmNob3JIcmVmIDogQXV0b2xpbmtlci5VdGlsLmFic3RyYWN0TWV0aG9kLFxuXHRcblx0XG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhbmNob3IgdGV4dCB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBtYXRjaC5cblx0ICogXG5cdCAqIEBhYnN0cmFjdFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRBbmNob3JUZXh0IDogQXV0b2xpbmtlci5VdGlsLmFic3RyYWN0TWV0aG9kXG5cbn0gKTtcbi8qZ2xvYmFsIEF1dG9saW5rZXIgKi9cbi8qKlxuICogQGNsYXNzIEF1dG9saW5rZXIubWF0Y2guRW1haWxcbiAqIEBleHRlbmRzIEF1dG9saW5rZXIubWF0Y2guTWF0Y2hcbiAqIFxuICogUmVwcmVzZW50cyBhIEVtYWlsIG1hdGNoIGZvdW5kIGluIGFuIGlucHV0IHN0cmluZyB3aGljaCBzaG91bGQgYmUgQXV0b2xpbmtlZC5cbiAqIFxuICogU2VlIHRoaXMgY2xhc3MncyBzdXBlcmNsYXNzICh7QGxpbmsgQXV0b2xpbmtlci5tYXRjaC5NYXRjaH0pIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cbkF1dG9saW5rZXIubWF0Y2guRW1haWwgPSBBdXRvbGlua2VyLlV0aWwuZXh0ZW5kKCBBdXRvbGlua2VyLm1hdGNoLk1hdGNoLCB7XG5cdFxuXHQvKipcblx0ICogQGNmZyB7U3RyaW5nfSBlbWFpbCAocmVxdWlyZWQpXG5cdCAqIFxuXHQgKiBUaGUgZW1haWwgYWRkcmVzcyB0aGF0IHdhcyBtYXRjaGVkLlxuXHQgKi9cblx0XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBzdHJpbmcgbmFtZSBmb3IgdGhlIHR5cGUgb2YgbWF0Y2ggdGhhdCB0aGlzIGNsYXNzIHJlcHJlc2VudHMuXG5cdCAqIFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRUeXBlIDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICdlbWFpbCc7XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGVtYWlsIGFkZHJlc3MgdGhhdCB3YXMgbWF0Y2hlZC5cblx0ICogXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldEVtYWlsIDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZW1haWw7XG5cdH0sXG5cdFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhbmNob3IgaHJlZiB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBtYXRjaC5cblx0ICogXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldEFuY2hvckhyZWYgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gJ21haWx0bzonICsgdGhpcy5lbWFpbDtcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgYW5jaG9yIHRleHQgdGhhdCBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGUgbWF0Y2guXG5cdCAqIFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRBbmNob3JUZXh0IDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZW1haWw7XG5cdH1cblx0XG59ICk7XG4vKmdsb2JhbCBBdXRvbGlua2VyICovXG4vKipcbiAqIEBjbGFzcyBBdXRvbGlua2VyLm1hdGNoLlR3aXR0ZXJcbiAqIEBleHRlbmRzIEF1dG9saW5rZXIubWF0Y2guTWF0Y2hcbiAqIFxuICogUmVwcmVzZW50cyBhIFR3aXR0ZXIgbWF0Y2ggZm91bmQgaW4gYW4gaW5wdXQgc3RyaW5nIHdoaWNoIHNob3VsZCBiZSBBdXRvbGlua2VkLlxuICogXG4gKiBTZWUgdGhpcyBjbGFzcydzIHN1cGVyY2xhc3MgKHtAbGluayBBdXRvbGlua2VyLm1hdGNoLk1hdGNofSkgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuQXV0b2xpbmtlci5tYXRjaC5Ud2l0dGVyID0gQXV0b2xpbmtlci5VdGlsLmV4dGVuZCggQXV0b2xpbmtlci5tYXRjaC5NYXRjaCwge1xuXHRcblx0LyoqXG5cdCAqIEBjZmcge1N0cmluZ30gdHdpdHRlckhhbmRsZSAocmVxdWlyZWQpXG5cdCAqIFxuXHQgKiBUaGUgVHdpdHRlciBoYW5kbGUgdGhhdCB3YXMgbWF0Y2hlZC5cblx0ICovXG5cdFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIG1hdGNoIHRoYXQgdGhpcyBjbGFzcyByZXByZXNlbnRzLlxuXHQgKiBcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0VHlwZSA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAndHdpdHRlcic7XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIFJldHVybnMgYSBzdHJpbmcgbmFtZSBmb3IgdGhlIHR5cGUgb2YgbWF0Y2ggdGhhdCB0aGlzIGNsYXNzIHJlcHJlc2VudHMuXG5cdCAqIFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRUd2l0dGVySGFuZGxlIDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMudHdpdHRlckhhbmRsZTtcblx0fSxcblx0XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGFuY2hvciBocmVmIHRoYXQgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgdGhlIG1hdGNoLlxuXHQgKiBcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0QW5jaG9ySHJlZiA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAnaHR0cHM6Ly90d2l0dGVyLmNvbS8nICsgdGhpcy50d2l0dGVySGFuZGxlO1xuXHR9LFxuXHRcblx0XG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhbmNob3IgdGV4dCB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBtYXRjaC5cblx0ICogXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldEFuY2hvclRleHQgOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gJ0AnICsgdGhpcy50d2l0dGVySGFuZGxlO1xuXHR9XG5cdFxufSApO1xuLypnbG9iYWwgQXV0b2xpbmtlciAqL1xuLyoqXG4gKiBAY2xhc3MgQXV0b2xpbmtlci5tYXRjaC5VcmxcbiAqIEBleHRlbmRzIEF1dG9saW5rZXIubWF0Y2guTWF0Y2hcbiAqIFxuICogUmVwcmVzZW50cyBhIFVybCBtYXRjaCBmb3VuZCBpbiBhbiBpbnB1dCBzdHJpbmcgd2hpY2ggc2hvdWxkIGJlIEF1dG9saW5rZWQuXG4gKiBcbiAqIFNlZSB0aGlzIGNsYXNzJ3Mgc3VwZXJjbGFzcyAoe0BsaW5rIEF1dG9saW5rZXIubWF0Y2guTWF0Y2h9KSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5BdXRvbGlua2VyLm1hdGNoLlVybCA9IEF1dG9saW5rZXIuVXRpbC5leHRlbmQoIEF1dG9saW5rZXIubWF0Y2guTWF0Y2gsIHtcblx0XG5cdC8qKlxuXHQgKiBAY2ZnIHtTdHJpbmd9IHVybCAocmVxdWlyZWQpXG5cdCAqIFxuXHQgKiBUaGUgdXJsIHRoYXQgd2FzIG1hdGNoZWQuXG5cdCAqL1xuXHRcblx0LyoqXG5cdCAqIEBjZmcge0Jvb2xlYW59IHByb3RvY29sVXJsTWF0Y2ggKHJlcXVpcmVkKVxuXHQgKiBcblx0ICogYHRydWVgIGlmIHRoZSBVUkwgaXMgYSBtYXRjaCB3aGljaCBhbHJlYWR5IGhhcyBhIHByb3RvY29sIChpLmUuICdodHRwOi8vJyksIGBmYWxzZWAgaWYgdGhlIG1hdGNoIHdhcyBmcm9tIGEgJ3d3dycgb3Jcblx0ICoga25vd24gVExEIG1hdGNoLlxuXHQgKi9cblx0XG5cdC8qKlxuXHQgKiBAY2ZnIHtCb29sZWFufSBwcm90b2NvbFJlbGF0aXZlTWF0Y2ggKHJlcXVpcmVkKVxuXHQgKiBcblx0ICogYHRydWVgIGlmIHRoZSBVUkwgaXMgYSBwcm90b2NvbC1yZWxhdGl2ZSBtYXRjaC4gQSBwcm90b2NvbC1yZWxhdGl2ZSBtYXRjaCBpcyBhIFVSTCB0aGF0IHN0YXJ0cyB3aXRoICcvLycsXG5cdCAqIGFuZCB3aWxsIGJlIGVpdGhlciBodHRwOi8vIG9yIGh0dHBzOi8vIGJhc2VkIG9uIHRoZSBwcm90b2NvbCB0aGF0IHRoZSBzaXRlIGlzIGxvYWRlZCB1bmRlci5cblx0ICovXG5cdFxuXHQvKipcblx0ICogQGNmZyB7Qm9vbGVhbn0gc3RyaXBQcmVmaXggKHJlcXVpcmVkKVxuXHQgKiBAaW5oZXJpdGRvYyBBdXRvbGlua2VyI3N0cmlwUHJlZml4XG5cdCAqL1xuXHRcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtSZWdFeHB9IHVybFByZWZpeFJlZ2V4XG5cdCAqIFxuXHQgKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIHJlbW92ZSB0aGUgJ2h0dHA6Ly8nIG9yICdodHRwczovLycgYW5kL29yIHRoZSAnd3d3LicgZnJvbSBVUkxzLlxuXHQgKi9cblx0dXJsUHJlZml4UmVnZXg6IC9eKGh0dHBzPzpcXC9cXC8pPyh3d3dcXC4pPy9pLFxuXHRcblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBwcm90b2NvbFJlbGF0aXZlUmVnZXhcblx0ICogXG5cdCAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCB0byByZW1vdmUgdGhlIHByb3RvY29sLXJlbGF0aXZlICcvLycgZnJvbSB0aGUge0BsaW5rICN1cmx9IHN0cmluZywgZm9yIHB1cnBvc2VzXG5cdCAqIG9mIHtAbGluayAjZ2V0QW5jaG9yVGV4dH0uIEEgcHJvdG9jb2wtcmVsYXRpdmUgVVJMIGlzLCBmb3IgZXhhbXBsZSwgXCIvL3lhaG9vLmNvbVwiXG5cdCAqL1xuXHRwcm90b2NvbFJlbGF0aXZlUmVnZXggOiAvXlxcL1xcLy8sXG5cdFxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQHByb3BlcnR5IHtCb29sZWFufSBwcm90b2NvbFByZXBlbmRlZFxuXHQgKiBcblx0ICogV2lsbCBiZSBzZXQgdG8gYHRydWVgIGlmIHRoZSAnaHR0cDovLycgcHJvdG9jb2wgaGFzIGJlZW4gcHJlcGVuZGVkIHRvIHRoZSB7QGxpbmsgI3VybH0gKGJlY2F1c2UgdGhlXG5cdCAqIHtAbGluayAjdXJsfSBkaWQgbm90IGhhdmUgYSBwcm90b2NvbClcblx0ICovXG5cdHByb3RvY29sUHJlcGVuZGVkIDogZmFsc2UsXG5cdFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgc3RyaW5nIG5hbWUgZm9yIHRoZSB0eXBlIG9mIG1hdGNoIHRoYXQgdGhpcyBjbGFzcyByZXByZXNlbnRzLlxuXHQgKiBcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0Z2V0VHlwZSA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAndXJsJztcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgdXJsIHRoYXQgd2FzIG1hdGNoZWQsIGFzc3VtaW5nIHRoZSBwcm90b2NvbCB0byBiZSAnaHR0cDovLycgaWYgdGhlIG9yaWdpbmFsXG5cdCAqIG1hdGNoIHdhcyBtaXNzaW5nIGEgcHJvdG9jb2wuXG5cdCAqIFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRVcmwgOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdXJsID0gdGhpcy51cmw7XG5cdFx0XG5cdFx0Ly8gaWYgdGhlIHVybCBzdHJpbmcgZG9lc24ndCBiZWdpbiB3aXRoIGEgcHJvdG9jb2wsIGFzc3VtZSAnaHR0cDovLydcblx0XHRpZiggIXRoaXMucHJvdG9jb2xSZWxhdGl2ZU1hdGNoICYmICF0aGlzLnByb3RvY29sVXJsTWF0Y2ggJiYgIXRoaXMucHJvdG9jb2xQcmVwZW5kZWQgKSB7XG5cdFx0XHR1cmwgPSB0aGlzLnVybCA9ICdodHRwOi8vJyArIHVybDtcblx0XHRcdFxuXHRcdFx0dGhpcy5wcm90b2NvbFByZXBlbmRlZCA9IHRydWU7XG5cdFx0fVxuXHRcdFxuXHRcdHJldHVybiB1cmw7XG5cdH0sXG5cdFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhbmNob3IgaHJlZiB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBtYXRjaC5cblx0ICogXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldEFuY2hvckhyZWYgOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdXJsID0gdGhpcy5nZXRVcmwoKTtcblx0XHRcblx0XHRyZXR1cm4gdXJsLnJlcGxhY2UoIC8mYW1wOy9nLCAnJicgKTsgIC8vIGFueSAmYW1wOydzIGluIHRoZSBVUkwgc2hvdWxkIGJlIGNvbnZlcnRlZCBiYWNrIHRvICcmJyBpZiB0aGV5IHdlcmUgZGlzcGxheWVkIGFzICZhbXA7IGluIHRoZSBzb3VyY2UgaHRtbCBcblx0fSxcblx0XG5cdFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgYW5jaG9yIHRleHQgdGhhdCBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGUgbWF0Y2guXG5cdCAqIFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqL1xuXHRnZXRBbmNob3JUZXh0IDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGFuY2hvclRleHQgPSB0aGlzLmdldFVybCgpO1xuXHRcdFxuXHRcdGlmKCB0aGlzLnByb3RvY29sUmVsYXRpdmVNYXRjaCApIHtcblx0XHRcdC8vIFN0cmlwIG9mZiBhbnkgcHJvdG9jb2wtcmVsYXRpdmUgJy8vJyBmcm9tIHRoZSBhbmNob3IgdGV4dFxuXHRcdFx0YW5jaG9yVGV4dCA9IHRoaXMuc3RyaXBQcm90b2NvbFJlbGF0aXZlUHJlZml4KCBhbmNob3JUZXh0ICk7XG5cdFx0fVxuXHRcdGlmKCB0aGlzLnN0cmlwUHJlZml4ICkge1xuXHRcdFx0YW5jaG9yVGV4dCA9IHRoaXMuc3RyaXBVcmxQcmVmaXgoIGFuY2hvclRleHQgKTtcblx0XHR9XG5cdFx0YW5jaG9yVGV4dCA9IHRoaXMucmVtb3ZlVHJhaWxpbmdTbGFzaCggYW5jaG9yVGV4dCApOyAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoLCBpZiB0aGVyZSBpcyBvbmVcblx0XHRcblx0XHRyZXR1cm4gYW5jaG9yVGV4dDtcblx0fSxcblx0XG5cdFxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XG5cdC8vIFV0aWxpdHkgRnVuY3Rpb25hbGl0eVxuXHRcblx0LyoqXG5cdCAqIFN0cmlwcyB0aGUgVVJMIHByZWZpeCAoc3VjaCBhcyBcImh0dHA6Ly9cIiBvciBcImh0dHBzOi8vXCIpIGZyb20gdGhlIGdpdmVuIHRleHQuXG5cdCAqIFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgdGV4dCBvZiB0aGUgYW5jaG9yIHRoYXQgaXMgYmVpbmcgZ2VuZXJhdGVkLCBmb3Igd2hpY2ggdG8gc3RyaXAgb2ZmIHRoZVxuXHQgKiAgIHVybCBwcmVmaXggKHN1Y2ggYXMgc3RyaXBwaW5nIG9mZiBcImh0dHA6Ly9cIilcblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgYGFuY2hvclRleHRgLCB3aXRoIHRoZSBwcmVmaXggc3RyaXBwZWQuXG5cdCAqL1xuXHRzdHJpcFVybFByZWZpeCA6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0LnJlcGxhY2UoIHRoaXMudXJsUHJlZml4UmVnZXgsICcnICk7XG5cdH0sXG5cdFxuXHRcblx0LyoqXG5cdCAqIFN0cmlwcyBhbnkgcHJvdG9jb2wtcmVsYXRpdmUgJy8vJyBmcm9tIHRoZSBhbmNob3IgdGV4dC5cblx0ICogXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IG9mIHRoZSBhbmNob3IgdGhhdCBpcyBiZWluZyBnZW5lcmF0ZWQsIGZvciB3aGljaCB0byBzdHJpcCBvZmYgdGhlXG5cdCAqICAgcHJvdG9jb2wtcmVsYXRpdmUgcHJlZml4IChzdWNoIGFzIHN0cmlwcGluZyBvZmYgXCIvL1wiKVxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBgYW5jaG9yVGV4dGAsIHdpdGggdGhlIHByb3RvY29sLXJlbGF0aXZlIHByZWZpeCBzdHJpcHBlZC5cblx0ICovXG5cdHN0cmlwUHJvdG9jb2xSZWxhdGl2ZVByZWZpeCA6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0LnJlcGxhY2UoIHRoaXMucHJvdG9jb2xSZWxhdGl2ZVJlZ2V4LCAnJyApO1xuXHR9LFxuXHRcblx0XG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFueSB0cmFpbGluZyBzbGFzaCBmcm9tIHRoZSBnaXZlbiBgYW5jaG9yVGV4dGAsIGluIHByZXBhcmF0aW9uIGZvciB0aGUgdGV4dCB0byBiZSBkaXNwbGF5ZWQuXG5cdCAqIFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gYW5jaG9yVGV4dCBUaGUgdGV4dCBvZiB0aGUgYW5jaG9yIHRoYXQgaXMgYmVpbmcgZ2VuZXJhdGVkLCBmb3Igd2hpY2ggdG8gcmVtb3ZlIGFueSB0cmFpbGluZ1xuXHQgKiAgIHNsYXNoICgnLycpIHRoYXQgbWF5IGV4aXN0LlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBgYW5jaG9yVGV4dGAsIHdpdGggdGhlIHRyYWlsaW5nIHNsYXNoIHJlbW92ZWQuXG5cdCAqL1xuXHRyZW1vdmVUcmFpbGluZ1NsYXNoIDogZnVuY3Rpb24oIGFuY2hvclRleHQgKSB7XG5cdFx0aWYoIGFuY2hvclRleHQuY2hhckF0KCBhbmNob3JUZXh0Lmxlbmd0aCAtIDEgKSA9PT0gJy8nICkge1xuXHRcdFx0YW5jaG9yVGV4dCA9IGFuY2hvclRleHQuc2xpY2UoIDAsIC0xICk7XG5cdFx0fVxuXHRcdHJldHVybiBhbmNob3JUZXh0O1xuXHR9XG5cdFxufSApO1xucmV0dXJuIEF1dG9saW5rZXI7XG5cbn0pKTtcbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxuZnVuY3Rpb24gaW5pdCAoKSB7XG4gIHZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgbG9va3VwW2ldID0gY29kZVtpXVxuICAgIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxuICB9XG5cbiAgcmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG4gIHJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xufVxuXG5pbml0KClcblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgaSwgaiwgbCwgdG1wLCBwbGFjZUhvbGRlcnMsIGFyclxuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICBwbGFjZUhvbGRlcnMgPSBiNjRbbGVuIC0gMl0gPT09ICc9JyA/IDIgOiBiNjRbbGVuIC0gMV0gPT09ICc9JyA/IDEgOiAwXG5cbiAgLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG4gIGFyciA9IG5ldyBBcnIobGVuICogMyAvIDQgLSBwbGFjZUhvbGRlcnMpXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICBsID0gcGxhY2VIb2xkZXJzID4gMCA/IGxlbiAtIDQgOiBsZW5cblxuICB2YXIgTCA9IDBcblxuICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzID09PSAyKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfSBlbHNlIGlmIChwbGFjZUhvbGRlcnMgPT09IDEpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPSAodWludDhbaV0gPDwgMTYpICsgKHVpbnQ4W2kgKyAxXSA8PCA4KSArICh1aW50OFtpICsgMl0pXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBvdXRwdXQgPSAnJ1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPT0nXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArICh1aW50OFtsZW4gLSAxXSlcbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAxMF1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9ICc9J1xuICB9XG5cbiAgcGFydHMucHVzaChvdXRwdXQpXG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCIvKiFcbiAqIGJyYWNlcyA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvYnJhY2VzPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llc1xuICovXG5cbnZhciBleHBhbmQgPSByZXF1aXJlKCdleHBhbmQtcmFuZ2UnKTtcbnZhciByZXBlYXQgPSByZXF1aXJlKCdyZXBlYXQtZWxlbWVudCcpO1xudmFyIHRva2VucyA9IHJlcXVpcmUoJ3ByZXNlcnZlJyk7XG5cbi8qKlxuICogRXhwb3NlIGBicmFjZXNgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihzdHIsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdicmFjZXMgZXhwZWN0cyBhIHN0cmluZycpO1xuICB9XG4gIHJldHVybiBicmFjZXMoc3RyLCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogRXhwYW5kIGB7Zm9vLGJhcn1gIG9yIGB7MS4uNX1gIGJyYWNlcyBpbiB0aGVcbiAqIGdpdmVuIGBzdHJpbmdgLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmBcbiAqIEBwYXJhbSAge0FycmF5fSBgYXJyYFxuICogQHBhcmFtICB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5cbmZ1bmN0aW9uIGJyYWNlcyhzdHIsIGFyciwgb3B0aW9ucykge1xuICBpZiAoc3RyID09PSAnJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgb3B0aW9ucyA9IGFycjtcbiAgICBhcnIgPSBbXTtcbiAgfVxuXG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgYXJyID0gYXJyIHx8IFtdO1xuXG4gIGlmICh0eXBlb2Ygb3B0cy5ub2R1cGVzID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdHMubm9kdXBlcyA9IHRydWU7XG4gIH1cblxuICB2YXIgZm4gPSBvcHRzLmZuO1xuICB2YXIgZXM2O1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZuID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cblxuICBpZiAoIShwYXR0ZXJuUmUgaW5zdGFuY2VvZiBSZWdFeHApKSB7XG4gICAgcGF0dGVyblJlID0gcGF0dGVyblJlZ2V4KCk7XG4gIH1cblxuICB2YXIgbWF0Y2hlcyA9IHN0ci5tYXRjaChwYXR0ZXJuUmUpIHx8IFtdO1xuICB2YXIgbSA9IG1hdGNoZXNbMF07XG5cbiAgc3dpdGNoKG0pIHtcbiAgICBjYXNlICdcXFxcLCc6XG4gICAgICByZXR1cm4gZXNjYXBlQ29tbWFzKHN0ciwgYXJyLCBvcHRzKTtcbiAgICBjYXNlICdcXFxcLic6XG4gICAgICByZXR1cm4gZXNjYXBlRG90cyhzdHIsIGFyciwgb3B0cyk7XG4gICAgY2FzZSAnXFwvLic6XG4gICAgICByZXR1cm4gZXNjYXBlUGF0aHMoc3RyLCBhcnIsIG9wdHMpO1xuICAgIGNhc2UgJyAnOlxuICAgICAgcmV0dXJuIHNwbGl0V2hpdGVzcGFjZShzdHIpO1xuICAgIGNhc2UgJ3ssfSc6XG4gICAgICByZXR1cm4gZXhwb25lbnRpYWwoc3RyLCBvcHRzLCBicmFjZXMpO1xuICAgIGNhc2UgJ3t9JzpcbiAgICAgIHJldHVybiBlbXB0eUJyYWNlcyhzdHIsIGFyciwgb3B0cyk7XG4gICAgY2FzZSAnXFxcXHsnOlxuICAgIGNhc2UgJ1xcXFx9JzpcbiAgICAgIHJldHVybiBlc2NhcGVCcmFjZXMoc3RyLCBhcnIsIG9wdHMpO1xuICAgIGNhc2UgJyR7JzpcbiAgICAgIGlmICghL1xce1tee10rXFx7Ly50ZXN0KHN0cikpIHtcbiAgICAgICAgcmV0dXJuIGFyci5jb25jYXQoc3RyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVzNiA9IHRydWU7XG4gICAgICAgIHN0ciA9IHRva2Vucy5iZWZvcmUoc3RyLCBlczZSZWdleCgpKTtcbiAgICAgIH1cbiAgfVxuXG4gIGlmICghKGJyYWNlUmUgaW5zdGFuY2VvZiBSZWdFeHApKSB7XG4gICAgYnJhY2VSZSA9IGJyYWNlUmVnZXgoKTtcbiAgfVxuXG4gIHZhciBtYXRjaCA9IGJyYWNlUmUuZXhlYyhzdHIpO1xuICBpZiAobWF0Y2ggPT0gbnVsbCkge1xuICAgIHJldHVybiBbc3RyXTtcbiAgfVxuXG4gIHZhciBvdXR0ZXIgPSBtYXRjaFsxXTtcbiAgdmFyIGlubmVyID0gbWF0Y2hbMl07XG4gIGlmIChpbm5lciA9PT0gJycpIHsgcmV0dXJuIFtzdHJdOyB9XG5cbiAgdmFyIHNlZ3MsIHNlZ3NMZW5ndGg7XG5cbiAgaWYgKGlubmVyLmluZGV4T2YoJy4uJykgIT09IC0xKSB7XG4gICAgc2VncyA9IGV4cGFuZChpbm5lciwgb3B0cywgZm4pIHx8IGlubmVyLnNwbGl0KCcsJyk7XG4gICAgc2Vnc0xlbmd0aCA9IHNlZ3MubGVuZ3RoO1xuXG4gIH0gZWxzZSBpZiAoaW5uZXJbMF0gPT09ICdcIicgfHwgaW5uZXJbMF0gPT09ICdcXCcnKSB7XG4gICAgcmV0dXJuIGFyci5jb25jYXQoc3RyLnNwbGl0KC9bJ1wiXS8pLmpvaW4oJycpKTtcblxuICB9IGVsc2Uge1xuICAgIHNlZ3MgPSBpbm5lci5zcGxpdCgnLCcpO1xuICAgIGlmIChvcHRzLm1ha2VSZSkge1xuICAgICAgcmV0dXJuIGJyYWNlcyhzdHIucmVwbGFjZShvdXR0ZXIsIHdyYXAoc2VncywgJ3wnKSksIG9wdHMpO1xuICAgIH1cblxuICAgIHNlZ3NMZW5ndGggPSBzZWdzLmxlbmd0aDtcbiAgICBpZiAoc2Vnc0xlbmd0aCA9PT0gMSAmJiBvcHRzLmJhc2gpIHtcbiAgICAgIHNlZ3NbMF0gPSB3cmFwKHNlZ3NbMF0sICdcXFxcJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGxlbiA9IHNlZ3MubGVuZ3RoO1xuICB2YXIgaSA9IDAsIHZhbDtcblxuICB3aGlsZSAobGVuLS0pIHtcbiAgICB2YXIgcGF0aCA9IHNlZ3NbaSsrXTtcblxuICAgIGlmICgvKFxcLlteLlxcL10pLy50ZXN0KHBhdGgpKSB7XG4gICAgICBpZiAoc2Vnc0xlbmd0aCA+IDEpIHtcbiAgICAgICAgcmV0dXJuIHNlZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3N0cl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsID0gc3BsaWNlKHN0ciwgb3V0dGVyLCBwYXRoKTtcblxuICAgIGlmICgvXFx7W157fV0rP1xcfS8udGVzdCh2YWwpKSB7XG4gICAgICBhcnIgPSBicmFjZXModmFsLCBhcnIsIG9wdHMpO1xuICAgIH0gZWxzZSBpZiAodmFsICE9PSAnJykge1xuICAgICAgaWYgKG9wdHMubm9kdXBlcyAmJiBhcnIuaW5kZXhPZih2YWwpICE9PSAtMSkgeyBjb250aW51ZTsgfVxuICAgICAgYXJyLnB1c2goZXM2ID8gdG9rZW5zLmFmdGVyKHZhbCkgOiB2YWwpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLnN0cmljdCkgeyByZXR1cm4gZmlsdGVyKGFyciwgZmlsdGVyRW1wdHkpOyB9XG4gIHJldHVybiBhcnI7XG59XG5cbi8qKlxuICogRXhwYW5kIGV4cG9uZW50aWFsIHJhbmdlc1xuICpcbiAqICAgYGF7LH17LH1gID0+IFsnYScsICdhJywgJ2EnLCAnYSddXG4gKi9cblxuZnVuY3Rpb24gZXhwb25lbnRpYWwoc3RyLCBvcHRpb25zLCBmbikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmbiA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cblxuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBlc2MgPSAnX19FU0NfRVhQX18nO1xuICB2YXIgZXhwID0gMDtcbiAgdmFyIHJlcztcblxuICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJ3ssfScpO1xuICBpZiAob3B0cy5ub2R1cGVzKSB7XG4gICAgcmV0dXJuIGZuKHBhcnRzLmpvaW4oJycpLCBvcHRzKTtcbiAgfVxuXG4gIGV4cCA9IHBhcnRzLmxlbmd0aCAtIDE7XG4gIHJlcyA9IGZuKHBhcnRzLmpvaW4oZXNjKSwgb3B0cyk7XG4gIHZhciBsZW4gPSByZXMubGVuZ3RoO1xuICB2YXIgYXJyID0gW107XG4gIHZhciBpID0gMDtcblxuICB3aGlsZSAobGVuLS0pIHtcbiAgICB2YXIgZWxlID0gcmVzW2krK107XG4gICAgdmFyIGlkeCA9IGVsZS5pbmRleE9mKGVzYyk7XG5cbiAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgYXJyLnB1c2goZWxlKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBlbGUgPSBlbGUuc3BsaXQoJ19fRVNDX0VYUF9fJykuam9pbignJyk7XG4gICAgICBpZiAoISFlbGUgJiYgb3B0cy5ub2R1cGVzICE9PSBmYWxzZSkge1xuICAgICAgICBhcnIucHVzaChlbGUpO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbnVtID0gTWF0aC5wb3coMiwgZXhwKTtcbiAgICAgICAgYXJyLnB1c2guYXBwbHkoYXJyLCByZXBlYXQoZWxlLCBudW0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cblxuLyoqXG4gKiBXcmFwIGEgdmFsdWUgd2l0aCBwYXJlbnMsIGJyYWNrZXRzIG9yIGJyYWNlcyxcbiAqIGJhc2VkIG9uIHRoZSBnaXZlbiBjaGFyYWN0ZXIvc2VwYXJhdG9yLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ3xBcnJheX0gYHZhbGBcbiAqIEBwYXJhbSAge1N0cmluZ30gYGNoYFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIHdyYXAodmFsLCBjaCkge1xuICBpZiAoY2ggPT09ICd8Jykge1xuICAgIHJldHVybiAnKCcgKyB2YWwuam9pbihjaCkgKyAnKSc7XG4gIH1cbiAgaWYgKGNoID09PSAnLCcpIHtcbiAgICByZXR1cm4gJ3snICsgdmFsLmpvaW4oY2gpICsgJ30nO1xuICB9XG4gIGlmIChjaCA9PT0gJy0nKSB7XG4gICAgcmV0dXJuICdbJyArIHZhbC5qb2luKGNoKSArICddJztcbiAgfVxuICBpZiAoY2ggPT09ICdcXFxcJykge1xuICAgIHJldHVybiAnXFxcXHsnICsgdmFsICsgJ1xcXFx9JztcbiAgfVxufVxuXG4vKipcbiAqIEhhbmRsZSBlbXB0eSBicmFjZXM6IGB7fWBcbiAqL1xuXG5mdW5jdGlvbiBlbXB0eUJyYWNlcyhzdHIsIGFyciwgb3B0cykge1xuICByZXR1cm4gYnJhY2VzKHN0ci5zcGxpdCgne30nKS5qb2luKCdcXFxce1xcXFx9JyksIGFyciwgb3B0cyk7XG59XG5cbi8qKlxuICogRmlsdGVyIG91dCBlbXB0eS1pc2ggdmFsdWVzXG4gKi9cblxuZnVuY3Rpb24gZmlsdGVyRW1wdHkoZWxlKSB7XG4gIHJldHVybiAhIWVsZSAmJiBlbGUgIT09ICdcXFxcJztcbn1cblxuLyoqXG4gKiBIYW5kbGUgcGF0dGVybnMgd2l0aCB3aGl0ZXNwYWNlXG4gKi9cblxuZnVuY3Rpb24gc3BsaXRXaGl0ZXNwYWNlKHN0cikge1xuICB2YXIgc2VncyA9IHN0ci5zcGxpdCgnICcpO1xuICB2YXIgbGVuID0gc2Vncy5sZW5ndGg7XG4gIHZhciByZXMgPSBbXTtcbiAgdmFyIGkgPSAwO1xuXG4gIHdoaWxlIChsZW4tLSkge1xuICAgIHJlcy5wdXNoLmFwcGx5KHJlcywgYnJhY2VzKHNlZ3NbaSsrXSkpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogSGFuZGxlIGVzY2FwZWQgYnJhY2VzOiBgXFxcXHtmb28sYmFyfWBcbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGVCcmFjZXMoc3RyLCBhcnIsIG9wdHMpIHtcbiAgaWYgKCEvXFx7W157XStcXHsvLnRlc3Qoc3RyKSkge1xuICAgIHJldHVybiBhcnIuY29uY2F0KHN0ci5zcGxpdCgnXFxcXCcpLmpvaW4oJycpKTtcbiAgfSBlbHNlIHtcbiAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcXFx7Jykuam9pbignX19MVF9CUkFDRV9fJyk7XG4gICAgc3RyID0gc3RyLnNwbGl0KCdcXFxcfScpLmpvaW4oJ19fUlRfQlJBQ0VfXycpO1xuICAgIHJldHVybiBtYXAoYnJhY2VzKHN0ciwgYXJyLCBvcHRzKSwgZnVuY3Rpb24oZWxlKSB7XG4gICAgICBlbGUgPSBlbGUuc3BsaXQoJ19fTFRfQlJBQ0VfXycpLmpvaW4oJ3snKTtcbiAgICAgIHJldHVybiBlbGUuc3BsaXQoJ19fUlRfQlJBQ0VfXycpLmpvaW4oJ30nKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEhhbmRsZSBlc2NhcGVkIGRvdHM6IGB7MVxcXFwuMn1gXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlRG90cyhzdHIsIGFyciwgb3B0cykge1xuICBpZiAoIS9bXlxcXFxdXFwuLitcXFxcXFwuLy50ZXN0KHN0cikpIHtcbiAgICByZXR1cm4gYXJyLmNvbmNhdChzdHIuc3BsaXQoJ1xcXFwnKS5qb2luKCcnKSk7XG4gIH0gZWxzZSB7XG4gICAgc3RyID0gc3RyLnNwbGl0KCdcXFxcLicpLmpvaW4oJ19fRVNDX0RPVF9fJyk7XG4gICAgcmV0dXJuIG1hcChicmFjZXMoc3RyLCBhcnIsIG9wdHMpLCBmdW5jdGlvbihlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuc3BsaXQoJ19fRVNDX0RPVF9fJykuam9pbignLicpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogSGFuZGxlIGVzY2FwZWQgZG90czogYHsxXFxcXC4yfWBcbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGVQYXRocyhzdHIsIGFyciwgb3B0cykge1xuICBzdHIgPSBzdHIuc3BsaXQoJ1xcLy4nKS5qb2luKCdfX0VTQ19QQVRIX18nKTtcbiAgcmV0dXJuIG1hcChicmFjZXMoc3RyLCBhcnIsIG9wdHMpLCBmdW5jdGlvbihlbGUpIHtcbiAgICByZXR1cm4gZWxlLnNwbGl0KCdfX0VTQ19QQVRIX18nKS5qb2luKCdcXC8uJyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEhhbmRsZSBlc2NhcGVkIGNvbW1hczogYHthXFxcXCxifWBcbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGVDb21tYXMoc3RyLCBhcnIsIG9wdHMpIHtcbiAgaWYgKCEvXFx3LC8udGVzdChzdHIpKSB7XG4gICAgcmV0dXJuIGFyci5jb25jYXQoc3RyLnNwbGl0KCdcXFxcJykuam9pbignJykpO1xuICB9IGVsc2Uge1xuICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxcXCwnKS5qb2luKCdfX0VTQ19DT01NQV9fJyk7XG4gICAgcmV0dXJuIG1hcChicmFjZXMoc3RyLCBhcnIsIG9wdHMpLCBmdW5jdGlvbihlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuc3BsaXQoJ19fRVNDX0NPTU1BX18nKS5qb2luKCcsJyk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdleCBmb3IgY29tbW9uIHBhdHRlcm5zXG4gKi9cblxuZnVuY3Rpb24gcGF0dGVyblJlZ2V4KCkge1xuICByZXR1cm4gL1xcJFxce3xbIFxcdF18e318eyx9fFxcXFwsKD89Lipbe31dKXxcXC9cXC4oPz0uKlt7fV0pfFxcXFxcXC4oPz17KXxcXFxce3xcXFxcfS87XG59XG5cbi8qKlxuICogQnJhY2VzIHJlZ2V4LlxuICovXG5cbmZ1bmN0aW9uIGJyYWNlUmVnZXgoKSB7XG4gIHJldHVybiAvLiooXFxcXD9cXHsoW159XSspXFx9KS87XG59XG5cbi8qKlxuICogZXM2IGRlbGltaXRlciByZWdleC5cbiAqL1xuXG5mdW5jdGlvbiBlczZSZWdleCgpIHtcbiAgcmV0dXJuIC9cXCRcXHsoW159XSspXFx9Lztcbn1cblxudmFyIGJyYWNlUmU7XG52YXIgcGF0dGVyblJlO1xuXG4vKipcbiAqIEZhc3RlciBhbHRlcm5hdGl2ZSB0byBgU3RyaW5nLnJlcGxhY2UoKWAgd2hlbiB0aGVcbiAqIGluZGV4IG9mIHRoZSB0b2tlbiB0byBiZSByZXBsYWNlcyBjYW4ndCBiZSBzdXBwbGllZFxuICovXG5cbmZ1bmN0aW9uIHNwbGljZShzdHIsIHRva2VuLCByZXBsYWNlbWVudCkge1xuICB2YXIgaSA9IHN0ci5pbmRleE9mKHRva2VuKTtcbiAgcmV0dXJuIHN0ci5zdWJzdHIoMCwgaSkgKyByZXBsYWNlbWVudFxuICAgICsgc3RyLnN1YnN0cihpICsgdG9rZW4ubGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBGYXN0IGFycmF5IG1hcFxuICovXG5cbmZ1bmN0aW9uIG1hcChhcnIsIGZuKSB7XG4gIGlmIChhcnIgPT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xuICB2YXIgcmVzID0gbmV3IEFycmF5KGxlbik7XG4gIHZhciBpID0gLTE7XG5cbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIHJlc1tpXSA9IGZuKGFycltpXSwgaSwgYXJyKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogRmFzdCBhcnJheSBmaWx0ZXJcbiAqL1xuXG5mdW5jdGlvbiBmaWx0ZXIoYXJyLCBjYikge1xuICBpZiAoYXJyID09IG51bGwpIHJldHVybiBbXTtcbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2JyYWNlczogZmlsdGVyIGV4cGVjdHMgYSBjYWxsYmFjayBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xuICB2YXIgcmVzID0gYXJyLnNsaWNlKCk7XG4gIHZhciBpID0gMDtcblxuICB3aGlsZSAobGVuLS0pIHtcbiAgICBpZiAoIWNiKGFycltsZW5dLCBpKyspKSB7XG4gICAgICByZXMuc3BsaWNlKGxlbiwgMSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG4iLCIiLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuLypcbiAqIEV4cG9ydCBrTWF4TGVuZ3RoIGFmdGVyIHR5cGVkIGFycmF5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZC5cbiAqL1xuZXhwb3J0cy5rTWF4TGVuZ3RoID0ga01heExlbmd0aCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuZm9vID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKVxuICB9XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgfVxuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiAhKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20odGhpcywgYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tICh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhhdCwgdmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgICAvLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGFycmF5LmJ5dGVMZW5ndGggLy8gdGhpcyB0aHJvd3MgaWYgYGFycmF5YCBpcyBub3QgYSB2YWxpZCBBcnJheUJ1ZmZlclxuXG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aGAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAncmF3JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgc3RyaW5nIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmdcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgLy8gRGVwcmVjYXRlZFxuICAgICAgY2FzZSAncmF3JzpcbiAgICAgIGNhc2UgJ3Jhd3MnOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYmluYXJ5U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgZm91bmRJbmRleCA9IC0xXG4gIGZvciAodmFyIGkgPSAwOyBieXRlT2Zmc2V0ICsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlYWQoYXJyLCBieXRlT2Zmc2V0ICsgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIChieXRlT2Zmc2V0ICsgZm91bmRJbmRleCkgKiBpbmRleFNpemVcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPj49IDBcblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAtMVxuICBpZiAoYnl0ZU9mZnNldCA+PSB0aGlzLmxlbmd0aCkgcmV0dXJuIC0xXG5cbiAgLy8gTmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBNYXRoLm1heCh0aGlzLmxlbmd0aCArIGJ5dGVPZmZzZXQsIDApXG5cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIHNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZylcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YodGhpcywgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmluYXJ5V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGJpbmFyeVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gYmluYXJ5U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47IGkrKykge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgaSsrKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7IGkrKykge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgaSsrKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZXNjYXBlU3RyaW5nUmVnZXhwID0gcmVxdWlyZSgnZXNjYXBlLXN0cmluZy1yZWdleHAnKTtcbnZhciBhbnNpU3R5bGVzID0gcmVxdWlyZSgnYW5zaS1zdHlsZXMnKTtcbnZhciBzdHJpcEFuc2kgPSByZXF1aXJlKCdzdHJpcC1hbnNpJyk7XG52YXIgaGFzQW5zaSA9IHJlcXVpcmUoJ2hhcy1hbnNpJyk7XG52YXIgc3VwcG9ydHNDb2xvciA9IHJlcXVpcmUoJ3N1cHBvcnRzLWNvbG9yJyk7XG52YXIgZGVmaW5lUHJvcHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcztcbnZhciBpc1NpbXBsZVdpbmRvd3NUZXJtID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyAmJiAhL154dGVybS9pLnRlc3QocHJvY2Vzcy5lbnYuVEVSTSk7XG5cbmZ1bmN0aW9uIENoYWxrKG9wdGlvbnMpIHtcblx0Ly8gZGV0ZWN0IG1vZGUgaWYgbm90IHNldCBtYW51YWxseVxuXHR0aGlzLmVuYWJsZWQgPSAhb3B0aW9ucyB8fCBvcHRpb25zLmVuYWJsZWQgPT09IHVuZGVmaW5lZCA/IHN1cHBvcnRzQ29sb3IgOiBvcHRpb25zLmVuYWJsZWQ7XG59XG5cbi8vIHVzZSBicmlnaHQgYmx1ZSBvbiBXaW5kb3dzIGFzIHRoZSBub3JtYWwgYmx1ZSBjb2xvciBpcyBpbGxlZ2libGVcbmlmIChpc1NpbXBsZVdpbmRvd3NUZXJtKSB7XG5cdGFuc2lTdHlsZXMuYmx1ZS5vcGVuID0gJ1xcdTAwMWJbOTRtJztcbn1cblxudmFyIHN0eWxlcyA9IChmdW5jdGlvbiAoKSB7XG5cdHZhciByZXQgPSB7fTtcblxuXHRPYmplY3Qua2V5cyhhbnNpU3R5bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcblx0XHRhbnNpU3R5bGVzW2tleV0uY2xvc2VSZSA9IG5ldyBSZWdFeHAoZXNjYXBlU3RyaW5nUmVnZXhwKGFuc2lTdHlsZXNba2V5XS5jbG9zZSksICdnJyk7XG5cblx0XHRyZXRba2V5XSA9IHtcblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gYnVpbGQuY2FsbCh0aGlzLCB0aGlzLl9zdHlsZXMuY29uY2F0KGtleSkpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0pO1xuXG5cdHJldHVybiByZXQ7XG59KSgpO1xuXG52YXIgcHJvdG8gPSBkZWZpbmVQcm9wcyhmdW5jdGlvbiBjaGFsaygpIHt9LCBzdHlsZXMpO1xuXG5mdW5jdGlvbiBidWlsZChfc3R5bGVzKSB7XG5cdHZhciBidWlsZGVyID0gZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBhcHBseVN0eWxlLmFwcGx5KGJ1aWxkZXIsIGFyZ3VtZW50cyk7XG5cdH07XG5cblx0YnVpbGRlci5fc3R5bGVzID0gX3N0eWxlcztcblx0YnVpbGRlci5lbmFibGVkID0gdGhpcy5lbmFibGVkO1xuXHQvLyBfX3Byb3RvX18gaXMgdXNlZCBiZWNhdXNlIHdlIG11c3QgcmV0dXJuIGEgZnVuY3Rpb24sIGJ1dCB0aGVyZSBpc1xuXHQvLyBubyB3YXkgdG8gY3JlYXRlIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCBwcm90b3R5cGUuXG5cdC8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cdGJ1aWxkZXIuX19wcm90b19fID0gcHJvdG87XG5cblx0cmV0dXJuIGJ1aWxkZXI7XG59XG5cbmZ1bmN0aW9uIGFwcGx5U3R5bGUoKSB7XG5cdC8vIHN1cHBvcnQgdmFyYWdzLCBidXQgc2ltcGx5IGNhc3QgdG8gc3RyaW5nIGluIGNhc2UgdGhlcmUncyBvbmx5IG9uZSBhcmdcblx0dmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cdHZhciBhcmdzTGVuID0gYXJncy5sZW5ndGg7XG5cdHZhciBzdHIgPSBhcmdzTGVuICE9PSAwICYmIFN0cmluZyhhcmd1bWVudHNbMF0pO1xuXG5cdGlmIChhcmdzTGVuID4gMSkge1xuXHRcdC8vIGRvbid0IHNsaWNlIGBhcmd1bWVudHNgLCBpdCBwcmV2ZW50cyB2OCBvcHRpbWl6YXRpb25zXG5cdFx0Zm9yICh2YXIgYSA9IDE7IGEgPCBhcmdzTGVuOyBhKyspIHtcblx0XHRcdHN0ciArPSAnICcgKyBhcmdzW2FdO1xuXHRcdH1cblx0fVxuXG5cdGlmICghdGhpcy5lbmFibGVkIHx8ICFzdHIpIHtcblx0XHRyZXR1cm4gc3RyO1xuXHR9XG5cblx0dmFyIG5lc3RlZFN0eWxlcyA9IHRoaXMuX3N0eWxlcztcblx0dmFyIGkgPSBuZXN0ZWRTdHlsZXMubGVuZ3RoO1xuXG5cdC8vIFR1cm5zIG91dCB0aGF0IG9uIFdpbmRvd3MgZGltbWVkIGdyYXkgdGV4dCBiZWNvbWVzIGludmlzaWJsZSBpbiBjbWQuZXhlLFxuXHQvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYWxrL2NoYWxrL2lzc3Vlcy81OFxuXHQvLyBJZiB3ZSdyZSBvbiBXaW5kb3dzIGFuZCB3ZSdyZSBkZWFsaW5nIHdpdGggYSBncmF5IGNvbG9yLCB0ZW1wb3JhcmlseSBtYWtlICdkaW0nIGEgbm9vcC5cblx0dmFyIG9yaWdpbmFsRGltID0gYW5zaVN0eWxlcy5kaW0ub3Blbjtcblx0aWYgKGlzU2ltcGxlV2luZG93c1Rlcm0gJiYgKG5lc3RlZFN0eWxlcy5pbmRleE9mKCdncmF5JykgIT09IC0xIHx8IG5lc3RlZFN0eWxlcy5pbmRleE9mKCdncmV5JykgIT09IC0xKSkge1xuXHRcdGFuc2lTdHlsZXMuZGltLm9wZW4gPSAnJztcblx0fVxuXG5cdHdoaWxlIChpLS0pIHtcblx0XHR2YXIgY29kZSA9IGFuc2lTdHlsZXNbbmVzdGVkU3R5bGVzW2ldXTtcblxuXHRcdC8vIFJlcGxhY2UgYW55IGluc3RhbmNlcyBhbHJlYWR5IHByZXNlbnQgd2l0aCBhIHJlLW9wZW5pbmcgY29kZVxuXHRcdC8vIG90aGVyd2lzZSBvbmx5IHRoZSBwYXJ0IG9mIHRoZSBzdHJpbmcgdW50aWwgc2FpZCBjbG9zaW5nIGNvZGVcblx0XHQvLyB3aWxsIGJlIGNvbG9yZWQsIGFuZCB0aGUgcmVzdCB3aWxsIHNpbXBseSBiZSAncGxhaW4nLlxuXHRcdHN0ciA9IGNvZGUub3BlbiArIHN0ci5yZXBsYWNlKGNvZGUuY2xvc2VSZSwgY29kZS5vcGVuKSArIGNvZGUuY2xvc2U7XG5cdH1cblxuXHQvLyBSZXNldCB0aGUgb3JpZ2luYWwgJ2RpbScgaWYgd2UgY2hhbmdlZCBpdCB0byB3b3JrIGFyb3VuZCB0aGUgV2luZG93cyBkaW1tZWQgZ3JheSBpc3N1ZS5cblx0YW5zaVN0eWxlcy5kaW0ub3BlbiA9IG9yaWdpbmFsRGltO1xuXG5cdHJldHVybiBzdHI7XG59XG5cbmZ1bmN0aW9uIGluaXQoKSB7XG5cdHZhciByZXQgPSB7fTtcblxuXHRPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcblx0XHRyZXRbbmFtZV0gPSB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIGJ1aWxkLmNhbGwodGhpcywgW25hbWVdKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9KTtcblxuXHRyZXR1cm4gcmV0O1xufVxuXG5kZWZpbmVQcm9wcyhDaGFsay5wcm90b3R5cGUsIGluaXQoKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IENoYWxrKCk7XG5tb2R1bGUuZXhwb3J0cy5zdHlsZXMgPSBhbnNpU3R5bGVzO1xubW9kdWxlLmV4cG9ydHMuaGFzQ29sb3IgPSBoYXNBbnNpO1xubW9kdWxlLmV4cG9ydHMuc3RyaXBDb2xvciA9IHN0cmlwQW5zaTtcbm1vZHVsZS5leHBvcnRzLnN1cHBvcnRzQ29sb3IgPSBzdXBwb3J0c0NvbG9yO1xuIiwiLyohXG4gKiBjcmVhdGUtZnJhbWUgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2NyZWF0ZS1mcmFtZT5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZUZyYW1lKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjcmVhdGVGcmFtZSBleHBlY3RzIGRhdGEgdG8gYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICB2YXIgZXh0ZW5kID0gdXRpbHMuZXh0ZW5kO1xuICB2YXIgZnJhbWUgPSBleHRlbmQoe30sIGRhdGEpO1xuICBmcmFtZS5fcGFyZW50ID0gZGF0YTtcblxuICB1dGlscy5kZWZpbmUoZnJhbWUsICdleHRlbmQnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGV4dGVuZCh0aGlzLCBkYXRhKTtcbiAgfSk7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoLCBpID0gLTE7XG4gICAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgICAgZnJhbWUuZXh0ZW5kKGFyZ3NbaV0gfHwge30pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZnJhbWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENhY2hlIHJlc3VsdHMgb2YgdGhlIGZpcnN0IGZ1bmN0aW9uIGNhbGwgdG8gZW5zdXJlIG9ubHkgY2FsbGluZyBvbmNlLlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgdXRpbHMgPSByZXF1aXJlKCdsYXp5LWNhY2hlJykocmVxdWlyZSk7XG4gKiAvLyBjYWNoZSB0aGUgY2FsbCB0byBgcmVxdWlyZSgnYW5zaS15ZWxsb3cnKWBcbiAqIHV0aWxzKCdhbnNpLXllbGxvdycsICd5ZWxsb3cnKTtcbiAqIC8vIHVzZSBgYW5zaS15ZWxsb3dgXG4gKiBjb25zb2xlLmxvZyh1dGlscy55ZWxsb3coJ3RoaXMgaXMgeWVsbG93JykpO1xuICogYGBgXG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IGBmbmAgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2UuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gRnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHRvIGdldCB0aGUgY2FjaGVkIGZ1bmN0aW9uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGxhenlDYWNoZShmbikge1xuICB2YXIgY2FjaGUgPSB7fTtcbiAgdmFyIHByb3h5ID0gZnVuY3Rpb24obW9kLCBuYW1lKSB7XG4gICAgbmFtZSA9IG5hbWUgfHwgY2FtZWxjYXNlKG1vZCk7XG5cbiAgICAvLyBjaGVjayBib3RoIGJvb2xlYW4gYW5kIHN0cmluZyBpbiBjYXNlIGBwcm9jZXNzLmVudmAgY2FzZXMgdG8gc3RyaW5nXG4gICAgaWYgKHByb2Nlc3MuZW52LlVOTEFaWSA9PT0gJ3RydWUnIHx8IHByb2Nlc3MuZW52LlVOTEFaWSA9PT0gdHJ1ZSkge1xuICAgICAgY2FjaGVbbmFtZV0gPSBmbihtb2QpO1xuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm94eSwgbmFtZSwge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZ2V0dGVyXG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBnZXR0ZXIoKSB7XG4gICAgICBpZiAoY2FjaGUuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlW25hbWVdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChjYWNoZVtuYW1lXSA9IGZuKG1vZCkpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0dGVyO1xuICB9O1xuICByZXR1cm4gcHJveHk7XG59XG5cbi8qKlxuICogVXNlZCB0byBjYW1lbGNhc2UgdGhlIG5hbWUgdG8gYmUgc3RvcmVkIG9uIHRoZSBgbGF6eWAgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmAgU3RyaW5nIGNvbnRhaW5pbmcgYF9gLCBgLmAsIGAtYCBvciB3aGl0ZXNwYWNlIHRoYXQgd2lsbCBiZSBjYW1lbGNhc2VkLlxuICogQHJldHVybiB7U3RyaW5nfSBjYW1lbGNhc2VkIHN0cmluZy5cbiAqL1xuXG5mdW5jdGlvbiBjYW1lbGNhc2Uoc3RyKSB7XG4gIGlmIChzdHIubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC9eW1xcV19dK3xbXFxXX10rJC9nLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXFxXX10rKFxcd3wkKS9nLCBmdW5jdGlvbihfLCBjaCkge1xuICAgIHJldHVybiBjaC50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBFeHBvc2UgYGxhenlDYWNoZWBcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxhenlDYWNoZTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGxhenkgPSByZXF1aXJlKCdsYXp5LWNhY2hlJykocmVxdWlyZSk7XG5cbmxhenkoJ2V4dGVuZC1zaGFsbG93JywgJ2V4dGVuZCcpO1xubGF6eSgnZGVmaW5lLXByb3BlcnR5JywgJ2RlZmluZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxhenk7XG4iLCIvKipcbiAqIEV4cG9zZSBgRGF0ZWBcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL3BhcnNlcicpO1xuIiwiLyoqXG4gKiBNb2R1bGUgRGVwZW5kZW5jaWVzXG4gKi9cblxudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnZGF0ZTpkYXRlJyk7XG5cbi8qKlxuICogVGltZSBjb25zdGFudHNcbiAqL1xuXG52YXIgX3NlY29uZCA9IDEwMDA7XG52YXIgX21pbnV0ZSA9IDYwICogX3NlY29uZDtcbnZhciBfaG91ciA9IDYwICogX21pbnV0ZTtcbnZhciBfZGF5ID0gMjQgKiBfaG91cjtcbnZhciBfd2VlayA9IDcgKiBfZGF5O1xudmFyIF95ZWFyID0gNTYgKiBfd2VlaztcbnZhciBfZGF5c0luTW9udGggPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07XG5cbi8qKlxuICogRXhwb3NlIGBkYXRlYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGF0ZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGBkYXRlYFxuICpcbiAqIEBwYXJhbSB7RGF0ZX0gb2Zmc2V0IChvcHRpb25hbClcbiAqIEByZXR1cm4ge0RhdGV9XG4gKiBAYXBpIHB1YmxpY3NcbiAqL1xuXG5mdW5jdGlvbiBkYXRlKG9mZnNldCkge1xuICBpZighKHRoaXMgaW5zdGFuY2VvZiBkYXRlKSkgcmV0dXJuIG5ldyBkYXRlKG9mZnNldCk7XG4gIHRoaXMuX2NoYW5nZWQgPSB7fTtcbiAgdGhpcy5kYXRlID0gbmV3IERhdGUob2Zmc2V0KTtcbn07XG5cbi8qKlxuICogQ2xvbmUgdGhlIGN1cnJlbnQgZGF0ZVxuICovXG5cbmRhdGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgRGF0ZSh0aGlzLmRhdGUpO1xufVxuXG4vKipcbiAqIEhhcyBjaGFuZ2VkXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuXG5kYXRlLnByb3RvdHlwZS5jaGFuZ2VkID0gZnVuY3Rpb24oc3RyKSB7XG4gIGlmICh0aGlzLl9jaGFuZ2VkW3N0cl0gPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdGhpcy5fY2hhbmdlZFtzdHJdO1xufTtcblxuLyoqXG4gKiBhZGQgb3Igc3VidHJhY3Qgc2Vjb25kc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtkYXRlfVxuICovXG5cbmRhdGUucHJvdG90eXBlLnNlY29uZCA9IGZ1bmN0aW9uKG4pIHtcbiAgdmFyIHNlY29uZHMgPSArbiAqIF9zZWNvbmQ7XG4gIHRoaXMudXBkYXRlKHNlY29uZHMpO1xuICB0aGlzLl9jaGFuZ2VkWydzZWNvbmRzJ10gPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBhZGQgb3Igc3VidHJhY3QgbWludXRlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtkYXRlfVxuICovXG5cbmRhdGUucHJvdG90eXBlLm1pbnV0ZSA9IGZ1bmN0aW9uKG4pIHtcbiAgdmFyIG1pbnV0ZXMgPSArbiAqIF9taW51dGU7XG4gIHRoaXMudXBkYXRlKG1pbnV0ZXMpO1xuICB0aGlzLl9jaGFuZ2VkWydtaW51dGVzJ10gPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBhZGQgb3Igc3VidHJhY3QgaG91cnNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gblxuICogQHJldHVybiB7ZGF0ZX1cbiAqL1xuXG5kYXRlLnByb3RvdHlwZS5ob3VyID0gZnVuY3Rpb24obikge1xuICB2YXIgaG91cnMgPSArbiAqIF9ob3VyO1xuICB0aGlzLnVwZGF0ZShob3Vycyk7XG4gIHRoaXMuX2NoYW5nZWRbJ2hvdXJzJ10gPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBhZGQgb3Igc3VidHJhY3QgZGF5c1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtkYXRlfVxuICovXG5cbmRhdGUucHJvdG90eXBlLmRheSA9IGZ1bmN0aW9uKG4pIHtcbiAgdmFyIGRheXMgPSArbiAqIF9kYXk7XG4gIHRoaXMudXBkYXRlKGRheXMpO1xuICB0aGlzLl9jaGFuZ2VkWydkYXlzJ10gPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBhZGQgb3Igc3VidHJhY3Qgd2Vla3NcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gblxuICogQHJldHVybiB7ZGF0ZX1cbiAqL1xuXG5kYXRlLnByb3RvdHlwZS53ZWVrID0gZnVuY3Rpb24obikge1xuICB2YXIgd2Vla3MgPSArbiAqIF93ZWVrO1xuICB0aGlzLnVwZGF0ZSh3ZWVrcyk7XG4gIHRoaXMuX2NoYW5nZWRbJ3dlZWtzJ10gPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBhZGQgb3Igc3VidHJhY3QgbW9udGhzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEByZXR1cm4ge0RhdGV9XG4gKi9cblxuZGF0ZS5wcm90b3R5cGUubW9udGggPSBmdW5jdGlvbihuKSB7XG4gIHZhciBkID0gdGhpcy5kYXRlO1xuICB2YXIgZGF5ID0gZC5nZXREYXRlKCk7XG4gIGQuc2V0RGF0ZSgxKTtcbiAgdmFyIG1vbnRoID0gK24gKyBkLmdldE1vbnRoKCk7XG4gIGQuc2V0TW9udGgobW9udGgpO1xuXG4gIC8vIEhhbmRsZSBkYXRlcyB3aXRoIGxlc3MgZGF5c1xuICB2YXIgZGltID0gdGhpcy5kYXlzSW5Nb250aChtb250aClcbiAgZC5zZXREYXRlKE1hdGgubWluKGRpbSwgZGF5KSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBnZXQgdGhlIGRheXMgaW4gdGhlIG1vbnRoXG4gKi9cblxuZGF0ZS5wcm90b3R5cGUuZGF5c0luTW9udGggPSBmdW5jdGlvbihtKSB7XG4gIHZhciBkaW0gPSBfZGF5c0luTW9udGhbbV07XG4gIHZhciBsZWFwID0gbGVhcHllYXIodGhpcy5kYXRlLmdldEZ1bGxZZWFyKCkpO1xuICByZXR1cm4gKDEgPT0gbSAmJiBsZWFwKSA/IDI5IDogMjg7XG59O1xuXG4vKipcbiAqIGFkZCBvciBzdWJ0cmFjdCB5ZWFyc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtkYXRlfVxuICovXG5cbmRhdGUucHJvdG90eXBlLnllYXIgPSBmdW5jdGlvbihuKSB7XG4gIHZhciB5ciA9IHRoaXMuZGF0ZS5nZXRGdWxsWWVhcigpO1xuICB5ciArPSArbjtcbiAgdGhpcy5kYXRlLnNldEZ1bGxZZWFyKHlyKTtcbiAgdGhpcy5fY2hhbmdlZFsneWVhcnMnXSA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIFNldCB0aGUgdGltZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBoXG4gKiBAcGFyYW0ge1N0cmluZ30gbVxuICogQHBhcmFtIHtTdHJpbmd9IHNcbiAqIEByZXR1cm4ge2RhdGV9XG4gKi9cblxuZGF0ZS5wcm90b3R5cGUudGltZSA9IGZ1bmN0aW9uKGgsIG0sIHMsIG1lcmlkaWVtKSB7XG4gIGlmIChoID09PSBmYWxzZSkge1xuICAgIGggPSB0aGlzLmRhdGUuZ2V0SG91cnMoKTtcbiAgfSBlbHNlIHtcbiAgICBoID0gK2ggfHwgMDtcbiAgICB0aGlzLl9jaGFuZ2VkWydob3VycyddID0gaDtcbiAgfVxuXG4gIGlmIChtID09PSBmYWxzZSkge1xuICAgIG0gPSB0aGlzLmRhdGUuZ2V0TWludXRlcygpO1xuICB9IGVsc2Uge1xuICAgIG0gPSArbSB8fCAwO1xuICAgIHRoaXMuX2NoYW5nZWRbJ21pbnV0ZXMnXSA9IG07XG4gIH1cblxuICBpZiAocyA9PT0gZmFsc2UpIHtcbiAgICBzID0gdGhpcy5kYXRlLmdldFNlY29uZHMoKTtcbiAgfSBlbHNlIHtcbiAgICBzID0gK3MgfHwgMDtcbiAgICB0aGlzLl9jaGFuZ2VkWydzZWNvbmRzJ10gPSBzO1xuICB9XG5cbiAgdGhpcy5kYXRlLnNldEhvdXJzKGgsIG0sIHMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRHluYW1pY2FsbHkgY3JlYXRlIGRheSBmdW5jdGlvbnMgKHN1bmRheShuKSwgbW9uZGF5KG4pLCBldGMuKVxuICovXG5cbnZhciBkYXlzID0gWydzdW5kYXknLCAnbW9uZGF5JywgJ3R1ZXNkYXknLCAnd2VkbmVzZGF5JywgJ3RodXJzZGF5JywgJ2ZyaWRheScsICdzYXR1cmRheSddO1xuZGF5cy5mb3JFYWNoKGZ1bmN0aW9uKGRheSwgaSkge1xuICBkYXRlLnByb3RvdHlwZVtkYXlzW2ldXSA9IGZ1bmN0aW9uKG4pIHtcbiAgICB0aGlzLl9jaGFuZ2VkWydkYXlzJ10gPSB0cnVlO1xuICAgIHRoaXMudXBkYXRlRGF5KGksIG4pO1xuICB9O1xufSk7XG5cbi8qKlxuICogZ28gdG8gZGF5IG9mIHdlZWtcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gZGF5XG4gKiBAcGFyYW0ge051bWJlcn0gblxuICogQHJldHVybiB7ZGF0ZX1cbiAqL1xuXG5kYXRlLnByb3RvdHlwZS51cGRhdGVEYXkgPSBmdW5jdGlvbihkLCBuKSB7XG4gIG4gPSArKG4gfHwgMSk7XG4gIHZhciBkaWZmID0gKGQgLSB0aGlzLmRhdGUuZ2V0RGF5KCkgKyA3KSAlIDc7XG4gIGlmIChuID4gMCkgLS1uO1xuICBkaWZmICs9ICg3ICogbik7XG4gIHRoaXMudXBkYXRlKGRpZmYgKiBfZGF5KTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogVXBkYXRlIHRoZSBkYXRlXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtEYXRlfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZGF0ZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24obXMpIHtcbiAgdGhpcy5kYXRlID0gbmV3IERhdGUodGhpcy5kYXRlLmdldFRpbWUoKSArIG1zKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIGxlYXAgeWVhclxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB5clxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuXG5mdW5jdGlvbiBsZWFweWVhcih5cikge1xuICByZXR1cm4gKHlyICUgNCA9PT0gMCAmJiB5ciAlIDEwMCAhPT0gMCkgfHwgeXIgJSA0MDAgPT09IDA7XG59XG4iLCIvKipcbiAqIE1vZHVsZSBEZXBlbmRlbmNpZXNcbiAqL1xuXG52YXIgZGF0ZSA9IHJlcXVpcmUoJy4vZGF0ZScpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnZGF0ZTpwYXJzZXInKTtcblxuLyoqXG4gKiBEYXlzXG4gKi9cblxudmFyIGRheXMgPSBbJ3N1bmRheScsICdtb25kYXknLCAndHVlc2RheScsICd3ZWRuZXNkYXknLCAndGh1cnNkYXknLCAnZnJpZGF5JywgJ3NhdHVyZGF5J107XG52YXIgbW9udGhzID0gWydqYW51YXJ5JywgJ2ZlYnJ1YXJ5JywgJ21hcmNoJywgJ2FwcmlsJywgJ21heScsICdqdW5lJywgJ2p1bHknLCAnYXVndXN0JywgJ3NlcHRlbWJlcicsXG4gICAgICAgICAgICAgICdvY3RvYmVyJywgJ25vdmVtYmVyJywgJ2RlY2VtYmVyJyBdXG5cbi8qKlxuICogUmVnZXhzXG4gKi9cblxuLy8gNSwgMDUsIDU6MzAsIDUuMzAsIDA1OjMwOjEwLCAwNTozMC4xMCwgMDUuMzAuMTAsIGF0IDVcbnZhciByTWVyaWRpZW0gPSAvXihcXGR7MSwyfSkoWzouXShcXGR7MSwyfSkpPyhbOi5dKFxcZHsxLDJ9KSk/XFxzKihbYXBdbSkvO1xudmFyIHJIb3VyTWludXRlID0gL14oXFxkezEsMn0pKFs6Ll0oXFxkezEsMn0pKShbOi5dKFxcZHsxLDJ9KSk/LztcbnZhciByQXRIb3VyID0gL15hdFxccz8oXFxkezEsMn0pJC87XG52YXIgckRheXMgPSAvXFxiKHN1bihkYXkpP3xtb24oZGF5KT98dHVlcyhkYXkpP3x3ZWQobmVzZGF5KT98dGh1cihzZGF5fHMpP3xmcmkoZGF5KT98c2F0KHVyZGF5KT8pcz9cXGIvO1xudmFyIHJNb250aHMgPSAvXigoXFxkezEsMn0pKHN0fG5kfHJkfHRoKSlcXHNvZlxccyhqYW51YXJ5fGZlYnJ1YXJ5fG1hcmNofGFwcmlsfG1heXxqdW5lfGp1bHl8YXVndXN0fHNlcHRlbWJlcnxvY3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pO1xudmFyIHJQYXN0ID0gL1xcYihsYXN0fHllc3RlcmRheXxhZ28pXFxiLztcbnZhciByRGF5TW9kID0gL1xcYihtb3JuaW5nfG5vb258YWZ0ZXJub29ufG5pZ2h0fGV2ZW5pbmd8bWlkbmlnaHQpXFxiLztcbnZhciByQWdvID0gL14oXFxkKilcXHM/XFxiKHNlY29uZHxtaW51dGV8aG91cnxkYXl8d2Vla3xtb250aHx5ZWFyKVtzXT9cXGJcXHM/YWdvJC87XG5cbi8qKlxuICogRXhwb3NlIGBwYXJzZXJgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZXI7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBgcGFyc2VyYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge0RhdGV9XG4gKiBAYXBpIHB1YmxpY3NcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZXIoc3RyLCBvZmZzZXQpIHtcbiAgaWYoISh0aGlzIGluc3RhbmNlb2YgcGFyc2VyKSkgcmV0dXJuIG5ldyBwYXJzZXIoc3RyLCBvZmZzZXQpO1xuICBpZih0eXBlb2Ygb2Zmc2V0ID09ICdzdHJpbmcnKSBvZmZzZXQgPSBwYXJzZXIob2Zmc2V0KTtcbiAgdmFyIGQgPSBvZmZzZXQgfHwgbmV3IERhdGU7XG4gIHRoaXMuZGF0ZSA9IG5ldyBkYXRlKGQpO1xuICB0aGlzLm9yaWdpbmFsID0gc3RyO1xuICB0aGlzLnN0ciA9IHN0ci50b0xvd2VyQ2FzZSgpO1xuICB0aGlzLnN0YXNoID0gW107XG4gIHRoaXMudG9rZW5zID0gW107XG4gIHdoaWxlICh0aGlzLmFkdmFuY2UoKSAhPT0gJ2VvcycpO1xuICBkZWJ1ZygndG9rZW5zICVqJywgdGhpcy50b2tlbnMpXG4gIHRoaXMubmV4dFRpbWUoZCk7XG4gIGlmICh0aGlzLmRhdGUuZGF0ZSA9PSBkKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0ZScpO1xuICByZXR1cm4gdGhpcy5kYXRlLmRhdGU7XG59O1xuXG4vKipcbiAqIEFkdmFuY2UgYSB0b2tlblxuICovXG5cbnBhcnNlci5wcm90b3R5cGUuYWR2YW5jZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgdG9rID0gdGhpcy5lb3MoKVxuICAgIHx8IHRoaXMuc3BhY2UoKVxuICAgIHx8IHRoaXMuX25leHQoKVxuICAgIHx8IHRoaXMubGFzdCgpXG4gICAgfHwgdGhpcy5kYXlCeU5hbWUoKVxuICAgIHx8IHRoaXMubW9udGhCeU5hbWUoKVxuICAgIHx8IHRoaXMudGltZUFnbygpXG4gICAgfHwgdGhpcy5hZ28oKVxuICAgIHx8IHRoaXMueWVzdGVyZGF5KClcbiAgICB8fCB0aGlzLnRvbW9ycm93KClcbiAgICB8fCB0aGlzLm5vb24oKVxuICAgIHx8IHRoaXMubWlkbmlnaHQoKVxuICAgIHx8IHRoaXMubmlnaHQoKVxuICAgIHx8IHRoaXMuZXZlbmluZygpXG4gICAgfHwgdGhpcy5hZnRlcm5vb24oKVxuICAgIHx8IHRoaXMubW9ybmluZygpXG4gICAgfHwgdGhpcy50b25pZ2h0KClcbiAgICB8fCB0aGlzLm1lcmlkaWVtKClcbiAgICB8fCB0aGlzLmhvdXJtaW51dGUoKVxuICAgIHx8IHRoaXMuYXRob3VyKClcbiAgICB8fCB0aGlzLndlZWsoKVxuICAgIHx8IHRoaXMubW9udGgoKVxuICAgIHx8IHRoaXMueWVhcigpXG4gICAgfHwgdGhpcy5zZWNvbmQoKVxuICAgIHx8IHRoaXMubWludXRlKClcbiAgICB8fCB0aGlzLmhvdXIoKVxuICAgIHx8IHRoaXMuZGF5KClcbiAgICB8fCB0aGlzLm51bWJlcigpXG4gICAgfHwgdGhpcy5zdHJpbmcoKVxuICAgIHx8IHRoaXMub3RoZXIoKTtcblxuICB0aGlzLnRva2Vucy5wdXNoKHRvayk7XG4gIHJldHVybiB0b2s7XG59O1xuXG4vKipcbiAqIExvb2thaGVhZCBgbmAgdG9rZW5zLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5wYXJzZXIucHJvdG90eXBlLmxvb2thaGVhZCA9IGZ1bmN0aW9uKG4pe1xuICB2YXIgZmV0Y2ggPSBuIC0gdGhpcy5zdGFzaC5sZW5ndGg7XG4gIGlmIChmZXRjaCA9PSAwKSByZXR1cm4gdGhpcy5sb29rYWhlYWQoKytuKTtcbiAgd2hpbGUgKGZldGNoLS0gPiAwKSB0aGlzLnN0YXNoLnB1c2godGhpcy5hZHZhbmNlKCkpO1xuICByZXR1cm4gdGhpcy5zdGFzaFstLW5dO1xufTtcblxuLyoqXG4gKiBMb29rYWhlYWQgYSBzaW5nbGUgdG9rZW4uXG4gKlxuICogQHJldHVybiB7VG9rZW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5wYXJzZXIucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMubG9va2FoZWFkKDEpO1xufTtcblxuLyoqXG4gKiBGZXRjaCBuZXh0IHRva2VuIGluY2x1ZGluZyB0aG9zZSBzdGFzaGVkIGJ5IHBlZWsuXG4gKlxuICogQHJldHVybiB7VG9rZW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5wYXJzZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHRvayA9IHRoaXMuc3Rhc2hlZCgpIHx8IHRoaXMuYWR2YW5jZSgpO1xuICByZXR1cm4gdG9rO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIG5leHQgcG9zc2libHkgc3Rhc2hlZCB0b2tlbi5cbiAqXG4gKiBAcmV0dXJuIHtUb2tlbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbnBhcnNlci5wcm90b3R5cGUuc3Rhc2hlZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3Rhc2hlZCA9IHRoaXMuc3Rhc2guc2hpZnQoKTtcbiAgcmV0dXJuIHN0YXNoZWQ7XG59O1xuXG4vKipcbiAqIENvbnN1bWUgdGhlIGdpdmVuIGBsZW5gLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfEFycmF5fSBsZW5cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbnBhcnNlci5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKGxlbil7XG4gIHRoaXMuc3RyID0gdGhpcy5zdHIuc3Vic3RyKEFycmF5LmlzQXJyYXkobGVuKVxuICAgID8gbGVuWzBdLmxlbmd0aFxuICAgIDogbGVuKTtcbn07XG5cbi8qKlxuICogRU9TXG4gKi9cblxucGFyc2VyLnByb3RvdHlwZS5lb3MgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuc3RyLmxlbmd0aCkgcmV0dXJuO1xuICByZXR1cm4gJ2Vvcyc7XG59O1xuXG4vKipcbiAqIFNwYWNlXG4gKi9cblxucGFyc2VyLnByb3RvdHlwZS5zcGFjZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FwdHVyZXM7XG4gIGlmIChjYXB0dXJlcyA9IC9eKFsgXFx0XSspLy5leGVjKHRoaXMuc3RyKSkge1xuICAgIHRoaXMuc2tpcChjYXB0dXJlcyk7XG4gICAgcmV0dXJuIHRoaXMuYWR2YW5jZSgpO1xuICB9XG59O1xuXG4vKipcbiAqIFNlY29uZFxuICovXG5cbnBhcnNlci5wcm90b3R5cGUuc2Vjb25kID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjYXB0dXJlcztcbiAgaWYgKGNhcHR1cmVzID0gL15zKGVjfGVjb25kKT9zPy8uZXhlYyh0aGlzLnN0cikpIHtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHJldHVybiAnc2Vjb25kJztcbiAgfVxufTtcblxuLyoqXG4gKiBNaW51dGVcbiAqL1xuXG5wYXJzZXIucHJvdG90eXBlLm1pbnV0ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FwdHVyZXM7XG4gIGlmIChjYXB0dXJlcyA9IC9ebShpbnxpbnV0ZSk/cz8vLmV4ZWModGhpcy5zdHIpKSB7XG4gICAgdGhpcy5za2lwKGNhcHR1cmVzKTtcbiAgICByZXR1cm4gJ21pbnV0ZSc7XG4gIH1cbn07XG5cbi8qKlxuICogSG91clxuICovXG5cbnBhcnNlci5wcm90b3R5cGUuaG91ciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FwdHVyZXM7XG4gIGlmIChjYXB0dXJlcyA9IC9eaChyfG91cilzPy8uZXhlYyh0aGlzLnN0cikpIHtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHJldHVybiAnaG91cic7XG4gIH1cbn07XG5cbi8qKlxuICogRGF5XG4gKi9cblxucGFyc2VyLnByb3RvdHlwZS5kYXkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNhcHR1cmVzO1xuICBpZiAoY2FwdHVyZXMgPSAvXmQoYXkpP3M/Ly5leGVjKHRoaXMuc3RyKSkge1xuICAgIHRoaXMuc2tpcChjYXB0dXJlcyk7XG4gICAgcmV0dXJuICdkYXknO1xuICB9XG59O1xuXG4vKipcbiAqIERheSBieSBuYW1lXG4gKi9cblxucGFyc2VyLnByb3RvdHlwZS5kYXlCeU5hbWUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNhcHR1cmVzO1xuICB2YXIgciA9IG5ldyBSZWdFeHAoJ14nICsgckRheXMuc291cmNlKTtcbiAgaWYgKGNhcHR1cmVzID0gci5leGVjKHRoaXMuc3RyKSkge1xuICAgIHZhciBkYXkgPSBjYXB0dXJlc1sxXTtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHRoaXMuZGF0ZVtkYXldKDEpO1xuICAgIHJldHVybiBjYXB0dXJlc1sxXTtcbiAgfVxufTtcblxuXG4vKipcbiAqIE1vbnRoIGJ5IG5hbWVcbiAqL1xuXG5wYXJzZXIucHJvdG90eXBlLm1vbnRoQnlOYW1lID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjYXB0dXJlcztcbiAgaWYgKGNhcHR1cmVzID0gck1vbnRocy5leGVjKHRoaXMuc3RyKSkge1xuICAgIHZhciBkYXkgPSBjYXB0dXJlc1syXVxuICAgIHZhciBtb250aCA9IGNhcHR1cmVzWzRdO1xuICAgIHRoaXMuZGF0ZS5kYXRlLnNldE1vbnRoKChtb250aHMuaW5kZXhPZihtb250aCkpKTtcbiAgICBpZiAoZGF5KSB0aGlzLmRhdGUuZGF0ZS5zZXREYXRlKHBhcnNlSW50KGRheSkpO1xuICAgIHRoaXMuc2tpcChjYXB0dXJlcyk7XG4gICAgcmV0dXJuIGNhcHR1cmVzWzBdO1xuICB9XG59O1xuXG5cbnBhcnNlci5wcm90b3R5cGUudGltZUFnbyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FwdHVyZXM7XG4gIGlmIChjYXB0dXJlcyA9IHJBZ28uZXhlYyh0aGlzLnN0cikpIHtcbiAgICB2YXIgbnVtID0gY2FwdHVyZXNbMV07XG4gICAgdmFyIG1vZCA9IGNhcHR1cmVzWzJdO1xuICAgIHRoaXMuZGF0ZVttb2RdKC1udW0pO1xuICAgIHRoaXMuc2tpcChjYXB0dXJlcyk7XG4gICAgcmV0dXJuICd0aW1lQWdvJztcbiAgfVxufTtcblxuLyoqXG4gKiBXZWVrXG4gKi9cblxucGFyc2VyLnByb3RvdHlwZS53ZWVrID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjYXB0dXJlcztcbiAgaWYgKGNhcHR1cmVzID0gL153KGt8ZWVrKXM/Ly5leGVjKHRoaXMuc3RyKSkge1xuICAgIHRoaXMuc2tpcChjYXB0dXJlcyk7XG4gICAgcmV0dXJuICd3ZWVrJztcbiAgfVxufTtcblxuLyoqXG4gKiBNb250aFxuICovXG5cbnBhcnNlci5wcm90b3R5cGUubW9udGggPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNhcHR1cmVzO1xuICBpZiAoY2FwdHVyZXMgPSAvXm1vbih0aCk/KGVzfHMpP1xcYi8uZXhlYyh0aGlzLnN0cikpIHtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHJldHVybiAnbW9udGgnO1xuICB9XG5cbn07XG5cbi8qKlxuICogV2Vla1xuICovXG5cbnBhcnNlci5wcm90b3R5cGUueWVhciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FwdHVyZXM7XG4gIGlmIChjYXB0dXJlcyA9IC9eeShyfGVhcilzPy8uZXhlYyh0aGlzLnN0cikpIHtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHJldHVybiAneWVhcic7XG4gIH1cbn07XG5cbi8qKlxuICogTWVyaWRpZW0gYW0vcG1cbiAqL1xuXG5wYXJzZXIucHJvdG90eXBlLm1lcmlkaWVtID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjYXB0dXJlcztcbiAgaWYgKGNhcHR1cmVzID0gck1lcmlkaWVtLmV4ZWModGhpcy5zdHIpKSB7XG4gICAgdGhpcy5za2lwKGNhcHR1cmVzKTtcbiAgICB0aGlzLnRpbWUoY2FwdHVyZXNbMV0sIGNhcHR1cmVzWzNdLCBjYXB0dXJlc1s1XSwgY2FwdHVyZXNbNl0pO1xuICAgIHJldHVybiAnbWVyaWRpZW0nO1xuICB9XG59O1xuXG4vKipcbiAqIEhvdXIgTWludXRlIChleC4gMTI6MzApXG4gKi9cblxucGFyc2VyLnByb3RvdHlwZS5ob3VybWludXRlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjYXB0dXJlcztcbiAgaWYgKGNhcHR1cmVzID0gckhvdXJNaW51dGUuZXhlYyh0aGlzLnN0cikpIHtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHRoaXMudGltZShjYXB0dXJlc1sxXSwgY2FwdHVyZXNbM10sIGNhcHR1cmVzWzVdLCB0aGlzLl9tZXJpZGllbSk7XG4gICAgcmV0dXJuICdob3VybWludXRlJztcbiAgfVxufTtcblxuLyoqXG4gKiBBdCBIb3VyIChleC4gYXQgNSlcbiAqL1xuXG5wYXJzZXIucHJvdG90eXBlLmF0aG91ciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FwdHVyZXM7XG4gIGlmIChjYXB0dXJlcyA9IHJBdEhvdXIuZXhlYyh0aGlzLnN0cikpIHtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHRoaXMudGltZShjYXB0dXJlc1sxXSwgMCwgMCwgdGhpcy5fbWVyaWRpZW0pO1xuICAgIHRoaXMuX21lcmlkaWVtID0gbnVsbDtcbiAgICByZXR1cm4gJ2F0aG91cic7XG4gIH1cbn07XG5cbi8qKlxuICogVGltZSBzZXQgaGVscGVyXG4gKi9cblxucGFyc2VyLnByb3RvdHlwZS50aW1lID0gZnVuY3Rpb24oaCwgbSwgcywgbWVyaWRpZW0pIHtcbiAgdmFyIGQgPSB0aGlzLmRhdGU7XG4gIHZhciBiZWZvcmUgPSBkLmNsb25lKCk7XG5cbiAgaWYgKG1lcmlkaWVtKSB7XG4gICAgLy8gY29udmVydCB0byAyNCBob3VyXG4gICAgaCA9ICgncG0nID09IG1lcmlkaWVtICYmIDEyID4gaCkgPyAraCArIDEyIDogaDsgLy8gNnBtID0+IDE4XG4gICAgaCA9ICgnYW0nID09IG1lcmlkaWVtICYmIDEyID09IGgpID8gMCA6IGg7IC8vIDEyYW0gPT4gMFxuICB9XG5cbiAgbSA9ICghbSAmJiBkLmNoYW5nZWQoJ21pbnV0ZXMnKSkgPyBmYWxzZSA6IG07XG4gIHMgPSAoIXMgJiYgZC5jaGFuZ2VkKCdzZWNvbmRzJykpID8gZmFsc2UgOiBzO1xuICBkLnRpbWUoaCwgbSwgcyk7XG59O1xuXG4vKipcbiAqIEJlc3QgYXR0ZW1wdCB0byBwaWNrIHRoZSBuZXh0IHRpbWUgdGhpcyBkYXRlIHdpbGwgb2NjdXJcbiAqXG4gKiBUT0RPOiBwbGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXJzaW5nXG4gKi9cblxucGFyc2VyLnByb3RvdHlwZS5uZXh0VGltZSA9IGZ1bmN0aW9uKGJlZm9yZSkge1xuICB2YXIgZCA9IHRoaXMuZGF0ZTtcbiAgdmFyIG9yaWcgPSB0aGlzLm9yaWdpbmFsO1xuXG4gIGlmIChiZWZvcmUgPD0gZC5kYXRlIHx8IHJQYXN0LnRlc3Qob3JpZykpIHJldHVybiB0aGlzO1xuXG4gIC8vIElmIHRpbWUgaXMgaW4gdGhlIHBhc3QsIHdlIG5lZWQgdG8gZ3Vlc3MgYXQgdGhlIG5leHQgdGltZVxuICBpZiAockRheXMudGVzdChvcmlnKSkge1xuICAgIGQuZGF5KDcpO1xuICB9IGVsc2UgaWYgKChiZWZvcmUgLSBkLmRhdGUpIC8gMTAwMCA+IDYwKSB7XG4gICAgLy8gSWYgaXQgaXMgYSBtb250aCBpbiB0aGUgcGFzdCwgZG9uJ3QgYWRkIGEgZGF5XG4gICAgaWYgKHJNb250aHMudGVzdChvcmlnKSkge1xuICAgICAgZC5kYXkoMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGQuZGF5KDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBZZXN0ZXJkYXlcbiAqL1xuXG5wYXJzZXIucHJvdG90eXBlLnllc3RlcmRheSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FwdHVyZXM7XG4gIGlmIChjYXB0dXJlcyA9IC9eKHllcyh0ZXJkYXkpPykvLmV4ZWModGhpcy5zdHIpKSB7XG4gICAgdGhpcy5za2lwKGNhcHR1cmVzKTtcbiAgICB0aGlzLmRhdGUuZGF5KC0xKTtcbiAgICByZXR1cm4gJ3llc3RlcmRheSc7XG4gIH1cbn07XG5cbi8qKlxuICogVG9tb3Jyb3dcbiAqL1xuXG5wYXJzZXIucHJvdG90eXBlLnRvbW9ycm93ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjYXB0dXJlcztcbiAgaWYgKGNhcHR1cmVzID0gL150b20ob3Jyb3cpPy8uZXhlYyh0aGlzLnN0cikpIHtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHRoaXMuZGF0ZS5kYXkoMSk7XG4gICAgcmV0dXJuICd0b21vcnJvdyc7XG4gIH1cbn07XG5cbi8qKlxuICogTm9vblxuICovXG5cbnBhcnNlci5wcm90b3R5cGUubm9vbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FwdHVyZXM7XG4gIGlmIChjYXB0dXJlcyA9IC9ebm9vblxcYi8uZXhlYyh0aGlzLnN0cikpIHtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHZhciBiZWZvcmUgPSB0aGlzLmRhdGUuY2xvbmUoKTtcbiAgICB0aGlzLmRhdGUuZGF0ZS5zZXRIb3VycygxMiwgMCwgMCk7XG4gICAgcmV0dXJuICdub29uJztcbiAgfVxufTtcblxuLyoqXG4gKiBNaWRuaWdodFxuICovXG5cbnBhcnNlci5wcm90b3R5cGUubWlkbmlnaHQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNhcHR1cmVzO1xuICBpZiAoY2FwdHVyZXMgPSAvXm1pZG5pZ2h0XFxiLy5leGVjKHRoaXMuc3RyKSkge1xuICAgIHRoaXMuc2tpcChjYXB0dXJlcyk7XG4gICAgdmFyIGJlZm9yZSA9IHRoaXMuZGF0ZS5jbG9uZSgpO1xuICAgIHRoaXMuZGF0ZS5kYXRlLnNldEhvdXJzKDAsIDAsIDApO1xuICAgIHJldHVybiAnbWlkbmlnaHQnO1xuICB9XG59O1xuXG4vKipcbiAqIE5pZ2h0IChhcmJpdHJhcmlseSBzZXQgYXQgN3BtKVxuICovXG5cbnBhcnNlci5wcm90b3R5cGUubmlnaHQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNhcHR1cmVzO1xuICBpZiAoY2FwdHVyZXMgPSAvXm5pZ2h0XFxiLy5leGVjKHRoaXMuc3RyKSkge1xuICAgIHRoaXMuc2tpcChjYXB0dXJlcyk7XG4gICAgdGhpcy5fbWVyaWRpZW0gPSAncG0nO1xuICAgIHZhciBiZWZvcmUgPSB0aGlzLmRhdGUuY2xvbmUoKTtcbiAgICB0aGlzLmRhdGUuZGF0ZS5zZXRIb3VycygxOSwgMCwgMCk7XG4gICAgcmV0dXJuICduaWdodCdcbiAgfVxufTtcblxuLyoqXG4gKiBFdmVuaW5nIChhcmJpdHJhcmlseSBzZXQgYXQgNXBtKVxuICovXG5cbnBhcnNlci5wcm90b3R5cGUuZXZlbmluZyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FwdHVyZXM7XG4gIGlmIChjYXB0dXJlcyA9IC9eZXZlbmluZ1xcYi8uZXhlYyh0aGlzLnN0cikpIHtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHRoaXMuX21lcmlkaWVtID0gJ3BtJztcbiAgICB2YXIgYmVmb3JlID0gdGhpcy5kYXRlLmNsb25lKCk7XG4gICAgdGhpcy5kYXRlLmRhdGUuc2V0SG91cnMoMTcsIDAsIDApO1xuICAgIHJldHVybiAnZXZlbmluZydcbiAgfVxufTtcblxuLyoqXG4gKiBBZnRlcm5vb24gKGFyYml0cmFyaWx5IHNldCBhdCAycG0pXG4gKi9cblxucGFyc2VyLnByb3RvdHlwZS5hZnRlcm5vb24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNhcHR1cmVzO1xuICBpZiAoY2FwdHVyZXMgPSAvXmFmdGVybm9vblxcYi8uZXhlYyh0aGlzLnN0cikpIHtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHRoaXMuX21lcmlkaWVtID0gJ3BtJztcbiAgICB2YXIgYmVmb3JlID0gdGhpcy5kYXRlLmNsb25lKCk7XG5cbiAgICBpZiAodGhpcy5kYXRlLmNoYW5nZWQoJ2hvdXJzJykpIHJldHVybiAnYWZ0ZXJub29uJztcblxuICAgIHRoaXMuZGF0ZS5kYXRlLnNldEhvdXJzKDE0LCAwLCAwKTtcbiAgICByZXR1cm4gJ2FmdGVybm9vbic7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBNb3JuaW5nIChhcmJpdHJhcmlseSBzZXQgYXQgOGFtKVxuICovXG5cbnBhcnNlci5wcm90b3R5cGUubW9ybmluZyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FwdHVyZXM7XG4gIGlmIChjYXB0dXJlcyA9IC9ebW9ybmluZ1xcYi8uZXhlYyh0aGlzLnN0cikpIHtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHRoaXMuX21lcmlkaWVtID0gJ2FtJztcbiAgICB2YXIgYmVmb3JlID0gdGhpcy5kYXRlLmNsb25lKCk7XG4gICAgaWYgKCF0aGlzLmRhdGUuY2hhbmdlZCgnaG91cnMnKSkgdGhpcy5kYXRlLmRhdGUuc2V0SG91cnMoOCwgMCwgMCk7XG4gICAgcmV0dXJuICdtb3JuaW5nJztcbiAgfVxufTtcblxuLyoqXG4gKiBUb25pZ2h0XG4gKi9cblxucGFyc2VyLnByb3RvdHlwZS50b25pZ2h0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjYXB0dXJlcztcbiAgaWYgKGNhcHR1cmVzID0gL150b25pZ2h0XFxiLy5leGVjKHRoaXMuc3RyKSkge1xuICAgIHRoaXMuc2tpcChjYXB0dXJlcyk7XG4gICAgdGhpcy5fbWVyaWRpZW0gPSAncG0nO1xuICAgIHJldHVybiAndG9uaWdodCc7XG4gIH1cbn07XG5cbi8qKlxuICogTmV4dCB0aW1lXG4gKi9cblxucGFyc2VyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FwdHVyZXM7XG4gIGlmIChjYXB0dXJlcyA9IC9ebmV4dC8uZXhlYyh0aGlzLnN0cikpIHtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHZhciBkID0gbmV3IERhdGUodGhpcy5kYXRlLmRhdGUpO1xuICAgIHZhciBtb2QgPSB0aGlzLnBlZWsoKTtcblxuICAgIC8vIElmIHdlIGhhdmUgYSBkZWZpbmVkIG1vZGlmaWVyLCB0aGVuIHVwZGF0ZVxuICAgIGlmICh0aGlzLmRhdGVbbW9kXSkge1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAvLyBzbGlnaHQgaGFjayB0byBtb2RpZnkgYWxyZWFkeSBtb2RpZmllZFxuICAgICAgdGhpcy5kYXRlID0gZGF0ZShkKTtcbiAgICAgIHRoaXMuZGF0ZVttb2RdKDEpO1xuICAgIH0gZWxzZSBpZiAockRheU1vZC50ZXN0KG1vZCkpIHtcbiAgICAgIHRoaXMuZGF0ZS5kYXkoMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICduZXh0JztcbiAgfVxufTtcblxuLyoqXG4gKiBMYXN0IHRpbWVcbiAqL1xuXG5wYXJzZXIucHJvdG90eXBlLmxhc3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNhcHR1cmVzO1xuICBpZiAoY2FwdHVyZXMgPSAvXmxhc3QvLmV4ZWModGhpcy5zdHIpKSB7XG4gICAgdGhpcy5za2lwKGNhcHR1cmVzKTtcbiAgICB2YXIgZCA9IG5ldyBEYXRlKHRoaXMuZGF0ZS5kYXRlKTtcbiAgICB2YXIgbW9kID0gdGhpcy5wZWVrKCk7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGEgZGVmaW5lZCBtb2RpZmllciwgdGhlbiB1cGRhdGVcbiAgICBpZiAodGhpcy5kYXRlW21vZF0pIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgLy8gc2xpZ2h0IGhhY2sgdG8gbW9kaWZ5IGFscmVhZHkgbW9kaWZpZWRcbiAgICAgIHRoaXMuZGF0ZSA9IGRhdGUoZCk7XG4gICAgICB0aGlzLmRhdGVbbW9kXSgtMSk7XG4gICAgfSBlbHNlIGlmIChyRGF5TW9kLnRlc3QobW9kKSkge1xuICAgICAgdGhpcy5kYXRlLmRheSgtMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICdsYXN0JztcbiAgfVxufTtcblxuLyoqXG4gKiBBZ29cbiAqL1xuXG5wYXJzZXIucHJvdG90eXBlLmFnbyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FwdHVyZXM7XG4gIGlmIChjYXB0dXJlcyA9IC9eYWdvXFxiLy5leGVjKHRoaXMuc3RyKSkge1xuICAgIHRoaXMuc2tpcChjYXB0dXJlcyk7XG4gICAgcmV0dXJuICdhZ28nO1xuICB9XG59O1xuXG4vKipcbiAqIE51bWJlclxuICovXG5cbnBhcnNlci5wcm90b3R5cGUubnVtYmVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjYXB0dXJlcztcbiAgaWYgKGNhcHR1cmVzID0gL14oXFxkKykvLmV4ZWModGhpcy5zdHIpKSB7XG4gICAgdmFyIG4gPSBjYXB0dXJlc1sxXTtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHZhciBtb2QgPSB0aGlzLnBlZWsoKTtcblxuICAgIC8vIElmIHdlIGhhdmUgYSBkZWZpbmVkIG1vZGlmaWVyLCB0aGVuIHVwZGF0ZVxuICAgIGlmICh0aGlzLmRhdGVbbW9kXSkge1xuICAgICAgaWYgKCdhZ28nID09IHRoaXMucGVlaygpKSBuID0gLW47XG4gICAgICB0aGlzLmRhdGVbbW9kXShuKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX21lcmlkaWVtKSB7XG4gICAgICAvLyB3aGVuIHdlIGRvbid0IGhhdmUgbWVyaWRpZW0sIHBvc3NpYmx5IHVzZSBjb250ZXh0IHRvIGd1ZXNzXG4gICAgICB0aGlzLnRpbWUobiwgMCwgMCwgdGhpcy5fbWVyaWRpZW0pO1xuICAgICAgdGhpcy5fbWVyaWRpZW0gPSBudWxsO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcmlnaW5hbC5pbmRleE9mKCdhdCcpID4gLTEgKSB7XG4gICAgICB0aGlzLnRpbWUobiwgMCwgMCwgdGhpcy5fbWVyaWRpZW0pO1xuICAgICAgdGhpcy5fbWVyaWRpZW0gPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiAnbnVtYmVyJztcbiAgfVxufTtcblxuLyoqXG4gKiBTdHJpbmdcbiAqL1xuXG5wYXJzZXIucHJvdG90eXBlLnN0cmluZyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FwdHVyZXM7XG4gIGlmIChjYXB0dXJlcyA9IC9eXFx3Ky8uZXhlYyh0aGlzLnN0cikpIHtcbiAgICB0aGlzLnNraXAoY2FwdHVyZXMpO1xuICAgIHJldHVybiAnc3RyaW5nJztcbiAgfVxufTtcblxuLyoqXG4gKiBPdGhlclxuICovXG5cbnBhcnNlci5wcm90b3R5cGUub3RoZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNhcHR1cmVzO1xuICBpZiAoY2FwdHVyZXMgPSAvXi4vLmV4ZWModGhpcy5zdHIpKSB7XG4gICAgdGhpcy5za2lwKGNhcHR1cmVzKTtcbiAgICByZXR1cm4gJ290aGVyJztcbiAgfVxufTtcbiIsIlxuLyoqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJ1ZztcblxuLyoqXG4gKiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm4ge1R5cGV9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlYnVnKG5hbWUpIHtcbiAgaWYgKCFkZWJ1Zy5lbmFibGVkKG5hbWUpKSByZXR1cm4gZnVuY3Rpb24oKXt9O1xuXG4gIHJldHVybiBmdW5jdGlvbihmbXQpe1xuICAgIGZtdCA9IGNvZXJjZShmbXQpO1xuXG4gICAgdmFyIGN1cnIgPSBuZXcgRGF0ZTtcbiAgICB2YXIgbXMgPSBjdXJyIC0gKGRlYnVnW25hbWVdIHx8IGN1cnIpO1xuICAgIGRlYnVnW25hbWVdID0gY3VycjtcblxuICAgIGZtdCA9IG5hbWVcbiAgICAgICsgJyAnXG4gICAgICArIGZtdFxuICAgICAgKyAnICsnICsgZGVidWcuaHVtYW5pemUobXMpO1xuXG4gICAgLy8gVGhpcyBoYWNrZXJ5IGlzIHJlcXVpcmVkIGZvciBJRThcbiAgICAvLyB3aGVyZSBgY29uc29sZS5sb2dgIGRvZXNuJ3QgaGF2ZSAnYXBwbHknXG4gICAgd2luZG93LmNvbnNvbGVcbiAgICAgICYmIGNvbnNvbGUubG9nXG4gICAgICAmJiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlLmxvZywgY29uc29sZSwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBjdXJyZW50bHkgYWN0aXZlIGRlYnVnIG1vZGUgbmFtZXMuXG4gKi9cblxuZGVidWcubmFtZXMgPSBbXTtcbmRlYnVnLnNraXBzID0gW107XG5cbi8qKlxuICogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZS4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuICogc2VwYXJhdGVkIGJ5IGEgY29sb24gYW5kIHdpbGRjYXJkcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5kZWJ1Zy5lbmFibGUgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHRyeSB7XG4gICAgbG9jYWxTdG9yYWdlLmRlYnVnID0gbmFtZTtcbiAgfSBjYXRjaChlKXt9XG5cbiAgdmFyIHNwbGl0ID0gKG5hbWUgfHwgJycpLnNwbGl0KC9bXFxzLF0rLylcbiAgICAsIGxlbiA9IHNwbGl0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgbmFtZSA9IHNwbGl0W2ldLnJlcGxhY2UoJyonLCAnLio/Jyk7XG4gICAgaWYgKG5hbWVbMF0gPT09ICctJykge1xuICAgICAgZGVidWcuc2tpcHMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWUuc3Vic3RyKDEpICsgJyQnKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZGVidWcubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWUgKyAnJCcpKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5kZWJ1Zy5kaXNhYmxlID0gZnVuY3Rpb24oKXtcbiAgZGVidWcuZW5hYmxlKCcnKTtcbn07XG5cbi8qKlxuICogSHVtYW5pemUgdGhlIGdpdmVuIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmRlYnVnLmh1bWFuaXplID0gZnVuY3Rpb24obXMpIHtcbiAgdmFyIHNlYyA9IDEwMDBcbiAgICAsIG1pbiA9IDYwICogMTAwMFxuICAgICwgaG91ciA9IDYwICogbWluO1xuXG4gIGlmIChtcyA+PSBob3VyKSByZXR1cm4gKG1zIC8gaG91cikudG9GaXhlZCgxKSArICdoJztcbiAgaWYgKG1zID49IG1pbikgcmV0dXJuIChtcyAvIG1pbikudG9GaXhlZCgxKSArICdtJztcbiAgaWYgKG1zID49IHNlYykgcmV0dXJuIChtcyAvIHNlYyB8IDApICsgJ3MnO1xuICByZXR1cm4gbXMgKyAnbXMnO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmRlYnVnLmVuYWJsZWQgPSBmdW5jdGlvbihuYW1lKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkZWJ1Zy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChkZWJ1Zy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkZWJ1Zy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChkZWJ1Zy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBDb2VyY2UgYHZhbGAuXG4gKi9cblxuZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG4gIHJldHVybiB2YWw7XG59XG5cbi8vIHBlcnNpc3RcblxudHJ5IHtcbiAgaWYgKHdpbmRvdy5sb2NhbFN0b3JhZ2UpIGRlYnVnLmVuYWJsZShsb2NhbFN0b3JhZ2UuZGVidWcpO1xufSBjYXRjaChlKXt9XG4iLCIvKiFcbiAqIGRlZmluZS1wcm9wZXJ0eSA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvZGVmaW5lLXByb3BlcnR5PlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNSwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNEZXNjcmlwdG9yID0gcmVxdWlyZSgnaXMtZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgdmFsKSB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4cGVjdGVkIGBwcm9wYCB0byBiZSBhIHN0cmluZy4nKTtcbiAgfVxuXG4gIGlmIChpc0Rlc2NyaXB0b3IodmFsKSAmJiAoJ3NldCcgaW4gdmFsIHx8ICdnZXQnIGluIHZhbCkpIHtcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgdmFsKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiB2YWxcbiAgfSk7XG59O1xuIiwidmFyIHB1bnljb2RlID0gcmVxdWlyZSgncHVueWNvZGUnKTtcbnZhciBlbnRpdGllcyA9IHJlcXVpcmUoJy4vZW50aXRpZXMuanNvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlY29kZTtcblxuZnVuY3Rpb24gZGVjb2RlIChzdHIpIHtcbiAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBTdHJpbmcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyYoIz9bXjtcXFddKzs/KS9nLCBmdW5jdGlvbiAoXywgbWF0Y2gpIHtcbiAgICAgICAgdmFyIG07XG4gICAgICAgIGlmIChtID0gL14jKFxcZCspOz8kLy5leGVjKG1hdGNoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHB1bnljb2RlLnVjczIuZW5jb2RlKFsgcGFyc2VJbnQobVsxXSwgMTApIF0pO1xuICAgICAgICB9IGVsc2UgaWYgKG0gPSAvXiNbWHhdKFtBLUZhLWYwLTldKyk7Py8uZXhlYyhtYXRjaCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwdW55Y29kZS51Y3MyLmVuY29kZShbIHBhcnNlSW50KG1bMV0sIDE2KSBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5hbWVkIGVudGl0eVxuICAgICAgICAgICAgdmFyIGhhc1NlbWkgPSAvOyQvLnRlc3QobWF0Y2gpO1xuICAgICAgICAgICAgdmFyIHdpdGhvdXRTZW1pID0gaGFzU2VtaSA/IG1hdGNoLnJlcGxhY2UoLzskLywgJycpIDogbWF0Y2g7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZW50aXRpZXNbd2l0aG91dFNlbWldIHx8IChoYXNTZW1pICYmIGVudGl0aWVzW21hdGNoXSk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwdW55Y29kZS51Y3MyLmVuY29kZShbIHRhcmdldCBdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyYnICsgbWF0Y2g7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBwdW55Y29kZSA9IHJlcXVpcmUoJ3B1bnljb2RlJyk7XG52YXIgcmV2RW50aXRpZXMgPSByZXF1aXJlKCcuL3JldmVyc2VkLmpzb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbmNvZGU7XG5cbmZ1bmN0aW9uIGVuY29kZSAoc3RyLCBvcHRzKSB7XG4gICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgU3RyaW5nJyk7XG4gICAgfVxuICAgIGlmICghb3B0cykgb3B0cyA9IHt9O1xuXG4gICAgdmFyIG51bWVyaWMgPSB0cnVlO1xuICAgIGlmIChvcHRzLm5hbWVkKSBudW1lcmljID0gZmFsc2U7XG4gICAgaWYgKG9wdHMubnVtZXJpYyAhPT0gdW5kZWZpbmVkKSBudW1lcmljID0gb3B0cy5udW1lcmljO1xuXG4gICAgdmFyIHNwZWNpYWwgPSBvcHRzLnNwZWNpYWwgfHwge1xuICAgICAgICAnXCInOiB0cnVlLCBcIidcIjogdHJ1ZSxcbiAgICAgICAgJzwnOiB0cnVlLCAnPic6IHRydWUsXG4gICAgICAgICcmJzogdHJ1ZVxuICAgIH07XG5cbiAgICB2YXIgY29kZVBvaW50cyA9IHB1bnljb2RlLnVjczIuZGVjb2RlKHN0cik7XG4gICAgdmFyIGNoYXJzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjYyA9IGNvZGVQb2ludHNbaV07XG4gICAgICAgIHZhciBjID0gcHVueWNvZGUudWNzMi5lbmNvZGUoWyBjYyBdKTtcbiAgICAgICAgdmFyIGUgPSByZXZFbnRpdGllc1tjY107XG4gICAgICAgIGlmIChlICYmIChjYyA+PSAxMjcgfHwgc3BlY2lhbFtjXSkgJiYgIW51bWVyaWMpIHtcbiAgICAgICAgICAgIGNoYXJzLnB1c2goJyYnICsgKC87JC8udGVzdChlKSA/IGUgOiBlICsgJzsnKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2MgPCAzMiB8fCBjYyA+PSAxMjcgfHwgc3BlY2lhbFtjXSkge1xuICAgICAgICAgICAgY2hhcnMucHVzaCgnJiMnICsgY2MgKyAnOycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2hhcnMucHVzaChjKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hhcnMuam9pbignJyk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gICAgXCJBYWN1dGU7XCI6IFwiXFx1MDBDMVwiLFxuICAgIFwiQWFjdXRlXCI6IFwiXFx1MDBDMVwiLFxuICAgIFwiYWFjdXRlO1wiOiBcIlxcdTAwRTFcIixcbiAgICBcImFhY3V0ZVwiOiBcIlxcdTAwRTFcIixcbiAgICBcIkFicmV2ZTtcIjogXCJcXHUwMTAyXCIsXG4gICAgXCJhYnJldmU7XCI6IFwiXFx1MDEwM1wiLFxuICAgIFwiYWM7XCI6IFwiXFx1MjIzRVwiLFxuICAgIFwiYWNkO1wiOiBcIlxcdTIyM0ZcIixcbiAgICBcImFjRTtcIjogXCJcXHUyMjNFXFx1MDMzM1wiLFxuICAgIFwiQWNpcmM7XCI6IFwiXFx1MDBDMlwiLFxuICAgIFwiQWNpcmNcIjogXCJcXHUwMEMyXCIsXG4gICAgXCJhY2lyYztcIjogXCJcXHUwMEUyXCIsXG4gICAgXCJhY2lyY1wiOiBcIlxcdTAwRTJcIixcbiAgICBcImFjdXRlO1wiOiBcIlxcdTAwQjRcIixcbiAgICBcImFjdXRlXCI6IFwiXFx1MDBCNFwiLFxuICAgIFwiQWN5O1wiOiBcIlxcdTA0MTBcIixcbiAgICBcImFjeTtcIjogXCJcXHUwNDMwXCIsXG4gICAgXCJBRWxpZztcIjogXCJcXHUwMEM2XCIsXG4gICAgXCJBRWxpZ1wiOiBcIlxcdTAwQzZcIixcbiAgICBcImFlbGlnO1wiOiBcIlxcdTAwRTZcIixcbiAgICBcImFlbGlnXCI6IFwiXFx1MDBFNlwiLFxuICAgIFwiYWY7XCI6IFwiXFx1MjA2MVwiLFxuICAgIFwiQWZyO1wiOiBcIlxcdUQ4MzVcXHVERDA0XCIsXG4gICAgXCJhZnI7XCI6IFwiXFx1RDgzNVxcdUREMUVcIixcbiAgICBcIkFncmF2ZTtcIjogXCJcXHUwMEMwXCIsXG4gICAgXCJBZ3JhdmVcIjogXCJcXHUwMEMwXCIsXG4gICAgXCJhZ3JhdmU7XCI6IFwiXFx1MDBFMFwiLFxuICAgIFwiYWdyYXZlXCI6IFwiXFx1MDBFMFwiLFxuICAgIFwiYWxlZnN5bTtcIjogXCJcXHUyMTM1XCIsXG4gICAgXCJhbGVwaDtcIjogXCJcXHUyMTM1XCIsXG4gICAgXCJBbHBoYTtcIjogXCJcXHUwMzkxXCIsXG4gICAgXCJhbHBoYTtcIjogXCJcXHUwM0IxXCIsXG4gICAgXCJBbWFjcjtcIjogXCJcXHUwMTAwXCIsXG4gICAgXCJhbWFjcjtcIjogXCJcXHUwMTAxXCIsXG4gICAgXCJhbWFsZztcIjogXCJcXHUyQTNGXCIsXG4gICAgXCJBTVA7XCI6IFwiJlwiLFxuICAgIFwiQU1QXCI6IFwiJlwiLFxuICAgIFwiYW1wO1wiOiBcIiZcIixcbiAgICBcImFtcFwiOiBcIiZcIixcbiAgICBcIkFuZDtcIjogXCJcXHUyQTUzXCIsXG4gICAgXCJhbmQ7XCI6IFwiXFx1MjIyN1wiLFxuICAgIFwiYW5kYW5kO1wiOiBcIlxcdTJBNTVcIixcbiAgICBcImFuZGQ7XCI6IFwiXFx1MkE1Q1wiLFxuICAgIFwiYW5kc2xvcGU7XCI6IFwiXFx1MkE1OFwiLFxuICAgIFwiYW5kdjtcIjogXCJcXHUyQTVBXCIsXG4gICAgXCJhbmc7XCI6IFwiXFx1MjIyMFwiLFxuICAgIFwiYW5nZTtcIjogXCJcXHUyOUE0XCIsXG4gICAgXCJhbmdsZTtcIjogXCJcXHUyMjIwXCIsXG4gICAgXCJhbmdtc2Q7XCI6IFwiXFx1MjIyMVwiLFxuICAgIFwiYW5nbXNkYWE7XCI6IFwiXFx1MjlBOFwiLFxuICAgIFwiYW5nbXNkYWI7XCI6IFwiXFx1MjlBOVwiLFxuICAgIFwiYW5nbXNkYWM7XCI6IFwiXFx1MjlBQVwiLFxuICAgIFwiYW5nbXNkYWQ7XCI6IFwiXFx1MjlBQlwiLFxuICAgIFwiYW5nbXNkYWU7XCI6IFwiXFx1MjlBQ1wiLFxuICAgIFwiYW5nbXNkYWY7XCI6IFwiXFx1MjlBRFwiLFxuICAgIFwiYW5nbXNkYWc7XCI6IFwiXFx1MjlBRVwiLFxuICAgIFwiYW5nbXNkYWg7XCI6IFwiXFx1MjlBRlwiLFxuICAgIFwiYW5ncnQ7XCI6IFwiXFx1MjIxRlwiLFxuICAgIFwiYW5ncnR2YjtcIjogXCJcXHUyMkJFXCIsXG4gICAgXCJhbmdydHZiZDtcIjogXCJcXHUyOTlEXCIsXG4gICAgXCJhbmdzcGg7XCI6IFwiXFx1MjIyMlwiLFxuICAgIFwiYW5nc3Q7XCI6IFwiXFx1MDBDNVwiLFxuICAgIFwiYW5nemFycjtcIjogXCJcXHUyMzdDXCIsXG4gICAgXCJBb2dvbjtcIjogXCJcXHUwMTA0XCIsXG4gICAgXCJhb2dvbjtcIjogXCJcXHUwMTA1XCIsXG4gICAgXCJBb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDM4XCIsXG4gICAgXCJhb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDUyXCIsXG4gICAgXCJhcDtcIjogXCJcXHUyMjQ4XCIsXG4gICAgXCJhcGFjaXI7XCI6IFwiXFx1MkE2RlwiLFxuICAgIFwiYXBFO1wiOiBcIlxcdTJBNzBcIixcbiAgICBcImFwZTtcIjogXCJcXHUyMjRBXCIsXG4gICAgXCJhcGlkO1wiOiBcIlxcdTIyNEJcIixcbiAgICBcImFwb3M7XCI6IFwiJ1wiLFxuICAgIFwiQXBwbHlGdW5jdGlvbjtcIjogXCJcXHUyMDYxXCIsXG4gICAgXCJhcHByb3g7XCI6IFwiXFx1MjI0OFwiLFxuICAgIFwiYXBwcm94ZXE7XCI6IFwiXFx1MjI0QVwiLFxuICAgIFwiQXJpbmc7XCI6IFwiXFx1MDBDNVwiLFxuICAgIFwiQXJpbmdcIjogXCJcXHUwMEM1XCIsXG4gICAgXCJhcmluZztcIjogXCJcXHUwMEU1XCIsXG4gICAgXCJhcmluZ1wiOiBcIlxcdTAwRTVcIixcbiAgICBcIkFzY3I7XCI6IFwiXFx1RDgzNVxcdURDOUNcIixcbiAgICBcImFzY3I7XCI6IFwiXFx1RDgzNVxcdURDQjZcIixcbiAgICBcIkFzc2lnbjtcIjogXCJcXHUyMjU0XCIsXG4gICAgXCJhc3Q7XCI6IFwiKlwiLFxuICAgIFwiYXN5bXA7XCI6IFwiXFx1MjI0OFwiLFxuICAgIFwiYXN5bXBlcTtcIjogXCJcXHUyMjREXCIsXG4gICAgXCJBdGlsZGU7XCI6IFwiXFx1MDBDM1wiLFxuICAgIFwiQXRpbGRlXCI6IFwiXFx1MDBDM1wiLFxuICAgIFwiYXRpbGRlO1wiOiBcIlxcdTAwRTNcIixcbiAgICBcImF0aWxkZVwiOiBcIlxcdTAwRTNcIixcbiAgICBcIkF1bWw7XCI6IFwiXFx1MDBDNFwiLFxuICAgIFwiQXVtbFwiOiBcIlxcdTAwQzRcIixcbiAgICBcImF1bWw7XCI6IFwiXFx1MDBFNFwiLFxuICAgIFwiYXVtbFwiOiBcIlxcdTAwRTRcIixcbiAgICBcImF3Y29uaW50O1wiOiBcIlxcdTIyMzNcIixcbiAgICBcImF3aW50O1wiOiBcIlxcdTJBMTFcIixcbiAgICBcImJhY2tjb25nO1wiOiBcIlxcdTIyNENcIixcbiAgICBcImJhY2tlcHNpbG9uO1wiOiBcIlxcdTAzRjZcIixcbiAgICBcImJhY2twcmltZTtcIjogXCJcXHUyMDM1XCIsXG4gICAgXCJiYWNrc2ltO1wiOiBcIlxcdTIyM0RcIixcbiAgICBcImJhY2tzaW1lcTtcIjogXCJcXHUyMkNEXCIsXG4gICAgXCJCYWNrc2xhc2g7XCI6IFwiXFx1MjIxNlwiLFxuICAgIFwiQmFydjtcIjogXCJcXHUyQUU3XCIsXG4gICAgXCJiYXJ2ZWU7XCI6IFwiXFx1MjJCRFwiLFxuICAgIFwiQmFyd2VkO1wiOiBcIlxcdTIzMDZcIixcbiAgICBcImJhcndlZDtcIjogXCJcXHUyMzA1XCIsXG4gICAgXCJiYXJ3ZWRnZTtcIjogXCJcXHUyMzA1XCIsXG4gICAgXCJiYnJrO1wiOiBcIlxcdTIzQjVcIixcbiAgICBcImJicmt0YnJrO1wiOiBcIlxcdTIzQjZcIixcbiAgICBcImJjb25nO1wiOiBcIlxcdTIyNENcIixcbiAgICBcIkJjeTtcIjogXCJcXHUwNDExXCIsXG4gICAgXCJiY3k7XCI6IFwiXFx1MDQzMVwiLFxuICAgIFwiYmRxdW87XCI6IFwiXFx1MjAxRVwiLFxuICAgIFwiYmVjYXVzO1wiOiBcIlxcdTIyMzVcIixcbiAgICBcIkJlY2F1c2U7XCI6IFwiXFx1MjIzNVwiLFxuICAgIFwiYmVjYXVzZTtcIjogXCJcXHUyMjM1XCIsXG4gICAgXCJiZW1wdHl2O1wiOiBcIlxcdTI5QjBcIixcbiAgICBcImJlcHNpO1wiOiBcIlxcdTAzRjZcIixcbiAgICBcImJlcm5vdTtcIjogXCJcXHUyMTJDXCIsXG4gICAgXCJCZXJub3VsbGlzO1wiOiBcIlxcdTIxMkNcIixcbiAgICBcIkJldGE7XCI6IFwiXFx1MDM5MlwiLFxuICAgIFwiYmV0YTtcIjogXCJcXHUwM0IyXCIsXG4gICAgXCJiZXRoO1wiOiBcIlxcdTIxMzZcIixcbiAgICBcImJldHdlZW47XCI6IFwiXFx1MjI2Q1wiLFxuICAgIFwiQmZyO1wiOiBcIlxcdUQ4MzVcXHVERDA1XCIsXG4gICAgXCJiZnI7XCI6IFwiXFx1RDgzNVxcdUREMUZcIixcbiAgICBcImJpZ2NhcDtcIjogXCJcXHUyMkMyXCIsXG4gICAgXCJiaWdjaXJjO1wiOiBcIlxcdTI1RUZcIixcbiAgICBcImJpZ2N1cDtcIjogXCJcXHUyMkMzXCIsXG4gICAgXCJiaWdvZG90O1wiOiBcIlxcdTJBMDBcIixcbiAgICBcImJpZ29wbHVzO1wiOiBcIlxcdTJBMDFcIixcbiAgICBcImJpZ290aW1lcztcIjogXCJcXHUyQTAyXCIsXG4gICAgXCJiaWdzcWN1cDtcIjogXCJcXHUyQTA2XCIsXG4gICAgXCJiaWdzdGFyO1wiOiBcIlxcdTI2MDVcIixcbiAgICBcImJpZ3RyaWFuZ2xlZG93bjtcIjogXCJcXHUyNUJEXCIsXG4gICAgXCJiaWd0cmlhbmdsZXVwO1wiOiBcIlxcdTI1QjNcIixcbiAgICBcImJpZ3VwbHVzO1wiOiBcIlxcdTJBMDRcIixcbiAgICBcImJpZ3ZlZTtcIjogXCJcXHUyMkMxXCIsXG4gICAgXCJiaWd3ZWRnZTtcIjogXCJcXHUyMkMwXCIsXG4gICAgXCJia2Fyb3c7XCI6IFwiXFx1MjkwRFwiLFxuICAgIFwiYmxhY2tsb3plbmdlO1wiOiBcIlxcdTI5RUJcIixcbiAgICBcImJsYWNrc3F1YXJlO1wiOiBcIlxcdTI1QUFcIixcbiAgICBcImJsYWNrdHJpYW5nbGU7XCI6IFwiXFx1MjVCNFwiLFxuICAgIFwiYmxhY2t0cmlhbmdsZWRvd247XCI6IFwiXFx1MjVCRVwiLFxuICAgIFwiYmxhY2t0cmlhbmdsZWxlZnQ7XCI6IFwiXFx1MjVDMlwiLFxuICAgIFwiYmxhY2t0cmlhbmdsZXJpZ2h0O1wiOiBcIlxcdTI1QjhcIixcbiAgICBcImJsYW5rO1wiOiBcIlxcdTI0MjNcIixcbiAgICBcImJsazEyO1wiOiBcIlxcdTI1OTJcIixcbiAgICBcImJsazE0O1wiOiBcIlxcdTI1OTFcIixcbiAgICBcImJsazM0O1wiOiBcIlxcdTI1OTNcIixcbiAgICBcImJsb2NrO1wiOiBcIlxcdTI1ODhcIixcbiAgICBcImJuZTtcIjogXCI9XFx1MjBFNVwiLFxuICAgIFwiYm5lcXVpdjtcIjogXCJcXHUyMjYxXFx1MjBFNVwiLFxuICAgIFwiYk5vdDtcIjogXCJcXHUyQUVEXCIsXG4gICAgXCJibm90O1wiOiBcIlxcdTIzMTBcIixcbiAgICBcIkJvcGY7XCI6IFwiXFx1RDgzNVxcdUREMzlcIixcbiAgICBcImJvcGY7XCI6IFwiXFx1RDgzNVxcdURENTNcIixcbiAgICBcImJvdDtcIjogXCJcXHUyMkE1XCIsXG4gICAgXCJib3R0b207XCI6IFwiXFx1MjJBNVwiLFxuICAgIFwiYm93dGllO1wiOiBcIlxcdTIyQzhcIixcbiAgICBcImJveGJveDtcIjogXCJcXHUyOUM5XCIsXG4gICAgXCJib3hETDtcIjogXCJcXHUyNTU3XCIsXG4gICAgXCJib3hEbDtcIjogXCJcXHUyNTU2XCIsXG4gICAgXCJib3hkTDtcIjogXCJcXHUyNTU1XCIsXG4gICAgXCJib3hkbDtcIjogXCJcXHUyNTEwXCIsXG4gICAgXCJib3hEUjtcIjogXCJcXHUyNTU0XCIsXG4gICAgXCJib3hEcjtcIjogXCJcXHUyNTUzXCIsXG4gICAgXCJib3hkUjtcIjogXCJcXHUyNTUyXCIsXG4gICAgXCJib3hkcjtcIjogXCJcXHUyNTBDXCIsXG4gICAgXCJib3hIO1wiOiBcIlxcdTI1NTBcIixcbiAgICBcImJveGg7XCI6IFwiXFx1MjUwMFwiLFxuICAgIFwiYm94SEQ7XCI6IFwiXFx1MjU2NlwiLFxuICAgIFwiYm94SGQ7XCI6IFwiXFx1MjU2NFwiLFxuICAgIFwiYm94aEQ7XCI6IFwiXFx1MjU2NVwiLFxuICAgIFwiYm94aGQ7XCI6IFwiXFx1MjUyQ1wiLFxuICAgIFwiYm94SFU7XCI6IFwiXFx1MjU2OVwiLFxuICAgIFwiYm94SHU7XCI6IFwiXFx1MjU2N1wiLFxuICAgIFwiYm94aFU7XCI6IFwiXFx1MjU2OFwiLFxuICAgIFwiYm94aHU7XCI6IFwiXFx1MjUzNFwiLFxuICAgIFwiYm94bWludXM7XCI6IFwiXFx1MjI5RlwiLFxuICAgIFwiYm94cGx1cztcIjogXCJcXHUyMjlFXCIsXG4gICAgXCJib3h0aW1lcztcIjogXCJcXHUyMkEwXCIsXG4gICAgXCJib3hVTDtcIjogXCJcXHUyNTVEXCIsXG4gICAgXCJib3hVbDtcIjogXCJcXHUyNTVDXCIsXG4gICAgXCJib3h1TDtcIjogXCJcXHUyNTVCXCIsXG4gICAgXCJib3h1bDtcIjogXCJcXHUyNTE4XCIsXG4gICAgXCJib3hVUjtcIjogXCJcXHUyNTVBXCIsXG4gICAgXCJib3hVcjtcIjogXCJcXHUyNTU5XCIsXG4gICAgXCJib3h1UjtcIjogXCJcXHUyNTU4XCIsXG4gICAgXCJib3h1cjtcIjogXCJcXHUyNTE0XCIsXG4gICAgXCJib3hWO1wiOiBcIlxcdTI1NTFcIixcbiAgICBcImJveHY7XCI6IFwiXFx1MjUwMlwiLFxuICAgIFwiYm94Vkg7XCI6IFwiXFx1MjU2Q1wiLFxuICAgIFwiYm94Vmg7XCI6IFwiXFx1MjU2QlwiLFxuICAgIFwiYm94dkg7XCI6IFwiXFx1MjU2QVwiLFxuICAgIFwiYm94dmg7XCI6IFwiXFx1MjUzQ1wiLFxuICAgIFwiYm94Vkw7XCI6IFwiXFx1MjU2M1wiLFxuICAgIFwiYm94Vmw7XCI6IFwiXFx1MjU2MlwiLFxuICAgIFwiYm94dkw7XCI6IFwiXFx1MjU2MVwiLFxuICAgIFwiYm94dmw7XCI6IFwiXFx1MjUyNFwiLFxuICAgIFwiYm94VlI7XCI6IFwiXFx1MjU2MFwiLFxuICAgIFwiYm94VnI7XCI6IFwiXFx1MjU1RlwiLFxuICAgIFwiYm94dlI7XCI6IFwiXFx1MjU1RVwiLFxuICAgIFwiYm94dnI7XCI6IFwiXFx1MjUxQ1wiLFxuICAgIFwiYnByaW1lO1wiOiBcIlxcdTIwMzVcIixcbiAgICBcIkJyZXZlO1wiOiBcIlxcdTAyRDhcIixcbiAgICBcImJyZXZlO1wiOiBcIlxcdTAyRDhcIixcbiAgICBcImJydmJhcjtcIjogXCJcXHUwMEE2XCIsXG4gICAgXCJicnZiYXJcIjogXCJcXHUwMEE2XCIsXG4gICAgXCJCc2NyO1wiOiBcIlxcdTIxMkNcIixcbiAgICBcImJzY3I7XCI6IFwiXFx1RDgzNVxcdURDQjdcIixcbiAgICBcImJzZW1pO1wiOiBcIlxcdTIwNEZcIixcbiAgICBcImJzaW07XCI6IFwiXFx1MjIzRFwiLFxuICAgIFwiYnNpbWU7XCI6IFwiXFx1MjJDRFwiLFxuICAgIFwiYnNvbDtcIjogXCJcXFxcXCIsXG4gICAgXCJic29sYjtcIjogXCJcXHUyOUM1XCIsXG4gICAgXCJic29saHN1YjtcIjogXCJcXHUyN0M4XCIsXG4gICAgXCJidWxsO1wiOiBcIlxcdTIwMjJcIixcbiAgICBcImJ1bGxldDtcIjogXCJcXHUyMDIyXCIsXG4gICAgXCJidW1wO1wiOiBcIlxcdTIyNEVcIixcbiAgICBcImJ1bXBFO1wiOiBcIlxcdTJBQUVcIixcbiAgICBcImJ1bXBlO1wiOiBcIlxcdTIyNEZcIixcbiAgICBcIkJ1bXBlcTtcIjogXCJcXHUyMjRFXCIsXG4gICAgXCJidW1wZXE7XCI6IFwiXFx1MjI0RlwiLFxuICAgIFwiQ2FjdXRlO1wiOiBcIlxcdTAxMDZcIixcbiAgICBcImNhY3V0ZTtcIjogXCJcXHUwMTA3XCIsXG4gICAgXCJDYXA7XCI6IFwiXFx1MjJEMlwiLFxuICAgIFwiY2FwO1wiOiBcIlxcdTIyMjlcIixcbiAgICBcImNhcGFuZDtcIjogXCJcXHUyQTQ0XCIsXG4gICAgXCJjYXBicmN1cDtcIjogXCJcXHUyQTQ5XCIsXG4gICAgXCJjYXBjYXA7XCI6IFwiXFx1MkE0QlwiLFxuICAgIFwiY2FwY3VwO1wiOiBcIlxcdTJBNDdcIixcbiAgICBcImNhcGRvdDtcIjogXCJcXHUyQTQwXCIsXG4gICAgXCJDYXBpdGFsRGlmZmVyZW50aWFsRDtcIjogXCJcXHUyMTQ1XCIsXG4gICAgXCJjYXBzO1wiOiBcIlxcdTIyMjlcXHVGRTAwXCIsXG4gICAgXCJjYXJldDtcIjogXCJcXHUyMDQxXCIsXG4gICAgXCJjYXJvbjtcIjogXCJcXHUwMkM3XCIsXG4gICAgXCJDYXlsZXlzO1wiOiBcIlxcdTIxMkRcIixcbiAgICBcImNjYXBzO1wiOiBcIlxcdTJBNERcIixcbiAgICBcIkNjYXJvbjtcIjogXCJcXHUwMTBDXCIsXG4gICAgXCJjY2Fyb247XCI6IFwiXFx1MDEwRFwiLFxuICAgIFwiQ2NlZGlsO1wiOiBcIlxcdTAwQzdcIixcbiAgICBcIkNjZWRpbFwiOiBcIlxcdTAwQzdcIixcbiAgICBcImNjZWRpbDtcIjogXCJcXHUwMEU3XCIsXG4gICAgXCJjY2VkaWxcIjogXCJcXHUwMEU3XCIsXG4gICAgXCJDY2lyYztcIjogXCJcXHUwMTA4XCIsXG4gICAgXCJjY2lyYztcIjogXCJcXHUwMTA5XCIsXG4gICAgXCJDY29uaW50O1wiOiBcIlxcdTIyMzBcIixcbiAgICBcImNjdXBzO1wiOiBcIlxcdTJBNENcIixcbiAgICBcImNjdXBzc207XCI6IFwiXFx1MkE1MFwiLFxuICAgIFwiQ2RvdDtcIjogXCJcXHUwMTBBXCIsXG4gICAgXCJjZG90O1wiOiBcIlxcdTAxMEJcIixcbiAgICBcImNlZGlsO1wiOiBcIlxcdTAwQjhcIixcbiAgICBcImNlZGlsXCI6IFwiXFx1MDBCOFwiLFxuICAgIFwiQ2VkaWxsYTtcIjogXCJcXHUwMEI4XCIsXG4gICAgXCJjZW1wdHl2O1wiOiBcIlxcdTI5QjJcIixcbiAgICBcImNlbnQ7XCI6IFwiXFx1MDBBMlwiLFxuICAgIFwiY2VudFwiOiBcIlxcdTAwQTJcIixcbiAgICBcIkNlbnRlckRvdDtcIjogXCJcXHUwMEI3XCIsXG4gICAgXCJjZW50ZXJkb3Q7XCI6IFwiXFx1MDBCN1wiLFxuICAgIFwiQ2ZyO1wiOiBcIlxcdTIxMkRcIixcbiAgICBcImNmcjtcIjogXCJcXHVEODM1XFx1REQyMFwiLFxuICAgIFwiQ0hjeTtcIjogXCJcXHUwNDI3XCIsXG4gICAgXCJjaGN5O1wiOiBcIlxcdTA0NDdcIixcbiAgICBcImNoZWNrO1wiOiBcIlxcdTI3MTNcIixcbiAgICBcImNoZWNrbWFyaztcIjogXCJcXHUyNzEzXCIsXG4gICAgXCJDaGk7XCI6IFwiXFx1MDNBN1wiLFxuICAgIFwiY2hpO1wiOiBcIlxcdTAzQzdcIixcbiAgICBcImNpcjtcIjogXCJcXHUyNUNCXCIsXG4gICAgXCJjaXJjO1wiOiBcIlxcdTAyQzZcIixcbiAgICBcImNpcmNlcTtcIjogXCJcXHUyMjU3XCIsXG4gICAgXCJjaXJjbGVhcnJvd2xlZnQ7XCI6IFwiXFx1MjFCQVwiLFxuICAgIFwiY2lyY2xlYXJyb3dyaWdodDtcIjogXCJcXHUyMUJCXCIsXG4gICAgXCJjaXJjbGVkYXN0O1wiOiBcIlxcdTIyOUJcIixcbiAgICBcImNpcmNsZWRjaXJjO1wiOiBcIlxcdTIyOUFcIixcbiAgICBcImNpcmNsZWRkYXNoO1wiOiBcIlxcdTIyOURcIixcbiAgICBcIkNpcmNsZURvdDtcIjogXCJcXHUyMjk5XCIsXG4gICAgXCJjaXJjbGVkUjtcIjogXCJcXHUwMEFFXCIsXG4gICAgXCJjaXJjbGVkUztcIjogXCJcXHUyNEM4XCIsXG4gICAgXCJDaXJjbGVNaW51cztcIjogXCJcXHUyMjk2XCIsXG4gICAgXCJDaXJjbGVQbHVzO1wiOiBcIlxcdTIyOTVcIixcbiAgICBcIkNpcmNsZVRpbWVzO1wiOiBcIlxcdTIyOTdcIixcbiAgICBcImNpckU7XCI6IFwiXFx1MjlDM1wiLFxuICAgIFwiY2lyZTtcIjogXCJcXHUyMjU3XCIsXG4gICAgXCJjaXJmbmludDtcIjogXCJcXHUyQTEwXCIsXG4gICAgXCJjaXJtaWQ7XCI6IFwiXFx1MkFFRlwiLFxuICAgIFwiY2lyc2NpcjtcIjogXCJcXHUyOUMyXCIsXG4gICAgXCJDbG9ja3dpc2VDb250b3VySW50ZWdyYWw7XCI6IFwiXFx1MjIzMlwiLFxuICAgIFwiQ2xvc2VDdXJseURvdWJsZVF1b3RlO1wiOiBcIlxcdTIwMURcIixcbiAgICBcIkNsb3NlQ3VybHlRdW90ZTtcIjogXCJcXHUyMDE5XCIsXG4gICAgXCJjbHVicztcIjogXCJcXHUyNjYzXCIsXG4gICAgXCJjbHVic3VpdDtcIjogXCJcXHUyNjYzXCIsXG4gICAgXCJDb2xvbjtcIjogXCJcXHUyMjM3XCIsXG4gICAgXCJjb2xvbjtcIjogXCI6XCIsXG4gICAgXCJDb2xvbmU7XCI6IFwiXFx1MkE3NFwiLFxuICAgIFwiY29sb25lO1wiOiBcIlxcdTIyNTRcIixcbiAgICBcImNvbG9uZXE7XCI6IFwiXFx1MjI1NFwiLFxuICAgIFwiY29tbWE7XCI6IFwiLFwiLFxuICAgIFwiY29tbWF0O1wiOiBcIkBcIixcbiAgICBcImNvbXA7XCI6IFwiXFx1MjIwMVwiLFxuICAgIFwiY29tcGZuO1wiOiBcIlxcdTIyMThcIixcbiAgICBcImNvbXBsZW1lbnQ7XCI6IFwiXFx1MjIwMVwiLFxuICAgIFwiY29tcGxleGVzO1wiOiBcIlxcdTIxMDJcIixcbiAgICBcImNvbmc7XCI6IFwiXFx1MjI0NVwiLFxuICAgIFwiY29uZ2RvdDtcIjogXCJcXHUyQTZEXCIsXG4gICAgXCJDb25ncnVlbnQ7XCI6IFwiXFx1MjI2MVwiLFxuICAgIFwiQ29uaW50O1wiOiBcIlxcdTIyMkZcIixcbiAgICBcImNvbmludDtcIjogXCJcXHUyMjJFXCIsXG4gICAgXCJDb250b3VySW50ZWdyYWw7XCI6IFwiXFx1MjIyRVwiLFxuICAgIFwiQ29wZjtcIjogXCJcXHUyMTAyXCIsXG4gICAgXCJjb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDU0XCIsXG4gICAgXCJjb3Byb2Q7XCI6IFwiXFx1MjIxMFwiLFxuICAgIFwiQ29wcm9kdWN0O1wiOiBcIlxcdTIyMTBcIixcbiAgICBcIkNPUFk7XCI6IFwiXFx1MDBBOVwiLFxuICAgIFwiQ09QWVwiOiBcIlxcdTAwQTlcIixcbiAgICBcImNvcHk7XCI6IFwiXFx1MDBBOVwiLFxuICAgIFwiY29weVwiOiBcIlxcdTAwQTlcIixcbiAgICBcImNvcHlzcjtcIjogXCJcXHUyMTE3XCIsXG4gICAgXCJDb3VudGVyQ2xvY2t3aXNlQ29udG91ckludGVncmFsO1wiOiBcIlxcdTIyMzNcIixcbiAgICBcImNyYXJyO1wiOiBcIlxcdTIxQjVcIixcbiAgICBcIkNyb3NzO1wiOiBcIlxcdTJBMkZcIixcbiAgICBcImNyb3NzO1wiOiBcIlxcdTI3MTdcIixcbiAgICBcIkNzY3I7XCI6IFwiXFx1RDgzNVxcdURDOUVcIixcbiAgICBcImNzY3I7XCI6IFwiXFx1RDgzNVxcdURDQjhcIixcbiAgICBcImNzdWI7XCI6IFwiXFx1MkFDRlwiLFxuICAgIFwiY3N1YmU7XCI6IFwiXFx1MkFEMVwiLFxuICAgIFwiY3N1cDtcIjogXCJcXHUyQUQwXCIsXG4gICAgXCJjc3VwZTtcIjogXCJcXHUyQUQyXCIsXG4gICAgXCJjdGRvdDtcIjogXCJcXHUyMkVGXCIsXG4gICAgXCJjdWRhcnJsO1wiOiBcIlxcdTI5MzhcIixcbiAgICBcImN1ZGFycnI7XCI6IFwiXFx1MjkzNVwiLFxuICAgIFwiY3VlcHI7XCI6IFwiXFx1MjJERVwiLFxuICAgIFwiY3Vlc2M7XCI6IFwiXFx1MjJERlwiLFxuICAgIFwiY3VsYXJyO1wiOiBcIlxcdTIxQjZcIixcbiAgICBcImN1bGFycnA7XCI6IFwiXFx1MjkzRFwiLFxuICAgIFwiQ3VwO1wiOiBcIlxcdTIyRDNcIixcbiAgICBcImN1cDtcIjogXCJcXHUyMjJBXCIsXG4gICAgXCJjdXBicmNhcDtcIjogXCJcXHUyQTQ4XCIsXG4gICAgXCJDdXBDYXA7XCI6IFwiXFx1MjI0RFwiLFxuICAgIFwiY3VwY2FwO1wiOiBcIlxcdTJBNDZcIixcbiAgICBcImN1cGN1cDtcIjogXCJcXHUyQTRBXCIsXG4gICAgXCJjdXBkb3Q7XCI6IFwiXFx1MjI4RFwiLFxuICAgIFwiY3Vwb3I7XCI6IFwiXFx1MkE0NVwiLFxuICAgIFwiY3VwcztcIjogXCJcXHUyMjJBXFx1RkUwMFwiLFxuICAgIFwiY3VyYXJyO1wiOiBcIlxcdTIxQjdcIixcbiAgICBcImN1cmFycm07XCI6IFwiXFx1MjkzQ1wiLFxuICAgIFwiY3VybHllcXByZWM7XCI6IFwiXFx1MjJERVwiLFxuICAgIFwiY3VybHllcXN1Y2M7XCI6IFwiXFx1MjJERlwiLFxuICAgIFwiY3VybHl2ZWU7XCI6IFwiXFx1MjJDRVwiLFxuICAgIFwiY3VybHl3ZWRnZTtcIjogXCJcXHUyMkNGXCIsXG4gICAgXCJjdXJyZW47XCI6IFwiXFx1MDBBNFwiLFxuICAgIFwiY3VycmVuXCI6IFwiXFx1MDBBNFwiLFxuICAgIFwiY3VydmVhcnJvd2xlZnQ7XCI6IFwiXFx1MjFCNlwiLFxuICAgIFwiY3VydmVhcnJvd3JpZ2h0O1wiOiBcIlxcdTIxQjdcIixcbiAgICBcImN1dmVlO1wiOiBcIlxcdTIyQ0VcIixcbiAgICBcImN1d2VkO1wiOiBcIlxcdTIyQ0ZcIixcbiAgICBcImN3Y29uaW50O1wiOiBcIlxcdTIyMzJcIixcbiAgICBcImN3aW50O1wiOiBcIlxcdTIyMzFcIixcbiAgICBcImN5bGN0eTtcIjogXCJcXHUyMzJEXCIsXG4gICAgXCJEYWdnZXI7XCI6IFwiXFx1MjAyMVwiLFxuICAgIFwiZGFnZ2VyO1wiOiBcIlxcdTIwMjBcIixcbiAgICBcImRhbGV0aDtcIjogXCJcXHUyMTM4XCIsXG4gICAgXCJEYXJyO1wiOiBcIlxcdTIxQTFcIixcbiAgICBcImRBcnI7XCI6IFwiXFx1MjFEM1wiLFxuICAgIFwiZGFycjtcIjogXCJcXHUyMTkzXCIsXG4gICAgXCJkYXNoO1wiOiBcIlxcdTIwMTBcIixcbiAgICBcIkRhc2h2O1wiOiBcIlxcdTJBRTRcIixcbiAgICBcImRhc2h2O1wiOiBcIlxcdTIyQTNcIixcbiAgICBcImRia2Fyb3c7XCI6IFwiXFx1MjkwRlwiLFxuICAgIFwiZGJsYWM7XCI6IFwiXFx1MDJERFwiLFxuICAgIFwiRGNhcm9uO1wiOiBcIlxcdTAxMEVcIixcbiAgICBcImRjYXJvbjtcIjogXCJcXHUwMTBGXCIsXG4gICAgXCJEY3k7XCI6IFwiXFx1MDQxNFwiLFxuICAgIFwiZGN5O1wiOiBcIlxcdTA0MzRcIixcbiAgICBcIkREO1wiOiBcIlxcdTIxNDVcIixcbiAgICBcImRkO1wiOiBcIlxcdTIxNDZcIixcbiAgICBcImRkYWdnZXI7XCI6IFwiXFx1MjAyMVwiLFxuICAgIFwiZGRhcnI7XCI6IFwiXFx1MjFDQVwiLFxuICAgIFwiRERvdHJhaGQ7XCI6IFwiXFx1MjkxMVwiLFxuICAgIFwiZGRvdHNlcTtcIjogXCJcXHUyQTc3XCIsXG4gICAgXCJkZWc7XCI6IFwiXFx1MDBCMFwiLFxuICAgIFwiZGVnXCI6IFwiXFx1MDBCMFwiLFxuICAgIFwiRGVsO1wiOiBcIlxcdTIyMDdcIixcbiAgICBcIkRlbHRhO1wiOiBcIlxcdTAzOTRcIixcbiAgICBcImRlbHRhO1wiOiBcIlxcdTAzQjRcIixcbiAgICBcImRlbXB0eXY7XCI6IFwiXFx1MjlCMVwiLFxuICAgIFwiZGZpc2h0O1wiOiBcIlxcdTI5N0ZcIixcbiAgICBcIkRmcjtcIjogXCJcXHVEODM1XFx1REQwN1wiLFxuICAgIFwiZGZyO1wiOiBcIlxcdUQ4MzVcXHVERDIxXCIsXG4gICAgXCJkSGFyO1wiOiBcIlxcdTI5NjVcIixcbiAgICBcImRoYXJsO1wiOiBcIlxcdTIxQzNcIixcbiAgICBcImRoYXJyO1wiOiBcIlxcdTIxQzJcIixcbiAgICBcIkRpYWNyaXRpY2FsQWN1dGU7XCI6IFwiXFx1MDBCNFwiLFxuICAgIFwiRGlhY3JpdGljYWxEb3Q7XCI6IFwiXFx1MDJEOVwiLFxuICAgIFwiRGlhY3JpdGljYWxEb3VibGVBY3V0ZTtcIjogXCJcXHUwMkREXCIsXG4gICAgXCJEaWFjcml0aWNhbEdyYXZlO1wiOiBcImBcIixcbiAgICBcIkRpYWNyaXRpY2FsVGlsZGU7XCI6IFwiXFx1MDJEQ1wiLFxuICAgIFwiZGlhbTtcIjogXCJcXHUyMkM0XCIsXG4gICAgXCJEaWFtb25kO1wiOiBcIlxcdTIyQzRcIixcbiAgICBcImRpYW1vbmQ7XCI6IFwiXFx1MjJDNFwiLFxuICAgIFwiZGlhbW9uZHN1aXQ7XCI6IFwiXFx1MjY2NlwiLFxuICAgIFwiZGlhbXM7XCI6IFwiXFx1MjY2NlwiLFxuICAgIFwiZGllO1wiOiBcIlxcdTAwQThcIixcbiAgICBcIkRpZmZlcmVudGlhbEQ7XCI6IFwiXFx1MjE0NlwiLFxuICAgIFwiZGlnYW1tYTtcIjogXCJcXHUwM0REXCIsXG4gICAgXCJkaXNpbjtcIjogXCJcXHUyMkYyXCIsXG4gICAgXCJkaXY7XCI6IFwiXFx1MDBGN1wiLFxuICAgIFwiZGl2aWRlO1wiOiBcIlxcdTAwRjdcIixcbiAgICBcImRpdmlkZVwiOiBcIlxcdTAwRjdcIixcbiAgICBcImRpdmlkZW9udGltZXM7XCI6IFwiXFx1MjJDN1wiLFxuICAgIFwiZGl2b254O1wiOiBcIlxcdTIyQzdcIixcbiAgICBcIkRKY3k7XCI6IFwiXFx1MDQwMlwiLFxuICAgIFwiZGpjeTtcIjogXCJcXHUwNDUyXCIsXG4gICAgXCJkbGNvcm47XCI6IFwiXFx1MjMxRVwiLFxuICAgIFwiZGxjcm9wO1wiOiBcIlxcdTIzMERcIixcbiAgICBcImRvbGxhcjtcIjogXCIkXCIsXG4gICAgXCJEb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDNCXCIsXG4gICAgXCJkb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDU1XCIsXG4gICAgXCJEb3Q7XCI6IFwiXFx1MDBBOFwiLFxuICAgIFwiZG90O1wiOiBcIlxcdTAyRDlcIixcbiAgICBcIkRvdERvdDtcIjogXCJcXHUyMERDXCIsXG4gICAgXCJkb3RlcTtcIjogXCJcXHUyMjUwXCIsXG4gICAgXCJkb3RlcWRvdDtcIjogXCJcXHUyMjUxXCIsXG4gICAgXCJEb3RFcXVhbDtcIjogXCJcXHUyMjUwXCIsXG4gICAgXCJkb3RtaW51cztcIjogXCJcXHUyMjM4XCIsXG4gICAgXCJkb3RwbHVzO1wiOiBcIlxcdTIyMTRcIixcbiAgICBcImRvdHNxdWFyZTtcIjogXCJcXHUyMkExXCIsXG4gICAgXCJkb3VibGViYXJ3ZWRnZTtcIjogXCJcXHUyMzA2XCIsXG4gICAgXCJEb3VibGVDb250b3VySW50ZWdyYWw7XCI6IFwiXFx1MjIyRlwiLFxuICAgIFwiRG91YmxlRG90O1wiOiBcIlxcdTAwQThcIixcbiAgICBcIkRvdWJsZURvd25BcnJvdztcIjogXCJcXHUyMUQzXCIsXG4gICAgXCJEb3VibGVMZWZ0QXJyb3c7XCI6IFwiXFx1MjFEMFwiLFxuICAgIFwiRG91YmxlTGVmdFJpZ2h0QXJyb3c7XCI6IFwiXFx1MjFENFwiLFxuICAgIFwiRG91YmxlTGVmdFRlZTtcIjogXCJcXHUyQUU0XCIsXG4gICAgXCJEb3VibGVMb25nTGVmdEFycm93O1wiOiBcIlxcdTI3RjhcIixcbiAgICBcIkRvdWJsZUxvbmdMZWZ0UmlnaHRBcnJvdztcIjogXCJcXHUyN0ZBXCIsXG4gICAgXCJEb3VibGVMb25nUmlnaHRBcnJvdztcIjogXCJcXHUyN0Y5XCIsXG4gICAgXCJEb3VibGVSaWdodEFycm93O1wiOiBcIlxcdTIxRDJcIixcbiAgICBcIkRvdWJsZVJpZ2h0VGVlO1wiOiBcIlxcdTIyQThcIixcbiAgICBcIkRvdWJsZVVwQXJyb3c7XCI6IFwiXFx1MjFEMVwiLFxuICAgIFwiRG91YmxlVXBEb3duQXJyb3c7XCI6IFwiXFx1MjFENVwiLFxuICAgIFwiRG91YmxlVmVydGljYWxCYXI7XCI6IFwiXFx1MjIyNVwiLFxuICAgIFwiRG93bkFycm93O1wiOiBcIlxcdTIxOTNcIixcbiAgICBcIkRvd25hcnJvdztcIjogXCJcXHUyMUQzXCIsXG4gICAgXCJkb3duYXJyb3c7XCI6IFwiXFx1MjE5M1wiLFxuICAgIFwiRG93bkFycm93QmFyO1wiOiBcIlxcdTI5MTNcIixcbiAgICBcIkRvd25BcnJvd1VwQXJyb3c7XCI6IFwiXFx1MjFGNVwiLFxuICAgIFwiRG93bkJyZXZlO1wiOiBcIlxcdTAzMTFcIixcbiAgICBcImRvd25kb3duYXJyb3dzO1wiOiBcIlxcdTIxQ0FcIixcbiAgICBcImRvd25oYXJwb29ubGVmdDtcIjogXCJcXHUyMUMzXCIsXG4gICAgXCJkb3duaGFycG9vbnJpZ2h0O1wiOiBcIlxcdTIxQzJcIixcbiAgICBcIkRvd25MZWZ0UmlnaHRWZWN0b3I7XCI6IFwiXFx1Mjk1MFwiLFxuICAgIFwiRG93bkxlZnRUZWVWZWN0b3I7XCI6IFwiXFx1Mjk1RVwiLFxuICAgIFwiRG93bkxlZnRWZWN0b3I7XCI6IFwiXFx1MjFCRFwiLFxuICAgIFwiRG93bkxlZnRWZWN0b3JCYXI7XCI6IFwiXFx1Mjk1NlwiLFxuICAgIFwiRG93blJpZ2h0VGVlVmVjdG9yO1wiOiBcIlxcdTI5NUZcIixcbiAgICBcIkRvd25SaWdodFZlY3RvcjtcIjogXCJcXHUyMUMxXCIsXG4gICAgXCJEb3duUmlnaHRWZWN0b3JCYXI7XCI6IFwiXFx1Mjk1N1wiLFxuICAgIFwiRG93blRlZTtcIjogXCJcXHUyMkE0XCIsXG4gICAgXCJEb3duVGVlQXJyb3c7XCI6IFwiXFx1MjFBN1wiLFxuICAgIFwiZHJia2Fyb3c7XCI6IFwiXFx1MjkxMFwiLFxuICAgIFwiZHJjb3JuO1wiOiBcIlxcdTIzMUZcIixcbiAgICBcImRyY3JvcDtcIjogXCJcXHUyMzBDXCIsXG4gICAgXCJEc2NyO1wiOiBcIlxcdUQ4MzVcXHVEQzlGXCIsXG4gICAgXCJkc2NyO1wiOiBcIlxcdUQ4MzVcXHVEQ0I5XCIsXG4gICAgXCJEU2N5O1wiOiBcIlxcdTA0MDVcIixcbiAgICBcImRzY3k7XCI6IFwiXFx1MDQ1NVwiLFxuICAgIFwiZHNvbDtcIjogXCJcXHUyOUY2XCIsXG4gICAgXCJEc3Ryb2s7XCI6IFwiXFx1MDExMFwiLFxuICAgIFwiZHN0cm9rO1wiOiBcIlxcdTAxMTFcIixcbiAgICBcImR0ZG90O1wiOiBcIlxcdTIyRjFcIixcbiAgICBcImR0cmk7XCI6IFwiXFx1MjVCRlwiLFxuICAgIFwiZHRyaWY7XCI6IFwiXFx1MjVCRVwiLFxuICAgIFwiZHVhcnI7XCI6IFwiXFx1MjFGNVwiLFxuICAgIFwiZHVoYXI7XCI6IFwiXFx1Mjk2RlwiLFxuICAgIFwiZHdhbmdsZTtcIjogXCJcXHUyOUE2XCIsXG4gICAgXCJEWmN5O1wiOiBcIlxcdTA0MEZcIixcbiAgICBcImR6Y3k7XCI6IFwiXFx1MDQ1RlwiLFxuICAgIFwiZHppZ3JhcnI7XCI6IFwiXFx1MjdGRlwiLFxuICAgIFwiRWFjdXRlO1wiOiBcIlxcdTAwQzlcIixcbiAgICBcIkVhY3V0ZVwiOiBcIlxcdTAwQzlcIixcbiAgICBcImVhY3V0ZTtcIjogXCJcXHUwMEU5XCIsXG4gICAgXCJlYWN1dGVcIjogXCJcXHUwMEU5XCIsXG4gICAgXCJlYXN0ZXI7XCI6IFwiXFx1MkE2RVwiLFxuICAgIFwiRWNhcm9uO1wiOiBcIlxcdTAxMUFcIixcbiAgICBcImVjYXJvbjtcIjogXCJcXHUwMTFCXCIsXG4gICAgXCJlY2lyO1wiOiBcIlxcdTIyNTZcIixcbiAgICBcIkVjaXJjO1wiOiBcIlxcdTAwQ0FcIixcbiAgICBcIkVjaXJjXCI6IFwiXFx1MDBDQVwiLFxuICAgIFwiZWNpcmM7XCI6IFwiXFx1MDBFQVwiLFxuICAgIFwiZWNpcmNcIjogXCJcXHUwMEVBXCIsXG4gICAgXCJlY29sb247XCI6IFwiXFx1MjI1NVwiLFxuICAgIFwiRWN5O1wiOiBcIlxcdTA0MkRcIixcbiAgICBcImVjeTtcIjogXCJcXHUwNDREXCIsXG4gICAgXCJlRERvdDtcIjogXCJcXHUyQTc3XCIsXG4gICAgXCJFZG90O1wiOiBcIlxcdTAxMTZcIixcbiAgICBcImVEb3Q7XCI6IFwiXFx1MjI1MVwiLFxuICAgIFwiZWRvdDtcIjogXCJcXHUwMTE3XCIsXG4gICAgXCJlZTtcIjogXCJcXHUyMTQ3XCIsXG4gICAgXCJlZkRvdDtcIjogXCJcXHUyMjUyXCIsXG4gICAgXCJFZnI7XCI6IFwiXFx1RDgzNVxcdUREMDhcIixcbiAgICBcImVmcjtcIjogXCJcXHVEODM1XFx1REQyMlwiLFxuICAgIFwiZWc7XCI6IFwiXFx1MkE5QVwiLFxuICAgIFwiRWdyYXZlO1wiOiBcIlxcdTAwQzhcIixcbiAgICBcIkVncmF2ZVwiOiBcIlxcdTAwQzhcIixcbiAgICBcImVncmF2ZTtcIjogXCJcXHUwMEU4XCIsXG4gICAgXCJlZ3JhdmVcIjogXCJcXHUwMEU4XCIsXG4gICAgXCJlZ3M7XCI6IFwiXFx1MkE5NlwiLFxuICAgIFwiZWdzZG90O1wiOiBcIlxcdTJBOThcIixcbiAgICBcImVsO1wiOiBcIlxcdTJBOTlcIixcbiAgICBcIkVsZW1lbnQ7XCI6IFwiXFx1MjIwOFwiLFxuICAgIFwiZWxpbnRlcnM7XCI6IFwiXFx1MjNFN1wiLFxuICAgIFwiZWxsO1wiOiBcIlxcdTIxMTNcIixcbiAgICBcImVscztcIjogXCJcXHUyQTk1XCIsXG4gICAgXCJlbHNkb3Q7XCI6IFwiXFx1MkE5N1wiLFxuICAgIFwiRW1hY3I7XCI6IFwiXFx1MDExMlwiLFxuICAgIFwiZW1hY3I7XCI6IFwiXFx1MDExM1wiLFxuICAgIFwiZW1wdHk7XCI6IFwiXFx1MjIwNVwiLFxuICAgIFwiZW1wdHlzZXQ7XCI6IFwiXFx1MjIwNVwiLFxuICAgIFwiRW1wdHlTbWFsbFNxdWFyZTtcIjogXCJcXHUyNUZCXCIsXG4gICAgXCJlbXB0eXY7XCI6IFwiXFx1MjIwNVwiLFxuICAgIFwiRW1wdHlWZXJ5U21hbGxTcXVhcmU7XCI6IFwiXFx1MjVBQlwiLFxuICAgIFwiZW1zcDtcIjogXCJcXHUyMDAzXCIsXG4gICAgXCJlbXNwMTM7XCI6IFwiXFx1MjAwNFwiLFxuICAgIFwiZW1zcDE0O1wiOiBcIlxcdTIwMDVcIixcbiAgICBcIkVORztcIjogXCJcXHUwMTRBXCIsXG4gICAgXCJlbmc7XCI6IFwiXFx1MDE0QlwiLFxuICAgIFwiZW5zcDtcIjogXCJcXHUyMDAyXCIsXG4gICAgXCJFb2dvbjtcIjogXCJcXHUwMTE4XCIsXG4gICAgXCJlb2dvbjtcIjogXCJcXHUwMTE5XCIsXG4gICAgXCJFb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDNDXCIsXG4gICAgXCJlb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDU2XCIsXG4gICAgXCJlcGFyO1wiOiBcIlxcdTIyRDVcIixcbiAgICBcImVwYXJzbDtcIjogXCJcXHUyOUUzXCIsXG4gICAgXCJlcGx1cztcIjogXCJcXHUyQTcxXCIsXG4gICAgXCJlcHNpO1wiOiBcIlxcdTAzQjVcIixcbiAgICBcIkVwc2lsb247XCI6IFwiXFx1MDM5NVwiLFxuICAgIFwiZXBzaWxvbjtcIjogXCJcXHUwM0I1XCIsXG4gICAgXCJlcHNpdjtcIjogXCJcXHUwM0Y1XCIsXG4gICAgXCJlcWNpcmM7XCI6IFwiXFx1MjI1NlwiLFxuICAgIFwiZXFjb2xvbjtcIjogXCJcXHUyMjU1XCIsXG4gICAgXCJlcXNpbTtcIjogXCJcXHUyMjQyXCIsXG4gICAgXCJlcXNsYW50Z3RyO1wiOiBcIlxcdTJBOTZcIixcbiAgICBcImVxc2xhbnRsZXNzO1wiOiBcIlxcdTJBOTVcIixcbiAgICBcIkVxdWFsO1wiOiBcIlxcdTJBNzVcIixcbiAgICBcImVxdWFscztcIjogXCI9XCIsXG4gICAgXCJFcXVhbFRpbGRlO1wiOiBcIlxcdTIyNDJcIixcbiAgICBcImVxdWVzdDtcIjogXCJcXHUyMjVGXCIsXG4gICAgXCJFcXVpbGlicml1bTtcIjogXCJcXHUyMUNDXCIsXG4gICAgXCJlcXVpdjtcIjogXCJcXHUyMjYxXCIsXG4gICAgXCJlcXVpdkREO1wiOiBcIlxcdTJBNzhcIixcbiAgICBcImVxdnBhcnNsO1wiOiBcIlxcdTI5RTVcIixcbiAgICBcImVyYXJyO1wiOiBcIlxcdTI5NzFcIixcbiAgICBcImVyRG90O1wiOiBcIlxcdTIyNTNcIixcbiAgICBcIkVzY3I7XCI6IFwiXFx1MjEzMFwiLFxuICAgIFwiZXNjcjtcIjogXCJcXHUyMTJGXCIsXG4gICAgXCJlc2RvdDtcIjogXCJcXHUyMjUwXCIsXG4gICAgXCJFc2ltO1wiOiBcIlxcdTJBNzNcIixcbiAgICBcImVzaW07XCI6IFwiXFx1MjI0MlwiLFxuICAgIFwiRXRhO1wiOiBcIlxcdTAzOTdcIixcbiAgICBcImV0YTtcIjogXCJcXHUwM0I3XCIsXG4gICAgXCJFVEg7XCI6IFwiXFx1MDBEMFwiLFxuICAgIFwiRVRIXCI6IFwiXFx1MDBEMFwiLFxuICAgIFwiZXRoO1wiOiBcIlxcdTAwRjBcIixcbiAgICBcImV0aFwiOiBcIlxcdTAwRjBcIixcbiAgICBcIkV1bWw7XCI6IFwiXFx1MDBDQlwiLFxuICAgIFwiRXVtbFwiOiBcIlxcdTAwQ0JcIixcbiAgICBcImV1bWw7XCI6IFwiXFx1MDBFQlwiLFxuICAgIFwiZXVtbFwiOiBcIlxcdTAwRUJcIixcbiAgICBcImV1cm87XCI6IFwiXFx1MjBBQ1wiLFxuICAgIFwiZXhjbDtcIjogXCIhXCIsXG4gICAgXCJleGlzdDtcIjogXCJcXHUyMjAzXCIsXG4gICAgXCJFeGlzdHM7XCI6IFwiXFx1MjIwM1wiLFxuICAgIFwiZXhwZWN0YXRpb247XCI6IFwiXFx1MjEzMFwiLFxuICAgIFwiRXhwb25lbnRpYWxFO1wiOiBcIlxcdTIxNDdcIixcbiAgICBcImV4cG9uZW50aWFsZTtcIjogXCJcXHUyMTQ3XCIsXG4gICAgXCJmYWxsaW5nZG90c2VxO1wiOiBcIlxcdTIyNTJcIixcbiAgICBcIkZjeTtcIjogXCJcXHUwNDI0XCIsXG4gICAgXCJmY3k7XCI6IFwiXFx1MDQ0NFwiLFxuICAgIFwiZmVtYWxlO1wiOiBcIlxcdTI2NDBcIixcbiAgICBcImZmaWxpZztcIjogXCJcXHVGQjAzXCIsXG4gICAgXCJmZmxpZztcIjogXCJcXHVGQjAwXCIsXG4gICAgXCJmZmxsaWc7XCI6IFwiXFx1RkIwNFwiLFxuICAgIFwiRmZyO1wiOiBcIlxcdUQ4MzVcXHVERDA5XCIsXG4gICAgXCJmZnI7XCI6IFwiXFx1RDgzNVxcdUREMjNcIixcbiAgICBcImZpbGlnO1wiOiBcIlxcdUZCMDFcIixcbiAgICBcIkZpbGxlZFNtYWxsU3F1YXJlO1wiOiBcIlxcdTI1RkNcIixcbiAgICBcIkZpbGxlZFZlcnlTbWFsbFNxdWFyZTtcIjogXCJcXHUyNUFBXCIsXG4gICAgXCJmamxpZztcIjogXCJmalwiLFxuICAgIFwiZmxhdDtcIjogXCJcXHUyNjZEXCIsXG4gICAgXCJmbGxpZztcIjogXCJcXHVGQjAyXCIsXG4gICAgXCJmbHRucztcIjogXCJcXHUyNUIxXCIsXG4gICAgXCJmbm9mO1wiOiBcIlxcdTAxOTJcIixcbiAgICBcIkZvcGY7XCI6IFwiXFx1RDgzNVxcdUREM0RcIixcbiAgICBcImZvcGY7XCI6IFwiXFx1RDgzNVxcdURENTdcIixcbiAgICBcIkZvckFsbDtcIjogXCJcXHUyMjAwXCIsXG4gICAgXCJmb3JhbGw7XCI6IFwiXFx1MjIwMFwiLFxuICAgIFwiZm9yaztcIjogXCJcXHUyMkQ0XCIsXG4gICAgXCJmb3JrdjtcIjogXCJcXHUyQUQ5XCIsXG4gICAgXCJGb3VyaWVydHJmO1wiOiBcIlxcdTIxMzFcIixcbiAgICBcImZwYXJ0aW50O1wiOiBcIlxcdTJBMERcIixcbiAgICBcImZyYWMxMjtcIjogXCJcXHUwMEJEXCIsXG4gICAgXCJmcmFjMTJcIjogXCJcXHUwMEJEXCIsXG4gICAgXCJmcmFjMTM7XCI6IFwiXFx1MjE1M1wiLFxuICAgIFwiZnJhYzE0O1wiOiBcIlxcdTAwQkNcIixcbiAgICBcImZyYWMxNFwiOiBcIlxcdTAwQkNcIixcbiAgICBcImZyYWMxNTtcIjogXCJcXHUyMTU1XCIsXG4gICAgXCJmcmFjMTY7XCI6IFwiXFx1MjE1OVwiLFxuICAgIFwiZnJhYzE4O1wiOiBcIlxcdTIxNUJcIixcbiAgICBcImZyYWMyMztcIjogXCJcXHUyMTU0XCIsXG4gICAgXCJmcmFjMjU7XCI6IFwiXFx1MjE1NlwiLFxuICAgIFwiZnJhYzM0O1wiOiBcIlxcdTAwQkVcIixcbiAgICBcImZyYWMzNFwiOiBcIlxcdTAwQkVcIixcbiAgICBcImZyYWMzNTtcIjogXCJcXHUyMTU3XCIsXG4gICAgXCJmcmFjMzg7XCI6IFwiXFx1MjE1Q1wiLFxuICAgIFwiZnJhYzQ1O1wiOiBcIlxcdTIxNThcIixcbiAgICBcImZyYWM1NjtcIjogXCJcXHUyMTVBXCIsXG4gICAgXCJmcmFjNTg7XCI6IFwiXFx1MjE1RFwiLFxuICAgIFwiZnJhYzc4O1wiOiBcIlxcdTIxNUVcIixcbiAgICBcImZyYXNsO1wiOiBcIlxcdTIwNDRcIixcbiAgICBcImZyb3duO1wiOiBcIlxcdTIzMjJcIixcbiAgICBcIkZzY3I7XCI6IFwiXFx1MjEzMVwiLFxuICAgIFwiZnNjcjtcIjogXCJcXHVEODM1XFx1RENCQlwiLFxuICAgIFwiZ2FjdXRlO1wiOiBcIlxcdTAxRjVcIixcbiAgICBcIkdhbW1hO1wiOiBcIlxcdTAzOTNcIixcbiAgICBcImdhbW1hO1wiOiBcIlxcdTAzQjNcIixcbiAgICBcIkdhbW1hZDtcIjogXCJcXHUwM0RDXCIsXG4gICAgXCJnYW1tYWQ7XCI6IFwiXFx1MDNERFwiLFxuICAgIFwiZ2FwO1wiOiBcIlxcdTJBODZcIixcbiAgICBcIkdicmV2ZTtcIjogXCJcXHUwMTFFXCIsXG4gICAgXCJnYnJldmU7XCI6IFwiXFx1MDExRlwiLFxuICAgIFwiR2NlZGlsO1wiOiBcIlxcdTAxMjJcIixcbiAgICBcIkdjaXJjO1wiOiBcIlxcdTAxMUNcIixcbiAgICBcImdjaXJjO1wiOiBcIlxcdTAxMURcIixcbiAgICBcIkdjeTtcIjogXCJcXHUwNDEzXCIsXG4gICAgXCJnY3k7XCI6IFwiXFx1MDQzM1wiLFxuICAgIFwiR2RvdDtcIjogXCJcXHUwMTIwXCIsXG4gICAgXCJnZG90O1wiOiBcIlxcdTAxMjFcIixcbiAgICBcImdFO1wiOiBcIlxcdTIyNjdcIixcbiAgICBcImdlO1wiOiBcIlxcdTIyNjVcIixcbiAgICBcImdFbDtcIjogXCJcXHUyQThDXCIsXG4gICAgXCJnZWw7XCI6IFwiXFx1MjJEQlwiLFxuICAgIFwiZ2VxO1wiOiBcIlxcdTIyNjVcIixcbiAgICBcImdlcXE7XCI6IFwiXFx1MjI2N1wiLFxuICAgIFwiZ2Vxc2xhbnQ7XCI6IFwiXFx1MkE3RVwiLFxuICAgIFwiZ2VzO1wiOiBcIlxcdTJBN0VcIixcbiAgICBcImdlc2NjO1wiOiBcIlxcdTJBQTlcIixcbiAgICBcImdlc2RvdDtcIjogXCJcXHUyQTgwXCIsXG4gICAgXCJnZXNkb3RvO1wiOiBcIlxcdTJBODJcIixcbiAgICBcImdlc2RvdG9sO1wiOiBcIlxcdTJBODRcIixcbiAgICBcImdlc2w7XCI6IFwiXFx1MjJEQlxcdUZFMDBcIixcbiAgICBcImdlc2xlcztcIjogXCJcXHUyQTk0XCIsXG4gICAgXCJHZnI7XCI6IFwiXFx1RDgzNVxcdUREMEFcIixcbiAgICBcImdmcjtcIjogXCJcXHVEODM1XFx1REQyNFwiLFxuICAgIFwiR2c7XCI6IFwiXFx1MjJEOVwiLFxuICAgIFwiZ2c7XCI6IFwiXFx1MjI2QlwiLFxuICAgIFwiZ2dnO1wiOiBcIlxcdTIyRDlcIixcbiAgICBcImdpbWVsO1wiOiBcIlxcdTIxMzdcIixcbiAgICBcIkdKY3k7XCI6IFwiXFx1MDQwM1wiLFxuICAgIFwiZ2pjeTtcIjogXCJcXHUwNDUzXCIsXG4gICAgXCJnbDtcIjogXCJcXHUyMjc3XCIsXG4gICAgXCJnbGE7XCI6IFwiXFx1MkFBNVwiLFxuICAgIFwiZ2xFO1wiOiBcIlxcdTJBOTJcIixcbiAgICBcImdsajtcIjogXCJcXHUyQUE0XCIsXG4gICAgXCJnbmFwO1wiOiBcIlxcdTJBOEFcIixcbiAgICBcImduYXBwcm94O1wiOiBcIlxcdTJBOEFcIixcbiAgICBcImduRTtcIjogXCJcXHUyMjY5XCIsXG4gICAgXCJnbmU7XCI6IFwiXFx1MkE4OFwiLFxuICAgIFwiZ25lcTtcIjogXCJcXHUyQTg4XCIsXG4gICAgXCJnbmVxcTtcIjogXCJcXHUyMjY5XCIsXG4gICAgXCJnbnNpbTtcIjogXCJcXHUyMkU3XCIsXG4gICAgXCJHb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDNFXCIsXG4gICAgXCJnb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDU4XCIsXG4gICAgXCJncmF2ZTtcIjogXCJgXCIsXG4gICAgXCJHcmVhdGVyRXF1YWw7XCI6IFwiXFx1MjI2NVwiLFxuICAgIFwiR3JlYXRlckVxdWFsTGVzcztcIjogXCJcXHUyMkRCXCIsXG4gICAgXCJHcmVhdGVyRnVsbEVxdWFsO1wiOiBcIlxcdTIyNjdcIixcbiAgICBcIkdyZWF0ZXJHcmVhdGVyO1wiOiBcIlxcdTJBQTJcIixcbiAgICBcIkdyZWF0ZXJMZXNzO1wiOiBcIlxcdTIyNzdcIixcbiAgICBcIkdyZWF0ZXJTbGFudEVxdWFsO1wiOiBcIlxcdTJBN0VcIixcbiAgICBcIkdyZWF0ZXJUaWxkZTtcIjogXCJcXHUyMjczXCIsXG4gICAgXCJHc2NyO1wiOiBcIlxcdUQ4MzVcXHVEQ0EyXCIsXG4gICAgXCJnc2NyO1wiOiBcIlxcdTIxMEFcIixcbiAgICBcImdzaW07XCI6IFwiXFx1MjI3M1wiLFxuICAgIFwiZ3NpbWU7XCI6IFwiXFx1MkE4RVwiLFxuICAgIFwiZ3NpbWw7XCI6IFwiXFx1MkE5MFwiLFxuICAgIFwiR1Q7XCI6IFwiPlwiLFxuICAgIFwiR1RcIjogXCI+XCIsXG4gICAgXCJHdDtcIjogXCJcXHUyMjZCXCIsXG4gICAgXCJndDtcIjogXCI+XCIsXG4gICAgXCJndFwiOiBcIj5cIixcbiAgICBcImd0Y2M7XCI6IFwiXFx1MkFBN1wiLFxuICAgIFwiZ3RjaXI7XCI6IFwiXFx1MkE3QVwiLFxuICAgIFwiZ3Rkb3Q7XCI6IFwiXFx1MjJEN1wiLFxuICAgIFwiZ3RsUGFyO1wiOiBcIlxcdTI5OTVcIixcbiAgICBcImd0cXVlc3Q7XCI6IFwiXFx1MkE3Q1wiLFxuICAgIFwiZ3RyYXBwcm94O1wiOiBcIlxcdTJBODZcIixcbiAgICBcImd0cmFycjtcIjogXCJcXHUyOTc4XCIsXG4gICAgXCJndHJkb3Q7XCI6IFwiXFx1MjJEN1wiLFxuICAgIFwiZ3RyZXFsZXNzO1wiOiBcIlxcdTIyREJcIixcbiAgICBcImd0cmVxcWxlc3M7XCI6IFwiXFx1MkE4Q1wiLFxuICAgIFwiZ3RybGVzcztcIjogXCJcXHUyMjc3XCIsXG4gICAgXCJndHJzaW07XCI6IFwiXFx1MjI3M1wiLFxuICAgIFwiZ3ZlcnRuZXFxO1wiOiBcIlxcdTIyNjlcXHVGRTAwXCIsXG4gICAgXCJndm5FO1wiOiBcIlxcdTIyNjlcXHVGRTAwXCIsXG4gICAgXCJIYWNlaztcIjogXCJcXHUwMkM3XCIsXG4gICAgXCJoYWlyc3A7XCI6IFwiXFx1MjAwQVwiLFxuICAgIFwiaGFsZjtcIjogXCJcXHUwMEJEXCIsXG4gICAgXCJoYW1pbHQ7XCI6IFwiXFx1MjEwQlwiLFxuICAgIFwiSEFSRGN5O1wiOiBcIlxcdTA0MkFcIixcbiAgICBcImhhcmRjeTtcIjogXCJcXHUwNDRBXCIsXG4gICAgXCJoQXJyO1wiOiBcIlxcdTIxRDRcIixcbiAgICBcImhhcnI7XCI6IFwiXFx1MjE5NFwiLFxuICAgIFwiaGFycmNpcjtcIjogXCJcXHUyOTQ4XCIsXG4gICAgXCJoYXJydztcIjogXCJcXHUyMUFEXCIsXG4gICAgXCJIYXQ7XCI6IFwiXlwiLFxuICAgIFwiaGJhcjtcIjogXCJcXHUyMTBGXCIsXG4gICAgXCJIY2lyYztcIjogXCJcXHUwMTI0XCIsXG4gICAgXCJoY2lyYztcIjogXCJcXHUwMTI1XCIsXG4gICAgXCJoZWFydHM7XCI6IFwiXFx1MjY2NVwiLFxuICAgIFwiaGVhcnRzdWl0O1wiOiBcIlxcdTI2NjVcIixcbiAgICBcImhlbGxpcDtcIjogXCJcXHUyMDI2XCIsXG4gICAgXCJoZXJjb247XCI6IFwiXFx1MjJCOVwiLFxuICAgIFwiSGZyO1wiOiBcIlxcdTIxMENcIixcbiAgICBcImhmcjtcIjogXCJcXHVEODM1XFx1REQyNVwiLFxuICAgIFwiSGlsYmVydFNwYWNlO1wiOiBcIlxcdTIxMEJcIixcbiAgICBcImhrc2Vhcm93O1wiOiBcIlxcdTI5MjVcIixcbiAgICBcImhrc3dhcm93O1wiOiBcIlxcdTI5MjZcIixcbiAgICBcImhvYXJyO1wiOiBcIlxcdTIxRkZcIixcbiAgICBcImhvbXRodDtcIjogXCJcXHUyMjNCXCIsXG4gICAgXCJob29rbGVmdGFycm93O1wiOiBcIlxcdTIxQTlcIixcbiAgICBcImhvb2tyaWdodGFycm93O1wiOiBcIlxcdTIxQUFcIixcbiAgICBcIkhvcGY7XCI6IFwiXFx1MjEwRFwiLFxuICAgIFwiaG9wZjtcIjogXCJcXHVEODM1XFx1REQ1OVwiLFxuICAgIFwiaG9yYmFyO1wiOiBcIlxcdTIwMTVcIixcbiAgICBcIkhvcml6b250YWxMaW5lO1wiOiBcIlxcdTI1MDBcIixcbiAgICBcIkhzY3I7XCI6IFwiXFx1MjEwQlwiLFxuICAgIFwiaHNjcjtcIjogXCJcXHVEODM1XFx1RENCRFwiLFxuICAgIFwiaHNsYXNoO1wiOiBcIlxcdTIxMEZcIixcbiAgICBcIkhzdHJvaztcIjogXCJcXHUwMTI2XCIsXG4gICAgXCJoc3Ryb2s7XCI6IFwiXFx1MDEyN1wiLFxuICAgIFwiSHVtcERvd25IdW1wO1wiOiBcIlxcdTIyNEVcIixcbiAgICBcIkh1bXBFcXVhbDtcIjogXCJcXHUyMjRGXCIsXG4gICAgXCJoeWJ1bGw7XCI6IFwiXFx1MjA0M1wiLFxuICAgIFwiaHlwaGVuO1wiOiBcIlxcdTIwMTBcIixcbiAgICBcIklhY3V0ZTtcIjogXCJcXHUwMENEXCIsXG4gICAgXCJJYWN1dGVcIjogXCJcXHUwMENEXCIsXG4gICAgXCJpYWN1dGU7XCI6IFwiXFx1MDBFRFwiLFxuICAgIFwiaWFjdXRlXCI6IFwiXFx1MDBFRFwiLFxuICAgIFwiaWM7XCI6IFwiXFx1MjA2M1wiLFxuICAgIFwiSWNpcmM7XCI6IFwiXFx1MDBDRVwiLFxuICAgIFwiSWNpcmNcIjogXCJcXHUwMENFXCIsXG4gICAgXCJpY2lyYztcIjogXCJcXHUwMEVFXCIsXG4gICAgXCJpY2lyY1wiOiBcIlxcdTAwRUVcIixcbiAgICBcIkljeTtcIjogXCJcXHUwNDE4XCIsXG4gICAgXCJpY3k7XCI6IFwiXFx1MDQzOFwiLFxuICAgIFwiSWRvdDtcIjogXCJcXHUwMTMwXCIsXG4gICAgXCJJRWN5O1wiOiBcIlxcdTA0MTVcIixcbiAgICBcImllY3k7XCI6IFwiXFx1MDQzNVwiLFxuICAgIFwiaWV4Y2w7XCI6IFwiXFx1MDBBMVwiLFxuICAgIFwiaWV4Y2xcIjogXCJcXHUwMEExXCIsXG4gICAgXCJpZmY7XCI6IFwiXFx1MjFENFwiLFxuICAgIFwiSWZyO1wiOiBcIlxcdTIxMTFcIixcbiAgICBcImlmcjtcIjogXCJcXHVEODM1XFx1REQyNlwiLFxuICAgIFwiSWdyYXZlO1wiOiBcIlxcdTAwQ0NcIixcbiAgICBcIklncmF2ZVwiOiBcIlxcdTAwQ0NcIixcbiAgICBcImlncmF2ZTtcIjogXCJcXHUwMEVDXCIsXG4gICAgXCJpZ3JhdmVcIjogXCJcXHUwMEVDXCIsXG4gICAgXCJpaTtcIjogXCJcXHUyMTQ4XCIsXG4gICAgXCJpaWlpbnQ7XCI6IFwiXFx1MkEwQ1wiLFxuICAgIFwiaWlpbnQ7XCI6IFwiXFx1MjIyRFwiLFxuICAgIFwiaWluZmluO1wiOiBcIlxcdTI5RENcIixcbiAgICBcImlpb3RhO1wiOiBcIlxcdTIxMjlcIixcbiAgICBcIklKbGlnO1wiOiBcIlxcdTAxMzJcIixcbiAgICBcImlqbGlnO1wiOiBcIlxcdTAxMzNcIixcbiAgICBcIkltO1wiOiBcIlxcdTIxMTFcIixcbiAgICBcIkltYWNyO1wiOiBcIlxcdTAxMkFcIixcbiAgICBcImltYWNyO1wiOiBcIlxcdTAxMkJcIixcbiAgICBcImltYWdlO1wiOiBcIlxcdTIxMTFcIixcbiAgICBcIkltYWdpbmFyeUk7XCI6IFwiXFx1MjE0OFwiLFxuICAgIFwiaW1hZ2xpbmU7XCI6IFwiXFx1MjExMFwiLFxuICAgIFwiaW1hZ3BhcnQ7XCI6IFwiXFx1MjExMVwiLFxuICAgIFwiaW1hdGg7XCI6IFwiXFx1MDEzMVwiLFxuICAgIFwiaW1vZjtcIjogXCJcXHUyMkI3XCIsXG4gICAgXCJpbXBlZDtcIjogXCJcXHUwMUI1XCIsXG4gICAgXCJJbXBsaWVzO1wiOiBcIlxcdTIxRDJcIixcbiAgICBcImluO1wiOiBcIlxcdTIyMDhcIixcbiAgICBcImluY2FyZTtcIjogXCJcXHUyMTA1XCIsXG4gICAgXCJpbmZpbjtcIjogXCJcXHUyMjFFXCIsXG4gICAgXCJpbmZpbnRpZTtcIjogXCJcXHUyOUREXCIsXG4gICAgXCJpbm9kb3Q7XCI6IFwiXFx1MDEzMVwiLFxuICAgIFwiSW50O1wiOiBcIlxcdTIyMkNcIixcbiAgICBcImludDtcIjogXCJcXHUyMjJCXCIsXG4gICAgXCJpbnRjYWw7XCI6IFwiXFx1MjJCQVwiLFxuICAgIFwiaW50ZWdlcnM7XCI6IFwiXFx1MjEyNFwiLFxuICAgIFwiSW50ZWdyYWw7XCI6IFwiXFx1MjIyQlwiLFxuICAgIFwiaW50ZXJjYWw7XCI6IFwiXFx1MjJCQVwiLFxuICAgIFwiSW50ZXJzZWN0aW9uO1wiOiBcIlxcdTIyQzJcIixcbiAgICBcImludGxhcmhrO1wiOiBcIlxcdTJBMTdcIixcbiAgICBcImludHByb2Q7XCI6IFwiXFx1MkEzQ1wiLFxuICAgIFwiSW52aXNpYmxlQ29tbWE7XCI6IFwiXFx1MjA2M1wiLFxuICAgIFwiSW52aXNpYmxlVGltZXM7XCI6IFwiXFx1MjA2MlwiLFxuICAgIFwiSU9jeTtcIjogXCJcXHUwNDAxXCIsXG4gICAgXCJpb2N5O1wiOiBcIlxcdTA0NTFcIixcbiAgICBcIklvZ29uO1wiOiBcIlxcdTAxMkVcIixcbiAgICBcImlvZ29uO1wiOiBcIlxcdTAxMkZcIixcbiAgICBcIklvcGY7XCI6IFwiXFx1RDgzNVxcdURENDBcIixcbiAgICBcImlvcGY7XCI6IFwiXFx1RDgzNVxcdURENUFcIixcbiAgICBcIklvdGE7XCI6IFwiXFx1MDM5OVwiLFxuICAgIFwiaW90YTtcIjogXCJcXHUwM0I5XCIsXG4gICAgXCJpcHJvZDtcIjogXCJcXHUyQTNDXCIsXG4gICAgXCJpcXVlc3Q7XCI6IFwiXFx1MDBCRlwiLFxuICAgIFwiaXF1ZXN0XCI6IFwiXFx1MDBCRlwiLFxuICAgIFwiSXNjcjtcIjogXCJcXHUyMTEwXCIsXG4gICAgXCJpc2NyO1wiOiBcIlxcdUQ4MzVcXHVEQ0JFXCIsXG4gICAgXCJpc2luO1wiOiBcIlxcdTIyMDhcIixcbiAgICBcImlzaW5kb3Q7XCI6IFwiXFx1MjJGNVwiLFxuICAgIFwiaXNpbkU7XCI6IFwiXFx1MjJGOVwiLFxuICAgIFwiaXNpbnM7XCI6IFwiXFx1MjJGNFwiLFxuICAgIFwiaXNpbnN2O1wiOiBcIlxcdTIyRjNcIixcbiAgICBcImlzaW52O1wiOiBcIlxcdTIyMDhcIixcbiAgICBcIml0O1wiOiBcIlxcdTIwNjJcIixcbiAgICBcIkl0aWxkZTtcIjogXCJcXHUwMTI4XCIsXG4gICAgXCJpdGlsZGU7XCI6IFwiXFx1MDEyOVwiLFxuICAgIFwiSXVrY3k7XCI6IFwiXFx1MDQwNlwiLFxuICAgIFwiaXVrY3k7XCI6IFwiXFx1MDQ1NlwiLFxuICAgIFwiSXVtbDtcIjogXCJcXHUwMENGXCIsXG4gICAgXCJJdW1sXCI6IFwiXFx1MDBDRlwiLFxuICAgIFwiaXVtbDtcIjogXCJcXHUwMEVGXCIsXG4gICAgXCJpdW1sXCI6IFwiXFx1MDBFRlwiLFxuICAgIFwiSmNpcmM7XCI6IFwiXFx1MDEzNFwiLFxuICAgIFwiamNpcmM7XCI6IFwiXFx1MDEzNVwiLFxuICAgIFwiSmN5O1wiOiBcIlxcdTA0MTlcIixcbiAgICBcImpjeTtcIjogXCJcXHUwNDM5XCIsXG4gICAgXCJKZnI7XCI6IFwiXFx1RDgzNVxcdUREMERcIixcbiAgICBcImpmcjtcIjogXCJcXHVEODM1XFx1REQyN1wiLFxuICAgIFwiam1hdGg7XCI6IFwiXFx1MDIzN1wiLFxuICAgIFwiSm9wZjtcIjogXCJcXHVEODM1XFx1REQ0MVwiLFxuICAgIFwiam9wZjtcIjogXCJcXHVEODM1XFx1REQ1QlwiLFxuICAgIFwiSnNjcjtcIjogXCJcXHVEODM1XFx1RENBNVwiLFxuICAgIFwianNjcjtcIjogXCJcXHVEODM1XFx1RENCRlwiLFxuICAgIFwiSnNlcmN5O1wiOiBcIlxcdTA0MDhcIixcbiAgICBcImpzZXJjeTtcIjogXCJcXHUwNDU4XCIsXG4gICAgXCJKdWtjeTtcIjogXCJcXHUwNDA0XCIsXG4gICAgXCJqdWtjeTtcIjogXCJcXHUwNDU0XCIsXG4gICAgXCJLYXBwYTtcIjogXCJcXHUwMzlBXCIsXG4gICAgXCJrYXBwYTtcIjogXCJcXHUwM0JBXCIsXG4gICAgXCJrYXBwYXY7XCI6IFwiXFx1MDNGMFwiLFxuICAgIFwiS2NlZGlsO1wiOiBcIlxcdTAxMzZcIixcbiAgICBcImtjZWRpbDtcIjogXCJcXHUwMTM3XCIsXG4gICAgXCJLY3k7XCI6IFwiXFx1MDQxQVwiLFxuICAgIFwia2N5O1wiOiBcIlxcdTA0M0FcIixcbiAgICBcIktmcjtcIjogXCJcXHVEODM1XFx1REQwRVwiLFxuICAgIFwia2ZyO1wiOiBcIlxcdUQ4MzVcXHVERDI4XCIsXG4gICAgXCJrZ3JlZW47XCI6IFwiXFx1MDEzOFwiLFxuICAgIFwiS0hjeTtcIjogXCJcXHUwNDI1XCIsXG4gICAgXCJraGN5O1wiOiBcIlxcdTA0NDVcIixcbiAgICBcIktKY3k7XCI6IFwiXFx1MDQwQ1wiLFxuICAgIFwia2pjeTtcIjogXCJcXHUwNDVDXCIsXG4gICAgXCJLb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDQyXCIsXG4gICAgXCJrb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDVDXCIsXG4gICAgXCJLc2NyO1wiOiBcIlxcdUQ4MzVcXHVEQ0E2XCIsXG4gICAgXCJrc2NyO1wiOiBcIlxcdUQ4MzVcXHVEQ0MwXCIsXG4gICAgXCJsQWFycjtcIjogXCJcXHUyMURBXCIsXG4gICAgXCJMYWN1dGU7XCI6IFwiXFx1MDEzOVwiLFxuICAgIFwibGFjdXRlO1wiOiBcIlxcdTAxM0FcIixcbiAgICBcImxhZW1wdHl2O1wiOiBcIlxcdTI5QjRcIixcbiAgICBcImxhZ3JhbjtcIjogXCJcXHUyMTEyXCIsXG4gICAgXCJMYW1iZGE7XCI6IFwiXFx1MDM5QlwiLFxuICAgIFwibGFtYmRhO1wiOiBcIlxcdTAzQkJcIixcbiAgICBcIkxhbmc7XCI6IFwiXFx1MjdFQVwiLFxuICAgIFwibGFuZztcIjogXCJcXHUyN0U4XCIsXG4gICAgXCJsYW5nZDtcIjogXCJcXHUyOTkxXCIsXG4gICAgXCJsYW5nbGU7XCI6IFwiXFx1MjdFOFwiLFxuICAgIFwibGFwO1wiOiBcIlxcdTJBODVcIixcbiAgICBcIkxhcGxhY2V0cmY7XCI6IFwiXFx1MjExMlwiLFxuICAgIFwibGFxdW87XCI6IFwiXFx1MDBBQlwiLFxuICAgIFwibGFxdW9cIjogXCJcXHUwMEFCXCIsXG4gICAgXCJMYXJyO1wiOiBcIlxcdTIxOUVcIixcbiAgICBcImxBcnI7XCI6IFwiXFx1MjFEMFwiLFxuICAgIFwibGFycjtcIjogXCJcXHUyMTkwXCIsXG4gICAgXCJsYXJyYjtcIjogXCJcXHUyMUU0XCIsXG4gICAgXCJsYXJyYmZzO1wiOiBcIlxcdTI5MUZcIixcbiAgICBcImxhcnJmcztcIjogXCJcXHUyOTFEXCIsXG4gICAgXCJsYXJyaGs7XCI6IFwiXFx1MjFBOVwiLFxuICAgIFwibGFycmxwO1wiOiBcIlxcdTIxQUJcIixcbiAgICBcImxhcnJwbDtcIjogXCJcXHUyOTM5XCIsXG4gICAgXCJsYXJyc2ltO1wiOiBcIlxcdTI5NzNcIixcbiAgICBcImxhcnJ0bDtcIjogXCJcXHUyMUEyXCIsXG4gICAgXCJsYXQ7XCI6IFwiXFx1MkFBQlwiLFxuICAgIFwibEF0YWlsO1wiOiBcIlxcdTI5MUJcIixcbiAgICBcImxhdGFpbDtcIjogXCJcXHUyOTE5XCIsXG4gICAgXCJsYXRlO1wiOiBcIlxcdTJBQURcIixcbiAgICBcImxhdGVzO1wiOiBcIlxcdTJBQURcXHVGRTAwXCIsXG4gICAgXCJsQmFycjtcIjogXCJcXHUyOTBFXCIsXG4gICAgXCJsYmFycjtcIjogXCJcXHUyOTBDXCIsXG4gICAgXCJsYmJyaztcIjogXCJcXHUyNzcyXCIsXG4gICAgXCJsYnJhY2U7XCI6IFwie1wiLFxuICAgIFwibGJyYWNrO1wiOiBcIltcIixcbiAgICBcImxicmtlO1wiOiBcIlxcdTI5OEJcIixcbiAgICBcImxicmtzbGQ7XCI6IFwiXFx1Mjk4RlwiLFxuICAgIFwibGJya3NsdTtcIjogXCJcXHUyOThEXCIsXG4gICAgXCJMY2Fyb247XCI6IFwiXFx1MDEzRFwiLFxuICAgIFwibGNhcm9uO1wiOiBcIlxcdTAxM0VcIixcbiAgICBcIkxjZWRpbDtcIjogXCJcXHUwMTNCXCIsXG4gICAgXCJsY2VkaWw7XCI6IFwiXFx1MDEzQ1wiLFxuICAgIFwibGNlaWw7XCI6IFwiXFx1MjMwOFwiLFxuICAgIFwibGN1YjtcIjogXCJ7XCIsXG4gICAgXCJMY3k7XCI6IFwiXFx1MDQxQlwiLFxuICAgIFwibGN5O1wiOiBcIlxcdTA0M0JcIixcbiAgICBcImxkY2E7XCI6IFwiXFx1MjkzNlwiLFxuICAgIFwibGRxdW87XCI6IFwiXFx1MjAxQ1wiLFxuICAgIFwibGRxdW9yO1wiOiBcIlxcdTIwMUVcIixcbiAgICBcImxkcmRoYXI7XCI6IFwiXFx1Mjk2N1wiLFxuICAgIFwibGRydXNoYXI7XCI6IFwiXFx1Mjk0QlwiLFxuICAgIFwibGRzaDtcIjogXCJcXHUyMUIyXCIsXG4gICAgXCJsRTtcIjogXCJcXHUyMjY2XCIsXG4gICAgXCJsZTtcIjogXCJcXHUyMjY0XCIsXG4gICAgXCJMZWZ0QW5nbGVCcmFja2V0O1wiOiBcIlxcdTI3RThcIixcbiAgICBcIkxlZnRBcnJvdztcIjogXCJcXHUyMTkwXCIsXG4gICAgXCJMZWZ0YXJyb3c7XCI6IFwiXFx1MjFEMFwiLFxuICAgIFwibGVmdGFycm93O1wiOiBcIlxcdTIxOTBcIixcbiAgICBcIkxlZnRBcnJvd0JhcjtcIjogXCJcXHUyMUU0XCIsXG4gICAgXCJMZWZ0QXJyb3dSaWdodEFycm93O1wiOiBcIlxcdTIxQzZcIixcbiAgICBcImxlZnRhcnJvd3RhaWw7XCI6IFwiXFx1MjFBMlwiLFxuICAgIFwiTGVmdENlaWxpbmc7XCI6IFwiXFx1MjMwOFwiLFxuICAgIFwiTGVmdERvdWJsZUJyYWNrZXQ7XCI6IFwiXFx1MjdFNlwiLFxuICAgIFwiTGVmdERvd25UZWVWZWN0b3I7XCI6IFwiXFx1Mjk2MVwiLFxuICAgIFwiTGVmdERvd25WZWN0b3I7XCI6IFwiXFx1MjFDM1wiLFxuICAgIFwiTGVmdERvd25WZWN0b3JCYXI7XCI6IFwiXFx1Mjk1OVwiLFxuICAgIFwiTGVmdEZsb29yO1wiOiBcIlxcdTIzMEFcIixcbiAgICBcImxlZnRoYXJwb29uZG93bjtcIjogXCJcXHUyMUJEXCIsXG4gICAgXCJsZWZ0aGFycG9vbnVwO1wiOiBcIlxcdTIxQkNcIixcbiAgICBcImxlZnRsZWZ0YXJyb3dzO1wiOiBcIlxcdTIxQzdcIixcbiAgICBcIkxlZnRSaWdodEFycm93O1wiOiBcIlxcdTIxOTRcIixcbiAgICBcIkxlZnRyaWdodGFycm93O1wiOiBcIlxcdTIxRDRcIixcbiAgICBcImxlZnRyaWdodGFycm93O1wiOiBcIlxcdTIxOTRcIixcbiAgICBcImxlZnRyaWdodGFycm93cztcIjogXCJcXHUyMUM2XCIsXG4gICAgXCJsZWZ0cmlnaHRoYXJwb29ucztcIjogXCJcXHUyMUNCXCIsXG4gICAgXCJsZWZ0cmlnaHRzcXVpZ2Fycm93O1wiOiBcIlxcdTIxQURcIixcbiAgICBcIkxlZnRSaWdodFZlY3RvcjtcIjogXCJcXHUyOTRFXCIsXG4gICAgXCJMZWZ0VGVlO1wiOiBcIlxcdTIyQTNcIixcbiAgICBcIkxlZnRUZWVBcnJvdztcIjogXCJcXHUyMUE0XCIsXG4gICAgXCJMZWZ0VGVlVmVjdG9yO1wiOiBcIlxcdTI5NUFcIixcbiAgICBcImxlZnR0aHJlZXRpbWVzO1wiOiBcIlxcdTIyQ0JcIixcbiAgICBcIkxlZnRUcmlhbmdsZTtcIjogXCJcXHUyMkIyXCIsXG4gICAgXCJMZWZ0VHJpYW5nbGVCYXI7XCI6IFwiXFx1MjlDRlwiLFxuICAgIFwiTGVmdFRyaWFuZ2xlRXF1YWw7XCI6IFwiXFx1MjJCNFwiLFxuICAgIFwiTGVmdFVwRG93blZlY3RvcjtcIjogXCJcXHUyOTUxXCIsXG4gICAgXCJMZWZ0VXBUZWVWZWN0b3I7XCI6IFwiXFx1Mjk2MFwiLFxuICAgIFwiTGVmdFVwVmVjdG9yO1wiOiBcIlxcdTIxQkZcIixcbiAgICBcIkxlZnRVcFZlY3RvckJhcjtcIjogXCJcXHUyOTU4XCIsXG4gICAgXCJMZWZ0VmVjdG9yO1wiOiBcIlxcdTIxQkNcIixcbiAgICBcIkxlZnRWZWN0b3JCYXI7XCI6IFwiXFx1Mjk1MlwiLFxuICAgIFwibEVnO1wiOiBcIlxcdTJBOEJcIixcbiAgICBcImxlZztcIjogXCJcXHUyMkRBXCIsXG4gICAgXCJsZXE7XCI6IFwiXFx1MjI2NFwiLFxuICAgIFwibGVxcTtcIjogXCJcXHUyMjY2XCIsXG4gICAgXCJsZXFzbGFudDtcIjogXCJcXHUyQTdEXCIsXG4gICAgXCJsZXM7XCI6IFwiXFx1MkE3RFwiLFxuICAgIFwibGVzY2M7XCI6IFwiXFx1MkFBOFwiLFxuICAgIFwibGVzZG90O1wiOiBcIlxcdTJBN0ZcIixcbiAgICBcImxlc2RvdG87XCI6IFwiXFx1MkE4MVwiLFxuICAgIFwibGVzZG90b3I7XCI6IFwiXFx1MkE4M1wiLFxuICAgIFwibGVzZztcIjogXCJcXHUyMkRBXFx1RkUwMFwiLFxuICAgIFwibGVzZ2VzO1wiOiBcIlxcdTJBOTNcIixcbiAgICBcImxlc3NhcHByb3g7XCI6IFwiXFx1MkE4NVwiLFxuICAgIFwibGVzc2RvdDtcIjogXCJcXHUyMkQ2XCIsXG4gICAgXCJsZXNzZXFndHI7XCI6IFwiXFx1MjJEQVwiLFxuICAgIFwibGVzc2VxcWd0cjtcIjogXCJcXHUyQThCXCIsXG4gICAgXCJMZXNzRXF1YWxHcmVhdGVyO1wiOiBcIlxcdTIyREFcIixcbiAgICBcIkxlc3NGdWxsRXF1YWw7XCI6IFwiXFx1MjI2NlwiLFxuICAgIFwiTGVzc0dyZWF0ZXI7XCI6IFwiXFx1MjI3NlwiLFxuICAgIFwibGVzc2d0cjtcIjogXCJcXHUyMjc2XCIsXG4gICAgXCJMZXNzTGVzcztcIjogXCJcXHUyQUExXCIsXG4gICAgXCJsZXNzc2ltO1wiOiBcIlxcdTIyNzJcIixcbiAgICBcIkxlc3NTbGFudEVxdWFsO1wiOiBcIlxcdTJBN0RcIixcbiAgICBcIkxlc3NUaWxkZTtcIjogXCJcXHUyMjcyXCIsXG4gICAgXCJsZmlzaHQ7XCI6IFwiXFx1Mjk3Q1wiLFxuICAgIFwibGZsb29yO1wiOiBcIlxcdTIzMEFcIixcbiAgICBcIkxmcjtcIjogXCJcXHVEODM1XFx1REQwRlwiLFxuICAgIFwibGZyO1wiOiBcIlxcdUQ4MzVcXHVERDI5XCIsXG4gICAgXCJsZztcIjogXCJcXHUyMjc2XCIsXG4gICAgXCJsZ0U7XCI6IFwiXFx1MkE5MVwiLFxuICAgIFwibEhhcjtcIjogXCJcXHUyOTYyXCIsXG4gICAgXCJsaGFyZDtcIjogXCJcXHUyMUJEXCIsXG4gICAgXCJsaGFydTtcIjogXCJcXHUyMUJDXCIsXG4gICAgXCJsaGFydWw7XCI6IFwiXFx1Mjk2QVwiLFxuICAgIFwibGhibGs7XCI6IFwiXFx1MjU4NFwiLFxuICAgIFwiTEpjeTtcIjogXCJcXHUwNDA5XCIsXG4gICAgXCJsamN5O1wiOiBcIlxcdTA0NTlcIixcbiAgICBcIkxsO1wiOiBcIlxcdTIyRDhcIixcbiAgICBcImxsO1wiOiBcIlxcdTIyNkFcIixcbiAgICBcImxsYXJyO1wiOiBcIlxcdTIxQzdcIixcbiAgICBcImxsY29ybmVyO1wiOiBcIlxcdTIzMUVcIixcbiAgICBcIkxsZWZ0YXJyb3c7XCI6IFwiXFx1MjFEQVwiLFxuICAgIFwibGxoYXJkO1wiOiBcIlxcdTI5NkJcIixcbiAgICBcImxsdHJpO1wiOiBcIlxcdTI1RkFcIixcbiAgICBcIkxtaWRvdDtcIjogXCJcXHUwMTNGXCIsXG4gICAgXCJsbWlkb3Q7XCI6IFwiXFx1MDE0MFwiLFxuICAgIFwibG1vdXN0O1wiOiBcIlxcdTIzQjBcIixcbiAgICBcImxtb3VzdGFjaGU7XCI6IFwiXFx1MjNCMFwiLFxuICAgIFwibG5hcDtcIjogXCJcXHUyQTg5XCIsXG4gICAgXCJsbmFwcHJveDtcIjogXCJcXHUyQTg5XCIsXG4gICAgXCJsbkU7XCI6IFwiXFx1MjI2OFwiLFxuICAgIFwibG5lO1wiOiBcIlxcdTJBODdcIixcbiAgICBcImxuZXE7XCI6IFwiXFx1MkE4N1wiLFxuICAgIFwibG5lcXE7XCI6IFwiXFx1MjI2OFwiLFxuICAgIFwibG5zaW07XCI6IFwiXFx1MjJFNlwiLFxuICAgIFwibG9hbmc7XCI6IFwiXFx1MjdFQ1wiLFxuICAgIFwibG9hcnI7XCI6IFwiXFx1MjFGRFwiLFxuICAgIFwibG9icms7XCI6IFwiXFx1MjdFNlwiLFxuICAgIFwiTG9uZ0xlZnRBcnJvdztcIjogXCJcXHUyN0Y1XCIsXG4gICAgXCJMb25nbGVmdGFycm93O1wiOiBcIlxcdTI3RjhcIixcbiAgICBcImxvbmdsZWZ0YXJyb3c7XCI6IFwiXFx1MjdGNVwiLFxuICAgIFwiTG9uZ0xlZnRSaWdodEFycm93O1wiOiBcIlxcdTI3RjdcIixcbiAgICBcIkxvbmdsZWZ0cmlnaHRhcnJvdztcIjogXCJcXHUyN0ZBXCIsXG4gICAgXCJsb25nbGVmdHJpZ2h0YXJyb3c7XCI6IFwiXFx1MjdGN1wiLFxuICAgIFwibG9uZ21hcHN0bztcIjogXCJcXHUyN0ZDXCIsXG4gICAgXCJMb25nUmlnaHRBcnJvdztcIjogXCJcXHUyN0Y2XCIsXG4gICAgXCJMb25ncmlnaHRhcnJvdztcIjogXCJcXHUyN0Y5XCIsXG4gICAgXCJsb25ncmlnaHRhcnJvdztcIjogXCJcXHUyN0Y2XCIsXG4gICAgXCJsb29wYXJyb3dsZWZ0O1wiOiBcIlxcdTIxQUJcIixcbiAgICBcImxvb3BhcnJvd3JpZ2h0O1wiOiBcIlxcdTIxQUNcIixcbiAgICBcImxvcGFyO1wiOiBcIlxcdTI5ODVcIixcbiAgICBcIkxvcGY7XCI6IFwiXFx1RDgzNVxcdURENDNcIixcbiAgICBcImxvcGY7XCI6IFwiXFx1RDgzNVxcdURENURcIixcbiAgICBcImxvcGx1cztcIjogXCJcXHUyQTJEXCIsXG4gICAgXCJsb3RpbWVzO1wiOiBcIlxcdTJBMzRcIixcbiAgICBcImxvd2FzdDtcIjogXCJcXHUyMjE3XCIsXG4gICAgXCJsb3diYXI7XCI6IFwiX1wiLFxuICAgIFwiTG93ZXJMZWZ0QXJyb3c7XCI6IFwiXFx1MjE5OVwiLFxuICAgIFwiTG93ZXJSaWdodEFycm93O1wiOiBcIlxcdTIxOThcIixcbiAgICBcImxvejtcIjogXCJcXHUyNUNBXCIsXG4gICAgXCJsb3plbmdlO1wiOiBcIlxcdTI1Q0FcIixcbiAgICBcImxvemY7XCI6IFwiXFx1MjlFQlwiLFxuICAgIFwibHBhcjtcIjogXCIoXCIsXG4gICAgXCJscGFybHQ7XCI6IFwiXFx1Mjk5M1wiLFxuICAgIFwibHJhcnI7XCI6IFwiXFx1MjFDNlwiLFxuICAgIFwibHJjb3JuZXI7XCI6IFwiXFx1MjMxRlwiLFxuICAgIFwibHJoYXI7XCI6IFwiXFx1MjFDQlwiLFxuICAgIFwibHJoYXJkO1wiOiBcIlxcdTI5NkRcIixcbiAgICBcImxybTtcIjogXCJcXHUyMDBFXCIsXG4gICAgXCJscnRyaTtcIjogXCJcXHUyMkJGXCIsXG4gICAgXCJsc2FxdW87XCI6IFwiXFx1MjAzOVwiLFxuICAgIFwiTHNjcjtcIjogXCJcXHUyMTEyXCIsXG4gICAgXCJsc2NyO1wiOiBcIlxcdUQ4MzVcXHVEQ0MxXCIsXG4gICAgXCJMc2g7XCI6IFwiXFx1MjFCMFwiLFxuICAgIFwibHNoO1wiOiBcIlxcdTIxQjBcIixcbiAgICBcImxzaW07XCI6IFwiXFx1MjI3MlwiLFxuICAgIFwibHNpbWU7XCI6IFwiXFx1MkE4RFwiLFxuICAgIFwibHNpbWc7XCI6IFwiXFx1MkE4RlwiLFxuICAgIFwibHNxYjtcIjogXCJbXCIsXG4gICAgXCJsc3F1bztcIjogXCJcXHUyMDE4XCIsXG4gICAgXCJsc3F1b3I7XCI6IFwiXFx1MjAxQVwiLFxuICAgIFwiTHN0cm9rO1wiOiBcIlxcdTAxNDFcIixcbiAgICBcImxzdHJvaztcIjogXCJcXHUwMTQyXCIsXG4gICAgXCJMVDtcIjogXCI8XCIsXG4gICAgXCJMVFwiOiBcIjxcIixcbiAgICBcIkx0O1wiOiBcIlxcdTIyNkFcIixcbiAgICBcImx0O1wiOiBcIjxcIixcbiAgICBcImx0XCI6IFwiPFwiLFxuICAgIFwibHRjYztcIjogXCJcXHUyQUE2XCIsXG4gICAgXCJsdGNpcjtcIjogXCJcXHUyQTc5XCIsXG4gICAgXCJsdGRvdDtcIjogXCJcXHUyMkQ2XCIsXG4gICAgXCJsdGhyZWU7XCI6IFwiXFx1MjJDQlwiLFxuICAgIFwibHRpbWVzO1wiOiBcIlxcdTIyQzlcIixcbiAgICBcImx0bGFycjtcIjogXCJcXHUyOTc2XCIsXG4gICAgXCJsdHF1ZXN0O1wiOiBcIlxcdTJBN0JcIixcbiAgICBcImx0cmk7XCI6IFwiXFx1MjVDM1wiLFxuICAgIFwibHRyaWU7XCI6IFwiXFx1MjJCNFwiLFxuICAgIFwibHRyaWY7XCI6IFwiXFx1MjVDMlwiLFxuICAgIFwibHRyUGFyO1wiOiBcIlxcdTI5OTZcIixcbiAgICBcImx1cmRzaGFyO1wiOiBcIlxcdTI5NEFcIixcbiAgICBcImx1cnVoYXI7XCI6IFwiXFx1Mjk2NlwiLFxuICAgIFwibHZlcnRuZXFxO1wiOiBcIlxcdTIyNjhcXHVGRTAwXCIsXG4gICAgXCJsdm5FO1wiOiBcIlxcdTIyNjhcXHVGRTAwXCIsXG4gICAgXCJtYWNyO1wiOiBcIlxcdTAwQUZcIixcbiAgICBcIm1hY3JcIjogXCJcXHUwMEFGXCIsXG4gICAgXCJtYWxlO1wiOiBcIlxcdTI2NDJcIixcbiAgICBcIm1hbHQ7XCI6IFwiXFx1MjcyMFwiLFxuICAgIFwibWFsdGVzZTtcIjogXCJcXHUyNzIwXCIsXG4gICAgXCJNYXA7XCI6IFwiXFx1MjkwNVwiLFxuICAgIFwibWFwO1wiOiBcIlxcdTIxQTZcIixcbiAgICBcIm1hcHN0bztcIjogXCJcXHUyMUE2XCIsXG4gICAgXCJtYXBzdG9kb3duO1wiOiBcIlxcdTIxQTdcIixcbiAgICBcIm1hcHN0b2xlZnQ7XCI6IFwiXFx1MjFBNFwiLFxuICAgIFwibWFwc3RvdXA7XCI6IFwiXFx1MjFBNVwiLFxuICAgIFwibWFya2VyO1wiOiBcIlxcdTI1QUVcIixcbiAgICBcIm1jb21tYTtcIjogXCJcXHUyQTI5XCIsXG4gICAgXCJNY3k7XCI6IFwiXFx1MDQxQ1wiLFxuICAgIFwibWN5O1wiOiBcIlxcdTA0M0NcIixcbiAgICBcIm1kYXNoO1wiOiBcIlxcdTIwMTRcIixcbiAgICBcIm1ERG90O1wiOiBcIlxcdTIyM0FcIixcbiAgICBcIm1lYXN1cmVkYW5nbGU7XCI6IFwiXFx1MjIyMVwiLFxuICAgIFwiTWVkaXVtU3BhY2U7XCI6IFwiXFx1MjA1RlwiLFxuICAgIFwiTWVsbGludHJmO1wiOiBcIlxcdTIxMzNcIixcbiAgICBcIk1mcjtcIjogXCJcXHVEODM1XFx1REQxMFwiLFxuICAgIFwibWZyO1wiOiBcIlxcdUQ4MzVcXHVERDJBXCIsXG4gICAgXCJtaG87XCI6IFwiXFx1MjEyN1wiLFxuICAgIFwibWljcm87XCI6IFwiXFx1MDBCNVwiLFxuICAgIFwibWljcm9cIjogXCJcXHUwMEI1XCIsXG4gICAgXCJtaWQ7XCI6IFwiXFx1MjIyM1wiLFxuICAgIFwibWlkYXN0O1wiOiBcIipcIixcbiAgICBcIm1pZGNpcjtcIjogXCJcXHUyQUYwXCIsXG4gICAgXCJtaWRkb3Q7XCI6IFwiXFx1MDBCN1wiLFxuICAgIFwibWlkZG90XCI6IFwiXFx1MDBCN1wiLFxuICAgIFwibWludXM7XCI6IFwiXFx1MjIxMlwiLFxuICAgIFwibWludXNiO1wiOiBcIlxcdTIyOUZcIixcbiAgICBcIm1pbnVzZDtcIjogXCJcXHUyMjM4XCIsXG4gICAgXCJtaW51c2R1O1wiOiBcIlxcdTJBMkFcIixcbiAgICBcIk1pbnVzUGx1cztcIjogXCJcXHUyMjEzXCIsXG4gICAgXCJtbGNwO1wiOiBcIlxcdTJBREJcIixcbiAgICBcIm1sZHI7XCI6IFwiXFx1MjAyNlwiLFxuICAgIFwibW5wbHVzO1wiOiBcIlxcdTIyMTNcIixcbiAgICBcIm1vZGVscztcIjogXCJcXHUyMkE3XCIsXG4gICAgXCJNb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDQ0XCIsXG4gICAgXCJtb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDVFXCIsXG4gICAgXCJtcDtcIjogXCJcXHUyMjEzXCIsXG4gICAgXCJNc2NyO1wiOiBcIlxcdTIxMzNcIixcbiAgICBcIm1zY3I7XCI6IFwiXFx1RDgzNVxcdURDQzJcIixcbiAgICBcIm1zdHBvcztcIjogXCJcXHUyMjNFXCIsXG4gICAgXCJNdTtcIjogXCJcXHUwMzlDXCIsXG4gICAgXCJtdTtcIjogXCJcXHUwM0JDXCIsXG4gICAgXCJtdWx0aW1hcDtcIjogXCJcXHUyMkI4XCIsXG4gICAgXCJtdW1hcDtcIjogXCJcXHUyMkI4XCIsXG4gICAgXCJuYWJsYTtcIjogXCJcXHUyMjA3XCIsXG4gICAgXCJOYWN1dGU7XCI6IFwiXFx1MDE0M1wiLFxuICAgIFwibmFjdXRlO1wiOiBcIlxcdTAxNDRcIixcbiAgICBcIm5hbmc7XCI6IFwiXFx1MjIyMFxcdTIwRDJcIixcbiAgICBcIm5hcDtcIjogXCJcXHUyMjQ5XCIsXG4gICAgXCJuYXBFO1wiOiBcIlxcdTJBNzBcXHUwMzM4XCIsXG4gICAgXCJuYXBpZDtcIjogXCJcXHUyMjRCXFx1MDMzOFwiLFxuICAgIFwibmFwb3M7XCI6IFwiXFx1MDE0OVwiLFxuICAgIFwibmFwcHJveDtcIjogXCJcXHUyMjQ5XCIsXG4gICAgXCJuYXR1cjtcIjogXCJcXHUyNjZFXCIsXG4gICAgXCJuYXR1cmFsO1wiOiBcIlxcdTI2NkVcIixcbiAgICBcIm5hdHVyYWxzO1wiOiBcIlxcdTIxMTVcIixcbiAgICBcIm5ic3A7XCI6IFwiXFx1MDBBMFwiLFxuICAgIFwibmJzcFwiOiBcIlxcdTAwQTBcIixcbiAgICBcIm5idW1wO1wiOiBcIlxcdTIyNEVcXHUwMzM4XCIsXG4gICAgXCJuYnVtcGU7XCI6IFwiXFx1MjI0RlxcdTAzMzhcIixcbiAgICBcIm5jYXA7XCI6IFwiXFx1MkE0M1wiLFxuICAgIFwiTmNhcm9uO1wiOiBcIlxcdTAxNDdcIixcbiAgICBcIm5jYXJvbjtcIjogXCJcXHUwMTQ4XCIsXG4gICAgXCJOY2VkaWw7XCI6IFwiXFx1MDE0NVwiLFxuICAgIFwibmNlZGlsO1wiOiBcIlxcdTAxNDZcIixcbiAgICBcIm5jb25nO1wiOiBcIlxcdTIyNDdcIixcbiAgICBcIm5jb25nZG90O1wiOiBcIlxcdTJBNkRcXHUwMzM4XCIsXG4gICAgXCJuY3VwO1wiOiBcIlxcdTJBNDJcIixcbiAgICBcIk5jeTtcIjogXCJcXHUwNDFEXCIsXG4gICAgXCJuY3k7XCI6IFwiXFx1MDQzRFwiLFxuICAgIFwibmRhc2g7XCI6IFwiXFx1MjAxM1wiLFxuICAgIFwibmU7XCI6IFwiXFx1MjI2MFwiLFxuICAgIFwibmVhcmhrO1wiOiBcIlxcdTI5MjRcIixcbiAgICBcIm5lQXJyO1wiOiBcIlxcdTIxRDdcIixcbiAgICBcIm5lYXJyO1wiOiBcIlxcdTIxOTdcIixcbiAgICBcIm5lYXJyb3c7XCI6IFwiXFx1MjE5N1wiLFxuICAgIFwibmVkb3Q7XCI6IFwiXFx1MjI1MFxcdTAzMzhcIixcbiAgICBcIk5lZ2F0aXZlTWVkaXVtU3BhY2U7XCI6IFwiXFx1MjAwQlwiLFxuICAgIFwiTmVnYXRpdmVUaGlja1NwYWNlO1wiOiBcIlxcdTIwMEJcIixcbiAgICBcIk5lZ2F0aXZlVGhpblNwYWNlO1wiOiBcIlxcdTIwMEJcIixcbiAgICBcIk5lZ2F0aXZlVmVyeVRoaW5TcGFjZTtcIjogXCJcXHUyMDBCXCIsXG4gICAgXCJuZXF1aXY7XCI6IFwiXFx1MjI2MlwiLFxuICAgIFwibmVzZWFyO1wiOiBcIlxcdTI5MjhcIixcbiAgICBcIm5lc2ltO1wiOiBcIlxcdTIyNDJcXHUwMzM4XCIsXG4gICAgXCJOZXN0ZWRHcmVhdGVyR3JlYXRlcjtcIjogXCJcXHUyMjZCXCIsXG4gICAgXCJOZXN0ZWRMZXNzTGVzcztcIjogXCJcXHUyMjZBXCIsXG4gICAgXCJOZXdMaW5lO1wiOiBcIlxcblwiLFxuICAgIFwibmV4aXN0O1wiOiBcIlxcdTIyMDRcIixcbiAgICBcIm5leGlzdHM7XCI6IFwiXFx1MjIwNFwiLFxuICAgIFwiTmZyO1wiOiBcIlxcdUQ4MzVcXHVERDExXCIsXG4gICAgXCJuZnI7XCI6IFwiXFx1RDgzNVxcdUREMkJcIixcbiAgICBcIm5nRTtcIjogXCJcXHUyMjY3XFx1MDMzOFwiLFxuICAgIFwibmdlO1wiOiBcIlxcdTIyNzFcIixcbiAgICBcIm5nZXE7XCI6IFwiXFx1MjI3MVwiLFxuICAgIFwibmdlcXE7XCI6IFwiXFx1MjI2N1xcdTAzMzhcIixcbiAgICBcIm5nZXFzbGFudDtcIjogXCJcXHUyQTdFXFx1MDMzOFwiLFxuICAgIFwibmdlcztcIjogXCJcXHUyQTdFXFx1MDMzOFwiLFxuICAgIFwibkdnO1wiOiBcIlxcdTIyRDlcXHUwMzM4XCIsXG4gICAgXCJuZ3NpbTtcIjogXCJcXHUyMjc1XCIsXG4gICAgXCJuR3Q7XCI6IFwiXFx1MjI2QlxcdTIwRDJcIixcbiAgICBcIm5ndDtcIjogXCJcXHUyMjZGXCIsXG4gICAgXCJuZ3RyO1wiOiBcIlxcdTIyNkZcIixcbiAgICBcIm5HdHY7XCI6IFwiXFx1MjI2QlxcdTAzMzhcIixcbiAgICBcIm5oQXJyO1wiOiBcIlxcdTIxQ0VcIixcbiAgICBcIm5oYXJyO1wiOiBcIlxcdTIxQUVcIixcbiAgICBcIm5ocGFyO1wiOiBcIlxcdTJBRjJcIixcbiAgICBcIm5pO1wiOiBcIlxcdTIyMEJcIixcbiAgICBcIm5pcztcIjogXCJcXHUyMkZDXCIsXG4gICAgXCJuaXNkO1wiOiBcIlxcdTIyRkFcIixcbiAgICBcIm5pdjtcIjogXCJcXHUyMjBCXCIsXG4gICAgXCJOSmN5O1wiOiBcIlxcdTA0MEFcIixcbiAgICBcIm5qY3k7XCI6IFwiXFx1MDQ1QVwiLFxuICAgIFwibmxBcnI7XCI6IFwiXFx1MjFDRFwiLFxuICAgIFwibmxhcnI7XCI6IFwiXFx1MjE5QVwiLFxuICAgIFwibmxkcjtcIjogXCJcXHUyMDI1XCIsXG4gICAgXCJubEU7XCI6IFwiXFx1MjI2NlxcdTAzMzhcIixcbiAgICBcIm5sZTtcIjogXCJcXHUyMjcwXCIsXG4gICAgXCJuTGVmdGFycm93O1wiOiBcIlxcdTIxQ0RcIixcbiAgICBcIm5sZWZ0YXJyb3c7XCI6IFwiXFx1MjE5QVwiLFxuICAgIFwibkxlZnRyaWdodGFycm93O1wiOiBcIlxcdTIxQ0VcIixcbiAgICBcIm5sZWZ0cmlnaHRhcnJvdztcIjogXCJcXHUyMUFFXCIsXG4gICAgXCJubGVxO1wiOiBcIlxcdTIyNzBcIixcbiAgICBcIm5sZXFxO1wiOiBcIlxcdTIyNjZcXHUwMzM4XCIsXG4gICAgXCJubGVxc2xhbnQ7XCI6IFwiXFx1MkE3RFxcdTAzMzhcIixcbiAgICBcIm5sZXM7XCI6IFwiXFx1MkE3RFxcdTAzMzhcIixcbiAgICBcIm5sZXNzO1wiOiBcIlxcdTIyNkVcIixcbiAgICBcIm5MbDtcIjogXCJcXHUyMkQ4XFx1MDMzOFwiLFxuICAgIFwibmxzaW07XCI6IFwiXFx1MjI3NFwiLFxuICAgIFwibkx0O1wiOiBcIlxcdTIyNkFcXHUyMEQyXCIsXG4gICAgXCJubHQ7XCI6IFwiXFx1MjI2RVwiLFxuICAgIFwibmx0cmk7XCI6IFwiXFx1MjJFQVwiLFxuICAgIFwibmx0cmllO1wiOiBcIlxcdTIyRUNcIixcbiAgICBcIm5MdHY7XCI6IFwiXFx1MjI2QVxcdTAzMzhcIixcbiAgICBcIm5taWQ7XCI6IFwiXFx1MjIyNFwiLFxuICAgIFwiTm9CcmVhaztcIjogXCJcXHUyMDYwXCIsXG4gICAgXCJOb25CcmVha2luZ1NwYWNlO1wiOiBcIlxcdTAwQTBcIixcbiAgICBcIk5vcGY7XCI6IFwiXFx1MjExNVwiLFxuICAgIFwibm9wZjtcIjogXCJcXHVEODM1XFx1REQ1RlwiLFxuICAgIFwiTm90O1wiOiBcIlxcdTJBRUNcIixcbiAgICBcIm5vdDtcIjogXCJcXHUwMEFDXCIsXG4gICAgXCJub3RcIjogXCJcXHUwMEFDXCIsXG4gICAgXCJOb3RDb25ncnVlbnQ7XCI6IFwiXFx1MjI2MlwiLFxuICAgIFwiTm90Q3VwQ2FwO1wiOiBcIlxcdTIyNkRcIixcbiAgICBcIk5vdERvdWJsZVZlcnRpY2FsQmFyO1wiOiBcIlxcdTIyMjZcIixcbiAgICBcIk5vdEVsZW1lbnQ7XCI6IFwiXFx1MjIwOVwiLFxuICAgIFwiTm90RXF1YWw7XCI6IFwiXFx1MjI2MFwiLFxuICAgIFwiTm90RXF1YWxUaWxkZTtcIjogXCJcXHUyMjQyXFx1MDMzOFwiLFxuICAgIFwiTm90RXhpc3RzO1wiOiBcIlxcdTIyMDRcIixcbiAgICBcIk5vdEdyZWF0ZXI7XCI6IFwiXFx1MjI2RlwiLFxuICAgIFwiTm90R3JlYXRlckVxdWFsO1wiOiBcIlxcdTIyNzFcIixcbiAgICBcIk5vdEdyZWF0ZXJGdWxsRXF1YWw7XCI6IFwiXFx1MjI2N1xcdTAzMzhcIixcbiAgICBcIk5vdEdyZWF0ZXJHcmVhdGVyO1wiOiBcIlxcdTIyNkJcXHUwMzM4XCIsXG4gICAgXCJOb3RHcmVhdGVyTGVzcztcIjogXCJcXHUyMjc5XCIsXG4gICAgXCJOb3RHcmVhdGVyU2xhbnRFcXVhbDtcIjogXCJcXHUyQTdFXFx1MDMzOFwiLFxuICAgIFwiTm90R3JlYXRlclRpbGRlO1wiOiBcIlxcdTIyNzVcIixcbiAgICBcIk5vdEh1bXBEb3duSHVtcDtcIjogXCJcXHUyMjRFXFx1MDMzOFwiLFxuICAgIFwiTm90SHVtcEVxdWFsO1wiOiBcIlxcdTIyNEZcXHUwMzM4XCIsXG4gICAgXCJub3RpbjtcIjogXCJcXHUyMjA5XCIsXG4gICAgXCJub3RpbmRvdDtcIjogXCJcXHUyMkY1XFx1MDMzOFwiLFxuICAgIFwibm90aW5FO1wiOiBcIlxcdTIyRjlcXHUwMzM4XCIsXG4gICAgXCJub3RpbnZhO1wiOiBcIlxcdTIyMDlcIixcbiAgICBcIm5vdGludmI7XCI6IFwiXFx1MjJGN1wiLFxuICAgIFwibm90aW52YztcIjogXCJcXHUyMkY2XCIsXG4gICAgXCJOb3RMZWZ0VHJpYW5nbGU7XCI6IFwiXFx1MjJFQVwiLFxuICAgIFwiTm90TGVmdFRyaWFuZ2xlQmFyO1wiOiBcIlxcdTI5Q0ZcXHUwMzM4XCIsXG4gICAgXCJOb3RMZWZ0VHJpYW5nbGVFcXVhbDtcIjogXCJcXHUyMkVDXCIsXG4gICAgXCJOb3RMZXNzO1wiOiBcIlxcdTIyNkVcIixcbiAgICBcIk5vdExlc3NFcXVhbDtcIjogXCJcXHUyMjcwXCIsXG4gICAgXCJOb3RMZXNzR3JlYXRlcjtcIjogXCJcXHUyMjc4XCIsXG4gICAgXCJOb3RMZXNzTGVzcztcIjogXCJcXHUyMjZBXFx1MDMzOFwiLFxuICAgIFwiTm90TGVzc1NsYW50RXF1YWw7XCI6IFwiXFx1MkE3RFxcdTAzMzhcIixcbiAgICBcIk5vdExlc3NUaWxkZTtcIjogXCJcXHUyMjc0XCIsXG4gICAgXCJOb3ROZXN0ZWRHcmVhdGVyR3JlYXRlcjtcIjogXCJcXHUyQUEyXFx1MDMzOFwiLFxuICAgIFwiTm90TmVzdGVkTGVzc0xlc3M7XCI6IFwiXFx1MkFBMVxcdTAzMzhcIixcbiAgICBcIm5vdG5pO1wiOiBcIlxcdTIyMENcIixcbiAgICBcIm5vdG5pdmE7XCI6IFwiXFx1MjIwQ1wiLFxuICAgIFwibm90bml2YjtcIjogXCJcXHUyMkZFXCIsXG4gICAgXCJub3RuaXZjO1wiOiBcIlxcdTIyRkRcIixcbiAgICBcIk5vdFByZWNlZGVzO1wiOiBcIlxcdTIyODBcIixcbiAgICBcIk5vdFByZWNlZGVzRXF1YWw7XCI6IFwiXFx1MkFBRlxcdTAzMzhcIixcbiAgICBcIk5vdFByZWNlZGVzU2xhbnRFcXVhbDtcIjogXCJcXHUyMkUwXCIsXG4gICAgXCJOb3RSZXZlcnNlRWxlbWVudDtcIjogXCJcXHUyMjBDXCIsXG4gICAgXCJOb3RSaWdodFRyaWFuZ2xlO1wiOiBcIlxcdTIyRUJcIixcbiAgICBcIk5vdFJpZ2h0VHJpYW5nbGVCYXI7XCI6IFwiXFx1MjlEMFxcdTAzMzhcIixcbiAgICBcIk5vdFJpZ2h0VHJpYW5nbGVFcXVhbDtcIjogXCJcXHUyMkVEXCIsXG4gICAgXCJOb3RTcXVhcmVTdWJzZXQ7XCI6IFwiXFx1MjI4RlxcdTAzMzhcIixcbiAgICBcIk5vdFNxdWFyZVN1YnNldEVxdWFsO1wiOiBcIlxcdTIyRTJcIixcbiAgICBcIk5vdFNxdWFyZVN1cGVyc2V0O1wiOiBcIlxcdTIyOTBcXHUwMzM4XCIsXG4gICAgXCJOb3RTcXVhcmVTdXBlcnNldEVxdWFsO1wiOiBcIlxcdTIyRTNcIixcbiAgICBcIk5vdFN1YnNldDtcIjogXCJcXHUyMjgyXFx1MjBEMlwiLFxuICAgIFwiTm90U3Vic2V0RXF1YWw7XCI6IFwiXFx1MjI4OFwiLFxuICAgIFwiTm90U3VjY2VlZHM7XCI6IFwiXFx1MjI4MVwiLFxuICAgIFwiTm90U3VjY2VlZHNFcXVhbDtcIjogXCJcXHUyQUIwXFx1MDMzOFwiLFxuICAgIFwiTm90U3VjY2VlZHNTbGFudEVxdWFsO1wiOiBcIlxcdTIyRTFcIixcbiAgICBcIk5vdFN1Y2NlZWRzVGlsZGU7XCI6IFwiXFx1MjI3RlxcdTAzMzhcIixcbiAgICBcIk5vdFN1cGVyc2V0O1wiOiBcIlxcdTIyODNcXHUyMEQyXCIsXG4gICAgXCJOb3RTdXBlcnNldEVxdWFsO1wiOiBcIlxcdTIyODlcIixcbiAgICBcIk5vdFRpbGRlO1wiOiBcIlxcdTIyNDFcIixcbiAgICBcIk5vdFRpbGRlRXF1YWw7XCI6IFwiXFx1MjI0NFwiLFxuICAgIFwiTm90VGlsZGVGdWxsRXF1YWw7XCI6IFwiXFx1MjI0N1wiLFxuICAgIFwiTm90VGlsZGVUaWxkZTtcIjogXCJcXHUyMjQ5XCIsXG4gICAgXCJOb3RWZXJ0aWNhbEJhcjtcIjogXCJcXHUyMjI0XCIsXG4gICAgXCJucGFyO1wiOiBcIlxcdTIyMjZcIixcbiAgICBcIm5wYXJhbGxlbDtcIjogXCJcXHUyMjI2XCIsXG4gICAgXCJucGFyc2w7XCI6IFwiXFx1MkFGRFxcdTIwRTVcIixcbiAgICBcIm5wYXJ0O1wiOiBcIlxcdTIyMDJcXHUwMzM4XCIsXG4gICAgXCJucG9saW50O1wiOiBcIlxcdTJBMTRcIixcbiAgICBcIm5wcjtcIjogXCJcXHUyMjgwXCIsXG4gICAgXCJucHJjdWU7XCI6IFwiXFx1MjJFMFwiLFxuICAgIFwibnByZTtcIjogXCJcXHUyQUFGXFx1MDMzOFwiLFxuICAgIFwibnByZWM7XCI6IFwiXFx1MjI4MFwiLFxuICAgIFwibnByZWNlcTtcIjogXCJcXHUyQUFGXFx1MDMzOFwiLFxuICAgIFwibnJBcnI7XCI6IFwiXFx1MjFDRlwiLFxuICAgIFwibnJhcnI7XCI6IFwiXFx1MjE5QlwiLFxuICAgIFwibnJhcnJjO1wiOiBcIlxcdTI5MzNcXHUwMzM4XCIsXG4gICAgXCJucmFycnc7XCI6IFwiXFx1MjE5RFxcdTAzMzhcIixcbiAgICBcIm5SaWdodGFycm93O1wiOiBcIlxcdTIxQ0ZcIixcbiAgICBcIm5yaWdodGFycm93O1wiOiBcIlxcdTIxOUJcIixcbiAgICBcIm5ydHJpO1wiOiBcIlxcdTIyRUJcIixcbiAgICBcIm5ydHJpZTtcIjogXCJcXHUyMkVEXCIsXG4gICAgXCJuc2M7XCI6IFwiXFx1MjI4MVwiLFxuICAgIFwibnNjY3VlO1wiOiBcIlxcdTIyRTFcIixcbiAgICBcIm5zY2U7XCI6IFwiXFx1MkFCMFxcdTAzMzhcIixcbiAgICBcIk5zY3I7XCI6IFwiXFx1RDgzNVxcdURDQTlcIixcbiAgICBcIm5zY3I7XCI6IFwiXFx1RDgzNVxcdURDQzNcIixcbiAgICBcIm5zaG9ydG1pZDtcIjogXCJcXHUyMjI0XCIsXG4gICAgXCJuc2hvcnRwYXJhbGxlbDtcIjogXCJcXHUyMjI2XCIsXG4gICAgXCJuc2ltO1wiOiBcIlxcdTIyNDFcIixcbiAgICBcIm5zaW1lO1wiOiBcIlxcdTIyNDRcIixcbiAgICBcIm5zaW1lcTtcIjogXCJcXHUyMjQ0XCIsXG4gICAgXCJuc21pZDtcIjogXCJcXHUyMjI0XCIsXG4gICAgXCJuc3BhcjtcIjogXCJcXHUyMjI2XCIsXG4gICAgXCJuc3FzdWJlO1wiOiBcIlxcdTIyRTJcIixcbiAgICBcIm5zcXN1cGU7XCI6IFwiXFx1MjJFM1wiLFxuICAgIFwibnN1YjtcIjogXCJcXHUyMjg0XCIsXG4gICAgXCJuc3ViRTtcIjogXCJcXHUyQUM1XFx1MDMzOFwiLFxuICAgIFwibnN1YmU7XCI6IFwiXFx1MjI4OFwiLFxuICAgIFwibnN1YnNldDtcIjogXCJcXHUyMjgyXFx1MjBEMlwiLFxuICAgIFwibnN1YnNldGVxO1wiOiBcIlxcdTIyODhcIixcbiAgICBcIm5zdWJzZXRlcXE7XCI6IFwiXFx1MkFDNVxcdTAzMzhcIixcbiAgICBcIm5zdWNjO1wiOiBcIlxcdTIyODFcIixcbiAgICBcIm5zdWNjZXE7XCI6IFwiXFx1MkFCMFxcdTAzMzhcIixcbiAgICBcIm5zdXA7XCI6IFwiXFx1MjI4NVwiLFxuICAgIFwibnN1cEU7XCI6IFwiXFx1MkFDNlxcdTAzMzhcIixcbiAgICBcIm5zdXBlO1wiOiBcIlxcdTIyODlcIixcbiAgICBcIm5zdXBzZXQ7XCI6IFwiXFx1MjI4M1xcdTIwRDJcIixcbiAgICBcIm5zdXBzZXRlcTtcIjogXCJcXHUyMjg5XCIsXG4gICAgXCJuc3Vwc2V0ZXFxO1wiOiBcIlxcdTJBQzZcXHUwMzM4XCIsXG4gICAgXCJudGdsO1wiOiBcIlxcdTIyNzlcIixcbiAgICBcIk50aWxkZTtcIjogXCJcXHUwMEQxXCIsXG4gICAgXCJOdGlsZGVcIjogXCJcXHUwMEQxXCIsXG4gICAgXCJudGlsZGU7XCI6IFwiXFx1MDBGMVwiLFxuICAgIFwibnRpbGRlXCI6IFwiXFx1MDBGMVwiLFxuICAgIFwibnRsZztcIjogXCJcXHUyMjc4XCIsXG4gICAgXCJudHJpYW5nbGVsZWZ0O1wiOiBcIlxcdTIyRUFcIixcbiAgICBcIm50cmlhbmdsZWxlZnRlcTtcIjogXCJcXHUyMkVDXCIsXG4gICAgXCJudHJpYW5nbGVyaWdodDtcIjogXCJcXHUyMkVCXCIsXG4gICAgXCJudHJpYW5nbGVyaWdodGVxO1wiOiBcIlxcdTIyRURcIixcbiAgICBcIk51O1wiOiBcIlxcdTAzOURcIixcbiAgICBcIm51O1wiOiBcIlxcdTAzQkRcIixcbiAgICBcIm51bTtcIjogXCIjXCIsXG4gICAgXCJudW1lcm87XCI6IFwiXFx1MjExNlwiLFxuICAgIFwibnVtc3A7XCI6IFwiXFx1MjAwN1wiLFxuICAgIFwibnZhcDtcIjogXCJcXHUyMjREXFx1MjBEMlwiLFxuICAgIFwiblZEYXNoO1wiOiBcIlxcdTIyQUZcIixcbiAgICBcIm5WZGFzaDtcIjogXCJcXHUyMkFFXCIsXG4gICAgXCJudkRhc2g7XCI6IFwiXFx1MjJBRFwiLFxuICAgIFwibnZkYXNoO1wiOiBcIlxcdTIyQUNcIixcbiAgICBcIm52Z2U7XCI6IFwiXFx1MjI2NVxcdTIwRDJcIixcbiAgICBcIm52Z3Q7XCI6IFwiPlxcdTIwRDJcIixcbiAgICBcIm52SGFycjtcIjogXCJcXHUyOTA0XCIsXG4gICAgXCJudmluZmluO1wiOiBcIlxcdTI5REVcIixcbiAgICBcIm52bEFycjtcIjogXCJcXHUyOTAyXCIsXG4gICAgXCJudmxlO1wiOiBcIlxcdTIyNjRcXHUyMEQyXCIsXG4gICAgXCJudmx0O1wiOiBcIjxcXHUyMEQyXCIsXG4gICAgXCJudmx0cmllO1wiOiBcIlxcdTIyQjRcXHUyMEQyXCIsXG4gICAgXCJudnJBcnI7XCI6IFwiXFx1MjkwM1wiLFxuICAgIFwibnZydHJpZTtcIjogXCJcXHUyMkI1XFx1MjBEMlwiLFxuICAgIFwibnZzaW07XCI6IFwiXFx1MjIzQ1xcdTIwRDJcIixcbiAgICBcIm53YXJoaztcIjogXCJcXHUyOTIzXCIsXG4gICAgXCJud0FycjtcIjogXCJcXHUyMUQ2XCIsXG4gICAgXCJud2FycjtcIjogXCJcXHUyMTk2XCIsXG4gICAgXCJud2Fycm93O1wiOiBcIlxcdTIxOTZcIixcbiAgICBcIm53bmVhcjtcIjogXCJcXHUyOTI3XCIsXG4gICAgXCJPYWN1dGU7XCI6IFwiXFx1MDBEM1wiLFxuICAgIFwiT2FjdXRlXCI6IFwiXFx1MDBEM1wiLFxuICAgIFwib2FjdXRlO1wiOiBcIlxcdTAwRjNcIixcbiAgICBcIm9hY3V0ZVwiOiBcIlxcdTAwRjNcIixcbiAgICBcIm9hc3Q7XCI6IFwiXFx1MjI5QlwiLFxuICAgIFwib2NpcjtcIjogXCJcXHUyMjlBXCIsXG4gICAgXCJPY2lyYztcIjogXCJcXHUwMEQ0XCIsXG4gICAgXCJPY2lyY1wiOiBcIlxcdTAwRDRcIixcbiAgICBcIm9jaXJjO1wiOiBcIlxcdTAwRjRcIixcbiAgICBcIm9jaXJjXCI6IFwiXFx1MDBGNFwiLFxuICAgIFwiT2N5O1wiOiBcIlxcdTA0MUVcIixcbiAgICBcIm9jeTtcIjogXCJcXHUwNDNFXCIsXG4gICAgXCJvZGFzaDtcIjogXCJcXHUyMjlEXCIsXG4gICAgXCJPZGJsYWM7XCI6IFwiXFx1MDE1MFwiLFxuICAgIFwib2RibGFjO1wiOiBcIlxcdTAxNTFcIixcbiAgICBcIm9kaXY7XCI6IFwiXFx1MkEzOFwiLFxuICAgIFwib2RvdDtcIjogXCJcXHUyMjk5XCIsXG4gICAgXCJvZHNvbGQ7XCI6IFwiXFx1MjlCQ1wiLFxuICAgIFwiT0VsaWc7XCI6IFwiXFx1MDE1MlwiLFxuICAgIFwib2VsaWc7XCI6IFwiXFx1MDE1M1wiLFxuICAgIFwib2ZjaXI7XCI6IFwiXFx1MjlCRlwiLFxuICAgIFwiT2ZyO1wiOiBcIlxcdUQ4MzVcXHVERDEyXCIsXG4gICAgXCJvZnI7XCI6IFwiXFx1RDgzNVxcdUREMkNcIixcbiAgICBcIm9nb247XCI6IFwiXFx1MDJEQlwiLFxuICAgIFwiT2dyYXZlO1wiOiBcIlxcdTAwRDJcIixcbiAgICBcIk9ncmF2ZVwiOiBcIlxcdTAwRDJcIixcbiAgICBcIm9ncmF2ZTtcIjogXCJcXHUwMEYyXCIsXG4gICAgXCJvZ3JhdmVcIjogXCJcXHUwMEYyXCIsXG4gICAgXCJvZ3Q7XCI6IFwiXFx1MjlDMVwiLFxuICAgIFwib2hiYXI7XCI6IFwiXFx1MjlCNVwiLFxuICAgIFwib2htO1wiOiBcIlxcdTAzQTlcIixcbiAgICBcIm9pbnQ7XCI6IFwiXFx1MjIyRVwiLFxuICAgIFwib2xhcnI7XCI6IFwiXFx1MjFCQVwiLFxuICAgIFwib2xjaXI7XCI6IFwiXFx1MjlCRVwiLFxuICAgIFwib2xjcm9zcztcIjogXCJcXHUyOUJCXCIsXG4gICAgXCJvbGluZTtcIjogXCJcXHUyMDNFXCIsXG4gICAgXCJvbHQ7XCI6IFwiXFx1MjlDMFwiLFxuICAgIFwiT21hY3I7XCI6IFwiXFx1MDE0Q1wiLFxuICAgIFwib21hY3I7XCI6IFwiXFx1MDE0RFwiLFxuICAgIFwiT21lZ2E7XCI6IFwiXFx1MDNBOVwiLFxuICAgIFwib21lZ2E7XCI6IFwiXFx1MDNDOVwiLFxuICAgIFwiT21pY3JvbjtcIjogXCJcXHUwMzlGXCIsXG4gICAgXCJvbWljcm9uO1wiOiBcIlxcdTAzQkZcIixcbiAgICBcIm9taWQ7XCI6IFwiXFx1MjlCNlwiLFxuICAgIFwib21pbnVzO1wiOiBcIlxcdTIyOTZcIixcbiAgICBcIk9vcGY7XCI6IFwiXFx1RDgzNVxcdURENDZcIixcbiAgICBcIm9vcGY7XCI6IFwiXFx1RDgzNVxcdURENjBcIixcbiAgICBcIm9wYXI7XCI6IFwiXFx1MjlCN1wiLFxuICAgIFwiT3BlbkN1cmx5RG91YmxlUXVvdGU7XCI6IFwiXFx1MjAxQ1wiLFxuICAgIFwiT3BlbkN1cmx5UXVvdGU7XCI6IFwiXFx1MjAxOFwiLFxuICAgIFwib3BlcnA7XCI6IFwiXFx1MjlCOVwiLFxuICAgIFwib3BsdXM7XCI6IFwiXFx1MjI5NVwiLFxuICAgIFwiT3I7XCI6IFwiXFx1MkE1NFwiLFxuICAgIFwib3I7XCI6IFwiXFx1MjIyOFwiLFxuICAgIFwib3JhcnI7XCI6IFwiXFx1MjFCQlwiLFxuICAgIFwib3JkO1wiOiBcIlxcdTJBNURcIixcbiAgICBcIm9yZGVyO1wiOiBcIlxcdTIxMzRcIixcbiAgICBcIm9yZGVyb2Y7XCI6IFwiXFx1MjEzNFwiLFxuICAgIFwib3JkZjtcIjogXCJcXHUwMEFBXCIsXG4gICAgXCJvcmRmXCI6IFwiXFx1MDBBQVwiLFxuICAgIFwib3JkbTtcIjogXCJcXHUwMEJBXCIsXG4gICAgXCJvcmRtXCI6IFwiXFx1MDBCQVwiLFxuICAgIFwib3JpZ29mO1wiOiBcIlxcdTIyQjZcIixcbiAgICBcIm9yb3I7XCI6IFwiXFx1MkE1NlwiLFxuICAgIFwib3JzbG9wZTtcIjogXCJcXHUyQTU3XCIsXG4gICAgXCJvcnY7XCI6IFwiXFx1MkE1QlwiLFxuICAgIFwib1M7XCI6IFwiXFx1MjRDOFwiLFxuICAgIFwiT3NjcjtcIjogXCJcXHVEODM1XFx1RENBQVwiLFxuICAgIFwib3NjcjtcIjogXCJcXHUyMTM0XCIsXG4gICAgXCJPc2xhc2g7XCI6IFwiXFx1MDBEOFwiLFxuICAgIFwiT3NsYXNoXCI6IFwiXFx1MDBEOFwiLFxuICAgIFwib3NsYXNoO1wiOiBcIlxcdTAwRjhcIixcbiAgICBcIm9zbGFzaFwiOiBcIlxcdTAwRjhcIixcbiAgICBcIm9zb2w7XCI6IFwiXFx1MjI5OFwiLFxuICAgIFwiT3RpbGRlO1wiOiBcIlxcdTAwRDVcIixcbiAgICBcIk90aWxkZVwiOiBcIlxcdTAwRDVcIixcbiAgICBcIm90aWxkZTtcIjogXCJcXHUwMEY1XCIsXG4gICAgXCJvdGlsZGVcIjogXCJcXHUwMEY1XCIsXG4gICAgXCJPdGltZXM7XCI6IFwiXFx1MkEzN1wiLFxuICAgIFwib3RpbWVzO1wiOiBcIlxcdTIyOTdcIixcbiAgICBcIm90aW1lc2FzO1wiOiBcIlxcdTJBMzZcIixcbiAgICBcIk91bWw7XCI6IFwiXFx1MDBENlwiLFxuICAgIFwiT3VtbFwiOiBcIlxcdTAwRDZcIixcbiAgICBcIm91bWw7XCI6IFwiXFx1MDBGNlwiLFxuICAgIFwib3VtbFwiOiBcIlxcdTAwRjZcIixcbiAgICBcIm92YmFyO1wiOiBcIlxcdTIzM0RcIixcbiAgICBcIk92ZXJCYXI7XCI6IFwiXFx1MjAzRVwiLFxuICAgIFwiT3ZlckJyYWNlO1wiOiBcIlxcdTIzREVcIixcbiAgICBcIk92ZXJCcmFja2V0O1wiOiBcIlxcdTIzQjRcIixcbiAgICBcIk92ZXJQYXJlbnRoZXNpcztcIjogXCJcXHUyM0RDXCIsXG4gICAgXCJwYXI7XCI6IFwiXFx1MjIyNVwiLFxuICAgIFwicGFyYTtcIjogXCJcXHUwMEI2XCIsXG4gICAgXCJwYXJhXCI6IFwiXFx1MDBCNlwiLFxuICAgIFwicGFyYWxsZWw7XCI6IFwiXFx1MjIyNVwiLFxuICAgIFwicGFyc2ltO1wiOiBcIlxcdTJBRjNcIixcbiAgICBcInBhcnNsO1wiOiBcIlxcdTJBRkRcIixcbiAgICBcInBhcnQ7XCI6IFwiXFx1MjIwMlwiLFxuICAgIFwiUGFydGlhbEQ7XCI6IFwiXFx1MjIwMlwiLFxuICAgIFwiUGN5O1wiOiBcIlxcdTA0MUZcIixcbiAgICBcInBjeTtcIjogXCJcXHUwNDNGXCIsXG4gICAgXCJwZXJjbnQ7XCI6IFwiJVwiLFxuICAgIFwicGVyaW9kO1wiOiBcIi5cIixcbiAgICBcInBlcm1pbDtcIjogXCJcXHUyMDMwXCIsXG4gICAgXCJwZXJwO1wiOiBcIlxcdTIyQTVcIixcbiAgICBcInBlcnRlbms7XCI6IFwiXFx1MjAzMVwiLFxuICAgIFwiUGZyO1wiOiBcIlxcdUQ4MzVcXHVERDEzXCIsXG4gICAgXCJwZnI7XCI6IFwiXFx1RDgzNVxcdUREMkRcIixcbiAgICBcIlBoaTtcIjogXCJcXHUwM0E2XCIsXG4gICAgXCJwaGk7XCI6IFwiXFx1MDNDNlwiLFxuICAgIFwicGhpdjtcIjogXCJcXHUwM0Q1XCIsXG4gICAgXCJwaG1tYXQ7XCI6IFwiXFx1MjEzM1wiLFxuICAgIFwicGhvbmU7XCI6IFwiXFx1MjYwRVwiLFxuICAgIFwiUGk7XCI6IFwiXFx1MDNBMFwiLFxuICAgIFwicGk7XCI6IFwiXFx1MDNDMFwiLFxuICAgIFwicGl0Y2hmb3JrO1wiOiBcIlxcdTIyRDRcIixcbiAgICBcInBpdjtcIjogXCJcXHUwM0Q2XCIsXG4gICAgXCJwbGFuY2s7XCI6IFwiXFx1MjEwRlwiLFxuICAgIFwicGxhbmNraDtcIjogXCJcXHUyMTBFXCIsXG4gICAgXCJwbGFua3Y7XCI6IFwiXFx1MjEwRlwiLFxuICAgIFwicGx1cztcIjogXCIrXCIsXG4gICAgXCJwbHVzYWNpcjtcIjogXCJcXHUyQTIzXCIsXG4gICAgXCJwbHVzYjtcIjogXCJcXHUyMjlFXCIsXG4gICAgXCJwbHVzY2lyO1wiOiBcIlxcdTJBMjJcIixcbiAgICBcInBsdXNkbztcIjogXCJcXHUyMjE0XCIsXG4gICAgXCJwbHVzZHU7XCI6IFwiXFx1MkEyNVwiLFxuICAgIFwicGx1c2U7XCI6IFwiXFx1MkE3MlwiLFxuICAgIFwiUGx1c01pbnVzO1wiOiBcIlxcdTAwQjFcIixcbiAgICBcInBsdXNtbjtcIjogXCJcXHUwMEIxXCIsXG4gICAgXCJwbHVzbW5cIjogXCJcXHUwMEIxXCIsXG4gICAgXCJwbHVzc2ltO1wiOiBcIlxcdTJBMjZcIixcbiAgICBcInBsdXN0d287XCI6IFwiXFx1MkEyN1wiLFxuICAgIFwicG07XCI6IFwiXFx1MDBCMVwiLFxuICAgIFwiUG9pbmNhcmVwbGFuZTtcIjogXCJcXHUyMTBDXCIsXG4gICAgXCJwb2ludGludDtcIjogXCJcXHUyQTE1XCIsXG4gICAgXCJQb3BmO1wiOiBcIlxcdTIxMTlcIixcbiAgICBcInBvcGY7XCI6IFwiXFx1RDgzNVxcdURENjFcIixcbiAgICBcInBvdW5kO1wiOiBcIlxcdTAwQTNcIixcbiAgICBcInBvdW5kXCI6IFwiXFx1MDBBM1wiLFxuICAgIFwiUHI7XCI6IFwiXFx1MkFCQlwiLFxuICAgIFwicHI7XCI6IFwiXFx1MjI3QVwiLFxuICAgIFwicHJhcDtcIjogXCJcXHUyQUI3XCIsXG4gICAgXCJwcmN1ZTtcIjogXCJcXHUyMjdDXCIsXG4gICAgXCJwckU7XCI6IFwiXFx1MkFCM1wiLFxuICAgIFwicHJlO1wiOiBcIlxcdTJBQUZcIixcbiAgICBcInByZWM7XCI6IFwiXFx1MjI3QVwiLFxuICAgIFwicHJlY2FwcHJveDtcIjogXCJcXHUyQUI3XCIsXG4gICAgXCJwcmVjY3VybHllcTtcIjogXCJcXHUyMjdDXCIsXG4gICAgXCJQcmVjZWRlcztcIjogXCJcXHUyMjdBXCIsXG4gICAgXCJQcmVjZWRlc0VxdWFsO1wiOiBcIlxcdTJBQUZcIixcbiAgICBcIlByZWNlZGVzU2xhbnRFcXVhbDtcIjogXCJcXHUyMjdDXCIsXG4gICAgXCJQcmVjZWRlc1RpbGRlO1wiOiBcIlxcdTIyN0VcIixcbiAgICBcInByZWNlcTtcIjogXCJcXHUyQUFGXCIsXG4gICAgXCJwcmVjbmFwcHJveDtcIjogXCJcXHUyQUI5XCIsXG4gICAgXCJwcmVjbmVxcTtcIjogXCJcXHUyQUI1XCIsXG4gICAgXCJwcmVjbnNpbTtcIjogXCJcXHUyMkU4XCIsXG4gICAgXCJwcmVjc2ltO1wiOiBcIlxcdTIyN0VcIixcbiAgICBcIlByaW1lO1wiOiBcIlxcdTIwMzNcIixcbiAgICBcInByaW1lO1wiOiBcIlxcdTIwMzJcIixcbiAgICBcInByaW1lcztcIjogXCJcXHUyMTE5XCIsXG4gICAgXCJwcm5hcDtcIjogXCJcXHUyQUI5XCIsXG4gICAgXCJwcm5FO1wiOiBcIlxcdTJBQjVcIixcbiAgICBcInBybnNpbTtcIjogXCJcXHUyMkU4XCIsXG4gICAgXCJwcm9kO1wiOiBcIlxcdTIyMEZcIixcbiAgICBcIlByb2R1Y3Q7XCI6IFwiXFx1MjIwRlwiLFxuICAgIFwicHJvZmFsYXI7XCI6IFwiXFx1MjMyRVwiLFxuICAgIFwicHJvZmxpbmU7XCI6IFwiXFx1MjMxMlwiLFxuICAgIFwicHJvZnN1cmY7XCI6IFwiXFx1MjMxM1wiLFxuICAgIFwicHJvcDtcIjogXCJcXHUyMjFEXCIsXG4gICAgXCJQcm9wb3J0aW9uO1wiOiBcIlxcdTIyMzdcIixcbiAgICBcIlByb3BvcnRpb25hbDtcIjogXCJcXHUyMjFEXCIsXG4gICAgXCJwcm9wdG87XCI6IFwiXFx1MjIxRFwiLFxuICAgIFwicHJzaW07XCI6IFwiXFx1MjI3RVwiLFxuICAgIFwicHJ1cmVsO1wiOiBcIlxcdTIyQjBcIixcbiAgICBcIlBzY3I7XCI6IFwiXFx1RDgzNVxcdURDQUJcIixcbiAgICBcInBzY3I7XCI6IFwiXFx1RDgzNVxcdURDQzVcIixcbiAgICBcIlBzaTtcIjogXCJcXHUwM0E4XCIsXG4gICAgXCJwc2k7XCI6IFwiXFx1MDNDOFwiLFxuICAgIFwicHVuY3NwO1wiOiBcIlxcdTIwMDhcIixcbiAgICBcIlFmcjtcIjogXCJcXHVEODM1XFx1REQxNFwiLFxuICAgIFwicWZyO1wiOiBcIlxcdUQ4MzVcXHVERDJFXCIsXG4gICAgXCJxaW50O1wiOiBcIlxcdTJBMENcIixcbiAgICBcIlFvcGY7XCI6IFwiXFx1MjExQVwiLFxuICAgIFwicW9wZjtcIjogXCJcXHVEODM1XFx1REQ2MlwiLFxuICAgIFwicXByaW1lO1wiOiBcIlxcdTIwNTdcIixcbiAgICBcIlFzY3I7XCI6IFwiXFx1RDgzNVxcdURDQUNcIixcbiAgICBcInFzY3I7XCI6IFwiXFx1RDgzNVxcdURDQzZcIixcbiAgICBcInF1YXRlcm5pb25zO1wiOiBcIlxcdTIxMERcIixcbiAgICBcInF1YXRpbnQ7XCI6IFwiXFx1MkExNlwiLFxuICAgIFwicXVlc3Q7XCI6IFwiP1wiLFxuICAgIFwicXVlc3RlcTtcIjogXCJcXHUyMjVGXCIsXG4gICAgXCJRVU9UO1wiOiBcIlxcXCJcIixcbiAgICBcIlFVT1RcIjogXCJcXFwiXCIsXG4gICAgXCJxdW90O1wiOiBcIlxcXCJcIixcbiAgICBcInF1b3RcIjogXCJcXFwiXCIsXG4gICAgXCJyQWFycjtcIjogXCJcXHUyMURCXCIsXG4gICAgXCJyYWNlO1wiOiBcIlxcdTIyM0RcXHUwMzMxXCIsXG4gICAgXCJSYWN1dGU7XCI6IFwiXFx1MDE1NFwiLFxuICAgIFwicmFjdXRlO1wiOiBcIlxcdTAxNTVcIixcbiAgICBcInJhZGljO1wiOiBcIlxcdTIyMUFcIixcbiAgICBcInJhZW1wdHl2O1wiOiBcIlxcdTI5QjNcIixcbiAgICBcIlJhbmc7XCI6IFwiXFx1MjdFQlwiLFxuICAgIFwicmFuZztcIjogXCJcXHUyN0U5XCIsXG4gICAgXCJyYW5nZDtcIjogXCJcXHUyOTkyXCIsXG4gICAgXCJyYW5nZTtcIjogXCJcXHUyOUE1XCIsXG4gICAgXCJyYW5nbGU7XCI6IFwiXFx1MjdFOVwiLFxuICAgIFwicmFxdW87XCI6IFwiXFx1MDBCQlwiLFxuICAgIFwicmFxdW9cIjogXCJcXHUwMEJCXCIsXG4gICAgXCJSYXJyO1wiOiBcIlxcdTIxQTBcIixcbiAgICBcInJBcnI7XCI6IFwiXFx1MjFEMlwiLFxuICAgIFwicmFycjtcIjogXCJcXHUyMTkyXCIsXG4gICAgXCJyYXJyYXA7XCI6IFwiXFx1Mjk3NVwiLFxuICAgIFwicmFycmI7XCI6IFwiXFx1MjFFNVwiLFxuICAgIFwicmFycmJmcztcIjogXCJcXHUyOTIwXCIsXG4gICAgXCJyYXJyYztcIjogXCJcXHUyOTMzXCIsXG4gICAgXCJyYXJyZnM7XCI6IFwiXFx1MjkxRVwiLFxuICAgIFwicmFycmhrO1wiOiBcIlxcdTIxQUFcIixcbiAgICBcInJhcnJscDtcIjogXCJcXHUyMUFDXCIsXG4gICAgXCJyYXJycGw7XCI6IFwiXFx1Mjk0NVwiLFxuICAgIFwicmFycnNpbTtcIjogXCJcXHUyOTc0XCIsXG4gICAgXCJSYXJydGw7XCI6IFwiXFx1MjkxNlwiLFxuICAgIFwicmFycnRsO1wiOiBcIlxcdTIxQTNcIixcbiAgICBcInJhcnJ3O1wiOiBcIlxcdTIxOURcIixcbiAgICBcInJBdGFpbDtcIjogXCJcXHUyOTFDXCIsXG4gICAgXCJyYXRhaWw7XCI6IFwiXFx1MjkxQVwiLFxuICAgIFwicmF0aW87XCI6IFwiXFx1MjIzNlwiLFxuICAgIFwicmF0aW9uYWxzO1wiOiBcIlxcdTIxMUFcIixcbiAgICBcIlJCYXJyO1wiOiBcIlxcdTI5MTBcIixcbiAgICBcInJCYXJyO1wiOiBcIlxcdTI5MEZcIixcbiAgICBcInJiYXJyO1wiOiBcIlxcdTI5MERcIixcbiAgICBcInJiYnJrO1wiOiBcIlxcdTI3NzNcIixcbiAgICBcInJicmFjZTtcIjogXCJ9XCIsXG4gICAgXCJyYnJhY2s7XCI6IFwiXVwiLFxuICAgIFwicmJya2U7XCI6IFwiXFx1Mjk4Q1wiLFxuICAgIFwicmJya3NsZDtcIjogXCJcXHUyOThFXCIsXG4gICAgXCJyYnJrc2x1O1wiOiBcIlxcdTI5OTBcIixcbiAgICBcIlJjYXJvbjtcIjogXCJcXHUwMTU4XCIsXG4gICAgXCJyY2Fyb247XCI6IFwiXFx1MDE1OVwiLFxuICAgIFwiUmNlZGlsO1wiOiBcIlxcdTAxNTZcIixcbiAgICBcInJjZWRpbDtcIjogXCJcXHUwMTU3XCIsXG4gICAgXCJyY2VpbDtcIjogXCJcXHUyMzA5XCIsXG4gICAgXCJyY3ViO1wiOiBcIn1cIixcbiAgICBcIlJjeTtcIjogXCJcXHUwNDIwXCIsXG4gICAgXCJyY3k7XCI6IFwiXFx1MDQ0MFwiLFxuICAgIFwicmRjYTtcIjogXCJcXHUyOTM3XCIsXG4gICAgXCJyZGxkaGFyO1wiOiBcIlxcdTI5NjlcIixcbiAgICBcInJkcXVvO1wiOiBcIlxcdTIwMURcIixcbiAgICBcInJkcXVvcjtcIjogXCJcXHUyMDFEXCIsXG4gICAgXCJyZHNoO1wiOiBcIlxcdTIxQjNcIixcbiAgICBcIlJlO1wiOiBcIlxcdTIxMUNcIixcbiAgICBcInJlYWw7XCI6IFwiXFx1MjExQ1wiLFxuICAgIFwicmVhbGluZTtcIjogXCJcXHUyMTFCXCIsXG4gICAgXCJyZWFscGFydDtcIjogXCJcXHUyMTFDXCIsXG4gICAgXCJyZWFscztcIjogXCJcXHUyMTFEXCIsXG4gICAgXCJyZWN0O1wiOiBcIlxcdTI1QURcIixcbiAgICBcIlJFRztcIjogXCJcXHUwMEFFXCIsXG4gICAgXCJSRUdcIjogXCJcXHUwMEFFXCIsXG4gICAgXCJyZWc7XCI6IFwiXFx1MDBBRVwiLFxuICAgIFwicmVnXCI6IFwiXFx1MDBBRVwiLFxuICAgIFwiUmV2ZXJzZUVsZW1lbnQ7XCI6IFwiXFx1MjIwQlwiLFxuICAgIFwiUmV2ZXJzZUVxdWlsaWJyaXVtO1wiOiBcIlxcdTIxQ0JcIixcbiAgICBcIlJldmVyc2VVcEVxdWlsaWJyaXVtO1wiOiBcIlxcdTI5NkZcIixcbiAgICBcInJmaXNodDtcIjogXCJcXHUyOTdEXCIsXG4gICAgXCJyZmxvb3I7XCI6IFwiXFx1MjMwQlwiLFxuICAgIFwiUmZyO1wiOiBcIlxcdTIxMUNcIixcbiAgICBcInJmcjtcIjogXCJcXHVEODM1XFx1REQyRlwiLFxuICAgIFwickhhcjtcIjogXCJcXHUyOTY0XCIsXG4gICAgXCJyaGFyZDtcIjogXCJcXHUyMUMxXCIsXG4gICAgXCJyaGFydTtcIjogXCJcXHUyMUMwXCIsXG4gICAgXCJyaGFydWw7XCI6IFwiXFx1Mjk2Q1wiLFxuICAgIFwiUmhvO1wiOiBcIlxcdTAzQTFcIixcbiAgICBcInJobztcIjogXCJcXHUwM0MxXCIsXG4gICAgXCJyaG92O1wiOiBcIlxcdTAzRjFcIixcbiAgICBcIlJpZ2h0QW5nbGVCcmFja2V0O1wiOiBcIlxcdTI3RTlcIixcbiAgICBcIlJpZ2h0QXJyb3c7XCI6IFwiXFx1MjE5MlwiLFxuICAgIFwiUmlnaHRhcnJvdztcIjogXCJcXHUyMUQyXCIsXG4gICAgXCJyaWdodGFycm93O1wiOiBcIlxcdTIxOTJcIixcbiAgICBcIlJpZ2h0QXJyb3dCYXI7XCI6IFwiXFx1MjFFNVwiLFxuICAgIFwiUmlnaHRBcnJvd0xlZnRBcnJvdztcIjogXCJcXHUyMUM0XCIsXG4gICAgXCJyaWdodGFycm93dGFpbDtcIjogXCJcXHUyMUEzXCIsXG4gICAgXCJSaWdodENlaWxpbmc7XCI6IFwiXFx1MjMwOVwiLFxuICAgIFwiUmlnaHREb3VibGVCcmFja2V0O1wiOiBcIlxcdTI3RTdcIixcbiAgICBcIlJpZ2h0RG93blRlZVZlY3RvcjtcIjogXCJcXHUyOTVEXCIsXG4gICAgXCJSaWdodERvd25WZWN0b3I7XCI6IFwiXFx1MjFDMlwiLFxuICAgIFwiUmlnaHREb3duVmVjdG9yQmFyO1wiOiBcIlxcdTI5NTVcIixcbiAgICBcIlJpZ2h0Rmxvb3I7XCI6IFwiXFx1MjMwQlwiLFxuICAgIFwicmlnaHRoYXJwb29uZG93bjtcIjogXCJcXHUyMUMxXCIsXG4gICAgXCJyaWdodGhhcnBvb251cDtcIjogXCJcXHUyMUMwXCIsXG4gICAgXCJyaWdodGxlZnRhcnJvd3M7XCI6IFwiXFx1MjFDNFwiLFxuICAgIFwicmlnaHRsZWZ0aGFycG9vbnM7XCI6IFwiXFx1MjFDQ1wiLFxuICAgIFwicmlnaHRyaWdodGFycm93cztcIjogXCJcXHUyMUM5XCIsXG4gICAgXCJyaWdodHNxdWlnYXJyb3c7XCI6IFwiXFx1MjE5RFwiLFxuICAgIFwiUmlnaHRUZWU7XCI6IFwiXFx1MjJBMlwiLFxuICAgIFwiUmlnaHRUZWVBcnJvdztcIjogXCJcXHUyMUE2XCIsXG4gICAgXCJSaWdodFRlZVZlY3RvcjtcIjogXCJcXHUyOTVCXCIsXG4gICAgXCJyaWdodHRocmVldGltZXM7XCI6IFwiXFx1MjJDQ1wiLFxuICAgIFwiUmlnaHRUcmlhbmdsZTtcIjogXCJcXHUyMkIzXCIsXG4gICAgXCJSaWdodFRyaWFuZ2xlQmFyO1wiOiBcIlxcdTI5RDBcIixcbiAgICBcIlJpZ2h0VHJpYW5nbGVFcXVhbDtcIjogXCJcXHUyMkI1XCIsXG4gICAgXCJSaWdodFVwRG93blZlY3RvcjtcIjogXCJcXHUyOTRGXCIsXG4gICAgXCJSaWdodFVwVGVlVmVjdG9yO1wiOiBcIlxcdTI5NUNcIixcbiAgICBcIlJpZ2h0VXBWZWN0b3I7XCI6IFwiXFx1MjFCRVwiLFxuICAgIFwiUmlnaHRVcFZlY3RvckJhcjtcIjogXCJcXHUyOTU0XCIsXG4gICAgXCJSaWdodFZlY3RvcjtcIjogXCJcXHUyMUMwXCIsXG4gICAgXCJSaWdodFZlY3RvckJhcjtcIjogXCJcXHUyOTUzXCIsXG4gICAgXCJyaW5nO1wiOiBcIlxcdTAyREFcIixcbiAgICBcInJpc2luZ2RvdHNlcTtcIjogXCJcXHUyMjUzXCIsXG4gICAgXCJybGFycjtcIjogXCJcXHUyMUM0XCIsXG4gICAgXCJybGhhcjtcIjogXCJcXHUyMUNDXCIsXG4gICAgXCJybG07XCI6IFwiXFx1MjAwRlwiLFxuICAgIFwicm1vdXN0O1wiOiBcIlxcdTIzQjFcIixcbiAgICBcInJtb3VzdGFjaGU7XCI6IFwiXFx1MjNCMVwiLFxuICAgIFwicm5taWQ7XCI6IFwiXFx1MkFFRVwiLFxuICAgIFwicm9hbmc7XCI6IFwiXFx1MjdFRFwiLFxuICAgIFwicm9hcnI7XCI6IFwiXFx1MjFGRVwiLFxuICAgIFwicm9icms7XCI6IFwiXFx1MjdFN1wiLFxuICAgIFwicm9wYXI7XCI6IFwiXFx1Mjk4NlwiLFxuICAgIFwiUm9wZjtcIjogXCJcXHUyMTFEXCIsXG4gICAgXCJyb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDYzXCIsXG4gICAgXCJyb3BsdXM7XCI6IFwiXFx1MkEyRVwiLFxuICAgIFwicm90aW1lcztcIjogXCJcXHUyQTM1XCIsXG4gICAgXCJSb3VuZEltcGxpZXM7XCI6IFwiXFx1Mjk3MFwiLFxuICAgIFwicnBhcjtcIjogXCIpXCIsXG4gICAgXCJycGFyZ3Q7XCI6IFwiXFx1Mjk5NFwiLFxuICAgIFwicnBwb2xpbnQ7XCI6IFwiXFx1MkExMlwiLFxuICAgIFwicnJhcnI7XCI6IFwiXFx1MjFDOVwiLFxuICAgIFwiUnJpZ2h0YXJyb3c7XCI6IFwiXFx1MjFEQlwiLFxuICAgIFwicnNhcXVvO1wiOiBcIlxcdTIwM0FcIixcbiAgICBcIlJzY3I7XCI6IFwiXFx1MjExQlwiLFxuICAgIFwicnNjcjtcIjogXCJcXHVEODM1XFx1RENDN1wiLFxuICAgIFwiUnNoO1wiOiBcIlxcdTIxQjFcIixcbiAgICBcInJzaDtcIjogXCJcXHUyMUIxXCIsXG4gICAgXCJyc3FiO1wiOiBcIl1cIixcbiAgICBcInJzcXVvO1wiOiBcIlxcdTIwMTlcIixcbiAgICBcInJzcXVvcjtcIjogXCJcXHUyMDE5XCIsXG4gICAgXCJydGhyZWU7XCI6IFwiXFx1MjJDQ1wiLFxuICAgIFwicnRpbWVzO1wiOiBcIlxcdTIyQ0FcIixcbiAgICBcInJ0cmk7XCI6IFwiXFx1MjVCOVwiLFxuICAgIFwicnRyaWU7XCI6IFwiXFx1MjJCNVwiLFxuICAgIFwicnRyaWY7XCI6IFwiXFx1MjVCOFwiLFxuICAgIFwicnRyaWx0cmk7XCI6IFwiXFx1MjlDRVwiLFxuICAgIFwiUnVsZURlbGF5ZWQ7XCI6IFwiXFx1MjlGNFwiLFxuICAgIFwicnVsdWhhcjtcIjogXCJcXHUyOTY4XCIsXG4gICAgXCJyeDtcIjogXCJcXHUyMTFFXCIsXG4gICAgXCJTYWN1dGU7XCI6IFwiXFx1MDE1QVwiLFxuICAgIFwic2FjdXRlO1wiOiBcIlxcdTAxNUJcIixcbiAgICBcInNicXVvO1wiOiBcIlxcdTIwMUFcIixcbiAgICBcIlNjO1wiOiBcIlxcdTJBQkNcIixcbiAgICBcInNjO1wiOiBcIlxcdTIyN0JcIixcbiAgICBcInNjYXA7XCI6IFwiXFx1MkFCOFwiLFxuICAgIFwiU2Nhcm9uO1wiOiBcIlxcdTAxNjBcIixcbiAgICBcInNjYXJvbjtcIjogXCJcXHUwMTYxXCIsXG4gICAgXCJzY2N1ZTtcIjogXCJcXHUyMjdEXCIsXG4gICAgXCJzY0U7XCI6IFwiXFx1MkFCNFwiLFxuICAgIFwic2NlO1wiOiBcIlxcdTJBQjBcIixcbiAgICBcIlNjZWRpbDtcIjogXCJcXHUwMTVFXCIsXG4gICAgXCJzY2VkaWw7XCI6IFwiXFx1MDE1RlwiLFxuICAgIFwiU2NpcmM7XCI6IFwiXFx1MDE1Q1wiLFxuICAgIFwic2NpcmM7XCI6IFwiXFx1MDE1RFwiLFxuICAgIFwic2NuYXA7XCI6IFwiXFx1MkFCQVwiLFxuICAgIFwic2NuRTtcIjogXCJcXHUyQUI2XCIsXG4gICAgXCJzY25zaW07XCI6IFwiXFx1MjJFOVwiLFxuICAgIFwic2Nwb2xpbnQ7XCI6IFwiXFx1MkExM1wiLFxuICAgIFwic2NzaW07XCI6IFwiXFx1MjI3RlwiLFxuICAgIFwiU2N5O1wiOiBcIlxcdTA0MjFcIixcbiAgICBcInNjeTtcIjogXCJcXHUwNDQxXCIsXG4gICAgXCJzZG90O1wiOiBcIlxcdTIyQzVcIixcbiAgICBcInNkb3RiO1wiOiBcIlxcdTIyQTFcIixcbiAgICBcInNkb3RlO1wiOiBcIlxcdTJBNjZcIixcbiAgICBcInNlYXJoaztcIjogXCJcXHUyOTI1XCIsXG4gICAgXCJzZUFycjtcIjogXCJcXHUyMUQ4XCIsXG4gICAgXCJzZWFycjtcIjogXCJcXHUyMTk4XCIsXG4gICAgXCJzZWFycm93O1wiOiBcIlxcdTIxOThcIixcbiAgICBcInNlY3Q7XCI6IFwiXFx1MDBBN1wiLFxuICAgIFwic2VjdFwiOiBcIlxcdTAwQTdcIixcbiAgICBcInNlbWk7XCI6IFwiO1wiLFxuICAgIFwic2Vzd2FyO1wiOiBcIlxcdTI5MjlcIixcbiAgICBcInNldG1pbnVzO1wiOiBcIlxcdTIyMTZcIixcbiAgICBcInNldG1uO1wiOiBcIlxcdTIyMTZcIixcbiAgICBcInNleHQ7XCI6IFwiXFx1MjczNlwiLFxuICAgIFwiU2ZyO1wiOiBcIlxcdUQ4MzVcXHVERDE2XCIsXG4gICAgXCJzZnI7XCI6IFwiXFx1RDgzNVxcdUREMzBcIixcbiAgICBcInNmcm93bjtcIjogXCJcXHUyMzIyXCIsXG4gICAgXCJzaGFycDtcIjogXCJcXHUyNjZGXCIsXG4gICAgXCJTSENIY3k7XCI6IFwiXFx1MDQyOVwiLFxuICAgIFwic2hjaGN5O1wiOiBcIlxcdTA0NDlcIixcbiAgICBcIlNIY3k7XCI6IFwiXFx1MDQyOFwiLFxuICAgIFwic2hjeTtcIjogXCJcXHUwNDQ4XCIsXG4gICAgXCJTaG9ydERvd25BcnJvdztcIjogXCJcXHUyMTkzXCIsXG4gICAgXCJTaG9ydExlZnRBcnJvdztcIjogXCJcXHUyMTkwXCIsXG4gICAgXCJzaG9ydG1pZDtcIjogXCJcXHUyMjIzXCIsXG4gICAgXCJzaG9ydHBhcmFsbGVsO1wiOiBcIlxcdTIyMjVcIixcbiAgICBcIlNob3J0UmlnaHRBcnJvdztcIjogXCJcXHUyMTkyXCIsXG4gICAgXCJTaG9ydFVwQXJyb3c7XCI6IFwiXFx1MjE5MVwiLFxuICAgIFwic2h5O1wiOiBcIlxcdTAwQURcIixcbiAgICBcInNoeVwiOiBcIlxcdTAwQURcIixcbiAgICBcIlNpZ21hO1wiOiBcIlxcdTAzQTNcIixcbiAgICBcInNpZ21hO1wiOiBcIlxcdTAzQzNcIixcbiAgICBcInNpZ21hZjtcIjogXCJcXHUwM0MyXCIsXG4gICAgXCJzaWdtYXY7XCI6IFwiXFx1MDNDMlwiLFxuICAgIFwic2ltO1wiOiBcIlxcdTIyM0NcIixcbiAgICBcInNpbWRvdDtcIjogXCJcXHUyQTZBXCIsXG4gICAgXCJzaW1lO1wiOiBcIlxcdTIyNDNcIixcbiAgICBcInNpbWVxO1wiOiBcIlxcdTIyNDNcIixcbiAgICBcInNpbWc7XCI6IFwiXFx1MkE5RVwiLFxuICAgIFwic2ltZ0U7XCI6IFwiXFx1MkFBMFwiLFxuICAgIFwic2ltbDtcIjogXCJcXHUyQTlEXCIsXG4gICAgXCJzaW1sRTtcIjogXCJcXHUyQTlGXCIsXG4gICAgXCJzaW1uZTtcIjogXCJcXHUyMjQ2XCIsXG4gICAgXCJzaW1wbHVzO1wiOiBcIlxcdTJBMjRcIixcbiAgICBcInNpbXJhcnI7XCI6IFwiXFx1Mjk3MlwiLFxuICAgIFwic2xhcnI7XCI6IFwiXFx1MjE5MFwiLFxuICAgIFwiU21hbGxDaXJjbGU7XCI6IFwiXFx1MjIxOFwiLFxuICAgIFwic21hbGxzZXRtaW51cztcIjogXCJcXHUyMjE2XCIsXG4gICAgXCJzbWFzaHA7XCI6IFwiXFx1MkEzM1wiLFxuICAgIFwic21lcGFyc2w7XCI6IFwiXFx1MjlFNFwiLFxuICAgIFwic21pZDtcIjogXCJcXHUyMjIzXCIsXG4gICAgXCJzbWlsZTtcIjogXCJcXHUyMzIzXCIsXG4gICAgXCJzbXQ7XCI6IFwiXFx1MkFBQVwiLFxuICAgIFwic210ZTtcIjogXCJcXHUyQUFDXCIsXG4gICAgXCJzbXRlcztcIjogXCJcXHUyQUFDXFx1RkUwMFwiLFxuICAgIFwiU09GVGN5O1wiOiBcIlxcdTA0MkNcIixcbiAgICBcInNvZnRjeTtcIjogXCJcXHUwNDRDXCIsXG4gICAgXCJzb2w7XCI6IFwiL1wiLFxuICAgIFwic29sYjtcIjogXCJcXHUyOUM0XCIsXG4gICAgXCJzb2xiYXI7XCI6IFwiXFx1MjMzRlwiLFxuICAgIFwiU29wZjtcIjogXCJcXHVEODM1XFx1REQ0QVwiLFxuICAgIFwic29wZjtcIjogXCJcXHVEODM1XFx1REQ2NFwiLFxuICAgIFwic3BhZGVzO1wiOiBcIlxcdTI2NjBcIixcbiAgICBcInNwYWRlc3VpdDtcIjogXCJcXHUyNjYwXCIsXG4gICAgXCJzcGFyO1wiOiBcIlxcdTIyMjVcIixcbiAgICBcInNxY2FwO1wiOiBcIlxcdTIyOTNcIixcbiAgICBcInNxY2FwcztcIjogXCJcXHUyMjkzXFx1RkUwMFwiLFxuICAgIFwic3FjdXA7XCI6IFwiXFx1MjI5NFwiLFxuICAgIFwic3FjdXBzO1wiOiBcIlxcdTIyOTRcXHVGRTAwXCIsXG4gICAgXCJTcXJ0O1wiOiBcIlxcdTIyMUFcIixcbiAgICBcInNxc3ViO1wiOiBcIlxcdTIyOEZcIixcbiAgICBcInNxc3ViZTtcIjogXCJcXHUyMjkxXCIsXG4gICAgXCJzcXN1YnNldDtcIjogXCJcXHUyMjhGXCIsXG4gICAgXCJzcXN1YnNldGVxO1wiOiBcIlxcdTIyOTFcIixcbiAgICBcInNxc3VwO1wiOiBcIlxcdTIyOTBcIixcbiAgICBcInNxc3VwZTtcIjogXCJcXHUyMjkyXCIsXG4gICAgXCJzcXN1cHNldDtcIjogXCJcXHUyMjkwXCIsXG4gICAgXCJzcXN1cHNldGVxO1wiOiBcIlxcdTIyOTJcIixcbiAgICBcInNxdTtcIjogXCJcXHUyNUExXCIsXG4gICAgXCJTcXVhcmU7XCI6IFwiXFx1MjVBMVwiLFxuICAgIFwic3F1YXJlO1wiOiBcIlxcdTI1QTFcIixcbiAgICBcIlNxdWFyZUludGVyc2VjdGlvbjtcIjogXCJcXHUyMjkzXCIsXG4gICAgXCJTcXVhcmVTdWJzZXQ7XCI6IFwiXFx1MjI4RlwiLFxuICAgIFwiU3F1YXJlU3Vic2V0RXF1YWw7XCI6IFwiXFx1MjI5MVwiLFxuICAgIFwiU3F1YXJlU3VwZXJzZXQ7XCI6IFwiXFx1MjI5MFwiLFxuICAgIFwiU3F1YXJlU3VwZXJzZXRFcXVhbDtcIjogXCJcXHUyMjkyXCIsXG4gICAgXCJTcXVhcmVVbmlvbjtcIjogXCJcXHUyMjk0XCIsXG4gICAgXCJzcXVhcmY7XCI6IFwiXFx1MjVBQVwiLFxuICAgIFwic3F1ZjtcIjogXCJcXHUyNUFBXCIsXG4gICAgXCJzcmFycjtcIjogXCJcXHUyMTkyXCIsXG4gICAgXCJTc2NyO1wiOiBcIlxcdUQ4MzVcXHVEQ0FFXCIsXG4gICAgXCJzc2NyO1wiOiBcIlxcdUQ4MzVcXHVEQ0M4XCIsXG4gICAgXCJzc2V0bW47XCI6IFwiXFx1MjIxNlwiLFxuICAgIFwic3NtaWxlO1wiOiBcIlxcdTIzMjNcIixcbiAgICBcInNzdGFyZjtcIjogXCJcXHUyMkM2XCIsXG4gICAgXCJTdGFyO1wiOiBcIlxcdTIyQzZcIixcbiAgICBcInN0YXI7XCI6IFwiXFx1MjYwNlwiLFxuICAgIFwic3RhcmY7XCI6IFwiXFx1MjYwNVwiLFxuICAgIFwic3RyYWlnaHRlcHNpbG9uO1wiOiBcIlxcdTAzRjVcIixcbiAgICBcInN0cmFpZ2h0cGhpO1wiOiBcIlxcdTAzRDVcIixcbiAgICBcInN0cm5zO1wiOiBcIlxcdTAwQUZcIixcbiAgICBcIlN1YjtcIjogXCJcXHUyMkQwXCIsXG4gICAgXCJzdWI7XCI6IFwiXFx1MjI4MlwiLFxuICAgIFwic3ViZG90O1wiOiBcIlxcdTJBQkRcIixcbiAgICBcInN1YkU7XCI6IFwiXFx1MkFDNVwiLFxuICAgIFwic3ViZTtcIjogXCJcXHUyMjg2XCIsXG4gICAgXCJzdWJlZG90O1wiOiBcIlxcdTJBQzNcIixcbiAgICBcInN1Ym11bHQ7XCI6IFwiXFx1MkFDMVwiLFxuICAgIFwic3VibkU7XCI6IFwiXFx1MkFDQlwiLFxuICAgIFwic3VibmU7XCI6IFwiXFx1MjI4QVwiLFxuICAgIFwic3VicGx1cztcIjogXCJcXHUyQUJGXCIsXG4gICAgXCJzdWJyYXJyO1wiOiBcIlxcdTI5NzlcIixcbiAgICBcIlN1YnNldDtcIjogXCJcXHUyMkQwXCIsXG4gICAgXCJzdWJzZXQ7XCI6IFwiXFx1MjI4MlwiLFxuICAgIFwic3Vic2V0ZXE7XCI6IFwiXFx1MjI4NlwiLFxuICAgIFwic3Vic2V0ZXFxO1wiOiBcIlxcdTJBQzVcIixcbiAgICBcIlN1YnNldEVxdWFsO1wiOiBcIlxcdTIyODZcIixcbiAgICBcInN1YnNldG5lcTtcIjogXCJcXHUyMjhBXCIsXG4gICAgXCJzdWJzZXRuZXFxO1wiOiBcIlxcdTJBQ0JcIixcbiAgICBcInN1YnNpbTtcIjogXCJcXHUyQUM3XCIsXG4gICAgXCJzdWJzdWI7XCI6IFwiXFx1MkFENVwiLFxuICAgIFwic3Vic3VwO1wiOiBcIlxcdTJBRDNcIixcbiAgICBcInN1Y2M7XCI6IFwiXFx1MjI3QlwiLFxuICAgIFwic3VjY2FwcHJveDtcIjogXCJcXHUyQUI4XCIsXG4gICAgXCJzdWNjY3VybHllcTtcIjogXCJcXHUyMjdEXCIsXG4gICAgXCJTdWNjZWVkcztcIjogXCJcXHUyMjdCXCIsXG4gICAgXCJTdWNjZWVkc0VxdWFsO1wiOiBcIlxcdTJBQjBcIixcbiAgICBcIlN1Y2NlZWRzU2xhbnRFcXVhbDtcIjogXCJcXHUyMjdEXCIsXG4gICAgXCJTdWNjZWVkc1RpbGRlO1wiOiBcIlxcdTIyN0ZcIixcbiAgICBcInN1Y2NlcTtcIjogXCJcXHUyQUIwXCIsXG4gICAgXCJzdWNjbmFwcHJveDtcIjogXCJcXHUyQUJBXCIsXG4gICAgXCJzdWNjbmVxcTtcIjogXCJcXHUyQUI2XCIsXG4gICAgXCJzdWNjbnNpbTtcIjogXCJcXHUyMkU5XCIsXG4gICAgXCJzdWNjc2ltO1wiOiBcIlxcdTIyN0ZcIixcbiAgICBcIlN1Y2hUaGF0O1wiOiBcIlxcdTIyMEJcIixcbiAgICBcIlN1bTtcIjogXCJcXHUyMjExXCIsXG4gICAgXCJzdW07XCI6IFwiXFx1MjIxMVwiLFxuICAgIFwic3VuZztcIjogXCJcXHUyNjZBXCIsXG4gICAgXCJTdXA7XCI6IFwiXFx1MjJEMVwiLFxuICAgIFwic3VwO1wiOiBcIlxcdTIyODNcIixcbiAgICBcInN1cDE7XCI6IFwiXFx1MDBCOVwiLFxuICAgIFwic3VwMVwiOiBcIlxcdTAwQjlcIixcbiAgICBcInN1cDI7XCI6IFwiXFx1MDBCMlwiLFxuICAgIFwic3VwMlwiOiBcIlxcdTAwQjJcIixcbiAgICBcInN1cDM7XCI6IFwiXFx1MDBCM1wiLFxuICAgIFwic3VwM1wiOiBcIlxcdTAwQjNcIixcbiAgICBcInN1cGRvdDtcIjogXCJcXHUyQUJFXCIsXG4gICAgXCJzdXBkc3ViO1wiOiBcIlxcdTJBRDhcIixcbiAgICBcInN1cEU7XCI6IFwiXFx1MkFDNlwiLFxuICAgIFwic3VwZTtcIjogXCJcXHUyMjg3XCIsXG4gICAgXCJzdXBlZG90O1wiOiBcIlxcdTJBQzRcIixcbiAgICBcIlN1cGVyc2V0O1wiOiBcIlxcdTIyODNcIixcbiAgICBcIlN1cGVyc2V0RXF1YWw7XCI6IFwiXFx1MjI4N1wiLFxuICAgIFwic3VwaHNvbDtcIjogXCJcXHUyN0M5XCIsXG4gICAgXCJzdXBoc3ViO1wiOiBcIlxcdTJBRDdcIixcbiAgICBcInN1cGxhcnI7XCI6IFwiXFx1Mjk3QlwiLFxuICAgIFwic3VwbXVsdDtcIjogXCJcXHUyQUMyXCIsXG4gICAgXCJzdXBuRTtcIjogXCJcXHUyQUNDXCIsXG4gICAgXCJzdXBuZTtcIjogXCJcXHUyMjhCXCIsXG4gICAgXCJzdXBwbHVzO1wiOiBcIlxcdTJBQzBcIixcbiAgICBcIlN1cHNldDtcIjogXCJcXHUyMkQxXCIsXG4gICAgXCJzdXBzZXQ7XCI6IFwiXFx1MjI4M1wiLFxuICAgIFwic3Vwc2V0ZXE7XCI6IFwiXFx1MjI4N1wiLFxuICAgIFwic3Vwc2V0ZXFxO1wiOiBcIlxcdTJBQzZcIixcbiAgICBcInN1cHNldG5lcTtcIjogXCJcXHUyMjhCXCIsXG4gICAgXCJzdXBzZXRuZXFxO1wiOiBcIlxcdTJBQ0NcIixcbiAgICBcInN1cHNpbTtcIjogXCJcXHUyQUM4XCIsXG4gICAgXCJzdXBzdWI7XCI6IFwiXFx1MkFENFwiLFxuICAgIFwic3Vwc3VwO1wiOiBcIlxcdTJBRDZcIixcbiAgICBcInN3YXJoaztcIjogXCJcXHUyOTI2XCIsXG4gICAgXCJzd0FycjtcIjogXCJcXHUyMUQ5XCIsXG4gICAgXCJzd2FycjtcIjogXCJcXHUyMTk5XCIsXG4gICAgXCJzd2Fycm93O1wiOiBcIlxcdTIxOTlcIixcbiAgICBcInN3bndhcjtcIjogXCJcXHUyOTJBXCIsXG4gICAgXCJzemxpZztcIjogXCJcXHUwMERGXCIsXG4gICAgXCJzemxpZ1wiOiBcIlxcdTAwREZcIixcbiAgICBcIlRhYjtcIjogXCJcXHRcIixcbiAgICBcInRhcmdldDtcIjogXCJcXHUyMzE2XCIsXG4gICAgXCJUYXU7XCI6IFwiXFx1MDNBNFwiLFxuICAgIFwidGF1O1wiOiBcIlxcdTAzQzRcIixcbiAgICBcInRicms7XCI6IFwiXFx1MjNCNFwiLFxuICAgIFwiVGNhcm9uO1wiOiBcIlxcdTAxNjRcIixcbiAgICBcInRjYXJvbjtcIjogXCJcXHUwMTY1XCIsXG4gICAgXCJUY2VkaWw7XCI6IFwiXFx1MDE2MlwiLFxuICAgIFwidGNlZGlsO1wiOiBcIlxcdTAxNjNcIixcbiAgICBcIlRjeTtcIjogXCJcXHUwNDIyXCIsXG4gICAgXCJ0Y3k7XCI6IFwiXFx1MDQ0MlwiLFxuICAgIFwidGRvdDtcIjogXCJcXHUyMERCXCIsXG4gICAgXCJ0ZWxyZWM7XCI6IFwiXFx1MjMxNVwiLFxuICAgIFwiVGZyO1wiOiBcIlxcdUQ4MzVcXHVERDE3XCIsXG4gICAgXCJ0ZnI7XCI6IFwiXFx1RDgzNVxcdUREMzFcIixcbiAgICBcInRoZXJlNDtcIjogXCJcXHUyMjM0XCIsXG4gICAgXCJUaGVyZWZvcmU7XCI6IFwiXFx1MjIzNFwiLFxuICAgIFwidGhlcmVmb3JlO1wiOiBcIlxcdTIyMzRcIixcbiAgICBcIlRoZXRhO1wiOiBcIlxcdTAzOThcIixcbiAgICBcInRoZXRhO1wiOiBcIlxcdTAzQjhcIixcbiAgICBcInRoZXRhc3ltO1wiOiBcIlxcdTAzRDFcIixcbiAgICBcInRoZXRhdjtcIjogXCJcXHUwM0QxXCIsXG4gICAgXCJ0aGlja2FwcHJveDtcIjogXCJcXHUyMjQ4XCIsXG4gICAgXCJ0aGlja3NpbTtcIjogXCJcXHUyMjNDXCIsXG4gICAgXCJUaGlja1NwYWNlO1wiOiBcIlxcdTIwNUZcXHUyMDBBXCIsXG4gICAgXCJ0aGluc3A7XCI6IFwiXFx1MjAwOVwiLFxuICAgIFwiVGhpblNwYWNlO1wiOiBcIlxcdTIwMDlcIixcbiAgICBcInRoa2FwO1wiOiBcIlxcdTIyNDhcIixcbiAgICBcInRoa3NpbTtcIjogXCJcXHUyMjNDXCIsXG4gICAgXCJUSE9STjtcIjogXCJcXHUwMERFXCIsXG4gICAgXCJUSE9STlwiOiBcIlxcdTAwREVcIixcbiAgICBcInRob3JuO1wiOiBcIlxcdTAwRkVcIixcbiAgICBcInRob3JuXCI6IFwiXFx1MDBGRVwiLFxuICAgIFwiVGlsZGU7XCI6IFwiXFx1MjIzQ1wiLFxuICAgIFwidGlsZGU7XCI6IFwiXFx1MDJEQ1wiLFxuICAgIFwiVGlsZGVFcXVhbDtcIjogXCJcXHUyMjQzXCIsXG4gICAgXCJUaWxkZUZ1bGxFcXVhbDtcIjogXCJcXHUyMjQ1XCIsXG4gICAgXCJUaWxkZVRpbGRlO1wiOiBcIlxcdTIyNDhcIixcbiAgICBcInRpbWVzO1wiOiBcIlxcdTAwRDdcIixcbiAgICBcInRpbWVzXCI6IFwiXFx1MDBEN1wiLFxuICAgIFwidGltZXNiO1wiOiBcIlxcdTIyQTBcIixcbiAgICBcInRpbWVzYmFyO1wiOiBcIlxcdTJBMzFcIixcbiAgICBcInRpbWVzZDtcIjogXCJcXHUyQTMwXCIsXG4gICAgXCJ0aW50O1wiOiBcIlxcdTIyMkRcIixcbiAgICBcInRvZWE7XCI6IFwiXFx1MjkyOFwiLFxuICAgIFwidG9wO1wiOiBcIlxcdTIyQTRcIixcbiAgICBcInRvcGJvdDtcIjogXCJcXHUyMzM2XCIsXG4gICAgXCJ0b3BjaXI7XCI6IFwiXFx1MkFGMVwiLFxuICAgIFwiVG9wZjtcIjogXCJcXHVEODM1XFx1REQ0QlwiLFxuICAgIFwidG9wZjtcIjogXCJcXHVEODM1XFx1REQ2NVwiLFxuICAgIFwidG9wZm9yaztcIjogXCJcXHUyQURBXCIsXG4gICAgXCJ0b3NhO1wiOiBcIlxcdTI5MjlcIixcbiAgICBcInRwcmltZTtcIjogXCJcXHUyMDM0XCIsXG4gICAgXCJUUkFERTtcIjogXCJcXHUyMTIyXCIsXG4gICAgXCJ0cmFkZTtcIjogXCJcXHUyMTIyXCIsXG4gICAgXCJ0cmlhbmdsZTtcIjogXCJcXHUyNUI1XCIsXG4gICAgXCJ0cmlhbmdsZWRvd247XCI6IFwiXFx1MjVCRlwiLFxuICAgIFwidHJpYW5nbGVsZWZ0O1wiOiBcIlxcdTI1QzNcIixcbiAgICBcInRyaWFuZ2xlbGVmdGVxO1wiOiBcIlxcdTIyQjRcIixcbiAgICBcInRyaWFuZ2xlcTtcIjogXCJcXHUyMjVDXCIsXG4gICAgXCJ0cmlhbmdsZXJpZ2h0O1wiOiBcIlxcdTI1QjlcIixcbiAgICBcInRyaWFuZ2xlcmlnaHRlcTtcIjogXCJcXHUyMkI1XCIsXG4gICAgXCJ0cmlkb3Q7XCI6IFwiXFx1MjVFQ1wiLFxuICAgIFwidHJpZTtcIjogXCJcXHUyMjVDXCIsXG4gICAgXCJ0cmltaW51cztcIjogXCJcXHUyQTNBXCIsXG4gICAgXCJUcmlwbGVEb3Q7XCI6IFwiXFx1MjBEQlwiLFxuICAgIFwidHJpcGx1cztcIjogXCJcXHUyQTM5XCIsXG4gICAgXCJ0cmlzYjtcIjogXCJcXHUyOUNEXCIsXG4gICAgXCJ0cml0aW1lO1wiOiBcIlxcdTJBM0JcIixcbiAgICBcInRycGV6aXVtO1wiOiBcIlxcdTIzRTJcIixcbiAgICBcIlRzY3I7XCI6IFwiXFx1RDgzNVxcdURDQUZcIixcbiAgICBcInRzY3I7XCI6IFwiXFx1RDgzNVxcdURDQzlcIixcbiAgICBcIlRTY3k7XCI6IFwiXFx1MDQyNlwiLFxuICAgIFwidHNjeTtcIjogXCJcXHUwNDQ2XCIsXG4gICAgXCJUU0hjeTtcIjogXCJcXHUwNDBCXCIsXG4gICAgXCJ0c2hjeTtcIjogXCJcXHUwNDVCXCIsXG4gICAgXCJUc3Ryb2s7XCI6IFwiXFx1MDE2NlwiLFxuICAgIFwidHN0cm9rO1wiOiBcIlxcdTAxNjdcIixcbiAgICBcInR3aXh0O1wiOiBcIlxcdTIyNkNcIixcbiAgICBcInR3b2hlYWRsZWZ0YXJyb3c7XCI6IFwiXFx1MjE5RVwiLFxuICAgIFwidHdvaGVhZHJpZ2h0YXJyb3c7XCI6IFwiXFx1MjFBMFwiLFxuICAgIFwiVWFjdXRlO1wiOiBcIlxcdTAwREFcIixcbiAgICBcIlVhY3V0ZVwiOiBcIlxcdTAwREFcIixcbiAgICBcInVhY3V0ZTtcIjogXCJcXHUwMEZBXCIsXG4gICAgXCJ1YWN1dGVcIjogXCJcXHUwMEZBXCIsXG4gICAgXCJVYXJyO1wiOiBcIlxcdTIxOUZcIixcbiAgICBcInVBcnI7XCI6IFwiXFx1MjFEMVwiLFxuICAgIFwidWFycjtcIjogXCJcXHUyMTkxXCIsXG4gICAgXCJVYXJyb2NpcjtcIjogXCJcXHUyOTQ5XCIsXG4gICAgXCJVYnJjeTtcIjogXCJcXHUwNDBFXCIsXG4gICAgXCJ1YnJjeTtcIjogXCJcXHUwNDVFXCIsXG4gICAgXCJVYnJldmU7XCI6IFwiXFx1MDE2Q1wiLFxuICAgIFwidWJyZXZlO1wiOiBcIlxcdTAxNkRcIixcbiAgICBcIlVjaXJjO1wiOiBcIlxcdTAwREJcIixcbiAgICBcIlVjaXJjXCI6IFwiXFx1MDBEQlwiLFxuICAgIFwidWNpcmM7XCI6IFwiXFx1MDBGQlwiLFxuICAgIFwidWNpcmNcIjogXCJcXHUwMEZCXCIsXG4gICAgXCJVY3k7XCI6IFwiXFx1MDQyM1wiLFxuICAgIFwidWN5O1wiOiBcIlxcdTA0NDNcIixcbiAgICBcInVkYXJyO1wiOiBcIlxcdTIxQzVcIixcbiAgICBcIlVkYmxhYztcIjogXCJcXHUwMTcwXCIsXG4gICAgXCJ1ZGJsYWM7XCI6IFwiXFx1MDE3MVwiLFxuICAgIFwidWRoYXI7XCI6IFwiXFx1Mjk2RVwiLFxuICAgIFwidWZpc2h0O1wiOiBcIlxcdTI5N0VcIixcbiAgICBcIlVmcjtcIjogXCJcXHVEODM1XFx1REQxOFwiLFxuICAgIFwidWZyO1wiOiBcIlxcdUQ4MzVcXHVERDMyXCIsXG4gICAgXCJVZ3JhdmU7XCI6IFwiXFx1MDBEOVwiLFxuICAgIFwiVWdyYXZlXCI6IFwiXFx1MDBEOVwiLFxuICAgIFwidWdyYXZlO1wiOiBcIlxcdTAwRjlcIixcbiAgICBcInVncmF2ZVwiOiBcIlxcdTAwRjlcIixcbiAgICBcInVIYXI7XCI6IFwiXFx1Mjk2M1wiLFxuICAgIFwidWhhcmw7XCI6IFwiXFx1MjFCRlwiLFxuICAgIFwidWhhcnI7XCI6IFwiXFx1MjFCRVwiLFxuICAgIFwidWhibGs7XCI6IFwiXFx1MjU4MFwiLFxuICAgIFwidWxjb3JuO1wiOiBcIlxcdTIzMUNcIixcbiAgICBcInVsY29ybmVyO1wiOiBcIlxcdTIzMUNcIixcbiAgICBcInVsY3JvcDtcIjogXCJcXHUyMzBGXCIsXG4gICAgXCJ1bHRyaTtcIjogXCJcXHUyNUY4XCIsXG4gICAgXCJVbWFjcjtcIjogXCJcXHUwMTZBXCIsXG4gICAgXCJ1bWFjcjtcIjogXCJcXHUwMTZCXCIsXG4gICAgXCJ1bWw7XCI6IFwiXFx1MDBBOFwiLFxuICAgIFwidW1sXCI6IFwiXFx1MDBBOFwiLFxuICAgIFwiVW5kZXJCYXI7XCI6IFwiX1wiLFxuICAgIFwiVW5kZXJCcmFjZTtcIjogXCJcXHUyM0RGXCIsXG4gICAgXCJVbmRlckJyYWNrZXQ7XCI6IFwiXFx1MjNCNVwiLFxuICAgIFwiVW5kZXJQYXJlbnRoZXNpcztcIjogXCJcXHUyM0REXCIsXG4gICAgXCJVbmlvbjtcIjogXCJcXHUyMkMzXCIsXG4gICAgXCJVbmlvblBsdXM7XCI6IFwiXFx1MjI4RVwiLFxuICAgIFwiVW9nb247XCI6IFwiXFx1MDE3MlwiLFxuICAgIFwidW9nb247XCI6IFwiXFx1MDE3M1wiLFxuICAgIFwiVW9wZjtcIjogXCJcXHVEODM1XFx1REQ0Q1wiLFxuICAgIFwidW9wZjtcIjogXCJcXHVEODM1XFx1REQ2NlwiLFxuICAgIFwiVXBBcnJvdztcIjogXCJcXHUyMTkxXCIsXG4gICAgXCJVcGFycm93O1wiOiBcIlxcdTIxRDFcIixcbiAgICBcInVwYXJyb3c7XCI6IFwiXFx1MjE5MVwiLFxuICAgIFwiVXBBcnJvd0JhcjtcIjogXCJcXHUyOTEyXCIsXG4gICAgXCJVcEFycm93RG93bkFycm93O1wiOiBcIlxcdTIxQzVcIixcbiAgICBcIlVwRG93bkFycm93O1wiOiBcIlxcdTIxOTVcIixcbiAgICBcIlVwZG93bmFycm93O1wiOiBcIlxcdTIxRDVcIixcbiAgICBcInVwZG93bmFycm93O1wiOiBcIlxcdTIxOTVcIixcbiAgICBcIlVwRXF1aWxpYnJpdW07XCI6IFwiXFx1Mjk2RVwiLFxuICAgIFwidXBoYXJwb29ubGVmdDtcIjogXCJcXHUyMUJGXCIsXG4gICAgXCJ1cGhhcnBvb25yaWdodDtcIjogXCJcXHUyMUJFXCIsXG4gICAgXCJ1cGx1cztcIjogXCJcXHUyMjhFXCIsXG4gICAgXCJVcHBlckxlZnRBcnJvdztcIjogXCJcXHUyMTk2XCIsXG4gICAgXCJVcHBlclJpZ2h0QXJyb3c7XCI6IFwiXFx1MjE5N1wiLFxuICAgIFwiVXBzaTtcIjogXCJcXHUwM0QyXCIsXG4gICAgXCJ1cHNpO1wiOiBcIlxcdTAzQzVcIixcbiAgICBcInVwc2loO1wiOiBcIlxcdTAzRDJcIixcbiAgICBcIlVwc2lsb247XCI6IFwiXFx1MDNBNVwiLFxuICAgIFwidXBzaWxvbjtcIjogXCJcXHUwM0M1XCIsXG4gICAgXCJVcFRlZTtcIjogXCJcXHUyMkE1XCIsXG4gICAgXCJVcFRlZUFycm93O1wiOiBcIlxcdTIxQTVcIixcbiAgICBcInVwdXBhcnJvd3M7XCI6IFwiXFx1MjFDOFwiLFxuICAgIFwidXJjb3JuO1wiOiBcIlxcdTIzMURcIixcbiAgICBcInVyY29ybmVyO1wiOiBcIlxcdTIzMURcIixcbiAgICBcInVyY3JvcDtcIjogXCJcXHUyMzBFXCIsXG4gICAgXCJVcmluZztcIjogXCJcXHUwMTZFXCIsXG4gICAgXCJ1cmluZztcIjogXCJcXHUwMTZGXCIsXG4gICAgXCJ1cnRyaTtcIjogXCJcXHUyNUY5XCIsXG4gICAgXCJVc2NyO1wiOiBcIlxcdUQ4MzVcXHVEQ0IwXCIsXG4gICAgXCJ1c2NyO1wiOiBcIlxcdUQ4MzVcXHVEQ0NBXCIsXG4gICAgXCJ1dGRvdDtcIjogXCJcXHUyMkYwXCIsXG4gICAgXCJVdGlsZGU7XCI6IFwiXFx1MDE2OFwiLFxuICAgIFwidXRpbGRlO1wiOiBcIlxcdTAxNjlcIixcbiAgICBcInV0cmk7XCI6IFwiXFx1MjVCNVwiLFxuICAgIFwidXRyaWY7XCI6IFwiXFx1MjVCNFwiLFxuICAgIFwidXVhcnI7XCI6IFwiXFx1MjFDOFwiLFxuICAgIFwiVXVtbDtcIjogXCJcXHUwMERDXCIsXG4gICAgXCJVdW1sXCI6IFwiXFx1MDBEQ1wiLFxuICAgIFwidXVtbDtcIjogXCJcXHUwMEZDXCIsXG4gICAgXCJ1dW1sXCI6IFwiXFx1MDBGQ1wiLFxuICAgIFwidXdhbmdsZTtcIjogXCJcXHUyOUE3XCIsXG4gICAgXCJ2YW5ncnQ7XCI6IFwiXFx1Mjk5Q1wiLFxuICAgIFwidmFyZXBzaWxvbjtcIjogXCJcXHUwM0Y1XCIsXG4gICAgXCJ2YXJrYXBwYTtcIjogXCJcXHUwM0YwXCIsXG4gICAgXCJ2YXJub3RoaW5nO1wiOiBcIlxcdTIyMDVcIixcbiAgICBcInZhcnBoaTtcIjogXCJcXHUwM0Q1XCIsXG4gICAgXCJ2YXJwaTtcIjogXCJcXHUwM0Q2XCIsXG4gICAgXCJ2YXJwcm9wdG87XCI6IFwiXFx1MjIxRFwiLFxuICAgIFwidkFycjtcIjogXCJcXHUyMUQ1XCIsXG4gICAgXCJ2YXJyO1wiOiBcIlxcdTIxOTVcIixcbiAgICBcInZhcnJobztcIjogXCJcXHUwM0YxXCIsXG4gICAgXCJ2YXJzaWdtYTtcIjogXCJcXHUwM0MyXCIsXG4gICAgXCJ2YXJzdWJzZXRuZXE7XCI6IFwiXFx1MjI4QVxcdUZFMDBcIixcbiAgICBcInZhcnN1YnNldG5lcXE7XCI6IFwiXFx1MkFDQlxcdUZFMDBcIixcbiAgICBcInZhcnN1cHNldG5lcTtcIjogXCJcXHUyMjhCXFx1RkUwMFwiLFxuICAgIFwidmFyc3Vwc2V0bmVxcTtcIjogXCJcXHUyQUNDXFx1RkUwMFwiLFxuICAgIFwidmFydGhldGE7XCI6IFwiXFx1MDNEMVwiLFxuICAgIFwidmFydHJpYW5nbGVsZWZ0O1wiOiBcIlxcdTIyQjJcIixcbiAgICBcInZhcnRyaWFuZ2xlcmlnaHQ7XCI6IFwiXFx1MjJCM1wiLFxuICAgIFwiVmJhcjtcIjogXCJcXHUyQUVCXCIsXG4gICAgXCJ2QmFyO1wiOiBcIlxcdTJBRThcIixcbiAgICBcInZCYXJ2O1wiOiBcIlxcdTJBRTlcIixcbiAgICBcIlZjeTtcIjogXCJcXHUwNDEyXCIsXG4gICAgXCJ2Y3k7XCI6IFwiXFx1MDQzMlwiLFxuICAgIFwiVkRhc2g7XCI6IFwiXFx1MjJBQlwiLFxuICAgIFwiVmRhc2g7XCI6IFwiXFx1MjJBOVwiLFxuICAgIFwidkRhc2g7XCI6IFwiXFx1MjJBOFwiLFxuICAgIFwidmRhc2g7XCI6IFwiXFx1MjJBMlwiLFxuICAgIFwiVmRhc2hsO1wiOiBcIlxcdTJBRTZcIixcbiAgICBcIlZlZTtcIjogXCJcXHUyMkMxXCIsXG4gICAgXCJ2ZWU7XCI6IFwiXFx1MjIyOFwiLFxuICAgIFwidmVlYmFyO1wiOiBcIlxcdTIyQkJcIixcbiAgICBcInZlZWVxO1wiOiBcIlxcdTIyNUFcIixcbiAgICBcInZlbGxpcDtcIjogXCJcXHUyMkVFXCIsXG4gICAgXCJWZXJiYXI7XCI6IFwiXFx1MjAxNlwiLFxuICAgIFwidmVyYmFyO1wiOiBcInxcIixcbiAgICBcIlZlcnQ7XCI6IFwiXFx1MjAxNlwiLFxuICAgIFwidmVydDtcIjogXCJ8XCIsXG4gICAgXCJWZXJ0aWNhbEJhcjtcIjogXCJcXHUyMjIzXCIsXG4gICAgXCJWZXJ0aWNhbExpbmU7XCI6IFwifFwiLFxuICAgIFwiVmVydGljYWxTZXBhcmF0b3I7XCI6IFwiXFx1Mjc1OFwiLFxuICAgIFwiVmVydGljYWxUaWxkZTtcIjogXCJcXHUyMjQwXCIsXG4gICAgXCJWZXJ5VGhpblNwYWNlO1wiOiBcIlxcdTIwMEFcIixcbiAgICBcIlZmcjtcIjogXCJcXHVEODM1XFx1REQxOVwiLFxuICAgIFwidmZyO1wiOiBcIlxcdUQ4MzVcXHVERDMzXCIsXG4gICAgXCJ2bHRyaTtcIjogXCJcXHUyMkIyXCIsXG4gICAgXCJ2bnN1YjtcIjogXCJcXHUyMjgyXFx1MjBEMlwiLFxuICAgIFwidm5zdXA7XCI6IFwiXFx1MjI4M1xcdTIwRDJcIixcbiAgICBcIlZvcGY7XCI6IFwiXFx1RDgzNVxcdURENERcIixcbiAgICBcInZvcGY7XCI6IFwiXFx1RDgzNVxcdURENjdcIixcbiAgICBcInZwcm9wO1wiOiBcIlxcdTIyMURcIixcbiAgICBcInZydHJpO1wiOiBcIlxcdTIyQjNcIixcbiAgICBcIlZzY3I7XCI6IFwiXFx1RDgzNVxcdURDQjFcIixcbiAgICBcInZzY3I7XCI6IFwiXFx1RDgzNVxcdURDQ0JcIixcbiAgICBcInZzdWJuRTtcIjogXCJcXHUyQUNCXFx1RkUwMFwiLFxuICAgIFwidnN1Ym5lO1wiOiBcIlxcdTIyOEFcXHVGRTAwXCIsXG4gICAgXCJ2c3VwbkU7XCI6IFwiXFx1MkFDQ1xcdUZFMDBcIixcbiAgICBcInZzdXBuZTtcIjogXCJcXHUyMjhCXFx1RkUwMFwiLFxuICAgIFwiVnZkYXNoO1wiOiBcIlxcdTIyQUFcIixcbiAgICBcInZ6aWd6YWc7XCI6IFwiXFx1Mjk5QVwiLFxuICAgIFwiV2NpcmM7XCI6IFwiXFx1MDE3NFwiLFxuICAgIFwid2NpcmM7XCI6IFwiXFx1MDE3NVwiLFxuICAgIFwid2VkYmFyO1wiOiBcIlxcdTJBNUZcIixcbiAgICBcIldlZGdlO1wiOiBcIlxcdTIyQzBcIixcbiAgICBcIndlZGdlO1wiOiBcIlxcdTIyMjdcIixcbiAgICBcIndlZGdlcTtcIjogXCJcXHUyMjU5XCIsXG4gICAgXCJ3ZWllcnA7XCI6IFwiXFx1MjExOFwiLFxuICAgIFwiV2ZyO1wiOiBcIlxcdUQ4MzVcXHVERDFBXCIsXG4gICAgXCJ3ZnI7XCI6IFwiXFx1RDgzNVxcdUREMzRcIixcbiAgICBcIldvcGY7XCI6IFwiXFx1RDgzNVxcdURENEVcIixcbiAgICBcIndvcGY7XCI6IFwiXFx1RDgzNVxcdURENjhcIixcbiAgICBcIndwO1wiOiBcIlxcdTIxMThcIixcbiAgICBcIndyO1wiOiBcIlxcdTIyNDBcIixcbiAgICBcIndyZWF0aDtcIjogXCJcXHUyMjQwXCIsXG4gICAgXCJXc2NyO1wiOiBcIlxcdUQ4MzVcXHVEQ0IyXCIsXG4gICAgXCJ3c2NyO1wiOiBcIlxcdUQ4MzVcXHVEQ0NDXCIsXG4gICAgXCJ4Y2FwO1wiOiBcIlxcdTIyQzJcIixcbiAgICBcInhjaXJjO1wiOiBcIlxcdTI1RUZcIixcbiAgICBcInhjdXA7XCI6IFwiXFx1MjJDM1wiLFxuICAgIFwieGR0cmk7XCI6IFwiXFx1MjVCRFwiLFxuICAgIFwiWGZyO1wiOiBcIlxcdUQ4MzVcXHVERDFCXCIsXG4gICAgXCJ4ZnI7XCI6IFwiXFx1RDgzNVxcdUREMzVcIixcbiAgICBcInhoQXJyO1wiOiBcIlxcdTI3RkFcIixcbiAgICBcInhoYXJyO1wiOiBcIlxcdTI3RjdcIixcbiAgICBcIlhpO1wiOiBcIlxcdTAzOUVcIixcbiAgICBcInhpO1wiOiBcIlxcdTAzQkVcIixcbiAgICBcInhsQXJyO1wiOiBcIlxcdTI3RjhcIixcbiAgICBcInhsYXJyO1wiOiBcIlxcdTI3RjVcIixcbiAgICBcInhtYXA7XCI6IFwiXFx1MjdGQ1wiLFxuICAgIFwieG5pcztcIjogXCJcXHUyMkZCXCIsXG4gICAgXCJ4b2RvdDtcIjogXCJcXHUyQTAwXCIsXG4gICAgXCJYb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDRGXCIsXG4gICAgXCJ4b3BmO1wiOiBcIlxcdUQ4MzVcXHVERDY5XCIsXG4gICAgXCJ4b3BsdXM7XCI6IFwiXFx1MkEwMVwiLFxuICAgIFwieG90aW1lO1wiOiBcIlxcdTJBMDJcIixcbiAgICBcInhyQXJyO1wiOiBcIlxcdTI3RjlcIixcbiAgICBcInhyYXJyO1wiOiBcIlxcdTI3RjZcIixcbiAgICBcIlhzY3I7XCI6IFwiXFx1RDgzNVxcdURDQjNcIixcbiAgICBcInhzY3I7XCI6IFwiXFx1RDgzNVxcdURDQ0RcIixcbiAgICBcInhzcWN1cDtcIjogXCJcXHUyQTA2XCIsXG4gICAgXCJ4dXBsdXM7XCI6IFwiXFx1MkEwNFwiLFxuICAgIFwieHV0cmk7XCI6IFwiXFx1MjVCM1wiLFxuICAgIFwieHZlZTtcIjogXCJcXHUyMkMxXCIsXG4gICAgXCJ4d2VkZ2U7XCI6IFwiXFx1MjJDMFwiLFxuICAgIFwiWWFjdXRlO1wiOiBcIlxcdTAwRERcIixcbiAgICBcIllhY3V0ZVwiOiBcIlxcdTAwRERcIixcbiAgICBcInlhY3V0ZTtcIjogXCJcXHUwMEZEXCIsXG4gICAgXCJ5YWN1dGVcIjogXCJcXHUwMEZEXCIsXG4gICAgXCJZQWN5O1wiOiBcIlxcdTA0MkZcIixcbiAgICBcInlhY3k7XCI6IFwiXFx1MDQ0RlwiLFxuICAgIFwiWWNpcmM7XCI6IFwiXFx1MDE3NlwiLFxuICAgIFwieWNpcmM7XCI6IFwiXFx1MDE3N1wiLFxuICAgIFwiWWN5O1wiOiBcIlxcdTA0MkJcIixcbiAgICBcInljeTtcIjogXCJcXHUwNDRCXCIsXG4gICAgXCJ5ZW47XCI6IFwiXFx1MDBBNVwiLFxuICAgIFwieWVuXCI6IFwiXFx1MDBBNVwiLFxuICAgIFwiWWZyO1wiOiBcIlxcdUQ4MzVcXHVERDFDXCIsXG4gICAgXCJ5ZnI7XCI6IFwiXFx1RDgzNVxcdUREMzZcIixcbiAgICBcIllJY3k7XCI6IFwiXFx1MDQwN1wiLFxuICAgIFwieWljeTtcIjogXCJcXHUwNDU3XCIsXG4gICAgXCJZb3BmO1wiOiBcIlxcdUQ4MzVcXHVERDUwXCIsXG4gICAgXCJ5b3BmO1wiOiBcIlxcdUQ4MzVcXHVERDZBXCIsXG4gICAgXCJZc2NyO1wiOiBcIlxcdUQ4MzVcXHVEQ0I0XCIsXG4gICAgXCJ5c2NyO1wiOiBcIlxcdUQ4MzVcXHVEQ0NFXCIsXG4gICAgXCJZVWN5O1wiOiBcIlxcdTA0MkVcIixcbiAgICBcInl1Y3k7XCI6IFwiXFx1MDQ0RVwiLFxuICAgIFwiWXVtbDtcIjogXCJcXHUwMTc4XCIsXG4gICAgXCJ5dW1sO1wiOiBcIlxcdTAwRkZcIixcbiAgICBcInl1bWxcIjogXCJcXHUwMEZGXCIsXG4gICAgXCJaYWN1dGU7XCI6IFwiXFx1MDE3OVwiLFxuICAgIFwiemFjdXRlO1wiOiBcIlxcdTAxN0FcIixcbiAgICBcIlpjYXJvbjtcIjogXCJcXHUwMTdEXCIsXG4gICAgXCJ6Y2Fyb247XCI6IFwiXFx1MDE3RVwiLFxuICAgIFwiWmN5O1wiOiBcIlxcdTA0MTdcIixcbiAgICBcInpjeTtcIjogXCJcXHUwNDM3XCIsXG4gICAgXCJaZG90O1wiOiBcIlxcdTAxN0JcIixcbiAgICBcInpkb3Q7XCI6IFwiXFx1MDE3Q1wiLFxuICAgIFwiemVldHJmO1wiOiBcIlxcdTIxMjhcIixcbiAgICBcIlplcm9XaWR0aFNwYWNlO1wiOiBcIlxcdTIwMEJcIixcbiAgICBcIlpldGE7XCI6IFwiXFx1MDM5NlwiLFxuICAgIFwiemV0YTtcIjogXCJcXHUwM0I2XCIsXG4gICAgXCJaZnI7XCI6IFwiXFx1MjEyOFwiLFxuICAgIFwiemZyO1wiOiBcIlxcdUQ4MzVcXHVERDM3XCIsXG4gICAgXCJaSGN5O1wiOiBcIlxcdTA0MTZcIixcbiAgICBcInpoY3k7XCI6IFwiXFx1MDQzNlwiLFxuICAgIFwiemlncmFycjtcIjogXCJcXHUyMUREXCIsXG4gICAgXCJab3BmO1wiOiBcIlxcdTIxMjRcIixcbiAgICBcInpvcGY7XCI6IFwiXFx1RDgzNVxcdURENkJcIixcbiAgICBcIlpzY3I7XCI6IFwiXFx1RDgzNVxcdURDQjVcIixcbiAgICBcInpzY3I7XCI6IFwiXFx1RDgzNVxcdURDQ0ZcIixcbiAgICBcInp3ajtcIjogXCJcXHUyMDBEXCIsXG4gICAgXCJ6d25qO1wiOiBcIlxcdTIwMENcIlxufSIsImV4cG9ydHMuZW5jb2RlID0gcmVxdWlyZSgnLi9lbmNvZGUnKTtcbmV4cG9ydHMuZGVjb2RlID0gcmVxdWlyZSgnLi9kZWNvZGUnKTtcbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgICBcIjlcIjogXCJUYWI7XCIsXG4gICAgXCIxMFwiOiBcIk5ld0xpbmU7XCIsXG4gICAgXCIzM1wiOiBcImV4Y2w7XCIsXG4gICAgXCIzNFwiOiBcInF1b3Q7XCIsXG4gICAgXCIzNVwiOiBcIm51bTtcIixcbiAgICBcIjM2XCI6IFwiZG9sbGFyO1wiLFxuICAgIFwiMzdcIjogXCJwZXJjbnQ7XCIsXG4gICAgXCIzOFwiOiBcImFtcDtcIixcbiAgICBcIjM5XCI6IFwiYXBvcztcIixcbiAgICBcIjQwXCI6IFwibHBhcjtcIixcbiAgICBcIjQxXCI6IFwicnBhcjtcIixcbiAgICBcIjQyXCI6IFwibWlkYXN0O1wiLFxuICAgIFwiNDNcIjogXCJwbHVzO1wiLFxuICAgIFwiNDRcIjogXCJjb21tYTtcIixcbiAgICBcIjQ2XCI6IFwicGVyaW9kO1wiLFxuICAgIFwiNDdcIjogXCJzb2w7XCIsXG4gICAgXCI1OFwiOiBcImNvbG9uO1wiLFxuICAgIFwiNTlcIjogXCJzZW1pO1wiLFxuICAgIFwiNjBcIjogXCJsdDtcIixcbiAgICBcIjYxXCI6IFwiZXF1YWxzO1wiLFxuICAgIFwiNjJcIjogXCJndDtcIixcbiAgICBcIjYzXCI6IFwicXVlc3Q7XCIsXG4gICAgXCI2NFwiOiBcImNvbW1hdDtcIixcbiAgICBcIjkxXCI6IFwibHNxYjtcIixcbiAgICBcIjkyXCI6IFwiYnNvbDtcIixcbiAgICBcIjkzXCI6IFwicnNxYjtcIixcbiAgICBcIjk0XCI6IFwiSGF0O1wiLFxuICAgIFwiOTVcIjogXCJVbmRlckJhcjtcIixcbiAgICBcIjk2XCI6IFwiZ3JhdmU7XCIsXG4gICAgXCIxMjNcIjogXCJsY3ViO1wiLFxuICAgIFwiMTI0XCI6IFwiVmVydGljYWxMaW5lO1wiLFxuICAgIFwiMTI1XCI6IFwicmN1YjtcIixcbiAgICBcIjE2MFwiOiBcIk5vbkJyZWFraW5nU3BhY2U7XCIsXG4gICAgXCIxNjFcIjogXCJpZXhjbDtcIixcbiAgICBcIjE2MlwiOiBcImNlbnQ7XCIsXG4gICAgXCIxNjNcIjogXCJwb3VuZDtcIixcbiAgICBcIjE2NFwiOiBcImN1cnJlbjtcIixcbiAgICBcIjE2NVwiOiBcInllbjtcIixcbiAgICBcIjE2NlwiOiBcImJydmJhcjtcIixcbiAgICBcIjE2N1wiOiBcInNlY3Q7XCIsXG4gICAgXCIxNjhcIjogXCJ1bWw7XCIsXG4gICAgXCIxNjlcIjogXCJjb3B5O1wiLFxuICAgIFwiMTcwXCI6IFwib3JkZjtcIixcbiAgICBcIjE3MVwiOiBcImxhcXVvO1wiLFxuICAgIFwiMTcyXCI6IFwibm90O1wiLFxuICAgIFwiMTczXCI6IFwic2h5O1wiLFxuICAgIFwiMTc0XCI6IFwicmVnO1wiLFxuICAgIFwiMTc1XCI6IFwic3RybnM7XCIsXG4gICAgXCIxNzZcIjogXCJkZWc7XCIsXG4gICAgXCIxNzdcIjogXCJwbTtcIixcbiAgICBcIjE3OFwiOiBcInN1cDI7XCIsXG4gICAgXCIxNzlcIjogXCJzdXAzO1wiLFxuICAgIFwiMTgwXCI6IFwiRGlhY3JpdGljYWxBY3V0ZTtcIixcbiAgICBcIjE4MVwiOiBcIm1pY3JvO1wiLFxuICAgIFwiMTgyXCI6IFwicGFyYTtcIixcbiAgICBcIjE4M1wiOiBcIm1pZGRvdDtcIixcbiAgICBcIjE4NFwiOiBcIkNlZGlsbGE7XCIsXG4gICAgXCIxODVcIjogXCJzdXAxO1wiLFxuICAgIFwiMTg2XCI6IFwib3JkbTtcIixcbiAgICBcIjE4N1wiOiBcInJhcXVvO1wiLFxuICAgIFwiMTg4XCI6IFwiZnJhYzE0O1wiLFxuICAgIFwiMTg5XCI6IFwiaGFsZjtcIixcbiAgICBcIjE5MFwiOiBcImZyYWMzNDtcIixcbiAgICBcIjE5MVwiOiBcImlxdWVzdDtcIixcbiAgICBcIjE5MlwiOiBcIkFncmF2ZTtcIixcbiAgICBcIjE5M1wiOiBcIkFhY3V0ZTtcIixcbiAgICBcIjE5NFwiOiBcIkFjaXJjO1wiLFxuICAgIFwiMTk1XCI6IFwiQXRpbGRlO1wiLFxuICAgIFwiMTk2XCI6IFwiQXVtbDtcIixcbiAgICBcIjE5N1wiOiBcIkFyaW5nO1wiLFxuICAgIFwiMTk4XCI6IFwiQUVsaWc7XCIsXG4gICAgXCIxOTlcIjogXCJDY2VkaWw7XCIsXG4gICAgXCIyMDBcIjogXCJFZ3JhdmU7XCIsXG4gICAgXCIyMDFcIjogXCJFYWN1dGU7XCIsXG4gICAgXCIyMDJcIjogXCJFY2lyYztcIixcbiAgICBcIjIwM1wiOiBcIkV1bWw7XCIsXG4gICAgXCIyMDRcIjogXCJJZ3JhdmU7XCIsXG4gICAgXCIyMDVcIjogXCJJYWN1dGU7XCIsXG4gICAgXCIyMDZcIjogXCJJY2lyYztcIixcbiAgICBcIjIwN1wiOiBcIkl1bWw7XCIsXG4gICAgXCIyMDhcIjogXCJFVEg7XCIsXG4gICAgXCIyMDlcIjogXCJOdGlsZGU7XCIsXG4gICAgXCIyMTBcIjogXCJPZ3JhdmU7XCIsXG4gICAgXCIyMTFcIjogXCJPYWN1dGU7XCIsXG4gICAgXCIyMTJcIjogXCJPY2lyYztcIixcbiAgICBcIjIxM1wiOiBcIk90aWxkZTtcIixcbiAgICBcIjIxNFwiOiBcIk91bWw7XCIsXG4gICAgXCIyMTVcIjogXCJ0aW1lcztcIixcbiAgICBcIjIxNlwiOiBcIk9zbGFzaDtcIixcbiAgICBcIjIxN1wiOiBcIlVncmF2ZTtcIixcbiAgICBcIjIxOFwiOiBcIlVhY3V0ZTtcIixcbiAgICBcIjIxOVwiOiBcIlVjaXJjO1wiLFxuICAgIFwiMjIwXCI6IFwiVXVtbDtcIixcbiAgICBcIjIyMVwiOiBcIllhY3V0ZTtcIixcbiAgICBcIjIyMlwiOiBcIlRIT1JOO1wiLFxuICAgIFwiMjIzXCI6IFwic3psaWc7XCIsXG4gICAgXCIyMjRcIjogXCJhZ3JhdmU7XCIsXG4gICAgXCIyMjVcIjogXCJhYWN1dGU7XCIsXG4gICAgXCIyMjZcIjogXCJhY2lyYztcIixcbiAgICBcIjIyN1wiOiBcImF0aWxkZTtcIixcbiAgICBcIjIyOFwiOiBcImF1bWw7XCIsXG4gICAgXCIyMjlcIjogXCJhcmluZztcIixcbiAgICBcIjIzMFwiOiBcImFlbGlnO1wiLFxuICAgIFwiMjMxXCI6IFwiY2NlZGlsO1wiLFxuICAgIFwiMjMyXCI6IFwiZWdyYXZlO1wiLFxuICAgIFwiMjMzXCI6IFwiZWFjdXRlO1wiLFxuICAgIFwiMjM0XCI6IFwiZWNpcmM7XCIsXG4gICAgXCIyMzVcIjogXCJldW1sO1wiLFxuICAgIFwiMjM2XCI6IFwiaWdyYXZlO1wiLFxuICAgIFwiMjM3XCI6IFwiaWFjdXRlO1wiLFxuICAgIFwiMjM4XCI6IFwiaWNpcmM7XCIsXG4gICAgXCIyMzlcIjogXCJpdW1sO1wiLFxuICAgIFwiMjQwXCI6IFwiZXRoO1wiLFxuICAgIFwiMjQxXCI6IFwibnRpbGRlO1wiLFxuICAgIFwiMjQyXCI6IFwib2dyYXZlO1wiLFxuICAgIFwiMjQzXCI6IFwib2FjdXRlO1wiLFxuICAgIFwiMjQ0XCI6IFwib2NpcmM7XCIsXG4gICAgXCIyNDVcIjogXCJvdGlsZGU7XCIsXG4gICAgXCIyNDZcIjogXCJvdW1sO1wiLFxuICAgIFwiMjQ3XCI6IFwiZGl2aWRlO1wiLFxuICAgIFwiMjQ4XCI6IFwib3NsYXNoO1wiLFxuICAgIFwiMjQ5XCI6IFwidWdyYXZlO1wiLFxuICAgIFwiMjUwXCI6IFwidWFjdXRlO1wiLFxuICAgIFwiMjUxXCI6IFwidWNpcmM7XCIsXG4gICAgXCIyNTJcIjogXCJ1dW1sO1wiLFxuICAgIFwiMjUzXCI6IFwieWFjdXRlO1wiLFxuICAgIFwiMjU0XCI6IFwidGhvcm47XCIsXG4gICAgXCIyNTVcIjogXCJ5dW1sO1wiLFxuICAgIFwiMjU2XCI6IFwiQW1hY3I7XCIsXG4gICAgXCIyNTdcIjogXCJhbWFjcjtcIixcbiAgICBcIjI1OFwiOiBcIkFicmV2ZTtcIixcbiAgICBcIjI1OVwiOiBcImFicmV2ZTtcIixcbiAgICBcIjI2MFwiOiBcIkFvZ29uO1wiLFxuICAgIFwiMjYxXCI6IFwiYW9nb247XCIsXG4gICAgXCIyNjJcIjogXCJDYWN1dGU7XCIsXG4gICAgXCIyNjNcIjogXCJjYWN1dGU7XCIsXG4gICAgXCIyNjRcIjogXCJDY2lyYztcIixcbiAgICBcIjI2NVwiOiBcImNjaXJjO1wiLFxuICAgIFwiMjY2XCI6IFwiQ2RvdDtcIixcbiAgICBcIjI2N1wiOiBcImNkb3Q7XCIsXG4gICAgXCIyNjhcIjogXCJDY2Fyb247XCIsXG4gICAgXCIyNjlcIjogXCJjY2Fyb247XCIsXG4gICAgXCIyNzBcIjogXCJEY2Fyb247XCIsXG4gICAgXCIyNzFcIjogXCJkY2Fyb247XCIsXG4gICAgXCIyNzJcIjogXCJEc3Ryb2s7XCIsXG4gICAgXCIyNzNcIjogXCJkc3Ryb2s7XCIsXG4gICAgXCIyNzRcIjogXCJFbWFjcjtcIixcbiAgICBcIjI3NVwiOiBcImVtYWNyO1wiLFxuICAgIFwiMjc4XCI6IFwiRWRvdDtcIixcbiAgICBcIjI3OVwiOiBcImVkb3Q7XCIsXG4gICAgXCIyODBcIjogXCJFb2dvbjtcIixcbiAgICBcIjI4MVwiOiBcImVvZ29uO1wiLFxuICAgIFwiMjgyXCI6IFwiRWNhcm9uO1wiLFxuICAgIFwiMjgzXCI6IFwiZWNhcm9uO1wiLFxuICAgIFwiMjg0XCI6IFwiR2NpcmM7XCIsXG4gICAgXCIyODVcIjogXCJnY2lyYztcIixcbiAgICBcIjI4NlwiOiBcIkdicmV2ZTtcIixcbiAgICBcIjI4N1wiOiBcImdicmV2ZTtcIixcbiAgICBcIjI4OFwiOiBcIkdkb3Q7XCIsXG4gICAgXCIyODlcIjogXCJnZG90O1wiLFxuICAgIFwiMjkwXCI6IFwiR2NlZGlsO1wiLFxuICAgIFwiMjkyXCI6IFwiSGNpcmM7XCIsXG4gICAgXCIyOTNcIjogXCJoY2lyYztcIixcbiAgICBcIjI5NFwiOiBcIkhzdHJvaztcIixcbiAgICBcIjI5NVwiOiBcImhzdHJvaztcIixcbiAgICBcIjI5NlwiOiBcIkl0aWxkZTtcIixcbiAgICBcIjI5N1wiOiBcIml0aWxkZTtcIixcbiAgICBcIjI5OFwiOiBcIkltYWNyO1wiLFxuICAgIFwiMjk5XCI6IFwiaW1hY3I7XCIsXG4gICAgXCIzMDJcIjogXCJJb2dvbjtcIixcbiAgICBcIjMwM1wiOiBcImlvZ29uO1wiLFxuICAgIFwiMzA0XCI6IFwiSWRvdDtcIixcbiAgICBcIjMwNVwiOiBcImlub2RvdDtcIixcbiAgICBcIjMwNlwiOiBcIklKbGlnO1wiLFxuICAgIFwiMzA3XCI6IFwiaWpsaWc7XCIsXG4gICAgXCIzMDhcIjogXCJKY2lyYztcIixcbiAgICBcIjMwOVwiOiBcImpjaXJjO1wiLFxuICAgIFwiMzEwXCI6IFwiS2NlZGlsO1wiLFxuICAgIFwiMzExXCI6IFwia2NlZGlsO1wiLFxuICAgIFwiMzEyXCI6IFwia2dyZWVuO1wiLFxuICAgIFwiMzEzXCI6IFwiTGFjdXRlO1wiLFxuICAgIFwiMzE0XCI6IFwibGFjdXRlO1wiLFxuICAgIFwiMzE1XCI6IFwiTGNlZGlsO1wiLFxuICAgIFwiMzE2XCI6IFwibGNlZGlsO1wiLFxuICAgIFwiMzE3XCI6IFwiTGNhcm9uO1wiLFxuICAgIFwiMzE4XCI6IFwibGNhcm9uO1wiLFxuICAgIFwiMzE5XCI6IFwiTG1pZG90O1wiLFxuICAgIFwiMzIwXCI6IFwibG1pZG90O1wiLFxuICAgIFwiMzIxXCI6IFwiTHN0cm9rO1wiLFxuICAgIFwiMzIyXCI6IFwibHN0cm9rO1wiLFxuICAgIFwiMzIzXCI6IFwiTmFjdXRlO1wiLFxuICAgIFwiMzI0XCI6IFwibmFjdXRlO1wiLFxuICAgIFwiMzI1XCI6IFwiTmNlZGlsO1wiLFxuICAgIFwiMzI2XCI6IFwibmNlZGlsO1wiLFxuICAgIFwiMzI3XCI6IFwiTmNhcm9uO1wiLFxuICAgIFwiMzI4XCI6IFwibmNhcm9uO1wiLFxuICAgIFwiMzI5XCI6IFwibmFwb3M7XCIsXG4gICAgXCIzMzBcIjogXCJFTkc7XCIsXG4gICAgXCIzMzFcIjogXCJlbmc7XCIsXG4gICAgXCIzMzJcIjogXCJPbWFjcjtcIixcbiAgICBcIjMzM1wiOiBcIm9tYWNyO1wiLFxuICAgIFwiMzM2XCI6IFwiT2RibGFjO1wiLFxuICAgIFwiMzM3XCI6IFwib2RibGFjO1wiLFxuICAgIFwiMzM4XCI6IFwiT0VsaWc7XCIsXG4gICAgXCIzMzlcIjogXCJvZWxpZztcIixcbiAgICBcIjM0MFwiOiBcIlJhY3V0ZTtcIixcbiAgICBcIjM0MVwiOiBcInJhY3V0ZTtcIixcbiAgICBcIjM0MlwiOiBcIlJjZWRpbDtcIixcbiAgICBcIjM0M1wiOiBcInJjZWRpbDtcIixcbiAgICBcIjM0NFwiOiBcIlJjYXJvbjtcIixcbiAgICBcIjM0NVwiOiBcInJjYXJvbjtcIixcbiAgICBcIjM0NlwiOiBcIlNhY3V0ZTtcIixcbiAgICBcIjM0N1wiOiBcInNhY3V0ZTtcIixcbiAgICBcIjM0OFwiOiBcIlNjaXJjO1wiLFxuICAgIFwiMzQ5XCI6IFwic2NpcmM7XCIsXG4gICAgXCIzNTBcIjogXCJTY2VkaWw7XCIsXG4gICAgXCIzNTFcIjogXCJzY2VkaWw7XCIsXG4gICAgXCIzNTJcIjogXCJTY2Fyb247XCIsXG4gICAgXCIzNTNcIjogXCJzY2Fyb247XCIsXG4gICAgXCIzNTRcIjogXCJUY2VkaWw7XCIsXG4gICAgXCIzNTVcIjogXCJ0Y2VkaWw7XCIsXG4gICAgXCIzNTZcIjogXCJUY2Fyb247XCIsXG4gICAgXCIzNTdcIjogXCJ0Y2Fyb247XCIsXG4gICAgXCIzNThcIjogXCJUc3Ryb2s7XCIsXG4gICAgXCIzNTlcIjogXCJ0c3Ryb2s7XCIsXG4gICAgXCIzNjBcIjogXCJVdGlsZGU7XCIsXG4gICAgXCIzNjFcIjogXCJ1dGlsZGU7XCIsXG4gICAgXCIzNjJcIjogXCJVbWFjcjtcIixcbiAgICBcIjM2M1wiOiBcInVtYWNyO1wiLFxuICAgIFwiMzY0XCI6IFwiVWJyZXZlO1wiLFxuICAgIFwiMzY1XCI6IFwidWJyZXZlO1wiLFxuICAgIFwiMzY2XCI6IFwiVXJpbmc7XCIsXG4gICAgXCIzNjdcIjogXCJ1cmluZztcIixcbiAgICBcIjM2OFwiOiBcIlVkYmxhYztcIixcbiAgICBcIjM2OVwiOiBcInVkYmxhYztcIixcbiAgICBcIjM3MFwiOiBcIlVvZ29uO1wiLFxuICAgIFwiMzcxXCI6IFwidW9nb247XCIsXG4gICAgXCIzNzJcIjogXCJXY2lyYztcIixcbiAgICBcIjM3M1wiOiBcIndjaXJjO1wiLFxuICAgIFwiMzc0XCI6IFwiWWNpcmM7XCIsXG4gICAgXCIzNzVcIjogXCJ5Y2lyYztcIixcbiAgICBcIjM3NlwiOiBcIll1bWw7XCIsXG4gICAgXCIzNzdcIjogXCJaYWN1dGU7XCIsXG4gICAgXCIzNzhcIjogXCJ6YWN1dGU7XCIsXG4gICAgXCIzNzlcIjogXCJaZG90O1wiLFxuICAgIFwiMzgwXCI6IFwiemRvdDtcIixcbiAgICBcIjM4MVwiOiBcIlpjYXJvbjtcIixcbiAgICBcIjM4MlwiOiBcInpjYXJvbjtcIixcbiAgICBcIjQwMlwiOiBcImZub2Y7XCIsXG4gICAgXCI0MzdcIjogXCJpbXBlZDtcIixcbiAgICBcIjUwMVwiOiBcImdhY3V0ZTtcIixcbiAgICBcIjU2N1wiOiBcImptYXRoO1wiLFxuICAgIFwiNzEwXCI6IFwiY2lyYztcIixcbiAgICBcIjcxMVwiOiBcIkhhY2VrO1wiLFxuICAgIFwiNzI4XCI6IFwiYnJldmU7XCIsXG4gICAgXCI3MjlcIjogXCJkb3Q7XCIsXG4gICAgXCI3MzBcIjogXCJyaW5nO1wiLFxuICAgIFwiNzMxXCI6IFwib2dvbjtcIixcbiAgICBcIjczMlwiOiBcInRpbGRlO1wiLFxuICAgIFwiNzMzXCI6IFwiRGlhY3JpdGljYWxEb3VibGVBY3V0ZTtcIixcbiAgICBcIjc4NVwiOiBcIkRvd25CcmV2ZTtcIixcbiAgICBcIjkxM1wiOiBcIkFscGhhO1wiLFxuICAgIFwiOTE0XCI6IFwiQmV0YTtcIixcbiAgICBcIjkxNVwiOiBcIkdhbW1hO1wiLFxuICAgIFwiOTE2XCI6IFwiRGVsdGE7XCIsXG4gICAgXCI5MTdcIjogXCJFcHNpbG9uO1wiLFxuICAgIFwiOTE4XCI6IFwiWmV0YTtcIixcbiAgICBcIjkxOVwiOiBcIkV0YTtcIixcbiAgICBcIjkyMFwiOiBcIlRoZXRhO1wiLFxuICAgIFwiOTIxXCI6IFwiSW90YTtcIixcbiAgICBcIjkyMlwiOiBcIkthcHBhO1wiLFxuICAgIFwiOTIzXCI6IFwiTGFtYmRhO1wiLFxuICAgIFwiOTI0XCI6IFwiTXU7XCIsXG4gICAgXCI5MjVcIjogXCJOdTtcIixcbiAgICBcIjkyNlwiOiBcIlhpO1wiLFxuICAgIFwiOTI3XCI6IFwiT21pY3JvbjtcIixcbiAgICBcIjkyOFwiOiBcIlBpO1wiLFxuICAgIFwiOTI5XCI6IFwiUmhvO1wiLFxuICAgIFwiOTMxXCI6IFwiU2lnbWE7XCIsXG4gICAgXCI5MzJcIjogXCJUYXU7XCIsXG4gICAgXCI5MzNcIjogXCJVcHNpbG9uO1wiLFxuICAgIFwiOTM0XCI6IFwiUGhpO1wiLFxuICAgIFwiOTM1XCI6IFwiQ2hpO1wiLFxuICAgIFwiOTM2XCI6IFwiUHNpO1wiLFxuICAgIFwiOTM3XCI6IFwiT21lZ2E7XCIsXG4gICAgXCI5NDVcIjogXCJhbHBoYTtcIixcbiAgICBcIjk0NlwiOiBcImJldGE7XCIsXG4gICAgXCI5NDdcIjogXCJnYW1tYTtcIixcbiAgICBcIjk0OFwiOiBcImRlbHRhO1wiLFxuICAgIFwiOTQ5XCI6IFwiZXBzaWxvbjtcIixcbiAgICBcIjk1MFwiOiBcInpldGE7XCIsXG4gICAgXCI5NTFcIjogXCJldGE7XCIsXG4gICAgXCI5NTJcIjogXCJ0aGV0YTtcIixcbiAgICBcIjk1M1wiOiBcImlvdGE7XCIsXG4gICAgXCI5NTRcIjogXCJrYXBwYTtcIixcbiAgICBcIjk1NVwiOiBcImxhbWJkYTtcIixcbiAgICBcIjk1NlwiOiBcIm11O1wiLFxuICAgIFwiOTU3XCI6IFwibnU7XCIsXG4gICAgXCI5NThcIjogXCJ4aTtcIixcbiAgICBcIjk1OVwiOiBcIm9taWNyb247XCIsXG4gICAgXCI5NjBcIjogXCJwaTtcIixcbiAgICBcIjk2MVwiOiBcInJobztcIixcbiAgICBcIjk2MlwiOiBcInZhcnNpZ21hO1wiLFxuICAgIFwiOTYzXCI6IFwic2lnbWE7XCIsXG4gICAgXCI5NjRcIjogXCJ0YXU7XCIsXG4gICAgXCI5NjVcIjogXCJ1cHNpbG9uO1wiLFxuICAgIFwiOTY2XCI6IFwicGhpO1wiLFxuICAgIFwiOTY3XCI6IFwiY2hpO1wiLFxuICAgIFwiOTY4XCI6IFwicHNpO1wiLFxuICAgIFwiOTY5XCI6IFwib21lZ2E7XCIsXG4gICAgXCI5NzdcIjogXCJ2YXJ0aGV0YTtcIixcbiAgICBcIjk3OFwiOiBcInVwc2loO1wiLFxuICAgIFwiOTgxXCI6IFwidmFycGhpO1wiLFxuICAgIFwiOTgyXCI6IFwidmFycGk7XCIsXG4gICAgXCI5ODhcIjogXCJHYW1tYWQ7XCIsXG4gICAgXCI5ODlcIjogXCJnYW1tYWQ7XCIsXG4gICAgXCIxMDA4XCI6IFwidmFya2FwcGE7XCIsXG4gICAgXCIxMDA5XCI6IFwidmFycmhvO1wiLFxuICAgIFwiMTAxM1wiOiBcInZhcmVwc2lsb247XCIsXG4gICAgXCIxMDE0XCI6IFwiYmVwc2k7XCIsXG4gICAgXCIxMDI1XCI6IFwiSU9jeTtcIixcbiAgICBcIjEwMjZcIjogXCJESmN5O1wiLFxuICAgIFwiMTAyN1wiOiBcIkdKY3k7XCIsXG4gICAgXCIxMDI4XCI6IFwiSnVrY3k7XCIsXG4gICAgXCIxMDI5XCI6IFwiRFNjeTtcIixcbiAgICBcIjEwMzBcIjogXCJJdWtjeTtcIixcbiAgICBcIjEwMzFcIjogXCJZSWN5O1wiLFxuICAgIFwiMTAzMlwiOiBcIkpzZXJjeTtcIixcbiAgICBcIjEwMzNcIjogXCJMSmN5O1wiLFxuICAgIFwiMTAzNFwiOiBcIk5KY3k7XCIsXG4gICAgXCIxMDM1XCI6IFwiVFNIY3k7XCIsXG4gICAgXCIxMDM2XCI6IFwiS0pjeTtcIixcbiAgICBcIjEwMzhcIjogXCJVYnJjeTtcIixcbiAgICBcIjEwMzlcIjogXCJEWmN5O1wiLFxuICAgIFwiMTA0MFwiOiBcIkFjeTtcIixcbiAgICBcIjEwNDFcIjogXCJCY3k7XCIsXG4gICAgXCIxMDQyXCI6IFwiVmN5O1wiLFxuICAgIFwiMTA0M1wiOiBcIkdjeTtcIixcbiAgICBcIjEwNDRcIjogXCJEY3k7XCIsXG4gICAgXCIxMDQ1XCI6IFwiSUVjeTtcIixcbiAgICBcIjEwNDZcIjogXCJaSGN5O1wiLFxuICAgIFwiMTA0N1wiOiBcIlpjeTtcIixcbiAgICBcIjEwNDhcIjogXCJJY3k7XCIsXG4gICAgXCIxMDQ5XCI6IFwiSmN5O1wiLFxuICAgIFwiMTA1MFwiOiBcIktjeTtcIixcbiAgICBcIjEwNTFcIjogXCJMY3k7XCIsXG4gICAgXCIxMDUyXCI6IFwiTWN5O1wiLFxuICAgIFwiMTA1M1wiOiBcIk5jeTtcIixcbiAgICBcIjEwNTRcIjogXCJPY3k7XCIsXG4gICAgXCIxMDU1XCI6IFwiUGN5O1wiLFxuICAgIFwiMTA1NlwiOiBcIlJjeTtcIixcbiAgICBcIjEwNTdcIjogXCJTY3k7XCIsXG4gICAgXCIxMDU4XCI6IFwiVGN5O1wiLFxuICAgIFwiMTA1OVwiOiBcIlVjeTtcIixcbiAgICBcIjEwNjBcIjogXCJGY3k7XCIsXG4gICAgXCIxMDYxXCI6IFwiS0hjeTtcIixcbiAgICBcIjEwNjJcIjogXCJUU2N5O1wiLFxuICAgIFwiMTA2M1wiOiBcIkNIY3k7XCIsXG4gICAgXCIxMDY0XCI6IFwiU0hjeTtcIixcbiAgICBcIjEwNjVcIjogXCJTSENIY3k7XCIsXG4gICAgXCIxMDY2XCI6IFwiSEFSRGN5O1wiLFxuICAgIFwiMTA2N1wiOiBcIlljeTtcIixcbiAgICBcIjEwNjhcIjogXCJTT0ZUY3k7XCIsXG4gICAgXCIxMDY5XCI6IFwiRWN5O1wiLFxuICAgIFwiMTA3MFwiOiBcIllVY3k7XCIsXG4gICAgXCIxMDcxXCI6IFwiWUFjeTtcIixcbiAgICBcIjEwNzJcIjogXCJhY3k7XCIsXG4gICAgXCIxMDczXCI6IFwiYmN5O1wiLFxuICAgIFwiMTA3NFwiOiBcInZjeTtcIixcbiAgICBcIjEwNzVcIjogXCJnY3k7XCIsXG4gICAgXCIxMDc2XCI6IFwiZGN5O1wiLFxuICAgIFwiMTA3N1wiOiBcImllY3k7XCIsXG4gICAgXCIxMDc4XCI6IFwiemhjeTtcIixcbiAgICBcIjEwNzlcIjogXCJ6Y3k7XCIsXG4gICAgXCIxMDgwXCI6IFwiaWN5O1wiLFxuICAgIFwiMTA4MVwiOiBcImpjeTtcIixcbiAgICBcIjEwODJcIjogXCJrY3k7XCIsXG4gICAgXCIxMDgzXCI6IFwibGN5O1wiLFxuICAgIFwiMTA4NFwiOiBcIm1jeTtcIixcbiAgICBcIjEwODVcIjogXCJuY3k7XCIsXG4gICAgXCIxMDg2XCI6IFwib2N5O1wiLFxuICAgIFwiMTA4N1wiOiBcInBjeTtcIixcbiAgICBcIjEwODhcIjogXCJyY3k7XCIsXG4gICAgXCIxMDg5XCI6IFwic2N5O1wiLFxuICAgIFwiMTA5MFwiOiBcInRjeTtcIixcbiAgICBcIjEwOTFcIjogXCJ1Y3k7XCIsXG4gICAgXCIxMDkyXCI6IFwiZmN5O1wiLFxuICAgIFwiMTA5M1wiOiBcImtoY3k7XCIsXG4gICAgXCIxMDk0XCI6IFwidHNjeTtcIixcbiAgICBcIjEwOTVcIjogXCJjaGN5O1wiLFxuICAgIFwiMTA5NlwiOiBcInNoY3k7XCIsXG4gICAgXCIxMDk3XCI6IFwic2hjaGN5O1wiLFxuICAgIFwiMTA5OFwiOiBcImhhcmRjeTtcIixcbiAgICBcIjEwOTlcIjogXCJ5Y3k7XCIsXG4gICAgXCIxMTAwXCI6IFwic29mdGN5O1wiLFxuICAgIFwiMTEwMVwiOiBcImVjeTtcIixcbiAgICBcIjExMDJcIjogXCJ5dWN5O1wiLFxuICAgIFwiMTEwM1wiOiBcInlhY3k7XCIsXG4gICAgXCIxMTA1XCI6IFwiaW9jeTtcIixcbiAgICBcIjExMDZcIjogXCJkamN5O1wiLFxuICAgIFwiMTEwN1wiOiBcImdqY3k7XCIsXG4gICAgXCIxMTA4XCI6IFwianVrY3k7XCIsXG4gICAgXCIxMTA5XCI6IFwiZHNjeTtcIixcbiAgICBcIjExMTBcIjogXCJpdWtjeTtcIixcbiAgICBcIjExMTFcIjogXCJ5aWN5O1wiLFxuICAgIFwiMTExMlwiOiBcImpzZXJjeTtcIixcbiAgICBcIjExMTNcIjogXCJsamN5O1wiLFxuICAgIFwiMTExNFwiOiBcIm5qY3k7XCIsXG4gICAgXCIxMTE1XCI6IFwidHNoY3k7XCIsXG4gICAgXCIxMTE2XCI6IFwia2pjeTtcIixcbiAgICBcIjExMThcIjogXCJ1YnJjeTtcIixcbiAgICBcIjExMTlcIjogXCJkemN5O1wiLFxuICAgIFwiODE5NFwiOiBcImVuc3A7XCIsXG4gICAgXCI4MTk1XCI6IFwiZW1zcDtcIixcbiAgICBcIjgxOTZcIjogXCJlbXNwMTM7XCIsXG4gICAgXCI4MTk3XCI6IFwiZW1zcDE0O1wiLFxuICAgIFwiODE5OVwiOiBcIm51bXNwO1wiLFxuICAgIFwiODIwMFwiOiBcInB1bmNzcDtcIixcbiAgICBcIjgyMDFcIjogXCJUaGluU3BhY2U7XCIsXG4gICAgXCI4MjAyXCI6IFwiVmVyeVRoaW5TcGFjZTtcIixcbiAgICBcIjgyMDNcIjogXCJaZXJvV2lkdGhTcGFjZTtcIixcbiAgICBcIjgyMDRcIjogXCJ6d25qO1wiLFxuICAgIFwiODIwNVwiOiBcInp3ajtcIixcbiAgICBcIjgyMDZcIjogXCJscm07XCIsXG4gICAgXCI4MjA3XCI6IFwicmxtO1wiLFxuICAgIFwiODIwOFwiOiBcImh5cGhlbjtcIixcbiAgICBcIjgyMTFcIjogXCJuZGFzaDtcIixcbiAgICBcIjgyMTJcIjogXCJtZGFzaDtcIixcbiAgICBcIjgyMTNcIjogXCJob3JiYXI7XCIsXG4gICAgXCI4MjE0XCI6IFwiVmVydDtcIixcbiAgICBcIjgyMTZcIjogXCJPcGVuQ3VybHlRdW90ZTtcIixcbiAgICBcIjgyMTdcIjogXCJyc3F1b3I7XCIsXG4gICAgXCI4MjE4XCI6IFwic2JxdW87XCIsXG4gICAgXCI4MjIwXCI6IFwiT3BlbkN1cmx5RG91YmxlUXVvdGU7XCIsXG4gICAgXCI4MjIxXCI6IFwicmRxdW9yO1wiLFxuICAgIFwiODIyMlwiOiBcImxkcXVvcjtcIixcbiAgICBcIjgyMjRcIjogXCJkYWdnZXI7XCIsXG4gICAgXCI4MjI1XCI6IFwiZGRhZ2dlcjtcIixcbiAgICBcIjgyMjZcIjogXCJidWxsZXQ7XCIsXG4gICAgXCI4MjI5XCI6IFwibmxkcjtcIixcbiAgICBcIjgyMzBcIjogXCJtbGRyO1wiLFxuICAgIFwiODI0MFwiOiBcInBlcm1pbDtcIixcbiAgICBcIjgyNDFcIjogXCJwZXJ0ZW5rO1wiLFxuICAgIFwiODI0MlwiOiBcInByaW1lO1wiLFxuICAgIFwiODI0M1wiOiBcIlByaW1lO1wiLFxuICAgIFwiODI0NFwiOiBcInRwcmltZTtcIixcbiAgICBcIjgyNDVcIjogXCJicHJpbWU7XCIsXG4gICAgXCI4MjQ5XCI6IFwibHNhcXVvO1wiLFxuICAgIFwiODI1MFwiOiBcInJzYXF1bztcIixcbiAgICBcIjgyNTRcIjogXCJPdmVyQmFyO1wiLFxuICAgIFwiODI1N1wiOiBcImNhcmV0O1wiLFxuICAgIFwiODI1OVwiOiBcImh5YnVsbDtcIixcbiAgICBcIjgyNjBcIjogXCJmcmFzbDtcIixcbiAgICBcIjgyNzFcIjogXCJic2VtaTtcIixcbiAgICBcIjgyNzlcIjogXCJxcHJpbWU7XCIsXG4gICAgXCI4Mjg3XCI6IFwiTWVkaXVtU3BhY2U7XCIsXG4gICAgXCI4Mjg4XCI6IFwiTm9CcmVhaztcIixcbiAgICBcIjgyODlcIjogXCJBcHBseUZ1bmN0aW9uO1wiLFxuICAgIFwiODI5MFwiOiBcIml0O1wiLFxuICAgIFwiODI5MVwiOiBcIkludmlzaWJsZUNvbW1hO1wiLFxuICAgIFwiODM2NFwiOiBcImV1cm87XCIsXG4gICAgXCI4NDExXCI6IFwiVHJpcGxlRG90O1wiLFxuICAgIFwiODQxMlwiOiBcIkRvdERvdDtcIixcbiAgICBcIjg0NTBcIjogXCJDb3BmO1wiLFxuICAgIFwiODQ1M1wiOiBcImluY2FyZTtcIixcbiAgICBcIjg0NThcIjogXCJnc2NyO1wiLFxuICAgIFwiODQ1OVwiOiBcIkhzY3I7XCIsXG4gICAgXCI4NDYwXCI6IFwiUG9pbmNhcmVwbGFuZTtcIixcbiAgICBcIjg0NjFcIjogXCJxdWF0ZXJuaW9ucztcIixcbiAgICBcIjg0NjJcIjogXCJwbGFuY2toO1wiLFxuICAgIFwiODQ2M1wiOiBcInBsYW5rdjtcIixcbiAgICBcIjg0NjRcIjogXCJJc2NyO1wiLFxuICAgIFwiODQ2NVwiOiBcImltYWdwYXJ0O1wiLFxuICAgIFwiODQ2NlwiOiBcIkxzY3I7XCIsXG4gICAgXCI4NDY3XCI6IFwiZWxsO1wiLFxuICAgIFwiODQ2OVwiOiBcIk5vcGY7XCIsXG4gICAgXCI4NDcwXCI6IFwibnVtZXJvO1wiLFxuICAgIFwiODQ3MVwiOiBcImNvcHlzcjtcIixcbiAgICBcIjg0NzJcIjogXCJ3cDtcIixcbiAgICBcIjg0NzNcIjogXCJwcmltZXM7XCIsXG4gICAgXCI4NDc0XCI6IFwicmF0aW9uYWxzO1wiLFxuICAgIFwiODQ3NVwiOiBcIlJzY3I7XCIsXG4gICAgXCI4NDc2XCI6IFwiUmZyO1wiLFxuICAgIFwiODQ3N1wiOiBcIlJvcGY7XCIsXG4gICAgXCI4NDc4XCI6IFwicng7XCIsXG4gICAgXCI4NDgyXCI6IFwidHJhZGU7XCIsXG4gICAgXCI4NDg0XCI6IFwiWm9wZjtcIixcbiAgICBcIjg0ODdcIjogXCJtaG87XCIsXG4gICAgXCI4NDg4XCI6IFwiWmZyO1wiLFxuICAgIFwiODQ4OVwiOiBcImlpb3RhO1wiLFxuICAgIFwiODQ5MlwiOiBcIkJzY3I7XCIsXG4gICAgXCI4NDkzXCI6IFwiQ2ZyO1wiLFxuICAgIFwiODQ5NVwiOiBcImVzY3I7XCIsXG4gICAgXCI4NDk2XCI6IFwiZXhwZWN0YXRpb247XCIsXG4gICAgXCI4NDk3XCI6IFwiRnNjcjtcIixcbiAgICBcIjg0OTlcIjogXCJwaG1tYXQ7XCIsXG4gICAgXCI4NTAwXCI6IFwib3NjcjtcIixcbiAgICBcIjg1MDFcIjogXCJhbGVwaDtcIixcbiAgICBcIjg1MDJcIjogXCJiZXRoO1wiLFxuICAgIFwiODUwM1wiOiBcImdpbWVsO1wiLFxuICAgIFwiODUwNFwiOiBcImRhbGV0aDtcIixcbiAgICBcIjg1MTdcIjogXCJERDtcIixcbiAgICBcIjg1MThcIjogXCJEaWZmZXJlbnRpYWxEO1wiLFxuICAgIFwiODUxOVwiOiBcImV4cG9uZW50aWFsZTtcIixcbiAgICBcIjg1MjBcIjogXCJJbWFnaW5hcnlJO1wiLFxuICAgIFwiODUzMVwiOiBcImZyYWMxMztcIixcbiAgICBcIjg1MzJcIjogXCJmcmFjMjM7XCIsXG4gICAgXCI4NTMzXCI6IFwiZnJhYzE1O1wiLFxuICAgIFwiODUzNFwiOiBcImZyYWMyNTtcIixcbiAgICBcIjg1MzVcIjogXCJmcmFjMzU7XCIsXG4gICAgXCI4NTM2XCI6IFwiZnJhYzQ1O1wiLFxuICAgIFwiODUzN1wiOiBcImZyYWMxNjtcIixcbiAgICBcIjg1MzhcIjogXCJmcmFjNTY7XCIsXG4gICAgXCI4NTM5XCI6IFwiZnJhYzE4O1wiLFxuICAgIFwiODU0MFwiOiBcImZyYWMzODtcIixcbiAgICBcIjg1NDFcIjogXCJmcmFjNTg7XCIsXG4gICAgXCI4NTQyXCI6IFwiZnJhYzc4O1wiLFxuICAgIFwiODU5MlwiOiBcInNsYXJyO1wiLFxuICAgIFwiODU5M1wiOiBcInVwYXJyb3c7XCIsXG4gICAgXCI4NTk0XCI6IFwic3JhcnI7XCIsXG4gICAgXCI4NTk1XCI6IFwiU2hvcnREb3duQXJyb3c7XCIsXG4gICAgXCI4NTk2XCI6IFwibGVmdHJpZ2h0YXJyb3c7XCIsXG4gICAgXCI4NTk3XCI6IFwidmFycjtcIixcbiAgICBcIjg1OThcIjogXCJVcHBlckxlZnRBcnJvdztcIixcbiAgICBcIjg1OTlcIjogXCJVcHBlclJpZ2h0QXJyb3c7XCIsXG4gICAgXCI4NjAwXCI6IFwic2VhcnJvdztcIixcbiAgICBcIjg2MDFcIjogXCJzd2Fycm93O1wiLFxuICAgIFwiODYwMlwiOiBcIm5sZWZ0YXJyb3c7XCIsXG4gICAgXCI4NjAzXCI6IFwibnJpZ2h0YXJyb3c7XCIsXG4gICAgXCI4NjA1XCI6IFwicmlnaHRzcXVpZ2Fycm93O1wiLFxuICAgIFwiODYwNlwiOiBcInR3b2hlYWRsZWZ0YXJyb3c7XCIsXG4gICAgXCI4NjA3XCI6IFwiVWFycjtcIixcbiAgICBcIjg2MDhcIjogXCJ0d29oZWFkcmlnaHRhcnJvdztcIixcbiAgICBcIjg2MDlcIjogXCJEYXJyO1wiLFxuICAgIFwiODYxMFwiOiBcImxlZnRhcnJvd3RhaWw7XCIsXG4gICAgXCI4NjExXCI6IFwicmlnaHRhcnJvd3RhaWw7XCIsXG4gICAgXCI4NjEyXCI6IFwibWFwc3RvbGVmdDtcIixcbiAgICBcIjg2MTNcIjogXCJVcFRlZUFycm93O1wiLFxuICAgIFwiODYxNFwiOiBcIlJpZ2h0VGVlQXJyb3c7XCIsXG4gICAgXCI4NjE1XCI6IFwibWFwc3RvZG93bjtcIixcbiAgICBcIjg2MTdcIjogXCJsYXJyaGs7XCIsXG4gICAgXCI4NjE4XCI6IFwicmFycmhrO1wiLFxuICAgIFwiODYxOVwiOiBcImxvb3BhcnJvd2xlZnQ7XCIsXG4gICAgXCI4NjIwXCI6IFwicmFycmxwO1wiLFxuICAgIFwiODYyMVwiOiBcImxlZnRyaWdodHNxdWlnYXJyb3c7XCIsXG4gICAgXCI4NjIyXCI6IFwibmxlZnRyaWdodGFycm93O1wiLFxuICAgIFwiODYyNFwiOiBcImxzaDtcIixcbiAgICBcIjg2MjVcIjogXCJyc2g7XCIsXG4gICAgXCI4NjI2XCI6IFwibGRzaDtcIixcbiAgICBcIjg2MjdcIjogXCJyZHNoO1wiLFxuICAgIFwiODYyOVwiOiBcImNyYXJyO1wiLFxuICAgIFwiODYzMFwiOiBcImN1cnZlYXJyb3dsZWZ0O1wiLFxuICAgIFwiODYzMVwiOiBcImN1cnZlYXJyb3dyaWdodDtcIixcbiAgICBcIjg2MzRcIjogXCJvbGFycjtcIixcbiAgICBcIjg2MzVcIjogXCJvcmFycjtcIixcbiAgICBcIjg2MzZcIjogXCJsaGFydTtcIixcbiAgICBcIjg2MzdcIjogXCJsaGFyZDtcIixcbiAgICBcIjg2MzhcIjogXCJ1cGhhcnBvb25yaWdodDtcIixcbiAgICBcIjg2MzlcIjogXCJ1cGhhcnBvb25sZWZ0O1wiLFxuICAgIFwiODY0MFwiOiBcIlJpZ2h0VmVjdG9yO1wiLFxuICAgIFwiODY0MVwiOiBcInJpZ2h0aGFycG9vbmRvd247XCIsXG4gICAgXCI4NjQyXCI6IFwiUmlnaHREb3duVmVjdG9yO1wiLFxuICAgIFwiODY0M1wiOiBcIkxlZnREb3duVmVjdG9yO1wiLFxuICAgIFwiODY0NFwiOiBcInJsYXJyO1wiLFxuICAgIFwiODY0NVwiOiBcIlVwQXJyb3dEb3duQXJyb3c7XCIsXG4gICAgXCI4NjQ2XCI6IFwibHJhcnI7XCIsXG4gICAgXCI4NjQ3XCI6IFwibGxhcnI7XCIsXG4gICAgXCI4NjQ4XCI6IFwidXVhcnI7XCIsXG4gICAgXCI4NjQ5XCI6IFwicnJhcnI7XCIsXG4gICAgXCI4NjUwXCI6IFwiZG93bmRvd25hcnJvd3M7XCIsXG4gICAgXCI4NjUxXCI6IFwiUmV2ZXJzZUVxdWlsaWJyaXVtO1wiLFxuICAgIFwiODY1MlwiOiBcInJsaGFyO1wiLFxuICAgIFwiODY1M1wiOiBcIm5MZWZ0YXJyb3c7XCIsXG4gICAgXCI4NjU0XCI6IFwibkxlZnRyaWdodGFycm93O1wiLFxuICAgIFwiODY1NVwiOiBcIm5SaWdodGFycm93O1wiLFxuICAgIFwiODY1NlwiOiBcIkxlZnRhcnJvdztcIixcbiAgICBcIjg2NTdcIjogXCJVcGFycm93O1wiLFxuICAgIFwiODY1OFwiOiBcIlJpZ2h0YXJyb3c7XCIsXG4gICAgXCI4NjU5XCI6IFwiRG93bmFycm93O1wiLFxuICAgIFwiODY2MFwiOiBcIkxlZnRyaWdodGFycm93O1wiLFxuICAgIFwiODY2MVwiOiBcInZBcnI7XCIsXG4gICAgXCI4NjYyXCI6IFwibndBcnI7XCIsXG4gICAgXCI4NjYzXCI6IFwibmVBcnI7XCIsXG4gICAgXCI4NjY0XCI6IFwic2VBcnI7XCIsXG4gICAgXCI4NjY1XCI6IFwic3dBcnI7XCIsXG4gICAgXCI4NjY2XCI6IFwiTGxlZnRhcnJvdztcIixcbiAgICBcIjg2NjdcIjogXCJScmlnaHRhcnJvdztcIixcbiAgICBcIjg2NjlcIjogXCJ6aWdyYXJyO1wiLFxuICAgIFwiODY3NlwiOiBcIkxlZnRBcnJvd0JhcjtcIixcbiAgICBcIjg2NzdcIjogXCJSaWdodEFycm93QmFyO1wiLFxuICAgIFwiODY5M1wiOiBcImR1YXJyO1wiLFxuICAgIFwiODcwMVwiOiBcImxvYXJyO1wiLFxuICAgIFwiODcwMlwiOiBcInJvYXJyO1wiLFxuICAgIFwiODcwM1wiOiBcImhvYXJyO1wiLFxuICAgIFwiODcwNFwiOiBcImZvcmFsbDtcIixcbiAgICBcIjg3MDVcIjogXCJjb21wbGVtZW50O1wiLFxuICAgIFwiODcwNlwiOiBcIlBhcnRpYWxEO1wiLFxuICAgIFwiODcwN1wiOiBcIkV4aXN0cztcIixcbiAgICBcIjg3MDhcIjogXCJOb3RFeGlzdHM7XCIsXG4gICAgXCI4NzA5XCI6IFwidmFybm90aGluZztcIixcbiAgICBcIjg3MTFcIjogXCJuYWJsYTtcIixcbiAgICBcIjg3MTJcIjogXCJpc2ludjtcIixcbiAgICBcIjg3MTNcIjogXCJub3RpbnZhO1wiLFxuICAgIFwiODcxNVwiOiBcIlN1Y2hUaGF0O1wiLFxuICAgIFwiODcxNlwiOiBcIk5vdFJldmVyc2VFbGVtZW50O1wiLFxuICAgIFwiODcxOVwiOiBcIlByb2R1Y3Q7XCIsXG4gICAgXCI4NzIwXCI6IFwiQ29wcm9kdWN0O1wiLFxuICAgIFwiODcyMVwiOiBcInN1bTtcIixcbiAgICBcIjg3MjJcIjogXCJtaW51cztcIixcbiAgICBcIjg3MjNcIjogXCJtcDtcIixcbiAgICBcIjg3MjRcIjogXCJwbHVzZG87XCIsXG4gICAgXCI4NzI2XCI6IFwic3NldG1uO1wiLFxuICAgIFwiODcyN1wiOiBcImxvd2FzdDtcIixcbiAgICBcIjg3MjhcIjogXCJTbWFsbENpcmNsZTtcIixcbiAgICBcIjg3MzBcIjogXCJTcXJ0O1wiLFxuICAgIFwiODczM1wiOiBcInZwcm9wO1wiLFxuICAgIFwiODczNFwiOiBcImluZmluO1wiLFxuICAgIFwiODczNVwiOiBcImFuZ3J0O1wiLFxuICAgIFwiODczNlwiOiBcImFuZ2xlO1wiLFxuICAgIFwiODczN1wiOiBcIm1lYXN1cmVkYW5nbGU7XCIsXG4gICAgXCI4NzM4XCI6IFwiYW5nc3BoO1wiLFxuICAgIFwiODczOVwiOiBcIlZlcnRpY2FsQmFyO1wiLFxuICAgIFwiODc0MFwiOiBcIm5zbWlkO1wiLFxuICAgIFwiODc0MVwiOiBcInNwYXI7XCIsXG4gICAgXCI4NzQyXCI6IFwibnNwYXI7XCIsXG4gICAgXCI4NzQzXCI6IFwid2VkZ2U7XCIsXG4gICAgXCI4NzQ0XCI6IFwidmVlO1wiLFxuICAgIFwiODc0NVwiOiBcImNhcDtcIixcbiAgICBcIjg3NDZcIjogXCJjdXA7XCIsXG4gICAgXCI4NzQ3XCI6IFwiSW50ZWdyYWw7XCIsXG4gICAgXCI4NzQ4XCI6IFwiSW50O1wiLFxuICAgIFwiODc0OVwiOiBcInRpbnQ7XCIsXG4gICAgXCI4NzUwXCI6IFwib2ludDtcIixcbiAgICBcIjg3NTFcIjogXCJEb3VibGVDb250b3VySW50ZWdyYWw7XCIsXG4gICAgXCI4NzUyXCI6IFwiQ2NvbmludDtcIixcbiAgICBcIjg3NTNcIjogXCJjd2ludDtcIixcbiAgICBcIjg3NTRcIjogXCJjd2NvbmludDtcIixcbiAgICBcIjg3NTVcIjogXCJDb3VudGVyQ2xvY2t3aXNlQ29udG91ckludGVncmFsO1wiLFxuICAgIFwiODc1NlwiOiBcInRoZXJlZm9yZTtcIixcbiAgICBcIjg3NTdcIjogXCJiZWNhdXNlO1wiLFxuICAgIFwiODc1OFwiOiBcInJhdGlvO1wiLFxuICAgIFwiODc1OVwiOiBcIlByb3BvcnRpb247XCIsXG4gICAgXCI4NzYwXCI6IFwibWludXNkO1wiLFxuICAgIFwiODc2MlwiOiBcIm1ERG90O1wiLFxuICAgIFwiODc2M1wiOiBcImhvbXRodDtcIixcbiAgICBcIjg3NjRcIjogXCJUaWxkZTtcIixcbiAgICBcIjg3NjVcIjogXCJic2ltO1wiLFxuICAgIFwiODc2NlwiOiBcIm1zdHBvcztcIixcbiAgICBcIjg3NjdcIjogXCJhY2Q7XCIsXG4gICAgXCI4NzY4XCI6IFwid3JlYXRoO1wiLFxuICAgIFwiODc2OVwiOiBcIm5zaW07XCIsXG4gICAgXCI4NzcwXCI6IFwiZXNpbTtcIixcbiAgICBcIjg3NzFcIjogXCJUaWxkZUVxdWFsO1wiLFxuICAgIFwiODc3MlwiOiBcIm5zaW1lcTtcIixcbiAgICBcIjg3NzNcIjogXCJUaWxkZUZ1bGxFcXVhbDtcIixcbiAgICBcIjg3NzRcIjogXCJzaW1uZTtcIixcbiAgICBcIjg3NzVcIjogXCJOb3RUaWxkZUZ1bGxFcXVhbDtcIixcbiAgICBcIjg3NzZcIjogXCJUaWxkZVRpbGRlO1wiLFxuICAgIFwiODc3N1wiOiBcIk5vdFRpbGRlVGlsZGU7XCIsXG4gICAgXCI4Nzc4XCI6IFwiYXBwcm94ZXE7XCIsXG4gICAgXCI4Nzc5XCI6IFwiYXBpZDtcIixcbiAgICBcIjg3ODBcIjogXCJiY29uZztcIixcbiAgICBcIjg3ODFcIjogXCJDdXBDYXA7XCIsXG4gICAgXCI4NzgyXCI6IFwiSHVtcERvd25IdW1wO1wiLFxuICAgIFwiODc4M1wiOiBcIkh1bXBFcXVhbDtcIixcbiAgICBcIjg3ODRcIjogXCJlc2RvdDtcIixcbiAgICBcIjg3ODVcIjogXCJlRG90O1wiLFxuICAgIFwiODc4NlwiOiBcImZhbGxpbmdkb3RzZXE7XCIsXG4gICAgXCI4Nzg3XCI6IFwicmlzaW5nZG90c2VxO1wiLFxuICAgIFwiODc4OFwiOiBcImNvbG9uZXE7XCIsXG4gICAgXCI4Nzg5XCI6IFwiZXFjb2xvbjtcIixcbiAgICBcIjg3OTBcIjogXCJlcWNpcmM7XCIsXG4gICAgXCI4NzkxXCI6IFwiY2lyZTtcIixcbiAgICBcIjg3OTNcIjogXCJ3ZWRnZXE7XCIsXG4gICAgXCI4Nzk0XCI6IFwidmVlZXE7XCIsXG4gICAgXCI4Nzk2XCI6IFwidHJpZTtcIixcbiAgICBcIjg3OTlcIjogXCJxdWVzdGVxO1wiLFxuICAgIFwiODgwMFwiOiBcIk5vdEVxdWFsO1wiLFxuICAgIFwiODgwMVwiOiBcImVxdWl2O1wiLFxuICAgIFwiODgwMlwiOiBcIk5vdENvbmdydWVudDtcIixcbiAgICBcIjg4MDRcIjogXCJsZXE7XCIsXG4gICAgXCI4ODA1XCI6IFwiR3JlYXRlckVxdWFsO1wiLFxuICAgIFwiODgwNlwiOiBcIkxlc3NGdWxsRXF1YWw7XCIsXG4gICAgXCI4ODA3XCI6IFwiR3JlYXRlckZ1bGxFcXVhbDtcIixcbiAgICBcIjg4MDhcIjogXCJsbmVxcTtcIixcbiAgICBcIjg4MDlcIjogXCJnbmVxcTtcIixcbiAgICBcIjg4MTBcIjogXCJOZXN0ZWRMZXNzTGVzcztcIixcbiAgICBcIjg4MTFcIjogXCJOZXN0ZWRHcmVhdGVyR3JlYXRlcjtcIixcbiAgICBcIjg4MTJcIjogXCJ0d2l4dDtcIixcbiAgICBcIjg4MTNcIjogXCJOb3RDdXBDYXA7XCIsXG4gICAgXCI4ODE0XCI6IFwiTm90TGVzcztcIixcbiAgICBcIjg4MTVcIjogXCJOb3RHcmVhdGVyO1wiLFxuICAgIFwiODgxNlwiOiBcIk5vdExlc3NFcXVhbDtcIixcbiAgICBcIjg4MTdcIjogXCJOb3RHcmVhdGVyRXF1YWw7XCIsXG4gICAgXCI4ODE4XCI6IFwibHNpbTtcIixcbiAgICBcIjg4MTlcIjogXCJndHJzaW07XCIsXG4gICAgXCI4ODIwXCI6IFwiTm90TGVzc1RpbGRlO1wiLFxuICAgIFwiODgyMVwiOiBcIk5vdEdyZWF0ZXJUaWxkZTtcIixcbiAgICBcIjg4MjJcIjogXCJsZztcIixcbiAgICBcIjg4MjNcIjogXCJndHJsZXNzO1wiLFxuICAgIFwiODgyNFwiOiBcIm50bGc7XCIsXG4gICAgXCI4ODI1XCI6IFwibnRnbDtcIixcbiAgICBcIjg4MjZcIjogXCJQcmVjZWRlcztcIixcbiAgICBcIjg4MjdcIjogXCJTdWNjZWVkcztcIixcbiAgICBcIjg4MjhcIjogXCJQcmVjZWRlc1NsYW50RXF1YWw7XCIsXG4gICAgXCI4ODI5XCI6IFwiU3VjY2VlZHNTbGFudEVxdWFsO1wiLFxuICAgIFwiODgzMFwiOiBcInByc2ltO1wiLFxuICAgIFwiODgzMVwiOiBcInN1Y2NzaW07XCIsXG4gICAgXCI4ODMyXCI6IFwibnByZWM7XCIsXG4gICAgXCI4ODMzXCI6IFwibnN1Y2M7XCIsXG4gICAgXCI4ODM0XCI6IFwic3Vic2V0O1wiLFxuICAgIFwiODgzNVwiOiBcInN1cHNldDtcIixcbiAgICBcIjg4MzZcIjogXCJuc3ViO1wiLFxuICAgIFwiODgzN1wiOiBcIm5zdXA7XCIsXG4gICAgXCI4ODM4XCI6IFwiU3Vic2V0RXF1YWw7XCIsXG4gICAgXCI4ODM5XCI6IFwic3Vwc2V0ZXE7XCIsXG4gICAgXCI4ODQwXCI6IFwibnN1YnNldGVxO1wiLFxuICAgIFwiODg0MVwiOiBcIm5zdXBzZXRlcTtcIixcbiAgICBcIjg4NDJcIjogXCJzdWJzZXRuZXE7XCIsXG4gICAgXCI4ODQzXCI6IFwic3Vwc2V0bmVxO1wiLFxuICAgIFwiODg0NVwiOiBcImN1cGRvdDtcIixcbiAgICBcIjg4NDZcIjogXCJ1cGx1cztcIixcbiAgICBcIjg4NDdcIjogXCJTcXVhcmVTdWJzZXQ7XCIsXG4gICAgXCI4ODQ4XCI6IFwiU3F1YXJlU3VwZXJzZXQ7XCIsXG4gICAgXCI4ODQ5XCI6IFwiU3F1YXJlU3Vic2V0RXF1YWw7XCIsXG4gICAgXCI4ODUwXCI6IFwiU3F1YXJlU3VwZXJzZXRFcXVhbDtcIixcbiAgICBcIjg4NTFcIjogXCJTcXVhcmVJbnRlcnNlY3Rpb247XCIsXG4gICAgXCI4ODUyXCI6IFwiU3F1YXJlVW5pb247XCIsXG4gICAgXCI4ODUzXCI6IFwib3BsdXM7XCIsXG4gICAgXCI4ODU0XCI6IFwib21pbnVzO1wiLFxuICAgIFwiODg1NVwiOiBcIm90aW1lcztcIixcbiAgICBcIjg4NTZcIjogXCJvc29sO1wiLFxuICAgIFwiODg1N1wiOiBcIm9kb3Q7XCIsXG4gICAgXCI4ODU4XCI6IFwib2NpcjtcIixcbiAgICBcIjg4NTlcIjogXCJvYXN0O1wiLFxuICAgIFwiODg2MVwiOiBcIm9kYXNoO1wiLFxuICAgIFwiODg2MlwiOiBcInBsdXNiO1wiLFxuICAgIFwiODg2M1wiOiBcIm1pbnVzYjtcIixcbiAgICBcIjg4NjRcIjogXCJ0aW1lc2I7XCIsXG4gICAgXCI4ODY1XCI6IFwic2RvdGI7XCIsXG4gICAgXCI4ODY2XCI6IFwidmRhc2g7XCIsXG4gICAgXCI4ODY3XCI6IFwiTGVmdFRlZTtcIixcbiAgICBcIjg4NjhcIjogXCJ0b3A7XCIsXG4gICAgXCI4ODY5XCI6IFwiVXBUZWU7XCIsXG4gICAgXCI4ODcxXCI6IFwibW9kZWxzO1wiLFxuICAgIFwiODg3MlwiOiBcInZEYXNoO1wiLFxuICAgIFwiODg3M1wiOiBcIlZkYXNoO1wiLFxuICAgIFwiODg3NFwiOiBcIlZ2ZGFzaDtcIixcbiAgICBcIjg4NzVcIjogXCJWRGFzaDtcIixcbiAgICBcIjg4NzZcIjogXCJudmRhc2g7XCIsXG4gICAgXCI4ODc3XCI6IFwibnZEYXNoO1wiLFxuICAgIFwiODg3OFwiOiBcIm5WZGFzaDtcIixcbiAgICBcIjg4NzlcIjogXCJuVkRhc2g7XCIsXG4gICAgXCI4ODgwXCI6IFwicHJ1cmVsO1wiLFxuICAgIFwiODg4MlwiOiBcInZsdHJpO1wiLFxuICAgIFwiODg4M1wiOiBcInZydHJpO1wiLFxuICAgIFwiODg4NFwiOiBcInRyaWFuZ2xlbGVmdGVxO1wiLFxuICAgIFwiODg4NVwiOiBcInRyaWFuZ2xlcmlnaHRlcTtcIixcbiAgICBcIjg4ODZcIjogXCJvcmlnb2Y7XCIsXG4gICAgXCI4ODg3XCI6IFwiaW1vZjtcIixcbiAgICBcIjg4ODhcIjogXCJtdW1hcDtcIixcbiAgICBcIjg4ODlcIjogXCJoZXJjb247XCIsXG4gICAgXCI4ODkwXCI6IFwiaW50ZXJjYWw7XCIsXG4gICAgXCI4ODkxXCI6IFwidmVlYmFyO1wiLFxuICAgIFwiODg5M1wiOiBcImJhcnZlZTtcIixcbiAgICBcIjg4OTRcIjogXCJhbmdydHZiO1wiLFxuICAgIFwiODg5NVwiOiBcImxydHJpO1wiLFxuICAgIFwiODg5NlwiOiBcInh3ZWRnZTtcIixcbiAgICBcIjg4OTdcIjogXCJ4dmVlO1wiLFxuICAgIFwiODg5OFwiOiBcInhjYXA7XCIsXG4gICAgXCI4ODk5XCI6IFwieGN1cDtcIixcbiAgICBcIjg5MDBcIjogXCJkaWFtb25kO1wiLFxuICAgIFwiODkwMVwiOiBcInNkb3Q7XCIsXG4gICAgXCI4OTAyXCI6IFwiU3RhcjtcIixcbiAgICBcIjg5MDNcIjogXCJkaXZvbng7XCIsXG4gICAgXCI4OTA0XCI6IFwiYm93dGllO1wiLFxuICAgIFwiODkwNVwiOiBcImx0aW1lcztcIixcbiAgICBcIjg5MDZcIjogXCJydGltZXM7XCIsXG4gICAgXCI4OTA3XCI6IFwibHRocmVlO1wiLFxuICAgIFwiODkwOFwiOiBcInJ0aHJlZTtcIixcbiAgICBcIjg5MDlcIjogXCJic2ltZTtcIixcbiAgICBcIjg5MTBcIjogXCJjdXZlZTtcIixcbiAgICBcIjg5MTFcIjogXCJjdXdlZDtcIixcbiAgICBcIjg5MTJcIjogXCJTdWJzZXQ7XCIsXG4gICAgXCI4OTEzXCI6IFwiU3Vwc2V0O1wiLFxuICAgIFwiODkxNFwiOiBcIkNhcDtcIixcbiAgICBcIjg5MTVcIjogXCJDdXA7XCIsXG4gICAgXCI4OTE2XCI6IFwicGl0Y2hmb3JrO1wiLFxuICAgIFwiODkxN1wiOiBcImVwYXI7XCIsXG4gICAgXCI4OTE4XCI6IFwibHRkb3Q7XCIsXG4gICAgXCI4OTE5XCI6IFwiZ3RyZG90O1wiLFxuICAgIFwiODkyMFwiOiBcIkxsO1wiLFxuICAgIFwiODkyMVwiOiBcImdnZztcIixcbiAgICBcIjg5MjJcIjogXCJMZXNzRXF1YWxHcmVhdGVyO1wiLFxuICAgIFwiODkyM1wiOiBcImd0cmVxbGVzcztcIixcbiAgICBcIjg5MjZcIjogXCJjdXJseWVxcHJlYztcIixcbiAgICBcIjg5MjdcIjogXCJjdXJseWVxc3VjYztcIixcbiAgICBcIjg5MjhcIjogXCJucHJjdWU7XCIsXG4gICAgXCI4OTI5XCI6IFwibnNjY3VlO1wiLFxuICAgIFwiODkzMFwiOiBcIm5zcXN1YmU7XCIsXG4gICAgXCI4OTMxXCI6IFwibnNxc3VwZTtcIixcbiAgICBcIjg5MzRcIjogXCJsbnNpbTtcIixcbiAgICBcIjg5MzVcIjogXCJnbnNpbTtcIixcbiAgICBcIjg5MzZcIjogXCJwcm5zaW07XCIsXG4gICAgXCI4OTM3XCI6IFwic3VjY25zaW07XCIsXG4gICAgXCI4OTM4XCI6IFwibnRyaWFuZ2xlbGVmdDtcIixcbiAgICBcIjg5MzlcIjogXCJudHJpYW5nbGVyaWdodDtcIixcbiAgICBcIjg5NDBcIjogXCJudHJpYW5nbGVsZWZ0ZXE7XCIsXG4gICAgXCI4OTQxXCI6IFwibnRyaWFuZ2xlcmlnaHRlcTtcIixcbiAgICBcIjg5NDJcIjogXCJ2ZWxsaXA7XCIsXG4gICAgXCI4OTQzXCI6IFwiY3Rkb3Q7XCIsXG4gICAgXCI4OTQ0XCI6IFwidXRkb3Q7XCIsXG4gICAgXCI4OTQ1XCI6IFwiZHRkb3Q7XCIsXG4gICAgXCI4OTQ2XCI6IFwiZGlzaW47XCIsXG4gICAgXCI4OTQ3XCI6IFwiaXNpbnN2O1wiLFxuICAgIFwiODk0OFwiOiBcImlzaW5zO1wiLFxuICAgIFwiODk0OVwiOiBcImlzaW5kb3Q7XCIsXG4gICAgXCI4OTUwXCI6IFwibm90aW52YztcIixcbiAgICBcIjg5NTFcIjogXCJub3RpbnZiO1wiLFxuICAgIFwiODk1M1wiOiBcImlzaW5FO1wiLFxuICAgIFwiODk1NFwiOiBcIm5pc2Q7XCIsXG4gICAgXCI4OTU1XCI6IFwieG5pcztcIixcbiAgICBcIjg5NTZcIjogXCJuaXM7XCIsXG4gICAgXCI4OTU3XCI6IFwibm90bml2YztcIixcbiAgICBcIjg5NThcIjogXCJub3RuaXZiO1wiLFxuICAgIFwiODk2NVwiOiBcImJhcndlZGdlO1wiLFxuICAgIFwiODk2NlwiOiBcImRvdWJsZWJhcndlZGdlO1wiLFxuICAgIFwiODk2OFwiOiBcIkxlZnRDZWlsaW5nO1wiLFxuICAgIFwiODk2OVwiOiBcIlJpZ2h0Q2VpbGluZztcIixcbiAgICBcIjg5NzBcIjogXCJsZmxvb3I7XCIsXG4gICAgXCI4OTcxXCI6IFwiUmlnaHRGbG9vcjtcIixcbiAgICBcIjg5NzJcIjogXCJkcmNyb3A7XCIsXG4gICAgXCI4OTczXCI6IFwiZGxjcm9wO1wiLFxuICAgIFwiODk3NFwiOiBcInVyY3JvcDtcIixcbiAgICBcIjg5NzVcIjogXCJ1bGNyb3A7XCIsXG4gICAgXCI4OTc2XCI6IFwiYm5vdDtcIixcbiAgICBcIjg5NzhcIjogXCJwcm9mbGluZTtcIixcbiAgICBcIjg5NzlcIjogXCJwcm9mc3VyZjtcIixcbiAgICBcIjg5ODFcIjogXCJ0ZWxyZWM7XCIsXG4gICAgXCI4OTgyXCI6IFwidGFyZ2V0O1wiLFxuICAgIFwiODk4OFwiOiBcInVsY29ybmVyO1wiLFxuICAgIFwiODk4OVwiOiBcInVyY29ybmVyO1wiLFxuICAgIFwiODk5MFwiOiBcImxsY29ybmVyO1wiLFxuICAgIFwiODk5MVwiOiBcImxyY29ybmVyO1wiLFxuICAgIFwiODk5NFwiOiBcInNmcm93bjtcIixcbiAgICBcIjg5OTVcIjogXCJzc21pbGU7XCIsXG4gICAgXCI5MDA1XCI6IFwiY3lsY3R5O1wiLFxuICAgIFwiOTAwNlwiOiBcInByb2ZhbGFyO1wiLFxuICAgIFwiOTAxNFwiOiBcInRvcGJvdDtcIixcbiAgICBcIjkwMjFcIjogXCJvdmJhcjtcIixcbiAgICBcIjkwMjNcIjogXCJzb2xiYXI7XCIsXG4gICAgXCI5MDg0XCI6IFwiYW5nemFycjtcIixcbiAgICBcIjkxMzZcIjogXCJsbW91c3RhY2hlO1wiLFxuICAgIFwiOTEzN1wiOiBcInJtb3VzdGFjaGU7XCIsXG4gICAgXCI5MTQwXCI6IFwidGJyaztcIixcbiAgICBcIjkxNDFcIjogXCJVbmRlckJyYWNrZXQ7XCIsXG4gICAgXCI5MTQyXCI6IFwiYmJya3Ricms7XCIsXG4gICAgXCI5MTgwXCI6IFwiT3ZlclBhcmVudGhlc2lzO1wiLFxuICAgIFwiOTE4MVwiOiBcIlVuZGVyUGFyZW50aGVzaXM7XCIsXG4gICAgXCI5MTgyXCI6IFwiT3ZlckJyYWNlO1wiLFxuICAgIFwiOTE4M1wiOiBcIlVuZGVyQnJhY2U7XCIsXG4gICAgXCI5MTg2XCI6IFwidHJwZXppdW07XCIsXG4gICAgXCI5MTkxXCI6IFwiZWxpbnRlcnM7XCIsXG4gICAgXCI5MjUxXCI6IFwiYmxhbms7XCIsXG4gICAgXCI5NDE2XCI6IFwib1M7XCIsXG4gICAgXCI5NDcyXCI6IFwiSG9yaXpvbnRhbExpbmU7XCIsXG4gICAgXCI5NDc0XCI6IFwiYm94djtcIixcbiAgICBcIjk0ODRcIjogXCJib3hkcjtcIixcbiAgICBcIjk0ODhcIjogXCJib3hkbDtcIixcbiAgICBcIjk0OTJcIjogXCJib3h1cjtcIixcbiAgICBcIjk0OTZcIjogXCJib3h1bDtcIixcbiAgICBcIjk1MDBcIjogXCJib3h2cjtcIixcbiAgICBcIjk1MDhcIjogXCJib3h2bDtcIixcbiAgICBcIjk1MTZcIjogXCJib3hoZDtcIixcbiAgICBcIjk1MjRcIjogXCJib3hodTtcIixcbiAgICBcIjk1MzJcIjogXCJib3h2aDtcIixcbiAgICBcIjk1NTJcIjogXCJib3hIO1wiLFxuICAgIFwiOTU1M1wiOiBcImJveFY7XCIsXG4gICAgXCI5NTU0XCI6IFwiYm94ZFI7XCIsXG4gICAgXCI5NTU1XCI6IFwiYm94RHI7XCIsXG4gICAgXCI5NTU2XCI6IFwiYm94RFI7XCIsXG4gICAgXCI5NTU3XCI6IFwiYm94ZEw7XCIsXG4gICAgXCI5NTU4XCI6IFwiYm94RGw7XCIsXG4gICAgXCI5NTU5XCI6IFwiYm94REw7XCIsXG4gICAgXCI5NTYwXCI6IFwiYm94dVI7XCIsXG4gICAgXCI5NTYxXCI6IFwiYm94VXI7XCIsXG4gICAgXCI5NTYyXCI6IFwiYm94VVI7XCIsXG4gICAgXCI5NTYzXCI6IFwiYm94dUw7XCIsXG4gICAgXCI5NTY0XCI6IFwiYm94VWw7XCIsXG4gICAgXCI5NTY1XCI6IFwiYm94VUw7XCIsXG4gICAgXCI5NTY2XCI6IFwiYm94dlI7XCIsXG4gICAgXCI5NTY3XCI6IFwiYm94VnI7XCIsXG4gICAgXCI5NTY4XCI6IFwiYm94VlI7XCIsXG4gICAgXCI5NTY5XCI6IFwiYm94dkw7XCIsXG4gICAgXCI5NTcwXCI6IFwiYm94Vmw7XCIsXG4gICAgXCI5NTcxXCI6IFwiYm94Vkw7XCIsXG4gICAgXCI5NTcyXCI6IFwiYm94SGQ7XCIsXG4gICAgXCI5NTczXCI6IFwiYm94aEQ7XCIsXG4gICAgXCI5NTc0XCI6IFwiYm94SEQ7XCIsXG4gICAgXCI5NTc1XCI6IFwiYm94SHU7XCIsXG4gICAgXCI5NTc2XCI6IFwiYm94aFU7XCIsXG4gICAgXCI5NTc3XCI6IFwiYm94SFU7XCIsXG4gICAgXCI5NTc4XCI6IFwiYm94dkg7XCIsXG4gICAgXCI5NTc5XCI6IFwiYm94Vmg7XCIsXG4gICAgXCI5NTgwXCI6IFwiYm94Vkg7XCIsXG4gICAgXCI5NjAwXCI6IFwidWhibGs7XCIsXG4gICAgXCI5NjA0XCI6IFwibGhibGs7XCIsXG4gICAgXCI5NjA4XCI6IFwiYmxvY2s7XCIsXG4gICAgXCI5NjE3XCI6IFwiYmxrMTQ7XCIsXG4gICAgXCI5NjE4XCI6IFwiYmxrMTI7XCIsXG4gICAgXCI5NjE5XCI6IFwiYmxrMzQ7XCIsXG4gICAgXCI5NjMzXCI6IFwic3F1YXJlO1wiLFxuICAgIFwiOTY0MlwiOiBcInNxdWY7XCIsXG4gICAgXCI5NjQzXCI6IFwiRW1wdHlWZXJ5U21hbGxTcXVhcmU7XCIsXG4gICAgXCI5NjQ1XCI6IFwicmVjdDtcIixcbiAgICBcIjk2NDZcIjogXCJtYXJrZXI7XCIsXG4gICAgXCI5NjQ5XCI6IFwiZmx0bnM7XCIsXG4gICAgXCI5NjUxXCI6IFwieHV0cmk7XCIsXG4gICAgXCI5NjUyXCI6IFwidXRyaWY7XCIsXG4gICAgXCI5NjUzXCI6IFwidXRyaTtcIixcbiAgICBcIjk2NTZcIjogXCJydHJpZjtcIixcbiAgICBcIjk2NTdcIjogXCJ0cmlhbmdsZXJpZ2h0O1wiLFxuICAgIFwiOTY2MVwiOiBcInhkdHJpO1wiLFxuICAgIFwiOTY2MlwiOiBcImR0cmlmO1wiLFxuICAgIFwiOTY2M1wiOiBcInRyaWFuZ2xlZG93bjtcIixcbiAgICBcIjk2NjZcIjogXCJsdHJpZjtcIixcbiAgICBcIjk2NjdcIjogXCJ0cmlhbmdsZWxlZnQ7XCIsXG4gICAgXCI5Njc0XCI6IFwibG96ZW5nZTtcIixcbiAgICBcIjk2NzVcIjogXCJjaXI7XCIsXG4gICAgXCI5NzA4XCI6IFwidHJpZG90O1wiLFxuICAgIFwiOTcxMVwiOiBcInhjaXJjO1wiLFxuICAgIFwiOTcyMFwiOiBcInVsdHJpO1wiLFxuICAgIFwiOTcyMVwiOiBcInVydHJpO1wiLFxuICAgIFwiOTcyMlwiOiBcImxsdHJpO1wiLFxuICAgIFwiOTcyM1wiOiBcIkVtcHR5U21hbGxTcXVhcmU7XCIsXG4gICAgXCI5NzI0XCI6IFwiRmlsbGVkU21hbGxTcXVhcmU7XCIsXG4gICAgXCI5NzMzXCI6IFwic3RhcmY7XCIsXG4gICAgXCI5NzM0XCI6IFwic3RhcjtcIixcbiAgICBcIjk3NDJcIjogXCJwaG9uZTtcIixcbiAgICBcIjk3OTJcIjogXCJmZW1hbGU7XCIsXG4gICAgXCI5Nzk0XCI6IFwibWFsZTtcIixcbiAgICBcIjk4MjRcIjogXCJzcGFkZXN1aXQ7XCIsXG4gICAgXCI5ODI3XCI6IFwiY2x1YnN1aXQ7XCIsXG4gICAgXCI5ODI5XCI6IFwiaGVhcnRzdWl0O1wiLFxuICAgIFwiOTgzMFwiOiBcImRpYW1zO1wiLFxuICAgIFwiOTgzNFwiOiBcInN1bmc7XCIsXG4gICAgXCI5ODM3XCI6IFwiZmxhdDtcIixcbiAgICBcIjk4MzhcIjogXCJuYXR1cmFsO1wiLFxuICAgIFwiOTgzOVwiOiBcInNoYXJwO1wiLFxuICAgIFwiMTAwMDNcIjogXCJjaGVja21hcms7XCIsXG4gICAgXCIxMDAwN1wiOiBcImNyb3NzO1wiLFxuICAgIFwiMTAwMTZcIjogXCJtYWx0ZXNlO1wiLFxuICAgIFwiMTAwMzhcIjogXCJzZXh0O1wiLFxuICAgIFwiMTAwNzJcIjogXCJWZXJ0aWNhbFNlcGFyYXRvcjtcIixcbiAgICBcIjEwMDk4XCI6IFwibGJicms7XCIsXG4gICAgXCIxMDA5OVwiOiBcInJiYnJrO1wiLFxuICAgIFwiMTAxODRcIjogXCJic29saHN1YjtcIixcbiAgICBcIjEwMTg1XCI6IFwic3VwaHNvbDtcIixcbiAgICBcIjEwMjE0XCI6IFwibG9icms7XCIsXG4gICAgXCIxMDIxNVwiOiBcInJvYnJrO1wiLFxuICAgIFwiMTAyMTZcIjogXCJMZWZ0QW5nbGVCcmFja2V0O1wiLFxuICAgIFwiMTAyMTdcIjogXCJSaWdodEFuZ2xlQnJhY2tldDtcIixcbiAgICBcIjEwMjE4XCI6IFwiTGFuZztcIixcbiAgICBcIjEwMjE5XCI6IFwiUmFuZztcIixcbiAgICBcIjEwMjIwXCI6IFwibG9hbmc7XCIsXG4gICAgXCIxMDIyMVwiOiBcInJvYW5nO1wiLFxuICAgIFwiMTAyMjlcIjogXCJ4bGFycjtcIixcbiAgICBcIjEwMjMwXCI6IFwieHJhcnI7XCIsXG4gICAgXCIxMDIzMVwiOiBcInhoYXJyO1wiLFxuICAgIFwiMTAyMzJcIjogXCJ4bEFycjtcIixcbiAgICBcIjEwMjMzXCI6IFwieHJBcnI7XCIsXG4gICAgXCIxMDIzNFwiOiBcInhoQXJyO1wiLFxuICAgIFwiMTAyMzZcIjogXCJ4bWFwO1wiLFxuICAgIFwiMTAyMzlcIjogXCJkemlncmFycjtcIixcbiAgICBcIjEwNDk4XCI6IFwibnZsQXJyO1wiLFxuICAgIFwiMTA0OTlcIjogXCJudnJBcnI7XCIsXG4gICAgXCIxMDUwMFwiOiBcIm52SGFycjtcIixcbiAgICBcIjEwNTAxXCI6IFwiTWFwO1wiLFxuICAgIFwiMTA1MDhcIjogXCJsYmFycjtcIixcbiAgICBcIjEwNTA5XCI6IFwicmJhcnI7XCIsXG4gICAgXCIxMDUxMFwiOiBcImxCYXJyO1wiLFxuICAgIFwiMTA1MTFcIjogXCJyQmFycjtcIixcbiAgICBcIjEwNTEyXCI6IFwiUkJhcnI7XCIsXG4gICAgXCIxMDUxM1wiOiBcIkREb3RyYWhkO1wiLFxuICAgIFwiMTA1MTRcIjogXCJVcEFycm93QmFyO1wiLFxuICAgIFwiMTA1MTVcIjogXCJEb3duQXJyb3dCYXI7XCIsXG4gICAgXCIxMDUxOFwiOiBcIlJhcnJ0bDtcIixcbiAgICBcIjEwNTIxXCI6IFwibGF0YWlsO1wiLFxuICAgIFwiMTA1MjJcIjogXCJyYXRhaWw7XCIsXG4gICAgXCIxMDUyM1wiOiBcImxBdGFpbDtcIixcbiAgICBcIjEwNTI0XCI6IFwickF0YWlsO1wiLFxuICAgIFwiMTA1MjVcIjogXCJsYXJyZnM7XCIsXG4gICAgXCIxMDUyNlwiOiBcInJhcnJmcztcIixcbiAgICBcIjEwNTI3XCI6IFwibGFycmJmcztcIixcbiAgICBcIjEwNTI4XCI6IFwicmFycmJmcztcIixcbiAgICBcIjEwNTMxXCI6IFwibndhcmhrO1wiLFxuICAgIFwiMTA1MzJcIjogXCJuZWFyaGs7XCIsXG4gICAgXCIxMDUzM1wiOiBcInNlYXJoaztcIixcbiAgICBcIjEwNTM0XCI6IFwic3dhcmhrO1wiLFxuICAgIFwiMTA1MzVcIjogXCJud25lYXI7XCIsXG4gICAgXCIxMDUzNlwiOiBcInRvZWE7XCIsXG4gICAgXCIxMDUzN1wiOiBcInRvc2E7XCIsXG4gICAgXCIxMDUzOFwiOiBcInN3bndhcjtcIixcbiAgICBcIjEwNTQ3XCI6IFwicmFycmM7XCIsXG4gICAgXCIxMDU0OVwiOiBcImN1ZGFycnI7XCIsXG4gICAgXCIxMDU1MFwiOiBcImxkY2E7XCIsXG4gICAgXCIxMDU1MVwiOiBcInJkY2E7XCIsXG4gICAgXCIxMDU1MlwiOiBcImN1ZGFycmw7XCIsXG4gICAgXCIxMDU1M1wiOiBcImxhcnJwbDtcIixcbiAgICBcIjEwNTU2XCI6IFwiY3VyYXJybTtcIixcbiAgICBcIjEwNTU3XCI6IFwiY3VsYXJycDtcIixcbiAgICBcIjEwNTY1XCI6IFwicmFycnBsO1wiLFxuICAgIFwiMTA1NjhcIjogXCJoYXJyY2lyO1wiLFxuICAgIFwiMTA1NjlcIjogXCJVYXJyb2NpcjtcIixcbiAgICBcIjEwNTcwXCI6IFwibHVyZHNoYXI7XCIsXG4gICAgXCIxMDU3MVwiOiBcImxkcnVzaGFyO1wiLFxuICAgIFwiMTA1NzRcIjogXCJMZWZ0UmlnaHRWZWN0b3I7XCIsXG4gICAgXCIxMDU3NVwiOiBcIlJpZ2h0VXBEb3duVmVjdG9yO1wiLFxuICAgIFwiMTA1NzZcIjogXCJEb3duTGVmdFJpZ2h0VmVjdG9yO1wiLFxuICAgIFwiMTA1NzdcIjogXCJMZWZ0VXBEb3duVmVjdG9yO1wiLFxuICAgIFwiMTA1NzhcIjogXCJMZWZ0VmVjdG9yQmFyO1wiLFxuICAgIFwiMTA1NzlcIjogXCJSaWdodFZlY3RvckJhcjtcIixcbiAgICBcIjEwNTgwXCI6IFwiUmlnaHRVcFZlY3RvckJhcjtcIixcbiAgICBcIjEwNTgxXCI6IFwiUmlnaHREb3duVmVjdG9yQmFyO1wiLFxuICAgIFwiMTA1ODJcIjogXCJEb3duTGVmdFZlY3RvckJhcjtcIixcbiAgICBcIjEwNTgzXCI6IFwiRG93blJpZ2h0VmVjdG9yQmFyO1wiLFxuICAgIFwiMTA1ODRcIjogXCJMZWZ0VXBWZWN0b3JCYXI7XCIsXG4gICAgXCIxMDU4NVwiOiBcIkxlZnREb3duVmVjdG9yQmFyO1wiLFxuICAgIFwiMTA1ODZcIjogXCJMZWZ0VGVlVmVjdG9yO1wiLFxuICAgIFwiMTA1ODdcIjogXCJSaWdodFRlZVZlY3RvcjtcIixcbiAgICBcIjEwNTg4XCI6IFwiUmlnaHRVcFRlZVZlY3RvcjtcIixcbiAgICBcIjEwNTg5XCI6IFwiUmlnaHREb3duVGVlVmVjdG9yO1wiLFxuICAgIFwiMTA1OTBcIjogXCJEb3duTGVmdFRlZVZlY3RvcjtcIixcbiAgICBcIjEwNTkxXCI6IFwiRG93blJpZ2h0VGVlVmVjdG9yO1wiLFxuICAgIFwiMTA1OTJcIjogXCJMZWZ0VXBUZWVWZWN0b3I7XCIsXG4gICAgXCIxMDU5M1wiOiBcIkxlZnREb3duVGVlVmVjdG9yO1wiLFxuICAgIFwiMTA1OTRcIjogXCJsSGFyO1wiLFxuICAgIFwiMTA1OTVcIjogXCJ1SGFyO1wiLFxuICAgIFwiMTA1OTZcIjogXCJySGFyO1wiLFxuICAgIFwiMTA1OTdcIjogXCJkSGFyO1wiLFxuICAgIFwiMTA1OThcIjogXCJsdXJ1aGFyO1wiLFxuICAgIFwiMTA1OTlcIjogXCJsZHJkaGFyO1wiLFxuICAgIFwiMTA2MDBcIjogXCJydWx1aGFyO1wiLFxuICAgIFwiMTA2MDFcIjogXCJyZGxkaGFyO1wiLFxuICAgIFwiMTA2MDJcIjogXCJsaGFydWw7XCIsXG4gICAgXCIxMDYwM1wiOiBcImxsaGFyZDtcIixcbiAgICBcIjEwNjA0XCI6IFwicmhhcnVsO1wiLFxuICAgIFwiMTA2MDVcIjogXCJscmhhcmQ7XCIsXG4gICAgXCIxMDYwNlwiOiBcIlVwRXF1aWxpYnJpdW07XCIsXG4gICAgXCIxMDYwN1wiOiBcIlJldmVyc2VVcEVxdWlsaWJyaXVtO1wiLFxuICAgIFwiMTA2MDhcIjogXCJSb3VuZEltcGxpZXM7XCIsXG4gICAgXCIxMDYwOVwiOiBcImVyYXJyO1wiLFxuICAgIFwiMTA2MTBcIjogXCJzaW1yYXJyO1wiLFxuICAgIFwiMTA2MTFcIjogXCJsYXJyc2ltO1wiLFxuICAgIFwiMTA2MTJcIjogXCJyYXJyc2ltO1wiLFxuICAgIFwiMTA2MTNcIjogXCJyYXJyYXA7XCIsXG4gICAgXCIxMDYxNFwiOiBcImx0bGFycjtcIixcbiAgICBcIjEwNjE2XCI6IFwiZ3RyYXJyO1wiLFxuICAgIFwiMTA2MTdcIjogXCJzdWJyYXJyO1wiLFxuICAgIFwiMTA2MTlcIjogXCJzdXBsYXJyO1wiLFxuICAgIFwiMTA2MjBcIjogXCJsZmlzaHQ7XCIsXG4gICAgXCIxMDYyMVwiOiBcInJmaXNodDtcIixcbiAgICBcIjEwNjIyXCI6IFwidWZpc2h0O1wiLFxuICAgIFwiMTA2MjNcIjogXCJkZmlzaHQ7XCIsXG4gICAgXCIxMDYyOVwiOiBcImxvcGFyO1wiLFxuICAgIFwiMTA2MzBcIjogXCJyb3BhcjtcIixcbiAgICBcIjEwNjM1XCI6IFwibGJya2U7XCIsXG4gICAgXCIxMDYzNlwiOiBcInJicmtlO1wiLFxuICAgIFwiMTA2MzdcIjogXCJsYnJrc2x1O1wiLFxuICAgIFwiMTA2MzhcIjogXCJyYnJrc2xkO1wiLFxuICAgIFwiMTA2MzlcIjogXCJsYnJrc2xkO1wiLFxuICAgIFwiMTA2NDBcIjogXCJyYnJrc2x1O1wiLFxuICAgIFwiMTA2NDFcIjogXCJsYW5nZDtcIixcbiAgICBcIjEwNjQyXCI6IFwicmFuZ2Q7XCIsXG4gICAgXCIxMDY0M1wiOiBcImxwYXJsdDtcIixcbiAgICBcIjEwNjQ0XCI6IFwicnBhcmd0O1wiLFxuICAgIFwiMTA2NDVcIjogXCJndGxQYXI7XCIsXG4gICAgXCIxMDY0NlwiOiBcImx0clBhcjtcIixcbiAgICBcIjEwNjUwXCI6IFwidnppZ3phZztcIixcbiAgICBcIjEwNjUyXCI6IFwidmFuZ3J0O1wiLFxuICAgIFwiMTA2NTNcIjogXCJhbmdydHZiZDtcIixcbiAgICBcIjEwNjYwXCI6IFwiYW5nZTtcIixcbiAgICBcIjEwNjYxXCI6IFwicmFuZ2U7XCIsXG4gICAgXCIxMDY2MlwiOiBcImR3YW5nbGU7XCIsXG4gICAgXCIxMDY2M1wiOiBcInV3YW5nbGU7XCIsXG4gICAgXCIxMDY2NFwiOiBcImFuZ21zZGFhO1wiLFxuICAgIFwiMTA2NjVcIjogXCJhbmdtc2RhYjtcIixcbiAgICBcIjEwNjY2XCI6IFwiYW5nbXNkYWM7XCIsXG4gICAgXCIxMDY2N1wiOiBcImFuZ21zZGFkO1wiLFxuICAgIFwiMTA2NjhcIjogXCJhbmdtc2RhZTtcIixcbiAgICBcIjEwNjY5XCI6IFwiYW5nbXNkYWY7XCIsXG4gICAgXCIxMDY3MFwiOiBcImFuZ21zZGFnO1wiLFxuICAgIFwiMTA2NzFcIjogXCJhbmdtc2RhaDtcIixcbiAgICBcIjEwNjcyXCI6IFwiYmVtcHR5djtcIixcbiAgICBcIjEwNjczXCI6IFwiZGVtcHR5djtcIixcbiAgICBcIjEwNjc0XCI6IFwiY2VtcHR5djtcIixcbiAgICBcIjEwNjc1XCI6IFwicmFlbXB0eXY7XCIsXG4gICAgXCIxMDY3NlwiOiBcImxhZW1wdHl2O1wiLFxuICAgIFwiMTA2NzdcIjogXCJvaGJhcjtcIixcbiAgICBcIjEwNjc4XCI6IFwib21pZDtcIixcbiAgICBcIjEwNjc5XCI6IFwib3BhcjtcIixcbiAgICBcIjEwNjgxXCI6IFwib3BlcnA7XCIsXG4gICAgXCIxMDY4M1wiOiBcIm9sY3Jvc3M7XCIsXG4gICAgXCIxMDY4NFwiOiBcIm9kc29sZDtcIixcbiAgICBcIjEwNjg2XCI6IFwib2xjaXI7XCIsXG4gICAgXCIxMDY4N1wiOiBcIm9mY2lyO1wiLFxuICAgIFwiMTA2ODhcIjogXCJvbHQ7XCIsXG4gICAgXCIxMDY4OVwiOiBcIm9ndDtcIixcbiAgICBcIjEwNjkwXCI6IFwiY2lyc2NpcjtcIixcbiAgICBcIjEwNjkxXCI6IFwiY2lyRTtcIixcbiAgICBcIjEwNjkyXCI6IFwic29sYjtcIixcbiAgICBcIjEwNjkzXCI6IFwiYnNvbGI7XCIsXG4gICAgXCIxMDY5N1wiOiBcImJveGJveDtcIixcbiAgICBcIjEwNzAxXCI6IFwidHJpc2I7XCIsXG4gICAgXCIxMDcwMlwiOiBcInJ0cmlsdHJpO1wiLFxuICAgIFwiMTA3MDNcIjogXCJMZWZ0VHJpYW5nbGVCYXI7XCIsXG4gICAgXCIxMDcwNFwiOiBcIlJpZ2h0VHJpYW5nbGVCYXI7XCIsXG4gICAgXCIxMDcxNlwiOiBcImlpbmZpbjtcIixcbiAgICBcIjEwNzE3XCI6IFwiaW5maW50aWU7XCIsXG4gICAgXCIxMDcxOFwiOiBcIm52aW5maW47XCIsXG4gICAgXCIxMDcyM1wiOiBcImVwYXJzbDtcIixcbiAgICBcIjEwNzI0XCI6IFwic21lcGFyc2w7XCIsXG4gICAgXCIxMDcyNVwiOiBcImVxdnBhcnNsO1wiLFxuICAgIFwiMTA3MzFcIjogXCJsb3pmO1wiLFxuICAgIFwiMTA3NDBcIjogXCJSdWxlRGVsYXllZDtcIixcbiAgICBcIjEwNzQyXCI6IFwiZHNvbDtcIixcbiAgICBcIjEwNzUyXCI6IFwieG9kb3Q7XCIsXG4gICAgXCIxMDc1M1wiOiBcInhvcGx1cztcIixcbiAgICBcIjEwNzU0XCI6IFwieG90aW1lO1wiLFxuICAgIFwiMTA3NTZcIjogXCJ4dXBsdXM7XCIsXG4gICAgXCIxMDc1OFwiOiBcInhzcWN1cDtcIixcbiAgICBcIjEwNzY0XCI6IFwicWludDtcIixcbiAgICBcIjEwNzY1XCI6IFwiZnBhcnRpbnQ7XCIsXG4gICAgXCIxMDc2OFwiOiBcImNpcmZuaW50O1wiLFxuICAgIFwiMTA3NjlcIjogXCJhd2ludDtcIixcbiAgICBcIjEwNzcwXCI6IFwicnBwb2xpbnQ7XCIsXG4gICAgXCIxMDc3MVwiOiBcInNjcG9saW50O1wiLFxuICAgIFwiMTA3NzJcIjogXCJucG9saW50O1wiLFxuICAgIFwiMTA3NzNcIjogXCJwb2ludGludDtcIixcbiAgICBcIjEwNzc0XCI6IFwicXVhdGludDtcIixcbiAgICBcIjEwNzc1XCI6IFwiaW50bGFyaGs7XCIsXG4gICAgXCIxMDc4NlwiOiBcInBsdXNjaXI7XCIsXG4gICAgXCIxMDc4N1wiOiBcInBsdXNhY2lyO1wiLFxuICAgIFwiMTA3ODhcIjogXCJzaW1wbHVzO1wiLFxuICAgIFwiMTA3ODlcIjogXCJwbHVzZHU7XCIsXG4gICAgXCIxMDc5MFwiOiBcInBsdXNzaW07XCIsXG4gICAgXCIxMDc5MVwiOiBcInBsdXN0d287XCIsXG4gICAgXCIxMDc5M1wiOiBcIm1jb21tYTtcIixcbiAgICBcIjEwNzk0XCI6IFwibWludXNkdTtcIixcbiAgICBcIjEwNzk3XCI6IFwibG9wbHVzO1wiLFxuICAgIFwiMTA3OThcIjogXCJyb3BsdXM7XCIsXG4gICAgXCIxMDc5OVwiOiBcIkNyb3NzO1wiLFxuICAgIFwiMTA4MDBcIjogXCJ0aW1lc2Q7XCIsXG4gICAgXCIxMDgwMVwiOiBcInRpbWVzYmFyO1wiLFxuICAgIFwiMTA4MDNcIjogXCJzbWFzaHA7XCIsXG4gICAgXCIxMDgwNFwiOiBcImxvdGltZXM7XCIsXG4gICAgXCIxMDgwNVwiOiBcInJvdGltZXM7XCIsXG4gICAgXCIxMDgwNlwiOiBcIm90aW1lc2FzO1wiLFxuICAgIFwiMTA4MDdcIjogXCJPdGltZXM7XCIsXG4gICAgXCIxMDgwOFwiOiBcIm9kaXY7XCIsXG4gICAgXCIxMDgwOVwiOiBcInRyaXBsdXM7XCIsXG4gICAgXCIxMDgxMFwiOiBcInRyaW1pbnVzO1wiLFxuICAgIFwiMTA4MTFcIjogXCJ0cml0aW1lO1wiLFxuICAgIFwiMTA4MTJcIjogXCJpcHJvZDtcIixcbiAgICBcIjEwODE1XCI6IFwiYW1hbGc7XCIsXG4gICAgXCIxMDgxNlwiOiBcImNhcGRvdDtcIixcbiAgICBcIjEwODE4XCI6IFwibmN1cDtcIixcbiAgICBcIjEwODE5XCI6IFwibmNhcDtcIixcbiAgICBcIjEwODIwXCI6IFwiY2FwYW5kO1wiLFxuICAgIFwiMTA4MjFcIjogXCJjdXBvcjtcIixcbiAgICBcIjEwODIyXCI6IFwiY3VwY2FwO1wiLFxuICAgIFwiMTA4MjNcIjogXCJjYXBjdXA7XCIsXG4gICAgXCIxMDgyNFwiOiBcImN1cGJyY2FwO1wiLFxuICAgIFwiMTA4MjVcIjogXCJjYXBicmN1cDtcIixcbiAgICBcIjEwODI2XCI6IFwiY3VwY3VwO1wiLFxuICAgIFwiMTA4MjdcIjogXCJjYXBjYXA7XCIsXG4gICAgXCIxMDgyOFwiOiBcImNjdXBzO1wiLFxuICAgIFwiMTA4MjlcIjogXCJjY2FwcztcIixcbiAgICBcIjEwODMyXCI6IFwiY2N1cHNzbTtcIixcbiAgICBcIjEwODM1XCI6IFwiQW5kO1wiLFxuICAgIFwiMTA4MzZcIjogXCJPcjtcIixcbiAgICBcIjEwODM3XCI6IFwiYW5kYW5kO1wiLFxuICAgIFwiMTA4MzhcIjogXCJvcm9yO1wiLFxuICAgIFwiMTA4MzlcIjogXCJvcnNsb3BlO1wiLFxuICAgIFwiMTA4NDBcIjogXCJhbmRzbG9wZTtcIixcbiAgICBcIjEwODQyXCI6IFwiYW5kdjtcIixcbiAgICBcIjEwODQzXCI6IFwib3J2O1wiLFxuICAgIFwiMTA4NDRcIjogXCJhbmRkO1wiLFxuICAgIFwiMTA4NDVcIjogXCJvcmQ7XCIsXG4gICAgXCIxMDg0N1wiOiBcIndlZGJhcjtcIixcbiAgICBcIjEwODU0XCI6IFwic2RvdGU7XCIsXG4gICAgXCIxMDg1OFwiOiBcInNpbWRvdDtcIixcbiAgICBcIjEwODYxXCI6IFwiY29uZ2RvdDtcIixcbiAgICBcIjEwODYyXCI6IFwiZWFzdGVyO1wiLFxuICAgIFwiMTA4NjNcIjogXCJhcGFjaXI7XCIsXG4gICAgXCIxMDg2NFwiOiBcImFwRTtcIixcbiAgICBcIjEwODY1XCI6IFwiZXBsdXM7XCIsXG4gICAgXCIxMDg2NlwiOiBcInBsdXNlO1wiLFxuICAgIFwiMTA4NjdcIjogXCJFc2ltO1wiLFxuICAgIFwiMTA4NjhcIjogXCJDb2xvbmU7XCIsXG4gICAgXCIxMDg2OVwiOiBcIkVxdWFsO1wiLFxuICAgIFwiMTA4NzFcIjogXCJlRERvdDtcIixcbiAgICBcIjEwODcyXCI6IFwiZXF1aXZERDtcIixcbiAgICBcIjEwODczXCI6IFwibHRjaXI7XCIsXG4gICAgXCIxMDg3NFwiOiBcImd0Y2lyO1wiLFxuICAgIFwiMTA4NzVcIjogXCJsdHF1ZXN0O1wiLFxuICAgIFwiMTA4NzZcIjogXCJndHF1ZXN0O1wiLFxuICAgIFwiMTA4NzdcIjogXCJMZXNzU2xhbnRFcXVhbDtcIixcbiAgICBcIjEwODc4XCI6IFwiR3JlYXRlclNsYW50RXF1YWw7XCIsXG4gICAgXCIxMDg3OVwiOiBcImxlc2RvdDtcIixcbiAgICBcIjEwODgwXCI6IFwiZ2VzZG90O1wiLFxuICAgIFwiMTA4ODFcIjogXCJsZXNkb3RvO1wiLFxuICAgIFwiMTA4ODJcIjogXCJnZXNkb3RvO1wiLFxuICAgIFwiMTA4ODNcIjogXCJsZXNkb3RvcjtcIixcbiAgICBcIjEwODg0XCI6IFwiZ2VzZG90b2w7XCIsXG4gICAgXCIxMDg4NVwiOiBcImxlc3NhcHByb3g7XCIsXG4gICAgXCIxMDg4NlwiOiBcImd0cmFwcHJveDtcIixcbiAgICBcIjEwODg3XCI6IFwibG5lcTtcIixcbiAgICBcIjEwODg4XCI6IFwiZ25lcTtcIixcbiAgICBcIjEwODg5XCI6IFwibG5hcHByb3g7XCIsXG4gICAgXCIxMDg5MFwiOiBcImduYXBwcm94O1wiLFxuICAgIFwiMTA4OTFcIjogXCJsZXNzZXFxZ3RyO1wiLFxuICAgIFwiMTA4OTJcIjogXCJndHJlcXFsZXNzO1wiLFxuICAgIFwiMTA4OTNcIjogXCJsc2ltZTtcIixcbiAgICBcIjEwODk0XCI6IFwiZ3NpbWU7XCIsXG4gICAgXCIxMDg5NVwiOiBcImxzaW1nO1wiLFxuICAgIFwiMTA4OTZcIjogXCJnc2ltbDtcIixcbiAgICBcIjEwODk3XCI6IFwibGdFO1wiLFxuICAgIFwiMTA4OThcIjogXCJnbEU7XCIsXG4gICAgXCIxMDg5OVwiOiBcImxlc2dlcztcIixcbiAgICBcIjEwOTAwXCI6IFwiZ2VzbGVzO1wiLFxuICAgIFwiMTA5MDFcIjogXCJlcXNsYW50bGVzcztcIixcbiAgICBcIjEwOTAyXCI6IFwiZXFzbGFudGd0cjtcIixcbiAgICBcIjEwOTAzXCI6IFwiZWxzZG90O1wiLFxuICAgIFwiMTA5MDRcIjogXCJlZ3Nkb3Q7XCIsXG4gICAgXCIxMDkwNVwiOiBcImVsO1wiLFxuICAgIFwiMTA5MDZcIjogXCJlZztcIixcbiAgICBcIjEwOTA5XCI6IFwic2ltbDtcIixcbiAgICBcIjEwOTEwXCI6IFwic2ltZztcIixcbiAgICBcIjEwOTExXCI6IFwic2ltbEU7XCIsXG4gICAgXCIxMDkxMlwiOiBcInNpbWdFO1wiLFxuICAgIFwiMTA5MTNcIjogXCJMZXNzTGVzcztcIixcbiAgICBcIjEwOTE0XCI6IFwiR3JlYXRlckdyZWF0ZXI7XCIsXG4gICAgXCIxMDkxNlwiOiBcImdsajtcIixcbiAgICBcIjEwOTE3XCI6IFwiZ2xhO1wiLFxuICAgIFwiMTA5MThcIjogXCJsdGNjO1wiLFxuICAgIFwiMTA5MTlcIjogXCJndGNjO1wiLFxuICAgIFwiMTA5MjBcIjogXCJsZXNjYztcIixcbiAgICBcIjEwOTIxXCI6IFwiZ2VzY2M7XCIsXG4gICAgXCIxMDkyMlwiOiBcInNtdDtcIixcbiAgICBcIjEwOTIzXCI6IFwibGF0O1wiLFxuICAgIFwiMTA5MjRcIjogXCJzbXRlO1wiLFxuICAgIFwiMTA5MjVcIjogXCJsYXRlO1wiLFxuICAgIFwiMTA5MjZcIjogXCJidW1wRTtcIixcbiAgICBcIjEwOTI3XCI6IFwicHJlY2VxO1wiLFxuICAgIFwiMTA5MjhcIjogXCJzdWNjZXE7XCIsXG4gICAgXCIxMDkzMVwiOiBcInByRTtcIixcbiAgICBcIjEwOTMyXCI6IFwic2NFO1wiLFxuICAgIFwiMTA5MzNcIjogXCJwcm5FO1wiLFxuICAgIFwiMTA5MzRcIjogXCJzdWNjbmVxcTtcIixcbiAgICBcIjEwOTM1XCI6IFwicHJlY2FwcHJveDtcIixcbiAgICBcIjEwOTM2XCI6IFwic3VjY2FwcHJveDtcIixcbiAgICBcIjEwOTM3XCI6IFwicHJuYXA7XCIsXG4gICAgXCIxMDkzOFwiOiBcInN1Y2NuYXBwcm94O1wiLFxuICAgIFwiMTA5MzlcIjogXCJQcjtcIixcbiAgICBcIjEwOTQwXCI6IFwiU2M7XCIsXG4gICAgXCIxMDk0MVwiOiBcInN1YmRvdDtcIixcbiAgICBcIjEwOTQyXCI6IFwic3VwZG90O1wiLFxuICAgIFwiMTA5NDNcIjogXCJzdWJwbHVzO1wiLFxuICAgIFwiMTA5NDRcIjogXCJzdXBwbHVzO1wiLFxuICAgIFwiMTA5NDVcIjogXCJzdWJtdWx0O1wiLFxuICAgIFwiMTA5NDZcIjogXCJzdXBtdWx0O1wiLFxuICAgIFwiMTA5NDdcIjogXCJzdWJlZG90O1wiLFxuICAgIFwiMTA5NDhcIjogXCJzdXBlZG90O1wiLFxuICAgIFwiMTA5NDlcIjogXCJzdWJzZXRlcXE7XCIsXG4gICAgXCIxMDk1MFwiOiBcInN1cHNldGVxcTtcIixcbiAgICBcIjEwOTUxXCI6IFwic3Vic2ltO1wiLFxuICAgIFwiMTA5NTJcIjogXCJzdXBzaW07XCIsXG4gICAgXCIxMDk1NVwiOiBcInN1YnNldG5lcXE7XCIsXG4gICAgXCIxMDk1NlwiOiBcInN1cHNldG5lcXE7XCIsXG4gICAgXCIxMDk1OVwiOiBcImNzdWI7XCIsXG4gICAgXCIxMDk2MFwiOiBcImNzdXA7XCIsXG4gICAgXCIxMDk2MVwiOiBcImNzdWJlO1wiLFxuICAgIFwiMTA5NjJcIjogXCJjc3VwZTtcIixcbiAgICBcIjEwOTYzXCI6IFwic3Vic3VwO1wiLFxuICAgIFwiMTA5NjRcIjogXCJzdXBzdWI7XCIsXG4gICAgXCIxMDk2NVwiOiBcInN1YnN1YjtcIixcbiAgICBcIjEwOTY2XCI6IFwic3Vwc3VwO1wiLFxuICAgIFwiMTA5NjdcIjogXCJzdXBoc3ViO1wiLFxuICAgIFwiMTA5NjhcIjogXCJzdXBkc3ViO1wiLFxuICAgIFwiMTA5NjlcIjogXCJmb3JrdjtcIixcbiAgICBcIjEwOTcwXCI6IFwidG9wZm9yaztcIixcbiAgICBcIjEwOTcxXCI6IFwibWxjcDtcIixcbiAgICBcIjEwOTgwXCI6IFwiRG91YmxlTGVmdFRlZTtcIixcbiAgICBcIjEwOTgyXCI6IFwiVmRhc2hsO1wiLFxuICAgIFwiMTA5ODNcIjogXCJCYXJ2O1wiLFxuICAgIFwiMTA5ODRcIjogXCJ2QmFyO1wiLFxuICAgIFwiMTA5ODVcIjogXCJ2QmFydjtcIixcbiAgICBcIjEwOTg3XCI6IFwiVmJhcjtcIixcbiAgICBcIjEwOTg4XCI6IFwiTm90O1wiLFxuICAgIFwiMTA5ODlcIjogXCJiTm90O1wiLFxuICAgIFwiMTA5OTBcIjogXCJybm1pZDtcIixcbiAgICBcIjEwOTkxXCI6IFwiY2lybWlkO1wiLFxuICAgIFwiMTA5OTJcIjogXCJtaWRjaXI7XCIsXG4gICAgXCIxMDk5M1wiOiBcInRvcGNpcjtcIixcbiAgICBcIjEwOTk0XCI6IFwibmhwYXI7XCIsXG4gICAgXCIxMDk5NVwiOiBcInBhcnNpbTtcIixcbiAgICBcIjExMDA1XCI6IFwicGFyc2w7XCIsXG4gICAgXCI2NDI1NlwiOiBcImZmbGlnO1wiLFxuICAgIFwiNjQyNTdcIjogXCJmaWxpZztcIixcbiAgICBcIjY0MjU4XCI6IFwiZmxsaWc7XCIsXG4gICAgXCI2NDI1OVwiOiBcImZmaWxpZztcIixcbiAgICBcIjY0MjYwXCI6IFwiZmZsbGlnO1wiXG59IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWF0Y2hPcGVyYXRvcnNSZSA9IC9bfFxcXFx7fSgpW1xcXV4kKyo/Ll0vZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyKSB7XG5cdGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHRyZXR1cm4gc3RyLnJlcGxhY2UobWF0Y2hPcGVyYXRvcnNSZSwgJ1xcXFwkJicpO1xufTtcbiIsIi8qIVxuICogZXhwYW5kLWJyYWNrZXRzIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9leHBhbmQtYnJhY2tldHM+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzUG9zaXhCcmFja2V0ID0gcmVxdWlyZSgnaXMtcG9zaXgtYnJhY2tldCcpO1xuXG4vKipcbiAqIFBPU0lYIGNoYXJhY3RlciBjbGFzc2VzXG4gKi9cblxudmFyIFBPU0lYID0ge1xuICBhbG51bTogJ2EtekEtWjAtOScsXG4gIGFscGhhOiAnYS16QS1aJyxcbiAgYmxhbms6ICcgXFxcXHQnLFxuICBjbnRybDogJ1xcXFx4MDAtXFxcXHgxRlxcXFx4N0YnLFxuICBkaWdpdDogJzAtOScsXG4gIGdyYXBoOiAnXFxcXHgyMS1cXFxceDdFJyxcbiAgbG93ZXI6ICdhLXonLFxuICBwcmludDogJ1xcXFx4MjAtXFxcXHg3RScsXG4gIHB1bmN0OiAnLSFcIiMkJSZcXCcoKVxcXFwqKywuLzo7PD0+P0BbXFxcXF1eX2B7fH1+JyxcbiAgc3BhY2U6ICcgXFxcXHRcXFxcclxcXFxuXFxcXHZcXFxcZicsXG4gIHVwcGVyOiAnQS1aJyxcbiAgd29yZDogICdBLVphLXowLTlfJyxcbiAgeGRpZ2l0OiAnQS1GYS1mMC05Jyxcbn07XG5cbi8qKlxuICogRXhwb3NlIGBicmFja2V0c2BcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJyYWNrZXRzO1xuXG5mdW5jdGlvbiBicmFja2V0cyhzdHIpIHtcbiAgaWYgKCFpc1Bvc2l4QnJhY2tldChzdHIpKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIHZhciBuZWdhdGVkID0gZmFsc2U7XG4gIGlmIChzdHIuaW5kZXhPZignW14nKSAhPT0gLTEpIHtcbiAgICBuZWdhdGVkID0gdHJ1ZTtcbiAgICBzdHIgPSBzdHIuc3BsaXQoJ1teJykuam9pbignWycpO1xuICB9XG4gIGlmIChzdHIuaW5kZXhPZignWyEnKSAhPT0gLTEpIHtcbiAgICBuZWdhdGVkID0gdHJ1ZTtcbiAgICBzdHIgPSBzdHIuc3BsaXQoJ1shJykuam9pbignWycpO1xuICB9XG5cbiAgdmFyIGEgPSBzdHIuc3BsaXQoJ1snKTtcbiAgdmFyIGIgPSBzdHIuc3BsaXQoJ10nKTtcbiAgdmFyIGltYmFsYW5jZWQgPSBhLmxlbmd0aCAhPT0gYi5sZW5ndGg7XG5cbiAgdmFyIHBhcnRzID0gc3RyLnNwbGl0KC8oPzo6XFxdXFxbOnxcXFs/XFxbOnw6XFxdXFxdPykvKTtcbiAgdmFyIGxlbiA9IHBhcnRzLmxlbmd0aCwgaSA9IDA7XG4gIHZhciBlbmQgPSAnJywgYmVnID0gJyc7XG4gIHZhciByZXMgPSBbXTtcblxuICAvLyBzdGFydCBhdCB0aGUgZW5kIChpbm5lcm1vc3QpIGZpcnN0XG4gIHdoaWxlIChsZW4tLSkge1xuICAgIHZhciBpbm5lciA9IHBhcnRzW2krK107XG4gICAgaWYgKGlubmVyID09PSAnXlshJyB8fCBpbm5lciA9PT0gJ1shJykge1xuICAgICAgaW5uZXIgPSAnJztcbiAgICAgIG5lZ2F0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwcmVmaXggPSBuZWdhdGVkID8gJ14nIDogJyc7XG4gICAgdmFyIGNoID0gUE9TSVhbaW5uZXJdO1xuXG4gICAgaWYgKGNoKSB7XG4gICAgICByZXMucHVzaCgnWycgKyBwcmVmaXggKyBjaCArICddJyk7XG4gICAgfSBlbHNlIGlmIChpbm5lcikge1xuICAgICAgaWYgKC9eXFxbP1xcdy1cXHdcXF0/JC8udGVzdChpbm5lcikpIHtcbiAgICAgICAgaWYgKGkgPT09IHBhcnRzLmxlbmd0aCkge1xuICAgICAgICAgIHJlcy5wdXNoKCdbJyArIHByZWZpeCArIGlubmVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChpID09PSAxKSB7XG4gICAgICAgICAgcmVzLnB1c2gocHJlZml4ICsgaW5uZXIgKyAnXScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcy5wdXNoKHByZWZpeCArIGlubmVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGkgPT09IDEpIHtcbiAgICAgICAgICBiZWcgKz0gaW5uZXI7XG4gICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gcGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgZW5kICs9IGlubmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcy5wdXNoKCdbJyArIHByZWZpeCArIGlubmVyICsgJ10nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSByZXMuam9pbignfCcpO1xuICB2YXIgcmxlbiA9IHJlcy5sZW5ndGggfHwgMTtcbiAgaWYgKHJsZW4gPiAxKSB7XG4gICAgcmVzdWx0ID0gJyg/OicgKyByZXN1bHQgKyAnKSc7XG4gICAgcmxlbiA9IDE7XG4gIH1cbiAgaWYgKGJlZykge1xuICAgIHJsZW4rKztcbiAgICBpZiAoYmVnLmNoYXJBdCgwKSA9PT0gJ1snKSB7XG4gICAgICBpZiAoaW1iYWxhbmNlZCkge1xuICAgICAgICBiZWcgPSAnXFxcXFsnICsgYmVnLnNsaWNlKDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmVnICs9ICddJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0ID0gYmVnICsgcmVzdWx0O1xuICB9XG4gIGlmIChlbmQpIHtcbiAgICBybGVuKys7XG4gICAgaWYgKGVuZC5zbGljZSgtMSkgPT09ICddJykge1xuICAgICAgaWYgKGltYmFsYW5jZWQpIHtcbiAgICAgICAgZW5kID0gZW5kLnNsaWNlKDAsIGVuZC5sZW5ndGggLSAxKSArICdcXFxcXSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQgPSAnWycgKyBlbmQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdCArPSBlbmQ7XG4gIH1cblxuICBpZiAocmxlbiA+IDEpIHtcbiAgICByZXN1bHQgPSByZXN1bHQuc3BsaXQoJ11bJykuam9pbignXXxbJyk7XG4gICAgaWYgKHJlc3VsdC5pbmRleE9mKCd8JykgIT09IC0xICYmICEvXFwoXFw/Ly50ZXN0KHJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdCA9ICcoPzonICsgcmVzdWx0ICsgJyknO1xuICAgIH1cbiAgfVxuXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXFsrPXw9XFxdKy9nLCAnXFxcXGInKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuYnJhY2tldHMubWFrZVJlID0gZnVuY3Rpb24ocGF0dGVybikge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGJyYWNrZXRzKHBhdHRlcm4pKTtcbiAgfSBjYXRjaCAoZXJyKSB7fVxufTtcblxuYnJhY2tldHMuaXNNYXRjaCA9IGZ1bmN0aW9uKHN0ciwgcGF0dGVybikge1xuICB0cnkge1xuICAgIHJldHVybiBicmFja2V0cy5tYWtlUmUocGF0dGVybikudGVzdChzdHIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmJyYWNrZXRzLm1hdGNoID0gZnVuY3Rpb24oYXJyLCBwYXR0ZXJuKSB7XG4gIHZhciBsZW4gPSBhcnIubGVuZ3RoLCBpID0gMDtcbiAgdmFyIHJlcyA9IGFyci5zbGljZSgpO1xuXG4gIHZhciByZSA9IGJyYWNrZXRzLm1ha2VSZShwYXR0ZXJuKTtcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICB2YXIgZWxlID0gYXJyW2krK107XG4gICAgaWYgKCFyZS50ZXN0KGVsZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXMuc3BsaWNlKGksIDEpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuIiwiLyohXG4gKiBleHBhbmQtcmFuZ2UgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2V4cGFuZC1yYW5nZT5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZmlsbCA9IHJlcXVpcmUoJ2ZpbGwtcmFuZ2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBleHBhbmRSYW5nZShzdHIsIG9wdGlvbnMsIGZuKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4cGFuZC1yYW5nZSBleHBlY3RzIGEgc3RyaW5nLicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm4gPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICAgIG9wdGlvbnMubWFrZVJlID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBhcmd1bWVudHMgdG8gcGFzcyB0byBmaWxsLXJhbmdlXG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGFyZ3MgPSBzdHIuc3BsaXQoJy4uJyk7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgaWYgKGxlbiA+IDMpIHsgcmV0dXJuIHN0cjsgfVxuXG4gIC8vIGlmIG9ubHkgb25lIGFyZ3VtZW50LCBpdCBjYW4ndCBleHBhbmQgc28gcmV0dXJuIGl0XG4gIGlmIChsZW4gPT09IDEpIHsgcmV0dXJuIGFyZ3M7IH1cblxuICAvLyBpZiBgdHJ1ZWAsIHRlbGwgZmlsbC1yYW5nZSB0byByZWdleGlmeSB0aGUgc3RyaW5nXG4gIGlmICh0eXBlb2YgZm4gPT09ICdib29sZWFuJyAmJiBmbiA9PT0gdHJ1ZSkge1xuICAgIG9wdHMubWFrZVJlID0gdHJ1ZTtcbiAgfVxuXG4gIGFyZ3MucHVzaChvcHRzKTtcbiAgcmV0dXJuIGZpbGwuYXBwbHkobnVsbCwgYXJncy5jb25jYXQoZm4pKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJ2lzLWV4dGVuZGFibGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBleHRlbmQoby8qLCBvYmplY3RzKi8pIHtcbiAgaWYgKCFpc09iamVjdChvKSkgeyBvID0ge307IH1cblxuICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBvYmogPSBhcmd1bWVudHNbaV07XG5cbiAgICBpZiAoaXNPYmplY3Qob2JqKSkge1xuICAgICAgYXNzaWduKG8sIG9iaik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvO1xufTtcblxuZnVuY3Rpb24gYXNzaWduKGEsIGIpIHtcbiAgZm9yICh2YXIga2V5IGluIGIpIHtcbiAgICBpZiAoaGFzT3duKGIsIGtleSkpIHtcbiAgICAgIGFba2V5XSA9IGJba2V5XTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBrZXlgIGlzIGFuIG93biBwcm9wZXJ0eSBvZiBgb2JqYC5cbiAqL1xuXG5mdW5jdGlvbiBoYXNPd24ob2JqLCBrZXkpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG59XG4iLCIvKiFcbiAqIGV4dGdsb2IgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2V4dGdsb2I+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE1LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llc1xuICovXG5cbnZhciBpc0V4dGdsb2IgPSByZXF1aXJlKCdpcy1leHRnbG9iJyk7XG52YXIgcmUsIGNhY2hlID0ge307XG5cbi8qKlxuICogRXhwb3NlIGBleHRnbG9iYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZXh0Z2xvYjtcblxuLyoqXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiBleHRnbG9iIGBzdHJpbmdgIHRvIGEgcmVnZXgtY29tcGF0aWJsZVxuICogc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgZXh0Z2xvYiA9IHJlcXVpcmUoJ2V4dGdsb2InKTtcbiAqIGV4dGdsb2IoJyEoYT8oYikpJyk7XG4gKiAvLz0+ICcoPyFhKD86Yik/KVteL10qPydcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyYCBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiAgIEBvcHRpb24ge0Jvb2xlYW59IFtvcHRpb25zXSBgZXNjYCBJZiBgZmFsc2VgIHNwZWNpYWwgY2hhcmFjdGVycyB3aWxsIG5vdCBiZSBlc2NhcGVkLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKiAgIEBvcHRpb24ge0Jvb2xlYW59IFtvcHRpb25zXSBgcmVnZXhgIElmIGB0cnVlYCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGEgc3RyaW5nLlxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dGdsb2Ioc3RyLCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICB2YXIgbyA9IHt9LCBpID0gMDtcblxuICAvLyBmaXggY29tbW9uIGNoYXJhY3RlciByZXZlcnNhbHNcbiAgLy8gJyohKC5qcyknID0+ICcqLiEoanMpJ1xuICBzdHIgPSBzdHIucmVwbGFjZSgvIVxcKChbXlxcdyooKV0pL2csICckMSEoJyk7XG5cbiAgLy8gc3VwcG9ydCBmaWxlIGV4dGVuc2lvbiBuZWdhdGlvblxuICBzdHIgPSBzdHIucmVwbGFjZSgvKFsqXFwvXSlcXC4hXFwoWypdXFwpL2csIGZ1bmN0aW9uIChtLCBjaCkge1xuICAgIGlmIChjaCA9PT0gJy8nKSB7XG4gICAgICByZXR1cm4gZXNjYXBlKCdcXFxcL1teLl0rJyk7XG4gICAgfVxuICAgIHJldHVybiBlc2NhcGUoJ1teLl0rJyk7XG4gIH0pO1xuXG4gIC8vIGNyZWF0ZSBhIHVuaXF1ZSBrZXkgZm9yIGNhY2hpbmcgYnlcbiAgLy8gY29tYmluaW5nIHRoZSBzdHJpbmcgYW5kIG9wdGlvbnNcbiAgdmFyIGtleSA9IHN0clxuICAgICsgU3RyaW5nKCEhb3B0cy5yZWdleClcbiAgICArIFN0cmluZyghIW9wdHMuY29udGFpbnMpXG4gICAgKyBTdHJpbmcoISFvcHRzLmVzY2FwZSk7XG5cbiAgaWYgKGNhY2hlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICByZXR1cm4gY2FjaGVba2V5XTtcbiAgfVxuXG4gIGlmICghKHJlIGluc3RhbmNlb2YgUmVnRXhwKSkge1xuICAgIHJlID0gcmVnZXgoKTtcbiAgfVxuXG4gIG9wdHMubmVnYXRlID0gZmFsc2U7XG4gIHZhciBtO1xuXG4gIHdoaWxlIChtID0gcmUuZXhlYyhzdHIpKSB7XG4gICAgdmFyIHByZWZpeCA9IG1bMV07XG4gICAgdmFyIGlubmVyID0gbVszXTtcbiAgICBpZiAocHJlZml4ID09PSAnIScpIHtcbiAgICAgIG9wdHMubmVnYXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgaWQgPSAnX19FWFRHTE9CXycgKyAoaSsrKSArICdfXyc7XG4gICAgLy8gdXNlIHRoZSBwcmVmaXggb2YgdGhlIF9sYXN0XyAob3V0dGVybW9zdCkgcGF0dGVyblxuICAgIG9baWRdID0gd3JhcChpbm5lciwgcHJlZml4LCBvcHRzLmVzY2FwZSk7XG4gICAgc3RyID0gc3RyLnNwbGl0KG1bMF0pLmpvaW4oaWQpO1xuICB9XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvKTtcbiAgdmFyIGxlbiA9IGtleXMubGVuZ3RoO1xuXG4gIC8vIHdlIGhhdmUgdG8gbG9vcCBhZ2FpbiB0byBhbGxvdyB1cyB0byBjb252ZXJ0XG4gIC8vIHBhdHRlcm5zIGluIHJldmVyc2Ugb3JkZXIgKHN0YXJ0aW5nIHdpdGggdGhlXG4gIC8vIGlubmVybW9zdC9sYXN0IHBhdHRlcm4gZmlyc3QpXG4gIHdoaWxlIChsZW4tLSkge1xuICAgIHZhciBwcm9wID0ga2V5c1tsZW5dO1xuICAgIHN0ciA9IHN0ci5zcGxpdChwcm9wKS5qb2luKG9bcHJvcF0pO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IG9wdHMucmVnZXhcbiAgICA/IHRvUmVnZXgoc3RyLCBvcHRzLmNvbnRhaW5zLCBvcHRzLm5lZ2F0ZSlcbiAgICA6IHN0cjtcblxuICByZXN1bHQgPSByZXN1bHQuc3BsaXQoJy4nKS5qb2luKCdcXFxcLicpO1xuXG4gIC8vIGNhY2hlIHRoZSByZXN1bHQgYW5kIHJldHVybiBpdFxuICByZXR1cm4gKGNhY2hlW2tleV0gPSByZXN1bHQpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYHN0cmluZ2AgdG8gYSByZWdleCBzdHJpbmcuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyYFxuICogQHBhcmFtICB7U3RyaW5nfSBgcHJlZml4YCBDaGFyYWN0ZXIgdGhhdCBkZXRlcm1pbmVzIGhvdyB0byB3cmFwIHRoZSBzdHJpbmcuXG4gKiBAcGFyYW0gIHtCb29sZWFufSBgZXNjYCBJZiBgZmFsc2VgIHNwZWNpYWwgY2hhcmFjdGVycyB3aWxsIG5vdCBiZSBlc2NhcGVkLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gd3JhcChpbm5lciwgcHJlZml4LCBlc2MpIHtcbiAgaWYgKGVzYykgaW5uZXIgPSBlc2NhcGUoaW5uZXIpO1xuXG4gIHN3aXRjaCAocHJlZml4KSB7XG4gICAgY2FzZSAnISc6XG4gICAgICByZXR1cm4gJyg/IScgKyBpbm5lciArICcpW14vXScgKyAoZXNjID8gJyUlJX4nIDogJyo/Jyk7XG4gICAgY2FzZSAnQCc6XG4gICAgICByZXR1cm4gJyg/OicgKyBpbm5lciArICcpJztcbiAgICBjYXNlICcrJzpcbiAgICAgIHJldHVybiAnKD86JyArIGlubmVyICsgJykrJztcbiAgICBjYXNlICcqJzpcbiAgICAgIHJldHVybiAnKD86JyArIGlubmVyICsgJyknICsgKGVzYyA/ICclJScgOiAnKicpXG4gICAgY2FzZSAnPyc6XG4gICAgICByZXR1cm4gJyg/OicgKyBpbm5lciArICd8KSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBpbm5lcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBlc2NhcGUoc3RyKSB7XG4gIHN0ciA9IHN0ci5zcGxpdCgnKicpLmpvaW4oJ1teL10lJSV+Jyk7XG4gIHN0ciA9IHN0ci5zcGxpdCgnLicpLmpvaW4oJ1xcXFwuJyk7XG4gIHJldHVybiBzdHI7XG59XG5cbi8qKlxuICogZXh0Z2xvYiByZWdleC5cbiAqL1xuXG5mdW5jdGlvbiByZWdleCgpIHtcbiAgcmV0dXJuIC8oXFxcXD9bQD8hKyokXVxcXFw/KShcXCgoW14oKV0qPylcXCkpLztcbn1cblxuLyoqXG4gKiBOZWdhdGlvbiByZWdleFxuICovXG5cbmZ1bmN0aW9uIG5lZ2F0ZShzdHIpIHtcbiAgcmV0dXJuICcoPyFeJyArIHN0ciArICcpLiokJztcbn1cblxuLyoqXG4gKiBDcmVhdGUgdGhlIHJlZ2V4IHRvIGRvIHRoZSBtYXRjaGluZy4gSWZcbiAqIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBpbiB0aGUgYHBhdHRlcm5gIGlzIGAhYFxuICogYSBuZWdhdGlvbiByZWdleCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGBjb250YWluc2AgQWxsb3cgbG9vc2UgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGBpc05lZ2F0ZWRgIFRydWUgaWYgdGhlIHBhdHRlcm4gaXMgYSBuZWdhdGlvbiBwYXR0ZXJuLlxuICovXG5cbmZ1bmN0aW9uIHRvUmVnZXgocGF0dGVybiwgY29udGFpbnMsIGlzTmVnYXRlZCkge1xuICB2YXIgcHJlZml4ID0gY29udGFpbnMgPyAnXicgOiAnJztcbiAgdmFyIGFmdGVyID0gY29udGFpbnMgPyAnJCcgOiAnJztcbiAgcGF0dGVybiA9ICgnKD86JyArIHBhdHRlcm4gKyAnKScgKyBhZnRlcik7XG4gIGlmIChpc05lZ2F0ZWQpIHtcbiAgICBwYXR0ZXJuID0gcHJlZml4ICsgbmVnYXRlKHBhdHRlcm4pO1xuICB9XG4gIHJldHVybiBuZXcgUmVnRXhwKHByZWZpeCArIHBhdHRlcm4pO1xufVxuIiwiLyohXG4gKiBmaWxlbmFtZS1yZWdleCA8aHR0cHM6Ly9naXRodWIuY29tL3JlZ2V4cHMvZmlsZW5hbWUtcmVnZXg+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEpvbiBTY2hsaW5rZXJ0XG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmaWxlbmFtZVJlZ2V4KCkge1xuICByZXR1cm4gLyhbXlxcXFxcXC9dKykkLztcbn07XG4iLCIvKiFcbiAqIGZpbGwtcmFuZ2UgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2ZpbGwtcmFuZ2U+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnaXNvYmplY3QnKTtcbnZhciBpc051bWJlciA9IHJlcXVpcmUoJ2lzLW51bWJlcicpO1xudmFyIHJhbmRvbWl6ZSA9IHJlcXVpcmUoJ3JhbmRvbWF0aWMnKTtcbnZhciByZXBlYXRTdHIgPSByZXF1aXJlKCdyZXBlYXQtc3RyaW5nJyk7XG52YXIgcmVwZWF0ID0gcmVxdWlyZSgncmVwZWF0LWVsZW1lbnQnKTtcblxuLyoqXG4gKiBFeHBvc2UgYGZpbGxSYW5nZWBcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbGxSYW5nZTtcblxuLyoqXG4gKiBSZXR1cm4gYSByYW5nZSBvZiBudW1iZXJzIG9yIGxldHRlcnMuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBgYWAgU3RhcnQgb2YgdGhlIHJhbmdlXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBiYCBFbmQgb2YgdGhlIHJhbmdlXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdGVwYCBJbmNyZW1lbnQgb3IgZGVjcmVtZW50IHRvIHVzZS5cbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBgZm5gIEN1c3RvbSBmdW5jdGlvbiB0byBtb2RpZnkgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZS5cbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5cbmZ1bmN0aW9uIGZpbGxSYW5nZShhLCBiLCBzdGVwLCBvcHRpb25zLCBmbikge1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmlsbC1yYW5nZSBleHBlY3RzIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGFyZ3MgdG8gYmUgc3RyaW5ncy4nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RlcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZuID0gc3RlcDsgb3B0aW9ucyA9IHt9OyBzdGVwID0gbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZuID0gb3B0aW9uczsgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKGlzT2JqZWN0KHN0ZXApKSB7XG4gICAgb3B0aW9ucyA9IHN0ZXA7IHN0ZXAgPSAnJztcbiAgfVxuXG4gIHZhciBleHBhbmQsIHJlZ2V4ID0gZmFsc2UsIHNlcCA9ICcnO1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKHR5cGVvZiBvcHRzLnNpbGVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRzLnNpbGVudCA9IHRydWU7XG4gIH1cblxuICBzdGVwID0gc3RlcCB8fCBvcHRzLnN0ZXA7XG5cbiAgLy8gc3RvcmUgYSByZWYgdG8gdW5tb2RpZmllZCBhcmdcbiAgdmFyIG9yaWdBID0gYSwgb3JpZ0IgPSBiO1xuXG4gIGIgPSAoYi50b1N0cmluZygpID09PSAnLTAnKSA/IDAgOiBiO1xuXG4gIGlmIChvcHRzLm9wdGltaXplIHx8IG9wdHMubWFrZVJlKSB7XG4gICAgc3RlcCA9IHN0ZXAgPyAoc3RlcCArPSAnficpIDogc3RlcDtcbiAgICBleHBhbmQgPSB0cnVlO1xuICAgIHJlZ2V4ID0gdHJ1ZTtcbiAgICBzZXAgPSAnfic7XG4gIH1cblxuICAvLyBoYW5kbGUgc3BlY2lhbCBzdGVwIGNoYXJhY3RlcnNcbiAgaWYgKHR5cGVvZiBzdGVwID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtYXRjaCA9IHN0ZXBSZSgpLmV4ZWMoc3RlcCk7XG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7XG4gICAgICB2YXIgbSA9IG1hdGNoWzBdO1xuXG4gICAgICAvLyByZXBlYXQgc3RyaW5nXG4gICAgICBpZiAobSA9PT0gJysnKSB7XG4gICAgICAgIHJldHVybiByZXBlYXQoYSwgYik7XG5cbiAgICAgIC8vIHJhbmRvbWl6ZSBhLCBgYmAgdGltZXNcbiAgICAgIH0gZWxzZSBpZiAobSA9PT0gJz8nKSB7XG4gICAgICAgIHJldHVybiBbcmFuZG9taXplKGEsIGIpXTtcblxuICAgICAgLy8gZXhwYW5kIHJpZ2h0LCBubyByZWdleCByZWR1Y3Rpb25cbiAgICAgIH0gZWxzZSBpZiAobSA9PT0gJz4nKSB7XG4gICAgICAgIHN0ZXAgPSBzdGVwLnN1YnN0cigwLCBpKSArIHN0ZXAuc3Vic3RyKGkgKyAxKTtcbiAgICAgICAgZXhwYW5kID0gdHJ1ZTtcblxuICAgICAgLy8gZXhwYW5kIHRvIGFuIGFycmF5LCBvciBpZiB2YWxpZCBjcmVhdGUgYSByZWR1Y2VkXG4gICAgICAvLyBzdHJpbmcgZm9yIGEgcmVnZXggbG9naWMgYG9yYFxuICAgICAgfSBlbHNlIGlmIChtID09PSAnfCcpIHtcbiAgICAgICAgc3RlcCA9IHN0ZXAuc3Vic3RyKDAsIGkpICsgc3RlcC5zdWJzdHIoaSArIDEpO1xuICAgICAgICBleHBhbmQgPSB0cnVlO1xuICAgICAgICByZWdleCA9IHRydWU7XG4gICAgICAgIHNlcCA9IG07XG5cbiAgICAgIC8vIGV4cGFuZCB0byBhbiBhcnJheSwgb3IgaWYgdmFsaWQgY3JlYXRlIGEgcmVkdWNlZFxuICAgICAgLy8gc3RyaW5nIGZvciBhIHJlZ2V4IHJhbmdlXG4gICAgICB9IGVsc2UgaWYgKG0gPT09ICd+Jykge1xuICAgICAgICBzdGVwID0gc3RlcC5zdWJzdHIoMCwgaSkgKyBzdGVwLnN1YnN0cihpICsgMSk7XG4gICAgICAgIGV4cGFuZCA9IHRydWU7XG4gICAgICAgIHJlZ2V4ID0gdHJ1ZTtcbiAgICAgICAgc2VwID0gbTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc051bWJlcihzdGVwKSkge1xuICAgICAgaWYgKCFvcHRzLnNpbGVudCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmaWxsLXJhbmdlOiBpbnZhbGlkIHN0ZXAuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBpZiAoL1suJiooKVtcXF1eJSQjQCFdLy50ZXN0KGEpIHx8IC9bLiYqKClbXFxdXiUkI0AhXS8udGVzdChiKSkge1xuICAgIGlmICghb3B0cy5zaWxlbnQpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdmaWxsLXJhbmdlOiBpbnZhbGlkIHJhbmdlIGFyZ3VtZW50cy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBoYXMgbmVpdGhlciBhIGxldHRlciBub3IgbnVtYmVyLCBvciBoYXMgYm90aCBsZXR0ZXJzIGFuZCBudW1iZXJzXG4gIC8vIHRoaXMgbmVlZHMgdG8gYmUgYWZ0ZXIgdGhlIHN0ZXAgbG9naWNcbiAgaWYgKCFub0FscGhhTnVtKGEpIHx8ICFub0FscGhhTnVtKGIpIHx8IGhhc0JvdGgoYSkgfHwgaGFzQm90aChiKSkge1xuICAgIGlmICghb3B0cy5zaWxlbnQpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdmaWxsLXJhbmdlOiBpbnZhbGlkIHJhbmdlIGFyZ3VtZW50cy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyB2YWxpZGF0ZSBhcmd1bWVudHNcbiAgdmFyIGlzTnVtQSA9IGlzTnVtYmVyKHplcm9zKGEpKTtcbiAgdmFyIGlzTnVtQiA9IGlzTnVtYmVyKHplcm9zKGIpKTtcblxuICBpZiAoKCFpc051bUEgJiYgaXNOdW1CKSB8fCAoaXNOdW1BICYmICFpc051bUIpKSB7XG4gICAgaWYgKCFvcHRzLnNpbGVudCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlsbC1yYW5nZTogZmlyc3QgcmFuZ2UgYXJndW1lbnQgaXMgaW5jb21wYXRpYmxlIHdpdGggc2Vjb25kLicpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIGJ5IHRoaXMgcG9pbnQgYm90aCBhcmUgdGhlIHNhbWUsIHNvIHdlXG4gIC8vIGNhbiB1c2UgQSB0byBjaGVjayBnb2luZyBmb3J3YXJkLlxuICB2YXIgaXNOdW0gPSBpc051bUE7XG4gIHZhciBudW0gPSBmb3JtYXRTdGVwKHN0ZXApO1xuXG4gIC8vIGlzIHRoZSByYW5nZSBhbHBoYWJldGljYWw/IG9yIG51bWVyaWM/XG4gIGlmIChpc051bSkge1xuICAgIC8vIGlmIG51bWVyaWMsIGNvZXJjZSB0byBhbiBpbnRlZ2VyXG4gICAgYSA9ICthOyBiID0gK2I7XG4gIH0gZWxzZSB7XG4gICAgLy8gb3RoZXJ3aXNlLCBnZXQgdGhlIGNoYXJDb2RlIHRvIGV4cGFuZCBhbHBoYSByYW5nZXNcbiAgICBhID0gYS5jaGFyQ29kZUF0KDApO1xuICAgIGIgPSBiLmNoYXJDb2RlQXQoMCk7XG4gIH1cblxuICAvLyBpcyB0aGUgcGF0dGVybiBkZXNjZW5kaW5nP1xuICB2YXIgaXNEZXNjZW5kaW5nID0gYSA+IGI7XG5cbiAgLy8gZG9uJ3QgY3JlYXRlIGEgY2hhcmFjdGVyIGNsYXNzIGlmIHRoZSBhcmdzIGFyZSA8IDBcbiAgaWYgKGEgPCAwIHx8IGIgPCAwKSB7XG4gICAgZXhwYW5kID0gZmFsc2U7XG4gICAgcmVnZXggPSBmYWxzZTtcbiAgfVxuXG4gIC8vIGRldGVjdCBwYWRkaW5nXG4gIHZhciBwYWRkaW5nID0gaXNQYWRkZWQob3JpZ0EsIG9yaWdCKTtcbiAgdmFyIHJlcywgcGFkLCBhcnIgPSBbXTtcbiAgdmFyIGlpID0gMDtcblxuICAvLyBjaGFyYWN0ZXIgY2xhc3NlcywgcmFuZ2VzIGFuZCBsb2dpY2FsIGBvcmBcbiAgaWYgKHJlZ2V4KSB7XG4gICAgaWYgKHNob3VsZEV4cGFuZChhLCBiLCBudW0sIGlzTnVtLCBwYWRkaW5nLCBvcHRzKSkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoZSBjb3JyZWN0IHNlcGFyYXRvciBpcyB1c2VkXG4gICAgICBpZiAoc2VwID09PSAnfCcgfHwgc2VwID09PSAnficpIHtcbiAgICAgICAgc2VwID0gZGV0ZWN0U2VwYXJhdG9yKGEsIGIsIG51bSwgaXNOdW0sIGlzRGVzY2VuZGluZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcChbb3JpZ0EsIG9yaWdCXSwgc2VwLCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAoaXNEZXNjZW5kaW5nID8gKGEgPj0gYikgOiAoYSA8PSBiKSkge1xuICAgIGlmIChwYWRkaW5nICYmIGlzTnVtKSB7XG4gICAgICBwYWQgPSBwYWRkaW5nKGEpO1xuICAgIH1cblxuICAgIC8vIGN1c3RvbSBmdW5jdGlvblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlcyA9IGZuKGEsIGlzTnVtLCBwYWQsIGlpKyspO1xuXG4gICAgLy8gbGV0dGVyc1xuICAgIH0gZWxzZSBpZiAoIWlzTnVtKSB7XG4gICAgICBpZiAocmVnZXggJiYgaXNJbnZhbGlkQ2hhcihhKSkge1xuICAgICAgICByZXMgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzID0gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtcbiAgICAgIH1cblxuICAgIC8vIG51bWJlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0gZm9ybWF0UGFkZGluZyhhLCBwYWQpO1xuICAgIH1cblxuICAgIC8vIGFkZCByZXN1bHQgdG8gdGhlIGFycmF5LCBmaWx0ZXJpbmcgYW55IG51bGxlZCB2YWx1ZXNcbiAgICBpZiAocmVzICE9PSBudWxsKSBhcnIucHVzaChyZXMpO1xuXG4gICAgLy8gaW5jcmVtZW50IG9yIGRlY3JlbWVudFxuICAgIGlmIChpc0Rlc2NlbmRpbmcpIHtcbiAgICAgIGEgLT0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBhICs9IG51bTtcbiAgICB9XG4gIH1cblxuICAvLyBub3cgdGhhdCB0aGUgYXJyYXkgaXMgZXhwYW5kZWQsIHdlIG5lZWQgdG8gaGFuZGxlIHJlZ2V4XG4gIC8vIGNoYXJhY3RlciBjbGFzc2VzLCByYW5nZXMgb3IgbG9naWNhbCBgb3JgIHRoYXQgd2Fzbid0XG4gIC8vIGFscmVhZHkgaGFuZGxlZCBiZWZvcmUgdGhlIGxvb3BcbiAgaWYgKChyZWdleCB8fCBleHBhbmQpICYmICFvcHRzLm5vZXhwYW5kKSB7XG4gICAgLy8gbWFrZSBzdXJlIHRoZSBjb3JyZWN0IHNlcGFyYXRvciBpcyB1c2VkXG4gICAgaWYgKHNlcCA9PT0gJ3wnIHx8IHNlcCA9PT0gJ34nKSB7XG4gICAgICBzZXAgPSBkZXRlY3RTZXBhcmF0b3IoYSwgYiwgbnVtLCBpc051bSwgaXNEZXNjZW5kaW5nKTtcbiAgICB9XG4gICAgaWYgKGFyci5sZW5ndGggPT09IDEgfHwgYSA8IDAgfHwgYiA8IDApIHsgcmV0dXJuIGFycjsgfVxuICAgIHJldHVybiB3cmFwKGFyciwgc2VwLCBvcHRzKTtcbiAgfVxuXG4gIHJldHVybiBhcnI7XG59XG5cbi8qKlxuICogV3JhcCB0aGUgc3RyaW5nIHdpdGggdGhlIGNvcnJlY3QgcmVnZXhcbiAqIHN5bnRheC5cbiAqL1xuXG5mdW5jdGlvbiB3cmFwKGFyciwgc2VwLCBvcHRzKSB7XG4gIGlmIChzZXAgPT09ICd+JykgeyBzZXAgPSAnLSc7IH1cbiAgdmFyIHN0ciA9IGFyci5qb2luKHNlcCk7XG4gIHZhciBwcmUgPSBvcHRzICYmIG9wdHMucmVnZXhQcmVmaXg7XG5cbiAgLy8gcmVnZXggbG9naWNhbCBgb3JgXG4gIGlmIChzZXAgPT09ICd8Jykge1xuICAgIHN0ciA9IHByZSA/IHByZSArIHN0ciA6IHN0cjtcbiAgICBzdHIgPSAnKCcgKyBzdHIgKyAnKSc7XG4gIH1cblxuICAvLyByZWdleCBjaGFyYWN0ZXIgY2xhc3NcbiAgaWYgKHNlcCA9PT0gJy0nKSB7XG4gICAgc3RyID0gKHByZSAmJiBwcmUgPT09ICdeJylcbiAgICAgID8gcHJlICsgc3RyXG4gICAgICA6IHN0cjtcbiAgICBzdHIgPSAnWycgKyBzdHIgKyAnXSc7XG4gIH1cbiAgcmV0dXJuIFtzdHJdO1xufVxuXG4vKipcbiAqIENoZWNrIGZvciBpbnZhbGlkIGNoYXJhY3RlcnNcbiAqL1xuXG5mdW5jdGlvbiBpc0NoYXJDbGFzcyhhLCBiLCBzdGVwLCBpc051bSwgaXNEZXNjZW5kaW5nKSB7XG4gIGlmIChpc0Rlc2NlbmRpbmcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChpc051bSkgeyByZXR1cm4gYSA8PSA5ICYmIGIgPD0gOTsgfVxuICBpZiAoYSA8IGIpIHsgcmV0dXJuIHN0ZXAgPT09IDE7IH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIERldGVjdCB0aGUgY29ycmVjdCBzZXBhcmF0b3IgdG8gdXNlXG4gKi9cblxuZnVuY3Rpb24gc2hvdWxkRXhwYW5kKGEsIGIsIG51bSwgaXNOdW0sIHBhZGRpbmcsIG9wdHMpIHtcbiAgaWYgKGlzTnVtICYmIChhID4gOSB8fCBiID4gOSkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIHJldHVybiAhcGFkZGluZyAmJiBudW0gPT09IDEgJiYgYSA8IGI7XG59XG5cbi8qKlxuICogRGV0ZWN0IHRoZSBjb3JyZWN0IHNlcGFyYXRvciB0byB1c2VcbiAqL1xuXG5mdW5jdGlvbiBkZXRlY3RTZXBhcmF0b3IoYSwgYiwgc3RlcCwgaXNOdW0sIGlzRGVzY2VuZGluZykge1xuICB2YXIgaXNDaGFyID0gaXNDaGFyQ2xhc3MoYSwgYiwgc3RlcCwgaXNOdW0sIGlzRGVzY2VuZGluZyk7XG4gIGlmICghaXNDaGFyKSB7XG4gICAgcmV0dXJuICd8JztcbiAgfVxuICByZXR1cm4gJ34nO1xufVxuXG4vKipcbiAqIENvcnJlY3RseSBmb3JtYXQgdGhlIHN0ZXAgYmFzZWQgb24gdHlwZVxuICovXG5cbmZ1bmN0aW9uIGZvcm1hdFN0ZXAoc3RlcCkge1xuICByZXR1cm4gTWF0aC5hYnMoc3RlcCA+PiAwKSB8fCAxO1xufVxuXG4vKipcbiAqIEZvcm1hdCBwYWRkaW5nLCB0YWtpbmcgbGVhZGluZyBgLWAgaW50byBhY2NvdW50XG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0UGFkZGluZyhjaCwgcGFkKSB7XG4gIHZhciByZXMgPSBwYWQgPyBwYWQgKyBjaCA6IGNoO1xuICBpZiAocGFkICYmIGNoLnRvU3RyaW5nKCkuY2hhckF0KDApID09PSAnLScpIHtcbiAgICByZXMgPSAnLScgKyBwYWQgKyBjaC50b1N0cmluZygpLnN1YnN0cigxKTtcbiAgfVxuICByZXR1cm4gcmVzLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogQ2hlY2sgZm9yIGludmFsaWQgY2hhcmFjdGVyc1xuICovXG5cbmZ1bmN0aW9uIGlzSW52YWxpZENoYXIoc3RyKSB7XG4gIHZhciBjaCA9IHRvU3RyKHN0cik7XG4gIHJldHVybiBjaCA9PT0gJ1xcXFwnXG4gICAgfHwgY2ggPT09ICdbJ1xuICAgIHx8IGNoID09PSAnXSdcbiAgICB8fCBjaCA9PT0gJ14nXG4gICAgfHwgY2ggPT09ICcoJ1xuICAgIHx8IGNoID09PSAnKSdcbiAgICB8fCBjaCA9PT0gJ2AnO1xufVxuXG4vKipcbiAqIENvbnZlcnQgdG8gYSBzdHJpbmcgZnJvbSBhIGNoYXJDb2RlXG4gKi9cblxuZnVuY3Rpb24gdG9TdHIoY2gpIHtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xufVxuXG5cbi8qKlxuICogU3RlcCByZWdleFxuICovXG5cbmZ1bmN0aW9uIHN0ZXBSZSgpIHtcbiAgcmV0dXJuIC9cXD98PnxcXHx8XFwrfFxcfi9nO1xufVxuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIGB2YWxgIGhhcyBlaXRoZXIgYSBsZXR0ZXJcbiAqIG9yIGEgbnVtYmVyXG4gKi9cblxuZnVuY3Rpb24gbm9BbHBoYU51bSh2YWwpIHtcbiAgcmV0dXJuIC9bYS16MC05XS9pLnRlc3QodmFsKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiBgdmFsYCBoYXMgYm90aCBhIGxldHRlciBhbmRcbiAqIGEgbnVtYmVyIChpbnZhbGlkKVxuICovXG5cbmZ1bmN0aW9uIGhhc0JvdGgodmFsKSB7XG4gIHJldHVybiAvW2Etel1bMC05XXxbMC05XVthLXpdL2kudGVzdCh2YWwpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB6ZXJvcyBmb3IgY2hlY2tzXG4gKi9cblxuZnVuY3Rpb24gemVyb3ModmFsKSB7XG4gIGlmICgvXi0qMCskLy50ZXN0KHZhbC50b1N0cmluZygpKSkge1xuICAgIHJldHVybiAnMCc7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiBgdmFsYCBoYXMgbGVhZGluZyB6ZXJvcyxcbiAqIG9yIGEgc2ltaWxhciB2YWxpZCBwYXR0ZXJuLlxuICovXG5cbmZ1bmN0aW9uIGhhc1plcm9zKHZhbCkge1xuICByZXR1cm4gL1teLl1cXC58Xi0qMCtbMC05XS8udGVzdCh2YWwpO1xufVxuXG4vKipcbiAqIElmIHRoZSBzdHJpbmcgaXMgcGFkZGVkLCByZXR1cm5zIGEgY3VycmllZCBmdW5jdGlvbiB3aXRoXG4gKiB0aGUgYSBjYWNoZWQgcGFkZGluZyBzdHJpbmcsIG9yIGBmYWxzZWAgaWYgbm8gcGFkZGluZy5cbiAqXG4gKiBAcGFyYW0gIHsqfSBgb3JpZ0FgIFN0cmluZyBvciBudW1iZXIuXG4gKiBAcmV0dXJuIHtTdHJpbmd8Qm9vbGVhbn1cbiAqL1xuXG5mdW5jdGlvbiBpc1BhZGRlZChvcmlnQSwgb3JpZ0IpIHtcbiAgaWYgKGhhc1plcm9zKG9yaWdBKSB8fCBoYXNaZXJvcyhvcmlnQikpIHtcbiAgICB2YXIgYWxlbiA9IGxlbmd0aChvcmlnQSk7XG4gICAgdmFyIGJsZW4gPSBsZW5ndGgob3JpZ0IpO1xuXG4gICAgdmFyIGxlbiA9IGFsZW4gPj0gYmxlblxuICAgICAgPyBhbGVuXG4gICAgICA6IGJsZW47XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiByZXBlYXRTdHIoJzAnLCBsZW4gLSBsZW5ndGgoYSkpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEdldCB0aGUgc3RyaW5nIGxlbmd0aCBvZiBgdmFsYFxuICovXG5cbmZ1bmN0aW9uIGxlbmd0aCh2YWwpIHtcbiAgcmV0dXJuIHZhbC50b1N0cmluZygpLmxlbmd0aDtcbn1cbiIsIi8qIVxuICogZm9yLWluIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9mb3ItaW4+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmb3JJbihvLCBmbiwgdGhpc0FyZykge1xuICBmb3IgKHZhciBrZXkgaW4gbykge1xuICAgIGlmIChmbi5jYWxsKHRoaXNBcmcsIG9ba2V5XSwga2V5LCBvKSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufTtcbiIsIi8qIVxuICogZm9yLW93biA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvZm9yLW93bj5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZm9ySW4gPSByZXF1aXJlKCdmb3ItaW4nKTtcbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZvck93bihvLCBmbiwgdGhpc0FyZykge1xuICBmb3JJbihvLCBmdW5jdGlvbih2YWwsIGtleSkge1xuICAgIGlmIChoYXNPd24uY2FsbChvLCBrZXkpKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGlzQXJnLCBvW2tleV0sIGtleSwgbyk7XG4gICAgfVxuICB9KTtcbn07XG4iLCIvKiFcbiAqIGZzLWV4aXN0cy1zeW5jIChodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9mcy1leGlzdHMtc3luYylcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmaWxlcGF0aCkge1xuICB0cnkge1xuICAgIChmcy5hY2Nlc3NTeW5jIHx8IGZzLnN0YXRTeW5jKShmaWxlcGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge31cbiAgcmV0dXJuIGZhbHNlO1xufTtcbiIsIi8qIVxuICogZ2V0LW9iamVjdCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvZ2V0LW9iamVjdD5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgSm9uIFNjaGxpbmtlcnQsIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzTnVtYmVyID0gcmVxdWlyZSgnaXMtbnVtYmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T2JqZWN0KG9iaiwgcHJvcCkge1xuICBpZiAoIXByb3ApIHJldHVybiBvYmo7XG4gIGlmICghb2JqKSByZXR1cm4ge307XG4gIHZhciBzZWdzID0gU3RyaW5nKHByb3ApLnNwbGl0KC9bWy5cXF1dLykuZmlsdGVyKEJvb2xlYW4pO1xuICB2YXIgbGFzdCA9IHNlZ3Nbc2Vncy5sZW5ndGggIC0gMV0sIHJlcyA9IHt9O1xuICB3aGlsZSAocHJvcCA9IHNlZ3Muc2hpZnQoKSkge1xuICAgIG9iaiA9IG9ialtwcm9wXTtcbiAgICBpZiAoIW9iaikgcmV0dXJuIHt9O1xuICB9XG4gIGlmIChpc051bWJlcihsYXN0KSkgcmV0dXJuIFtvYmpdO1xuICByZXNbbGFzdF0gPSBvYmo7XG4gIHJldHVybiByZXM7XG59O1xuIiwiLyohXG4gKiBnZXQtdmFsdWUgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2dldC12YWx1ZT5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmosIHByb3AsIGEsIGIsIGMpIHtcbiAgaWYgKCFpc09iamVjdChvYmopIHx8ICFwcm9wKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHByb3AgPSB0b1N0cmluZyhwcm9wKTtcblxuICAvLyBhbGxvd2luZyBmb3IgbXVsdGlwbGUgcHJvcGVydGllcyB0byBiZSBwYXNzZWQgYXNcbiAgLy8gYSBzdHJpbmcgb3IgYXJyYXksIGJ1dCBtdWNoIGZhc3RlciAoMy00eCkgdGhhbiBkb2luZ1xuICAvLyBgW10uc2xpY2UuY2FsbChhcmd1bWVudHMpYFxuICBpZiAoYSkgcHJvcCArPSAnLicgKyB0b1N0cmluZyhhKTtcbiAgaWYgKGIpIHByb3AgKz0gJy4nICsgdG9TdHJpbmcoYik7XG4gIGlmIChjKSBwcm9wICs9ICcuJyArIHRvU3RyaW5nKGMpO1xuXG4gIGlmIChwcm9wIGluIG9iaikge1xuICAgIHJldHVybiBvYmpbcHJvcF07XG4gIH1cblxuICB2YXIgc2VncyA9IHByb3Auc3BsaXQoJy4nKTtcbiAgdmFyIGxlbiA9IHNlZ3MubGVuZ3RoO1xuICB2YXIgaSA9IC0xO1xuXG4gIHdoaWxlIChvYmogJiYgKCsraSA8IGxlbikpIHtcbiAgICB2YXIga2V5ID0gc2Vnc1tpXTtcbiAgICB3aGlsZSAoa2V5W2tleS5sZW5ndGggLSAxXSA9PT0gJ1xcXFwnKSB7XG4gICAgICBrZXkgPSBrZXkuc2xpY2UoMCwgLTEpICsgJy4nICsgc2Vnc1srK2ldO1xuICAgIH1cbiAgICBvYmogPSBvYmpba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcblxuZnVuY3Rpb24gaXNPYmplY3QodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpO1xufVxuXG5mdW5jdGlvbiB0b1N0cmluZyh2YWwpIHtcbiAgaWYgKCF2YWwpIHJldHVybiAnJztcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIHJldHVybiB2YWwuam9pbignLicpO1xuICB9XG4gIHJldHVybiB2YWw7XG59XG4iLCIvKiFcbiAqIGdsb2ItYmFzZSA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvZ2xvYi1iYXNlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNSwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciBwYXJlbnQgPSByZXF1aXJlKCdnbG9iLXBhcmVudCcpO1xudmFyIGlzR2xvYiA9IHJlcXVpcmUoJ2lzLWdsb2InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnbG9iQmFzZShwYXR0ZXJuKSB7XG4gIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdnbG9iLWJhc2UgZXhwZWN0cyBhIHN0cmluZy4nKTtcbiAgfVxuXG4gIHZhciByZXMgPSB7fTtcbiAgcmVzLmJhc2UgPSBwYXJlbnQocGF0dGVybik7XG4gIHJlcy5pc0dsb2IgPSBpc0dsb2IocGF0dGVybik7XG5cbiAgaWYgKHJlcy5iYXNlICE9PSAnLicpIHtcbiAgICByZXMuZ2xvYiA9IHBhdHRlcm4uc3Vic3RyKHJlcy5iYXNlLmxlbmd0aCk7XG4gICAgaWYgKHJlcy5nbG9iLmNoYXJBdCgwKSA9PT0gJy8nKSB7XG4gICAgICByZXMuZ2xvYiA9IHJlcy5nbG9iLnN1YnN0cigxKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzLmdsb2IgPSBwYXR0ZXJuO1xuICB9XG5cbiAgaWYgKCFyZXMuaXNHbG9iKSB7XG4gICAgcmVzLmJhc2UgPSBkaXJuYW1lKHBhdHRlcm4pO1xuICAgIHJlcy5nbG9iID0gcmVzLmJhc2UgIT09ICcuJ1xuICAgICAgPyBwYXR0ZXJuLnN1YnN0cihyZXMuYmFzZS5sZW5ndGgpXG4gICAgICA6IHBhdHRlcm47XG4gIH1cblxuICBpZiAocmVzLmdsb2Iuc3Vic3RyKDAsIDIpID09PSAnLi8nKSB7XG4gICAgcmVzLmdsb2IgPSByZXMuZ2xvYi5zdWJzdHIoMik7XG4gIH1cbiAgaWYgKHJlcy5nbG9iLmNoYXJBdCgwKSA9PT0gJy8nKSB7XG4gICAgcmVzLmdsb2IgPSByZXMuZ2xvYi5zdWJzdHIoMSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIGRpcm5hbWUoZ2xvYikge1xuICBpZiAoZ2xvYi5zbGljZSgtMSkgPT09ICcvJykgcmV0dXJuIGdsb2I7XG4gIHJldHVybiBwYXRoLmRpcm5hbWUoZ2xvYik7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGlzZ2xvYiA9IHJlcXVpcmUoJ2lzLWdsb2InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnbG9iUGFyZW50KHN0cikge1xuXHRzdHIgKz0gJ2EnOyAvLyBwcmVzZXJ2ZXMgZnVsbCBwYXRoIGluIGNhc2Ugb2YgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3Jcblx0ZG8ge3N0ciA9IHBhdGguZGlybmFtZShzdHIpfSB3aGlsZSAoaXNnbG9iKHN0cikpO1xuXHRyZXR1cm4gc3RyO1xufTtcbiIsIi8qIVxuICogaGFuZGxlYmFycy1oZWxwZXJzIDxodHRwczovL2dpdGh1Yi5jb20vYXNzZW1ibGUvaGFuZGxlYmFycy1oZWxwZXJzPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE2IEpvbiBTY2hsaW5rZXJ0LCBCcmlhbiBXb29kd2FyZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBmb3JJbiA9IHJlcXVpcmUoJ2Zvci1pbicpO1xudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0eScpO1xudmFyIGxpYiA9IHJlcXVpcmUoJy4vbGliLycpO1xuXG4vKipcbiAqIEV4cG9zZSBoZWxwZXJzXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoZWxwZXJzKGdyb3Vwcywgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGdyb3VwcyA9PT0gJ3N0cmluZycpIHtcbiAgICBncm91cHMgPSBbZ3JvdXBzXTtcbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShncm91cHMpKSB7XG4gICAgb3B0aW9ucyA9IGdyb3VwcztcbiAgICBncm91cHMgPSBudWxsO1xuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBoYnMgPSBvcHRpb25zLmhhbmRsZWJhcnMgfHwgcmVxdWlyZSgnaGFuZGxlYmFycycpO1xuXG4gIGRlZmluZShtb2R1bGUuZXhwb3J0cywgJ2hhbmRsZWJhcnMnLCBoYnMpO1xuXG4gIGlmIChncm91cHMpIHtcbiAgICBncm91cHMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgIGhicy5yZWdpc3RlckhlbHBlcihsaWJba2V5XSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZm9ySW4obGliLCBmdW5jdGlvbihncm91cCwga2V5KSB7XG4gICAgICBoYnMucmVnaXN0ZXJIZWxwZXIoZ3JvdXApO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBoYnMuaGVscGVycztcbn07XG5cbi8qKlxuICogRXhwb3NlIGhlbHBlciBncm91cHNcbiAqL1xuXG5mb3JJbihsaWIsIGZ1bmN0aW9uKGdyb3VwLCBrZXkpIHtcbiAgZGVmaW5lKG1vZHVsZS5leHBvcnRzLCBrZXksIGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB2YXIgaGJzID0gb3B0aW9ucy5oYnMgfHwgcmVxdWlyZSgnaGFuZGxlYmFycycpO1xuICAgIGRlZmluZShtb2R1bGUuZXhwb3J0cywgJ2hhbmRsZWJhcnMnLCBoYnMpO1xuICAgIGhicy5yZWdpc3RlckhlbHBlcihncm91cCk7XG4gICAgcmV0dXJuIGhicy5oZWxwZXJzO1xuICB9KTtcbn0pO1xuXG4vKipcbiAqIEV4cG9zZSBgdXRpbHNgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMudXRpbHMgPSByZXF1aXJlKCcuL2xpYi91dGlscycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogRXhwb3NlIGBoZWxwZXJzYFxuICovXG5cbnZhciBoZWxwZXJzID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogUmV0dXJucyBhbGwgb2YgdGhlIGl0ZW1zIGluIGFuIGFycmF5IGFmdGVyIHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gKiBPcHBvc2l0ZSBvZiBbYmVmb3JlXSgjYmVmb3JlKS5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e2FmdGVyIFwiWydhJywgJ2InLCAnYyddXCIgMX19XG4gKiAvLz0+ICdbXCJjXCJdJ1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYGFycmF5YCBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gYG5gIFN0YXJ0aW5nIGluZGV4IChudW1iZXIgb2YgaXRlbXMgdG8gZXhjbHVkZSlcbiAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBleGx1ZGluZyBgbmAgaXRlbXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuYWZ0ZXIgPSBmdW5jdGlvbihhcnJheSwgbikge1xuICBpZiAodXRpbHMuaXNVbmRlZmluZWQoYXJyYXkpKSByZXR1cm4gJyc7XG4gIHJldHVybiBhcnJheS5zbGljZShuKTtcbn07XG5cbi8qKlxuICogQ2FzdCB0aGUgZ2l2ZW4gYHZhbHVlYCB0byBhbiBhcnJheS5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e2FycmF5aWZ5IFwiZm9vXCJ9fVxuICogLy89PiAnW1wiZm9vXCJdJ1xuICogYGBgXG4gKiBAcGFyYW0ge2FueX0gYHZhbHVlYFxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuYXJyYXlpZnkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPyAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pIDogW107XG59O1xuXG4vKipcbiAqIFJldHVybiBhbGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uIGJlZm9yZSB0aGUgc3BlY2lmaWVkXG4gKiBjb3VudC4gT3Bwb3NpdGUgb2YgW2FmdGVyXSgjYWZ0ZXIpLlxuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7YmVmb3JlIFwiWydhJywgJ2InLCAnYyddXCIgMn19XG4gKiAvLz0+ICdbXCJhXCIsIFwiYlwiXSdcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGBhcnJheWBcbiAqIEBwYXJhbSB7TnVtYmVyfSBgbmBcbiAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBleGNsdWRpbmcgaXRlbXMgYWZ0ZXIgdGhlIGdpdmVuIG51bWJlci5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5iZWZvcmUgPSBmdW5jdGlvbihhcnJheSwgbikge1xuICBpZiAodXRpbHMuaXNVbmRlZmluZWQoYXJyYXkpKSByZXR1cm4gJyc7XG4gIHJldHVybiBhcnJheS5zbGljZSgwLCAtbik7XG59O1xuXG4vKipcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7I2VhY2hJbmRleCBjb2xsZWN0aW9ufX1cbiAqICAge3tpdGVtfX0gaXMge3tpbmRleH19XG4gKiB7ey9lYWNoSW5kZXh9fVxuICogYGBgXG4gKiBAcGFyYW0ge0FycmF5fSBgYXJyYXlgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5lYWNoSW5kZXggPSBmdW5jdGlvbihhcnJheSwgb3B0aW9ucykge1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHQgKz0gb3B0aW9ucy5mbih7aXRlbTogYXJyYXlbaV0sIGluZGV4OiBpfSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQmxvY2sgaGVscGVyIHRoYXQgZmlsdGVycyB0aGUgZ2l2ZW4gYXJyYXkgYW5kIHJlbmRlcnMgdGhlIGJsb2NrIGZvciB2YWx1ZXMgdGhhdFxuICogZXZhbHVhdGUgdG8gYHRydWVgLCBvdGhlcndpc2UgdGhlIGludmVyc2UgYmxvY2sgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBgaGFuZGxlYmFyc1xuICoge3sjZmlsdGVyIGFycmF5IFwiZm9vXCJ9fUFBQXt7ZWxzZX19QkJCe3svZmlsdGVyfX1cbiAqIC8vPT4gJ0JCQlxuICogYGBgXG4gKlxuICogQG5hbWUgLmZpbHRlclxuICogQHBhcmFtIHtBcnJheX0gYGFycmF5YFxuICogQHBhcmFtIHthbnl9IGB2YWx1ZWBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmZpbHRlciA9IGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgY29udGVudCA9ICcnO1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gIC8vIGZpbHRlciBvbiBhIHNwZWNpZmljIHByb3BlcnR5XG4gIHZhciBwcm9wID0gb3B0aW9ucy5oYXNoICYmIG9wdGlvbnMuaGFzaC5wcm9wZXJ0eTtcbiAgaWYgKHByb3ApIHtcbiAgICByZXN1bHRzID0gdXRpbHMuZmlsdGVyKGFycmF5LCBmdW5jdGlvbih2YWwpIHtcbiAgICAgIHJldHVybiB1dGlscy5nZXQodmFsLCBwcm9wKSA9PT0gdmFsdWU7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG5cbiAgICAvLyBmaWx0ZXIgb24gYSBzdHJpbmcgdmFsdWVcbiAgICByZXN1bHRzID0gdXRpbHMuZmlsdGVyKGFycmF5LCBmdW5jdGlvbih2KSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHY7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnRlbnQgKz0gb3B0aW9ucy5mbihyZXN1bHRzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgaXRlbSwgb3IgZmlyc3QgYG5gIGl0ZW1zIG9mIGFuIGFycmF5LlxuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7Zmlyc3QgXCJbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddXCIgMn19XG4gKiAvLz0+ICdbXCJhXCIsIFwiYlwiXSdcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGBhcnJheWBcbiAqIEBwYXJhbSB7TnVtYmVyfSBgbmAgTnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybiwgc3RhcnRpbmcgYXQgYDBgLlxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuZmlyc3QgPSBmdW5jdGlvbihhcnJheSwgbikge1xuICBpZiAodXRpbHMuaXNVbmRlZmluZWQoYXJyYXkpKSByZXR1cm4gJyc7XG4gIGlmICghdXRpbHMuaXNOdW1iZXIobikpIHtcbiAgICByZXR1cm4gYXJyYXlbMF07XG4gIH1cbiAgcmV0dXJuIGFycmF5LnNsaWNlKDAsIG4pO1xufTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVhY2ggaXRlbSBpbiBhbiBhcnJheSBhbmQgZXhwb3NlcyB0aGUgY3VycmVudCBpdGVtXG4gKiBpbiB0aGUgYXJyYXkgYXMgY29udGV4dCB0byB0aGUgaW5uZXIgYmxvY2suIEluIGFkZGl0aW9uIHRvXG4gKiB0aGUgY3VycmVudCBhcnJheSBpdGVtLCB0aGUgaGVscGVyIGV4cG9zZXMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXNcbiAqIHRvIHRoZSBpbm5lciBibG9jazpcbiAqXG4gKiAtIGBpbmRleGBcbiAqIC0gYHRvdGFsYFxuICogLSBgaXNGaXJzdGBcbiAqIC0gYGlzTGFzdGBcbiAqXG4gKiBBbHNvLCBgQGluZGV4YCBpcyBleHBvc2VkIGFzIGEgcHJpdmF0ZSB2YXJpYWJsZSwgYW5kIGFkZGl0aW9uYWxcbiAqIHByaXZhdGUgdmFyaWFibGVzIG1heSBiZSBkZWZpbmVkIGFzIGhhc2ggYXJndW1lbnRzLlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgYWNjb3VudHMgPSBbXG4gKiAgIHsnbmFtZSc6ICdKb2huJywgJ2VtYWlsJzogJ2pvaG5AZXhhbXBsZS5jb20nfSxcbiAqICAgeyduYW1lJzogJ01hbGNvbG0nLCAnZW1haWwnOiAnbWFsY29sbUBleGFtcGxlLmNvbSd9LFxuICogICB7J25hbWUnOiAnRGF2aWQnLCAnZW1haWwnOiAnZGF2aWRAZXhhbXBsZS5jb20nfVxuICogXTtcbiAqXG4gKiAvLyBleGFtcGxlIHVzYWdlXG4gKiAvLyB7eyNmb3JFYWNoIGFjY291bnRzfX1cbiAqIC8vICAgPGEgaHJlZj1cIm1haWx0bzp7eyBlbWFpbCB9fVwiIHRpdGxlPVwiU2VuZCBhbiBlbWFpbCB0byB7eyBuYW1lIH19XCI+XG4gKiAvLyAgICAge3sgbmFtZSB9fVxuICogLy8gICA8L2E+e3sjdW5sZXNzIGlzTGFzdH19LCB7ey91bmxlc3N9fVxuICogLy8ge3svZm9yRWFjaH19XG4gKiBgYGBcbiAqIEBzb3VyY2UgPGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTM4NjEwMDc+XG4gKiBAcGFyYW0ge0FycmF5fSBgYXJyYXlgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5mb3JFYWNoID0gZnVuY3Rpb24oYXJyYXksIG9wdGlvbnMpIHtcbiAgdmFyIGRhdGEgPSB1dGlscy5jcmVhdGVGcmFtZShvcHRpb25zLCBvcHRpb25zLmhhc2gpO1xuICB2YXIgbGVuID0gYXJyYXkubGVuZ3RoO1xuICB2YXIgYnVmZmVyID0gJyc7XG4gIHZhciBpID0gLTE7XG5cbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIHZhciBpdGVtID0gYXJyYXlbaV07XG4gICAgZGF0YS5pbmRleCA9IGk7XG4gICAgaXRlbS5pbmRleCA9IGkgKyAxO1xuICAgIGl0ZW0udG90YWwgPSBsZW47XG4gICAgaXRlbS5pc0ZpcnN0ID0gaSA9PT0gMDtcbiAgICBpdGVtLmlzTGFzdCA9IGkgPT09IChsZW4gLSAxKTtcbiAgICBidWZmZXIgKz0gb3B0aW9ucy5mbihpdGVtLCB7ZGF0YTogZGF0YX0pO1xuICB9XG4gIHJldHVybiBidWZmZXI7XG59O1xuXG4vKipcbiAqIEJsb2NrIGhlbHBlciB0aGF0IHJlbmRlcnMgdGhlIGJsb2NrIGlmIGFuIGFycmF5IGhhcyB0aGVcbiAqIGdpdmVuIGB2YWx1ZWAuIE9wdGlvbmFsbHkgc3BlY2lmeSBhbiBpbnZlcnNlIGJsb2NrIHRvIHJlbmRlclxuICogd2hlbiB0aGUgYXJyYXkgZG9lcyBub3QgaGF2ZSB0aGUgZ2l2ZW4gdmFsdWUuXG4gKlxuICogR2l2ZW4gdGhlIGFycmF5IGBbJ2EnLCAnYicsICdjJ11gOlxuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7I2luQXJyYXkgYXJyYXkgXCJkXCJ9fVxuICogICBmb29cbiAqIHt7ZWxzZX19XG4gKiAgIGJhclxuICoge3svaW5BcnJheX19XG4gKiBgYGBcbiAqXG4gKiBAbmFtZSAuaW5BcnJheVxuICogQHBhcmFtIHtBcnJheX0gYGFycmF5YFxuICogQHBhcmFtIHthbnl9IGB2YWx1ZWBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmluQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgaWYgKHV0aWxzLmluZGV4T2YoYXJyYXksIHZhbHVlKSA+IC0xKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYW4gZXM1IGFycmF5LlxuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7aXNBcnJheSBcImFiY1wifX1cbiAqIC8vPT4gJ2ZhbHNlJ1xuICogYGBgXG4gKlxuICogQHBhcmFtIHthbnl9IGB2YWx1ZWAgVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmlzQXJyYXkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59O1xuXG4vKipcbiAqIEpvaW4gYWxsIGVsZW1lbnRzIG9mIGFycmF5IGludG8gYSBzdHJpbmcsIG9wdGlvbmFsbHkgdXNpbmcgYVxuICogZ2l2ZW4gc2VwYXJhdG9yLlxuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7am9pbiBcIlsnYScsICdiJywgJ2MnXVwifX1cbiAqIC8vPT4gJ2EsIGIsIGMnXG4gKlxuICoge3tqb2luIFwiWydhJywgJ2InLCAnYyddXCIgJy0nfX1cbiAqIC8vPT4gJ2EtYi1jJ1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYGFycmF5YFxuICogQHBhcmFtIHtTdHJpbmd9IGBzZXBgIFRoZSBzZXBhcmF0b3IgdG8gdXNlLlxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmpvaW4gPSBmdW5jdGlvbihhcnJheSwgc2VwKSB7XG4gIGlmICh1dGlscy5pc1VuZGVmaW5lZChhcnJheSkpIHJldHVybiAnJztcbiAgc2VwID0gdHlwZW9mIHNlcCAhPT0gJ3N0cmluZydcbiAgICA/ICcsICdcbiAgICA6IHNlcDtcbiAgcmV0dXJuIGFycmF5LmpvaW4oc2VwKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGFzdCBpdGVtLCBvciBsYXN0IGBuYCBpdGVtcyBvZiBhbiBhcnJheS5cbiAqIE9wcG9zaXRlIG9mIFtmaXJzdF0oI2ZpcnN0KS5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e2xhc3QgXCJbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddXCIgMn19XG4gKiAvLz0+ICdbXCJkXCIsIFwiZVwiXSdcbiAqIGBgYFxuICogQHBhcmFtIHtBcnJheX0gYGFycmF5YFxuICogQHBhcmFtIHtOdW1iZXJ9IGBuYCBOdW1iZXIgb2YgaXRlbXMgdG8gcmV0dXJuLCBzdGFydGluZyB3aXRoIHRoZSBsYXN0IGl0ZW0uXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5sYXN0ID0gZnVuY3Rpb24oYXJyYXksIG4pIHtcbiAgaWYgKCF1dGlscy5pc051bWJlcihuKSkge1xuICAgIHJldHVybiBhcnJheVthcnJheS5sZW5ndGggLSAxXTtcbiAgfVxuICByZXR1cm4gYXJyYXkuc2xpY2UoLW4pO1xufTtcblxuLyoqXG4gKiBCbG9jayBoZWxwZXIgdGhhdCBjb21wYXJlcyB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBhcnJheSB0b1xuICogdGhlIG51bWJlciBwYXNzZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gSWYgdGhlIGFycmF5IGxlbmd0aFxuICogaXMgZXF1YWwgdG8gdGhlIGdpdmVuIGBsZW5ndGhgLCB0aGUgYmxvY2sgaXMgcmV0dXJuZWQsXG4gKiBvdGhlcndpc2UgYW4gaW52ZXJzZSBibG9jayBtYXkgb3B0aW9uYWxseSBiZSByZXR1cm5lZC5cbiAqXG4gKiBAbmFtZSAubGVuZ3RoRXF1YWxcbiAqIEBwYXJhbSB7QXJyYXl9IGBhcnJheWBcbiAqIEBwYXJhbSB7TnVtYmVyfSBgbGVuZ3RoYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGJsb2NrXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMubGVuZ3RoRXF1YWwgPSBmdW5jdGlvbihhcnJheSwgbGVuZ3RoLCBvcHRpb25zKSB7XG4gIGlmIChhcnJheS5sZW5ndGggPT09IGxlbmd0aCkge1xuICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuICB9XG4gIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgYXJyYXksIGNyZWF0ZWQgYnkgY2FsbGluZyBgZnVuY3Rpb25gXG4gKiBvbiBlYWNoIGVsZW1lbnQgb2YgdGhlIGdpdmVuIGBhcnJheWAuXG4gKlxuICogYGBganNcbiAqIC8vIHJlZ2lzdGVyIGBkb3VibGVgIGFzIGEgaGVscGVyXG4gKiBmdW5jdGlvbiBkb3VibGUoc3RyKSB7XG4gKiAgIHJldHVybiBzdHIgKyBzdHI7XG4gKiB9XG4gKiAvLyB0aGVuIHVzZWQgbGlrZSB0aGlzOlxuICogLy8ge3ttYXAgXCJbJ2EnLCAnYicsICdjJ11cIiBkb3VibGV9fVxuICogLy89PiAnW1wiYWFcIiwgXCJiYlwiLCBcImNjXCJdJ1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYGFycmF5YFxuICogQHBhcmFtIHtGdW5jdGlvbn0gYGZuYFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLm1hcCA9IGZ1bmN0aW9uKGFycmF5LCBmbikge1xuICBpZiAodXRpbHMuaXNVbmRlZmluZWQoYXJyYXkpKSByZXR1cm4gJyc7XG4gIGlmICh0eXBlb2YgYXJyYXkgPT09ICdzdHJpbmcnICYmIC9bW10vLnRlc3QoYXJyYXkpKSB7XG4gICAgYXJyYXkgPSB1dGlscy50cnlQYXJzZShhcnJheSkgfHwgW107XG4gIH1cbiAgdmFyIGxlbiA9IGFycmF5Lmxlbmd0aDtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShsZW4pO1xuICB2YXIgaSA9IC0xO1xuXG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICByZXNbaV0gPSBmbihhcnJheVtpXSwgaSwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIEJsb2NrIGhlbHBlciB0aGF0IHJldHVybnMgdGhlIGJsb2NrIGlmIHRoZSBjYWxsYmFjayByZXR1cm5zIHRydWVcbiAqIGZvciBzb21lIHZhbHVlIGluIHRoZSBnaXZlbiBhcnJheS5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7eyNzb21lIGFycmF5IGlzU3RyaW5nfX1cbiAqICAgUmVuZGVyIG1lIGlmIHRoZSBhcnJheSBoYXMgYSBzdHJpbmcuXG4gKiB7e2Vsc2V9fVxuICogICBSZW5kZXIgbWUgaWYgaXQgZG9lc24ndC5cbiAqIHt7L3NvbWV9fVxuICogYGBgXG4gKiBAbmFtZSAuc29tZVxuICogQHBhcmFtIHtBcnJheX0gYGFycmF5YFxuICogQHBhcmFtIHtGdW5jdGlvbn0gYGNiYCBjYWxsYmFjayBmdW5jdGlvblxuICogQHBhcmFtIHtPcHRpb25zfSBIYW5kbGViYXJzIHByb3ZpZGVkIG9wdGlvbnMgb2JqZWN0XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLnNvbWUgPSBmdW5jdGlvbihhcnIsIGNiLCBvcHRpb25zKSB7XG4gIGNiID0gdXRpbHMuaXRlcmF0b3IoY2IsIHRoaXMpO1xuICBpZiAoYXJyID09IG51bGwpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xuICB9XG4gIHZhciBsZW4gPSBhcnIubGVuZ3RoLCBpID0gLTE7XG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICBpZiAoY2IoYXJyW2ldLCBpLCBhcnIpKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbn07XG5cbi8qKlxuICogU29ydCB0aGUgZ2l2ZW4gYGFycmF5YC4gSWYgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyBwYXNzZWQsXG4gKiB5b3UgbWF5IG9wdGlvbmFsbHkgcGFzcyBhIGBrZXlgIHRvIHNvcnQgb24gYXMgdGhlIHNlY29uZFxuICogYXJndW1lbnQuIFlvdSBtYXkgYWx0ZXJuYXRpdmVseSBwYXNzIGEgc29ydGluZyBmdW5jdGlvbiBhc1xuICogdGhlIHNlY29uZCBhcmd1bWVudC5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e3NvcnQgXCJbJ2InLCAnYScsICdjJ11cIn19XG4gKiAvLz0+ICdhLGIsYydcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGBhcnJheWAgdGhlIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gYGtleWAgVGhlIG9iamVjdCBrZXkgdG8gc29ydCBieSwgb3Igc29ydGluZyBmdW5jdGlvbi5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5zb3J0ID0gZnVuY3Rpb24oYXJyLCBvcHRpb25zKSB7XG4gIGlmICh1dGlscy5pc1VuZGVmaW5lZChhcnIpKSByZXR1cm4gJyc7XG4gIGlmICh1dGlscy5nZXQob3B0aW9ucywgJ2hhc2gucmV2ZXJzZScpKSB7XG4gICAgcmV0dXJuIGFyci5zb3J0KCkucmV2ZXJzZSgpO1xuICB9XG4gIHJldHVybiBhcnIuc29ydCgpO1xufTtcblxuLyoqXG4gKiBTb3J0IGFuIGBhcnJheWAuIElmIGFuIGFycmF5IG9mIG9iamVjdHMgaXMgcGFzc2VkLFxuICogeW91IG1heSBvcHRpb25hbGx5IHBhc3MgYSBga2V5YCB0byBzb3J0IG9uIGFzIHRoZSBzZWNvbmRcbiAqIGFyZ3VtZW50LiBZb3UgbWF5IGFsdGVybmF0aXZlbHkgcGFzcyBhIHNvcnRpbmcgZnVuY3Rpb24gYXNcbiAqIHRoZSBzZWNvbmQgYXJndW1lbnQuXG4gKlxuICogYGBgaGFuZGxlYmFyc1xuICoge3tzb3J0QnkgJ1tcImJcIiwgXCJhXCIsIFwiY1wiXSd9fVxuICogLy89PiAnYSxiLGMnXG4gKlxuICoge3tzb3J0QnkgJ1t7YTogXCJ6enpcIn0sIHthOiBcImFhYVwifV0nIFwiYVwifX1cbiAqIC8vPT4gJ1t7XCJhXCI6XCJhYWFcIn0se1wiYVwiOlwienp6XCJ9XSdcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGBhcnJheWAgdGhlIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gYHByb3BzYCBPbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIHRvIHNvcnQgYnksIG9yIHNvcnRpbmcgZnVuY3Rpb25zIHRvIHVzZS5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5zb3J0QnkgPSBmdW5jdGlvbihhcnIvKiwgcHJvcCovKSB7XG4gIGlmICh1dGlscy5pc1VuZGVmaW5lZChhcnIpKSByZXR1cm4gJyc7XG4gIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICBhcmdzLnBvcCgpOyAvLyByZW1vdmUgaGJzIG9wdGlvbnMgb2JqZWN0XG5cbiAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyAmJiAvW1tdLy50ZXN0KGFyZ3NbMF0pKSB7XG4gICAgYXJnc1swXSA9IHV0aWxzLnRyeVBhcnNlKGFyZ3NbMF0pIHx8IFtdO1xuICB9XG4gIGlmICh1dGlscy5pc1VuZGVmaW5lZChhcmdzWzFdKSkge1xuICAgIHJldHVybiBhcmdzWzBdLnNvcnQoKTtcbiAgfVxuICByZXR1cm4gdXRpbHMuc29ydEJ5LmFwcGx5KG51bGwsIGFyZ3MpO1xufTtcblxuLyoqXG4gKiBVc2UgdGhlIGl0ZW1zIGluIHRoZSBhcnJheSBfYWZ0ZXJfIHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAqIGFzIGNvbnRleHQgaW5zaWRlIGEgYmxvY2suIE9wcG9zaXRlIG9mIFt3aXRoQmVmb3JlXSgjd2l0aEJlZm9yZSkuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYGFycmF5YFxuICogQHBhcmFtIHtOdW1iZXJ9IGBpZHhgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLndpdGhBZnRlciA9IGZ1bmN0aW9uKGFycmF5LCBpZHgsIG9wdGlvbnMpIHtcbiAgYXJyYXkgPSBhcnJheS5zbGljZShpZHgpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG5cbiAgdmFyIGxlbiA9IGFycmF5Lmxlbmd0aCwgaSA9IC0xO1xuICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgcmVzdWx0ICs9IG9wdGlvbnMuZm4oYXJyYXlbaV0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFVzZSB0aGUgaXRlbXMgaW4gdGhlIGFycmF5IF9iZWZvcmVfIHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAqIGFzIGNvbnRleHQgaW5zaWRlIGEgYmxvY2suT3Bwb3NpdGUgb2YgW3dpdGhBZnRlcl0oI3dpdGhBZnRlcikuXG4gKlxuICogYGBgaGFuZGxlYmFyc1xuICoge3sjd2l0aEJlZm9yZSBhcnJheSAzfX1cbiAqICAge3t0aGlzfX1cbiAqIHt7L3dpdGhCZWZvcmV9fVxuICogYGBgXG4gKiBAcGFyYW0ge0FycmF5fSBgYXJyYXlgXG4gKiBAcGFyYW0ge051bWJlcn0gYGlkeGBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGJsb2NrXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMud2l0aEJlZm9yZSA9IGZ1bmN0aW9uKGFycmF5LCBpZHgsIG9wdGlvbnMpIHtcbiAgYXJyYXkgPSBhcnJheS5zbGljZSgwLCAtaWR4KTtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuXG4gIHZhciBsZW4gPSBhcnJheS5sZW5ndGgsIGkgPSAtMTtcbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIHJlc3VsdCArPSBvcHRpb25zLmZuKGFycmF5W2ldKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBVc2UgdGhlIGZpcnN0IGl0ZW0gaW4gYSBjb2xsZWN0aW9uIGluc2lkZSBhIGhhbmRsZWJhcnNcbiAqIGJsb2NrIGV4cHJlc3Npb24uIE9wcG9zaXRlIG9mIFt3aXRoTGFzdF0oI3dpdGhMYXN0KS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBgYXJyYXlgXG4gKiBAcGFyYW0ge051bWJlcn0gYGlkeGBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLndpdGhGaXJzdCA9IGZ1bmN0aW9uKGFyciwgaWR4LCBvcHRpb25zKSB7XG4gIGlmICh1dGlscy5pc1VuZGVmaW5lZChhcnIpKSByZXR1cm4gJyc7XG4gIGFyciA9IHV0aWxzLnJlc3VsdChhcnIpO1xuXG4gIGlmICghdXRpbHMuaXNVbmRlZmluZWQoaWR4KSkge1xuICAgIGlkeCA9IHBhcnNlRmxvYXQodXRpbHMucmVzdWx0KGlkeCkpO1xuICB9XG5cbiAgaWYgKHV0aWxzLmlzVW5kZWZpbmVkKGlkeCkpIHtcbiAgICBvcHRpb25zID0gaWR4O1xuICAgIHJldHVybiBvcHRpb25zLmZuKGFyclswXSk7XG4gIH1cblxuICBhcnIgPSBhcnIuc2xpY2UoMCwgaWR4KTtcbiAgdmFyIGxlbiA9IGFyci5sZW5ndGgsIGkgPSAtMTtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgcmVzdWx0ICs9IG9wdGlvbnMuZm4oYXJyW2ldKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBVc2UgdGhlIGxhc3QgaXRlbSBvciBgbmAgaXRlbXMgaW4gYW4gYXJyYXkgYXMgY29udGV4dCBpbnNpZGUgYSBibG9jay5cbiAqIE9wcG9zaXRlIG9mIFt3aXRoRmlyc3RdKCN3aXRoRmlyc3QpLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGBhcnJheWBcbiAqIEBwYXJhbSB7TnVtYmVyfSBgaWR4YCBUaGUgc3RhcnRpbmcgaW5kZXguXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy53aXRoTGFzdCA9IGZ1bmN0aW9uKGFycmF5LCBpZHgsIG9wdGlvbnMpIHtcbiAgaWYgKHV0aWxzLmlzVW5kZWZpbmVkKGFycmF5KSkgcmV0dXJuICcnO1xuICBhcnJheSA9IHV0aWxzLnJlc3VsdChhcnJheSk7XG5cbiAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChpZHgpKSB7XG4gICAgaWR4ID0gcGFyc2VGbG9hdCh1dGlscy5yZXN1bHQoaWR4KSk7XG4gIH1cblxuICBpZiAodXRpbHMuaXNVbmRlZmluZWQoaWR4KSkge1xuICAgIG9wdGlvbnMgPSBpZHg7XG4gICAgcmV0dXJuIG9wdGlvbnMuZm4oYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV0pO1xuICB9XG5cbiAgYXJyYXkgPSBhcnJheS5zbGljZSgtaWR4KTtcbiAgdmFyIGxlbiA9IGFycmF5Lmxlbmd0aCwgaSA9IC0xO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICByZXN1bHQgKz0gb3B0aW9ucy5mbihhcnJheVtpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQmxvY2sgaGVscGVyIHRoYXQgc29ydHMgYSBjb2xsZWN0aW9uIGFuZCBleHBvc2VzIHRoZSBzb3J0ZWRcbiAqIGNvbGxlY3Rpb24gYXMgY29udGV4dCBpbnNpZGUgdGhlIGJsb2NrLlxuICpcbiAqIEBuYW1lIC53aXRoU29ydFxuICogQHBhcmFtIHtBcnJheX0gYGFycmF5YFxuICogQHBhcmFtIHtTdHJpbmd9IGBwcm9wYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTcGVjaWZ5IGByZXZlcnNlPVwidHJ1ZVwiYCB0byByZXZlcnNlIHRoZSBhcnJheS5cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLndpdGhTb3J0ID0gZnVuY3Rpb24oYXJyYXksIHByb3AsIG9wdGlvbnMpIHtcbiAgaWYgKHV0aWxzLmlzVW5kZWZpbmVkKGFycmF5KSkgcmV0dXJuICcnO1xuICB2YXIgcmVzdWx0ID0gJyc7XG5cbiAgaWYgKHV0aWxzLmlzVW5kZWZpbmVkKHByb3ApKSB7XG4gICAgb3B0aW9ucyA9IHByb3A7XG5cbiAgICBhcnJheSA9IGFycmF5LnNvcnQoKTtcbiAgICBpZiAodXRpbHMuZ2V0KG9wdGlvbnMsICdoYXNoLnJldmVyc2UnKSkge1xuICAgICAgYXJyYXkgPSBhcnJheS5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICByZXN1bHQgKz0gb3B0aW9ucy5mbihhcnJheVtpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhcnJheS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICBhID0gdXRpbHMuZ2V0KGEsIHByb3ApO1xuICAgIGIgPSB1dGlscy5nZXQoYiwgcHJvcCk7XG4gICAgcmV0dXJuIGEgPiBiO1xuICB9KTtcblxuICBpZiAodXRpbHMuZ2V0KG9wdGlvbnMsICdoYXNoLnJldmVyc2UnKSkge1xuICAgIGFycmF5ID0gYXJyYXkucmV2ZXJzZSgpO1xuICB9XG5cbiAgdmFyIGFsZW4gPSBhcnJheS5sZW5ndGgsIGogPSAtMTtcbiAgd2hpbGUgKCsraiA8IGFsZW4pIHtcbiAgICByZXN1bHQgKz0gb3B0aW9ucy5mbihhcnJheVtqXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi91dGlscy9odG1sJyk7XG52YXIgb2JqZWN0ID0gcmVxdWlyZSgnLi9vYmplY3QnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuLyoqXG4gKiBFeHBvc2UgYGhlbHBlcnNgXG4gKi9cblxudmFyIGhlbHBlcnMgPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBFbWJlZCBjb2RlIGZyb20gYW4gZXh0ZXJuYWwgZmlsZSBhcyBwcmVmb3JtYXR0ZWQgdGV4dC5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e2VtYmVkICdwYXRoL3RvL2ZpbGUuanMnfX1cbiAqXG4gKiAvLyBzcGVjaWZ5IHRoZSBsYW5ndWFnZSB0byB1c2VcbiAqIHt7ZW1iZWQgJ3BhdGgvdG8vZmlsZS5oYnMnICdodG1sJyl9fVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGBmcGAgZmlsZXBhdGggdG8gdGhlIGZpbGUgdG8gZW1iZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gYGxhbmd1YWdlYCBPcHRpb25hbGx5IHNwZWNpZnkgdGhlIGxhbmd1YWdlIHRvIHVzZSBmb3Igc3ludGF4IGhpZ2hsaWdodGluZy5cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5lbWJlZCA9IGZ1bmN0aW9uIGVtYmVkKGZwLCBleHQpIHtcbiAgZXh0ID0gdHlwZW9mIGV4dCAhPT0gJ3N0cmluZydcbiAgICA/IHBhdGguZXh0bmFtZShmcCkuc2xpY2UoMSlcbiAgICA6IGV4dDtcblxuICB2YXIgY29kZSA9IGZzLnJlYWRGaWxlU3luYyhmcCwgJ3V0ZjgnKTtcbiAgaWYgKGV4dCA9PT0gJ21hcmtkb3duJyB8fCBleHQgPT09ICdtZCcpIHtcbiAgICBleHQgPSAnbWFya2Rvd24nO1xuICAgIC8vIGlmIHRoZSBzdHJpbmcgaXMgbWFya2Rvd24sIGVzY2FwZSBiYWNrdGlja3NcbiAgICBjb2RlID0gY29kZS5zcGxpdCgnYCcpLmpvaW4oJyYjeDYwJyk7XG4gIH1cbiAgcmV0dXJuIHV0aWxzLmJsb2NrKGNvZGUsIGV4dCkudHJpbSgpICsgJ1xcbic7XG59O1xuXG4vKipcbiAqIEVtYmVkIGEgR2l0SHViIEdpc3QgdXNpbmcgb25seSB0aGUgaWQgb2YgdGhlIEdpc3RcbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e2dpc3QgMTIzNDV9fVxuICogYGBgXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBpZGBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5naXN0ID0gZnVuY3Rpb24oaWQpIHtcbiAgcmV0dXJuICc8c2NyaXB0IHNyYz1cImh0dHBzOi8vZ2lzdC5naXRodWIuY29tLycgKyBpZCArICcuanNcIj48L3NjcmlwdD4nO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSB0aGUgSFRNTCBmb3IgYSBqc0ZpZGRsZSBsaW5rIHdpdGggdGhlIGdpdmVuIGBwYXJhbXNgXG4gKlxuICogYGBgaGFuZGxlYmFyc1xuICoge3tqc2ZpZGRsZSBpZD1cIjBkZmsxMGtzXCIgdGFicz1cInRydWVcIn19XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYHBhcmFtc2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5qc2ZpZGRsZSA9IGZ1bmN0aW9uIGpzRmlkZGxlKGF0dHIpIHtcbiAgYXR0ciA9IG9iamVjdC5tZXJnZSh7fSwgYXR0ciwgYXR0ci5oYXNoKTtcbiAgZGVsZXRlIGF0dHIubmFtZTtcbiAgZGVsZXRlIGF0dHIuaGFzaDtcbiAgZGVsZXRlIGF0dHIuZGF0YTtcblxuICBpZiAodHlwZW9mIGF0dHIuaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdqc2ZpZGRsZSBoZWxwZXIgZXhwZWN0cyBhbiBgaWRgJyk7XG4gIH1cblxuICBhdHRyLmlkID0gJ2h0dHA6Ly9qc2ZpZGRsZS5uZXQvJyArIGF0dHIuaWQ7XG4gIGF0dHIud2lkdGggPSBhdHRyLndpZHRoIHx8ICcxMDAlJztcbiAgYXR0ci5oZWlnaHQgPSBhdHRyLmhlaWdodCB8fCAnMzAwJztcbiAgYXR0ci5za2luID0gYXR0ci5za2luIHx8ICcvcHJlc2VudGF0aW9uLyc7XG4gIGF0dHIudGFicyA9IChhdHRyLnRhYnMgfHwgJ3Jlc3VsdCxqcyxodG1sLGNzcycpICsgYXR0ci5za2luO1xuICBhdHRyLnNyYyA9IGF0dHIuaWQgKyAnL2VtYmVkZGVkLycgKyBhdHRyLnRhYnM7XG4gIGF0dHIuYWxsb3dmdWxsc2NyZWVuID0gYXR0ci5hbGxvd2Z1bGxzY3JlZW4gfHwgJ2FsbG93ZnVsbHNjcmVlbic7XG4gIGF0dHIuZnJhbWVib3JkZXIgPSBhdHRyLmZyYW1lYm9yZGVyIHx8ICcwJztcblxuICBkZWxldGUgYXR0ci50YWJzO1xuICBkZWxldGUgYXR0ci5za2luO1xuICBkZWxldGUgYXR0ci5pZDtcbiAgcmV0dXJuICc8aWZyYW1lICcgKyBodG1sLnBhcnNlQXR0cmlidXRlcyhhdHRyKSArICc+PC9pZnJhbWU+Jztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhcnJheSA9IHJlcXVpcmUoJy4vYXJyYXknKTtcbnZhciBvYmplY3QgPSByZXF1aXJlKCcuL29iamVjdCcpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGZvckVhY2ggPSBhcnJheS5mb3JFYWNoO1xudmFyIGZvck93biA9IG9iamVjdC5mb3JPd247XG5cbi8qKlxuICogRXhwb3NlIGBoZWxwZXJzYFxuICovXG5cbnZhciBoZWxwZXJzID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogQmxvY2sgaGVscGVyIHRoYXQgcmV0dXJucyBhIGJsb2NrIGlmIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGlzXG4gKiBlbXB0eS4gSWYgdGhlIGNvbGxlY3Rpb24gaXMgbm90IGVtcHR5IHRoZSBpbnZlcnNlIGJsb2NrIGlzIHJldHVybmVkXG4gKiAoaWYgc3VwcGxpZWQpLlxuICpcbiAqIEBuYW1lIC5pc0VtcHR5XG4gKiBAcGFyYW0ge09iamVjdH0gYGNvbGxlY3Rpb25gXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5pc0VtcHR5ID0gZnVuY3Rpb24oY29sbGVjdGlvbiwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgb3B0aW9ucyA9IGNvbGxlY3Rpb247XG4gICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShjb2xsZWN0aW9uKSAmJiAhY29sbGVjdGlvbi5sZW5ndGgpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTtcbiAgfVxuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoY29sbGVjdGlvbik7XG4gIGlmICh0eXBlb2YgY29sbGVjdGlvbiA9PT0gJ29iamVjdCcgJiYgIWtleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbn07XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFuIGFycmF5IG9yIG9iamVjdCxcbiAqXG4gKiBAbmFtZSAuaXRlcmF0ZVxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IGBjb250ZXh0YCBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLml0ZXJhdGUgPSBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbnRleHQpKSB7XG4gICAgcmV0dXJuIGZvckVhY2guYXBwbHkoZm9yRWFjaCwgYXJndW1lbnRzKTtcbiAgfSBlbHNlIGlmICh1dGlscy5pc09iamVjdChjb250ZXh0KSkge1xuICAgIHJldHVybiBmb3JPd24uYXBwbHkoZm9yT3duLCBhcmd1bWVudHMpO1xuICB9XG4gIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gY29sbGVjdGlvbi5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e2xlbmd0aCBcIlsnYScsICdiJywgJ2MnXVwifX1cbiAqIC8vPT4gM1xuICogYGBgXG4gKiBAcGFyYW0gIHtBcnJheXxPYmplY3R8U3RyaW5nfSBgdmFsdWVgXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBsZW5ndGggb2YgdGhlIHZhbHVlLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmxlbmd0aCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICh1dGlscy5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybiAnJztcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgL1tbXS8udGVzdCh2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IHV0aWxzLnRyeVBhcnNlKHZhbHVlKSB8fCBbXTtcbiAgfVxuICBpZiAodXRpbHMuaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFsdWUgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlLmxlbmd0aDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vb2JqZWN0JykuaXNPYmplY3Q7XG52YXIgaXNTdHJpbmcgPSByZXF1aXJlKCcuL3N0cmluZycpLmlzU3RyaW5nO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIEV4cG9zZSBgaGVscGVyc2BcbiAqL1xuXG52YXIgaGVscGVycyA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIEJsb2NrIGhlbHBlciB0aGF0IHJlbmRlcnMgdGhlIGJsb2NrIGlmICoqYm90aCoqIG9mIHRoZSBnaXZlbiB2YWx1ZXNcbiAqIGFyZSB0cnV0aHkuIElmIGFuIGludmVyc2UgYmxvY2sgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgcmVuZGVyZWRcbiAqIHdoZW4gZmFsc3kuXG4gKlxuICogQHBhcmFtIHthbnl9IGBhYFxuICogQHBhcmFtIHthbnl9IGBiYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBIYW5kbGViYXJzIHByb3ZpZGVkIG9wdGlvbnMgb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5hbmQgPSBmdW5jdGlvbihhLCBiLCBvcHRpb25zKSB7XG4gIGlmIChhICYmIGIpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xufTtcblxuLyoqXG4gKiBSZW5kZXIgYSBibG9jayB3aGVuIGEgY29tcGFyaXNvbiBvZiB0aGUgZmlyc3QgYW5kIHRoaXJkXG4gKiBhcmd1bWVudHMgcmV0dXJucyB0cnVlLiBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzXG4gKiB0aGUgW2FyaXRoZW1ldGljIG9wZXJhdG9yXVtvcGVyYXRvcnNdIHRvIHVzZS4gWW91IG1heSBhbHNvXG4gKiBvcHRpb25hbGx5IHNwZWNpZnkgYW4gaW52ZXJzZSBibG9jayB0byByZW5kZXIgd2hlbiBmYWxzeS5cbiAqXG4gKiBAcGFyYW0gYGFgXG4gKiBAcGFyYW0gYG9wZXJhdG9yYCBUaGUgb3BlcmF0b3IgdG8gdXNlLiBPcGVyYXRvcnMgbXVzdCBiZSBlbmNsb3NlZCBpbiBxdW90ZXM6IGBcIj5cImAsIGBcIj1cImAsIGBcIjw9XCJgLCBhbmQgc28gb24uXG4gKiBAcGFyYW0gYGJgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIEhhbmRsZWJhcnMgcHJvdmlkZWQgb3B0aW9ucyBvYmplY3RcbiAqIEByZXR1cm4ge1N0cmluZ30gQmxvY2ssIG9yIGlmIHNwZWNpZmllZCB0aGUgaW52ZXJzZSBibG9jayBpcyByZW5kZXJlZCBpZiBmYWxzZXkuXG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5jb21wYXJlID0gZnVuY3Rpb24oYSwgb3BlcmF0b3IsIGIsIG9wdGlvbnMpIHtcbiAgLyplc2xpbnQgZXFlcWVxOiAwKi9cblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2hhbmRsZWJhcnMgSGVscGVyIHt7Y29tcGFyZX19IGV4cGVjdHMgNCBhcmd1bWVudHMnKTtcbiAgfVxuXG4gIHZhciByZXN1bHQ7XG4gIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICBjYXNlICc9PSc6XG4gICAgICByZXN1bHQgPSBhID09IGI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc9PT0nOlxuICAgICAgcmVzdWx0ID0gYSA9PT0gYjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJyE9JzpcbiAgICAgIHJlc3VsdCA9IGEgIT0gYjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJyE9PSc6XG4gICAgICByZXN1bHQgPSBhICE9PSBiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnPCc6XG4gICAgICByZXN1bHQgPSBhIDwgYjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJz4nOlxuICAgICAgcmVzdWx0ID0gYSA+IGI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc8PSc6XG4gICAgICByZXN1bHQgPSBhIDw9IGI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc+PSc6XG4gICAgICByZXN1bHQgPSBhID49IGI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0eXBlb2YnOlxuICAgICAgcmVzdWx0ID0gdHlwZW9mIGEgPT09IGI7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hlbHBlciB7e2NvbXBhcmV9fTogaW52YWxpZCBvcGVyYXRvcjogYCcgKyBvcGVyYXRvciArICdgJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xuICB9XG4gIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xufTtcblxuLyoqXG4gKiBCbG9jayBoZWxwZXIgdGhhdCByZW5kZXJzIHRoZSBibG9jayBpZiBgY29sbGVjdGlvbmAgaGFzIHRoZVxuICogZ2l2ZW4gYHZhbHVlYCwgdXNpbmcgc3RyaWN0IGVxdWFsaXR5IChgPT09YCkgZm9yIGNvbXBhcmlzb24sXG4gKiBvdGhlcndpc2UgdGhlIGludmVyc2UgYmxvY2sgaXMgcmVuZGVyZWQgKGlmIHNwZWNpZmllZCkuIElmIGFcbiAqIGBzdGFydEluZGV4YCBpcyBzcGVjaWZpZWQgYW5kIGlzIG5lZ2F0aXZlLCBpdCBpcyB1c2VkIGFzIHRoZVxuICogb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbi5cbiAqXG4gKiBHaXZlbiB0aGUgYXJyYXkgYFsnYScsICdiJywgJ2MnXWA6XG4gKlxuICogYGBgaGFuZGxlYmFyc1xuICoge3sjY29udGFpbnMgYXJyYXkgXCJkXCJ9fVxuICogICBUaGlzIHdpbGwgbm90IGJlIHJlbmRlcmVkLlxuICoge3tlbHNlfX1cbiAqICAgVGhpcyB3aWxsIGJlIHJlbmRlcmVkLlxuICoge3svY29udGFpbnN9fVxuICogYGBgXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdHxTdHJpbmd9IGBjb2xsZWN0aW9uYCBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge2FueX0gYHZhbHVlYCBUaGUgdmFsdWUgdG8gY2hlY2sgZm9yLlxuICogQHBhcmFtIHtOdW1iZXJ9IGBbc3RhcnRJbmRleD0wXWAgT3B0aW9uYWxseSBkZWZpbmUgdGhlIHN0YXJ0aW5nIGluZGV4LlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBIYW5kbGViYXJzIHByb3ZpZGVkIG9wdGlvbnMgb2JqZWN0LlxuICogQGJsb2NrXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuY29udGFpbnMgPSBmdW5jdGlvbihjb2xsZWN0aW9uLCB2YWx1ZSwgc3RhcnRJbmRleCwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHN0YXJ0SW5kZXggPT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IHN0YXJ0SW5kZXg7XG4gICAgc3RhcnRJbmRleCA9IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodXRpbHMuY29udGFpbnMoY29sbGVjdGlvbiwgdmFsdWUsIHN0YXJ0SW5kZXgpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbn07XG5cbi8qKlxuICogQmxvY2sgaGVscGVyIHRoYXQgcmVuZGVycyBhIGJsb2NrIGlmIGBhYCBpcyAqKmdyZWF0ZXIgdGhhbioqIGBiYC5cbiAqXG4gKiBJZiBhbiBpbnZlcnNlIGJsb2NrIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHJlbmRlcmVkIHdoZW4gZmFsc3kuXG4gKiBZb3UgbWF5IG9wdGlvbmFsbHkgdXNlIHRoZSBgY29tcGFyZT1cIlwiYCBoYXNoIGFyZ3VtZW50IGZvciB0aGVcbiAqIHNlY29uZCB2YWx1ZS5cbiAqXG4gKiBAbmFtZSAuZ3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBgYWBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgYmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgSGFuZGxlYmFycyBwcm92aWRlZCBvcHRpb25zIG9iamVjdFxuICogQHJldHVybiB7U3RyaW5nfSBCbG9jaywgb3IgaW52ZXJzZSBibG9jayBpZiBzcGVjaWZpZWQgYW5kIGZhbHNleS5cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmd0ID0gZnVuY3Rpb24oYSwgYiwgb3B0aW9ucykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIG9wdGlvbnMgPSBiO1xuICAgIGIgPSBvcHRpb25zLmhhc2guY29tcGFyZTtcbiAgfVxuICBpZiAoYSA+IGIpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xufTtcblxuLyoqXG4gKiBCbG9jayBoZWxwZXIgdGhhdCByZW5kZXJzIGEgYmxvY2sgaWYgYGFgIGlzICoqZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byoqIGBiYC5cbiAqXG4gKiBJZiBhbiBpbnZlcnNlIGJsb2NrIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHJlbmRlcmVkIHdoZW4gZmFsc3kuXG4gKiBZb3UgbWF5IG9wdGlvbmFsbHkgdXNlIHRoZSBgY29tcGFyZT1cIlwiYCBoYXNoIGFyZ3VtZW50IGZvciB0aGVcbiAqIHNlY29uZCB2YWx1ZS5cbiAqXG4gKiBAbmFtZSAuZ3RlXG4gKiBAcGFyYW0ge1N0cmluZ30gYGFgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGJgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIEhhbmRsZWJhcnMgcHJvdmlkZWQgb3B0aW9ucyBvYmplY3RcbiAqIEByZXR1cm4ge1N0cmluZ30gQmxvY2ssIG9yIGludmVyc2UgYmxvY2sgaWYgc3BlY2lmaWVkIGFuZCBmYWxzZXkuXG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5ndGUgPSBmdW5jdGlvbihhLCBiLCBvcHRpb25zKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgb3B0aW9ucyA9IGI7XG4gICAgYiA9IG9wdGlvbnMuaGFzaC5jb21wYXJlO1xuICB9XG4gIGlmIChhID49IGIpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xufTtcblxuLyoqXG4gKiBCbG9jayBoZWxwZXIgdGhhdCByZW5kZXJzIGEgYmxvY2sgaWYgYHZhbHVlYCBoYXMgYHBhdHRlcm5gLlxuICogSWYgYW4gaW52ZXJzZSBibG9jayBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSByZW5kZXJlZCB3aGVuIGZhbHN5LlxuICpcbiAqIEBwYXJhbSB7YW55fSBgdmFsYCBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge2FueX0gYHBhdHRlcm5gIFRoZSBwYXR0ZXJuIHRvIGNoZWNrIGZvci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgSGFuZGxlYmFycyBwcm92aWRlZCBvcHRpb25zIG9iamVjdFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGJsb2NrXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuaGFzID0gZnVuY3Rpb24odmFsdWUsIHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gcGF0dGVybi5pbnZlcnNlKHRoaXMpO1xuICB9XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gdmFsdWUuaW52ZXJzZSh0aGlzKTtcbiAgfVxuXG4gIGlmICgoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNTdHJpbmcodmFsdWUpKSAmJiBpc1N0cmluZyhwYXR0ZXJuKSkge1xuICAgIGlmICh2YWx1ZS5pbmRleE9mKHBhdHRlcm4pID4gLTEpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpICYmIGlzU3RyaW5nKHBhdHRlcm4pICYmIHBhdHRlcm4gaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xufTtcblxuLyoqXG4gKiBCbG9jayBoZWxwZXIgdGhhdCByZW5kZXJzIGEgYmxvY2sgaWYgYGFgIGlzICoqZXF1YWwgdG8qKiBgYmAuXG4gKiBJZiBhbiBpbnZlcnNlIGJsb2NrIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHJlbmRlcmVkIHdoZW4gZmFsc3kuXG4gKiBZb3UgbWF5IG9wdGlvbmFsbHkgdXNlIHRoZSBgY29tcGFyZT1cIlwiYCBoYXNoIGFyZ3VtZW50IGZvciB0aGVcbiAqIHNlY29uZCB2YWx1ZS5cbiAqXG4gKiBAbmFtZSAuZXFcbiAqIEBwYXJhbSB7U3RyaW5nfSBgYWBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgYmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgSGFuZGxlYmFycyBwcm92aWRlZCBvcHRpb25zIG9iamVjdFxuICogQHJldHVybiB7U3RyaW5nfSBCbG9jaywgb3IgaW52ZXJzZSBibG9jayBpZiBzcGVjaWZpZWQgYW5kIGZhbHNleS5cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmVxID0gZnVuY3Rpb24oYSwgYiwgb3B0aW9ucykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIG9wdGlvbnMgPSBiO1xuICAgIGIgPSBvcHRpb25zLmhhc2guY29tcGFyZTtcbiAgfVxuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuICB9XG4gIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG59O1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB2YXVlIGlzIGFuIGV2ZW4gbnVtYmVyLlxuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7I2lmRXZlbiB2YWx1ZX19XG4gKiAgIHJlbmRlciBBXG4gKiB7e2Vsc2V9fVxuICogICByZW5kZXIgQlxuICoge3svaWZFdmVufX1cbiAqIGBgYFxuICogQHBhcmFtICB7TnVtYmVyfSBgbnVtYmVyYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBIYW5kbGViYXJzIHByb3ZpZGVkIG9wdGlvbnMgb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9IEJsb2NrLCBvciBpbnZlcnNlIGJsb2NrIGlmIHNwZWNpZmllZCBhbmQgZmFsc2V5LlxuICogQGJsb2NrXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuaWZFdmVuID0gZnVuY3Rpb24obnVtLCBvcHRpb25zKSB7XG4gIHJldHVybiB1dGlscy5pc0V2ZW4obnVtKVxuICAgID8gb3B0aW9ucy5mbih0aGlzKVxuICAgIDogb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xufTtcblxuLyoqXG4gKiBDb25kaXRpb25hbGx5IHJlbmRlcnMgYSBibG9jayBpZiB0aGUgcmVtYWluZGVyIGlzIHplcm8gd2hlblxuICogYGFgIG9wZXJhbmQgaXMgZGl2aWRlZCBieSBgYmAuIElmIGFuIGludmVyc2UgYmxvY2sgaXMgc3BlY2lmaWVkXG4gKiBpdCB3aWxsIGJlIHJlbmRlcmVkIHdoZW4gdGhlIHJlbWFpbmRlciBpcyAqKm5vdCB6ZXJvKiouXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9XG4gKiBAcGFyYW0ge051bWJlcn1cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgSGFuZGxlYmFycyBwcm92aWRlZCBvcHRpb25zIG9iamVjdFxuICogQHJldHVybiB7U3RyaW5nfSBCbG9jaywgb3IgaW52ZXJzZSBibG9jayBpZiBzcGVjaWZpZWQgYW5kIGZhbHNleS5cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmlmTnRoID0gZnVuY3Rpb24oYSwgYiwgb3B0aW9ucykge1xuICBpZiAoKytiICUgYSA9PT0gMCkge1xuICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuICB9XG4gIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG59O1xuXG4vKipcbiAqIEJsb2NrIGhlbHBlciB0aGF0IHJlbmRlcnMgYSBibG9jayBpZiBgdmFsdWVgIGlzICoqYW4gb2RkIG51bWJlcioqLlxuICogSWYgYW4gaW52ZXJzZSBibG9jayBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSByZW5kZXJlZCB3aGVuIGZhbHN5LlxuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7I2lmT2RkIHZhbHVlfX1cbiAqICAgcmVuZGVyIEFcbiAqIHt7ZWxzZX19XG4gKiAgIHJlbmRlciBCXG4gKiB7ey9pZk9kZH19XG4gKiBgYGBcbiAqIEBwYXJhbSAge09iamVjdH0gYHZhbHVlYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBIYW5kbGViYXJzIHByb3ZpZGVkIG9wdGlvbnMgb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9IEJsb2NrLCBvciBpbnZlcnNlIGJsb2NrIGlmIHNwZWNpZmllZCBhbmQgZmFsc2V5LlxuICogQGJsb2NrXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuaWZPZGQgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHV0aWxzLmlzT2RkKHZhbClcbiAgICA/IG9wdGlvbnMuZm4odGhpcylcbiAgICA6IG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbn07XG5cbi8qKlxuICogQmxvY2sgaGVscGVyIHRoYXQgcmVuZGVycyBhIGJsb2NrIGlmIGBhYCBpcyAqKmVxdWFsIHRvKiogYGJgLlxuICogSWYgYW4gaW52ZXJzZSBibG9jayBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSByZW5kZXJlZCB3aGVuIGZhbHN5LlxuICpcbiAqIEBuYW1lIC5pc1xuICogQHBhcmFtIHthbnl9IGBhYFxuICogQHBhcmFtIHthbnl9IGBiYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBIYW5kbGViYXJzIHByb3ZpZGVkIG9wdGlvbnMgb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5pcyA9IGZ1bmN0aW9uKGEsIGIsIG9wdGlvbnMpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICBvcHRpb25zID0gYjtcbiAgICBiID0gb3B0aW9ucy5oYXNoLmNvbXBhcmU7XG4gIH1cbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xufTtcblxuLyoqXG4gKiBCbG9jayBoZWxwZXIgdGhhdCByZW5kZXJzIGEgYmxvY2sgaWYgYGFgIGlzICoqbm90IGVxdWFsIHRvKiogYGJgLlxuICogSWYgYW4gaW52ZXJzZSBibG9jayBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSByZW5kZXJlZCB3aGVuIGZhbHN5LlxuICpcbiAqIEBuYW1lIC5pc250XG4gKiBAcGFyYW0ge1N0cmluZ30gYGFgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGJgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIEhhbmRsZWJhcnMgcHJvdmlkZWQgb3B0aW9ucyBvYmplY3RcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmlzbnQgPSBmdW5jdGlvbihhLCBiLCBvcHRpb25zKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgb3B0aW9ucyA9IGI7XG4gICAgYiA9IG9wdGlvbnMuaGFzaC5jb21wYXJlO1xuICB9XG4gIGlmIChhICE9PSBiKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbn07XG5cbi8qKlxuICogQmxvY2sgaGVscGVyIHRoYXQgcmVuZGVycyBhIGJsb2NrIGlmIGBhYCBpcyAqKmxlc3MgdGhhbioqIGBiYC5cbiAqXG4gKiBJZiBhbiBpbnZlcnNlIGJsb2NrIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHJlbmRlcmVkIHdoZW4gZmFsc3kuXG4gKiBZb3UgbWF5IG9wdGlvbmFsbHkgdXNlIHRoZSBgY29tcGFyZT1cIlwiYCBoYXNoIGFyZ3VtZW50IGZvciB0aGVcbiAqIHNlY29uZCB2YWx1ZS5cbiAqXG4gKiBAbmFtZSAubHRcbiAqIEBwYXJhbSB7T2JqZWN0fSBgY29udGV4dGBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgSGFuZGxlYmFycyBwcm92aWRlZCBvcHRpb25zIG9iamVjdFxuICogQHJldHVybiB7U3RyaW5nfSBCbG9jaywgb3IgaW52ZXJzZSBibG9jayBpZiBzcGVjaWZpZWQgYW5kIGZhbHNleS5cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmx0ID0gZnVuY3Rpb24oYSwgYiwgb3B0aW9ucykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIG9wdGlvbnMgPSBiO1xuICAgIGIgPSBvcHRpb25zLmhhc2guY29tcGFyZTtcbiAgfVxuICBpZiAoYSA8IGIpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xufTtcblxuLyoqXG4gKiBCbG9jayBoZWxwZXIgdGhhdCByZW5kZXJzIGEgYmxvY2sgaWYgYGFgIGlzICoqbGVzcyB0aGFuIG9yXG4gKiBlcXVhbCB0byoqIGBiYC5cbiAqXG4gKiBJZiBhbiBpbnZlcnNlIGJsb2NrIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHJlbmRlcmVkIHdoZW4gZmFsc3kuXG4gKiBZb3UgbWF5IG9wdGlvbmFsbHkgdXNlIHRoZSBgY29tcGFyZT1cIlwiYCBoYXNoIGFyZ3VtZW50IGZvciB0aGVcbiAqIHNlY29uZCB2YWx1ZS5cbiAqXG4gKiBAbmFtZSAubHRlXG4gKiBAcGFyYW0ge1NyaW5nfSBgYWBcbiAqIEBwYXJhbSB7U3Jpbmd9IGBiYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBIYW5kbGViYXJzIHByb3ZpZGVkIG9wdGlvbnMgb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9IEJsb2NrLCBvciBpbnZlcnNlIGJsb2NrIGlmIHNwZWNpZmllZCBhbmQgZmFsc2V5LlxuICogQGJsb2NrXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMubHRlID0gZnVuY3Rpb24oYSwgYiwgb3B0aW9ucykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIG9wdGlvbnMgPSBiO1xuICAgIGIgPSBvcHRpb25zLmhhc2guY29tcGFyZTtcbiAgfVxuICBpZiAoYSA8PSBiKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbn07XG5cbi8qKlxuICogQmxvY2sgaGVscGVyIHRoYXQgcmVuZGVycyBhIGJsb2NrIGlmICoqbmVpdGhlciBvZioqIHRoZSBnaXZlbiB2YWx1ZXNcbiAqIGFyZSB0cnV0aHkuIElmIGFuIGludmVyc2UgYmxvY2sgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgcmVuZGVyZWRcbiAqIHdoZW4gZmFsc3kuXG4gKlxuICogQG5hbWUgLm5laXRoZXJcbiAqIEBwYXJhbSB7YW55fSBgYWBcbiAqIEBwYXJhbSB7YW55fSBgYmBcbiAqIEBwYXJhbSBgb3B0aW9uc2AgSGFuZGxlYmFycyBvcHRpb25zIG9iamVjdFxuICogQHJldHVybiB7U3RyaW5nfSBCbG9jaywgb3IgaW52ZXJzZSBibG9jayBpZiBzcGVjaWZpZWQgYW5kIGZhbHNleS5cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLm5laXRoZXIgPSBmdW5jdGlvbihhLCBiLCBvcHRpb25zKSB7XG4gIGlmICghYSAmJiAhYikge1xuICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuICB9XG4gIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG59O1xuXG4vKipcbiAqIEJsb2NrIGhlbHBlciB0aGF0IHJlbmRlcnMgYSBibG9jayBpZiAqKmVpdGhlciBvZioqIHRoZSBnaXZlbiB2YWx1ZXNcbiAqIGlzIHRydXRoeS4gSWYgYW4gaW52ZXJzZSBibG9jayBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSByZW5kZXJlZFxuICogd2hlbiBmYWxzeS5cbiAqXG4gKiBAbmFtZSAub3JcbiAqIEBwYXJhbSB7YW55fSBgYWBcbiAqIEBwYXJhbSB7YW55fSBgYmBcbiAqIEBwYXJhbSBgb3B0aW9uc2AgSGFuZGxlYmFycyBvcHRpb25zIG9iamVjdFxuICogQHJldHVybiB7U3RyaW5nfSBCbG9jaywgb3IgaW52ZXJzZSBibG9jayBpZiBzcGVjaWZpZWQgYW5kIGZhbHNleS5cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLm9yID0gZnVuY3Rpb24oYSwgYiwgb3B0aW9ucykge1xuICBpZiAoYSA9PT0gdHJ1ZSB8fCBiID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbn07XG5cbi8qKlxuICogQmxvY2sgaGVscGVyIHRoYXQgYWx3YXlzIHJlbmRlcnMgdGhlIGludmVyc2UgYmxvY2sgKip1bmxlc3MgYGFgIGlzXG4gKiBpcyBlcXVhbCB0byBgYmAqKi5cbiAqXG4gKiBAbmFtZSAudW5sZXNzRXFcbiAqIEBwYXJhbSB7U3RyaW5nfSBgYWBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgYmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgSGFuZGxlYmFycyBwcm92aWRlZCBvcHRpb25zIG9iamVjdFxuICogQHJldHVybiB7U3RyaW5nfSBJbnZlcnNlIGJsb2NrIGJ5IGRlZmF1bHQsIG9yIGJsb2NrIGlmIGZhbHNleS5cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLnVubGVzc0VxID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICBpZiAoY29udGV4dCA9PT0gb3B0aW9ucy5oYXNoLmNvbXBhcmUpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xuICB9XG4gIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xufTtcblxuLyoqXG4gKiBCbG9jayBoZWxwZXIgdGhhdCBhbHdheXMgcmVuZGVycyB0aGUgaW52ZXJzZSBibG9jayAqKnVubGVzcyBgYWAgaXNcbiAqIGlzIGdyZWF0ZXIgdGhhbiBgYmAqKi5cbiAqXG4gKiBAbmFtZSAudW5sZXNzR3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBgY29udGV4dGBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgSGFuZGxlYmFycyBwcm92aWRlZCBvcHRpb25zIG9iamVjdFxuICogQHJldHVybiB7U3RyaW5nfSBJbnZlcnNlIGJsb2NrIGJ5IGRlZmF1bHQsIG9yIGJsb2NrIGlmIGZhbHNleS5cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLnVubGVzc0d0ID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICBpZiAoY29udGV4dCA+IG9wdGlvbnMuaGFzaC5jb21wYXJlKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTtcbn07XG5cbi8qKlxuICogQmxvY2sgaGVscGVyIHRoYXQgYWx3YXlzIHJlbmRlcnMgdGhlIGludmVyc2UgYmxvY2sgKip1bmxlc3MgYGFgIGlzXG4gKiBpcyBsZXNzIHRoYW4gYGJgKiouXG4gKlxuICogQG5hbWUgLnVubGVzc0x0XG4gKiBAcGFyYW0ge09iamVjdH0gYGNvbnRleHRgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIEhhbmRsZWJhcnMgcHJvdmlkZWQgb3B0aW9ucyBvYmplY3RcbiAqIEByZXR1cm4ge1N0cmluZ30gQmxvY2ssIG9yIGludmVyc2UgYmxvY2sgaWYgc3BlY2lmaWVkIGFuZCBmYWxzZXkuXG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy51bmxlc3NMdCA9IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgaWYgKGNvbnRleHQgPCBvcHRpb25zLmhhc2guY29tcGFyZSkge1xuICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG59O1xuXG4vKipcbiAqIEJsb2NrIGhlbHBlciB0aGF0IGFsd2F5cyByZW5kZXJzIHRoZSBpbnZlcnNlIGJsb2NrICoqdW5sZXNzIGBhYCBpc1xuICogaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBiYCoqLlxuICpcbiAqIEBuYW1lIC51bmxlc3NHdGVxXG4gKiBAcGFyYW0ge09iamVjdH0gYGNvbnRleHRgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIEhhbmRsZWJhcnMgcHJvdmlkZWQgb3B0aW9ucyBvYmplY3RcbiAqIEByZXR1cm4ge1N0cmluZ30gQmxvY2ssIG9yIGludmVyc2UgYmxvY2sgaWYgc3BlY2lmaWVkIGFuZCBmYWxzZXkuXG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy51bmxlc3NHdGVxID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICBpZiAoY29udGV4dCA+PSBvcHRpb25zLmhhc2guY29tcGFyZSkge1xuICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG59O1xuXG4vKipcbiAqIEJsb2NrIGhlbHBlciB0aGF0IGFsd2F5cyByZW5kZXJzIHRoZSBpbnZlcnNlIGJsb2NrICoqdW5sZXNzIGBhYCBpc1xuICogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBiYCoqLlxuICpcbiAqIEBuYW1lIC51bmxlc3NMdGVxXG4gKiBAcGFyYW0ge09iamVjdH0gYGNvbnRleHRgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIEhhbmRsZWJhcnMgcHJvdmlkZWQgb3B0aW9ucyBvYmplY3RcbiAqIEByZXR1cm4ge1N0cmluZ30gQmxvY2ssIG9yIGludmVyc2UgYmxvY2sgaWYgc3BlY2lmaWVkIGFuZCBmYWxzZXkuXG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy51bmxlc3NMdGVxID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICBpZiAoY29udGV4dCA8PSBvcHRpb25zLmhhc2guY29tcGFyZSkge1xuICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEV4cG9zZSBgaGVscGVyc2BcbiAqL1xuXG52YXIgaGVscGVycyA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIEV4cG9zZSBgbW9tZW50YCBoZWxwZXJcbiAqIEBleHBvc2VzIGhlbHBlci1kYXRlIGFzIG1vbWVudFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLm1vbWVudCA9IHJlcXVpcmUoJ2hlbHBlci1kYXRlJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuLyoqXG4gKiBFeHBvc2UgYGhlbHBlcnNgXG4gKi9cblxudmFyIGhlbHBlcnMgPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBDb252ZXJ0cyBieXRlcyBpbnRvIGEgbmljZSByZXByZXNlbnRhdGlvbiB3aXRoIHVuaXQuXG4gKlxuICogKipFeGFtcGxlczoqKlxuICpcbiAqICAgLSBgMTM2NjE4NTUgPT4gMTMuNyBNQmBcbiAqICAgLSBgODI1Mzk5ID0+IDgyNSBLQmBcbiAqICAgLSBgMTM5NiA9PiAxIEtCYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBgdmFsdWVgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuZmlsZVNpemUgPSBmdW5jdGlvbihudW0pIHtcbiAgdmFyIGJ5dGVzID0gcGFyc2VJbnQobnVtLCAxMCk7XG5cbiAgaWYgKCF1dGlscy5pc051bWJlcihieXRlcykpIHtcbiAgICBjb25zb2xlLmVycm9yKCdoZWxwZXIge3tmaWxlU2l6ZX19IGNhbm5vdCBwYXJzZTogXCInICsgbnVtICsgJ1wiJyk7XG4gICAgcmV0dXJuIG51bS50b1N0cmluZygpOyAvLyBHcmFjZWZ1bCBkZWdyYWRhdGlvblxuICB9XG5cbiAgLy8gS0IgaXMgdGVjaG5pY2FsbHkgYSBLaWxvYml0LCBidXQgaXQgc2VlbXMgbW9yZSByZWFkYWJsZS5cbiAgdmFyIG1ldHJpYyA9IFsnYnl0ZScsICdieXRlcycsICdLQicsICdNQicsICdHQiddO1xuXG4gIHZhciByZXM7XG4gIGlmIChieXRlcyA9PT0gMCkge1xuICAgIHJldHVybiAnMCBieXRlcyc7XG4gIH0gZWxzZSB7XG4gICAgLy8gQmFzZSAxMDAwIChyYXRoZXIgdGhhbiAxMDI0KSBtYXRjaGVzIE1hYyBPUyBYXG4gICAgcmVzID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZygxMDAwKSk7XG5cbiAgICAvLyBObyBkZWNpbWFscyBmb3IgYW55dGhpbmcgc21hbGxlciB0aGFuIDEgTUJcbiAgICBudW0gPSAoYnl0ZXMgLyBNYXRoLnBvdygxMDAwLCBNYXRoLmZsb29yKHJlcykpKS50b0ZpeGVkKHJlcyA8IDIgPyAwIDogMSk7XG5cbiAgICBpZiAoYnl0ZXMgPT09IDEpIHtcbiAgICAgIHJlcyA9IC0xOyAvLyBzcGVjaWFsIGNhc2U6IDEgYnl0ZSAoc2luZ3VsYXIpXG4gICAgfVxuICB9XG4gIHJldHVybiBudW0gKyAnICcgKyBtZXRyaWNbcmVzICsgMV07XG59O1xuXG4vKipcbiAqIFJlYWQgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBgZmlsZXBhdGhgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMucmVhZCA9IGZ1bmN0aW9uKGZpbGVwYXRoKSB7XG4gIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoZmlsZXBhdGgsICd1dGY4Jyk7XG59O1xuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBvZiBmaWxlcyBmcm9tIHRoZSBnaXZlblxuICogZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBgZGlyZWN0b3J5YFxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMucmVhZGRpciA9IGZ1bmN0aW9uKGRpciwgZmlsdGVyKSB7XG4gIHZhciBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGRpcik7XG4gIGZpbGVzID0gZmlsZXMubWFwKGZ1bmN0aW9uKGZwKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihkaXIsIGZwKTtcbiAgfSk7XG4gIGlmICh1dGlscy5pc09wdGlvbnMoZmlsdGVyKSkge1xuICAgIHJldHVybiBmaWxlcztcbiAgfVxuICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmaWx0ZXIoZmlsZXMpO1xuICB9XG4gIGlmICh1dGlscy5pc1JlZ2V4KGZpbHRlcikpIHtcbiAgICB2YXIgcmUgPSB1dGlscy50b1JlZ2V4KGZpbHRlcik7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcihmdW5jdGlvbihmcCkge1xuICAgICAgcmV0dXJuIHJlLnRlc3QoZnApO1xuICAgIH0pO1xuICB9XG4gIGlmICh1dGlscy5pc0dsb2IoZmlsdGVyKSkge1xuICAgIHZhciBpc01hdGNoID0gdXRpbHMubW0ubWF0Y2hlcihmaWx0ZXIpO1xuICAgIHJldHVybiBmaWxlcy5maWx0ZXIoZnVuY3Rpb24oZnApIHtcbiAgICAgIHJldHVybiBpc01hdGNoKGZwKTtcbiAgICB9KTtcbiAgfVxuICBpZiAoWydpc0ZpbGUnLCAnaXNEaXJlY3RvcnknXS5pbmRleE9mKGZpbHRlcikgIT09IC0xKSB7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcihmdW5jdGlvbihmcCkge1xuICAgICAgdmFyIHN0YXQgPSBmcy5zdGF0U3luYyhmcCk7XG4gICAgICByZXR1cm4gc3RhdFtmaWx0ZXJdKCk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGZpbGVzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4vdXRpbHMvaHRtbCcpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIHBhcnNlQXR0ciA9IGh0bWwucGFyc2VBdHRyaWJ1dGVzO1xuXG4vKipcbiAqIEV4cG9zZSBgaGVscGVyc2BcbiAqL1xuXG52YXIgaGVscGVycyA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIEFkZCBhbiBhcnJheSBvZiBgPGxpbms+YCB0YWdzLiBBdXRvbWF0aWNhbGx5IHJlc29sdmVzXG4gKiByZWxhdGl2ZSBwYXRocyB0byBgb3B0aW9ucy5hc3NldHNgIGlmIHBhc3NlZCBvbiB0aGUgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBjb250ZXh0YFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmNzcyA9IGZ1bmN0aW9uKGFycmF5LCBvcHRpb25zKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIG9wdGlvbnMgPSBhcnJheTtcbiAgICBhcnJheSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBzdHlsZXMgPSB1dGlscy5hcnJheWlmeShhcnJheSB8fCBbXSk7XG4gIHZhciBhc3NldHMgPSAnJztcblxuICBpZiAodGhpcyAmJiB0aGlzLm9wdGlvbnMpIHtcbiAgICBhc3NldHMgPSB0aGlzLm9wdGlvbnMuYXNzZXRzIHx8ICcnO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuaGFzaC5ocmVmKSB7XG4gICAgc3R5bGVzID0gdXRpbHMuYXJyYXlpZnkob3B0aW9ucy5oYXNoLmhyZWYpO1xuICB9XG5cbiAgcmV0dXJuIHN0eWxlcy5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgIHZhciBleHQgPSBwYXRoLmV4dG5hbWUoaXRlbSk7XG4gICAgdmFyIGZwID0gcGF0aC5qb2luKGFzc2V0cywgaXRlbSk7XG5cbiAgICBpZiAoZXh0ID09PSAnLmxlc3MnKSB7XG4gICAgICByZXR1cm4gJzxsaW5rIHR5cGU9XCJ0ZXh0L2Nzc1wiIHJlbD1cInN0eWxlc2hlZXQvbGVzc1wiIGhyZWY9XCInICsgZnAgKyAnXCI+JztcbiAgICB9XG4gICAgcmV0dXJuICc8bGluayB0eXBlPVwidGV4dC9jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIicgKyBmcCArICdcIj4nO1xuICB9KS5qb2luKCdcXG4nKTtcbn07XG5cbi8qKlxuICogVHJ1bmNhdGVzIGEgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgYGxlbmd0aGAsIGFuZCBhcHBlbmRzXG4gKiBpdCB3aXRoIGFuIGVsaXBzaXMsIGDigKZgLlxuICpcbiAqIGBgYGpzXG4gKiB7e2VsbGlwc2lzIFwiPHNwYW4+Zm9vIGJhciBiYXo8L3NwYW4+XCIsIDd9fVxuICogLy89PiAnZm9vIGJhcuKApidcbiAqIGBgYFxuICogQG5hbWUgLmVsbGlwc2lzXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmBcbiAqIEBwYXJhbSB7TnVtYmVyfSBgbGVuZ3RoYCBUaGUgZGVzaXJlZCBsZW5ndGggb2YgdGhlIHJldHVybmVkIHN0cmluZy5cbiAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHRydW5jYXRlZCBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuZWxsaXBzaXMgPSBmdW5jdGlvbihzdHIsIGxpbWl0KSB7XG4gIGlmIChzdHIgJiYgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA8PSBsaW1pdCkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuIGhlbHBlcnMudHJ1bmNhdGUoc3RyLCBsaW1pdCkgKyAn4oCmJztcbiAgfVxufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBvbmUgb3IgbW9yZSBgPHNjcmlwdD48L3NjcmlwdD5gIHRhZ3Mgd2l0aCBwYXRocy91cmxzIHRvXG4gKiBqYXZhc2NyaXB0IG9yIGNvZmZlZXNjcmlwdCBmaWxlcy5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e2pzIHNjcmlwdHN9fVxuICogYGBgXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBgY29udGV4dGBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5qcyA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgaWYgKHV0aWxzLnR5cGVPZihjb250ZXh0KSA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgYXR0ciA9IGh0bWwudG9BdHRyaWJ1dGVzKGNvbnRleHQuaGFzaCk7XG4gICAgcmV0dXJuICc8c2NyaXB0JyArIGF0dHIgKyAnPjwvc2NyaXB0Pic7XG4gIH1cblxuICBpZiAodXRpbHMudHlwZU9mKGNvbnRleHQpID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAnPHNjcmlwdCBzcmM9XCInICsgY29udGV4dCArICdcIj48L3NjcmlwdD4nO1xuICB9XG5cbiAgY29udGV4dCA9IHV0aWxzLmFycmF5aWZ5KGNvbnRleHQpO1xuICByZXR1cm4gY29udGV4dC5tYXAoZnVuY3Rpb24oZnApIHtcbiAgICByZXR1cm4gKHBhdGguZXh0bmFtZShmcCkgPT09ICcuY29mZmVlJylcbiAgICAgID8gdXRpbHMudGFnKCdzY3JpcHQnLCB7dHlwZTogJ3RleHQvY29mZmVlc2NyaXB0Jywgc3JjOiBmcH0pXG4gICAgICA6IHV0aWxzLnRhZygnc2NyaXB0Jywge3NyYzogZnB9LCB0cnVlKTtcbiAgfSkuam9pbignXFxuJyk7XG59O1xuXG4vKipcbiAqIFN0cmlwIEhUTUwgdGFncyBmcm9tIGEgc3RyaW5nLCBzbyB0aGF0IG9ubHkgdGhlIHRleHQgbm9kZXNcbiAqIGFyZSBwcmVzZXJ2ZWQuXG4gKlxuICogYGBganNcbiAqIHt7c2FuaXRpemUgXCI8c3Bhbj5mb288L3NwYW4+XCJ9fVxuICogLy89PiAnZm9vJ1xuICogYGBgXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyYCBUaGUgc3RyaW5nIG9mIEhUTUwgdG8gc2FuaXRpemUuXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuc2FuaXRpemUgPSBmdW5jdGlvbihzdHIpIHtcbiAgcmV0dXJuIGh0bWwuc2FuaXRpemUoc3RyKTtcbn07XG5cbi8qKlxuICogVHJ1bmNhdGUgYSBzdHJpbmcgYnkgcmVtb3ZpbmcgYWxsIEhUTUwgdGFncyBhbmQgbGltaXRpbmcgdGhlIHJlc3VsdFxuICogdG8gdGhlIHNwZWNpZmllZCBgbGVuZ3RoYC4gQXNsbyBzZWUgW2VsbGlwc2lzXSgjZWxsaXBzaXMpLlxuICpcbiAqIGBgYGpzXG4gKiB0cnVuY2F0ZShcIjxzcGFuPmZvbyBiYXIgYmF6PC9zcGFuPlwiLCA3KTtcbiAqIC8vPT4gJ2ZvbyBiYXInXG4gKiBgYGBcbiAqXG4gKiBAbmFtZSAudHJ1bmNhdGVcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmBcbiAqIEBwYXJhbSAge051bWJlcn0gYGxpbWl0YCBUaGUgZGVzaXJlZCBsZW5ndGggb2YgdGhlIHJldHVybmVkIHN0cmluZy5cbiAqIEBwYXJhbSAge1N0cmluZ30gYHN1ZmZpeGAgT3B0aW9uYWxseSBzdXBwbHkgYSBzdHJpbmcgdG8gdXNlIGFzIGEgc3VmZml4IHRvXG4gKiBkZW5vdGUgd2hlbiB0aGUgc3RyaW5nIGhhcyBiZWVuIHRydW5jYXRlZC5cbiAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHRydW5jYXRlZCBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMudHJ1bmNhdGUgPSBmdW5jdGlvbihzdHIsIGxpbWl0LCBzdWZmaXgpIHtcbiAgaWYgKHN0ciAmJiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJykge1xuICAgIHZhciBjaCA9IHR5cGVvZiBzdWZmaXggPT09ICdzdHJpbmcnID8gc3VmZml4IDogJyc7XG4gICAgaWYgKHN0ci5sZW5ndGggPiBsaW1pdCkge1xuICAgICAgcmV0dXJuIGh0bWwuc2FuaXRpemUoc3RyKS5zbGljZSgwLCBsaW1pdCAtIGNoLmxlbmd0aCkgKyBjaDtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufTtcblxuLyoqXG4gKiBCbG9jayBoZWxwZXIgZm9yIGNyZWF0aW5nIHVub3JkZXJlZCBsaXN0cyAoYDx1bD48L3VsPmApXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBgY29udGV4dGBcbiAqIEBwYXJhbSAge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy51bCA9IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuICgnPHVsICcgKyAocGFyc2VBdHRyKG9wdGlvbnMuaGFzaCkpICsgJz4nKSArIGNvbnRleHQubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICByZXR1cm4gJzxsaT4nICsgKG9wdGlvbnMuZm4oaXRlbSkpICsgJzwvbGk+JztcbiAgfSkuam9pbignXFxuJykgKyAnPC91bD4nO1xufTtcblxuLyoqXG4gKiBCbG9jayBoZWxwZXIgZm9yIGNyZWF0aW5nIG9yZGVyZWQgbGlzdHMgIChgPG9sPjwvb2w+YClcbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBjb250ZXh0YFxuICogQHBhcmFtICB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLm9sID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICByZXR1cm4gKCc8b2wgJyArIChwYXJzZUF0dHIob3B0aW9ucy5oYXNoKSkgKyAnPicpICsgY29udGV4dC5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgIHJldHVybiAnPGxpPicgKyAob3B0aW9ucy5mbihpdGVtKSkgKyAnPC9saT4nO1xuICB9KS5qb2luKCdcXG4nKSArICc8L29sPic7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBgPGZpZ3VyZT5gIHdpdGggYSB0aHVtYm5haWwgbGlua2VkIHRvIGEgZnVsbCBwaWN0dXJlXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBgY29udGV4dGAgT2JqZWN0IHdpdGggdmFsdWVzL2F0dHJpYnV0ZXMgdG8gYWRkIHRvIHRoZSBnZW5lcmF0ZWQgZWxlbWVudHM6XG4gKiBAcGFyYW0ge1N0cmluZ30gYGNvbnRleHQuYWx0YFxuICogQHBhcmFtIHtTdHJpbmd9IGBjb250ZXh0LnNyY2BcbiAqIEBwYXJhbSB7TnVtYmVyfSBgY29udGV4dC53aWR0aGBcbiAqIEBwYXJhbSB7TnVtYmVyfSBgY29udGV4dC5oZWlnaHRgXG4gKiBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgYDxmaWd1cmU+YCBlbGVtZW50IHdpdGggaW1hZ2UgYW5kIG9wdGlvbmFsIGNhcHRpb24vbGluay5cbiAqIEBjb250cmlidXRvcjogTWFyaWUgSG9nZWJyYW5kdCA8aHR0cHM6Ly9naXRodWIuY29tL01lbGluZHJlYT5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy50aHVtYm5haWxJbWFnZSA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgdmFyIGZpZ3VyZSA9ICcnO1xuICB2YXIgaW1hZ2UgPSAnJztcblxuICB2YXIgbGluayA9IGNvbnRleHQuZnVsbCB8fCBmYWxzZTtcbiAgdmFyIGltYWdlQXR0cmlidXRlcyA9IHtcbiAgICBhbHQ6IGNvbnRleHQuYWx0LFxuICAgIHNyYzogY29udGV4dC50aHVtYm5haWwsXG4gICAgd2lkdGg6IGNvbnRleHQuc2l6ZS53aWR0aCxcbiAgICBoZWlnaHQ6IGNvbnRleHQuc2l6ZS5oZWlnaHRcbiAgfTtcblxuICB2YXIgZmlndXJlQXR0cmlidXRlcyA9IHsgaWQ6ICdpbWFnZS0nICsgY29udGV4dC5pZCB9O1xuICB2YXIgbGlua0F0dHJpYnV0ZXMgPSB7IGhyZWY6IGxpbmssIHJlbDogJ3RodW1ibmFpbCcgfTtcblxuICBpZiAoY29udGV4dC5jbGFzc2VzKSB7XG4gICAgaWYgKGNvbnRleHQuY2xhc3Nlcy5pbWFnZSkge1xuICAgICAgaW1hZ2VBdHRyaWJ1dGVzLmNsYXNzID0gY29udGV4dC5jbGFzc2VzLmltYWdlLmpvaW4oJyAnKTtcbiAgICB9XG4gICAgaWYgKGNvbnRleHQuY2xhc3Nlcy5maWd1cmUpIHtcbiAgICAgIGZpZ3VyZUF0dHJpYnV0ZXMuY2xhc3MgPSBjb250ZXh0LmNsYXNzZXMuZmlndXJlLmpvaW4oJyAnKTtcbiAgICB9XG4gICAgaWYgKGNvbnRleHQuY2xhc3Nlcy5saW5rKSB7XG4gICAgICBsaW5rQXR0cmlidXRlcy5jbGFzcyA9IGNvbnRleHQuY2xhc3Nlcy5saW5rLmpvaW4oJyAnKTtcbiAgICB9XG4gIH1cblxuICBmaWd1cmUgKz0gJzxmaWd1cmUgJyArIHBhcnNlQXR0cihmaWd1cmVBdHRyaWJ1dGVzKSArICc+XFxuJztcbiAgaW1hZ2UgKz0gJzxpbWcgJyArIHBhcnNlQXR0cihpbWFnZUF0dHJpYnV0ZXMpICsgJz5cXG4nO1xuXG4gIGlmIChsaW5rKSB7XG4gICAgZmlndXJlICs9ICc8YSAnICsgcGFyc2VBdHRyKGxpbmtBdHRyaWJ1dGVzKSArICc+XFxuJyArIGltYWdlICsgJzwvYT5cXG4nO1xuICB9IGVsc2Uge1xuICAgIGZpZ3VyZSArPSBpbWFnZTtcbiAgfVxuXG4gIGlmIChjb250ZXh0LmNhcHRpb24pIHtcbiAgICBmaWd1cmUgKz0gJzxmaWdjYXB0aW9uPicgKyBjb250ZXh0LmNhcHRpb24gKyAnPC9maWdjYXB0aW9uPlxcbic7XG4gIH1cblxuICBmaWd1cmUgKz0gJzwvZmlndXJlPic7XG4gIHJldHVybiBmaWd1cmU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogRXhwb3NlIGBoZWxwZXJzYFxuICovXG5cbnZhciBoZWxwZXJzID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogaTE4biBoZWxwZXIuIFNlZSBbYnV0dG9uLWkxOG5dKGh0dHBzOi8vZ2l0aHViLmNvbS9hc3NlbWJsZS9idXR0b25zKVxuICogZm9yIGEgd29ya2luZyBleGFtcGxlLlxuICpcbiAqIEBjb250cmlidXRvciBMYXVyZW50IEdvZGVycmUgPGh0dHBzOi8vZ2l0aHViLmNvbS9MYXVyZW50R29kZXJycmU+XG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBrZXlgXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmkxOG4gPSBmdW5jdGlvbihwcm9wLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIGlmICh1dGlscy5pc09wdGlvbnMoY29udGV4dCkpIHtcbiAgICBvcHRpb25zID0gY29udGV4dDtcbiAgICBjb250ZXh0ID0ge307XG4gIH1cblxuICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd7e2kxOG59fSBoZWxwZXIgZXhwZWN0ZWQgXCJrZXlcIiB0byBiZSBhIHN0cmluZycpO1xuICB9XG5cbiAgdmFyIG9wdHMgPSB1dGlscy5tZXJnZSh7fSwgdGhpcywgb3B0aW9ucy5oYXNoKTtcblxuICAvLyBhY2NvdW50IGZvciBgb3B0aW9uc2AgYmVpbmcgcGFzc2VkIG9uIHRoZSBjb250ZXh0XG4gIGlmIChvcHRzLm9wdGlvbnMpIHtcbiAgICBvcHRzID0gdXRpbHMubWVyZ2Uoe30sIG9wdHMsIG9wdHMub3B0aW9ucyk7XG4gICAgZGVsZXRlIG9wdHMub3B0aW9ucztcbiAgfVxuXG4gIHZhciBsYW5nID0gb3B0cy5sYW5ndWFnZSB8fCBvcHRzLmxhbmc7XG5cbiAgaWYgKHR5cGVvZiBsYW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcigne3tpMThufX0gaGVscGVyIGV4cGVjdGVkIFwibGFuZ3VhZ2VcIiBwYXJhbWV0ZXIgdG8gYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIHZhciB2YWx1ZSA9IHV0aWxzLmdldChvcHRzLCBsYW5nKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3t7aTE4bn19IGhlbHBlciBjYW5ub3QgZmluZCBsYW5ndWFnZSBcIicgKyBsYW5nICsgJ1wiJyk7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gdXRpbHMuZ2V0KHZhbHVlLCBwcm9wKTtcbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd7e2kxOG59fSBoZWxwZXIgY2Fubm90IGZpbmQgcHJvcGVydHkgXCInICsgcHJvcCArICdcIiBmb3IgbGFuZ3VhZ2UgXCInICsgbGFuZyArICdcIicpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhcnJheTogcmVxdWlyZSgnLi9hcnJheScpLFxuICBjb2RlOiByZXF1aXJlKCcuL2NvZGUnKSxcbiAgY29sbGVjdGlvbjogcmVxdWlyZSgnLi9jb2xsZWN0aW9uJyksXG4gIGNvbXBhcmlzb246IHJlcXVpcmUoJy4vY29tcGFyaXNvbicpLFxuICBkYXRlOiByZXF1aXJlKCcuL2RhdGUnKSxcbiAgZnM6IHJlcXVpcmUoJy4vZnMnKSxcbiAgaHRtbDogcmVxdWlyZSgnLi9odG1sJyksXG4gIGkxOG46IHJlcXVpcmUoJy4vaTE4bicpLFxuICBpbmZsZWN0aW9uOiByZXF1aXJlKCcuL2luZmxlY3Rpb24nKSxcbiAgbG9nZ2luZzogcmVxdWlyZSgnLi9sb2dnaW5nJyksXG4gIG1hcmtkb3duOiByZXF1aXJlKCcuL21hcmtkb3duJyksXG4gIG1hdGNoOiByZXF1aXJlKCcuL21hdGNoJyksXG4gIG1hdGg6IHJlcXVpcmUoJy4vbWF0aCcpLFxuICBtaXNjOiByZXF1aXJlKCcuL21pc2MnKSxcbiAgbnVtYmVyOiByZXF1aXJlKCcuL251bWJlcicpLFxuICBvYmplY3Q6IHJlcXVpcmUoJy4vb2JqZWN0JyksXG4gIHBhdGg6IHJlcXVpcmUoJy4vcGF0aCcpLFxuICBzdHJpbmc6IHJlcXVpcmUoJy4vc3RyaW5nJyksXG4gIHVybDogcmVxdWlyZSgnLi91cmwnKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIEV4cG9zZSBgaGVscGVyc2BcbiAqL1xuXG52YXIgaGVscGVycyA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIEBuYW1lIC5pbmZsZWN0XG4gKiBAcGFyYW0ge051bWJlcn0gYGNvdW50YFxuICogQHBhcmFtIHtTdHJpbmd9IGBzaW5ndWxhcmAgVGhlIHNpbmd1bGFyIGZvcm1cbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGx1cmFsYCBUaGUgcGx1cmFsIGZvcm1cbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5jbHVkZWBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5pbmZsZWN0ID0gZnVuY3Rpb24oY291bnQsIHNpbmd1bGFyLCBwbHVyYWwsIGluY2x1ZGUpIHtcbiAgdmFyIHdvcmQgPSAoY291bnQgPiAxIHx8IGNvdW50ID09PSAwKSA/IHBsdXJhbCA6IHNpbmd1bGFyO1xuXG4gIGlmICh1dGlscy5pc1VuZGVmaW5lZChpbmNsdWRlKSB8fCBpbmNsdWRlID09PSBmYWxzZSkge1xuICAgIHJldHVybiB3b3JkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBTdHJpbmcoY291bnQpICsgJyAnICsgd29yZDtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9yZGluYWxpemVkIG51bWJlciAoYXMgYSBzdHJpbmcpLlxuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7b3JkaW5hbGl6ZSAxfX1cbiAqIC8vPT4gJzFzdCdcbiAqIHt7b3JkaW5hbGl6ZSAyMX19XG4gKiAvLz0+ICcyMXN0J1xuICoge3tvcmRpbmFsaXplIDI5fX1cbiAqIC8vPT4gJzI5dGgnXG4gKiB7e29yZGluYWxpemUgMjJ9fVxuICogLy89PiAnMjJuZCdcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBgdmFsYCBUaGUgdmFsdWUgdG8gb3JkaW5hbGl6ZS5cbiAqIEByZXR1cm4ge1N0cmluZ30gVGhlIG9yZGluYWxpemVkIG51bWJlclxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLm9yZGluYWxpemUgPSBmdW5jdGlvbih2YWwpIHtcbiAgdmFyIG51bSA9IE1hdGguYWJzKE1hdGgucm91bmQodmFsKSk7XG4gIHZhciByZXMgPSBudW0gJSAxMDA7XG5cbiAgaWYgKHV0aWxzLmluZGV4T2YoWzExLCAxMiwgMTNdLCByZXMpID49IDApIHtcbiAgICByZXR1cm4gJycgKyB2YWwgKyAndGgnO1xuICB9XG5cbiAgc3dpdGNoIChudW0gJSAxMCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiAnJyArIHZhbCArICdzdCc7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuICcnICsgdmFsICsgJ25kJztcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gJycgKyB2YWwgKyAncmQnO1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiAnJyArIHZhbCArICd0aCc7XG4gICAgfVxuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFtsb2dnaW5nLWhlbHBlcnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9oZWxwZXJzL2xvZ2dpbmctaGVscGVycykuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnbG9nZ2luZy1oZWxwZXJzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRXhwb3NlIG1hcmtkb3duIGBoZWxwZXJzYCAoZm9yIHBlcmZvcm1hbmNlIHdlJ3JlIHVzaW5nIGdldHRlcnMgc29cbiAqIHRoYXQgdGhlIGhlbHBlcnMgYXJlIG9ubHkgbG9hZGVkIGlmIGNhbGxlZClcbiAqL1xuXG52YXIgaGVscGVycyA9IG1vZHVsZS5leHBvcnRzO1xudmFyIG1hcmtkb3duO1xudmFyIG1kO1xuXG4vKipcbiAqIEJsb2NrIGhlbHBlciB0aGF0IGNvbnZlcnRzIGEgc3RyaW5nIG9mIGlubGluZSBtYXJrZG93biB0byBIVE1MLlxuICpcbiAqIGBgYGh0bWxcbiAqIHt7I21hcmtkb3dufX1cbiAqICMgRm9vXG4gKiB7ey9tYXJrZG93bn19XG4gKiAvLz0+IDxoMT5Gb288L2gxPlxuICogYGBgXG4gKiBAbmFtZSAubWFya2Rvd25cbiAqIEBwYXJhbSB7T2JqZWN0fSBgY29udGV4dGBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoaGVscGVycywgJ21hcmtkb3duJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIHNldDogZnVuY3Rpb24odmFsKSB7XG4gICAgbWFya2Rvd24gPSB2YWw7XG4gIH0sXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG1hcmtkb3duIHx8IChtYXJrZG93biA9IHJlcXVpcmUoJ2hlbHBlci1tYXJrZG93bicpKCkpO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZWFkIGEgbWFya2Rvd24gZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbSBhbmQgaW5qZWN0IGl0cyBjb250ZW50cyBhZnRlclxuICogY29udmVydGluZyBpdCB0byBIVE1MLlxuICpcbiAqIGBgYGh0bWxcbiAqIHt7bWQgXCJmb28vYmFyLm1kXCJ9fVxuICogYGBgXG4gKiBAbmFtZSAubWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBgY29udGV4dGBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoaGVscGVycywgJ21kJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIHNldDogZnVuY3Rpb24odmFsKSB7XG4gICAgbWQgPSB2YWw7XG4gIH0sXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG1kIHx8IChtZCA9IHJlcXVpcmUoJ2hlbHBlci1tZCcpKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuLyoqXG4gKiBFeHBvc2UgYGhlbHBlcnNgXG4gKi9cblxudmFyIGhlbHBlcnMgPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBUaGUgbWFpbiBmdW5jdGlvbi4gUGFzcyBhbiBhcnJheSBvZiBmaWxlcGF0aHMsXG4gKiBhbmQgYSBzdHJpbmcgb3IgYXJyYXkgb2YgZ2xvYiBwYXR0ZXJucy4gT3B0aW9ucyBtYXlcbiAqIGJlIHBhc3NlZCBvbiB0aGUgaGFzaCBvciBvbiBgdGhpcy5vcHRpb25zYC5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e21hdGNoIChyZWFkZGlyIFwiZm9vXCIpIFwiKi5qc1wifX1cbiAqIGBgYFxuICogQHBhcmFtICB7QXJyYXl8U3RyaW5nfSBgZmlsZXNgXG4gKiBAcGFyYW0gIHtBcnJheXxTdHJpbmd9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucy5cbiAqIEBwYXJhbSAge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgb2YgbWF0Y2hlc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLm1tID0gZnVuY3Rpb24oKSB7XG4gIHZhciBhcmdzID0gdXRpbHMuZ2V0QXJncyh0aGlzLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdXRpbHMubW0uYXBwbHkodXRpbHMubW0sIGFyZ3MpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZpbGVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIGdsb2IgcGF0dGVybi5cbiAqIE9wdGlvbnMgbWF5IGJlIHBhc3NlZCBvbiB0aGUgaGFzaCBvciBvbiBgdGhpcy5vcHRpb25zYC5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e21hdGNoIChyZWFkZGlyIFwiZm9vXCIpIFwiKi5qc1wifX1cbiAqIGBgYFxuICogQHBhcmFtICB7QXJyYXl9IGBmaWxlc2BcbiAqIEBwYXJhbSAge1N0cmluZ30gYHBhdHRlcm5gXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMubWF0Y2ggPSBmdW5jdGlvbigpIHtcbiAgdmFyIGFyZ3MgPSB1dGlscy5nZXRBcmdzKHRoaXMsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB1dGlscy5tbS5tYXRjaC5hcHBseSh1dGlscy5tbSwgYXJncyk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhIGZpbGVwYXRoIGNvbnRhaW5zIHRoZSBnaXZlbiBwYXR0ZXJuLlxuICogT3B0aW9ucyBtYXkgYmUgcGFzc2VkIG9uIHRoZSBoYXNoIG9yIG9uIGB0aGlzLm9wdGlvbnNgLlxuICpcbiAqIGBgYGpzXG4gKiB7e2lzTWF0Y2ggXCJmb28ubWRcIiBcIioubWRcIn19XG4gKiAvLz0+IHRydWVcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYGZpbGVwYXRoYFxuICogQHBhcmFtICB7U3RyaW5nfSBgcGF0dGVybmBcbiAqIEBwYXJhbSAge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmlzTWF0Y2ggPSBmdW5jdGlvbigpIHtcbiAgdmFyIGFyZ3MgPSB1dGlscy5nZXRBcmdzKHRoaXMsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB1dGlscy5tbS5pc01hdGNoLmFwcGx5KHV0aWxzLm1tLCBhcmdzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuLyoqXG4gKiBFeHBvc2UgYGhlbHBlcnNgXG4gKi9cblxudmFyIGhlbHBlcnMgPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHByb2R1Y3Qgb2YgYGFgIHBsdXMgYGJgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBgYWBcbiAqIEBwYXJhbSB7TnVtYmVyfSBgYmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5hZGQgPSBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhICsgYjtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwcm9kdWN0IG9mIGBhYCBtaW51cyBgYmAuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGFcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5zdWJ0cmFjdCA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgLSBiO1xufTtcblxuLyoqXG4gKiBEaXZpZGUgYGFgIGJ5IGBiYFxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBgYWAgbnVtZXJhdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gYGJgIGRlbm9taW5hdG9yXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuZGl2aWRlID0gZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSAvIGI7XG59O1xuXG4vKipcbiAqIE11bHRpcGx5IGBhYCBieSBgYmAuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGBhYCBmYWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBgYmAgbXVsdGlwbGllclxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLm11bHRpcGx5ID0gZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSAqIGI7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgYE1hdGguZmxvb3IoKWAgb2YgdGhlIGdpdmVuIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBgdmFsdWVgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuZmxvb3IgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5mbG9vcih2YWx1ZSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgYE1hdGguY2VpbCgpYCBvZiB0aGUgZ2l2ZW4gdmFsdWUuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGB2YWx1ZWBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5jZWlsID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIE1hdGguY2VpbCh2YWx1ZSk7XG59O1xuXG4vKipcbiAqIFJvdW5kIHRoZSBnaXZlbiB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gYHZhbHVlYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLnJvdW5kID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgYWxsIG51bWJlcnMgaW4gdGhlIGdpdmVuIGFycmF5LlxuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7c3VtIFwiWzEsIDIsIDMsIDQsIDVdXCJ9fVxuICogLy89PiAnMTUnXG4gKiBgYGBcbiAqXG4gKiBAbmFtZSAuc3VtXG4gKiBAcGFyYW0ge0FycmF5fSBgYXJyYXlgIEFycmF5IG9mIG51bWJlcnMgdG8gYWRkIHVwLlxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLnN1bSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXJncyA9IHV0aWxzLmZsYXR0ZW4oW10uY29uY2F0LmFwcGx5KFtdLCBhcmd1bWVudHMpKTtcbiAgdmFyIGkgPSBhcmdzLmxlbmd0aCwgc3VtID0gMDtcbiAgd2hpbGUgKGktLSkge1xuICAgIGlmICghdXRpbHMuaXNOdW1iZXIoYXJnc1tpXSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBzdW0gKz0gKCthcmdzW2ldKTtcbiAgfVxuICByZXR1cm4gc3VtO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhdmVyYWdlIG9mIGFsbCBudW1iZXJzIGluIHRoZSBnaXZlbiBhcnJheS5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e2F2ZyBcIlsxLCAyLCAzLCA0LCA1XVwifX1cbiAqIC8vPT4gJzMnXG4gKiBgYGBcbiAqXG4gKiBAbmFtZSAuYXZnXG4gKiBAcGFyYW0ge0FycmF5fSBgYXJyYXlgIEFycmF5IG9mIG51bWJlcnMgdG8gYWRkIHVwLlxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmF2ZyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXJncyA9IHV0aWxzLmZsYXR0ZW4oW10uY29uY2F0LmFwcGx5KFtdLCBhcmd1bWVudHMpKTtcbiAgLy8gcmVtb3ZlIGhhbmRsZWJhcnMgb3B0aW9ucyBvYmplY3RcbiAgYXJncy5wb3AoKTtcbiAgcmV0dXJuIGV4cG9ydHMuc3VtKGFyZ3MpIC8gYXJncy5sZW5ndGg7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogRXhwb3NlIGBoZWxwZXJzYFxuICovXG5cbnZhciBoZWxwZXJzID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgdmFsdWUgaWYgZGVmaW5lZCwgb3RoZXJ3aXNlIHRoZSBcImRlZmF1bHRcIiB2YWx1ZSBpcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gYHZhbHVlYFxuICogQHBhcmFtIHthbnl9IGBkZWZhdWx0VmFsdWVgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYWxpYXMgLm9yXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuZGVmYXVsdCA9IGZ1bmN0aW9uKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGxcbiAgICA/IGRlZmF1bHRWYWx1ZVxuICAgIDogdmFsdWU7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgZ2l2ZW4gdmFsdWUgb2YgYHByb3BgIGZyb20gYHRoaXMub3B0aW9uc2AuIEdpdmVuIHRoZSBjb250ZXh0IGB7b3B0aW9uczoge2E6IHtiOiB7YzogJ2RkZCd9fX19YFxuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7b3B0aW9uIFwiYS5iLmNcIn19XG4gKiA8IS0tIHJlc3VsdHMgPT4gYGRkZGAgLS0+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYHByb3BgXG4gKiBAcmV0dXJuIHthbnl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMub3B0aW9uID0gZnVuY3Rpb24ocHJvcCkge1xuICB2YXIgb3B0cyA9ICh0aGlzICYmIHRoaXMub3B0aW9ucykgfHwge307XG4gIHJldHVybiB1dGlscy5nZXQob3B0cywgcHJvcCk7XG59O1xuXG4vKipcbiAqIEJsb2NrIGhlbHBlciB0aGF0IHJlbmRlcnMgdGhlIGJsb2NrIHdpdGhvdXQgdGFraW5nIGFueSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGJsb2NrXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMubm9vcCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG59O1xuXG4vKipcbiAqIEJsb2NrIGhlbHBlciB0aGF0IGJ1aWxkcyB0aGUgY29udGV4dCBmb3IgdGhlIGJsb2NrXG4gKiBmcm9tIHRoZSBvcHRpb25zIGhhc2guXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBIYW5kbGViYXJzIHByb3ZpZGVkIG9wdGlvbnMgb2JqZWN0LlxuICogQGNvbnRyaWJ1dG9yIFZsYWRpbWlyIEt1em5ldHNvdiA8aHR0cHM6Ly9naXRodWIuY29tL21pc3Rha3N0ZXI+XG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy53aXRoSGFzaCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuaGFzaCAmJiBPYmplY3Qua2V5cyhvcHRpb25zLmhhc2gpLmxlbmd0aCkge1xuICAgIHJldHVybiBvcHRpb25zLmZuKG9wdGlvbnMuaGFzaCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIEV4cG9zZSBgaGVscGVyc2BcbiAqL1xuXG52YXIgaGVscGVycyA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIEFkZCBjb21tYXMgdG8gbnVtYmVyc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBgbnVtYFxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmFkZENvbW1hcyA9IGZ1bmN0aW9uKG51bSkge1xuICByZXR1cm4gbnVtLnRvU3RyaW5nKCkucmVwbGFjZSgvKFxcZCkoPz0oXFxkXFxkXFxkKSsoPyFcXGQpKS9nLCAnJDEsJyk7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgYSBzdHJpbmcgb3IgbnVtYmVyIHRvIGEgZm9ybWF0dGVkIHBob25lIG51bWJlci5cbiAqXG4gKiBAcGFyYW0gIHtOdW1iZXJ8U3RyaW5nfSBgbnVtYCBUaGUgcGhvbmUgbnVtYmVyIHRvIGZvcm1hdCwgZS5nLiBgODAwNTU1MTIxMmBcbiAqIEByZXR1cm4ge051bWJlcn0gRm9ybWF0dGVkIHBob25lIG51bWJlcjogYCg4MDApIDU1NS0xMjEyYFxuICogQHNvdXJjZSBodHRwOi8vYml0Lmx5L1FsUG1QclxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLnBob25lTnVtYmVyID0gZnVuY3Rpb24obnVtKSB7XG4gIG51bSA9IG51bS50b1N0cmluZygpO1xuXG4gIHJldHVybiAnKCcgKyBudW0uc3Vic3RyKDAsIDMpICsgJykgJ1xuICAgICsgbnVtLnN1YnN0cigzLCAzKSArICctJ1xuICAgICsgbnVtLnN1YnN0cig2LCA0KTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgYSByYW5kb20gbnVtYmVyIGJldHdlZW4gdHdvIHZhbHVlc1xuICpcbiAqIEBwYXJhbSAge051bWJlcn0gYG1pbmBcbiAqIEBwYXJhbSAge051bWJlcn0gYG1heGBcbiAqIEBjb250cmlidXRvciBUaW0gRG91Z2xhcyA8aHR0cHM6Ly9naXRodWIuY29tL3RpbWRvdWdsYXM+XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMucmFuZG9tID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XG59O1xuXG4vKipcbiAqIEFiYnJldmlhdGUgbnVtYmVycyB0byB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGBwcmVjaXNpb25gLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYG51bWJlcmBcbiAqIEBwYXJhbSAge1N0cmluZ30gYHByZWNpc2lvbmBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy50b0FiYnIgPSBmdW5jdGlvbihudW1iZXIsIHByZWNpc2lvbikge1xuICBpZiAodXRpbHMuaXNVbmRlZmluZWQocHJlY2lzaW9uKSkge1xuICAgIHByZWNpc2lvbiA9IDI7XG4gIH1cblxuICAvLyAyIGRlY2ltYWwgcGxhY2VzID0+IDEwMCwgMyA9PiAxMDAwLCBldGMuXG4gIHByZWNpc2lvbiA9IE1hdGgucG93KDEwLCBwcmVjaXNpb24pO1xuICB2YXIgYWJiciA9IFsnaycsICdtJywgJ2InLCAndCcsICdxJ107XG4gIHZhciBsZW4gPSBhYmJyLmxlbmd0aCAtIDE7XG5cbiAgd2hpbGUgKGxlbiA+PSAwKSB7XG4gICAgdmFyIHNpemUgPSBNYXRoLnBvdygxMCwgKGxlbiArIDEpICogMyk7XG4gICAgaWYgKHNpemUgPD0gKG51bWJlciArIDEpKSB7XG4gICAgICBudW1iZXIgPSBNYXRoLnJvdW5kKG51bWJlciAqIHByZWNpc2lvbiAvIHNpemUpIC8gcHJlY2lzaW9uO1xuICAgICAgbnVtYmVyICs9IGFiYnJbbGVuXTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsZW4tLTtcbiAgfVxuICByZXR1cm4gbnVtYmVyO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gbnVtYmVyIGluIGV4cG9uZW50aWFsIG5vdGF0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiB7e3RvRXhwb25lbnRpYWwgbnVtYmVyIGRpZ2l0c319O1xuICogYGBgXG4gKiBAcGFyYW0ge051bWJlcn0gYG51bWJlcmBcbiAqIEBwYXJhbSB7TnVtYmVyfSBgZnJhY3Rpb25EaWdpdHNgIE9wdGlvbmFsLiBBbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBkaWdpdHMgdG8gdXNlIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LiBEZWZhdWx0cyB0byBhcyBtYW55IGRpZ2l0cyBhcyBuZWNlc3NhcnkgdG8gc3BlY2lmeSB0aGUgbnVtYmVyLlxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLnRvRXhwb25lbnRpYWwgPSBmdW5jdGlvbihudW1iZXIsIGRpZ2l0cykge1xuICBpZiAodXRpbHMuaXNVbmRlZmluZWQoZGlnaXRzKSkge1xuICAgIGRpZ2l0cyA9IDA7XG4gIH1cbiAgcmV0dXJuIG51bWJlci50b0V4cG9uZW50aWFsKGRpZ2l0cyk7XG59O1xuXG4vKipcbiAqIEZvcm1hdHMgdGhlIGdpdmVuIG51bWJlciB1c2luZyBmaXhlZC1wb2ludCBub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gYG51bWJlcmBcbiAqIEBwYXJhbSB7TnVtYmVyfSBgZGlnaXRzYCBPcHRpb25hbC4gVGhlIG51bWJlciBvZiBkaWdpdHMgdG8gdXNlIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50OyB0aGlzIG1heSBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMjAsIGluY2x1c2l2ZSwgYW5kIGltcGxlbWVudGF0aW9ucyBtYXkgb3B0aW9uYWxseSBzdXBwb3J0IGEgbGFyZ2VyIHJhbmdlIG9mIHZhbHVlcy4gSWYgdGhpcyBhcmd1bWVudCBpcyBvbWl0dGVkLCBpdCBpcyB0cmVhdGVkIGFzIDAuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMudG9GaXhlZCA9IGZ1bmN0aW9uKG51bWJlciwgZGlnaXRzKSB7XG4gIGlmICh1dGlscy5pc1VuZGVmaW5lZChkaWdpdHMpKSB7XG4gICAgZGlnaXRzID0gMDtcbiAgfVxuICByZXR1cm4gbnVtYmVyLnRvRml4ZWQoZGlnaXRzKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtOdW1iZXJ9IGBudW1iZXJgXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMudG9GbG9hdCA9IGZ1bmN0aW9uKG51bWJlcikge1xuICByZXR1cm4gcGFyc2VGbG9hdChudW1iZXIpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge051bWJlcn0gYG51bWJlcmBcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy50b0ludCA9IGZ1bmN0aW9uKG51bWJlcikge1xuICByZXR1cm4gcGFyc2VJbnQobnVtYmVyLCAxMCk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7TnVtYmVyfSBgbnVtYmVyYFxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLnRvUHJlY2lzaW9uID0gZnVuY3Rpb24obnVtYmVyLCBwcmVjaXNpb24pIHtcbiAgaWYgKHV0aWxzLmlzVW5kZWZpbmVkKHByZWNpc2lvbikpIHtcbiAgICBwcmVjaXNpb24gPSAxO1xuICB9XG4gIHJldHVybiBudW1iZXIudG9QcmVjaXNpb24ocHJlY2lzaW9uKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhcnJheSA9IHJlcXVpcmUoJy4vYXJyYXknKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvJyk7XG5cbi8qKlxuICogRXhwb3NlIGBoZWxwZXJzYFxuICovXG5cbnZhciBoZWxwZXJzID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogRXh0ZW5kIHRoZSBjb250ZXh0IHdpdGggdGhlIHByb3BlcnRpZXMgb2Ygb3RoZXIgb2JqZWN0cy5cbiAqIEEgc2hhbGxvdyBtZXJnZSBpcyBwZXJmb3JtZWQgdG8gYXZvaWQgbXV0YXRpbmcgdGhlIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGBvYmplY3RzYCBPbmUgb3IgbW9yZSBvYmplY3RzIHRvIGV4dGVuZC5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5leHRlbmQgPSBmdW5jdGlvbigvKm9iamVjdHMqLykge1xuICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgdmFyIGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG5cbiAgaWYgKGxhc3QgJiYgdHlwZW9mIGxhc3QgPT09ICdvYmplY3QnICYmIGxhc3QuaGFzaCkge1xuICAgIGxhc3QgPSBsYXN0Lmhhc2g7XG4gICAgYXJncy5wb3AoKTsgLy8gcmVtb3ZlIGhhbmRsZWJhcnMgb3B0aW9ucyBvYmplY3RcbiAgICBhcmdzLnB1c2gobGFzdCk7XG4gIH1cblxuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBjb250ZXh0ID0ge307XG4gIHZhciBpID0gLTE7XG5cbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIHZhciBvYmogPSBhcmdzW2ldO1xuICAgIC8vIHNraXAgb3ZlciBzcGFyc2UgYXJndW1lbnRzXG4gICAgaWYgKG9iaiAhPSBudWxsKSB7XG4gICAgICB1dGlscy5mb3JPd24ob2JqLCBmdW5jdGlvbih2YWwsIGtleSkge1xuICAgICAgICB0aGlzW2tleV0gPSB2YWw7XG4gICAgICB9LCBjb250ZXh0KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuXG4vKipcbiAqIEJsb2NrIGhlbHBlciB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIHByb3BlcnRpZXMgb2ZcbiAqIGFuIG9iamVjdCwgZXhwb3NpbmcgZWFjaCBrZXkgYW5kIHZhbHVlIG9uIHRoZSBjb250ZXh0LlxuICpcbiAqIEBuYW1lIC5mb3JJblxuICogQHBhcmFtIHtPYmplY3R9IGBjb250ZXh0YFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGJsb2NrXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuZm9ySW4gPSBmdW5jdGlvbihvYmosIG9wdGlvbnMpIHtcbiAgaWYgKCF1dGlscy5pc09wdGlvbnMob3B0aW9ucykpIHtcbiAgICByZXR1cm4gb2JqLmludmVyc2UodGhpcyk7XG4gIH1cblxuICB2YXIgZGF0YSA9IHV0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMsIG9wdGlvbnMuaGFzaCk7XG4gIHZhciByZXN1bHQgPSAnJztcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgZGF0YS5rZXkgPSBrZXk7XG4gICAgcmVzdWx0ICs9IG9wdGlvbnMuZm4ob2JqW2tleV0sIHtkYXRhOiBkYXRhfSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQmxvY2sgaGVscGVyIHRoYXQgaXRlcmF0ZXMgb3ZlciB0aGUgKipvd24qKiBwcm9wZXJ0aWVzIG9mXG4gKiBhbiBvYmplY3QsIGV4cG9zaW5nIGVhY2gga2V5IGFuZCB2YWx1ZSBvbiB0aGUgY29udGV4dC5cbiAqXG4gKiBAbmFtZSAuZm9yT3duXG4gKiBAcGFyYW0ge09iamVjdH0gYG9iamAgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5mb3JPd24gPSBmdW5jdGlvbihvYmosIG9wdGlvbnMpIHtcbiAgaWYgKCF1dGlscy5pc09wdGlvbnMob3B0aW9ucykpIHtcbiAgICByZXR1cm4gb2JqLmludmVyc2UodGhpcyk7XG4gIH1cblxuICB2YXIgZGF0YSA9IHV0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMsIG9wdGlvbnMuaGFzaCk7XG4gIHZhciByZXN1bHQgPSAnJztcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBkYXRhLmtleSA9IGtleTtcbiAgICAgIHJlc3VsdCArPSBvcHRpb25zLmZuKG9ialtrZXldLCB7ZGF0YTogZGF0YX0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBVc2UgcHJvcGVydHkgcGF0aHMgKGBhLmIuY2ApIHRvIGdldCBhIHZhbHVlIG9yIG5lc3RlZCB2YWx1ZSBmcm9tXG4gKiB0aGUgY29udGV4dC4gV29ya3MgYXMgYSByZWd1bGFyIGhlbHBlciBvciBibG9jayBoZWxwZXIuXG4gKlxuICogQG5hbWUgLmdldFxuICogQHBhcmFtIHtTdHJpbmd9IGBwcm9wYCBUaGUgcHJvcGVydHkgdG8gZ2V0LCBvcHRpb25hbGx5IHVzaW5nIGRvdCBub3RhdGlvbiBmb3IgbmVzdGVkIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gYGNvbnRleHRgIFRoZSBjb250ZXh0IG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBUaGUgaGFuZGxlYmFycyBvcHRpb25zIG9iamVjdCwgaWYgdXNlZCBhcyBhIGJsb2NrIGhlbHBlci5cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmdldCA9IGZ1bmN0aW9uKHByb3AsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgdmFyIHZhbCA9IHV0aWxzLmdldChjb250ZXh0LCBwcm9wKTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5mbikge1xuICAgIHJldHVybiB2YWwgPyBvcHRpb25zLmZuKHZhbCkgOiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn07XG5cbi8qKlxuICogVXNlIHByb3BlcnR5IHBhdGhzIChgYS5iLmNgKSB0byBnZXQgYW4gb2JqZWN0IGZyb21cbiAqIHRoZSBjb250ZXh0LiBEaWZmZXJzIGZyb20gdGhlIGBnZXRgIGhlbHBlciBpbiB0aGF0IHRoaXNcbiAqIGhlbHBlciB3aWxsIHJldHVybiB0aGUgYWN0dWFsIG9iamVjdCwgaW5jbHVkaW5nIHRoZVxuICogZ2l2ZW4gcHJvcGVydHkga2V5LiBBbHNvLCB0aGlzIGhlbHBlciBkb2VzIG5vdCB3b3JrIGFzIGFcbiAqIGJsb2NrIGhlbHBlci5cbiAqXG4gKiBAbmFtZSAuZ2V0T2JqZWN0XG4gKiBAcGFyYW0ge1N0cmluZ30gYHByb3BgIFRoZSBwcm9wZXJ0eSB0byBnZXQsIG9wdGlvbmFsbHkgdXNpbmcgZG90IG5vdGF0aW9uIGZvciBuZXN0ZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgY29udGV4dGAgVGhlIGNvbnRleHQgb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuZ2V0T2JqZWN0ID0gZnVuY3Rpb24ocHJvcCwgY29udGV4dCkge1xuICByZXR1cm4gdXRpbHMuZ2V0T2JqZWN0KGNvbnRleHQsIHByb3ApO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiBga2V5YCBpcyBhbiBvd24sIGVudW1lcmFibGUgcHJvcGVydHlcbiAqIG9mIHRoZSBnaXZlbiBgY29udGV4dGAgb2JqZWN0LlxuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7aGFzT3duIGNvbnRleHQga2V5fX1cbiAqIGBgYFxuICpcbiAqIEBuYW1lIC5oYXNPd25cbiAqIEBwYXJhbSAge1N0cmluZ30gYGtleWBcbiAqIEBwYXJhbSAge09iamVjdH0gYGNvbnRleHRgIFRoZSBjb250ZXh0IG9iamVjdC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuaGFzT3duID0gZnVuY3Rpb24oY29udGV4dCwga2V5KSB7XG4gIHJldHVybiB7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbnRleHQsIGtleSk7XG59O1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LlxuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7aXNPYmplY3QgXCJmb29cIn19XG4gKiAvLz0+IGZhbHNlXG4gKiBgYGBcbiAqIEBuYW1lIC5pc09iamVjdFxuICogQHBhcmFtICB7U3RyaW5nfSBgdmFsdWVgXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmlzT2JqZWN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59O1xuXG4vKipcbiAqIERlZXBseSBtZXJnZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gYG9iamVjdHNgIHdpdGggdGhlXG4gKiBjb250ZXh0IG9iamVjdC5cbiAqXG4gKiBAbmFtZSAubWVyZ2VcbiAqIEBwYXJhbSAge09iamVjdH0gYG9iamVjdGAgVGhlIHRhcmdldCBvYmplY3QuIFBhc3MgYW4gZW1wdHkgb2JqZWN0IHRvIHNoYWxsb3cgY2xvbmUuXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBvYmplY3RzYFxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLm1lcmdlID0gZnVuY3Rpb24oY29udGV4dC8qLCBvYmplY3RzLCBvcHRpb25zKi8pIHtcbiAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gIHZhciBsYXN0ID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuXG4gIGlmIChsYXN0ICYmIHR5cGVvZiBsYXN0ID09PSAnb2JqZWN0JyAmJiBsYXN0Lmhhc2gpIHtcbiAgICBsYXN0ID0gbGFzdC5oYXNoO1xuICAgIGFyZ3MucG9wKCk7IC8vIHJlbW92ZSBoYW5kbGViYXJzIG9wdGlvbnMgb2JqZWN0XG4gICAgYXJncy5wdXNoKGxhc3QpO1xuICB9XG5cbiAgY29udGV4dCA9IHV0aWxzLm1lcmdlLmFwcGx5KHV0aWxzLm1lcmdlLCBhcmdzKTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuXG4vKipcbiAqIEJsb2NrIGhlbHBlciB0aGF0IHBhcnNlcyBhIHN0cmluZyB1c2luZyBgSlNPTi5wYXJzZWAsXG4gKiB0aGVuIHBhc3NlcyB0aGUgcGFyc2VkIG9iamVjdCB0byB0aGUgYmxvY2sgYXMgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmluZ2AgVGhlIHN0cmluZyB0byBwYXJzZVxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBIYW5kbGViYXJzIG9wdGlvbnMgb2JqZWN0XG4gKiBAY29udHJpYnV0b3IgZ2l0aHViLmNvbS9rZWVnYW5zdHJlZXRcbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLnBhcnNlSlNPTiA9IGZ1bmN0aW9uKHN0ciwgb3B0aW9ucykge1xuICByZXR1cm4gb3B0aW9ucy5mbihKU09OLnBhcnNlKHN0cikpO1xufTtcblxuLyoqXG4gKiBQaWNrIHByb3BlcnRpZXMgZnJvbSB0aGUgY29udGV4dCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGBwcm9wZXJ0aWVzYCBPbmUgb3IgbW9yZSBwcm9lcGVydGllcyB0byBwaWNrLlxuICogQHBhcmFtIHtPYmplY3R9IGBjb250ZXh0YFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBIYW5kbGViYXJzIG9wdGlvbnMgb2JqZWN0LlxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHRoZSBwaWNrZWQgdmFsdWVzLiBJZiB1c2VkIGFzIGEgYmxvY2sgaGVscGVyLCB0aGUgdmFsdWVzIGFyZSBwYXNzZWQgYXMgY29udGV4dCB0byB0aGUgaW5uZXIgYmxvY2suIElmIG5vIHZhbHVlcyBhcmUgZm91bmQsIHRoZSBjb250ZXh0IGlzIHBhc3NlZCB0byB0aGUgaW52ZXJzZSBibG9jay5cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLnBpY2sgPSBmdW5jdGlvbihwcm9wcywgY29udGV4dCwgb3B0aW9ucykge1xuICB2YXIga2V5cyA9IGFycmF5LmFycmF5aWZ5KHByb3BzKTtcbiAgdmFyIGxlbiA9IGtleXMubGVuZ3RoLCBpID0gLTE7XG4gIHZhciByZXN1bHQgPSB7fTtcblxuICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgcmVzdWx0ID0gaGVscGVycy5leHRlbmQocmVzdWx0LCB1dGlscy5nZXRPYmplY3QoY29udGV4dCwga2V5c1tpXSkpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuZm4pIHtcbiAgICBpZiAoT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmZuKHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFN0cmluZ2lmeSBhbiBvYmplY3QgdXNpbmcgYEpTT04uc3RyaW5naWZ5YC5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBvYmpgIE9iamVjdCB0byBzdHJpbmdpZnlcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5zdHJpbmdpZnkgPSBmdW5jdGlvbihvYmosIGluZGVudCkge1xuICBpZiAoIXV0aWxzLmlzTnVtYmVyKGluZGVudCkpIHtcbiAgICBpbmRlbnQgPSAwO1xuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIGluZGVudCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuLyoqXG4gKiBFeHBvc2UgYGhlbHBlcnNgXG4gKi9cblxudmFyIGhlbHBlcnMgPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBHZXQgdGhlIGZpbGUgZXh0ZW5zaW9uIGZyb20gdGhlIGdpdmVuIGBmaWxlcGF0aGAuXG4gKlxuICogYGBgaGFuZGxlYmFyc1xuICoge3tiYXNlbmFtZSBcImRvY3MvdG9jLm1kXCJ9fVxuICogLy89PiAndG9jLm1kJ1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGV4dGBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5iYXNlbmFtZSA9IGZ1bmN0aW9uKGZpbGVwYXRoKSB7XG4gIHJldHVybiBwYXRoLmJhc2VuYW1lKGZpbGVwYXRoKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBkaXJlY3RvcnkgcGF0aCBzZWdtZW50IGZyb20gdGhlIGdpdmVuIGBmaWxlcGF0aGAuXG4gKlxuICogYGBgaGFuZGxlYmFyc1xuICoge3tkaXJuYW1lIFwiZG9jcy90b2MubWRcIn19XG4gKiAvLz0+ICdkb2NzJ1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGV4dGBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5kaXJuYW1lID0gZnVuY3Rpb24oZmlsZXBhdGgpIHtcbiAgcmV0dXJuIHBhdGguZGlybmFtZShmaWxlcGF0aCk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZmlsZSBleHRlbnNpb24gZnJvbSB0aGUgZ2l2ZW4gYGZpbGVwYXRoYC5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e2V4dG5hbWUgXCJkb2NzL3RvYy5tZFwifX1cbiAqIC8vPT4gJy5tZCdcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBmaWxlcGF0aGBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5leHRuYW1lID0gZnVuY3Rpb24oZmlsZXBhdGgpIHtcbiAgcmV0dXJuIHBhdGguZXh0bmFtZShmaWxlcGF0aCk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcmVsYXRpdmUgZmlsZXBhdGggZnJvbSBgYWAgdG8gYGJgLlxuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7cmVsYXRpdmUgYSBifX1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBgYWBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgYmBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5yZWxhdGl2ZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIHV0aWxzLnJlbGF0aXZlKGEsIGIpO1xufTtcblxuLyoqXG4gKiBHZXQgc3BlY2lmaWMgKGpvaW5lZCkgc2VnbWVudHMgb2YgYSBmaWxlIHBhdGggYnkgcGFzc2luZyBhXG4gKiByYW5nZSBvZiBhcnJheSBpbmRpY2VzLlxuICpcbiAqIGBgYGpzXG4gKiB7e3NlZ21lbnRzIFwiYS9iL2MvZFwiIFwiMlwiIFwiM1wifX1cbiAqIC8vPT4gJ2MvZCdcbiAqXG4gKiB7e3NlZ21lbnRzIFwiYS9iL2MvZFwiIFwiMVwiIFwiM1wifX1cbiAqIC8vPT4gJ2IvYy9kJ1xuICpcbiAqIHt7c2VnbWVudHMgXCJhL2IvYy9kXCIgXCIxXCIgXCIyXCJ9fVxuICogLy89PiAnYi9jJ1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGBmaWxlcGF0aGAgVGhlIGZpbGUgcGF0aCB0byBzcGxpdCBpbnRvIHNlZ21lbnRzLlxuICogQHJldHVybiB7U3RyaW5nfSBSZXR1cm5zIGEgc2luZ2xlLCBqb2luZWQgZmlsZSBwYXRoLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLnNlZ21lbnRzID0gZnVuY3Rpb24oZnAsIGEsIGIpIHtcbiAgcmV0dXJuIHV0aWxzLm5vcm1hbGl6ZShmcCkuc3BsaXQoJy8nKS5zbGljZShhLCBiKS5qb2luKCcvJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogRXhwb3NlIGBoZWxwZXJzYFxuICovXG5cbnZhciBoZWxwZXJzID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogY2FtZWxDYXNlIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBgc3RyaW5nYC5cbiAqXG4gKiBgYGBqc1xuICoge3tjYW1lbGNhc2UgXCJmb28gYmFyIGJhelwifX07XG4gKiAvLz0+ICdmb29CYXJCYXonXG4gKiBgYGBcbiAqXG4gKiBAbmFtZSAuY2FtZWxjYXNlXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdHJpbmdgIFRoZSBzdHJpbmcgdG8gY2FtZWxjYXNlLlxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmNhbWVsY2FzZSA9IGZ1bmN0aW9uKHN0cikge1xuICByZXR1cm4gdXRpbHMuY2hhbmdlY2FzZShzdHIsIGZ1bmN0aW9uKGNoKSB7XG4gICAgcmV0dXJuIGNoLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBDYXBpdGFsaXplIHRoZSBmaXJzdCB3b3JkIGluIGEgc2VudGVuY2UuXG4gKlxuICogYGBgaGFuZGxlYmFyc1xuICoge3tjYXBpdGFsaXplIFwiZm9vIGJhciBiYXpcIn19XG4gKiAvLz0+IFwiRm9vIGJhciBiYXpcIlxuICogYGBgXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdHJgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyICYmIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKVxuICAgICAgKyBzdHIuc2xpY2UoMSk7XG4gIH1cbn07XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSBhbGwgd29yZHMgaW4gYSBzdHJpbmcuXG4gKlxuICogYGBgaGFuZGxlYmFyc1xuICoge3tjYXBpdGFsaXplIFwiZm9vIGJhciBiYXpcIn19XG4gKiAvLz0+IFwiRm9vIEJhciBCYXpcIlxuICogYGBgXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdHJgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuY2FwaXRhbGl6ZUFsbCA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyICYmIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHdcXFMqL2csIGZ1bmN0aW9uKHdvcmQpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmNhcGl0YWxpemUod29yZCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogQ2VudGVyIGEgc3RyaW5nIHVzaW5nIG5vbi1icmVha2luZyBzcGFjZXNcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdHJgXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzcGFjZXNgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuY2VudGVyID0gZnVuY3Rpb24oc3RyLCBzcGFjZXMpIHtcbiAgaWYgKHN0ciAmJiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJykge1xuICAgIHZhciBzcGFjZSA9ICcnO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IHNwYWNlcykge1xuICAgICAgc3BhY2UgKz0gJyZuYnNwOyc7XG4gICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiBzcGFjZSArIHN0ciArIHNwYWNlO1xuICB9XG59O1xuXG4vKipcbiAqIExpa2UgdHJpbSwgYnV0IHJlbW92ZXMgYm90aCBleHRyYW5lb3VzIHdoaXRlc3BhY2UgKiphbmRcbiAqIG5vbi13b3JkIGNoYXJhY3RlcnMqKiBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICoge3tjaG9wIFwiX0FCQ19cIn19XG4gKiAvLz0+ICdBQkMnXG4gKlxuICoge3tjaG9wIFwiLUFCQy1cIn19XG4gKiAvLz0+ICdBQkMnXG4gKlxuICoge3tjaG9wIFwiIEFCQyBcIn19XG4gKiAvLz0+ICdBQkMnXG4gKiBgYGBcbiAqXG4gKiBAbmFtZSAuY2hvcFxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyaW5nYCBUaGUgc3RyaW5nIHRvIGNob3AuXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuY2hvcCA9IGZ1bmN0aW9uKHN0cikge1xuICByZXR1cm4gdXRpbHMuY2hvcChzdHIpO1xufTtcblxuLyoqXG4gKiBkYXNoLWNhc2UgdGhlIGNoYXJhY3RlcnMgaW4gYHN0cmluZ2AuIFJlcGxhY2VzIG5vbi13b3JkXG4gKiBjaGFyYWN0ZXJzIGFuZCBwZXJpb2RzIHdpdGggaHlwaGVucy5cbiAqXG4gKiBgYGBqc1xuICoge3tkYXNoY2FzZSBcImEtYi1jIGRfZVwifX1cbiAqIC8vPT4gJ2EtYi1jLWQtZSdcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmluZ2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5kYXNoY2FzZSA9IGZ1bmN0aW9uKHN0cikge1xuICByZXR1cm4gdXRpbHMuY2hhbmdlY2FzZShzdHIsIGZ1bmN0aW9uKGNoKSB7XG4gICAgcmV0dXJuICctJyArIGNoO1xuICB9KTtcbn07XG5cbi8qKlxuICogZG90LmNhc2UgdGhlIGNoYXJhY3RlcnMgaW4gYHN0cmluZ2AuXG4gKlxuICogYGBganNcbiAqIHt7ZG90Y2FzZSBcImEtYi1jIGRfZVwifX1cbiAqIC8vPT4gJ2EuYi5jLmQuZSdcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmluZ2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5kb3RjYXNlID0gZnVuY3Rpb24oc3RyKSB7XG4gIHJldHVybiB1dGlscy5jaGFuZ2VjYXNlKHN0ciwgZnVuY3Rpb24oY2gpIHtcbiAgICByZXR1cm4gJy4nICsgY2g7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXBsYWNlIHNwYWNlcyBpbiBhIHN0cmluZyB3aXRoIGh5cGhlbnMuXG4gKlxuICogYGBgaGFuZGxlYmFyc1xuICoge3toeXBoZW5hdGUgXCJmb28gYmFyIGJheiBxdXhcIn19XG4gKiAvLz0+IFwiZm9vLWJhci1iYXotcXV4XCJcbiAqIGBgYFxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyYFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmh5cGhlbmF0ZSA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyICYmIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0ci5zcGxpdCgnICcpLmpvaW4oJy0nKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLlxuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7aXNTdHJpbmcgXCJmb29cIn19XG4gKiAvLz0+ICd0cnVlJ1xuICogYGBgXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGB2YWx1ZWBcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuaXNTdHJpbmcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdXRpbHMuaXNTdHJpbmcodmFsdWUpO1xufTtcblxuLyoqXG4gKiBMb3dlcmNhc2UgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuIHN0cmluZy5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e2xvd2VyY2FzZSBcIkZvbyBCQVIgYmFaXCJ9fVxuICogLy89PiAnZm9vIGJhciBiYXonXG4gKiBgYGBcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5sb3dlcmNhc2UgPSBmdW5jdGlvbihzdHIpIHtcbiAgaWYgKHN0ciAmJiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIG51bWJlciBvZiBvY2N1cnJhbmNlcyBvZiBgc3Vic3RyaW5nYCB3aXRoaW4gdGhlXG4gKiBnaXZlbiBgc3RyaW5nYC5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e29jY3VycmFuY2VzIFwiZm9vIGJhciBmb28gYmFyIGJhelwiIFwiZm9vXCJ9fVxuICogLy89PiAyXG4gKiBgYGBcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmBcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN1YnN0cmluZ2BcbiAqIEByZXR1cm4ge051bWJlcn0gTnVtYmVyIG9mIG9jY3VycmFuY2VzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMub2NjdXJyZW5jZXMgPSBmdW5jdGlvbihzdHIsIHN1YnN0cmluZykge1xuICBpZiAoc3RyICYmIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIGxlbiA9IHN1YnN0cmluZy5sZW5ndGg7XG4gICAgdmFyIHBvcyA9IDA7XG4gICAgdmFyIG4gPSAwO1xuXG4gICAgd2hpbGUgKChwb3MgPSBzdHIuaW5kZXhPZihzdWJzdHJpbmcsIHBvcykpKSB7XG4gICAgICBpZiAocG9zID4gLTEpIHtcbiAgICAgICAgbisrO1xuICAgICAgICBwb3MgKz0gbGVuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9XG59O1xuXG4vKipcbiAqIFBhc2NhbENhc2UgdGhlIGNoYXJhY3RlcnMgaW4gYHN0cmluZ2AuXG4gKlxuICogYGBganNcbiAqIHt7cGFzY2FsY2FzZSBcImZvbyBiYXIgYmF6XCJ9fVxuICogLy89PiAnRm9vQmFyQmF6J1xuICogYGBgXG4gKlxuICogQG5hbWUgLnBhc2NhbGNhc2VcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmluZ2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5wYXNjYWxjYXNlID0gZnVuY3Rpb24oc3RyKSB7XG4gIHN0ciA9IHV0aWxzLmNoYW5nZWNhc2Uoc3RyLCBmdW5jdGlvbihjaCkge1xuICAgIHJldHVybiBjaC50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKVxuICAgICsgc3RyLnNsaWNlKDEpO1xufTtcblxuLyoqXG4gKiBwYXRoL2Nhc2UgdGhlIGNoYXJhY3RlcnMgaW4gYHN0cmluZ2AuXG4gKlxuICogYGBganNcbiAqIHt7cGF0aGNhc2UgXCJhLWItYyBkX2VcIn19XG4gKiAvLz0+ICdhL2IvYy9kL2UnXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdHJpbmdgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMucGF0aGNhc2UgPSBmdW5jdGlvbihzdHIpIHtcbiAgcmV0dXJuIHV0aWxzLmNoYW5nZWNhc2Uoc3RyLCBmdW5jdGlvbihjaCkge1xuICAgIHJldHVybiAnLycgKyBjaDtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJlcGxhY2Ugc3BhY2VzIGluIHRoZSBnaXZlbiBzdHJpbmcgd2l0aCBwbHVzZXMuXG4gKlxuICogYGBgaGFuZGxlYmFyc1xuICoge3twbHVzaWZ5IFwiZm9vIGJhciBiYXpcIn19XG4gKiAvLz0+ICdmb28rYmFyK2JheidcbiAqIGBgYFxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyYCBUaGUgaW5wdXQgc3RyaW5nXG4gKiBAcmV0dXJuIHtTdHJpbmd9IElucHV0IHN0cmluZyB3aXRoIHNwYWNlcyByZXBsYWNlZCBieSBwbHVzIHNpZ25zXG4gKiBAc291cmNlIFN0ZXBoZW4gV2F5IDxodHRwczovL2dpdGh1Yi5jb20vc3RlcGhlbndheT5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5wbHVzaWZ5ID0gZnVuY3Rpb24oc3RyKSB7XG4gIGlmIChzdHIgJiYgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyLnNwbGl0KCcgJykuam9pbignKycpO1xuICB9XG59O1xuXG4vKipcbiAqIFJldmVyc2UgYSBzdHJpbmcuXG4gKlxuICogYGBgaGFuZGxlYmFyc1xuICoge3tyZXZlcnNlIFwiYWJjZGVcIn19XG4gKiAvLz0+ICdlZGNiYSdcbiAqIGBgYFxuICogQG5hbWUgLnJldmVyc2VcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyYFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLnJldmVyc2UgPSBmdW5jdGlvbihzdHIpIHtcbiAgaWYgKHN0ciAmJiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHIuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiBgYWAgd2l0aCBgYmAuXG4gKlxuICogYGBgaGFuZGxlYmFyc1xuICoge3tyZXBsYWNlIFwiYSBiIGEgYiBhIGJcIiBcImFcIiBcInpcIn19XG4gKiAvLz0+ICd6IGIgeiBiIHogYidcbiAqIGBgYFxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyYFxuICogQHBhcmFtICB7U3RyaW5nfSBgYWBcbiAqIEBwYXJhbSAge1N0cmluZ30gYGJgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMucmVwbGFjZSA9IGZ1bmN0aW9uKHN0ciwgYSwgYikge1xuICBpZiAoc3RyICYmIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFhIHx8IHR5cGVvZiBhICE9PSAnc3RyaW5nJykgcmV0dXJuIHN0cjtcbiAgICBpZiAoIWIgfHwgdHlwZW9mIGIgIT09ICdzdHJpbmcnKSBiID0gJyc7XG4gICAgcmV0dXJuIHN0ci5zcGxpdChhKS5qb2luKGIpO1xuICB9XG59O1xuXG4vKipcbiAqIFNlbnRlbmNlIGNhc2UgdGhlIGdpdmVuIHN0cmluZ1xuICpcbiAqIGBgYGhhbmRsZWJhcnNcbiAqIHt7c2VudGVuY2UgXCJoZWxsbyB3b3JsZC4gZ29vZGJ5ZSB3b3JsZC5cIn19XG4gKiAvLz0+ICdIZWxsbyB3b3JsZC4gR29vZGJ5ZSB3b3JsZC4nXG4gKiBgYGBcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5zZW50ZW5jZSA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyICYmIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIHJlID0gLygoPzpcXFNbXlxcLlxcP1xcIV0qKVtcXC5cXD9cXCFdKikvZztcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UocmUsIGZ1bmN0aW9uKHR4dCkge1xuICAgICAgcmV0dXJuIHR4dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKVxuICAgICAgICArIHR4dC5zdWJzdHIoMSkudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBzbmFrZV9jYXNlIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBgc3RyaW5nYC5cbiAqXG4gKiBgYGBqc1xuICoge3tzbmFrZWNhc2UgXCJhLWItYyBkX2VcIn19XG4gKiAvLz0+ICdhX2JfY19kX2UnXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdHJpbmdgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuc25ha2VjYXNlID0gZnVuY3Rpb24oc3RyKSB7XG4gIHJldHVybiB1dGlscy5jaGFuZ2VjYXNlKHN0ciwgZnVuY3Rpb24oY2gpIHtcbiAgICByZXR1cm4gJ18nICsgY2g7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBTcGxpdCBgc3RyaW5nYCBieSB0aGUgZ2l2ZW4gYGNoYXJhY3RlcmAuXG4gKlxuICogYGBganNcbiAqIHt7c3BsaXQgXCJhLGIsY1wiIFwiLFwifX1cbiAqIC8vPT4gWydhJywgJ2InLCAnYyddXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdHJpbmdgIFRoZSBzdHJpbmcgdG8gc3BsaXQuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IGBjaGFyYWN0ZXJgIERlZmF1bHQgaXMgYCxgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMuc3BsaXQgPSBmdW5jdGlvbihzdHIsIGNoKSB7XG4gIGlmICghaGVscGVycy5pc1N0cmluZyhzdHIpKSByZXR1cm4gJyc7XG4gIGlmICh0eXBlb2YgY2ggIT09ICdzdHJpbmcnKSBjaCA9ICcsJztcbiAgcmV0dXJuIHN0ci5zcGxpdChjaCk7XG59O1xuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBzdHJpbmcgYmVnaW5zIHdpdGggdGhlIGdpdmVuIHByZWZpeC5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7eyNzdGFydHNXaXRoIFwiR29vZGJ5ZVwiIFwiSGVsbG8sIHdvcmxkIVwifX1cbiAqICAgV2hvb3BzXG4gKiB7e2Vsc2V9fVxuICogICBCcm8sIGRvIHlvdSBldmVuIGhlbGxvIHdvcmxkP1xuICoge3svc3RhcnRzV2l0aH19XG4gKiBgYGBcbiAqIEBwYXJhbSAge1N0cmluZ30gYHByZWZpeGBcbiAqIEBwYXJhbSAge1N0cmluZ30gYHRlc3RTdHJpbmdgXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBvcHRpb25zYFxuICogQGNvbnRyaWJ1dG9yIERhbiBGb3ggPGh0dHA6Ly9naXRodWIuY29tL2lhbWRhbmZveD5cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBibG9ja1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLnN0YXJ0c1dpdGggPSBmdW5jdGlvbihwcmVmaXgsIHN0ciwgb3B0aW9ucykge1xuICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgb3B0aW9ucyA9IGFyZ3MucG9wKCk7XG4gIGlmIChzdHIgJiYgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoc3RyLmluZGV4T2YocHJlZml4KSA9PT0gMCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pbnZlcnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbiAgfVxuICByZXR1cm4gJyc7XG59O1xuXG4vKipcbiAqIFRpdGxlIGNhc2UgdGhlIGdpdmVuIHN0cmluZy5cbiAqXG4gKiBgYGBoYW5kbGViYXJzXG4gKiB7e3RpdGxlaXplIFwidGhpcyBpcyB0aXRsZSBjYXNlXCJ9fVxuICogLy89PiAnVGhpcyBJcyBUaXRsZSBDYXNlJ1xuICogYGBgXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdHJgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMudGl0bGVpemUgPSBmdW5jdGlvbihzdHIpIHtcbiAgaWYgKHN0ciAmJiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJykge1xuICAgIHZhciB0aXRsZSA9IHN0ci5yZXBsYWNlKC9bIFxcLV9dKy9nLCAnICcpO1xuICAgIHZhciB3b3JkcyA9IHRpdGxlLm1hdGNoKC9cXHcrL2cpO1xuICAgIHZhciBsZW4gPSB3b3Jkcy5sZW5ndGg7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIHZhciB3b3JkID0gd29yZHNbaSsrXTtcbiAgICAgIHJlcy5wdXNoKGV4cG9ydHMuY2FwaXRhbGl6ZSh3b3JkKSk7XG4gICAgfVxuICAgIHJldHVybiByZXMuam9pbignICcpO1xuICB9XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgZXh0cmFuZW91cyB3aGl0ZXNwYWNlIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgZW5kXG4gKiBvZiBhIHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICoge3t0cmltIFwiIEFCQyBcIn19XG4gKiAvLz0+ICdBQkMnXG4gKiBgYGBcbiAqXG4gKiBAbmFtZSAudHJpbVxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyaW5nYCBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMudHJpbSA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoIWhlbHBlcnMuaXNTdHJpbmcoc3RyKSkgcmV0dXJuICcnO1xuICByZXR1cm4gc3RyLnRyaW0oKTtcbn07XG5cbi8qKlxuICogVXBwZXJjYXNlIGFsbCBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nLiBJZiB1c2VkIGFzIGFcbiAqIGJsb2NrIGhlbHBlciBpdCB3aWxsIHVwcGVyY2FzZSB0aGUgZW50aXJlIGJsb2NrLiBUaGlzIGhlbHBlclxuICogZG9lcyBub3Qgc3VwcG9ydCBpbnZlcnNlIGJsb2Nrcy5cbiAqXG4gKiBAbmFtZSAudXBwZXJjYXNlXG4gKiBAcmVsYXRlZCBjYXBpdGFsaXplIGNhcGl0YWxpemVBbGxcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyYCBUaGUgc3RyaW5nIHRvIHVwcGVyY2FzZVxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBIYW5kbGViYXJzIG9wdGlvbnMgb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYmxvY2tcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy51cHBlcmNhc2UgPSBmdW5jdGlvbihzdHIsIG9wdGlvbnMpIHtcbiAgaWYgKHN0ciAmJiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHIudG9VcHBlckNhc2UoKTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zID0gc3RyO1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5mbikge1xuICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpLnRvVXBwZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuICcnO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHVybCA9IHJlcXVpcmUoJ3VybCcpO1xuXG4vKipcbiAqIEV4cG9zZSBgaGVscGVyc2BcbiAqL1xuXG52YXIgaGVscGVycyA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIEVuY29kZXMgYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSkgY29tcG9uZW50XG4gKiBieSByZXBsYWNpbmcgZWFjaCBpbnN0YW5jZSBvZiBjZXJ0YWluIGNoYXJhY3RlcnMgYnlcbiAqIG9uZSwgdHdvLCB0aHJlZSwgb3IgZm91ciBlc2NhcGUgc2VxdWVuY2VzIHJlcHJlc2VudGluZ1xuICogdGhlIFVURi04IGVuY29kaW5nIG9mIHRoZSBjaGFyYWN0ZXIuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyYCBUaGUgdW4tZW5jb2RlZCBzdHJpbmdcbiAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGVuZGNvZGVkIHN0cmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmVuY29kZVVSSSA9IGZ1bmN0aW9uKHN0cikge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cik7XG59O1xuXG4vKipcbiAqIERlY29kZSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKSBjb21wb25lbnQuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyYFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5oZWxwZXJzLmRlY29kZVVSSSA9IGZ1bmN0aW9uKHN0cikge1xuICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cik7XG59O1xuXG4vKipcbiAqIFRha2UgYSBiYXNlIFVSTCwgYW5kIGEgaHJlZiBVUkwsIGFuZCByZXNvbHZlIHRoZW0gYXMgYVxuICogYnJvd3NlciB3b3VsZCBmb3IgYW4gYW5jaG9yIHRhZy5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBiYXNlYFxuICogQHBhcmFtICB7U3RyaW5nfSBgaHJlZmBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy51cmxSZXNvbHZlID0gZnVuY3Rpb24oYmFzZSwgaHJlZikge1xuICByZXR1cm4gdXJsLnJlc29sdmUoYmFzZSwgaHJlZik7XG59O1xuXG4vKipcbiAqIFBhcnNlcyBhIGB1cmxgIHN0cmluZyBpbnRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdHJgIFVSTCBzdHJpbmdcbiAqIEByZXR1cm4ge1N0cmluZ30gUmV0dXJucyBzdHJpbmdpZmllZCBKU09OXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmhlbHBlcnMudXJsUGFyc2UgPSBmdW5jdGlvbihzdHIpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHVybC5wYXJzZShzdHIpKTtcbn07XG5cbi8qKlxuICogU3RyaXAgdGhlIHF1ZXJ5IHN0cmluZyBmcm9tIHRoZSBnaXZlIGB1cmxgLlxuICpcbiAqIEBuYW1lIC5zdHJpcFF1ZXJ5c3RyaW5nXG4gKiBAcGFyYW0ge1N0cmluZ30gYHVybGBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaGVscGVycy5zdHJpcFF1ZXJ5c3RyaW5nID0gZnVuY3Rpb24odXJsKSB7XG4gIHJldHVybiB1cmwuc3BsaXQoJz8nKVswXTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpcHRhZ3MgPSByZXF1aXJlKCdzdHJpcHRhZ3MnKTtcbnZhciB0eXBlT2YgPSByZXF1aXJlKCdraW5kLW9mJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLycpO1xuXG4vKipcbiAqIEV4cG9zZSBgdXRpbHNgXG4gKi9cblxudmFyIGh0bWwgPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBSZW1vdmUgZXh0cmEgbmV3bGluZXMgZnJvbSBIVE1MLCByZXNwZWN0IGluZGVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gaHRtbFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5odG1sLmNvbmRlbnNlID0gZnVuY3Rpb24oc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvKFxcclxcbnxcXHJ8XFxufFxcdTIwMjh8XFx1MjAyOSkgezIsfS9nLCAnXFxuJyk7XG59O1xuXG4vKipcbiAqIEFkZCBhIHNpbmdsZSBuZXdsaW5lIGFib3ZlIGNvZGUgY29tbWVudHMgaW4gSFRNTFxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYGh0bWxgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmh0bWwucGFkY29tbWVudHMgPSBmdW5jdGlvbihzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oXFxzKjwhLS0pL2csICdcXG4kMScpO1xufTtcblxuLyoqXG4gKiBQYXJzZSBIVE1MIHRhZyBhdHRyaWJ1dGVzIGZyb20gdGhlIGBvcHRpb25zLmhhc2hgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBgaGFzaGAgSGVscGVyIG9wdGlvbnMgaGFzaCwgZS5nLiBge2ZvbzogJ2Jhcid9YFxuICogQHJldHVybiB7U3RyaW5nfSBTdHJpbmdpZmllZCBhdHRyaWJ1dGVzLCBlLmcuIGBmb289XCJiYXJcImBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaHRtbC5wYXJzZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiBwYXJzZUF0dHJpYnV0ZXMoaGFzaCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoaGFzaCkubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBrZXkgKyAnPVwiJyArIGhhc2hba2V5XSArICdcIic7XG4gIH0pLmpvaW4oJyAnKTtcbn07XG5cbi8qKlxuICogU3RyaXAgSFRNTCB0YWdzIGZyb20gYSBzdHJpbmcsIHNvIHRoYXQgb25seSB0aGUgdGV4dCBub2Rlc1xuICogYXJlIHByZXNlcnZlZC5cbiAqXG4gKiBgYGBqc1xuICoge3tzYW5pdGl6ZSBcIjxzcGFuPmZvbzwvc3Bhbj5cIn19XG4gKiAvLz0+ICdmb28nXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdHJgIFRoZSBzdHJpbmcgb2YgSFRNTCB0byBzYW5pdGl6ZS5cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuaHRtbC5zYW5pdGl6ZSA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoIXV0aWxzLmlzU3RyaW5nKHN0cikpIHJldHVybiAnJztcbiAgcmV0dXJuIHN0cmlwdGFncyhzdHIpLnRyaW0oKTtcbn07XG5cbmh0bWwudG9BdHRyaWJ1dGVzID0gZnVuY3Rpb24gdG9BdHRyaWJ1dGVzKGhhc2gpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBrZXkgaW4gaGFzaCkge1xuICAgIGlmIChoYXNoLmhhc093blByb3BlcnR5KGtleSkgJiYgdHlwZU9mKGhhc2hba2V5XSA9PT0gJ3N0cmluZycpKSB7XG4gICAgICByZXMgKz0gJyAnICsga2V5ICsgJz1cIicgKyBoYXNoW2tleV0gKyAnXCInO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgY29udGFpbnMgdGhlIGdpdmVuXG4gKiBgb2JqZWN0YCwgb3B0aW9uYWxseSBwYXNzaW5nIGEgc3RhcnRpbmcgaW5kZXguXG4gKlxuICogQHBhcmFtIHtBcnJheX0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0ge051bWJlcn0gc3RhcnRcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cblxudXRpbHMuY29udGFpbnMgPSBmdW5jdGlvbih2YWwsIG9iaiwgc3RhcnQpIHtcbiAgdmFyIGxlbiA9IHZhbCA/IHZhbC5sZW5ndGggOiAwO1xuICB2YXIgaWR4ID0gc3RhcnQgPCAwXG4gICAgPyBNYXRoLm1heCgwLCBsZW4gKyBzdGFydClcbiAgICA6IHN0YXJ0O1xuXG4gIHZhciByZXMgPSBmYWxzZTtcbiAgdmFyIGkgPSAwO1xuXG4gIHN0YXJ0ID0gaWR4IHx8IDA7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIHJlcyA9IHV0aWxzLmluZGV4T2YodmFsLCBvYmosIHN0YXJ0KSA+IC0xO1xuXG4gIH0gZWxzZSBpZiAodXRpbHMuaXNOdW1iZXIobGVuKSkge1xuICAgIHJlcyA9ICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJ1xuICAgICAgPyB2YWwuaW5kZXhPZihvYmosIHN0YXJ0KVxuICAgICAgOiB1dGlscy5pbmRleE9mKHZhbCwgb2JqLCBzdGFydCkpID4gLTE7XG5cbiAgfSBlbHNlIHtcbiAgICB1dGlscy5pdGVyYXRvcih2YWwsIGZ1bmN0aW9uKGVsZSkge1xuICAgICAgaWYgKHN0YXJ0IDwgaSsrKSB7XG4gICAgICAgIHJldHVybiAhKHJlcyA9IChlbGUgPT09IG9iaikpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgXCJyZWdleC1zdHJpbmdcIiB0byBhbiBhY3R1YWwgcmVndWxhciBleHByZXNzaW9uLlxuICpcbiAqIGBgYGpzXG4gKiB1dGlscy50b1JlZ2V4KCdcIi9mb28vXCInKTtcbiAqIC8vPT4gL2Zvby9cbiAqIGBgYFxuICogQHBhcmFtIHtPYmplY3R9IGB2YWx1ZWBcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnV0aWxzLnRvUmVnZXggPSBmdW5jdGlvbih2YWwpIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAodmFsLnJlcGxhY2UoL15cXC98XFwvJC9nLCAnJykpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGFwcGVhcnMgdG8gYmUgYVxuICogcmVndWxhciBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBgdmFsdWVgXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG51dGlscy5pc1JlZ2V4ID0gZnVuY3Rpb24odmFsKSB7XG4gIGlmICh1dGlscy50eXBlT2YodmFsKSA9PT0gJ3JlZ2V4cCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbC5jaGFyQXQoMCkgPT09ICcvJ1xuICAgICYmIHZhbC5zbGljZSgtMSkgPT09ICdcXC8nO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgbm9uLXdvcmRcbiAqIGNoYXJhY3RlcnMgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyYFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5cbnV0aWxzLmNob3AgPSBmdW5jdGlvbihzdHIpIHtcbiAgaWYgKCF1dGlscy5pc1N0cmluZyhzdHIpKSByZXR1cm4gJyc7XG4gIHZhciByZSA9IC9eWy1fLlxcV1xcc10rfFstXy5cXFdcXHNdKyQvZztcbiAgcmV0dXJuIHN0ci50cmltKCkucmVwbGFjZShyZSwgJycpO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgY2FzaW5nIG9uIHRoZSBnaXZlbiBgc3RyaW5nYCwgb3B0aW9uYWxseVxuICogcGFzc2luZyBhIGRlbGltaXRlciB0byB1c2UgYmV0d2VlbiB3b3JkcyBpbiB0aGVcbiAqIHJldHVybmVkIHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICogdXRpbHMuY2hhbmdlY2FzZSgnZm9vQmFyQmF6Jyk7XG4gKiAvLz0+ICdmb28gYmFyIGJheidcbiAqXG4gKiB1dGlscy5jaGFuZ2VjYXNlKCdmb29CYXJCYXonICctJyk7XG4gKiAvLz0+ICdmb28tYmFyLWJheidcbiAqIGBgYFxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyaW5nYCBUaGUgc3RyaW5nIHRvIGNoYW5nZS5cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxudXRpbHMuY2hhbmdlY2FzZSA9IGZ1bmN0aW9uKHN0ciwgZm4pIHtcbiAgaWYgKCF1dGlscy5pc1N0cmluZyhzdHIpKSByZXR1cm4gJyc7XG4gIGlmIChzdHIubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgc3RyID0gdXRpbHMuY2hvcChzdHIpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICBmbiA9IHV0aWxzLmlkZW50aXR5O1xuICB9XG5cbiAgdmFyIHJlID0gL1stXy5cXFdcXHNdKyhcXHd8JCkvZztcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKHJlLCBmdW5jdGlvbihfLCBjaCkge1xuICAgIHJldHVybiBmbihjaCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHJhbmRvbSBudW1iZXJcbiAqXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGBtaW5gXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGBtYXhgXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnV0aWxzLnJhbmRvbSA9IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG4gIHJldHVybiBtaW4gKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGB1bmRlZmluZWRgIG9yXG4gKiBpcyBhIGhhbmRsZWJhcnMgb3B0aW9ucyBoYXNoLlxuICpcbiAqIEBwYXJhbSB7YW55fSBgdmFsdWVgXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG51dGlscy5pc1VuZGVmaW5lZCA9IGZ1bmN0aW9uKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCdcbiAgICB8fCAodmFsLmhhc2ggIT0gbnVsbCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgYXBwZWFycyB0byBiZSBhbiAqKm9wdGlvbnMqKiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGB2YWx1ZWBcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnV0aWxzLmlzT3B0aW9ucyA9IGZ1bmN0aW9uKHZhbCkge1xuICByZXR1cm4gdXRpbHMuaXNPYmplY3QodmFsKSAmJiB2YWwuaGFzT3duUHJvcGVydHkoJ2hhc2gnKTtcbn07XG5cbi8qKlxuICogR2V0IG9wdGlvbnMgZnJvbSB0aGUgb3B0aW9ucyBoYXNoIGFuZCBgdGhpc2AuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGBhcHBgIFRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG51dGlscy5nZXRBcmdzID0gZnVuY3Rpb24oYXBwLCBhcmdzKSB7XG4gIHZhciBvcHRzID0gKGFwcCAmJiBhcHAub3B0aW9ucykgfHwge307XG4gIGlmICghQXJyYXkuaXNBcnJheShhcmdzKSkge1xuICAgIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3MpO1xuICB9XG5cbiAgdmFyIGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gIC8vIG1lcmdlIGBvcHRpb25zLmhhc2hgIGludG8gdGhlIG9wdGlvbnNcbiAgaWYgKHV0aWxzLmlzT3B0aW9ucyhsYXN0KSkge1xuICAgIHZhciBob3B0ID0gYXJncy5wb3AoKTtcbiAgICBvcHRzID0gdXRpbHMuZ2V0KG9wdHMsIGhvcHQubmFtZSkgfHwgb3B0cztcbiAgICB1dGlscy5tZXJnZShvcHRzLCBob3B0Lmhhc2gpO1xuXG4gIC8vIGlmIHRoZSBsYXN0IGFyZyBpcyBhbiBvYmplY3QsIG1lcmdlIGl0XG4gIC8vIGludG8gdGhlIG9wdGlvbnNcbiAgfSBlbHNlIGlmICh1dGlscy5pc09iamVjdChsYXN0KSkge1xuICAgIHV0aWxzLm1lcmdlKG9wdHMsIGFyZ3MucG9wKCkpO1xuICB9XG4gIGFyZ3MucHVzaChvcHRzKTtcbiAgcmV0dXJuIGFyZ3M7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gb2JqZWN0XG4gKiBhbmQgbm90IGFuIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7YW55fSBgdmFsdWVgXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG51dGlscy5pc09iamVjdCA9IGZ1bmN0aW9uKHZhbCkge1xuICByZXR1cm4gdmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnXG4gICAgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gYHZhbHVlYFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxudXRpbHMuaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbCkge1xuICBpZiAodmFsID09PSAwIHx8IHZhbCA9PT0gJzAnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghdmFsIHx8IChBcnJheS5pc0FycmF5KHZhbCkgJiYgdmFsLmxlbmd0aCA9PT0gMCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIU9iamVjdC5rZXlzKHZhbCkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBUcnkgdG8gcGFyc2UgdGhlIGdpdmVuIGBzdHJpbmdgIGFzIEpTT04uIEZhaWxzXG4gKiBncmFjZWZ1bGx5IGlmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgcGFyc2VkLlxuICpcbiAqIEBuYW1lICAudHJ5UGFyc2VcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyaW5nYFxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG51dGlscy50cnlQYXJzZSA9IGZ1bmN0aW9uKHN0cikge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHN0cik7XG4gIH0gY2F0Y2ggKGVycikge31cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgZ2l2ZW4gdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gKiBpdCB3aWxsIGJlIGNhbGxlZCwgYW5kIHRoZSByZXN1bHQgaXMgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtICB7YW55fSBgdmFsYFxuICogQHJldHVybiB7YW55fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG51dGlscy5yZXN1bHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHZhbHVlKCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGdpdmVuIHZhbHVlLCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtICB7YW55fSBgdmFsYFxuICogQHJldHVybiB7YW55fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG51dGlscy5pZGVudGl0eSA9IGZ1bmN0aW9uKHZhbCkge1xuICByZXR1cm4gdmFsO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiBgdmFsYCBpcyBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gIHthbnl9IGB2YWxgIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxudXRpbHMuaXNTdHJpbmcgPSBmdW5jdGlvbih2YWwpIHtcbiAgcmV0dXJuIHZhbCAmJiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJztcbn07XG5cbi8qKlxuICogQ2FzdCBgdmFsYCB0byBhbiBhcnJheS5cbiAqXG4gKiBAcGFyYW0gIHthbnl9IGB2YWxgIFRoZSB2YWx1ZSB0byBhcnJheWlmeS5cbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG51dGlscy5hcnJheWlmeSA9IGZ1bmN0aW9uKHZhbCkge1xuICByZXR1cm4gdmFsID8gKEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWxdKSA6IFtdO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgYHV0aWxzYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdXRpbHM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJ2xhenktY2FjaGUnKShyZXF1aXJlKTtcbnZhciBmbiA9IHJlcXVpcmU7XG5yZXF1aXJlID0gdXRpbHM7XG5cbi8vIEFycmF5IHV0aWxzXG5yZXF1aXJlKCdhcnJheS1zb3J0JywgJ3NvcnRCeScpO1xucmVxdWlyZSgnYXJyLWZpbHRlcicsICdmaWx0ZXInKTtcbnJlcXVpcmUoJ2Fyci1mbGF0dGVuJywgJ2ZsYXR0ZW4nKTtcbnJlcXVpcmUoJ2luZGV4LW9mJyk7XG5cbi8vIENvbGxlY3Rpb24gdXRpbHNcbnJlcXVpcmUoJ21ha2UtaXRlcmF0b3InLCAnaXRlcmF0b3InKTtcblxuLy8gSHRtbCB1dGlsc1xucmVxdWlyZSgndG8tZ2ZtLWNvZGUtYmxvY2snLCAnYmxvY2snKTtcbnJlcXVpcmUoJ2h0bWwtdGFnJywgJ3RhZycpO1xuXG4vLyBKYXZhU2NyaXB0IGxhbmd1YWdlIHV0aWxzXG5yZXF1aXJlKCdraW5kLW9mJywgJ3R5cGVPZicpO1xuXG4vLyBtYXRjaGluZyB1dGlsc1xucmVxdWlyZSgnaXMtZ2xvYicpO1xucmVxdWlyZSgnbWljcm9tYXRjaCcsICdtbScpO1xuXG4vLyBOdW1iZXIgdXRpbHNcbnJlcXVpcmUoJ2lzLWV2ZW4nKTtcbnJlcXVpcmUoJ2lzLW51bWJlcicpO1xucmVxdWlyZSgnaXMtb2RkJyk7XG5cbi8vIE9iamVjdCB1dGlsc1xucmVxdWlyZSgnY3JlYXRlLWZyYW1lJyk7XG5yZXF1aXJlKCdnZXQtb2JqZWN0Jyk7XG5yZXF1aXJlKCdnZXQtdmFsdWUnLCAnZ2V0Jyk7XG5yZXF1aXJlKCdmb3Itb3duJyk7XG5yZXF1aXJlKCdtaXhpbi1kZWVwJywgJ21lcmdlJyk7XG5cbi8vIFBhdGggdXRpbHNcbnJlcXVpcmUoJ25vcm1hbGl6ZS1wYXRoJywgJ25vcm1hbGl6ZScpO1xucmVxdWlyZSgncmVsYXRpdmUnKTtcbnJlcXVpcmUgPSBmbjtcblxuLyoqXG4gKiBFeHBvc2UgYHV0aWxzYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdXRpbHM7XG4iLCJ2YXIgaXNCdWZmZXIgPSByZXF1aXJlKCdpcy1idWZmZXInKTtcbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogR2V0IHRoZSBuYXRpdmUgYHR5cGVvZmAgYSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gIHsqfSBgdmFsYFxuICogQHJldHVybiB7Kn0gTmF0aXZlIGphdmFzY3JpcHQgdHlwZVxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ga2luZE9mKHZhbCkge1xuICAvLyBwcmltaXRpdmllc1xuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gIH1cbiAgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnbnVsbCc7XG4gIH1cbiAgaWYgKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09IGZhbHNlIHx8IHZhbCBpbnN0YW5jZW9mIEJvb2xlYW4pIHtcbiAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyB8fCB2YWwgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICByZXR1cm4gJ3N0cmluZyc7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInIHx8IHZhbCBpbnN0YW5jZW9mIE51bWJlcikge1xuICAgIHJldHVybiAnbnVtYmVyJztcbiAgfVxuXG4gIC8vIGZ1bmN0aW9uc1xuICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJyB8fCB2YWwgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgIHJldHVybiAnZnVuY3Rpb24nO1xuICB9XG5cbiAgLy8gYXJyYXlcbiAgaWYgKHR5cGVvZiBBcnJheS5pc0FycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICByZXR1cm4gJ2FycmF5JztcbiAgfVxuXG4gIC8vIGNoZWNrIGZvciBpbnN0YW5jZXMgb2YgUmVnRXhwIGFuZCBEYXRlIGJlZm9yZSBjYWxsaW5nIGB0b1N0cmluZ2BcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiAncmVnZXhwJztcbiAgfVxuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiAnZGF0ZSc7XG4gIH1cblxuICAvLyBvdGhlciBvYmplY3RzXG4gIHZhciB0eXBlID0gdG9TdHJpbmcuY2FsbCh2YWwpO1xuXG4gIGlmICh0eXBlID09PSAnW29iamVjdCBSZWdFeHBdJykge1xuICAgIHJldHVybiAncmVnZXhwJztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgRGF0ZV0nKSB7XG4gICAgcmV0dXJuICdkYXRlJztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXScpIHtcbiAgICByZXR1cm4gJ2FyZ3VtZW50cyc7XG4gIH1cblxuICAvLyBidWZmZXJcbiAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIGlzQnVmZmVyKHZhbCkpIHtcbiAgICByZXR1cm4gJ2J1ZmZlcic7XG4gIH1cblxuICAvLyBlczY6IE1hcCwgV2Vha01hcCwgU2V0LCBXZWFrU2V0XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBTZXRdJykge1xuICAgIHJldHVybiAnc2V0JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgV2Vha1NldF0nKSB7XG4gICAgcmV0dXJuICd3ZWFrc2V0JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgTWFwXScpIHtcbiAgICByZXR1cm4gJ21hcCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFdlYWtNYXBdJykge1xuICAgIHJldHVybiAnd2Vha21hcCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7XG4gICAgcmV0dXJuICdzeW1ib2wnO1xuICB9XG5cbiAgLy8gdHlwZWQgYXJyYXlzXG4gIGlmICh0eXBlID09PSAnW29iamVjdCBJbnQ4QXJyYXldJykge1xuICAgIHJldHVybiAnaW50OGFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgVWludDhBcnJheV0nKSB7XG4gICAgcmV0dXJuICd1aW50OGFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJykge1xuICAgIHJldHVybiAndWludDhjbGFtcGVkYXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBJbnQxNkFycmF5XScpIHtcbiAgICByZXR1cm4gJ2ludDE2YXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBVaW50MTZBcnJheV0nKSB7XG4gICAgcmV0dXJuICd1aW50MTZhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEludDMyQXJyYXldJykge1xuICAgIHJldHVybiAnaW50MzJhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFVpbnQzMkFycmF5XScpIHtcbiAgICByZXR1cm4gJ3VpbnQzMmFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScpIHtcbiAgICByZXR1cm4gJ2Zsb2F0MzJhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nKSB7XG4gICAgcmV0dXJuICdmbG9hdDY0YXJyYXknO1xuICB9XG5cbiAgLy8gbXVzdCBiZSBhIHBsYWluIG9iamVjdFxuICByZXR1cm4gJ29iamVjdCc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc2V0ID0gcmVxdWlyZSgnc2V0LWdldHRlcicpO1xuXG4vKipcbiAqIENhY2hlIHJlc3VsdHMgb2YgdGhlIGZpcnN0IGZ1bmN0aW9uIGNhbGwgdG8gZW5zdXJlIG9ubHkgY2FsbGluZyBvbmNlLlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgdXRpbHMgPSByZXF1aXJlKCdsYXp5LWNhY2hlJykocmVxdWlyZSk7XG4gKiAvLyBjYWNoZSB0aGUgY2FsbCB0byBgcmVxdWlyZSgnYW5zaS15ZWxsb3cnKWBcbiAqIHV0aWxzKCdhbnNpLXllbGxvdycsICd5ZWxsb3cnKTtcbiAqIC8vIHVzZSBgYW5zaS15ZWxsb3dgXG4gKiBjb25zb2xlLmxvZyh1dGlscy55ZWxsb3coJ3RoaXMgaXMgeWVsbG93JykpO1xuICogYGBgXG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IGBmbmAgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2UuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gRnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHRvIGdldCB0aGUgY2FjaGVkIGZ1bmN0aW9uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGxhenlDYWNoZShyZXF1aXJlRm4pIHtcbiAgdmFyIGNhY2hlID0ge307XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHByb3h5KG5hbWUsIGFsaWFzKSB7XG4gICAgdmFyIGtleSA9IGFsaWFzO1xuXG4gICAgLy8gY2FtZWwtY2FzZSB0aGUgbW9kdWxlIGBuYW1lYCBpZiBgYWxpYXNgIGlzIG5vdCBkZWZpbmVkXG4gICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICBrZXkgPSBjYW1lbGNhc2UobmFtZSk7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGEgZ2V0dGVyIHRvIGxhemlseSBpbnZva2UgdGhlIG1vZHVsZSB0aGUgZmlyc3QgdGltZSBpdCdzIGNhbGxlZFxuICAgIGZ1bmN0aW9uIGdldHRlcigpIHtcbiAgICAgIHJldHVybiBjYWNoZVtrZXldIHx8IChjYWNoZVtrZXldID0gcmVxdWlyZUZuKG5hbWUpKTtcbiAgICB9XG5cbiAgICAvLyB0cmlwIHRoZSBnZXR0ZXIgaWYgYHByb2Nlc3MuZW52LlVOTEFaWWAgaXMgZGVmaW5lZFxuICAgIGlmICh1bmxhenkocHJvY2Vzcy5lbnYpKSB7XG4gICAgICBnZXR0ZXIoKTtcbiAgICB9XG5cbiAgICBzZXQocHJveHksIGtleSwgZ2V0dGVyKTtcbiAgICByZXR1cm4gZ2V0dGVyO1xuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIGBwcm9jZXNzLmVudi5MQVpZYCBpcyB0cnVlLCBvciB0cmF2aXMgaXMgcnVubmluZy5cbiAqL1xuXG5mdW5jdGlvbiB1bmxhenkoZW52KSB7XG4gIHJldHVybiBlbnYuVU5MQVpZID09PSAndHJ1ZScgfHwgZW52LlVOTEFaWSA9PT0gdHJ1ZSB8fCBlbnYuVFJBVklTO1xufVxuXG4vKipcbiAqIENhbWVsY2FzZSB0aGUgdGhlIGdpdmVuIG1vZHVsZSBgbmFtZWAuXG4gKi9cblxuZnVuY3Rpb24gY2FtZWxjYXNlKHN0cikge1xuICBpZiAoc3RyLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKTtcbiAgfVxuICBzdHIgPSBzdHIucmVwbGFjZSgvXltcXFdfXSt8W1xcV19dKyQvZywgJycpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvW1xcV19dKyhcXHd8JCkvZywgZnVuY3Rpb24oXywgY2gpIHtcbiAgICByZXR1cm4gY2gudG9VcHBlckNhc2UoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRXhwb3NlIGBsYXp5Q2FjaGVgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBsYXp5Q2FjaGU7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYW5zaVJlZ2V4ID0gcmVxdWlyZSgnYW5zaS1yZWdleCcpO1xudmFyIHJlID0gbmV3IFJlZ0V4cChhbnNpUmVnZXgoKS5zb3VyY2UpOyAvLyByZW1vdmUgdGhlIGBnYCBmbGFnXG5tb2R1bGUuZXhwb3J0cyA9IHJlLnRlc3QuYmluZChyZSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2VzXG4gKi9cblxudmFyIHR5cGVPZiA9IHJlcXVpcmUoJ2tpbmQtb2YnKTtcbnZhciBkYXRlID0gcmVxdWlyZSgnZGF0ZS5qcycpO1xudmFyIG1vbWVudCA9IHJlcXVpcmUoJ21vbWVudCcpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoJ2V4dGVuZC1zaGFsbG93Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbW9tZW50SGVscGVyKHN0ciwgcGF0dGVybiwgb3B0aW9ucykge1xuICAvLyBpZiBubyBhcmdzIGFyZSBwYXNzZWQsIHJldHVybiBhIGZvcm1hdHRlZCBkYXRlXG4gIGlmIChzdHIgPT0gbnVsbCAmJiBwYXR0ZXJuID09IG51bGwpIHtcbiAgICBtb21lbnQubG9jYWxlKCdlbicpO1xuICAgIHJldHVybiBtb21lbnQoKS5mb3JtYXQoJ01NTU0gREQsIFlZWVknKTtcbiAgfVxuXG4gIHZhciBvcHRzID0ge2xhbmc6ICdlbicsIGRhdGU6IG5ldyBEYXRlKCl9O1xuICBvcHRzID0gZXh0ZW5kKHt9LCBvcHRzLCBzdHIsIHBhdHRlcm4sIG9wdGlvbnMpO1xuICBvcHRzID0gZXh0ZW5kKHt9LCBvcHRzLCBvcHRzLmhhc2gpO1xuXG4gIC8vIHNldCB0aGUgbGFuZ3VhZ2UgdG8gdXNlXG4gIG1vbWVudC5sb2NhbGUob3B0cy5sYW5nKTtcblxuICBpZiAob3B0cy5kYXRlanMgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG1vbWVudChuZXcgRGF0ZShzdHIpKS5mb3JtYXQocGF0dGVybik7XG4gIH1cbiAgLy8gaWYgYm90aCBhcmdzIGFyZSBzdHJpbmdzLCB0aGlzIGNvdWxkIGFwcGx5IHRvIGVpdGhlciBsaWIuXG4gIC8vIHNvIGluc3RlYWQgb2YgZG9pbmcgbWFnaWMgd2UnbGwganVzdCBhc2sgdGhlIHVzZXIgdG8gdGVsbFxuICAvLyB1cyBpZiB0aGUgYXJncyBzaG91bGQgYmUgcGFzc2VkIHRvIGRhdGUuanMgb3IgbW9tZW50LlxuICBpZiAodHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG1vbWVudChkYXRlKHN0cikpLmZvcm1hdChwYXR0ZXJuKTtcbiAgfVxuXG4gIC8vIElmIGhhbmRsZWJhcnMsIGV4cG9zZSBtb21lbnQgbWV0aG9kcyBhcyBoYXNoIHByb3BlcnRpZXNcbiAgaWYgKG9wdHMuaGFzaCkge1xuICAgIGlmIChvcHRzLmNvbnRleHQpIHtcbiAgICAgIGV4dGVuZChvcHRzLmhhc2gsIG9wdHMuY29udGV4dCk7XG4gICAgfVxuXG4gICAgdmFyIHJlcyA9IG1vbWVudChzdHIpO1xuICAgIGZvciAodmFyIGtleSBpbiBvcHRzLmhhc2gpIHtcbiAgICAgIGlmIChyZXNba2V5XSkge1xuICAgICAgICByZXR1cm4gcmVzW2tleV0ob3B0cy5oYXNoW2tleV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ21vbWVudC5qcyBkb2VzIG5vdCBzdXBwb3J0IFwiJyArIGtleSArICdcIicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlT2Yoc3RyKSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbW9tZW50KHN0cikuZm9ybWF0KHBhdHRlcm4pO1xuICB9XG5cbiAgLy8gaWYgb25seSBhIHN0cmluZyBpcyBwYXNzZWQsIGFzc3VtZSBpdCdzIGEgZGF0ZSBwYXR0ZXJuICgnWVlZWScpXG4gIGlmICh0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyAmJiAhcGF0dGVybikge1xuICAgIHJldHVybiBtb21lbnQoKS5mb3JtYXQoc3RyKTtcbiAgfVxuXG4gIHJldHVybiBtb21lbnQoc3RyKS5mb3JtYXQocGF0dGVybik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdHlwZU9mID0gcmVxdWlyZSgna2luZC1vZicpO1xuXG4vKipcbiAqIEV4cG9zZSBgZXh0ZW5kYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZXh0ZW5kO1xuXG4vKipcbiAqIEV4dGVuZCBgb2Agd2l0aCBwcm9wZXJ0aWVzIG9mIG90aGVyIGBvYmplY3RzYC5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBvYCBUaGUgdGFyZ2V0IG9iamVjdC4gUGFzcyBhbiBlbXB0eSBvYmplY3QgdG8gc2hhbGxvdyBjbG9uZS5cbiAqIEBwYXJhbSAge09iamVjdH0gYG9iamVjdHNgXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gZXh0ZW5kKG8pIHtcbiAgaWYgKHR5cGVPZihvKSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIHt9OyB9XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGggLSAxO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgb2JqID0gYXJnc1tpICsgMV07XG5cbiAgICBpZiAodHlwZU9mKG9iaikgPT09ICdvYmplY3QnICYmIHR5cGVPZihvYmopICE9PSAncmVnZXhwJykge1xuICAgICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBvW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbztcbn07XG4iLCJ2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIEdldCB0aGUgbmF0aXZlIGB0eXBlb2ZgIGEgdmFsdWUuXG4gKlxuICogQHBhcmFtICB7Kn0gYHZhbGBcbiAqIEByZXR1cm4geyp9IE5hdGl2ZSBqYXZhc2NyaXB0IHR5cGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcbiAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICB9XG4gIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG4gIGlmICh2YWwgPT09IHRydWUgfHwgdmFsID09PSBmYWxzZSB8fCB2YWwgaW5zdGFuY2VvZiBCb29sZWFuKSB7XG4gICAgcmV0dXJuICdib29sZWFuJztcbiAgfVxuICBpZiAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbDtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgcmV0dXJuICdhcnJheSc7XG4gIH1cblxuICB2YXIgdHlwZSA9IHRvU3RyaW5nLmNhbGwodmFsKTtcblxuICBpZiAodmFsIGluc3RhbmNlb2YgUmVnRXhwIHx8IHR5cGUgPT09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7XG4gICAgcmV0dXJuICdyZWdleHAnO1xuICB9XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlIHx8IHR5cGUgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIHJldHVybiAnZGF0ZSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScpIHtcbiAgICByZXR1cm4gJ2Z1bmN0aW9uJztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXScpIHtcbiAgICByZXR1cm4gJ2FyZ3VtZW50cyc7XG4gIH1cbiAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgcmV0dXJuICdidWZmZXInO1xuICB9XG4gIHJldHVybiB0eXBlLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpO1xufTtcbiIsInZhciBpc0J1ZmZlciA9IHJlcXVpcmUoJ2lzLWJ1ZmZlcicpO1xudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBHZXQgdGhlIG5hdGl2ZSBgdHlwZW9mYCBhIHZhbHVlLlxuICpcbiAqIEBwYXJhbSAgeyp9IGB2YWxgXG4gKiBAcmV0dXJuIHsqfSBOYXRpdmUgamF2YXNjcmlwdCB0eXBlXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIC8vIHByaW1pdGl2aWVzXG4gIGlmICh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgfVxuICBpZiAodmFsID09PSBudWxsKSB7XG4gICAgcmV0dXJuICdudWxsJztcbiAgfVxuICBpZiAodmFsID09PSB0cnVlIHx8IHZhbCA9PT0gZmFsc2UgfHwgdmFsIGluc3RhbmNlb2YgQm9vbGVhbikge1xuICAgIHJldHVybiAnYm9vbGVhbic7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnIHx8IHZhbCBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgIHJldHVybiAnc3RyaW5nJztcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicgfHwgdmFsIGluc3RhbmNlb2YgTnVtYmVyKSB7XG4gICAgcmV0dXJuICdudW1iZXInO1xuICB9XG5cbiAgLy8gZnVuY3Rpb25zXG4gIGlmICh0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nIHx8IHZhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuICdmdW5jdGlvbic7XG4gIH1cblxuICAvLyBhcnJheVxuICBpZiAodHlwZW9mIEFycmF5LmlzQXJyYXkgIT09ICd1bmRlZmluZWQnICYmIEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIHJldHVybiAnYXJyYXknO1xuICB9XG5cbiAgLy8gY2hlY2sgZm9yIGluc3RhbmNlcyBvZiBSZWdFeHAgYW5kIERhdGUgYmVmb3JlIGNhbGxpbmcgYHRvU3RyaW5nYFxuICBpZiAodmFsIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuICdyZWdleHAnO1xuICB9XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuICdkYXRlJztcbiAgfVxuXG4gIC8vIG90aGVyIG9iamVjdHNcbiAgdmFyIHR5cGUgPSB0b1N0cmluZy5jYWxsKHZhbCk7XG5cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7XG4gICAgcmV0dXJuICdyZWdleHAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICByZXR1cm4gJ2RhdGUnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBBcmd1bWVudHNdJykge1xuICAgIHJldHVybiAnYXJndW1lbnRzJztcbiAgfVxuXG4gIC8vIGJ1ZmZlclxuICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNCdWZmZXIodmFsKSkge1xuICAgIHJldHVybiAnYnVmZmVyJztcbiAgfVxuXG4gIC8vIGVzNjogTWFwLCBXZWFrTWFwLCBTZXQsIFdlYWtTZXRcbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFNldF0nKSB7XG4gICAgcmV0dXJuICdzZXQnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBXZWFrU2V0XScpIHtcbiAgICByZXR1cm4gJ3dlYWtzZXQnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBNYXBdJykge1xuICAgIHJldHVybiAnbWFwJztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgV2Vha01hcF0nKSB7XG4gICAgcmV0dXJuICd3ZWFrbWFwJztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgU3ltYm9sXScpIHtcbiAgICByZXR1cm4gJ3N5bWJvbCc7XG4gIH1cblxuICAvLyBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0XG4gIHJldHVybiAnb2JqZWN0Jztcbn07XG4iLCIvKiFcbiAqIGhlbHBlci1tYXJrZG93biA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaGVscGVyLW1hcmtkb3duPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBKb24gU2NobGlua2VydCwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnaXNvYmplY3QnKTtcbnZhciBSZW1hcmthYmxlID0gcmVxdWlyZSgncmVtYXJrYWJsZScpO1xudmFyIG1lcmdlID0gcmVxdWlyZSgnbWl4aW4tZGVlcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1hcmtkb3duKGNvbmZpZykge1xuICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gaGVscGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBjb25maWcgPSBjb25maWcgfHwge307XG4gIGlmIChjb25maWcuZm4gfHwgY29uZmlnLmhhc2ggfHwgYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gaGVscGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiBoZWxwZXIoY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBvcHRzID0gbWVyZ2Uoe30sIGNvbmZpZywgb3B0aW9ucyk7XG4gICAgICB2YXIgbWQgPSBuZXcgUmVtYXJrYWJsZShvcHRzKTtcbiAgICAgIHJldHVybiBtZC5yZW5kZXIoY29udGV4dCk7XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0KGNvbnRleHQpICYmIHR5cGVvZiBjb250ZXh0LmZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvcHRpb25zID0gY29udGV4dDtcbiAgICAgIGNvbnRleHQgPSB7fTtcbiAgICB9XG5cbiAgICBvcHRpb25zID0gbWVyZ2UoeyBodG1sOiB0cnVlLCBicmVha3M6IHRydWUgfSwgY29uZmlnLCBvcHRpb25zKTtcbiAgICBvcHRpb25zID0gbWVyZ2Uoe30sIG9wdGlvbnMsIG9wdGlvbnMubWFya2Rvd24sIG9wdGlvbnMuaGFzaCk7XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xhbmcnKSkge1xuICAgICAgb3B0aW9ucy5sYW5nUHJlZml4ID0gb3B0aW9ucy5sYW5nO1xuICAgIH1cblxuICAgIHZhciBtZCA9IG5ldyBSZW1hcmthYmxlKG9wdGlvbnMpO1xuICAgIHZhciBjdHggPSBtZXJnZSh7fSwgb3B0aW9ucywgdGhpcy5jb250ZXh0LCBjb250ZXh0KTtcbiAgICByZXR1cm4gbWQucmVuZGVyKG9wdGlvbnMuZm4oY3R4KSk7XG4gIH1cblxuICByZXR1cm4gaGVscGVyO1xufTtcbiIsIi8qIVxuICogaGVscGVyLW1hcmtkb3duIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9oZWxwZXItbWFya2Rvd24+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IEpvbiBTY2hsaW5rZXJ0LCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZnMgPSByZXF1aXJlKCdmcycpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgUmVtYXJrYWJsZSA9IHJlcXVpcmUoJ3JlbWFya2FibGUnKTtcbnZhciBleHRlbmQgPSByZXF1aXJlKCdleHRlbmQtc2hhbGxvdycpO1xudmFyIGV4aXN0cyA9IHJlcXVpcmUoJ2ZzLWV4aXN0cy1zeW5jJyk7XG52YXIgZW50ID0gcmVxdWlyZSgnZW50Jyk7XG5cbi8qKlxuICogRXhwb3NlIGBtZGAgaGVscGVyXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lLCBvcHRpb25zLCBjYikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignbWQgYXN5bmMgaGVscGVyIGV4cGVjdHMgY2FsbGJhY2sgdG8gYmUgYSBmdW5jdGlvbi4gRGlkIHlvdSBtZWFuIHRvIHVzZSBgbWQuc3luY2A/Jyk7XG4gIH1cbiAgaWYgKHR5cGVvZiB0aGlzID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgdGhpcy5hcHAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtZCBhc3luYyBoZWxwZXIgZXhwZWN0cyBgYXBwYCB0byBiZSBleHBvc2VkIG9uIHRoZSBjb250ZXh0Jyk7XG4gIH1cblxuICB2YXIgb3B0cyA9IGV4dGVuZCh7Y3dkOiBwcm9jZXNzLmN3ZCgpfSwgdGhpcy5vcHRpb25zLCBvcHRpb25zKTtcbiAgb3B0cyA9IGV4dGVuZCh7fSwgb3B0cywgb3B0cy5oYXNoKTtcbiAgdmFyIG1kID0gbWFya2Rvd24ob3B0cyk7XG5cbiAgdmFyIGZpbGVwYXRoID0gcGF0aC5yZXNvbHZlKG9wdHMuY3dkLCBuYW1lKTtcbiAgdmFyIHZpZXc7XG4gIHZhciBzdHIgPSAnJztcblxuICBpZiAoZXhpc3RzKGZpbGVwYXRoKSkge1xuICAgIC8vIGNyZWF0ZSBhIGNvbGxlY3Rpb24gdG8gZW5zdXJlIG1pZGRsZXdhcmUgaXMgY29uc2lzdGVudFxuICAgIHRoaXMuYXBwLmNyZWF0ZSgnbWRmaWxlcycpO1xuICAgIHN0ciA9IGZzLnJlYWRGaWxlU3luYyhmaWxlcGF0aCwgJ3V0ZjgnKTtcbiAgICB2aWV3ID0gdGhpcy5hcHAubWRmaWxlKGZpbGVwYXRoLCB7cGF0aDogZmlsZXBhdGgsIGNvbnRlbnQ6IHN0cn0pO1xuICB9IGVsc2Uge1xuICAgIHZpZXcgPSB0aGlzLmFwcC5maW5kKG5hbWUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2aWV3ID09PSAndW5kZWZpbmVkJykge1xuICAgIGNiKG51bGwsICcnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2aWV3LmNvbnRlbnQgPSBlbnQuZGVjb2RlKG1kLnJlbmRlcih2aWV3LmNvbnRlbnQpKTtcbiAgdGhpcy5hcHAucmVuZGVyKHZpZXcsIHRoaXMuY29udGV4dCwgZnVuY3Rpb24oZXJyLCByZXMpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKTtcbiAgICBjYihudWxsLCByZXMuY29udGVudCk7XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMuc3luYyA9IGZ1bmN0aW9uKG5hbWUsIG9wdGlvbnMpIHtcbiAgdmFyIGN0eCA9IHRoaXMgfHwge307XG4gIHZhciBhcHAgPSBjdHguYXBwIHx8IHt9O1xuXG4gIHZhciBvcHRzID0gZXh0ZW5kKHtjd2Q6IHByb2Nlc3MuY3dkKCl9LCBjdHgub3B0aW9ucywgb3B0aW9ucyk7XG4gIG9wdHMgPSBleHRlbmQoe30sIG9wdHMsIG9wdHMuaGFzaCk7XG4gIHZhciBtZCA9IG1hcmtkb3duKG9wdHMpO1xuXG4gIHZhciBmaWxlcGF0aCA9IHBhdGgucmVzb2x2ZShvcHRzLmN3ZCwgbmFtZSk7XG4gIHZhciB2aWV3O1xuICB2YXIgaHRtbCA9ICcnO1xuICB2YXIgc3RyID0gJyc7XG5cbiAgaWYgKGV4aXN0cyhmaWxlcGF0aCkpIHtcbiAgICBzdHIgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZXBhdGgsICd1dGY4Jyk7XG4gICAgaHRtbCA9IGVudC5kZWNvZGUobWQucmVuZGVyKHN0cikpO1xuICB9IGVsc2UgaWYgKGFwcC52aWV3cykge1xuICAgIHZpZXcgPSBhcHAuZmluZChuYW1lKTtcbiAgICBpZiAodmlldykge1xuICAgICAgaHRtbCA9IHZpZXcuY29udGVudCA9IGVudC5kZWNvZGUobWQucmVuZGVyKHZpZXcuY29udGVudCkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh2aWV3ICYmIHR5cGVvZiB2aWV3LmNvbXBpbGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2aWV3LmNvbXBpbGUob3B0cyk7XG4gICAgdmFyIGRhdGEgPSBjdHguY2FjaGUgPyBjdHguY2FjaGUuZGF0YSA6IHt9O1xuICAgIGN0eCA9IGV4dGVuZCh7fSwgZGF0YSwgdmlldy5kYXRhKTtcbiAgICByZXR1cm4gdmlldy5mbihjdHgpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0aGlzLmNvbXBpbGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZm4gPSB0aGlzLmNvbXBpbGUoaHRtbCk7XG4gICAgcmV0dXJuIGZuKHRoaXMpO1xuICB9XG4gIHJldHVybiBodG1sO1xufTtcblxuLyoqXG4gKiBTaGFyZWQgc2V0dGluZ3MgZm9yIHJlbWFya2FibGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBtYXJrZG93bihvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgUmVtYXJrYWJsZShleHRlbmQoe1xuICAgIGJyZWFrczogZmFsc2UsXG4gICAgaHRtbDogdHJ1ZSxcbiAgICBsYW5nUHJlZml4OiAnbGFuZy0nLFxuICAgIGxpbmtpZnk6IHRydWUsXG4gICAgdHlwb2dyYXBoZXI6IGZhbHNlLFxuICAgIHhodG1sT3V0OiBmYWxzZVxuICB9LCBvcHRpb25zKSk7XG59XG4iLCIvKiFcbiAqIGh0bWwtdGFnIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9odG1sLXRhZz5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgSm9uIFNjaGxpbmtlcnQsIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqICMjIHRhZyggbmFtZSwgYXR0cnMsIHRleHQgKVxuICpcbiAqIENyZWF0ZSBhIHNuaXBwZXQgb2YgSFRNTC5cbiAqXG4gKiAqKkV4YW1wbGVzOioqXG4gKlxuICogYGBganNcbiAqIHRhZygnYScsIHtocmVmOiAnaHR0cDovL3d3dy5nb29nbGUuY29tJ30sICdHb29nbGUnKTtcbiAqIHRhZygnaW1nJywge3NyYzogJ2Zvby5qcGcnfSk7XG4gKiBgYGBcbiAqXG4gKiB5aWVsZHM6XG4gKlxuICogYGBgaHRtbFxuICogPGEgaHJlZj1cImh0dHA6Ly93d3cuZ29vZ2xlLmNvbVwiPkdvb2dsZTwvYT5cbiAqIDxpbWcgc3JjPVwiZm9vLmpwZ1wiPlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGB0YWdgIFRoZSB0YWcgdG8gY3JlYXRlLlxuICogQHBhcmFtIHtPYmplY3R9IGBhdHRyc2AgT3B0aW9uYWwgYXR0cmlidXRlc1xuICogQHBhcmFtIHtTdHJpbmd9IGB0ZXh0YCBPcHRpb25hbCB0ZXh0XG4gKiBAcmV0dXJuIHtTdHJpbmd9IEhUTUxcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YWcsIGF0dHJzLCB0ZXh0KSB7XG4gIHZhciBodG1sID0gJzwnICsgdGFnO1xuXG4gIGZvciAodmFyIGkgaW4gYXR0cnMpIHtcbiAgICBpZiAoYXR0cnNbaV0pIGh0bWwgKz0gJyAnICsgaSArICc9XCInICsgYXR0cnNbaV0gKyAnXCInO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnYm9vbGVhbicgJiYgdGV4dCA9PT0gdHJ1ZSkge1xuICAgIGh0bWwgKz0gJz48LycgKyB0YWcgKyAnPic7XG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cblxuICBodG1sICs9IHRleHQgPyAnPicgKyB0ZXh0ICsgJzwvJyArIHRhZyArICc+JyA6ICc+JztcbiAgcmV0dXJuIGh0bWw7XG59OyIsImV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwiLyohXG4gKiBpbmRleC1vZiA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaW5kZXgtb2Y+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZGV4T2YoYXJyLCBlbGUsIHN0YXJ0KSB7XG4gIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgdmFyIGlkeCA9IC0xO1xuXG4gIGlmIChhcnIgPT0gbnVsbCkgcmV0dXJuIGlkeDtcbiAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XG4gIHZhciBpID0gc3RhcnQgPCAwXG4gICAgPyAobGVuICsgc3RhcnQpXG4gICAgOiBzdGFydDtcblxuICBpZiAoaSA+PSBhcnIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBpZiAoYXJyW2ldID09PSBlbGUpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4gLTE7XG59O1xuIiwiLyohXG4gKiBpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNSwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdHlwZU9mID0gcmVxdWlyZSgna2luZC1vZicpO1xuXG4vLyBhY2Nlc3NvciBkZXNjcmlwdG9yIHByb3BlcnRpZXNcbnZhciBhY2Nlc3NvciA9IHtcbiAgZ2V0OiAnZnVuY3Rpb24nLFxuICBzZXQ6ICdmdW5jdGlvbicsXG4gIGNvbmZpZ3VyYWJsZTogJ2Jvb2xlYW4nLFxuICBlbnVtZXJhYmxlOiAnYm9vbGVhbidcbn07XG5cbmZ1bmN0aW9uIGlzQWNjZXNzb3JEZXNjcmlwdG9yKG9iaiwgcHJvcCkge1xuICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIHZhbCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKTtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCAhPT0gJ3VuZGVmaW5lZCc7XG4gIH1cblxuICBpZiAodHlwZU9mKG9iaikgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGhhcyhvYmosICd2YWx1ZScpIHx8IGhhcyhvYmosICd3cml0YWJsZScpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXMob2JqLCAnZ2V0JykgfHwgdHlwZW9mIG9iai5nZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyB0bGRyOiBpdCdzIHZhbGlkIHRvIGhhdmUgXCJzZXRcIiBiZSB1bmRlZmluZWRcbiAgLy8gXCJzZXRcIiBtaWdodCBiZSB1bmRlZmluZWQgaWYgYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgXG4gIC8vIHdhcyB1c2VkIHRvIGdldCB0aGUgdmFsdWUsIGFuZCBvbmx5IGBnZXRgIHdhcyBkZWZpbmVkIGJ5IHRoZSB1c2VyXG4gIGlmIChoYXMob2JqLCAnc2V0JykgJiYgdHlwZW9mIG9ialtrZXldICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmpba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKCFhY2Nlc3Nvci5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZU9mKG9ialtrZXldKSA9PT0gYWNjZXNzb3Jba2V5XSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmpba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGhhcyhvYmosIGtleSkge1xuICByZXR1cm4ge30uaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG59XG5cbi8qKlxuICogRXhwb3NlIGBpc0FjY2Vzc29yRGVzY3JpcHRvcmBcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQWNjZXNzb3JEZXNjcmlwdG9yO1xuIiwidmFyIGlzQnVmZmVyID0gcmVxdWlyZSgnaXMtYnVmZmVyJyk7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIEdldCB0aGUgbmF0aXZlIGB0eXBlb2ZgIGEgdmFsdWUuXG4gKlxuICogQHBhcmFtICB7Kn0gYHZhbGBcbiAqIEByZXR1cm4geyp9IE5hdGl2ZSBqYXZhc2NyaXB0IHR5cGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcbiAgLy8gcHJpbWl0aXZpZXNcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICB9XG4gIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG4gIGlmICh2YWwgPT09IHRydWUgfHwgdmFsID09PSBmYWxzZSB8fCB2YWwgaW5zdGFuY2VvZiBCb29sZWFuKSB7XG4gICAgcmV0dXJuICdib29sZWFuJztcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdmFsIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgcmV0dXJuICdzdHJpbmcnO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyB8fCB2YWwgaW5zdGFuY2VvZiBOdW1iZXIpIHtcbiAgICByZXR1cm4gJ251bWJlcic7XG4gIH1cblxuICAvLyBmdW5jdGlvbnNcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicgfHwgdmFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIC8vIGFycmF5XG4gIGlmICh0eXBlb2YgQXJyYXkuaXNBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgcmV0dXJuICdhcnJheSc7XG4gIH1cblxuICAvLyBjaGVjayBmb3IgaW5zdGFuY2VzIG9mIFJlZ0V4cCBhbmQgRGF0ZSBiZWZvcmUgY2FsbGluZyBgdG9TdHJpbmdgXG4gIGlmICh2YWwgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gIH1cbiAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gJ2RhdGUnO1xuICB9XG5cbiAgLy8gb3RoZXIgb2JqZWN0c1xuICB2YXIgdHlwZSA9IHRvU3RyaW5nLmNhbGwodmFsKTtcblxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcbiAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIHJldHVybiAnZGF0ZSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nKSB7XG4gICAgcmV0dXJuICdhcmd1bWVudHMnO1xuICB9XG5cbiAgLy8gYnVmZmVyXG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBpc0J1ZmZlcih2YWwpKSB7XG4gICAgcmV0dXJuICdidWZmZXInO1xuICB9XG5cbiAgLy8gZXM2OiBNYXAsIFdlYWtNYXAsIFNldCwgV2Vha1NldFxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgU2V0XScpIHtcbiAgICByZXR1cm4gJ3NldCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFdlYWtTZXRdJykge1xuICAgIHJldHVybiAnd2Vha3NldCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IE1hcF0nKSB7XG4gICAgcmV0dXJuICdtYXAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBXZWFrTWFwXScpIHtcbiAgICByZXR1cm4gJ3dlYWttYXAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBTeW1ib2xdJykge1xuICAgIHJldHVybiAnc3ltYm9sJztcbiAgfVxuXG4gIC8vIHR5cGVkIGFycmF5c1xuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSW50OEFycmF5XScpIHtcbiAgICByZXR1cm4gJ2ludDhhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykge1xuICAgIHJldHVybiAndWludDhhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScpIHtcbiAgICByZXR1cm4gJ3VpbnQ4Y2xhbXBlZGFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSW50MTZBcnJheV0nKSB7XG4gICAgcmV0dXJuICdpbnQxNmFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgVWludDE2QXJyYXldJykge1xuICAgIHJldHVybiAndWludDE2YXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBJbnQzMkFycmF5XScpIHtcbiAgICByZXR1cm4gJ2ludDMyYXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBVaW50MzJBcnJheV0nKSB7XG4gICAgcmV0dXJuICd1aW50MzJhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nKSB7XG4gICAgcmV0dXJuICdmbG9hdDMyYXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBGbG9hdDY0QXJyYXldJykge1xuICAgIHJldHVybiAnZmxvYXQ2NGFycmF5JztcbiAgfVxuXG4gIC8vIG11c3QgYmUgYSBwbGFpbiBvYmplY3RcbiAgcmV0dXJuICdvYmplY3QnO1xufTtcbiIsIi8qKlxuICogRGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBCdWZmZXJcbiAqXG4gKiBBdXRob3I6ICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIExpY2Vuc2U6ICBNSVRcbiAqXG4gKiBgbnBtIGluc3RhbGwgaXMtYnVmZmVyYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gISEob2JqICE9IG51bGwgJiZcbiAgICAob2JqLl9pc0J1ZmZlciB8fCAvLyBGb3IgU2FmYXJpIDUtNyAobWlzc2luZyBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yKVxuICAgICAgKG9iai5jb25zdHJ1Y3RvciAmJlxuICAgICAgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaikpXG4gICAgKSlcbn1cbiIsIi8qIVxuICogaXMtZGF0YS1kZXNjcmlwdG9yIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1kYXRhLWRlc2NyaXB0b3I+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE1LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciB0eXBlT2YgPSByZXF1aXJlKCdraW5kLW9mJyk7XG5cbi8vIGRhdGEgZGVzY3JpcHRvciBwcm9wZXJ0aWVzXG52YXIgZGF0YSA9IHtcbiAgY29uZmlndXJhYmxlOiAnYm9vbGVhbicsXG4gIGVudW1lcmFibGU6ICdib29sZWFuJyxcbiAgd3JpdGFibGU6ICdib29sZWFuJ1xufTtcblxuZnVuY3Rpb24gaXNEYXRhRGVzY3JpcHRvcihvYmosIHByb3ApIHtcbiAgaWYgKHR5cGVPZihvYmopICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgdmFsID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xuICAgIHJldHVybiB0eXBlb2YgdmFsICE9PSAndW5kZWZpbmVkJztcbiAgfVxuXG4gIGlmICghKCd2YWx1ZScgaW4gb2JqKSAmJiAhKCd3cml0YWJsZScgaW4gb2JqKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoa2V5ID09PSAndmFsdWUnKSBjb250aW51ZTtcblxuICAgIGlmICghZGF0YS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZU9mKG9ialtrZXldKSA9PT0gZGF0YVtrZXldKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9ialtrZXldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBFeHBvc2UgYGlzRGF0YURlc2NyaXB0b3JgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBpc0RhdGFEZXNjcmlwdG9yO1xuIiwidmFyIGlzQnVmZmVyID0gcmVxdWlyZSgnaXMtYnVmZmVyJyk7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIEdldCB0aGUgbmF0aXZlIGB0eXBlb2ZgIGEgdmFsdWUuXG4gKlxuICogQHBhcmFtICB7Kn0gYHZhbGBcbiAqIEByZXR1cm4geyp9IE5hdGl2ZSBqYXZhc2NyaXB0IHR5cGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcbiAgLy8gcHJpbWl0aXZpZXNcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICB9XG4gIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG4gIGlmICh2YWwgPT09IHRydWUgfHwgdmFsID09PSBmYWxzZSB8fCB2YWwgaW5zdGFuY2VvZiBCb29sZWFuKSB7XG4gICAgcmV0dXJuICdib29sZWFuJztcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdmFsIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgcmV0dXJuICdzdHJpbmcnO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyB8fCB2YWwgaW5zdGFuY2VvZiBOdW1iZXIpIHtcbiAgICByZXR1cm4gJ251bWJlcic7XG4gIH1cblxuICAvLyBmdW5jdGlvbnNcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicgfHwgdmFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIC8vIGFycmF5XG4gIGlmICh0eXBlb2YgQXJyYXkuaXNBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgcmV0dXJuICdhcnJheSc7XG4gIH1cblxuICAvLyBjaGVjayBmb3IgaW5zdGFuY2VzIG9mIFJlZ0V4cCBhbmQgRGF0ZSBiZWZvcmUgY2FsbGluZyBgdG9TdHJpbmdgXG4gIGlmICh2YWwgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gIH1cbiAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gJ2RhdGUnO1xuICB9XG5cbiAgLy8gb3RoZXIgb2JqZWN0c1xuICB2YXIgdHlwZSA9IHRvU3RyaW5nLmNhbGwodmFsKTtcblxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcbiAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIHJldHVybiAnZGF0ZSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nKSB7XG4gICAgcmV0dXJuICdhcmd1bWVudHMnO1xuICB9XG5cbiAgLy8gYnVmZmVyXG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBpc0J1ZmZlcih2YWwpKSB7XG4gICAgcmV0dXJuICdidWZmZXInO1xuICB9XG5cbiAgLy8gZXM2OiBNYXAsIFdlYWtNYXAsIFNldCwgV2Vha1NldFxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgU2V0XScpIHtcbiAgICByZXR1cm4gJ3NldCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFdlYWtTZXRdJykge1xuICAgIHJldHVybiAnd2Vha3NldCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IE1hcF0nKSB7XG4gICAgcmV0dXJuICdtYXAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBXZWFrTWFwXScpIHtcbiAgICByZXR1cm4gJ3dlYWttYXAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBTeW1ib2xdJykge1xuICAgIHJldHVybiAnc3ltYm9sJztcbiAgfVxuXG4gIC8vIHR5cGVkIGFycmF5c1xuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSW50OEFycmF5XScpIHtcbiAgICByZXR1cm4gJ2ludDhhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykge1xuICAgIHJldHVybiAndWludDhhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScpIHtcbiAgICByZXR1cm4gJ3VpbnQ4Y2xhbXBlZGFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSW50MTZBcnJheV0nKSB7XG4gICAgcmV0dXJuICdpbnQxNmFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgVWludDE2QXJyYXldJykge1xuICAgIHJldHVybiAndWludDE2YXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBJbnQzMkFycmF5XScpIHtcbiAgICByZXR1cm4gJ2ludDMyYXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBVaW50MzJBcnJheV0nKSB7XG4gICAgcmV0dXJuICd1aW50MzJhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nKSB7XG4gICAgcmV0dXJuICdmbG9hdDMyYXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBGbG9hdDY0QXJyYXldJykge1xuICAgIHJldHVybiAnZmxvYXQ2NGFycmF5JztcbiAgfVxuXG4gIC8vIG11c3QgYmUgYSBwbGFpbiBvYmplY3RcbiAgcmV0dXJuICdvYmplY3QnO1xufTtcbiIsIi8qIVxuICogaXMtZGVzY3JpcHRvciA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtZGVzY3JpcHRvcj5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRGVzY3JpcHRvcihvYmosIGtleSkge1xuICBpZiAodXRpbHMudHlwZU9mKG9iaikgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgnZ2V0JyBpbiBvYmopIHtcbiAgICByZXR1cm4gdXRpbHMuaXNBY2Nlc3NvcihvYmosIGtleSk7XG4gIH1cbiAgcmV0dXJuIHV0aWxzLmlzRGF0YShvYmosIGtleSk7XG59O1xuIiwidmFyIGlzQnVmZmVyID0gcmVxdWlyZSgnaXMtYnVmZmVyJyk7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIEdldCB0aGUgbmF0aXZlIGB0eXBlb2ZgIGEgdmFsdWUuXG4gKlxuICogQHBhcmFtICB7Kn0gYHZhbGBcbiAqIEByZXR1cm4geyp9IE5hdGl2ZSBqYXZhc2NyaXB0IHR5cGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcbiAgLy8gcHJpbWl0aXZpZXNcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICB9XG4gIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG4gIGlmICh2YWwgPT09IHRydWUgfHwgdmFsID09PSBmYWxzZSB8fCB2YWwgaW5zdGFuY2VvZiBCb29sZWFuKSB7XG4gICAgcmV0dXJuICdib29sZWFuJztcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdmFsIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgcmV0dXJuICdzdHJpbmcnO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyB8fCB2YWwgaW5zdGFuY2VvZiBOdW1iZXIpIHtcbiAgICByZXR1cm4gJ251bWJlcic7XG4gIH1cblxuICAvLyBmdW5jdGlvbnNcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicgfHwgdmFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIC8vIGFycmF5XG4gIGlmICh0eXBlb2YgQXJyYXkuaXNBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgcmV0dXJuICdhcnJheSc7XG4gIH1cblxuICAvLyBjaGVjayBmb3IgaW5zdGFuY2VzIG9mIFJlZ0V4cCBhbmQgRGF0ZSBiZWZvcmUgY2FsbGluZyBgdG9TdHJpbmdgXG4gIGlmICh2YWwgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gIH1cbiAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gJ2RhdGUnO1xuICB9XG5cbiAgLy8gb3RoZXIgb2JqZWN0c1xuICB2YXIgdHlwZSA9IHRvU3RyaW5nLmNhbGwodmFsKTtcblxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcbiAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIHJldHVybiAnZGF0ZSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nKSB7XG4gICAgcmV0dXJuICdhcmd1bWVudHMnO1xuICB9XG5cbiAgLy8gYnVmZmVyXG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBpc0J1ZmZlcih2YWwpKSB7XG4gICAgcmV0dXJuICdidWZmZXInO1xuICB9XG5cbiAgLy8gZXM2OiBNYXAsIFdlYWtNYXAsIFNldCwgV2Vha1NldFxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgU2V0XScpIHtcbiAgICByZXR1cm4gJ3NldCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFdlYWtTZXRdJykge1xuICAgIHJldHVybiAnd2Vha3NldCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IE1hcF0nKSB7XG4gICAgcmV0dXJuICdtYXAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBXZWFrTWFwXScpIHtcbiAgICByZXR1cm4gJ3dlYWttYXAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBTeW1ib2xdJykge1xuICAgIHJldHVybiAnc3ltYm9sJztcbiAgfVxuXG4gIC8vIHR5cGVkIGFycmF5c1xuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSW50OEFycmF5XScpIHtcbiAgICByZXR1cm4gJ2ludDhhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykge1xuICAgIHJldHVybiAndWludDhhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScpIHtcbiAgICByZXR1cm4gJ3VpbnQ4Y2xhbXBlZGFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSW50MTZBcnJheV0nKSB7XG4gICAgcmV0dXJuICdpbnQxNmFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgVWludDE2QXJyYXldJykge1xuICAgIHJldHVybiAndWludDE2YXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBJbnQzMkFycmF5XScpIHtcbiAgICByZXR1cm4gJ2ludDMyYXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBVaW50MzJBcnJheV0nKSB7XG4gICAgcmV0dXJuICd1aW50MzJhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nKSB7XG4gICAgcmV0dXJuICdmbG9hdDMyYXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBGbG9hdDY0QXJyYXldJykge1xuICAgIHJldHVybiAnZmxvYXQ2NGFycmF5JztcbiAgfVxuXG4gIC8vIG11c3QgYmUgYSBwbGFpbiBvYmplY3RcbiAgcmV0dXJuICdvYmplY3QnO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBMYXppbHkgcmVxdWlyZWQgbW9kdWxlIGRlcGVuZGVuY2llc1xuICovXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJ2xhenktY2FjaGUnKShyZXF1aXJlKTtcbnZhciBmbiA9IHJlcXVpcmU7XG5yZXF1aXJlID0gdXRpbHM7XG5cbi8qKlxuICogVXRpbHNcbiAqL1xuXG5yZXF1aXJlKCdraW5kLW9mJywgJ3R5cGVPZicpO1xucmVxdWlyZSgnaXMtYWNjZXNzb3ItZGVzY3JpcHRvcicsICdpc0FjY2Vzc29yJyk7XG5yZXF1aXJlKCdpcy1kYXRhLWRlc2NyaXB0b3InLCAnaXNEYXRhJyk7XG5yZXF1aXJlID0gZm47XG5cbi8qKlxuICogRXhwb3NlIGB1dGlsc2BcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHV0aWxzO1xuIiwiLyohXG4gKiBpcy1kb3RmaWxlIDxodHRwczovL2dpdGh1Yi5jb20vcmVnZXhwcy9pcy1kb3RmaWxlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNSBKb24gU2NobGlua2VydCwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3RyKSB7XG4gIGlmIChzdHIuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLyAmJiBzdHIuaW5kZXhPZignLycsIDEpID09PSAtMSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGxhc3QgPSBzdHIubGFzdEluZGV4T2YoJy8nKTtcbiAgcmV0dXJuIGxhc3QgIT09IC0xID8gc3RyLmNoYXJDb2RlQXQobGFzdCArIDEpID09PSA0NiAgLyogLiAqLyA6IGZhbHNlO1xufTtcbiIsIi8qIVxuICogaXMtZXF1YWwtc2hhbGxvdyA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtZXF1YWwtc2hhbGxvdz5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzUHJpbWl0aXZlID0gcmVxdWlyZSgnaXMtcHJpbWl0aXZlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNFcXVhbChhLCBiKSB7XG4gIGlmICghYSAmJiAhYikgeyByZXR1cm4gdHJ1ZTsgfVxuICBpZiAoIWEgJiYgYiB8fCBhICYmICFiKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIHZhciBudW1LZXlzQSA9IDAsIG51bUtleXNCID0gMCwga2V5O1xuICBmb3IgKGtleSBpbiBiKSB7XG4gICAgbnVtS2V5c0IrKztcbiAgICBpZiAoIWlzUHJpbWl0aXZlKGJba2V5XSkgfHwgIWEuaGFzT3duUHJvcGVydHkoa2V5KSB8fCAoYVtrZXldICE9PSBiW2tleV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGZvciAoa2V5IGluIGEpIHtcbiAgICBudW1LZXlzQSsrO1xuICB9XG4gIHJldHVybiBudW1LZXlzQSA9PT0gbnVtS2V5c0I7XG59O1xuIiwiLyohXG4gKiBpcy1ldmVuIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1ldmVuPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNSwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNOdW1iZXIgPSByZXF1aXJlKCdpcy1udW1iZXInKTtcbnZhciBpc09kZCA9IHJlcXVpcmUoJ2lzLW9kZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRXZlbihpKSB7XG4gIGlmICghaXNOdW1iZXIoaSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpcy1ldmVuIGV4cGVjdHMgYSBudW1iZXIuJyk7XG4gIH1cbiAgcmV0dXJuICFpc09kZChpKTtcbn07XG4iLCIvKiFcbiAqIGlzLW51bWJlciA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtbnVtYmVyPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNOdW1iZXIobikge1xuICByZXR1cm4gKCEhKCtuKSAmJiAhQXJyYXkuaXNBcnJheShuKSkgJiYgaXNGaW5pdGUobilcbiAgICB8fCBuID09PSAnMCdcbiAgICB8fCBuID09PSAwO1xufTtcbiIsIi8qIVxuICogaXMtZXh0ZW5kYWJsZSA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtZXh0ZW5kYWJsZT5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0V4dGVuZGFibGUodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsICE9PSAndW5kZWZpbmVkJyAmJiB2YWwgIT09IG51bGxcbiAgICAmJiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJyk7XG59O1xuIiwiLyohXG4gKiBpcy1leHRnbG9iIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1leHRnbG9iPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRXh0Z2xvYihzdHIpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnXG4gICAgJiYgL1tAPyErKl1cXCgvLnRlc3Qoc3RyKTtcbn07XG4iLCIvKiFcbiAqIGlzLWdsb2IgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLWdsb2I+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbnZhciBpc0V4dGdsb2IgPSByZXF1aXJlKCdpcy1leHRnbG9iJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNHbG9iKHN0cikge1xuICByZXR1cm4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZydcbiAgICAmJiAoL1sqIT97fSh8KVtcXF1dLy50ZXN0KHN0cilcbiAgICAgfHwgaXNFeHRnbG9iKHN0cikpO1xufTsiLCIvKiFcbiAqIGlzLW51bWJlciA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtbnVtYmVyPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciB0eXBlT2YgPSByZXF1aXJlKCdraW5kLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNOdW1iZXIobnVtKSB7XG4gIHZhciB0eXBlID0gdHlwZU9mKG51bSk7XG4gIGlmICh0eXBlICE9PSAnbnVtYmVyJyAmJiB0eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbiA9ICtudW07XG4gIHJldHVybiAobiAtIG4gKyAxKSA+PSAwICYmIG51bSAhPT0gJyc7XG59O1xuIiwidmFyIGlzQnVmZmVyID0gcmVxdWlyZSgnaXMtYnVmZmVyJyk7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIEdldCB0aGUgbmF0aXZlIGB0eXBlb2ZgIGEgdmFsdWUuXG4gKlxuICogQHBhcmFtICB7Kn0gYHZhbGBcbiAqIEByZXR1cm4geyp9IE5hdGl2ZSBqYXZhc2NyaXB0IHR5cGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcbiAgLy8gcHJpbWl0aXZpZXNcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICB9XG4gIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG4gIGlmICh2YWwgPT09IHRydWUgfHwgdmFsID09PSBmYWxzZSB8fCB2YWwgaW5zdGFuY2VvZiBCb29sZWFuKSB7XG4gICAgcmV0dXJuICdib29sZWFuJztcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdmFsIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgcmV0dXJuICdzdHJpbmcnO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyB8fCB2YWwgaW5zdGFuY2VvZiBOdW1iZXIpIHtcbiAgICByZXR1cm4gJ251bWJlcic7XG4gIH1cblxuICAvLyBmdW5jdGlvbnNcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicgfHwgdmFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIC8vIGFycmF5XG4gIGlmICh0eXBlb2YgQXJyYXkuaXNBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgcmV0dXJuICdhcnJheSc7XG4gIH1cblxuICAvLyBjaGVjayBmb3IgaW5zdGFuY2VzIG9mIFJlZ0V4cCBhbmQgRGF0ZSBiZWZvcmUgY2FsbGluZyBgdG9TdHJpbmdgXG4gIGlmICh2YWwgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gIH1cbiAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gJ2RhdGUnO1xuICB9XG5cbiAgLy8gb3RoZXIgb2JqZWN0c1xuICB2YXIgdHlwZSA9IHRvU3RyaW5nLmNhbGwodmFsKTtcblxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcbiAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIHJldHVybiAnZGF0ZSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nKSB7XG4gICAgcmV0dXJuICdhcmd1bWVudHMnO1xuICB9XG5cbiAgLy8gYnVmZmVyXG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBpc0J1ZmZlcih2YWwpKSB7XG4gICAgcmV0dXJuICdidWZmZXInO1xuICB9XG5cbiAgLy8gZXM2OiBNYXAsIFdlYWtNYXAsIFNldCwgV2Vha1NldFxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgU2V0XScpIHtcbiAgICByZXR1cm4gJ3NldCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFdlYWtTZXRdJykge1xuICAgIHJldHVybiAnd2Vha3NldCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IE1hcF0nKSB7XG4gICAgcmV0dXJuICdtYXAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBXZWFrTWFwXScpIHtcbiAgICByZXR1cm4gJ3dlYWttYXAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBTeW1ib2xdJykge1xuICAgIHJldHVybiAnc3ltYm9sJztcbiAgfVxuXG4gIC8vIHR5cGVkIGFycmF5c1xuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSW50OEFycmF5XScpIHtcbiAgICByZXR1cm4gJ2ludDhhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykge1xuICAgIHJldHVybiAndWludDhhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScpIHtcbiAgICByZXR1cm4gJ3VpbnQ4Y2xhbXBlZGFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSW50MTZBcnJheV0nKSB7XG4gICAgcmV0dXJuICdpbnQxNmFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgVWludDE2QXJyYXldJykge1xuICAgIHJldHVybiAndWludDE2YXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBJbnQzMkFycmF5XScpIHtcbiAgICByZXR1cm4gJ2ludDMyYXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBVaW50MzJBcnJheV0nKSB7XG4gICAgcmV0dXJuICd1aW50MzJhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nKSB7XG4gICAgcmV0dXJuICdmbG9hdDMyYXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBGbG9hdDY0QXJyYXldJykge1xuICAgIHJldHVybiAnZmxvYXQ2NGFycmF5JztcbiAgfVxuXG4gIC8vIG11c3QgYmUgYSBwbGFpbiBvYmplY3RcbiAgcmV0dXJuICdvYmplY3QnO1xufTtcbiIsIi8qIVxuICogaXMtb2RkIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1vZGQ+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE1LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpc051bWJlciA9IHJlcXVpcmUoJ2lzLW51bWJlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzT2RkKGkpIHtcbiAgaWYgKCFpc051bWJlcihpKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2lzLW9kZCBleHBlY3RzIGEgbnVtYmVyLicpO1xuICB9XG4gIHJldHVybiAhISh+fmkgPj4gMCAmIDEpO1xufTtcbiIsIi8qIVxuICogaXMtcG9zaXgtYnJhY2tldCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtcG9zaXgtYnJhY2tldD5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1Bvc2l4QnJhY2tldChzdHIpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnICYmIC9cXFsoWzouPStdKSg/OlteXFxbXFxdXXwpK1xcMVxcXS8udGVzdChzdHIpO1xufTtcbiIsIi8qIVxuICogaXMtcHJpbWl0aXZlIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1wcmltaXRpdmU+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gc2VlIGh0dHA6Ly9qc3BlcmYuY29tL3Rlc3RpbmctdmFsdWUtaXMtcHJpbWl0aXZlLzdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNQcmltaXRpdmUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKTtcbn07XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIi8qIVxuICogaXNvYmplY3QgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzb2JqZWN0PlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbCkge1xuICByZXR1cm4gdmFsICE9IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgaXNBcnJheSh2YWwpID09PSBmYWxzZTtcbn07XG4iLCIvKiFcbiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjIuMi4zXG4gKiBodHRwOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vXG4gKlxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMTYtMDQtMDVUMTk6MjZaXG4gKi9cblxuKGZ1bmN0aW9uKCBnbG9iYWwsIGZhY3RvcnkgKSB7XG5cblx0aWYgKCB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHQvLyBGb3IgQ29tbW9uSlMgYW5kIENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHdoZXJlIGEgcHJvcGVyIGB3aW5kb3dgXG5cdFx0Ly8gaXMgcHJlc2VudCwgZXhlY3V0ZSB0aGUgZmFjdG9yeSBhbmQgZ2V0IGpRdWVyeS5cblx0XHQvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YFxuXHRcdC8vIChzdWNoIGFzIE5vZGUuanMpLCBleHBvc2UgYSBmYWN0b3J5IGFzIG1vZHVsZS5leHBvcnRzLlxuXHRcdC8vIFRoaXMgYWNjZW50dWF0ZXMgdGhlIG5lZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIHJlYWwgYHdpbmRvd2AuXG5cdFx0Ly8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKSh3aW5kb3cpO1xuXHRcdC8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgP1xuXHRcdFx0ZmFjdG9yeSggZ2xvYmFsLCB0cnVlICkgOlxuXHRcdFx0ZnVuY3Rpb24oIHcgKSB7XG5cdFx0XHRcdGlmICggIXcuZG9jdW1lbnQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBcImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnRcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWN0b3J5KCB3ICk7XG5cdFx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdGZhY3RvcnkoIGdsb2JhbCApO1xuXHR9XG5cbi8vIFBhc3MgdGhpcyBpZiB3aW5kb3cgaXMgbm90IGRlZmluZWQgeWV0XG59KHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiggd2luZG93LCBub0dsb2JhbCApIHtcblxuLy8gU3VwcG9ydDogRmlyZWZveCAxOCtcbi8vIENhbid0IGJlIGluIHN0cmljdCBtb2RlLCBzZXZlcmFsIGxpYnMgaW5jbHVkaW5nIEFTUC5ORVQgdHJhY2Vcbi8vIHRoZSBzdGFjayB2aWEgYXJndW1lbnRzLmNhbGxlci5jYWxsZWUgYW5kIEZpcmVmb3ggZGllcyBpZlxuLy8geW91IHRyeSB0byB0cmFjZSB0aHJvdWdoIFwidXNlIHN0cmljdFwiIGNhbGwgY2hhaW5zLiAoIzEzMzM1KVxuLy9cInVzZSBzdHJpY3RcIjtcbnZhciBhcnIgPSBbXTtcblxudmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuXG52YXIgc2xpY2UgPSBhcnIuc2xpY2U7XG5cbnZhciBjb25jYXQgPSBhcnIuY29uY2F0O1xuXG52YXIgcHVzaCA9IGFyci5wdXNoO1xuXG52YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mO1xuXG52YXIgY2xhc3MydHlwZSA9IHt9O1xuXG52YXIgdG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nO1xuXG52YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIHN1cHBvcnQgPSB7fTtcblxuXG5cbnZhclxuXHR2ZXJzaW9uID0gXCIyLjIuM1wiLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblxuXHRcdC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJ1xuXHRcdC8vIE5lZWQgaW5pdCBpZiBqUXVlcnkgaXMgY2FsbGVkIChqdXN0IGFsbG93IGVycm9yIHRvIGJlIHRocm93biBpZiBub3QgaW5jbHVkZWQpXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMVxuXHQvLyBNYWtlIHN1cmUgd2UgdHJpbSBCT00gYW5kIE5CU1Bcblx0cnRyaW0gPSAvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csXG5cblx0Ly8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nXG5cdHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbXFxkYS16XSkvZ2ksXG5cblx0Ly8gVXNlZCBieSBqUXVlcnkuY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRvIHJlcGxhY2UoKVxuXHRmY2FtZWxDYXNlID0gZnVuY3Rpb24oIGFsbCwgbGV0dGVyICkge1xuXHRcdHJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTtcblx0fTtcblxualF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHtcblxuXHQvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkXG5cdGpxdWVyeTogdmVyc2lvbixcblxuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LFxuXG5cdC8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3Jcblx0c2VsZWN0b3I6IFwiXCIsXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXHRcdHJldHVybiBudW0gIT0gbnVsbCA/XG5cblx0XHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRcdCggbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXSApIDpcblxuXHRcdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdFx0c2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2tcblx0Ly8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpXG5cdHB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkge1xuXG5cdFx0Ly8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXRcblx0XHR2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1zICk7XG5cblx0XHQvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKVxuXHRcdHJldC5wcmV2T2JqZWN0ID0gdGhpcztcblx0XHRyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuXHRcdC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHQvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LlxuXHRlYWNoOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjayApO1xuXHR9LFxuXG5cdG1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gY2FsbGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApO1xuXHRcdH0gKSApO1xuXHR9LFxuXG5cdHNsaWNlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApO1xuXHR9LFxuXG5cdGZpcnN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggMCApO1xuXHR9LFxuXG5cdGxhc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAtMSApO1xuXHR9LFxuXG5cdGVxOiBmdW5jdGlvbiggaSApIHtcblx0XHR2YXIgbGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRqID0gK2kgKyAoIGkgPCAwID8gbGVuIDogMCApO1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggaiA+PSAwICYmIGogPCBsZW4gPyBbIHRoaXNbIGogXSBdIDogW10gKTtcblx0fSxcblxuXHRlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpO1xuXHR9LFxuXG5cdC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cblx0Ly8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuXG5cdHB1c2g6IHB1c2gsXG5cdHNvcnQ6IGFyci5zb3J0LFxuXHRzcGxpY2U6IGFyci5zcGxpY2Vcbn07XG5cbmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7XG5cdHZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSxcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSxcblx0XHRpID0gMSxcblx0XHRsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuXHRcdGRlZXAgPSBmYWxzZTtcblxuXHQvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uXG5cdGlmICggdHlwZW9mIHRhcmdldCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0ZGVlcCA9IHRhcmdldDtcblxuXHRcdC8vIFNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXRcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbIGkgXSB8fCB7fTtcblx0XHRpKys7XG5cdH1cblxuXHQvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSlcblx0aWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSBcIm9iamVjdFwiICYmICFqUXVlcnkuaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHQvLyBFeHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcblx0aWYgKCBpID09PSBsZW5ndGggKSB7XG5cdFx0dGFyZ2V0ID0gdGhpcztcblx0XHRpLS07XG5cdH1cblxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblxuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAoICggb3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdICkgIT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggdGFyZ2V0ID09PSBjb3B5ICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdGlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvcHkgKSB8fFxuXHRcdFx0XHRcdCggY29weUlzQXJyYXkgPSBqUXVlcnkuaXNBcnJheSggY29weSApICkgKSApIHtcblxuXHRcdFx0XHRcdGlmICggY29weUlzQXJyYXkgKSB7XG5cdFx0XHRcdFx0XHRjb3B5SXNBcnJheSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoIHNyYyApID8gc3JjIDogW107XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHNyYyApID8gc3JjIDoge307XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtXG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29weSApO1xuXG5cdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0fSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0gY29weTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XG5cdHJldHVybiB0YXJnZXQ7XG59O1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlXG5cdGV4cGFuZG86IFwialF1ZXJ5XCIgKyAoIHZlcnNpb24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xcRC9nLCBcIlwiICksXG5cblx0Ly8gQXNzdW1lIGpRdWVyeSBpcyByZWFkeSB3aXRob3V0IHRoZSByZWFkeSBtb2R1bGVcblx0aXNSZWFkeTogdHJ1ZSxcblxuXHRlcnJvcjogZnVuY3Rpb24oIG1zZyApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXHR9LFxuXG5cdG5vb3A6IGZ1bmN0aW9uKCkge30sXG5cblx0aXNGdW5jdGlvbjogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRyZXR1cm4galF1ZXJ5LnR5cGUoIG9iaiApID09PSBcImZ1bmN0aW9uXCI7XG5cdH0sXG5cblx0aXNBcnJheTogQXJyYXkuaXNBcnJheSxcblxuXHRpc1dpbmRvdzogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRyZXR1cm4gb2JqICE9IG51bGwgJiYgb2JqID09PSBvYmoud2luZG93O1xuXHR9LFxuXG5cdGlzTnVtZXJpYzogZnVuY3Rpb24oIG9iaiApIHtcblxuXHRcdC8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzIChudWxsfHRydWV8ZmFsc2V8XCJcIilcblx0XHQvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzIChcIjB4Li4uXCIpXG5cdFx0Ly8gc3VidHJhY3Rpb24gZm9yY2VzIGluZmluaXRpZXMgdG8gTmFOXG5cdFx0Ly8gYWRkaW5nIDEgY29ycmVjdHMgbG9zcyBvZiBwcmVjaXNpb24gZnJvbSBwYXJzZUZsb2F0ICgjMTUxMDApXG5cdFx0dmFyIHJlYWxTdHJpbmdPYmogPSBvYmogJiYgb2JqLnRvU3RyaW5nKCk7XG5cdFx0cmV0dXJuICFqUXVlcnkuaXNBcnJheSggb2JqICkgJiYgKCByZWFsU3RyaW5nT2JqIC0gcGFyc2VGbG9hdCggcmVhbFN0cmluZ09iaiApICsgMSApID49IDA7XG5cdH0sXG5cblx0aXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIga2V5O1xuXG5cdFx0Ly8gTm90IHBsYWluIG9iamVjdHM6XG5cdFx0Ly8gLSBBbnkgb2JqZWN0IG9yIHZhbHVlIHdob3NlIGludGVybmFsIFtbQ2xhc3NdXSBwcm9wZXJ0eSBpcyBub3QgXCJbb2JqZWN0IE9iamVjdF1cIlxuXHRcdC8vIC0gRE9NIG5vZGVzXG5cdFx0Ly8gLSB3aW5kb3dcblx0XHRpZiAoIGpRdWVyeS50eXBlKCBvYmogKSAhPT0gXCJvYmplY3RcIiB8fCBvYmoubm9kZVR5cGUgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBOb3Qgb3duIGNvbnN0cnVjdG9yIHByb3BlcnR5IG11c3QgYmUgT2JqZWN0XG5cdFx0aWYgKCBvYmouY29uc3RydWN0b3IgJiZcblx0XHRcdFx0IWhhc093bi5jYWxsKCBvYmosIFwiY29uc3RydWN0b3JcIiApICYmXG5cdFx0XHRcdCFoYXNPd24uY2FsbCggb2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSB8fCB7fSwgXCJpc1Byb3RvdHlwZU9mXCIgKSApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBPd24gcHJvcGVydGllcyBhcmUgZW51bWVyYXRlZCBmaXJzdGx5LCBzbyB0byBzcGVlZCB1cCxcblx0XHQvLyBpZiBsYXN0IG9uZSBpcyBvd24sIHRoZW4gYWxsIHByb3BlcnRpZXMgYXJlIG93blxuXHRcdGZvciAoIGtleSBpbiBvYmogKSB7fVxuXG5cdFx0cmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkIHx8IGhhc093bi5jYWxsKCBvYmosIGtleSApO1xuXHR9LFxuXG5cdGlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIG5hbWU7XG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdHR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0aWYgKCBvYmogPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiBvYmogKyBcIlwiO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wLCBpT1M8NiAoZnVuY3Rpb25pc2ggUmVnRXhwKVxuXHRcdHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiA/XG5cdFx0XHRjbGFzczJ0eXBlWyB0b1N0cmluZy5jYWxsKCBvYmogKSBdIHx8IFwib2JqZWN0XCIgOlxuXHRcdFx0dHlwZW9mIG9iajtcblx0fSxcblxuXHQvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dFxuXHRnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHtcblx0XHR2YXIgc2NyaXB0LFxuXHRcdFx0aW5kaXJlY3QgPSBldmFsO1xuXG5cdFx0Y29kZSA9IGpRdWVyeS50cmltKCBjb2RlICk7XG5cblx0XHRpZiAoIGNvZGUgKSB7XG5cblx0XHRcdC8vIElmIHRoZSBjb2RlIGluY2x1ZGVzIGEgdmFsaWQsIHByb2xvZ3VlIHBvc2l0aW9uXG5cdFx0XHQvLyBzdHJpY3QgbW9kZSBwcmFnbWEsIGV4ZWN1dGUgY29kZSBieSBpbmplY3RpbmcgYVxuXHRcdFx0Ly8gc2NyaXB0IHRhZyBpbnRvIHRoZSBkb2N1bWVudC5cblx0XHRcdGlmICggY29kZS5pbmRleE9mKCBcInVzZSBzdHJpY3RcIiApID09PSAxICkge1xuXHRcdFx0XHRzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInNjcmlwdFwiICk7XG5cdFx0XHRcdHNjcmlwdC50ZXh0ID0gY29kZTtcblx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0ICkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc2NyaXB0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgYXZvaWQgdGhlIERPTSBub2RlIGNyZWF0aW9uLCBpbnNlcnRpb25cblx0XHRcdFx0Ly8gYW5kIHJlbW92YWwgYnkgdXNpbmcgYW4gaW5kaXJlY3QgZ2xvYmFsIGV2YWxcblxuXHRcdFx0XHRpbmRpcmVjdCggY29kZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzXG5cdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0Ly8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKVxuXHRjYW1lbENhc2U6IGZ1bmN0aW9uKCBzdHJpbmcgKSB7XG5cdFx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsIFwibXMtXCIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7XG5cdH0sXG5cblx0bm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkge1xuXHRcdHZhciBsZW5ndGgsIGkgPSAwO1xuXG5cdFx0aWYgKCBpc0FycmF5TGlrZSggb2JqICkgKSB7XG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gb2JqICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvYmo7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjFcblx0dHJpbTogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0cmV0dXJuIHRleHQgPT0gbnVsbCA/XG5cdFx0XHRcIlwiIDpcblx0XHRcdCggdGV4dCArIFwiXCIgKS5yZXBsYWNlKCBydHJpbSwgXCJcIiApO1xuXHR9LFxuXG5cdC8vIHJlc3VsdHMgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkge1xuXHRcdHZhciByZXQgPSByZXN1bHRzIHx8IFtdO1xuXG5cdFx0aWYgKCBhcnIgIT0gbnVsbCApIHtcblx0XHRcdGlmICggaXNBcnJheUxpa2UoIE9iamVjdCggYXJyICkgKSApIHtcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCByZXQsXG5cdFx0XHRcdFx0dHlwZW9mIGFyciA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0WyBhcnIgXSA6IGFyclxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5jYWxsKCByZXQsIGFyciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0aW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHtcblx0XHRyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7XG5cdH0sXG5cblx0bWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkge1xuXHRcdHZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCxcblx0XHRcdGogPSAwLFxuXHRcdFx0aSA9IGZpcnN0Lmxlbmd0aDtcblxuXHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0Zmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqIF07XG5cdFx0fVxuXG5cdFx0Zmlyc3QubGVuZ3RoID0gaTtcblxuXHRcdHJldHVybiBmaXJzdDtcblx0fSxcblxuXHRncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnZlcnQgKSB7XG5cdFx0dmFyIGNhbGxiYWNrSW52ZXJzZSxcblx0XHRcdG1hdGNoZXMgPSBbXSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoLFxuXHRcdFx0Y2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0O1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtc1xuXHRcdC8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uXG5cdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRjYWxsYmFja0ludmVyc2UgPSAhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTtcblx0XHRcdGlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHtcblx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBlbGVtc1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGNoZXM7XG5cdH0sXG5cblx0Ly8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1hcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgYXJnICkge1xuXHRcdHZhciBsZW5ndGgsIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRyZXQgPSBbXTtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVpciBuZXcgdmFsdWVzXG5cdFx0aWYgKCBpc0FycmF5TGlrZSggZWxlbXMgKSApIHtcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRoZSBvYmplY3QsXG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gZWxlbXMgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0XHRyZXR1cm4gY29uY2F0LmFwcGx5KCBbXSwgcmV0ICk7XG5cdH0sXG5cblx0Ly8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzXG5cdGd1aWQ6IDEsXG5cblx0Ly8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55XG5cdC8vIGFyZ3VtZW50cy5cblx0cHJveHk6IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHtcblx0XHR2YXIgdG1wLCBhcmdzLCBwcm94eTtcblxuXHRcdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHR0bXAgPSBmblsgY29udGV4dCBdO1xuXHRcdFx0Y29udGV4dCA9IGZuO1xuXHRcdFx0Zm4gPSB0bXA7XG5cdFx0fVxuXG5cdFx0Ly8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWNcblx0XHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRcdGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBTaW11bGF0ZWQgYmluZFxuXHRcdGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTtcblx0XHRwcm94eSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdFx0fTtcblxuXHRcdC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZFxuXHRcdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdFx0cmV0dXJuIHByb3h5O1xuXHR9LFxuXG5cdG5vdzogRGF0ZS5ub3csXG5cblx0Ly8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyXG5cdC8vIHByb3BlcnRpZXMgdG8gaXQgc28gaXQgbmVlZHMgdG8gZXhpc3QuXG5cdHN1cHBvcnQ6IHN1cHBvcnRcbn0gKTtcblxuLy8gSlNIaW50IHdvdWxkIGVycm9yIG9uIHRoaXMgY29kZSBkdWUgdG8gdGhlIFN5bWJvbCBub3QgYmVpbmcgZGVmaW5lZCBpbiBFUzUuXG4vLyBEZWZpbmluZyB0aGlzIGdsb2JhbCBpbiAuanNoaW50cmMgd291bGQgY3JlYXRlIGEgZGFuZ2VyIG9mIHVzaW5nIHRoZSBnbG9iYWxcbi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBqdXN0IGRpc2FibGUgSlNIaW50IGZvciB0aGVzZVxuLy8gdGhyZWUgbGluZXMuXG4vKiBqc2hpbnQgaWdub3JlOiBzdGFydCAqL1xuaWYgKCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cdGpRdWVyeS5mblsgU3ltYm9sLml0ZXJhdG9yIF0gPSBhcnJbIFN5bWJvbC5pdGVyYXRvciBdO1xufVxuLyoganNoaW50IGlnbm9yZTogZW5kICovXG5cbi8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcFxualF1ZXJ5LmVhY2goIFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2xcIi5zcGxpdCggXCIgXCIgKSxcbmZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHRjbGFzczJ0eXBlWyBcIltvYmplY3QgXCIgKyBuYW1lICsgXCJdXCIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbn0gKTtcblxuZnVuY3Rpb24gaXNBcnJheUxpa2UoIG9iaiApIHtcblxuXHQvLyBTdXBwb3J0OiBpT1MgOC4yIChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcilcblx0Ly8gYGluYCBjaGVjayB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0yMTQ1KVxuXHQvLyBoYXNPd24gaXNuJ3QgdXNlZCBoZXJlIGR1ZSB0byBmYWxzZSBuZWdhdGl2ZXNcblx0Ly8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRVxuXHR2YXIgbGVuZ3RoID0gISFvYmogJiYgXCJsZW5ndGhcIiBpbiBvYmogJiYgb2JqLmxlbmd0aCxcblx0XHR0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXG5cdGlmICggdHlwZSA9PT0gXCJmdW5jdGlvblwiIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIHR5cGUgPT09IFwiYXJyYXlcIiB8fCBsZW5ndGggPT09IDAgfHxcblx0XHR0eXBlb2YgbGVuZ3RoID09PSBcIm51bWJlclwiICYmIGxlbmd0aCA+IDAgJiYgKCBsZW5ndGggLSAxICkgaW4gb2JqO1xufVxudmFyIFNpenpsZSA9XG4vKiFcbiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjIuMVxuICogaHR0cDovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNS0xMC0xN1xuICovXG4oZnVuY3Rpb24oIHdpbmRvdyApIHtcblxudmFyIGksXG5cdHN1cHBvcnQsXG5cdEV4cHIsXG5cdGdldFRleHQsXG5cdGlzWE1MLFxuXHR0b2tlbml6ZSxcblx0Y29tcGlsZSxcblx0c2VsZWN0LFxuXHRvdXRlcm1vc3RDb250ZXh0LFxuXHRzb3J0SW5wdXQsXG5cdGhhc0R1cGxpY2F0ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdHNldERvY3VtZW50LFxuXHRkb2N1bWVudCxcblx0ZG9jRWxlbSxcblx0ZG9jdW1lbnRJc0hUTUwsXG5cdHJidWdneVFTQSxcblx0cmJ1Z2d5TWF0Y2hlcyxcblx0bWF0Y2hlcyxcblx0Y29udGFpbnMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0gXCJzaXp6bGVcIiArIDEgKiBuZXcgRGF0ZSgpLFxuXHRwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0c29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIDA7XG5cdH0sXG5cblx0Ly8gR2VuZXJhbC1wdXJwb3NlIGNvbnN0YW50c1xuXHRNQVhfTkVHQVRJVkUgPSAxIDw8IDMxLFxuXG5cdC8vIEluc3RhbmNlIG1ldGhvZHNcblx0aGFzT3duID0gKHt9KS5oYXNPd25Qcm9wZXJ0eSxcblx0YXJyID0gW10sXG5cdHBvcCA9IGFyci5wb3AsXG5cdHB1c2hfbmF0aXZlID0gYXJyLnB1c2gsXG5cdHB1c2ggPSBhcnIucHVzaCxcblx0c2xpY2UgPSBhcnIuc2xpY2UsXG5cdC8vIFVzZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBhcyBpdCdzIGZhc3RlciB0aGFuIG5hdGl2ZVxuXHQvLyBodHRwOi8vanNwZXJmLmNvbS90aG9yLWluZGV4b2YtdnMtZm9yLzVcblx0aW5kZXhPZiA9IGZ1bmN0aW9uKCBsaXN0LCBlbGVtICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdGxlbiA9IGxpc3QubGVuZ3RoO1xuXHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0aWYgKCBsaXN0W2ldID09PSBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllclxuXHRpZGVudGlmaWVyID0gXCIoPzpcXFxcXFxcXC58W1xcXFx3LV18W15cXFxceDAwLVxcXFx4YTBdKStcIixcblxuXHQvLyBBdHRyaWJ1dGUgc2VsZWN0b3JzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcblx0YXR0cmlidXRlcyA9IFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBPcGVyYXRvciAoY2FwdHVyZSAyKVxuXHRcdFwiKihbKl4kfCF+XT89KVwiICsgd2hpdGVzcGFjZSArXG5cdFx0Ly8gXCJBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgQ1NTIGlkZW50aWZpZXJzIFtjYXB0dXJlIDVdIG9yIHN0cmluZ3MgW2NhcHR1cmUgMyBvciBjYXB0dXJlIDRdXCJcblx0XHRcIiooPzonKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcJ10pKiknfFxcXCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFxcXFwiXSkqKVxcXCJ8KFwiICsgaWRlbnRpZmllciArIFwiKSl8KVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XCIqXFxcXF1cIixcblxuXHRwc2V1ZG9zID0gXCI6KFwiICsgaWRlbnRpZmllciArIFwiKSg/OlxcXFwoKFwiICtcblx0XHQvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVmZXIgYXJndW1lbnRzOlxuXHRcdC8vIDEuIHF1b3RlZCAoY2FwdHVyZSAzOyBjYXB0dXJlIDQgb3IgY2FwdHVyZSA1KVxuXHRcdFwiKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8XCIgK1xuXHRcdC8vIDIuIHNpbXBsZSAoY2FwdHVyZSA2KVxuXHRcdFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKClbXFxcXF1dfFwiICsgYXR0cmlidXRlcyArIFwiKSopfFwiICtcblx0XHQvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpXG5cdFx0XCIuKlwiICtcblx0XHRcIilcXFxcKXwpXCIsXG5cblx0Ly8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlclxuXHRyd2hpdGVzcGFjZSA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyBcIitcIiwgXCJnXCIgKSxcblx0cnRyaW0gPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIit8KCg/Ol58W15cXFxcXFxcXF0pKD86XFxcXFxcXFwuKSopXCIgKyB3aGl0ZXNwYWNlICsgXCIrJFwiLCBcImdcIiApLFxuXG5cdHJjb21tYSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKixcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXHRyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiooWz4rfl18XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXCIgKSxcblxuXHRyYXR0cmlidXRlUXVvdGVzID0gbmV3IFJlZ0V4cCggXCI9XCIgKyB3aGl0ZXNwYWNlICsgXCIqKFteXFxcXF0nXFxcIl0qPylcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcXVwiLCBcImdcIiApLFxuXG5cdHJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksXG5cdHJpZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggXCJeXCIgKyBpZGVudGlmaWVyICsgXCIkXCIgKSxcblxuXHRtYXRjaEV4cHIgPSB7XG5cdFx0XCJJRFwiOiBuZXcgUmVnRXhwKCBcIl4jKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJDTEFTU1wiOiBuZXcgUmVnRXhwKCBcIl5cXFxcLihcIiArIGlkZW50aWZpZXIgKyBcIilcIiApLFxuXHRcdFwiVEFHXCI6IG5ldyBSZWdFeHAoIFwiXihcIiArIGlkZW50aWZpZXIgKyBcInxbKl0pXCIgKSxcblx0XHRcIkFUVFJcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBhdHRyaWJ1dGVzICksXG5cdFx0XCJQU0VVRE9cIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBwc2V1ZG9zICksXG5cdFx0XCJDSElMRFwiOiBuZXcgUmVnRXhwKCBcIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcXFwoXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihldmVufG9kZHwoKFsrLV18KShcXFxcZCopbnwpXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86KFsrLV18KVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIiooXFxcXGQrKXwpKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfClcIiwgXCJpXCIgKSxcblx0XHRcImJvb2xcIjogbmV3IFJlZ0V4cCggXCJeKD86XCIgKyBib29sZWFucyArIFwiKSRcIiwgXCJpXCIgKSxcblx0XHQvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKClcblx0XHQvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgXG5cdFx0XCJuZWVkc0NvbnRleHRcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXFxcKFwiICtcblx0XHRcdHdoaXRlc3BhY2UgKyBcIiooKD86LVxcXFxkKT9cXFxcZCopXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KSg/PVteLV18JClcIiwgXCJpXCIgKVxuXHR9LFxuXG5cdHJpbnB1dHMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyaGVhZGVyID0gL15oXFxkJC9pLFxuXG5cdHJuYXRpdmUgPSAvXltee10rXFx7XFxzKlxcW25hdGl2ZSBcXHcvLFxuXG5cdC8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9yc1xuXHRycXVpY2tFeHByID0gL14oPzojKFtcXHctXSspfChcXHcrKXxcXC4oW1xcdy1dKykpJC8sXG5cblx0cnNpYmxpbmcgPSAvWyt+XS8sXG5cdHJlc2NhcGUgPSAvJ3xcXFxcL2csXG5cblx0Ly8gQ1NTIGVzY2FwZXMgaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI2VzY2FwZWQtY2hhcmFjdGVyc1xuXHRydW5lc2NhcGUgPSBuZXcgUmVnRXhwKCBcIlxcXFxcXFxcKFtcXFxcZGEtZl17MSw2fVwiICsgd2hpdGVzcGFjZSArIFwiP3woXCIgKyB3aGl0ZXNwYWNlICsgXCIpfC4pXCIsIFwiaWdcIiApLFxuXHRmdW5lc2NhcGUgPSBmdW5jdGlvbiggXywgZXNjYXBlZCwgZXNjYXBlZFdoaXRlc3BhY2UgKSB7XG5cdFx0dmFyIGhpZ2ggPSBcIjB4XCIgKyBlc2NhcGVkIC0gMHgxMDAwMDtcblx0XHQvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludFxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjRcblx0XHQvLyBXb3JrYXJvdW5kIGVycm9uZW91cyBudW1lcmljIGludGVycHJldGF0aW9uIG9mICtcIjB4XCJcblx0XHRyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/XG5cdFx0XHRlc2NhcGVkIDpcblx0XHRcdGhpZ2ggPCAwID9cblx0XHRcdFx0Ly8gQk1QIGNvZGVwb2ludFxuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDpcblx0XHRcdFx0Ly8gU3VwcGxlbWVudGFsIFBsYW5lIGNvZGVwb2ludCAoc3Vycm9nYXRlIHBhaXIpXG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCApO1xuXHR9LFxuXG5cdC8vIFVzZWQgZm9yIGlmcmFtZXNcblx0Ly8gU2VlIHNldERvY3VtZW50KClcblx0Ly8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgXCJQZXJtaXNzaW9uIERlbmllZFwiXG5cdC8vIGVycm9yIGluIElFXG5cdHVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcblx0XHRzZXREb2N1bWVudCgpO1xuXHR9O1xuXG4vLyBPcHRpbWl6ZSBmb3IgcHVzaC5hcHBseSggXywgTm9kZUxpc3QgKVxudHJ5IHtcblx0cHVzaC5hcHBseShcblx0XHQoYXJyID0gc2xpY2UuY2FsbCggcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMgKSksXG5cdFx0cHJlZmVycmVkRG9jLmNoaWxkTm9kZXNcblx0KTtcblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjBcblx0Ly8gRGV0ZWN0IHNpbGVudGx5IGZhaWxpbmcgcHVzaC5hcHBseVxuXHRhcnJbIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzLmxlbmd0aCBdLm5vZGVUeXBlO1xufSBjYXRjaCAoIGUgKSB7XG5cdHB1c2ggPSB7IGFwcGx5OiBhcnIubGVuZ3RoID9cblxuXHRcdC8vIExldmVyYWdlIHNsaWNlIGlmIHBvc3NpYmxlXG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0cHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7XG5cdFx0fSA6XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZCBkaXJlY3RseVxuXHRcdGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHZhciBqID0gdGFyZ2V0Lmxlbmd0aCxcblx0XHRcdFx0aSA9IDA7XG5cdFx0XHQvLyBDYW4ndCB0cnVzdCBOb2RlTGlzdC5sZW5ndGhcblx0XHRcdHdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge31cblx0XHRcdHRhcmdldC5sZW5ndGggPSBqIC0gMTtcblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBtLCBpLCBlbGVtLCBuaWQsIG5pZHNlbGVjdCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXG5cdFx0aWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHtcblx0XHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0fVxuXHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdFx0Ly8gSWYgdGhlIHNlbGVjdG9yIGlzIHN1ZmZpY2llbnRseSBzaW1wbGUsIHRyeSB1c2luZyBhIFwiZ2V0KkJ5KlwiIERPTSBtZXRob2Rcblx0XHRcdC8vIChleGNlcHRpbmcgRG9jdW1lbnRGcmFnbWVudCBjb250ZXh0LCB3aGVyZSB0aGUgbWV0aG9kcyBkb24ndCBleGlzdClcblx0XHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmIChtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0Ly8gSUQgc2VsZWN0b3Jcblx0XHRcdFx0aWYgKCAobSA9IG1hdGNoWzFdKSApIHtcblxuXHRcdFx0XHRcdC8vIERvY3VtZW50IGNvbnRleHRcblx0XHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnNcblx0XHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0XHRpZiAoIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRWxlbWVudCBjb250ZXh0XG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHRcdC8vIENsYXNzIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJlxuXHRcdFx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0aWYgKCBzdXBwb3J0LnFzYSAmJlxuXHRcdFx0XHQhY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdICYmXG5cdFx0XHRcdCghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gY29udGV4dDtcblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IHNlbGVjdG9yO1xuXG5cdFx0XHRcdC8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudFxuXHRcdFx0XHQvLyBUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhpcyB3b3JrYXJvdW5kIHRlY2huaXF1ZVxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PThcblx0XHRcdFx0Ly8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHNcblx0XHRcdFx0fSBlbHNlIGlmICggY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2FwdHVyZSB0aGUgY29udGV4dCBJRCwgc2V0dGluZyBpdCBmaXJzdCBpZiBuZWNlc3Nhcnlcblx0XHRcdFx0XHRpZiAoIChuaWQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggXCJpZFwiICkpICkge1xuXHRcdFx0XHRcdFx0bmlkID0gbmlkLnJlcGxhY2UoIHJlc2NhcGUsIFwiXFxcXCQmXCIgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgKG5pZCA9IGV4cGFuZG8pICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0XG5cdFx0XHRcdFx0Z3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0XHRcdFx0aSA9IGdyb3Vwcy5sZW5ndGg7XG5cdFx0XHRcdFx0bmlkc2VsZWN0ID0gcmlkZW50aWZpZXIudGVzdCggbmlkICkgPyBcIiNcIiArIG5pZCA6IFwiW2lkPSdcIiArIG5pZCArIFwiJ11cIjtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGdyb3Vwc1tpXSA9IG5pZHNlbGVjdCArIFwiIFwiICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIFwiLFwiICk7XG5cblx0XHRcdFx0XHQvLyBFeHBhbmQgY29udGV4dCBmb3Igc2libGluZyBzZWxlY3RvcnNcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHxcblx0XHRcdFx0XHRcdGNvbnRleHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIG5ld1NlbGVjdG9yICkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0XHRuZXdDb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIG5ld1NlbGVjdG9yIClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9IGNhdGNoICggcXNhRXJyb3IgKSB7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdGlmICggbmlkID09PSBleHBhbmRvICkge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cdFx0Ly8gVXNlIChrZXkgKyBcIiBcIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChzZWUgSXNzdWUgIzE1Nylcblx0XHRpZiAoIGtleXMucHVzaCgga2V5ICsgXCIgXCIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoY2FjaGVbIGtleSArIFwiIFwiIF0gPSB2YWx1ZSk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZGl2IGFuZCBleHBlY3RzIGEgYm9vbGVhbiByZXN1bHRcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0KCBmbiApIHtcblx0dmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cblx0dHJ5IHtcblx0XHRyZXR1cm4gISFmbiggZGl2ICk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZmluYWxseSB7XG5cdFx0Ly8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0XG5cdFx0aWYgKCBkaXYucGFyZW50Tm9kZSApIHtcblx0XHRcdGRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBkaXYgKTtcblx0XHR9XG5cdFx0Ly8gcmVsZWFzZSBtZW1vcnkgaW4gSUVcblx0XHRkaXYgPSBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRyc1xuICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkXG4gKi9cbmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7XG5cdHZhciBhcnIgPSBhdHRycy5zcGxpdChcInxcIiksXG5cdFx0aSA9IGFyci5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0RXhwci5hdHRySGFuZGxlWyBhcnJbaV0gXSA9IGhhbmRsZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYlxuICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiXG4gKi9cbmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHtcblx0dmFyIGN1ciA9IGIgJiYgYSxcblx0XHRkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0KCB+Yi5zb3VyY2VJbmRleCB8fCBNQVhfTkVHQVRJVkUgKSAtXG5cdFx0XHQoIH5hLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApO1xuXG5cdC8vIFVzZSBJRSBzb3VyY2VJbmRleCBpZiBhdmFpbGFibGUgb24gYm90aCBub2Rlc1xuXHRpZiAoIGRpZmYgKSB7XG5cdFx0cmV0dXJuIGRpZmY7XG5cdH1cblxuXHQvLyBDaGVjayBpZiBiIGZvbGxvd3MgYVxuXHRpZiAoIGN1ciApIHtcblx0XHR3aGlsZSAoIChjdXIgPSBjdXIubmV4dFNpYmxpbmcpICkge1xuXHRcdFx0aWYgKCBjdXIgPT09IGIgKSB7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYSA/IDEgOiAtMTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGlucHV0IHR5cGVzXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9uc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIChuYW1lID09PSBcImlucHV0XCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIikgJiYgZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgcG9zaXRpb25hbHNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZuICkge1xuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBhcmd1bWVudCApIHtcblx0XHRhcmd1bWVudCA9ICthcmd1bWVudDtcblx0XHRyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkge1xuXHRcdFx0dmFyIGosXG5cdFx0XHRcdG1hdGNoSW5kZXhlcyA9IGZuKCBbXSwgc2VlZC5sZW5ndGgsIGFyZ3VtZW50ICksXG5cdFx0XHRcdGkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoO1xuXG5cdFx0XHQvLyBNYXRjaCBlbGVtZW50cyBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4ZXNcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoIHNlZWRbIChqID0gbWF0Y2hJbmRleGVzW2ldKSBdICkge1xuXHRcdFx0XHRcdHNlZWRbal0gPSAhKG1hdGNoZXNbal0gPSBzZWVkW2pdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgYSBub2RlIGZvciB2YWxpZGl0eSBhcyBhIFNpenpsZSBjb250ZXh0XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dFxuICogQHJldHVybnMge0VsZW1lbnR8T2JqZWN0fEJvb2xlYW59IFRoZSBpbnB1dCBub2RlIGlmIGFjY2VwdGFibGUsIG90aGVyd2lzZSBhIGZhbHN5IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkge1xuXHRyZXR1cm4gY29udGV4dCAmJiB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb250ZXh0O1xufVxuXG4vLyBFeHBvc2Ugc3VwcG9ydCB2YXJzIGZvciBjb252ZW5pZW5jZVxuc3VwcG9ydCA9IFNpenpsZS5zdXBwb3J0ID0ge307XG5cbi8qKlxuICogRGV0ZWN0cyBYTUwgbm9kZXNcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZmYgZWxlbSBpcyBhIG5vbi1IVE1MIFhNTCBub2RlXG4gKi9cbmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdC8vIGRvY3VtZW50RWxlbWVudCBpcyB2ZXJpZmllZCBmb3IgY2FzZXMgd2hlcmUgaXQgZG9lc24ndCB5ZXQgZXhpc3Rcblx0Ly8gKHN1Y2ggYXMgbG9hZGluZyBpZnJhbWVzIGluIElFIC0gIzQ4MzMpXG5cdHZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50O1xuXHRyZXR1cm4gZG9jdW1lbnRFbGVtZW50ID8gZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lICE9PSBcIkhUTUxcIiA6IGZhbHNlO1xufTtcblxuLyoqXG4gKiBTZXRzIGRvY3VtZW50LXJlbGF0ZWQgdmFyaWFibGVzIG9uY2UgYmFzZWQgb24gdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKi9cbnNldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7XG5cdHZhciBoYXNDb21wYXJlLCBwYXJlbnQsXG5cdFx0ZG9jID0gbm9kZSA/IG5vZGUub3duZXJEb2N1bWVudCB8fCBub2RlIDogcHJlZmVycmVkRG9jO1xuXG5cdC8vIFJldHVybiBlYXJseSBpZiBkb2MgaXMgaW52YWxpZCBvciBhbHJlYWR5IHNlbGVjdGVkXG5cdGlmICggZG9jID09PSBkb2N1bWVudCB8fCBkb2Mubm9kZVR5cGUgIT09IDkgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQgKSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50O1xuXHR9XG5cblx0Ly8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXNcblx0ZG9jdW1lbnQgPSBkb2M7XG5cdGRvY0VsZW0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cdGRvY3VtZW50SXNIVE1MID0gIWlzWE1MKCBkb2N1bWVudCApO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDktMTEsIEVkZ2Vcblx0Ly8gQWNjZXNzaW5nIGlmcmFtZSBkb2N1bWVudHMgYWZ0ZXIgdW5sb2FkIHRocm93cyBcInBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3JzIChqUXVlcnkgIzEzOTM2KVxuXHRpZiAoIChwYXJlbnQgPSBkb2N1bWVudC5kZWZhdWx0VmlldykgJiYgcGFyZW50LnRvcCAhPT0gcGFyZW50ICkge1xuXHRcdC8vIFN1cHBvcnQ6IElFIDExXG5cdFx0aWYgKCBwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lciApIHtcblx0XHRcdHBhcmVudC5hZGRFdmVudExpc3RlbmVyKCBcInVubG9hZFwiLCB1bmxvYWRIYW5kbGVyLCBmYWxzZSApO1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDEwIG9ubHlcblx0XHR9IGVsc2UgaWYgKCBwYXJlbnQuYXR0YWNoRXZlbnQgKSB7XG5cdFx0XHRwYXJlbnQuYXR0YWNoRXZlbnQoIFwib251bmxvYWRcIiwgdW5sb2FkSGFuZGxlciApO1xuXHRcdH1cblx0fVxuXG5cdC8qIEF0dHJpYnV0ZXNcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFN1cHBvcnQ6IElFPDhcblx0Ly8gVmVyaWZ5IHRoYXQgZ2V0QXR0cmlidXRlIHJlYWxseSByZXR1cm5zIGF0dHJpYnV0ZXMgYW5kIG5vdCBwcm9wZXJ0aWVzXG5cdC8vIChleGNlcHRpbmcgSUU4IGJvb2xlYW5zKVxuXHRzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRkaXYuY2xhc3NOYW1lID0gXCJpXCI7XG5cdFx0cmV0dXJuICFkaXYuZ2V0QXR0cmlidXRlKFwiY2xhc3NOYW1lXCIpO1xuXHR9KTtcblxuXHQvKiBnZXRFbGVtZW50KHMpQnkqXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikgcmV0dXJucyBvbmx5IGVsZW1lbnRzXG5cdHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoXCJcIikgKTtcblx0XHRyZXR1cm4gIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBTdXBwb3J0OiBJRTw5XG5cdHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApO1xuXG5cdC8vIFN1cHBvcnQ6IElFPDEwXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZVxuXHQvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtYXRpY2FsbHktc2V0IG5hbWVzLFxuXHQvLyBzbyB1c2UgYSByb3VuZGFib3V0IGdldEVsZW1lbnRzQnlOYW1lIHRlc3Rcblx0c3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggZGl2ICkuaWQgPSBleHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBJRCBmaW5kIGFuZCBmaWx0ZXJcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maW5kW1wiSURcIl0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0XHR2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7XG5cdFx0XHRcdHJldHVybiBtID8gWyBtIF0gOiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdEV4cHIuZmlsdGVyW1wiSURcIl0gPSBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHQvLyBTdXBwb3J0OiBJRTYvN1xuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRkZWxldGUgRXhwci5maW5kW1wiSURcIl07XG5cblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZFtcIlRBR1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgP1xuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgZG9uJ3QgaGF2ZSBnRUJUTlxuXHRcdFx0fSBlbHNlIGlmICggc3VwcG9ydC5xc2EgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyApO1xuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHR0bXAgPSBbXSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdC8vIEJ5IGhhcHB5IGNvaW5jaWRlbmNlLCBhIChicm9rZW4pIGdFQlROIGFwcGVhcnMgb24gRG9jdW1lbnRGcmFnbWVudCBub2RlcyB0b29cblx0XHRcdFx0cmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzXG5cdFx0XHRpZiAoIHRhZyA9PT0gXCIqXCIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdHRtcC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRtcDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdH07XG5cblx0Ly8gQ2xhc3Ncblx0RXhwci5maW5kW1wiQ0xBU1NcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHtcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTMzNzhcblx0cmJ1Z2d5UVNBID0gW107XG5cblx0aWYgKCAoc3VwcG9ydC5xc2EgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgKSkgKSB7XG5cdFx0Ly8gQnVpbGQgUVNBIHJlZ2V4XG5cdFx0Ly8gUmVnZXggc3RyYXRlZ3kgYWRvcHRlZCBmcm9tIERpZWdvIFBlcmluaVxuXHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OVxuXHRcdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggZGl2ICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxyXFxcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2hoNDY1Mzg4LmFzcHgjYXR0cmlidXRlX3NlY3Rpb25cblx0XHRcdGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbc2VsZWN0ZWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooPzp2YWx1ZXxcIiArIGJvb2xlYW5zICsgXCIpXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lPDI5LCBBbmRyb2lkPDQuNCwgU2FmYXJpPDcuMCssIGlPUzw3LjArLCBQaGFudG9tSlM8MS45LjgrXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCggXCJbaWR+PVwiICsgZXhwYW5kbyArIFwiLV1cIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCJ+PVwiKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkXG5cdFx0XHQvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0c1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCI6Y2hlY2tlZFwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiOmNoZWNrZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4KywgaU9TIDgrXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2ODUxXG5cdFx0XHQvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJpbmctY29tYmluYXRvciBzZWxlY3RvcmAgZmFpbHNcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIi4jLitbK35dXCIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0XHQvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHNcblx0XHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdFx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwiRFwiICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gRW5mb3JjZSBjYXNlLXNlbnNpdGl2aXR5IG9mIG5hbWUgYXR0cmlidXRlXG5cdFx0XHRpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW25hbWU9ZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJuYW1lXCIgKyB3aGl0ZXNwYWNlICsgXCIqWypeJHwhfl0/PVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpXG5cdFx0XHQvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0c1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCI6ZW5hYmxlZFwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3BlcmEgMTAtMTEgZG9lcyBub3QgdGhyb3cgb24gcG9zdC1jb21tYSBpbnZhbGlkIHBzZXVkb3Ncblx0XHRcdGRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiKiw6eFwiKTtcblx0XHRcdHJidWdneVFTQS5wdXNoKFwiLC4qOlwiKTtcblx0XHR9KTtcblx0fVxuXG5cdGlmICggKHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yID0gcm5hdGl2ZS50ZXN0KCAobWF0Y2hlcyA9IGRvY0VsZW0ubWF0Y2hlcyB8fFxuXHRcdGRvY0VsZW0ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tb3pNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm9NYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1zTWF0Y2hlc1NlbGVjdG9yKSApKSApIHtcblxuXHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZGl2LCBcImRpdlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZGl2LCBcIltzIT0nJ106eFwiICk7XG5cdFx0XHRyYnVnZ3lNYXRjaGVzLnB1c2goIFwiIT1cIiwgcHNldWRvcyApO1xuXHRcdH0pO1xuXHR9XG5cblx0cmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbihcInxcIikgKTtcblx0cmJ1Z2d5TWF0Y2hlcyA9IHJidWdneU1hdGNoZXMubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneU1hdGNoZXMuam9pbihcInxcIikgKTtcblxuXHQvKiBDb250YWluc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cdGhhc0NvbXBhcmUgPSBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29tcGFyZURvY3VtZW50UG9zaXRpb24gKTtcblxuXHQvLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXJcblx0Ly8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlXG5cdC8vIEFzIGluLCBhbiBlbGVtZW50IGRvZXMgbm90IGNvbnRhaW4gaXRzZWxmXG5cdGNvbnRhaW5zID0gaGFzQ29tcGFyZSB8fCBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29udGFpbnMgKSA/XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHR2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09PSA5ID8gYS5kb2N1bWVudEVsZW1lbnQgOiBhLFxuXHRcdFx0XHRidXAgPSBiICYmIGIucGFyZW50Tm9kZTtcblx0XHRcdHJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYgKFxuXHRcdFx0XHRhZG93bi5jb250YWlucyA/XG5cdFx0XHRcdFx0YWRvd24uY29udGFpbnMoIGJ1cCApIDpcblx0XHRcdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGJ1cCApICYgMTZcblx0XHRcdCkpO1xuXHRcdH0gOlxuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0aWYgKCBiICkge1xuXHRcdFx0XHR3aGlsZSAoIChiID0gYi5wYXJlbnROb2RlKSApIHtcblx0XHRcdFx0XHRpZiAoIGIgPT09IGEgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdC8qIFNvcnRpbmdcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmdcblx0c29ydE9yZGVyID0gaGFzQ29tcGFyZSA/XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXG5cdFx0Ly8gRmxhZyBmb3IgZHVwbGljYXRlIHJlbW92YWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0Ly8gU29ydCBvbiBtZXRob2QgZXhpc3RlbmNlIGlmIG9ubHkgb25lIGlucHV0IGhhcyBjb21wYXJlRG9jdW1lbnRQb3NpdGlvblxuXHRcdHZhciBjb21wYXJlID0gIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gLSAhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtcblx0XHRpZiAoIGNvbXBhcmUgKSB7XG5cdFx0XHRyZXR1cm4gY29tcGFyZTtcblx0XHR9XG5cblx0XHQvLyBDYWxjdWxhdGUgcG9zaXRpb24gaWYgYm90aCBpbnB1dHMgYmVsb25nIHRvIHRoZSBzYW1lIGRvY3VtZW50XG5cdFx0Y29tcGFyZSA9ICggYS5vd25lckRvY3VtZW50IHx8IGEgKSA9PT0gKCBiLm93bmVyRG9jdW1lbnQgfHwgYiApID9cblx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGIgKSA6XG5cblx0XHRcdC8vIE90aGVyd2lzZSB3ZSBrbm93IHRoZXkgYXJlIGRpc2Nvbm5lY3RlZFxuXHRcdFx0MTtcblxuXHRcdC8vIERpc2Nvbm5lY3RlZCBub2Rlc1xuXHRcdGlmICggY29tcGFyZSAmIDEgfHxcblx0XHRcdCghc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSApID09PSBjb21wYXJlKSApIHtcblxuXHRcdFx0Ly8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50XG5cdFx0XHRpZiAoIGEgPT09IGRvY3VtZW50IHx8IGEub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYSkgKSB7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHRcdGlmICggYiA9PT0gZG9jdW1lbnQgfHwgYi5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBiKSApIHtcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1haW50YWluIG9yaWdpbmFsIG9yZGVyXG5cdFx0XHRyZXR1cm4gc29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21wYXJlICYgNCA/IC0xIDogMTtcblx0fSA6XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdC8vIEV4aXQgZWFybHkgaWYgdGhlIG5vZGVzIGFyZSBpZGVudGljYWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0YXVwID0gYS5wYXJlbnROb2RlLFxuXHRcdFx0YnVwID0gYi5wYXJlbnROb2RlLFxuXHRcdFx0YXAgPSBbIGEgXSxcblx0XHRcdGJwID0gWyBiIF07XG5cblx0XHQvLyBQYXJlbnRsZXNzIG5vZGVzIGFyZSBlaXRoZXIgZG9jdW1lbnRzIG9yIGRpc2Nvbm5lY3RlZFxuXHRcdGlmICggIWF1cCB8fCAhYnVwICkge1xuXHRcdFx0cmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOlxuXHRcdFx0XHRiID09PSBkb2N1bWVudCA/IDEgOlxuXHRcdFx0XHRhdXAgPyAtMSA6XG5cdFx0XHRcdGJ1cCA/IDEgOlxuXHRcdFx0XHRzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cblx0XHQvLyBJZiB0aGUgbm9kZXMgYXJlIHNpYmxpbmdzLCB3ZSBjYW4gZG8gYSBxdWljayBjaGVja1xuXHRcdH0gZWxzZSBpZiAoIGF1cCA9PT0gYnVwICkge1xuXHRcdFx0cmV0dXJuIHNpYmxpbmdDaGVjayggYSwgYiApO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uXG5cdFx0Y3VyID0gYTtcblx0XHR3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7XG5cdFx0XHRhcC51bnNoaWZ0KCBjdXIgKTtcblx0XHR9XG5cdFx0Y3VyID0gYjtcblx0XHR3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7XG5cdFx0XHRicC51bnNoaWZ0KCBjdXIgKTtcblx0XHR9XG5cblx0XHQvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeVxuXHRcdHdoaWxlICggYXBbaV0gPT09IGJwW2ldICkge1xuXHRcdFx0aSsrO1xuXHRcdH1cblxuXHRcdHJldHVybiBpID9cblx0XHRcdC8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvclxuXHRcdFx0c2libGluZ0NoZWNrKCBhcFtpXSwgYnBbaV0gKSA6XG5cblx0XHRcdC8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdFxuXHRcdFx0YXBbaV0gPT09IHByZWZlcnJlZERvYyA/IC0xIDpcblx0XHRcdGJwW2ldID09PSBwcmVmZXJyZWREb2MgPyAxIDpcblx0XHRcdDA7XG5cdH07XG5cblx0cmV0dXJuIGRvY3VtZW50O1xufTtcblxuU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgZWxlbWVudHMgKSB7XG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7XG59O1xuXG5TaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdC8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZFxuXHRleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCBcIj0nJDEnXVwiICk7XG5cblx0aWYgKCBzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciAmJiBkb2N1bWVudElzSFRNTCAmJlxuXHRcdCFjb21waWxlckNhY2hlWyBleHByICsgXCIgXCIgXSAmJlxuXHRcdCggIXJidWdneU1hdGNoZXMgfHwgIXJidWdneU1hdGNoZXMudGVzdCggZXhwciApICkgJiZcblx0XHQoICFyYnVnZ3lRU0EgICAgIHx8ICFyYnVnZ3lRU0EudGVzdCggZXhwciApICkgKSB7XG5cblx0XHR0cnkge1xuXHRcdFx0dmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApO1xuXG5cdFx0XHQvLyBJRSA5J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0XHRpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8XG5cdFx0XHRcdFx0Ly8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnRcblx0XHRcdFx0XHQvLyBmcmFnbWVudCBpbiBJRSA5XG5cdFx0XHRcdFx0ZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7fVxuXHR9XG5cblx0cmV0dXJuIFNpenpsZSggZXhwciwgZG9jdW1lbnQsIG51bGwsIFsgZWxlbSBdICkubGVuZ3RoID4gMDtcbn07XG5cblNpenpsZS5jb250YWlucyA9IGZ1bmN0aW9uKCBjb250ZXh0LCBlbGVtICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblx0cmV0dXJuIGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICk7XG59O1xuXG5TaXp6bGUuYXR0ciA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdH1cblxuXHR2YXIgZm4gPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUudG9Mb3dlckNhc2UoKSBdLFxuXHRcdC8vIERvbid0IGdldCBmb29sZWQgYnkgT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzIChqUXVlcnkgIzEzODA3KVxuXHRcdHZhbCA9IGZuICYmIGhhc093bi5jYWxsKCBFeHByLmF0dHJIYW5kbGUsIG5hbWUudG9Mb3dlckNhc2UoKSApID9cblx0XHRcdGZuKCBlbGVtLCBuYW1lLCAhZG9jdW1lbnRJc0hUTUwgKSA6XG5cdFx0XHR1bmRlZmluZWQ7XG5cblx0cmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID9cblx0XHR2YWwgOlxuXHRcdHN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSA6XG5cdFx0XHQodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0bnVsbDtcbn07XG5cblNpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdHRocm93IG5ldyBFcnJvciggXCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiBcIiArIG1zZyApO1xufTtcblxuLyoqXG4gKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzXG4gKiBAcGFyYW0ge0FycmF5TGlrZX0gcmVzdWx0c1xuICovXG5TaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkge1xuXHR2YXIgZWxlbSxcblx0XHRkdXBsaWNhdGVzID0gW10sXG5cdFx0aiA9IDAsXG5cdFx0aSA9IDA7XG5cblx0Ly8gVW5sZXNzIHdlICprbm93KiB3ZSBjYW4gZGV0ZWN0IGR1cGxpY2F0ZXMsIGFzc3VtZSB0aGVpciBwcmVzZW5jZVxuXHRoYXNEdXBsaWNhdGUgPSAhc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzO1xuXHRzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTtcblx0cmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTtcblxuXHRpZiAoIGhhc0R1cGxpY2F0ZSApIHtcblx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdGlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkge1xuXHRcdFx0XHRqID0gZHVwbGljYXRlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0cmVzdWx0cy5zcGxpY2UoIGR1cGxpY2F0ZXNbIGogXSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdC8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9wdWxsLzIyNVxuXHRzb3J0SW5wdXQgPSBudWxsO1xuXG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2Rlc1xuICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtXG4gKi9cbmdldFRleHQgPSBTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHR2YXIgbm9kZSxcblx0XHRyZXQgPSBcIlwiLFxuXHRcdGkgPSAwLFxuXHRcdG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRpZiAoICFub2RlVHlwZSApIHtcblx0XHQvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheVxuXHRcdHdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkge1xuXHRcdFx0Ly8gRG8gbm90IHRyYXZlcnNlIGNvbW1lbnQgbm9kZXNcblx0XHRcdHJldCArPSBnZXRUZXh0KCBub2RlICk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7XG5cdFx0Ly8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50c1xuXHRcdC8vIGlubmVyVGV4dCB1c2FnZSByZW1vdmVkIGZvciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKGpRdWVyeSAjMTExNTMpXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLnRleHRDb250ZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUcmF2ZXJzZSBpdHMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRyZXQgKz0gZ2V0VGV4dCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVZhbHVlO1xuXHR9XG5cdC8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2Rlc1xuXG5cdHJldHVybiByZXQ7XG59O1xuXG5FeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHtcblxuXHQvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXJcblx0Y2FjaGVMZW5ndGg6IDUwLFxuXG5cdGNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLFxuXG5cdG1hdGNoOiBtYXRjaEV4cHIsXG5cblx0YXR0ckhhbmRsZToge30sXG5cblx0ZmluZDoge30sXG5cblx0cmVsYXRpdmU6IHtcblx0XHRcIj5cIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiIFwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIgfSxcblx0XHRcIitcIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCJ+XCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiIH1cblx0fSxcblxuXHRwcmVGaWx0ZXI6IHtcblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0bWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHQvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZFxuXHRcdFx0bWF0Y2hbM10gPSAoIG1hdGNoWzNdIHx8IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCIgKS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHRpZiAoIG1hdGNoWzJdID09PSBcIn49XCIgKSB7XG5cdFx0XHRcdG1hdGNoWzNdID0gXCIgXCIgKyBtYXRjaFszXSArIFwiIFwiO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTtcblx0XHR9LFxuXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHQvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByW1wiQ0hJTERcIl1cblx0XHRcdFx0MSB0eXBlIChvbmx5fG50aHwuLi4pXG5cdFx0XHRcdDIgd2hhdCAoY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0MyBhcmd1bWVudCAoZXZlbnxvZGR8XFxkKnxcXGQqbihbKy1dXFxkKyk/fC4uLilcblx0XHRcdFx0NCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cXGQqbnwpXG5cdFx0XHRcdDUgc2lnbiBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NiB4IG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ3IHNpZ24gb2YgeS1jb21wb25lbnRcblx0XHRcdFx0OCB5IG9mIHktY29tcG9uZW50XG5cdFx0XHQqL1xuXHRcdFx0bWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRpZiAoIG1hdGNoWzFdLnNsaWNlKCAwLCAzICkgPT09IFwibnRoXCIgKSB7XG5cdFx0XHRcdC8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50XG5cdFx0XHRcdGlmICggIW1hdGNoWzNdICkge1xuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIG51bWVyaWMgeCBhbmQgeSBwYXJhbWV0ZXJzIGZvciBFeHByLmZpbHRlci5DSElMRFxuXHRcdFx0XHQvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xXG5cdFx0XHRcdG1hdGNoWzRdID0gKyggbWF0Y2hbNF0gPyBtYXRjaFs1XSArIChtYXRjaFs2XSB8fCAxKSA6IDIgKiAoIG1hdGNoWzNdID09PSBcImV2ZW5cIiB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApICk7XG5cdFx0XHRcdG1hdGNoWzVdID0gKyggKCBtYXRjaFs3XSArIG1hdGNoWzhdICkgfHwgbWF0Y2hbM10gPT09IFwib2RkXCIgKTtcblxuXHRcdFx0Ly8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFszXSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdHZhciBleGNlc3MsXG5cdFx0XHRcdHVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdO1xuXG5cdFx0XHRpZiAoIG1hdGNoRXhwcltcIkNISUxEXCJdLnRlc3QoIG1hdGNoWzBdICkgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pc1xuXHRcdFx0aWYgKCBtYXRjaFszXSApIHtcblx0XHRcdFx0bWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTdHJpcCBleGNlc3MgY2hhcmFjdGVycyBmcm9tIHVucXVvdGVkIGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggdW5xdW90ZWQgJiYgcnBzZXVkby50ZXN0KCB1bnF1b3RlZCApICYmXG5cdFx0XHRcdC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpXG5cdFx0XHRcdChleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiZcblx0XHRcdFx0Ly8gYWR2YW5jZSB0byB0aGUgbmV4dCBjbG9zaW5nIHBhcmVudGhlc2lzXG5cdFx0XHRcdChleGNlc3MgPSB1bnF1b3RlZC5pbmRleE9mKCBcIilcIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkge1xuXG5cdFx0XHRcdC8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4XG5cdFx0XHRcdG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0XHRtYXRjaFsyXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTtcblx0XHR9XG5cdH0sXG5cblx0ZmlsdGVyOiB7XG5cblx0XHRcIlRBR1wiOiBmdW5jdGlvbiggbm9kZU5hbWVTZWxlY3RvciApIHtcblx0XHRcdHZhciBub2RlTmFtZSA9IG5vZGVOYW1lU2VsZWN0b3IucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09IFwiKlwiID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9IDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTtcblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJDTEFTU1wiOiBmdW5jdGlvbiggY2xhc3NOYW1lICkge1xuXHRcdFx0dmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyBcIiBcIiBdO1xuXG5cdFx0XHRyZXR1cm4gcGF0dGVybiB8fFxuXHRcdFx0XHQocGF0dGVybiA9IG5ldyBSZWdFeHAoIFwiKF58XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyBjbGFzc05hbWUgKyBcIihcIiArIHdoaXRlc3BhY2UgKyBcInwkKVwiICkpICYmXG5cdFx0XHRcdGNsYXNzQ2FjaGUoIGNsYXNzTmFtZSwgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhdHRlcm4udGVzdCggdHlwZW9mIGVsZW0uY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIgKTtcblx0XHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNoZWNrICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gU2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PSBudWxsICkge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCIhPVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggIW9wZXJhdG9yICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0ICs9IFwiXCI7XG5cblx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIj1cIiA/IHJlc3VsdCA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiE9XCIgPyByZXN1bHQgIT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJePVwiID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIio9XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIkPVwiID8gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ+PVwiID8gKCBcIiBcIiArIHJlc3VsdC5yZXBsYWNlKCByd2hpdGVzcGFjZSwgXCIgXCIgKSArIFwiIFwiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ8PVwiID8gcmVzdWx0ID09PSBjaGVjayB8fCByZXN1bHQuc2xpY2UoIDAsIGNoZWNrLmxlbmd0aCArIDEgKSA9PT0gY2hlY2sgKyBcIi1cIiA6XG5cdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBhcmd1bWVudCwgZmlyc3QsIGxhc3QgKSB7XG5cdFx0XHR2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSBcIm50aFwiLFxuXHRcdFx0XHRmb3J3YXJkID0gdHlwZS5zbGljZSggLTQgKSAhPT0gXCJsYXN0XCIsXG5cdFx0XHRcdG9mVHlwZSA9IHdoYXQgPT09IFwib2YtdHlwZVwiO1xuXG5cdFx0XHRyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/XG5cblx0XHRcdFx0Ly8gU2hvcnRjdXQgZm9yIDpudGgtKihuKVxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gISFlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRcdH0gOlxuXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGNhY2hlLCB1bmlxdWVDYWNoZSwgb3V0ZXJDYWNoZSwgbm9kZSwgbm9kZUluZGV4LCBzdGFydCxcblx0XHRcdFx0XHRcdGRpciA9IHNpbXBsZSAhPT0gZm9yd2FyZCA/IFwibmV4dFNpYmxpbmdcIiA6IFwicHJldmlvdXNTaWJsaW5nXCIsXG5cdFx0XHRcdFx0XHRwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUsXG5cdFx0XHRcdFx0XHRuYW1lID0gb2ZUeXBlICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxcblx0XHRcdFx0XHRcdHVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLFxuXHRcdFx0XHRcdFx0ZGlmZiA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIDooZmlyc3R8bGFzdHxvbmx5KS0oY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0XHRcdGlmICggc2ltcGxlICkge1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIGRpciApIHtcblx0XHRcdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gbm9kZVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSogKGlmIHdlIGhhdmVuJ3QgeWV0IGRvbmUgc28pXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnQgPSBkaXIgPSB0eXBlID09PSBcIm9ubHlcIiAmJiAhc3RhcnQgJiYgXCJuZXh0U2libGluZ1wiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdO1xuXG5cdFx0XHRcdFx0XHQvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YFxuXHRcdFx0XHRcdFx0aWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleFxuXG5cdFx0XHRcdFx0XHRcdC8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXlcblx0XHRcdFx0XHRcdFx0bm9kZSA9IHBhcmVudDtcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0KG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRjYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0ZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdO1xuXHRcdFx0XHRcdFx0XHRub2RlID0gbm9kZUluZGV4ICYmIHBhcmVudC5jaGlsZE5vZGVzWyBub2RlSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHQoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFdoZW4gZm91bmQsIGNhY2hlIGluZGV4ZXMgb24gYHBhcmVudGAgYW5kIGJyZWFrXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlLm5vZGVUeXBlID09PSAxICYmICsrZGlmZiAmJiBub2RlID09PSBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgbm9kZUluZGV4LCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0XHRub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBkaXJydW5zICYmIGNhY2hlWyAxIF07XG5cdFx0XHRcdFx0XHRcdFx0ZGlmZiA9IG5vZGVJbmRleDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIHhtbCA6bnRoLWNoaWxkKC4uLilcblx0XHRcdFx0XHRcdFx0Ly8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKVxuXHRcdFx0XHRcdFx0XHRpZiAoIGRpZmYgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoICggb2ZUeXBlID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsrZGlmZiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBDYWNoZSB0aGUgaW5kZXggb2YgZWFjaCBlbmNvdW50ZXJlZCBlbGVtZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlID09PSBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEluY29ycG9yYXRlIHRoZSBvZmZzZXQsIHRoZW4gY2hlY2sgYWdhaW5zdCBjeWNsZSBzaXplXG5cdFx0XHRcdFx0XHRkaWZmIC09IGxhc3Q7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkge1xuXHRcdFx0Ly8gcHNldWRvLWNsYXNzIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFzc2VzXG5cdFx0XHQvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVyc1xuXHRcdFx0Ly8gUmVtZW1iZXIgdGhhdCBzZXRGaWx0ZXJzIGluaGVyaXRzIGZyb20gcHNldWRvc1xuXHRcdFx0dmFyIGFyZ3MsXG5cdFx0XHRcdGZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnNldEZpbHRlcnNbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF0gfHxcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgcHNldWRvOiBcIiArIHBzZXVkbyApO1xuXG5cdFx0XHQvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0XG5cdFx0XHQvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvblxuXHRcdFx0Ly8ganVzdCBhcyBTaXp6bGUgZG9lc1xuXHRcdFx0aWYgKCBmblsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRyZXR1cm4gZm4oIGFyZ3VtZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEJ1dCBtYWludGFpbiBzdXBwb3J0IGZvciBvbGQgc2lnbmF0dXJlc1xuXHRcdFx0aWYgKCBmbi5sZW5ndGggPiAxICkge1xuXHRcdFx0XHRhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgXCJcIiwgYXJndW1lbnQgXTtcblx0XHRcdFx0cmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRcdFx0bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkge1xuXHRcdFx0XHRcdFx0dmFyIGlkeCxcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLFxuXHRcdFx0XHRcdFx0XHRpID0gbWF0Y2hlZC5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWR4ID0gaW5kZXhPZiggc2VlZCwgbWF0Y2hlZFtpXSApO1xuXHRcdFx0XHRcdFx0XHRzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pIDpcblx0XHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmbiggZWxlbSwgMCwgYXJncyApO1xuXHRcdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmbjtcblx0XHR9XG5cdH0sXG5cblx0cHNldWRvczoge1xuXHRcdC8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvc1xuXHRcdFwibm90XCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHQvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZVxuXHRcdFx0Ly8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmdcblx0XHRcdC8vIHNwYWNlcyBhcyBjb21iaW5hdG9yc1xuXHRcdFx0dmFyIGlucHV0ID0gW10sXG5cdFx0XHRcdHJlc3VsdHMgPSBbXSxcblx0XHRcdFx0bWF0Y2hlciA9IGNvbXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSApO1xuXG5cdFx0XHRyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID9cblx0XHRcdFx0bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksXG5cdFx0XHRcdFx0XHRpID0gc2VlZC5sZW5ndGg7XG5cblx0XHRcdFx0XHQvLyBNYXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkgYG1hdGNoZXJgXG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0c2VlZFtpXSA9ICEobWF0Y2hlc1tpXSA9IGVsZW0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSkgOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdGlucHV0WzBdID0gZWxlbTtcblx0XHRcdFx0XHRtYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7XG5cdFx0XHRcdFx0Ly8gRG9uJ3Qga2VlcCB0aGUgZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdFx0XHRpbnB1dFswXSA9IG51bGw7XG5cdFx0XHRcdFx0cmV0dXJuICFyZXN1bHRzLnBvcCgpO1xuXHRcdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJoYXNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdFwiY29udGFpbnNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHQvLyBcIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3Jcblx0XHQvLyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZVxuXHRcdC8vIGJlaW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsXG5cdFx0Ly8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBcIi1cIi5cblx0XHQvLyBUaGUgbWF0Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS5cblx0XHQvLyBUaGUgaWRlbnRpZmllciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1lLlwiXG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNsYW5nLXBzZXVkb1xuXHRcdFwibGFuZ1wiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkge1xuXHRcdFx0Ly8gbGFuZyB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllclxuXHRcdFx0aWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8IFwiXCIpICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgbGFuZzogXCIgKyBsYW5nICk7XG5cdFx0XHR9XG5cdFx0XHRsYW5nID0gbGFuZy5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBlbGVtTGFuZztcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGlmICggKGVsZW1MYW5nID0gZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0XHRcdFx0ZWxlbS5sYW5nIDpcblx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpKSApIHtcblxuXHRcdFx0XHRcdFx0ZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5nLmluZGV4T2YoIGxhbmcgKyBcIi1cIiApID09PSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSB3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHQvLyBNaXNjZWxsYW5lb3VzXG5cdFx0XCJ0YXJnZXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDtcblx0XHRcdHJldHVybiBoYXNoICYmIGhhc2guc2xpY2UoIDEgKSA9PT0gZWxlbS5pZDtcblx0XHR9LFxuXG5cdFx0XCJyb290XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY0VsZW07XG5cdFx0fSxcblxuXHRcdFwiZm9jdXNcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpO1xuXHRcdH0sXG5cblx0XHQvLyBCb29sZWFuIHByb3BlcnRpZXNcblx0XHRcImVuYWJsZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2U7XG5cdFx0fSxcblxuXHRcdFwiZGlzYWJsZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0XCJjaGVja2VkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0dmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmICEhZWxlbS5jaGVja2VkKSB8fCAobm9kZU5hbWUgPT09IFwib3B0aW9uXCIgJiYgISFlbGVtLnNlbGVjdGVkKTtcblx0XHR9LFxuXG5cdFx0XCJzZWxlY3RlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHRcblx0XHRcdC8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHlcblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdC8vIENvbnRlbnRzXG5cdFx0XCJlbXB0eVwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvXG5cdFx0XHQvLyA6ZW1wdHkgaXMgbmVnYXRlZCBieSBlbGVtZW50ICgxKSBvciBjb250ZW50IG5vZGVzICh0ZXh0OiAzOyBjZGF0YTogNDsgZW50aXR5IHJlZjogNSksXG5cdFx0XHQvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKVxuXHRcdFx0Ly8gbm9kZVR5cGUgPCA2IHdvcmtzIGJlY2F1c2UgYXR0cmlidXRlcyAoMikgZG8gbm90IGFwcGVhciBhcyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0XCJwYXJlbnRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gIUV4cHIucHNldWRvc1tcImVtcHR5XCJdKCBlbGVtICk7XG5cdFx0fSxcblxuXHRcdC8vIEVsZW1lbnQvaW5wdXQgdHlwZXNcblx0XHRcImhlYWRlclwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJpbnB1dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaW5wdXRzLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJidXR0b25cIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSBcImJ1dHRvblwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCI7XG5cdFx0fSxcblxuXHRcdFwidGV4dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBhdHRyO1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmXG5cdFx0XHRcdGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCIgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRTw4XG5cdFx0XHRcdC8vIE5ldyBIVE1MNSBhdHRyaWJ1dGUgdmFsdWVzIChlLmcuLCBcInNlYXJjaFwiKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09IFwidGV4dFwiXG5cdFx0XHRcdCggKGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIiApO1xuXHRcdH0sXG5cblx0XHQvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uXG5cdFx0XCJmaXJzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFsgMCBdO1xuXHRcdH0pLFxuXG5cdFx0XCJsYXN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIFsgbGVuZ3RoIC0gMSBdO1xuXHRcdH0pLFxuXG5cdFx0XCJlcVwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHRyZXR1cm4gWyBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50IF07XG5cdFx0fSksXG5cblx0XHRcImV2ZW5cIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcIm9kZFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMTtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwibHRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyAtLWkgPj0gMDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJndFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pXG5cdH1cbn07XG5cbkV4cHIucHNldWRvc1tcIm50aFwiXSA9IEV4cHIucHNldWRvc1tcImVxXCJdO1xuXG4vLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvc1xuZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTtcbn1cbmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlQnV0dG9uUHNldWRvKCBpICk7XG59XG5cbi8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVyc1xuZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9XG5zZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRvcztcbkV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7XG5cbnRva2VuaXplID0gU2l6emxlLnRva2VuaXplID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBwYXJzZU9ubHkgKSB7XG5cdHZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLFxuXHRcdHNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsXG5cdFx0Y2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggY2FjaGVkICkge1xuXHRcdHJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7XG5cdH1cblxuXHRzb0ZhciA9IHNlbGVjdG9yO1xuXHRncm91cHMgPSBbXTtcblx0cHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVyO1xuXG5cdHdoaWxlICggc29GYXIgKSB7XG5cblx0XHQvLyBDb21tYSBhbmQgZmlyc3QgcnVuXG5cdFx0aWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7XG5cdFx0XHRpZiAoIG1hdGNoICkge1xuXHRcdFx0XHQvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZFxuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFswXS5sZW5ndGggKSB8fCBzb0Zhcjtcblx0XHRcdH1cblx0XHRcdGdyb3Vwcy5wdXNoKCAodG9rZW5zID0gW10pICk7XG5cdFx0fVxuXG5cdFx0bWF0Y2hlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQ29tYmluYXRvcnNcblx0XHRpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0Ly8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlXG5cdFx0XHRcdHR5cGU6IG1hdGNoWzBdLnJlcGxhY2UoIHJ0cmltLCBcIiBcIiApXG5cdFx0XHR9KTtcblx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmlsdGVyc1xuXHRcdGZvciAoIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7XG5cdFx0XHRpZiAoIChtYXRjaCA9IG1hdGNoRXhwclsgdHlwZSBdLmV4ZWMoIHNvRmFyICkpICYmICghcHJlRmlsdGVyc1sgdHlwZSBdIHx8XG5cdFx0XHRcdChtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkge1xuXHRcdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdFx0bWF0Y2hlczogbWF0Y2hcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCAhbWF0Y2hlZCApIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2Vzc1xuXHQvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmdcblx0Ly8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zXG5cdHJldHVybiBwYXJzZU9ubHkgP1xuXHRcdHNvRmFyLmxlbmd0aCA6XG5cdFx0c29GYXIgP1xuXHRcdFx0U2l6emxlLmVycm9yKCBzZWxlY3RvciApIDpcblx0XHRcdC8vIENhY2hlIHRoZSB0b2tlbnNcblx0XHRcdHRva2VuQ2FjaGUoIHNlbGVjdG9yLCBncm91cHMgKS5zbGljZSggMCApO1xufTtcblxuZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRzZWxlY3RvciA9IFwiXCI7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdHNlbGVjdG9yICs9IHRva2Vuc1tpXS52YWx1ZTtcblx0fVxuXHRyZXR1cm4gc2VsZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7XG5cdHZhciBkaXIgPSBjb21iaW5hdG9yLmRpcixcblx0XHRjaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBkaXIgPT09IFwicGFyZW50Tm9kZVwiLFxuXHRcdGRvbmVOYW1lID0gZG9uZSsrO1xuXG5cdHJldHVybiBjb21iaW5hdG9yLmZpcnN0ID9cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSA6XG5cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGFsbCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudHNcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIG9sZENhY2hlLCB1bmlxdWVDYWNoZSwgb3V0ZXJDYWNoZSxcblx0XHRcdFx0bmV3Q2FjaGUgPSBbIGRpcnJ1bnMsIGRvbmVOYW1lIF07XG5cblx0XHRcdC8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGNvbWJpbmF0b3IgY2FjaGluZ1xuXHRcdFx0aWYgKCB4bWwgKSB7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gZWxlbVsgZXhwYW5kbyBdIHx8IChlbGVtWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gfHwgKG91dGVyQ2FjaGVbIGVsZW0udW5pcXVlSUQgXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0aWYgKCAob2xkQ2FjaGUgPSB1bmlxdWVDYWNoZVsgZGlyIF0pICYmXG5cdFx0XHRcdFx0XHRcdG9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0cmV0dXJuIChuZXdDYWNoZVsgMiBdID0gb2xkQ2FjaGVbIDIgXSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBSZXVzZSBuZXdjYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlWyBkaXIgXSA9IG5ld0NhY2hlO1xuXG5cdFx0XHRcdFx0XHRcdC8vIEEgbWF0Y2ggbWVhbnMgd2UncmUgZG9uZTsgYSBmYWlsIG1lYW5zIHdlIGhhdmUgdG8ga2VlcCBjaGVja2luZ1xuXHRcdFx0XHRcdFx0XHRpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkpICkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcbn1cblxuZnVuY3Rpb24gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICkge1xuXHRyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBpID0gbWF0Y2hlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggIW1hdGNoZXJzW2ldKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gOlxuXHRcdG1hdGNoZXJzWzBdO1xufVxuXG5mdW5jdGlvbiBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciwgY29udGV4dHMsIHJlc3VsdHMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBjb250ZXh0cy5sZW5ndGg7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGNvbmRlbnNlKCB1bm1hdGNoZWQsIG1hcCwgZmlsdGVyLCBjb250ZXh0LCB4bWwgKSB7XG5cdHZhciBlbGVtLFxuXHRcdG5ld1VubWF0Y2hlZCA9IFtdLFxuXHRcdGkgPSAwLFxuXHRcdGxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsXG5cdFx0bWFwcGVkID0gbWFwICE9IG51bGw7XG5cblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0aWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7XG5cdFx0XHRpZiAoICFmaWx0ZXIgfHwgZmlsdGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0bmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0aWYgKCBtYXBwZWQgKSB7XG5cdFx0XHRcdFx0bWFwLnB1c2goIGkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBuZXdVbm1hdGNoZWQ7XG59XG5cbmZ1bmN0aW9uIHNldE1hdGNoZXIoIHByZUZpbHRlciwgc2VsZWN0b3IsIG1hdGNoZXIsIHBvc3RGaWx0ZXIsIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApIHtcblx0aWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTtcblx0fVxuXHRpZiAoIHBvc3RGaW5kZXIgJiYgIXBvc3RGaW5kZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmluZGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICk7XG5cdH1cblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgcmVzdWx0cywgY29udGV4dCwgeG1sICkge1xuXHRcdHZhciB0ZW1wLCBpLCBlbGVtLFxuXHRcdFx0cHJlTWFwID0gW10sXG5cdFx0XHRwb3N0TWFwID0gW10sXG5cdFx0XHRwcmVleGlzdGluZyA9IHJlc3VsdHMubGVuZ3RoLFxuXG5cdFx0XHQvLyBHZXQgaW5pdGlhbCBlbGVtZW50cyBmcm9tIHNlZWQgb3IgY29udGV4dFxuXHRcdFx0ZWxlbXMgPSBzZWVkIHx8IG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yIHx8IFwiKlwiLCBjb250ZXh0Lm5vZGVUeXBlID8gWyBjb250ZXh0IF0gOiBjb250ZXh0LCBbXSApLFxuXG5cdFx0XHQvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb25cblx0XHRcdG1hdGNoZXJJbiA9IHByZUZpbHRlciAmJiAoIHNlZWQgfHwgIXNlbGVjdG9yICkgP1xuXHRcdFx0XHRjb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwgKSA6XG5cdFx0XHRcdGVsZW1zLFxuXG5cdFx0XHRtYXRjaGVyT3V0ID0gbWF0Y2hlciA/XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsXG5cdFx0XHRcdHBvc3RGaW5kZXIgfHwgKCBzZWVkID8gcHJlRmlsdGVyIDogcHJlZXhpc3RpbmcgfHwgcG9zdEZpbHRlciApID9cblxuXHRcdFx0XHRcdC8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeVxuXHRcdFx0XHRcdFtdIDpcblxuXHRcdFx0XHRcdC8vIC4uLm90aGVyd2lzZSB1c2UgcmVzdWx0cyBkaXJlY3RseVxuXHRcdFx0XHRcdHJlc3VsdHMgOlxuXHRcdFx0XHRtYXRjaGVySW47XG5cblx0XHQvLyBGaW5kIHByaW1hcnkgbWF0Y2hlc1xuXHRcdGlmICggbWF0Y2hlciApIHtcblx0XHRcdG1hdGNoZXIoIG1hdGNoZXJJbiwgbWF0Y2hlck91dCwgY29udGV4dCwgeG1sICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcG9zdEZpbHRlclxuXHRcdGlmICggcG9zdEZpbHRlciApIHtcblx0XHRcdHRlbXAgPSBjb25kZW5zZSggbWF0Y2hlck91dCwgcG9zdE1hcCApO1xuXHRcdFx0cG9zdEZpbHRlciggdGVtcCwgW10sIGNvbnRleHQsIHhtbCApO1xuXG5cdFx0XHQvLyBVbi1tYXRjaCBmYWlsaW5nIGVsZW1lbnRzIGJ5IG1vdmluZyB0aGVtIGJhY2sgdG8gbWF0Y2hlckluXG5cdFx0XHRpID0gdGVtcC5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCAoZWxlbSA9IHRlbXBbaV0pICkge1xuXHRcdFx0XHRcdG1hdGNoZXJPdXRbIHBvc3RNYXBbaV0gXSA9ICEobWF0Y2hlckluWyBwb3N0TWFwW2ldIF0gPSBlbGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggc2VlZCApIHtcblx0XHRcdGlmICggcG9zdEZpbmRlciB8fCBwcmVGaWx0ZXIgKSB7XG5cdFx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblx0XHRcdFx0XHQvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4dHNcblx0XHRcdFx0XHR0ZW1wID0gW107XG5cdFx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHQvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaFxuXHRcdFx0XHRcdFx0XHR0ZW1wLnB1c2goIChtYXRjaGVySW5baV0gPSBlbGVtKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVtcCwgeG1sICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBNb3ZlIG1hdGNoZWQgZWxlbWVudHMgZnJvbSBzZWVkIHRvIHJlc3VsdHMgdG8ga2VlcCB0aGVtIHN5bmNocm9uaXplZFxuXHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSAmJlxuXHRcdFx0XHRcdFx0KHRlbXAgPSBwb3N0RmluZGVyID8gaW5kZXhPZiggc2VlZCwgZWxlbSApIDogcHJlTWFwW2ldKSA+IC0xICkge1xuXG5cdFx0XHRcdFx0XHRzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBBZGQgZWxlbWVudHMgdG8gcmVzdWx0cywgdGhyb3VnaCBwb3N0RmluZGVyIGlmIGRlZmluZWRcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlck91dCA9IGNvbmRlbnNlKFxuXHRcdFx0XHRtYXRjaGVyT3V0ID09PSByZXN1bHRzID9cblx0XHRcdFx0XHRtYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3RoICkgOlxuXHRcdFx0XHRcdG1hdGNoZXJPdXRcblx0XHRcdCk7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsIHJlc3VsdHMsIG1hdGNoZXJPdXQsIHhtbCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgbWF0Y2hlck91dCApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXJGcm9tVG9rZW5zKCB0b2tlbnMgKSB7XG5cdHZhciBjaGVja0NvbnRleHQsIG1hdGNoZXIsIGosXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRsZWFkaW5nUmVsYXRpdmUgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMF0udHlwZSBdLFxuXHRcdGltcGxpY2l0UmVsYXRpdmUgPSBsZWFkaW5nUmVsYXRpdmUgfHwgRXhwci5yZWxhdGl2ZVtcIiBcIl0sXG5cdFx0aSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLFxuXG5cdFx0Ly8gVGhlIGZvdW5kYXRpb25hbCBtYXRjaGVyIGVuc3VyZXMgdGhhdCBlbGVtZW50cyBhcmUgcmVhY2hhYmxlIGZyb20gdG9wLWxldmVsIGNvbnRleHQocylcblx0XHRtYXRjaENvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBjaGVja0NvbnRleHQ7XG5cdFx0fSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLFxuXHRcdG1hdGNoQW55Q29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7XG5cdFx0fSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLFxuXHRcdG1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIHJldCA9ICggIWxlYWRpbmdSZWxhdGl2ZSAmJiAoIHhtbCB8fCBjb250ZXh0ICE9PSBvdXRlcm1vc3RDb250ZXh0ICkgKSB8fCAoXG5cdFx0XHRcdChjaGVja0NvbnRleHQgPSBjb250ZXh0KS5ub2RlVHlwZSA/XG5cdFx0XHRcdFx0bWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6XG5cdFx0XHRcdFx0bWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApO1xuXHRcdFx0Ly8gQXZvaWQgaGFuZ2luZyBvbnRvIGVsZW1lbnQgKGlzc3VlICMyOTkpXG5cdFx0XHRjaGVja0NvbnRleHQgPSBudWxsO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9IF07XG5cblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0aWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBlIF0pICkge1xuXHRcdFx0bWF0Y2hlcnMgPSBbIGFkZENvbWJpbmF0b3IoZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksIG1hdGNoZXIpIF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXIgPSBFeHByLmZpbHRlclsgdG9rZW5zW2ldLnR5cGUgXS5hcHBseSggbnVsbCwgdG9rZW5zW2ldLm1hdGNoZXMgKTtcblxuXHRcdFx0Ly8gUmV0dXJuIHNwZWNpYWwgdXBvbiBzZWVpbmcgYSBwb3NpdGlvbmFsIG1hdGNoZXJcblx0XHRcdGlmICggbWF0Y2hlclsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHQvLyBGaW5kIHRoZSBuZXh0IHJlbGF0aXZlIG9wZXJhdG9yIChpZiBhbnkpIGZvciBwcm9wZXIgaGFuZGxpbmdcblx0XHRcdFx0aiA9ICsraTtcblx0XHRcdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyB0b2tlbnNbal0udHlwZSBdICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBzZXRNYXRjaGVyKFxuXHRcdFx0XHRcdGkgPiAxICYmIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLFxuXHRcdFx0XHRcdGkgPiAxICYmIHRvU2VsZWN0b3IoXG5cdFx0XHRcdFx0XHQvLyBJZiB0aGUgcHJlY2VkaW5nIHRva2VuIHdhcyBhIGRlc2NlbmRhbnQgY29tYmluYXRvciwgaW5zZXJ0IGFuIGltcGxpY2l0IGFueS1lbGVtZW50IGAqYFxuXHRcdFx0XHRcdFx0dG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gXCIgXCIgPyBcIipcIiA6IFwiXCIgfSlcblx0XHRcdFx0XHQpLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSxcblx0XHRcdFx0XHRtYXRjaGVyLFxuXHRcdFx0XHRcdGkgPCBqICYmIG1hdGNoZXJGcm9tVG9rZW5zKCB0b2tlbnMuc2xpY2UoIGksIGogKSApLFxuXHRcdFx0XHRcdGogPCBsZW4gJiYgbWF0Y2hlckZyb21Ub2tlbnMoICh0b2tlbnMgPSB0b2tlbnMuc2xpY2UoIGogKSkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIHRvU2VsZWN0b3IoIHRva2VucyApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRtYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSB7XG5cdHZhciBieVNldCA9IHNldE1hdGNoZXJzLmxlbmd0aCA+IDAsXG5cdFx0YnlFbGVtZW50ID0gZWxlbWVudE1hdGNoZXJzLmxlbmd0aCA+IDAsXG5cdFx0c3VwZXJNYXRjaGVyID0gZnVuY3Rpb24oIHNlZWQsIGNvbnRleHQsIHhtbCwgcmVzdWx0cywgb3V0ZXJtb3N0ICkge1xuXHRcdFx0dmFyIGVsZW0sIGosIG1hdGNoZXIsXG5cdFx0XHRcdG1hdGNoZWRDb3VudCA9IDAsXG5cdFx0XHRcdGkgPSBcIjBcIixcblx0XHRcdFx0dW5tYXRjaGVkID0gc2VlZCAmJiBbXSxcblx0XHRcdFx0c2V0TWF0Y2hlZCA9IFtdLFxuXHRcdFx0XHRjb250ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCxcblx0XHRcdFx0Ly8gV2UgbXVzdCBhbHdheXMgaGF2ZSBlaXRoZXIgc2VlZCBlbGVtZW50cyBvciBvdXRlcm1vc3QgY29udGV4dFxuXHRcdFx0XHRlbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFtcIlRBR1wiXSggXCIqXCIsIG91dGVybW9zdCApLFxuXHRcdFx0XHQvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlclxuXHRcdFx0XHRkaXJydW5zVW5pcXVlID0gKGRpcnJ1bnMgKz0gY29udGV4dEJhY2t1cCA9PSBudWxsID8gMSA6IE1hdGgucmFuZG9tKCkgfHwgMC4xKSxcblx0XHRcdFx0bGVuID0gZWxlbXMubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHQgPT09IGRvY3VtZW50IHx8IGNvbnRleHQgfHwgb3V0ZXJtb3N0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgZWxlbWVudHMgcGFzc2luZyBlbGVtZW50TWF0Y2hlcnMgZGlyZWN0bHkgdG8gcmVzdWx0c1xuXHRcdFx0Ly8gU3VwcG9ydDogSUU8OSwgU2FmYXJpXG5cdFx0XHQvLyBUb2xlcmF0ZSBOb2RlTGlzdCBwcm9wZXJ0aWVzIChJRTogXCJsZW5ndGhcIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWRcblx0XHRcdGZvciAoIDsgaSAhPT0gbGVuICYmIChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHRpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0XHRcdFx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHRcdFx0XHRcdFx0eG1sID0gIWRvY3VtZW50SXNIVE1MO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR3aGlsZSAoIChtYXRjaGVyID0gZWxlbWVudE1hdGNoZXJzW2orK10pICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwpICkge1xuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRcdFx0ZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVHJhY2sgdW5tYXRjaGVkIGVsZW1lbnRzIGZvciBzZXQgZmlsdGVyc1xuXHRcdFx0XHRpZiAoIGJ5U2V0ICkge1xuXHRcdFx0XHRcdC8vIFRoZXkgd2lsbCBoYXZlIGdvbmUgdGhyb3VnaCBhbGwgcG9zc2libGUgbWF0Y2hlcnNcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gIW1hdGNoZXIgJiYgZWxlbSkgKSB7XG5cdFx0XHRcdFx0XHRtYXRjaGVkQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90XG5cdFx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdFx0dW5tYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gYGlgIGlzIG5vdyB0aGUgY291bnQgb2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50YFxuXHRcdFx0Ly8gbWFrZXMgdGhlIGxhdHRlciBub25uZWdhdGl2ZS5cblx0XHRcdG1hdGNoZWRDb3VudCArPSBpO1xuXG5cdFx0XHQvLyBBcHBseSBzZXQgZmlsdGVycyB0byB1bm1hdGNoZWQgZWxlbWVudHNcblx0XHRcdC8vIE5PVEU6IFRoaXMgY2FuIGJlIHNraXBwZWQgaWYgdGhlcmUgYXJlIG5vIHVubWF0Y2hlZCBlbGVtZW50cyAoaS5lLiwgYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZpc2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZVxuXHRcdFx0Ly8gbm8gZWxlbWVudCBtYXRjaGVycyBhbmQgbm8gc2VlZC5cblx0XHRcdC8vIEluY3JlbWVudGluZyBhbiBpbml0aWFsbHktc3RyaW5nIFwiMFwiIGBpYCBhbGxvd3MgYGlgIHRvIHJlbWFpbiBhIHN0cmluZyBvbmx5IGluIHRoYXRcblx0XHRcdC8vIGNhc2UsIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgXCIwMFwiIGBtYXRjaGVkQ291bnRgIHRoYXQgZGlmZmVycyBmcm9tIGBpYCBidXQgaXMgYWxzb1xuXHRcdFx0Ly8gbnVtZXJpY2FsbHkgemVyby5cblx0XHRcdGlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkge1xuXHRcdFx0XHRqID0gMDtcblx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IHNldE1hdGNoZXJzW2orK10pICkge1xuXHRcdFx0XHRcdG1hdGNoZXIoIHVubWF0Y2hlZCwgc2V0TWF0Y2hlZCwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRcdFx0Ly8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZ1xuXHRcdFx0XHRcdGlmICggbWF0Y2hlZENvdW50ID4gMCApIHtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHRcdHNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRGlzY2FyZCBpbmRleCBwbGFjZWhvbGRlciB2YWx1ZXMgdG8gZ2V0IG9ubHkgYWN0dWFsIG1hdGNoZXNcblx0XHRcdFx0XHRzZXRNYXRjaGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHNcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hlZCApO1xuXG5cdFx0XHRcdC8vIFNlZWRsZXNzIHNldCBtYXRjaGVzIHN1Y2NlZWRpbmcgbXVsdGlwbGUgc3VjY2Vzc2Z1bCBtYXRjaGVycyBzdGlwdWxhdGUgc29ydGluZ1xuXHRcdFx0XHRpZiAoIG91dGVybW9zdCAmJiAhc2VlZCAmJiBzZXRNYXRjaGVkLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHQoIG1hdGNoZWRDb3VudCArIHNldE1hdGNoZXJzLmxlbmd0aCApID4gMSApIHtcblxuXHRcdFx0XHRcdFNpenpsZS51bmlxdWVTb3J0KCByZXN1bHRzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gT3ZlcnJpZGUgbWFuaXB1bGF0aW9uIG9mIGdsb2JhbHMgYnkgbmVzdGVkIG1hdGNoZXJzXG5cdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0ZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5tYXRjaGVkO1xuXHRcdH07XG5cblx0cmV0dXJuIGJ5U2V0ID9cblx0XHRtYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDpcblx0XHRzdXBlck1hdGNoZXI7XG59XG5cbmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XG5cdHZhciBpLFxuXHRcdHNldE1hdGNoZXJzID0gW10sXG5cdFx0ZWxlbWVudE1hdGNoZXJzID0gW10sXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggIWNhY2hlZCApIHtcblx0XHQvLyBHZW5lcmF0ZSBhIGZ1bmN0aW9uIG9mIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGVjayBlYWNoIGVsZW1lbnRcblx0XHRpZiAoICFtYXRjaCApIHtcblx0XHRcdG1hdGNoID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0fVxuXHRcdGkgPSBtYXRjaC5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRjYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTtcblx0XHRcdGlmICggY2FjaGVkWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhY2hlIHRoZSBjb21waWxlZCBmdW5jdGlvblxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGUoIHNlbGVjdG9yLCBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSApO1xuXG5cdFx0Ly8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uXG5cdFx0Y2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7XG5cdH1cblx0cmV0dXJuIGNhY2hlZDtcbn07XG5cbi8qKlxuICogQSBsb3ctbGV2ZWwgc2VsZWN0aW9uIGZ1bmN0aW9uIHRoYXQgd29ya3Mgd2l0aCBTaXp6bGUncyBjb21waWxlZFxuICogIHNlbGVjdG9yIGZ1bmN0aW9uc1xuICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IHNlbGVjdG9yIEEgc2VsZWN0b3Igb3IgYSBwcmUtY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbiBidWlsdCB3aXRoIFNpenpsZS5jb21waWxlXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHRcbiAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHRzXVxuICogQHBhcmFtIHtBcnJheX0gW3NlZWRdIEEgc2V0IG9mIGVsZW1lbnRzIHRvIG1hdGNoIGFnYWluc3RcbiAqL1xuc2VsZWN0ID0gU2l6emxlLnNlbGVjdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsXG5cdFx0Y29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBzZWxlY3Rvcixcblx0XHRtYXRjaCA9ICFzZWVkICYmIHRva2VuaXplKCAoc2VsZWN0b3IgPSBjb21waWxlZC5zZWxlY3RvciB8fCBzZWxlY3RvcikgKTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBUcnkgdG8gbWluaW1pemUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBzZWxlY3RvciBpbiB0aGUgbGlzdCBhbmQgbm8gc2VlZFxuXHQvLyAodGhlIGxhdHRlciBvZiB3aGljaCBndWFyYW50ZWVzIHVzIGNvbnRleHQpXG5cdGlmICggbWF0Y2gubGVuZ3RoID09PSAxICkge1xuXG5cdFx0Ly8gUmVkdWNlIGNvbnRleHQgaWYgdGhlIGxlYWRpbmcgY29tcG91bmQgc2VsZWN0b3IgaXMgYW4gSURcblx0XHR0b2tlbnMgPSBtYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwICk7XG5cdFx0aWYgKCB0b2tlbnMubGVuZ3RoID4gMiAmJiAodG9rZW4gPSB0b2tlbnNbMF0pLnR5cGUgPT09IFwiSURcIiAmJlxuXHRcdFx0XHRzdXBwb3J0LmdldEJ5SWQgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJlxuXHRcdFx0XHRFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkge1xuXG5cdFx0XHRjb250ZXh0ID0gKCBFeHByLmZpbmRbXCJJRFwiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKHJ1bmVzY2FwZSwgZnVuZXNjYXBlKSwgY29udGV4dCApIHx8IFtdIClbMF07XG5cdFx0XHRpZiAoICFjb250ZXh0ICkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbFxuXHRcdFx0fSBlbHNlIGlmICggY29tcGlsZWQgKSB7XG5cdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmdcblx0XHRpID0gbWF0Y2hFeHByW1wibmVlZHNDb250ZXh0XCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRva2VuID0gdG9rZW5zW2ldO1xuXG5cdFx0XHQvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yXG5cdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbICh0eXBlID0gdG9rZW4udHlwZSkgXSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0pICkge1xuXHRcdFx0XHQvLyBTZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnNcblx0XHRcdFx0aWYgKCAoc2VlZCA9IGZpbmQoXG5cdFx0XHRcdFx0dG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRcdHJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0XHRcdFx0KSkgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHlcblx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTtcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3ZpZGVkXG5cdC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmVcblx0KCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKFxuXHRcdHNlZWQsXG5cdFx0Y29udGV4dCxcblx0XHQhZG9jdW1lbnRJc0hUTUwsXG5cdFx0cmVzdWx0cyxcblx0XHQhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdCk7XG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLy8gT25lLXRpbWUgYXNzaWdubWVudHNcblxuLy8gU29ydCBzdGFiaWxpdHlcbnN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoXCJcIikuc29ydCggc29ydE9yZGVyICkuam9pbihcIlwiKSA9PT0gZXhwYW5kbztcblxuLy8gU3VwcG9ydDogQ2hyb21lIDE0LTM1K1xuLy8gQWx3YXlzIGFzc3VtZSBkdXBsaWNhdGVzIGlmIHRoZXkgYXJlbid0IHBhc3NlZCB0byB0aGUgY29tcGFyaXNvbiBmdW5jdGlvblxuc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7XG5cbi8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudFxuc2V0RG9jdW1lbnQoKTtcblxuLy8gU3VwcG9ydDogV2Via2l0PDUzNy4zMiAtIFNhZmFyaSA2LjAuMy9DaHJvbWUgMjUgKGZpeGVkIGluIENocm9tZSAyNylcbi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKlxuc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdjEgKSB7XG5cdC8vIFNob3VsZCByZXR1cm4gMSwgYnV0IHJldHVybnMgNCAoZm9sbG93aW5nKVxuXHRyZXR1cm4gZGl2MS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSApICYgMTtcbn0pO1xuXG4vLyBTdXBwb3J0OiBJRTw4XG4vLyBQcmV2ZW50IGF0dHJpYnV0ZS9wcm9wZXJ0eSBcImludGVycG9sYXRpb25cIlxuLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweFxuaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdGRpdi5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JyMnPjwvYT5cIjtcblx0cmV0dXJuIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZShcImhyZWZcIikgPT09IFwiI1wiIDtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidHlwZXxocmVmfGhlaWdodHx3aWR0aFwiLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0eXBlXCIgPyAxIDogMiApO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBkZWZhdWx0VmFsdWUgaW4gcGxhY2Ugb2YgZ2V0QXR0cmlidXRlKFwidmFsdWVcIilcbmlmICggIXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdGRpdi5pbm5lckhUTUwgPSBcIjxpbnB1dC8+XCI7XG5cdGRpdi5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiLCBcIlwiICk7XG5cdHJldHVybiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBcIlwiO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggXCJ2YWx1ZVwiLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0aWYgKCAhaXNYTUwgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kZWZhdWx0VmFsdWU7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGdldEF0dHJpYnV0ZU5vZGUgdG8gZmV0Y2ggYm9vbGVhbnMgd2hlbiBnZXRBdHRyaWJ1dGUgbGllc1xuaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdHJldHVybiBkaXYuZ2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPT0gbnVsbDtcbn0pICkge1xuXHRhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHZhbDtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtWyBuYW1lIF0gPT09IHRydWUgPyBuYW1lLnRvTG93ZXJDYXNlKCkgOlxuXHRcdFx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKSkgJiYgdmFsLnNwZWNpZmllZCA/XG5cdFx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0bnVsbDtcblx0XHR9XG5cdH0pO1xufVxuXG5yZXR1cm4gU2l6emxlO1xuXG59KSggd2luZG93ICk7XG5cblxuXG5qUXVlcnkuZmluZCA9IFNpenpsZTtcbmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9ycztcbmpRdWVyeS5leHByWyBcIjpcIiBdID0galF1ZXJ5LmV4cHIucHNldWRvcztcbmpRdWVyeS51bmlxdWVTb3J0ID0galF1ZXJ5LnVuaXF1ZSA9IFNpenpsZS51bmlxdWVTb3J0O1xualF1ZXJ5LnRleHQgPSBTaXp6bGUuZ2V0VGV4dDtcbmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDtcbmpRdWVyeS5jb250YWlucyA9IFNpenpsZS5jb250YWlucztcblxuXG5cbnZhciBkaXIgPSBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHtcblx0dmFyIG1hdGNoZWQgPSBbXSxcblx0XHR0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7XG5cblx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7XG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0aWYgKCB0cnVuY2F0ZSAmJiBqUXVlcnkoIGVsZW0gKS5pcyggdW50aWwgKSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRtYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBzaWJsaW5ncyA9IGZ1bmN0aW9uKCBuLCBlbGVtICkge1xuXHR2YXIgbWF0Y2hlZCA9IFtdO1xuXG5cdGZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7XG5cdFx0aWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7XG5cdFx0XHRtYXRjaGVkLnB1c2goIG4gKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbWF0Y2hlZDtcbn07XG5cblxudmFyIHJuZWVkc0NvbnRleHQgPSBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7XG5cbnZhciByc2luZ2xlVGFnID0gKCAvXjwoW1xcdy1dKylcXHMqXFwvPz4oPzo8XFwvXFwxPnwpJC8gKTtcblxuXG5cbnZhciByaXNTaW1wbGUgPSAvXi5bXjojXFxbXFwuLF0qJC87XG5cbi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90XG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHtcblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHQvKiBqc2hpbnQgLVcwMTggKi9cblx0XHRcdHJldHVybiAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICkgIT09IG5vdDtcblx0XHR9ICk7XG5cblx0fVxuXG5cdGlmICggcXVhbGlmaWVyLm5vZGVUeXBlICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICggZWxlbSA9PT0gcXVhbGlmaWVyICkgIT09IG5vdDtcblx0XHR9ICk7XG5cblx0fVxuXG5cdGlmICggdHlwZW9mIHF1YWxpZmllciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRpZiAoIHJpc1NpbXBsZS50ZXN0KCBxdWFsaWZpZXIgKSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzLCBub3QgKTtcblx0XHR9XG5cblx0XHRxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzICk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90O1xuXHR9ICk7XG59XG5cbmpRdWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHtcblx0dmFyIGVsZW0gPSBlbGVtc1sgMCBdO1xuXG5cdGlmICggbm90ICkge1xuXHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XG5cdH1cblxuXHRyZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgP1xuXHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXSA6XG5cdFx0alF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxO1xuXHRcdH0gKSApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGksXG5cdFx0XHRsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJldCA9IFtdLFxuXHRcdFx0c2VsZiA9IHRoaXM7XG5cblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0alF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApO1xuXHRcdH1cblxuXHRcdC8vIE5lZWRlZCBiZWNhdXNlICQoIHNlbGVjdG9yLCBjb250ZXh0ICkgYmVjb21lcyAkKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKVxuXHRcdHJldCA9IHRoaXMucHVzaFN0YWNrKCBsZW4gPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQgKTtcblx0XHRyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yID8gdGhpcy5zZWxlY3RvciArIFwiIFwiICsgc2VsZWN0b3IgOiBzZWxlY3Rvcjtcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXHRmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIGZhbHNlICkgKTtcblx0fSxcblx0bm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTtcblx0fSxcblx0aXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gISF3aW5ub3coXG5cdFx0XHR0aGlzLFxuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgcG9zaXRpb25hbC9yZWxhdGl2ZSBzZWxlY3RvciwgY2hlY2sgbWVtYmVyc2hpcCBpbiB0aGUgcmV0dXJuZWQgc2V0XG5cdFx0XHQvLyBzbyAkKFwicDpmaXJzdFwiKS5pcyhcInA6bGFzdFwiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gXCJwXCIuXG5cdFx0XHR0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgJiYgcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID9cblx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvciApIDpcblx0XHRcdFx0c2VsZWN0b3IgfHwgW10sXG5cdFx0XHRmYWxzZVxuXHRcdCkubGVuZ3RoO1xuXHR9XG59ICk7XG5cblxuLy8gSW5pdGlhbGl6ZSBhIGpRdWVyeSBvYmplY3RcblxuXG4vLyBBIGNlbnRyYWwgcmVmZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1bWVudClcbnZhciByb290alF1ZXJ5LFxuXG5cdC8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzXG5cdC8vIFByaW9yaXRpemUgI2lkIG92ZXIgPHRhZz4gdG8gYXZvaWQgWFNTIHZpYSBsb2NhdGlvbi5oYXNoICgjOTUyMSlcblx0Ly8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpXG5cdHJxdWlja0V4cHIgPSAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0qKSkkLyxcblxuXHRpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7XG5cdFx0dmFyIG1hdGNoLCBlbGVtO1xuXG5cdFx0Ly8gSEFORExFOiAkKFwiXCIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBNZXRob2QgaW5pdCgpIGFjY2VwdHMgYW4gYWx0ZXJuYXRlIHJvb3RqUXVlcnlcblx0XHQvLyBzbyBtaWdyYXRlIGNhbiBzdXBwb3J0IGpRdWVyeS5zdWIgKGdoLTIxMDEpXG5cdFx0cm9vdCA9IHJvb3QgfHwgcm9vdGpRdWVyeTtcblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbIDAgXSA9PT0gXCI8XCIgJiZcblx0XHRcdFx0c2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiZcblx0XHRcdFx0c2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcblx0XHRcdFx0bWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkXG5cdFx0XHRpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWyAxIF0gKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WyAwIF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsgMSBdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWyAxIF0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkge1xuXHRcdFx0XHRcdFx0Zm9yICggbWF0Y2ggaW4gY29udGV4dCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHRoaXNbIG1hdGNoIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXR0ciggbWF0Y2gsIGNvbnRleHRbIG1hdGNoIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJCgjaWQpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsgMiBdICk7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBCbGFja2JlcnJ5IDQuNlxuXHRcdFx0XHRcdC8vIGdFQklEIHJldHVybnMgbm9kZXMgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAoIzY5NjMpXG5cdFx0XHRcdFx0aWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXMubGVuZ3RoID0gMTtcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5jb250ZXh0ID0gZG9jdW1lbnQ7XG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpcy5jb250ZXh0ID0gdGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHtcblx0XHRcdHJldHVybiByb290LnJlYWR5ICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRyb290LnJlYWR5KCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBFeGVjdXRlIGltbWVkaWF0ZWx5IGlmIHJlYWR5IGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdHNlbGVjdG9yKCBqUXVlcnkgKTtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0O1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cblx0Ly8gTWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcblx0Z3VhcmFudGVlZFVuaXF1ZSA9IHtcblx0XHRjaGlsZHJlbjogdHJ1ZSxcblx0XHRjb250ZW50czogdHJ1ZSxcblx0XHRuZXh0OiB0cnVlLFxuXHRcdHByZXY6IHRydWVcblx0fTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbIGkgXSApICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0bWF0Y2hlZCA9IFtdLFxuXHRcdFx0cG9zID0gcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSB8fCB0eXBlb2Ygc2VsZWN0b3JzICE9PSBcInN0cmluZ1wiID9cblx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvcnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOlxuXHRcdFx0XHQwO1xuXG5cdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0Zm9yICggY3VyID0gdGhpc1sgaSBdOyBjdXIgJiYgY3VyICE9PSBjb250ZXh0OyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblxuXHRcdFx0XHQvLyBBbHdheXMgc2tpcCBkb2N1bWVudCBmcmFnbWVudHNcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAoIHBvcyA/XG5cdFx0XHRcdFx0cG9zLmluZGV4KCBjdXIgKSA+IC0xIDpcblxuXHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIFNpenpsZVxuXHRcdFx0XHRcdGN1ci5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBjdXIsIHNlbGVjdG9ycyApICkgKSB7XG5cblx0XHRcdFx0XHRtYXRjaGVkLnB1c2goIGN1ciApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApO1xuXHR9LFxuXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldFxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudFxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7XG5cdFx0fVxuXG5cdFx0Ly8gSW5kZXggaW4gc2VsZWN0b3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApO1xuXHRcdH1cblxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxuXHRcdHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsXG5cblx0XHRcdC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZFxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtXG5cdFx0KTtcblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soXG5cdFx0XHRqUXVlcnkudW5pcXVlU29ydChcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLmdldCgpLCBqUXVlcnkoIHNlbGVjdG9yLCBjb250ZXh0ICkgKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLmFkZCggc2VsZWN0b3IgPT0gbnVsbCA/XG5cdFx0XHR0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKCBzZWxlY3RvciApXG5cdFx0KTtcblx0fVxufSApO1xuXG5mdW5jdGlvbiBzaWJsaW5nKCBjdXIsIGRpciApIHtcblx0d2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fVxuXHRyZXR1cm4gY3VyO1xufVxuXG5qUXVlcnkuZWFjaCgge1xuXHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0cmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDtcblx0fSxcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcblx0fSxcblx0cGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIsIHVudGlsICk7XG5cdH0sXG5cdG5leHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTtcblx0fSxcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7XG5cdH0sXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZWxlbS5jb250ZW50RG9jdW1lbnQgfHwgalF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7XG5cdH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdW50aWwsIHNlbGVjdG9yICkge1xuXHRcdHZhciBtYXRjaGVkID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7XG5cblx0XHRpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09IFwiVW50aWxcIiApIHtcblx0XHRcdHNlbGVjdG9yID0gdW50aWw7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRtYXRjaGVkID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIG1hdGNoZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZXNcblx0XHRcdGlmICggIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSApIHtcblx0XHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXNcblx0XHRcdGlmICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0bWF0Y2hlZC5yZXZlcnNlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7XG5cdH07XG59ICk7XG52YXIgcm5vdHdoaXRlID0gKCAvXFxTKy9nICk7XG5cblxuXG4vLyBDb252ZXJ0IFN0cmluZy1mb3JtYXR0ZWQgb3B0aW9ucyBpbnRvIE9iamVjdC1mb3JtYXR0ZWQgb25lc1xuZnVuY3Rpb24gY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIHtcblx0dmFyIG9iamVjdCA9IHt9O1xuXHRqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBfLCBmbGFnICkge1xuXHRcdG9iamVjdFsgZmxhZyBdID0gdHJ1ZTtcblx0fSApO1xuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcbiAqXHRcdFx0dGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdFxuICpcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXG4gKiBcImZpcmVkXCIgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogUG9zc2libGUgb3B0aW9uczpcbiAqXG4gKlx0b25jZTpcdFx0XHR3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdG1lbW9yeTpcdFx0XHR3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkXG4gKlx0XHRcdFx0XHRhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCBcIm1lbW9yaXplZFwiXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0dW5pcXVlOlx0XHRcdHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KVxuICpcbiAqXHRzdG9wT25GYWxzZTpcdGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICpcbiAqL1xualF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcblx0Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KVxuXHRvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgP1xuXHRcdGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6XG5cdFx0alF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTtcblxuXHR2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZ1xuXHRcdGZpcmluZyxcblxuXHRcdC8vIExhc3QgZmlyZSB2YWx1ZSBmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzXG5cdFx0bWVtb3J5LFxuXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWRcblx0XHRmaXJlZCxcblxuXHRcdC8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmdcblx0XHRsb2NrZWQsXG5cblx0XHQvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdFxuXHRcdGxpc3QgPSBbXSxcblxuXHRcdC8vIFF1ZXVlIG9mIGV4ZWN1dGlvbiBkYXRhIGZvciByZXBlYXRhYmxlIGxpc3RzXG5cdFx0cXVldWUgPSBbXSxcblxuXHRcdC8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKVxuXHRcdGZpcmluZ0luZGV4ID0gLTEsXG5cblx0XHQvLyBGaXJlIGNhbGxiYWNrc1xuXHRcdGZpcmUgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nXG5cdFx0XHRsb2NrZWQgPSBvcHRpb25zLm9uY2U7XG5cblx0XHRcdC8vIEV4ZWN1dGUgY2FsbGJhY2tzIGZvciBhbGwgcGVuZGluZyBleGVjdXRpb25zLFxuXHRcdFx0Ly8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlc1xuXHRcdFx0ZmlyZWQgPSBmaXJpbmcgPSB0cnVlO1xuXHRcdFx0Zm9yICggOyBxdWV1ZS5sZW5ndGg7IGZpcmluZ0luZGV4ID0gLTEgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRcdHdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0Ly8gUnVuIGNhbGxiYWNrIGFuZCBjaGVjayBmb3IgZWFybHkgdGVybWluYXRpb25cblx0XHRcdFx0XHRpZiAoIGxpc3RbIGZpcmluZ0luZGV4IF0uYXBwbHkoIG1lbW9yeVsgMCBdLCBtZW1vcnlbIDEgXSApID09PSBmYWxzZSAmJlxuXHRcdFx0XHRcdFx0b3B0aW9ucy5zdG9wT25GYWxzZSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSnVtcCB0byBlbmQgYW5kIGZvcmdldCB0aGUgZGF0YSBzbyAuYWRkIGRvZXNuJ3QgcmUtZmlyZVxuXHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXggPSBsaXN0Lmxlbmd0aDtcblx0XHRcdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3JnZXQgdGhlIGRhdGEgaWYgd2UncmUgZG9uZSB3aXRoIGl0XG5cdFx0XHRpZiAoICFvcHRpb25zLm1lbW9yeSApIHtcblx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGZpcmluZyA9IGZhbHNlO1xuXG5cdFx0XHQvLyBDbGVhbiB1cCBpZiB3ZSdyZSBkb25lIGZpcmluZyBmb3IgZ29vZFxuXHRcdFx0aWYgKCBsb2NrZWQgKSB7XG5cblx0XHRcdFx0Ly8gS2VlcCBhbiBlbXB0eSBsaXN0IGlmIHdlIGhhdmUgZGF0YSBmb3IgZnV0dXJlIGFkZCBjYWxsc1xuXHRcdFx0XHRpZiAoIG1lbW9yeSApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCB0aGlzIG9iamVjdCBpcyBzcGVudFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGxpc3QgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0XG5cdFx0c2VsZiA9IHtcblxuXHRcdFx0Ly8gQWRkIGEgY2FsbGJhY2sgb3IgYSBjb2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUgbGlzdFxuXHRcdFx0YWRkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmdcblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXggPSBsaXN0Lmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBtZW1vcnkgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQoIGZ1bmN0aW9uIGFkZCggYXJncyApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdC5wdXNoKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIGpRdWVyeS50eXBlKCBhcmcgKSAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEluc3BlY3QgcmVjdXJzaXZlbHlcblx0XHRcdFx0XHRcdFx0XHRhZGQoIGFyZyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0fSApKCBhcmd1bWVudHMgKTtcblxuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdFxuXHRcdFx0cmVtb3ZlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHR2YXIgaW5kZXg7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7XG5cdFx0XHRcdFx0XHRsaXN0LnNwbGljZSggaW5kZXgsIDEgKTtcblxuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGZpcmluZyBpbmRleGVzXG5cdFx0XHRcdFx0XHRpZiAoIGluZGV4IDw9IGZpcmluZ0luZGV4ICkge1xuXHRcdFx0XHRcdFx0XHRmaXJpbmdJbmRleC0tO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENoZWNrIGlmIGEgZ2l2ZW4gY2FsbGJhY2sgaXMgaW4gdGhlIGxpc3QuXG5cdFx0XHQvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC5cblx0XHRcdGhhczogZnVuY3Rpb24oIGZuICkge1xuXHRcdFx0XHRyZXR1cm4gZm4gP1xuXHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOlxuXHRcdFx0XHRcdGxpc3QubGVuZ3RoID4gMDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3Rcblx0XHRcdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmUgYW5kIC5hZGRcblx0XHRcdC8vIEFib3J0IGFueSBjdXJyZW50L3BlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0Ly8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzXG5cdFx0XHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGRpc2FibGVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICFsaXN0O1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZVxuXHRcdFx0Ly8gQWxzbyBkaXNhYmxlIC5hZGQgdW5sZXNzIHdlIGhhdmUgbWVtb3J5IChzaW5jZSBpdCB3b3VsZCBoYXZlIG5vIGVmZmVjdClcblx0XHRcdC8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdGxvY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSBxdWV1ZSA9IFtdO1xuXHRcdFx0XHRpZiAoICFtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0bG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhbG9ja2VkO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkge1xuXHRcdFx0XHRpZiAoICFsb2NrZWQgKSB7XG5cdFx0XHRcdFx0YXJncyA9IGFyZ3MgfHwgW107XG5cdFx0XHRcdFx0YXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBhcmdzICk7XG5cdFx0XHRcdFx0aWYgKCAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXG5cdFx0XHRmaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWZpcmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIHNlbGY7XG59O1xuXG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XG5cdFx0dmFyIHR1cGxlcyA9IFtcblxuXHRcdFx0XHQvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgbGlzdGVuZXIgbGlzdCwgZmluYWwgc3RhdGVcblx0XHRcdFx0WyBcInJlc29sdmVcIiwgXCJkb25lXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCBcInJlc29sdmVkXCIgXSxcblx0XHRcdFx0WyBcInJlamVjdFwiLCBcImZhaWxcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIFwicmVqZWN0ZWRcIiBdLFxuXHRcdFx0XHRbIFwibm90aWZ5XCIsIFwicHJvZ3Jlc3NcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApIF1cblx0XHRcdF0sXG5cdFx0XHRzdGF0ZSA9IFwicGVuZGluZ1wiLFxuXHRcdFx0cHJvbWlzZSA9IHtcblx0XHRcdFx0c3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YWx3YXlzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xuXHRcdFx0XHRcdHZhciBmbnMgPSBhcmd1bWVudHM7XG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgZm4gPSBqUXVlcnkuaXNGdW5jdGlvbiggZm5zWyBpIF0gKSAmJiBmbnNbIGkgXTtcblxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZFsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdIGZvciBmb3J3YXJkaW5nIGFjdGlvbnMgdG8gbmV3RGVmZXJcblx0XHRcdFx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggcmV0dXJuZWQgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLnByb21pc2UoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIG5ld0RlZmVyLm5vdGlmeSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5kb25lKCBuZXdEZWZlci5yZXNvbHZlIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmZhaWwoIG5ld0RlZmVyLnJlamVjdCApO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlclsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMgPT09IHByb21pc2UgPyBuZXdEZWZlci5wcm9taXNlKCkgOiB0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkXG5cdFx0XHRcdC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3Rcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWZlcnJlZCA9IHt9O1xuXG5cdFx0Ly8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdFxuXHRcdHByb21pc2UucGlwZSA9IHByb21pc2UudGhlbjtcblxuXHRcdC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHNcblx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXG5cdFx0XHRcdHN0YXRlU3RyaW5nID0gdHVwbGVbIDMgXTtcblxuXHRcdFx0Ly8gcHJvbWlzZVsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdID0gbGlzdC5hZGRcblx0XHRcdHByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGVcblx0XHRcdGlmICggc3RhdGVTdHJpbmcgKSB7XG5cdFx0XHRcdGxpc3QuYWRkKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdC8vIHN0YXRlID0gWyByZXNvbHZlZCB8IHJlamVjdGVkIF1cblx0XHRcdFx0XHRzdGF0ZSA9IHN0YXRlU3RyaW5nO1xuXG5cdFx0XHRcdC8vIFsgcmVqZWN0X2xpc3QgfCByZXNvbHZlX2xpc3QgXS5kaXNhYmxlOyBwcm9ncmVzc19saXN0LmxvY2tcblx0XHRcdFx0fSwgdHVwbGVzWyBpIF4gMSBdWyAyIF0uZGlzYWJsZSwgdHVwbGVzWyAyIF1bIDIgXS5sb2NrICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGRlZmVycmVkWyByZXNvbHZlIHwgcmVqZWN0IHwgbm90aWZ5IF1cblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHByb21pc2UgOiB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9O1xuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdID0gbGlzdC5maXJlV2l0aDtcblx0XHR9ICk7XG5cblx0XHQvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2Vcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XG5cblx0XHQvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55XG5cdFx0aWYgKCBmdW5jICkge1xuXHRcdFx0ZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGwgZG9uZSFcblx0XHRyZXR1cm4gZGVmZXJyZWQ7XG5cdH0sXG5cblx0Ly8gRGVmZXJyZWQgaGVscGVyXG5cdHdoZW46IGZ1bmN0aW9uKCBzdWJvcmRpbmF0ZSAvKiAsIC4uLiwgc3Vib3JkaW5hdGVOICovICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblx0XHRcdGxlbmd0aCA9IHJlc29sdmVWYWx1ZXMubGVuZ3RoLFxuXG5cdFx0XHQvLyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXG5cdFx0XHRyZW1haW5pbmcgPSBsZW5ndGggIT09IDEgfHxcblx0XHRcdFx0KCBzdWJvcmRpbmF0ZSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggc3Vib3JkaW5hdGUucHJvbWlzZSApICkgPyBsZW5ndGggOiAwLFxuXG5cdFx0XHQvLyB0aGUgbWFzdGVyIERlZmVycmVkLlxuXHRcdFx0Ly8gSWYgcmVzb2x2ZVZhbHVlcyBjb25zaXN0IG9mIG9ubHkgYSBzaW5nbGUgRGVmZXJyZWQsIGp1c3QgdXNlIHRoYXQuXG5cdFx0XHRkZWZlcnJlZCA9IHJlbWFpbmluZyA9PT0gMSA/IHN1Ym9yZGluYXRlIDogalF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIFVwZGF0ZSBmdW5jdGlvbiBmb3IgYm90aCByZXNvbHZlIGFuZCBwcm9ncmVzcyB2YWx1ZXNcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSwgY29udGV4dHMsIHZhbHVlcyApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRjb250ZXh0c1sgaSBdID0gdGhpcztcblx0XHRcdFx0XHR2YWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoIHZhbHVlcyA9PT0gcHJvZ3Jlc3NWYWx1ZXMgKSB7XG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fSxcblxuXHRcdFx0cHJvZ3Jlc3NWYWx1ZXMsIHByb2dyZXNzQ29udGV4dHMsIHJlc29sdmVDb250ZXh0cztcblxuXHRcdC8vIEFkZCBsaXN0ZW5lcnMgdG8gRGVmZXJyZWQgc3Vib3JkaW5hdGVzOyB0cmVhdCBvdGhlcnMgYXMgcmVzb2x2ZWRcblx0XHRpZiAoIGxlbmd0aCA+IDEgKSB7XG5cdFx0XHRwcm9ncmVzc1ZhbHVlcyA9IG5ldyBBcnJheSggbGVuZ3RoICk7XG5cdFx0XHRwcm9ncmVzc0NvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdHJlc29sdmVDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCByZXNvbHZlVmFsdWVzWyBpIF0gJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2UoKVxuXHRcdFx0XHRcdFx0LnByb2dyZXNzKCB1cGRhdGVGdW5jKCBpLCBwcm9ncmVzc0NvbnRleHRzLCBwcm9ncmVzc1ZhbHVlcyApIClcblx0XHRcdFx0XHRcdC5kb25lKCB1cGRhdGVGdW5jKCBpLCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKSApXG5cdFx0XHRcdFx0XHQuZmFpbCggZGVmZXJyZWQucmVqZWN0ICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LS1yZW1haW5pbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBJZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhbnl0aGluZywgcmVzb2x2ZSB0aGUgbWFzdGVyXG5cdFx0aWYgKCAhcmVtYWluaW5nICkge1xuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7XG5cdH1cbn0gKTtcblxuXG4vLyBUaGUgZGVmZXJyZWQgdXNlZCBvbiBET00gcmVhZHlcbnZhciByZWFkeUxpc3Q7XG5cbmpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHtcblxuXHQvLyBBZGQgdGhlIGNhbGxiYWNrXG5cdGpRdWVyeS5yZWFkeS5wcm9taXNlKCkuZG9uZSggZm4gKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLlxuXHRpc1JlYWR5OiBmYWxzZSxcblxuXHQvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnRcblx0aG9sZFJlYWR5OiBmdW5jdGlvbiggaG9sZCApIHtcblx0XHRpZiAoIGhvbGQgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlXYWl0Kys7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpRdWVyeS5yZWFkeSggdHJ1ZSApO1xuXHRcdH1cblx0fSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cblx0XHQvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHNcblx0XHRpZiAoIGpRdWVyeS5mbi50cmlnZ2VySGFuZGxlciApIHtcblx0XHRcdGpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VySGFuZGxlciggXCJyZWFkeVwiICk7XG5cdFx0XHRqUXVlcnkoIGRvY3VtZW50ICkub2ZmKCBcInJlYWR5XCIgKTtcblx0XHR9XG5cdH1cbn0gKTtcblxuLyoqXG4gKiBUaGUgcmVhZHkgZXZlbnQgaGFuZGxlciBhbmQgc2VsZiBjbGVhbnVwIG1ldGhvZFxuICovXG5mdW5jdGlvbiBjb21wbGV0ZWQoKSB7XG5cdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwiRE9NQ29udGVudExvYWRlZFwiLCBjb21wbGV0ZWQgKTtcblx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBjb21wbGV0ZWQgKTtcblx0alF1ZXJ5LnJlYWR5KCk7XG59XG5cbmpRdWVyeS5yZWFkeS5wcm9taXNlID0gZnVuY3Rpb24oIG9iaiApIHtcblx0aWYgKCAhcmVhZHlMaXN0ICkge1xuXG5cdFx0cmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cblx0XHQvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZFxuXHRcdC8vIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLlxuXHRcdC8vIFN1cHBvcnQ6IElFOS0xMCBvbmx5XG5cdFx0Ly8gT2xkZXIgSUUgc29tZXRpbWVzIHNpZ25hbHMgXCJpbnRlcmFjdGl2ZVwiIHRvbyBzb29uXG5cdFx0aWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIgfHxcblx0XHRcdCggZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gXCJsb2FkaW5nXCIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkge1xuXG5cdFx0XHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBqUXVlcnkucmVhZHkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwiRE9NQ29udGVudExvYWRlZFwiLCBjb21wbGV0ZWQgKTtcblxuXHRcdFx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZWFkeUxpc3QucHJvbWlzZSggb2JqICk7XG59O1xuXG4vLyBLaWNrIG9mZiB0aGUgRE9NIHJlYWR5IGNoZWNrIGV2ZW4gaWYgdGhlIHVzZXIgZG9lcyBub3RcbmpRdWVyeS5yZWFkeS5wcm9taXNlKCk7XG5cblxuXG5cbi8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvblxuLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uXG52YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggalF1ZXJ5LnR5cGUoIGtleSApID09PSBcIm9iamVjdFwiICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cdFx0Zm9yICggaSBpbiBrZXkgKSB7XG5cdFx0XHRhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTtcblx0XHR9XG5cblx0Ly8gU2V0cyBvbmUgdmFsdWVcblx0fSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXG5cdFx0aWYgKCAhalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyYXcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICggYnVsayApIHtcblxuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBrZXksIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiBidWxrLmNhbGwoIGpRdWVyeSggZWxlbSApLCB2YWx1ZSApO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0Zm4oXG5cdFx0XHRcdFx0ZWxlbXNbIGkgXSwga2V5LCByYXcgP1xuXHRcdFx0XHRcdHZhbHVlIDpcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjaGFpbmFibGUgP1xuXHRcdGVsZW1zIDpcblxuXHRcdC8vIEdldHNcblx0XHRidWxrID9cblx0XHRcdGZuLmNhbGwoIGVsZW1zICkgOlxuXHRcdFx0bGVuID8gZm4oIGVsZW1zWyAwIF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xudmFyIGFjY2VwdERhdGEgPSBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0Ly8gQWNjZXB0cyBvbmx5OlxuXHQvLyAgLSBOb2RlXG5cdC8vICAgIC0gTm9kZS5FTEVNRU5UX05PREVcblx0Ly8gICAgLSBOb2RlLkRPQ1VNRU5UX05PREVcblx0Ly8gIC0gT2JqZWN0XG5cdC8vICAgIC0gQW55XG5cdC8qIGpzaGludCAtVzAxOCAqL1xuXHRyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7XG59O1xuXG5cblxuXG5mdW5jdGlvbiBEYXRhKCkge1xuXHR0aGlzLmV4cGFuZG8gPSBqUXVlcnkuZXhwYW5kbyArIERhdGEudWlkKys7XG59XG5cbkRhdGEudWlkID0gMTtcblxuRGF0YS5wcm90b3R5cGUgPSB7XG5cblx0cmVnaXN0ZXI6IGZ1bmN0aW9uKCBvd25lciwgaW5pdGlhbCApIHtcblx0XHR2YXIgdmFsdWUgPSBpbml0aWFsIHx8IHt9O1xuXG5cdFx0Ly8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlclxuXHRcdC8vIHVzZSBwbGFpbiBhc3NpZ25tZW50XG5cdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHZhbHVlO1xuXG5cdFx0Ly8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlLCBub24td3JpdGFibGUgcHJvcGVydHlcblx0XHQvLyBjb25maWd1cmFiaWxpdHkgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZVxuXHRcdC8vIGRlbGV0ZWQgd2l0aCB0aGUgZGVsZXRlIG9wZXJhdG9yXG5cdFx0fSBlbHNlIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywge1xuXHRcdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRjb25maWd1cmFibGU6IHRydWVcblx0XHRcdH0gKTtcblx0XHR9XG5cdFx0cmV0dXJuIG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblx0fSxcblx0Y2FjaGU6IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHRcdC8vIFdlIGNhbiBhY2NlcHQgZGF0YSBmb3Igbm9uLWVsZW1lbnQgbm9kZXMgaW4gbW9kZXJuIGJyb3dzZXJzLFxuXHRcdC8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuXG5cdFx0Ly8gQWx3YXlzIHJldHVybiBhbiBlbXB0eSBvYmplY3QuXG5cdFx0aWYgKCAhYWNjZXB0RGF0YSggb3duZXIgKSApIHtcblx0XHRcdHJldHVybiB7fTtcblx0XHR9XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGVcblx0XHR2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHQvLyBJZiBub3QsIGNyZWF0ZSBvbmVcblx0XHRpZiAoICF2YWx1ZSApIHtcblx0XHRcdHZhbHVlID0ge307XG5cblx0XHRcdC8vIFdlIGNhbiBhY2NlcHQgZGF0YSBmb3Igbm9uLWVsZW1lbnQgbm9kZXMgaW4gbW9kZXJuIGJyb3dzZXJzLFxuXHRcdFx0Ly8gYnV0IHdlIHNob3VsZCBub3QsIHNlZSAjODMzNS5cblx0XHRcdC8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBvd25lciApICkge1xuXG5cdFx0XHRcdC8vIElmIGl0IGlzIGEgbm9kZSB1bmxpa2VseSB0byBiZSBzdHJpbmdpZnktZWQgb3IgbG9vcGVkIG92ZXJcblx0XHRcdFx0Ly8gdXNlIHBsYWluIGFzc2lnbm1lbnRcblx0XHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHlcblx0XHRcdFx0Ly8gY29uZmlndXJhYmxlIG11c3QgYmUgdHJ1ZSB0byBhbGxvdyB0aGUgcHJvcGVydHkgdG8gYmVcblx0XHRcdFx0Ly8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywge1xuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGUoIG93bmVyICk7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUgXSBhcmdzXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGNhY2hlWyBkYXRhIF0gPSB2YWx1ZTtcblxuXHRcdC8vIEhhbmRsZTogWyBvd25lciwgeyBwcm9wZXJ0aWVzIH0gXSBhcmdzXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3Rcblx0XHRcdGZvciAoIHByb3AgaW4gZGF0YSApIHtcblx0XHRcdFx0Y2FjaGVbIHByb3AgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzLmNhY2hlKCBvd25lciApIDpcblx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGtleSBdO1xuXHR9LFxuXHRhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHtcblx0XHR2YXIgc3RvcmVkO1xuXG5cdFx0Ly8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZFxuXHRcdC8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZFxuXHRcdC8vXG5cdFx0Ly8gVGFrZSB0aGUgXCJyZWFkXCIgcGF0aCBhbmQgYWxsb3cgdGhlIGdldCBtZXRob2QgdG8gZGV0ZXJtaW5lXG5cdFx0Ly8gd2hpY2ggdmFsdWUgdG8gcmV0dXJuLCByZXNwZWN0aXZlbHkgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBUaGUgZW50aXJlIGNhY2hlIG9iamVjdFxuXHRcdC8vICAgMi4gVGhlIGRhdGEgc3RvcmVkIGF0IHRoZSBrZXlcblx0XHQvL1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0KCAoIGtleSAmJiB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkge1xuXG5cdFx0XHRzdG9yZWQgPSB0aGlzLmdldCggb3duZXIsIGtleSApO1xuXG5cdFx0XHRyZXR1cm4gc3RvcmVkICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRzdG9yZWQgOiB0aGlzLmdldCggb3duZXIsIGpRdWVyeS5jYW1lbENhc2UoIGtleSApICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLCBuYW1lLCBjYW1lbCxcblx0XHRcdGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0aWYgKCBjYWNoZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0aGlzLnJlZ2lzdGVyKCBvd25lciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIGtleSApICkge1xuXG5cdFx0XHRcdC8vIElmIFwibmFtZVwiIGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2hlbiBkYXRhIGlzIGluaXRpYWxseSBjcmVhdGVkLCB2aWEgKFwia2V5XCIsIFwidmFsXCIpIHNpZ25hdHVyZSxcblx0XHRcdFx0Ly8ga2V5cyB3aWxsIGJlIGNvbnZlcnRlZCB0byBjYW1lbENhc2UuXG5cdFx0XHRcdC8vIFNpbmNlIHRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIF9ob3dfIGEga2V5IHdhcyBhZGRlZCwgcmVtb3ZlXG5cdFx0XHRcdC8vIGJvdGggcGxhaW4ga2V5IGFuZCBjYW1lbENhc2Uga2V5LiAjMTI3ODZcblx0XHRcdFx0Ly8gVGhpcyB3aWxsIG9ubHkgcGVuYWxpemUgdGhlIGFycmF5IGFyZ3VtZW50IHBhdGguXG5cdFx0XHRcdG5hbWUgPSBrZXkuY29uY2F0KCBrZXkubWFwKCBqUXVlcnkuY2FtZWxDYXNlICkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNhbWVsID0galF1ZXJ5LmNhbWVsQ2FzZSgga2V5ICk7XG5cblx0XHRcdFx0Ly8gVHJ5IHRoZSBzdHJpbmcgYXMgYSBrZXkgYmVmb3JlIGFueSBtYW5pcHVsYXRpb25cblx0XHRcdFx0aWYgKCBrZXkgaW4gY2FjaGUgKSB7XG5cdFx0XHRcdFx0bmFtZSA9IFsga2V5LCBjYW1lbCBdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gSWYgYSBrZXkgd2l0aCB0aGUgc3BhY2VzIGV4aXN0cywgdXNlIGl0LlxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdFx0bmFtZSA9IGNhbWVsO1xuXHRcdFx0XHRcdG5hbWUgPSBuYW1lIGluIGNhY2hlID9cblx0XHRcdFx0XHRcdFsgbmFtZSBdIDogKCBuYW1lLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGkgPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVsgbmFtZVsgaSBdIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9IDM1LTQ1K1xuXHRcdFx0Ly8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXNcblx0XHRcdC8vIGZyb20gRE9NIG5vZGVzLCBzbyBzZXQgdG8gdW5kZWZpbmVkIGluc3RlYWRcblx0XHRcdC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDdcblx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0dmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdHJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTtcblx0fVxufTtcbnZhciBkYXRhUHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvW0EtWl0vZztcblxuZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHtcblx0dmFyIG5hbWU7XG5cblx0Ly8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueVxuXHQvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGVcblx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRuYW1lID0gXCJkYXRhLVwiICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsIFwiLSQmXCIgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdGRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApO1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRhdGEgPSBkYXRhID09PSBcInRydWVcIiA/IHRydWUgOlxuXHRcdFx0XHRcdGRhdGEgPT09IFwiZmFsc2VcIiA/IGZhbHNlIDpcblx0XHRcdFx0XHRkYXRhID09PSBcIm51bGxcIiA/IG51bGwgOlxuXG5cdFx0XHRcdFx0Ly8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmdcblx0XHRcdFx0XHQrZGF0YSArIFwiXCIgPT09IGRhdGEgPyArZGF0YSA6XG5cdFx0XHRcdFx0cmJyYWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVyeS5wYXJzZUpTT04oIGRhdGEgKSA6XG5cdFx0XHRcdFx0ZGF0YTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhVXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTtcblx0fSxcblxuXHRkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVVzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRlcHJlY2F0ZWQuXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGRhdGEsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0YXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlcztcblxuXHRcdC8vIEdldHMgYWxsIHZhbHVlc1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhUHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTExK1xuXHRcdFx0XHRcdFx0Ly8gVGhlIGF0dHJzIGVsZW1lbnRzIGNhbiBiZSBudWxsICgjMTQ4OTQpXG5cdFx0XHRcdFx0XHRpZiAoIGF0dHJzWyBpIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0XHRcdGlmICggbmFtZS5pbmRleE9mKCBcImRhdGEtXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZS5zbGljZSggNSApICk7XG5cdFx0XHRcdFx0XHRcdFx0ZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJoYXNEYXRhQXR0cnNcIiwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXHRcdH1cblxuXHRcdC8vIFNldHMgbXVsdGlwbGUgdmFsdWVzXG5cdFx0aWYgKCB0eXBlb2Yga2V5ID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywga2V5ICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGRhdGEsIGNhbWVsS2V5O1xuXG5cdFx0XHQvLyBUaGUgY2FsbGluZyBqUXVlcnkgb2JqZWN0IChlbGVtZW50IG1hdGNoZXMpIGlzIG5vdCBlbXB0eVxuXHRcdFx0Ly8gKGFuZCB0aGVyZWZvcmUgaGFzIGFuIGVsZW1lbnQgYXBwZWFycyBhdCB0aGlzWyAwIF0pIGFuZCB0aGVcblx0XHRcdC8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0XG5cdFx0XHQvLyB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBmb3IgZWxlbSA9IHRoaXNbIDAgXSB3aGljaCB3aWxsXG5cdFx0XHQvLyB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gYXR0ZW1wdCB0byByZWFkIGEgZGF0YSBjYWNoZSBpcyBtYWRlLlxuXHRcdFx0aWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyB3aXRoIHRoZSBrZXkgYXMtaXNcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSwga2V5ICkgfHxcblxuXHRcdFx0XHRcdC8vIFRyeSB0byBmaW5kIGRhc2hlZCBrZXkgaWYgaXQgZXhpc3RzIChnaC0yNzc5KVxuXHRcdFx0XHRcdC8vIFRoaXMgaXMgZm9yIDIuMi54IG9ubHlcblx0XHRcdFx0XHRkYXRhVXNlci5nZXQoIGVsZW0sIGtleS5yZXBsYWNlKCBybXVsdGlEYXNoLCBcIi0kJlwiICkudG9Mb3dlckNhc2UoKSApO1xuXG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y2FtZWxLZXkgPSBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlXG5cdFx0XHRcdC8vIHdpdGggdGhlIGtleSBjYW1lbGl6ZWRcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSwgY2FtZWxLZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIFwiZGlzY292ZXJcIiB0aGUgZGF0YSBpblxuXHRcdFx0XHQvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzXG5cdFx0XHRcdGRhdGEgPSBkYXRhQXR0ciggZWxlbSwgY2FtZWxLZXksIHVuZGVmaW5lZCApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlIHRyaWVkIHJlYWxseSBoYXJkLCBidXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdC5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgdGhlIGRhdGEuLi5cblx0XHRcdGNhbWVsS2V5ID0galF1ZXJ5LmNhbWVsQ2FzZSgga2V5ICk7XG5cdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIEZpcnN0LCBhdHRlbXB0IHRvIHN0b3JlIGEgY29weSBvciByZWZlcmVuY2Ugb2YgYW55XG5cdFx0XHRcdC8vIGRhdGEgdGhhdCBtaWdodCd2ZSBiZWVuIHN0b3JlIHdpdGggYSBjYW1lbENhc2VkIGtleS5cblx0XHRcdFx0dmFyIGRhdGEgPSBkYXRhVXNlci5nZXQoIHRoaXMsIGNhbWVsS2V5ICk7XG5cblx0XHRcdFx0Ly8gRm9yIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGUgaW50ZXJvcCwgd2UgaGF2ZSB0b1xuXHRcdFx0XHQvLyBzdG9yZSBwcm9wZXJ0eSBuYW1lcyB3aXRoIGRhc2hlcyBpbiBhIGNhbWVsQ2FzZSBmb3JtLlxuXHRcdFx0XHQvLyBUaGlzIG1pZ2h0IG5vdCBhcHBseSB0byBhbGwgcHJvcGVydGllcy4uLipcblx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBjYW1lbEtleSwgdmFsdWUgKTtcblxuXHRcdFx0XHQvLyAqLi4uIEluIHRoZSBjYXNlIG9mIHByb3BlcnRpZXMgdGhhdCBtaWdodCBfYWN0dWFsbHlfXG5cdFx0XHRcdC8vIGhhdmUgZGFzaGVzLCB3ZSBuZWVkIHRvIGFsc28gc3RvcmUgYSBjb3B5IG9mIHRoYXRcblx0XHRcdFx0Ly8gdW5jaGFuZ2VkIHByb3BlcnR5LlxuXHRcdFx0XHRpZiAoIGtleS5pbmRleE9mKCBcIi1cIiApID4gLTEgJiYgZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxLCBudWxsLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGRhdGFVc2VyLnJlbW92ZSggdGhpcywga2V5ICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHF1ZXVlO1xuXG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0dHlwZSA9ICggdHlwZSB8fCBcImZ4XCIgKSArIFwicXVldWVcIjtcblx0XHRcdHF1ZXVlID0gZGF0YVByaXYuZ2V0KCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdC8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXBcblx0XHRcdGlmICggZGF0YSApIHtcblx0XHRcdFx0aWYgKCAhcXVldWUgfHwgalF1ZXJ5LmlzQXJyYXkoIGRhdGEgKSApIHtcblx0XHRcdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cXVldWUucHVzaCggZGF0YSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcXVldWUgfHwgW107XG5cdFx0fVxuXHR9LFxuXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLFxuXHRcdFx0c3RhcnRMZW5ndGggPSBxdWV1ZS5sZW5ndGgsXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCksXG5cdFx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLFxuXHRcdFx0bmV4dCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApO1xuXHRcdFx0fTtcblxuXHRcdC8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWxcblx0XHRpZiAoIGZuID09PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdHN0YXJ0TGVuZ3RoLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblxuXHRcdFx0Ly8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZ1xuXHRcdFx0Ly8gYXV0b21hdGljYWxseSBkZXF1ZXVlZFxuXHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgKSB7XG5cdFx0XHRcdHF1ZXVlLnVuc2hpZnQoIFwiaW5wcm9ncmVzc1wiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb25cblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0Zm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTtcblx0XHR9XG5cblx0XHRpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmVcblx0X3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHZhciBrZXkgPSB0eXBlICsgXCJxdWV1ZUhvb2tzXCI7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmdldCggZWxlbSwga2V5ICkgfHwgZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBrZXksIHtcblx0XHRcdGVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKS5hZGQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArIFwicXVldWVcIiwga2V5IF0gKTtcblx0XHRcdH0gKVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgc2V0dGVyID0gMjtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRkYXRhID0gdHlwZTtcblx0XHRcdHR5cGUgPSBcImZ4XCI7XG5cdFx0XHRzZXR0ZXItLTtcblx0XHR9XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnF1ZXVlKCB0aGlzWyAwIF0sIHR5cGUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHRoaXMgOlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBkYXRhICk7XG5cblx0XHRcdFx0Ly8gRW5zdXJlIGEgaG9va3MgZm9yIHRoaXMgcXVldWVcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgJiYgcXVldWVbIDAgXSAhPT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHR9LFxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0fSApO1xuXHR9LFxuXHRjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdH0sXG5cblx0Ly8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZVxuXHQvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdClcblx0cHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHtcblx0XHR2YXIgdG1wLFxuXHRcdFx0Y291bnQgPSAxLFxuXHRcdFx0ZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGVsZW1lbnRzID0gdGhpcyxcblx0XHRcdGkgPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJlc29sdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhKCAtLWNvdW50ICkgKSB7XG5cdFx0XHRcdFx0ZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRvYmogPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0bXAgPSBkYXRhUHJpdi5nZXQoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyBcInF1ZXVlSG9va3NcIiApO1xuXHRcdFx0aWYgKCB0bXAgJiYgdG1wLmVtcHR5ICkge1xuXHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0XHR0bXAuZW1wdHkuYWRkKCByZXNvbHZlICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlc29sdmUoKTtcblx0XHRyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7XG5cdH1cbn0gKTtcbnZhciBwbnVtID0gKCAvWystXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVsrLV0/XFxkK3wpLyApLnNvdXJjZTtcblxudmFyIHJjc3NOdW0gPSBuZXcgUmVnRXhwKCBcIl4oPzooWystXSk9fCkoXCIgKyBwbnVtICsgXCIpKFthLXolXSopJFwiLCBcImlcIiApO1xuXG5cbnZhciBjc3NFeHBhbmQgPSBbIFwiVG9wXCIsIFwiUmlnaHRcIiwgXCJCb3R0b21cIiwgXCJMZWZ0XCIgXTtcblxudmFyIGlzSGlkZGVuID0gZnVuY3Rpb24oIGVsZW0sIGVsICkge1xuXG5cdFx0Ly8gaXNIaWRkZW4gbWlnaHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjtcblx0XHQvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnRcblx0XHRlbGVtID0gZWwgfHwgZWxlbTtcblx0XHRyZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCIgfHxcblx0XHRcdCFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApO1xuXHR9O1xuXG5cblxuZnVuY3Rpb24gYWRqdXN0Q1NTKCBlbGVtLCBwcm9wLCB2YWx1ZVBhcnRzLCB0d2VlbiApIHtcblx0dmFyIGFkanVzdGVkLFxuXHRcdHNjYWxlID0gMSxcblx0XHRtYXhJdGVyYXRpb25zID0gMjAsXG5cdFx0Y3VycmVudFZhbHVlID0gdHdlZW4gP1xuXHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiB0d2Vlbi5jdXIoKTsgfSA6XG5cdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsIFwiXCIgKTsgfSxcblx0XHRpbml0aWFsID0gY3VycmVudFZhbHVlKCksXG5cdFx0dW5pdCA9IHZhbHVlUGFydHMgJiYgdmFsdWVQYXJ0c1sgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApLFxuXG5cdFx0Ly8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXNcblx0XHRpbml0aWFsSW5Vbml0ID0gKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gfHwgdW5pdCAhPT0gXCJweFwiICYmICtpbml0aWFsICkgJiZcblx0XHRcdHJjc3NOdW0uZXhlYyggalF1ZXJ5LmNzcyggZWxlbSwgcHJvcCApICk7XG5cblx0aWYgKCBpbml0aWFsSW5Vbml0ICYmIGluaXRpYWxJblVuaXRbIDMgXSAhPT0gdW5pdCApIHtcblxuXHRcdC8vIFRydXN0IHVuaXRzIHJlcG9ydGVkIGJ5IGpRdWVyeS5jc3Ncblx0XHR1bml0ID0gdW5pdCB8fCBpbml0aWFsSW5Vbml0WyAzIF07XG5cblx0XHQvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2VlbiBwcm9wZXJ0aWVzIGxhdGVyIG9uXG5cdFx0dmFsdWVQYXJ0cyA9IHZhbHVlUGFydHMgfHwgW107XG5cblx0XHQvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludFxuXHRcdGluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxO1xuXG5cdFx0ZG8ge1xuXG5cdFx0XHQvLyBJZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29tZXRoaW5nKi5cblx0XHRcdC8vIFVzZSBzdHJpbmcgZm9yIGRvdWJsaW5nIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBzZWUgc2NhbGUgYXMgdW5jaGFuZ2VkIGJlbG93XG5cdFx0XHRzY2FsZSA9IHNjYWxlIHx8IFwiLjVcIjtcblxuXHRcdFx0Ly8gQWRqdXN0IGFuZCBhcHBseVxuXHRcdFx0aW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgLyBzY2FsZTtcblx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTtcblxuXHRcdC8vIFVwZGF0ZSBzY2FsZSwgdG9sZXJhdGluZyB6ZXJvIG9yIE5hTiBmcm9tIHR3ZWVuLmN1cigpXG5cdFx0Ly8gQnJlYWsgdGhlIGxvb3AgaWYgc2NhbGUgaXMgdW5jaGFuZ2VkIG9yIHBlcmZlY3QsIG9yIGlmIHdlJ3ZlIGp1c3QgaGFkIGVub3VnaC5cblx0XHR9IHdoaWxlIChcblx0XHRcdHNjYWxlICE9PSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsICkgJiYgc2NhbGUgIT09IDEgJiYgLS1tYXhJdGVyYXRpb25zXG5cdFx0KTtcblx0fVxuXG5cdGlmICggdmFsdWVQYXJ0cyApIHtcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDtcblxuXHRcdC8vIEFwcGx5IHJlbGF0aXZlIG9mZnNldCAoKz0vLT0pIGlmIHNwZWNpZmllZFxuXHRcdGFkanVzdGVkID0gdmFsdWVQYXJ0c1sgMSBdID9cblx0XHRcdGluaXRpYWxJblVuaXQgKyAoIHZhbHVlUGFydHNbIDEgXSArIDEgKSAqIHZhbHVlUGFydHNbIDIgXSA6XG5cdFx0XHQrdmFsdWVQYXJ0c1sgMiBdO1xuXHRcdGlmICggdHdlZW4gKSB7XG5cdFx0XHR0d2Vlbi51bml0ID0gdW5pdDtcblx0XHRcdHR3ZWVuLnN0YXJ0ID0gaW5pdGlhbEluVW5pdDtcblx0XHRcdHR3ZWVuLmVuZCA9IGFkanVzdGVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYWRqdXN0ZWQ7XG59XG52YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7XG5cbnZhciBydGFnTmFtZSA9ICggLzwoW1xcdzotXSspLyApO1xuXG52YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxcXC8oPzpqYXZhfGVjbWEpc2NyaXB0L2kgKTtcblxuXG5cbi8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICgjMTMyMDApXG52YXIgd3JhcE1hcCA9IHtcblxuXHQvLyBTdXBwb3J0OiBJRTlcblx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG4vLyBTdXBwb3J0OiBJRTlcbndyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjtcblxud3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDtcbndyYXBNYXAudGggPSB3cmFwTWFwLnRkO1xuXG5cbmZ1bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkge1xuXG5cdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0Ly8gVXNlIHR5cGVvZiB0byBhdm9pZCB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBpbnZvY2F0aW9uIG9uIGhvc3Qgb2JqZWN0cyAoIzE1MTUxKVxuXHR2YXIgcmV0ID0gdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgP1xuXHRcdFx0Y29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnIHx8IFwiKlwiICkgOlxuXHRcdFx0dHlwZW9mIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCAhPT0gXCJ1bmRlZmluZWRcIiA/XG5cdFx0XHRcdGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8IFwiKlwiICkgOlxuXHRcdFx0W107XG5cblx0cmV0dXJuIHRhZyA9PT0gdW5kZWZpbmVkIHx8IHRhZyAmJiBqUXVlcnkubm9kZU5hbWUoIGNvbnRleHQsIHRhZyApID9cblx0XHRqUXVlcnkubWVyZ2UoIFsgY29udGV4dCBdLCByZXQgKSA6XG5cdFx0cmV0O1xufVxuXG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZGF0YVByaXYuc2V0KFxuXHRcdFx0ZWxlbXNbIGkgXSxcblx0XHRcdFwiZ2xvYmFsRXZhbFwiLFxuXHRcdFx0IXJlZkVsZW1lbnRzIHx8IGRhdGFQcml2LmdldCggcmVmRWxlbWVudHNbIGkgXSwgXCJnbG9iYWxFdmFsXCIgKVxuXHRcdCk7XG5cdH1cbn1cblxuXG52YXIgcmh0bWwgPSAvPHwmIz9cXHcrOy87XG5cbmZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24sIGlnbm9yZWQgKSB7XG5cdHZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosXG5cdFx0ZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRub2RlcyA9IFtdLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGVsZW0gPSBlbGVtc1sgaSBdO1xuXG5cdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0aWYgKCBqUXVlcnkudHlwZSggZWxlbSApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xLCBQaGFudG9tSlM8MlxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTtcblxuXHRcdFx0Ly8gQ29udmVydCBub24taHRtbCBpbnRvIGEgdGV4dCBub2RlXG5cdFx0XHR9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkge1xuXHRcdFx0XHRub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkgKTtcblxuXHRcdFx0Ly8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cblx0XHRcdFx0Ly8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvblxuXHRcdFx0XHR0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0d3JhcCA9IHdyYXBNYXBbIHRhZyBdIHx8IHdyYXBNYXAuX2RlZmF1bHQ7XG5cdFx0XHRcdHRtcC5pbm5lckhUTUwgPSB3cmFwWyAxIF0gKyBqUXVlcnkuaHRtbFByZWZpbHRlciggZWxlbSApICsgd3JhcFsgMiBdO1xuXG5cdFx0XHRcdC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudFxuXHRcdFx0XHRqID0gd3JhcFsgMCBdO1xuXHRcdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0XHR0bXAgPSB0bXAubGFzdENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjEsIFBoYW50b21KUzwyXG5cdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lclxuXHRcdFx0XHR0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSB0aGUgY3JlYXRlZCBub2RlcyBhcmUgb3JwaGFuZWQgKCMxMjM5Milcblx0XHRcdFx0dG1wLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZW1vdmUgd3JhcHBlciBmcm9tIGZyYWdtZW50XG5cdGZyYWdtZW50LnRleHRDb250ZW50ID0gXCJcIjtcblxuXHRpID0gMDtcblx0d2hpbGUgKCAoIGVsZW0gPSBub2Rlc1sgaSsrIF0gKSApIHtcblxuXHRcdC8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpXG5cdFx0aWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7XG5cdFx0XHRpZiAoIGlnbm9yZWQgKSB7XG5cdFx0XHRcdGlnbm9yZWQucHVzaCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApO1xuXG5cdFx0Ly8gQXBwZW5kIHRvIGZyYWdtZW50XG5cdFx0dG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApLCBcInNjcmlwdFwiICk7XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0aWYgKCBjb250YWlucyApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIHRtcCApO1xuXHRcdH1cblxuXHRcdC8vIENhcHR1cmUgZXhlY3V0YWJsZXNcblx0XHRpZiAoIHNjcmlwdHMgKSB7XG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdG1wWyBqKysgXSApICkge1xuXHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdFx0c2NyaXB0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZnJhZ21lbnQ7XG59XG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdGRpdiA9IGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKSxcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wLTQuMywgU2FmYXJpPD01LjFcblx0Ly8gQ2hlY2sgc3RhdGUgbG9zdCBpZiB0aGUgbmFtZSBpcyBzZXQgKCMxMTIxNylcblx0Ly8gU3VwcG9ydDogV2luZG93cyBXZWIgQXBwcyAoV1dBKVxuXHQvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSlcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJyYWRpb1wiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJjaGVja2VkXCIsIFwiY2hlY2tlZFwiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwidFwiICk7XG5cblx0ZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApO1xuXG5cdC8vIFN1cHBvcnQ6IFNhZmFyaTw9NS4xLCBBbmRyb2lkPDQuMlxuXHQvLyBPbGRlciBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHNcblx0c3VwcG9ydC5jaGVja0Nsb25lID0gZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkO1xuXG5cdC8vIFN1cHBvcnQ6IElFPD0xMStcblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcbn0gKSgpO1xuXG5cbnZhclxuXHRya2V5RXZlbnQgPSAvXmtleS8sXG5cdHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLFxuXHRydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlxcLiguKyl8KS87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vLyBTdXBwb3J0OiBJRTlcbi8vIFNlZSAjMTMzOTMgZm9yIG1vcmUgaW5mb1xuZnVuY3Rpb24gc2FmZUFjdGl2ZUVsZW1lbnQoKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cdH0gY2F0Y2ggKCBlcnIgKSB7IH1cbn1cblxuZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHtcblx0dmFyIG9yaWdGbiwgdHlwZTtcblxuXHQvLyBUeXBlcyBjYW4gYmUgYSBtYXAgb2YgdHlwZXMvaGFuZGxlcnNcblx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyAoIHR5cGVzLU9iamVjdCwgc2VsZWN0b3IsIGRhdGEgKVxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSApXG5cdFx0XHRkYXRhID0gZGF0YSB8fCBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0b24oIGVsZW0sIHR5cGUsIHNlbGVjdG9yLCBkYXRhLCB0eXBlc1sgdHlwZSBdLCBvbmUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIGRhdGEgPT0gbnVsbCAmJiBmbiA9PSBudWxsICkge1xuXG5cdFx0Ly8gKCB0eXBlcywgZm4gKVxuXHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0ZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKCBmbiA9PSBudWxsICkge1xuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLCBzZWxlY3RvciwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyAoIHR5cGVzLCBkYXRhLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0fSBlbHNlIGlmICggIWZuICkge1xuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBvbmUgPT09IDEgKSB7XG5cdFx0b3JpZ0ZuID0gZm47XG5cdFx0Zm4gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdC8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBzaW5jZSBldmVudCBjb250YWlucyB0aGUgaW5mb1xuXHRcdFx0alF1ZXJ5KCkub2ZmKCBldmVudCApO1xuXHRcdFx0cmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fTtcblxuXHRcdC8vIFVzZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuXG5cdFx0Zm4uZ3VpZCA9IG9yaWdGbi5ndWlkIHx8ICggb3JpZ0ZuLmd1aWQgPSBqUXVlcnkuZ3VpZCsrICk7XG5cdH1cblx0cmV0dXJuIGVsZW0uZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZXMsIGZuLCBkYXRhLCBzZWxlY3RvciApO1xuXHR9ICk7XG59XG5cbi8qXG4gKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBldmVudHMgLS0gbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuXG4gKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLlxuICovXG5qUXVlcnkuZXZlbnQgPSB7XG5cblx0Z2xvYmFsOiB7fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7XG5cblx0XHR2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7XG5cblx0XHQvLyBEb24ndCBhdHRhY2ggZXZlbnRzIHRvIG5vRGF0YSBvciB0ZXh0L2NvbW1lbnQgbm9kZXMgKGJ1dCBhbGxvdyBwbGFpbiBvYmplY3RzKVxuXHRcdGlmICggIWVsZW1EYXRhICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlclxuXHRcdGlmICggaGFuZGxlci5oYW5kbGVyICkge1xuXHRcdFx0aGFuZGxlT2JqSW4gPSBoYW5kbGVyO1xuXHRcdFx0aGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7XG5cdFx0XHRzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBoYW5kbGVyIGhhcyBhIHVuaXF1ZSBJRCwgdXNlZCB0byBmaW5kL3JlbW92ZSBpdCBsYXRlclxuXHRcdGlmICggIWhhbmRsZXIuZ3VpZCApIHtcblx0XHRcdGhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7XG5cdFx0fVxuXG5cdFx0Ly8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdFxuXHRcdGlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7XG5cdFx0XHRldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSB7fTtcblx0XHR9XG5cdFx0aWYgKCAhKCBldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSApICkge1xuXHRcdFx0ZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgPSBmdW5jdGlvbiggZSApIHtcblxuXHRcdFx0XHQvLyBEaXNjYXJkIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dlcigpIGFuZFxuXHRcdFx0XHQvLyB3aGVuIGFuIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2UgaGFzIHVubG9hZGVkXG5cdFx0XHRcdHJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSBcInVuZGVmaW5lZFwiICYmIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSA/XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmFwcGx5KCBlbGVtLCBhcmd1bWVudHMgKSA6IHVuZGVmaW5lZDtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZVxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1sgdCBdICkgfHwgW107XG5cdFx0XHR0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsgMiBdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFRoZXJlICptdXN0KiBiZSBhIHR5cGUsIG5vIGF0dGFjaGluZyBuYW1lc3BhY2Utb25seSBoYW5kbGVyc1xuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4gdHlwZVxuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnNcblx0XHRcdGhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0b3JpZ1R5cGU6IG9yaWdUeXBlLFxuXHRcdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0XHRoYW5kbGVyOiBoYW5kbGVyLFxuXHRcdFx0XHRndWlkOiBoYW5kbGVyLmd1aWQsXG5cdFx0XHRcdHNlbGVjdG9yOiBzZWxlY3Rvcixcblx0XHRcdFx0bmVlZHNDb250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSxcblx0XHRcdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oIFwiLlwiIClcblx0XHRcdH0sIGhhbmRsZU9iakluICk7XG5cblx0XHRcdC8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0XG5cdFx0XHRpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHtcblx0XHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IFtdO1xuXHRcdFx0XHRoYW5kbGVycy5kZWxlZ2F0ZUNvdW50ID0gMDtcblxuXHRcdFx0XHQvLyBPbmx5IHVzZSBhZGRFdmVudExpc3RlbmVyIGlmIHRoZSBzcGVjaWFsIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2Vcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC5zZXR1cCB8fFxuXHRcdFx0XHRcdHNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHtcblx0XHRcdFx0XHRcdGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzcGVjaWFsLmFkZCApIHtcblx0XHRcdFx0c3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cblx0XHRcdFx0aWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHtcblx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdCwgZGVsZWdhdGVzIGluIGZyb250XG5cdFx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQrKywgMCwgaGFuZGxlT2JqICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gS2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBldmVyIGJlZW4gdXNlZCwgZm9yIGV2ZW50IG9wdGltaXphdGlvblxuXHRcdFx0alF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTtcblx0XHR9XG5cblx0fSxcblxuXHQvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnRcblx0cmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIHNlbGVjdG9yLCBtYXBwZWRUeXBlcyApIHtcblxuXHRcdHZhciBqLCBvcmlnQ291bnQsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7XG5cblx0XHRpZiAoICFlbGVtRGF0YSB8fCAhKCBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkXG5cdFx0dHlwZXMgPSAoIHR5cGVzIHx8IFwiXCIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZGF0YSBhbmQgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImhhbmRsZSBldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApO1xuXG5cdFx0dmFyIGksIGosIHJldCwgbWF0Y2hlZCwgaGFuZGxlT2JqLFxuXHRcdFx0aGFuZGxlclF1ZXVlID0gW10sXG5cdFx0XHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cdFx0XHRoYW5kbGVycyA9ICggZGF0YVByaXYuZ2V0KCB0aGlzLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdIHx8IFtdLFxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307XG5cblx0XHQvLyBVc2UgdGhlIGZpeC1lZCBqUXVlcnkuRXZlbnQgcmF0aGVyIHRoYW4gdGhlIChyZWFkLW9ubHkpIG5hdGl2ZSBldmVudFxuXHRcdGFyZ3NbIDAgXSA9IGV2ZW50O1xuXHRcdGV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpcztcblxuXHRcdC8vIENhbGwgdGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWlsIGlmIGRlc2lyZWRcblx0XHRpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaGFuZGxlcnNcblx0XHRoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7XG5cblx0XHQvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1c1xuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBtYXRjaGVkID0gaGFuZGxlclF1ZXVlWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTtcblxuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0gKSAmJlxuXHRcdFx0XHQhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0XHQvLyBUcmlnZ2VyZWQgZXZlbnQgbXVzdCBlaXRoZXIgMSkgaGF2ZSBubyBuYW1lc3BhY2UsIG9yIDIpIGhhdmUgbmFtZXNwYWNlKHMpXG5cdFx0XHRcdC8vIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLlxuXHRcdFx0XHRpZiAoICFldmVudC5ybmFtZXNwYWNlIHx8IGV2ZW50LnJuYW1lc3BhY2UudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkge1xuXG5cdFx0XHRcdFx0ZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqO1xuXHRcdFx0XHRcdGV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTtcblxuXHRcdFx0XHRcdHJldCA9ICggKCBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgaGFuZGxlT2JqLm9yaWdUeXBlIF0gfHwge30gKS5oYW5kbGUgfHxcblx0XHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyICkuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApO1xuXG5cdFx0XHRcdFx0aWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdGlmICggKCBldmVudC5yZXN1bHQgPSByZXQgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGwgdGhlIHBvc3REaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGVcblx0XHRpZiAoIHNwZWNpYWwucG9zdERpc3BhdGNoICkge1xuXHRcdFx0c3BlY2lhbC5wb3N0RGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQucmVzdWx0O1xuXHR9LFxuXG5cdGhhbmRsZXJzOiBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXJzICkge1xuXHRcdHZhciBpLCBtYXRjaGVzLCBzZWwsIGhhbmRsZU9iaixcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0ZGVsZWdhdGVDb3VudCA9IGhhbmRsZXJzLmRlbGVnYXRlQ291bnQsXG5cdFx0XHRjdXIgPSBldmVudC50YXJnZXQ7XG5cblx0XHQvLyBTdXBwb3J0IChhdCBsZWFzdCk6IENocm9tZSwgSUU5XG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICgjMTMxODApXG5cdFx0Ly9cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94PD00Mitcblx0XHQvLyBBdm9pZCBub24tbGVmdC1jbGljayBpbiBGRiBidXQgZG9uJ3QgYmxvY2sgSUUgcmFkaW8gZXZlbnRzICgjMzg2MSwgZ2gtMjM0Mylcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgJiYgY3VyLm5vZGVUeXBlICYmXG5cdFx0XHQoIGV2ZW50LnR5cGUgIT09IFwiY2xpY2tcIiB8fCBpc05hTiggZXZlbnQuYnV0dG9uICkgfHwgZXZlbnQuYnV0dG9uIDwgMSApICkge1xuXG5cdFx0XHRmb3IgKCA7IGN1ciAhPT0gdGhpczsgY3VyID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHtcblxuXHRcdFx0XHQvLyBEb24ndCBjaGVjayBub24tZWxlbWVudHMgKCMxMzIwOClcblx0XHRcdFx0Ly8gRG9uJ3QgcHJvY2VzcyBjbGlja3Mgb24gZGlzYWJsZWQgZWxlbWVudHMgKCM2OTExLCAjODE2NSwgIzExMzgyLCAjMTE3NjQpXG5cdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICggY3VyLmRpc2FibGVkICE9PSB0cnVlIHx8IGV2ZW50LnR5cGUgIT09IFwiY2xpY2tcIiApICkge1xuXHRcdFx0XHRcdG1hdGNoZXMgPSBbXTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID4gLTEgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG1hdGNoZXMubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogbWF0Y2hlcyB9ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCA8IGhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IHRoaXMsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaGFuZGxlclF1ZXVlO1xuXHR9LFxuXG5cdC8vIEluY2x1ZGVzIHNvbWUgZXZlbnQgcHJvcHMgc2hhcmVkIGJ5IEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50XG5cdHByb3BzOiAoIFwiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGV0YWlsIGV2ZW50UGhhc2UgXCIgK1xuXHRcdFwibWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaFwiICkuc3BsaXQoIFwiIFwiICksXG5cblx0Zml4SG9va3M6IHt9LFxuXG5cdGtleUhvb2tzOiB7XG5cdFx0cHJvcHM6IFwiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZVwiLnNwbGl0KCBcIiBcIiApLFxuXHRcdGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHtcblxuXHRcdFx0Ly8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzXG5cdFx0XHRpZiAoIGV2ZW50LndoaWNoID09IG51bGwgKSB7XG5cdFx0XHRcdGV2ZW50LndoaWNoID0gb3JpZ2luYWwuY2hhckNvZGUgIT0gbnVsbCA/IG9yaWdpbmFsLmNoYXJDb2RlIDogb3JpZ2luYWwua2V5Q29kZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV2ZW50O1xuXHRcdH1cblx0fSxcblxuXHRtb3VzZUhvb2tzOiB7XG5cdFx0cHJvcHM6ICggXCJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIFwiICtcblx0XHRcdFwic2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudFwiICkuc3BsaXQoIFwiIFwiICksXG5cdFx0ZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkge1xuXHRcdFx0dmFyIGV2ZW50RG9jLCBkb2MsIGJvZHksXG5cdFx0XHRcdGJ1dHRvbiA9IG9yaWdpbmFsLmJ1dHRvbjtcblxuXHRcdFx0Ly8gQ2FsY3VsYXRlIHBhZ2VYL1kgaWYgbWlzc2luZyBhbmQgY2xpZW50WC9ZIGF2YWlsYWJsZVxuXHRcdFx0aWYgKCBldmVudC5wYWdlWCA9PSBudWxsICYmIG9yaWdpbmFsLmNsaWVudFggIT0gbnVsbCApIHtcblx0XHRcdFx0ZXZlbnREb2MgPSBldmVudC50YXJnZXQub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDtcblx0XHRcdFx0ZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0XHRib2R5ID0gZXZlbnREb2MuYm9keTtcblxuXHRcdFx0XHRldmVudC5wYWdlWCA9IG9yaWdpbmFsLmNsaWVudFggK1xuXHRcdFx0XHRcdCggZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYgYm9keS5zY3JvbGxMZWZ0IHx8IDAgKSAtXG5cdFx0XHRcdFx0KCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCApO1xuXHRcdFx0XHRldmVudC5wYWdlWSA9IG9yaWdpbmFsLmNsaWVudFkgK1xuXHRcdFx0XHRcdCggZG9jICYmIGRvYy5zY3JvbGxUb3AgIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgIHx8IDAgKSAtXG5cdFx0XHRcdFx0KCBkb2MgJiYgZG9jLmNsaWVudFRvcCAgfHwgYm9keSAmJiBib2R5LmNsaWVudFRvcCAgfHwgMCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0XG5cdFx0XHQvLyBOb3RlOiBidXR0b24gaXMgbm90IG5vcm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdFxuXHRcdFx0aWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdGV2ZW50LndoaWNoID0gKCBidXR0b24gJiAxID8gMSA6ICggYnV0dG9uICYgMiA/IDMgOiAoIGJ1dHRvbiAmIDQgPyAyIDogMCApICkgKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV2ZW50O1xuXHRcdH1cblx0fSxcblxuXHRmaXg6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRpZiAoIGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdICkge1xuXHRcdFx0cmV0dXJuIGV2ZW50O1xuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBhIHdyaXRhYmxlIGNvcHkgb2YgdGhlIGV2ZW50IG9iamVjdCBhbmQgbm9ybWFsaXplIHNvbWUgcHJvcGVydGllc1xuXHRcdHZhciBpLCBwcm9wLCBjb3B5LFxuXHRcdFx0dHlwZSA9IGV2ZW50LnR5cGUsXG5cdFx0XHRvcmlnaW5hbEV2ZW50ID0gZXZlbnQsXG5cdFx0XHRmaXhIb29rID0gdGhpcy5maXhIb29rc1sgdHlwZSBdO1xuXG5cdFx0aWYgKCAhZml4SG9vayApIHtcblx0XHRcdHRoaXMuZml4SG9va3NbIHR5cGUgXSA9IGZpeEhvb2sgPVxuXHRcdFx0XHRybW91c2VFdmVudC50ZXN0KCB0eXBlICkgPyB0aGlzLm1vdXNlSG9va3MgOlxuXHRcdFx0XHRya2V5RXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5rZXlIb29rcyA6XG5cdFx0XHRcdHt9O1xuXHRcdH1cblx0XHRjb3B5ID0gZml4SG9vay5wcm9wcyA/IHRoaXMucHJvcHMuY29uY2F0KCBmaXhIb29rLnByb3BzICkgOiB0aGlzLnByb3BzO1xuXG5cdFx0ZXZlbnQgPSBuZXcgalF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7XG5cblx0XHRpID0gY29weS5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRwcm9wID0gY29weVsgaSBdO1xuXHRcdFx0ZXZlbnRbIHByb3AgXSA9IG9yaWdpbmFsRXZlbnRbIHByb3AgXTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBDb3Jkb3ZhIDIuNSAoV2ViS2l0KSAoIzEzMjU1KVxuXHRcdC8vIEFsbCBldmVudHMgc2hvdWxkIGhhdmUgYSB0YXJnZXQ7IENvcmRvdmEgZGV2aWNlcmVhZHkgZG9lc24ndFxuXHRcdGlmICggIWV2ZW50LnRhcmdldCApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGRvY3VtZW50O1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA2LjArLCBDaHJvbWU8Mjhcblx0XHQvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKVxuXHRcdGlmICggZXZlbnQudGFyZ2V0Lm5vZGVUeXBlID09PSAzICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZpeEhvb2suZmlsdGVyID8gZml4SG9vay5maWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50ICkgOiBldmVudDtcblx0fSxcblxuXHRzcGVjaWFsOiB7XG5cdFx0bG9hZDoge1xuXG5cdFx0XHQvLyBQcmV2ZW50IHRyaWdnZXJlZCBpbWFnZS5sb2FkIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHRvIHdpbmRvdy5sb2FkXG5cdFx0XHRub0J1YmJsZTogdHJ1ZVxuXHRcdH0sXG5cdFx0Zm9jdXM6IHtcblxuXHRcdFx0Ly8gRmlyZSBuYXRpdmUgZXZlbnQgaWYgcG9zc2libGUgc28gYmx1ci9mb2N1cyBzZXF1ZW5jZSBpcyBjb3JyZWN0XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzICE9PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuZm9jdXMgKSB7XG5cdFx0XHRcdFx0dGhpcy5mb2N1cygpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlbGVnYXRlVHlwZTogXCJmb2N1c2luXCJcblx0XHR9LFxuXHRcdGJsdXI6IHtcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMgPT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5ibHVyICkge1xuXHRcdFx0XHRcdHRoaXMuYmx1cigpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlbGVnYXRlVHlwZTogXCJmb2N1c291dFwiXG5cdFx0fSxcblx0XHRjbGljazoge1xuXG5cdFx0XHQvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcy50eXBlID09PSBcImNoZWNrYm94XCIgJiYgdGhpcy5jbGljayAmJiBqUXVlcnkubm9kZU5hbWUoIHRoaXMsIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHRoaXMuY2xpY2soKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5LCBkb24ndCBmaXJlIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rc1xuXHRcdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZXZlbnQudGFyZ2V0LCBcImFcIiApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRiZWZvcmV1bmxvYWQ6IHtcblx0XHRcdHBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggMjArXG5cdFx0XHRcdC8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC5cblx0XHRcdFx0aWYgKCBldmVudC5yZXN1bHQgIT09IHVuZGVmaW5lZCAmJiBldmVudC5vcmlnaW5hbEV2ZW50ICkge1xuXHRcdFx0XHRcdGV2ZW50Lm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWUgPSBldmVudC5yZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5yZW1vdmVFdmVudCA9IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7XG5cblx0Ly8gVGhpcyBcImlmXCIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzXG5cdGlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkge1xuXHRcdGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgaGFuZGxlICk7XG5cdH1cbn07XG5cbmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkge1xuXG5cdC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZFxuXHRpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHtcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gRXZlbnQgb2JqZWN0XG5cdGlmICggc3JjICYmIHNyYy50eXBlICkge1xuXHRcdHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYztcblx0XHR0aGlzLnR5cGUgPSBzcmMudHlwZTtcblxuXHRcdC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG5cdFx0Ly8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuXG5cdFx0dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fFxuXHRcdFx0XHRzcmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5kZWZpbmVkICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjBcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdC8vIEV2ZW50IHR5cGVcblx0fSBlbHNlIHtcblx0XHR0aGlzLnR5cGUgPSBzcmM7XG5cdH1cblxuXHQvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuXHRpZiAoIHByb3BzICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxuXHR0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IGpRdWVyeS5ub3coKTtcblxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXG5cdHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlO1xufTtcblxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWxcbmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBqUXVlcnkuRXZlbnQsXG5cdGlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsXG5cdGlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgKSB7XG5cdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cbn07XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gc28gdGhhdCBldmVudCBkZWxlZ2F0aW9uIHdvcmtzIGluIGpRdWVyeS5cbi8vIERvIHRoZSBzYW1lIGZvciBwb2ludGVyZW50ZXIvcG9pbnRlcmxlYXZlIGFuZCBwb2ludGVyb3Zlci9wb2ludGVyb3V0XG4vL1xuLy8gU3VwcG9ydDogU2FmYXJpIDcgb25seVxuLy8gU2FmYXJpIHNlbmRzIG1vdXNlZW50ZXIgdG9vIG9mdGVuOyBzZWU6XG4vLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDcwMjU4XG4vLyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBidWcgKGl0IGV4aXN0ZWQgaW4gb2xkZXIgQ2hyb21lIHZlcnNpb25zIGFzIHdlbGwpLlxualF1ZXJ5LmVhY2goIHtcblx0bW91c2VlbnRlcjogXCJtb3VzZW92ZXJcIixcblx0bW91c2VsZWF2ZTogXCJtb3VzZW91dFwiLFxuXHRwb2ludGVyZW50ZXI6IFwicG9pbnRlcm92ZXJcIixcblx0cG9pbnRlcmxlYXZlOiBcInBvaW50ZXJvdXRcIlxufSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHtcblx0XHRkZWxlZ2F0ZVR5cGU6IGZpeCxcblx0XHRiaW5kVHlwZTogZml4LFxuXG5cdFx0aGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHR0YXJnZXQgPSB0aGlzLFxuXHRcdFx0XHRyZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCxcblx0XHRcdFx0aGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqO1xuXG5cdFx0XHQvLyBGb3IgbW91c2VlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LlxuXHRcdFx0Ly8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3dcblx0XHRcdGlmICggIXJlbGF0ZWQgfHwgKCByZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkgKSApIHtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTtcblx0XHRcdFx0cmV0ID0gaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRldmVudC50eXBlID0gZml4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0b246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHRvbmU6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApO1xuXHR9LFxuXHRvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkge1xuXHRcdHZhciBoYW5kbGVPYmosIHR5cGU7XG5cdFx0aWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7XG5cblx0XHRcdC8vICggZXZlbnQgKSAgZGlzcGF0Y2hlZCBqUXVlcnkuRXZlbnRcblx0XHRcdGhhbmRsZU9iaiA9IHR5cGVzLmhhbmRsZU9iajtcblx0XHRcdGpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoXG5cdFx0XHRcdGhhbmRsZU9iai5uYW1lc3BhY2UgP1xuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSArIFwiLlwiICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlLFxuXHRcdFx0XHRoYW5kbGVPYmouc2VsZWN0b3IsXG5cdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLW9iamVjdCBbLCBzZWxlY3Rvcl0gKVxuXHRcdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdFx0dGhpcy5vZmYoIHR5cGUsIHNlbGVjdG9yLCB0eXBlc1sgdHlwZSBdICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMgWywgZm5dIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG52YXJcblx0cnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1xcdzotXSspW14+XSopXFwvPi9naSxcblxuXHQvLyBTdXBwb3J0OiBJRSAxMC0xMSwgRWRnZSAxMDI0MCtcblx0Ly8gSW4gSUUvRWRnZSB1c2luZyByZWdleCBncm91cHMgaGVyZSBjYXVzZXMgc2V2ZXJlIHNsb3dkb3ducy5cblx0Ly8gU2VlIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvMTczNjUxMi9cblx0cm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksXG5cblx0Ly8gY2hlY2tlZD1cImNoZWNrZWRcIiBvciBjaGVja2VkXG5cdHJjaGVja2VkID0gL2NoZWNrZWRcXHMqKD86W149XXw9XFxzKi5jaGVja2VkLikvaSxcblx0cnNjcmlwdFR5cGVNYXNrZWQgPSAvXnRydWVcXC8oLiopLyxcblx0cmNsZWFuU2NyaXB0ID0gL15cXHMqPCEoPzpcXFtDREFUQVxcW3wtLSl8KD86XFxdXFxdfC0tKT5cXHMqJC9nO1xuXG4vLyBNYW5pcHVsYXRpbmcgdGFibGVzIHJlcXVpcmVzIGEgdGJvZHlcbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0cmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJ0YWJsZVwiICkgJiZcblx0XHRqUXVlcnkubm9kZU5hbWUoIGNvbnRlbnQubm9kZVR5cGUgIT09IDExID8gY29udGVudCA6IGNvbnRlbnQuZmlyc3RDaGlsZCwgXCJ0clwiICkgP1xuXG5cdFx0ZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJ0Ym9keVwiIClbIDAgXSB8fFxuXHRcdFx0ZWxlbS5hcHBlbmRDaGlsZCggZWxlbS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwidGJvZHlcIiApICkgOlxuXHRcdGVsZW07XG59XG5cbi8vIFJlcGxhY2UvcmVzdG9yZSB0aGUgdHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb25cbmZ1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7XG5cdGVsZW0udHlwZSA9ICggZWxlbS5nZXRBdHRyaWJ1dGUoIFwidHlwZVwiICkgIT09IG51bGwgKSArIFwiL1wiICsgZWxlbS50eXBlO1xuXHRyZXR1cm4gZWxlbTtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7XG5cdHZhciBtYXRjaCA9IHJzY3JpcHRUeXBlTWFza2VkLmV4ZWMoIGVsZW0udHlwZSApO1xuXG5cdGlmICggbWF0Y2ggKSB7XG5cdFx0ZWxlbS50eXBlID0gbWF0Y2hbIDEgXTtcblx0fSBlbHNlIHtcblx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggXCJ0eXBlXCIgKTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5mdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkge1xuXHR2YXIgaSwgbCwgdHlwZSwgcGRhdGFPbGQsIHBkYXRhQ3VyLCB1ZGF0YU9sZCwgdWRhdGFDdXIsIGV2ZW50cztcblxuXHRpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gMS4gQ29weSBwcml2YXRlIGRhdGE6IGV2ZW50cywgaGFuZGxlcnMsIGV0Yy5cblx0aWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHRwZGF0YU9sZCA9IGRhdGFQcml2LmFjY2Vzcyggc3JjICk7XG5cdFx0cGRhdGFDdXIgPSBkYXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7XG5cdFx0ZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzO1xuXG5cdFx0aWYgKCBldmVudHMgKSB7XG5cdFx0XHRkZWxldGUgcGRhdGFDdXIuaGFuZGxlO1xuXHRcdFx0cGRhdGFDdXIuZXZlbnRzID0ge307XG5cblx0XHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xuXHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlwZSBdLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBkZXN0LCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyAyLiBDb3B5IHVzZXIgZGF0YVxuXHRpZiAoIGRhdGFVc2VyLmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHVkYXRhT2xkID0gZGF0YVVzZXIuYWNjZXNzKCBzcmMgKTtcblx0XHR1ZGF0YUN1ciA9IGpRdWVyeS5leHRlbmQoIHt9LCB1ZGF0YU9sZCApO1xuXG5cdFx0ZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApO1xuXHR9XG59XG5cbi8vIEZpeCBJRSBidWdzLCBzZWUgc3VwcG9ydCB0ZXN0c1xuZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHtcblx0dmFyIG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdC8vIEZhaWxzIHRvIHBlcnNpc3QgdGhlIGNoZWNrZWQgc3RhdGUgb2YgYSBjbG9uZWQgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uLlxuXHRpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHtcblx0XHRkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDtcblxuXHQvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9uc1xuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgKSB7XG5cdFx0ZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGRvbU1hbmlwKCBjb2xsZWN0aW9uLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApIHtcblxuXHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdGFyZ3MgPSBjb25jYXQuYXBwbHkoIFtdLCBhcmdzICk7XG5cblx0dmFyIGZyYWdtZW50LCBmaXJzdCwgc2NyaXB0cywgaGFzU2NyaXB0cywgbm9kZSwgZG9jLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBjb2xsZWN0aW9uLmxlbmd0aCxcblx0XHRpTm9DbG9uZSA9IGwgLSAxLFxuXHRcdHZhbHVlID0gYXJnc1sgMCBdLFxuXHRcdGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCBpc0Z1bmN0aW9uIHx8XG5cdFx0XHQoIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQhc3VwcG9ydC5jaGVja0Nsb25lICYmIHJjaGVja2VkLnRlc3QoIHZhbHVlICkgKSApIHtcblx0XHRyZXR1cm4gY29sbGVjdGlvbi5lYWNoKCBmdW5jdGlvbiggaW5kZXggKSB7XG5cdFx0XHR2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdGFyZ3NbIDAgXSA9IHZhbHVlLmNhbGwoIHRoaXMsIGluZGV4LCBzZWxmLmh0bWwoKSApO1xuXHRcdFx0fVxuXHRcdFx0ZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7XG5cdFx0fSApO1xuXHR9XG5cblx0aWYgKCBsICkge1xuXHRcdGZyYWdtZW50ID0gYnVpbGRGcmFnbWVudCggYXJncywgY29sbGVjdGlvblsgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNlLCBjb2xsZWN0aW9uLCBpZ25vcmVkICk7XG5cdFx0Zmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0aWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdGZyYWdtZW50ID0gZmlyc3Q7XG5cdFx0fVxuXG5cdFx0Ly8gUmVxdWlyZSBlaXRoZXIgbmV3IGNvbnRlbnQgb3IgYW4gaW50ZXJlc3QgaW4gaWdub3JlZCBlbGVtZW50cyB0byBpbnZva2UgdGhlIGNhbGxiYWNrXG5cdFx0aWYgKCBmaXJzdCB8fCBpZ25vcmVkICkge1xuXHRcdFx0c2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsIFwic2NyaXB0XCIgKSwgZGlzYWJsZVNjcmlwdCApO1xuXHRcdFx0aGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoO1xuXG5cdFx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IGZvciB0aGUgbGFzdCBpdGVtXG5cdFx0XHQvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXBcblx0XHRcdC8vIGJlaW5nIGVtcHRpZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICgjODA3MCkuXG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdG5vZGUgPSBmcmFnbWVudDtcblxuXHRcdFx0XHRpZiAoIGkgIT09IGlOb0Nsb25lICkge1xuXHRcdFx0XHRcdG5vZGUgPSBqUXVlcnkuY2xvbmUoIG5vZGUsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdC8vIEtlZXAgcmVmZXJlbmNlcyB0byBjbG9uZWQgc2NyaXB0cyBmb3IgbGF0ZXIgcmVzdG9yYXRpb25cblx0XHRcdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xLCBQaGFudG9tSlM8MlxuXHRcdFx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNhbGxiYWNrLmNhbGwoIGNvbGxlY3Rpb25bIGkgXSwgbm9kZSwgaSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cdFx0XHRcdGRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7XG5cblx0XHRcdFx0Ly8gUmVlbmFibGUgc2NyaXB0c1xuXHRcdFx0XHRqUXVlcnkubWFwKCBzY3JpcHRzLCByZXN0b3JlU2NyaXB0ICk7XG5cblx0XHRcdFx0Ly8gRXZhbHVhdGUgZXhlY3V0YWJsZSBzY3JpcHRzIG9uIGZpcnN0IGRvY3VtZW50IGluc2VydGlvblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHtcblx0XHRcdFx0XHRub2RlID0gc2NyaXB0c1sgaSBdO1xuXHRcdFx0XHRcdGlmICggcnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBlIHx8IFwiXCIgKSAmJlxuXHRcdFx0XHRcdFx0IWRhdGFQcml2LmFjY2Vzcyggbm9kZSwgXCJnbG9iYWxFdmFsXCIgKSAmJlxuXHRcdFx0XHRcdFx0alF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBub2RlLnNyYyApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudFxuXHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5fZXZhbFVybCApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuX2V2YWxVcmwoIG5vZGUuc3JjICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgXCJcIiApICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBEYXRhICkge1xuXHR2YXIgbm9kZSxcblx0XHRub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdGlmICggIWtlZXBEYXRhICYmIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIG5vZGUgKSApO1xuXHRcdH1cblxuXHRcdGlmICggbm9kZS5wYXJlbnROb2RlICkge1xuXHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIG5vZGUub3duZXJEb2N1bWVudCwgbm9kZSApICkge1xuXHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0fVxuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBub2RlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aHRtbFByZWZpbHRlcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0cmV0dXJuIGh0bWwucmVwbGFjZSggcnhodG1sVGFnLCBcIjwkMT48LyQyPlwiICk7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHR2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cyxcblx0XHRcdGNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKSxcblx0XHRcdGluUGFnZSA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHQvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXNcblx0XHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmXG5cdFx0XHRcdCFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBodHRwOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzJcblx0XHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUgKTtcblx0XHRcdHNyY0VsZW1lbnRzID0gZ2V0QWxsKCBlbGVtICk7XG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lXG5cdFx0aWYgKCBkYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0aWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdFx0c3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBnZXRBbGwoIGVsZW0gKTtcblx0XHRcdFx0ZGVzdEVsZW1lbnRzID0gZGVzdEVsZW1lbnRzIHx8IGdldEFsbCggY2xvbmUgKTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRjbG9uZUNvcHlFdmVudCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUsIFwic2NyaXB0XCIgKTtcblx0XHRpZiAoIGRlc3RFbGVtZW50cy5sZW5ndGggPiAwICkge1xuXHRcdFx0c2V0R2xvYmFsRXZhbCggZGVzdEVsZW1lbnRzLCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgXCJzY3JpcHRcIiApICk7XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0XG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9LFxuXG5cdGNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBkYXRhLCBlbGVtLCB0eXBlLFxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPT0gdW5kZWZpbmVkOyBpKysgKSB7XG5cdFx0XHRpZiAoIGFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdFx0aWYgKCAoIGRhdGEgPSBlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0Zm9yICggdHlwZSBpbiBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWRcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0gMzUtNDUrXG5cdFx0XHRcdFx0Ly8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlXG5cdFx0XHRcdFx0ZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdICkge1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9IDM1LTQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0Ly8gS2VlcCBkb21NYW5pcCBleHBvc2VkIHVudGlsIDMuMCAoZ2gtMjIyNSlcblx0ZG9tTWFuaXA6IGRvbU1hbmlwLFxuXG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaWdub3JlZCA9IFtdO1xuXG5cdFx0Ly8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggbm9uLWlnbm9yZWQgY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggdGhpcywgaWdub3JlZCApIDwgMCApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTtcblx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uXG5cdFx0fSwgaWdub3JlZCApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCB7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFF0V2ViS2l0XG5cdFx0XHQvLyAuZ2V0KCkgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzXG5cdFx0XHRwdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTtcblx0fTtcbn0gKTtcblxuXG52YXIgaWZyYW1lLFxuXHRlbGVtZGlzcGxheSA9IHtcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3hcblx0XHQvLyBXZSBoYXZlIHRvIHByZS1kZWZpbmUgdGhlc2UgdmFsdWVzIGZvciBGRiAoIzEwMjI3KVxuXHRcdEhUTUw6IFwiYmxvY2tcIixcblx0XHRCT0RZOiBcImJsb2NrXCJcblx0fTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgYWN0dWFsIGRpc3BsYXkgb2YgYSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBub2RlTmFtZSBvZiB0aGUgZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IGRvYyBEb2N1bWVudCBvYmplY3RcbiAqL1xuXG4vLyBDYWxsZWQgb25seSBmcm9tIHdpdGhpbiBkZWZhdWx0RGlzcGxheVxuZnVuY3Rpb24gYWN0dWFsRGlzcGxheSggbmFtZSwgZG9jICkge1xuXHR2YXIgZWxlbSA9IGpRdWVyeSggZG9jLmNyZWF0ZUVsZW1lbnQoIG5hbWUgKSApLmFwcGVuZFRvKCBkb2MuYm9keSApLFxuXG5cdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW1bIDAgXSwgXCJkaXNwbGF5XCIgKTtcblxuXHQvLyBXZSBkb24ndCBoYXZlIGFueSBkYXRhIHN0b3JlZCBvbiB0aGUgZWxlbWVudCxcblx0Ly8gc28gdXNlIFwiZGV0YWNoXCIgbWV0aG9kIGFzIGZhc3Qgd2F5IHRvIGdldCByaWQgb2YgdGhlIGVsZW1lbnRcblx0ZWxlbS5kZXRhY2goKTtcblxuXHRyZXR1cm4gZGlzcGxheTtcbn1cblxuLyoqXG4gKiBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IG5vZGVOYW1lXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHREaXNwbGF5KCBub2RlTmFtZSApIHtcblx0dmFyIGRvYyA9IGRvY3VtZW50LFxuXHRcdGRpc3BsYXkgPSBlbGVtZGlzcGxheVsgbm9kZU5hbWUgXTtcblxuXHRpZiAoICFkaXNwbGF5ICkge1xuXHRcdGRpc3BsYXkgPSBhY3R1YWxEaXNwbGF5KCBub2RlTmFtZSwgZG9jICk7XG5cblx0XHQvLyBJZiB0aGUgc2ltcGxlIHdheSBmYWlscywgcmVhZCBmcm9tIGluc2lkZSBhbiBpZnJhbWVcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiIHx8ICFkaXNwbGF5ICkge1xuXG5cdFx0XHQvLyBVc2UgdGhlIGFscmVhZHktY3JlYXRlZCBpZnJhbWUgaWYgcG9zc2libGVcblx0XHRcdGlmcmFtZSA9ICggaWZyYW1lIHx8IGpRdWVyeSggXCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+XCIgKSApXG5cdFx0XHRcdC5hcHBlbmRUbyggZG9jLmRvY3VtZW50RWxlbWVudCApO1xuXG5cdFx0XHQvLyBBbHdheXMgd3JpdGUgYSBuZXcgSFRNTCBza2VsZXRvbiBzbyBXZWJraXQgYW5kIEZpcmVmb3ggZG9uJ3QgY2hva2Ugb24gcmV1c2Vcblx0XHRcdGRvYyA9IGlmcmFtZVsgMCBdLmNvbnRlbnREb2N1bWVudDtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUVcblx0XHRcdGRvYy53cml0ZSgpO1xuXHRcdFx0ZG9jLmNsb3NlKCk7XG5cblx0XHRcdGRpc3BsYXkgPSBhY3R1YWxEaXNwbGF5KCBub2RlTmFtZSwgZG9jICk7XG5cdFx0XHRpZnJhbWUuZGV0YWNoKCk7XG5cdFx0fVxuXG5cdFx0Ly8gU3RvcmUgdGhlIGNvcnJlY3QgZGVmYXVsdCBkaXNwbGF5XG5cdFx0ZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xuXHR9XG5cblx0cmV0dXJuIGRpc3BsYXk7XG59XG52YXIgcm1hcmdpbiA9ICggL15tYXJnaW4vICk7XG5cbnZhciBybnVtbm9ucHggPSBuZXcgUmVnRXhwKCBcIl4oXCIgKyBwbnVtICsgXCIpKD8hcHgpW2EteiVdKyRcIiwgXCJpXCIgKTtcblxudmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUU8PTExKywgRmlyZWZveDw9MzArICgjMTUwOTgsICMxNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHR2YXIgdmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkge1xuXHRcdFx0dmlldyA9IHdpbmRvdztcblx0XHR9XG5cblx0XHRyZXR1cm4gdmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG5cdH07XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrLCBhcmdzICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTtcblxuXHQvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn07XG5cblxudmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBwaXhlbFBvc2l0aW9uVmFsLCBib3hTaXppbmdSZWxpYWJsZVZhbCwgcGl4ZWxNYXJnaW5SaWdodFZhbCwgcmVsaWFibGVNYXJnaW5MZWZ0VmFsLFxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0Ly8gRmluaXNoIGVhcmx5IGluIGxpbWl0ZWQgKG5vbi1icm93c2VyKSBlbnZpcm9ubWVudHNcblx0aWYgKCAhZGl2LnN0eWxlICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0Ly8gU3R5bGUgb2YgY2xvbmVkIGVsZW1lbnQgYWZmZWN0cyBzb3VyY2UgZWxlbWVudCBjbG9uZWQgKCM4OTA4KVxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7XCIgK1xuXHRcdFwicGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlXCI7XG5cdGNvbnRhaW5lci5hcHBlbmRDaGlsZCggZGl2ICk7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyOSwgQW5kcm9pZCAyLjNcblx0XHRcdC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZ1xuXHRcdFx0XCItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7XCIgK1xuXHRcdFx0XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO1wiICtcblx0XHRcdFwibWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDtcIiArXG5cdFx0XHRcInRvcDoxJTt3aWR0aDo1MCVcIjtcblx0XHRkaXYuaW5uZXJIVE1MID0gXCJcIjtcblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApO1xuXG5cdFx0dmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3AgIT09IFwiMSVcIjtcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSBkaXZTdHlsZS5tYXJnaW5MZWZ0ID09PSBcIjJweFwiO1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gZGl2U3R5bGUud2lkdGggPT09IFwiNHB4XCI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdFx0Ly8gU29tZSBzdHlsZXMgY29tZSBiYWNrIHdpdGggcGVyY2VudGFnZSB2YWx1ZXMsIGV2ZW4gdGhvdWdoIHRoZXkgc2hvdWxkbid0XG5cdFx0ZGl2LnN0eWxlLm1hcmdpblJpZ2h0ID0gXCI1MCVcIjtcblx0XHRwaXhlbE1hcmdpblJpZ2h0VmFsID0gZGl2U3R5bGUubWFyZ2luUmlnaHQgPT09IFwiNHB4XCI7XG5cblx0XHRkb2N1bWVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoIGNvbnRhaW5lciApO1xuXHR9XG5cblx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBUaGlzIHRlc3QgaXMgZXhlY3V0ZWQgb25seSBvbmNlIGJ1dCB3ZSBzdGlsbCBkbyBtZW1vaXppbmdcblx0XHRcdC8vIHNpbmNlIHdlIGNhbiB1c2UgdGhlIGJveFNpemluZ1JlbGlhYmxlIHByZS1jb21wdXRpbmcuXG5cdFx0XHQvLyBObyBuZWVkIHRvIGNoZWNrIGlmIHRoZSB0ZXN0IHdhcyBhbHJlYWR5IHBlcmZvcm1lZCwgdGhvdWdoLlxuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0Ym94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBib3hTaXppbmdSZWxpYWJsZVZhbCA9PSBudWxsICkge1xuXHRcdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxNYXJnaW5SaWdodDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wLTQuM1xuXHRcdFx0Ly8gV2UncmUgY2hlY2tpbmcgZm9yIGJveFNpemluZ1JlbGlhYmxlVmFsIGhlcmUgaW5zdGVhZCBvZiBwaXhlbE1hcmdpblJpZ2h0VmFsXG5cdFx0XHQvLyBzaW5jZSB0aGF0IGNvbXByZXNzZXMgYmV0dGVyIGFuZCB0aGV5J3JlIGNvbXB1dGVkIHRvZ2V0aGVyIGFueXdheS5cblx0XHRcdGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBwaXhlbE1hcmdpblJpZ2h0VmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IG9ubHksIEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gMzdcblx0XHRcdGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZWxpYWJsZU1hcmdpbkxlZnRWYWw7XG5cdFx0fSxcblx0XHRyZWxpYWJsZU1hcmdpblJpZ2h0OiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjNcblx0XHRcdC8vIENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHlcblx0XHRcdC8vIGdldHMgY29tcHV0ZWQgbWFyZ2luLXJpZ2h0IGJhc2VkIG9uIHdpZHRoIG9mIGNvbnRhaW5lci4gKCMzMzMzKVxuXHRcdFx0Ly8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0XG5cdFx0XHQvLyBUaGlzIHN1cHBvcnQgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBvbmNlIHNvIG5vIG1lbW9pemluZyBpcyBuZWVkZWQuXG5cdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHRtYXJnaW5EaXYgPSBkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHQvLyBSZXNldCBDU1M6IGJveC1zaXppbmc7IGRpc3BsYXk7IG1hcmdpbjsgYm9yZGVyOyBwYWRkaW5nXG5cdFx0XHRtYXJnaW5EaXYuc3R5bGUuY3NzVGV4dCA9IGRpdi5zdHlsZS5jc3NUZXh0ID1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuXHRcdFx0XHQvLyBWZW5kb3ItcHJlZml4IGJveC1zaXppbmdcblx0XHRcdFx0XCItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtcIiArXG5cdFx0XHRcdFwiZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjBcIjtcblx0XHRcdG1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IG1hcmdpbkRpdi5zdHlsZS53aWR0aCA9IFwiMFwiO1xuXHRcdFx0ZGl2LnN0eWxlLndpZHRoID0gXCIxcHhcIjtcblx0XHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICk7XG5cblx0XHRcdHJldCA9ICFwYXJzZUZsb2F0KCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggbWFyZ2luRGl2ICkubWFyZ2luUmlnaHQgKTtcblxuXHRcdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblx0XHRcdGRpdi5yZW1vdmVDaGlsZCggbWFyZ2luRGl2ICk7XG5cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHR9ICk7XG59ICkoKTtcblxuXG5mdW5jdGlvbiBjdXJDU1MoIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApO1xuXHRyZXQgPSBjb21wdXRlZCA/IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdIDogdW5kZWZpbmVkO1xuXG5cdC8vIFN1cHBvcnQ6IE9wZXJhIDEyLjF4IG9ubHlcblx0Ly8gRmFsbCBiYWNrIHRvIHN0eWxlIGV2ZW4gd2l0aG91dCBjb21wdXRlZFxuXHQvLyBjb21wdXRlZCBpcyB1bmRlZmluZWQgZm9yIGVsZW1zIG9uIGRvY3VtZW50IGZyYWdtZW50c1xuXHRpZiAoICggcmV0ID09PSBcIlwiIHx8IHJldCA9PT0gdW5kZWZpbmVkICkgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7XG5cdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRTlcblx0Ly8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBvbmx5IG5lZWRlZCBmb3IgLmNzcygnZmlsdGVyJykgKCMxMjUzNylcblx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBBbmRyb2lkIEJyb3dzZXIgcmV0dXJucyBwZXJjZW50YWdlIGZvciBzb21lIHZhbHVlcyxcblx0XHQvLyBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzLlxuXHRcdC8vIFRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQgc3BlYzpcblx0XHQvLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5waXhlbE1hcmdpblJpZ2h0KCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJtYXJnaW4udGVzdCggbmFtZSApICkge1xuXG5cdFx0XHQvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzXG5cdFx0XHR3aWR0aCA9IHN0eWxlLndpZHRoO1xuXHRcdFx0bWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDtcblx0XHRcdG1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7XG5cblx0XHRcdC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXRcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDtcblx0XHRcdHJldCA9IGNvbXB1dGVkLndpZHRoO1xuXG5cdFx0XHQvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXG5cdFx0XHRzdHlsZS53aWR0aCA9IHdpZHRoO1xuXHRcdFx0c3R5bGUubWluV2lkdGggPSBtaW5XaWR0aDtcblx0XHRcdHN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJldCAhPT0gdW5kZWZpbmVkID9cblxuXHRcdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0XHQvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLlxuXHRcdHJldCArIFwiXCIgOlxuXHRcdHJldDtcbn1cblxuXG5mdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7XG5cblx0Ly8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBjb25kaXRpb25GbigpICkge1xuXG5cdFx0XHRcdC8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZVxuXHRcdFx0XHQvLyB0byBtaXNzaW5nIGRlcGVuZGVuY3kpLCByZW1vdmUgaXQuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmdldDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi5cblx0XHRcdHJldHVybiAoIHRoaXMuZ2V0ID0gaG9va0ZuICkuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fTtcbn1cblxuXG52YXJcblxuXHQvLyBTd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlXG5cdC8vIGV4Y2VwdCBcInRhYmxlXCIsIFwidGFibGUtY2VsbFwiLCBvciBcInRhYmxlLWNhcHRpb25cIlxuXHQvLyBTZWUgaGVyZSBmb3IgZGlzcGxheSB2YWx1ZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvQ1NTL2Rpc3BsYXlcblx0cmRpc3BsYXlzd2FwID0gL14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFxuXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxuXHRjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7XG5cdFx0bGV0dGVyU3BhY2luZzogXCIwXCIsXG5cdFx0Zm9udFdlaWdodDogXCI0MDBcIlxuXHR9LFxuXG5cdGNzc1ByZWZpeGVzID0gWyBcIldlYmtpdFwiLCBcIk9cIiwgXCJNb3pcIiwgXCJtc1wiIF0sXG5cdGVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkuc3R5bGU7XG5cbi8vIFJldHVybiBhIGNzcyBwcm9wZXJ0eSBtYXBwZWQgdG8gYSBwb3RlbnRpYWxseSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHlcbmZ1bmN0aW9uIHZlbmRvclByb3BOYW1lKCBuYW1lICkge1xuXG5cdC8vIFNob3J0Y3V0IGZvciBuYW1lcyB0aGF0IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkXG5cdGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkge1xuXHRcdHJldHVybiBuYW1lO1xuXHR9XG5cblx0Ly8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lc1xuXHR2YXIgY2FwTmFtZSA9IG5hbWVbIDAgXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSggMSApLFxuXHRcdGkgPSBjc3NQcmVmaXhlcy5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0bmFtZSA9IGNzc1ByZWZpeGVzWyBpIF0gKyBjYXBOYW1lO1xuXHRcdGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkge1xuXHRcdFx0cmV0dXJuIG5hbWU7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7XG5cblx0Ly8gQW55IHJlbGF0aXZlICgrLy0pIHZhbHVlcyBoYXZlIGFscmVhZHkgYmVlblxuXHQvLyBub3JtYWxpemVkIGF0IHRoaXMgcG9pbnRcblx0dmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7XG5cdHJldHVybiBtYXRjaGVzID9cblxuXHRcdC8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkIFwic3VidHJhY3RcIiwgZS5nLiwgd2hlbiB1c2VkIGFzIGluIGNzc0hvb2tzXG5cdFx0TWF0aC5tYXgoIDAsIG1hdGNoZXNbIDIgXSAtICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSA6XG5cdFx0dmFsdWU7XG59XG5cbmZ1bmN0aW9uIGF1Z21lbnRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSwgaXNCb3JkZXJCb3gsIHN0eWxlcyApIHtcblx0dmFyIGkgPSBleHRyYSA9PT0gKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApID9cblxuXHRcdC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvblxuXHRcdDQgOlxuXG5cdFx0Ly8gT3RoZXJ3aXNlIGluaXRpYWxpemUgZm9yIGhvcml6b250YWwgb3IgdmVydGljYWwgcHJvcGVydGllc1xuXHRcdG5hbWUgPT09IFwid2lkdGhcIiA/IDEgOiAwLFxuXG5cdFx0dmFsID0gMDtcblxuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgKSB7XG5cblx0XHQvLyBCb3RoIGJveCBtb2RlbHMgZXhjbHVkZSBtYXJnaW4sIHNvIGFkZCBpdCBpZiB3ZSB3YW50IGl0XG5cdFx0aWYgKCBleHRyYSA9PT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCBleHRyYSArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGlzQm9yZGVyQm94ICkge1xuXG5cdFx0XHQvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcsIHNvIHJlbW92ZSBpdCBpZiB3ZSB3YW50IGNvbnRlbnRcblx0XHRcdGlmICggZXh0cmEgPT09IFwiY29udGVudFwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGJvcmRlciBub3IgbWFyZ2luLCBzbyByZW1vdmUgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcIm1hcmdpblwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50LCBzbyBhZGQgcGFkZGluZ1xuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50IG5vciBwYWRkaW5nLCBzbyBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBvZmZzZXQgcHJvcGVydHksIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJvcmRlci1ib3ggdmFsdWVcblx0dmFyIHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlLFxuXHRcdHZhbCA9IG5hbWUgPT09IFwid2lkdGhcIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCxcblx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogSUUxMSBvbmx5XG5cdC8vIEluIElFIDExIGZ1bGxzY3JlZW4gZWxlbWVudHMgaW5zaWRlIG9mIGFuIGlmcmFtZSBoYXZlXG5cdC8vIDEwMHggdG9vIHNtYWxsIGRpbWVuc2lvbnMgKGdoLTE3NjQpLlxuXHRpZiAoIGRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQgJiYgd2luZG93LnRvcCAhPT0gd2luZG93ICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUxMSBvbmx5XG5cdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHRcdC8vIGluIElFIHRocm93cyBhbiBlcnJvci5cblx0XHRpZiAoIGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cdFx0XHR2YWwgPSBNYXRoLnJvdW5kKCBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpWyBuYW1lIF0gKiAxMDAgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBTb21lIG5vbi1odG1sIGVsZW1lbnRzIHJldHVybiB1bmRlZmluZWQgZm9yIG9mZnNldFdpZHRoLCBzbyBjaGVjayBmb3IgbnVsbC91bmRlZmluZWRcblx0Ly8gc3ZnIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ5Mjg1XG5cdC8vIE1hdGhNTCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTQ5MTY2OFxuXHRpZiAoIHZhbCA8PSAwIHx8IHZhbCA9PSBudWxsICkge1xuXG5cdFx0Ly8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNzYXJ5XG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHRpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7XG5cdFx0XHR2YWwgPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gQ29tcHV0ZWQgdW5pdCBpcyBub3QgcGl4ZWxzLiBTdG9wIGhlcmUgYW5kIHJldHVybi5cblx0XHRpZiAoIHJudW1ub25weC50ZXN0KCB2YWwgKSApIHtcblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcblx0XHQvLyBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIHRoZSByZWxpYWJsZSBlbGVtLnN0eWxlXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94ICYmXG5cdFx0XHQoIHN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUoKSB8fCB2YWwgPT09IGVsZW0uc3R5bGVbIG5hbWUgXSApO1xuXG5cdFx0Ly8gTm9ybWFsaXplIFwiXCIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYVxuXHRcdHZhbCA9IHBhcnNlRmxvYXQoIHZhbCApIHx8IDA7XG5cdH1cblxuXHQvLyBVc2UgdGhlIGFjdGl2ZSBib3gtc2l6aW5nIG1vZGVsIHRvIGFkZC9zdWJ0cmFjdCBpcnJlbGV2YW50IHN0eWxlc1xuXHRyZXR1cm4gKCB2YWwgK1xuXHRcdGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxuXHRcdFx0ZWxlbSxcblx0XHRcdG5hbWUsXG5cdFx0XHRleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICksXG5cdFx0XHR2YWx1ZUlzQm9yZGVyQm94LFxuXHRcdFx0c3R5bGVzXG5cdFx0KVxuXHQpICsgXCJweFwiO1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLCBoaWRkZW4sXG5cdFx0dmFsdWVzID0gW10sXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDtcblxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0dmFsdWVzWyBpbmRleCBdID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcIm9sZGRpc3BsYXlcIiApO1xuXHRcdGRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7XG5cdFx0aWYgKCBzaG93ICkge1xuXG5cdFx0XHQvLyBSZXNldCB0aGUgaW5saW5lIGRpc3BsYXkgb2YgdGhpcyBlbGVtZW50IHRvIGxlYXJuIGlmIGl0IGlzXG5cdFx0XHQvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90XG5cdFx0XHRpZiAoICF2YWx1ZXNbIGluZGV4IF0gJiYgZGlzcGxheSA9PT0gXCJub25lXCIgKSB7XG5cdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBlbGVtZW50cyB3aGljaCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmVcblx0XHRcdC8vIGluIGEgc3R5bGVzaGVldCB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBicm93c2VyIHN0eWxlIGlzXG5cdFx0XHQvLyBmb3Igc3VjaCBhbiBlbGVtZW50XG5cdFx0XHRpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJiBpc0hpZGRlbiggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5hY2Nlc3MoXG5cdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRcIm9sZGRpc3BsYXlcIixcblx0XHRcdFx0XHRkZWZhdWx0RGlzcGxheSggZWxlbS5ub2RlTmFtZSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGhpZGRlbiA9IGlzSGlkZGVuKCBlbGVtICk7XG5cblx0XHRcdGlmICggZGlzcGxheSAhPT0gXCJub25lXCIgfHwgIWhpZGRlbiApIHtcblx0XHRcdFx0ZGF0YVByaXYuc2V0KFxuXHRcdFx0XHRcdGVsZW0sXG5cdFx0XHRcdFx0XCJvbGRkaXNwbGF5XCIsXG5cdFx0XHRcdFx0aGlkZGVuID8gZGlzcGxheSA6IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgbW9zdCBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcFxuXHQvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0aWYgKCAhc2hvdyB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiIHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IHNob3cgPyB2YWx1ZXNbIGluZGV4IF0gfHwgXCJcIiA6IFwibm9uZVwiO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50cztcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmYXVsdFxuXHQvLyBiZWhhdmlvciBvZiBnZXR0aW5nIGFuZCBzZXR0aW5nIGEgc3R5bGUgcHJvcGVydHlcblx0Y3NzSG9va3M6IHtcblx0XHRvcGFjaXR5OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHRcdC8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5XG5cdFx0XHRcdFx0dmFyIHJldCA9IGN1ckNTUyggZWxlbSwgXCJvcGFjaXR5XCIgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmV0ID09PSBcIlwiID8gXCIxXCIgOiByZXQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgXCJweFwiIHRvIHRoZXNlIHBvc3NpYmx5LXVuaXRsZXNzIHByb3BlcnRpZXNcblx0Y3NzTnVtYmVyOiB7XG5cdFx0XCJhbmltYXRpb25JdGVyYXRpb25Db3VudFwiOiB0cnVlLFxuXHRcdFwiY29sdW1uQ291bnRcIjogdHJ1ZSxcblx0XHRcImZpbGxPcGFjaXR5XCI6IHRydWUsXG5cdFx0XCJmbGV4R3Jvd1wiOiB0cnVlLFxuXHRcdFwiZmxleFNocmlua1wiOiB0cnVlLFxuXHRcdFwiZm9udFdlaWdodFwiOiB0cnVlLFxuXHRcdFwibGluZUhlaWdodFwiOiB0cnVlLFxuXHRcdFwib3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwib3JkZXJcIjogdHJ1ZSxcblx0XHRcIm9ycGhhbnNcIjogdHJ1ZSxcblx0XHRcIndpZG93c1wiOiB0cnVlLFxuXHRcdFwiekluZGV4XCI6IHRydWUsXG5cdFx0XCJ6b29tXCI6IHRydWVcblx0fSxcblxuXHQvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlXG5cdC8vIHNldHRpbmcgb3IgZ2V0dGluZyB0aGUgdmFsdWVcblx0Y3NzUHJvcHM6IHtcblx0XHRcImZsb2F0XCI6IFwiY3NzRmxvYXRcIlxuXHR9LFxuXG5cdC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlXG5cdHN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkge1xuXG5cdFx0Ly8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0dmFyIHJldCwgdHlwZSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSxcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRcdG5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHxcblx0XHRcdCggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIG9yaWdOYW1lICkgfHwgb3JpZ05hbWUgKTtcblxuXHRcdC8vIEdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24sIHRoZW4gdW5wcmVmaXhlZCB2ZXJzaW9uXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWVcblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG5cdFx0XHQvLyBDb252ZXJ0IFwiKz1cIiBvciBcIi09XCIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwic3RyaW5nXCIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHtcblx0XHRcdFx0dmFsdWUgPSBhZGp1c3RDU1MoIGVsZW0sIG5hbWUsIHJldCApO1xuXG5cdFx0XHRcdC8vIEZpeGVzIGJ1ZyAjOTIzN1xuXHRcdFx0XHR0eXBlID0gXCJudW1iZXJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNilcblx0XHRcdGlmICggdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdHZhbHVlICs9IHJldCAmJiByZXRbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gPyBcIlwiIDogXCJweFwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0XHRcdC8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXNcblx0XHRcdGlmICggIXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlICYmIHZhbHVlID09PSBcIlwiICYmIG5hbWUuaW5kZXhPZiggXCJiYWNrZ3JvdW5kXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0c3R5bGVbIG5hbWUgXSA9IFwiaW5oZXJpdFwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWVcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fFxuXHRcdFx0XHQoIHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c3R5bGVbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdFxuXHRcdFx0cmV0dXJuIHN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXHR9LFxuXG5cdGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7XG5cdFx0dmFyIHZhbCwgbnVtLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0bmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fFxuXHRcdFx0KCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggb3JpZ05hbWUgKSB8fCBvcmlnTmFtZSApO1xuXG5cdFx0Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZVxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcblx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IFwibm9ybWFsXCIgdG8gY29tcHV0ZWQgdmFsdWVcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcblx0XHRcdHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIE1ha2UgbnVtZXJpYyBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xuXHRcdGlmICggZXh0cmEgPT09IFwiXCIgfHwgZXh0cmEgKSB7XG5cdFx0XHRudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTtcblx0XHRcdHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcImhlaWdodFwiLCBcIndpZHRoXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0Ly8gQ2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXG5cdFx0XHRcdC8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0XG5cdFx0XHRcdHJldHVybiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICYmXG5cdFx0XHRcdFx0ZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCA/XG5cdFx0XHRcdFx0XHRzd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XG5cdFx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkge1xuXHRcdFx0dmFyIG1hdGNoZXMsXG5cdFx0XHRcdHN0eWxlcyA9IGV4dHJhICYmIGdldFN0eWxlcyggZWxlbSApLFxuXHRcdFx0XHRzdWJ0cmFjdCA9IGV4dHJhICYmIGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxuXHRcdFx0XHRcdGVsZW0sXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRleHRyYSxcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiLFxuXHRcdFx0XHRcdHN0eWxlc1xuXHRcdFx0XHQpO1xuXG5cdFx0XHQvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZFxuXHRcdFx0aWYgKCBzdWJ0cmFjdCAmJiAoIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJlxuXHRcdFx0XHQoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSAhPT0gXCJweFwiICkge1xuXG5cdFx0XHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5jc3NIb29rcy5tYXJnaW5MZWZ0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luTGVmdCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4gKCBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sIFwibWFyZ2luTGVmdFwiICkgKSB8fFxuXHRcdFx0XHRlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuXHRcdFx0XHRcdHN3YXAoIGVsZW0sIHsgbWFyZ2luTGVmdDogMCB9LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cdFx0XHRcdFx0fSApXG5cdFx0XHRcdCkgKyBcInB4XCI7XG5cdFx0fVxuXHR9XG4pO1xuXG4vLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xualF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQsXG5cdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0cmV0dXJuIHN3YXAoIGVsZW0sIHsgXCJkaXNwbGF5XCI6IFwiaW5saW5lLWJsb2NrXCIgfSxcblx0XHRcdFx0Y3VyQ1NTLCBbIGVsZW0sIFwibWFyZ2luUmlnaHRcIiBdICk7XG5cdFx0fVxuXHR9XG4pO1xuXG4vLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzXG5qUXVlcnkuZWFjaCgge1xuXHRtYXJnaW46IFwiXCIsXG5cdHBhZGRpbmc6IFwiXCIsXG5cdGJvcmRlcjogXCJXaWR0aFwiXG59LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7XG5cdFx0ZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgaSA9IDAsXG5cdFx0XHRcdGV4cGFuZGVkID0ge30sXG5cblx0XHRcdFx0Ly8gQXNzdW1lcyBhIHNpbmdsZSBudW1iZXIgaWYgbm90IGEgc3RyaW5nXG5cdFx0XHRcdHBhcnRzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUuc3BsaXQoIFwiIFwiICkgOiBbIHZhbHVlIF07XG5cblx0XHRcdGZvciAoIDsgaSA8IDQ7IGkrKyApIHtcblx0XHRcdFx0ZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPVxuXHRcdFx0XHRcdHBhcnRzWyBpIF0gfHwgcGFydHNbIGkgLSAyIF0gfHwgcGFydHNbIDAgXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV4cGFuZGVkO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaXNBcnJheSggbmFtZSApICkge1xuXHRcdFx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKTtcblx0XHRcdFx0bGVuID0gbmFtZS5sZW5ndGg7XG5cblx0XHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0bWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG1hcDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUsIHZhbHVlICkgOlxuXHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7XG5cdFx0fSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xuXHR9LFxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcblx0fSxcblx0dG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW4oIHRoaXMgKSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuc2hvdygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHtcblx0cmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTtcbn1cbmpRdWVyeS5Ud2VlbiA9IFR3ZWVuO1xuXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBUd2Vlbixcblx0aW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkge1xuXHRcdHRoaXMuZWxlbSA9IGVsZW07XG5cdFx0dGhpcy5wcm9wID0gcHJvcDtcblx0XHR0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0O1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0Ly8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCxcblx0XHRcdC8vIG9yIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc3R5bGUgcHJvcGVydHkgdGhhdCBleGlzdHMuXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgIT09IDEgfHxcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07XG5cdFx0XHR9XG5cblx0XHRcdC8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseVxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscy5cblx0XHRcdC8vIFNpbXBsZSB2YWx1ZXMgc3VjaCBhcyBcIjEwcHhcIiBhcmUgcGFyc2VkIHRvIEZsb2F0O1xuXHRcdFx0Ly8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyBcInJvdGF0ZSgxcmFkKVwiIGFyZSByZXR1cm5lZCBhcy1pcy5cblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIFwiXCIgKTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdXBwb3J0OiBJRTlcbi8vIFBhbmljIGJhc2VkIGFwcHJvYWNoIHRvIHNldHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xuVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgJiYgdHdlZW4uZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmVhc2luZyA9IHtcblx0bGluZWFyOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gcDtcblx0fSxcblx0c3dpbmc6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiAwLjUgLSBNYXRoLmNvcyggcCAqIE1hdGguUEkgKSAvIDI7XG5cdH0sXG5cdF9kZWZhdWx0OiBcInN3aW5nXCJcbn07XG5cbmpRdWVyeS5meCA9IFR3ZWVuLnByb3RvdHlwZS5pbml0O1xuXG4vLyBCYWNrIENvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludFxualF1ZXJ5LmZ4LnN0ZXAgPSB7fTtcblxuXG5cblxudmFyXG5cdGZ4Tm93LCB0aW1lcklkLFxuXHRyZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxcblx0cnJ1biA9IC9xdWV1ZUhvb2tzJC87XG5cbi8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHlcbmZ1bmN0aW9uIGNyZWF0ZUZ4Tm93KCkge1xuXHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0ZnhOb3cgPSB1bmRlZmluZWQ7XG5cdH0gKTtcblx0cmV0dXJuICggZnhOb3cgPSBqUXVlcnkubm93KCkgKTtcbn1cblxuLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBhbmltYXRpb25cbmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7XG5cdHZhciB3aGljaCxcblx0XHRpID0gMCxcblx0XHRhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07XG5cblx0Ly8gSWYgd2UgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAxIHRvIGRvIGFsbCBjc3NFeHBhbmQgdmFsdWVzLFxuXHQvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodFxuXHRpbmNsdWRlV2lkdGggPSBpbmNsdWRlV2lkdGggPyAxIDogMDtcblx0Zm9yICggOyBpIDwgNCA7IGkgKz0gMiAtIGluY2x1ZGVXaWR0aCApIHtcblx0XHR3aGljaCA9IGNzc0V4cGFuZFsgaSBdO1xuXHRcdGF0dHJzWyBcIm1hcmdpblwiICsgd2hpY2ggXSA9IGF0dHJzWyBcInBhZGRpbmdcIiArIHdoaWNoIF0gPSB0eXBlO1xuXHR9XG5cblx0aWYgKCBpbmNsdWRlV2lkdGggKSB7XG5cdFx0YXR0cnMub3BhY2l0eSA9IGF0dHJzLndpZHRoID0gdHlwZTtcblx0fVxuXG5cdHJldHVybiBhdHRycztcbn1cblxuZnVuY3Rpb24gY3JlYXRlVHdlZW4oIHZhbHVlLCBwcm9wLCBhbmltYXRpb24gKSB7XG5cdHZhciB0d2Vlbixcblx0XHRjb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyBcIipcIiBdICksXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGlmICggKCB0d2VlbiA9IGNvbGxlY3Rpb25bIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApICkgKSB7XG5cblx0XHRcdC8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkge1xuXHQvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG5cdHZhciBwcm9wLCB2YWx1ZSwgdG9nZ2xlLCB0d2VlbiwgaG9va3MsIG9sZGZpcmUsIGRpc3BsYXksIGNoZWNrRGlzcGxheSxcblx0XHRhbmltID0gdGhpcyxcblx0XHRvcmlnID0ge30sXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlLFxuXHRcdGhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW4oIGVsZW0gKSxcblx0XHRkYXRhU2hvdyA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJmeHNob3dcIiApO1xuXG5cdC8vIEhhbmRsZSBxdWV1ZTogZmFsc2UgcHJvbWlzZXNcblx0aWYgKCAhb3B0cy5xdWV1ZSApIHtcblx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgXCJmeFwiICk7XG5cdFx0aWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkge1xuXHRcdFx0aG9va3MudW5xdWV1ZWQgPSAwO1xuXHRcdFx0b2xkZmlyZSA9IGhvb2tzLmVtcHR5LmZpcmU7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggIWhvb2tzLnVucXVldWVkICkge1xuXHRcdFx0XHRcdG9sZGZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0aG9va3MudW5xdWV1ZWQrKztcblxuXHRcdGFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRW5zdXJlIHRoZSBjb21wbGV0ZSBoYW5kbGVyIGlzIGNhbGxlZCBiZWZvcmUgdGhpcyBjb21wbGV0ZXNcblx0XHRcdGFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0aG9va3MudW5xdWV1ZWQtLTtcblx0XHRcdFx0aWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCBcImZ4XCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdFx0aG9va3MuZW1wdHkuZmlyZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSGVpZ2h0L3dpZHRoIG92ZXJmbG93IHBhc3Ncblx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCJoZWlnaHRcIiBpbiBwcm9wcyB8fCBcIndpZHRoXCIgaW4gcHJvcHMgKSApIHtcblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgc25lYWtzIG91dFxuXHRcdC8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUU5LTEwIGRvIG5vdFxuXHRcdC8vIGNoYW5nZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZFxuXHRcdC8vIG92ZXJmbG93WSBhcmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlXG5cdFx0b3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07XG5cblx0XHQvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aFxuXHRcdC8vIGFuaW1hdGlvbnMgb24gaW5saW5lIGVsZW1lbnRzIHRoYXQgYXJlIGhhdmluZyB3aWR0aC9oZWlnaHQgYW5pbWF0ZWRcblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblxuXHRcdC8vIFRlc3QgZGVmYXVsdCBkaXNwbGF5IGlmIGRpc3BsYXkgaXMgY3VycmVudGx5IFwibm9uZVwiXG5cdFx0Y2hlY2tEaXNwbGF5ID0gZGlzcGxheSA9PT0gXCJub25lXCIgP1xuXHRcdFx0ZGF0YVByaXYuZ2V0KCBlbGVtLCBcIm9sZGRpc3BsYXlcIiApIHx8IGRlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVOYW1lICkgOiBkaXNwbGF5O1xuXG5cdFx0aWYgKCBjaGVja0Rpc3BsYXkgPT09IFwiaW5saW5lXCIgJiYgalF1ZXJ5LmNzcyggZWxlbSwgXCJmbG9hdFwiICkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0c3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBvcHRzLm92ZXJmbG93ICkge1xuXHRcdHN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTtcblx0XHRcdHN0eWxlLm92ZXJmbG93WCA9IG9wdHMub3ZlcmZsb3dbIDEgXTtcblx0XHRcdHN0eWxlLm92ZXJmbG93WSA9IG9wdHMub3ZlcmZsb3dbIDIgXTtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBzaG93L2hpZGUgcGFzc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGRhdGFTaG93IGxlZnQgb3ZlciBmcm9tIGEgc3RvcHBlZCBoaWRlIG9yIHNob3dcblx0XHRcdFx0Ly8gYW5kIHdlIGFyZSBnb2luZyB0byBwcm9jZWVkIHdpdGggc2hvdywgd2Ugc2hvdWxkIHByZXRlbmQgdG8gYmUgaGlkZGVuXG5cdFx0XHRcdGlmICggdmFsdWUgPT09IFwic2hvd1wiICYmIGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXG5cdFx0Ly8gQW55IG5vbi1meCB2YWx1ZSBzdG9wcyB1cyBmcm9tIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgZGlzcGxheSB2YWx1ZVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkaXNwbGF5ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0aWYgKCBkYXRhU2hvdyApIHtcblx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0aGlkZGVuID0gZGF0YVNob3cuaGlkZGVuO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgXCJmeHNob3dcIiwge30gKTtcblx0XHR9XG5cblx0XHQvLyBTdG9yZSBzdGF0ZSBpZiBpdHMgdG9nZ2xlIC0gZW5hYmxlcyAuc3RvcCgpLnRvZ2dsZSgpIHRvIFwicmV2ZXJzZVwiXG5cdFx0aWYgKCB0b2dnbGUgKSB7XG5cdFx0XHRkYXRhU2hvdy5oaWRkZW4gPSAhaGlkZGVuO1xuXHRcdH1cblx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdGpRdWVyeSggZWxlbSApLnNob3coKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5KCBlbGVtICkuaGlkZSgpO1xuXHRcdFx0fSApO1xuXHRcdH1cblx0XHRhbmltLmRvbmUoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHByb3A7XG5cblx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgXCJmeHNob3dcIiApO1xuXHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIG9yaWdbIHByb3AgXSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHR0d2VlbiA9IGNyZWF0ZVR3ZWVuKCBoaWRkZW4gPyBkYXRhU2hvd1sgcHJvcCBdIDogMCwgcHJvcCwgYW5pbSApO1xuXG5cdFx0XHRpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHtcblx0XHRcdFx0ZGF0YVNob3dbIHByb3AgXSA9IHR3ZWVuLnN0YXJ0O1xuXHRcdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0XHR0d2Vlbi5lbmQgPSB0d2Vlbi5zdGFydDtcblx0XHRcdFx0XHR0d2Vlbi5zdGFydCA9IHByb3AgPT09IFwid2lkdGhcIiB8fCBwcm9wID09PSBcImhlaWdodFwiID8gMSA6IDA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0Ly8gSWYgdGhpcyBpcyBhIG5vb3AgbGlrZSAuaGlkZSgpLmhpZGUoKSwgcmVzdG9yZSBhbiBvdmVyd3JpdHRlbiBkaXNwbGF5IHZhbHVlXG5cdH0gZWxzZSBpZiAoICggZGlzcGxheSA9PT0gXCJub25lXCIgPyBkZWZhdWx0RGlzcGxheSggZWxlbS5ub2RlTmFtZSApIDogZGlzcGxheSApID09PSBcImlubGluZVwiICkge1xuXHRcdHN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5O1xuXHR9XG59XG5cbmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkge1xuXHR2YXIgaW5kZXgsIG5hbWUsIGVhc2luZywgdmFsdWUsIGhvb2tzO1xuXG5cdC8vIGNhbWVsQ2FzZSwgc3BlY2lhbEVhc2luZyBhbmQgZXhwYW5kIGNzc0hvb2sgcGFzc1xuXHRmb3IgKCBpbmRleCBpbiBwcm9wcyApIHtcblx0XHRuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggaW5kZXggKTtcblx0XHRlYXNpbmcgPSBzcGVjaWFsRWFzaW5nWyBuYW1lIF07XG5cdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBBbmltYXRpb24ucHJlZmlsdGVycy5sZW5ndGgsXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSApLFxuXHRcdHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdFx0cmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLFxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5cdFx0XHRcdC8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5Nylcblx0XHRcdFx0dGVtcCA9IHJlbWFpbmluZyAvIGFuaW1hdGlvbi5kdXJhdGlvbiB8fCAwLFxuXHRcdFx0XHRwZXJjZW50ID0gMSAtIHRlbXAsXG5cdFx0XHRcdGluZGV4ID0gMCxcblx0XHRcdFx0bGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7XG5cblx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgcGVyY2VudCwgcmVtYWluaW5nIF0gKTtcblxuXHRcdFx0aWYgKCBwZXJjZW50IDwgMSAmJiBsZW5ndGggKSB7XG5cdFx0XHRcdHJldHVybiByZW1haW5pbmc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24gXSApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRhbmltYXRpb24gPSBkZWZlcnJlZC5wcm9taXNlKCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0cHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksXG5cdFx0XHRvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0cnVlLCB7XG5cdFx0XHRcdHNwZWNpYWxFYXNpbmc6IHt9LFxuXHRcdFx0XHRlYXNpbmc6IGpRdWVyeS5lYXNpbmcuX2RlZmF1bHRcblx0XHRcdH0sIG9wdGlvbnMgKSxcblx0XHRcdG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGllcyxcblx0XHRcdG9yaWdpbmFsT3B0aW9uczogb3B0aW9ucyxcblx0XHRcdHN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uLFxuXHRcdFx0dHdlZW5zOiBbXSxcblx0XHRcdGNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkge1xuXHRcdFx0XHR2YXIgdHdlZW4gPSBqUXVlcnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5vcHRzLCBwcm9wLCBlbmQsXG5cdFx0XHRcdFx0XHRhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdFx0fSxcblx0XHRcdHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkge1xuXHRcdFx0XHR2YXIgaW5kZXggPSAwLFxuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0XG5cdFx0XHRcdFx0bGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDtcblx0XHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0b3BwZWQgPSB0cnVlO1xuXHRcdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcblx0XHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVzb2x2ZSB3aGVuIHdlIHBsYXllZCB0aGUgbGFzdCBmcmFtZTsgb3RoZXJ3aXNlLCByZWplY3Rcblx0XHRcdFx0aWYgKCBnb3RvRW5kICkge1xuXHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCAxLCAwIF0gKTtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9ICksXG5cdFx0cHJvcHMgPSBhbmltYXRpb24ucHJvcHM7XG5cblx0cHJvcEZpbHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmcgKTtcblxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApO1xuXHRcdGlmICggcmVzdWx0ICkge1xuXHRcdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcmVzdWx0LnN0b3AgKSApIHtcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCBhbmltYXRpb24uZWxlbSwgYW5pbWF0aW9uLm9wdHMucXVldWUgKS5zdG9wID1cblx0XHRcdFx0XHRqUXVlcnkucHJveHkoIHJlc3VsdC5zdG9wLCByZXN1bHQgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5Lm1hcCggcHJvcHMsIGNyZWF0ZVR3ZWVuLCBhbmltYXRpb24gKTtcblxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkge1xuXHRcdGFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApO1xuXHR9XG5cblx0alF1ZXJ5LmZ4LnRpbWVyKFxuXHRcdGpRdWVyeS5leHRlbmQoIHRpY2ssIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRhbmltOiBhbmltYXRpb24sXG5cdFx0XHRxdWV1ZTogYW5pbWF0aW9uLm9wdHMucXVldWVcblx0XHR9IClcblx0KTtcblxuXHQvLyBhdHRhY2ggY2FsbGJhY2tzIGZyb20gb3B0aW9uc1xuXHRyZXR1cm4gYW5pbWF0aW9uLnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApXG5cdFx0LmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlIClcblx0XHQuZmFpbCggYW5pbWF0aW9uLm9wdHMuZmFpbCApXG5cdFx0LmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7XG59XG5cbmpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHtcblx0dHdlZW5lcnM6IHtcblx0XHRcIipcIjogWyBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApO1xuXHRcdFx0YWRqdXN0Q1NTKCB0d2Vlbi5lbGVtLCBwcm9wLCByY3NzTnVtLmV4ZWMoIHZhbHVlICksIHR3ZWVuICk7XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fSBdXG5cdH0sXG5cblx0dHdlZW5lcjogZnVuY3Rpb24oIHByb3BzLCBjYWxsYmFjayApIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwcm9wcyApICkge1xuXHRcdFx0Y2FsbGJhY2sgPSBwcm9wcztcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wcyA9IHByb3BzLm1hdGNoKCBybm90d2hpdGUgKTtcblx0XHR9XG5cblx0XHR2YXIgcHJvcCxcblx0XHRcdGluZGV4ID0gMCxcblx0XHRcdGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuXHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdFx0cHJvcCA9IHByb3BzWyBpbmRleCBdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gPSBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZWZpbHRlcnM6IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXG5cdHByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkge1xuXHRcdGlmICggcHJlcGVuZCApIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcblx0dmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gXCJvYmplY3RcIiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDoge1xuXHRcdGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8XG5cdFx0XHRqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCxcblx0XHRkdXJhdGlvbjogc3BlZWQsXG5cdFx0ZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nXG5cdH07XG5cblx0b3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSBcIm51bWJlclwiID9cblx0XHRvcHQuZHVyYXRpb24gOiBvcHQuZHVyYXRpb24gaW4galF1ZXJ5LmZ4LnNwZWVkcyA/XG5cdFx0XHRqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXSA6IGpRdWVyeS5meC5zcGVlZHMuX2RlZmF1bHQ7XG5cblx0Ly8gTm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gXCJmeFwiXG5cdGlmICggb3B0LnF1ZXVlID09IG51bGwgfHwgb3B0LnF1ZXVlID09PSB0cnVlICkge1xuXHRcdG9wdC5xdWV1ZSA9IFwiZnhcIjtcblx0fVxuXG5cdC8vIFF1ZXVlaW5nXG5cdG9wdC5vbGQgPSBvcHQuY29tcGxldGU7XG5cblx0b3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW4gKS5jc3MoIFwib3BhY2l0eVwiLCAwICkuc2hvdygpXG5cblx0XHRcdC8vIEFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZFxuXHRcdFx0LmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fSxcblx0YW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHZhciBlbXB0eSA9IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICksXG5cdFx0XHRvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICksXG5cdFx0XHRkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0XG5cdFx0XHRcdHZhciBhbmltID0gQW5pbWF0aW9uKCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTtcblxuXHRcdFx0XHQvLyBFbXB0eSBhbmltYXRpb25zLCBvciBmaW5pc2hpbmcgcmVzb2x2ZXMgaW1tZWRpYXRlbHlcblx0XHRcdFx0aWYgKCBlbXB0eSB8fCBkYXRhUHJpdi5nZXQoIHRoaXMsIFwiZmluaXNoXCIgKSApIHtcblx0XHRcdFx0XHRhbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGRvQW5pbWF0aW9uLmZpbmlzaCA9IGRvQW5pbWF0aW9uO1xuXG5cdFx0cmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0dGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDpcblx0XHRcdHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTtcblx0fSxcblx0c3RvcDogZnVuY3Rpb24oIHR5cGUsIGNsZWFyUXVldWUsIGdvdG9FbmQgKSB7XG5cdFx0dmFyIHN0b3BRdWV1ZSA9IGZ1bmN0aW9uKCBob29rcyApIHtcblx0XHRcdHZhciBzdG9wID0gaG9va3Muc3RvcDtcblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0c3RvcCggZ290b0VuZCApO1xuXHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Z290b0VuZCA9IGNsZWFyUXVldWU7XG5cdFx0XHRjbGVhclF1ZXVlID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xlYXJRdWV1ZSAmJiB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRlcXVldWUgPSB0cnVlLFxuXHRcdFx0XHRpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgXCJxdWV1ZUhvb2tzXCIsXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBpbmRleCApIHtcblx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCApIHtcblx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaW5kZXggaW4gZGF0YSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHtcblx0XHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmXG5cdFx0XHRcdFx0KCB0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkgKSB7XG5cblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7XG5cdFx0XHRcdFx0ZGVxdWV1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZC5cblx0XHRcdC8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2hcblx0XHRcdC8vIHdpbGwgZGVxdWV1ZSBidXQgb25seSBpZiB0aGV5IHdlcmUgZ290b0VuZC5cblx0XHRcdGlmICggZGVxdWV1ZSB8fCAhZ290b0VuZCApIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cdGZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0aWYgKCB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaW5kZXgsXG5cdFx0XHRcdGRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSxcblx0XHRcdFx0cXVldWUgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZVwiIF0sXG5cdFx0XHRcdGhvb2tzID0gZGF0YVsgdHlwZSArIFwicXVldWVIb29rc1wiIF0sXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDtcblxuXHRcdFx0Ly8gRW5hYmxlIGZpbmlzaGluZyBmbGFnIG9uIHByaXZhdGUgZGF0YVxuXHRcdFx0ZGF0YS5maW5pc2ggPSB0cnVlO1xuXG5cdFx0XHQvLyBFbXB0eSB0aGUgcXVldWUgZmlyc3Rcblx0XHRcdGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTtcblxuXHRcdFx0aWYgKCBob29rcyAmJiBob29rcy5zdG9wICkge1xuXHRcdFx0XHRob29rcy5zdG9wLmNhbGwoIHRoaXMsIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFjdGl2ZSBhbmltYXRpb25zLCBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkge1xuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHtcblx0XHRcdFx0XHRxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFR1cm4gb2ZmIGZpbmlzaGluZyBmbGFnXG5cdFx0XHRkZWxldGUgZGF0YS5maW5pc2g7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwidG9nZ2xlXCIsIFwic2hvd1wiLCBcImhpZGVcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGNzc0ZuID0galF1ZXJ5LmZuWyBuYW1lIF07XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gXCJib29sZWFuXCIgP1xuXHRcdFx0Y3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDpcblx0XHRcdHRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxuLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9uc1xualF1ZXJ5LmVhY2goIHtcblx0c2xpZGVEb3duOiBnZW5GeCggXCJzaG93XCIgKSxcblx0c2xpZGVVcDogZ2VuRngoIFwiaGlkZVwiICksXG5cdHNsaWRlVG9nZ2xlOiBnZW5GeCggXCJ0b2dnbGVcIiApLFxuXHRmYWRlSW46IHsgb3BhY2l0eTogXCJzaG93XCIgfSxcblx0ZmFkZU91dDogeyBvcGFjaXR5OiBcImhpZGVcIiB9LFxuXHRmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6IFwidG9nZ2xlXCIgfVxufSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LnRpbWVycyA9IFtdO1xualF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHtcblx0dmFyIHRpbWVyLFxuXHRcdGkgPSAwLFxuXHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnM7XG5cblx0ZnhOb3cgPSBqUXVlcnkubm93KCk7XG5cblx0Zm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkge1xuXHRcdHRpbWVyID0gdGltZXJzWyBpIF07XG5cblx0XHQvLyBDaGVja3MgdGhlIHRpbWVyIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlbW92ZWRcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRpZiAoIHRpbWVyKCkgKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0YXJ0KCk7XG5cdH0gZWxzZSB7XG5cdFx0alF1ZXJ5LnRpbWVycy5wb3AoKTtcblx0fVxufTtcblxualF1ZXJ5LmZ4LmludGVydmFsID0gMTM7XG5qUXVlcnkuZnguc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0aWYgKCAhdGltZXJJZCApIHtcblx0XHR0aW1lcklkID0gd2luZG93LnNldEludGVydmFsKCBqUXVlcnkuZngudGljaywgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdH1cbn07XG5cbmpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdHdpbmRvdy5jbGVhckludGVydmFsKCB0aW1lcklkICk7XG5cblx0dGltZXJJZCA9IG51bGw7XG59O1xuXG5qUXVlcnkuZnguc3BlZWRzID0ge1xuXHRzbG93OiA2MDAsXG5cdGZhc3Q6IDIwMCxcblxuXHQvLyBEZWZhdWx0IHNwZWVkXG5cdF9kZWZhdWx0OiA0MDBcbn07XG5cblxuLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLlxuLy8gaHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxMDAzMjQwMTQ3NDcvaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5L1xualF1ZXJ5LmZuLmRlbGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7XG5cdHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0aW1lIF0gfHwgdGltZSA6IHRpbWU7XG5cdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkge1xuXHRcdHZhciB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTtcblx0XHRob29rcy5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cdFx0fTtcblx0fSApO1xufTtcblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKSxcblx0XHRzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInNlbGVjdFwiICksXG5cdFx0b3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcIm9wdGlvblwiICkgKTtcblxuXHRpbnB1dC50eXBlID0gXCJjaGVja2JveFwiO1xuXG5cdC8vIFN1cHBvcnQ6IGlPUzw9NS4xLCBBbmRyb2lkPD00LjIrXG5cdC8vIERlZmF1bHQgdmFsdWUgZm9yIGEgY2hlY2tib3ggc2hvdWxkIGJlIFwib25cIlxuXHRzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gXCJcIjtcblxuXHQvLyBTdXBwb3J0OiBJRTw9MTErXG5cdC8vIE11c3QgYWNjZXNzIHNlbGVjdGVkSW5kZXggdG8gbWFrZSBkZWZhdWx0IG9wdGlvbnMgc2VsZWN0XG5cdHN1cHBvcnQub3B0U2VsZWN0ZWQgPSBvcHQuc2VsZWN0ZWQ7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw9Mi4zXG5cdC8vIE9wdGlvbnMgaW5zaWRlIGRpc2FibGVkIHNlbGVjdHMgYXJlIGluY29ycmVjdGx5IG1hcmtlZCBhcyBkaXNhYmxlZFxuXHRzZWxlY3QuZGlzYWJsZWQgPSB0cnVlO1xuXHRzdXBwb3J0Lm9wdERpc2FibGVkID0gIW9wdC5kaXNhYmxlZDtcblxuXHQvLyBTdXBwb3J0OiBJRTw9MTErXG5cdC8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvXG5cdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdGlucHV0LnZhbHVlID0gXCJ0XCI7XG5cdGlucHV0LnR5cGUgPSBcInJhZGlvXCI7XG5cdHN1cHBvcnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSBcInRcIjtcbn0gKSgpO1xuXG5cbnZhciBib29sSG9vayxcblx0YXR0ckhhbmRsZSA9IGpRdWVyeS5leHByLmF0dHJIYW5kbGU7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5hdHRyLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0YXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRmFsbGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSwgdmFsdWUgKTtcblx0XHR9XG5cblx0XHQvLyBBbGwgYXR0cmlidXRlcyBhcmUgbG93ZXJjYXNlXG5cdFx0Ly8gR3JhYiBuZWNlc3NhcnkgaG9vayBpZiBvbmUgaXMgZGVmaW5lZFxuXHRcdGlmICggblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXHRcdFx0bmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdGhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdIHx8XG5cdFx0XHRcdCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IHVuZGVmaW5lZCApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkXG5cdFx0cmV0dXJuIHJldCA9PSBudWxsID8gdW5kZWZpbmVkIDogcmV0O1xuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGVsZW0udmFsdWU7XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCB2YWx1ZSApO1xuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0ZWxlbS52YWx1ZSA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHR2YXIgbmFtZSwgcHJvcE5hbWUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90d2hpdGUgKTtcblxuXHRcdGlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHR3aGlsZSAoICggbmFtZSA9IGF0dHJOYW1lc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0cHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cblx0XHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGdldCBzcGVjaWFsIHRyZWF0bWVudCAoIzEwODcwKVxuXHRcdFx0XHRpZiAoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApICkge1xuXG5cdFx0XHRcdFx0Ly8gU2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdG8gZmFsc2Vcblx0XHRcdFx0XHRlbGVtWyBwcm9wTmFtZSBdID0gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG4vLyBIb29rcyBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzXG5ib29sSG9vayA9IHtcblx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XG5cdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2hlbiBzZXQgdG8gZmFsc2Vcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7XG5cdFx0fVxuXHRcdHJldHVybiBuYW1lO1xuXHR9XG59O1xualF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXFx3Ky9nICksIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHR2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7XG5cblx0YXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciByZXQsIGhhbmRsZTtcblx0XHRpZiAoICFpc1hNTCApIHtcblxuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRuYW1lLnRvTG93ZXJDYXNlKCkgOlxuXHRcdFx0XHRudWxsO1xuXHRcdFx0YXR0ckhhbmRsZVsgbmFtZSBdID0gaGFuZGxlO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xufSApO1xuXG5cblxuXG52YXIgcmZvY3VzYWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGRlbGV0ZSB0aGlzWyBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUgXTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rc1xuXHRcdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcblx0XHRcdGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVsZW1bIG5hbWUgXTtcblx0fSxcblxuXHRwcm9wSG9va3M6IHtcblx0XHR0YWJJbmRleDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGVcblx0XHRcdFx0Ly8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XG5cdFx0XHRcdC8vIGh0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvXG5cdFx0XHRcdC8vIFVzZSBwcm9wZXIgYXR0cmlidXRlIHJldHJpZXZhbCgjMTIwNzIpXG5cdFx0XHRcdHZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIFwidGFiaW5kZXhcIiApO1xuXG5cdFx0XHRcdHJldHVybiB0YWJpbmRleCA/XG5cdFx0XHRcdFx0cGFyc2VJbnQoIHRhYmluZGV4LCAxMCApIDpcblx0XHRcdFx0XHRyZm9jdXNhYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSB8fFxuXHRcdFx0XHRcdFx0cmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYgZWxlbS5ocmVmID9cblx0XHRcdFx0XHRcdFx0MCA6XG5cdFx0XHRcdFx0XHRcdC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRwcm9wRml4OiB7XG5cdFx0XCJmb3JcIjogXCJodG1sRm9yXCIsXG5cdFx0XCJjbGFzc1wiOiBcImNsYXNzTmFtZVwiXG5cdH1cbn0gKTtcblxuLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG4vLyBBY2Nlc3NpbmcgdGhlIHNlbGVjdGVkSW5kZXggcHJvcGVydHlcbi8vIGZvcmNlcyB0aGUgYnJvd3NlciB0byByZXNwZWN0IHNldHRpbmcgc2VsZWN0ZWRcbi8vIG9uIHRoZSBvcHRpb25cbi8vIFRoZSBnZXR0ZXIgZW5zdXJlcyBhIGRlZmF1bHQgb3B0aW9uIGlzIHNlbGVjdGVkXG4vLyB3aGVuIGluIGFuIG9wdGdyb3VwXG5pZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkge1xuXHRqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdHBhcmVudC5zZWxlY3RlZEluZGV4O1xuXG5cdFx0XHRcdGlmICggcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxualF1ZXJ5LmVhY2goIFtcblx0XCJ0YWJJbmRleFwiLFxuXHRcInJlYWRPbmx5XCIsXG5cdFwibWF4TGVuZ3RoXCIsXG5cdFwiY2VsbFNwYWNpbmdcIixcblx0XCJjZWxsUGFkZGluZ1wiLFxuXHRcInJvd1NwYW5cIixcblx0XCJjb2xTcGFuXCIsXG5cdFwidXNlTWFwXCIsXG5cdFwiZnJhbWVCb3JkZXJcIixcblx0XCJjb250ZW50RWRpdGFibGVcIlxuXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS5wcm9wRml4WyB0aGlzLnRvTG93ZXJDYXNlKCkgXSA9IHRoaXM7XG59ICk7XG5cblxuXG5cbnZhciByY2xhc3MgPSAvW1xcdFxcclxcblxcZl0vZztcblxuZnVuY3Rpb24gZ2V0Q2xhc3MoIGVsZW0gKSB7XG5cdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSAmJiBlbGVtLmdldEF0dHJpYnV0ZSggXCJjbGFzc1wiICkgfHwgXCJcIjtcbn1cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhZGRDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGN1clZhbHVlLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUgKSB7XG5cdFx0XHRjbGFzc2VzID0gdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdO1xuXG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGN1clZhbHVlID0gZ2V0Q2xhc3MoIGVsZW0gKTtcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdCggXCIgXCIgKyBjdXJWYWx1ZSArIFwiIFwiICkucmVwbGFjZSggcmNsYXNzLCBcIiBcIiApO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGN1ci5pbmRleE9mKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIgKSA8IDAgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciArPSBjbGF6eiArIFwiIFwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IGpRdWVyeS50cmltKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYXR0ciggXCJjbGFzc1wiLCBcIlwiICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUgKSB7XG5cdFx0XHRjbGFzc2VzID0gdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdO1xuXG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGN1clZhbHVlID0gZ2V0Q2xhc3MoIGVsZW0gKTtcblxuXHRcdFx0XHQvLyBUaGlzIGV4cHJlc3Npb24gaXMgaGVyZSBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIGFkZENsYXNzKVxuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdFx0KCBcIiBcIiArIGN1clZhbHVlICsgXCIgXCIgKS5yZXBsYWNlKCByY2xhc3MsIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhenogKyBcIiBcIiwgXCIgXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBqUXVlcnkudHJpbSggY3VyICk7XG5cdFx0XHRcdFx0aWYgKCBjdXJWYWx1ZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsIGZpbmFsVmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHtcblx0XHR2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdGlmICggdHlwZW9mIHN0YXRlVmFsID09PSBcImJvb2xlYW5cIiAmJiB0eXBlID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlVmFsID8gdGhpcy5hZGRDbGFzcyggdmFsdWUgKSA6IHRoaXMucmVtb3ZlQ2xhc3MoIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyhcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLFxuXHRcdFx0XHRcdHN0YXRlVmFsXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgY2xhc3NOYW1lLCBpLCBzZWxmLCBjbGFzc05hbWVzO1xuXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdFx0Ly8gVG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXNcblx0XHRcdFx0aSA9IDA7XG5cdFx0XHRcdHNlbGYgPSBqUXVlcnkoIHRoaXMgKTtcblx0XHRcdFx0Y2xhc3NOYW1lcyA9IHZhbHVlLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0XHR3aGlsZSAoICggY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0gKSApIHtcblxuXHRcdFx0XHRcdC8vIENoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVuLCBzcGFjZSBzZXBhcmF0ZWQgbGlzdFxuXHRcdFx0XHRcdGlmICggc2VsZi5oYXNDbGFzcyggY2xhc3NOYW1lICkgKSB7XG5cdFx0XHRcdFx0XHRzZWxmLnJlbW92ZUNsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdC8vIFRvZ2dsZSB3aG9sZSBjbGFzcyBuYW1lXG5cdFx0XHR9IGVsc2UgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0XHRjbGFzc05hbWUgPSBnZXRDbGFzcyggdGhpcyApO1xuXHRcdFx0XHRpZiAoIGNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdC8vIFN0b3JlIGNsYXNzTmFtZSBpZiBzZXRcblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiLCBjbGFzc05hbWUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIHRoZSBlbGVtZW50IGhhcyBhIGNsYXNzIG5hbWUgb3IgaWYgd2UncmUgcGFzc2VkIGBmYWxzZWAsXG5cdFx0XHRcdC8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBicmluZyBiYWNrIHdoYXRldmVyIHdhcyBwcmV2aW91c2x5IHNhdmVkIChpZiBhbnl0aGluZyksXG5cdFx0XHRcdC8vIGZhbGxpbmcgYmFjayB0byB0aGUgZW1wdHkgc3RyaW5nIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cblx0XHRcdFx0aWYgKCB0aGlzLnNldEF0dHJpYnV0ZSApIHtcblx0XHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLFxuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRcdFx0XHRcIlwiIDpcblx0XHRcdFx0XHRcdGRhdGFQcml2LmdldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIgKSB8fCBcIlwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRoYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBjbGFzc05hbWUsIGVsZW0sXG5cdFx0XHRpID0gMDtcblxuXHRcdGNsYXNzTmFtZSA9IFwiIFwiICsgc2VsZWN0b3IgKyBcIiBcIjtcblx0XHR3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0KCBcIiBcIiArIGdldENsYXNzKCBlbGVtICkgKyBcIiBcIiApLnJlcGxhY2UoIHJjbGFzcywgXCIgXCIgKVxuXHRcdFx0XHRcdC5pbmRleE9mKCBjbGFzc05hbWUgKSA+IC0xXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBycmV0dXJuID0gL1xcci9nLFxuXHRyc3BhY2VzID0gL1tcXHgyMFxcdFxcclxcblxcZl0rL2c7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0dmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGhvb2tzLCByZXQsIGlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmXG5cdFx0XHRcdFx0XCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSApICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0cmV0dXJuIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgP1xuXG5cdFx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRcdHJldC5yZXBsYWNlKCBycmV0dXJuLCBcIlwiICkgOlxuXG5cdFx0XHRcdFx0Ly8gSGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyXG5cdFx0XHRcdFx0cmV0ID09IG51bGwgPyBcIlwiIDogcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHR2YXIgdmFsO1xuXG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uICkge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzIFwiXCI7IGNvbnZlcnQgbnVtYmVycyB0byBzdHJpbmdcblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHZhbCA9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdHZhbCArPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBqUXVlcnkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFMTAtMTErXG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtYW5kLWNvbGxhcHNlLXdoaXRlc3BhY2Vcblx0XHRcdFx0XHRqUXVlcnkudHJpbSggalF1ZXJ5LnRleHQoIGVsZW0gKSApLnJlcGxhY2UoIHJzcGFjZXMsIFwiIFwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIiB8fCBpbmRleCA8IDAsXG5cdFx0XHRcdFx0dmFsdWVzID0gb25lID8gbnVsbCA6IFtdLFxuXHRcdFx0XHRcdG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoLFxuXHRcdFx0XHRcdGkgPSBpbmRleCA8IDAgP1xuXHRcdFx0XHRcdFx0bWF4IDpcblx0XHRcdFx0XHRcdG9uZSA/IGluZGV4IDogMDtcblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIElFOC05IGRvZXNuJ3QgdXBkYXRlIHNlbGVjdGVkIGFmdGVyIGZvcm0gcmVzZXQgKCMyNTUxKVxuXHRcdFx0XHRcdGlmICggKCBvcHRpb24uc2VsZWN0ZWQgfHwgaSA9PT0gaW5kZXggKSAmJlxuXG5cdFx0XHRcdFx0XHRcdC8vIERvbid0IHJldHVybiBvcHRpb25zIHRoYXQgYXJlIGRpc2FibGVkIG9yIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXBcblx0XHRcdFx0XHRcdFx0KCBzdXBwb3J0Lm9wdERpc2FibGVkID9cblx0XHRcdFx0XHRcdFx0XHQhb3B0aW9uLmRpc2FibGVkIDogb3B0aW9uLmdldEF0dHJpYnV0ZSggXCJkaXNhYmxlZFwiICkgPT09IG51bGwgKSAmJlxuXHRcdFx0XHRcdFx0XHQoICFvcHRpb24ucGFyZW50Tm9kZS5kaXNhYmxlZCB8fFxuXHRcdFx0XHRcdFx0XHRcdCFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCBcIm9wdGdyb3VwXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0aW9uXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7XG5cblx0XHRcdFx0XHRcdC8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzXG5cdFx0XHRcdFx0XHRpZiAoIG9uZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheVxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgb3B0aW9uU2V0LCBvcHRpb24sXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHR2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLFxuXHRcdFx0XHRcdGkgPSBvcHRpb25zLmxlbmd0aDtcblxuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cdFx0XHRcdFx0aWYgKCBvcHRpb24uc2VsZWN0ZWQgPVxuXHRcdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b3B0aW9uU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGb3JjZSBicm93c2VycyB0byBiZWhhdmUgY29uc2lzdGVudGx5IHdoZW4gbm9uLW1hdGNoaW5nIHZhbHVlIGlzIHNldFxuXHRcdFx0XHRpZiAoICFvcHRpb25TZXQgKSB7XG5cdFx0XHRcdFx0ZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIGdldHRlci9zZXR0ZXJcbmpRdWVyeS5lYWNoKCBbIFwicmFkaW9cIiwgXCJjaGVja2JveFwiIF0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHtcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7XG5cdFx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb25cblxuXG52YXIgcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC87XG5cbmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwge1xuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkge1xuXG5cdFx0dmFyIGksIGN1ciwgdG1wLCBidWJibGVUeXBlLCBvbnR5cGUsIGhhbmRsZSwgc3BlY2lhbCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCggXCIuXCIgKSA6IFtdO1xuXG5cdFx0Y3VyID0gdG1wID0gZWxlbSA9IGVsZW0gfHwgZG9jdW1lbnQ7XG5cblx0XHQvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGZvY3VzL2JsdXIgbW9ycGhzIHRvIGZvY3VzaW4vb3V0OyBlbnN1cmUgd2UncmUgbm90IGZpcmluZyB0aGVtIHJpZ2h0IG5vd1xuXHRcdGlmICggcmZvY3VzTW9ycGgudGVzdCggdHlwZSArIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGUuaW5kZXhPZiggXCIuXCIgKSA+IC0xICkge1xuXG5cdFx0XHQvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpXG5cdFx0XHRuYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggXCIuXCIgKTtcblx0XHRcdHR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7XG5cdFx0XHRuYW1lc3BhY2VzLnNvcnQoKTtcblx0XHR9XG5cdFx0b250eXBlID0gdHlwZS5pbmRleE9mKCBcIjpcIiApIDwgMCAmJiBcIm9uXCIgKyB0eXBlO1xuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nXG5cdFx0ZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/XG5cdFx0XHRldmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCB0eXBlb2YgZXZlbnQgPT09IFwib2JqZWN0XCIgJiYgZXZlbnQgKTtcblxuXHRcdC8vIFRyaWdnZXIgYml0bWFzazogJiAxIGZvciBuYXRpdmUgaGFuZGxlcnM7ICYgMiBmb3IgalF1ZXJ5IChhbHdheXMgdHJ1ZSlcblx0XHRldmVudC5pc1RyaWdnZXIgPSBvbmx5SGFuZGxlcnMgPyAyIDogMztcblx0XHRldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oIFwiLlwiICk7XG5cdFx0ZXZlbnQucm5hbWVzcGFjZSA9IGV2ZW50Lm5hbWVzcGFjZSA/XG5cdFx0XHRuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKCBcIlxcXFwuKD86LipcXFxcLnwpXCIgKSArIFwiKFxcXFwufCQpXCIgKSA6XG5cdFx0XHRudWxsO1xuXG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkXG5cdFx0ZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkO1xuXHRcdGlmICggIWV2ZW50LnRhcmdldCApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGVsZW07XG5cdFx0fVxuXG5cdFx0Ly8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdFxuXHRcdGRhdGEgPSBkYXRhID09IG51bGwgP1xuXHRcdFx0WyBldmVudCBdIDpcblx0XHRcdGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEsIFsgZXZlbnQgXSApO1xuXG5cdFx0Ly8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBvdXRzaWRlIHRoZSBsaW5lc1xuXHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKVxuXHRcdC8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAoIzk3MjQpXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0YnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7XG5cdFx0XHRpZiAoICFyZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApICkge1xuXHRcdFx0XHRjdXIgPSBjdXIucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIGN1ciApO1xuXHRcdFx0XHR0bXAgPSBjdXI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKVxuXHRcdFx0aWYgKCB0bXAgPT09ICggZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50ICkgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCB0bXAuZGVmYXVsdFZpZXcgfHwgdG1wLnBhcmVudFdpbmRvdyB8fCB3aW5kb3cgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0ZXZlbnQudHlwZSA9IGkgPiAxID9cblx0XHRcdFx0YnViYmxlVHlwZSA6XG5cdFx0XHRcdHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTtcblxuXHRcdFx0Ly8galF1ZXJ5IGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsIFwiZXZlbnRzXCIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gJiZcblx0XHRcdFx0ZGF0YVByaXYuZ2V0KCBjdXIsIFwiaGFuZGxlXCIgKTtcblx0XHRcdGlmICggaGFuZGxlICkge1xuXHRcdFx0XHRoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBOYXRpdmUgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gb250eXBlICYmIGN1clsgb250eXBlIF07XG5cdFx0XHRpZiAoIGhhbmRsZSAmJiBoYW5kbGUuYXBwbHkgJiYgYWNjZXB0RGF0YSggY3VyICkgKSB7XG5cdFx0XHRcdGV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGV2ZW50LnR5cGUgPSB0eXBlO1xuXG5cdFx0Ly8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vd1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7XG5cblx0XHRcdGlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fFxuXHRcdFx0XHRzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBldmVudFBhdGgucG9wKCksIGRhdGEgKSA9PT0gZmFsc2UgKSAmJlxuXHRcdFx0XHRhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cblx0XHRcdFx0Ly8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIG5hbWUgYXMgdGhlIGV2ZW50LlxuXHRcdFx0XHQvLyBEb24ndCBkbyBkZWZhdWx0IGFjdGlvbnMgb24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xvYmFsIHZhcmlhYmxlcyBiZSAoIzYxNzApXG5cdFx0XHRcdGlmICggb250eXBlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBlbGVtWyB0eXBlIF0gKSAmJiAhalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXHRcdFx0XHRcdGVsZW1bIHR5cGUgXSgpO1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gdG1wO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0Ly8gUGlnZ3liYWNrIG9uIGEgZG9ub3IgZXZlbnQgdG8gc2ltdWxhdGUgYSBkaWZmZXJlbnQgb25lXG5cdHNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQgKSB7XG5cdFx0dmFyIGUgPSBqUXVlcnkuZXh0ZW5kKFxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCgpLFxuXHRcdFx0ZXZlbnQsXG5cdFx0XHR7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdGlzU2ltdWxhdGVkOiB0cnVlXG5cblx0XHRcdFx0Ly8gUHJldmlvdXNseSwgYG9yaWdpbmFsRXZlbnQ6IHt9YCB3YXMgc2V0IGhlcmUsIHNvIHN0b3BQcm9wYWdhdGlvbiBjYWxsXG5cdFx0XHRcdC8vIHdvdWxkIG5vdCBiZSB0cmlnZ2VyZWQgb24gZG9ub3IgZXZlbnQsIHNpbmNlIGluIG91ciBvd25cblx0XHRcdFx0Ly8galF1ZXJ5LmV2ZW50LnN0b3BQcm9wYWdhdGlvbiBmdW5jdGlvbiB3ZSBoYWQgYSBjaGVjayBmb3IgZXhpc3RlbmNlIG9mXG5cdFx0XHRcdC8vIG9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uIG1ldGhvZCwgc28sIGNvbnNlcXVlbnRseSBpdCB3b3VsZCBiZSBhIG5vb3AuXG5cdFx0XHRcdC8vXG5cdFx0XHRcdC8vIEJ1dCBub3csIHRoaXMgXCJzaW11bGF0ZVwiIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBmb3IgZXZlbnRzXG5cdFx0XHRcdC8vIGZvciB3aGljaCBzdG9wUHJvcGFnYXRpb24oKSBpcyBub29wLCBzbyB0aGVyZSBpcyBubyBuZWVkIGZvciB0aGF0IGFueW1vcmUuXG5cdFx0XHRcdC8vXG5cdFx0XHRcdC8vIEZvciB0aGUgMS54IGJyYW5jaCB0aG91Z2gsIGd1YXJkIGZvciBcImNsaWNrXCIgYW5kIFwic3VibWl0XCJcblx0XHRcdFx0Ly8gZXZlbnRzIGlzIHN0aWxsIHVzZWQsIGJ1dCB3YXMgbW92ZWQgdG8galF1ZXJ5LmV2ZW50LnN0b3BQcm9wYWdhdGlvbiBmdW5jdGlvblxuXHRcdFx0XHQvLyBiZWNhdXNlIGBvcmlnaW5hbEV2ZW50YCBzaG91bGQgcG9pbnQgdG8gdGhlIG9yaWdpbmFsIGV2ZW50IGZvciB0aGUgY29uc3RhbmN5XG5cdFx0XHRcdC8vIHdpdGggb3RoZXIgZXZlbnRzIGFuZCBmb3IgbW9yZSBmb2N1c2VkIGxvZ2ljXG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7XG5cblx0XHRpZiAoIGUuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fVxuXG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSApO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxualF1ZXJ5LmVhY2goICggXCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBcIiArXG5cdFwibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgXCIgK1xuXHRcImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnVcIiApLnNwbGl0KCBcIiBcIiApLFxuXHRmdW5jdGlvbiggaSwgbmFtZSApIHtcblxuXHQvLyBIYW5kbGUgZXZlbnQgYmluZGluZ1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgP1xuXHRcdFx0dGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6XG5cdFx0XHR0aGlzLnRyaWdnZXIoIG5hbWUgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XG5cdFx0cmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7XG5cdH1cbn0gKTtcblxuXG5cblxuc3VwcG9ydC5mb2N1c2luID0gXCJvbmZvY3VzaW5cIiBpbiB3aW5kb3c7XG5cblxuLy8gU3VwcG9ydDogRmlyZWZveFxuLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50c1xuLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc3ODdcbi8vXG4vLyBTdXBwb3J0OiBDaHJvbWUsIFNhZmFyaVxuLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsXG4vLyB3aGljaCBpcyBzcGVjIHZpb2xhdGlvbiAtIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWZvY3VzZXZlbnQtZXZlbnQtb3JkZXJcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1N1xuaWYgKCAhc3VwcG9ydC5mb2N1c2luICkge1xuXHRqUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXG5cdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIG9uIHRoZSBkb2N1bWVudCB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXRcblx0XHR2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTtcblx0XHR9O1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0ge1xuXHRcdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTtcblx0XHRcdH0sXG5cdFx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fSApO1xufVxudmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuXG52YXIgbm9uY2UgPSBqUXVlcnkubm93KCk7XG5cbnZhciBycXVlcnkgPSAoIC9cXD8vICk7XG5cblxuXG4vLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuLy8gV29ya2Fyb3VuZCBmYWlsdXJlIHRvIHN0cmluZy1jYXN0IG51bGwgaW5wdXRcbmpRdWVyeS5wYXJzZUpTT04gPSBmdW5jdGlvbiggZGF0YSApIHtcblx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKyBcIlwiICk7XG59O1xuXG5cbi8vIENyb3NzLWJyb3dzZXIgeG1sIHBhcnNpbmdcbmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHR2YXIgeG1sO1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUU5XG5cdHRyeSB7XG5cdFx0eG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCBcInRleHQveG1sXCIgKTtcblx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0eG1sID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0aWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJwYXJzZXJlcnJvclwiICkubGVuZ3RoICkge1xuXHRcdGpRdWVyeS5lcnJvciggXCJJbnZhbGlkIFhNTDogXCIgKyBkYXRhICk7XG5cdH1cblx0cmV0dXJuIHhtbDtcbn07XG5cblxudmFyXG5cdHJoYXNoID0gLyMuKiQvLFxuXHRydHMgPSAvKFs/Jl0pXz1bXiZdKi8sXG5cdHJoZWFkZXJzID0gL14oLio/KTpbIFxcdF0qKFteXFxyXFxuXSopJC9tZyxcblxuXHQvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb25cblx0cmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxcblx0cm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sXG5cdHJwcm90b2NvbCA9IC9eXFwvXFwvLyxcblxuXHQvKiBQcmVmaWx0ZXJzXG5cdCAqIDEpIFRoZXkgYXJlIHVzZWZ1bCB0byBpbnRyb2R1Y2UgY3VzdG9tIGRhdGFUeXBlcyAoc2VlIGFqYXgvanNvbnAuanMgZm9yIGFuIGV4YW1wbGUpXG5cdCAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6XG5cdCAqICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0cmFuc3BvcnRcblx0ICogICAgLSBBRlRFUiBwYXJhbSBzZXJpYWxpemF0aW9uIChzLmRhdGEgaXMgYSBzdHJpbmcgaWYgcy5wcm9jZXNzRGF0YSBpcyB0cnVlKVxuXHQgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byBcIipcIiBpZiBuZWVkZWRcblx0ICovXG5cdHByZWZpbHRlcnMgPSB7fSxcblxuXHQvKiBUcmFuc3BvcnRzIGJpbmRpbmdzXG5cdCAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogMikgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiAzKSBzZWxlY3Rpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBnbyB0byBcIipcIiBpZiBuZWVkZWRcblx0ICovXG5cdHRyYW5zcG9ydHMgPSB7fSxcblxuXHQvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb25cblx0YWxsVHlwZXMgPSBcIiovXCIuY29uY2F0KCBcIipcIiApLFxuXG5cdC8vIEFuY2hvciB0YWcgZm9yIHBhcnNpbmcgdGhlIGRvY3VtZW50IG9yaWdpblxuXHRvcmlnaW5BbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXHRvcmlnaW5BbmNob3IuaHJlZiA9IGxvY2F0aW9uLmhyZWY7XG5cbi8vIEJhc2UgXCJjb25zdHJ1Y3RvclwiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnRcbmZ1bmN0aW9uIGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlICkge1xuXG5cdC8vIGRhdGFUeXBlRXhwcmVzc2lvbiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gXCIqXCJcblx0cmV0dXJuIGZ1bmN0aW9uKCBkYXRhVHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uO1xuXHRcdFx0ZGF0YVR5cGVFeHByZXNzaW9uID0gXCIqXCI7XG5cdFx0fVxuXG5cdFx0dmFyIGRhdGFUeXBlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7XG5cblx0XHRcdC8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb25cblx0XHRcdHdoaWxlICggKCBkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSsrIF0gKSApIHtcblxuXHRcdFx0XHQvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZFxuXHRcdFx0XHRpZiAoIGRhdGFUeXBlWyAwIF0gPT09IFwiK1wiICkge1xuXHRcdFx0XHRcdGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCBcIipcIjtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnVuc2hpZnQoIGZ1bmMgKTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYXBwZW5kXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbi8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0c1xuZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHtcblxuXHR2YXIgaW5zcGVjdGVkID0ge30sXG5cdFx0c2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7XG5cblx0ZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7XG5cdFx0dmFyIHNlbGVjdGVkO1xuXHRcdGluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7XG5cdFx0alF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHtcblx0XHRcdHZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7XG5cdFx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHtcblxuXHRcdFx0XHRvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdGluc3BlY3QoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmICggc2Vla2luZ1RyYW5zcG9ydCApIHtcblx0XHRcdFx0cmV0dXJuICEoIHNlbGVjdGVkID0gZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0XHRyZXR1cm4gc2VsZWN0ZWQ7XG5cdH1cblxuXHRyZXR1cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNwZWN0ZWRbIFwiKlwiIF0gJiYgaW5zcGVjdCggXCIqXCIgKTtcbn1cblxuLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zXG4vLyB0aGF0IHRha2VzIFwiZmxhdFwiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKVxuLy8gRml4ZXMgIzk4ODdcbmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkge1xuXHR2YXIga2V5LCBkZWVwLFxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcblxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xuXHRcdGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0KCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKCBkZWVwID0ge30gKSApIClbIGtleSBdID0gc3JjWyBrZXkgXTtcblx0XHR9XG5cdH1cblx0aWYgKCBkZWVwICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OlxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcbiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xuXG5cdHZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlXG5cdGlmICggY3QgKSB7XG5cdFx0Zm9yICggdHlwZSBpbiBjb250ZW50cyApIHtcblx0XHRcdGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7XG5cdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZVxuXHRpZiAoIGRhdGFUeXBlc1sgMCBdIGluIHJlc3BvbnNlcyApIHtcblx0XHRmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1sgMCBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZVxuXHRcdGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7XG5cdH1cblxuXHQvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlXG5cdC8vIFdlIGFkZCB0aGUgZGF0YVR5cGUgdG8gdGhlIGxpc3QgaWYgbmVlZGVkXG5cdC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2Vcblx0aWYgKCBmaW5hbERhdGFUeXBlICkge1xuXHRcdGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7XG5cdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07XG5cdH1cbn1cblxuLyogQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZVxuICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApIHtcblx0dmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsIHByZXYsXG5cdFx0Y29udmVydGVycyA9IHt9LFxuXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0Ly8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0b1xuXHRcdFx0aWYgKCBjdXJyZW50ID09PSBcIipcIiApIHtcblxuXHRcdFx0XHRjdXJyZW50ID0gcHJldjtcblxuXHRcdFx0Ly8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZyb20gY3VycmVudFxuXHRcdFx0fSBlbHNlIGlmICggcHJldiAhPT0gXCIqXCIgJiYgcHJldiAhPT0gY3VycmVudCApIHtcblxuXHRcdFx0XHQvLyBTZWVrIGEgZGlyZWN0IGNvbnZlcnRlclxuXHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbIFwiKiBcIiArIGN1cnJlbnQgXTtcblxuXHRcdFx0XHQvLyBJZiBub25lIGZvdW5kLCBzZWVrIGEgcGFpclxuXHRcdFx0XHRpZiAoICFjb252ICkge1xuXHRcdFx0XHRcdGZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudFxuXHRcdFx0XHRcdFx0dG1wID0gY29udjIuc3BsaXQoIFwiIFwiICk7XG5cdFx0XHRcdFx0XHRpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHByZXYgY2FuIGJlIGNvbnZlcnRlZCB0byBhY2NlcHRlZCBpbnB1dFxuXHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgdG1wWyAwIF0gXSB8fFxuXHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlcnNbIFwiKiBcIiArIHRtcFsgMCBdIF07XG5cdFx0XHRcdFx0XHRcdGlmICggY29udiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIENvbmRlbnNlIGVxdWl2YWxlbmNlIGNvbnZlcnRlcnNcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgY29udjIgXTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGVcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudCA9IHRtcFsgMCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHRtcFsgMSBdICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXBwbHkgY29udmVydGVyIChpZiBub3QgYW4gZXF1aXZhbGVuY2UpXG5cdFx0XHRcdGlmICggY29udiAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdC8vIFVubGVzcyBlcnJvcnMgYXJlIGFsbG93ZWQgdG8gYnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW1cblx0XHRcdFx0XHRpZiAoIGNvbnYgJiYgcy50aHJvd3MgKSB7XG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXRlOiBcInBhcnNlcmVycm9yXCIsXG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3I6IGNvbnYgPyBlIDogXCJObyBjb252ZXJzaW9uIGZyb20gXCIgKyBwcmV2ICsgXCIgdG8gXCIgKyBjdXJyZW50XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHsgc3RhdGU6IFwic3VjY2Vzc1wiLCBkYXRhOiByZXNwb25zZSB9O1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzXG5cdGFjdGl2ZTogMCxcblxuXHQvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0XG5cdGxhc3RNb2RpZmllZDoge30sXG5cdGV0YWc6IHt9LFxuXG5cdGFqYXhTZXR0aW5nczoge1xuXHRcdHVybDogbG9jYXRpb24uaHJlZixcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGlzTG9jYWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGxvY2F0aW9uLnByb3RvY29sICksXG5cdFx0Z2xvYmFsOiB0cnVlLFxuXHRcdHByb2Nlc3NEYXRhOiB0cnVlLFxuXHRcdGFzeW5jOiB0cnVlLFxuXHRcdGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiLFxuXHRcdC8qXG5cdFx0dGltZW91dDogMCxcblx0XHRkYXRhOiBudWxsLFxuXHRcdGRhdGFUeXBlOiBudWxsLFxuXHRcdHVzZXJuYW1lOiBudWxsLFxuXHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdGNhY2hlOiBudWxsLFxuXHRcdHRocm93czogZmFsc2UsXG5cdFx0dHJhZGl0aW9uYWw6IGZhbHNlLFxuXHRcdGhlYWRlcnM6IHt9LFxuXHRcdCovXG5cblx0XHRhY2NlcHRzOiB7XG5cdFx0XHRcIipcIjogYWxsVHlwZXMsXG5cdFx0XHR0ZXh0OiBcInRleHQvcGxhaW5cIixcblx0XHRcdGh0bWw6IFwidGV4dC9odG1sXCIsXG5cdFx0XHR4bWw6IFwiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbFwiLFxuXHRcdFx0anNvbjogXCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHRcIlxuXHRcdH0sXG5cblx0XHRjb250ZW50czoge1xuXHRcdFx0eG1sOiAvXFxieG1sXFxiLyxcblx0XHRcdGh0bWw6IC9cXGJodG1sLyxcblx0XHRcdGpzb246IC9cXGJqc29uXFxiL1xuXHRcdH0sXG5cblx0XHRyZXNwb25zZUZpZWxkczoge1xuXHRcdFx0eG1sOiBcInJlc3BvbnNlWE1MXCIsXG5cdFx0XHR0ZXh0OiBcInJlc3BvbnNlVGV4dFwiLFxuXHRcdFx0anNvbjogXCJyZXNwb25zZUpTT05cIlxuXHRcdH0sXG5cblx0XHQvLyBEYXRhIGNvbnZlcnRlcnNcblx0XHQvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgXCIqXCIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG5cdFx0Y29udmVydGVyczoge1xuXG5cdFx0XHQvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHRcblx0XHRcdFwiKiB0ZXh0XCI6IFN0cmluZyxcblxuXHRcdFx0Ly8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pXG5cdFx0XHRcInRleHQgaHRtbFwiOiB0cnVlLFxuXG5cdFx0XHQvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uXG5cdFx0XHRcInRleHQganNvblwiOiBqUXVlcnkucGFyc2VKU09OLFxuXG5cdFx0XHQvLyBQYXJzZSB0ZXh0IGFzIHhtbFxuXHRcdFx0XCJ0ZXh0IHhtbFwiOiBqUXVlcnkucGFyc2VYTUxcblx0XHR9LFxuXG5cdFx0Ly8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDpcblx0XHQvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmXG5cdFx0Ly8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmVcblx0XHQvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZClcblx0XHRmbGF0T3B0aW9uczoge1xuXHRcdFx0dXJsOiB0cnVlLFxuXHRcdFx0Y29udGV4dDogdHJ1ZVxuXHRcdH1cblx0fSxcblxuXHQvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldFxuXHQvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0aW5ncyBmaWVsZHMuXG5cdC8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuXG5cdGFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzID9cblxuXHRcdFx0Ly8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3Rcblx0XHRcdGFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDpcblxuXHRcdFx0Ly8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5nc1xuXHRcdFx0YWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7XG5cdH0sXG5cblx0YWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksXG5cdGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLFxuXG5cdC8vIE1haW4gbWV0aG9kXG5cdGFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBJZiB1cmwgaXMgYW4gb2JqZWN0LCBzaW11bGF0ZSBwcmUtMS41IHNpZ25hdHVyZVxuXHRcdGlmICggdHlwZW9mIHVybCA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB1cmw7XG5cdFx0XHR1cmwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3Rcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdHZhciB0cmFuc3BvcnQsXG5cblx0XHRcdC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW1cblx0XHRcdGNhY2hlVVJMLFxuXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcsXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXG5cblx0XHRcdC8vIHRpbWVvdXQgaGFuZGxlXG5cdFx0XHR0aW1lb3V0VGltZXIsXG5cblx0XHRcdC8vIFVybCBjbGVhbnVwIHZhclxuXHRcdFx0dXJsQW5jaG9yLFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMgb2JqZWN0XG5cdFx0XHRzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSxcblxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcblx0XHRcdGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLFxuXG5cdFx0XHQvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uXG5cdFx0XHRnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiZcblx0XHRcdFx0KCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID9cblx0XHRcdFx0XHRqUXVlcnkoIGNhbGxiYWNrQ29udGV4dCApIDpcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQsXG5cblx0XHRcdC8vIERlZmVycmVkc1xuXHRcdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdHN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sXG5cblx0XHRcdC8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpXG5cdFx0XHRyZXF1ZXN0SGVhZGVycyA9IHt9LFxuXHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LFxuXG5cdFx0XHQvLyBUaGUganFYSFIgc3RhdGVcblx0XHRcdHN0YXRlID0gMCxcblxuXHRcdFx0Ly8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlXG5cdFx0XHRzdHJBYm9ydCA9IFwiY2FuY2VsZWRcIixcblxuXHRcdFx0Ly8gRmFrZSB4aHJcblx0XHRcdGpxWEhSID0ge1xuXHRcdFx0XHRyZWFkeVN0YXRlOiAwLFxuXG5cdFx0XHRcdC8vIEJ1aWxkcyBoZWFkZXJzIGhhc2h0YWJsZSBpZiBuZWVkZWRcblx0XHRcdFx0Z2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0XHRcdFx0dmFyIG1hdGNoO1xuXHRcdFx0XHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoICggbWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbIDEgXS50b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gUmF3IHN0cmluZ1xuXHRcdFx0XHRnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZSA9PT0gMiA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdHZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRpZiAoICFzdGF0ZSApIHtcblx0XHRcdFx0XHRcdG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoICFzdGF0ZSApIHtcblx0XHRcdFx0XHRcdHMubWltZVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0XHRzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkge1xuXHRcdFx0XHRcdHZhciBjb2RlO1xuXHRcdFx0XHRcdGlmICggbWFwICkge1xuXHRcdFx0XHRcdFx0aWYgKCBzdGF0ZSA8IDIgKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gTGF6eS1hZGQgdGhlIG5ldyBjYWxsYmFjayBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lc1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrc1xuXHRcdFx0XHRcdFx0XHRqcVhIUi5hbHdheXMoIG1hcFsganFYSFIuc3RhdHVzIF0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSByZXF1ZXN0XG5cdFx0XHRcdGFib3J0OiBmdW5jdGlvbiggc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHR2YXIgZmluYWxUZXh0ID0gc3RhdHVzVGV4dCB8fCBzdHJBYm9ydDtcblx0XHRcdFx0XHRpZiAoIHRyYW5zcG9ydCApIHtcblx0XHRcdFx0XHRcdHRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRvbmUoIDAsIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0Ly8gQXR0YWNoIGRlZmVycmVkc1xuXHRcdGRlZmVycmVkLnByb21pc2UoIGpxWEhSICkuY29tcGxldGUgPSBjb21wbGV0ZURlZmVycmVkLmFkZDtcblx0XHRqcVhIUi5zdWNjZXNzID0ganFYSFIuZG9uZTtcblx0XHRqcVhIUi5lcnJvciA9IGpxWEhSLmZhaWw7XG5cblx0XHQvLyBSZW1vdmUgaGFzaCBjaGFyYWN0ZXIgKCM3NTMxOiBhbmQgc3RyaW5nIHByb21vdGlvbilcblx0XHQvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkIChwcmVmaWx0ZXJzIG1pZ2h0IGV4cGVjdCBpdClcblx0XHQvLyBIYW5kbGUgZmFsc3kgdXJsIGluIHRoZSBzZXR0aW5ncyBvYmplY3QgKCMxMDA5MzogY29uc2lzdGVuY3kgd2l0aCBvbGQgc2lnbmF0dXJlKVxuXHRcdC8vIFdlIGFsc28gdXNlIHRoZSB1cmwgcGFyYW1ldGVyIGlmIGF2YWlsYWJsZVxuXHRcdHMudXJsID0gKCAoIHVybCB8fCBzLnVybCB8fCBsb2NhdGlvbi5ocmVmICkgKyBcIlwiICkucmVwbGFjZSggcmhhc2gsIFwiXCIgKVxuXHRcdFx0LnJlcGxhY2UoIHJwcm90b2NvbCwgbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKTtcblxuXHRcdC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNFxuXHRcdHMudHlwZSA9IG9wdGlvbnMubWV0aG9kIHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7XG5cblx0XHQvLyBFeHRyYWN0IGRhdGFUeXBlcyBsaXN0XG5cdFx0cy5kYXRhVHlwZXMgPSBqUXVlcnkudHJpbSggcy5kYXRhVHlwZSB8fCBcIipcIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXG5cdFx0Ly8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHRoZSBvcmlnaW4gZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudCBvcmlnaW4uXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XG5cdFx0XHR1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTgtMTErXG5cdFx0XHQvLyBJRSB0aHJvd3MgZXhjZXB0aW9uIGlmIHVybCBpcyBtYWxmb3JtZWQsIGUuZy4gaHR0cDovL2V4YW1wbGUuY29tOjgweC9cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gcy51cmw7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUU4LTExK1xuXHRcdFx0XHQvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZVxuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHVybEFuY2hvci5ocmVmO1xuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gb3JpZ2luQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09XG5cdFx0XHRcdFx0dXJsQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgdXJsQW5jaG9yLmhvc3Q7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbixcblx0XHRcdFx0Ly8gaXQgY2FuIGJlIHJlamVjdGVkIGJ5IHRoZSB0cmFuc3BvcnQgaWYgaXQgaXMgaW52YWxpZFxuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcblx0XHRpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHByZWZpbHRlcnNcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlXG5cdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcblx0XHRcdHJldHVybiBqcVhIUjtcblx0XHR9XG5cblx0XHQvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0b1xuXHRcdC8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpXG5cdFx0ZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7XG5cblx0XHQvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzXG5cdFx0aWYgKCBmaXJlR2xvYmFscyAmJiBqUXVlcnkuYWN0aXZlKysgPT09IDAgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RhcnRcIiApO1xuXHRcdH1cblxuXHRcdC8vIFVwcGVyY2FzZSB0aGUgdHlwZVxuXHRcdHMudHlwZSA9IHMudHlwZS50b1VwcGVyQ2FzZSgpO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnRcblx0XHRzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTtcblxuXHRcdC8vIFNhdmUgdGhlIFVSTCBpbiBjYXNlIHdlJ3JlIHRveWluZyB3aXRoIHRoZSBJZi1Nb2RpZmllZC1TaW5jZVxuXHRcdC8vIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciBsYXRlciBvblxuXHRcdGNhY2hlVVJMID0gcy51cmw7XG5cblx0XHQvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdpdGggbm8gY29udGVudFxuXHRcdGlmICggIXMuaGFzQ29udGVudCApIHtcblxuXHRcdFx0Ly8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybFxuXHRcdFx0aWYgKCBzLmRhdGEgKSB7XG5cdFx0XHRcdGNhY2hlVVJMID0gKCBzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgcy5kYXRhICk7XG5cblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxuXHRcdFx0XHRkZWxldGUgcy5kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkXG5cdFx0XHRpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRzLnVybCA9IHJ0cy50ZXN0KCBjYWNoZVVSTCApID9cblxuXHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSAnXycgcGFyYW1ldGVyLCBzZXQgaXRzIHZhbHVlXG5cdFx0XHRcdFx0Y2FjaGVVUkwucmVwbGFjZSggcnRzLCBcIiQxXz1cIiArIG5vbmNlKysgKSA6XG5cblx0XHRcdFx0XHQvLyBPdGhlcndpc2UgYWRkIG9uZSB0byB0aGUgZW5kXG5cdFx0XHRcdFx0Y2FjaGVVUkwgKyAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgXCJfPVwiICsgbm9uY2UrKztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0aWYgKCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU1vZGlmaWVkLVNpbmNlXCIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHRcdGlmICggalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTm9uZS1NYXRjaFwiLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2VudFxuXHRcdGlmICggcy5kYXRhICYmIHMuaGFzQ29udGVudCAmJiBzLmNvbnRlbnRUeXBlICE9PSBmYWxzZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJDb250ZW50LVR5cGVcIiwgcy5jb250ZW50VHlwZSApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGVcblx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKFxuXHRcdFx0XCJBY2NlcHRcIixcblx0XHRcdHMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gP1xuXHRcdFx0XHRzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArXG5cdFx0XHRcdFx0KCBzLmRhdGFUeXBlc1sgMCBdICE9PSBcIipcIiA/IFwiLCBcIiArIGFsbFR5cGVzICsgXCI7IHE9MC4wMVwiIDogXCJcIiApIDpcblx0XHRcdFx0cy5hY2NlcHRzWyBcIipcIiBdXG5cdFx0KTtcblxuXHRcdC8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvblxuXHRcdGZvciAoIGkgaW4gcy5oZWFkZXJzICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0XG5cdFx0aWYgKCBzLmJlZm9yZVNlbmQgJiZcblx0XHRcdCggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGZvciAoIGkgaW4geyBzdWNjZXNzOiAxLCBlcnJvcjogMSwgY29tcGxldGU6IDEgfSApIHtcblx0XHRcdGpxWEhSWyBpIF0oIHNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEdldCB0cmFuc3BvcnRcblx0XHR0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIG5vIHRyYW5zcG9ydCwgd2UgYXV0by1hYm9ydFxuXHRcdGlmICggIXRyYW5zcG9ydCApIHtcblx0XHRcdGRvbmUoIC0xLCBcIk5vIFRyYW5zcG9ydFwiICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSAxO1xuXG5cdFx0XHQvLyBTZW5kIGdsb2JhbCBldmVudFxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheFNlbmRcIiwgWyBqcVhIUiwgcyBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlXG5cdFx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0anFYSFIuYWJvcnQoIFwidGltZW91dFwiICk7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRzdGF0ZSA9IDE7XG5cdFx0XHRcdHRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApO1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Ly8gUHJvcGFnYXRlIGV4Y2VwdGlvbiBhcyBlcnJvciBpZiBub3QgZG9uZVxuXHRcdFx0XHRpZiAoIHN0YXRlIDwgMiApIHtcblx0XHRcdFx0XHRkb25lKCAtMSwgZSApO1xuXG5cdFx0XHRcdC8vIFNpbXBseSByZXRocm93IG90aGVyd2lzZVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmVcblx0XHRmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHtcblx0XHRcdHZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsXG5cdFx0XHRcdHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0O1xuXG5cdFx0XHQvLyBDYWxsZWQgb25jZVxuXHRcdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGF0ZSBpcyBcImRvbmVcIiBub3dcblx0XHRcdHN0YXRlID0gMjtcblxuXHRcdFx0Ly8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHNcblx0XHRcdGlmICggdGltZW91dFRpbWVyICkge1xuXHRcdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb25cblx0XHRcdC8vIChubyBtYXR0ZXIgaG93IGxvbmcgdGhlIGpxWEhSIG9iamVjdCB3aWxsIGJlIHVzZWQpXG5cdFx0XHR0cmFuc3BvcnQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdC8vIENhY2hlIHJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyA9IGhlYWRlcnMgfHwgXCJcIjtcblxuXHRcdFx0Ly8gU2V0IHJlYWR5U3RhdGVcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMgPiAwID8gNCA6IDA7XG5cblx0XHRcdC8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsXG5cdFx0XHRpc1N1Y2Nlc3MgPSBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBzdGF0dXMgPT09IDMwNDtcblxuXHRcdFx0Ly8gR2V0IHJlc3BvbnNlIGRhdGFcblx0XHRcdGlmICggcmVzcG9uc2VzICkge1xuXHRcdFx0XHRyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KVxuXHRcdFx0cmVzcG9uc2UgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKTtcblxuXHRcdFx0Ly8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmdcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXG5cdFx0XHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0XHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiTGFzdC1Nb2RpZmllZFwiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJldGFnXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBpZiBubyBjb250ZW50XG5cdFx0XHRcdGlmICggc3RhdHVzID09PSAyMDQgfHwgcy50eXBlID09PSBcIkhFQURcIiApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub2NvbnRlbnRcIjtcblxuXHRcdFx0XHQvLyBpZiBub3QgbW9kaWZpZWRcblx0XHRcdFx0fSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm90bW9kaWZpZWRcIjtcblxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdGU7XG5cdFx0XHRcdFx0c3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0ZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcblx0XHRcdFx0XHRpc1N1Y2Nlc3MgPSAhZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gRXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQgYW5kIG5vcm1hbGl6ZSBmb3Igbm9uLWFib3J0c1xuXHRcdFx0XHRlcnJvciA9IHN0YXR1c1RleHQ7XG5cdFx0XHRcdGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcImVycm9yXCI7XG5cdFx0XHRcdFx0aWYgKCBzdGF0dXMgPCAwICkge1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3Rcblx0XHRcdGpxWEhSLnN0YXR1cyA9IHN0YXR1cztcblx0XHRcdGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgXCJcIjtcblxuXHRcdFx0Ly8gU3VjY2Vzcy9FcnJvclxuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7XG5cdFx0XHRzdGF0dXNDb2RlID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggaXNTdWNjZXNzID8gXCJhamF4U3VjY2Vzc1wiIDogXCJhamF4RXJyb3JcIixcblx0XHRcdFx0XHRbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb21wbGV0ZVxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheENvbXBsZXRlXCIsIFsganFYSFIsIHMgXSApO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlclxuXHRcdFx0XHRpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdG9wXCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBqcVhIUjtcblx0fSxcblxuXHRnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgXCJqc29uXCIgKTtcblx0fSxcblxuXHRnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssIFwic2NyaXB0XCIgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcImdldFwiLCBcInBvc3RcIiBdLCBmdW5jdGlvbiggaSwgbWV0aG9kICkge1xuXHRqUXVlcnlbIG1ldGhvZCBdID0gZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2ssIHR5cGUgKSB7XG5cblx0XHQvLyBTaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZFxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrO1xuXHRcdFx0Y2FsbGJhY2sgPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBUaGUgdXJsIGNhbiBiZSBhbiBvcHRpb25zIG9iamVjdCAod2hpY2ggdGhlbiBtdXN0IGhhdmUgLnVybClcblx0XHRyZXR1cm4galF1ZXJ5LmFqYXgoIGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdHVybDogdXJsLFxuXHRcdFx0dHlwZTogbWV0aG9kLFxuXHRcdFx0ZGF0YVR5cGU6IHR5cGUsXG5cdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0c3VjY2VzczogY2FsbGJhY2tcblx0XHR9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTtcblx0fTtcbn0gKTtcblxuXG5qUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkge1xuXHRyZXR1cm4galF1ZXJ5LmFqYXgoIHtcblx0XHR1cmw6IHVybCxcblxuXHRcdC8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KVxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0ZGF0YVR5cGU6IFwic2NyaXB0XCIsXG5cdFx0YXN5bmM6IGZhbHNlLFxuXHRcdGdsb2JhbDogZmFsc2UsXG5cdFx0XCJ0aHJvd3NcIjogdHJ1ZVxuXHR9ICk7XG59O1xuXG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0d3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dmFyIHdyYXA7XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXNbIDAgXSApIHtcblxuXHRcdFx0Ly8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmRcblx0XHRcdHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbIDAgXS5vd25lckRvY3VtZW50ICkuZXEoIDAgKS5jbG9uZSggdHJ1ZSApO1xuXG5cdFx0XHRpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR3cmFwLmluc2VydEJlZm9yZSggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHdyYXAubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGVsZW0gPSB0aGlzO1xuXG5cdFx0XHRcdHdoaWxlICggZWxlbS5maXJzdEVsZW1lbnRDaGlsZCApIHtcblx0XHRcdFx0XHRlbGVtID0gZWxlbS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBlbGVtO1xuXHRcdFx0fSApLmFwcGVuZCggdGhpcyApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHdyYXBJbm5lcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGlzRnVuY3Rpb24gPyBodG1sLmNhbGwoIHRoaXMsIGkgKSA6IGh0bWwgKTtcblx0XHR9ICk7XG5cdH0sXG5cblx0dW53cmFwOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggIWpRdWVyeS5ub2RlTmFtZSggdGhpcywgXCJib2R5XCIgKSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApO1xuXHRcdFx0fVxuXHRcdH0gKS5lbmQoKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiAhalF1ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxlKCBlbGVtICk7XG59O1xualF1ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxlID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0Ly8gU3VwcG9ydDogT3BlcmEgPD0gMTIuMTJcblx0Ly8gT3BlcmEgcmVwb3J0cyBvZmZzZXRXaWR0aHMgYW5kIG9mZnNldEhlaWdodHMgbGVzcyB0aGFuIHplcm8gb24gc29tZSBlbGVtZW50c1xuXHQvLyBVc2UgT1IgaW5zdGVhZCBvZiBBTkQgYXMgdGhlIGVsZW1lbnQgaXMgbm90IHZpc2libGUgaWYgZWl0aGVyIGlzIHRydWVcblx0Ly8gU2VlIHRpY2tldHMgIzEwNDA2IGFuZCAjMTMxMzJcblx0cmV0dXJuIGVsZW0ub2Zmc2V0V2lkdGggPiAwIHx8IGVsZW0ub2Zmc2V0SGVpZ2h0ID4gMCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoID4gMDtcbn07XG5cblxuXG5cbnZhciByMjAgPSAvJTIwL2csXG5cdHJicmFja2V0ID0gL1xcW1xcXSQvLFxuXHRyQ1JMRiA9IC9cXHI/XFxuL2csXG5cdHJzdWJtaXR0ZXJUeXBlcyA9IC9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxcblx0cnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO1xuXG5mdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7XG5cdHZhciBuYW1lO1xuXG5cdGlmICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC5cblx0XHRcdFx0YnVpbGRQYXJhbXMoXG5cdFx0XHRcdFx0cHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT0gbnVsbCA/IGkgOiBcIlwiICkgKyBcIl1cIixcblx0XHRcdFx0XHR2LFxuXHRcdFx0XHRcdHRyYWRpdGlvbmFsLFxuXHRcdFx0XHRcdGFkZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgalF1ZXJ5LnR5cGUoIG9iaiApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIG9iamVjdCBpdGVtLlxuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCArIFwiW1wiICsgbmFtZSArIFwiXVwiLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHNjYWxhciBpdGVtLlxuXHRcdGFkZCggcHJlZml4LCBvYmogKTtcblx0fVxufVxuXG4vLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZlxuLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nXG5qUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7XG5cdHZhciBwcmVmaXgsXG5cdFx0cyA9IFtdLFxuXHRcdGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWVcblx0XHRcdHZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogKCB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICk7XG5cdFx0XHRzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSApO1xuXHRcdH07XG5cblx0Ly8gU2V0IHRyYWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci5cblx0aWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdHRyYWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncyAmJiBqUXVlcnkuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsO1xuXHR9XG5cblx0Ly8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy5cblx0aWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50c1xuXHRcdGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHtcblx0XHRcdGFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7XG5cdFx0fSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSBcIm9sZFwiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlclxuXHRcdC8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LlxuXHRcdGZvciAoIHByZWZpeCBpbiBhICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uXG5cdHJldHVybiBzLmpvaW4oIFwiJlwiICkucmVwbGFjZSggcjIwLCBcIitcIiApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApO1xuXHR9LFxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gQ2FuIGFkZCBwcm9wSG9vayBmb3IgXCJlbGVtZW50c1wiIHRvIGZpbHRlciBvciBhZGQgZm9ybSBlbGVtZW50c1xuXHRcdFx0dmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3AoIHRoaXMsIFwiZWxlbWVudHNcIiApO1xuXHRcdFx0cmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7XG5cdFx0fSApXG5cdFx0LmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdFx0Ly8gVXNlIC5pcyggXCI6ZGlzYWJsZWRcIiApIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRdIHdvcmtzXG5cdFx0XHRyZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggXCI6ZGlzYWJsZWRcIiApICYmXG5cdFx0XHRcdHJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiZcblx0XHRcdFx0KCB0aGlzLmNoZWNrZWQgfHwgIXJjaGVja2FibGVUeXBlLnRlc3QoIHR5cGUgKSApO1xuXHRcdH0gKVxuXHRcdC5tYXAoIGZ1bmN0aW9uKCBpLCBlbGVtICkge1xuXHRcdFx0dmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpO1xuXG5cdFx0XHRyZXR1cm4gdmFsID09IG51bGwgP1xuXHRcdFx0XHRudWxsIDpcblx0XHRcdFx0alF1ZXJ5LmlzQXJyYXkoIHZhbCApID9cblx0XHRcdFx0XHRqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdFx0XHRcdH0gKSA6XG5cdFx0XHRcdFx0eyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdH0gKS5nZXQoKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblx0fSBjYXRjaCAoIGUgKSB7fVxufTtcblxudmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7XG5cblx0XHQvLyBGaWxlIHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIGNvZGUgMCwgYXNzdW1lIDIwMFxuXHRcdDA6IDIwMCxcblxuXHRcdC8vIFN1cHBvcnQ6IElFOVxuXHRcdC8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNFxuXHRcdDEyMjM6IDIwNFxuXHR9LFxuXHR4aHJTdXBwb3J0ZWQgPSBqUXVlcnkuYWpheFNldHRpbmdzLnhocigpO1xuXG5zdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoIFwid2l0aENyZWRlbnRpYWxzXCIgaW4geGhyU3VwcG9ydGVkICk7XG5zdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDtcblxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHR2YXIgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s7XG5cblx0Ly8gQ3Jvc3MgZG9tYWluIG9ubHkgYWxsb3dlZCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdFxuXHRpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0dmFyIGksXG5cdFx0XHRcdFx0eGhyID0gb3B0aW9ucy54aHIoKTtcblxuXHRcdFx0XHR4aHIub3Blbihcblx0XHRcdFx0XHRvcHRpb25zLnR5cGUsXG5cdFx0XHRcdFx0b3B0aW9ucy51cmwsXG5cdFx0XHRcdFx0b3B0aW9ucy5hc3luYyxcblx0XHRcdFx0XHRvcHRpb25zLnVzZXJuYW1lLFxuXHRcdFx0XHRcdG9wdGlvbnMucGFzc3dvcmRcblx0XHRcdFx0KTtcblxuXHRcdFx0XHQvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0Zm9yICggaSBpbiBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRcdHhoclsgaSBdID0gb3B0aW9ucy54aHJGaWVsZHNbIGkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBPdmVycmlkZSBtaW1lIHR5cGUgaWYgbmVlZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHtcblx0XHRcdFx0XHR4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gWC1SZXF1ZXN0ZWQtV2l0aCBoZWFkZXJcblx0XHRcdFx0Ly8gRm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc2VlaW5nIGFzIGNvbmRpdGlvbnMgZm9yIGEgcHJlZmxpZ2h0IGFyZVxuXHRcdFx0XHQvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLlxuXHRcdFx0XHQvLyAoaXQgY2FuIGFsd2F5cyBiZSBzZXQgb24gYSBwZXItcmVxdWVzdCBiYXNpcyBvciBldmVuIHVzaW5nIGFqYXhTZXR1cClcblx0XHRcdFx0Ly8gRm9yIHNhbWUtZG9tYWluIHJlcXVlc3RzLCB3b24ndCBjaGFuZ2UgaGVhZGVyIGlmIGFscmVhZHkgcHJvdmlkZWQuXG5cdFx0XHRcdGlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiIF0gKSB7XG5cdFx0XHRcdFx0aGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSA9IFwiWE1MSHR0cFJlcXVlc3RcIjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNldCBoZWFkZXJzXG5cdFx0XHRcdGZvciAoIGkgaW4gaGVhZGVycyApIHtcblx0XHRcdFx0XHR4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrID0gZXJyb3JDYWxsYmFjayA9IHhoci5vbmxvYWQgPVxuXHRcdFx0XHRcdFx0XHRcdHhoci5vbmVycm9yID0geGhyLm9uYWJvcnQgPSB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiYWJvcnRcIiApIHtcblx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gXCJlcnJvclwiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUU5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZVxuXHRcdFx0XHRcdFx0XHRcdGlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggMCwgXCJlcnJvclwiICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZShcblx0XHRcdFx0XHRcdFx0XHRcdHhoclN1Y2Nlc3NTdGF0dXNbIHhoci5zdGF0dXMgXSB8fCB4aHIuc3RhdHVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHQsXG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFOSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBGb3IgWEhSMiBub24tdGV4dCwgbGV0IHRoZSBjYWxsZXIgaGFuZGxlIGl0IChnaC0yNDk4KVxuXHRcdFx0XHRcdFx0XHRcdFx0KCB4aHIucmVzcG9uc2VUeXBlIHx8IFwidGV4dFwiICkgIT09IFwidGV4dFwiICB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHhoci5yZXNwb25zZVRleHQgIT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGJpbmFyeTogeGhyLnJlc3BvbnNlIH0gOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IHRleHQ6IHhoci5yZXNwb25zZVRleHQgfSxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIExpc3RlbiB0byBldmVudHNcblx0XHRcdFx0eGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7XG5cdFx0XHRcdGVycm9yQ2FsbGJhY2sgPSB4aHIub25lcnJvciA9IGNhbGxiYWNrKCBcImVycm9yXCIgKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRTlcblx0XHRcdFx0Ly8gVXNlIG9ucmVhZHlzdGF0ZWNoYW5nZSB0byByZXBsYWNlIG9uYWJvcnRcblx0XHRcdFx0Ly8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0c1xuXHRcdFx0XHRpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0eGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBpdCBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFsbG93IG9uZXJyb3IgdG8gYmUgY2FsbGVkIGZpcnN0LFxuXHRcdFx0XHRcdFx0XHQvLyBidXQgdGhhdCB3aWxsIG5vdCBoYW5kbGUgYSBuYXRpdmUgYWJvcnRcblx0XHRcdFx0XHRcdFx0Ly8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0Ly8gYXMgeGhyLm9uZXJyb3IgY2Fubm90IGJlIGFjY2Vzc2VkXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2soIFwiYWJvcnRcIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pXG5cdFx0XHRcdFx0eGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdC8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGVcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0YWNjZXB0czoge1xuXHRcdHNjcmlwdDogXCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIFwiICtcblx0XHRcdFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCJcblx0fSxcblx0Y29udGVudHM6IHtcblx0XHRzY3JpcHQ6IC9cXGIoPzpqYXZhfGVjbWEpc2NyaXB0XFxiL1xuXHR9LFxuXHRjb252ZXJ0ZXJzOiB7XG5cdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7XG5cdFx0XHRyZXR1cm4gdGV4dDtcblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRzLmNhY2hlID0gZmFsc2U7XG5cdH1cblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMudHlwZSA9IFwiR0VUXCI7XG5cdH1cbn0gKTtcblxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XG5qUXVlcnkuYWpheFRyYW5zcG9ydCggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cblx0Ly8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0c1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0dmFyIHNjcmlwdCwgY2FsbGJhY2s7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBfLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0c2NyaXB0ID0galF1ZXJ5KCBcIjxzY3JpcHQ+XCIgKS5wcm9wKCB7XG5cdFx0XHRcdFx0Y2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LFxuXHRcdFx0XHRcdHNyYzogcy51cmxcblx0XHRcdFx0fSApLm9uKFxuXHRcdFx0XHRcdFwibG9hZCBlcnJvclwiLFxuXHRcdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZSsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0gKTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApXG5cdFx0XHRcdFx0LmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCAmJlxuXHRcdFx0XHRyanNvbnAudGVzdCggcy5kYXRhICkgJiYgXCJkYXRhXCJcblx0XHQpO1xuXG5cdC8vIEhhbmRsZSBpZmYgdGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyBcImpzb25wXCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXRcblx0aWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSBcImpzb25wXCIgKSB7XG5cblx0XHQvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0XG5cdFx0Y2FsbGJhY2tOYW1lID0gcy5qc29ucENhbGxiYWNrID0galF1ZXJ5LmlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID9cblx0XHRcdHMuanNvbnBDYWxsYmFjaygpIDpcblx0XHRcdHMuanNvbnBDYWxsYmFjaztcblxuXHRcdC8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGFcblx0XHRpZiAoIGpzb25Qcm9wICkge1xuXHRcdFx0c1sganNvblByb3AgXSA9IHNbIGpzb25Qcm9wIF0ucmVwbGFjZSggcmpzb25wLCBcIiQxXCIgKyBjYWxsYmFja05hbWUgKTtcblx0XHR9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHtcblx0XHRcdHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIHMudXJsICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmpzb25wICsgXCI9XCIgKyBjYWxsYmFja05hbWU7XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIGRhdGEgY29udmVydGVyIHRvIHJldHJpZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvblxuXHRcdHMuY29udmVydGVyc1sgXCJzY3JpcHQganNvblwiIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggIXJlc3BvbnNlQ29udGFpbmVyICkge1xuXHRcdFx0XHRqUXVlcnkuZXJyb3IoIGNhbGxiYWNrTmFtZSArIFwiIHdhcyBub3QgY2FsbGVkXCIgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXNwb25zZUNvbnRhaW5lclsgMCBdO1xuXHRcdH07XG5cblx0XHQvLyBGb3JjZSBqc29uIGRhdGFUeXBlXG5cdFx0cy5kYXRhVHlwZXNbIDAgXSA9IFwianNvblwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja1xuXHRcdG92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTtcblx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IGFyZ3VtZW50cztcblx0XHR9O1xuXG5cdFx0Ly8gQ2xlYW4tdXAgZnVuY3Rpb24gKGZpcmVzIGFmdGVyIGNvbnZlcnRlcnMpXG5cdFx0anFYSFIuYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gSWYgcHJldmlvdXMgdmFsdWUgZGlkbid0IGV4aXN0IC0gcmVtb3ZlIGl0XG5cdFx0XHRpZiAoIG92ZXJ3cml0dGVuID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdGpRdWVyeSggd2luZG93ICkucmVtb3ZlUHJvcCggY2FsbGJhY2tOYW1lICk7XG5cblx0XHRcdC8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNhdmUgYmFjayBhcyBmcmVlXG5cdFx0XHRpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkge1xuXG5cdFx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZFxuXHRcdFx0XHRzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHRcdFx0Ly8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZVxuXHRcdFx0XHRvbGRDYWxsYmFja3MucHVzaCggY2FsbGJhY2tOYW1lICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZVxuXHRcdFx0aWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHtcblx0XHRcdFx0b3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDtcblx0XHR9ICk7XG5cblx0XHQvLyBEZWxlZ2F0ZSB0byBzY3JpcHRcblx0XHRyZXR1cm4gXCJzY3JpcHRcIjtcblx0fVxufSApO1xuXG5cblxuXG4vLyBBcmd1bWVudCBcImRhdGFcIiBzaG91bGQgYmUgc3RyaW5nIG9mIGh0bWxcbi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCxcbi8vIGRlZmF1bHRzIHRvIGRvY3VtZW50XG4vLyBrZWVwU2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nXG5qUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkge1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGtlZXBTY3JpcHRzID0gY29udGV4dDtcblx0XHRjb250ZXh0ID0gZmFsc2U7XG5cdH1cblx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0dmFyIHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApLFxuXHRcdHNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107XG5cblx0Ly8gU2luZ2xlIHRhZ1xuXHRpZiAoIHBhcnNlZCApIHtcblx0XHRyZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsgMSBdICkgXTtcblx0fVxuXG5cdHBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7XG5cblx0aWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkge1xuXHRcdGpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIHBhcnNlZC5jaGlsZE5vZGVzICk7XG59O1xuXG5cbi8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZCBtZXRob2RcbnZhciBfbG9hZCA9IGpRdWVyeS5mbi5sb2FkO1xuXG4vKipcbiAqIExvYWQgYSB1cmwgaW50byBhIHBhZ2VcbiAqL1xualF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkge1xuXHRpZiAoIHR5cGVvZiB1cmwgIT09IFwic3RyaW5nXCIgJiYgX2xvYWQgKSB7XG5cdFx0cmV0dXJuIF9sb2FkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fVxuXG5cdHZhciBzZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0b2ZmID0gdXJsLmluZGV4T2YoIFwiIFwiICk7XG5cblx0aWYgKCBvZmYgPiAtMSApIHtcblx0XHRzZWxlY3RvciA9IGpRdWVyeS50cmltKCB1cmwuc2xpY2UoIG9mZiApICk7XG5cdFx0dXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTtcblx0fVxuXG5cdC8vIElmIGl0J3MgYSBmdW5jdGlvblxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoIHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBJZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkLlxuXHRcdFx0Ly8gTWFrZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGV4cGxpY2l0IHNpbmNlXG5cdFx0XHQvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2Rcblx0XHRcdHR5cGU6IHR5cGUgfHwgXCJHRVRcIixcblx0XHRcdGRhdGFUeXBlOiBcImh0bWxcIixcblx0XHRcdGRhdGE6IHBhcmFtc1xuXHRcdH0gKS5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeSggXCI8ZGl2PlwiICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0Ly8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImRhdGFcIiwgXCJzdGF0dXNcIiwgXCJqcVhIUlwiXG5cdFx0Ly8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLlxuXHRcdC8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJqcVhIUlwiLCBcInN0YXR1c1wiLCBcImVycm9yXCJcblx0XHR9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG4vLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50c1xualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSApO1xuXG5cblxuXG5qUXVlcnkuZXhwci5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiBqUXVlcnkuZ3JlcCggalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9ICkubGVuZ3RoO1xufTtcblxuXG5cblxuLyoqXG4gKiBHZXRzIGEgd2luZG93IGZyb20gYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7XG5cdHJldHVybiBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSA/IGVsZW0gOiBlbGVtLm5vZGVUeXBlID09PSA5ICYmIGVsZW0uZGVmYXVsdFZpZXc7XG59XG5cbmpRdWVyeS5vZmZzZXQgPSB7XG5cdHNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7XG5cdFx0dmFyIGN1clBvc2l0aW9uLCBjdXJMZWZ0LCBjdXJDU1NUb3AsIGN1clRvcCwgY3VyT2Zmc2V0LCBjdXJDU1NMZWZ0LCBjYWxjdWxhdGVQb3NpdGlvbixcblx0XHRcdHBvc2l0aW9uID0galF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICksXG5cdFx0XHRjdXJFbGVtID0galF1ZXJ5KCBlbGVtICksXG5cdFx0XHRwcm9wcyA9IHt9O1xuXG5cdFx0Ly8gU2V0IHBvc2l0aW9uIGZpcnN0LCBpbi1jYXNlIHRvcC9sZWZ0IGFyZSBzZXQgZXZlbiBvbiBzdGF0aWMgZWxlbVxuXHRcdGlmICggcG9zaXRpb24gPT09IFwic3RhdGljXCIgKSB7XG5cdFx0XHRlbGVtLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuXHRcdH1cblxuXHRcdGN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCk7XG5cdFx0Y3VyQ1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgXCJ0b3BcIiApO1xuXHRcdGN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImxlZnRcIiApO1xuXHRcdGNhbGN1bGF0ZVBvc2l0aW9uID0gKCBwb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiIHx8IHBvc2l0aW9uID09PSBcImZpeGVkXCIgKSAmJlxuXHRcdFx0KCBjdXJDU1NUb3AgKyBjdXJDU1NMZWZ0ICkuaW5kZXhPZiggXCJhdXRvXCIgKSA+IC0xO1xuXG5cdFx0Ly8gTmVlZCB0byBiZSBhYmxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiBpZiBlaXRoZXJcblx0XHQvLyB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWRcblx0XHRpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkge1xuXHRcdFx0Y3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7XG5cdFx0XHRjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7XG5cdFx0XHRjdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwO1xuXHRcdFx0Y3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwO1xuXHRcdH1cblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHtcblxuXHRcdFx0Ly8gVXNlIGpRdWVyeS5leHRlbmQgaGVyZSB0byBhbGxvdyBtb2RpZmljYXRpb24gb2YgY29vcmRpbmF0ZXMgYXJndW1lbnQgKGdoLTE4NDgpXG5cdFx0XHRvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbnMudG9wICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy50b3AgPSAoIG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCApICsgY3VyVG9wO1xuXHRcdH1cblx0XHRpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7XG5cdFx0fVxuXG5cdFx0aWYgKCBcInVzaW5nXCIgaW4gb3B0aW9ucyApIHtcblx0XHRcdG9wdGlvbnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJFbGVtLmNzcyggcHJvcHMgKTtcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0b2Zmc2V0OiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0dGhpcyA6XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTtcblx0XHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHZhciBkb2NFbGVtLCB3aW4sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0Ym94ID0geyB0b3A6IDAsIGxlZnQ6IDAgfSxcblx0XHRcdGRvYyA9IGVsZW0gJiYgZWxlbS5vd25lckRvY3VtZW50O1xuXG5cdFx0aWYgKCAhZG9jICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0Ly8gTWFrZSBzdXJlIGl0J3Mgbm90IGEgZGlzY29ubmVjdGVkIERPTSBub2RlXG5cdFx0aWYgKCAhalF1ZXJ5LmNvbnRhaW5zKCBkb2NFbGVtLCBlbGVtICkgKSB7XG5cdFx0XHRyZXR1cm4gYm94O1xuXHRcdH1cblxuXHRcdGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0d2luID0gZ2V0V2luZG93KCBkb2MgKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBib3gudG9wICsgd2luLnBhZ2VZT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRUb3AsXG5cdFx0XHRsZWZ0OiBib3gubGVmdCArIHdpbi5wYWdlWE9mZnNldCAtIGRvY0VsZW0uY2xpZW50TGVmdFxuXHRcdH07XG5cdH0sXG5cblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0cGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblxuXHRcdC8vIEZpeGVkIGVsZW1lbnRzIGFyZSBvZmZzZXQgZnJvbSB3aW5kb3cgKHBhcmVudE9mZnNldCA9IHt0b3A6MCwgbGVmdDogMH0sXG5cdFx0Ly8gYmVjYXVzZSBpdCBpcyBpdHMgb25seSBvZmZzZXQgcGFyZW50XG5cdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSA9PT0gXCJmaXhlZFwiICkge1xuXG5cdFx0XHQvLyBBc3N1bWUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGlzIHRoZXJlIHdoZW4gY29tcHV0ZWQgcG9zaXRpb24gaXMgZml4ZWRcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudFxuXHRcdFx0b2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQoKTtcblxuXHRcdFx0Ly8gR2V0IGNvcnJlY3Qgb2Zmc2V0c1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblx0XHRcdGlmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50WyAwIF0sIFwiaHRtbFwiICkgKSB7XG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IG9mZnNldFBhcmVudC5vZmZzZXQoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzXG5cdFx0XHRwYXJlbnRPZmZzZXQudG9wICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCBcImJvcmRlclRvcFdpZHRoXCIsIHRydWUgKTtcblx0XHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCBcImJvcmRlckxlZnRXaWR0aFwiLCB0cnVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2luc1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5Ub3BcIiwgdHJ1ZSApLFxuXHRcdFx0bGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luTGVmdFwiLCB0cnVlIClcblx0XHR9O1xuXHR9LFxuXG5cdC8vIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGRvY3VtZW50RWxlbWVudCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuXHQvLyAxKSBGb3IgdGhlIGVsZW1lbnQgaW5zaWRlIHRoZSBpZnJhbWUgd2l0aG91dCBvZmZzZXRQYXJlbnQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuXG5cdC8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvd1xuXHQvLyAyKSBGb3IgdGhlIGhpZGRlbiBvciBkZXRhY2hlZCBlbGVtZW50XG5cdC8vIDMpIEZvciBib2R5IG9yIGh0bWwgZWxlbWVudCwgaS5lLiBpbiBjYXNlIG9mIHRoZSBodG1sIG5vZGUgLSBpdCB3aWxsIHJldHVybiBpdHNlbGZcblx0Ly9cblx0Ly8gYnV0IHRob3NlIGV4Y2VwdGlvbnMgd2VyZSBuZXZlciBwcmVzZW50ZWQgYXMgYSByZWFsIGxpZmUgdXNlLWNhc2VzXG5cdC8vIGFuZCBtaWdodCBiZSBjb25zaWRlcmVkIGFzIG1vcmUgcHJlZmVyYWJsZSByZXN1bHRzLlxuXHQvL1xuXHQvLyBUaGlzIGxvZ2ljLCBob3dldmVyLCBpcyBub3QgZ3VhcmFudGVlZCBhbmQgY2FuIGNoYW5nZSBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZVxuXHRvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQ7XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnRFbGVtZW50O1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG4vLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IHNjcm9sbExlZnQ6IFwicGFnZVhPZmZzZXRcIiwgc2Nyb2xsVG9wOiBcInBhZ2VZT2Zmc2V0XCIgfSwgZnVuY3Rpb24oIG1ldGhvZCwgcHJvcCApIHtcblx0dmFyIHRvcCA9IFwicGFnZVlPZmZzZXRcIiA9PT0gcHJvcDtcblxuXHRqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7XG5cdFx0XHR2YXIgd2luID0gZ2V0V2luZG93KCBlbGVtICk7XG5cblx0XHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiB3aW4gPyB3aW5bIHByb3AgXSA6IGVsZW1bIG1ldGhvZCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHdpbiApIHtcblx0XHRcdFx0d2luLnNjcm9sbFRvKFxuXHRcdFx0XHRcdCF0b3AgPyB2YWwgOiB3aW4ucGFnZVhPZmZzZXQsXG5cdFx0XHRcdFx0dG9wID8gdmFsIDogd2luLnBhZ2VZT2Zmc2V0XG5cdFx0XHRcdCk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1bIG1ldGhvZCBdID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH07XG59ICk7XG5cbi8vIFN1cHBvcnQ6IFNhZmFyaTw3LTgrLCBDaHJvbWU8MzctNDQrXG4vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvblxuLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0XG4vLyBCbGluayBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0yMjkyODBcbi8vIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyBwZXJjZW50IHdoZW4gc3BlY2lmaWVkIGZvciB0b3AvbGVmdC9ib3R0b20vcmlnaHQ7XG4vLyByYXRoZXIgdGhhbiBtYWtlIHRoZSBjc3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zmc2V0IG1vZHVsZSwganVzdCBjaGVjayBmb3IgaXQgaGVyZVxualF1ZXJ5LmVhY2goIFsgXCJ0b3BcIiwgXCJsZWZ0XCIgXSwgZnVuY3Rpb24oIGksIHByb3AgKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdFx0Y29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTtcblxuXHRcdFx0XHQvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXRcblx0XHRcdFx0cmV0dXJuIHJudW1ub25weC50ZXN0KCBjb21wdXRlZCApID9cblx0XHRcdFx0XHRqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigpWyBwcm9wIF0gKyBcInB4XCIgOlxuXHRcdFx0XHRcdGNvbXB1dGVkO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcbn0gKTtcblxuXG4vLyBDcmVhdGUgaW5uZXJIZWlnaHQsIGlubmVyV2lkdGgsIGhlaWdodCwgd2lkdGgsIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IEhlaWdodDogXCJoZWlnaHRcIiwgV2lkdGg6IFwid2lkdGhcIiB9LCBmdW5jdGlvbiggbmFtZSwgdHlwZSApIHtcblx0alF1ZXJ5LmVhY2goIHsgcGFkZGluZzogXCJpbm5lclwiICsgbmFtZSwgY29udGVudDogdHlwZSwgXCJcIjogXCJvdXRlclwiICsgbmFtZSB9LFxuXHRcdGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xuXG5cdFx0Ly8gTWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXG5cdFx0alF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSBcImJvb2xlYW5cIiApLFxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XG5cblx0XHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGRvYztcblxuXHRcdFx0XHRpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRcdFx0Ly8gQXMgb2YgNS84LzIwMTIgdGhpcyB3aWxsIHlpZWxkIGluY29ycmVjdCByZXN1bHRzIGZvciBNb2JpbGUgU2FmYXJpLCBidXQgdGhlcmVcblx0XHRcdFx0XHQvLyBpc24ndCBhIHdob2xlIGxvdCB3ZSBjYW4gZG8uIFNlZSBwdWxsIHJlcXVlc3QgYXQgdGhpcyBVUkwgZm9yIGRpc2N1c3Npb246XG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC83NjRcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIFwiY2xpZW50XCIgKyBuYW1lIF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdFx0XHRcdC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSxcblx0XHRcdFx0XHQvLyB3aGljaGV2ZXIgaXMgZ3JlYXRlc3Rcblx0XHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwic2Nyb2xsXCIgKyBuYW1lIF0sIGRvY1sgXCJzY3JvbGxcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJvZmZzZXRcIiArIG5hbWUgXSwgZG9jWyBcIm9mZnNldFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZG9jWyBcImNsaWVudFwiICsgbmFtZSBdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblxuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUsIG51bGwgKTtcblx0XHR9O1xuXHR9ICk7XG59ICk7XG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgP1xuXHRcdFx0dGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6XG5cdFx0XHR0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8IFwiKipcIiwgZm4gKTtcblx0fSxcblx0c2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubGVuZ3RoO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5hbmRTZWxmID0galF1ZXJ5LmZuLmFkZEJhY2s7XG5cblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSApO1xufVxuXG5cblxudmFyXG5cblx0Ly8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LFxuXG5cdC8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF8kID0gd2luZG93LiQ7XG5cbmpRdWVyeS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oIGRlZXAgKSB7XG5cdGlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cuJCA9IF8kO1xuXHR9XG5cblx0aWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnk7XG59O1xuXG4vLyBFeHBvc2UgalF1ZXJ5IGFuZCAkIGlkZW50aWZpZXJzLCBldmVuIGluIEFNRFxuLy8gKCM3MTAyI2NvbW1lbnQ6MTAsIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNTU3KVxuLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KVxuaWYgKCAhbm9HbG9iYWwgKSB7XG5cdHdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTtcbn1cblxucmV0dXJuIGpRdWVyeTtcbn0pKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDYWNoZSByZXN1bHRzIG9mIHRoZSBmaXJzdCBmdW5jdGlvbiBjYWxsIHRvIGVuc3VyZSBvbmx5IGNhbGxpbmcgb25jZS5cbiAqXG4gKiBgYGBqc1xuICogdmFyIHV0aWxzID0gcmVxdWlyZSgnbGF6eS1jYWNoZScpKHJlcXVpcmUpO1xuICogLy8gY2FjaGUgdGhlIGNhbGwgdG8gYHJlcXVpcmUoJ2Fuc2kteWVsbG93JylgXG4gKiB1dGlscygnYW5zaS15ZWxsb3cnLCAneWVsbG93Jyk7XG4gKiAvLyB1c2UgYGFuc2kteWVsbG93YFxuICogY29uc29sZS5sb2codXRpbHMueWVsbG93KCd0aGlzIGlzIHllbGxvdycpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBgZm5gIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlLlxuICogQHJldHVybiB7RnVuY3Rpb259IEZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCB0byBnZXQgdGhlIGNhY2hlZCBmdW5jdGlvblxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBsYXp5Q2FjaGUoZm4pIHtcbiAgdmFyIGNhY2hlID0ge307XG4gIHZhciBwcm94eSA9IGZ1bmN0aW9uKG1vZCwgbmFtZSkge1xuICAgIG5hbWUgPSBuYW1lIHx8IGNhbWVsY2FzZShtb2QpO1xuXG4gICAgLy8gY2hlY2sgYm90aCBib29sZWFuIGFuZCBzdHJpbmcgaW4gY2FzZSBgcHJvY2Vzcy5lbnZgIGNhc2VzIHRvIHN0cmluZ1xuICAgIGlmIChwcm9jZXNzLmVudi5VTkxBWlkgPT09ICd0cnVlJyB8fCBwcm9jZXNzLmVudi5VTkxBWlkgPT09IHRydWUgfHwgcHJvY2Vzcy5lbnYuVFJBVklTKSB7XG4gICAgICBjYWNoZVtuYW1lXSA9IGZuKG1vZCk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3h5LCBuYW1lLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBnZXR0ZXJcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGdldHRlcigpIHtcbiAgICAgIGlmIChjYWNoZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICByZXR1cm4gY2FjaGVbbmFtZV07XG4gICAgICB9XG4gICAgICByZXR1cm4gKGNhY2hlW25hbWVdID0gZm4obW9kKSk7XG4gICAgfVxuICAgIHJldHVybiBnZXR0ZXI7XG4gIH07XG4gIHJldHVybiBwcm94eTtcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGNhbWVsY2FzZSB0aGUgbmFtZSB0byBiZSBzdG9yZWQgb24gdGhlIGBsYXp5YCBvYmplY3QuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyYCBTdHJpbmcgY29udGFpbmluZyBgX2AsIGAuYCwgYC1gIG9yIHdoaXRlc3BhY2UgdGhhdCB3aWxsIGJlIGNhbWVsY2FzZWQuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IGNhbWVsY2FzZWQgc3RyaW5nLlxuICovXG5cbmZ1bmN0aW9uIGNhbWVsY2FzZShzdHIpIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgc3RyID0gc3RyLnJlcGxhY2UoL15bXFxXX10rfFtcXFdfXSskL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL1tcXFdfXSsoXFx3fCQpL2csIGZ1bmN0aW9uKF8sIGNoKSB7XG4gICAgcmV0dXJuIGNoLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEV4cG9zZSBgbGF6eUNhY2hlYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gbGF6eUNhY2hlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2hhbGsgPSByZXF1aXJlKCdjaGFsaycpO1xuXG4vKipcbiAqIGBgYGpzXG4gKiAvLyBMby1EYXNoXG4gKiA8JT0gbG9nKFwidGhpcyBpcyBhIG1lc3NhZ2UhXCIpICU+XG4gKiA8JT0gbG9nKFwiJWpcIiwgZm9vKSAlPlxuICpcbiAqIC8vIEhhbmRsZWJhcnNcbiAqIHt7bG9nIFwidGhpcyBpcyBhIG1lc3NhZ2UhXCJ9fVxuICogYGBgXG4gKi9cblxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbiBsb2dfKCkge1xuICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xufTtcblxuLyoqXG4gKiBgYGBqc1xuICogLy8gTG8tRGFzaFxuICogPCU9IGluZm8oXCJ0aGlzIGlzIGEgbWVzc2FnZSFcIikgJT5cbiAqIDwlPSBpbmZvKFwiJWpcIiwgZm9vKSAlPlxuICpcbiAqIC8vIEhhbmRsZWJhcnNcbiAqIHt7aW5mbyBcInRoaXMgaXMgYSBtZXNzYWdlIVwifX1cbiAqIGBgYFxuICovXG5cbmV4cG9ydHMuaW5mbyA9IGZ1bmN0aW9uIGluZm9fKCkge1xuICBhcmd1bWVudHNbMF0gPSBjaGFsay5jeWFuKGFyZ3VtZW50c1swXSk7XG4gIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cyk7XG59O1xuXG4vKipcbiAqIGBgYGpzXG4gKiAvLyBMby1EYXNoXG4gKiA8JT0gYm9sZChcInRoaXMgaXMgYSBtZXNzYWdlIVwiKSAlPlxuICogPCU9IGJvbGQoXCIlalwiLCBmb28pICU+XG4gKlxuICogLy8gSGFuZGxlYmFyc1xuICoge3tib2xkIFwidGhpcyBpcyBhIG1lc3NhZ2UhXCJ9fVxuICogYGBgXG4gKi9cblxuZXhwb3J0cy5ib2xkID0gZnVuY3Rpb24gYm9sZF8oKSB7XG4gIGFyZ3VtZW50c1swXSA9IGNoYWxrLmJvbGQoYXJndW1lbnRzWzBdKTtcbiAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcbn07XG5cbmV4cG9ydHMud2FybiA9IGZ1bmN0aW9uIHdhcm5fKCkge1xuICBhcmd1bWVudHNbMF0gPSBjaGFsay55ZWxsb3coYXJndW1lbnRzWzBdKTtcbiAgY29uc29sZS53YXJuLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cyk7XG59O1xuXG5leHBvcnRzLmVycm9yID0gZnVuY3Rpb24gZXJyb3JfKCkge1xuICBhcmd1bWVudHNbMF0gPSBjaGFsay5yZWQoYXJndW1lbnRzWzBdKTtcbiAgY29uc29sZS5lcnJvci5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xufTtcblxuLyoqXG4gKiBPdXRwdXRzIGEgZGVidWcgc3RhdGVtZW50IHdpdGggdGhlIGN1cnJlbnQgY29udGV4dCxcbiAqIGFuZC9vciBgdmFsYFxuICovXG5cbmV4cG9ydHMuZGVidWcgPSBmdW5jdGlvbiBkZWJ1Z18odmFsKSB7XG4gIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgY29uc29sZS5sb2coJ2NvbnRleHQ6ICVqJywgdGhpcyk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGlmICghaXNVbmRlZmluZWQodmFsKSkge1xuICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIFsndmFsdWU6ICVqJ10uY29uY2F0KHZhbCkpO1xuICB9XG4gIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgY29uc29sZS5sb2coKTtcbiAgcmV0dXJuO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHN0cmluZ2lmaWVkIEpTT04sIHdyYXBwZWQgaW4gYSBtYXJrZG93bi1mb3JtYXR0ZWRcbiAqIGNvZGVibG9jaywgaHRtbCBwcmUgdGFncywgb3Igbm90aGluZyBiYXNlZCBvbiB0aGUgYGV4dGBcbiAqIHBhc3NlZCBvbiB0aGUgY29udGV4dC5cbiAqL1xuXG5leHBvcnRzLl9pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdF8oY29udGV4dCwgb3B0aW9ucykge1xuICBjb250ZXh0ID0gSlNPTi5zdHJpbmdpZnkoY29udGV4dCwgbnVsbCwgMik7XG4gIHZhciBleHQgPSBvcHRpb25zICYmIG9wdGlvbnMuaGFzaCAmJiBvcHRpb25zLmhhc2guZXh0IHx8ICdodG1sJztcbiAgcmV0dXJuIHN3aXRjaE91dHB1dChleHQsIGNvbnRleHQpO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBvdXRwdXQgZm9yIHRoZSBgaW5zcGVjdGAgaGVscGVyIGJhc2VkIG9uIHRoZVxuICogZXh0ZW5zaW9uIHBhc3NlZC5cbiAqL1xuXG5mdW5jdGlvbiBzd2l0Y2hPdXRwdXQoZXh0LCByZXMpIHtcbiAgaWYgKGV4dFswXSA9PT0gJy4nKSBleHQgPSBleHQuc2xpY2UoMSk7XG4gIHN3aXRjaCAoZXh0KSB7XG4gICAgY2FzZSAnbWQnOlxuICAgICAgcmV0dXJuICcnXG4gICAgICAgICsgJ1xcbmBgYGpzb25cXG4nXG4gICAgICAgICsgcmVzXG4gICAgICAgICsgJ1xcbmBgYFxcbic7XG4gICAgY2FzZSAnaHRtbCc6XG4gICAgICByZXR1cm4gJydcbiAgICAgICAgKyAnPHByZT48Y29kZSBjbGFzcz1cImpzb25cIj5cXG4nXG4gICAgICAgICsgcmVzXG4gICAgICAgICsgJzwvY29kZT48L3ByZT4nO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCdcbiAgICB8fCB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nXG4gICAgfHwgdmFsLmhhc2ggIT0gbnVsbDtcbn1cbiIsIi8qIVxuICogbWFrZS1pdGVyYXRvciA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvbWFrZS1pdGVyYXRvcj5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgSm9uIFNjaGxpbmtlcnQsIGNvbnRyaWJ1dG9ycy5cbiAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxMyBtb3V0anMgdGVhbSBhbmQgY29udHJpYnV0b3JzIChodHRwOi8vbW91dGpzLmNvbSlcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGZvck93biA9IHJlcXVpcmUoJ2Zvci1vd24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtYWtlSXRlcmF0b3Ioc3JjLCB0aGlzQXJnKSB7XG4gIGlmIChzcmMgPT0gbnVsbCkge1xuICAgIHJldHVybiBub29wO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlb2Ygc3JjKSB7XG4gICAgLy8gZnVuY3Rpb24gaXMgdGhlIGZpcnN0IHRvIGltcHJvdmUgcGVyZiAobW9zdCBjb21tb24gY2FzZSlcbiAgICAvLyBhbHNvIGF2b2lkIHVzaW5nIGBGdW5jdGlvbiNjYWxsYCBpZiBub3QgbmVlZGVkLCB3aGljaCBib29zdHNcbiAgICAvLyBwZXJmIGEgbG90IGluIHNvbWUgY2FzZXNcbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICByZXR1cm4gKHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJykgPyBmdW5jdGlvbiAodmFsLCBpLCBhcnIpIHtcbiAgICAgICAgcmV0dXJuIHNyYy5jYWxsKHRoaXNBcmcsIHZhbCwgaSwgYXJyKTtcbiAgICAgIH0gOiBzcmM7XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiBkZWVwTWF0Y2hlcyh2YWwsIHNyYyk7XG4gICAgICB9O1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBwcm9wKHNyYyk7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gY29udGFpbnNNYXRjaChhcnJheSwgdmFsdWUpIHtcbiAgdmFyIGxlbiA9IGFycmF5Lmxlbmd0aDtcbiAgdmFyIGkgPSAtMTtcblxuICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgaWYgKGRlZXBNYXRjaGVzKGFycmF5W2ldLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1hdGNoQXJyYXkobywgdmFsdWUpIHtcbiAgdmFyIGxlbiA9IHZhbHVlLmxlbmd0aDtcbiAgdmFyIGkgPSAtMTtcblxuICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgaWYgKCFjb250YWluc01hdGNoKG8sIHZhbHVlW2ldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hPYmplY3QobywgdmFsdWUpIHtcbiAgdmFyIHJlcyA9IHRydWU7XG4gIGZvck93bih2YWx1ZSwgZnVuY3Rpb24gKHZhbCwga2V5KSB7XG4gICAgaWYgKCFkZWVwTWF0Y2hlcyhvW2tleV0sIHZhbCkpIHtcbiAgICAgIC8vIFJldHVybiBmYWxzZSB0byBicmVhayBvdXQgb2YgZm9yT3duIGVhcmx5XG4gICAgICByZXR1cm4gKHJlcyA9IGZhbHNlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0c1xuICovXG5cbmZ1bmN0aW9uIGRlZXBNYXRjaGVzKG8sIHZhbHVlKSB7XG4gIGlmIChvICYmIHR5cGVvZiBvID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8pICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbWF0Y2hBcnJheShvLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtYXRjaE9iamVjdChvLCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBvID09PSB2YWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9wKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiBvYmpbbmFtZV07XG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vb3AodmFsKSB7XG4gIHJldHVybiB2YWw7XG59IiwiLyohXG4gKiBtaWNyb21hdGNoIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9taWNyb21hdGNoPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBleHBhbmQgPSByZXF1aXJlKCcuL2xpYi9leHBhbmQnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vbGliL3V0aWxzJyk7XG5cbi8qKlxuICogVGhlIG1haW4gZnVuY3Rpb24uIFBhc3MgYW4gYXJyYXkgb2YgZmlsZXBhdGhzLFxuICogYW5kIGEgc3RyaW5nIG9yIGFycmF5IG9mIGdsb2IgcGF0dGVybnNcbiAqXG4gKiBAcGFyYW0gIHtBcnJheXxTdHJpbmd9IGBmaWxlc2BcbiAqIEBwYXJhbSAge0FycmF5fFN0cmluZ30gYHBhdHRlcm5zYFxuICogQHBhcmFtICB7T2JqZWN0fSBgb3B0c2BcbiAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBvZiBtYXRjaGVzXG4gKi9cblxuZnVuY3Rpb24gbWljcm9tYXRjaChmaWxlcywgcGF0dGVybnMsIG9wdHMpIHtcbiAgaWYgKCFmaWxlcyB8fCAhcGF0dGVybnMpIHJldHVybiBbXTtcbiAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgaWYgKHR5cGVvZiBvcHRzLmNhY2hlID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdHMuY2FjaGUgPSB0cnVlO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhdHRlcm5zKSkge1xuICAgIHJldHVybiBtYXRjaChmaWxlcywgcGF0dGVybnMsIG9wdHMpO1xuICB9XG5cbiAgdmFyIGxlbiA9IHBhdHRlcm5zLmxlbmd0aCwgaSA9IDA7XG4gIHZhciBvbWl0ID0gW10sIGtlZXAgPSBbXTtcblxuICB3aGlsZSAobGVuLS0pIHtcbiAgICB2YXIgZ2xvYiA9IHBhdHRlcm5zW2krK107XG4gICAgaWYgKHR5cGVvZiBnbG9iID09PSAnc3RyaW5nJyAmJiBnbG9iLmNoYXJDb2RlQXQoMCkgPT09IDMzIC8qICEgKi8pIHtcbiAgICAgIG9taXQucHVzaC5hcHBseShvbWl0LCBtYXRjaChmaWxlcywgZ2xvYi5zbGljZSgxKSwgb3B0cykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBrZWVwLnB1c2guYXBwbHkoa2VlcCwgbWF0Y2goZmlsZXMsIGdsb2IsIG9wdHMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHV0aWxzLmRpZmYoa2VlcCwgb21pdCk7XG59XG5cbi8qKlxuICogUmV0dXJuIGFuIGFycmF5IG9mIGZpbGVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIGdsb2IgcGF0dGVybi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBgbWljcm9tYXRjaGAgZnVuY3Rpb24gSWYgeW91IG9ubHlcbiAqIG5lZWQgdG8gcGFzcyBhIHNpbmdsZSBwYXR0ZXJuIHlvdSBtaWdodCBnZXQgdmVyeSBtaW5vciBzcGVlZCBpbXByb3ZlbWVudHNcbiAqIHVzaW5nIHRoaXMgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtICB7QXJyYXl9IGBmaWxlc2BcbiAqIEBwYXJhbSAge1N0cmluZ30gYHBhdHRlcm5gXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cblxuZnVuY3Rpb24gbWF0Y2goZmlsZXMsIHBhdHRlcm4sIG9wdHMpIHtcbiAgaWYgKHV0aWxzLnR5cGVPZihmaWxlcykgIT09ICdzdHJpbmcnICYmICFBcnJheS5pc0FycmF5KGZpbGVzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2coJ21hdGNoJywgJ2ZpbGVzJywgJ2Egc3RyaW5nIG9yIGFycmF5JykpO1xuICB9XG5cbiAgZmlsZXMgPSB1dGlscy5hcnJheWlmeShmaWxlcyk7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIHZhciBuZWdhdGUgPSBvcHRzLm5lZ2F0ZSB8fCBmYWxzZTtcbiAgdmFyIG9yaWcgPSBwYXR0ZXJuO1xuXG4gIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICBuZWdhdGUgPSBwYXR0ZXJuLmNoYXJBdCgwKSA9PT0gJyEnO1xuICAgIGlmIChuZWdhdGUpIHtcbiAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDEpO1xuICAgIH1cblxuICAgIC8vIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBjaGFyYWN0ZXIgcmVnYXJkbGVzcyxcbiAgICAvLyBzbyB0aGUgYWJvdmUgbG9naWMgaXMgc3RpbGwgbmVlZGVkXG4gICAgaWYgKG9wdHMubm9uZWdhdGUgPT09IHRydWUpIHtcbiAgICAgIG5lZ2F0ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfaXNNYXRjaCA9IG1hdGNoZXIocGF0dGVybiwgb3B0cyk7XG4gIHZhciBsZW4gPSBmaWxlcy5sZW5ndGgsIGkgPSAwO1xuICB2YXIgcmVzID0gW107XG5cbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICB2YXIgZmlsZSA9IGZpbGVzW2krK107XG4gICAgdmFyIGZwID0gdXRpbHMudW5peGlmeShmaWxlLCBvcHRzKTtcblxuICAgIGlmICghX2lzTWF0Y2goZnApKSB7IGNvbnRpbnVlOyB9XG4gICAgcmVzLnB1c2goZnApO1xuICB9XG5cbiAgaWYgKHJlcy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAob3B0cy5mYWlsZ2xvYiA9PT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaWNyb21hdGNoLm1hdGNoKCkgZm91bmQgbm8gbWF0Y2hlcyBmb3I6IFwiJyArIG9yaWcgKyAnXCIuJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMubm9udWxsIHx8IG9wdHMubnVsbGdsb2IpIHtcbiAgICAgIHJlcy5wdXNoKHV0aWxzLnVuZXNjYXBlR2xvYihvcmlnKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgYG5lZ2F0ZWAgd2FzIGRlZmluZWQsIGRpZmYgbmVnYXRlZCBmaWxlc1xuICBpZiAobmVnYXRlKSB7IHJlcyA9IHV0aWxzLmRpZmYoZmlsZXMsIHJlcyk7IH1cblxuICAvLyBpZiBgaWdub3JlYCB3YXMgZGVmaW5lZCwgZGlmZiBpZ25vcmVkIGZpbGVkXG4gIGlmIChvcHRzLmlnbm9yZSAmJiBvcHRzLmlnbm9yZS5sZW5ndGgpIHtcbiAgICBwYXR0ZXJuID0gb3B0cy5pZ25vcmU7XG4gICAgb3B0cyA9IHV0aWxzLm9taXQob3B0cywgWydpZ25vcmUnXSk7XG4gICAgcmVzID0gdXRpbHMuZGlmZihyZXMsIG1pY3JvbWF0Y2gocmVzLCBwYXR0ZXJuLCBvcHRzKSk7XG4gIH1cblxuICBpZiAob3B0cy5ub2R1cGVzKSB7XG4gICAgcmV0dXJuIHV0aWxzLnVuaXF1ZShyZXMpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBnbG9iIHBhdHRlcm4gb3IgYXJyYXkgb2YgZ2xvYiBwYXR0ZXJuc1xuICogdG8gYmUgdXNlZCB3aXRoIGBBcnJheSNmaWx0ZXIoKWAuIChJbnRlcm5hbGx5IHRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzXG4gKiB0aGUgbWF0Y2hpbmcgZnVuY3Rpb24gdXNpbmcgdGhlIFttYXRjaGVyXSBtZXRob2QpLlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgZm4gPSBtbS5maWx0ZXIoJ1thLWNdJyk7XG4gKiBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddLmZpbHRlcihmbik7XG4gKiAvLz0+IFsnYScsICdiJywgJ2MnXVxuICogYGBgXG4gKiBAcGFyYW0gIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgQ2FuIGJlIGEgZ2xvYiBvciBhcnJheSBvZiBnbG9icy5cbiAqIEBwYXJhbSAge09wdGlvbnN9IGBvcHRzYCBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIFttYXRjaGVyXSBtZXRob2QuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gRmlsdGVyIGZ1bmN0aW9uIHRvIGJlIHBhc3NlZCB0byBgQXJyYXkjZmlsdGVyKClgLlxuICovXG5cbmZ1bmN0aW9uIGZpbHRlcihwYXR0ZXJucywgb3B0cykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocGF0dGVybnMpICYmIHR5cGVvZiBwYXR0ZXJucyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG1zZygnZmlsdGVyJywgJ3BhdHRlcm5zJywgJ2Egc3RyaW5nIG9yIGFycmF5JykpO1xuICB9XG5cbiAgcGF0dGVybnMgPSB1dGlscy5hcnJheWlmeShwYXR0ZXJucyk7XG4gIHZhciBsZW4gPSBwYXR0ZXJucy5sZW5ndGgsIGkgPSAwO1xuICB2YXIgcGF0dGVybk1hdGNoZXJzID0gQXJyYXkobGVuKTtcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBwYXR0ZXJuTWF0Y2hlcnNbaV0gPSBtYXRjaGVyKHBhdHRlcm5zW2krK10sIG9wdHMpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGZwKSB7XG4gICAgaWYgKGZwID09IG51bGwpIHJldHVybiBbXTtcbiAgICB2YXIgbGVuID0gcGF0dGVybk1hdGNoZXJzLmxlbmd0aCwgaSA9IDA7XG4gICAgdmFyIHJlcyA9IHRydWU7XG5cbiAgICBmcCA9IHV0aWxzLnVuaXhpZnkoZnAsIG9wdHMpO1xuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICB2YXIgZm4gPSBwYXR0ZXJuTWF0Y2hlcnNbaSsrXTtcbiAgICAgIGlmICghZm4oZnApKSB7XG4gICAgICAgIHJlcyA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGVwYXRoIGNvbnRhaW5zIHRoZSBnaXZlblxuICogcGF0dGVybi4gQ2FuIGFsc28gcmV0dXJuIGEgZnVuY3Rpb24gZm9yIG1hdGNoaW5nLlxuICpcbiAqIGBgYGpzXG4gKiBpc01hdGNoKCdmb28ubWQnLCAnKi5tZCcsIHt9KTtcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIGlzTWF0Y2goJyoubWQnLCB7fSkoJ2Zvby5tZCcpXG4gKiAvLz0+IHRydWVcbiAqIGBgYFxuICogQHBhcmFtICB7U3RyaW5nfSBgZnBgXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBwYXR0ZXJuYFxuICogQHBhcmFtICB7T2JqZWN0fSBgb3B0c2BcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cblxuZnVuY3Rpb24gaXNNYXRjaChmcCwgcGF0dGVybiwgb3B0cykge1xuICBpZiAodHlwZW9mIGZwICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IobXNnKCdpc01hdGNoJywgJ2ZpbGVwYXRoJywgJ2Egc3RyaW5nJykpO1xuICB9XG5cbiAgZnAgPSB1dGlscy51bml4aWZ5KGZwLCBvcHRzKTtcbiAgaWYgKHV0aWxzLnR5cGVPZihwYXR0ZXJuKSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbWF0Y2hlcihmcCwgcGF0dGVybik7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXIocGF0dGVybiwgb3B0cykoZnApO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZXBhdGggbWF0Y2hlcyB0aGVcbiAqIGdpdmVuIHBhdHRlcm4uXG4gKi9cblxuZnVuY3Rpb24gY29udGFpbnMoZnAsIHBhdHRlcm4sIG9wdHMpIHtcbiAgaWYgKHR5cGVvZiBmcCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG1zZygnY29udGFpbnMnLCAncGF0dGVybicsICdhIHN0cmluZycpKTtcbiAgfVxuXG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICBvcHRzLmNvbnRhaW5zID0gKHBhdHRlcm4gIT09ICcnKTtcbiAgZnAgPSB1dGlscy51bml4aWZ5KGZwLCBvcHRzKTtcblxuICBpZiAob3B0cy5jb250YWlucyAmJiAhdXRpbHMuaXNHbG9iKHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIGZwLmluZGV4T2YocGF0dGVybikgIT09IC0xO1xuICB9XG4gIHJldHVybiBtYXRjaGVyKHBhdHRlcm4sIG9wdHMpKGZwKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBmaWxlIHBhdGggbWF0Y2hlcyBhbnkgb2YgdGhlXG4gKiBnaXZlbiBwYXR0ZXJucy5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBmcGAgVGhlIGZpbGVwYXRoIHRvIHRlc3QuXG4gKiBAcGFyYW0gIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgR2xvYiBwYXR0ZXJucyB0byB1c2UuXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBvcHRzYCBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGBtYXRjaGVyKClgIGZ1bmN0aW9uLlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGFueShmcCwgcGF0dGVybnMsIG9wdHMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhdHRlcm5zKSAmJiB0eXBlb2YgcGF0dGVybnMgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihtc2coJ2FueScsICdwYXR0ZXJucycsICdhIHN0cmluZyBvciBhcnJheScpKTtcbiAgfVxuXG4gIHBhdHRlcm5zID0gdXRpbHMuYXJyYXlpZnkocGF0dGVybnMpO1xuICB2YXIgbGVuID0gcGF0dGVybnMubGVuZ3RoO1xuXG4gIGZwID0gdXRpbHMudW5peGlmeShmcCwgb3B0cyk7XG4gIHdoaWxlIChsZW4tLSkge1xuICAgIHZhciBpc01hdGNoID0gbWF0Y2hlcihwYXR0ZXJuc1tsZW5dLCBvcHRzKTtcbiAgICBpZiAoaXNNYXRjaChmcCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogRmlsdGVyIHRoZSBrZXlzIG9mIGFuIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBgZ2xvYmAgcGF0dGVyblxuICogYW5kIGBvcHRpb25zYFxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gYG9iamVjdGBcbiAqIEBwYXJhbSAge1BhdHRlcm59IGBvYmplY3RgXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuXG5mdW5jdGlvbiBtYXRjaEtleXMob2JqLCBnbG9iLCBvcHRpb25zKSB7XG4gIGlmICh1dGlscy50eXBlT2Yob2JqKSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG1zZygnbWF0Y2hLZXlzJywgJ2ZpcnN0IGFyZ3VtZW50JywgJ2FuIG9iamVjdCcpKTtcbiAgfVxuXG4gIHZhciBmbiA9IG1hdGNoZXIoZ2xvYiwgb3B0aW9ucyk7XG4gIHZhciByZXMgPSB7fTtcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGZuKGtleSkpIHtcbiAgICAgIHJlc1trZXldID0gb2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgZnVuY3Rpb24gZm9yIG1hdGNoaW5nIGJhc2VkIG9uIHRoZVxuICogZ2l2ZW4gYHBhdHRlcm5gIGFuZCBgb3B0aW9uc2AuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBgcGF0dGVybmBcbiAqIEBwYXJhbSAge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuXG5mdW5jdGlvbiBtYXRjaGVyKHBhdHRlcm4sIG9wdHMpIHtcbiAgLy8gcGF0dGVybiBpcyBhIGZ1bmN0aW9uXG4gIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG4gIC8vIHBhdHRlcm4gaXMgYSByZWdleFxuICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiBmdW5jdGlvbihmcCkge1xuICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdChmcCk7XG4gICAgfTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG1zZygnbWF0Y2hlcicsICdwYXR0ZXJuJywgJ2Egc3RyaW5nLCByZWdleCwgb3IgZnVuY3Rpb24nKSk7XG4gIH1cblxuICAvLyBzdHJpbmdzLCBhbGwgdGhlIHdheSBkb3duLi4uXG4gIHBhdHRlcm4gPSB1dGlscy51bml4aWZ5KHBhdHRlcm4sIG9wdHMpO1xuXG4gIC8vIHBhdHRlcm4gaXMgYSBub24tZ2xvYiBzdHJpbmdcbiAgaWYgKCF1dGlscy5pc0dsb2IocGF0dGVybikpIHtcbiAgICByZXR1cm4gdXRpbHMubWF0Y2hQYXRoKHBhdHRlcm4sIG9wdHMpO1xuICB9XG4gIC8vIHBhdHRlcm4gaXMgYSBnbG9iIHN0cmluZ1xuICB2YXIgcmUgPSBtYWtlUmUocGF0dGVybiwgb3B0cyk7XG5cbiAgLy8gYG1hdGNoQmFzZWAgaXMgZGVmaW5lZFxuICBpZiAob3B0cyAmJiBvcHRzLm1hdGNoQmFzZSkge1xuICAgIHJldHVybiB1dGlscy5oYXNGaWxlbmFtZShyZSwgb3B0cyk7XG4gIH1cbiAgLy8gYG1hdGNoQmFzZWAgaXMgbm90IGRlZmluZWRcbiAgcmV0dXJuIGZ1bmN0aW9uKGZwKSB7XG4gICAgZnAgPSB1dGlscy51bml4aWZ5KGZwLCBvcHRzKTtcbiAgICByZXR1cm4gcmUudGVzdChmcCk7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuZCBjYWNoZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgbWF0Y2hpbmdcbiAqIGZpbGUgcGF0aHMuXG4gKlxuICogSWYgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIGluIHRoZSBgZ2xvYmAgaXMgYCFgLCBhIG5lZ2F0aW9uXG4gKiByZWdleCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBnbG9iYFxuICogQHBhcmFtICB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1JlZ0V4cH1cbiAqL1xuXG5mdW5jdGlvbiB0b1JlZ2V4KGdsb2IsIG9wdGlvbnMpIHtcbiAgLy8gY2xvbmUgb3B0aW9ucyB0byBwcmV2ZW50ICBtdXRhdGluZyB0aGUgb3JpZ2luYWwgb2JqZWN0XG4gIHZhciBvcHRzID0gT2JqZWN0LmNyZWF0ZShvcHRpb25zIHx8IHt9KTtcbiAgdmFyIGZsYWdzID0gb3B0cy5mbGFncyB8fCAnJztcbiAgaWYgKG9wdHMubm9jYXNlICYmIGZsYWdzLmluZGV4T2YoJ2knKSA9PT0gLTEpIHtcbiAgICBmbGFncyArPSAnaSc7XG4gIH1cblxuICB2YXIgcGFyc2VkID0gZXhwYW5kKGdsb2IsIG9wdHMpO1xuXG4gIC8vIHBhc3MgaW4gdG9rZW5zIHRvIGF2b2lkIHBhcnNpbmcgbW9yZSB0aGFuIG9uY2VcbiAgb3B0cy5uZWdhdGVkID0gb3B0cy5uZWdhdGVkIHx8IHBhcnNlZC5uZWdhdGVkO1xuICBvcHRzLm5lZ2F0ZSA9IG9wdHMubmVnYXRlZDtcbiAgZ2xvYiA9IHdyYXBHbG9iKHBhcnNlZC5wYXR0ZXJuLCBvcHRzKTtcbiAgdmFyIHJlO1xuXG4gIHRyeSB7XG4gICAgcmUgPSBuZXcgUmVnRXhwKGdsb2IsIGZsYWdzKTtcbiAgICByZXR1cm4gcmU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5yZWFzb24gPSAnbWljcm9tYXRjaCBpbnZhbGlkIHJlZ2V4OiAoJyArIHJlICsgJyknO1xuICAgIGlmIChvcHRzLnN0cmljdCkgdGhyb3cgbmV3IFN5bnRheEVycm9yKGVycik7XG4gIH1cblxuICAvLyB3ZSdyZSBvbmx5IGhlcmUgaWYgYSBiYWQgcGF0dGVybiB3YXMgdXNlZCBhbmQgdGhlIHVzZXJcbiAgLy8gcGFzc2VkIGBvcHRpb25zLnNpbGVudGAsIHNvIG1hdGNoIG5vdGhpbmdcbiAgcmV0dXJuIC8kXi87XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSByZWdleCB0byBkbyB0aGUgbWF0Y2hpbmcuIElmIHRoZSBsZWFkaW5nXG4gKiBjaGFyYWN0ZXIgaW4gdGhlIGBnbG9iYCBpcyBgIWAgYSBuZWdhdGlvbiByZWdleCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYGdsb2JgXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGBuZWdhdGVgXG4gKi9cblxuZnVuY3Rpb24gd3JhcEdsb2IoZ2xvYiwgb3B0cykge1xuICB2YXIgcHJlZml4ID0gKG9wdHMgJiYgIW9wdHMuY29udGFpbnMpID8gJ14nIDogJyc7XG4gIHZhciBhZnRlciA9IChvcHRzICYmICFvcHRzLmNvbnRhaW5zKSA/ICckJyA6ICcnO1xuICBnbG9iID0gKCcoPzonICsgZ2xvYiArICcpJyArIGFmdGVyKTtcbiAgaWYgKG9wdHMgJiYgb3B0cy5uZWdhdGUpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgKCcoPyFeJyArIGdsb2IgKyAnKS4qJCcpO1xuICB9XG4gIHJldHVybiBwcmVmaXggKyBnbG9iO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbmQgY2FjaGUgYSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIGZpbGUgcGF0aHMuXG4gKiBJZiB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgaW4gdGhlIGBnbG9iYCBpcyBgIWAsIGEgbmVnYXRpb25cbiAqIHJlZ2V4IGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYGdsb2JgXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7UmVnRXhwfVxuICovXG5cbmZ1bmN0aW9uIG1ha2VSZShnbG9iLCBvcHRzKSB7XG4gIGlmICh1dGlscy50eXBlT2YoZ2xvYikgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZygnbWFrZVJlJywgJ2dsb2InLCAnYSBzdHJpbmcnKSk7XG4gIH1cbiAgcmV0dXJuIHV0aWxzLmNhY2hlKHRvUmVnZXgsIGdsb2IsIG9wdHMpO1xufVxuXG4vKipcbiAqIE1ha2UgZXJyb3IgbWVzc2FnZXMgY29uc2lzdGVudC4gRm9sbG93cyB0aGlzIGZvcm1hdDpcbiAqXG4gKiBgYGBqc1xuICogbXNnKG1ldGhvZE5hbWUsIGFyZ051bWJlciwgbmF0aXZlVHlwZSk7XG4gKiAvLyBleGFtcGxlOlxuICogbXNnKCdtYXRjaEtleXMnLCAnZmlyc3QnLCAnYW4gb2JqZWN0Jyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBtZXRob2RgXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBudW1gXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGB0eXBlYFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIG1zZyhtZXRob2QsIHdoYXQsIHR5cGUpIHtcbiAgcmV0dXJuICdtaWNyb21hdGNoLicgKyBtZXRob2QgKyAnKCk6ICcgKyB3aGF0ICsgJyBzaG91bGQgYmUgJyArIHR5cGUgKyAnLic7XG59XG5cbi8qKlxuICogUHVibGljIG1ldGhvZHNcbiAqL1xuXG4vKiBlc2xpbnQgbm8tbXVsdGktc3BhY2VzOiAwICovXG5taWNyb21hdGNoLmFueSAgICAgICA9IGFueTtcbm1pY3JvbWF0Y2guYnJhY2VzICAgID0gbWljcm9tYXRjaC5icmFjZUV4cGFuZCA9IHV0aWxzLmJyYWNlcztcbm1pY3JvbWF0Y2guY29udGFpbnMgID0gY29udGFpbnM7XG5taWNyb21hdGNoLmV4cGFuZCAgICA9IGV4cGFuZDtcbm1pY3JvbWF0Y2guZmlsdGVyICAgID0gZmlsdGVyO1xubWljcm9tYXRjaC5pc01hdGNoICAgPSBpc01hdGNoO1xubWljcm9tYXRjaC5tYWtlUmUgICAgPSBtYWtlUmU7XG5taWNyb21hdGNoLm1hdGNoICAgICA9IG1hdGNoO1xubWljcm9tYXRjaC5tYXRjaGVyICAgPSBtYXRjaGVyO1xubWljcm9tYXRjaC5tYXRjaEtleXMgPSBtYXRjaEtleXM7XG5cbi8qKlxuICogRXhwb3NlIGBtaWNyb21hdGNoYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gbWljcm9tYXRjaDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNoYXJzID0ge30sIHVuZXNjLCB0ZW1wO1xuXG5mdW5jdGlvbiByZXZlcnNlKG9iamVjdCwgcHJlcGVuZGVyKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpLnJlZHVjZShmdW5jdGlvbihyZXZlcnNlZCwga2V5KSB7XG4gICAgdmFyIG5ld0tleSA9IHByZXBlbmRlciA/IHByZXBlbmRlciArIGtleSA6IGtleTsgLy8gT3B0aW9uYWxseSBwcmVwZW5kIGEgc3RyaW5nIHRvIGtleS5cbiAgICByZXZlcnNlZFtvYmplY3Rba2V5XV0gPSBuZXdLZXk7IC8vIFN3YXAga2V5IGFuZCB2YWx1ZS5cbiAgICByZXR1cm4gcmV2ZXJzZWQ7IC8vIFJldHVybiB0aGUgcmVzdWx0LlxuICB9LCB7fSk7XG59XG5cbi8qKlxuICogUmVnZXggZm9yIGNvbW1vbiBjaGFyYWN0ZXJzXG4gKi9cblxuY2hhcnMuZXNjYXBlUmVnZXggPSB7XG4gICc/JzogL1xcPy9nLFxuICAnQCc6IC9cXEAvZyxcbiAgJyEnOiAvXFwhL2csXG4gICcrJzogL1xcKy9nLFxuICAnKic6IC9cXCovZyxcbiAgJygnOiAvXFwoL2csXG4gICcpJzogL1xcKS9nLFxuICAnWyc6IC9cXFsvZyxcbiAgJ10nOiAvXFxdL2dcbn07XG5cbi8qKlxuICogRXNjYXBlIGNoYXJhY3RlcnNcbiAqL1xuXG5jaGFycy5FU0MgPSB7XG4gICc/JzogJ19fVU5FU0NfUU1SS19fJyxcbiAgJ0AnOiAnX19VTkVTQ19BTVBFX18nLFxuICAnISc6ICdfX1VORVNDX0VYQ0xfXycsXG4gICcrJzogJ19fVU5FU0NfUExVU19fJyxcbiAgJyonOiAnX19VTkVTQ19TVEFSX18nLFxuICAnLCc6ICdfX1VORVNDX0NPTU1BX18nLFxuICAnKCc6ICdfX1VORVNDX0xUUEFSRU5fXycsXG4gICcpJzogJ19fVU5FU0NfUlRQQVJFTl9fJyxcbiAgJ1snOiAnX19VTkVTQ19MVEJSQUNLX18nLFxuICAnXSc6ICdfX1VORVNDX1JUQlJBQ0tfXydcbn07XG5cbi8qKlxuICogVW5lc2NhcGUgY2hhcmFjdGVyc1xuICovXG5cbmNoYXJzLlVORVNDID0gdW5lc2MgfHwgKHVuZXNjID0gcmV2ZXJzZShjaGFycy5FU0MsICdcXFxcJykpO1xuXG5jaGFycy5FU0NfVEVNUCA9IHtcbiAgJz8nOiAnX19URU1QX1FNUktfXycsXG4gICdAJzogJ19fVEVNUF9BTVBFX18nLFxuICAnISc6ICdfX1RFTVBfRVhDTF9fJyxcbiAgJyonOiAnX19URU1QX1NUQVJfXycsXG4gICcrJzogJ19fVEVNUF9QTFVTX18nLFxuICAnLCc6ICdfX1RFTVBfQ09NTUFfXycsXG4gICcoJzogJ19fVEVNUF9MVFBBUkVOX18nLFxuICAnKSc6ICdfX1RFTVBfUlRQQVJFTl9fJyxcbiAgJ1snOiAnX19URU1QX0xUQlJBQ0tfXycsXG4gICddJzogJ19fVEVNUF9SVEJSQUNLX18nXG59O1xuXG5jaGFycy5URU1QID0gdGVtcCB8fCAodGVtcCA9IHJldmVyc2UoY2hhcnMuRVNDX1RFTVApKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjaGFycztcbiIsIi8qIVxuICogbWljcm9tYXRjaCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvbWljcm9tYXRjaD5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgR2xvYiA9IHJlcXVpcmUoJy4vZ2xvYicpO1xuXG4vKipcbiAqIEV4cG9zZSBgZXhwYW5kYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZXhwYW5kO1xuXG4vKipcbiAqIEV4cGFuZCBhIGdsb2IgcGF0dGVybiB0byByZXNvbHZlIGJyYWNlcyBhbmRcbiAqIHNpbWlsYXIgcGF0dGVybnMgYmVmb3JlIGNvbnZlcnRpbmcgdG8gcmVnZXguXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfEFycmF5fSBgcGF0dGVybmBcbiAqIEBwYXJhbSAge0FycmF5fSBgZmlsZXNgXG4gKiBAcGFyYW0gIHtPcHRpb25zfSBgb3B0c2BcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5cbmZ1bmN0aW9uIGV4cGFuZChwYXR0ZXJuLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtaWNyb21hdGNoLmV4cGFuZCgpOiBhcmd1bWVudCBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XG4gIH1cblxuICB2YXIgZ2xvYiA9IG5ldyBHbG9iKHBhdHRlcm4sIG9wdGlvbnMgfHwge30pO1xuICB2YXIgb3B0cyA9IGdsb2Iub3B0aW9ucztcblxuICBpZiAoIXV0aWxzLmlzR2xvYihwYXR0ZXJuKSkge1xuICAgIGdsb2IucGF0dGVybiA9IGdsb2IucGF0dGVybi5yZXBsYWNlKC8oW1xcLy5dKS9nLCAnXFxcXCQxJyk7XG4gICAgcmV0dXJuIGdsb2I7XG4gIH1cblxuICBnbG9iLnBhdHRlcm4gPSBnbG9iLnBhdHRlcm4ucmVwbGFjZSgvKFxcKykoPyFcXCgpL2csICdcXFxcJDEnKTtcbiAgZ2xvYi5wYXR0ZXJuID0gZ2xvYi5wYXR0ZXJuLnNwbGl0KCckJykuam9pbignXFxcXCQnKTtcblxuICBpZiAodHlwZW9mIG9wdHMuYnJhY2VzICE9PSAnYm9vbGVhbicgJiYgdHlwZW9mIG9wdHMubm9icmFjZXMgIT09ICdib29sZWFuJykge1xuICAgIG9wdHMuYnJhY2VzID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChnbG9iLnBhdHRlcm4gPT09ICcuKicpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0dGVybjogJ1xcXFwuJyArIHN0YXIsXG4gICAgICB0b2tlbnM6IHRvayxcbiAgICAgIG9wdGlvbnM6IG9wdHNcbiAgICB9O1xuICB9XG5cbiAgaWYgKGdsb2IucGF0dGVybiA9PT0gJyonKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdHRlcm46IG9uZVN0YXIob3B0cy5kb3QpLFxuICAgICAgdG9rZW5zOiB0b2ssXG4gICAgICBvcHRpb25zOiBvcHRzXG4gICAgfTtcbiAgfVxuXG4gIC8vIHBhcnNlIHRoZSBnbG9iIHBhdHRlcm4gaW50byB0b2tlbnNcbiAgZ2xvYi5wYXJzZSgpO1xuICB2YXIgdG9rID0gZ2xvYi50b2tlbnM7XG4gIHRvay5pcy5uZWdhdGVkID0gb3B0cy5uZWdhdGVkO1xuXG4gIC8vIGRvdGZpbGUgaGFuZGxpbmdcbiAgaWYgKChvcHRzLmRvdGZpbGVzID09PSB0cnVlIHx8IHRvay5pcy5kb3RmaWxlKSAmJiBvcHRzLmRvdCAhPT0gZmFsc2UpIHtcbiAgICBvcHRzLmRvdGZpbGVzID0gdHJ1ZTtcbiAgICBvcHRzLmRvdCA9IHRydWU7XG4gIH1cblxuICBpZiAoKG9wdHMuZG90ZGlycyA9PT0gdHJ1ZSB8fCB0b2suaXMuZG90ZGlyKSAmJiBvcHRzLmRvdCAhPT0gZmFsc2UpIHtcbiAgICBvcHRzLmRvdGRpcnMgPSB0cnVlO1xuICAgIG9wdHMuZG90ID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIGNoZWNrIGZvciBicmFjZXMgd2l0aCBhIGRvdGZpbGUgcGF0dGVyblxuICBpZiAoL1t7LF1cXC4vLnRlc3QoZ2xvYi5wYXR0ZXJuKSkge1xuICAgIG9wdHMubWFrZVJlID0gZmFsc2U7XG4gICAgb3B0cy5kb3QgPSB0cnVlO1xuICB9XG5cbiAgaWYgKG9wdHMubm9uZWdhdGUgIT09IHRydWUpIHtcbiAgICBvcHRzLm5lZ2F0ZWQgPSBnbG9iLm5lZ2F0ZWQ7XG4gIH1cblxuICAvLyBpZiB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgaXMgYSBkb3Qgb3IgYSBzbGFzaCwgZXNjYXBlIGl0XG4gIGlmIChnbG9iLnBhdHRlcm4uY2hhckF0KDApID09PSAnLicgJiYgZ2xvYi5wYXR0ZXJuLmNoYXJBdCgxKSAhPT0gJy8nKSB7XG4gICAgZ2xvYi5wYXR0ZXJuID0gJ1xcXFwnICsgZ2xvYi5wYXR0ZXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dGVuZGVkIGdsb2JzXG4gICAqL1xuXG4gIC8vIGV4cGFuZCBicmFjZXMsIGUuZyBgezEuLjV9YFxuICBnbG9iLnRyYWNrKCdiZWZvcmUgYnJhY2VzJyk7XG4gIGlmICh0b2suaXMuYnJhY2VzKSB7XG4gICAgZ2xvYi5icmFjZXMoKTtcbiAgfVxuICBnbG9iLnRyYWNrKCdhZnRlciBicmFjZXMnKTtcblxuICAvLyBleHBhbmQgZXh0Z2xvYnMsIGUuZyBgZm9vLyEoYXxiKWBcbiAgZ2xvYi50cmFjaygnYmVmb3JlIGV4dGdsb2InKTtcbiAgaWYgKHRvay5pcy5leHRnbG9iKSB7XG4gICAgZ2xvYi5leHRnbG9iKCk7XG4gIH1cbiAgZ2xvYi50cmFjaygnYWZ0ZXIgZXh0Z2xvYicpO1xuXG4gIC8vIGV4cGFuZCBicmFja2V0cywgZS5nIGBbWzphbHBoYTpdXWBcbiAgZ2xvYi50cmFjaygnYmVmb3JlIGJyYWNrZXRzJyk7XG4gIGlmICh0b2suaXMuYnJhY2tldHMpIHtcbiAgICBnbG9iLmJyYWNrZXRzKCk7XG4gIH1cbiAgZ2xvYi50cmFjaygnYWZ0ZXIgYnJhY2tldHMnKTtcblxuICAvLyBzcGVjaWFsIHBhdHRlcm5zXG4gIGdsb2IuX3JlcGxhY2UoJ1shJywgJ1teJyk7XG4gIGdsb2IuX3JlcGxhY2UoJyg/JywgJyglficpO1xuICBnbG9iLl9yZXBsYWNlKC9cXFtcXF0vLCAnXFxcXFtcXFxcXScpO1xuICBnbG9iLl9yZXBsYWNlKCcvWycsICcvJyArIChvcHRzLmRvdCA/IGRvdGZpbGVzIDogbm9kb3QpICsgJ1snLCB0cnVlKTtcbiAgZ2xvYi5fcmVwbGFjZSgnLz8nLCAnLycgKyAob3B0cy5kb3QgPyBkb3RmaWxlcyA6IG5vZG90KSArICdbXi9dJywgdHJ1ZSk7XG4gIGdsb2IuX3JlcGxhY2UoJy8uJywgJy8oPz0uKVxcXFwuJywgdHJ1ZSk7XG5cbiAgLy8gd2luZG93cyBkcml2ZXNcbiAgZ2xvYi5fcmVwbGFjZSgvXihcXHcpOihbXFxcXFxcL10rPykvZ2ksICcoPz0uKSQxOiQyJywgdHJ1ZSk7XG5cbiAgLy8gbmVnYXRlIHNsYXNoZXMgaW4gZXhjbHVzaW9uIHJhbmdlc1xuICBpZiAoZ2xvYi5wYXR0ZXJuLmluZGV4T2YoJ1teJykgIT09IC0xKSB7XG4gICAgZ2xvYi5wYXR0ZXJuID0gbmVnYXRlU2xhc2goZ2xvYi5wYXR0ZXJuKTtcbiAgfVxuXG4gIGlmIChvcHRzLmdsb2JzdGFyICE9PSBmYWxzZSAmJiBnbG9iLnBhdHRlcm4gPT09ICcqKicpIHtcbiAgICBnbG9iLnBhdHRlcm4gPSBnbG9ic3RhcihvcHRzLmRvdCk7XG5cbiAgfSBlbHNlIHtcbiAgICAvLyAnLyovKi8qJyA9PiAnKD86LyopezN9J1xuICAgIGdsb2IuX3JlcGxhY2UoLyhcXC9cXCopKy9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgICAgdmFyIGxlbiA9IG1hdGNoLmxlbmd0aCAvIDI7XG4gICAgICBpZiAobGVuID09PSAxKSB7IHJldHVybiBtYXRjaDsgfVxuICAgICAgcmV0dXJuICcoPzpcXFxcLyopeycgKyBsZW4gKyAnfSc7XG4gICAgfSk7XG5cbiAgICBnbG9iLnBhdHRlcm4gPSBiYWxhbmNlKGdsb2IucGF0dGVybiwgJ1snLCAnXScpO1xuICAgIGdsb2IuZXNjYXBlKGdsb2IucGF0dGVybik7XG5cbiAgICAvLyBpZiB0aGUgcGF0dGVybiBoYXMgYCoqYFxuICAgIGlmICh0b2suaXMuZ2xvYnN0YXIpIHtcbiAgICAgIGdsb2IucGF0dGVybiA9IGNvbGxhcHNlKGdsb2IucGF0dGVybiwgJy8qKicpO1xuICAgICAgZ2xvYi5wYXR0ZXJuID0gY29sbGFwc2UoZ2xvYi5wYXR0ZXJuLCAnKiovJyk7XG4gICAgICBnbG9iLl9yZXBsYWNlKCcvKiovJywgJyg/Oi8nICsgZ2xvYnN0YXIob3B0cy5kb3QpICsgJy98LyknLCB0cnVlKTtcbiAgICAgIGdsb2IuX3JlcGxhY2UoL1xcKnsyLH0vZywgJyoqJyk7XG5cbiAgICAgIC8vICdmb28vKidcbiAgICAgIGdsb2IuX3JlcGxhY2UoLyhcXHcrKVxcKig/IVxcLykvZywgJyQxW14vXSo/JywgdHJ1ZSk7XG4gICAgICBnbG9iLl9yZXBsYWNlKC9cXCpcXCpcXC9cXCooXFx3KS9nLCBnbG9ic3RhcihvcHRzLmRvdCkgKyAnXFxcXC8nICsgKG9wdHMuZG90ID8gZG90ZmlsZXMgOiBub2RvdCkgKyAnW14vXSo/JDEnLCB0cnVlKTtcblxuICAgICAgaWYgKG9wdHMuZG90ICE9PSB0cnVlKSB7XG4gICAgICAgIGdsb2IuX3JlcGxhY2UoL1xcKlxcKlxcLyguKS9nLCAnKD86KipcXFxcL3wpJDEnKTtcbiAgICAgIH1cblxuICAgICAgLy8gJ2Zvby8qKicgb3IgJ3sqKiwqfScsIGJ1dCBub3QgJ2ZvbyoqJ1xuICAgICAgaWYgKHRvay5wYXRoLmRpcm5hbWUgIT09ICcnIHx8IC8sXFwqXFwqfFxcKlxcKiwvLnRlc3QoZ2xvYi5vcmlnKSkge1xuICAgICAgICBnbG9iLl9yZXBsYWNlKCcqKicsIGdsb2JzdGFyKG9wdHMuZG90KSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW5kcyB3aXRoIC8qXG4gICAgZ2xvYi5fcmVwbGFjZSgvXFwvXFwqJC8sICdcXFxcLycgKyBvbmVTdGFyKG9wdHMuZG90KSwgdHJ1ZSk7XG4gICAgLy8gZW5kcyB3aXRoICosIG5vIHNsYXNoZXNcbiAgICBnbG9iLl9yZXBsYWNlKC8oPyFcXC8pXFwqJC8sIHN0YXIsIHRydWUpO1xuICAgIC8vIGhhcyAnbiouJyAocGFydGlhbCB3aWxkY2FyZCB3LyBmaWxlIGV4dGVuc2lvbilcbiAgICBnbG9iLl9yZXBsYWNlKC8oW15cXC9dKylcXCovLCAnJDEnICsgb25lU3Rhcih0cnVlKSwgdHJ1ZSk7XG4gICAgLy8gaGFzICcqJ1xuICAgIGdsb2IuX3JlcGxhY2UoJyonLCBvbmVTdGFyKG9wdHMuZG90KSwgdHJ1ZSk7XG4gICAgZ2xvYi5fcmVwbGFjZSgnPy4nLCAnP1xcXFwuJywgdHJ1ZSk7XG4gICAgZ2xvYi5fcmVwbGFjZSgnPzonLCAnPzonLCB0cnVlKTtcblxuICAgIGdsb2IuX3JlcGxhY2UoL1xcPysvZywgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICAgIHZhciBsZW4gPSBtYXRjaC5sZW5ndGg7XG4gICAgICBpZiAobGVuID09PSAxKSB7XG4gICAgICAgIHJldHVybiBxbWFyaztcbiAgICAgIH1cbiAgICAgIHJldHVybiBxbWFyayArICd7JyArIGxlbiArICd9JztcbiAgICB9KTtcblxuICAgIC8vIGVzY2FwZSAnLmFiYycgPT4gJ1xcXFwuYWJjJ1xuICAgIGdsb2IuX3JlcGxhY2UoL1xcLihbKlxcd10rKS9nLCAnXFxcXC4kMScpO1xuICAgIC8vIGZpeCAnW15cXFxcXFxcXC9dJ1xuICAgIGdsb2IuX3JlcGxhY2UoL1xcW1xcXltcXFxcXFwvXStcXF0vZywgcW1hcmspO1xuICAgIC8vICcvLy8nID0+ICdcXC8nXG4gICAgZ2xvYi5fcmVwbGFjZSgvXFwvKy9nLCAnXFxcXC8nKTtcbiAgICAvLyAnXFxcXFxcXFxcXFxcJyA9PiAnXFxcXCdcbiAgICBnbG9iLl9yZXBsYWNlKC9cXFxcezIsfS9nLCAnXFxcXCcpO1xuICB9XG5cbiAgLy8gdW5lc2NhcGUgcHJldmlvdXNseSBlc2NhcGVkIHBhdHRlcm5zXG4gIGdsb2IudW5lc2NhcGUoZ2xvYi5wYXR0ZXJuKTtcbiAgZ2xvYi5fcmVwbGFjZSgnX19VTkVTQ19TVEFSX18nLCAnKicpO1xuXG4gIC8vIGVzY2FwZSBkb3RzIHRoYXQgZm9sbG93IHFtYXJrc1xuICBnbG9iLl9yZXBsYWNlKCc/LicsICc/XFxcXC4nKTtcblxuICAvLyByZW1vdmUgdW5uZWNlc3Nhcnkgc2xhc2hlcyBpbiBjaGFyYWN0ZXIgY2xhc3Nlc1xuICBnbG9iLl9yZXBsYWNlKCdbXlxcXFwvXScsIHFtYXJrKTtcblxuICBpZiAoZ2xvYi5wYXR0ZXJuLmxlbmd0aCA+IDEpIHtcbiAgICBpZiAoL15bXFxbPypdLy50ZXN0KGdsb2IucGF0dGVybikpIHtcbiAgICAgIC8vIG9ubHkgcHJlcGVuZCB0aGUgc3RyaW5nIGlmIHdlIGRvbid0IHdhbnQgdG8gbWF0Y2ggZG90ZmlsZXNcbiAgICAgIGdsb2IucGF0dGVybiA9IChvcHRzLmRvdCA/IGRvdGZpbGVzIDogbm9kb3QpICsgZ2xvYi5wYXR0ZXJuO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnbG9iO1xufVxuXG4vKipcbiAqIENvbGxhcHNlIHJlcGVhdGVkIGNoYXJhY3RlciBzZXF1ZW5jZXMuXG4gKlxuICogYGBganNcbiAqIGNvbGxhcHNlKCdhLy4uLy4uLy4uL2InLCAnLi4vJyk7XG4gKiAvLz0+ICdhLy4uL2InXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdHJgXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBjaGAgQ2hhcmFjdGVyIHNlcXVlbmNlIHRvIGNvbGxhcHNlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gY29sbGFwc2Uoc3RyLCBjaCkge1xuICB2YXIgcmVzID0gc3RyLnNwbGl0KGNoKTtcbiAgdmFyIGlzRmlyc3QgPSByZXNbMF0gPT09ICcnO1xuICB2YXIgaXNMYXN0ID0gcmVzW3Jlcy5sZW5ndGggLSAxXSA9PT0gJyc7XG4gIHJlcyA9IHJlcy5maWx0ZXIoQm9vbGVhbik7XG4gIGlmIChpc0ZpcnN0KSByZXMudW5zaGlmdCgnJyk7XG4gIGlmIChpc0xhc3QpIHJlcy5wdXNoKCcnKTtcbiAgcmV0dXJuIHJlcy5qb2luKGNoKTtcbn1cblxuLyoqXG4gKiBOZWdhdGUgc2xhc2hlcyBpbiBleGNsdXNpb24gcmFuZ2VzLCBwZXIgZ2xvYiBzcGVjOlxuICpcbiAqIGBgYGpzXG4gKiBuZWdhdGVTbGFzaCgnW15mb29dJyk7XG4gKiAvLz0+ICdbXlxcXFwvZm9vXSdcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmAgZ2xvYiBwYXR0ZXJuXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gbmVnYXRlU2xhc2goc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxbXFxeKFteXFxdXSo/KVxcXS9nLCBmdW5jdGlvbihtYXRjaCwgaW5uZXIpIHtcbiAgICBpZiAoaW5uZXIuaW5kZXhPZignLycpID09PSAtMSkge1xuICAgICAgaW5uZXIgPSAnXFxcXC8nICsgaW5uZXI7XG4gICAgfVxuICAgIHJldHVybiAnW14nICsgaW5uZXIgKyAnXSc7XG4gIH0pO1xufVxuXG4vKipcbiAqIEVzY2FwZSBpbWJhbGFuY2VkIGJyYWNlcy9icmFja2V0LiBUaGlzIGlzIGEgdmVyeVxuICogYmFzaWMsIG5haXZlIGltcGxlbWVudGF0aW9uIHRoYXQgb25seSBkb2VzIGVub3VnaFxuICogdG8gc2VydmUgdGhlIHB1cnBvc2UuXG4gKi9cblxuZnVuY3Rpb24gYmFsYW5jZShzdHIsIGEsIGIpIHtcbiAgdmFyIGFhcnIgPSBzdHIuc3BsaXQoYSk7XG4gIHZhciBhbGVuID0gYWFyci5qb2luKCcnKS5sZW5ndGg7XG4gIHZhciBibGVuID0gc3RyLnNwbGl0KGIpLmpvaW4oJycpLmxlbmd0aDtcblxuICBpZiAoYWxlbiAhPT0gYmxlbikge1xuICAgIHN0ciA9IGFhcnIuam9pbignXFxcXCcgKyBhKTtcbiAgICByZXR1cm4gc3RyLnNwbGl0KGIpLmpvaW4oJ1xcXFwnICsgYik7XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG4gKiBTcGVjaWFsIHBhdHRlcm5zIHRvIGJlIGNvbnZlcnRlZCB0byByZWdleC5cbiAqIEhldXJpc3RpY3MgYXJlIHVzZWQgdG8gc2ltcGxpZnkgcGF0dGVybnNcbiAqIGFuZCBzcGVlZCB1cCBwcm9jZXNzaW5nLlxuICovXG5cbi8qIGVzbGludCBuby1tdWx0aS1zcGFjZXM6IDAgKi9cbnZhciBxbWFyayAgICAgICA9ICdbXi9dJztcbnZhciBzdGFyICAgICAgICA9IHFtYXJrICsgJyo/JztcbnZhciBub2RvdCAgICAgICA9ICcoPyFcXFxcLikoPz0uKSc7XG52YXIgZG90ZmlsZUdsb2IgPSAnKD86XFxcXC98XilcXFxcLnsxLDJ9KCR8XFxcXC8pJztcbnZhciBkb3RmaWxlcyAgICA9ICcoPyEnICsgZG90ZmlsZUdsb2IgKyAnKSg/PS4pJztcbnZhciB0d29TdGFyRG90ICA9ICcoPzooPyEnICsgZG90ZmlsZUdsb2IgKyAnKS4pKj8nO1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlZ2V4IGZvciBgKmAuXG4gKlxuICogSWYgYGRvdGAgaXMgdHJ1ZSwgb3IgdGhlIHBhdHRlcm4gZG9lcyBub3QgYmVnaW4gd2l0aFxuICogYSBsZWFkaW5nIHN0YXIsIHRoZW4gcmV0dXJuIHRoZSBzaW1wbGVyIHJlZ2V4LlxuICovXG5cbmZ1bmN0aW9uIG9uZVN0YXIoZG90ZmlsZSkge1xuICByZXR1cm4gZG90ZmlsZSA/ICcoPyEnICsgZG90ZmlsZUdsb2IgKyAnKSg/PS4pJyArIHN0YXIgOiAobm9kb3QgKyBzdGFyKTtcbn1cblxuZnVuY3Rpb24gZ2xvYnN0YXIoZG90ZmlsZSkge1xuICBpZiAoZG90ZmlsZSkgeyByZXR1cm4gdHdvU3RhckRvdDsgfVxuICByZXR1cm4gJyg/Oig/ISg/OlxcXFwvfF4pXFxcXC4pLikqPyc7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjaGFycyA9IHJlcXVpcmUoJy4vY2hhcnMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuLyoqXG4gKiBFeHBvc2UgYEdsb2JgXG4gKi9cblxudmFyIEdsb2IgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIEdsb2IocGF0dGVybiwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgR2xvYikpIHtcbiAgICByZXR1cm4gbmV3IEdsb2IocGF0dGVybiwgb3B0aW9ucyk7XG4gIH1cbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgdGhpcy5oaXN0b3J5ID0gW107XG4gIHRoaXMudG9rZW5zID0ge307XG4gIHRoaXMuaW5pdChwYXR0ZXJuKTtcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBkZWZhdWx0c1xuICovXG5cbkdsb2IucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gIHRoaXMub3JpZyA9IHBhdHRlcm47XG4gIHRoaXMubmVnYXRlZCA9IHRoaXMuaXNOZWdhdGVkKCk7XG4gIHRoaXMub3B0aW9ucy50cmFjayA9IHRoaXMub3B0aW9ucy50cmFjayB8fCBmYWxzZTtcbiAgdGhpcy5vcHRpb25zLm1ha2VSZSA9IHRydWU7XG59O1xuXG4vKipcbiAqIFB1c2ggYSBjaGFuZ2UgaW50byBgZ2xvYi5oaXN0b3J5YC4gVXNlZnVsXG4gKiBmb3IgZGVidWdnaW5nLlxuICovXG5cbkdsb2IucHJvdG90eXBlLnRyYWNrID0gZnVuY3Rpb24obXNnKSB7XG4gIGlmICh0aGlzLm9wdGlvbnMudHJhY2spIHtcbiAgICB0aGlzLmhpc3RvcnkucHVzaCh7bXNnOiBtc2csIHBhdHRlcm46IHRoaXMucGF0dGVybn0pO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIGBnbG9iLnBhdHRlcm5gIHdhcyBuZWdhdGVkXG4gKiB3aXRoIGAhYCwgYWxzbyByZW1vdmUgdGhlIGAhYCBmcm9tIHRoZSBwYXR0ZXJuLlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cblxuR2xvYi5wcm90b3R5cGUuaXNOZWdhdGVkID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnBhdHRlcm4uY2hhckNvZGVBdCgwKSA9PT0gMzMgLyogJyEnICovKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gdGhpcy5wYXR0ZXJuLnNsaWNlKDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogRXhwYW5kIGJyYWNlcyBpbiB0aGUgZ2l2ZW4gZ2xvYiBwYXR0ZXJuLlxuICpcbiAqIFdlIG9ubHkgbmVlZCB0byB1c2UgdGhlIFticmFjZXNdIGxpYiB3aGVuXG4gKiBwYXR0ZXJucyBhcmUgbmVzdGVkLlxuICovXG5cbkdsb2IucHJvdG90eXBlLmJyYWNlcyA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5vcHRpb25zLm5vYnJhY2VzICE9PSB0cnVlICYmIHRoaXMub3B0aW9ucy5ub2JyYWNlICE9PSB0cnVlKSB7XG4gICAgLy8gbmFpdmUvZmFzdCBjaGVjayBmb3IgaW1iYWxhbmNlZCBjaGFyYWN0ZXJzXG4gICAgdmFyIGEgPSB0aGlzLnBhdHRlcm4ubWF0Y2goL1tcXHtcXChcXFtdL2cpO1xuICAgIHZhciBiID0gdGhpcy5wYXR0ZXJuLm1hdGNoKC9bXFx9XFwpXFxdXS9nKTtcblxuICAgIC8vIGlmIGltYmFsYW5jZWQsIGRvbid0IG9wdGltaXplIHRoZSBwYXR0ZXJuXG4gICAgaWYgKGEgJiYgYiAmJiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSkge1xuICAgICAgdGhpcy5vcHRpb25zLm1ha2VSZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGV4cGFuZCBicmFjZSBwYXR0ZXJucyBhbmQgam9pbiB0aGUgcmVzdWx0aW5nIGFycmF5XG4gICAgdmFyIGV4cGFuZGVkID0gdXRpbHMuYnJhY2VzKHRoaXMucGF0dGVybiwgdGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLnBhdHRlcm4gPSBleHBhbmRlZC5qb2luKCd8Jyk7XG4gIH1cbn07XG5cbi8qKlxuICogRXhwYW5kIGJyYWNrZXQgZXhwcmVzc2lvbnMgaW4gYGdsb2IucGF0dGVybmBcbiAqL1xuXG5HbG9iLnByb3RvdHlwZS5icmFja2V0cyA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5vcHRpb25zLm5vYnJhY2tldHMgIT09IHRydWUpIHtcbiAgICB0aGlzLnBhdHRlcm4gPSB1dGlscy5icmFja2V0cyh0aGlzLnBhdHRlcm4pO1xuICB9XG59O1xuXG4vKipcbiAqIEV4cGFuZCBicmFja2V0IGV4cHJlc3Npb25zIGluIGBnbG9iLnBhdHRlcm5gXG4gKi9cblxuR2xvYi5wcm90b3R5cGUuZXh0Z2xvYiA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5vcHRpb25zLm5vZXh0Z2xvYiA9PT0gdHJ1ZSkgcmV0dXJuO1xuXG4gIGlmICh1dGlscy5pc0V4dGdsb2IodGhpcy5wYXR0ZXJuKSkge1xuICAgIHRoaXMucGF0dGVybiA9IHV0aWxzLmV4dGdsb2IodGhpcy5wYXR0ZXJuLCB7ZXNjYXBlOiB0cnVlfSk7XG4gIH1cbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIHBhdHRlcm5cbiAqL1xuXG5HbG9iLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgdGhpcy50b2tlbnMgPSB1dGlscy5wYXJzZUdsb2IocGF0dGVybiB8fCB0aGlzLnBhdHRlcm4sIHRydWUpO1xuICByZXR1cm4gdGhpcy50b2tlbnM7XG59O1xuXG4vKipcbiAqIFJlcGxhY2UgYGFgIHdpdGggYGJgLiBBbHNvIHRyYWNrcyB0aGUgY2hhbmdlIGJlZm9yZSBhbmRcbiAqIGFmdGVyIGVhY2ggcmVwbGFjZW1lbnQuIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYnV0XG4gKiBjYW4gYmUgZW5hYmxlZCBieSBzZXR0aW5nIGBvcHRpb25zLnRyYWNrYCB0byB0cnVlLlxuICpcbiAqIEFsc28sIHdoZW4gdGhlIHBhdHRlcm4gaXMgYSBzdHJpbmcsIGAuc3BsaXQoKWAgaXMgdXNlZCxcbiAqIGJlY2F1c2UgaXQncyBtdWNoIGZhc3RlciB0aGFuIHJlcGxhY2UuXG4gKlxuICogQHBhcmFtICB7UmVnRXhwfFN0cmluZ30gYGFgXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBiYFxuICogQHBhcmFtICB7Qm9vbGVhbn0gYGVzY2FwZWAgV2hlbiBgdHJ1ZWAsIGVzY2FwZXMgYCpgIGFuZCBgP2AgaW4gdGhlIHJlcGxhY2VtZW50LlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5cbkdsb2IucHJvdG90eXBlLl9yZXBsYWNlID0gZnVuY3Rpb24oYSwgYiwgZXNjYXBlKSB7XG4gIHRoaXMudHJhY2soJ2JlZm9yZSAoZmluZCk6IFwiJyArIGEgKyAnXCIgKHJlcGxhY2Ugd2l0aCk6IFwiJyArIGIgKyAnXCInKTtcbiAgaWYgKGVzY2FwZSkgYiA9IGVzYyhiKTtcbiAgaWYgKGEgJiYgYiAmJiB0eXBlb2YgYSA9PT0gJ3N0cmluZycpIHtcbiAgICB0aGlzLnBhdHRlcm4gPSB0aGlzLnBhdHRlcm4uc3BsaXQoYSkuam9pbihiKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnBhdHRlcm4gPSB0aGlzLnBhdHRlcm4ucmVwbGFjZShhLCBiKTtcbiAgfVxuICB0aGlzLnRyYWNrKCdhZnRlcicpO1xufTtcblxuLyoqXG4gKiBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBzdHJpbmcuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyYCBHbG9iIHBhdHRlcm5cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG5HbG9iLnByb3RvdHlwZS5lc2NhcGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgdGhpcy50cmFjaygnYmVmb3JlIGVzY2FwZTogJyk7XG4gIHZhciByZSA9IC9bXCJcXFxcXShbJ1wiXT9bXlwiJ1xcXFxdWydcIl0/KS9nO1xuXG4gIHRoaXMucGF0dGVybiA9IHN0ci5yZXBsYWNlKHJlLCBmdW5jdGlvbigkMCwgJDEpIHtcbiAgICB2YXIgbyA9IGNoYXJzLkVTQztcbiAgICB2YXIgY2ggPSBvICYmIG9bJDFdO1xuICAgIGlmIChjaCkge1xuICAgICAgcmV0dXJuIGNoO1xuICAgIH1cbiAgICBpZiAoL1thLXpdL2kudGVzdCgkMCkpIHtcbiAgICAgIHJldHVybiAkMC5zcGxpdCgnXFxcXCcpLmpvaW4oJycpO1xuICAgIH1cbiAgICByZXR1cm4gJDA7XG4gIH0pO1xuXG4gIHRoaXMudHJhY2soJ2FmdGVyIGVzY2FwZTogJyk7XG59O1xuXG4vKipcbiAqIFVuZXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG5HbG9iLnByb3RvdHlwZS51bmVzY2FwZSA9IGZ1bmN0aW9uKHN0cikge1xuICB2YXIgcmUgPSAvX18oW0EtWl0rKV8oW0EtWl0rKV9fL2c7XG4gIHRoaXMucGF0dGVybiA9IHN0ci5yZXBsYWNlKHJlLCBmdW5jdGlvbigkMCwgJDEpIHtcbiAgICByZXR1cm4gY2hhcnNbJDFdWyQwXTtcbiAgfSk7XG4gIHRoaXMucGF0dGVybiA9IHVuZXNjKHRoaXMucGF0dGVybik7XG59O1xuXG4vKipcbiAqIEVzY2FwZS91bmVzY2FwZSB1dGlsc1xuICovXG5cbmZ1bmN0aW9uIGVzYyhzdHIpIHtcbiAgc3RyID0gc3RyLnNwbGl0KCc/Jykuam9pbignJX4nKTtcbiAgc3RyID0gc3RyLnNwbGl0KCcqJykuam9pbignJSUnKTtcbiAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gdW5lc2Moc3RyKSB7XG4gIHN0ciA9IHN0ci5zcGxpdCgnJX4nKS5qb2luKCc/Jyk7XG4gIHN0ciA9IHN0ci5zcGxpdCgnJSUnKS5qb2luKCcqJyk7XG4gIHJldHVybiBzdHI7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB3aW4zMiA9IHByb2Nlc3MgJiYgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGZpbGVSZSA9IHJlcXVpcmUoJ2ZpbGVuYW1lLXJlZ2V4Jyk7XG52YXIgdXRpbHMgPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzXG4gKi9cblxudXRpbHMuZGlmZiA9IHJlcXVpcmUoJ2Fyci1kaWZmJyk7XG51dGlscy51bmlxdWUgPSByZXF1aXJlKCdhcnJheS11bmlxdWUnKTtcbnV0aWxzLmJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xudXRpbHMuYnJhY2tldHMgPSByZXF1aXJlKCdleHBhbmQtYnJhY2tldHMnKTtcbnV0aWxzLmV4dGdsb2IgPSByZXF1aXJlKCdleHRnbG9iJyk7XG51dGlscy5pc0V4dGdsb2IgPSByZXF1aXJlKCdpcy1leHRnbG9iJyk7XG51dGlscy5pc0dsb2IgPSByZXF1aXJlKCdpcy1nbG9iJyk7XG51dGlscy50eXBlT2YgPSByZXF1aXJlKCdraW5kLW9mJyk7XG51dGlscy5ub3JtYWxpemUgPSByZXF1aXJlKCdub3JtYWxpemUtcGF0aCcpO1xudXRpbHMub21pdCA9IHJlcXVpcmUoJ29iamVjdC5vbWl0Jyk7XG51dGlscy5wYXJzZUdsb2IgPSByZXF1aXJlKCdwYXJzZS1nbG9iJyk7XG51dGlscy5jYWNoZSA9IHJlcXVpcmUoJ3JlZ2V4LWNhY2hlJyk7XG5cbi8qKlxuICogR2V0IHRoZSBmaWxlbmFtZSBvZiBhIGZpbGVwYXRoXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJpbmdgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxudXRpbHMuZmlsZW5hbWUgPSBmdW5jdGlvbiBmaWxlbmFtZShmcCkge1xuICB2YXIgc2VnID0gZnAubWF0Y2goZmlsZVJlKCkpO1xuICByZXR1cm4gc2VnICYmIHNlZ1swXTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlblxuICogcGF0dGVybiBpcyB0aGUgc2FtZSBhcyBhIGdpdmVuIGBmaWxlcGF0aGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuXG51dGlscy5pc1BhdGggPSBmdW5jdGlvbiBpc1BhdGgocGF0dGVybiwgb3B0cykge1xuICByZXR1cm4gZnVuY3Rpb24oZnApIHtcbiAgICByZXR1cm4gcGF0dGVybiA9PT0gdXRpbHMudW5peGlmeShmcCwgb3B0cyk7XG4gIH07XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW5cbiAqIHBhdHRlcm4gY29udGFpbnMgYSBgZmlsZXBhdGhgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYFxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cblxudXRpbHMuaGFzUGF0aCA9IGZ1bmN0aW9uIGhhc1BhdGgocGF0dGVybiwgb3B0cykge1xuICByZXR1cm4gZnVuY3Rpb24oZnApIHtcbiAgICByZXR1cm4gdXRpbHMudW5peGlmeShwYXR0ZXJuLCBvcHRzKS5pbmRleE9mKGZwKSAhPT0gLTE7XG4gIH07XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW5cbiAqIHBhdHRlcm4gbWF0Y2hlcyBvciBjb250YWlucyBhIGBmaWxlcGF0aGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuXG51dGlscy5tYXRjaFBhdGggPSBmdW5jdGlvbiBtYXRjaFBhdGgocGF0dGVybiwgb3B0cykge1xuICB2YXIgZm4gPSAob3B0cyAmJiBvcHRzLmNvbnRhaW5zKVxuICAgID8gdXRpbHMuaGFzUGF0aChwYXR0ZXJuLCBvcHRzKVxuICAgIDogdXRpbHMuaXNQYXRoKHBhdHRlcm4sIG9wdHMpO1xuICByZXR1cm4gZm47XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW5cbiAqIHJlZ2V4IG1hdGNoZXMgdGhlIGBmaWxlbmFtZWAgb2YgYSBmaWxlIHBhdGguXG4gKlxuICogQHBhcmFtIHtSZWdFeHB9IGByZWBcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cblxudXRpbHMuaGFzRmlsZW5hbWUgPSBmdW5jdGlvbiBoYXNGaWxlbmFtZShyZSkge1xuICByZXR1cm4gZnVuY3Rpb24oZnApIHtcbiAgICB2YXIgbmFtZSA9IHV0aWxzLmZpbGVuYW1lKGZwKTtcbiAgICByZXR1cm4gbmFtZSAmJiByZS50ZXN0KG5hbWUpO1xuICB9O1xufTtcblxuLyoqXG4gKiBDb2VyY2UgYHZhbGAgdG8gYW4gYXJyYXlcbiAqXG4gKiBAcGFyYW0gIHsqfSB2YWxcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5cbnV0aWxzLmFycmF5aWZ5ID0gZnVuY3Rpb24gYXJyYXlpZnkodmFsKSB7XG4gIHJldHVybiAhQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgPyBbdmFsXVxuICAgIDogdmFsO1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYWxsIHNsYXNoZXMgaW4gYSBmaWxlIHBhdGggb3IgZ2xvYiBwYXR0ZXJuIHRvXG4gKiBmb3J3YXJkIHNsYXNoZXMuXG4gKi9cblxudXRpbHMudW5peGlmeSA9IGZ1bmN0aW9uIHVuaXhpZnkoZnAsIG9wdHMpIHtcbiAgaWYgKG9wdHMgJiYgb3B0cy51bml4aWZ5ID09PSBmYWxzZSkgcmV0dXJuIGZwO1xuICBpZiAob3B0cyAmJiBvcHRzLnVuaXhpZnkgPT09IHRydWUgfHwgd2luMzIgfHwgcGF0aC5zZXAgPT09ICdcXFxcJykge1xuICAgIHJldHVybiB1dGlscy5ub3JtYWxpemUoZnAsIGZhbHNlKTtcbiAgfVxuICBpZiAob3B0cyAmJiBvcHRzLnVuZXNjYXBlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZwID8gZnAudG9TdHJpbmcoKS5yZXBsYWNlKC9cXFxcKFxcdykvZywgJyQxJykgOiAnJztcbiAgfVxuICByZXR1cm4gZnA7XG59O1xuXG4vKipcbiAqIEVzY2FwZS91bmVzY2FwZSB1dGlsc1xuICovXG5cbnV0aWxzLmVzY2FwZVBhdGggPSBmdW5jdGlvbiBlc2NhcGVQYXRoKGZwKSB7XG4gIHJldHVybiBmcC5yZXBsYWNlKC9bXFxcXC5dL2csICdcXFxcJCYnKTtcbn07XG5cbnV0aWxzLnVuZXNjYXBlR2xvYiA9IGZ1bmN0aW9uIHVuZXNjYXBlR2xvYihmcCkge1xuICByZXR1cm4gZnAucmVwbGFjZSgvW1xcXFxcIiddL2csICcnKTtcbn07XG5cbnV0aWxzLmVzY2FwZVJlID0gZnVuY3Rpb24gZXNjYXBlUmUoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvWy1bXFxcXCQqKz8uI15cXHN7fSh8KVxcXV0vZywgJ1xcXFwkJicpO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgYHV0aWxzYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdXRpbHM7XG4iLCIvKiFcbiAqIGFyci1kaWZmIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9hcnItZGlmZj5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgSm9uIFNjaGxpbmtlcnQsIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGZsYXR0ZW4gPSByZXF1aXJlKCdhcnItZmxhdHRlbicpO1xudmFyIHNsaWNlID0gW10uc2xpY2U7XG5cbi8qKlxuICogUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGZpcnN0IGFycmF5IGFuZFxuICogYWRkaXRpb25hbCBhcnJheXMuXG4gKlxuICogYGBganNcbiAqIHZhciBkaWZmID0gcmVxdWlyZSgneyU9IG5hbWUgJX0nKTtcbiAqXG4gKiB2YXIgYSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICogdmFyIGIgPSBbJ2InLCAnYyddO1xuICpcbiAqIGNvbnNvbGUubG9nKGRpZmYoYSwgYikpXG4gKiAvLz0+IFsnYScsICdkJ11cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSAge0FycmF5fSBgYWBcbiAqIEBwYXJhbSAge0FycmF5fSBgYmBcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkaWZmKGFyciwgYXJyYXlzKSB7XG4gIHZhciBhcmdzTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGxlbiA9IGFyci5sZW5ndGgsIGkgPSAtMTtcbiAgdmFyIHJlcyA9IFtdLCBhcnJheXM7XG5cbiAgaWYgKGFyZ3NMZW4gPT09IDEpIHtcbiAgICByZXR1cm4gYXJyO1xuICB9XG5cbiAgaWYgKGFyZ3NMZW4gPiAyKSB7XG4gICAgYXJyYXlzID0gZmxhdHRlbihzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xuICB9XG5cbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIGlmICghfmFycmF5cy5pbmRleE9mKGFycltpXSkpIHtcbiAgICAgIHJlcy5wdXNoKGFycltpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogRXhwb3NlIGBkaWZmYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGlmZjtcbiIsInZhciBpc0J1ZmZlciA9IHJlcXVpcmUoJ2lzLWJ1ZmZlcicpO1xudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBHZXQgdGhlIG5hdGl2ZSBgdHlwZW9mYCBhIHZhbHVlLlxuICpcbiAqIEBwYXJhbSAgeyp9IGB2YWxgXG4gKiBAcmV0dXJuIHsqfSBOYXRpdmUgamF2YXNjcmlwdCB0eXBlXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIC8vIHByaW1pdGl2aWVzXG4gIGlmICh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgfVxuICBpZiAodmFsID09PSBudWxsKSB7XG4gICAgcmV0dXJuICdudWxsJztcbiAgfVxuICBpZiAodmFsID09PSB0cnVlIHx8IHZhbCA9PT0gZmFsc2UgfHwgdmFsIGluc3RhbmNlb2YgQm9vbGVhbikge1xuICAgIHJldHVybiAnYm9vbGVhbic7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnIHx8IHZhbCBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgIHJldHVybiAnc3RyaW5nJztcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicgfHwgdmFsIGluc3RhbmNlb2YgTnVtYmVyKSB7XG4gICAgcmV0dXJuICdudW1iZXInO1xuICB9XG5cbiAgLy8gZnVuY3Rpb25zXG4gIGlmICh0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nIHx8IHZhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuICdmdW5jdGlvbic7XG4gIH1cblxuICAvLyBhcnJheVxuICBpZiAodHlwZW9mIEFycmF5LmlzQXJyYXkgIT09ICd1bmRlZmluZWQnICYmIEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIHJldHVybiAnYXJyYXknO1xuICB9XG5cbiAgLy8gY2hlY2sgZm9yIGluc3RhbmNlcyBvZiBSZWdFeHAgYW5kIERhdGUgYmVmb3JlIGNhbGxpbmcgYHRvU3RyaW5nYFxuICBpZiAodmFsIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuICdyZWdleHAnO1xuICB9XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuICdkYXRlJztcbiAgfVxuXG4gIC8vIG90aGVyIG9iamVjdHNcbiAgdmFyIHR5cGUgPSB0b1N0cmluZy5jYWxsKHZhbCk7XG5cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7XG4gICAgcmV0dXJuICdyZWdleHAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICByZXR1cm4gJ2RhdGUnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBBcmd1bWVudHNdJykge1xuICAgIHJldHVybiAnYXJndW1lbnRzJztcbiAgfVxuXG4gIC8vIGJ1ZmZlclxuICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNCdWZmZXIodmFsKSkge1xuICAgIHJldHVybiAnYnVmZmVyJztcbiAgfVxuXG4gIC8vIGVzNjogTWFwLCBXZWFrTWFwLCBTZXQsIFdlYWtTZXRcbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFNldF0nKSB7XG4gICAgcmV0dXJuICdzZXQnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBXZWFrU2V0XScpIHtcbiAgICByZXR1cm4gJ3dlYWtzZXQnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBNYXBdJykge1xuICAgIHJldHVybiAnbWFwJztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgV2Vha01hcF0nKSB7XG4gICAgcmV0dXJuICd3ZWFrbWFwJztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgU3ltYm9sXScpIHtcbiAgICByZXR1cm4gJ3N5bWJvbCc7XG4gIH1cblxuICAvLyB0eXBlZCBhcnJheXNcbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEludDhBcnJheV0nKSB7XG4gICAgcmV0dXJuICdpbnQ4YXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBVaW50OEFycmF5XScpIHtcbiAgICByZXR1cm4gJ3VpbnQ4YXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nKSB7XG4gICAgcmV0dXJuICd1aW50OGNsYW1wZWRhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEludDE2QXJyYXldJykge1xuICAgIHJldHVybiAnaW50MTZhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFVpbnQxNkFycmF5XScpIHtcbiAgICByZXR1cm4gJ3VpbnQxNmFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSW50MzJBcnJheV0nKSB7XG4gICAgcmV0dXJuICdpbnQzMmFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgVWludDMyQXJyYXldJykge1xuICAgIHJldHVybiAndWludDMyYXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBGbG9hdDMyQXJyYXldJykge1xuICAgIHJldHVybiAnZmxvYXQzMmFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScpIHtcbiAgICByZXR1cm4gJ2Zsb2F0NjRhcnJheSc7XG4gIH1cblxuICAvLyBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0XG4gIHJldHVybiAnb2JqZWN0Jztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc0V4dGVuZGFibGUgPSByZXF1aXJlKCdpcy1leHRlbmRhYmxlJyk7XG52YXIgZm9ySW4gPSByZXF1aXJlKCdmb3ItaW4nKTtcblxuZnVuY3Rpb24gbWl4aW5EZWVwKHRhcmdldCwgb2JqZWN0cykge1xuICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgaSA9IDA7XG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICB2YXIgb2JqID0gYXJndW1lbnRzW2ldO1xuICAgIGlmIChpc09iamVjdChvYmopKSB7XG4gICAgICBmb3JJbihvYmosIGNvcHksIHRhcmdldCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKlxuICogQ29weSBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZSBvYmplY3QgdG8gdGhlXG4gKiB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSAgeyp9IGB2YWxgXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBrZXlgXG4gKi9cblxuZnVuY3Rpb24gY29weSh2YWwsIGtleSkge1xuICB2YXIgb2JqID0gdGhpc1trZXldO1xuICBpZiAoaXNPYmplY3QodmFsKSAmJiBpc09iamVjdChvYmopKSB7XG4gICAgbWl4aW5EZWVwKG9iaiwgdmFsKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzW2tleV0gPSB2YWw7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYHZhbGAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSAge2FueX0gdmFsXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbCkge1xuICByZXR1cm4gaXNFeHRlbmRhYmxlKHZhbCkgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcbn1cblxuLyoqXG4gKiBFeHBvc2UgYG1peGluRGVlcGBcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1peGluRGVlcDtcbiIsIi8vISBtb21lbnQuanNcbi8vISB2ZXJzaW9uIDogMi4xMy4wXG4vLyEgYXV0aG9ycyA6IFRpbSBXb29kLCBJc2tyZW4gQ2hlcm5ldiwgTW9tZW50LmpzIGNvbnRyaWJ1dG9yc1xuLy8hIGxpY2Vuc2UgOiBNSVRcbi8vISBtb21lbnRqcy5jb21cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gICAgZ2xvYmFsLm1vbWVudCA9IGZhY3RvcnkoKVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBob29rQ2FsbGJhY2s7XG5cbiAgICBmdW5jdGlvbiB1dGlsc19ob29rc19faG9va3MgKCkge1xuICAgICAgICByZXR1cm4gaG9va0NhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBkb25lIHRvIHJlZ2lzdGVyIHRoZSBtZXRob2QgY2FsbGVkIHdpdGggbW9tZW50KClcbiAgICAvLyB3aXRob3V0IGNyZWF0aW5nIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbiAgICBmdW5jdGlvbiBzZXRIb29rQ2FsbGJhY2sgKGNhbGxiYWNrKSB7XG4gICAgICAgIGhvb2tDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQXJyYXkoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgQXJyYXkgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RhdGUoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgRGF0ZSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBEYXRlXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFwKGFyciwgZm4pIHtcbiAgICAgICAgdmFyIHJlcyA9IFtdLCBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICByZXMucHVzaChmbihhcnJbaV0sIGkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhc093blByb3AoYSwgYikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsIGIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dGVuZChhLCBiKSB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gYikge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoYiwgaSkpIHtcbiAgICAgICAgICAgICAgICBhW2ldID0gYltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd25Qcm9wKGIsICd0b1N0cmluZycpKSB7XG4gICAgICAgICAgICBhLnRvU3RyaW5nID0gYi50b1N0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd25Qcm9wKGIsICd2YWx1ZU9mJykpIHtcbiAgICAgICAgICAgIGEudmFsdWVPZiA9IGIudmFsdWVPZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZV91dGNfX2NyZWF0ZVVUQyAoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIHRydWUpLnV0YygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmF1bHRQYXJzaW5nRmxhZ3MoKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZGVlcCBjbG9uZSB0aGlzIG9iamVjdC5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVtcHR5ICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgdW51c2VkVG9rZW5zICAgIDogW10sXG4gICAgICAgICAgICB1bnVzZWRJbnB1dCAgICAgOiBbXSxcbiAgICAgICAgICAgIG92ZXJmbG93ICAgICAgICA6IC0yLFxuICAgICAgICAgICAgY2hhcnNMZWZ0T3ZlciAgIDogMCxcbiAgICAgICAgICAgIG51bGxJbnB1dCAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgaW52YWxpZE1vbnRoICAgIDogbnVsbCxcbiAgICAgICAgICAgIGludmFsaWRGb3JtYXQgICA6IGZhbHNlLFxuICAgICAgICAgICAgdXNlckludmFsaWRhdGVkIDogZmFsc2UsXG4gICAgICAgICAgICBpc28gICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHBhcnNlZERhdGVQYXJ0cyA6IFtdLFxuICAgICAgICAgICAgbWVyaWRpZW0gICAgICAgIDogbnVsbFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFBhcnNpbmdGbGFncyhtKSB7XG4gICAgICAgIGlmIChtLl9wZiA9PSBudWxsKSB7XG4gICAgICAgICAgICBtLl9wZiA9IGRlZmF1bHRQYXJzaW5nRmxhZ3MoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5fcGY7XG4gICAgfVxuXG4gICAgdmFyIHNvbWU7XG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5zb21lKSB7XG4gICAgICAgIHNvbWUgPSBBcnJheS5wcm90b3R5cGUuc29tZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzb21lID0gZnVuY3Rpb24gKGZ1bikge1xuICAgICAgICAgICAgdmFyIHQgPSBPYmplY3QodGhpcyk7XG4gICAgICAgICAgICB2YXIgbGVuID0gdC5sZW5ndGggPj4+IDA7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSBpbiB0ICYmIGZ1bi5jYWxsKHRoaXMsIHRbaV0sIGksIHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkX19pc1ZhbGlkKG0pIHtcbiAgICAgICAgaWYgKG0uX2lzVmFsaWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGZsYWdzID0gZ2V0UGFyc2luZ0ZsYWdzKG0pO1xuICAgICAgICAgICAgdmFyIHBhcnNlZFBhcnRzID0gc29tZS5jYWxsKGZsYWdzLnBhcnNlZERhdGVQYXJ0cywgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAhPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtLl9pc1ZhbGlkID0gIWlzTmFOKG0uX2QuZ2V0VGltZSgpKSAmJlxuICAgICAgICAgICAgICAgIGZsYWdzLm92ZXJmbG93IDwgMCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5lbXB0eSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkTW9udGggJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZFdlZWtkYXkgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MubnVsbElucHV0ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRGb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MudXNlckludmFsaWRhdGVkICYmXG4gICAgICAgICAgICAgICAgKCFmbGFncy5tZXJpZGllbSB8fCAoZmxhZ3MubWVyaWRpZW0gJiYgcGFyc2VkUGFydHMpKTtcblxuICAgICAgICAgICAgaWYgKG0uX3N0cmljdCkge1xuICAgICAgICAgICAgICAgIG0uX2lzVmFsaWQgPSBtLl9pc1ZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNoYXJzTGVmdE92ZXIgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MudW51c2VkVG9rZW5zLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5iaWdIb3VyID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG0uX2lzVmFsaWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRfX2NyZWF0ZUludmFsaWQgKGZsYWdzKSB7XG4gICAgICAgIHZhciBtID0gY3JlYXRlX3V0Y19fY3JlYXRlVVRDKE5hTik7XG4gICAgICAgIGlmIChmbGFncyAhPSBudWxsKSB7XG4gICAgICAgICAgICBleHRlbmQoZ2V0UGFyc2luZ0ZsYWdzKG0pLCBmbGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MobSkudXNlckludmFsaWRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PT0gdm9pZCAwO1xuICAgIH1cblxuICAgIC8vIFBsdWdpbnMgdGhhdCBhZGQgcHJvcGVydGllcyBzaG91bGQgYWxzbyBhZGQgdGhlIGtleSBoZXJlIChudWxsIHZhbHVlKSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJvcGVybHkgY2xvbmUgb3Vyc2VsdmVzLlxuICAgIHZhciBtb21lbnRQcm9wZXJ0aWVzID0gdXRpbHNfaG9va3NfX2hvb2tzLm1vbWVudFByb3BlcnRpZXMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGNvcHlDb25maWcodG8sIGZyb20pIHtcbiAgICAgICAgdmFyIGksIHByb3AsIHZhbDtcblxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzQU1vbWVudE9iamVjdCkpIHtcbiAgICAgICAgICAgIHRvLl9pc0FNb21lbnRPYmplY3QgPSBmcm9tLl9pc0FNb21lbnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pKSkge1xuICAgICAgICAgICAgdG8uX2kgPSBmcm9tLl9pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fZikpIHtcbiAgICAgICAgICAgIHRvLl9mID0gZnJvbS5fZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2wpKSB7XG4gICAgICAgICAgICB0by5fbCA9IGZyb20uX2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9zdHJpY3QpKSB7XG4gICAgICAgICAgICB0by5fc3RyaWN0ID0gZnJvbS5fc3RyaWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fdHptKSkge1xuICAgICAgICAgICAgdG8uX3R6bSA9IGZyb20uX3R6bTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzVVRDKSkge1xuICAgICAgICAgICAgdG8uX2lzVVRDID0gZnJvbS5faXNVVEM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9vZmZzZXQpKSB7XG4gICAgICAgICAgICB0by5fb2Zmc2V0ID0gZnJvbS5fb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fcGYpKSB7XG4gICAgICAgICAgICB0by5fcGYgPSBnZXRQYXJzaW5nRmxhZ3MoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sb2NhbGUpKSB7XG4gICAgICAgICAgICB0by5fbG9jYWxlID0gZnJvbS5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vbWVudFByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChpIGluIG1vbWVudFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gbW9tZW50UHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICB2YWwgPSBmcm9tW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICB0b1twcm9wXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAgIC8vIE1vbWVudCBwcm90b3R5cGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gTW9tZW50KGNvbmZpZykge1xuICAgICAgICBjb3B5Q29uZmlnKHRoaXMsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShjb25maWcuX2QgIT0gbnVsbCA/IGNvbmZpZy5fZC5nZXRUaW1lKCkgOiBOYU4pO1xuICAgICAgICAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY2FzZSB1cGRhdGVPZmZzZXQgY3JlYXRlcyBuZXcgbW9tZW50XG4gICAgICAgIC8vIG9iamVjdHMuXG4gICAgICAgIGlmICh1cGRhdGVJblByb2dyZXNzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICB1dGlsc19ob29rc19faG9va3MudXBkYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNNb21lbnQgKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgTW9tZW50IHx8IChvYmogIT0gbnVsbCAmJiBvYmouX2lzQU1vbWVudE9iamVjdCAhPSBudWxsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNGbG9vciAobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JbnQoYXJndW1lbnRGb3JDb2VyY2lvbikge1xuICAgICAgICB2YXIgY29lcmNlZE51bWJlciA9ICthcmd1bWVudEZvckNvZXJjaW9uLFxuICAgICAgICAgICAgdmFsdWUgPSAwO1xuXG4gICAgICAgIGlmIChjb2VyY2VkTnVtYmVyICE9PSAwICYmIGlzRmluaXRlKGNvZXJjZWROdW1iZXIpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGFic0Zsb29yKGNvZXJjZWROdW1iZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIGNvbXBhcmUgdHdvIGFycmF5cywgcmV0dXJuIHRoZSBudW1iZXIgb2YgZGlmZmVyZW5jZXNcbiAgICBmdW5jdGlvbiBjb21wYXJlQXJyYXlzKGFycmF5MSwgYXJyYXkyLCBkb250Q29udmVydCkge1xuICAgICAgICB2YXIgbGVuID0gTWF0aC5taW4oYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCksXG4gICAgICAgICAgICBsZW5ndGhEaWZmID0gTWF0aC5hYnMoYXJyYXkxLmxlbmd0aCAtIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgZGlmZnMgPSAwLFxuICAgICAgICAgICAgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoKGRvbnRDb252ZXJ0ICYmIGFycmF5MVtpXSAhPT0gYXJyYXkyW2ldKSB8fFxuICAgICAgICAgICAgICAgICghZG9udENvbnZlcnQgJiYgdG9JbnQoYXJyYXkxW2ldKSAhPT0gdG9JbnQoYXJyYXkyW2ldKSkpIHtcbiAgICAgICAgICAgICAgICBkaWZmcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaWZmcyArIGxlbmd0aERpZmY7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Fybihtc2cpIHtcbiAgICAgICAgaWYgKHV0aWxzX2hvb2tzX19ob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBjb25zb2xlICE9PSAgJ3VuZGVmaW5lZCcpICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdEZXByZWNhdGlvbiB3YXJuaW5nOiAnICsgbXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZShtc2csIGZuKSB7XG4gICAgICAgIHZhciBmaXJzdFRpbWUgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHV0aWxzX2hvb2tzX19ob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHV0aWxzX2hvb2tzX19ob29rcy5kZXByZWNhdGlvbkhhbmRsZXIobnVsbCwgbXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXJzdFRpbWUpIHtcbiAgICAgICAgICAgICAgICB3YXJuKG1zZyArICdcXG5Bcmd1bWVudHM6ICcgKyBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oJywgJykgKyAnXFxuJyArIChuZXcgRXJyb3IoKSkuc3RhY2spO1xuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sIGZuKTtcbiAgICB9XG5cbiAgICB2YXIgZGVwcmVjYXRpb25zID0ge307XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGVTaW1wbGUobmFtZSwgbXNnKSB7XG4gICAgICAgIGlmICh1dGlsc19ob29rc19faG9va3MuZGVwcmVjYXRpb25IYW5kbGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHV0aWxzX2hvb2tzX19ob29rcy5kZXByZWNhdGlvbkhhbmRsZXIobmFtZSwgbXNnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlcHJlY2F0aW9uc1tuYW1lXSkge1xuICAgICAgICAgICAgd2Fybihtc2cpO1xuICAgICAgICAgICAgZGVwcmVjYXRpb25zW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHV0aWxzX2hvb2tzX19ob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPSBmYWxzZTtcbiAgICB1dGlsc19ob29rc19faG9va3MuZGVwcmVjYXRpb25IYW5kbGVyID0gbnVsbDtcblxuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09iamVjdChpbnB1dCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlX3NldF9fc2V0IChjb25maWcpIHtcbiAgICAgICAgdmFyIHByb3AsIGk7XG4gICAgICAgIGZvciAoaSBpbiBjb25maWcpIHtcbiAgICAgICAgICAgIHByb3AgPSBjb25maWdbaV07XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihwcm9wKSkge1xuICAgICAgICAgICAgICAgIHRoaXNbaV0gPSBwcm9wO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzWydfJyArIGldID0gcHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIC8vIExlbmllbnQgb3JkaW5hbCBwYXJzaW5nIGFjY2VwdHMganVzdCBhIG51bWJlciBpbiBhZGRpdGlvbiB0b1xuICAgICAgICAvLyBudW1iZXIgKyAocG9zc2libHkpIHN0dWZmIGNvbWluZyBmcm9tIF9vcmRpbmFsUGFyc2VMZW5pZW50LlxuICAgICAgICB0aGlzLl9vcmRpbmFsUGFyc2VMZW5pZW50ID0gbmV3IFJlZ0V4cCh0aGlzLl9vcmRpbmFsUGFyc2Uuc291cmNlICsgJ3wnICsgKC9cXGR7MSwyfS8pLnNvdXJjZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY2hpbGRDb25maWcpIHtcbiAgICAgICAgdmFyIHJlcyA9IGV4dGVuZCh7fSwgcGFyZW50Q29uZmlnKSwgcHJvcDtcbiAgICAgICAgZm9yIChwcm9wIGluIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChjaGlsZENvbmZpZywgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKSAmJiBpc09iamVjdChjaGlsZENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW3Byb3BdID0ge307XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIHBhcmVudENvbmZpZ1twcm9wXSk7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIGNoaWxkQ29uZmlnW3Byb3BdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkQ29uZmlnW3Byb3BdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW3Byb3BdID0gY2hpbGRDb25maWdbcHJvcF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc1twcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBMb2NhbGUoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZXQoY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKSB7XG4gICAgICAgIGtleXMgPSBPYmplY3Qua2V5cztcbiAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgdmFyIGksIHJlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChpIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKG9iaiwgaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBpbnRlcm5hbCBzdG9yYWdlIGZvciBsb2NhbGUgY29uZmlnIGZpbGVzXG4gICAgdmFyIGxvY2FsZXMgPSB7fTtcbiAgICB2YXIgZ2xvYmFsTG9jYWxlO1xuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYWxlKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5ID8ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnXycsICctJykgOiBrZXk7XG4gICAgfVxuXG4gICAgLy8gcGljayB0aGUgbG9jYWxlIGZyb20gdGhlIGFycmF5XG4gICAgLy8gdHJ5IFsnZW4tYXUnLCAnZW4tZ2InXSBhcyAnZW4tYXUnLCAnZW4tZ2InLCAnZW4nLCBhcyBpbiBtb3ZlIHRocm91Z2ggdGhlIGxpc3QgdHJ5aW5nIGVhY2hcbiAgICAvLyBzdWJzdHJpbmcgZnJvbSBtb3N0IHNwZWNpZmljIHRvIGxlYXN0LCBidXQgbW92ZSB0byB0aGUgbmV4dCBhcnJheSBpdGVtIGlmIGl0J3MgYSBtb3JlIHNwZWNpZmljIHZhcmlhbnQgdGhhbiB0aGUgY3VycmVudCByb290XG4gICAgZnVuY3Rpb24gY2hvb3NlTG9jYWxlKG5hbWVzKSB7XG4gICAgICAgIHZhciBpID0gMCwgaiwgbmV4dCwgbG9jYWxlLCBzcGxpdDtcblxuICAgICAgICB3aGlsZSAoaSA8IG5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgc3BsaXQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaV0pLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBqID0gc3BsaXQubGVuZ3RoO1xuICAgICAgICAgICAgbmV4dCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpICsgMV0pO1xuICAgICAgICAgICAgbmV4dCA9IG5leHQgPyBuZXh0LnNwbGl0KCctJykgOiBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKGogPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShzcGxpdC5zbGljZSgwLCBqKS5qb2luKCctJykpO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5sZW5ndGggPj0gaiAmJiBjb21wYXJlQXJyYXlzKHNwbGl0LCBuZXh0LCB0cnVlKSA+PSBqIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvL3RoZSBuZXh0IGFycmF5IGl0ZW0gaXMgYmV0dGVyIHRoYW4gYSBzaGFsbG93ZXIgc3Vic3RyaW5nIG9mIHRoaXMgb25lXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9hZExvY2FsZShuYW1lKSB7XG4gICAgICAgIHZhciBvbGRMb2NhbGUgPSBudWxsO1xuICAgICAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byByZWdpc3RlciBhbmQgbG9hZCBhbGwgdGhlIGxvY2FsZXMgaW4gTm9kZVxuICAgICAgICBpZiAoIWxvY2FsZXNbbmFtZV0gJiYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgIG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBvbGRMb2NhbGUgPSBnbG9iYWxMb2NhbGUuX2FiYnI7XG4gICAgICAgICAgICAgICAgcmVxdWlyZSgnLi9sb2NhbGUvJyArIG5hbWUpO1xuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgZGVmaW5lTG9jYWxlIGN1cnJlbnRseSBhbHNvIHNldHMgdGhlIGdsb2JhbCBsb2NhbGUsIHdlXG4gICAgICAgICAgICAgICAgLy8gd2FudCB0byB1bmRvIHRoYXQgZm9yIGxhenkgbG9hZGVkIGxvY2FsZXNcbiAgICAgICAgICAgICAgICBsb2NhbGVfbG9jYWxlc19fZ2V0U2V0R2xvYmFsTG9jYWxlKG9sZExvY2FsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgbG9hZCBsb2NhbGUgYW5kIHRoZW4gc2V0IHRoZSBnbG9iYWwgbG9jYWxlLiAgSWZcbiAgICAvLyBubyBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiwgaXQgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBjdXJyZW50IGdsb2JhbFxuICAgIC8vIGxvY2FsZSBrZXkuXG4gICAgZnVuY3Rpb24gbG9jYWxlX2xvY2FsZXNfX2dldFNldEdsb2JhbExvY2FsZSAoa2V5LCB2YWx1ZXMpIHtcbiAgICAgICAgdmFyIGRhdGE7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGxvY2FsZV9sb2NhbGVzX19nZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBkZWZpbmVMb2NhbGUoa2V5LCB2YWx1ZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIG1vbWVudC5kdXJhdGlvbi5fbG9jYWxlID0gbW9tZW50Ll9sb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgICAgIGdsb2JhbExvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlLl9hYmJyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmluZUxvY2FsZSAobmFtZSwgY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5hYmJyID0gbmFtZTtcbiAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVTaW1wbGUoJ2RlZmluZUxvY2FsZU92ZXJyaWRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICd1c2UgbW9tZW50LnVwZGF0ZUxvY2FsZShsb2NhbGVOYW1lLCBjb25maWcpIHRvIGNoYW5nZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdhbiBleGlzdGluZyBsb2NhbGUuIG1vbWVudC5kZWZpbmVMb2NhbGUobG9jYWxlTmFtZSwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlnKSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjcmVhdGluZyBhIG5ldyBsb2NhbGUnKTtcbiAgICAgICAgICAgICAgICBjb25maWcgPSBtZXJnZUNvbmZpZ3MobG9jYWxlc1tuYW1lXS5fY29uZmlnLCBjb25maWcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcucGFyZW50TG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxlc1tjb25maWcucGFyZW50TG9jYWxlXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlncyhsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLl9jb25maWcsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJlYXQgYXMgaWYgdGhlcmUgaXMgbm8gYmFzZSBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKCdwYXJlbnRMb2NhbGVVbmRlZmluZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgcGFyZW50TG9jYWxlIGlzIG5vdCBkZWZpbmVkIHlldCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBuZXcgTG9jYWxlKGNvbmZpZyk7XG5cbiAgICAgICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXQgZm9yIG5vdzogYWxzbyBzZXQgdGhlIGxvY2FsZVxuICAgICAgICAgICAgbG9jYWxlX2xvY2FsZXNfX2dldFNldEdsb2JhbExvY2FsZShuYW1lKTtcblxuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB1c2VmdWwgZm9yIHRlc3RpbmdcbiAgICAgICAgICAgIGRlbGV0ZSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVMb2NhbGUobmFtZSwgY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGxvY2FsZTtcbiAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcgPSBtZXJnZUNvbmZpZ3MobG9jYWxlc1tuYW1lXS5fY29uZmlnLCBjb25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZShjb25maWcpO1xuICAgICAgICAgICAgbG9jYWxlLnBhcmVudExvY2FsZSA9IGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbG9jYWxlO1xuXG4gICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0IGZvciBub3c6IGFsc28gc2V0IHRoZSBsb2NhbGVcbiAgICAgICAgICAgIGxvY2FsZV9sb2NhbGVzX19nZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzIG51bGwgZm9yIGNvbmZpZyB0byB1bnVwZGF0ZSwgdXNlZnVsIGZvciB0ZXN0c1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsb2NhbGUgZGF0YVxuICAgIGZ1bmN0aW9uIGxvY2FsZV9sb2NhbGVzX19nZXRMb2NhbGUgKGtleSkge1xuICAgICAgICB2YXIgbG9jYWxlO1xuXG4gICAgICAgIGlmIChrZXkgJiYga2V5Ll9sb2NhbGUgJiYga2V5Ll9sb2NhbGUuX2FiYnIpIHtcbiAgICAgICAgICAgIGtleSA9IGtleS5fbG9jYWxlLl9hYmJyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxMb2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQXJyYXkoa2V5KSkge1xuICAgICAgICAgICAgLy9zaG9ydC1jaXJjdWl0IGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShrZXkpO1xuICAgICAgICAgICAgaWYgKGxvY2FsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrZXkgPSBba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaG9vc2VMb2NhbGUoa2V5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVfbG9jYWxlc19fbGlzdExvY2FsZXMoKSB7XG4gICAgICAgIHJldHVybiBrZXlzKGxvY2FsZXMpO1xuICAgIH1cblxuICAgIHZhciBhbGlhc2VzID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRVbml0QWxpYXMgKHVuaXQsIHNob3J0aGFuZCkge1xuICAgICAgICB2YXIgbG93ZXJDYXNlID0gdW5pdC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBhbGlhc2VzW2xvd2VyQ2FzZV0gPSBhbGlhc2VzW2xvd2VyQ2FzZSArICdzJ10gPSBhbGlhc2VzW3Nob3J0aGFuZF0gPSB1bml0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXRzKHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdW5pdHMgPT09ICdzdHJpbmcnID8gYWxpYXNlc1t1bml0c10gfHwgYWxpYXNlc1t1bml0cy50b0xvd2VyQ2FzZSgpXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVPYmplY3RVbml0cyhpbnB1dE9iamVjdCkge1xuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0ID0ge30sXG4gICAgICAgICAgICBub3JtYWxpemVkUHJvcCxcbiAgICAgICAgICAgIHByb3A7XG5cbiAgICAgICAgZm9yIChwcm9wIGluIGlucHV0T2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChpbnB1dE9iamVjdCwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkUHJvcCA9IG5vcm1hbGl6ZVVuaXRzKHByb3ApO1xuICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkUHJvcCkge1xuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkSW5wdXRbbm9ybWFsaXplZFByb3BdID0gaW5wdXRPYmplY3RbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRJbnB1dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlR2V0U2V0ICh1bml0LCBrZWVwVGltZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGdldF9zZXRfX3NldCh0aGlzLCB1bml0LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdXRpbHNfaG9va3NfX2hvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCBrZWVwVGltZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRfc2V0X19nZXQodGhpcywgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0X3NldF9fZ2V0IChtb20sIHVuaXQpIHtcbiAgICAgICAgcmV0dXJuIG1vbS5pc1ZhbGlkKCkgP1xuICAgICAgICAgICAgbW9tLl9kWydnZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0X3NldF9fc2V0IChtb20sIHVuaXQsIHZhbHVlKSB7XG4gICAgICAgIGlmIChtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICBtb20uX2RbJ3NldCcgKyAobW9tLl9pc1VUQyA/ICdVVEMnIDogJycpICsgdW5pdF0odmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0ICh1bml0cywgdmFsdWUpIHtcbiAgICAgICAgdmFyIHVuaXQ7XG4gICAgICAgIGlmICh0eXBlb2YgdW5pdHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmb3IgKHVuaXQgaW4gdW5pdHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldCh1bml0LCB1bml0c1t1bml0XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXNbdW5pdHNdKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3VuaXRzXSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gemVyb0ZpbGwobnVtYmVyLCB0YXJnZXRMZW5ndGgsIGZvcmNlU2lnbikge1xuICAgICAgICB2YXIgYWJzTnVtYmVyID0gJycgKyBNYXRoLmFicyhudW1iZXIpLFxuICAgICAgICAgICAgemVyb3NUb0ZpbGwgPSB0YXJnZXRMZW5ndGggLSBhYnNOdW1iZXIubGVuZ3RoLFxuICAgICAgICAgICAgc2lnbiA9IG51bWJlciA+PSAwO1xuICAgICAgICByZXR1cm4gKHNpZ24gPyAoZm9yY2VTaWduID8gJysnIDogJycpIDogJy0nKSArXG4gICAgICAgICAgICBNYXRoLnBvdygxMCwgTWF0aC5tYXgoMCwgemVyb3NUb0ZpbGwpKS50b1N0cmluZygpLnN1YnN0cigxKSArIGFic051bWJlcjtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhbSGhdbW0oc3MpP3xNb3xNTT9NP00/fERvfERERG98REQ/RD9EP3xkZGQ/ZD98ZG8/fHdbb3x3XT98V1tvfFddP3xRbz98WVlZWVlZfFlZWVlZfFlZWVl8WVl8Z2coZ2dnPyk/fEdHKEdHRz8pP3xlfEV8YXxBfGhoP3xISD98a2s/fG1tP3xzcz98U3sxLDl9fHh8WHx6ej98Wlo/fC4pL2c7XG5cbiAgICB2YXIgbG9jYWxGb3JtYXR0aW5nVG9rZW5zID0gLyhcXFtbXlxcW10qXFxdKXwoXFxcXCk/KExUU3xMVHxMTD9MP0w/fGx7MSw0fSkvZztcblxuICAgIHZhciBmb3JtYXRGdW5jdGlvbnMgPSB7fTtcblxuICAgIHZhciBmb3JtYXRUb2tlbkZ1bmN0aW9ucyA9IHt9O1xuXG4gICAgLy8gdG9rZW46ICAgICdNJ1xuICAgIC8vIHBhZGRlZDogICBbJ01NJywgMl1cbiAgICAvLyBvcmRpbmFsOiAgJ01vJ1xuICAgIC8vIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7IHRoaXMubW9udGgoKSArIDEgfVxuICAgIGZ1bmN0aW9uIGFkZEZvcm1hdFRva2VuICh0b2tlbiwgcGFkZGVkLCBvcmRpbmFsLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZnVuYyA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tjYWxsYmFja10oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1t0b2tlbl0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWRkZWQpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW3BhZGRlZFswXV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHplcm9GaWxsKGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgcGFkZGVkWzFdLCBwYWRkZWRbMl0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3JkaW5hbCkge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbb3JkaW5hbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm9yZGluYWwoZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0b2tlbik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQubWF0Y2goL1xcW1tcXHNcXFNdLykpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9eXFxbfFxcXSQvZywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9cXFxcL2csICcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KSB7XG4gICAgICAgIHZhciBhcnJheSA9IGZvcm1hdC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSwgaSwgbGVuZ3RoO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dKSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBmb3JtYXRUb2tlbkZ1bmN0aW9uc1thcnJheVtpXV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhhcnJheVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1vbSkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9ICcnLCBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IGFycmF5W2ldIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBhcnJheVtpXS5jYWxsKG1vbSwgZm9ybWF0KSA6IGFycmF5W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBmb3JtYXQgZGF0ZSB1c2luZyBuYXRpdmUgZGF0ZSBvYmplY3RcbiAgICBmdW5jdGlvbiBmb3JtYXRNb21lbnQobSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBtLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0ID0gZXhwYW5kRm9ybWF0KGZvcm1hdCwgbS5sb2NhbGVEYXRhKCkpO1xuICAgICAgICBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSA9IGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdIHx8IG1ha2VGb3JtYXRGdW5jdGlvbihmb3JtYXQpO1xuXG4gICAgICAgIHJldHVybiBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XShtKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHBhbmRGb3JtYXQoZm9ybWF0LCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGkgPSA1O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlcGxhY2VMb25nRGF0ZUZvcm1hdFRva2VucyhpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS5sb25nRGF0ZUZvcm1hdChpbnB1dCkgfHwgaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMubGFzdEluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPj0gMCAmJiBsb2NhbEZvcm1hdHRpbmdUb2tlbnMudGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZShsb2NhbEZvcm1hdHRpbmdUb2tlbnMsIHJlcGxhY2VMb25nRGF0ZUZvcm1hdFRva2Vucyk7XG4gICAgICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgfVxuXG4gICAgdmFyIG1hdGNoMSAgICAgICAgID0gL1xcZC87ICAgICAgICAgICAgLy8gICAgICAgMCAtIDlcbiAgICB2YXIgbWF0Y2gyICAgICAgICAgPSAvXFxkXFxkLzsgICAgICAgICAgLy8gICAgICAwMCAtIDk5XG4gICAgdmFyIG1hdGNoMyAgICAgICAgID0gL1xcZHszfS87ICAgICAgICAgLy8gICAgIDAwMCAtIDk5OVxuICAgIHZhciBtYXRjaDQgICAgICAgICA9IC9cXGR7NH0vOyAgICAgICAgIC8vICAgIDAwMDAgLSA5OTk5XG4gICAgdmFyIG1hdGNoNiAgICAgICAgID0gL1srLV0/XFxkezZ9LzsgICAgLy8gLTk5OTk5OSAtIDk5OTk5OVxuICAgIHZhciBtYXRjaDF0bzIgICAgICA9IC9cXGRcXGQ/LzsgICAgICAgICAvLyAgICAgICAwIC0gOTlcbiAgICB2YXIgbWF0Y2gzdG80ICAgICAgPSAvXFxkXFxkXFxkXFxkPy87ICAgICAvLyAgICAgOTk5IC0gOTk5OVxuICAgIHZhciBtYXRjaDV0bzYgICAgICA9IC9cXGRcXGRcXGRcXGRcXGRcXGQ/LzsgLy8gICA5OTk5OSAtIDk5OTk5OVxuICAgIHZhciBtYXRjaDF0bzMgICAgICA9IC9cXGR7MSwzfS87ICAgICAgIC8vICAgICAgIDAgLSA5OTlcbiAgICB2YXIgbWF0Y2gxdG80ICAgICAgPSAvXFxkezEsNH0vOyAgICAgICAvLyAgICAgICAwIC0gOTk5OVxuICAgIHZhciBtYXRjaDF0bzYgICAgICA9IC9bKy1dP1xcZHsxLDZ9LzsgIC8vIC05OTk5OTkgLSA5OTk5OTlcblxuICAgIHZhciBtYXRjaFVuc2lnbmVkICA9IC9cXGQrLzsgICAgICAgICAgIC8vICAgICAgIDAgLSBpbmZcbiAgICB2YXIgbWF0Y2hTaWduZWQgICAgPSAvWystXT9cXGQrLzsgICAgICAvLyAgICAtaW5mIC0gaW5mXG5cbiAgICB2YXIgbWF0Y2hPZmZzZXQgICAgPSAvWnxbKy1dXFxkXFxkOj9cXGRcXGQvZ2k7IC8vICswMDowMCAtMDA6MDAgKzAwMDAgLTAwMDAgb3IgWlxuICAgIHZhciBtYXRjaFNob3J0T2Zmc2V0ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vZ2k7IC8vICswMCAtMDAgKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG5cbiAgICB2YXIgbWF0Y2hUaW1lc3RhbXAgPSAvWystXT9cXGQrKFxcLlxcZHsxLDN9KT8vOyAvLyAxMjM0NTY3ODkgMTIzNDU2Nzg5LjEyM1xuXG4gICAgLy8gYW55IHdvcmQgKG9yIHR3bykgY2hhcmFjdGVycyBvciBudW1iZXJzIGluY2x1ZGluZyB0d28vdGhyZWUgd29yZCBtb250aCBpbiBhcmFiaWMuXG4gICAgLy8gaW5jbHVkZXMgc2NvdHRpc2ggZ2FlbGljIHR3byB3b3JkIGFuZCBoeXBoZW5hdGVkIG1vbnRoc1xuICAgIHZhciBtYXRjaFdvcmQgPSAvWzAtOV0qWydhLXpcXHUwMEEwLVxcdTA1RkZcXHUwNzAwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdK3xbXFx1MDYwMC1cXHUwNkZGXFwvXSsoXFxzKj9bXFx1MDYwMC1cXHUwNkZGXSspezEsMn0vaTtcblxuXG4gICAgdmFyIHJlZ2V4ZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFJlZ2V4VG9rZW4gKHRva2VuLCByZWdleCwgc3RyaWN0UmVnZXgpIHtcbiAgICAgICAgcmVnZXhlc1t0b2tlbl0gPSBpc0Z1bmN0aW9uKHJlZ2V4KSA/IHJlZ2V4IDogZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGVEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gKGlzU3RyaWN0ICYmIHN0cmljdFJlZ2V4KSA/IHN0cmljdFJlZ2V4IDogcmVnZXg7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2VSZWdleEZvclRva2VuICh0b2tlbiwgY29uZmlnKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcChyZWdleGVzLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHVuZXNjYXBlRm9ybWF0KHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVnZXhlc1t0b2tlbl0oY29uZmlnLl9zdHJpY3QsIGNvbmZpZy5fbG9jYWxlKTtcbiAgICB9XG5cbiAgICAvLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTYxNDkzL2lzLXRoZXJlLWEtcmVnZXhwLWVzY2FwZS1mdW5jdGlvbi1pbi1qYXZhc2NyaXB0XG4gICAgZnVuY3Rpb24gdW5lc2NhcGVGb3JtYXQocykge1xuICAgICAgICByZXR1cm4gcmVnZXhFc2NhcGUocy5yZXBsYWNlKCdcXFxcJywgJycpLnJlcGxhY2UoL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZywgZnVuY3Rpb24gKG1hdGNoZWQsIHAxLCBwMiwgcDMsIHA0KSB7XG4gICAgICAgICAgICByZXR1cm4gcDEgfHwgcDIgfHwgcDMgfHwgcDQ7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWdleEVzY2FwZShzKSB7XG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xuICAgIH1cblxuICAgIHZhciB0b2tlbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFBhcnNlVG9rZW4gKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaSwgZnVuYyA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdG9rZW4gPSBbdG9rZW5dO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBmdW5jID0gZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2NhbGxiYWNrXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2VuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0b2tlbnNbdG9rZW5baV1dID0gZnVuYztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFdlZWtQYXJzZVRva2VuICh0b2tlbiwgY2FsbGJhY2spIHtcbiAgICAgICAgYWRkUGFyc2VUb2tlbih0b2tlbiwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICAgICAgY29uZmlnLl93ID0gY29uZmlnLl93IHx8IHt9O1xuICAgICAgICAgICAgY2FsbGJhY2soaW5wdXQsIGNvbmZpZy5fdywgY29uZmlnLCB0b2tlbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBpbnB1dCwgY29uZmlnKSB7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGhhc093blByb3AodG9rZW5zLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHRva2Vuc1t0b2tlbl0oaW5wdXQsIGNvbmZpZy5fYSwgY29uZmlnLCB0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgWUVBUiA9IDA7XG4gICAgdmFyIE1PTlRIID0gMTtcbiAgICB2YXIgREFURSA9IDI7XG4gICAgdmFyIEhPVVIgPSAzO1xuICAgIHZhciBNSU5VVEUgPSA0O1xuICAgIHZhciBTRUNPTkQgPSA1O1xuICAgIHZhciBNSUxMSVNFQ09ORCA9IDY7XG4gICAgdmFyIFdFRUsgPSA3O1xuICAgIHZhciBXRUVLREFZID0gODtcblxuICAgIHZhciBpbmRleE9mO1xuXG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7XG4gICAgICAgIGluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpbmRleE9mID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIC8vIEkga25vd1xuICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW2ldID09PSBvKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGggKyAxLCAwKSkuZ2V0VVRDRGF0ZSgpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNJywgWydNTScsIDJdLCAnTW8nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vbnRoKCkgKyAxO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTScsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRoc1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignTU1NTScsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRocyh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdtb250aCcsICdNJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdNJywgICAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdNTScsICAgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NTScsICBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLm1vbnRoc1Nob3J0UmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NTU0nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLm1vbnRoc1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydNJywgJ01NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTU9OVEhdID0gdG9JbnQoaW5wdXQpIC0gMTtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydNTU0nLCAnTU1NTSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciBtb250aCA9IGNvbmZpZy5fbG9jYWxlLm1vbnRoc1BhcnNlKGlucHV0LCB0b2tlbiwgY29uZmlnLl9zdHJpY3QpO1xuICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhIG1vbnRoIG5hbWUsIG1hcmsgdGhlIGRhdGUgYXMgaW52YWxpZC5cbiAgICAgICAgaWYgKG1vbnRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGFycmF5W01PTlRIXSA9IG1vbnRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZE1vbnRoID0gaW5wdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIHZhciBNT05USFNfSU5fRk9STUFUID0gL0Rbb0RdPyhcXFtbXlxcW1xcXV0qXFxdfFxccyspK01NTU0/LztcbiAgICB2YXIgZGVmYXVsdExvY2FsZU1vbnRocyA9ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRocyAobSwgZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHNbbS5tb250aCgpXSA6XG4gICAgICAgICAgICB0aGlzLl9tb250aHNbTU9OVEhTX0lOX0ZPUk1BVC50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0ID0gJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1Nob3J0IChtLCBmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzU2hvcnQpID8gdGhpcy5fbW9udGhzU2hvcnRbbS5tb250aCgpXSA6XG4gICAgICAgICAgICB0aGlzLl9tb250aHNTaG9ydFtNT05USFNfSU5fRk9STUFULnRlc3QoZm9ybWF0KSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXVttLm1vbnRoKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVuaXRzX21vbnRoX19oYW5kbGVTdHJpY3RQYXJzZShtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBpaSwgbW9tLCBsbGMgPSBtb250aE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLl9tb250aHNQYXJzZSkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3QgdXNlZFxuICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVfdXRjX19jcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gdGhpcy5tb250aHNTaG9ydChtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzKG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnTU1NJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnTU1NJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1BhcnNlIChtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdW5pdHNfbW9udGhfX2hhbmRsZVN0cmljdFBhcnNlLmNhbGwodGhpcywgbW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBhZGQgc29ydGluZ1xuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyXG4gICAgICAgIC8vIHNlZSBzb3J0aW5nIGluIGNvbXB1dGVNb250aHNQYXJzZVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVfdXRjX19jcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN0cmljdCAmJiAhdGhpcy5fbW9udGhzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICByZWdleCA9ICdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU1NJyAmJiB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU0nICYmIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fbW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBzZXRNb250aCAobW9tLCB2YWx1ZSkge1xuICAgICAgICB2YXIgZGF5T2ZNb250aDtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9JbnQodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEFub3RoZXIgc2lsZW50IGZhaWx1cmU/XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkYXlPZk1vbnRoID0gTWF0aC5taW4obW9tLmRhdGUoKSwgZGF5c0luTW9udGgobW9tLnllYXIoKSwgdmFsdWUpKTtcbiAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArICdNb250aCddKHZhbHVlLCBkYXlPZk1vbnRoKTtcbiAgICAgICAgcmV0dXJuIG1vbTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRNb250aCAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgIHV0aWxzX2hvb2tzX19ob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRfc2V0X19nZXQodGhpcywgJ01vbnRoJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREYXlzSW5Nb250aCAoKSB7XG4gICAgICAgIHJldHVybiBkYXlzSW5Nb250aCh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXggPSBtYXRjaFdvcmQ7XG4gICAgZnVuY3Rpb24gbW9udGhzU2hvcnRSZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlTW9udGhzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4IDogdGhpcy5fbW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TW9udGhzUmVnZXggPSBtYXRjaFdvcmQ7XG4gICAgZnVuY3Rpb24gbW9udGhzUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZU1vbnRoc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggOiB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNb250aHNQYXJzZSAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGNtcExlblJldihhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaG9ydFBpZWNlcyA9IFtdLCBsb25nUGllY2VzID0gW10sIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLCBtb207XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZV91dGNfX2NyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgc2hvcnRQaWVjZXMucHVzaCh0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXMucHVzaCh0aGlzLm1vbnRocyhtb20sICcnKSk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHRoaXMubW9udGhzKG1vbSwgJycpKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2godGhpcy5tb250aHNTaG9ydChtb20sICcnKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSBtb250aCAob3IgYWJicikgaXMgYSBwcmVmaXggb2YgYW5vdGhlciBpdFxuICAgICAgICAvLyB3aWxsIG1hdGNoIHRoZSBsb25nZXIgcGllY2UuXG4gICAgICAgIHNob3J0UGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbG9uZ1BpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIG1peGVkUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIHNob3J0UGllY2VzW2ldID0gcmVnZXhFc2NhcGUoc2hvcnRQaWVjZXNbaV0pO1xuICAgICAgICAgICAgbG9uZ1BpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKGxvbmdQaWVjZXNbaV0pO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShtaXhlZFBpZWNlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tb250aHNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB0aGlzLl9tb250aHNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgc2hvcnRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrT3ZlcmZsb3cgKG0pIHtcbiAgICAgICAgdmFyIG92ZXJmbG93O1xuICAgICAgICB2YXIgYSA9IG0uX2E7XG5cbiAgICAgICAgaWYgKGEgJiYgZ2V0UGFyc2luZ0ZsYWdzKG0pLm92ZXJmbG93ID09PSAtMikge1xuICAgICAgICAgICAgb3ZlcmZsb3cgPVxuICAgICAgICAgICAgICAgIGFbTU9OVEhdICAgICAgIDwgMCB8fCBhW01PTlRIXSAgICAgICA+IDExICA/IE1PTlRIIDpcbiAgICAgICAgICAgICAgICBhW0RBVEVdICAgICAgICA8IDEgfHwgYVtEQVRFXSAgICAgICAgPiBkYXlzSW5Nb250aChhW1lFQVJdLCBhW01PTlRIXSkgPyBEQVRFIDpcbiAgICAgICAgICAgICAgICBhW0hPVVJdICAgICAgICA8IDAgfHwgYVtIT1VSXSAgICAgICAgPiAyNCB8fCAoYVtIT1VSXSA9PT0gMjQgJiYgKGFbTUlOVVRFXSAhPT0gMCB8fCBhW1NFQ09ORF0gIT09IDAgfHwgYVtNSUxMSVNFQ09ORF0gIT09IDApKSA/IEhPVVIgOlxuICAgICAgICAgICAgICAgIGFbTUlOVVRFXSAgICAgIDwgMCB8fCBhW01JTlVURV0gICAgICA+IDU5ICA/IE1JTlVURSA6XG4gICAgICAgICAgICAgICAgYVtTRUNPTkRdICAgICAgPCAwIHx8IGFbU0VDT05EXSAgICAgID4gNTkgID8gU0VDT05EIDpcbiAgICAgICAgICAgICAgICBhW01JTExJU0VDT05EXSA8IDAgfHwgYVtNSUxMSVNFQ09ORF0gPiA5OTkgPyBNSUxMSVNFQ09ORCA6XG4gICAgICAgICAgICAgICAgLTE7XG5cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93RGF5T2ZZZWFyICYmIChvdmVyZmxvdyA8IFlFQVIgfHwgb3ZlcmZsb3cgPiBEQVRFKSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gREFURTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla3MgJiYgb3ZlcmZsb3cgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBXRUVLO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dXZWVrZGF5ICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFS0RBWTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLm92ZXJmbG93ID0gb3ZlcmZsb3c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBpc28gODYwMSByZWdleFxuICAgIC8vIDAwMDAtMDAtMDAgMDAwMC1XMDAgb3IgMDAwMC1XMDAtMCArIFQgKyAwMCBvciAwMDowMCBvciAwMDowMDowMCBvciAwMDowMDowMC4wMDAgKyArMDA6MDAgb3IgKzAwMDAgb3IgKzAwKVxuICAgIHZhciBleHRlbmRlZElzb1JlZ2V4ID0gL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KS0oPzpcXGRcXGQtXFxkXFxkfFdcXGRcXGQtXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86OlxcZFxcZCg/OjpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPy87XG4gICAgdmFyIGJhc2ljSXNvUmVnZXggPSAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pKD86XFxkXFxkXFxkXFxkfFdcXGRcXGRcXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzpcXGRcXGQoPzpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPy87XG5cbiAgICB2YXIgdHpSZWdleCA9IC9afFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/LztcblxuICAgIHZhciBpc29EYXRlcyA9IFtcbiAgICAgICAgWydZWVlZWVktTU0tREQnLCAvWystXVxcZHs2fS1cXGRcXGQtXFxkXFxkL10sXG4gICAgICAgIFsnWVlZWS1NTS1ERCcsIC9cXGR7NH0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICBbJ0dHR0ctW1ddV1ctRScsIC9cXGR7NH0tV1xcZFxcZC1cXGQvXSxcbiAgICAgICAgWydHR0dHLVtXXVdXJywgL1xcZHs0fS1XXFxkXFxkLywgZmFsc2VdLFxuICAgICAgICBbJ1lZWVktREREJywgL1xcZHs0fS1cXGR7M30vXSxcbiAgICAgICAgWydZWVlZLU1NJywgL1xcZHs0fS1cXGRcXGQvLCBmYWxzZV0sXG4gICAgICAgIFsnWVlZWVlZTU1ERCcsIC9bKy1dXFxkezEwfS9dLFxuICAgICAgICBbJ1lZWVlNTUREJywgL1xcZHs4fS9dLFxuICAgICAgICAvLyBZWVlZTU0gaXMgTk9UIGFsbG93ZWQgYnkgdGhlIHN0YW5kYXJkXG4gICAgICAgIFsnR0dHR1tXXVdXRScsIC9cXGR7NH1XXFxkezN9L10sXG4gICAgICAgIFsnR0dHR1tXXVdXJywgL1xcZHs0fVdcXGR7Mn0vLCBmYWxzZV0sXG4gICAgICAgIFsnWVlZWURERCcsIC9cXGR7N30vXVxuICAgIF07XG5cbiAgICAvLyBpc28gdGltZSBmb3JtYXRzIGFuZCByZWdleGVzXG4gICAgdmFyIGlzb1RpbWVzID0gW1xuICAgICAgICBbJ0hIOm1tOnNzLlNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGRcXC5cXGQrL10sXG4gICAgICAgIFsnSEg6bW06c3MsU1NTUycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZCxcXGQrL10sXG4gICAgICAgIFsnSEg6bW06c3MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQvXSxcbiAgICAgICAgWydISDptbScsIC9cXGRcXGQ6XFxkXFxkL10sXG4gICAgICAgIFsnSEhtbXNzLlNTU1MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkXFwuXFxkKy9dLFxuICAgICAgICBbJ0hIbW1zcyxTU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZCxcXGQrL10sXG4gICAgICAgIFsnSEhtbXNzJywgL1xcZFxcZFxcZFxcZFxcZFxcZC9dLFxuICAgICAgICBbJ0hIbW0nLCAvXFxkXFxkXFxkXFxkL10sXG4gICAgICAgIFsnSEgnLCAvXFxkXFxkL11cbiAgICBdO1xuXG4gICAgdmFyIGFzcE5ldEpzb25SZWdleCA9IC9eXFwvP0RhdGVcXCgoXFwtP1xcZCspL2k7XG5cbiAgICAvLyBkYXRlIGZyb20gaXNvIGZvcm1hdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21JU08oY29uZmlnKSB7XG4gICAgICAgIHZhciBpLCBsLFxuICAgICAgICAgICAgc3RyaW5nID0gY29uZmlnLl9pLFxuICAgICAgICAgICAgbWF0Y2ggPSBleHRlbmRlZElzb1JlZ2V4LmV4ZWMoc3RyaW5nKSB8fCBiYXNpY0lzb1JlZ2V4LmV4ZWMoc3RyaW5nKSxcbiAgICAgICAgICAgIGFsbG93VGltZSwgZGF0ZUZvcm1hdCwgdGltZUZvcm1hdCwgdHpGb3JtYXQ7XG5cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pc28gPSB0cnVlO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gaXNvRGF0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzb0RhdGVzW2ldWzFdLmV4ZWMobWF0Y2hbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQgPSBpc29EYXRlc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dUaW1lID0gaXNvRGF0ZXNbaV1bMl0gIT09IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0ZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb1RpbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNvVGltZXNbaV1bMV0uZXhlYyhtYXRjaFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzJdIHNob3VsZCBiZSAnVCcgb3Igc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVGb3JtYXQgPSAobWF0Y2hbMl0gfHwgJyAnKSArIGlzb1RpbWVzW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYWxsb3dUaW1lICYmIHRpbWVGb3JtYXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFs0XSkge1xuICAgICAgICAgICAgICAgIGlmICh0elJlZ2V4LmV4ZWMobWF0Y2hbNF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHR6Rm9ybWF0ID0gJ1onO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnLl9mID0gZGF0ZUZvcm1hdCArICh0aW1lRm9ybWF0IHx8ICcnKSArICh0ekZvcm1hdCB8fCAnJyk7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSBpc28gZm9ybWF0IG9yIGZhbGxiYWNrXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZyhjb25maWcpIHtcbiAgICAgICAgdmFyIG1hdGNoZWQgPSBhc3BOZXRKc29uUmVnZXguZXhlYyhjb25maWcuX2kpO1xuXG4gICAgICAgIGlmIChtYXRjaGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSgrbWF0Y2hlZFsxXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgICAgICAgICAgdXRpbHNfaG9va3NfX2hvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1dGlsc19ob29rc19faG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2sgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQgY29uc3RydWN0aW9uIGZhbGxzIGJhY2sgdG8ganMgRGF0ZS4gVGhpcyBpcyAnICtcbiAgICAgICAgJ2Rpc2NvdXJhZ2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdXBjb21pbmcgbWFqb3IgJyArXG4gICAgICAgICdyZWxlYXNlLiBQbGVhc2UgcmVmZXIgdG8gJyArXG4gICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTQwNyBmb3IgbW9yZSBpbmZvLicsXG4gICAgICAgIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGNvbmZpZy5faSArIChjb25maWcuX3VzZVVUQyA/ICcgVVRDJyA6ICcnKSk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlRGF0ZSAoeSwgbSwgZCwgaCwgTSwgcywgbXMpIHtcbiAgICAgICAgLy9jYW4ndCBqdXN0IGFwcGx5KCkgdG8gY3JlYXRlIGEgZGF0ZTpcbiAgICAgICAgLy9odHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE4MTM0OC9pbnN0YW50aWF0aW5nLWEtamF2YXNjcmlwdC1vYmplY3QtYnktY2FsbGluZy1wcm90b3R5cGUtY29uc3RydWN0b3ItYXBwbHlcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh5LCBtLCBkLCBoLCBNLCBzLCBtcyk7XG5cbiAgICAgICAgLy90aGUgZGF0ZSBjb25zdHJ1Y3RvciByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwICYmIGlzRmluaXRlKGRhdGUuZ2V0RnVsbFllYXIoKSkpIHtcbiAgICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVVRDRGF0ZSAoeSkge1xuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xuXG4gICAgICAgIC8vdGhlIERhdGUuVVRDIGZ1bmN0aW9uIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDAgJiYgaXNGaW5pdGUoZGF0ZS5nZXRVVENGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignWScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHkgPSB0aGlzLnllYXIoKTtcbiAgICAgICAgcmV0dXJuIHkgPD0gOTk5OSA/ICcnICsgeSA6ICcrJyArIHk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZJywgICA0XSwgICAgICAgMCwgJ3llYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVlZJywgIDVdLCAgICAgICAwLCAneWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWVlZJywgNiwgdHJ1ZV0sIDAsICd5ZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3llYXInLCAneScpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWScsICAgICAgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZJywgICAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVknLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZWScsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydZWVlZWScsICdZWVlZWVknXSwgWUVBUik7XG4gICAgYWRkUGFyc2VUb2tlbignWVlZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPSBpbnB1dC5sZW5ndGggPT09IDIgPyB1dGlsc19ob29rc19faG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpIDogdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1lZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9IHV0aWxzX2hvb2tzX19ob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPSBwYXJzZUludChpbnB1dCwgMTApO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgZnVuY3Rpb24gZGF5c0luWWVhcih5ZWFyKSB7XG4gICAgICAgIHJldHVybiBpc0xlYXBZZWFyKHllYXIpID8gMzY2IDogMzY1O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gKHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDApIHx8IHllYXIgJSA0MDAgPT09IDA7XG4gICAgfVxuXG4gICAgLy8gSE9PS1NcblxuICAgIHV0aWxzX2hvb2tzX19ob29rcy5wYXJzZVR3b0RpZ2l0WWVhciA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gdG9JbnQoaW5wdXQpICsgKHRvSW50KGlucHV0KSA+IDY4ID8gMTkwMCA6IDIwMDApO1xuICAgIH07XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0WWVhciA9IG1ha2VHZXRTZXQoJ0Z1bGxZZWFyJywgdHJ1ZSk7XG5cbiAgICBmdW5jdGlvbiBnZXRJc0xlYXBZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0LW9mLWZpcnN0LXdlZWsgLSBzdGFydC1vZi15ZWFyXG4gICAgZnVuY3Rpb24gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciAvLyBmaXJzdC13ZWVrIGRheSAtLSB3aGljaCBqYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayAoNCBmb3IgaXNvLCAxIGZvciBvdGhlcilcbiAgICAgICAgICAgIGZ3ZCA9IDcgKyBkb3cgLSBkb3ksXG4gICAgICAgICAgICAvLyBmaXJzdC13ZWVrIGRheSBsb2NhbCB3ZWVrZGF5IC0tIHdoaWNoIGxvY2FsIHdlZWtkYXkgaXMgZndkXG4gICAgICAgICAgICBmd2RsdyA9ICg3ICsgY3JlYXRlVVRDRGF0ZSh5ZWFyLCAwLCBmd2QpLmdldFVUQ0RheSgpIC0gZG93KSAlIDc7XG5cbiAgICAgICAgcmV0dXJuIC1md2RsdyArIGZ3ZCAtIDE7XG4gICAgfVxuXG4gICAgLy9odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGUjQ2FsY3VsYXRpbmdfYV9kYXRlX2dpdmVuX3RoZV95ZWFyLjJDX3dlZWtfbnVtYmVyX2FuZF93ZWVrZGF5XG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtzKHllYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBsb2NhbFdlZWtkYXkgPSAoNyArIHdlZWtkYXkgLSBkb3cpICUgNyxcbiAgICAgICAgICAgIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpLFxuICAgICAgICAgICAgZGF5T2ZZZWFyID0gMSArIDcgKiAod2VlayAtIDEpICsgbG9jYWxXZWVrZGF5ICsgd2Vla09mZnNldCxcbiAgICAgICAgICAgIHJlc1llYXIsIHJlc0RheU9mWWVhcjtcblxuICAgICAgICBpZiAoZGF5T2ZZZWFyIDw9IDApIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyIC0gMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheXNJblllYXIocmVzWWVhcikgKyBkYXlPZlllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyKSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXIgKyAxO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyIC0gZGF5c0luWWVhcih5ZWFyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXIsXG4gICAgICAgICAgICBkYXlPZlllYXI6IHJlc0RheU9mWWVhclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtPZlllYXIobW9tLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldChtb20ueWVhcigpLCBkb3csIGRveSksXG4gICAgICAgICAgICB3ZWVrID0gTWF0aC5mbG9vcigobW9tLmRheU9mWWVhcigpIC0gd2Vla09mZnNldCAtIDEpIC8gNykgKyAxLFxuICAgICAgICAgICAgcmVzV2VlaywgcmVzWWVhcjtcblxuICAgICAgICBpZiAod2VlayA8IDEpIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpIC0gMTtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrICsgd2Vla3NJblllYXIocmVzWWVhciwgZG93LCBkb3kpO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWsgPiB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSkpIHtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrIC0gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCk7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3ZWVrOiByZXNXZWVrLFxuICAgICAgICAgICAgeWVhcjogcmVzWWVhclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtzSW5ZZWFyKHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIHdlZWtPZmZzZXROZXh0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIgKyAxLCBkb3csIGRveSk7XG4gICAgICAgIHJldHVybiAoZGF5c0luWWVhcih5ZWFyKSAtIHdlZWtPZmZzZXQgKyB3ZWVrT2Zmc2V0TmV4dCkgLyA3O1xuICAgIH1cblxuICAgIC8vIFBpY2sgdGhlIGZpcnN0IGRlZmluZWQgb2YgdHdvIG9yIHRocmVlIGFyZ3VtZW50cy5cbiAgICBmdW5jdGlvbiBkZWZhdWx0cyhhLCBiLCBjKSB7XG4gICAgICAgIGlmIChhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGN1cnJlbnREYXRlQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIC8vIGhvb2tzIGlzIGFjdHVhbGx5IHRoZSBleHBvcnRlZCBtb21lbnQgb2JqZWN0XG4gICAgICAgIHZhciBub3dWYWx1ZSA9IG5ldyBEYXRlKHV0aWxzX2hvb2tzX19ob29rcy5ub3coKSk7XG4gICAgICAgIGlmIChjb25maWcuX3VzZVVUQykge1xuICAgICAgICAgICAgcmV0dXJuIFtub3dWYWx1ZS5nZXRVVENGdWxsWWVhcigpLCBub3dWYWx1ZS5nZXRVVENNb250aCgpLCBub3dWYWx1ZS5nZXRVVENEYXRlKCldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbbm93VmFsdWUuZ2V0RnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0TW9udGgoKSwgbm93VmFsdWUuZ2V0RGF0ZSgpXTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IGFuIGFycmF5IHRvIGEgZGF0ZS5cbiAgICAvLyB0aGUgYXJyYXkgc2hvdWxkIG1pcnJvciB0aGUgcGFyYW1ldGVycyBiZWxvd1xuICAgIC8vIG5vdGU6IGFsbCB2YWx1ZXMgcGFzdCB0aGUgeWVhciBhcmUgb3B0aW9uYWwgYW5kIHdpbGwgZGVmYXVsdCB0byB0aGUgbG93ZXN0IHBvc3NpYmxlIHZhbHVlLlxuICAgIC8vIFt5ZWFyLCBtb250aCwgZGF5ICwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kXVxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21BcnJheSAoY29uZmlnKSB7XG4gICAgICAgIHZhciBpLCBkYXRlLCBpbnB1dCA9IFtdLCBjdXJyZW50RGF0ZSwgeWVhclRvVXNlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGVBcnJheShjb25maWcpO1xuXG4gICAgICAgIC8vY29tcHV0ZSBkYXkgb2YgdGhlIHllYXIgZnJvbSB3ZWVrcyBhbmQgd2Vla2RheXNcbiAgICAgICAgaWYgKGNvbmZpZy5fdyAmJiBjb25maWcuX2FbREFURV0gPT0gbnVsbCAmJiBjb25maWcuX2FbTU9OVEhdID09IG51bGwpIHtcbiAgICAgICAgICAgIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiB0aGUgZGF5IG9mIHRoZSB5ZWFyIGlzIHNldCwgZmlndXJlIG91dCB3aGF0IGl0IGlzXG4gICAgICAgIGlmIChjb25maWcuX2RheU9mWWVhcikge1xuICAgICAgICAgICAgeWVhclRvVXNlID0gZGVmYXVsdHMoY29uZmlnLl9hW1lFQVJdLCBjdXJyZW50RGF0ZVtZRUFSXSk7XG5cbiAgICAgICAgICAgIGlmIChjb25maWcuX2RheU9mWWVhciA+IGRheXNJblllYXIoeWVhclRvVXNlKSkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd0RheU9mWWVhciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGUgPSBjcmVhdGVVVENEYXRlKHllYXJUb1VzZSwgMCwgY29uZmlnLl9kYXlPZlllYXIpO1xuICAgICAgICAgICAgY29uZmlnLl9hW01PTlRIXSA9IGRhdGUuZ2V0VVRDTW9udGgoKTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtEQVRFXSA9IGRhdGUuZ2V0VVRDRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IGRhdGUuXG4gICAgICAgIC8vICogaWYgbm8geWVhciwgbW9udGgsIGRheSBvZiBtb250aCBhcmUgZ2l2ZW4sIGRlZmF1bHQgdG8gdG9kYXlcbiAgICAgICAgLy8gKiBpZiBkYXkgb2YgbW9udGggaXMgZ2l2ZW4sIGRlZmF1bHQgbW9udGggYW5kIHllYXJcbiAgICAgICAgLy8gKiBpZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBvbmx5IHllYXJcbiAgICAgICAgLy8gKiBpZiB5ZWFyIGlzIGdpdmVuLCBkb24ndCBkZWZhdWx0IGFueXRoaW5nXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzICYmIGNvbmZpZy5fYVtpXSA9PSBudWxsOyArK2kpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID0gY3VycmVudERhdGVbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBaZXJvIG91dCB3aGF0ZXZlciB3YXMgbm90IGRlZmF1bHRlZCwgaW5jbHVkaW5nIHRpbWVcbiAgICAgICAgZm9yICg7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID0gKGNvbmZpZy5fYVtpXSA9PSBudWxsKSA/IChpID09PSAyID8gMSA6IDApIDogY29uZmlnLl9hW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIDI0OjAwOjAwLjAwMFxuICAgICAgICBpZiAoY29uZmlnLl9hW0hPVVJdID09PSAyNCAmJlxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtNSU5VVEVdID09PSAwICYmXG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW1NFQ09ORF0gPT09IDAgJiZcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbTUlMTElTRUNPTkRdID09PSAwKSB7XG4gICAgICAgICAgICBjb25maWcuX25leHREYXkgPSB0cnVlO1xuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZy5fZCA9IChjb25maWcuX3VzZVVUQyA/IGNyZWF0ZVVUQ0RhdGUgOiBjcmVhdGVEYXRlKS5hcHBseShudWxsLCBpbnB1dCk7XG4gICAgICAgIC8vIEFwcGx5IHRpbWV6b25lIG9mZnNldCBmcm9tIGlucHV0LiBUaGUgYWN0dWFsIHV0Y09mZnNldCBjYW4gYmUgY2hhbmdlZFxuICAgICAgICAvLyB3aXRoIHBhcnNlWm9uZS5cbiAgICAgICAgaWYgKGNvbmZpZy5fdHptICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZC5zZXRVVENNaW51dGVzKGNvbmZpZy5fZC5nZXRVVENNaW51dGVzKCkgLSBjb25maWcuX3R6bSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLl9uZXh0RGF5KSB7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAyNDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpIHtcbiAgICAgICAgdmFyIHcsIHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSwgdGVtcCwgd2Vla2RheU92ZXJmbG93O1xuXG4gICAgICAgIHcgPSBjb25maWcuX3c7XG4gICAgICAgIGlmICh3LkdHICE9IG51bGwgfHwgdy5XICE9IG51bGwgfHwgdy5FICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRvdyA9IDE7XG4gICAgICAgICAgICBkb3kgPSA0O1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBXZSBuZWVkIHRvIHRha2UgdGhlIGN1cnJlbnQgaXNvV2Vla1llYXIsIGJ1dCB0aGF0IGRlcGVuZHMgb25cbiAgICAgICAgICAgIC8vIGhvdyB3ZSBpbnRlcnByZXQgbm93IChsb2NhbCwgdXRjLCBmaXhlZCBvZmZzZXQpLiBTbyBjcmVhdGVcbiAgICAgICAgICAgIC8vIGEgbm93IHZlcnNpb24gb2YgY3VycmVudCBjb25maWcgKHRha2UgbG9jYWwvdXRjL29mZnNldCBmbGFncywgYW5kXG4gICAgICAgICAgICAvLyBjcmVhdGUgbm93KS5cbiAgICAgICAgICAgIHdlZWtZZWFyID0gZGVmYXVsdHMody5HRywgY29uZmlnLl9hW1lFQVJdLCB3ZWVrT2ZZZWFyKGxvY2FsX19jcmVhdGVMb2NhbCgpLCAxLCA0KS55ZWFyKTtcbiAgICAgICAgICAgIHdlZWsgPSBkZWZhdWx0cyh3LlcsIDEpO1xuICAgICAgICAgICAgd2Vla2RheSA9IGRlZmF1bHRzKHcuRSwgMSk7XG4gICAgICAgICAgICBpZiAod2Vla2RheSA8IDEgfHwgd2Vla2RheSA+IDcpIHtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG93ID0gY29uZmlnLl9sb2NhbGUuX3dlZWsuZG93O1xuICAgICAgICAgICAgZG95ID0gY29uZmlnLl9sb2NhbGUuX3dlZWsuZG95O1xuXG4gICAgICAgICAgICB3ZWVrWWVhciA9IGRlZmF1bHRzKHcuZ2csIGNvbmZpZy5fYVtZRUFSXSwgd2Vla09mWWVhcihsb2NhbF9fY3JlYXRlTG9jYWwoKSwgZG93LCBkb3kpLnllYXIpO1xuICAgICAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcudywgMSk7XG5cbiAgICAgICAgICAgIGlmICh3LmQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIHdlZWtkYXkgLS0gbG93IGRheSBudW1iZXJzIGFyZSBjb25zaWRlcmVkIG5leHQgd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSB3LmQ7XG4gICAgICAgICAgICAgICAgaWYgKHdlZWtkYXkgPCAwIHx8IHdlZWtkYXkgPiA2KSB7XG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh3LmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGxvY2FsIHdlZWtkYXkgLS0gY291bnRpbmcgc3RhcnRzIGZyb20gYmVnaW5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSB3LmUgKyBkb3c7XG4gICAgICAgICAgICAgICAgaWYgKHcuZSA8IDAgfHwgdy5lID4gNikge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBiZWdpbmluZyBvZiB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IGRvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2VlayA8IDEgfHwgd2VlayA+IHdlZWtzSW5ZZWFyKHdlZWtZZWFyLCBkb3csIGRveSkpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd1dlZWtzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWVrZGF5T3ZlcmZsb3cgIT0gbnVsbCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93V2Vla2RheSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZW1wID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSk7XG4gICAgICAgICAgICBjb25maWcuX2FbWUVBUl0gPSB0ZW1wLnllYXI7XG4gICAgICAgICAgICBjb25maWcuX2RheU9mWWVhciA9IHRlbXAuZGF5T2ZZZWFyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc3RhbnQgdGhhdCByZWZlcnMgdG8gdGhlIElTTyBzdGFuZGFyZFxuICAgIHV0aWxzX2hvb2tzX19ob29rcy5JU09fODYwMSA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZ1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyB0byBhbm90aGVyIHBhcnQgb2YgdGhlIGNyZWF0aW9uIGZsb3cgdG8gcHJldmVudCBjaXJjdWxhciBkZXBzXG4gICAgICAgIGlmIChjb25maWcuX2YgPT09IHV0aWxzX2hvb2tzX19ob29rcy5JU09fODYwMSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbUlTTyhjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnLl9hID0gW107XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVtcHR5ID0gdHJ1ZTtcblxuICAgICAgICAvLyBUaGlzIGFycmF5IGlzIHVzZWQgdG8gbWFrZSBhIERhdGUsIGVpdGhlciB3aXRoIGBuZXcgRGF0ZWAgb3IgYERhdGUuVVRDYFxuICAgICAgICB2YXIgc3RyaW5nID0gJycgKyBjb25maWcuX2ksXG4gICAgICAgICAgICBpLCBwYXJzZWRJbnB1dCwgdG9rZW5zLCB0b2tlbiwgc2tpcHBlZCxcbiAgICAgICAgICAgIHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG4gICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoID0gMDtcblxuICAgICAgICB0b2tlbnMgPSBleHBhbmRGb3JtYXQoY29uZmlnLl9mLCBjb25maWcuX2xvY2FsZSkubWF0Y2goZm9ybWF0dGluZ1Rva2VucykgfHwgW107XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV07XG4gICAgICAgICAgICBwYXJzZWRJbnB1dCA9IChzdHJpbmcubWF0Y2goZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpKSB8fCBbXSlbMF07XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygndG9rZW4nLCB0b2tlbiwgJ3BhcnNlZElucHV0JywgcGFyc2VkSW5wdXQsXG4gICAgICAgICAgICAvLyAgICAgICAgICdyZWdleCcsIGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSk7XG4gICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBza2lwcGVkID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkpO1xuICAgICAgICAgICAgICAgIGlmIChza2lwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChza2lwcGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKHN0cmluZy5pbmRleE9mKHBhcnNlZElucHV0KSArIHBhcnNlZElucHV0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCArPSBwYXJzZWRJbnB1dC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkb24ndCBwYXJzZSBpZiBpdCdzIG5vdCBhIGtub3duIHRva2VuXG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVtcHR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBwYXJzZWRJbnB1dCwgY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbmZpZy5fc3RyaWN0ICYmICFwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCByZW1haW5pbmcgdW5wYXJzZWQgaW5wdXQgbGVuZ3RoIHRvIHRoZSBzdHJpbmdcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuY2hhcnNMZWZ0T3ZlciA9IHN0cmluZ0xlbmd0aCAtIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGg7XG4gICAgICAgIGlmIChzdHJpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChzdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYXIgXzEyaCBmbGFnIGlmIGhvdXIgaXMgPD0gMTJcbiAgICAgICAgaWYgKGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPD0gMTIgJiZcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPiAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykucGFyc2VkRGF0ZVBhcnRzID0gY29uZmlnLl9hLnNsaWNlKDApO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5tZXJpZGllbSA9IGNvbmZpZy5fbWVyaWRpZW07XG4gICAgICAgIC8vIGhhbmRsZSBtZXJpZGllbVxuICAgICAgICBjb25maWcuX2FbSE9VUl0gPSBtZXJpZGllbUZpeFdyYXAoY29uZmlnLl9sb2NhbGUsIGNvbmZpZy5fYVtIT1VSXSwgY29uZmlnLl9tZXJpZGllbSk7XG5cbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgICAgIGNoZWNrT3ZlcmZsb3coY29uZmlnKTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtRml4V3JhcCAobG9jYWxlLCBob3VyLCBtZXJpZGllbSkge1xuICAgICAgICB2YXIgaXNQbTtcblxuICAgICAgICBpZiAobWVyaWRpZW0gPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gbm90aGluZyB0byBkb1xuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsZS5tZXJpZGllbUhvdXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS5tZXJpZGllbUhvdXIoaG91ciwgbWVyaWRpZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZS5pc1BNICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrXG4gICAgICAgICAgICBpc1BtID0gbG9jYWxlLmlzUE0obWVyaWRpZW0pO1xuICAgICAgICAgICAgaWYgKGlzUG0gJiYgaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciArPSAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNQbSAmJiBob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW5cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgYXJyYXkgb2YgZm9ybWF0IHN0cmluZ3NcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIHZhciB0ZW1wQ29uZmlnLFxuICAgICAgICAgICAgYmVzdE1vbWVudCxcblxuICAgICAgICAgICAgc2NvcmVUb0JlYXQsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgY3VycmVudFNjb3JlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2YubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkRm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKE5hTik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLl9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgPSAwO1xuICAgICAgICAgICAgdGVtcENvbmZpZyA9IGNvcHlDb25maWcoe30sIGNvbmZpZyk7XG4gICAgICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRlbXBDb25maWcuX3VzZVVUQyA9IGNvbmZpZy5fdXNlVVRDO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGVtcENvbmZpZy5fZiA9IGNvbmZpZy5fZltpXTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQodGVtcENvbmZpZyk7XG5cbiAgICAgICAgICAgIGlmICghdmFsaWRfX2lzVmFsaWQodGVtcENvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW55IGlucHV0IHRoYXQgd2FzIG5vdCBwYXJzZWQgYWRkIGEgcGVuYWx0eSBmb3IgdGhhdCBmb3JtYXRcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuY2hhcnNMZWZ0T3ZlcjtcblxuICAgICAgICAgICAgLy9vciB0b2tlbnNcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykudW51c2VkVG9rZW5zLmxlbmd0aCAqIDEwO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuc2NvcmUgPSBjdXJyZW50U2NvcmU7XG5cbiAgICAgICAgICAgIGlmIChzY29yZVRvQmVhdCA9PSBudWxsIHx8IGN1cnJlbnRTY29yZSA8IHNjb3JlVG9CZWF0KSB7XG4gICAgICAgICAgICAgICAgc2NvcmVUb0JlYXQgPSBjdXJyZW50U2NvcmU7XG4gICAgICAgICAgICAgICAgYmVzdE1vbWVudCA9IHRlbXBDb25maWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBleHRlbmQoY29uZmlnLCBiZXN0TW9tZW50IHx8IHRlbXBDb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21PYmplY3QoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpID0gbm9ybWFsaXplT2JqZWN0VW5pdHMoY29uZmlnLl9pKTtcbiAgICAgICAgY29uZmlnLl9hID0gbWFwKFtpLnllYXIsIGkubW9udGgsIGkuZGF5IHx8IGkuZGF0ZSwgaS5ob3VyLCBpLm1pbnV0ZSwgaS5zZWNvbmQsIGkubWlsbGlzZWNvbmRdLCBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqICYmIHBhcnNlSW50KG9iaiwgMTApO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVGcm9tQ29uZmlnIChjb25maWcpIHtcbiAgICAgICAgdmFyIHJlcyA9IG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhwcmVwYXJlQ29uZmlnKGNvbmZpZykpKTtcbiAgICAgICAgaWYgKHJlcy5fbmV4dERheSkge1xuICAgICAgICAgICAgLy8gQWRkaW5nIGlzIHNtYXJ0IGVub3VnaCBhcm91bmQgRFNUXG4gICAgICAgICAgICByZXMuYWRkKDEsICdkJyk7XG4gICAgICAgICAgICByZXMuX25leHREYXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXBhcmVDb25maWcgKGNvbmZpZykge1xuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBmb3JtYXQgPSBjb25maWcuX2Y7XG5cbiAgICAgICAgY29uZmlnLl9sb2NhbGUgPSBjb25maWcuX2xvY2FsZSB8fCBsb2NhbGVfbG9jYWxlc19fZ2V0TG9jYWxlKGNvbmZpZy5fbCk7XG5cbiAgICAgICAgaWYgKGlucHV0ID09PSBudWxsIHx8IChmb3JtYXQgPT09IHVuZGVmaW5lZCAmJiBpbnB1dCA9PT0gJycpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRfX2NyZWF0ZUludmFsaWQoe251bGxJbnB1dDogdHJ1ZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faSA9IGlucHV0ID0gY29uZmlnLl9sb2NhbGUucHJlcGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTW9tZW50KGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhpbnB1dCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZm9ybWF0KSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0KSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gaW5wdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWdGcm9tSW5wdXQoY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsaWRfX2lzVmFsaWQoY29uZmlnKSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUlucHV0KGNvbmZpZykge1xuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2k7XG4gICAgICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSh1dGlsc19ob29rc19faG9va3Mubm93KCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0LnZhbHVlT2YoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZyhjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2EgPSBtYXAoaW5wdXQuc2xpY2UoMCksIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZihpbnB1dCkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tT2JqZWN0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKGlucHV0KSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIC8vIGZyb20gbWlsbGlzZWNvbmRzXG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShpbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1dGlsc19ob29rc19faG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2soY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxvY2FsT3JVVEMgKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCBpc1VUQykge1xuICAgICAgICB2YXIgYyA9IHt9O1xuXG4gICAgICAgIGlmICh0eXBlb2YobG9jYWxlKSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBzdHJpY3QgPSBsb2NhbGU7XG4gICAgICAgICAgICBsb2NhbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb2JqZWN0IGNvbnN0cnVjdGlvbiBtdXN0IGJlIGRvbmUgdGhpcyB3YXkuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNDIzXG4gICAgICAgIGMuX2lzQU1vbWVudE9iamVjdCA9IHRydWU7XG4gICAgICAgIGMuX3VzZVVUQyA9IGMuX2lzVVRDID0gaXNVVEM7XG4gICAgICAgIGMuX2wgPSBsb2NhbGU7XG4gICAgICAgIGMuX2kgPSBpbnB1dDtcbiAgICAgICAgYy5fZiA9IGZvcm1hdDtcbiAgICAgICAgYy5fc3RyaWN0ID0gc3RyaWN0O1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVGcm9tQ29uZmlnKGMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsX19jcmVhdGVMb2NhbCAoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG90eXBlTWluID0gZGVwcmVjYXRlKFxuICAgICAgICAgJ21vbWVudCgpLm1pbiBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1heCBpbnN0ZWFkLiBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTU0OCcsXG4gICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgdmFyIG90aGVyID0gbG9jYWxfX2NyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPCB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZF9fY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgKTtcblxuICAgIHZhciBwcm90b3R5cGVNYXggPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5tYXggaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5taW4gaW5zdGVhZC4gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE1NDgnLFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb3RoZXIgPSBsb2NhbF9fY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPiB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRfX2NyZWF0ZUludmFsaWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBQaWNrIGEgbW9tZW50IG0gZnJvbSBtb21lbnRzIHNvIHRoYXQgbVtmbl0ob3RoZXIpIGlzIHRydWUgZm9yIGFsbFxuICAgIC8vIG90aGVyLiBUaGlzIHJlbGllcyBvbiB0aGUgZnVuY3Rpb24gZm4gdG8gYmUgdHJhbnNpdGl2ZS5cbiAgICAvL1xuICAgIC8vIG1vbWVudHMgc2hvdWxkIGVpdGhlciBiZSBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cyBvciBhbiBhcnJheSwgd2hvc2VcbiAgICAvLyBmaXJzdCBlbGVtZW50IGlzIGFuIGFycmF5IG9mIG1vbWVudCBvYmplY3RzLlxuICAgIGZ1bmN0aW9uIHBpY2tCeShmbiwgbW9tZW50cykge1xuICAgICAgICB2YXIgcmVzLCBpO1xuICAgICAgICBpZiAobW9tZW50cy5sZW5ndGggPT09IDEgJiYgaXNBcnJheShtb21lbnRzWzBdKSkge1xuICAgICAgICAgICAgbW9tZW50cyA9IG1vbWVudHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtb21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsX19jcmVhdGVMb2NhbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJlcyA9IG1vbWVudHNbMF07XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBtb21lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoIW1vbWVudHNbaV0uaXNWYWxpZCgpIHx8IG1vbWVudHNbaV1bZm5dKHJlcykpIHtcbiAgICAgICAgICAgICAgICByZXMgPSBtb21lbnRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogVXNlIFtdLnNvcnQgaW5zdGVhZD9cbiAgICBmdW5jdGlvbiBtaW4gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgICAgICByZXR1cm4gcGlja0J5KCdpc0JlZm9yZScsIGFyZ3MpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1heCAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgICAgIHJldHVybiBwaWNrQnkoJ2lzQWZ0ZXInLCBhcmdzKTtcbiAgICB9XG5cbiAgICB2YXIgbm93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gRGF0ZS5ub3cgPyBEYXRlLm5vdygpIDogKyhuZXcgRGF0ZSgpKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gRHVyYXRpb24gKGR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSBub3JtYWxpemVPYmplY3RVbml0cyhkdXJhdGlvbiksXG4gICAgICAgICAgICB5ZWFycyA9IG5vcm1hbGl6ZWRJbnB1dC55ZWFyIHx8IDAsXG4gICAgICAgICAgICBxdWFydGVycyA9IG5vcm1hbGl6ZWRJbnB1dC5xdWFydGVyIHx8IDAsXG4gICAgICAgICAgICBtb250aHMgPSBub3JtYWxpemVkSW5wdXQubW9udGggfHwgMCxcbiAgICAgICAgICAgIHdlZWtzID0gbm9ybWFsaXplZElucHV0LndlZWsgfHwgMCxcbiAgICAgICAgICAgIGRheXMgPSBub3JtYWxpemVkSW5wdXQuZGF5IHx8IDAsXG4gICAgICAgICAgICBob3VycyA9IG5vcm1hbGl6ZWRJbnB1dC5ob3VyIHx8IDAsXG4gICAgICAgICAgICBtaW51dGVzID0gbm9ybWFsaXplZElucHV0Lm1pbnV0ZSB8fCAwLFxuICAgICAgICAgICAgc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5zZWNvbmQgfHwgMCxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5taWxsaXNlY29uZCB8fCAwO1xuXG4gICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIGZvciBkYXRlQWRkUmVtb3ZlXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9ICttaWxsaXNlY29uZHMgK1xuICAgICAgICAgICAgc2Vjb25kcyAqIDFlMyArIC8vIDEwMDBcbiAgICAgICAgICAgIG1pbnV0ZXMgKiA2ZTQgKyAvLyAxMDAwICogNjBcbiAgICAgICAgICAgIGhvdXJzICogMTAwMCAqIDYwICogNjA7IC8vdXNpbmcgMTAwMCAqIDYwICogNjAgaW5zdGVhZCBvZiAzNmU1IHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9ycyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMjk3OFxuICAgICAgICAvLyBCZWNhdXNlIG9mIGRhdGVBZGRSZW1vdmUgdHJlYXRzIDI0IGhvdXJzIGFzIGRpZmZlcmVudCBmcm9tIGFcbiAgICAgICAgLy8gZGF5IHdoZW4gd29ya2luZyBhcm91bmQgRFNULCB3ZSBuZWVkIHRvIHN0b3JlIHRoZW0gc2VwYXJhdGVseVxuICAgICAgICB0aGlzLl9kYXlzID0gK2RheXMgK1xuICAgICAgICAgICAgd2Vla3MgKiA3O1xuICAgICAgICAvLyBJdCBpcyBpbXBvc3NpYmxlIHRyYW5zbGF0ZSBtb250aHMgaW50byBkYXlzIHdpdGhvdXQga25vd2luZ1xuICAgICAgICAvLyB3aGljaCBtb250aHMgeW91IGFyZSBhcmUgdGFsa2luZyBhYm91dCwgc28gd2UgaGF2ZSB0byBzdG9yZVxuICAgICAgICAvLyBpdCBzZXBhcmF0ZWx5LlxuICAgICAgICB0aGlzLl9tb250aHMgPSArbW9udGhzICtcbiAgICAgICAgICAgIHF1YXJ0ZXJzICogMyArXG4gICAgICAgICAgICB5ZWFycyAqIDEyO1xuXG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcblxuICAgICAgICB0aGlzLl9sb2NhbGUgPSBsb2NhbGVfbG9jYWxlc19fZ2V0TG9jYWxlKCk7XG5cbiAgICAgICAgdGhpcy5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvbiAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEdXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBmdW5jdGlvbiBvZmZzZXQgKHRva2VuLCBzZXBhcmF0b3IpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4odG9rZW4sIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnV0Y09mZnNldCgpO1xuICAgICAgICAgICAgdmFyIHNpZ24gPSAnKyc7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7XG4gICAgICAgICAgICAgICAgc2lnbiA9ICctJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzaWduICsgemVyb0ZpbGwofn4ob2Zmc2V0IC8gNjApLCAyKSArIHNlcGFyYXRvciArIHplcm9GaWxsKH5+KG9mZnNldCkgJSA2MCwgMik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9mZnNldCgnWicsICc6Jyk7XG4gICAgb2Zmc2V0KCdaWicsICcnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1onLCAgbWF0Y2hTaG9ydE9mZnNldCk7XG4gICAgYWRkUmVnZXhUb2tlbignWlonLCBtYXRjaFNob3J0T2Zmc2V0KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnWicsICdaWiddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl91c2VVVEMgPSB0cnVlO1xuICAgICAgICBjb25maWcuX3R6bSA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hTaG9ydE9mZnNldCwgaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gdGltZXpvbmUgY2h1bmtlclxuICAgIC8vICcrMTA6MDAnID4gWycxMCcsICAnMDAnXVxuICAgIC8vICctMTUzMCcgID4gWyctMTUnLCAnMzAnXVxuICAgIHZhciBjaHVua09mZnNldCA9IC8oW1xcK1xcLV18XFxkXFxkKS9naTtcblxuICAgIGZ1bmN0aW9uIG9mZnNldEZyb21TdHJpbmcobWF0Y2hlciwgc3RyaW5nKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gKChzdHJpbmcgfHwgJycpLm1hdGNoKG1hdGNoZXIpIHx8IFtdKTtcbiAgICAgICAgdmFyIGNodW5rICAgPSBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0gfHwgW107XG4gICAgICAgIHZhciBwYXJ0cyAgID0gKGNodW5rICsgJycpLm1hdGNoKGNodW5rT2Zmc2V0KSB8fCBbJy0nLCAwLCAwXTtcbiAgICAgICAgdmFyIG1pbnV0ZXMgPSArKHBhcnRzWzFdICogNjApICsgdG9JbnQocGFydHNbMl0pO1xuXG4gICAgICAgIHJldHVybiBwYXJ0c1swXSA9PT0gJysnID8gbWludXRlcyA6IC1taW51dGVzO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBhIG1vbWVudCBmcm9tIGlucHV0LCB0aGF0IGlzIGxvY2FsL3V0Yy96b25lIGVxdWl2YWxlbnQgdG8gbW9kZWwuXG4gICAgZnVuY3Rpb24gY2xvbmVXaXRoT2Zmc2V0KGlucHV0LCBtb2RlbCkge1xuICAgICAgICB2YXIgcmVzLCBkaWZmO1xuICAgICAgICBpZiAobW9kZWwuX2lzVVRDKSB7XG4gICAgICAgICAgICByZXMgPSBtb2RlbC5jbG9uZSgpO1xuICAgICAgICAgICAgZGlmZiA9IChpc01vbWVudChpbnB1dCkgfHwgaXNEYXRlKGlucHV0KSA/IGlucHV0LnZhbHVlT2YoKSA6IGxvY2FsX19jcmVhdGVMb2NhbChpbnB1dCkudmFsdWVPZigpKSAtIHJlcy52YWx1ZU9mKCk7XG4gICAgICAgICAgICAvLyBVc2UgbG93LWxldmVsIGFwaSwgYmVjYXVzZSB0aGlzIGZuIGlzIGxvdy1sZXZlbCBhcGkuXG4gICAgICAgICAgICByZXMuX2Quc2V0VGltZShyZXMuX2QudmFsdWVPZigpICsgZGlmZik7XG4gICAgICAgICAgICB1dGlsc19ob29rc19faG9va3MudXBkYXRlT2Zmc2V0KHJlcywgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbF9fY3JlYXRlTG9jYWwoaW5wdXQpLmxvY2FsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREYXRlT2Zmc2V0IChtKSB7XG4gICAgICAgIC8vIE9uIEZpcmVmb3guMjQgRGF0ZSNnZXRUaW1lem9uZU9mZnNldCByZXR1cm5zIGEgZmxvYXRpbmcgcG9pbnQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L3B1bGwvMTg3MVxuICAgICAgICByZXR1cm4gLU1hdGgucm91bmQobS5fZC5nZXRUaW1lem9uZU9mZnNldCgpIC8gMTUpICogMTU7XG4gICAgfVxuXG4gICAgLy8gSE9PS1NcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBtb21lbnQgaXMgbXV0YXRlZC5cbiAgICAvLyBJdCBpcyBpbnRlbmRlZCB0byBrZWVwIHRoZSBvZmZzZXQgaW4gc3luYyB3aXRoIHRoZSB0aW1lem9uZS5cbiAgICB1dGlsc19ob29rc19faG9va3MudXBkYXRlT2Zmc2V0ID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICAvLyBrZWVwTG9jYWxUaW1lID0gdHJ1ZSBtZWFucyBvbmx5IGNoYW5nZSB0aGUgdGltZXpvbmUsIHdpdGhvdXRcbiAgICAvLyBhZmZlY3RpbmcgdGhlIGxvY2FsIGhvdXIuIFNvIDU6MzE6MjYgKzAzMDAgLS1bdXRjT2Zmc2V0KDIsIHRydWUpXS0tPlxuICAgIC8vIDU6MzE6MjYgKzAyMDAgSXQgaXMgcG9zc2libGUgdGhhdCA1OjMxOjI2IGRvZXNuJ3QgZXhpc3Qgd2l0aCBvZmZzZXRcbiAgICAvLyArMDIwMCwgc28gd2UgYWRqdXN0IHRoZSB0aW1lIGFzIG5lZWRlZCwgdG8gYmUgdmFsaWQuXG4gICAgLy9cbiAgICAvLyBLZWVwaW5nIHRoZSB0aW1lIGFjdHVhbGx5IGFkZHMvc3VidHJhY3RzIChvbmUgaG91cilcbiAgICAvLyBmcm9tIHRoZSBhY3R1YWwgcmVwcmVzZW50ZWQgdGltZS4gVGhhdCBpcyB3aHkgd2UgY2FsbCB1cGRhdGVPZmZzZXRcbiAgICAvLyBhIHNlY29uZCB0aW1lLiBJbiBjYXNlIGl0IHdhbnRzIHVzIHRvIGNoYW5nZSB0aGUgb2Zmc2V0IGFnYWluXG4gICAgLy8gX2NoYW5nZUluUHJvZ3Jlc3MgPT0gdHJ1ZSBjYXNlLCB0aGVuIHdlIGhhdmUgdG8gYWRqdXN0LCBiZWNhdXNlXG4gICAgLy8gdGhlcmUgaXMgbm8gc3VjaCB0aW1lIGluIHRoZSBnaXZlbiB0aW1lem9uZS5cbiAgICBmdW5jdGlvbiBnZXRTZXRPZmZzZXQgKGlucHV0LCBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLl9vZmZzZXQgfHwgMCxcbiAgICAgICAgICAgIGxvY2FsQWRqdXN0O1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoU2hvcnRPZmZzZXQsIGlucHV0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoaW5wdXQpIDwgMTYpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0ICogNjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzVVRDICYmIGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICBsb2NhbEFkanVzdCA9IGdldERhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vZmZzZXQgPSBpbnB1dDtcbiAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChsb2NhbEFkanVzdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGQobG9jYWxBZGp1c3QsICdtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgIGlmICgha2VlcExvY2FsVGltZSB8fCB0aGlzLl9jaGFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZF9zdWJ0cmFjdF9fYWRkU3VidHJhY3QodGhpcywgY3JlYXRlX19jcmVhdGVEdXJhdGlvbihpbnB1dCAtIG9mZnNldCwgJ20nKSwgMSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHV0aWxzX2hvb2tzX19ob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gb2Zmc2V0IDogZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldFpvbmUgKGlucHV0LCBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gLWlucHV0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldChpbnB1dCwga2VlcExvY2FsVGltZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIC10aGlzLnV0Y09mZnNldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9VVEMgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvTG9jYWwgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzVVRDKSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJ0cmFjdChnZXREYXRlT2Zmc2V0KHRoaXMpLCAnbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvUGFyc2VkT2Zmc2V0ICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3R6bSkge1xuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodGhpcy5fdHptKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5faSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KG9mZnNldEZyb21TdHJpbmcobWF0Y2hPZmZzZXQsIHRoaXMuX2kpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNBbGlnbmVkSG91ck9mZnNldCAoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0ID0gaW5wdXQgPyBsb2NhbF9fY3JlYXRlTG9jYWwoaW5wdXQpLnV0Y09mZnNldCgpIDogMDtcblxuICAgICAgICByZXR1cm4gKHRoaXMudXRjT2Zmc2V0KCkgLSBpbnB1dCkgJSA2MCA9PT0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RheWxpZ2h0U2F2aW5nVGltZSAoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDApLnV0Y09mZnNldCgpIHx8XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDUpLnV0Y09mZnNldCgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkICgpIHtcbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9pc0RTVFNoaWZ0ZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGMgPSB7fTtcblxuICAgICAgICBjb3B5Q29uZmlnKGMsIHRoaXMpO1xuICAgICAgICBjID0gcHJlcGFyZUNvbmZpZyhjKTtcblxuICAgICAgICBpZiAoYy5fYSkge1xuICAgICAgICAgICAgdmFyIG90aGVyID0gYy5faXNVVEMgPyBjcmVhdGVfdXRjX19jcmVhdGVVVEMoYy5fYSkgOiBsb2NhbF9fY3JlYXRlTG9jYWwoYy5fYSk7XG4gICAgICAgICAgICB0aGlzLl9pc0RTVFNoaWZ0ZWQgPSB0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgICAgIGNvbXBhcmVBcnJheXMoYy5fYSwgb3RoZXIudG9BcnJheSgpKSA+IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc0RTVFNoaWZ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMb2NhbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/ICF0aGlzLl9pc1VUQyA6IGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXRjT2Zmc2V0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0YyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2lzVVRDICYmIHRoaXMuX29mZnNldCA9PT0gMCA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEFTUC5ORVQganNvbiBkYXRlIGZvcm1hdCByZWdleFxuICAgIHZhciBhc3BOZXRSZWdleCA9IC9eKFxcLSk/KD86KFxcZCopWy4gXSk/KFxcZCspXFw6KFxcZCspKD86XFw6KFxcZCspXFwuPyhcXGR7M30pP1xcZCopPyQvO1xuXG4gICAgLy8gZnJvbSBodHRwOi8vZG9jcy5jbG9zdXJlLWxpYnJhcnkuZ29vZ2xlY29kZS5jb20vZ2l0L2Nsb3N1cmVfZ29vZ19kYXRlX2RhdGUuanMuc291cmNlLmh0bWxcbiAgICAvLyBzb21ld2hhdCBtb3JlIGluIGxpbmUgd2l0aCA0LjQuMy4yIDIwMDQgc3BlYywgYnV0IGFsbG93cyBkZWNpbWFsIGFueXdoZXJlXG4gICAgLy8gYW5kIGZ1cnRoZXIgbW9kaWZpZWQgdG8gYWxsb3cgZm9yIHN0cmluZ3MgY29udGFpbmluZyBib3RoIHdlZWsgYW5kIGRheVxuICAgIHZhciBpc29SZWdleCA9IC9eKC0pP1AoPzooLT9bMC05LC5dKilZKT8oPzooLT9bMC05LC5dKilNKT8oPzooLT9bMC05LC5dKilXKT8oPzooLT9bMC05LC5dKilEKT8oPzpUKD86KC0/WzAtOSwuXSopSCk/KD86KC0/WzAtOSwuXSopTSk/KD86KC0/WzAtOSwuXSopUyk/KT8kLztcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZV9fY3JlYXRlRHVyYXRpb24gKGlucHV0LCBrZXkpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gaW5wdXQsXG4gICAgICAgICAgICAvLyBtYXRjaGluZyBhZ2FpbnN0IHJlZ2V4cCBpcyBleHBlbnNpdmUsIGRvIGl0IG9uIGRlbWFuZFxuICAgICAgICAgICAgbWF0Y2ggPSBudWxsLFxuICAgICAgICAgICAgc2lnbixcbiAgICAgICAgICAgIHJldCxcbiAgICAgICAgICAgIGRpZmZSZXM7XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBtcyA6IGlucHV0Ll9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICAgICAgZCAgOiBpbnB1dC5fZGF5cyxcbiAgICAgICAgICAgICAgICBNICA6IGlucHV0Ll9tb250aHNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbltrZXldID0gaW5wdXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uLm1pbGxpc2Vjb25kcyA9IGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEhKG1hdGNoID0gYXNwTmV0UmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gKG1hdGNoWzFdID09PSAnLScpID8gLTEgOiAxO1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeSAgOiAwLFxuICAgICAgICAgICAgICAgIGQgIDogdG9JbnQobWF0Y2hbREFURV0pICAgICAgICAqIHNpZ24sXG4gICAgICAgICAgICAgICAgaCAgOiB0b0ludChtYXRjaFtIT1VSXSkgICAgICAgICogc2lnbixcbiAgICAgICAgICAgICAgICBtICA6IHRvSW50KG1hdGNoW01JTlVURV0pICAgICAgKiBzaWduLFxuICAgICAgICAgICAgICAgIHMgIDogdG9JbnQobWF0Y2hbU0VDT05EXSkgICAgICAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbXMgOiB0b0ludChtYXRjaFtNSUxMSVNFQ09ORF0pICogc2lnblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICghIShtYXRjaCA9IGlzb1JlZ2V4LmV4ZWMoaW5wdXQpKSkge1xuICAgICAgICAgICAgc2lnbiA9IChtYXRjaFsxXSA9PT0gJy0nKSA/IC0xIDogMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHkgOiBwYXJzZUlzbyhtYXRjaFsyXSwgc2lnbiksXG4gICAgICAgICAgICAgICAgTSA6IHBhcnNlSXNvKG1hdGNoWzNdLCBzaWduKSxcbiAgICAgICAgICAgICAgICB3IDogcGFyc2VJc28obWF0Y2hbNF0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGQgOiBwYXJzZUlzbyhtYXRjaFs1XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgaCA6IHBhcnNlSXNvKG1hdGNoWzZdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBtIDogcGFyc2VJc28obWF0Y2hbN10sIHNpZ24pLFxuICAgICAgICAgICAgICAgIHMgOiBwYXJzZUlzbyhtYXRjaFs4XSwgc2lnbilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoZHVyYXRpb24gPT0gbnVsbCkgey8vIGNoZWNrcyBmb3IgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGR1cmF0aW9uID09PSAnb2JqZWN0JyAmJiAoJ2Zyb20nIGluIGR1cmF0aW9uIHx8ICd0bycgaW4gZHVyYXRpb24pKSB7XG4gICAgICAgICAgICBkaWZmUmVzID0gbW9tZW50c0RpZmZlcmVuY2UobG9jYWxfX2NyZWF0ZUxvY2FsKGR1cmF0aW9uLmZyb20pLCBsb2NhbF9fY3JlYXRlTG9jYWwoZHVyYXRpb24udG8pKTtcblxuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgICAgIGR1cmF0aW9uLm1zID0gZGlmZlJlcy5taWxsaXNlY29uZHM7XG4gICAgICAgICAgICBkdXJhdGlvbi5NID0gZGlmZlJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXQgPSBuZXcgRHVyYXRpb24oZHVyYXRpb24pO1xuXG4gICAgICAgIGlmIChpc0R1cmF0aW9uKGlucHV0KSAmJiBoYXNPd25Qcm9wKGlucHV0LCAnX2xvY2FsZScpKSB7XG4gICAgICAgICAgICByZXQuX2xvY2FsZSA9IGlucHV0Ll9sb2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGNyZWF0ZV9fY3JlYXRlRHVyYXRpb24uZm4gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG5cbiAgICBmdW5jdGlvbiBwYXJzZUlzbyAoaW5wLCBzaWduKSB7XG4gICAgICAgIC8vIFdlJ2Qgbm9ybWFsbHkgdXNlIH5+aW5wIGZvciB0aGlzLCBidXQgdW5mb3J0dW5hdGVseSBpdCBhbHNvXG4gICAgICAgIC8vIGNvbnZlcnRzIGZsb2F0cyB0byBpbnRzLlxuICAgICAgICAvLyBpbnAgbWF5IGJlIHVuZGVmaW5lZCwgc28gY2FyZWZ1bCBjYWxsaW5nIHJlcGxhY2Ugb24gaXQuXG4gICAgICAgIHZhciByZXMgPSBpbnAgJiYgcGFyc2VGbG9hdChpbnAucmVwbGFjZSgnLCcsICcuJykpO1xuICAgICAgICAvLyBhcHBseSBzaWduIHdoaWxlIHdlJ3JlIGF0IGl0XG4gICAgICAgIHJldHVybiAoaXNOYU4ocmVzKSA/IDAgOiByZXMpICogc2lnbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXMgPSB7bWlsbGlzZWNvbmRzOiAwLCBtb250aHM6IDB9O1xuXG4gICAgICAgIHJlcy5tb250aHMgPSBvdGhlci5tb250aCgpIC0gYmFzZS5tb250aCgpICtcbiAgICAgICAgICAgIChvdGhlci55ZWFyKCkgLSBiYXNlLnllYXIoKSkgKiAxMjtcbiAgICAgICAgaWYgKGJhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKS5pc0FmdGVyKG90aGVyKSkge1xuICAgICAgICAgICAgLS1yZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzLm1pbGxpc2Vjb25kcyA9ICtvdGhlciAtICsoYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIGlmICghKGJhc2UuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7bWlsbGlzZWNvbmRzOiAwLCBtb250aHM6IDB9O1xuICAgICAgICB9XG5cbiAgICAgICAgb3RoZXIgPSBjbG9uZVdpdGhPZmZzZXQob3RoZXIsIGJhc2UpO1xuICAgICAgICBpZiAoYmFzZS5pc0JlZm9yZShvdGhlcikpIHtcbiAgICAgICAgICAgIHJlcyA9IHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzID0gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShvdGhlciwgYmFzZSk7XG4gICAgICAgICAgICByZXMubWlsbGlzZWNvbmRzID0gLXJlcy5taWxsaXNlY29uZHM7XG4gICAgICAgICAgICByZXMubW9udGhzID0gLXJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic1JvdW5kIChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKC0xICogbnVtYmVyKSAqIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE86IHJlbW92ZSAnbmFtZScgYXJnIGFmdGVyIGRlcHJlY2F0aW9uIGlzIHJlbW92ZWRcbiAgICBmdW5jdGlvbiBjcmVhdGVBZGRlcihkaXJlY3Rpb24sIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWwsIHBlcmlvZCkge1xuICAgICAgICAgICAgdmFyIGR1ciwgdG1wO1xuICAgICAgICAgICAgLy9pbnZlcnQgdGhlIGFyZ3VtZW50cywgYnV0IGNvbXBsYWluIGFib3V0IGl0XG4gICAgICAgICAgICBpZiAocGVyaW9kICE9PSBudWxsICYmICFpc05hTigrcGVyaW9kKSkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZShuYW1lLCAnbW9tZW50KCkuJyArIG5hbWUgICsgJyhwZXJpb2QsIG51bWJlcikgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBtb21lbnQoKS4nICsgbmFtZSArICcobnVtYmVyLCBwZXJpb2QpLicpO1xuICAgICAgICAgICAgICAgIHRtcCA9IHZhbDsgdmFsID0gcGVyaW9kOyBwZXJpb2QgPSB0bXA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbCA9IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gK3ZhbCA6IHZhbDtcbiAgICAgICAgICAgIGR1ciA9IGNyZWF0ZV9fY3JlYXRlRHVyYXRpb24odmFsLCBwZXJpb2QpO1xuICAgICAgICAgICAgYWRkX3N1YnRyYWN0X19hZGRTdWJ0cmFjdCh0aGlzLCBkdXIsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRfc3VidHJhY3RfX2FkZFN1YnRyYWN0IChtb20sIGR1cmF0aW9uLCBpc0FkZGluZywgdXBkYXRlT2Zmc2V0KSB7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSBkdXJhdGlvbi5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgZGF5cyA9IGFic1JvdW5kKGR1cmF0aW9uLl9kYXlzKSxcbiAgICAgICAgICAgIG1vbnRocyA9IGFic1JvdW5kKGR1cmF0aW9uLl9tb250aHMpO1xuXG4gICAgICAgIGlmICghbW9tLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgLy8gTm8gb3BcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZU9mZnNldCA9IHVwZGF0ZU9mZnNldCA9PSBudWxsID8gdHJ1ZSA6IHVwZGF0ZU9mZnNldDtcblxuICAgICAgICBpZiAobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgICAgICBtb20uX2Quc2V0VGltZShtb20uX2QudmFsdWVPZigpICsgbWlsbGlzZWNvbmRzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXlzKSB7XG4gICAgICAgICAgICBnZXRfc2V0X19zZXQobW9tLCAnRGF0ZScsIGdldF9zZXRfX2dldChtb20sICdEYXRlJykgKyBkYXlzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb250aHMpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKG1vbSwgZ2V0X3NldF9fZ2V0KG1vbSwgJ01vbnRoJykgKyBtb250aHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZU9mZnNldCkge1xuICAgICAgICAgICAgdXRpbHNfaG9va3NfX2hvb2tzLnVwZGF0ZU9mZnNldChtb20sIGRheXMgfHwgbW9udGhzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhZGRfc3VidHJhY3RfX2FkZCAgICAgID0gY3JlYXRlQWRkZXIoMSwgJ2FkZCcpO1xuICAgIHZhciBhZGRfc3VidHJhY3RfX3N1YnRyYWN0ID0gY3JlYXRlQWRkZXIoLTEsICdzdWJ0cmFjdCcpO1xuXG4gICAgZnVuY3Rpb24gbW9tZW50X2NhbGVuZGFyX19jYWxlbmRhciAodGltZSwgZm9ybWF0cykge1xuICAgICAgICAvLyBXZSB3YW50IHRvIGNvbXBhcmUgdGhlIHN0YXJ0IG9mIHRvZGF5LCB2cyB0aGlzLlxuICAgICAgICAvLyBHZXR0aW5nIHN0YXJ0LW9mLXRvZGF5IGRlcGVuZHMgb24gd2hldGhlciB3ZSdyZSBsb2NhbC91dGMvb2Zmc2V0IG9yIG5vdC5cbiAgICAgICAgdmFyIG5vdyA9IHRpbWUgfHwgbG9jYWxfX2NyZWF0ZUxvY2FsKCksXG4gICAgICAgICAgICBzb2QgPSBjbG9uZVdpdGhPZmZzZXQobm93LCB0aGlzKS5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgIGRpZmYgPSB0aGlzLmRpZmYoc29kLCAnZGF5cycsIHRydWUpLFxuICAgICAgICAgICAgZm9ybWF0ID0gZGlmZiA8IC02ID8gJ3NhbWVFbHNlJyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IC0xID8gJ2xhc3RXZWVrJyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDAgPyAnbGFzdERheScgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCAxID8gJ3NhbWVEYXknIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgMiA/ICduZXh0RGF5JyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDcgPyAnbmV4dFdlZWsnIDogJ3NhbWVFbHNlJztcblxuICAgICAgICB2YXIgb3V0cHV0ID0gZm9ybWF0cyAmJiAoaXNGdW5jdGlvbihmb3JtYXRzW2Zvcm1hdF0pID8gZm9ybWF0c1tmb3JtYXRdKCkgOiBmb3JtYXRzW2Zvcm1hdF0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChvdXRwdXQgfHwgdGhpcy5sb2NhbGVEYXRhKCkuY2FsZW5kYXIoZm9ybWF0LCB0aGlzLCBsb2NhbF9fY3JlYXRlTG9jYWwobm93KSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsb25lICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBZnRlciAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBsb2NhbF9fY3JlYXRlTG9jYWwoaW5wdXQpO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKCFpc1VuZGVmaW5lZCh1bml0cykgPyB1bml0cyA6ICdtaWxsaXNlY29uZCcpO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA+IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsSW5wdXQudmFsdWVPZigpIDwgdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpLnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmVmb3JlIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGxvY2FsX19jcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHMoIWlzVW5kZWZpbmVkKHVuaXRzKSA/IHVuaXRzIDogJ21pbGxpc2Vjb25kJyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmV0d2VlbiAoZnJvbSwgdG8sIHVuaXRzLCBpbmNsdXNpdml0eSkge1xuICAgICAgICBpbmNsdXNpdml0eSA9IGluY2x1c2l2aXR5IHx8ICcoKSc7XG4gICAgICAgIHJldHVybiAoaW5jbHVzaXZpdHlbMF0gPT09ICcoJyA/IHRoaXMuaXNBZnRlcihmcm9tLCB1bml0cykgOiAhdGhpcy5pc0JlZm9yZShmcm9tLCB1bml0cykpICYmXG4gICAgICAgICAgICAoaW5jbHVzaXZpdHlbMV0gPT09ICcpJyA/IHRoaXMuaXNCZWZvcmUodG8sIHVuaXRzKSA6ICF0aGlzLmlzQWZ0ZXIodG8sIHVuaXRzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGxvY2FsX19jcmVhdGVMb2NhbChpbnB1dCksXG4gICAgICAgICAgICBpbnB1dE1zO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzIHx8ICdtaWxsaXNlY29uZCcpO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA9PT0gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dE1zID0gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpLnZhbHVlT2YoKSA8PSBpbnB1dE1zICYmIGlucHV0TXMgPD0gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckFmdGVyIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTYW1lKGlucHV0LCB1bml0cykgfHwgdGhpcy5pc0FmdGVyKGlucHV0LHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckJlZm9yZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNCZWZvcmUoaW5wdXQsdW5pdHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpZmYgKGlucHV0LCB1bml0cywgYXNGbG9hdCkge1xuICAgICAgICB2YXIgdGhhdCxcbiAgICAgICAgICAgIHpvbmVEZWx0YSxcbiAgICAgICAgICAgIGRlbHRhLCBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoYXQgPSBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIHRoaXMpO1xuXG4gICAgICAgIGlmICghdGhhdC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB6b25lRGVsdGEgPSAodGhhdC51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpICogNmU0O1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ3llYXInIHx8IHVuaXRzID09PSAnbW9udGgnIHx8IHVuaXRzID09PSAncXVhcnRlcicpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KTtcbiAgICAgICAgICAgIGlmICh1bml0cyA9PT0gJ3F1YXJ0ZXInKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0IC8gMztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodW5pdHMgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dCAvIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsdGEgPSB0aGlzIC0gdGhhdDtcbiAgICAgICAgICAgIG91dHB1dCA9IHVuaXRzID09PSAnc2Vjb25kJyA/IGRlbHRhIC8gMWUzIDogLy8gMTAwMFxuICAgICAgICAgICAgICAgIHVuaXRzID09PSAnbWludXRlJyA/IGRlbHRhIC8gNmU0IDogLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICAgICAgdW5pdHMgPT09ICdob3VyJyA/IGRlbHRhIC8gMzZlNSA6IC8vIDEwMDAgKiA2MCAqIDYwXG4gICAgICAgICAgICAgICAgdW5pdHMgPT09ICdkYXknID8gKGRlbHRhIC0gem9uZURlbHRhKSAvIDg2NGU1IDogLy8gMTAwMCAqIDYwICogNjAgKiAyNCwgbmVnYXRlIGRzdFxuICAgICAgICAgICAgICAgIHVuaXRzID09PSAnd2VlaycgPyAoZGVsdGEgLSB6b25lRGVsdGEpIC8gNjA0OGU1IDogLy8gMTAwMCAqIDYwICogNjAgKiAyNCAqIDcsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgICAgICBkZWx0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXNGbG9hdCA/IG91dHB1dCA6IGFic0Zsb29yKG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhEaWZmIChhLCBiKSB7XG4gICAgICAgIC8vIGRpZmZlcmVuY2UgaW4gbW9udGhzXG4gICAgICAgIHZhciB3aG9sZU1vbnRoRGlmZiA9ICgoYi55ZWFyKCkgLSBhLnllYXIoKSkgKiAxMikgKyAoYi5tb250aCgpIC0gYS5tb250aCgpKSxcbiAgICAgICAgICAgIC8vIGIgaXMgaW4gKGFuY2hvciAtIDEgbW9udGgsIGFuY2hvciArIDEgbW9udGgpXG4gICAgICAgICAgICBhbmNob3IgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmLCAnbW9udGhzJyksXG4gICAgICAgICAgICBhbmNob3IyLCBhZGp1c3Q7XG5cbiAgICAgICAgaWYgKGIgLSBhbmNob3IgPCAwKSB7XG4gICAgICAgICAgICBhbmNob3IyID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiAtIDEsICdtb250aHMnKTtcbiAgICAgICAgICAgIC8vIGxpbmVhciBhY3Jvc3MgdGhlIG1vbnRoXG4gICAgICAgICAgICBhZGp1c3QgPSAoYiAtIGFuY2hvcikgLyAoYW5jaG9yIC0gYW5jaG9yMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmNob3IyID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiArIDEsICdtb250aHMnKTtcbiAgICAgICAgICAgIC8vIGxpbmVhciBhY3Jvc3MgdGhlIG1vbnRoXG4gICAgICAgICAgICBhZGp1c3QgPSAoYiAtIGFuY2hvcikgLyAoYW5jaG9yMiAtIGFuY2hvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGZvciBuZWdhdGl2ZSB6ZXJvLCByZXR1cm4gemVybyBpZiBuZWdhdGl2ZSB6ZXJvXG4gICAgICAgIHJldHVybiAtKHdob2xlTW9udGhEaWZmICsgYWRqdXN0KSB8fCAwO1xuICAgIH1cblxuICAgIHV0aWxzX2hvb2tzX19ob29rcy5kZWZhdWx0Rm9ybWF0ID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcbiAgICB1dGlsc19ob29rc19faG9va3MuZGVmYXVsdEZvcm1hdFV0YyA9ICdZWVlZLU1NLUREVEhIOm1tOnNzW1pdJztcblxuICAgIGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5sb2NhbGUoJ2VuJykuZm9ybWF0KCdkZGQgTU1NIEREIFlZWVkgSEg6bW06c3MgW0dNVF1aWicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbWVudF9mb3JtYXRfX3RvSVNPU3RyaW5nICgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzLmNsb25lKCkudXRjKCk7XG4gICAgICAgIGlmICgwIDwgbS55ZWFyKCkgJiYgbS55ZWFyKCkgPD0gOTk5OSkge1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgLy8gbmF0aXZlIGltcGxlbWVudGF0aW9uIGlzIH41MHggZmFzdGVyLCB1c2UgaXQgd2hlbiB3ZSBjYW5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b0RhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZvcm1hdCAoaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgaWYgKCFpbnB1dFN0cmluZykge1xuICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSB0aGlzLmlzVXRjKCkgPyB1dGlsc19ob29rc19faG9va3MuZGVmYXVsdEZvcm1hdFV0YyA6IHV0aWxzX2hvb2tzX19ob29rcy5kZWZhdWx0Rm9ybWF0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBvdXRwdXQgPSBmb3JtYXRNb21lbnQodGhpcywgaW5wdXRTdHJpbmcpO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkucG9zdGZvcm1hdChvdXRwdXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZyb20gKHRpbWUsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAgICAgKChpc01vbWVudCh0aW1lKSAmJiB0aW1lLmlzVmFsaWQoKSkgfHxcbiAgICAgICAgICAgICAgICAgbG9jYWxfX2NyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVfX2NyZWF0ZUR1cmF0aW9uKHt0bzogdGhpcywgZnJvbTogdGltZX0pLmxvY2FsZSh0aGlzLmxvY2FsZSgpKS5odW1hbml6ZSghd2l0aG91dFN1ZmZpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZyb21Ob3cgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbShsb2NhbF9fY3JlYXRlTG9jYWwoKSwgd2l0aG91dFN1ZmZpeCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG8gKHRpbWUsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAgICAgKChpc01vbWVudCh0aW1lKSAmJiB0aW1lLmlzVmFsaWQoKSkgfHxcbiAgICAgICAgICAgICAgICAgbG9jYWxfX2NyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVfX2NyZWF0ZUR1cmF0aW9uKHtmcm9tOiB0aGlzLCB0bzogdGltZX0pLmxvY2FsZSh0aGlzLmxvY2FsZSgpKS5odW1hbml6ZSghd2l0aG91dFN1ZmZpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvTm93ICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvKGxvY2FsX19jcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXNzZWQgYSBsb2NhbGUga2V5LCBpdCB3aWxsIHNldCB0aGUgbG9jYWxlIGZvciB0aGlzXG4gICAgLy8gaW5zdGFuY2UuICBPdGhlcndpc2UsIGl0IHdpbGwgcmV0dXJuIHRoZSBsb2NhbGUgY29uZmlndXJhdGlvblxuICAgIC8vIHZhcmlhYmxlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICBmdW5jdGlvbiBsb2NhbGUgKGtleSkge1xuICAgICAgICB2YXIgbmV3TG9jYWxlRGF0YTtcblxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdMb2NhbGVEYXRhID0gbG9jYWxlX2xvY2FsZXNfX2dldExvY2FsZShrZXkpO1xuICAgICAgICAgICAgaWYgKG5ld0xvY2FsZURhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvY2FsZSA9IG5ld0xvY2FsZURhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsYW5nID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9tZW50KCkubGFuZygpIGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBtb21lbnQoKS5sb2NhbGVEYXRhKCkgdG8gZ2V0IHRoZSBsYW5ndWFnZSBjb25maWd1cmF0aW9uLiBVc2UgbW9tZW50KCkubG9jYWxlKCkgdG8gY2hhbmdlIGxhbmd1YWdlcy4nLFxuICAgICAgICBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZURhdGEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0YXJ0T2YgKHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHN3aXRjaCBpbnRlbnRpb25hbGx5IG9taXRzIGJyZWFrIGtleXdvcmRzXG4gICAgICAgIC8vIHRvIHV0aWxpemUgZmFsbGluZyB0aHJvdWdoIHRoZSBjYXNlcy5cbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgIHRoaXMubW9udGgoMCk7XG4gICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICB0aGlzLmRhdGUoMSk7XG4gICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICdpc29XZWVrJzpcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICB0aGlzLmhvdXJzKDApO1xuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgIHRoaXMubWludXRlcygwKTtcbiAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcygwKTtcbiAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgIHRoaXMubWlsbGlzZWNvbmRzKDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2Vla3MgYXJlIGEgc3BlY2lhbCBjYXNlXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ3dlZWsnKSB7XG4gICAgICAgICAgICB0aGlzLndlZWtkYXkoMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaXRzID09PSAnaXNvV2VlaycpIHtcbiAgICAgICAgICAgIHRoaXMuaXNvV2Vla2RheSgxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHF1YXJ0ZXJzIGFyZSBhbHNvIHNwZWNpYWxcbiAgICAgICAgaWYgKHVuaXRzID09PSAncXVhcnRlcicpIHtcbiAgICAgICAgICAgIHRoaXMubW9udGgoTWF0aC5mbG9vcih0aGlzLm1vbnRoKCkgLyAzKSAqIDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5kT2YgKHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICBpZiAodW5pdHMgPT09IHVuZGVmaW5lZCB8fCB1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAnZGF0ZScgaXMgYW4gYWxpYXMgZm9yICdkYXknLCBzbyBpdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBzdWNoLlxuICAgICAgICBpZiAodW5pdHMgPT09ICdkYXRlJykge1xuICAgICAgICAgICAgdW5pdHMgPSAnZGF5JztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2YodW5pdHMpLmFkZCgxLCAodW5pdHMgPT09ICdpc29XZWVrJyA/ICd3ZWVrJyA6IHVuaXRzKSkuc3VidHJhY3QoMSwgJ21zJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9fdHlwZV9fdmFsdWVPZiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kLnZhbHVlT2YoKSAtICgodGhpcy5fb2Zmc2V0IHx8IDApICogNjAwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVuaXggKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKSAvIDEwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvRGF0ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vZmZzZXQgPyBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSkgOiB0aGlzLl9kO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvQXJyYXkgKCkge1xuICAgICAgICB2YXIgbSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBbbS55ZWFyKCksIG0ubW9udGgoKSwgbS5kYXRlKCksIG0uaG91cigpLCBtLm1pbnV0ZSgpLCBtLnNlY29uZCgpLCBtLm1pbGxpc2Vjb25kKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvT2JqZWN0ICgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcnM6IG0ueWVhcigpLFxuICAgICAgICAgICAgbW9udGhzOiBtLm1vbnRoKCksXG4gICAgICAgICAgICBkYXRlOiBtLmRhdGUoKSxcbiAgICAgICAgICAgIGhvdXJzOiBtLmhvdXJzKCksXG4gICAgICAgICAgICBtaW51dGVzOiBtLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHNlY29uZHM6IG0uc2Vjb25kcygpLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzOiBtLm1pbGxpc2Vjb25kcygpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgICAgICAgLy8gbmV3IERhdGUoTmFOKS50b0pTT04oKSA9PT0gbnVsbFxuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbWVudF92YWxpZF9faXNWYWxpZCAoKSB7XG4gICAgICAgIHJldHVybiB2YWxpZF9faXNWYWxpZCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzaW5nRmxhZ3MgKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBnZXRQYXJzaW5nRmxhZ3ModGhpcykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGludmFsaWRBdCAoKSB7XG4gICAgICAgIHJldHVybiBnZXRQYXJzaW5nRmxhZ3ModGhpcykub3ZlcmZsb3c7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRpb25EYXRhKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5wdXQ6IHRoaXMuX2ksXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuX2YsXG4gICAgICAgICAgICBsb2NhbGU6IHRoaXMuX2xvY2FsZSxcbiAgICAgICAgICAgIGlzVVRDOiB0aGlzLl9pc1VUQyxcbiAgICAgICAgICAgIHN0cmljdDogdGhpcy5fc3RyaWN0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydnZycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndlZWtZZWFyKCkgJSAxMDA7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ0dHJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2Vla1llYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4gKHRva2VuLCBnZXR0ZXIpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4oMCwgW3Rva2VuLCB0b2tlbi5sZW5ndGhdLCAwLCBnZXR0ZXIpO1xuICAgIH1cblxuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ2dnZ2cnLCAgICAgJ3dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZ2cnLCAgICAnd2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdHR0dHJywgICdpc29XZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ0dHR0dHJywgJ2lzb1dlZWtZZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3dlZWtZZWFyJywgJ2dnJyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrWWVhcicsICdHRycpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignRycsICAgICAgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2cnLCAgICAgIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdHRycsICAgICBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignZ2cnLCAgICAgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHR0cnLCAgIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdnZ2dnJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignR0dHR0cnLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnZ2dnJywgIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZ2dnZycsICdnZ2dnZycsICdHR0dHJywgJ0dHR0dHJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAyKV0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2dnJywgJ0dHJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IHV0aWxzX2hvb2tzX19ob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrWWVhciAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFNldFdlZWtZZWFySGVscGVyLmNhbGwodGhpcyxcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICB0aGlzLndlZWsoKSxcbiAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXkoKSxcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3csXG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG95KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09XZWVrWWVhciAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFNldFdlZWtZZWFySGVscGVyLmNhbGwodGhpcyxcbiAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy5pc29XZWVrKCksIHRoaXMuaXNvV2Vla2RheSgpLCAxLCA0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRJU09XZWVrc0luWWVhciAoKSB7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgMSwgNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0V2Vla3NJblllYXIgKCkge1xuICAgICAgICB2YXIgd2Vla0luZm8gPSB0aGlzLmxvY2FsZURhdGEoKS5fd2VlaztcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMueWVhcigpLCB3ZWVrSW5mby5kb3csIHdlZWtJbmZvLmRveSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2Vla1llYXJIZWxwZXIoaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrc1RhcmdldDtcbiAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKHRoaXMsIGRvdywgZG95KS55ZWFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2Vla3NUYXJnZXQgPSB3ZWVrc0luWWVhcihpbnB1dCwgZG93LCBkb3kpO1xuICAgICAgICAgICAgaWYgKHdlZWsgPiB3ZWVrc1RhcmdldCkge1xuICAgICAgICAgICAgICAgIHdlZWsgPSB3ZWVrc1RhcmdldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZXRXZWVrQWxsLmNhbGwodGhpcywgaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFdlZWtBbGwod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBkYXlPZlllYXJEYXRhID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSksXG4gICAgICAgICAgICBkYXRlID0gY3JlYXRlVVRDRGF0ZShkYXlPZlllYXJEYXRhLnllYXIsIDAsIGRheU9mWWVhckRhdGEuZGF5T2ZZZWFyKTtcblxuICAgICAgICB0aGlzLnllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpKTtcbiAgICAgICAgdGhpcy5tb250aChkYXRlLmdldFVUQ01vbnRoKCkpO1xuICAgICAgICB0aGlzLmRhdGUoZGF0ZS5nZXRVVENEYXRlKCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignUScsIDAsICdRbycsICdxdWFydGVyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3F1YXJ0ZXInLCAnUScpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignUScsIG1hdGNoMSk7XG4gICAgYWRkUGFyc2VUb2tlbignUScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTU9OVEhdID0gKHRvSW50KGlucHV0KSAtIDEpICogMztcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFF1YXJ0ZXIgKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gTWF0aC5jZWlsKCh0aGlzLm1vbnRoKCkgKyAxKSAvIDMpIDogdGhpcy5tb250aCgoaW5wdXQgLSAxKSAqIDMgKyB0aGlzLm1vbnRoKCkgJSAzKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigndycsIFsnd3cnLCAyXSwgJ3dvJywgJ3dlZWsnKTtcbiAgICBhZGRGb3JtYXRUb2tlbignVycsIFsnV1cnLCAyXSwgJ1dvJywgJ2lzb1dlZWsnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnd2VlaycsICd3Jyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrJywgJ1cnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3cnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCd3dycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdXJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignV1cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ3cnLCAnd3cnLCAnVycsICdXVyddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbi5zdWJzdHIoMCwgMSldID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2VlayAobW9tKSB7XG4gICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKG1vbSwgdGhpcy5fd2Vlay5kb3csIHRoaXMuX3dlZWsuZG95KS53ZWVrO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2VlayA9IHtcbiAgICAgICAgZG93IDogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgIGRveSA6IDYgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRmlyc3REYXlPZldlZWsgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Vlay5kb3c7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlRmlyc3REYXlPZlllYXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Vlay5kb3k7XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2VlayAoaW5wdXQpIHtcbiAgICAgICAgdmFyIHdlZWsgPSB0aGlzLmxvY2FsZURhdGEoKS53ZWVrKHRoaXMpO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPV2VlayAoaW5wdXQpIHtcbiAgICAgICAgdmFyIHdlZWsgPSB3ZWVrT2ZZZWFyKHRoaXMsIDEsIDQpLndlZWs7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2VlayA6IHRoaXMuYWRkKChpbnB1dCAtIHdlZWspICogNywgJ2QnKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignRCcsIFsnREQnLCAyXSwgJ0RvJywgJ2RhdGUnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnZGF0ZScsICdEJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdEJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignREQnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignRG8nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gaXNTdHJpY3QgPyBsb2NhbGUuX29yZGluYWxQYXJzZSA6IGxvY2FsZS5fb3JkaW5hbFBhcnNlTGVuaWVudDtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydEJywgJ0REJ10sIERBVEUpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0RvJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtEQVRFXSA9IHRvSW50KGlucHV0Lm1hdGNoKG1hdGNoMXRvMilbMF0sIDEwKTtcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXREYXlPZk1vbnRoID0gbWFrZUdldFNldCgnRGF0ZScsIHRydWUpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2QnLCAwLCAnZG8nLCAnZGF5Jyk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c01pbih0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzU2hvcnQodGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGRkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdlJywgMCwgMCwgJ3dlZWtkYXknKTtcbiAgICBhZGRGb3JtYXRUb2tlbignRScsIDAsIDAsICdpc29XZWVrZGF5Jyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RheScsICdkJyk7XG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrZGF5JywgJ2UnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWtkYXknLCAnRScpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignZCcsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZScsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignRScsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZGQnLCAgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNNaW5SZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkJywgICBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkZCcsICAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZGQnLCAnZGRkJywgJ2RkZGQnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gY29uZmlnLl9sb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgLy8gaWYgd2UgZGlkbid0IGdldCBhIHdlZWtkYXkgbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkXG4gICAgICAgIGlmICh3ZWVrZGF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdlZWsuZCA9IHdlZWtkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkV2Vla2RheSA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2QnLCAnZScsICdFJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIHBhcnNlV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmFOKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dCA9IGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIExPQ0FMRVNcblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXMgPSAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXMgKG0sIGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl93ZWVrZGF5cykgPyB0aGlzLl93ZWVrZGF5c1ttLmRheSgpXSA6XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1t0aGlzLl93ZWVrZGF5cy5pc0Zvcm1hdC50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5kYXkoKV07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0ID0gJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c1Nob3J0IChtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0W20uZGF5KCldO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXNNaW4gPSAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNNaW4gKG0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluW20uZGF5KCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheV9vZl93ZWVrX19oYW5kbGVTdHJpY3RQYXJzZSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIGlpLCBtb20sIGxsYyA9IHdlZWtkYXlOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVfdXRjX19jcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNQYXJzZSAod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXlfb2Zfd2Vla19faGFuZGxlU3RyaWN0UGFyc2UuY2FsbCh0aGlzLCB3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcblxuICAgICAgICAgICAgbW9tID0gY3JlYXRlX3V0Y19fY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnXFwuPycpICsgJyQnLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPSAnXicgKyB0aGlzLndlZWtkYXlzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKSArICd8XicgKyB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdkZGRkJyAmJiB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnZGRkJyAmJiB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ2RkJyAmJiB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fd2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZXZWVrIChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRheSA9IHRoaXMuX2lzVVRDID8gdGhpcy5fZC5nZXRVVENEYXkoKSA6IHRoaXMuX2QuZ2V0RGF5KCk7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbnB1dCA9IHBhcnNlV2Vla2RheShpbnB1dCwgdGhpcy5sb2NhbGVEYXRhKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkKGlucHV0IC0gZGF5LCAnZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRheTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldExvY2FsZURheU9mV2VlayAoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gKHRoaXMuZGF5KCkgKyA3IC0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93KSAlIDc7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2Vla2RheSA6IHRoaXMuYWRkKGlucHV0IC0gd2Vla2RheSwgJ2QnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09EYXlPZldlZWsgKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICAvLyBiZWhhdmVzIHRoZSBzYW1lIGFzIG1vbWVudCNkYXkgZXhjZXB0XG4gICAgICAgIC8vIGFzIGEgZ2V0dGVyLCByZXR1cm5zIDcgaW5zdGVhZCBvZiAwICgxLTcgcmFuZ2UgaW5zdGVhZCBvZiAwLTYpXG4gICAgICAgIC8vIGFzIGEgc2V0dGVyLCBzdW5kYXkgc2hvdWxkIGJlbG9uZyB0byB0aGUgcHJldmlvdXMgd2Vlay5cbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB0aGlzLmRheSgpIHx8IDcgOiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IGlucHV0IDogaW5wdXQgLSA3KTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFdlZWtkYXlzUmVnZXggPSBtYXRjaFdvcmQ7XG4gICAgZnVuY3Rpb24gd2Vla2RheXNSZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4IDogdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzU2hvcnRSZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggOiB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFdlZWtkYXlzTWluUmVnZXggPSBtYXRjaFdvcmQ7XG4gICAgZnVuY3Rpb24gd2Vla2RheXNNaW5SZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4IDogdGhpcy5fd2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZVdlZWtkYXlzUGFyc2UgKCkge1xuICAgICAgICBmdW5jdGlvbiBjbXBMZW5SZXYoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWluUGllY2VzID0gW10sIHNob3J0UGllY2VzID0gW10sIGxvbmdQaWVjZXMgPSBbXSwgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksIG1vbSwgbWlucCwgc2hvcnRwLCBsb25ncDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVfdXRjX19jcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICBtaW5wID0gdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgICAgIHNob3J0cCA9IHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKTtcbiAgICAgICAgICAgIGxvbmdwID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKTtcbiAgICAgICAgICAgIG1pblBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgc2hvcnRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKGxvbmdwKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gobWlucCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHNob3J0cCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKGxvbmdwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIHdlZWtkYXkgKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXIgaXRcbiAgICAgICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgICAgICBtaW5QaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBzaG9ydFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGxvbmdQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIHNob3J0UGllY2VzW2ldID0gcmVnZXhFc2NhcGUoc2hvcnRQaWVjZXNbaV0pO1xuICAgICAgICAgICAgbG9uZ1BpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKGxvbmdQaWVjZXNbaV0pO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShtaXhlZFBpZWNlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbWl4ZWRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcblxuICAgICAgICB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbG9uZ1BpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1pblBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0RERCcsIFsnRERERCcsIDNdLCAnREREbycsICdkYXlPZlllYXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnZGF5T2ZZZWFyJywgJ0RERCcpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignREREJywgIG1hdGNoMXRvMyk7XG4gICAgYWRkUmVnZXhUb2tlbignRERERCcsIG1hdGNoMyk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ0RERCcsICdEREREJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2RheU9mWWVhciA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mWWVhciAoaW5wdXQpIHtcbiAgICAgICAgdmFyIGRheU9mWWVhciA9IE1hdGgucm91bmQoKHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKSAtIHRoaXMuY2xvbmUoKS5zdGFydE9mKCd5ZWFyJykpIC8gODY0ZTUpICsgMTtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyBkYXlPZlllYXIgOiB0aGlzLmFkZCgoaW5wdXQgLSBkYXlPZlllYXIpLCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIGhGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgJSAxMiB8fCAxMjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBrRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpIHx8IDI0O1xuICAgIH1cblxuICAgIGFkZEZvcm1hdFRva2VuKCdIJywgWydISCcsIDJdLCAwLCAnaG91cicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdoJywgWydoaCcsIDJdLCAwLCBoRm9ybWF0KTtcbiAgICBhZGRGb3JtYXRUb2tlbignaycsIFsna2snLCAyXSwgMCwga0Zvcm1hdCk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIHRoaXMuaG91cnMoKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW1zcycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdGhpcy5ob3VycygpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtICh0b2tlbiwgbG93ZXJjYXNlKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubWVyaWRpZW0odGhpcy5ob3VycygpLCB0aGlzLm1pbnV0ZXMoKSwgbG93ZXJjYXNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyaWRpZW0oJ2EnLCB0cnVlKTtcbiAgICBtZXJpZGllbSgnQScsIGZhbHNlKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnaG91cicsICdoJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBmdW5jdGlvbiBtYXRjaE1lcmlkaWVtIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuX21lcmlkaWVtUGFyc2U7XG4gICAgfVxuXG4gICAgYWRkUmVnZXhUb2tlbignYScsICBtYXRjaE1lcmlkaWVtKTtcbiAgICBhZGRSZWdleFRva2VuKCdBJywgIG1hdGNoTWVyaWRpZW0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0gnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdoJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignSEgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignaGgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRSZWdleFRva2VuKCdobW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbXNzJywgbWF0Y2g1dG82KTtcbiAgICBhZGRSZWdleFRva2VuKCdIbW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbXNzJywgbWF0Y2g1dG82KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydIJywgJ0hIJ10sIEhPVVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydhJywgJ0EnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5faXNQbSA9IGNvbmZpZy5fbG9jYWxlLmlzUE0oaW5wdXQpO1xuICAgICAgICBjb25maWcuX21lcmlkaWVtID0gaW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2gnLCAnaGgnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW0nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvcyA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvcykpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQ7XG4gICAgICAgIHZhciBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tc3MnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0O1xuICAgICAgICB2YXIgcG9zMiA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvczEpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgICAgIGFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMikpO1xuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlSXNQTSAoaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IFF1aXJrcyBNb2RlICYgSUU3IFN0YW5kYXJkcyBNb2RlIGRvIG5vdCBhbGxvdyBhY2Nlc3Npbmcgc3RyaW5ncyBsaWtlIGFycmF5c1xuICAgICAgICAvLyBVc2luZyBjaGFyQXQgc2hvdWxkIGJlIG1vcmUgY29tcGF0aWJsZS5cbiAgICAgICAgcmV0dXJuICgoaW5wdXQgKyAnJykudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCkgPT09ICdwJyk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlID0gL1thcF1cXC4/bT9cXC4/L2k7XG4gICAgZnVuY3Rpb24gbG9jYWxlTWVyaWRpZW0gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbScgOiAnUE0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnYW0nIDogJ0FNJztcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgLy8gU2V0dGluZyB0aGUgaG91ciBzaG91bGQga2VlcCB0aGUgdGltZSwgYmVjYXVzZSB0aGUgdXNlciBleHBsaWNpdGx5XG4gICAgLy8gc3BlY2lmaWVkIHdoaWNoIGhvdXIgaGUgd2FudHMuIFNvIHRyeWluZyB0byBtYWludGFpbiB0aGUgc2FtZSBob3VyIChpblxuICAgIC8vIGEgbmV3IHRpbWV6b25lKSBtYWtlcyBzZW5zZS4gQWRkaW5nL3N1YnRyYWN0aW5nIGhvdXJzIGRvZXMgbm90IGZvbGxvd1xuICAgIC8vIHRoaXMgcnVsZS5cbiAgICB2YXIgZ2V0U2V0SG91ciA9IG1ha2VHZXRTZXQoJ0hvdXJzJywgdHJ1ZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignbScsIFsnbW0nLCAyXSwgMCwgJ21pbnV0ZScpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdtaW51dGUnLCAnbScpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignbScsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ21tJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydtJywgJ21tJ10sIE1JTlVURSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0TWludXRlID0gbWFrZUdldFNldCgnTWludXRlcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdzJywgWydzcycsIDJdLCAwLCAnc2Vjb25kJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3NlY29uZCcsICdzJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdzJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignc3MnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ3MnLCAnc3MnXSwgU0VDT05EKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRTZWNvbmQgPSBtYWtlR2V0U2V0KCdTZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMDApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTUycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTUycsIDNdLCAwLCAnbWlsbGlzZWNvbmQnKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1MnLCA0XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTUycsIDVdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1MnLCA2XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1MnLCA3XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTUycsIDhdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTU1MnLCA5XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDAwMDtcbiAgICB9KTtcblxuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdtaWxsaXNlY29uZCcsICdtcycpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignUycsICAgIG1hdGNoMXRvMywgbWF0Y2gxKTtcbiAgICBhZGRSZWdleFRva2VuKCdTUycsICAgbWF0Y2gxdG8zLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1NTUycsICBtYXRjaDF0bzMsIG1hdGNoMyk7XG5cbiAgICB2YXIgdG9rZW47XG4gICAgZm9yICh0b2tlbiA9ICdTU1NTJzsgdG9rZW4ubGVuZ3RoIDw9IDk7IHRva2VuICs9ICdTJykge1xuICAgICAgICBhZGRSZWdleFRva2VuKHRva2VuLCBtYXRjaFVuc2lnbmVkKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU1zKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNSUxMSVNFQ09ORF0gPSB0b0ludCgoJzAuJyArIGlucHV0KSAqIDEwMDApO1xuICAgIH1cblxuICAgIGZvciAodG9rZW4gPSAnUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUGFyc2VUb2tlbih0b2tlbiwgcGFyc2VNcyk7XG4gICAgfVxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRNaWxsaXNlY29uZCA9IG1ha2VHZXRTZXQoJ01pbGxpc2Vjb25kcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd6JywgIDAsIDAsICd6b25lQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd6eicsIDAsIDAsICd6b25lTmFtZScpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0Wm9uZUFiYnIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnVVRDJyA6ICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFpvbmVOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gJ0Nvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lJyA6ICcnO1xuICAgIH1cblxuICAgIHZhciBtb21lbnRQcm90b3R5cGVfX3Byb3RvID0gTW9tZW50LnByb3RvdHlwZTtcblxuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uYWRkICAgICAgICAgICAgICAgPSBhZGRfc3VidHJhY3RfX2FkZDtcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLmNhbGVuZGFyICAgICAgICAgID0gbW9tZW50X2NhbGVuZGFyX19jYWxlbmRhcjtcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLmNsb25lICAgICAgICAgICAgID0gY2xvbmU7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5kaWZmICAgICAgICAgICAgICA9IGRpZmY7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5lbmRPZiAgICAgICAgICAgICA9IGVuZE9mO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uZm9ybWF0ICAgICAgICAgICAgPSBmb3JtYXQ7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5mcm9tICAgICAgICAgICAgICA9IGZyb207XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5mcm9tTm93ICAgICAgICAgICA9IGZyb21Ob3c7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by50byAgICAgICAgICAgICAgICA9IHRvO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8udG9Ob3cgICAgICAgICAgICAgPSB0b05vdztcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLmdldCAgICAgICAgICAgICAgID0gZ2V0U2V0O1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uaW52YWxpZEF0ICAgICAgICAgPSBpbnZhbGlkQXQ7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5pc0FmdGVyICAgICAgICAgICA9IGlzQWZ0ZXI7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5pc0JlZm9yZSAgICAgICAgICA9IGlzQmVmb3JlO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uaXNCZXR3ZWVuICAgICAgICAgPSBpc0JldHdlZW47XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5pc1NhbWUgICAgICAgICAgICA9IGlzU2FtZTtcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLmlzU2FtZU9yQWZ0ZXIgICAgID0gaXNTYW1lT3JBZnRlcjtcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLmlzU2FtZU9yQmVmb3JlICAgID0gaXNTYW1lT3JCZWZvcmU7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5pc1ZhbGlkICAgICAgICAgICA9IG1vbWVudF92YWxpZF9faXNWYWxpZDtcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLmxhbmcgICAgICAgICAgICAgID0gbGFuZztcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLmxvY2FsZSAgICAgICAgICAgID0gbG9jYWxlO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8ubG9jYWxlRGF0YSAgICAgICAgPSBsb2NhbGVEYXRhO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8ubWF4ICAgICAgICAgICAgICAgPSBwcm90b3R5cGVNYXg7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5taW4gICAgICAgICAgICAgICA9IHByb3RvdHlwZU1pbjtcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLnBhcnNpbmdGbGFncyAgICAgID0gcGFyc2luZ0ZsYWdzO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uc2V0ICAgICAgICAgICAgICAgPSBnZXRTZXQ7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5zdGFydE9mICAgICAgICAgICA9IHN0YXJ0T2Y7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5zdWJ0cmFjdCAgICAgICAgICA9IGFkZF9zdWJ0cmFjdF9fc3VidHJhY3Q7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by50b0FycmF5ICAgICAgICAgICA9IHRvQXJyYXk7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by50b09iamVjdCAgICAgICAgICA9IHRvT2JqZWN0O1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8udG9EYXRlICAgICAgICAgICAgPSB0b0RhdGU7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by50b0lTT1N0cmluZyAgICAgICA9IG1vbWVudF9mb3JtYXRfX3RvSVNPU3RyaW5nO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8udG9KU09OICAgICAgICAgICAgPSB0b0pTT047XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by50b1N0cmluZyAgICAgICAgICA9IHRvU3RyaW5nO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8udW5peCAgICAgICAgICAgICAgPSB1bml4O1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8udmFsdWVPZiAgICAgICAgICAgPSB0b190eXBlX192YWx1ZU9mO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uY3JlYXRpb25EYXRhICAgICAgPSBjcmVhdGlvbkRhdGE7XG5cbiAgICAvLyBZZWFyXG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by55ZWFyICAgICAgID0gZ2V0U2V0WWVhcjtcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLmlzTGVhcFllYXIgPSBnZXRJc0xlYXBZZWFyO1xuXG4gICAgLy8gV2VlayBZZWFyXG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by53ZWVrWWVhciAgICA9IGdldFNldFdlZWtZZWFyO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uaXNvV2Vla1llYXIgPSBnZXRTZXRJU09XZWVrWWVhcjtcblxuICAgIC8vIFF1YXJ0ZXJcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLnF1YXJ0ZXIgPSBtb21lbnRQcm90b3R5cGVfX3Byb3RvLnF1YXJ0ZXJzID0gZ2V0U2V0UXVhcnRlcjtcblxuICAgIC8vIE1vbnRoXG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5tb250aCAgICAgICA9IGdldFNldE1vbnRoO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uZGF5c0luTW9udGggPSBnZXREYXlzSW5Nb250aDtcblxuICAgIC8vIFdlZWtcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLndlZWsgICAgICAgICAgID0gbW9tZW50UHJvdG90eXBlX19wcm90by53ZWVrcyAgICAgICAgPSBnZXRTZXRXZWVrO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uaXNvV2VlayAgICAgICAgPSBtb21lbnRQcm90b3R5cGVfX3Byb3RvLmlzb1dlZWtzICAgICA9IGdldFNldElTT1dlZWs7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by53ZWVrc0luWWVhciAgICA9IGdldFdlZWtzSW5ZZWFyO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uaXNvV2Vla3NJblllYXIgPSBnZXRJU09XZWVrc0luWWVhcjtcblxuICAgIC8vIERheVxuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uZGF0ZSAgICAgICA9IGdldFNldERheU9mTW9udGg7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5kYXkgICAgICAgID0gbW9tZW50UHJvdG90eXBlX19wcm90by5kYXlzICAgICAgICAgICAgID0gZ2V0U2V0RGF5T2ZXZWVrO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8ud2Vla2RheSAgICA9IGdldFNldExvY2FsZURheU9mV2VlaztcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLmlzb1dlZWtkYXkgPSBnZXRTZXRJU09EYXlPZldlZWs7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5kYXlPZlllYXIgID0gZ2V0U2V0RGF5T2ZZZWFyO1xuXG4gICAgLy8gSG91clxuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uaG91ciA9IG1vbWVudFByb3RvdHlwZV9fcHJvdG8uaG91cnMgPSBnZXRTZXRIb3VyO1xuXG4gICAgLy8gTWludXRlXG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5taW51dGUgPSBtb21lbnRQcm90b3R5cGVfX3Byb3RvLm1pbnV0ZXMgPSBnZXRTZXRNaW51dGU7XG5cbiAgICAvLyBTZWNvbmRcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLnNlY29uZCA9IG1vbWVudFByb3RvdHlwZV9fcHJvdG8uc2Vjb25kcyA9IGdldFNldFNlY29uZDtcblxuICAgIC8vIE1pbGxpc2Vjb25kXG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5taWxsaXNlY29uZCA9IG1vbWVudFByb3RvdHlwZV9fcHJvdG8ubWlsbGlzZWNvbmRzID0gZ2V0U2V0TWlsbGlzZWNvbmQ7XG5cbiAgICAvLyBPZmZzZXRcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLnV0Y09mZnNldCAgICAgICAgICAgID0gZ2V0U2V0T2Zmc2V0O1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8udXRjICAgICAgICAgICAgICAgICAgPSBzZXRPZmZzZXRUb1VUQztcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLmxvY2FsICAgICAgICAgICAgICAgID0gc2V0T2Zmc2V0VG9Mb2NhbDtcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLnBhcnNlWm9uZSAgICAgICAgICAgID0gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQ7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5oYXNBbGlnbmVkSG91ck9mZnNldCA9IGhhc0FsaWduZWRIb3VyT2Zmc2V0O1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uaXNEU1QgICAgICAgICAgICAgICAgPSBpc0RheWxpZ2h0U2F2aW5nVGltZTtcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLmlzRFNUU2hpZnRlZCAgICAgICAgID0gaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uaXNMb2NhbCAgICAgICAgICAgICAgPSBpc0xvY2FsO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uaXNVdGNPZmZzZXQgICAgICAgICAgPSBpc1V0Y09mZnNldDtcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLmlzVXRjICAgICAgICAgICAgICAgID0gaXNVdGM7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5pc1VUQyAgICAgICAgICAgICAgICA9IGlzVXRjO1xuXG4gICAgLy8gVGltZXpvbmVcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLnpvbmVBYmJyID0gZ2V0Wm9uZUFiYnI7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by56b25lTmFtZSA9IGdldFpvbmVOYW1lO1xuXG4gICAgLy8gRGVwcmVjYXRpb25zXG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5kYXRlcyAgPSBkZXByZWNhdGUoJ2RhdGVzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBkYXRlIGluc3RlYWQuJywgZ2V0U2V0RGF5T2ZNb250aCk7XG4gICAgbW9tZW50UHJvdG90eXBlX19wcm90by5tb250aHMgPSBkZXByZWNhdGUoJ21vbnRocyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgbW9udGggaW5zdGVhZCcsIGdldFNldE1vbnRoKTtcbiAgICBtb21lbnRQcm90b3R5cGVfX3Byb3RvLnllYXJzICA9IGRlcHJlY2F0ZSgneWVhcnMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIHllYXIgaW5zdGVhZCcsIGdldFNldFllYXIpO1xuICAgIG1vbWVudFByb3RvdHlwZV9fcHJvdG8uem9uZSAgID0gZGVwcmVjYXRlKCdtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE3NzknLCBnZXRTZXRab25lKTtcblxuICAgIHZhciBtb21lbnRQcm90b3R5cGUgPSBtb21lbnRQcm90b3R5cGVfX3Byb3RvO1xuXG4gICAgZnVuY3Rpb24gbW9tZW50X19jcmVhdGVVbml4IChpbnB1dCkge1xuICAgICAgICByZXR1cm4gbG9jYWxfX2NyZWF0ZUxvY2FsKGlucHV0ICogMTAwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9tZW50X19jcmVhdGVJblpvbmUgKCkge1xuICAgICAgICByZXR1cm4gbG9jYWxfX2NyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cykucGFyc2Vab25lKCk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRDYWxlbmRhciA9IHtcbiAgICAgICAgc2FtZURheSA6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgbmV4dERheSA6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgbGFzdERheSA6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgIGxhc3RXZWVrIDogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVfY2FsZW5kYXJfX2NhbGVuZGFyIChrZXksIG1vbSwgbm93KSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9jYWxlbmRhcltrZXldO1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihvdXRwdXQpID8gb3V0cHV0LmNhbGwobW9tLCBub3cpIDogb3V0cHV0O1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQgPSB7XG4gICAgICAgIExUUyAgOiAnaDptbTpzcyBBJyxcbiAgICAgICAgTFQgICA6ICdoOm1tIEEnLFxuICAgICAgICBMICAgIDogJ01NL0REL1lZWVknLFxuICAgICAgICBMTCAgIDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgIExMTCAgOiAnTU1NTSBELCBZWVlZIGg6bW0gQScsXG4gICAgICAgIExMTEwgOiAnZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQSdcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbG9uZ0RhdGVGb3JtYXQgKGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSxcbiAgICAgICAgICAgIGZvcm1hdFVwcGVyID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5LnRvVXBwZXJDYXNlKCldO1xuXG4gICAgICAgIGlmIChmb3JtYXQgfHwgIWZvcm1hdFVwcGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSA9IGZvcm1hdFVwcGVyLnJlcGxhY2UoL01NTU18TU18RER8ZGRkZC9nLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnNsaWNlKDEpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdEludmFsaWREYXRlID0gJ0ludmFsaWQgZGF0ZSc7XG5cbiAgICBmdW5jdGlvbiBpbnZhbGlkRGF0ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZhbGlkRGF0ZTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdE9yZGluYWwgPSAnJWQnO1xuICAgIHZhciBkZWZhdWx0T3JkaW5hbFBhcnNlID0gL1xcZHsxLDJ9LztcblxuICAgIGZ1bmN0aW9uIG9yZGluYWwgKG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JkaW5hbC5yZXBsYWNlKCclZCcsIG51bWJlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlUGFyc2VQb3N0Rm9ybWF0IChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFJlbGF0aXZlVGltZSA9IHtcbiAgICAgICAgZnV0dXJlIDogJ2luICVzJyxcbiAgICAgICAgcGFzdCAgIDogJyVzIGFnbycsXG4gICAgICAgIHMgIDogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICBtICA6ICdhIG1pbnV0ZScsXG4gICAgICAgIG1tIDogJyVkIG1pbnV0ZXMnLFxuICAgICAgICBoICA6ICdhbiBob3VyJyxcbiAgICAgICAgaGggOiAnJWQgaG91cnMnLFxuICAgICAgICBkICA6ICdhIGRheScsXG4gICAgICAgIGRkIDogJyVkIGRheXMnLFxuICAgICAgICBNICA6ICdhIG1vbnRoJyxcbiAgICAgICAgTU0gOiAnJWQgbW9udGhzJyxcbiAgICAgICAgeSAgOiAnYSB5ZWFyJyxcbiAgICAgICAgeXkgOiAnJWQgeWVhcnMnXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlX19yZWxhdGl2ZVRpbWUgKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW3N0cmluZ107XG4gICAgICAgIHJldHVybiAoaXNGdW5jdGlvbihvdXRwdXQpKSA/XG4gICAgICAgICAgICBvdXRwdXQobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSA6XG4gICAgICAgICAgICBvdXRwdXQucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXN0RnV0dXJlIChkaWZmLCBvdXRwdXQpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX3JlbGF0aXZlVGltZVtkaWZmID4gMCA/ICdmdXR1cmUnIDogJ3Bhc3QnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oZm9ybWF0KSA/IGZvcm1hdChvdXRwdXQpIDogZm9ybWF0LnJlcGxhY2UoLyVzL2ksIG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvdHlwZV9fcHJvdG8gPSBMb2NhbGUucHJvdG90eXBlO1xuXG4gICAgcHJvdG90eXBlX19wcm90by5fY2FsZW5kYXIgICAgICAgPSBkZWZhdWx0Q2FsZW5kYXI7XG4gICAgcHJvdG90eXBlX19wcm90by5jYWxlbmRhciAgICAgICAgPSBsb2NhbGVfY2FsZW5kYXJfX2NhbGVuZGFyO1xuICAgIHByb3RvdHlwZV9fcHJvdG8uX2xvbmdEYXRlRm9ybWF0ID0gZGVmYXVsdExvbmdEYXRlRm9ybWF0O1xuICAgIHByb3RvdHlwZV9fcHJvdG8ubG9uZ0RhdGVGb3JtYXQgID0gbG9uZ0RhdGVGb3JtYXQ7XG4gICAgcHJvdG90eXBlX19wcm90by5faW52YWxpZERhdGUgICAgPSBkZWZhdWx0SW52YWxpZERhdGU7XG4gICAgcHJvdG90eXBlX19wcm90by5pbnZhbGlkRGF0ZSAgICAgPSBpbnZhbGlkRGF0ZTtcbiAgICBwcm90b3R5cGVfX3Byb3RvLl9vcmRpbmFsICAgICAgICA9IGRlZmF1bHRPcmRpbmFsO1xuICAgIHByb3RvdHlwZV9fcHJvdG8ub3JkaW5hbCAgICAgICAgID0gb3JkaW5hbDtcbiAgICBwcm90b3R5cGVfX3Byb3RvLl9vcmRpbmFsUGFyc2UgICA9IGRlZmF1bHRPcmRpbmFsUGFyc2U7XG4gICAgcHJvdG90eXBlX19wcm90by5wcmVwYXJzZSAgICAgICAgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG90eXBlX19wcm90by5wb3N0Zm9ybWF0ICAgICAgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG90eXBlX19wcm90by5fcmVsYXRpdmVUaW1lICAgPSBkZWZhdWx0UmVsYXRpdmVUaW1lO1xuICAgIHByb3RvdHlwZV9fcHJvdG8ucmVsYXRpdmVUaW1lICAgID0gcmVsYXRpdmVfX3JlbGF0aXZlVGltZTtcbiAgICBwcm90b3R5cGVfX3Byb3RvLnBhc3RGdXR1cmUgICAgICA9IHBhc3RGdXR1cmU7XG4gICAgcHJvdG90eXBlX19wcm90by5zZXQgICAgICAgICAgICAgPSBsb2NhbGVfc2V0X19zZXQ7XG5cbiAgICAvLyBNb250aFxuICAgIHByb3RvdHlwZV9fcHJvdG8ubW9udGhzICAgICAgICAgICAgPSAgICAgICAgbG9jYWxlTW9udGhzO1xuICAgIHByb3RvdHlwZV9fcHJvdG8uX21vbnRocyAgICAgICAgICAgPSBkZWZhdWx0TG9jYWxlTW9udGhzO1xuICAgIHByb3RvdHlwZV9fcHJvdG8ubW9udGhzU2hvcnQgICAgICAgPSAgICAgICAgbG9jYWxlTW9udGhzU2hvcnQ7XG4gICAgcHJvdG90eXBlX19wcm90by5fbW9udGhzU2hvcnQgICAgICA9IGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydDtcbiAgICBwcm90b3R5cGVfX3Byb3RvLm1vbnRoc1BhcnNlICAgICAgID0gICAgICAgIGxvY2FsZU1vbnRoc1BhcnNlO1xuICAgIHByb3RvdHlwZV9fcHJvdG8uX21vbnRoc1JlZ2V4ICAgICAgPSBkZWZhdWx0TW9udGhzUmVnZXg7XG4gICAgcHJvdG90eXBlX19wcm90by5tb250aHNSZWdleCAgICAgICA9IG1vbnRoc1JlZ2V4O1xuICAgIHByb3RvdHlwZV9fcHJvdG8uX21vbnRoc1Nob3J0UmVnZXggPSBkZWZhdWx0TW9udGhzU2hvcnRSZWdleDtcbiAgICBwcm90b3R5cGVfX3Byb3RvLm1vbnRoc1Nob3J0UmVnZXggID0gbW9udGhzU2hvcnRSZWdleDtcblxuICAgIC8vIFdlZWtcbiAgICBwcm90b3R5cGVfX3Byb3RvLndlZWsgPSBsb2NhbGVXZWVrO1xuICAgIHByb3RvdHlwZV9fcHJvdG8uX3dlZWsgPSBkZWZhdWx0TG9jYWxlV2VlaztcbiAgICBwcm90b3R5cGVfX3Byb3RvLmZpcnN0RGF5T2ZZZWFyID0gbG9jYWxlRmlyc3REYXlPZlllYXI7XG4gICAgcHJvdG90eXBlX19wcm90by5maXJzdERheU9mV2VlayA9IGxvY2FsZUZpcnN0RGF5T2ZXZWVrO1xuXG4gICAgLy8gRGF5IG9mIFdlZWtcbiAgICBwcm90b3R5cGVfX3Byb3RvLndlZWtkYXlzICAgICAgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzO1xuICAgIHByb3RvdHlwZV9fcHJvdG8uX3dlZWtkYXlzICAgICAgPSBkZWZhdWx0TG9jYWxlV2Vla2RheXM7XG4gICAgcHJvdG90eXBlX19wcm90by53ZWVrZGF5c01pbiAgICA9ICAgICAgICBsb2NhbGVXZWVrZGF5c01pbjtcbiAgICBwcm90b3R5cGVfX3Byb3RvLl93ZWVrZGF5c01pbiAgID0gZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluO1xuICAgIHByb3RvdHlwZV9fcHJvdG8ud2Vla2RheXNTaG9ydCAgPSAgICAgICAgbG9jYWxlV2Vla2RheXNTaG9ydDtcbiAgICBwcm90b3R5cGVfX3Byb3RvLl93ZWVrZGF5c1Nob3J0ID0gZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQ7XG4gICAgcHJvdG90eXBlX19wcm90by53ZWVrZGF5c1BhcnNlICA9ICAgICAgICBsb2NhbGVXZWVrZGF5c1BhcnNlO1xuXG4gICAgcHJvdG90eXBlX19wcm90by5fd2Vla2RheXNSZWdleCAgICAgID0gZGVmYXVsdFdlZWtkYXlzUmVnZXg7XG4gICAgcHJvdG90eXBlX19wcm90by53ZWVrZGF5c1JlZ2V4ICAgICAgID0gICAgICAgIHdlZWtkYXlzUmVnZXg7XG4gICAgcHJvdG90eXBlX19wcm90by5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleDtcbiAgICBwcm90b3R5cGVfX3Byb3RvLndlZWtkYXlzU2hvcnRSZWdleCAgPSAgICAgICAgd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgIHByb3RvdHlwZV9fcHJvdG8uX3dlZWtkYXlzTWluUmVnZXggICA9IGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4O1xuICAgIHByb3RvdHlwZV9fcHJvdG8ud2Vla2RheXNNaW5SZWdleCAgICA9ICAgICAgICB3ZWVrZGF5c01pblJlZ2V4O1xuXG4gICAgLy8gSG91cnNcbiAgICBwcm90b3R5cGVfX3Byb3RvLmlzUE0gPSBsb2NhbGVJc1BNO1xuICAgIHByb3RvdHlwZV9fcHJvdG8uX21lcmlkaWVtUGFyc2UgPSBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZTtcbiAgICBwcm90b3R5cGVfX3Byb3RvLm1lcmlkaWVtID0gbG9jYWxlTWVyaWRpZW07XG5cbiAgICBmdW5jdGlvbiBsaXN0c19fZ2V0IChmb3JtYXQsIGluZGV4LCBmaWVsZCwgc2V0dGVyKSB7XG4gICAgICAgIHZhciBsb2NhbGUgPSBsb2NhbGVfbG9jYWxlc19fZ2V0TG9jYWxlKCk7XG4gICAgICAgIHZhciB1dGMgPSBjcmVhdGVfdXRjX19jcmVhdGVVVEMoKS5zZXQoc2V0dGVyLCBpbmRleCk7XG4gICAgICAgIHJldHVybiBsb2NhbGVbZmllbGRdKHV0YywgZm9ybWF0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzSW1wbCAoZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBmb3JtYXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGxpc3RzX19nZXQoZm9ybWF0LCBpbmRleCwgZmllbGQsICdtb250aCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGk7XG4gICAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIG91dFtpXSA9IGxpc3RzX19nZXQoZm9ybWF0LCBpLCBmaWVsZCwgJ21vbnRoJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICAvLyAoKVxuICAgIC8vICg1KVxuICAgIC8vIChmbXQsIDUpXG4gICAgLy8gKGZtdClcbiAgICAvLyAodHJ1ZSlcbiAgICAvLyAodHJ1ZSwgNSlcbiAgICAvLyAodHJ1ZSwgZm10LCA1KVxuICAgIC8vICh0cnVlLCBmbXQpXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzSW1wbCAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCBmaWVsZCkge1xuICAgICAgICBpZiAodHlwZW9mIGxvY2FsZVNvcnRlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZvcm1hdCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGxvY2FsZVNvcnRlZDtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgbG9jYWxlU29ydGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZm9ybWF0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxvY2FsZSA9IGxvY2FsZV9sb2NhbGVzX19nZXRMb2NhbGUoKSxcbiAgICAgICAgICAgIHNoaWZ0ID0gbG9jYWxlU29ydGVkID8gbG9jYWxlLl93ZWVrLmRvdyA6IDA7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsaXN0c19fZ2V0KGZvcm1hdCwgKGluZGV4ICsgc2hpZnQpICUgNywgZmllbGQsICdkYXknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgb3V0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIG91dFtpXSA9IGxpc3RzX19nZXQoZm9ybWF0LCAoaSArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0c19fbGlzdE1vbnRocyAoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRocycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RzX19saXN0TW9udGhzU2hvcnQgKGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHNTaG9ydCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RzX19saXN0V2Vla2RheXMgKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5cycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RzX19saXN0V2Vla2RheXNTaG9ydCAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzU2hvcnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0c19fbGlzdFdlZWtkYXlzTWluIChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXNNaW4nKTtcbiAgICB9XG5cbiAgICBsb2NhbGVfbG9jYWxlc19fZ2V0U2V0R2xvYmFsTG9jYWxlKCdlbicsIHtcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn0odGh8c3R8bmR8cmQpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRvSW50KG51bWJlciAlIDEwMCAvIDEwKSA9PT0gMSkgPyAndGgnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMSkgPyAnc3QnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMikgPyAnbmQnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMykgPyAncmQnIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcbiAgICB1dGlsc19ob29rc19faG9va3MubGFuZyA9IGRlcHJlY2F0ZSgnbW9tZW50LmxhbmcgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGUgaW5zdGVhZC4nLCBsb2NhbGVfbG9jYWxlc19fZ2V0U2V0R2xvYmFsTG9jYWxlKTtcbiAgICB1dGlsc19ob29rc19faG9va3MubGFuZ0RhdGEgPSBkZXByZWNhdGUoJ21vbWVudC5sYW5nRGF0YSBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZURhdGEgaW5zdGVhZC4nLCBsb2NhbGVfbG9jYWxlc19fZ2V0TG9jYWxlKTtcblxuICAgIHZhciBtYXRoQWJzID0gTWF0aC5hYnM7XG5cbiAgICBmdW5jdGlvbiBkdXJhdGlvbl9hYnNfX2FicyAoKSB7XG4gICAgICAgIHZhciBkYXRhICAgICAgICAgICA9IHRoaXMuX2RhdGE7XG5cbiAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzID0gbWF0aEFicyh0aGlzLl9taWxsaXNlY29uZHMpO1xuICAgICAgICB0aGlzLl9kYXlzICAgICAgICAgPSBtYXRoQWJzKHRoaXMuX2RheXMpO1xuICAgICAgICB0aGlzLl9tb250aHMgICAgICAgPSBtYXRoQWJzKHRoaXMuX21vbnRocyk7XG5cbiAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgID0gbWF0aEFicyhkYXRhLm1pbGxpc2Vjb25kcyk7XG4gICAgICAgIGRhdGEuc2Vjb25kcyAgICAgICA9IG1hdGhBYnMoZGF0YS5zZWNvbmRzKTtcbiAgICAgICAgZGF0YS5taW51dGVzICAgICAgID0gbWF0aEFicyhkYXRhLm1pbnV0ZXMpO1xuICAgICAgICBkYXRhLmhvdXJzICAgICAgICAgPSBtYXRoQWJzKGRhdGEuaG91cnMpO1xuICAgICAgICBkYXRhLm1vbnRocyAgICAgICAgPSBtYXRoQWJzKGRhdGEubW9udGhzKTtcbiAgICAgICAgZGF0YS55ZWFycyAgICAgICAgID0gbWF0aEFicyhkYXRhLnllYXJzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkdXJhdGlvbl9hZGRfc3VidHJhY3RfX2FkZFN1YnRyYWN0IChkdXJhdGlvbiwgaW5wdXQsIHZhbHVlLCBkaXJlY3Rpb24pIHtcbiAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlX19jcmVhdGVEdXJhdGlvbihpbnB1dCwgdmFsdWUpO1xuXG4gICAgICAgIGR1cmF0aW9uLl9taWxsaXNlY29uZHMgKz0gZGlyZWN0aW9uICogb3RoZXIuX21pbGxpc2Vjb25kcztcbiAgICAgICAgZHVyYXRpb24uX2RheXMgICAgICAgICArPSBkaXJlY3Rpb24gKiBvdGhlci5fZGF5cztcbiAgICAgICAgZHVyYXRpb24uX21vbnRocyAgICAgICArPSBkaXJlY3Rpb24gKiBvdGhlci5fbW9udGhzO1xuXG4gICAgICAgIHJldHVybiBkdXJhdGlvbi5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgLy8gc3VwcG9ydHMgb25seSAyLjAtc3R5bGUgYWRkKDEsICdzJykgb3IgYWRkKGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIGR1cmF0aW9uX2FkZF9zdWJ0cmFjdF9fYWRkIChpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGR1cmF0aW9uX2FkZF9zdWJ0cmFjdF9fYWRkU3VidHJhY3QodGhpcywgaW5wdXQsIHZhbHVlLCAxKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0cyBvbmx5IDIuMC1zdHlsZSBzdWJ0cmFjdCgxLCAncycpIG9yIHN1YnRyYWN0KGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIGR1cmF0aW9uX2FkZF9zdWJ0cmFjdF9fc3VidHJhY3QgKGlucHV0LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZHVyYXRpb25fYWRkX3N1YnRyYWN0X19hZGRTdWJ0cmFjdCh0aGlzLCBpbnB1dCwgdmFsdWUsIC0xKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNDZWlsIChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKG51bWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBidWJibGUgKCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzO1xuICAgICAgICB2YXIgZGF5cyAgICAgICAgID0gdGhpcy5fZGF5cztcbiAgICAgICAgdmFyIG1vbnRocyAgICAgICA9IHRoaXMuX21vbnRocztcbiAgICAgICAgdmFyIGRhdGEgICAgICAgICA9IHRoaXMuX2RhdGE7XG4gICAgICAgIHZhciBzZWNvbmRzLCBtaW51dGVzLCBob3VycywgeWVhcnMsIG1vbnRoc0Zyb21EYXlzO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBtaXggb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcywgYnViYmxlIGRvd24gZmlyc3RcbiAgICAgICAgLy8gY2hlY2s6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yMTY2XG4gICAgICAgIGlmICghKChtaWxsaXNlY29uZHMgPj0gMCAmJiBkYXlzID49IDAgJiYgbW9udGhzID49IDApIHx8XG4gICAgICAgICAgICAgICAgKG1pbGxpc2Vjb25kcyA8PSAwICYmIGRheXMgPD0gMCAmJiBtb250aHMgPD0gMCkpKSB7XG4gICAgICAgICAgICBtaWxsaXNlY29uZHMgKz0gYWJzQ2VpbChtb250aHNUb0RheXMobW9udGhzKSArIGRheXMpICogODY0ZTU7XG4gICAgICAgICAgICBkYXlzID0gMDtcbiAgICAgICAgICAgIG1vbnRocyA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgYnViYmxlcyB1cCB2YWx1ZXMsIHNlZSB0aGUgdGVzdHMgZm9yXG4gICAgICAgIC8vIGV4YW1wbGVzIG9mIHdoYXQgdGhhdCBtZWFucy5cbiAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHMgJSAxMDAwO1xuXG4gICAgICAgIHNlY29uZHMgICAgICAgICAgID0gYWJzRmxvb3IobWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gICAgICAgIGRhdGEuc2Vjb25kcyAgICAgID0gc2Vjb25kcyAlIDYwO1xuXG4gICAgICAgIG1pbnV0ZXMgICAgICAgICAgID0gYWJzRmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICAgICAgZGF0YS5taW51dGVzICAgICAgPSBtaW51dGVzICUgNjA7XG5cbiAgICAgICAgaG91cnMgICAgICAgICAgICAgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgICAgICBkYXRhLmhvdXJzICAgICAgICA9IGhvdXJzICUgMjQ7XG5cbiAgICAgICAgZGF5cyArPSBhYnNGbG9vcihob3VycyAvIDI0KTtcblxuICAgICAgICAvLyBjb252ZXJ0IGRheXMgdG8gbW9udGhzXG4gICAgICAgIG1vbnRoc0Zyb21EYXlzID0gYWJzRmxvb3IoZGF5c1RvTW9udGhzKGRheXMpKTtcbiAgICAgICAgbW9udGhzICs9IG1vbnRoc0Zyb21EYXlzO1xuICAgICAgICBkYXlzIC09IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRoc0Zyb21EYXlzKSk7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyA9IGFic0Zsb29yKG1vbnRocyAvIDEyKTtcbiAgICAgICAgbW9udGhzICU9IDEyO1xuXG4gICAgICAgIGRhdGEuZGF5cyAgID0gZGF5cztcbiAgICAgICAgZGF0YS5tb250aHMgPSBtb250aHM7XG4gICAgICAgIGRhdGEueWVhcnMgID0geWVhcnM7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5c1RvTW9udGhzIChkYXlzKSB7XG4gICAgICAgIC8vIDQwMCB5ZWFycyBoYXZlIDE0NjA5NyBkYXlzICh0YWtpbmcgaW50byBhY2NvdW50IGxlYXAgeWVhciBydWxlcylcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTIgbW9udGhzID09PSA0ODAwXG4gICAgICAgIHJldHVybiBkYXlzICogNDgwMCAvIDE0NjA5NztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aHNUb0RheXMgKG1vbnRocykge1xuICAgICAgICAvLyB0aGUgcmV2ZXJzZSBvZiBkYXlzVG9Nb250aHNcbiAgICAgICAgcmV0dXJuIG1vbnRocyAqIDE0NjA5NyAvIDQ4MDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXMgKHVuaXRzKSB7XG4gICAgICAgIHZhciBkYXlzO1xuICAgICAgICB2YXIgbW9udGhzO1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzO1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21vbnRoJyB8fCB1bml0cyA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICBkYXlzICAgPSB0aGlzLl9kYXlzICAgKyBtaWxsaXNlY29uZHMgLyA4NjRlNTtcbiAgICAgICAgICAgIG1vbnRocyA9IHRoaXMuX21vbnRocyArIGRheXNUb01vbnRocyhkYXlzKTtcbiAgICAgICAgICAgIHJldHVybiB1bml0cyA9PT0gJ21vbnRoJyA/IG1vbnRocyA6IG1vbnRocyAvIDEyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaGFuZGxlIG1pbGxpc2Vjb25kcyBzZXBhcmF0ZWx5IGJlY2F1c2Ugb2YgZmxvYXRpbmcgcG9pbnQgbWF0aCBlcnJvcnMgKGlzc3VlICMxODY3KVxuICAgICAgICAgICAgZGF5cyA9IHRoaXMuX2RheXMgKyBNYXRoLnJvdW5kKG1vbnRoc1RvRGF5cyh0aGlzLl9tb250aHMpKTtcbiAgICAgICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd3ZWVrJyAgIDogcmV0dXJuIGRheXMgLyA3ICAgICArIG1pbGxpc2Vjb25kcyAvIDYwNDhlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdkYXknICAgIDogcmV0dXJuIGRheXMgICAgICAgICArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hvdXInICAgOiByZXR1cm4gZGF5cyAqIDI0ICAgICsgbWlsbGlzZWNvbmRzIC8gMzZlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdtaW51dGUnIDogcmV0dXJuIGRheXMgKiAxNDQwICArIG1pbGxpc2Vjb25kcyAvIDZlNDtcbiAgICAgICAgICAgICAgICBjYXNlICdzZWNvbmQnIDogcmV0dXJuIGRheXMgKiA4NjQwMCArIG1pbGxpc2Vjb25kcyAvIDEwMDA7XG4gICAgICAgICAgICAgICAgLy8gTWF0aC5mbG9vciBwcmV2ZW50cyBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyBoZXJlXG4gICAgICAgICAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOiByZXR1cm4gTWF0aC5mbG9vcihkYXlzICogODY0ZTUpICsgbWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcignVW5rbm93biB1bml0ICcgKyB1bml0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBVc2UgdGhpcy5hcygnbXMnKT9cbiAgICBmdW5jdGlvbiBkdXJhdGlvbl9hc19fdmFsdWVPZiAoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgK1xuICAgICAgICAgICAgdGhpcy5fZGF5cyAqIDg2NGU1ICtcbiAgICAgICAgICAgICh0aGlzLl9tb250aHMgJSAxMikgKiAyNTkyZTYgK1xuICAgICAgICAgICAgdG9JbnQodGhpcy5fbW9udGhzIC8gMTIpICogMzE1MzZlNlxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VBcyAoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFzKGFsaWFzKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgYXNNaWxsaXNlY29uZHMgPSBtYWtlQXMoJ21zJyk7XG4gICAgdmFyIGFzU2Vjb25kcyAgICAgID0gbWFrZUFzKCdzJyk7XG4gICAgdmFyIGFzTWludXRlcyAgICAgID0gbWFrZUFzKCdtJyk7XG4gICAgdmFyIGFzSG91cnMgICAgICAgID0gbWFrZUFzKCdoJyk7XG4gICAgdmFyIGFzRGF5cyAgICAgICAgID0gbWFrZUFzKCdkJyk7XG4gICAgdmFyIGFzV2Vla3MgICAgICAgID0gbWFrZUFzKCd3Jyk7XG4gICAgdmFyIGFzTW9udGhzICAgICAgID0gbWFrZUFzKCdNJyk7XG4gICAgdmFyIGFzWWVhcnMgICAgICAgID0gbWFrZUFzKCd5Jyk7XG5cbiAgICBmdW5jdGlvbiBkdXJhdGlvbl9nZXRfX2dldCAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIHJldHVybiB0aGlzW3VuaXRzICsgJ3MnXSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXR0ZXIobmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFbbmFtZV07XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIG1pbGxpc2Vjb25kcyA9IG1ha2VHZXR0ZXIoJ21pbGxpc2Vjb25kcycpO1xuICAgIHZhciBzZWNvbmRzICAgICAgPSBtYWtlR2V0dGVyKCdzZWNvbmRzJyk7XG4gICAgdmFyIG1pbnV0ZXMgICAgICA9IG1ha2VHZXR0ZXIoJ21pbnV0ZXMnKTtcbiAgICB2YXIgaG91cnMgICAgICAgID0gbWFrZUdldHRlcignaG91cnMnKTtcbiAgICB2YXIgZGF5cyAgICAgICAgID0gbWFrZUdldHRlcignZGF5cycpO1xuICAgIHZhciBtb250aHMgICAgICAgPSBtYWtlR2V0dGVyKCdtb250aHMnKTtcbiAgICB2YXIgeWVhcnMgICAgICAgID0gbWFrZUdldHRlcigneWVhcnMnKTtcblxuICAgIGZ1bmN0aW9uIHdlZWtzICgpIHtcbiAgICAgICAgcmV0dXJuIGFic0Zsb29yKHRoaXMuZGF5cygpIC8gNyk7XG4gICAgfVxuXG4gICAgdmFyIHJvdW5kID0gTWF0aC5yb3VuZDtcbiAgICB2YXIgdGhyZXNob2xkcyA9IHtcbiAgICAgICAgczogNDUsICAvLyBzZWNvbmRzIHRvIG1pbnV0ZVxuICAgICAgICBtOiA0NSwgIC8vIG1pbnV0ZXMgdG8gaG91clxuICAgICAgICBoOiAyMiwgIC8vIGhvdXJzIHRvIGRheVxuICAgICAgICBkOiAyNiwgIC8vIGRheXMgdG8gbW9udGhcbiAgICAgICAgTTogMTEgICAvLyBtb250aHMgdG8geWVhclxuICAgIH07XG5cbiAgICAvLyBoZWxwZXIgZnVuY3Rpb24gZm9yIG1vbWVudC5mbi5mcm9tLCBtb21lbnQuZm4uZnJvbU5vdywgYW5kIG1vbWVudC5kdXJhdGlvbi5mbi5odW1hbml6ZVxuICAgIGZ1bmN0aW9uIHN1YnN0aXR1dGVUaW1lQWdvKHN0cmluZywgbnVtYmVyLCB3aXRob3V0U3VmZml4LCBpc0Z1dHVyZSwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUucmVsYXRpdmVUaW1lKG51bWJlciB8fCAxLCAhIXdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGR1cmF0aW9uX2h1bWFuaXplX19yZWxhdGl2ZVRpbWUgKHBvc05lZ0R1cmF0aW9uLCB3aXRob3V0U3VmZml4LCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gY3JlYXRlX19jcmVhdGVEdXJhdGlvbihwb3NOZWdEdXJhdGlvbikuYWJzKCk7XG4gICAgICAgIHZhciBzZWNvbmRzICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdzJykpO1xuICAgICAgICB2YXIgbWludXRlcyAgPSByb3VuZChkdXJhdGlvbi5hcygnbScpKTtcbiAgICAgICAgdmFyIGhvdXJzICAgID0gcm91bmQoZHVyYXRpb24uYXMoJ2gnKSk7XG4gICAgICAgIHZhciBkYXlzICAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdkJykpO1xuICAgICAgICB2YXIgbW9udGhzICAgPSByb3VuZChkdXJhdGlvbi5hcygnTScpKTtcbiAgICAgICAgdmFyIHllYXJzICAgID0gcm91bmQoZHVyYXRpb24uYXMoJ3knKSk7XG5cbiAgICAgICAgdmFyIGEgPSBzZWNvbmRzIDwgdGhyZXNob2xkcy5zICYmIFsncycsIHNlY29uZHNdICB8fFxuICAgICAgICAgICAgICAgIG1pbnV0ZXMgPD0gMSAgICAgICAgICAgJiYgWydtJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgbWludXRlcyA8IHRocmVzaG9sZHMubSAmJiBbJ21tJywgbWludXRlc10gfHxcbiAgICAgICAgICAgICAgICBob3VycyAgIDw9IDEgICAgICAgICAgICYmIFsnaCddICAgICAgICAgICB8fFxuICAgICAgICAgICAgICAgIGhvdXJzICAgPCB0aHJlc2hvbGRzLmggJiYgWydoaCcsIGhvdXJzXSAgIHx8XG4gICAgICAgICAgICAgICAgZGF5cyAgICA8PSAxICAgICAgICAgICAmJiBbJ2QnXSAgICAgICAgICAgfHxcbiAgICAgICAgICAgICAgICBkYXlzICAgIDwgdGhyZXNob2xkcy5kICYmIFsnZGQnLCBkYXlzXSAgICB8fFxuICAgICAgICAgICAgICAgIG1vbnRocyAgPD0gMSAgICAgICAgICAgJiYgWydNJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgbW9udGhzICA8IHRocmVzaG9sZHMuTSAmJiBbJ01NJywgbW9udGhzXSAgfHxcbiAgICAgICAgICAgICAgICB5ZWFycyAgIDw9IDEgICAgICAgICAgICYmIFsneSddICAgICAgICAgICB8fCBbJ3l5JywgeWVhcnNdO1xuXG4gICAgICAgIGFbMl0gPSB3aXRob3V0U3VmZml4O1xuICAgICAgICBhWzNdID0gK3Bvc05lZ0R1cmF0aW9uID4gMDtcbiAgICAgICAgYVs0XSA9IGxvY2FsZTtcbiAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGVUaW1lQWdvLmFwcGx5KG51bGwsIGEpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgYSB0aHJlc2hvbGQgZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGR1cmF0aW9uX2h1bWFuaXplX19nZXRTZXRSZWxhdGl2ZVRpbWVUaHJlc2hvbGQgKHRocmVzaG9sZCwgbGltaXQpIHtcbiAgICAgICAgaWYgKHRocmVzaG9sZHNbdGhyZXNob2xkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJlc2hvbGRzW3RocmVzaG9sZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkc1t0aHJlc2hvbGRdID0gbGltaXQ7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGh1bWFuaXplICh3aXRoU3VmZml4KSB7XG4gICAgICAgIHZhciBsb2NhbGUgPSB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgdmFyIG91dHB1dCA9IGR1cmF0aW9uX2h1bWFuaXplX19yZWxhdGl2ZVRpbWUodGhpcywgIXdpdGhTdWZmaXgsIGxvY2FsZSk7XG5cbiAgICAgICAgaWYgKHdpdGhTdWZmaXgpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IGxvY2FsZS5wYXN0RnV0dXJlKCt0aGlzLCBvdXRwdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxvY2FsZS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIGlzb19zdHJpbmdfX2FicyA9IE1hdGguYWJzO1xuXG4gICAgZnVuY3Rpb24gaXNvX3N0cmluZ19fdG9JU09TdHJpbmcoKSB7XG4gICAgICAgIC8vIGZvciBJU08gc3RyaW5ncyB3ZSBkbyBub3QgdXNlIHRoZSBub3JtYWwgYnViYmxpbmcgcnVsZXM6XG4gICAgICAgIC8vICAqIG1pbGxpc2Vjb25kcyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgaG91cnNcbiAgICAgICAgLy8gICogZGF5cyBkbyBub3QgYnViYmxlIGF0IGFsbFxuICAgICAgICAvLyAgKiBtb250aHMgYnViYmxlIHVwIHVudGlsIHRoZXkgYmVjb21lIHllYXJzXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGVyZSBpcyBubyBjb250ZXh0LWZyZWUgY29udmVyc2lvbiBiZXR3ZWVuIGhvdXJzIGFuZCBkYXlzXG4gICAgICAgIC8vICh0aGluayBvZiBjbG9jayBjaGFuZ2VzKVxuICAgICAgICAvLyBhbmQgYWxzbyBub3QgYmV0d2VlbiBkYXlzIGFuZCBtb250aHMgKDI4LTMxIGRheXMgcGVyIG1vbnRoKVxuICAgICAgICB2YXIgc2Vjb25kcyA9IGlzb19zdHJpbmdfX2Ficyh0aGlzLl9taWxsaXNlY29uZHMpIC8gMTAwMDtcbiAgICAgICAgdmFyIGRheXMgICAgICAgICA9IGlzb19zdHJpbmdfX2Ficyh0aGlzLl9kYXlzKTtcbiAgICAgICAgdmFyIG1vbnRocyAgICAgICA9IGlzb19zdHJpbmdfX2Ficyh0aGlzLl9tb250aHMpO1xuICAgICAgICB2YXIgbWludXRlcywgaG91cnMsIHllYXJzO1xuXG4gICAgICAgIC8vIDM2MDAgc2Vjb25kcyAtPiA2MCBtaW51dGVzIC0+IDEgaG91clxuICAgICAgICBtaW51dGVzICAgICAgICAgICA9IGFic0Zsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgICAgIGhvdXJzICAgICAgICAgICAgID0gYWJzRmxvb3IobWludXRlcyAvIDYwKTtcbiAgICAgICAgc2Vjb25kcyAlPSA2MDtcbiAgICAgICAgbWludXRlcyAlPSA2MDtcblxuICAgICAgICAvLyAxMiBtb250aHMgLT4gMSB5ZWFyXG4gICAgICAgIHllYXJzICA9IGFic0Zsb29yKG1vbnRocyAvIDEyKTtcbiAgICAgICAgbW9udGhzICU9IDEyO1xuXG5cbiAgICAgICAgLy8gaW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL2RvcmRpbGxlL21vbWVudC1pc29kdXJhdGlvbi9ibG9iL21hc3Rlci9tb21lbnQuaXNvZHVyYXRpb24uanNcbiAgICAgICAgdmFyIFkgPSB5ZWFycztcbiAgICAgICAgdmFyIE0gPSBtb250aHM7XG4gICAgICAgIHZhciBEID0gZGF5cztcbiAgICAgICAgdmFyIGggPSBob3VycztcbiAgICAgICAgdmFyIG0gPSBtaW51dGVzO1xuICAgICAgICB2YXIgcyA9IHNlY29uZHM7XG4gICAgICAgIHZhciB0b3RhbCA9IHRoaXMuYXNTZWNvbmRzKCk7XG5cbiAgICAgICAgaWYgKCF0b3RhbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxuICAgICAgICAgICAgLy8gYnV0IG5vdCBvdGhlciBKUyAoZ29vZy5kYXRlKVxuICAgICAgICAgICAgcmV0dXJuICdQMEQnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICh0b3RhbCA8IDAgPyAnLScgOiAnJykgK1xuICAgICAgICAgICAgJ1AnICtcbiAgICAgICAgICAgIChZID8gWSArICdZJyA6ICcnKSArXG4gICAgICAgICAgICAoTSA/IE0gKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKEQgPyBEICsgJ0QnIDogJycpICtcbiAgICAgICAgICAgICgoaCB8fCBtIHx8IHMpID8gJ1QnIDogJycpICtcbiAgICAgICAgICAgIChoID8gaCArICdIJyA6ICcnKSArXG4gICAgICAgICAgICAobSA/IG0gKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKHMgPyBzICsgJ1MnIDogJycpO1xuICAgIH1cblxuICAgIHZhciBkdXJhdGlvbl9wcm90b3R5cGVfX3Byb3RvID0gRHVyYXRpb24ucHJvdG90eXBlO1xuXG4gICAgZHVyYXRpb25fcHJvdG90eXBlX19wcm90by5hYnMgICAgICAgICAgICA9IGR1cmF0aW9uX2Fic19fYWJzO1xuICAgIGR1cmF0aW9uX3Byb3RvdHlwZV9fcHJvdG8uYWRkICAgICAgICAgICAgPSBkdXJhdGlvbl9hZGRfc3VidHJhY3RfX2FkZDtcbiAgICBkdXJhdGlvbl9wcm90b3R5cGVfX3Byb3RvLnN1YnRyYWN0ICAgICAgID0gZHVyYXRpb25fYWRkX3N1YnRyYWN0X19zdWJ0cmFjdDtcbiAgICBkdXJhdGlvbl9wcm90b3R5cGVfX3Byb3RvLmFzICAgICAgICAgICAgID0gYXM7XG4gICAgZHVyYXRpb25fcHJvdG90eXBlX19wcm90by5hc01pbGxpc2Vjb25kcyA9IGFzTWlsbGlzZWNvbmRzO1xuICAgIGR1cmF0aW9uX3Byb3RvdHlwZV9fcHJvdG8uYXNTZWNvbmRzICAgICAgPSBhc1NlY29uZHM7XG4gICAgZHVyYXRpb25fcHJvdG90eXBlX19wcm90by5hc01pbnV0ZXMgICAgICA9IGFzTWludXRlcztcbiAgICBkdXJhdGlvbl9wcm90b3R5cGVfX3Byb3RvLmFzSG91cnMgICAgICAgID0gYXNIb3VycztcbiAgICBkdXJhdGlvbl9wcm90b3R5cGVfX3Byb3RvLmFzRGF5cyAgICAgICAgID0gYXNEYXlzO1xuICAgIGR1cmF0aW9uX3Byb3RvdHlwZV9fcHJvdG8uYXNXZWVrcyAgICAgICAgPSBhc1dlZWtzO1xuICAgIGR1cmF0aW9uX3Byb3RvdHlwZV9fcHJvdG8uYXNNb250aHMgICAgICAgPSBhc01vbnRocztcbiAgICBkdXJhdGlvbl9wcm90b3R5cGVfX3Byb3RvLmFzWWVhcnMgICAgICAgID0gYXNZZWFycztcbiAgICBkdXJhdGlvbl9wcm90b3R5cGVfX3Byb3RvLnZhbHVlT2YgICAgICAgID0gZHVyYXRpb25fYXNfX3ZhbHVlT2Y7XG4gICAgZHVyYXRpb25fcHJvdG90eXBlX19wcm90by5fYnViYmxlICAgICAgICA9IGJ1YmJsZTtcbiAgICBkdXJhdGlvbl9wcm90b3R5cGVfX3Byb3RvLmdldCAgICAgICAgICAgID0gZHVyYXRpb25fZ2V0X19nZXQ7XG4gICAgZHVyYXRpb25fcHJvdG90eXBlX19wcm90by5taWxsaXNlY29uZHMgICA9IG1pbGxpc2Vjb25kcztcbiAgICBkdXJhdGlvbl9wcm90b3R5cGVfX3Byb3RvLnNlY29uZHMgICAgICAgID0gc2Vjb25kcztcbiAgICBkdXJhdGlvbl9wcm90b3R5cGVfX3Byb3RvLm1pbnV0ZXMgICAgICAgID0gbWludXRlcztcbiAgICBkdXJhdGlvbl9wcm90b3R5cGVfX3Byb3RvLmhvdXJzICAgICAgICAgID0gaG91cnM7XG4gICAgZHVyYXRpb25fcHJvdG90eXBlX19wcm90by5kYXlzICAgICAgICAgICA9IGRheXM7XG4gICAgZHVyYXRpb25fcHJvdG90eXBlX19wcm90by53ZWVrcyAgICAgICAgICA9IHdlZWtzO1xuICAgIGR1cmF0aW9uX3Byb3RvdHlwZV9fcHJvdG8ubW9udGhzICAgICAgICAgPSBtb250aHM7XG4gICAgZHVyYXRpb25fcHJvdG90eXBlX19wcm90by55ZWFycyAgICAgICAgICA9IHllYXJzO1xuICAgIGR1cmF0aW9uX3Byb3RvdHlwZV9fcHJvdG8uaHVtYW5pemUgICAgICAgPSBodW1hbml6ZTtcbiAgICBkdXJhdGlvbl9wcm90b3R5cGVfX3Byb3RvLnRvSVNPU3RyaW5nICAgID0gaXNvX3N0cmluZ19fdG9JU09TdHJpbmc7XG4gICAgZHVyYXRpb25fcHJvdG90eXBlX19wcm90by50b1N0cmluZyAgICAgICA9IGlzb19zdHJpbmdfX3RvSVNPU3RyaW5nO1xuICAgIGR1cmF0aW9uX3Byb3RvdHlwZV9fcHJvdG8udG9KU09OICAgICAgICAgPSBpc29fc3RyaW5nX190b0lTT1N0cmluZztcbiAgICBkdXJhdGlvbl9wcm90b3R5cGVfX3Byb3RvLmxvY2FsZSAgICAgICAgID0gbG9jYWxlO1xuICAgIGR1cmF0aW9uX3Byb3RvdHlwZV9fcHJvdG8ubG9jYWxlRGF0YSAgICAgPSBsb2NhbGVEYXRhO1xuXG4gICAgLy8gRGVwcmVjYXRpb25zXG4gICAgZHVyYXRpb25fcHJvdG90eXBlX19wcm90by50b0lzb1N0cmluZyA9IGRlcHJlY2F0ZSgndG9Jc29TdHJpbmcoKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRvSVNPU3RyaW5nKCkgaW5zdGVhZCAobm90aWNlIHRoZSBjYXBpdGFscyknLCBpc29fc3RyaW5nX190b0lTT1N0cmluZyk7XG4gICAgZHVyYXRpb25fcHJvdG90eXBlX19wcm90by5sYW5nID0gbGFuZztcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdYJywgMCwgMCwgJ3VuaXgnKTtcbiAgICBhZGRGb3JtYXRUb2tlbigneCcsIDAsIDAsICd2YWx1ZU9mJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCd4JywgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1gnLCBtYXRjaFRpbWVzdGFtcCk7XG4gICAgYWRkUGFyc2VUb2tlbignWCcsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShwYXJzZUZsb2F0KGlucHV0LCAxMCkgKiAxMDAwKTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCd4JywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHRvSW50KGlucHV0KSk7XG4gICAgfSk7XG5cbiAgICAvLyBTaWRlIGVmZmVjdCBpbXBvcnRzXG5cblxuICAgIHV0aWxzX2hvb2tzX19ob29rcy52ZXJzaW9uID0gJzIuMTMuMCc7XG5cbiAgICBzZXRIb29rQ2FsbGJhY2sobG9jYWxfX2NyZWF0ZUxvY2FsKTtcblxuICAgIHV0aWxzX2hvb2tzX19ob29rcy5mbiAgICAgICAgICAgICAgICAgICAgPSBtb21lbnRQcm90b3R5cGU7XG4gICAgdXRpbHNfaG9va3NfX2hvb2tzLm1pbiAgICAgICAgICAgICAgICAgICA9IG1pbjtcbiAgICB1dGlsc19ob29rc19faG9va3MubWF4ICAgICAgICAgICAgICAgICAgID0gbWF4O1xuICAgIHV0aWxzX2hvb2tzX19ob29rcy5ub3cgICAgICAgICAgICAgICAgICAgPSBub3c7XG4gICAgdXRpbHNfaG9va3NfX2hvb2tzLnV0YyAgICAgICAgICAgICAgICAgICA9IGNyZWF0ZV91dGNfX2NyZWF0ZVVUQztcbiAgICB1dGlsc19ob29rc19faG9va3MudW5peCAgICAgICAgICAgICAgICAgID0gbW9tZW50X19jcmVhdGVVbml4O1xuICAgIHV0aWxzX2hvb2tzX19ob29rcy5tb250aHMgICAgICAgICAgICAgICAgPSBsaXN0c19fbGlzdE1vbnRocztcbiAgICB1dGlsc19ob29rc19faG9va3MuaXNEYXRlICAgICAgICAgICAgICAgID0gaXNEYXRlO1xuICAgIHV0aWxzX2hvb2tzX19ob29rcy5sb2NhbGUgICAgICAgICAgICAgICAgPSBsb2NhbGVfbG9jYWxlc19fZ2V0U2V0R2xvYmFsTG9jYWxlO1xuICAgIHV0aWxzX2hvb2tzX19ob29rcy5pbnZhbGlkICAgICAgICAgICAgICAgPSB2YWxpZF9fY3JlYXRlSW52YWxpZDtcbiAgICB1dGlsc19ob29rc19faG9va3MuZHVyYXRpb24gICAgICAgICAgICAgID0gY3JlYXRlX19jcmVhdGVEdXJhdGlvbjtcbiAgICB1dGlsc19ob29rc19faG9va3MuaXNNb21lbnQgICAgICAgICAgICAgID0gaXNNb21lbnQ7XG4gICAgdXRpbHNfaG9va3NfX2hvb2tzLndlZWtkYXlzICAgICAgICAgICAgICA9IGxpc3RzX19saXN0V2Vla2RheXM7XG4gICAgdXRpbHNfaG9va3NfX2hvb2tzLnBhcnNlWm9uZSAgICAgICAgICAgICA9IG1vbWVudF9fY3JlYXRlSW5ab25lO1xuICAgIHV0aWxzX2hvb2tzX19ob29rcy5sb2NhbGVEYXRhICAgICAgICAgICAgPSBsb2NhbGVfbG9jYWxlc19fZ2V0TG9jYWxlO1xuICAgIHV0aWxzX2hvb2tzX19ob29rcy5pc0R1cmF0aW9uICAgICAgICAgICAgPSBpc0R1cmF0aW9uO1xuICAgIHV0aWxzX2hvb2tzX19ob29rcy5tb250aHNTaG9ydCAgICAgICAgICAgPSBsaXN0c19fbGlzdE1vbnRoc1Nob3J0O1xuICAgIHV0aWxzX2hvb2tzX19ob29rcy53ZWVrZGF5c01pbiAgICAgICAgICAgPSBsaXN0c19fbGlzdFdlZWtkYXlzTWluO1xuICAgIHV0aWxzX2hvb2tzX19ob29rcy5kZWZpbmVMb2NhbGUgICAgICAgICAgPSBkZWZpbmVMb2NhbGU7XG4gICAgdXRpbHNfaG9va3NfX2hvb2tzLnVwZGF0ZUxvY2FsZSAgICAgICAgICA9IHVwZGF0ZUxvY2FsZTtcbiAgICB1dGlsc19ob29rc19faG9va3MubG9jYWxlcyAgICAgICAgICAgICAgID0gbG9jYWxlX2xvY2FsZXNfX2xpc3RMb2NhbGVzO1xuICAgIHV0aWxzX2hvb2tzX19ob29rcy53ZWVrZGF5c1Nob3J0ICAgICAgICAgPSBsaXN0c19fbGlzdFdlZWtkYXlzU2hvcnQ7XG4gICAgdXRpbHNfaG9va3NfX2hvb2tzLm5vcm1hbGl6ZVVuaXRzICAgICAgICA9IG5vcm1hbGl6ZVVuaXRzO1xuICAgIHV0aWxzX2hvb2tzX19ob29rcy5yZWxhdGl2ZVRpbWVUaHJlc2hvbGQgPSBkdXJhdGlvbl9odW1hbml6ZV9fZ2V0U2V0UmVsYXRpdmVUaW1lVGhyZXNob2xkO1xuICAgIHV0aWxzX2hvb2tzX19ob29rcy5wcm90b3R5cGUgICAgICAgICAgICAgPSBtb21lbnRQcm90b3R5cGU7XG5cbiAgICB2YXIgX21vbWVudCA9IHV0aWxzX2hvb2tzX19ob29rcztcblxuICAgIHJldHVybiBfbW9tZW50O1xuXG59KSk7IiwiLyohXG4gKiBub3JtYWxpemUtcGF0aCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvbm9ybWFsaXplLXBhdGg+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHN0ciwgc3RyaXBUcmFpbGluZykge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleHBlY3RlZCBhIHN0cmluZycpO1xuICB9XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC9bXFxcXFxcL10rL2csICcvJyk7XG4gIGlmIChzdHJpcFRyYWlsaW5nICE9PSBmYWxzZSkge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXC8kLywgJycpO1xuICB9XG4gIHJldHVybiBzdHI7XG59O1xuIiwiLyohXG4gKiBvYmplY3Qub21pdCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvb2JqZWN0Lm9taXQ+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnaXMtZXh0ZW5kYWJsZScpO1xudmFyIGZvck93biA9IHJlcXVpcmUoJ2Zvci1vd24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBvbWl0KG9iaiwga2V5cykge1xuICBpZiAoIWlzT2JqZWN0KG9iaikpIHJldHVybiB7fTtcblxuICB2YXIga2V5cyA9IFtdLmNvbmNhdC5hcHBseShbXSwgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgdmFyIGxhc3QgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gIHZhciByZXMgPSB7fSwgZm47XG5cbiAgaWYgKHR5cGVvZiBsYXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm4gPSBrZXlzLnBvcCgpO1xuICB9XG5cbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbic7XG4gIGlmICgha2V5cy5sZW5ndGggJiYgIWlzRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgZm9yT3duKG9iaiwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICBpZiAoa2V5cy5pbmRleE9mKGtleSkgPT09IC0xKSB7XG5cbiAgICAgIGlmICghaXNGdW5jdGlvbikge1xuICAgICAgICByZXNba2V5XSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChmbih2YWx1ZSwga2V5LCBvYmopKSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlcztcbn07XG4iLCIvKiFcbiAqIHBhcnNlLWdsb2IgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L3BhcnNlLWdsb2I+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE1LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpc0dsb2IgPSByZXF1aXJlKCdpcy1nbG9iJyk7XG52YXIgZmluZEJhc2UgPSByZXF1aXJlKCdnbG9iLWJhc2UnKTtcbnZhciBleHRnbG9iID0gcmVxdWlyZSgnaXMtZXh0Z2xvYicpO1xudmFyIGRvdGZpbGUgPSByZXF1aXJlKCdpcy1kb3RmaWxlJyk7XG5cbi8qKlxuICogRXhwb3NlIGBjYWNoZWBcbiAqL1xuXG52YXIgY2FjaGUgPSBtb2R1bGUuZXhwb3J0cy5jYWNoZSA9IHt9O1xuXG4vKipcbiAqIFBhcnNlIGEgZ2xvYiBwYXR0ZXJuIGludG8gdG9rZW5zLlxuICpcbiAqIFdoZW4gbm8gcGF0aHMgb3IgJyoqJyBhcmUgaW4gdGhlIGdsb2IsIHdlIHVzZSBhXG4gKiBkaWZmZXJlbnQgc3RyYXRlZ3kgZm9yIHBhcnNpbmcgdGhlIGZpbGVuYW1lLCBzaW5jZVxuICogZmlsZSBuYW1lcyBjYW4gY29udGFpbiBicmFjZXMgYW5kIG90aGVyIGRpZmZpY3VsdFxuICogcGF0dGVybnMuIHN1Y2ggYXM6XG4gKlxuICogIC0gYCoue2EsYn1gXG4gKiAgLSBgKCoqfCouanMpYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFyc2VHbG9iKGdsb2IpIHtcbiAgaWYgKGNhY2hlLmhhc093blByb3BlcnR5KGdsb2IpKSB7XG4gICAgcmV0dXJuIGNhY2hlW2dsb2JdO1xuICB9XG5cbiAgdmFyIHRvayA9IHt9O1xuICB0b2sub3JpZyA9IGdsb2I7XG4gIHRvay5pcyA9IHt9O1xuXG4gIC8vIHVuZXNjYXBlIGRvdHMgYW5kIHNsYXNoZXMgaW4gYnJhY2VzL2JyYWNrZXRzXG4gIGdsb2IgPSBlc2NhcGUoZ2xvYik7XG5cbiAgdmFyIHBhcnNlZCA9IGZpbmRCYXNlKGdsb2IpO1xuICB0b2suaXMuZ2xvYiA9IHBhcnNlZC5pc0dsb2I7XG5cbiAgdG9rLmdsb2IgPSBwYXJzZWQuZ2xvYjtcbiAgdG9rLmJhc2UgPSBwYXJzZWQuYmFzZTtcbiAgdmFyIHNlZ3MgPSAvKFteXFwvXSopJC8uZXhlYyhnbG9iKTtcblxuICB0b2sucGF0aCA9IHt9O1xuICB0b2sucGF0aC5kaXJuYW1lID0gJyc7XG4gIHRvay5wYXRoLmJhc2VuYW1lID0gc2Vnc1sxXSB8fCAnJztcbiAgdG9rLnBhdGguZGlybmFtZSA9IGdsb2Iuc3BsaXQodG9rLnBhdGguYmFzZW5hbWUpLmpvaW4oJycpIHx8ICcnO1xuICB2YXIgYmFzZW5hbWUgPSAodG9rLnBhdGguYmFzZW5hbWUgfHwgJycpLnNwbGl0KCcuJykgfHwgJyc7XG4gIHRvay5wYXRoLmZpbGVuYW1lID0gYmFzZW5hbWVbMF0gfHwgJyc7XG4gIHRvay5wYXRoLmV4dG5hbWUgPSBiYXNlbmFtZS5zbGljZSgxKS5qb2luKCcuJykgfHwgJyc7XG4gIHRvay5wYXRoLmV4dCA9ICcnO1xuXG4gIGlmIChpc0dsb2IodG9rLnBhdGguZGlybmFtZSkgJiYgIXRvay5wYXRoLmJhc2VuYW1lKSB7XG4gICAgaWYgKCEvXFwvJC8udGVzdCh0b2suZ2xvYikpIHtcbiAgICAgIHRvay5wYXRoLmJhc2VuYW1lID0gdG9rLmdsb2I7XG4gICAgfVxuICAgIHRvay5wYXRoLmRpcm5hbWUgPSB0b2suYmFzZTtcbiAgfVxuXG4gIGlmIChnbG9iLmluZGV4T2YoJy8nKSA9PT0gLTEgJiYgIXRvay5pcy5nbG9ic3Rhcikge1xuICAgIHRvay5wYXRoLmRpcm5hbWUgPSAnJztcbiAgICB0b2sucGF0aC5iYXNlbmFtZSA9IHRvay5vcmlnO1xuICB9XG5cbiAgdmFyIGRvdCA9IHRvay5wYXRoLmJhc2VuYW1lLmluZGV4T2YoJy4nKTtcbiAgaWYgKGRvdCAhPT0gLTEpIHtcbiAgICB0b2sucGF0aC5maWxlbmFtZSA9IHRvay5wYXRoLmJhc2VuYW1lLnNsaWNlKDAsIGRvdCk7XG4gICAgdG9rLnBhdGguZXh0bmFtZSA9IHRvay5wYXRoLmJhc2VuYW1lLnNsaWNlKGRvdCk7XG4gIH1cblxuICBpZiAodG9rLnBhdGguZXh0bmFtZS5jaGFyQXQoMCkgPT09ICcuJykge1xuICAgIHZhciBleHRzID0gdG9rLnBhdGguZXh0bmFtZS5zcGxpdCgnLicpO1xuICAgIHRvay5wYXRoLmV4dCA9IGV4dHNbZXh0cy5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIC8vIHVuZXNjYXBlIGRvdHMgYW5kIHNsYXNoZXMgaW4gYnJhY2VzL2JyYWNrZXRzXG4gIHRvay5nbG9iID0gdW5lc2NhcGUodG9rLmdsb2IpO1xuICB0b2sucGF0aC5kaXJuYW1lID0gdW5lc2NhcGUodG9rLnBhdGguZGlybmFtZSk7XG4gIHRvay5wYXRoLmJhc2VuYW1lID0gdW5lc2NhcGUodG9rLnBhdGguYmFzZW5hbWUpO1xuICB0b2sucGF0aC5maWxlbmFtZSA9IHVuZXNjYXBlKHRvay5wYXRoLmZpbGVuYW1lKTtcbiAgdG9rLnBhdGguZXh0bmFtZSA9IHVuZXNjYXBlKHRvay5wYXRoLmV4dG5hbWUpO1xuXG4gIC8vIEJvb2xlYW5zXG4gIHZhciBpcyA9IChnbG9iICYmIHRvay5pcy5nbG9iKTtcbiAgdG9rLmlzLm5lZ2F0ZWQgID0gZ2xvYiAmJiBnbG9iLmNoYXJBdCgwKSA9PT0gJyEnO1xuICB0b2suaXMuZXh0Z2xvYiAgPSBnbG9iICYmIGV4dGdsb2IoZ2xvYik7XG4gIHRvay5pcy5icmFjZXMgICA9IGhhcyhpcywgZ2xvYiwgJ3snKTtcbiAgdG9rLmlzLmJyYWNrZXRzID0gaGFzKGlzLCBnbG9iLCAnWzonKTtcbiAgdG9rLmlzLmdsb2JzdGFyID0gaGFzKGlzLCBnbG9iLCAnKionKTtcbiAgdG9rLmlzLmRvdGZpbGUgID0gZG90ZmlsZSh0b2sucGF0aC5iYXNlbmFtZSkgfHwgZG90ZmlsZSh0b2sucGF0aC5maWxlbmFtZSk7XG4gIHRvay5pcy5kb3RkaXIgICA9IGRvdGRpcih0b2sucGF0aC5kaXJuYW1lKTtcbiAgcmV0dXJuIChjYWNoZVtnbG9iXSA9IHRvayk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnbG9iIG1hdGNoZXMgZG90LWRpcmVjdG9yaWVzLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gYHRva2AgVGhlIHRva2VucyBvYmplY3RcbiAqIEBwYXJhbSAge09iamVjdH0gYHBhdGhgIFRoZSBwYXRoIG9iamVjdFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGRvdGRpcihiYXNlKSB7XG4gIGlmIChiYXNlLmluZGV4T2YoJy8uJykgIT09IC0xKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGJhc2UuY2hhckF0KDApID09PSAnLicgJiYgYmFzZS5jaGFyQXQoMSkgIT09ICcvJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdHRlcm4gaGFzIHRoZSBnaXZlbiBgY2hgYXJhY3RlcihzKVxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gYGdsb2JgIFRoZSBnbG9iIHBhdHRlcm4uXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBjaGAgVGhlIGNoYXJhY3RlciB0byB0ZXN0IGZvclxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGhhcyhpcywgZ2xvYiwgY2gpIHtcbiAgcmV0dXJuIGlzICYmIGdsb2IuaW5kZXhPZihjaCkgIT09IC0xO1xufVxuXG4vKipcbiAqIEVzY2FwZS91bmVzY2FwZSB1dGlsc1xuICovXG5cbmZ1bmN0aW9uIGVzY2FwZShzdHIpIHtcbiAgdmFyIHJlID0gL1xceyhbXnt9XSo/KX18XFwoKFteKCldKj8pXFwpfFxcWyhbXlxcW1xcXV0qPylcXF0vZztcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKHJlLCBmdW5jdGlvbiAob3V0dGVyLCBicmFjZXMsIHBhcmVucywgYnJhY2tldHMpIHtcbiAgICB2YXIgaW5uZXIgPSBicmFjZXMgfHwgcGFyZW5zIHx8IGJyYWNrZXRzO1xuICAgIGlmICghaW5uZXIpIHsgcmV0dXJuIG91dHRlcjsgfVxuICAgIHJldHVybiBvdXR0ZXIuc3BsaXQoaW5uZXIpLmpvaW4oZXNjKGlubmVyKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlc2Moc3RyKSB7XG4gIHN0ciA9IHN0ci5zcGxpdCgnLycpLmpvaW4oJ19fU0xBU0hfXycpO1xuICBzdHIgPSBzdHIuc3BsaXQoJy4nKS5qb2luKCdfX0RPVF9fJyk7XG4gIHJldHVybiBzdHI7XG59XG5cbmZ1bmN0aW9uIHVuZXNjYXBlKHN0cikge1xuICBzdHIgPSBzdHIuc3BsaXQoJ19fU0xBU0hfXycpLmpvaW4oJy8nKTtcbiAgc3RyID0gc3RyLnNwbGl0KCdfX0RPVF9fJykuam9pbignLicpO1xuICByZXR1cm4gc3RyO1xufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIHJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCBhcnJheSB3aXRoIGRpcmVjdG9yeSBuYW1lcyB0aGVyZVxuLy8gbXVzdCBiZSBubyBzbGFzaGVzLCBlbXB0eSBlbGVtZW50cywgb3IgZGV2aWNlIG5hbWVzIChjOlxcKSBpbiB0aGUgYXJyYXlcbi8vIChzbyBhbHNvIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMgLSBpdCBkb2VzIG5vdCBkaXN0aW5ndWlzaFxuLy8gcmVsYXRpdmUgYW5kIGFic29sdXRlIHBhdGhzKVxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocGFydHMsIGFsbG93QWJvdmVSb290KSB7XG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBsYXN0ID0gcGFydHNbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBwYXJ0cy51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG52YXIgc3BsaXRQYXRoUmUgPVxuICAgIC9eKFxcLz98KShbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXlxcL10rP3wpKFxcLlteLlxcL10qfCkpKD86W1xcL10qKSQvO1xudmFyIHNwbGl0UGF0aCA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTtcbn07XG5cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICB2YXIgcGF0aCA9IChpID49IDApID8gYXJndW1lbnRzW2ldIDogcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDtcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIHJldHVybiAoKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGgpIHx8ICcuJztcbn07XG5cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIGlmICghcGF0aCAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHBhdGggPSAnLic7XG4gIH1cbiAgaWYgKHBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIHBhdGggKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmpvaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGV4cG9ydHMubm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn07XG5cblxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xuICBmcm9tID0gZXhwb3J0cy5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSBleHBvcnRzLnJlc29sdmUodG8pLnN1YnN0cigxKTtcblxuICBmdW5jdGlvbiB0cmltKGFycikge1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgaWYgKGFycltlbmRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTtcbiAgfVxuXG4gIHZhciBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcblxuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn07XG5cbmV4cG9ydHMuc2VwID0gJy8nO1xuZXhwb3J0cy5kZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydHMuZGlybmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKSxcbiAgICAgIHJvb3QgPSByZXN1bHRbMF0sXG4gICAgICBkaXIgPSByZXN1bHRbMV07XG5cbiAgaWYgKCFyb290ICYmICFkaXIpIHtcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcbiAgICByZXR1cm4gJy4nO1xuICB9XG5cbiAgaWYgKGRpcikge1xuICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gcm9vdCArIGRpcjtcbn07XG5cblxuZXhwb3J0cy5iYXNlbmFtZSA9IGZ1bmN0aW9uKHBhdGgsIGV4dCkge1xuICB2YXIgZiA9IHNwbGl0UGF0aChwYXRoKVsyXTtcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBmO1xufTtcblxuXG5leHBvcnRzLmV4dG5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBzcGxpdFBhdGgocGF0aClbM107XG59O1xuXG5mdW5jdGlvbiBmaWx0ZXIgKHhzLCBmKSB7XG4gICAgaWYgKHhzLmZpbHRlcikgcmV0dXJuIHhzLmZpbHRlcihmKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZih4c1tpXSwgaSwgeHMpKSByZXMucHVzaCh4c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8vIFN0cmluZy5wcm90b3R5cGUuc3Vic3RyIC0gbmVnYXRpdmUgaW5kZXggZG9uJ3Qgd29yayBpbiBJRThcbnZhciBzdWJzdHIgPSAnYWInLnN1YnN0cigtMSkgPT09ICdiJ1xuICAgID8gZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikgeyByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKSB9XG4gICAgOiBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gc3RyLmxlbmd0aCArIHN0YXJ0O1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKTtcbiAgICB9XG47XG4iLCIvKiFcbiAqIHByZXNlcnZlIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9wcmVzZXJ2ZT5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFJlcGxhY2UgdG9rZW5zIGluIGBzdHJgIHdpdGggYSB0ZW1wb3JhcnksIGhldXJpc3RpYyBwbGFjZWhvbGRlci5cbiAqXG4gKiBgYGBqc1xuICogdG9rZW5zLmJlZm9yZSgne2FcXFxcLGJ9Jyk7XG4gKiAvLz0+ICd7X19JRDFfX30nXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdHJgXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFN0cmluZyB3aXRoIHBsYWNlaG9sZGVycy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5iZWZvcmUgPSBmdW5jdGlvbiBiZWZvcmUoc3RyLCByZSkge1xuICByZXR1cm4gc3RyLnJlcGxhY2UocmUsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHZhciBpZCA9IHJhbmRvbWl6ZSgpO1xuICAgIGNhY2hlW2lkXSA9IG1hdGNoO1xuICAgIHJldHVybiAnX19JRCcgKyBpZCArICdfXyc7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXBsYWNlIHBsYWNlaG9sZGVycyBpbiBgc3RyYCB3aXRoIG9yaWdpbmFsIHRva2Vucy5cbiAqXG4gKiBgYGBqc1xuICogdG9rZW5zLmFmdGVyKCd7X19JRDFfX30nKTtcbiAqIC8vPT4gJ3thXFxcXCxifSdcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmAgU3RyaW5nIHdpdGggcGxhY2Vob2xkZXJzXG4gKiBAcmV0dXJuIHtTdHJpbmd9IGBzdHJgIFN0cmluZyB3aXRoIG9yaWdpbmFsIHRva2Vucy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5hZnRlciA9IGZ1bmN0aW9uIGFmdGVyKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL19fSUQoLns1fSlfXy9nLCBmdW5jdGlvbiAoXywgaWQpIHtcbiAgICByZXR1cm4gY2FjaGVbaWRdO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIHJhbmRvbWl6ZSgpIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5zbGljZSgyLCA3KTtcbn1cblxudmFyIGNhY2hlID0ge307IiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIvKiEgaHR0cHM6Ly9tdGhzLmJlL3B1bnljb2RlIHYxLjQuMSBieSBAbWF0aGlhcyAqL1xuOyhmdW5jdGlvbihyb290KSB7XG5cblx0LyoqIERldGVjdCBmcmVlIHZhcmlhYmxlcyAqL1xuXHR2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmXG5cdFx0IWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblx0dmFyIGZyZWVNb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJlxuXHRcdCFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXHR2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsO1xuXHRpZiAoXG5cdFx0ZnJlZUdsb2JhbC5nbG9iYWwgPT09IGZyZWVHbG9iYWwgfHxcblx0XHRmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwuc2VsZiA9PT0gZnJlZUdsb2JhbFxuXHQpIHtcblx0XHRyb290ID0gZnJlZUdsb2JhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgYHB1bnljb2RlYCBvYmplY3QuXG5cdCAqIEBuYW1lIHB1bnljb2RlXG5cdCAqIEB0eXBlIE9iamVjdFxuXHQgKi9cblx0dmFyIHB1bnljb2RlLFxuXG5cdC8qKiBIaWdoZXN0IHBvc2l0aXZlIHNpZ25lZCAzMi1iaXQgZmxvYXQgdmFsdWUgKi9cblx0bWF4SW50ID0gMjE0NzQ4MzY0NywgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG5cdC8qKiBCb290c3RyaW5nIHBhcmFtZXRlcnMgKi9cblx0YmFzZSA9IDM2LFxuXHR0TWluID0gMSxcblx0dE1heCA9IDI2LFxuXHRza2V3ID0gMzgsXG5cdGRhbXAgPSA3MDAsXG5cdGluaXRpYWxCaWFzID0gNzIsXG5cdGluaXRpYWxOID0gMTI4LCAvLyAweDgwXG5cdGRlbGltaXRlciA9ICctJywgLy8gJ1xceDJEJ1xuXG5cdC8qKiBSZWd1bGFyIGV4cHJlc3Npb25zICovXG5cdHJlZ2V4UHVueWNvZGUgPSAvXnhuLS0vLFxuXHRyZWdleE5vbkFTQ0lJID0gL1teXFx4MjAtXFx4N0VdLywgLy8gdW5wcmludGFibGUgQVNDSUkgY2hhcnMgKyBub24tQVNDSUkgY2hhcnNcblx0cmVnZXhTZXBhcmF0b3JzID0gL1tcXHgyRVxcdTMwMDJcXHVGRjBFXFx1RkY2MV0vZywgLy8gUkZDIDM0OTAgc2VwYXJhdG9yc1xuXG5cdC8qKiBFcnJvciBtZXNzYWdlcyAqL1xuXHRlcnJvcnMgPSB7XG5cdFx0J292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcblx0XHQnbm90LWJhc2ljJzogJ0lsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCknLFxuXHRcdCdpbnZhbGlkLWlucHV0JzogJ0ludmFsaWQgaW5wdXQnXG5cdH0sXG5cblx0LyoqIENvbnZlbmllbmNlIHNob3J0Y3V0cyAqL1xuXHRiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW4sXG5cdGZsb29yID0gTWF0aC5mbG9vcixcblx0c3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZSxcblxuXHQvKiogVGVtcG9yYXJ5IHZhcmlhYmxlICovXG5cdGtleTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGVycm9yIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuXHQgKiBAcmV0dXJucyB7RXJyb3J9IFRocm93cyBhIGBSYW5nZUVycm9yYCB3aXRoIHRoZSBhcHBsaWNhYmxlIGVycm9yIG1lc3NhZ2UuXG5cdCAqL1xuXHRmdW5jdGlvbiBlcnJvcih0eXBlKSB7XG5cdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG5cdCAqIGl0ZW0uXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcChhcnJheSwgZm4pIHtcblx0XHR2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHRcdHZhciByZXN1bHQgPSBbXTtcblx0XHR3aGlsZSAobGVuZ3RoLS0pIHtcblx0XHRcdHJlc3VsdFtsZW5ndGhdID0gZm4oYXJyYXlbbGVuZ3RoXSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzIG9yIGVtYWlsXG5cdCAqIGFkZHJlc3Nlcy5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcy5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5XG5cdCAqIGNoYXJhY3Rlci5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2tcblx0ICogZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXBEb21haW4oc3RyaW5nLCBmbikge1xuXHRcdHZhciBwYXJ0cyA9IHN0cmluZy5zcGxpdCgnQCcpO1xuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gSW4gZW1haWwgYWRkcmVzc2VzLCBvbmx5IHRoZSBkb21haW4gbmFtZSBzaG91bGQgYmUgcHVueWNvZGVkLiBMZWF2ZVxuXHRcdFx0Ly8gdGhlIGxvY2FsIHBhcnQgKGkuZS4gZXZlcnl0aGluZyB1cCB0byBgQGApIGludGFjdC5cblx0XHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuXHRcdFx0c3RyaW5nID0gcGFydHNbMV07XG5cdFx0fVxuXHRcdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleFNlcGFyYXRvcnMsICdcXHgyRScpO1xuXHRcdHZhciBsYWJlbHMgPSBzdHJpbmcuc3BsaXQoJy4nKTtcblx0XHR2YXIgZW5jb2RlZCA9IG1hcChsYWJlbHMsIGZuKS5qb2luKCcuJyk7XG5cdFx0cmV0dXJuIHJlc3VsdCArIGVuY29kZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBudW1lcmljIGNvZGUgcG9pbnRzIG9mIGVhY2ggVW5pY29kZVxuXHQgKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG5cdCAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG5cdCAqIFVDUy0yIGV4cG9zZXMgYXMgc2VwYXJhdGUgY2hhcmFjdGVycykgaW50byBhIHNpbmdsZSBjb2RlIHBvaW50LFxuXHQgKiBtYXRjaGluZyBVVEYtMTYuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZW5jb2RlYFxuXHQgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZGVjb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIFVuaWNvZGUgaW5wdXQgc3RyaW5nIChVQ1MtMikuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJkZWNvZGUoc3RyaW5nKSB7XG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBjb3VudGVyID0gMCxcblx0XHQgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcblx0XHQgICAgdmFsdWUsXG5cdFx0ICAgIGV4dHJhO1xuXHRcdHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHR2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3RlclxuXHRcdFx0XHRleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBsb3cgc3Vycm9nYXRlXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGUgbmV4dFxuXHRcdFx0XHRcdC8vIGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0XHRjb3VudGVyLS07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3RyaW5nIGJhc2VkIG9uIGFuIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZGVjb2RlYFxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBlbmNvZGVcblx0ICogQHBhcmFtIHtBcnJheX0gY29kZVBvaW50cyBUaGUgYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIG5ldyBVbmljb2RlIHN0cmluZyAoVUNTLTIpLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSkge1xuXHRcdHJldHVybiBtYXAoYXJyYXksIGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0XHRpZiAodmFsdWUgPiAweEZGRkYpIHtcblx0XHRcdFx0dmFsdWUgLT0gMHgxMDAwMDtcblx0XHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG5cdFx0XHRcdHZhbHVlID0gMHhEQzAwIHwgdmFsdWUgJiAweDNGRjtcblx0XHRcdH1cblx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUpO1xuXHRcdFx0cmV0dXJuIG91dHB1dDtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGJhc2ljIGNvZGUgcG9pbnQgaW50byBhIGRpZ2l0L2ludGVnZXIuXG5cdCAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gY29kZVBvaW50IFRoZSBiYXNpYyBudW1lcmljIGNvZGUgcG9pbnQgdmFsdWUuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGluIHRoZSByYW5nZSBgMGAgdG8gYGJhc2UgLSAxYCwgb3IgYGJhc2VgIGlmXG5cdCAqIHRoZSBjb2RlIHBvaW50IGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbHVlLlxuXHQgKi9cblx0ZnVuY3Rpb24gYmFzaWNUb0RpZ2l0KGNvZGVQb2ludCkge1xuXHRcdGlmIChjb2RlUG9pbnQgLSA0OCA8IDEwKSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gMjI7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA2NSA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gNjU7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA5NyA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gOTc7XG5cdFx0fVxuXHRcdHJldHVybiBiYXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHNlZSBgYmFzaWNUb0RpZ2l0KClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBiYXNpYyBjb2RlIHBvaW50IHdob3NlIHZhbHVlICh3aGVuIHVzZWQgZm9yXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaXMgYGRpZ2l0YCwgd2hpY2ggbmVlZHMgdG8gYmUgaW4gdGhlIHJhbmdlXG5cdCAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xuXHQgKiB1c2VkOyBlbHNlLCB0aGUgbG93ZXJjYXNlIGZvcm0gaXMgdXNlZC4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZFxuXHQgKiBpZiBgZmxhZ2AgaXMgbm9uLXplcm8gYW5kIGBkaWdpdGAgaGFzIG5vIHVwcGVyY2FzZSBmb3JtLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGlnaXRUb0Jhc2ljKGRpZ2l0LCBmbGFnKSB7XG5cdFx0Ly8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcblx0XHQvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcblx0XHRyZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG5cdCAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0XHR2YXIgayA9IDA7XG5cdFx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0XHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdFx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcblx0ICogc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG5cdFx0Ly8gRG9uJ3QgdXNlIFVDUy0yXG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgb3V0LFxuXHRcdCAgICBpID0gMCxcblx0XHQgICAgbiA9IGluaXRpYWxOLFxuXHRcdCAgICBiaWFzID0gaW5pdGlhbEJpYXMsXG5cdFx0ICAgIGJhc2ljLFxuXHRcdCAgICBqLFxuXHRcdCAgICBpbmRleCxcblx0XHQgICAgb2xkaSxcblx0XHQgICAgdyxcblx0XHQgICAgayxcblx0XHQgICAgZGlnaXQsXG5cdFx0ICAgIHQsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBiYXNlTWludXNUO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdFx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0XHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRcdGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0XHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0XHRiYXNpYyA9IDA7XG5cdFx0fVxuXG5cdFx0Zm9yIChqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdFx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRcdGZvciAoaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRcdGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0XHRpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGlnaXQgPSBiYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPiBmbG9vcigobWF4SW50IC0gaSkgLyB3KSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aSArPSBkaWdpdCAqIHc7XG5cdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0aWYgKHcgPiBmbG9vcihtYXhJbnQgLyBiYXNlTWludXNUKSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdFx0YmlhcyA9IGFkYXB0KGkgLSBvbGRpLCBvdXQsIG9sZGkgPT0gMCk7XG5cblx0XHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdFx0aWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0biArPSBmbG9vcihpIC8gb3V0KTtcblx0XHRcdGkgJT0gb3V0O1xuXG5cdFx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0XG5cdFx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG5cdCAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuXHRcdHZhciBuLFxuXHRcdCAgICBkZWx0YSxcblx0XHQgICAgaGFuZGxlZENQQ291bnQsXG5cdFx0ICAgIGJhc2ljTGVuZ3RoLFxuXHRcdCAgICBiaWFzLFxuXHRcdCAgICBqLFxuXHRcdCAgICBtLFxuXHRcdCAgICBxLFxuXHRcdCAgICBrLFxuXHRcdCAgICB0LFxuXHRcdCAgICBjdXJyZW50VmFsdWUsXG5cdFx0ICAgIG91dHB1dCA9IFtdLFxuXHRcdCAgICAvKiogYGlucHV0TGVuZ3RoYCB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiBgaW5wdXRgLiAqL1xuXHRcdCAgICBpbnB1dExlbmd0aCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50UGx1c09uZSxcblx0XHQgICAgYmFzZU1pbnVzVCxcblx0XHQgICAgcU1pbnVzVDtcblxuXHRcdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcblx0XHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdFx0Ly8gQ2FjaGUgdGhlIGxlbmd0aFxuXHRcdGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcblx0XHRuID0gaW5pdGlhbE47XG5cdFx0ZGVsdGEgPSAwO1xuXHRcdGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHNcblx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cblx0XHQvLyBgaGFuZGxlZENQQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcblx0XHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0XHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcblx0XHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRcdG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHRcdHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG5cblx0XHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0XHRmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XG5cdFx0XHRoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRcdG4gPSBtO1xuXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID09IG4pIHtcblx0XHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlclxuXHRcdFx0XHRcdGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRcdGRlbHRhID0gMDtcblx0XHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCsrZGVsdGE7XG5cdFx0XHQrK247XG5cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG5cdCAqIHRvIFVuaWNvZGUuIE9ubHkgdGhlIFB1bnljb2RlZCBwYXJ0cyBvZiB0aGUgaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQsIGkuZS5cblx0ICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG5cdCAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuXHQgKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBQdW55Y29kZVxuXHQgKiBzdHJpbmcuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1VuaWNvZGUoaW5wdXQpIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/IGRlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIFB1bnljb2RlLiBPbmx5IHRoZSBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLFxuXHQgKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cblx0ICogQVNDSUkuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuXHQgKiBVbmljb2RlIHN0cmluZy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFB1bnljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkb21haW4gbmFtZSBvclxuXHQgKiBlbWFpbCBhZGRyZXNzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG5cdHB1bnljb2RlID0ge1xuXHRcdC8qKlxuXHRcdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHQgKi9cblx0XHQndmVyc2lvbic6ICcxLjQuMScsXG5cdFx0LyoqXG5cdFx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcblx0XHQgKiByZXByZXNlbnRhdGlvbiAoVUNTLTIpIHRvIFVuaWNvZGUgY29kZSBwb2ludHMsIGFuZCBiYWNrLlxuXHRcdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIE9iamVjdFxuXHRcdCAqL1xuXHRcdCd1Y3MyJzoge1xuXHRcdFx0J2RlY29kZSc6IHVjczJkZWNvZGUsXG5cdFx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHRcdH0sXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0XHQndG9Vbmljb2RlJzogdG9Vbmljb2RlXG5cdH07XG5cblx0LyoqIEV4cG9zZSBgcHVueWNvZGVgICovXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKCdwdW55Y29kZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHB1bnljb2RlO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMpIHtcblx0XHRcdC8vIGluIE5vZGUuanMsIGlvLmpzLCBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0Zm9yIChrZXkgaW4gcHVueWNvZGUpIHtcblx0XHRcdFx0cHVueWNvZGUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IHB1bnljb2RlW2tleV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5wdW55Y29kZSA9IHB1bnljb2RlO1xuXHR9XG5cbn0odGhpcykpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gSWYgb2JqLmhhc093blByb3BlcnR5IGhhcyBiZWVuIG92ZXJyaWRkZW4sIHRoZW4gY2FsbGluZ1xuLy8gb2JqLmhhc093blByb3BlcnR5KHByb3ApIHdpbGwgYnJlYWsuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcwN1xuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihxcywgc2VwLCBlcSwgb3B0aW9ucykge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIGlmICh0eXBlb2YgcXMgIT09ICdzdHJpbmcnIHx8IHFzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB2YXIgcmVnZXhwID0gL1xcKy9nO1xuICBxcyA9IHFzLnNwbGl0KHNlcCk7XG5cbiAgdmFyIG1heEtleXMgPSAxMDAwO1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5tYXhLZXlzID09PSAnbnVtYmVyJykge1xuICAgIG1heEtleXMgPSBvcHRpb25zLm1heEtleXM7XG4gIH1cblxuICB2YXIgbGVuID0gcXMubGVuZ3RoO1xuICAvLyBtYXhLZXlzIDw9IDAgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbm90IGxpbWl0IGtleXMgY291bnRcbiAgaWYgKG1heEtleXMgPiAwICYmIGxlbiA+IG1heEtleXMpIHtcbiAgICBsZW4gPSBtYXhLZXlzO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciB4ID0gcXNbaV0ucmVwbGFjZShyZWdleHAsICclMjAnKSxcbiAgICAgICAgaWR4ID0geC5pbmRleE9mKGVxKSxcbiAgICAgICAga3N0ciwgdnN0ciwgaywgdjtcblxuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAga3N0ciA9IHguc3Vic3RyKDAsIGlkeCk7XG4gICAgICB2c3RyID0geC5zdWJzdHIoaWR4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtzdHIgPSB4O1xuICAgICAgdnN0ciA9ICcnO1xuICAgIH1cblxuICAgIGsgPSBkZWNvZGVVUklDb21wb25lbnQoa3N0cik7XG4gICAgdiA9IGRlY29kZVVSSUNvbXBvbmVudCh2c3RyKTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkob2JqLCBrKSkge1xuICAgICAgb2JqW2tdID0gdjtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgb2JqW2tdLnB1c2godik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtrXSA9IFtvYmpba10sIHZdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnlQcmltaXRpdmUgPSBmdW5jdGlvbih2KSB7XG4gIHN3aXRjaCAodHlwZW9mIHYpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHY7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB2ID8gJ3RydWUnIDogJ2ZhbHNlJztcblxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gaXNGaW5pdGUodikgPyB2IDogJyc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iaiwgc2VwLCBlcSwgbmFtZSkge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIG9iaiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBtYXAob2JqZWN0S2V5cyhvYmopLCBmdW5jdGlvbihrKSB7XG4gICAgICB2YXIga3MgPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKGspKSArIGVxO1xuICAgICAgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgICByZXR1cm4gbWFwKG9ialtrXSwgZnVuY3Rpb24odikge1xuICAgICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUodikpO1xuICAgICAgICB9KS5qb2luKHNlcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9ialtrXSkpO1xuICAgICAgfVxuICAgIH0pLmpvaW4oc2VwKTtcblxuICB9XG5cbiAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG5hbWUpKSArIGVxICtcbiAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqKSk7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuZnVuY3Rpb24gbWFwICh4cywgZikge1xuICBpZiAoeHMubWFwKSByZXR1cm4geHMubWFwKGYpO1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICByZXMucHVzaChmKHhzW2ldLCBpKSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSByZXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMucGFyc2UgPSByZXF1aXJlKCcuL2RlY29kZScpO1xuZXhwb3J0cy5lbmNvZGUgPSBleHBvcnRzLnN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vZW5jb2RlJyk7XG4iLCIvKiFcbiAqIHJhbmRvbWF0aWMgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L3JhbmRvbWF0aWM+XG4gKlxuICogVGhpcyB3YXMgb3JpZ2luYWxseSBpbnNwaXJlZCBieSA8aHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTA3MjcxNTUvMTI2NzYzOT5cbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzTnVtYmVyID0gcmVxdWlyZSgnaXMtbnVtYmVyJyk7XG52YXIgdHlwZU9mID0gcmVxdWlyZSgna2luZC1vZicpO1xuXG4vKipcbiAqIEV4cG9zZSBgcmFuZG9tYXRpY2BcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJhbmRvbWF0aWM7XG5cbi8qKlxuICogQXZhaWxhYmxlIG1hc2sgY2hhcmFjdGVyc1xuICovXG5cbnZhciB0eXBlID0ge1xuICBsb3dlcjogJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyxcbiAgdXBwZXI6ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicsXG4gIG51bWJlcjogJzAxMjM0NTY3ODknLFxuICBzcGVjaWFsOiAnfiFAIyQlXiYoKV8rLT17fVtdO1xcJywuJ1xufTtcblxudHlwZS5hbGwgPSB0eXBlLmxvd2VyICsgdHlwZS51cHBlciArIHR5cGUubnVtYmVyO1xuXG4vKipcbiAqIEdlbmVyYXRlIHJhbmRvbSBjaGFyYWN0ZXIgc2VxdWVuY2VzIG9mIGEgc3BlY2lmaWVkIGBsZW5ndGhgLFxuICogYmFzZWQgb24gdGhlIGdpdmVuIGBwYXR0ZXJuYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIFRoZSBwYXR0ZXJuIHRvIHVzZSBmb3IgZ2VuZXJhdGluZyB0aGUgcmFuZG9tIHN0cmluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBgbGVuZ3RoYCBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdG8gZ2VuZXJhdGUuXG4gKiBAcGFyYW0ge1N0cmluZ30gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHJhbmRvbWF0aWMocGF0dGVybiwgbGVuZ3RoLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JhbmRvbWF0aWMgZXhwZWN0cyBhIHN0cmluZyBvciBudW1iZXIuJyk7XG4gIH1cblxuICB2YXIgY3VzdG9tID0gZmFsc2U7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgICAgbGVuZ3RoID0gcGF0dGVybi5sZW5ndGg7XG5cbiAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKHBhdHRlcm4pKSB7XG4gICAgICBvcHRpb25zID0ge307IGxlbmd0aCA9IHBhdHRlcm47IHBhdHRlcm4gPSAnKic7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVPZihsZW5ndGgpID09PSAnb2JqZWN0JyAmJiBsZW5ndGguaGFzT3duUHJvcGVydHkoJ2NoYXJzJykpIHtcbiAgICBvcHRpb25zID0gbGVuZ3RoO1xuICAgIHBhdHRlcm4gPSBvcHRpb25zLmNoYXJzO1xuICAgIGxlbmd0aCA9IHBhdHRlcm4ubGVuZ3RoO1xuICAgIGN1c3RvbSA9IHRydWU7XG4gIH1cblxuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBtYXNrID0gJyc7XG4gIHZhciByZXMgPSAnJztcblxuICAvLyBDaGFyYWN0ZXJzIHRvIGJlIHVzZWRcbiAgaWYgKHBhdHRlcm4uaW5kZXhPZignPycpICE9PSAtMSkgbWFzayArPSBvcHRzLmNoYXJzO1xuICBpZiAocGF0dGVybi5pbmRleE9mKCdhJykgIT09IC0xKSBtYXNrICs9IHR5cGUubG93ZXI7XG4gIGlmIChwYXR0ZXJuLmluZGV4T2YoJ0EnKSAhPT0gLTEpIG1hc2sgKz0gdHlwZS51cHBlcjtcbiAgaWYgKHBhdHRlcm4uaW5kZXhPZignMCcpICE9PSAtMSkgbWFzayArPSB0eXBlLm51bWJlcjtcbiAgaWYgKHBhdHRlcm4uaW5kZXhPZignIScpICE9PSAtMSkgbWFzayArPSB0eXBlLnNwZWNpYWw7XG4gIGlmIChwYXR0ZXJuLmluZGV4T2YoJyonKSAhPT0gLTEpIG1hc2sgKz0gdHlwZS5hbGw7XG4gIGlmIChjdXN0b20pIG1hc2sgKz0gcGF0dGVybjtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICByZXMgKz0gbWFzay5jaGFyQXQocGFyc2VJbnQoTWF0aC5yYW5kb20oKSAqIG1hc2subGVuZ3RoLCAxMCkpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuIiwidmFyIGlzQnVmZmVyID0gcmVxdWlyZSgnaXMtYnVmZmVyJyk7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIEdldCB0aGUgbmF0aXZlIGB0eXBlb2ZgIGEgdmFsdWUuXG4gKlxuICogQHBhcmFtICB7Kn0gYHZhbGBcbiAqIEByZXR1cm4geyp9IE5hdGl2ZSBqYXZhc2NyaXB0IHR5cGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcbiAgLy8gcHJpbWl0aXZpZXNcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICB9XG4gIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG4gIGlmICh2YWwgPT09IHRydWUgfHwgdmFsID09PSBmYWxzZSB8fCB2YWwgaW5zdGFuY2VvZiBCb29sZWFuKSB7XG4gICAgcmV0dXJuICdib29sZWFuJztcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdmFsIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgcmV0dXJuICdzdHJpbmcnO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyB8fCB2YWwgaW5zdGFuY2VvZiBOdW1iZXIpIHtcbiAgICByZXR1cm4gJ251bWJlcic7XG4gIH1cblxuICAvLyBmdW5jdGlvbnNcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicgfHwgdmFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIC8vIGFycmF5XG4gIGlmICh0eXBlb2YgQXJyYXkuaXNBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgcmV0dXJuICdhcnJheSc7XG4gIH1cblxuICAvLyBjaGVjayBmb3IgaW5zdGFuY2VzIG9mIFJlZ0V4cCBhbmQgRGF0ZSBiZWZvcmUgY2FsbGluZyBgdG9TdHJpbmdgXG4gIGlmICh2YWwgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gIH1cbiAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gJ2RhdGUnO1xuICB9XG5cbiAgLy8gb3RoZXIgb2JqZWN0c1xuICB2YXIgdHlwZSA9IHRvU3RyaW5nLmNhbGwodmFsKTtcblxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcbiAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIHJldHVybiAnZGF0ZSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nKSB7XG4gICAgcmV0dXJuICdhcmd1bWVudHMnO1xuICB9XG5cbiAgLy8gYnVmZmVyXG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBpc0J1ZmZlcih2YWwpKSB7XG4gICAgcmV0dXJuICdidWZmZXInO1xuICB9XG5cbiAgLy8gZXM2OiBNYXAsIFdlYWtNYXAsIFNldCwgV2Vha1NldFxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgU2V0XScpIHtcbiAgICByZXR1cm4gJ3NldCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFdlYWtTZXRdJykge1xuICAgIHJldHVybiAnd2Vha3NldCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IE1hcF0nKSB7XG4gICAgcmV0dXJuICdtYXAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBXZWFrTWFwXScpIHtcbiAgICByZXR1cm4gJ3dlYWttYXAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBTeW1ib2xdJykge1xuICAgIHJldHVybiAnc3ltYm9sJztcbiAgfVxuXG4gIC8vIHR5cGVkIGFycmF5c1xuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSW50OEFycmF5XScpIHtcbiAgICByZXR1cm4gJ2ludDhhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykge1xuICAgIHJldHVybiAndWludDhhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScpIHtcbiAgICByZXR1cm4gJ3VpbnQ4Y2xhbXBlZGFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSW50MTZBcnJheV0nKSB7XG4gICAgcmV0dXJuICdpbnQxNmFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgVWludDE2QXJyYXldJykge1xuICAgIHJldHVybiAndWludDE2YXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBJbnQzMkFycmF5XScpIHtcbiAgICByZXR1cm4gJ2ludDMyYXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBVaW50MzJBcnJheV0nKSB7XG4gICAgcmV0dXJuICd1aW50MzJhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nKSB7XG4gICAgcmV0dXJuICdmbG9hdDMyYXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBGbG9hdDY0QXJyYXldJykge1xuICAgIHJldHVybiAnZmxvYXQ2NGFycmF5JztcbiAgfVxuXG4gIC8vIG11c3QgYmUgYSBwbGFpbiBvYmplY3RcbiAgcmV0dXJuICdvYmplY3QnO1xufTtcbiIsIi8qIVxuICogcmVnZXgtY2FjaGUgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L3JlZ2V4LWNhY2hlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNSBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpc1ByaW1pdGl2ZSA9IHJlcXVpcmUoJ2lzLXByaW1pdGl2ZScpO1xudmFyIGVxdWFsID0gcmVxdWlyZSgnaXMtZXF1YWwtc2hhbGxvdycpO1xudmFyIGJhc2ljID0ge307XG52YXIgY2FjaGUgPSB7fTtcblxuLyoqXG4gKiBFeHBvc2UgYHJlZ2V4Q2FjaGVgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZWdleENhY2hlO1xuXG4vKipcbiAqIE1lbW9pemUgdGhlIHJlc3VsdHMgb2YgYSBjYWxsIHRvIHRoZSBuZXcgUmVnRXhwIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHN0ciBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPcHRpb25zfSBvcHRpb25zIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0Jvb2xlYW59IG5vY29tcGFyZSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtSZWdFeHB9XG4gKi9cblxuZnVuY3Rpb24gcmVnZXhDYWNoZShmbiwgc3RyLCBvcHRzKSB7XG4gIHZhciBrZXkgPSAnX2RlZmF1bHRfJywgcmVnZXgsIGNhY2hlZDtcblxuICBpZiAoIXN0ciAmJiAhb3B0cykge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBmbjtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2ljW2tleV0gfHwgKGJhc2ljW2tleV0gPSBmbihzdHIpKTtcbiAgfVxuXG4gIHZhciBpc1N0cmluZyA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnO1xuICBpZiAoaXNTdHJpbmcpIHtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgIHJldHVybiBiYXNpY1tzdHJdIHx8IChiYXNpY1tzdHJdID0gZm4oc3RyKSk7XG4gICAgfVxuICAgIGtleSA9IHN0cjtcbiAgfSBlbHNlIHtcbiAgICBvcHRzID0gc3RyO1xuICB9XG5cbiAgY2FjaGVkID0gY2FjaGVba2V5XTtcbiAgaWYgKGNhY2hlZCAmJiBlcXVhbChjYWNoZWQub3B0cywgb3B0cykpIHtcbiAgICByZXR1cm4gY2FjaGVkLnJlZ2V4O1xuICB9XG5cbiAgbWVtbyhrZXksIG9wdHMsIChyZWdleCA9IGZuKHN0ciwgb3B0cykpKTtcbiAgcmV0dXJuIHJlZ2V4O1xufVxuXG5mdW5jdGlvbiBtZW1vKGtleSwgb3B0cywgcmVnZXgpIHtcbiAgY2FjaGVba2V5XSA9IHtyZWdleDogcmVnZXgsIG9wdHM6IG9wdHN9O1xufVxuXG4vKipcbiAqIEV4cG9zZSBgY2FjaGVgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMuY2FjaGUgPSBjYWNoZTtcbm1vZHVsZS5leHBvcnRzLmJhc2ljID0gYmFzaWM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJ2lzb2JqZWN0Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbi8qKlxuICogRXhwb3NlIGByZWxhdGl2ZWBcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlbGF0aXZlO1xuXG4vKipcbiAqIEdldCB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tIGBhYCB0byBgYmAuXG4gKi9cblxuZnVuY3Rpb24gcmVsYXRpdmUoYSwgYiwgc3RhdCkge1xuICBpZiAodHlwZW9mIGEgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVsYXRpdmUgZXhwZWN0cyBhIHN0cmluZy4nKTtcbiAgfVxuXG4gIGlmIChhID09ICcnICYmICFiKSByZXR1cm4gYTtcblxuICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgaWYgKGxlbiA9PT0gMSkge1xuICAgIGIgPSBhOyBhID0gcHJvY2Vzcy5jd2QoKTsgc3RhdCA9IG51bGw7XG4gIH1cblxuICBpZiAobGVuID09PSAyICYmIHR5cGVvZiBiID09PSAnYm9vbGVhbicpIHtcbiAgICBiID0gYTsgYSA9IHByb2Nlc3MuY3dkKCk7IHN0YXQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKGxlbiA9PT0gMiAmJiB0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICBzdGF0ID0gYjsgYiA9IGE7IGEgPSBwcm9jZXNzLmN3ZCgpO1xuICB9XG5cbiAgdmFyIG9yaWdCID0gYjtcblxuICAvLyBzZWUgaWYgYSBzbGFzaCBleGlzdHMgYmVmb3JlIG5vcm1hbGl6aW5nXG4gIHZhciBzbGFzaEEgPSBlbmRzV2l0aChhLCAnLycpO1xuICB2YXIgc2xhc2hCID0gZW5kc1dpdGgoYiwgJy8nKTtcblxuICBhID0gdW5peGlmeShhKTtcbiAgYiA9IHVuaXhpZnkoYik7XG5cbiAgLy8gaWYgYGFgIGhhZCBhIHNsYXNoLCBhZGQgaXQgYmFja1xuICBpZiAoc2xhc2hBKSB7IGEgPSBhICsgJy8nOyB9XG5cbiAgaWYgKGlzRmlsZShhLCBzdGF0KSkge1xuICAgIGEgPSBwYXRoLmRpcm5hbWUoYSk7XG4gIH1cblxuICB2YXIgcmVzID0gcGF0aC5yZWxhdGl2ZShhLCBiKTtcbiAgaWYgKHJlcyA9PT0gJycpIHtcbiAgICByZXR1cm4gJy4nO1xuICB9XG5cbiAgLy8gaWYgYGJgIG9yaWdpbmFsbHkgaGFkIGEgc2xhc2gsIGFuZCB0aGUgcGF0aCBlbmRzXG4gIC8vIHdpdGggYGJgIG1pc3NpbmcgYSBzbGFzaCwgdGhlbiByZS1hZGQgdGhlIHNsYXNoLlxuICB2YXIgbm9zbGFzaCA9IHRyaW1FbmQob3JpZ0IsICcvJyk7XG4gIGlmIChzbGFzaEIgJiYgKHJlcyA9PT0gbm9zbGFzaCB8fCBlbmRzV2l0aChyZXMsIG5vc2xhc2gpKSkge1xuICAgIHJlcyA9IHJlcyArICcvJztcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gYmFzZSBwYXRoLlxuICovXG5cbnJlbGF0aXZlLnRvQmFzZSA9IGZ1bmN0aW9uIHRvQmFzZShiYXNlLCBmcCkge1xuICBiYXNlID0gdW5peGlmeShiYXNlKTtcbiAgZnAgPSB1bml4aWZ5KGZwKTtcblxuICB2YXIgcmVzID0gZnAuc2xpY2UoYmFzZS5sZW5ndGgpO1xuICBpZiAocmVzLmNoYXJBdCgwKSA9PT0gJy8nKSB7XG4gICAgcmVzID0gcmVzLnNsaWNlKDEpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBzbGFzaGVzIGluIHBhdGhzIHRvIHVuaXggc2xhc2hlcy4gVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2VcbiAqIHBhdGhzIGFyZSBub3QgY2FsY3VsYXRlZCB0aGUgc2FtZSBieSBub2RlLmpzIHdoZW5cbiAqIHdpbmRvd3MgcGF0aHMgYXJlIHVzZWQuXG4gKi9cblxuZnVuY3Rpb24gdW5peGlmeShzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXFxcXFxcL10rL2csICcvJyk7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBnaXZlbiBjaGFyYWN0ZXIgZnJvbSB0aGUgcGF0aC5cbiAqL1xuXG5mdW5jdGlvbiB0cmltRW5kKGZwLCBjaCkge1xuICByZXR1cm4gZnAuc2xpY2UoMCwgZnAubGVuZ3RoIC0gY2gubGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBEb2VzIHRoZSBwYXRoIGVuZCB3aXRoIHRoZSBnaXZlbiBgY2hgYXJhY3Rlcj9cbiAqL1xuXG5mdW5jdGlvbiBlbmRzV2l0aChmcCwgY2gpIHtcbiAgcmV0dXJuIGZwLnNsaWNlKC1jaC5sZW5ndGgpWzBdID09PSBjaDtcbn1cblxuLyoqXG4gKiBJZiBgZnBgIGV4aXN0cywgcmV0dXJuIGEgYHN0YXRgIG9iamVjdCxcbiAqIG90aGVyd2lzZSByZXR1cm4gYG51bGxgLlxuICovXG5cbmZ1bmN0aW9uIHRyeVN0YXRzKGZwKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzLnN0YXRTeW5jKGZwKTtcbiAgfSBjYXRjaChlcnIpIHt9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBgZnBgIGlzIGEgZGlyZWN0b3J5LiBUbyB1c2UgYSBgZnNgXG4gKiBzdGF0IG9iamVjdCB0byBhY3R1YWxseSBjaGVjayB0aGUgZmlsZSBzeXN0ZW0sXG4gKiBlaXRoZXIgcGFzcyBgdHJ1ZWAgYXMgdGhlIHNlY29uZCBhcmcsIG9yIHBhc3MgeW91clxuICogb3duIHN0YXQgb2JqZWN0IGFzIHRoZSBzZWNvbmQgYXJnLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYGZwYFxuICogQHBhcmFtICB7Qm9vbGVhbnxPYmplY3R9IGBzdGF0YFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuXG5mdW5jdGlvbiBpc0RpcihmcCwgc3RhdCkge1xuICBpZiAoZW5kc1dpdGgoZnAsICcvJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChzdGF0ID09PSBudWxsKSB7XG4gICAgLy8gdHJ5IHRvIGdldCB0aGUgZGlyZWN0b3J5IGluZm8gaWYgaXQgaGFzbid0IGJlZW4gZG9uZSB5ZXRcbiAgICAvLyB0byBlbnN1cmUgZGlyZWN0b3JpZXMgY29udGFpbmluZyBkb3RzIGFyZSB3ZWxsIGhhbmRsZVxuICAgIHN0YXQgPSB0cnlTdGF0cyhmcCk7XG4gIH1cblxuICBpZiAoaXNPYmplY3Qoc3RhdCkgJiYgdHlwZW9mIHN0YXQuaXNEaXJlY3RvcnkgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc3RhdC5pc0RpcmVjdG9yeSgpO1xuICB9XG5cbiAgdmFyIHNlZ3MgPSBmcC5zcGxpdCgnLycpO1xuICB2YXIgbGFzdCA9IHNlZ3Nbc2Vncy5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3QgJiYgbGFzdC5pbmRleE9mKCcuJykgIT09IC0xKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIGBmcGAgbG9va3MgbGlrZSBhIGZpbGUsIG9yXG4gKiBhY3R1YWxseSBpcyBhIGZpbGUgaWYgZnMuc3RhdCBpcyB1c2VkLlxuICovXG5cbmZ1bmN0aW9uIGlzRmlsZShmcCwgc3RhdCkge1xuICBpZiAoc3RhdCA9PT0gdHJ1ZSkge1xuICAgIHN0YXQgPSB0cnlTdGF0cyhmcCk7XG4gIH1cbiAgcmV0dXJuICFpc0RpcihmcCwgc3RhdCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi8nKTtcbiIsIi8vIExpc3Qgb2YgdmFsaWQgZW50aXRpZXNcbi8vXG4vLyBHZW5lcmF0ZSB3aXRoIC4vc3VwcG9ydC9lbnRpdGllcy5qcyBzY3JpcHRcbi8vXG4ndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50IHF1b3RlczowKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICBcIkFhY3V0ZVwiOlwiXFx1MDBDMVwiLFxuICBcImFhY3V0ZVwiOlwiXFx1MDBFMVwiLFxuICBcIkFicmV2ZVwiOlwiXFx1MDEwMlwiLFxuICBcImFicmV2ZVwiOlwiXFx1MDEwM1wiLFxuICBcImFjXCI6XCJcXHUyMjNFXCIsXG4gIFwiYWNkXCI6XCJcXHUyMjNGXCIsXG4gIFwiYWNFXCI6XCJcXHUyMjNFXFx1MDMzM1wiLFxuICBcIkFjaXJjXCI6XCJcXHUwMEMyXCIsXG4gIFwiYWNpcmNcIjpcIlxcdTAwRTJcIixcbiAgXCJhY3V0ZVwiOlwiXFx1MDBCNFwiLFxuICBcIkFjeVwiOlwiXFx1MDQxMFwiLFxuICBcImFjeVwiOlwiXFx1MDQzMFwiLFxuICBcIkFFbGlnXCI6XCJcXHUwMEM2XCIsXG4gIFwiYWVsaWdcIjpcIlxcdTAwRTZcIixcbiAgXCJhZlwiOlwiXFx1MjA2MVwiLFxuICBcIkFmclwiOlwiXFx1RDgzNVxcdUREMDRcIixcbiAgXCJhZnJcIjpcIlxcdUQ4MzVcXHVERDFFXCIsXG4gIFwiQWdyYXZlXCI6XCJcXHUwMEMwXCIsXG4gIFwiYWdyYXZlXCI6XCJcXHUwMEUwXCIsXG4gIFwiYWxlZnN5bVwiOlwiXFx1MjEzNVwiLFxuICBcImFsZXBoXCI6XCJcXHUyMTM1XCIsXG4gIFwiQWxwaGFcIjpcIlxcdTAzOTFcIixcbiAgXCJhbHBoYVwiOlwiXFx1MDNCMVwiLFxuICBcIkFtYWNyXCI6XCJcXHUwMTAwXCIsXG4gIFwiYW1hY3JcIjpcIlxcdTAxMDFcIixcbiAgXCJhbWFsZ1wiOlwiXFx1MkEzRlwiLFxuICBcIkFNUFwiOlwiXFx1MDAyNlwiLFxuICBcImFtcFwiOlwiXFx1MDAyNlwiLFxuICBcIkFuZFwiOlwiXFx1MkE1M1wiLFxuICBcImFuZFwiOlwiXFx1MjIyN1wiLFxuICBcImFuZGFuZFwiOlwiXFx1MkE1NVwiLFxuICBcImFuZGRcIjpcIlxcdTJBNUNcIixcbiAgXCJhbmRzbG9wZVwiOlwiXFx1MkE1OFwiLFxuICBcImFuZHZcIjpcIlxcdTJBNUFcIixcbiAgXCJhbmdcIjpcIlxcdTIyMjBcIixcbiAgXCJhbmdlXCI6XCJcXHUyOUE0XCIsXG4gIFwiYW5nbGVcIjpcIlxcdTIyMjBcIixcbiAgXCJhbmdtc2RcIjpcIlxcdTIyMjFcIixcbiAgXCJhbmdtc2RhYVwiOlwiXFx1MjlBOFwiLFxuICBcImFuZ21zZGFiXCI6XCJcXHUyOUE5XCIsXG4gIFwiYW5nbXNkYWNcIjpcIlxcdTI5QUFcIixcbiAgXCJhbmdtc2RhZFwiOlwiXFx1MjlBQlwiLFxuICBcImFuZ21zZGFlXCI6XCJcXHUyOUFDXCIsXG4gIFwiYW5nbXNkYWZcIjpcIlxcdTI5QURcIixcbiAgXCJhbmdtc2RhZ1wiOlwiXFx1MjlBRVwiLFxuICBcImFuZ21zZGFoXCI6XCJcXHUyOUFGXCIsXG4gIFwiYW5ncnRcIjpcIlxcdTIyMUZcIixcbiAgXCJhbmdydHZiXCI6XCJcXHUyMkJFXCIsXG4gIFwiYW5ncnR2YmRcIjpcIlxcdTI5OURcIixcbiAgXCJhbmdzcGhcIjpcIlxcdTIyMjJcIixcbiAgXCJhbmdzdFwiOlwiXFx1MDBDNVwiLFxuICBcImFuZ3phcnJcIjpcIlxcdTIzN0NcIixcbiAgXCJBb2dvblwiOlwiXFx1MDEwNFwiLFxuICBcImFvZ29uXCI6XCJcXHUwMTA1XCIsXG4gIFwiQW9wZlwiOlwiXFx1RDgzNVxcdUREMzhcIixcbiAgXCJhb3BmXCI6XCJcXHVEODM1XFx1REQ1MlwiLFxuICBcImFwXCI6XCJcXHUyMjQ4XCIsXG4gIFwiYXBhY2lyXCI6XCJcXHUyQTZGXCIsXG4gIFwiYXBFXCI6XCJcXHUyQTcwXCIsXG4gIFwiYXBlXCI6XCJcXHUyMjRBXCIsXG4gIFwiYXBpZFwiOlwiXFx1MjI0QlwiLFxuICBcImFwb3NcIjpcIlxcdTAwMjdcIixcbiAgXCJBcHBseUZ1bmN0aW9uXCI6XCJcXHUyMDYxXCIsXG4gIFwiYXBwcm94XCI6XCJcXHUyMjQ4XCIsXG4gIFwiYXBwcm94ZXFcIjpcIlxcdTIyNEFcIixcbiAgXCJBcmluZ1wiOlwiXFx1MDBDNVwiLFxuICBcImFyaW5nXCI6XCJcXHUwMEU1XCIsXG4gIFwiQXNjclwiOlwiXFx1RDgzNVxcdURDOUNcIixcbiAgXCJhc2NyXCI6XCJcXHVEODM1XFx1RENCNlwiLFxuICBcIkFzc2lnblwiOlwiXFx1MjI1NFwiLFxuICBcImFzdFwiOlwiXFx1MDAyQVwiLFxuICBcImFzeW1wXCI6XCJcXHUyMjQ4XCIsXG4gIFwiYXN5bXBlcVwiOlwiXFx1MjI0RFwiLFxuICBcIkF0aWxkZVwiOlwiXFx1MDBDM1wiLFxuICBcImF0aWxkZVwiOlwiXFx1MDBFM1wiLFxuICBcIkF1bWxcIjpcIlxcdTAwQzRcIixcbiAgXCJhdW1sXCI6XCJcXHUwMEU0XCIsXG4gIFwiYXdjb25pbnRcIjpcIlxcdTIyMzNcIixcbiAgXCJhd2ludFwiOlwiXFx1MkExMVwiLFxuICBcImJhY2tjb25nXCI6XCJcXHUyMjRDXCIsXG4gIFwiYmFja2Vwc2lsb25cIjpcIlxcdTAzRjZcIixcbiAgXCJiYWNrcHJpbWVcIjpcIlxcdTIwMzVcIixcbiAgXCJiYWNrc2ltXCI6XCJcXHUyMjNEXCIsXG4gIFwiYmFja3NpbWVxXCI6XCJcXHUyMkNEXCIsXG4gIFwiQmFja3NsYXNoXCI6XCJcXHUyMjE2XCIsXG4gIFwiQmFydlwiOlwiXFx1MkFFN1wiLFxuICBcImJhcnZlZVwiOlwiXFx1MjJCRFwiLFxuICBcIkJhcndlZFwiOlwiXFx1MjMwNlwiLFxuICBcImJhcndlZFwiOlwiXFx1MjMwNVwiLFxuICBcImJhcndlZGdlXCI6XCJcXHUyMzA1XCIsXG4gIFwiYmJya1wiOlwiXFx1MjNCNVwiLFxuICBcImJicmt0YnJrXCI6XCJcXHUyM0I2XCIsXG4gIFwiYmNvbmdcIjpcIlxcdTIyNENcIixcbiAgXCJCY3lcIjpcIlxcdTA0MTFcIixcbiAgXCJiY3lcIjpcIlxcdTA0MzFcIixcbiAgXCJiZHF1b1wiOlwiXFx1MjAxRVwiLFxuICBcImJlY2F1c1wiOlwiXFx1MjIzNVwiLFxuICBcIkJlY2F1c2VcIjpcIlxcdTIyMzVcIixcbiAgXCJiZWNhdXNlXCI6XCJcXHUyMjM1XCIsXG4gIFwiYmVtcHR5dlwiOlwiXFx1MjlCMFwiLFxuICBcImJlcHNpXCI6XCJcXHUwM0Y2XCIsXG4gIFwiYmVybm91XCI6XCJcXHUyMTJDXCIsXG4gIFwiQmVybm91bGxpc1wiOlwiXFx1MjEyQ1wiLFxuICBcIkJldGFcIjpcIlxcdTAzOTJcIixcbiAgXCJiZXRhXCI6XCJcXHUwM0IyXCIsXG4gIFwiYmV0aFwiOlwiXFx1MjEzNlwiLFxuICBcImJldHdlZW5cIjpcIlxcdTIyNkNcIixcbiAgXCJCZnJcIjpcIlxcdUQ4MzVcXHVERDA1XCIsXG4gIFwiYmZyXCI6XCJcXHVEODM1XFx1REQxRlwiLFxuICBcImJpZ2NhcFwiOlwiXFx1MjJDMlwiLFxuICBcImJpZ2NpcmNcIjpcIlxcdTI1RUZcIixcbiAgXCJiaWdjdXBcIjpcIlxcdTIyQzNcIixcbiAgXCJiaWdvZG90XCI6XCJcXHUyQTAwXCIsXG4gIFwiYmlnb3BsdXNcIjpcIlxcdTJBMDFcIixcbiAgXCJiaWdvdGltZXNcIjpcIlxcdTJBMDJcIixcbiAgXCJiaWdzcWN1cFwiOlwiXFx1MkEwNlwiLFxuICBcImJpZ3N0YXJcIjpcIlxcdTI2MDVcIixcbiAgXCJiaWd0cmlhbmdsZWRvd25cIjpcIlxcdTI1QkRcIixcbiAgXCJiaWd0cmlhbmdsZXVwXCI6XCJcXHUyNUIzXCIsXG4gIFwiYmlndXBsdXNcIjpcIlxcdTJBMDRcIixcbiAgXCJiaWd2ZWVcIjpcIlxcdTIyQzFcIixcbiAgXCJiaWd3ZWRnZVwiOlwiXFx1MjJDMFwiLFxuICBcImJrYXJvd1wiOlwiXFx1MjkwRFwiLFxuICBcImJsYWNrbG96ZW5nZVwiOlwiXFx1MjlFQlwiLFxuICBcImJsYWNrc3F1YXJlXCI6XCJcXHUyNUFBXCIsXG4gIFwiYmxhY2t0cmlhbmdsZVwiOlwiXFx1MjVCNFwiLFxuICBcImJsYWNrdHJpYW5nbGVkb3duXCI6XCJcXHUyNUJFXCIsXG4gIFwiYmxhY2t0cmlhbmdsZWxlZnRcIjpcIlxcdTI1QzJcIixcbiAgXCJibGFja3RyaWFuZ2xlcmlnaHRcIjpcIlxcdTI1QjhcIixcbiAgXCJibGFua1wiOlwiXFx1MjQyM1wiLFxuICBcImJsazEyXCI6XCJcXHUyNTkyXCIsXG4gIFwiYmxrMTRcIjpcIlxcdTI1OTFcIixcbiAgXCJibGszNFwiOlwiXFx1MjU5M1wiLFxuICBcImJsb2NrXCI6XCJcXHUyNTg4XCIsXG4gIFwiYm5lXCI6XCJcXHUwMDNEXFx1MjBFNVwiLFxuICBcImJuZXF1aXZcIjpcIlxcdTIyNjFcXHUyMEU1XCIsXG4gIFwiYk5vdFwiOlwiXFx1MkFFRFwiLFxuICBcImJub3RcIjpcIlxcdTIzMTBcIixcbiAgXCJCb3BmXCI6XCJcXHVEODM1XFx1REQzOVwiLFxuICBcImJvcGZcIjpcIlxcdUQ4MzVcXHVERDUzXCIsXG4gIFwiYm90XCI6XCJcXHUyMkE1XCIsXG4gIFwiYm90dG9tXCI6XCJcXHUyMkE1XCIsXG4gIFwiYm93dGllXCI6XCJcXHUyMkM4XCIsXG4gIFwiYm94Ym94XCI6XCJcXHUyOUM5XCIsXG4gIFwiYm94RExcIjpcIlxcdTI1NTdcIixcbiAgXCJib3hEbFwiOlwiXFx1MjU1NlwiLFxuICBcImJveGRMXCI6XCJcXHUyNTU1XCIsXG4gIFwiYm94ZGxcIjpcIlxcdTI1MTBcIixcbiAgXCJib3hEUlwiOlwiXFx1MjU1NFwiLFxuICBcImJveERyXCI6XCJcXHUyNTUzXCIsXG4gIFwiYm94ZFJcIjpcIlxcdTI1NTJcIixcbiAgXCJib3hkclwiOlwiXFx1MjUwQ1wiLFxuICBcImJveEhcIjpcIlxcdTI1NTBcIixcbiAgXCJib3hoXCI6XCJcXHUyNTAwXCIsXG4gIFwiYm94SERcIjpcIlxcdTI1NjZcIixcbiAgXCJib3hIZFwiOlwiXFx1MjU2NFwiLFxuICBcImJveGhEXCI6XCJcXHUyNTY1XCIsXG4gIFwiYm94aGRcIjpcIlxcdTI1MkNcIixcbiAgXCJib3hIVVwiOlwiXFx1MjU2OVwiLFxuICBcImJveEh1XCI6XCJcXHUyNTY3XCIsXG4gIFwiYm94aFVcIjpcIlxcdTI1NjhcIixcbiAgXCJib3hodVwiOlwiXFx1MjUzNFwiLFxuICBcImJveG1pbnVzXCI6XCJcXHUyMjlGXCIsXG4gIFwiYm94cGx1c1wiOlwiXFx1MjI5RVwiLFxuICBcImJveHRpbWVzXCI6XCJcXHUyMkEwXCIsXG4gIFwiYm94VUxcIjpcIlxcdTI1NURcIixcbiAgXCJib3hVbFwiOlwiXFx1MjU1Q1wiLFxuICBcImJveHVMXCI6XCJcXHUyNTVCXCIsXG4gIFwiYm94dWxcIjpcIlxcdTI1MThcIixcbiAgXCJib3hVUlwiOlwiXFx1MjU1QVwiLFxuICBcImJveFVyXCI6XCJcXHUyNTU5XCIsXG4gIFwiYm94dVJcIjpcIlxcdTI1NThcIixcbiAgXCJib3h1clwiOlwiXFx1MjUxNFwiLFxuICBcImJveFZcIjpcIlxcdTI1NTFcIixcbiAgXCJib3h2XCI6XCJcXHUyNTAyXCIsXG4gIFwiYm94VkhcIjpcIlxcdTI1NkNcIixcbiAgXCJib3hWaFwiOlwiXFx1MjU2QlwiLFxuICBcImJveHZIXCI6XCJcXHUyNTZBXCIsXG4gIFwiYm94dmhcIjpcIlxcdTI1M0NcIixcbiAgXCJib3hWTFwiOlwiXFx1MjU2M1wiLFxuICBcImJveFZsXCI6XCJcXHUyNTYyXCIsXG4gIFwiYm94dkxcIjpcIlxcdTI1NjFcIixcbiAgXCJib3h2bFwiOlwiXFx1MjUyNFwiLFxuICBcImJveFZSXCI6XCJcXHUyNTYwXCIsXG4gIFwiYm94VnJcIjpcIlxcdTI1NUZcIixcbiAgXCJib3h2UlwiOlwiXFx1MjU1RVwiLFxuICBcImJveHZyXCI6XCJcXHUyNTFDXCIsXG4gIFwiYnByaW1lXCI6XCJcXHUyMDM1XCIsXG4gIFwiQnJldmVcIjpcIlxcdTAyRDhcIixcbiAgXCJicmV2ZVwiOlwiXFx1MDJEOFwiLFxuICBcImJydmJhclwiOlwiXFx1MDBBNlwiLFxuICBcIkJzY3JcIjpcIlxcdTIxMkNcIixcbiAgXCJic2NyXCI6XCJcXHVEODM1XFx1RENCN1wiLFxuICBcImJzZW1pXCI6XCJcXHUyMDRGXCIsXG4gIFwiYnNpbVwiOlwiXFx1MjIzRFwiLFxuICBcImJzaW1lXCI6XCJcXHUyMkNEXCIsXG4gIFwiYnNvbFwiOlwiXFx1MDA1Q1wiLFxuICBcImJzb2xiXCI6XCJcXHUyOUM1XCIsXG4gIFwiYnNvbGhzdWJcIjpcIlxcdTI3QzhcIixcbiAgXCJidWxsXCI6XCJcXHUyMDIyXCIsXG4gIFwiYnVsbGV0XCI6XCJcXHUyMDIyXCIsXG4gIFwiYnVtcFwiOlwiXFx1MjI0RVwiLFxuICBcImJ1bXBFXCI6XCJcXHUyQUFFXCIsXG4gIFwiYnVtcGVcIjpcIlxcdTIyNEZcIixcbiAgXCJCdW1wZXFcIjpcIlxcdTIyNEVcIixcbiAgXCJidW1wZXFcIjpcIlxcdTIyNEZcIixcbiAgXCJDYWN1dGVcIjpcIlxcdTAxMDZcIixcbiAgXCJjYWN1dGVcIjpcIlxcdTAxMDdcIixcbiAgXCJDYXBcIjpcIlxcdTIyRDJcIixcbiAgXCJjYXBcIjpcIlxcdTIyMjlcIixcbiAgXCJjYXBhbmRcIjpcIlxcdTJBNDRcIixcbiAgXCJjYXBicmN1cFwiOlwiXFx1MkE0OVwiLFxuICBcImNhcGNhcFwiOlwiXFx1MkE0QlwiLFxuICBcImNhcGN1cFwiOlwiXFx1MkE0N1wiLFxuICBcImNhcGRvdFwiOlwiXFx1MkE0MFwiLFxuICBcIkNhcGl0YWxEaWZmZXJlbnRpYWxEXCI6XCJcXHUyMTQ1XCIsXG4gIFwiY2Fwc1wiOlwiXFx1MjIyOVxcdUZFMDBcIixcbiAgXCJjYXJldFwiOlwiXFx1MjA0MVwiLFxuICBcImNhcm9uXCI6XCJcXHUwMkM3XCIsXG4gIFwiQ2F5bGV5c1wiOlwiXFx1MjEyRFwiLFxuICBcImNjYXBzXCI6XCJcXHUyQTREXCIsXG4gIFwiQ2Nhcm9uXCI6XCJcXHUwMTBDXCIsXG4gIFwiY2Nhcm9uXCI6XCJcXHUwMTBEXCIsXG4gIFwiQ2NlZGlsXCI6XCJcXHUwMEM3XCIsXG4gIFwiY2NlZGlsXCI6XCJcXHUwMEU3XCIsXG4gIFwiQ2NpcmNcIjpcIlxcdTAxMDhcIixcbiAgXCJjY2lyY1wiOlwiXFx1MDEwOVwiLFxuICBcIkNjb25pbnRcIjpcIlxcdTIyMzBcIixcbiAgXCJjY3Vwc1wiOlwiXFx1MkE0Q1wiLFxuICBcImNjdXBzc21cIjpcIlxcdTJBNTBcIixcbiAgXCJDZG90XCI6XCJcXHUwMTBBXCIsXG4gIFwiY2RvdFwiOlwiXFx1MDEwQlwiLFxuICBcImNlZGlsXCI6XCJcXHUwMEI4XCIsXG4gIFwiQ2VkaWxsYVwiOlwiXFx1MDBCOFwiLFxuICBcImNlbXB0eXZcIjpcIlxcdTI5QjJcIixcbiAgXCJjZW50XCI6XCJcXHUwMEEyXCIsXG4gIFwiQ2VudGVyRG90XCI6XCJcXHUwMEI3XCIsXG4gIFwiY2VudGVyZG90XCI6XCJcXHUwMEI3XCIsXG4gIFwiQ2ZyXCI6XCJcXHUyMTJEXCIsXG4gIFwiY2ZyXCI6XCJcXHVEODM1XFx1REQyMFwiLFxuICBcIkNIY3lcIjpcIlxcdTA0MjdcIixcbiAgXCJjaGN5XCI6XCJcXHUwNDQ3XCIsXG4gIFwiY2hlY2tcIjpcIlxcdTI3MTNcIixcbiAgXCJjaGVja21hcmtcIjpcIlxcdTI3MTNcIixcbiAgXCJDaGlcIjpcIlxcdTAzQTdcIixcbiAgXCJjaGlcIjpcIlxcdTAzQzdcIixcbiAgXCJjaXJcIjpcIlxcdTI1Q0JcIixcbiAgXCJjaXJjXCI6XCJcXHUwMkM2XCIsXG4gIFwiY2lyY2VxXCI6XCJcXHUyMjU3XCIsXG4gIFwiY2lyY2xlYXJyb3dsZWZ0XCI6XCJcXHUyMUJBXCIsXG4gIFwiY2lyY2xlYXJyb3dyaWdodFwiOlwiXFx1MjFCQlwiLFxuICBcImNpcmNsZWRhc3RcIjpcIlxcdTIyOUJcIixcbiAgXCJjaXJjbGVkY2lyY1wiOlwiXFx1MjI5QVwiLFxuICBcImNpcmNsZWRkYXNoXCI6XCJcXHUyMjlEXCIsXG4gIFwiQ2lyY2xlRG90XCI6XCJcXHUyMjk5XCIsXG4gIFwiY2lyY2xlZFJcIjpcIlxcdTAwQUVcIixcbiAgXCJjaXJjbGVkU1wiOlwiXFx1MjRDOFwiLFxuICBcIkNpcmNsZU1pbnVzXCI6XCJcXHUyMjk2XCIsXG4gIFwiQ2lyY2xlUGx1c1wiOlwiXFx1MjI5NVwiLFxuICBcIkNpcmNsZVRpbWVzXCI6XCJcXHUyMjk3XCIsXG4gIFwiY2lyRVwiOlwiXFx1MjlDM1wiLFxuICBcImNpcmVcIjpcIlxcdTIyNTdcIixcbiAgXCJjaXJmbmludFwiOlwiXFx1MkExMFwiLFxuICBcImNpcm1pZFwiOlwiXFx1MkFFRlwiLFxuICBcImNpcnNjaXJcIjpcIlxcdTI5QzJcIixcbiAgXCJDbG9ja3dpc2VDb250b3VySW50ZWdyYWxcIjpcIlxcdTIyMzJcIixcbiAgXCJDbG9zZUN1cmx5RG91YmxlUXVvdGVcIjpcIlxcdTIwMURcIixcbiAgXCJDbG9zZUN1cmx5UXVvdGVcIjpcIlxcdTIwMTlcIixcbiAgXCJjbHVic1wiOlwiXFx1MjY2M1wiLFxuICBcImNsdWJzdWl0XCI6XCJcXHUyNjYzXCIsXG4gIFwiQ29sb25cIjpcIlxcdTIyMzdcIixcbiAgXCJjb2xvblwiOlwiXFx1MDAzQVwiLFxuICBcIkNvbG9uZVwiOlwiXFx1MkE3NFwiLFxuICBcImNvbG9uZVwiOlwiXFx1MjI1NFwiLFxuICBcImNvbG9uZXFcIjpcIlxcdTIyNTRcIixcbiAgXCJjb21tYVwiOlwiXFx1MDAyQ1wiLFxuICBcImNvbW1hdFwiOlwiXFx1MDA0MFwiLFxuICBcImNvbXBcIjpcIlxcdTIyMDFcIixcbiAgXCJjb21wZm5cIjpcIlxcdTIyMThcIixcbiAgXCJjb21wbGVtZW50XCI6XCJcXHUyMjAxXCIsXG4gIFwiY29tcGxleGVzXCI6XCJcXHUyMTAyXCIsXG4gIFwiY29uZ1wiOlwiXFx1MjI0NVwiLFxuICBcImNvbmdkb3RcIjpcIlxcdTJBNkRcIixcbiAgXCJDb25ncnVlbnRcIjpcIlxcdTIyNjFcIixcbiAgXCJDb25pbnRcIjpcIlxcdTIyMkZcIixcbiAgXCJjb25pbnRcIjpcIlxcdTIyMkVcIixcbiAgXCJDb250b3VySW50ZWdyYWxcIjpcIlxcdTIyMkVcIixcbiAgXCJDb3BmXCI6XCJcXHUyMTAyXCIsXG4gIFwiY29wZlwiOlwiXFx1RDgzNVxcdURENTRcIixcbiAgXCJjb3Byb2RcIjpcIlxcdTIyMTBcIixcbiAgXCJDb3Byb2R1Y3RcIjpcIlxcdTIyMTBcIixcbiAgXCJDT1BZXCI6XCJcXHUwMEE5XCIsXG4gIFwiY29weVwiOlwiXFx1MDBBOVwiLFxuICBcImNvcHlzclwiOlwiXFx1MjExN1wiLFxuICBcIkNvdW50ZXJDbG9ja3dpc2VDb250b3VySW50ZWdyYWxcIjpcIlxcdTIyMzNcIixcbiAgXCJjcmFyclwiOlwiXFx1MjFCNVwiLFxuICBcIkNyb3NzXCI6XCJcXHUyQTJGXCIsXG4gIFwiY3Jvc3NcIjpcIlxcdTI3MTdcIixcbiAgXCJDc2NyXCI6XCJcXHVEODM1XFx1REM5RVwiLFxuICBcImNzY3JcIjpcIlxcdUQ4MzVcXHVEQ0I4XCIsXG4gIFwiY3N1YlwiOlwiXFx1MkFDRlwiLFxuICBcImNzdWJlXCI6XCJcXHUyQUQxXCIsXG4gIFwiY3N1cFwiOlwiXFx1MkFEMFwiLFxuICBcImNzdXBlXCI6XCJcXHUyQUQyXCIsXG4gIFwiY3Rkb3RcIjpcIlxcdTIyRUZcIixcbiAgXCJjdWRhcnJsXCI6XCJcXHUyOTM4XCIsXG4gIFwiY3VkYXJyclwiOlwiXFx1MjkzNVwiLFxuICBcImN1ZXByXCI6XCJcXHUyMkRFXCIsXG4gIFwiY3Vlc2NcIjpcIlxcdTIyREZcIixcbiAgXCJjdWxhcnJcIjpcIlxcdTIxQjZcIixcbiAgXCJjdWxhcnJwXCI6XCJcXHUyOTNEXCIsXG4gIFwiQ3VwXCI6XCJcXHUyMkQzXCIsXG4gIFwiY3VwXCI6XCJcXHUyMjJBXCIsXG4gIFwiY3VwYnJjYXBcIjpcIlxcdTJBNDhcIixcbiAgXCJDdXBDYXBcIjpcIlxcdTIyNERcIixcbiAgXCJjdXBjYXBcIjpcIlxcdTJBNDZcIixcbiAgXCJjdXBjdXBcIjpcIlxcdTJBNEFcIixcbiAgXCJjdXBkb3RcIjpcIlxcdTIyOERcIixcbiAgXCJjdXBvclwiOlwiXFx1MkE0NVwiLFxuICBcImN1cHNcIjpcIlxcdTIyMkFcXHVGRTAwXCIsXG4gIFwiY3VyYXJyXCI6XCJcXHUyMUI3XCIsXG4gIFwiY3VyYXJybVwiOlwiXFx1MjkzQ1wiLFxuICBcImN1cmx5ZXFwcmVjXCI6XCJcXHUyMkRFXCIsXG4gIFwiY3VybHllcXN1Y2NcIjpcIlxcdTIyREZcIixcbiAgXCJjdXJseXZlZVwiOlwiXFx1MjJDRVwiLFxuICBcImN1cmx5d2VkZ2VcIjpcIlxcdTIyQ0ZcIixcbiAgXCJjdXJyZW5cIjpcIlxcdTAwQTRcIixcbiAgXCJjdXJ2ZWFycm93bGVmdFwiOlwiXFx1MjFCNlwiLFxuICBcImN1cnZlYXJyb3dyaWdodFwiOlwiXFx1MjFCN1wiLFxuICBcImN1dmVlXCI6XCJcXHUyMkNFXCIsXG4gIFwiY3V3ZWRcIjpcIlxcdTIyQ0ZcIixcbiAgXCJjd2NvbmludFwiOlwiXFx1MjIzMlwiLFxuICBcImN3aW50XCI6XCJcXHUyMjMxXCIsXG4gIFwiY3lsY3R5XCI6XCJcXHUyMzJEXCIsXG4gIFwiRGFnZ2VyXCI6XCJcXHUyMDIxXCIsXG4gIFwiZGFnZ2VyXCI6XCJcXHUyMDIwXCIsXG4gIFwiZGFsZXRoXCI6XCJcXHUyMTM4XCIsXG4gIFwiRGFyclwiOlwiXFx1MjFBMVwiLFxuICBcImRBcnJcIjpcIlxcdTIxRDNcIixcbiAgXCJkYXJyXCI6XCJcXHUyMTkzXCIsXG4gIFwiZGFzaFwiOlwiXFx1MjAxMFwiLFxuICBcIkRhc2h2XCI6XCJcXHUyQUU0XCIsXG4gIFwiZGFzaHZcIjpcIlxcdTIyQTNcIixcbiAgXCJkYmthcm93XCI6XCJcXHUyOTBGXCIsXG4gIFwiZGJsYWNcIjpcIlxcdTAyRERcIixcbiAgXCJEY2Fyb25cIjpcIlxcdTAxMEVcIixcbiAgXCJkY2Fyb25cIjpcIlxcdTAxMEZcIixcbiAgXCJEY3lcIjpcIlxcdTA0MTRcIixcbiAgXCJkY3lcIjpcIlxcdTA0MzRcIixcbiAgXCJERFwiOlwiXFx1MjE0NVwiLFxuICBcImRkXCI6XCJcXHUyMTQ2XCIsXG4gIFwiZGRhZ2dlclwiOlwiXFx1MjAyMVwiLFxuICBcImRkYXJyXCI6XCJcXHUyMUNBXCIsXG4gIFwiRERvdHJhaGRcIjpcIlxcdTI5MTFcIixcbiAgXCJkZG90c2VxXCI6XCJcXHUyQTc3XCIsXG4gIFwiZGVnXCI6XCJcXHUwMEIwXCIsXG4gIFwiRGVsXCI6XCJcXHUyMjA3XCIsXG4gIFwiRGVsdGFcIjpcIlxcdTAzOTRcIixcbiAgXCJkZWx0YVwiOlwiXFx1MDNCNFwiLFxuICBcImRlbXB0eXZcIjpcIlxcdTI5QjFcIixcbiAgXCJkZmlzaHRcIjpcIlxcdTI5N0ZcIixcbiAgXCJEZnJcIjpcIlxcdUQ4MzVcXHVERDA3XCIsXG4gIFwiZGZyXCI6XCJcXHVEODM1XFx1REQyMVwiLFxuICBcImRIYXJcIjpcIlxcdTI5NjVcIixcbiAgXCJkaGFybFwiOlwiXFx1MjFDM1wiLFxuICBcImRoYXJyXCI6XCJcXHUyMUMyXCIsXG4gIFwiRGlhY3JpdGljYWxBY3V0ZVwiOlwiXFx1MDBCNFwiLFxuICBcIkRpYWNyaXRpY2FsRG90XCI6XCJcXHUwMkQ5XCIsXG4gIFwiRGlhY3JpdGljYWxEb3VibGVBY3V0ZVwiOlwiXFx1MDJERFwiLFxuICBcIkRpYWNyaXRpY2FsR3JhdmVcIjpcIlxcdTAwNjBcIixcbiAgXCJEaWFjcml0aWNhbFRpbGRlXCI6XCJcXHUwMkRDXCIsXG4gIFwiZGlhbVwiOlwiXFx1MjJDNFwiLFxuICBcIkRpYW1vbmRcIjpcIlxcdTIyQzRcIixcbiAgXCJkaWFtb25kXCI6XCJcXHUyMkM0XCIsXG4gIFwiZGlhbW9uZHN1aXRcIjpcIlxcdTI2NjZcIixcbiAgXCJkaWFtc1wiOlwiXFx1MjY2NlwiLFxuICBcImRpZVwiOlwiXFx1MDBBOFwiLFxuICBcIkRpZmZlcmVudGlhbERcIjpcIlxcdTIxNDZcIixcbiAgXCJkaWdhbW1hXCI6XCJcXHUwM0REXCIsXG4gIFwiZGlzaW5cIjpcIlxcdTIyRjJcIixcbiAgXCJkaXZcIjpcIlxcdTAwRjdcIixcbiAgXCJkaXZpZGVcIjpcIlxcdTAwRjdcIixcbiAgXCJkaXZpZGVvbnRpbWVzXCI6XCJcXHUyMkM3XCIsXG4gIFwiZGl2b254XCI6XCJcXHUyMkM3XCIsXG4gIFwiREpjeVwiOlwiXFx1MDQwMlwiLFxuICBcImRqY3lcIjpcIlxcdTA0NTJcIixcbiAgXCJkbGNvcm5cIjpcIlxcdTIzMUVcIixcbiAgXCJkbGNyb3BcIjpcIlxcdTIzMERcIixcbiAgXCJkb2xsYXJcIjpcIlxcdTAwMjRcIixcbiAgXCJEb3BmXCI6XCJcXHVEODM1XFx1REQzQlwiLFxuICBcImRvcGZcIjpcIlxcdUQ4MzVcXHVERDU1XCIsXG4gIFwiRG90XCI6XCJcXHUwMEE4XCIsXG4gIFwiZG90XCI6XCJcXHUwMkQ5XCIsXG4gIFwiRG90RG90XCI6XCJcXHUyMERDXCIsXG4gIFwiZG90ZXFcIjpcIlxcdTIyNTBcIixcbiAgXCJkb3RlcWRvdFwiOlwiXFx1MjI1MVwiLFxuICBcIkRvdEVxdWFsXCI6XCJcXHUyMjUwXCIsXG4gIFwiZG90bWludXNcIjpcIlxcdTIyMzhcIixcbiAgXCJkb3RwbHVzXCI6XCJcXHUyMjE0XCIsXG4gIFwiZG90c3F1YXJlXCI6XCJcXHUyMkExXCIsXG4gIFwiZG91YmxlYmFyd2VkZ2VcIjpcIlxcdTIzMDZcIixcbiAgXCJEb3VibGVDb250b3VySW50ZWdyYWxcIjpcIlxcdTIyMkZcIixcbiAgXCJEb3VibGVEb3RcIjpcIlxcdTAwQThcIixcbiAgXCJEb3VibGVEb3duQXJyb3dcIjpcIlxcdTIxRDNcIixcbiAgXCJEb3VibGVMZWZ0QXJyb3dcIjpcIlxcdTIxRDBcIixcbiAgXCJEb3VibGVMZWZ0UmlnaHRBcnJvd1wiOlwiXFx1MjFENFwiLFxuICBcIkRvdWJsZUxlZnRUZWVcIjpcIlxcdTJBRTRcIixcbiAgXCJEb3VibGVMb25nTGVmdEFycm93XCI6XCJcXHUyN0Y4XCIsXG4gIFwiRG91YmxlTG9uZ0xlZnRSaWdodEFycm93XCI6XCJcXHUyN0ZBXCIsXG4gIFwiRG91YmxlTG9uZ1JpZ2h0QXJyb3dcIjpcIlxcdTI3RjlcIixcbiAgXCJEb3VibGVSaWdodEFycm93XCI6XCJcXHUyMUQyXCIsXG4gIFwiRG91YmxlUmlnaHRUZWVcIjpcIlxcdTIyQThcIixcbiAgXCJEb3VibGVVcEFycm93XCI6XCJcXHUyMUQxXCIsXG4gIFwiRG91YmxlVXBEb3duQXJyb3dcIjpcIlxcdTIxRDVcIixcbiAgXCJEb3VibGVWZXJ0aWNhbEJhclwiOlwiXFx1MjIyNVwiLFxuICBcIkRvd25BcnJvd1wiOlwiXFx1MjE5M1wiLFxuICBcIkRvd25hcnJvd1wiOlwiXFx1MjFEM1wiLFxuICBcImRvd25hcnJvd1wiOlwiXFx1MjE5M1wiLFxuICBcIkRvd25BcnJvd0JhclwiOlwiXFx1MjkxM1wiLFxuICBcIkRvd25BcnJvd1VwQXJyb3dcIjpcIlxcdTIxRjVcIixcbiAgXCJEb3duQnJldmVcIjpcIlxcdTAzMTFcIixcbiAgXCJkb3duZG93bmFycm93c1wiOlwiXFx1MjFDQVwiLFxuICBcImRvd25oYXJwb29ubGVmdFwiOlwiXFx1MjFDM1wiLFxuICBcImRvd25oYXJwb29ucmlnaHRcIjpcIlxcdTIxQzJcIixcbiAgXCJEb3duTGVmdFJpZ2h0VmVjdG9yXCI6XCJcXHUyOTUwXCIsXG4gIFwiRG93bkxlZnRUZWVWZWN0b3JcIjpcIlxcdTI5NUVcIixcbiAgXCJEb3duTGVmdFZlY3RvclwiOlwiXFx1MjFCRFwiLFxuICBcIkRvd25MZWZ0VmVjdG9yQmFyXCI6XCJcXHUyOTU2XCIsXG4gIFwiRG93blJpZ2h0VGVlVmVjdG9yXCI6XCJcXHUyOTVGXCIsXG4gIFwiRG93blJpZ2h0VmVjdG9yXCI6XCJcXHUyMUMxXCIsXG4gIFwiRG93blJpZ2h0VmVjdG9yQmFyXCI6XCJcXHUyOTU3XCIsXG4gIFwiRG93blRlZVwiOlwiXFx1MjJBNFwiLFxuICBcIkRvd25UZWVBcnJvd1wiOlwiXFx1MjFBN1wiLFxuICBcImRyYmthcm93XCI6XCJcXHUyOTEwXCIsXG4gIFwiZHJjb3JuXCI6XCJcXHUyMzFGXCIsXG4gIFwiZHJjcm9wXCI6XCJcXHUyMzBDXCIsXG4gIFwiRHNjclwiOlwiXFx1RDgzNVxcdURDOUZcIixcbiAgXCJkc2NyXCI6XCJcXHVEODM1XFx1RENCOVwiLFxuICBcIkRTY3lcIjpcIlxcdTA0MDVcIixcbiAgXCJkc2N5XCI6XCJcXHUwNDU1XCIsXG4gIFwiZHNvbFwiOlwiXFx1MjlGNlwiLFxuICBcIkRzdHJva1wiOlwiXFx1MDExMFwiLFxuICBcImRzdHJva1wiOlwiXFx1MDExMVwiLFxuICBcImR0ZG90XCI6XCJcXHUyMkYxXCIsXG4gIFwiZHRyaVwiOlwiXFx1MjVCRlwiLFxuICBcImR0cmlmXCI6XCJcXHUyNUJFXCIsXG4gIFwiZHVhcnJcIjpcIlxcdTIxRjVcIixcbiAgXCJkdWhhclwiOlwiXFx1Mjk2RlwiLFxuICBcImR3YW5nbGVcIjpcIlxcdTI5QTZcIixcbiAgXCJEWmN5XCI6XCJcXHUwNDBGXCIsXG4gIFwiZHpjeVwiOlwiXFx1MDQ1RlwiLFxuICBcImR6aWdyYXJyXCI6XCJcXHUyN0ZGXCIsXG4gIFwiRWFjdXRlXCI6XCJcXHUwMEM5XCIsXG4gIFwiZWFjdXRlXCI6XCJcXHUwMEU5XCIsXG4gIFwiZWFzdGVyXCI6XCJcXHUyQTZFXCIsXG4gIFwiRWNhcm9uXCI6XCJcXHUwMTFBXCIsXG4gIFwiZWNhcm9uXCI6XCJcXHUwMTFCXCIsXG4gIFwiZWNpclwiOlwiXFx1MjI1NlwiLFxuICBcIkVjaXJjXCI6XCJcXHUwMENBXCIsXG4gIFwiZWNpcmNcIjpcIlxcdTAwRUFcIixcbiAgXCJlY29sb25cIjpcIlxcdTIyNTVcIixcbiAgXCJFY3lcIjpcIlxcdTA0MkRcIixcbiAgXCJlY3lcIjpcIlxcdTA0NERcIixcbiAgXCJlRERvdFwiOlwiXFx1MkE3N1wiLFxuICBcIkVkb3RcIjpcIlxcdTAxMTZcIixcbiAgXCJlRG90XCI6XCJcXHUyMjUxXCIsXG4gIFwiZWRvdFwiOlwiXFx1MDExN1wiLFxuICBcImVlXCI6XCJcXHUyMTQ3XCIsXG4gIFwiZWZEb3RcIjpcIlxcdTIyNTJcIixcbiAgXCJFZnJcIjpcIlxcdUQ4MzVcXHVERDA4XCIsXG4gIFwiZWZyXCI6XCJcXHVEODM1XFx1REQyMlwiLFxuICBcImVnXCI6XCJcXHUyQTlBXCIsXG4gIFwiRWdyYXZlXCI6XCJcXHUwMEM4XCIsXG4gIFwiZWdyYXZlXCI6XCJcXHUwMEU4XCIsXG4gIFwiZWdzXCI6XCJcXHUyQTk2XCIsXG4gIFwiZWdzZG90XCI6XCJcXHUyQTk4XCIsXG4gIFwiZWxcIjpcIlxcdTJBOTlcIixcbiAgXCJFbGVtZW50XCI6XCJcXHUyMjA4XCIsXG4gIFwiZWxpbnRlcnNcIjpcIlxcdTIzRTdcIixcbiAgXCJlbGxcIjpcIlxcdTIxMTNcIixcbiAgXCJlbHNcIjpcIlxcdTJBOTVcIixcbiAgXCJlbHNkb3RcIjpcIlxcdTJBOTdcIixcbiAgXCJFbWFjclwiOlwiXFx1MDExMlwiLFxuICBcImVtYWNyXCI6XCJcXHUwMTEzXCIsXG4gIFwiZW1wdHlcIjpcIlxcdTIyMDVcIixcbiAgXCJlbXB0eXNldFwiOlwiXFx1MjIwNVwiLFxuICBcIkVtcHR5U21hbGxTcXVhcmVcIjpcIlxcdTI1RkJcIixcbiAgXCJlbXB0eXZcIjpcIlxcdTIyMDVcIixcbiAgXCJFbXB0eVZlcnlTbWFsbFNxdWFyZVwiOlwiXFx1MjVBQlwiLFxuICBcImVtc3BcIjpcIlxcdTIwMDNcIixcbiAgXCJlbXNwMTNcIjpcIlxcdTIwMDRcIixcbiAgXCJlbXNwMTRcIjpcIlxcdTIwMDVcIixcbiAgXCJFTkdcIjpcIlxcdTAxNEFcIixcbiAgXCJlbmdcIjpcIlxcdTAxNEJcIixcbiAgXCJlbnNwXCI6XCJcXHUyMDAyXCIsXG4gIFwiRW9nb25cIjpcIlxcdTAxMThcIixcbiAgXCJlb2dvblwiOlwiXFx1MDExOVwiLFxuICBcIkVvcGZcIjpcIlxcdUQ4MzVcXHVERDNDXCIsXG4gIFwiZW9wZlwiOlwiXFx1RDgzNVxcdURENTZcIixcbiAgXCJlcGFyXCI6XCJcXHUyMkQ1XCIsXG4gIFwiZXBhcnNsXCI6XCJcXHUyOUUzXCIsXG4gIFwiZXBsdXNcIjpcIlxcdTJBNzFcIixcbiAgXCJlcHNpXCI6XCJcXHUwM0I1XCIsXG4gIFwiRXBzaWxvblwiOlwiXFx1MDM5NVwiLFxuICBcImVwc2lsb25cIjpcIlxcdTAzQjVcIixcbiAgXCJlcHNpdlwiOlwiXFx1MDNGNVwiLFxuICBcImVxY2lyY1wiOlwiXFx1MjI1NlwiLFxuICBcImVxY29sb25cIjpcIlxcdTIyNTVcIixcbiAgXCJlcXNpbVwiOlwiXFx1MjI0MlwiLFxuICBcImVxc2xhbnRndHJcIjpcIlxcdTJBOTZcIixcbiAgXCJlcXNsYW50bGVzc1wiOlwiXFx1MkE5NVwiLFxuICBcIkVxdWFsXCI6XCJcXHUyQTc1XCIsXG4gIFwiZXF1YWxzXCI6XCJcXHUwMDNEXCIsXG4gIFwiRXF1YWxUaWxkZVwiOlwiXFx1MjI0MlwiLFxuICBcImVxdWVzdFwiOlwiXFx1MjI1RlwiLFxuICBcIkVxdWlsaWJyaXVtXCI6XCJcXHUyMUNDXCIsXG4gIFwiZXF1aXZcIjpcIlxcdTIyNjFcIixcbiAgXCJlcXVpdkREXCI6XCJcXHUyQTc4XCIsXG4gIFwiZXF2cGFyc2xcIjpcIlxcdTI5RTVcIixcbiAgXCJlcmFyclwiOlwiXFx1Mjk3MVwiLFxuICBcImVyRG90XCI6XCJcXHUyMjUzXCIsXG4gIFwiRXNjclwiOlwiXFx1MjEzMFwiLFxuICBcImVzY3JcIjpcIlxcdTIxMkZcIixcbiAgXCJlc2RvdFwiOlwiXFx1MjI1MFwiLFxuICBcIkVzaW1cIjpcIlxcdTJBNzNcIixcbiAgXCJlc2ltXCI6XCJcXHUyMjQyXCIsXG4gIFwiRXRhXCI6XCJcXHUwMzk3XCIsXG4gIFwiZXRhXCI6XCJcXHUwM0I3XCIsXG4gIFwiRVRIXCI6XCJcXHUwMEQwXCIsXG4gIFwiZXRoXCI6XCJcXHUwMEYwXCIsXG4gIFwiRXVtbFwiOlwiXFx1MDBDQlwiLFxuICBcImV1bWxcIjpcIlxcdTAwRUJcIixcbiAgXCJldXJvXCI6XCJcXHUyMEFDXCIsXG4gIFwiZXhjbFwiOlwiXFx1MDAyMVwiLFxuICBcImV4aXN0XCI6XCJcXHUyMjAzXCIsXG4gIFwiRXhpc3RzXCI6XCJcXHUyMjAzXCIsXG4gIFwiZXhwZWN0YXRpb25cIjpcIlxcdTIxMzBcIixcbiAgXCJFeHBvbmVudGlhbEVcIjpcIlxcdTIxNDdcIixcbiAgXCJleHBvbmVudGlhbGVcIjpcIlxcdTIxNDdcIixcbiAgXCJmYWxsaW5nZG90c2VxXCI6XCJcXHUyMjUyXCIsXG4gIFwiRmN5XCI6XCJcXHUwNDI0XCIsXG4gIFwiZmN5XCI6XCJcXHUwNDQ0XCIsXG4gIFwiZmVtYWxlXCI6XCJcXHUyNjQwXCIsXG4gIFwiZmZpbGlnXCI6XCJcXHVGQjAzXCIsXG4gIFwiZmZsaWdcIjpcIlxcdUZCMDBcIixcbiAgXCJmZmxsaWdcIjpcIlxcdUZCMDRcIixcbiAgXCJGZnJcIjpcIlxcdUQ4MzVcXHVERDA5XCIsXG4gIFwiZmZyXCI6XCJcXHVEODM1XFx1REQyM1wiLFxuICBcImZpbGlnXCI6XCJcXHVGQjAxXCIsXG4gIFwiRmlsbGVkU21hbGxTcXVhcmVcIjpcIlxcdTI1RkNcIixcbiAgXCJGaWxsZWRWZXJ5U21hbGxTcXVhcmVcIjpcIlxcdTI1QUFcIixcbiAgXCJmamxpZ1wiOlwiXFx1MDA2NlxcdTAwNkFcIixcbiAgXCJmbGF0XCI6XCJcXHUyNjZEXCIsXG4gIFwiZmxsaWdcIjpcIlxcdUZCMDJcIixcbiAgXCJmbHRuc1wiOlwiXFx1MjVCMVwiLFxuICBcImZub2ZcIjpcIlxcdTAxOTJcIixcbiAgXCJGb3BmXCI6XCJcXHVEODM1XFx1REQzRFwiLFxuICBcImZvcGZcIjpcIlxcdUQ4MzVcXHVERDU3XCIsXG4gIFwiRm9yQWxsXCI6XCJcXHUyMjAwXCIsXG4gIFwiZm9yYWxsXCI6XCJcXHUyMjAwXCIsXG4gIFwiZm9ya1wiOlwiXFx1MjJENFwiLFxuICBcImZvcmt2XCI6XCJcXHUyQUQ5XCIsXG4gIFwiRm91cmllcnRyZlwiOlwiXFx1MjEzMVwiLFxuICBcImZwYXJ0aW50XCI6XCJcXHUyQTBEXCIsXG4gIFwiZnJhYzEyXCI6XCJcXHUwMEJEXCIsXG4gIFwiZnJhYzEzXCI6XCJcXHUyMTUzXCIsXG4gIFwiZnJhYzE0XCI6XCJcXHUwMEJDXCIsXG4gIFwiZnJhYzE1XCI6XCJcXHUyMTU1XCIsXG4gIFwiZnJhYzE2XCI6XCJcXHUyMTU5XCIsXG4gIFwiZnJhYzE4XCI6XCJcXHUyMTVCXCIsXG4gIFwiZnJhYzIzXCI6XCJcXHUyMTU0XCIsXG4gIFwiZnJhYzI1XCI6XCJcXHUyMTU2XCIsXG4gIFwiZnJhYzM0XCI6XCJcXHUwMEJFXCIsXG4gIFwiZnJhYzM1XCI6XCJcXHUyMTU3XCIsXG4gIFwiZnJhYzM4XCI6XCJcXHUyMTVDXCIsXG4gIFwiZnJhYzQ1XCI6XCJcXHUyMTU4XCIsXG4gIFwiZnJhYzU2XCI6XCJcXHUyMTVBXCIsXG4gIFwiZnJhYzU4XCI6XCJcXHUyMTVEXCIsXG4gIFwiZnJhYzc4XCI6XCJcXHUyMTVFXCIsXG4gIFwiZnJhc2xcIjpcIlxcdTIwNDRcIixcbiAgXCJmcm93blwiOlwiXFx1MjMyMlwiLFxuICBcIkZzY3JcIjpcIlxcdTIxMzFcIixcbiAgXCJmc2NyXCI6XCJcXHVEODM1XFx1RENCQlwiLFxuICBcImdhY3V0ZVwiOlwiXFx1MDFGNVwiLFxuICBcIkdhbW1hXCI6XCJcXHUwMzkzXCIsXG4gIFwiZ2FtbWFcIjpcIlxcdTAzQjNcIixcbiAgXCJHYW1tYWRcIjpcIlxcdTAzRENcIixcbiAgXCJnYW1tYWRcIjpcIlxcdTAzRERcIixcbiAgXCJnYXBcIjpcIlxcdTJBODZcIixcbiAgXCJHYnJldmVcIjpcIlxcdTAxMUVcIixcbiAgXCJnYnJldmVcIjpcIlxcdTAxMUZcIixcbiAgXCJHY2VkaWxcIjpcIlxcdTAxMjJcIixcbiAgXCJHY2lyY1wiOlwiXFx1MDExQ1wiLFxuICBcImdjaXJjXCI6XCJcXHUwMTFEXCIsXG4gIFwiR2N5XCI6XCJcXHUwNDEzXCIsXG4gIFwiZ2N5XCI6XCJcXHUwNDMzXCIsXG4gIFwiR2RvdFwiOlwiXFx1MDEyMFwiLFxuICBcImdkb3RcIjpcIlxcdTAxMjFcIixcbiAgXCJnRVwiOlwiXFx1MjI2N1wiLFxuICBcImdlXCI6XCJcXHUyMjY1XCIsXG4gIFwiZ0VsXCI6XCJcXHUyQThDXCIsXG4gIFwiZ2VsXCI6XCJcXHUyMkRCXCIsXG4gIFwiZ2VxXCI6XCJcXHUyMjY1XCIsXG4gIFwiZ2VxcVwiOlwiXFx1MjI2N1wiLFxuICBcImdlcXNsYW50XCI6XCJcXHUyQTdFXCIsXG4gIFwiZ2VzXCI6XCJcXHUyQTdFXCIsXG4gIFwiZ2VzY2NcIjpcIlxcdTJBQTlcIixcbiAgXCJnZXNkb3RcIjpcIlxcdTJBODBcIixcbiAgXCJnZXNkb3RvXCI6XCJcXHUyQTgyXCIsXG4gIFwiZ2VzZG90b2xcIjpcIlxcdTJBODRcIixcbiAgXCJnZXNsXCI6XCJcXHUyMkRCXFx1RkUwMFwiLFxuICBcImdlc2xlc1wiOlwiXFx1MkE5NFwiLFxuICBcIkdmclwiOlwiXFx1RDgzNVxcdUREMEFcIixcbiAgXCJnZnJcIjpcIlxcdUQ4MzVcXHVERDI0XCIsXG4gIFwiR2dcIjpcIlxcdTIyRDlcIixcbiAgXCJnZ1wiOlwiXFx1MjI2QlwiLFxuICBcImdnZ1wiOlwiXFx1MjJEOVwiLFxuICBcImdpbWVsXCI6XCJcXHUyMTM3XCIsXG4gIFwiR0pjeVwiOlwiXFx1MDQwM1wiLFxuICBcImdqY3lcIjpcIlxcdTA0NTNcIixcbiAgXCJnbFwiOlwiXFx1MjI3N1wiLFxuICBcImdsYVwiOlwiXFx1MkFBNVwiLFxuICBcImdsRVwiOlwiXFx1MkE5MlwiLFxuICBcImdsalwiOlwiXFx1MkFBNFwiLFxuICBcImduYXBcIjpcIlxcdTJBOEFcIixcbiAgXCJnbmFwcHJveFwiOlwiXFx1MkE4QVwiLFxuICBcImduRVwiOlwiXFx1MjI2OVwiLFxuICBcImduZVwiOlwiXFx1MkE4OFwiLFxuICBcImduZXFcIjpcIlxcdTJBODhcIixcbiAgXCJnbmVxcVwiOlwiXFx1MjI2OVwiLFxuICBcImduc2ltXCI6XCJcXHUyMkU3XCIsXG4gIFwiR29wZlwiOlwiXFx1RDgzNVxcdUREM0VcIixcbiAgXCJnb3BmXCI6XCJcXHVEODM1XFx1REQ1OFwiLFxuICBcImdyYXZlXCI6XCJcXHUwMDYwXCIsXG4gIFwiR3JlYXRlckVxdWFsXCI6XCJcXHUyMjY1XCIsXG4gIFwiR3JlYXRlckVxdWFsTGVzc1wiOlwiXFx1MjJEQlwiLFxuICBcIkdyZWF0ZXJGdWxsRXF1YWxcIjpcIlxcdTIyNjdcIixcbiAgXCJHcmVhdGVyR3JlYXRlclwiOlwiXFx1MkFBMlwiLFxuICBcIkdyZWF0ZXJMZXNzXCI6XCJcXHUyMjc3XCIsXG4gIFwiR3JlYXRlclNsYW50RXF1YWxcIjpcIlxcdTJBN0VcIixcbiAgXCJHcmVhdGVyVGlsZGVcIjpcIlxcdTIyNzNcIixcbiAgXCJHc2NyXCI6XCJcXHVEODM1XFx1RENBMlwiLFxuICBcImdzY3JcIjpcIlxcdTIxMEFcIixcbiAgXCJnc2ltXCI6XCJcXHUyMjczXCIsXG4gIFwiZ3NpbWVcIjpcIlxcdTJBOEVcIixcbiAgXCJnc2ltbFwiOlwiXFx1MkE5MFwiLFxuICBcIkdUXCI6XCJcXHUwMDNFXCIsXG4gIFwiR3RcIjpcIlxcdTIyNkJcIixcbiAgXCJndFwiOlwiXFx1MDAzRVwiLFxuICBcImd0Y2NcIjpcIlxcdTJBQTdcIixcbiAgXCJndGNpclwiOlwiXFx1MkE3QVwiLFxuICBcImd0ZG90XCI6XCJcXHUyMkQ3XCIsXG4gIFwiZ3RsUGFyXCI6XCJcXHUyOTk1XCIsXG4gIFwiZ3RxdWVzdFwiOlwiXFx1MkE3Q1wiLFxuICBcImd0cmFwcHJveFwiOlwiXFx1MkE4NlwiLFxuICBcImd0cmFyclwiOlwiXFx1Mjk3OFwiLFxuICBcImd0cmRvdFwiOlwiXFx1MjJEN1wiLFxuICBcImd0cmVxbGVzc1wiOlwiXFx1MjJEQlwiLFxuICBcImd0cmVxcWxlc3NcIjpcIlxcdTJBOENcIixcbiAgXCJndHJsZXNzXCI6XCJcXHUyMjc3XCIsXG4gIFwiZ3Ryc2ltXCI6XCJcXHUyMjczXCIsXG4gIFwiZ3ZlcnRuZXFxXCI6XCJcXHUyMjY5XFx1RkUwMFwiLFxuICBcImd2bkVcIjpcIlxcdTIyNjlcXHVGRTAwXCIsXG4gIFwiSGFjZWtcIjpcIlxcdTAyQzdcIixcbiAgXCJoYWlyc3BcIjpcIlxcdTIwMEFcIixcbiAgXCJoYWxmXCI6XCJcXHUwMEJEXCIsXG4gIFwiaGFtaWx0XCI6XCJcXHUyMTBCXCIsXG4gIFwiSEFSRGN5XCI6XCJcXHUwNDJBXCIsXG4gIFwiaGFyZGN5XCI6XCJcXHUwNDRBXCIsXG4gIFwiaEFyclwiOlwiXFx1MjFENFwiLFxuICBcImhhcnJcIjpcIlxcdTIxOTRcIixcbiAgXCJoYXJyY2lyXCI6XCJcXHUyOTQ4XCIsXG4gIFwiaGFycndcIjpcIlxcdTIxQURcIixcbiAgXCJIYXRcIjpcIlxcdTAwNUVcIixcbiAgXCJoYmFyXCI6XCJcXHUyMTBGXCIsXG4gIFwiSGNpcmNcIjpcIlxcdTAxMjRcIixcbiAgXCJoY2lyY1wiOlwiXFx1MDEyNVwiLFxuICBcImhlYXJ0c1wiOlwiXFx1MjY2NVwiLFxuICBcImhlYXJ0c3VpdFwiOlwiXFx1MjY2NVwiLFxuICBcImhlbGxpcFwiOlwiXFx1MjAyNlwiLFxuICBcImhlcmNvblwiOlwiXFx1MjJCOVwiLFxuICBcIkhmclwiOlwiXFx1MjEwQ1wiLFxuICBcImhmclwiOlwiXFx1RDgzNVxcdUREMjVcIixcbiAgXCJIaWxiZXJ0U3BhY2VcIjpcIlxcdTIxMEJcIixcbiAgXCJoa3NlYXJvd1wiOlwiXFx1MjkyNVwiLFxuICBcImhrc3dhcm93XCI6XCJcXHUyOTI2XCIsXG4gIFwiaG9hcnJcIjpcIlxcdTIxRkZcIixcbiAgXCJob210aHRcIjpcIlxcdTIyM0JcIixcbiAgXCJob29rbGVmdGFycm93XCI6XCJcXHUyMUE5XCIsXG4gIFwiaG9va3JpZ2h0YXJyb3dcIjpcIlxcdTIxQUFcIixcbiAgXCJIb3BmXCI6XCJcXHUyMTBEXCIsXG4gIFwiaG9wZlwiOlwiXFx1RDgzNVxcdURENTlcIixcbiAgXCJob3JiYXJcIjpcIlxcdTIwMTVcIixcbiAgXCJIb3Jpem9udGFsTGluZVwiOlwiXFx1MjUwMFwiLFxuICBcIkhzY3JcIjpcIlxcdTIxMEJcIixcbiAgXCJoc2NyXCI6XCJcXHVEODM1XFx1RENCRFwiLFxuICBcImhzbGFzaFwiOlwiXFx1MjEwRlwiLFxuICBcIkhzdHJva1wiOlwiXFx1MDEyNlwiLFxuICBcImhzdHJva1wiOlwiXFx1MDEyN1wiLFxuICBcIkh1bXBEb3duSHVtcFwiOlwiXFx1MjI0RVwiLFxuICBcIkh1bXBFcXVhbFwiOlwiXFx1MjI0RlwiLFxuICBcImh5YnVsbFwiOlwiXFx1MjA0M1wiLFxuICBcImh5cGhlblwiOlwiXFx1MjAxMFwiLFxuICBcIklhY3V0ZVwiOlwiXFx1MDBDRFwiLFxuICBcImlhY3V0ZVwiOlwiXFx1MDBFRFwiLFxuICBcImljXCI6XCJcXHUyMDYzXCIsXG4gIFwiSWNpcmNcIjpcIlxcdTAwQ0VcIixcbiAgXCJpY2lyY1wiOlwiXFx1MDBFRVwiLFxuICBcIkljeVwiOlwiXFx1MDQxOFwiLFxuICBcImljeVwiOlwiXFx1MDQzOFwiLFxuICBcIklkb3RcIjpcIlxcdTAxMzBcIixcbiAgXCJJRWN5XCI6XCJcXHUwNDE1XCIsXG4gIFwiaWVjeVwiOlwiXFx1MDQzNVwiLFxuICBcImlleGNsXCI6XCJcXHUwMEExXCIsXG4gIFwiaWZmXCI6XCJcXHUyMUQ0XCIsXG4gIFwiSWZyXCI6XCJcXHUyMTExXCIsXG4gIFwiaWZyXCI6XCJcXHVEODM1XFx1REQyNlwiLFxuICBcIklncmF2ZVwiOlwiXFx1MDBDQ1wiLFxuICBcImlncmF2ZVwiOlwiXFx1MDBFQ1wiLFxuICBcImlpXCI6XCJcXHUyMTQ4XCIsXG4gIFwiaWlpaW50XCI6XCJcXHUyQTBDXCIsXG4gIFwiaWlpbnRcIjpcIlxcdTIyMkRcIixcbiAgXCJpaW5maW5cIjpcIlxcdTI5RENcIixcbiAgXCJpaW90YVwiOlwiXFx1MjEyOVwiLFxuICBcIklKbGlnXCI6XCJcXHUwMTMyXCIsXG4gIFwiaWpsaWdcIjpcIlxcdTAxMzNcIixcbiAgXCJJbVwiOlwiXFx1MjExMVwiLFxuICBcIkltYWNyXCI6XCJcXHUwMTJBXCIsXG4gIFwiaW1hY3JcIjpcIlxcdTAxMkJcIixcbiAgXCJpbWFnZVwiOlwiXFx1MjExMVwiLFxuICBcIkltYWdpbmFyeUlcIjpcIlxcdTIxNDhcIixcbiAgXCJpbWFnbGluZVwiOlwiXFx1MjExMFwiLFxuICBcImltYWdwYXJ0XCI6XCJcXHUyMTExXCIsXG4gIFwiaW1hdGhcIjpcIlxcdTAxMzFcIixcbiAgXCJpbW9mXCI6XCJcXHUyMkI3XCIsXG4gIFwiaW1wZWRcIjpcIlxcdTAxQjVcIixcbiAgXCJJbXBsaWVzXCI6XCJcXHUyMUQyXCIsXG4gIFwiaW5cIjpcIlxcdTIyMDhcIixcbiAgXCJpbmNhcmVcIjpcIlxcdTIxMDVcIixcbiAgXCJpbmZpblwiOlwiXFx1MjIxRVwiLFxuICBcImluZmludGllXCI6XCJcXHUyOUREXCIsXG4gIFwiaW5vZG90XCI6XCJcXHUwMTMxXCIsXG4gIFwiSW50XCI6XCJcXHUyMjJDXCIsXG4gIFwiaW50XCI6XCJcXHUyMjJCXCIsXG4gIFwiaW50Y2FsXCI6XCJcXHUyMkJBXCIsXG4gIFwiaW50ZWdlcnNcIjpcIlxcdTIxMjRcIixcbiAgXCJJbnRlZ3JhbFwiOlwiXFx1MjIyQlwiLFxuICBcImludGVyY2FsXCI6XCJcXHUyMkJBXCIsXG4gIFwiSW50ZXJzZWN0aW9uXCI6XCJcXHUyMkMyXCIsXG4gIFwiaW50bGFyaGtcIjpcIlxcdTJBMTdcIixcbiAgXCJpbnRwcm9kXCI6XCJcXHUyQTNDXCIsXG4gIFwiSW52aXNpYmxlQ29tbWFcIjpcIlxcdTIwNjNcIixcbiAgXCJJbnZpc2libGVUaW1lc1wiOlwiXFx1MjA2MlwiLFxuICBcIklPY3lcIjpcIlxcdTA0MDFcIixcbiAgXCJpb2N5XCI6XCJcXHUwNDUxXCIsXG4gIFwiSW9nb25cIjpcIlxcdTAxMkVcIixcbiAgXCJpb2dvblwiOlwiXFx1MDEyRlwiLFxuICBcIklvcGZcIjpcIlxcdUQ4MzVcXHVERDQwXCIsXG4gIFwiaW9wZlwiOlwiXFx1RDgzNVxcdURENUFcIixcbiAgXCJJb3RhXCI6XCJcXHUwMzk5XCIsXG4gIFwiaW90YVwiOlwiXFx1MDNCOVwiLFxuICBcImlwcm9kXCI6XCJcXHUyQTNDXCIsXG4gIFwiaXF1ZXN0XCI6XCJcXHUwMEJGXCIsXG4gIFwiSXNjclwiOlwiXFx1MjExMFwiLFxuICBcImlzY3JcIjpcIlxcdUQ4MzVcXHVEQ0JFXCIsXG4gIFwiaXNpblwiOlwiXFx1MjIwOFwiLFxuICBcImlzaW5kb3RcIjpcIlxcdTIyRjVcIixcbiAgXCJpc2luRVwiOlwiXFx1MjJGOVwiLFxuICBcImlzaW5zXCI6XCJcXHUyMkY0XCIsXG4gIFwiaXNpbnN2XCI6XCJcXHUyMkYzXCIsXG4gIFwiaXNpbnZcIjpcIlxcdTIyMDhcIixcbiAgXCJpdFwiOlwiXFx1MjA2MlwiLFxuICBcIkl0aWxkZVwiOlwiXFx1MDEyOFwiLFxuICBcIml0aWxkZVwiOlwiXFx1MDEyOVwiLFxuICBcIkl1a2N5XCI6XCJcXHUwNDA2XCIsXG4gIFwiaXVrY3lcIjpcIlxcdTA0NTZcIixcbiAgXCJJdW1sXCI6XCJcXHUwMENGXCIsXG4gIFwiaXVtbFwiOlwiXFx1MDBFRlwiLFxuICBcIkpjaXJjXCI6XCJcXHUwMTM0XCIsXG4gIFwiamNpcmNcIjpcIlxcdTAxMzVcIixcbiAgXCJKY3lcIjpcIlxcdTA0MTlcIixcbiAgXCJqY3lcIjpcIlxcdTA0MzlcIixcbiAgXCJKZnJcIjpcIlxcdUQ4MzVcXHVERDBEXCIsXG4gIFwiamZyXCI6XCJcXHVEODM1XFx1REQyN1wiLFxuICBcImptYXRoXCI6XCJcXHUwMjM3XCIsXG4gIFwiSm9wZlwiOlwiXFx1RDgzNVxcdURENDFcIixcbiAgXCJqb3BmXCI6XCJcXHVEODM1XFx1REQ1QlwiLFxuICBcIkpzY3JcIjpcIlxcdUQ4MzVcXHVEQ0E1XCIsXG4gIFwianNjclwiOlwiXFx1RDgzNVxcdURDQkZcIixcbiAgXCJKc2VyY3lcIjpcIlxcdTA0MDhcIixcbiAgXCJqc2VyY3lcIjpcIlxcdTA0NThcIixcbiAgXCJKdWtjeVwiOlwiXFx1MDQwNFwiLFxuICBcImp1a2N5XCI6XCJcXHUwNDU0XCIsXG4gIFwiS2FwcGFcIjpcIlxcdTAzOUFcIixcbiAgXCJrYXBwYVwiOlwiXFx1MDNCQVwiLFxuICBcImthcHBhdlwiOlwiXFx1MDNGMFwiLFxuICBcIktjZWRpbFwiOlwiXFx1MDEzNlwiLFxuICBcImtjZWRpbFwiOlwiXFx1MDEzN1wiLFxuICBcIktjeVwiOlwiXFx1MDQxQVwiLFxuICBcImtjeVwiOlwiXFx1MDQzQVwiLFxuICBcIktmclwiOlwiXFx1RDgzNVxcdUREMEVcIixcbiAgXCJrZnJcIjpcIlxcdUQ4MzVcXHVERDI4XCIsXG4gIFwia2dyZWVuXCI6XCJcXHUwMTM4XCIsXG4gIFwiS0hjeVwiOlwiXFx1MDQyNVwiLFxuICBcImtoY3lcIjpcIlxcdTA0NDVcIixcbiAgXCJLSmN5XCI6XCJcXHUwNDBDXCIsXG4gIFwia2pjeVwiOlwiXFx1MDQ1Q1wiLFxuICBcIktvcGZcIjpcIlxcdUQ4MzVcXHVERDQyXCIsXG4gIFwia29wZlwiOlwiXFx1RDgzNVxcdURENUNcIixcbiAgXCJLc2NyXCI6XCJcXHVEODM1XFx1RENBNlwiLFxuICBcImtzY3JcIjpcIlxcdUQ4MzVcXHVEQ0MwXCIsXG4gIFwibEFhcnJcIjpcIlxcdTIxREFcIixcbiAgXCJMYWN1dGVcIjpcIlxcdTAxMzlcIixcbiAgXCJsYWN1dGVcIjpcIlxcdTAxM0FcIixcbiAgXCJsYWVtcHR5dlwiOlwiXFx1MjlCNFwiLFxuICBcImxhZ3JhblwiOlwiXFx1MjExMlwiLFxuICBcIkxhbWJkYVwiOlwiXFx1MDM5QlwiLFxuICBcImxhbWJkYVwiOlwiXFx1MDNCQlwiLFxuICBcIkxhbmdcIjpcIlxcdTI3RUFcIixcbiAgXCJsYW5nXCI6XCJcXHUyN0U4XCIsXG4gIFwibGFuZ2RcIjpcIlxcdTI5OTFcIixcbiAgXCJsYW5nbGVcIjpcIlxcdTI3RThcIixcbiAgXCJsYXBcIjpcIlxcdTJBODVcIixcbiAgXCJMYXBsYWNldHJmXCI6XCJcXHUyMTEyXCIsXG4gIFwibGFxdW9cIjpcIlxcdTAwQUJcIixcbiAgXCJMYXJyXCI6XCJcXHUyMTlFXCIsXG4gIFwibEFyclwiOlwiXFx1MjFEMFwiLFxuICBcImxhcnJcIjpcIlxcdTIxOTBcIixcbiAgXCJsYXJyYlwiOlwiXFx1MjFFNFwiLFxuICBcImxhcnJiZnNcIjpcIlxcdTI5MUZcIixcbiAgXCJsYXJyZnNcIjpcIlxcdTI5MURcIixcbiAgXCJsYXJyaGtcIjpcIlxcdTIxQTlcIixcbiAgXCJsYXJybHBcIjpcIlxcdTIxQUJcIixcbiAgXCJsYXJycGxcIjpcIlxcdTI5MzlcIixcbiAgXCJsYXJyc2ltXCI6XCJcXHUyOTczXCIsXG4gIFwibGFycnRsXCI6XCJcXHUyMUEyXCIsXG4gIFwibGF0XCI6XCJcXHUyQUFCXCIsXG4gIFwibEF0YWlsXCI6XCJcXHUyOTFCXCIsXG4gIFwibGF0YWlsXCI6XCJcXHUyOTE5XCIsXG4gIFwibGF0ZVwiOlwiXFx1MkFBRFwiLFxuICBcImxhdGVzXCI6XCJcXHUyQUFEXFx1RkUwMFwiLFxuICBcImxCYXJyXCI6XCJcXHUyOTBFXCIsXG4gIFwibGJhcnJcIjpcIlxcdTI5MENcIixcbiAgXCJsYmJya1wiOlwiXFx1Mjc3MlwiLFxuICBcImxicmFjZVwiOlwiXFx1MDA3QlwiLFxuICBcImxicmFja1wiOlwiXFx1MDA1QlwiLFxuICBcImxicmtlXCI6XCJcXHUyOThCXCIsXG4gIFwibGJya3NsZFwiOlwiXFx1Mjk4RlwiLFxuICBcImxicmtzbHVcIjpcIlxcdTI5OERcIixcbiAgXCJMY2Fyb25cIjpcIlxcdTAxM0RcIixcbiAgXCJsY2Fyb25cIjpcIlxcdTAxM0VcIixcbiAgXCJMY2VkaWxcIjpcIlxcdTAxM0JcIixcbiAgXCJsY2VkaWxcIjpcIlxcdTAxM0NcIixcbiAgXCJsY2VpbFwiOlwiXFx1MjMwOFwiLFxuICBcImxjdWJcIjpcIlxcdTAwN0JcIixcbiAgXCJMY3lcIjpcIlxcdTA0MUJcIixcbiAgXCJsY3lcIjpcIlxcdTA0M0JcIixcbiAgXCJsZGNhXCI6XCJcXHUyOTM2XCIsXG4gIFwibGRxdW9cIjpcIlxcdTIwMUNcIixcbiAgXCJsZHF1b3JcIjpcIlxcdTIwMUVcIixcbiAgXCJsZHJkaGFyXCI6XCJcXHUyOTY3XCIsXG4gIFwibGRydXNoYXJcIjpcIlxcdTI5NEJcIixcbiAgXCJsZHNoXCI6XCJcXHUyMUIyXCIsXG4gIFwibEVcIjpcIlxcdTIyNjZcIixcbiAgXCJsZVwiOlwiXFx1MjI2NFwiLFxuICBcIkxlZnRBbmdsZUJyYWNrZXRcIjpcIlxcdTI3RThcIixcbiAgXCJMZWZ0QXJyb3dcIjpcIlxcdTIxOTBcIixcbiAgXCJMZWZ0YXJyb3dcIjpcIlxcdTIxRDBcIixcbiAgXCJsZWZ0YXJyb3dcIjpcIlxcdTIxOTBcIixcbiAgXCJMZWZ0QXJyb3dCYXJcIjpcIlxcdTIxRTRcIixcbiAgXCJMZWZ0QXJyb3dSaWdodEFycm93XCI6XCJcXHUyMUM2XCIsXG4gIFwibGVmdGFycm93dGFpbFwiOlwiXFx1MjFBMlwiLFxuICBcIkxlZnRDZWlsaW5nXCI6XCJcXHUyMzA4XCIsXG4gIFwiTGVmdERvdWJsZUJyYWNrZXRcIjpcIlxcdTI3RTZcIixcbiAgXCJMZWZ0RG93blRlZVZlY3RvclwiOlwiXFx1Mjk2MVwiLFxuICBcIkxlZnREb3duVmVjdG9yXCI6XCJcXHUyMUMzXCIsXG4gIFwiTGVmdERvd25WZWN0b3JCYXJcIjpcIlxcdTI5NTlcIixcbiAgXCJMZWZ0Rmxvb3JcIjpcIlxcdTIzMEFcIixcbiAgXCJsZWZ0aGFycG9vbmRvd25cIjpcIlxcdTIxQkRcIixcbiAgXCJsZWZ0aGFycG9vbnVwXCI6XCJcXHUyMUJDXCIsXG4gIFwibGVmdGxlZnRhcnJvd3NcIjpcIlxcdTIxQzdcIixcbiAgXCJMZWZ0UmlnaHRBcnJvd1wiOlwiXFx1MjE5NFwiLFxuICBcIkxlZnRyaWdodGFycm93XCI6XCJcXHUyMUQ0XCIsXG4gIFwibGVmdHJpZ2h0YXJyb3dcIjpcIlxcdTIxOTRcIixcbiAgXCJsZWZ0cmlnaHRhcnJvd3NcIjpcIlxcdTIxQzZcIixcbiAgXCJsZWZ0cmlnaHRoYXJwb29uc1wiOlwiXFx1MjFDQlwiLFxuICBcImxlZnRyaWdodHNxdWlnYXJyb3dcIjpcIlxcdTIxQURcIixcbiAgXCJMZWZ0UmlnaHRWZWN0b3JcIjpcIlxcdTI5NEVcIixcbiAgXCJMZWZ0VGVlXCI6XCJcXHUyMkEzXCIsXG4gIFwiTGVmdFRlZUFycm93XCI6XCJcXHUyMUE0XCIsXG4gIFwiTGVmdFRlZVZlY3RvclwiOlwiXFx1Mjk1QVwiLFxuICBcImxlZnR0aHJlZXRpbWVzXCI6XCJcXHUyMkNCXCIsXG4gIFwiTGVmdFRyaWFuZ2xlXCI6XCJcXHUyMkIyXCIsXG4gIFwiTGVmdFRyaWFuZ2xlQmFyXCI6XCJcXHUyOUNGXCIsXG4gIFwiTGVmdFRyaWFuZ2xlRXF1YWxcIjpcIlxcdTIyQjRcIixcbiAgXCJMZWZ0VXBEb3duVmVjdG9yXCI6XCJcXHUyOTUxXCIsXG4gIFwiTGVmdFVwVGVlVmVjdG9yXCI6XCJcXHUyOTYwXCIsXG4gIFwiTGVmdFVwVmVjdG9yXCI6XCJcXHUyMUJGXCIsXG4gIFwiTGVmdFVwVmVjdG9yQmFyXCI6XCJcXHUyOTU4XCIsXG4gIFwiTGVmdFZlY3RvclwiOlwiXFx1MjFCQ1wiLFxuICBcIkxlZnRWZWN0b3JCYXJcIjpcIlxcdTI5NTJcIixcbiAgXCJsRWdcIjpcIlxcdTJBOEJcIixcbiAgXCJsZWdcIjpcIlxcdTIyREFcIixcbiAgXCJsZXFcIjpcIlxcdTIyNjRcIixcbiAgXCJsZXFxXCI6XCJcXHUyMjY2XCIsXG4gIFwibGVxc2xhbnRcIjpcIlxcdTJBN0RcIixcbiAgXCJsZXNcIjpcIlxcdTJBN0RcIixcbiAgXCJsZXNjY1wiOlwiXFx1MkFBOFwiLFxuICBcImxlc2RvdFwiOlwiXFx1MkE3RlwiLFxuICBcImxlc2RvdG9cIjpcIlxcdTJBODFcIixcbiAgXCJsZXNkb3RvclwiOlwiXFx1MkE4M1wiLFxuICBcImxlc2dcIjpcIlxcdTIyREFcXHVGRTAwXCIsXG4gIFwibGVzZ2VzXCI6XCJcXHUyQTkzXCIsXG4gIFwibGVzc2FwcHJveFwiOlwiXFx1MkE4NVwiLFxuICBcImxlc3Nkb3RcIjpcIlxcdTIyRDZcIixcbiAgXCJsZXNzZXFndHJcIjpcIlxcdTIyREFcIixcbiAgXCJsZXNzZXFxZ3RyXCI6XCJcXHUyQThCXCIsXG4gIFwiTGVzc0VxdWFsR3JlYXRlclwiOlwiXFx1MjJEQVwiLFxuICBcIkxlc3NGdWxsRXF1YWxcIjpcIlxcdTIyNjZcIixcbiAgXCJMZXNzR3JlYXRlclwiOlwiXFx1MjI3NlwiLFxuICBcImxlc3NndHJcIjpcIlxcdTIyNzZcIixcbiAgXCJMZXNzTGVzc1wiOlwiXFx1MkFBMVwiLFxuICBcImxlc3NzaW1cIjpcIlxcdTIyNzJcIixcbiAgXCJMZXNzU2xhbnRFcXVhbFwiOlwiXFx1MkE3RFwiLFxuICBcIkxlc3NUaWxkZVwiOlwiXFx1MjI3MlwiLFxuICBcImxmaXNodFwiOlwiXFx1Mjk3Q1wiLFxuICBcImxmbG9vclwiOlwiXFx1MjMwQVwiLFxuICBcIkxmclwiOlwiXFx1RDgzNVxcdUREMEZcIixcbiAgXCJsZnJcIjpcIlxcdUQ4MzVcXHVERDI5XCIsXG4gIFwibGdcIjpcIlxcdTIyNzZcIixcbiAgXCJsZ0VcIjpcIlxcdTJBOTFcIixcbiAgXCJsSGFyXCI6XCJcXHUyOTYyXCIsXG4gIFwibGhhcmRcIjpcIlxcdTIxQkRcIixcbiAgXCJsaGFydVwiOlwiXFx1MjFCQ1wiLFxuICBcImxoYXJ1bFwiOlwiXFx1Mjk2QVwiLFxuICBcImxoYmxrXCI6XCJcXHUyNTg0XCIsXG4gIFwiTEpjeVwiOlwiXFx1MDQwOVwiLFxuICBcImxqY3lcIjpcIlxcdTA0NTlcIixcbiAgXCJMbFwiOlwiXFx1MjJEOFwiLFxuICBcImxsXCI6XCJcXHUyMjZBXCIsXG4gIFwibGxhcnJcIjpcIlxcdTIxQzdcIixcbiAgXCJsbGNvcm5lclwiOlwiXFx1MjMxRVwiLFxuICBcIkxsZWZ0YXJyb3dcIjpcIlxcdTIxREFcIixcbiAgXCJsbGhhcmRcIjpcIlxcdTI5NkJcIixcbiAgXCJsbHRyaVwiOlwiXFx1MjVGQVwiLFxuICBcIkxtaWRvdFwiOlwiXFx1MDEzRlwiLFxuICBcImxtaWRvdFwiOlwiXFx1MDE0MFwiLFxuICBcImxtb3VzdFwiOlwiXFx1MjNCMFwiLFxuICBcImxtb3VzdGFjaGVcIjpcIlxcdTIzQjBcIixcbiAgXCJsbmFwXCI6XCJcXHUyQTg5XCIsXG4gIFwibG5hcHByb3hcIjpcIlxcdTJBODlcIixcbiAgXCJsbkVcIjpcIlxcdTIyNjhcIixcbiAgXCJsbmVcIjpcIlxcdTJBODdcIixcbiAgXCJsbmVxXCI6XCJcXHUyQTg3XCIsXG4gIFwibG5lcXFcIjpcIlxcdTIyNjhcIixcbiAgXCJsbnNpbVwiOlwiXFx1MjJFNlwiLFxuICBcImxvYW5nXCI6XCJcXHUyN0VDXCIsXG4gIFwibG9hcnJcIjpcIlxcdTIxRkRcIixcbiAgXCJsb2Jya1wiOlwiXFx1MjdFNlwiLFxuICBcIkxvbmdMZWZ0QXJyb3dcIjpcIlxcdTI3RjVcIixcbiAgXCJMb25nbGVmdGFycm93XCI6XCJcXHUyN0Y4XCIsXG4gIFwibG9uZ2xlZnRhcnJvd1wiOlwiXFx1MjdGNVwiLFxuICBcIkxvbmdMZWZ0UmlnaHRBcnJvd1wiOlwiXFx1MjdGN1wiLFxuICBcIkxvbmdsZWZ0cmlnaHRhcnJvd1wiOlwiXFx1MjdGQVwiLFxuICBcImxvbmdsZWZ0cmlnaHRhcnJvd1wiOlwiXFx1MjdGN1wiLFxuICBcImxvbmdtYXBzdG9cIjpcIlxcdTI3RkNcIixcbiAgXCJMb25nUmlnaHRBcnJvd1wiOlwiXFx1MjdGNlwiLFxuICBcIkxvbmdyaWdodGFycm93XCI6XCJcXHUyN0Y5XCIsXG4gIFwibG9uZ3JpZ2h0YXJyb3dcIjpcIlxcdTI3RjZcIixcbiAgXCJsb29wYXJyb3dsZWZ0XCI6XCJcXHUyMUFCXCIsXG4gIFwibG9vcGFycm93cmlnaHRcIjpcIlxcdTIxQUNcIixcbiAgXCJsb3BhclwiOlwiXFx1Mjk4NVwiLFxuICBcIkxvcGZcIjpcIlxcdUQ4MzVcXHVERDQzXCIsXG4gIFwibG9wZlwiOlwiXFx1RDgzNVxcdURENURcIixcbiAgXCJsb3BsdXNcIjpcIlxcdTJBMkRcIixcbiAgXCJsb3RpbWVzXCI6XCJcXHUyQTM0XCIsXG4gIFwibG93YXN0XCI6XCJcXHUyMjE3XCIsXG4gIFwibG93YmFyXCI6XCJcXHUwMDVGXCIsXG4gIFwiTG93ZXJMZWZ0QXJyb3dcIjpcIlxcdTIxOTlcIixcbiAgXCJMb3dlclJpZ2h0QXJyb3dcIjpcIlxcdTIxOThcIixcbiAgXCJsb3pcIjpcIlxcdTI1Q0FcIixcbiAgXCJsb3plbmdlXCI6XCJcXHUyNUNBXCIsXG4gIFwibG96ZlwiOlwiXFx1MjlFQlwiLFxuICBcImxwYXJcIjpcIlxcdTAwMjhcIixcbiAgXCJscGFybHRcIjpcIlxcdTI5OTNcIixcbiAgXCJscmFyclwiOlwiXFx1MjFDNlwiLFxuICBcImxyY29ybmVyXCI6XCJcXHUyMzFGXCIsXG4gIFwibHJoYXJcIjpcIlxcdTIxQ0JcIixcbiAgXCJscmhhcmRcIjpcIlxcdTI5NkRcIixcbiAgXCJscm1cIjpcIlxcdTIwMEVcIixcbiAgXCJscnRyaVwiOlwiXFx1MjJCRlwiLFxuICBcImxzYXF1b1wiOlwiXFx1MjAzOVwiLFxuICBcIkxzY3JcIjpcIlxcdTIxMTJcIixcbiAgXCJsc2NyXCI6XCJcXHVEODM1XFx1RENDMVwiLFxuICBcIkxzaFwiOlwiXFx1MjFCMFwiLFxuICBcImxzaFwiOlwiXFx1MjFCMFwiLFxuICBcImxzaW1cIjpcIlxcdTIyNzJcIixcbiAgXCJsc2ltZVwiOlwiXFx1MkE4RFwiLFxuICBcImxzaW1nXCI6XCJcXHUyQThGXCIsXG4gIFwibHNxYlwiOlwiXFx1MDA1QlwiLFxuICBcImxzcXVvXCI6XCJcXHUyMDE4XCIsXG4gIFwibHNxdW9yXCI6XCJcXHUyMDFBXCIsXG4gIFwiTHN0cm9rXCI6XCJcXHUwMTQxXCIsXG4gIFwibHN0cm9rXCI6XCJcXHUwMTQyXCIsXG4gIFwiTFRcIjpcIlxcdTAwM0NcIixcbiAgXCJMdFwiOlwiXFx1MjI2QVwiLFxuICBcImx0XCI6XCJcXHUwMDNDXCIsXG4gIFwibHRjY1wiOlwiXFx1MkFBNlwiLFxuICBcImx0Y2lyXCI6XCJcXHUyQTc5XCIsXG4gIFwibHRkb3RcIjpcIlxcdTIyRDZcIixcbiAgXCJsdGhyZWVcIjpcIlxcdTIyQ0JcIixcbiAgXCJsdGltZXNcIjpcIlxcdTIyQzlcIixcbiAgXCJsdGxhcnJcIjpcIlxcdTI5NzZcIixcbiAgXCJsdHF1ZXN0XCI6XCJcXHUyQTdCXCIsXG4gIFwibHRyaVwiOlwiXFx1MjVDM1wiLFxuICBcImx0cmllXCI6XCJcXHUyMkI0XCIsXG4gIFwibHRyaWZcIjpcIlxcdTI1QzJcIixcbiAgXCJsdHJQYXJcIjpcIlxcdTI5OTZcIixcbiAgXCJsdXJkc2hhclwiOlwiXFx1Mjk0QVwiLFxuICBcImx1cnVoYXJcIjpcIlxcdTI5NjZcIixcbiAgXCJsdmVydG5lcXFcIjpcIlxcdTIyNjhcXHVGRTAwXCIsXG4gIFwibHZuRVwiOlwiXFx1MjI2OFxcdUZFMDBcIixcbiAgXCJtYWNyXCI6XCJcXHUwMEFGXCIsXG4gIFwibWFsZVwiOlwiXFx1MjY0MlwiLFxuICBcIm1hbHRcIjpcIlxcdTI3MjBcIixcbiAgXCJtYWx0ZXNlXCI6XCJcXHUyNzIwXCIsXG4gIFwiTWFwXCI6XCJcXHUyOTA1XCIsXG4gIFwibWFwXCI6XCJcXHUyMUE2XCIsXG4gIFwibWFwc3RvXCI6XCJcXHUyMUE2XCIsXG4gIFwibWFwc3RvZG93blwiOlwiXFx1MjFBN1wiLFxuICBcIm1hcHN0b2xlZnRcIjpcIlxcdTIxQTRcIixcbiAgXCJtYXBzdG91cFwiOlwiXFx1MjFBNVwiLFxuICBcIm1hcmtlclwiOlwiXFx1MjVBRVwiLFxuICBcIm1jb21tYVwiOlwiXFx1MkEyOVwiLFxuICBcIk1jeVwiOlwiXFx1MDQxQ1wiLFxuICBcIm1jeVwiOlwiXFx1MDQzQ1wiLFxuICBcIm1kYXNoXCI6XCJcXHUyMDE0XCIsXG4gIFwibUREb3RcIjpcIlxcdTIyM0FcIixcbiAgXCJtZWFzdXJlZGFuZ2xlXCI6XCJcXHUyMjIxXCIsXG4gIFwiTWVkaXVtU3BhY2VcIjpcIlxcdTIwNUZcIixcbiAgXCJNZWxsaW50cmZcIjpcIlxcdTIxMzNcIixcbiAgXCJNZnJcIjpcIlxcdUQ4MzVcXHVERDEwXCIsXG4gIFwibWZyXCI6XCJcXHVEODM1XFx1REQyQVwiLFxuICBcIm1ob1wiOlwiXFx1MjEyN1wiLFxuICBcIm1pY3JvXCI6XCJcXHUwMEI1XCIsXG4gIFwibWlkXCI6XCJcXHUyMjIzXCIsXG4gIFwibWlkYXN0XCI6XCJcXHUwMDJBXCIsXG4gIFwibWlkY2lyXCI6XCJcXHUyQUYwXCIsXG4gIFwibWlkZG90XCI6XCJcXHUwMEI3XCIsXG4gIFwibWludXNcIjpcIlxcdTIyMTJcIixcbiAgXCJtaW51c2JcIjpcIlxcdTIyOUZcIixcbiAgXCJtaW51c2RcIjpcIlxcdTIyMzhcIixcbiAgXCJtaW51c2R1XCI6XCJcXHUyQTJBXCIsXG4gIFwiTWludXNQbHVzXCI6XCJcXHUyMjEzXCIsXG4gIFwibWxjcFwiOlwiXFx1MkFEQlwiLFxuICBcIm1sZHJcIjpcIlxcdTIwMjZcIixcbiAgXCJtbnBsdXNcIjpcIlxcdTIyMTNcIixcbiAgXCJtb2RlbHNcIjpcIlxcdTIyQTdcIixcbiAgXCJNb3BmXCI6XCJcXHVEODM1XFx1REQ0NFwiLFxuICBcIm1vcGZcIjpcIlxcdUQ4MzVcXHVERDVFXCIsXG4gIFwibXBcIjpcIlxcdTIyMTNcIixcbiAgXCJNc2NyXCI6XCJcXHUyMTMzXCIsXG4gIFwibXNjclwiOlwiXFx1RDgzNVxcdURDQzJcIixcbiAgXCJtc3Rwb3NcIjpcIlxcdTIyM0VcIixcbiAgXCJNdVwiOlwiXFx1MDM5Q1wiLFxuICBcIm11XCI6XCJcXHUwM0JDXCIsXG4gIFwibXVsdGltYXBcIjpcIlxcdTIyQjhcIixcbiAgXCJtdW1hcFwiOlwiXFx1MjJCOFwiLFxuICBcIm5hYmxhXCI6XCJcXHUyMjA3XCIsXG4gIFwiTmFjdXRlXCI6XCJcXHUwMTQzXCIsXG4gIFwibmFjdXRlXCI6XCJcXHUwMTQ0XCIsXG4gIFwibmFuZ1wiOlwiXFx1MjIyMFxcdTIwRDJcIixcbiAgXCJuYXBcIjpcIlxcdTIyNDlcIixcbiAgXCJuYXBFXCI6XCJcXHUyQTcwXFx1MDMzOFwiLFxuICBcIm5hcGlkXCI6XCJcXHUyMjRCXFx1MDMzOFwiLFxuICBcIm5hcG9zXCI6XCJcXHUwMTQ5XCIsXG4gIFwibmFwcHJveFwiOlwiXFx1MjI0OVwiLFxuICBcIm5hdHVyXCI6XCJcXHUyNjZFXCIsXG4gIFwibmF0dXJhbFwiOlwiXFx1MjY2RVwiLFxuICBcIm5hdHVyYWxzXCI6XCJcXHUyMTE1XCIsXG4gIFwibmJzcFwiOlwiXFx1MDBBMFwiLFxuICBcIm5idW1wXCI6XCJcXHUyMjRFXFx1MDMzOFwiLFxuICBcIm5idW1wZVwiOlwiXFx1MjI0RlxcdTAzMzhcIixcbiAgXCJuY2FwXCI6XCJcXHUyQTQzXCIsXG4gIFwiTmNhcm9uXCI6XCJcXHUwMTQ3XCIsXG4gIFwibmNhcm9uXCI6XCJcXHUwMTQ4XCIsXG4gIFwiTmNlZGlsXCI6XCJcXHUwMTQ1XCIsXG4gIFwibmNlZGlsXCI6XCJcXHUwMTQ2XCIsXG4gIFwibmNvbmdcIjpcIlxcdTIyNDdcIixcbiAgXCJuY29uZ2RvdFwiOlwiXFx1MkE2RFxcdTAzMzhcIixcbiAgXCJuY3VwXCI6XCJcXHUyQTQyXCIsXG4gIFwiTmN5XCI6XCJcXHUwNDFEXCIsXG4gIFwibmN5XCI6XCJcXHUwNDNEXCIsXG4gIFwibmRhc2hcIjpcIlxcdTIwMTNcIixcbiAgXCJuZVwiOlwiXFx1MjI2MFwiLFxuICBcIm5lYXJoa1wiOlwiXFx1MjkyNFwiLFxuICBcIm5lQXJyXCI6XCJcXHUyMUQ3XCIsXG4gIFwibmVhcnJcIjpcIlxcdTIxOTdcIixcbiAgXCJuZWFycm93XCI6XCJcXHUyMTk3XCIsXG4gIFwibmVkb3RcIjpcIlxcdTIyNTBcXHUwMzM4XCIsXG4gIFwiTmVnYXRpdmVNZWRpdW1TcGFjZVwiOlwiXFx1MjAwQlwiLFxuICBcIk5lZ2F0aXZlVGhpY2tTcGFjZVwiOlwiXFx1MjAwQlwiLFxuICBcIk5lZ2F0aXZlVGhpblNwYWNlXCI6XCJcXHUyMDBCXCIsXG4gIFwiTmVnYXRpdmVWZXJ5VGhpblNwYWNlXCI6XCJcXHUyMDBCXCIsXG4gIFwibmVxdWl2XCI6XCJcXHUyMjYyXCIsXG4gIFwibmVzZWFyXCI6XCJcXHUyOTI4XCIsXG4gIFwibmVzaW1cIjpcIlxcdTIyNDJcXHUwMzM4XCIsXG4gIFwiTmVzdGVkR3JlYXRlckdyZWF0ZXJcIjpcIlxcdTIyNkJcIixcbiAgXCJOZXN0ZWRMZXNzTGVzc1wiOlwiXFx1MjI2QVwiLFxuICBcIk5ld0xpbmVcIjpcIlxcdTAwMEFcIixcbiAgXCJuZXhpc3RcIjpcIlxcdTIyMDRcIixcbiAgXCJuZXhpc3RzXCI6XCJcXHUyMjA0XCIsXG4gIFwiTmZyXCI6XCJcXHVEODM1XFx1REQxMVwiLFxuICBcIm5mclwiOlwiXFx1RDgzNVxcdUREMkJcIixcbiAgXCJuZ0VcIjpcIlxcdTIyNjdcXHUwMzM4XCIsXG4gIFwibmdlXCI6XCJcXHUyMjcxXCIsXG4gIFwibmdlcVwiOlwiXFx1MjI3MVwiLFxuICBcIm5nZXFxXCI6XCJcXHUyMjY3XFx1MDMzOFwiLFxuICBcIm5nZXFzbGFudFwiOlwiXFx1MkE3RVxcdTAzMzhcIixcbiAgXCJuZ2VzXCI6XCJcXHUyQTdFXFx1MDMzOFwiLFxuICBcIm5HZ1wiOlwiXFx1MjJEOVxcdTAzMzhcIixcbiAgXCJuZ3NpbVwiOlwiXFx1MjI3NVwiLFxuICBcIm5HdFwiOlwiXFx1MjI2QlxcdTIwRDJcIixcbiAgXCJuZ3RcIjpcIlxcdTIyNkZcIixcbiAgXCJuZ3RyXCI6XCJcXHUyMjZGXCIsXG4gIFwibkd0dlwiOlwiXFx1MjI2QlxcdTAzMzhcIixcbiAgXCJuaEFyclwiOlwiXFx1MjFDRVwiLFxuICBcIm5oYXJyXCI6XCJcXHUyMUFFXCIsXG4gIFwibmhwYXJcIjpcIlxcdTJBRjJcIixcbiAgXCJuaVwiOlwiXFx1MjIwQlwiLFxuICBcIm5pc1wiOlwiXFx1MjJGQ1wiLFxuICBcIm5pc2RcIjpcIlxcdTIyRkFcIixcbiAgXCJuaXZcIjpcIlxcdTIyMEJcIixcbiAgXCJOSmN5XCI6XCJcXHUwNDBBXCIsXG4gIFwibmpjeVwiOlwiXFx1MDQ1QVwiLFxuICBcIm5sQXJyXCI6XCJcXHUyMUNEXCIsXG4gIFwibmxhcnJcIjpcIlxcdTIxOUFcIixcbiAgXCJubGRyXCI6XCJcXHUyMDI1XCIsXG4gIFwibmxFXCI6XCJcXHUyMjY2XFx1MDMzOFwiLFxuICBcIm5sZVwiOlwiXFx1MjI3MFwiLFxuICBcIm5MZWZ0YXJyb3dcIjpcIlxcdTIxQ0RcIixcbiAgXCJubGVmdGFycm93XCI6XCJcXHUyMTlBXCIsXG4gIFwibkxlZnRyaWdodGFycm93XCI6XCJcXHUyMUNFXCIsXG4gIFwibmxlZnRyaWdodGFycm93XCI6XCJcXHUyMUFFXCIsXG4gIFwibmxlcVwiOlwiXFx1MjI3MFwiLFxuICBcIm5sZXFxXCI6XCJcXHUyMjY2XFx1MDMzOFwiLFxuICBcIm5sZXFzbGFudFwiOlwiXFx1MkE3RFxcdTAzMzhcIixcbiAgXCJubGVzXCI6XCJcXHUyQTdEXFx1MDMzOFwiLFxuICBcIm5sZXNzXCI6XCJcXHUyMjZFXCIsXG4gIFwibkxsXCI6XCJcXHUyMkQ4XFx1MDMzOFwiLFxuICBcIm5sc2ltXCI6XCJcXHUyMjc0XCIsXG4gIFwibkx0XCI6XCJcXHUyMjZBXFx1MjBEMlwiLFxuICBcIm5sdFwiOlwiXFx1MjI2RVwiLFxuICBcIm5sdHJpXCI6XCJcXHUyMkVBXCIsXG4gIFwibmx0cmllXCI6XCJcXHUyMkVDXCIsXG4gIFwibkx0dlwiOlwiXFx1MjI2QVxcdTAzMzhcIixcbiAgXCJubWlkXCI6XCJcXHUyMjI0XCIsXG4gIFwiTm9CcmVha1wiOlwiXFx1MjA2MFwiLFxuICBcIk5vbkJyZWFraW5nU3BhY2VcIjpcIlxcdTAwQTBcIixcbiAgXCJOb3BmXCI6XCJcXHUyMTE1XCIsXG4gIFwibm9wZlwiOlwiXFx1RDgzNVxcdURENUZcIixcbiAgXCJOb3RcIjpcIlxcdTJBRUNcIixcbiAgXCJub3RcIjpcIlxcdTAwQUNcIixcbiAgXCJOb3RDb25ncnVlbnRcIjpcIlxcdTIyNjJcIixcbiAgXCJOb3RDdXBDYXBcIjpcIlxcdTIyNkRcIixcbiAgXCJOb3REb3VibGVWZXJ0aWNhbEJhclwiOlwiXFx1MjIyNlwiLFxuICBcIk5vdEVsZW1lbnRcIjpcIlxcdTIyMDlcIixcbiAgXCJOb3RFcXVhbFwiOlwiXFx1MjI2MFwiLFxuICBcIk5vdEVxdWFsVGlsZGVcIjpcIlxcdTIyNDJcXHUwMzM4XCIsXG4gIFwiTm90RXhpc3RzXCI6XCJcXHUyMjA0XCIsXG4gIFwiTm90R3JlYXRlclwiOlwiXFx1MjI2RlwiLFxuICBcIk5vdEdyZWF0ZXJFcXVhbFwiOlwiXFx1MjI3MVwiLFxuICBcIk5vdEdyZWF0ZXJGdWxsRXF1YWxcIjpcIlxcdTIyNjdcXHUwMzM4XCIsXG4gIFwiTm90R3JlYXRlckdyZWF0ZXJcIjpcIlxcdTIyNkJcXHUwMzM4XCIsXG4gIFwiTm90R3JlYXRlckxlc3NcIjpcIlxcdTIyNzlcIixcbiAgXCJOb3RHcmVhdGVyU2xhbnRFcXVhbFwiOlwiXFx1MkE3RVxcdTAzMzhcIixcbiAgXCJOb3RHcmVhdGVyVGlsZGVcIjpcIlxcdTIyNzVcIixcbiAgXCJOb3RIdW1wRG93bkh1bXBcIjpcIlxcdTIyNEVcXHUwMzM4XCIsXG4gIFwiTm90SHVtcEVxdWFsXCI6XCJcXHUyMjRGXFx1MDMzOFwiLFxuICBcIm5vdGluXCI6XCJcXHUyMjA5XCIsXG4gIFwibm90aW5kb3RcIjpcIlxcdTIyRjVcXHUwMzM4XCIsXG4gIFwibm90aW5FXCI6XCJcXHUyMkY5XFx1MDMzOFwiLFxuICBcIm5vdGludmFcIjpcIlxcdTIyMDlcIixcbiAgXCJub3RpbnZiXCI6XCJcXHUyMkY3XCIsXG4gIFwibm90aW52Y1wiOlwiXFx1MjJGNlwiLFxuICBcIk5vdExlZnRUcmlhbmdsZVwiOlwiXFx1MjJFQVwiLFxuICBcIk5vdExlZnRUcmlhbmdsZUJhclwiOlwiXFx1MjlDRlxcdTAzMzhcIixcbiAgXCJOb3RMZWZ0VHJpYW5nbGVFcXVhbFwiOlwiXFx1MjJFQ1wiLFxuICBcIk5vdExlc3NcIjpcIlxcdTIyNkVcIixcbiAgXCJOb3RMZXNzRXF1YWxcIjpcIlxcdTIyNzBcIixcbiAgXCJOb3RMZXNzR3JlYXRlclwiOlwiXFx1MjI3OFwiLFxuICBcIk5vdExlc3NMZXNzXCI6XCJcXHUyMjZBXFx1MDMzOFwiLFxuICBcIk5vdExlc3NTbGFudEVxdWFsXCI6XCJcXHUyQTdEXFx1MDMzOFwiLFxuICBcIk5vdExlc3NUaWxkZVwiOlwiXFx1MjI3NFwiLFxuICBcIk5vdE5lc3RlZEdyZWF0ZXJHcmVhdGVyXCI6XCJcXHUyQUEyXFx1MDMzOFwiLFxuICBcIk5vdE5lc3RlZExlc3NMZXNzXCI6XCJcXHUyQUExXFx1MDMzOFwiLFxuICBcIm5vdG5pXCI6XCJcXHUyMjBDXCIsXG4gIFwibm90bml2YVwiOlwiXFx1MjIwQ1wiLFxuICBcIm5vdG5pdmJcIjpcIlxcdTIyRkVcIixcbiAgXCJub3RuaXZjXCI6XCJcXHUyMkZEXCIsXG4gIFwiTm90UHJlY2VkZXNcIjpcIlxcdTIyODBcIixcbiAgXCJOb3RQcmVjZWRlc0VxdWFsXCI6XCJcXHUyQUFGXFx1MDMzOFwiLFxuICBcIk5vdFByZWNlZGVzU2xhbnRFcXVhbFwiOlwiXFx1MjJFMFwiLFxuICBcIk5vdFJldmVyc2VFbGVtZW50XCI6XCJcXHUyMjBDXCIsXG4gIFwiTm90UmlnaHRUcmlhbmdsZVwiOlwiXFx1MjJFQlwiLFxuICBcIk5vdFJpZ2h0VHJpYW5nbGVCYXJcIjpcIlxcdTI5RDBcXHUwMzM4XCIsXG4gIFwiTm90UmlnaHRUcmlhbmdsZUVxdWFsXCI6XCJcXHUyMkVEXCIsXG4gIFwiTm90U3F1YXJlU3Vic2V0XCI6XCJcXHUyMjhGXFx1MDMzOFwiLFxuICBcIk5vdFNxdWFyZVN1YnNldEVxdWFsXCI6XCJcXHUyMkUyXCIsXG4gIFwiTm90U3F1YXJlU3VwZXJzZXRcIjpcIlxcdTIyOTBcXHUwMzM4XCIsXG4gIFwiTm90U3F1YXJlU3VwZXJzZXRFcXVhbFwiOlwiXFx1MjJFM1wiLFxuICBcIk5vdFN1YnNldFwiOlwiXFx1MjI4MlxcdTIwRDJcIixcbiAgXCJOb3RTdWJzZXRFcXVhbFwiOlwiXFx1MjI4OFwiLFxuICBcIk5vdFN1Y2NlZWRzXCI6XCJcXHUyMjgxXCIsXG4gIFwiTm90U3VjY2VlZHNFcXVhbFwiOlwiXFx1MkFCMFxcdTAzMzhcIixcbiAgXCJOb3RTdWNjZWVkc1NsYW50RXF1YWxcIjpcIlxcdTIyRTFcIixcbiAgXCJOb3RTdWNjZWVkc1RpbGRlXCI6XCJcXHUyMjdGXFx1MDMzOFwiLFxuICBcIk5vdFN1cGVyc2V0XCI6XCJcXHUyMjgzXFx1MjBEMlwiLFxuICBcIk5vdFN1cGVyc2V0RXF1YWxcIjpcIlxcdTIyODlcIixcbiAgXCJOb3RUaWxkZVwiOlwiXFx1MjI0MVwiLFxuICBcIk5vdFRpbGRlRXF1YWxcIjpcIlxcdTIyNDRcIixcbiAgXCJOb3RUaWxkZUZ1bGxFcXVhbFwiOlwiXFx1MjI0N1wiLFxuICBcIk5vdFRpbGRlVGlsZGVcIjpcIlxcdTIyNDlcIixcbiAgXCJOb3RWZXJ0aWNhbEJhclwiOlwiXFx1MjIyNFwiLFxuICBcIm5wYXJcIjpcIlxcdTIyMjZcIixcbiAgXCJucGFyYWxsZWxcIjpcIlxcdTIyMjZcIixcbiAgXCJucGFyc2xcIjpcIlxcdTJBRkRcXHUyMEU1XCIsXG4gIFwibnBhcnRcIjpcIlxcdTIyMDJcXHUwMzM4XCIsXG4gIFwibnBvbGludFwiOlwiXFx1MkExNFwiLFxuICBcIm5wclwiOlwiXFx1MjI4MFwiLFxuICBcIm5wcmN1ZVwiOlwiXFx1MjJFMFwiLFxuICBcIm5wcmVcIjpcIlxcdTJBQUZcXHUwMzM4XCIsXG4gIFwibnByZWNcIjpcIlxcdTIyODBcIixcbiAgXCJucHJlY2VxXCI6XCJcXHUyQUFGXFx1MDMzOFwiLFxuICBcIm5yQXJyXCI6XCJcXHUyMUNGXCIsXG4gIFwibnJhcnJcIjpcIlxcdTIxOUJcIixcbiAgXCJucmFycmNcIjpcIlxcdTI5MzNcXHUwMzM4XCIsXG4gIFwibnJhcnJ3XCI6XCJcXHUyMTlEXFx1MDMzOFwiLFxuICBcIm5SaWdodGFycm93XCI6XCJcXHUyMUNGXCIsXG4gIFwibnJpZ2h0YXJyb3dcIjpcIlxcdTIxOUJcIixcbiAgXCJucnRyaVwiOlwiXFx1MjJFQlwiLFxuICBcIm5ydHJpZVwiOlwiXFx1MjJFRFwiLFxuICBcIm5zY1wiOlwiXFx1MjI4MVwiLFxuICBcIm5zY2N1ZVwiOlwiXFx1MjJFMVwiLFxuICBcIm5zY2VcIjpcIlxcdTJBQjBcXHUwMzM4XCIsXG4gIFwiTnNjclwiOlwiXFx1RDgzNVxcdURDQTlcIixcbiAgXCJuc2NyXCI6XCJcXHVEODM1XFx1RENDM1wiLFxuICBcIm5zaG9ydG1pZFwiOlwiXFx1MjIyNFwiLFxuICBcIm5zaG9ydHBhcmFsbGVsXCI6XCJcXHUyMjI2XCIsXG4gIFwibnNpbVwiOlwiXFx1MjI0MVwiLFxuICBcIm5zaW1lXCI6XCJcXHUyMjQ0XCIsXG4gIFwibnNpbWVxXCI6XCJcXHUyMjQ0XCIsXG4gIFwibnNtaWRcIjpcIlxcdTIyMjRcIixcbiAgXCJuc3BhclwiOlwiXFx1MjIyNlwiLFxuICBcIm5zcXN1YmVcIjpcIlxcdTIyRTJcIixcbiAgXCJuc3FzdXBlXCI6XCJcXHUyMkUzXCIsXG4gIFwibnN1YlwiOlwiXFx1MjI4NFwiLFxuICBcIm5zdWJFXCI6XCJcXHUyQUM1XFx1MDMzOFwiLFxuICBcIm5zdWJlXCI6XCJcXHUyMjg4XCIsXG4gIFwibnN1YnNldFwiOlwiXFx1MjI4MlxcdTIwRDJcIixcbiAgXCJuc3Vic2V0ZXFcIjpcIlxcdTIyODhcIixcbiAgXCJuc3Vic2V0ZXFxXCI6XCJcXHUyQUM1XFx1MDMzOFwiLFxuICBcIm5zdWNjXCI6XCJcXHUyMjgxXCIsXG4gIFwibnN1Y2NlcVwiOlwiXFx1MkFCMFxcdTAzMzhcIixcbiAgXCJuc3VwXCI6XCJcXHUyMjg1XCIsXG4gIFwibnN1cEVcIjpcIlxcdTJBQzZcXHUwMzM4XCIsXG4gIFwibnN1cGVcIjpcIlxcdTIyODlcIixcbiAgXCJuc3Vwc2V0XCI6XCJcXHUyMjgzXFx1MjBEMlwiLFxuICBcIm5zdXBzZXRlcVwiOlwiXFx1MjI4OVwiLFxuICBcIm5zdXBzZXRlcXFcIjpcIlxcdTJBQzZcXHUwMzM4XCIsXG4gIFwibnRnbFwiOlwiXFx1MjI3OVwiLFxuICBcIk50aWxkZVwiOlwiXFx1MDBEMVwiLFxuICBcIm50aWxkZVwiOlwiXFx1MDBGMVwiLFxuICBcIm50bGdcIjpcIlxcdTIyNzhcIixcbiAgXCJudHJpYW5nbGVsZWZ0XCI6XCJcXHUyMkVBXCIsXG4gIFwibnRyaWFuZ2xlbGVmdGVxXCI6XCJcXHUyMkVDXCIsXG4gIFwibnRyaWFuZ2xlcmlnaHRcIjpcIlxcdTIyRUJcIixcbiAgXCJudHJpYW5nbGVyaWdodGVxXCI6XCJcXHUyMkVEXCIsXG4gIFwiTnVcIjpcIlxcdTAzOURcIixcbiAgXCJudVwiOlwiXFx1MDNCRFwiLFxuICBcIm51bVwiOlwiXFx1MDAyM1wiLFxuICBcIm51bWVyb1wiOlwiXFx1MjExNlwiLFxuICBcIm51bXNwXCI6XCJcXHUyMDA3XCIsXG4gIFwibnZhcFwiOlwiXFx1MjI0RFxcdTIwRDJcIixcbiAgXCJuVkRhc2hcIjpcIlxcdTIyQUZcIixcbiAgXCJuVmRhc2hcIjpcIlxcdTIyQUVcIixcbiAgXCJudkRhc2hcIjpcIlxcdTIyQURcIixcbiAgXCJudmRhc2hcIjpcIlxcdTIyQUNcIixcbiAgXCJudmdlXCI6XCJcXHUyMjY1XFx1MjBEMlwiLFxuICBcIm52Z3RcIjpcIlxcdTAwM0VcXHUyMEQyXCIsXG4gIFwibnZIYXJyXCI6XCJcXHUyOTA0XCIsXG4gIFwibnZpbmZpblwiOlwiXFx1MjlERVwiLFxuICBcIm52bEFyclwiOlwiXFx1MjkwMlwiLFxuICBcIm52bGVcIjpcIlxcdTIyNjRcXHUyMEQyXCIsXG4gIFwibnZsdFwiOlwiXFx1MDAzQ1xcdTIwRDJcIixcbiAgXCJudmx0cmllXCI6XCJcXHUyMkI0XFx1MjBEMlwiLFxuICBcIm52ckFyclwiOlwiXFx1MjkwM1wiLFxuICBcIm52cnRyaWVcIjpcIlxcdTIyQjVcXHUyMEQyXCIsXG4gIFwibnZzaW1cIjpcIlxcdTIyM0NcXHUyMEQyXCIsXG4gIFwibndhcmhrXCI6XCJcXHUyOTIzXCIsXG4gIFwibndBcnJcIjpcIlxcdTIxRDZcIixcbiAgXCJud2FyclwiOlwiXFx1MjE5NlwiLFxuICBcIm53YXJyb3dcIjpcIlxcdTIxOTZcIixcbiAgXCJud25lYXJcIjpcIlxcdTI5MjdcIixcbiAgXCJPYWN1dGVcIjpcIlxcdTAwRDNcIixcbiAgXCJvYWN1dGVcIjpcIlxcdTAwRjNcIixcbiAgXCJvYXN0XCI6XCJcXHUyMjlCXCIsXG4gIFwib2NpclwiOlwiXFx1MjI5QVwiLFxuICBcIk9jaXJjXCI6XCJcXHUwMEQ0XCIsXG4gIFwib2NpcmNcIjpcIlxcdTAwRjRcIixcbiAgXCJPY3lcIjpcIlxcdTA0MUVcIixcbiAgXCJvY3lcIjpcIlxcdTA0M0VcIixcbiAgXCJvZGFzaFwiOlwiXFx1MjI5RFwiLFxuICBcIk9kYmxhY1wiOlwiXFx1MDE1MFwiLFxuICBcIm9kYmxhY1wiOlwiXFx1MDE1MVwiLFxuICBcIm9kaXZcIjpcIlxcdTJBMzhcIixcbiAgXCJvZG90XCI6XCJcXHUyMjk5XCIsXG4gIFwib2Rzb2xkXCI6XCJcXHUyOUJDXCIsXG4gIFwiT0VsaWdcIjpcIlxcdTAxNTJcIixcbiAgXCJvZWxpZ1wiOlwiXFx1MDE1M1wiLFxuICBcIm9mY2lyXCI6XCJcXHUyOUJGXCIsXG4gIFwiT2ZyXCI6XCJcXHVEODM1XFx1REQxMlwiLFxuICBcIm9mclwiOlwiXFx1RDgzNVxcdUREMkNcIixcbiAgXCJvZ29uXCI6XCJcXHUwMkRCXCIsXG4gIFwiT2dyYXZlXCI6XCJcXHUwMEQyXCIsXG4gIFwib2dyYXZlXCI6XCJcXHUwMEYyXCIsXG4gIFwib2d0XCI6XCJcXHUyOUMxXCIsXG4gIFwib2hiYXJcIjpcIlxcdTI5QjVcIixcbiAgXCJvaG1cIjpcIlxcdTAzQTlcIixcbiAgXCJvaW50XCI6XCJcXHUyMjJFXCIsXG4gIFwib2xhcnJcIjpcIlxcdTIxQkFcIixcbiAgXCJvbGNpclwiOlwiXFx1MjlCRVwiLFxuICBcIm9sY3Jvc3NcIjpcIlxcdTI5QkJcIixcbiAgXCJvbGluZVwiOlwiXFx1MjAzRVwiLFxuICBcIm9sdFwiOlwiXFx1MjlDMFwiLFxuICBcIk9tYWNyXCI6XCJcXHUwMTRDXCIsXG4gIFwib21hY3JcIjpcIlxcdTAxNERcIixcbiAgXCJPbWVnYVwiOlwiXFx1MDNBOVwiLFxuICBcIm9tZWdhXCI6XCJcXHUwM0M5XCIsXG4gIFwiT21pY3JvblwiOlwiXFx1MDM5RlwiLFxuICBcIm9taWNyb25cIjpcIlxcdTAzQkZcIixcbiAgXCJvbWlkXCI6XCJcXHUyOUI2XCIsXG4gIFwib21pbnVzXCI6XCJcXHUyMjk2XCIsXG4gIFwiT29wZlwiOlwiXFx1RDgzNVxcdURENDZcIixcbiAgXCJvb3BmXCI6XCJcXHVEODM1XFx1REQ2MFwiLFxuICBcIm9wYXJcIjpcIlxcdTI5QjdcIixcbiAgXCJPcGVuQ3VybHlEb3VibGVRdW90ZVwiOlwiXFx1MjAxQ1wiLFxuICBcIk9wZW5DdXJseVF1b3RlXCI6XCJcXHUyMDE4XCIsXG4gIFwib3BlcnBcIjpcIlxcdTI5QjlcIixcbiAgXCJvcGx1c1wiOlwiXFx1MjI5NVwiLFxuICBcIk9yXCI6XCJcXHUyQTU0XCIsXG4gIFwib3JcIjpcIlxcdTIyMjhcIixcbiAgXCJvcmFyclwiOlwiXFx1MjFCQlwiLFxuICBcIm9yZFwiOlwiXFx1MkE1RFwiLFxuICBcIm9yZGVyXCI6XCJcXHUyMTM0XCIsXG4gIFwib3JkZXJvZlwiOlwiXFx1MjEzNFwiLFxuICBcIm9yZGZcIjpcIlxcdTAwQUFcIixcbiAgXCJvcmRtXCI6XCJcXHUwMEJBXCIsXG4gIFwib3JpZ29mXCI6XCJcXHUyMkI2XCIsXG4gIFwib3JvclwiOlwiXFx1MkE1NlwiLFxuICBcIm9yc2xvcGVcIjpcIlxcdTJBNTdcIixcbiAgXCJvcnZcIjpcIlxcdTJBNUJcIixcbiAgXCJvU1wiOlwiXFx1MjRDOFwiLFxuICBcIk9zY3JcIjpcIlxcdUQ4MzVcXHVEQ0FBXCIsXG4gIFwib3NjclwiOlwiXFx1MjEzNFwiLFxuICBcIk9zbGFzaFwiOlwiXFx1MDBEOFwiLFxuICBcIm9zbGFzaFwiOlwiXFx1MDBGOFwiLFxuICBcIm9zb2xcIjpcIlxcdTIyOThcIixcbiAgXCJPdGlsZGVcIjpcIlxcdTAwRDVcIixcbiAgXCJvdGlsZGVcIjpcIlxcdTAwRjVcIixcbiAgXCJPdGltZXNcIjpcIlxcdTJBMzdcIixcbiAgXCJvdGltZXNcIjpcIlxcdTIyOTdcIixcbiAgXCJvdGltZXNhc1wiOlwiXFx1MkEzNlwiLFxuICBcIk91bWxcIjpcIlxcdTAwRDZcIixcbiAgXCJvdW1sXCI6XCJcXHUwMEY2XCIsXG4gIFwib3ZiYXJcIjpcIlxcdTIzM0RcIixcbiAgXCJPdmVyQmFyXCI6XCJcXHUyMDNFXCIsXG4gIFwiT3ZlckJyYWNlXCI6XCJcXHUyM0RFXCIsXG4gIFwiT3ZlckJyYWNrZXRcIjpcIlxcdTIzQjRcIixcbiAgXCJPdmVyUGFyZW50aGVzaXNcIjpcIlxcdTIzRENcIixcbiAgXCJwYXJcIjpcIlxcdTIyMjVcIixcbiAgXCJwYXJhXCI6XCJcXHUwMEI2XCIsXG4gIFwicGFyYWxsZWxcIjpcIlxcdTIyMjVcIixcbiAgXCJwYXJzaW1cIjpcIlxcdTJBRjNcIixcbiAgXCJwYXJzbFwiOlwiXFx1MkFGRFwiLFxuICBcInBhcnRcIjpcIlxcdTIyMDJcIixcbiAgXCJQYXJ0aWFsRFwiOlwiXFx1MjIwMlwiLFxuICBcIlBjeVwiOlwiXFx1MDQxRlwiLFxuICBcInBjeVwiOlwiXFx1MDQzRlwiLFxuICBcInBlcmNudFwiOlwiXFx1MDAyNVwiLFxuICBcInBlcmlvZFwiOlwiXFx1MDAyRVwiLFxuICBcInBlcm1pbFwiOlwiXFx1MjAzMFwiLFxuICBcInBlcnBcIjpcIlxcdTIyQTVcIixcbiAgXCJwZXJ0ZW5rXCI6XCJcXHUyMDMxXCIsXG4gIFwiUGZyXCI6XCJcXHVEODM1XFx1REQxM1wiLFxuICBcInBmclwiOlwiXFx1RDgzNVxcdUREMkRcIixcbiAgXCJQaGlcIjpcIlxcdTAzQTZcIixcbiAgXCJwaGlcIjpcIlxcdTAzQzZcIixcbiAgXCJwaGl2XCI6XCJcXHUwM0Q1XCIsXG4gIFwicGhtbWF0XCI6XCJcXHUyMTMzXCIsXG4gIFwicGhvbmVcIjpcIlxcdTI2MEVcIixcbiAgXCJQaVwiOlwiXFx1MDNBMFwiLFxuICBcInBpXCI6XCJcXHUwM0MwXCIsXG4gIFwicGl0Y2hmb3JrXCI6XCJcXHUyMkQ0XCIsXG4gIFwicGl2XCI6XCJcXHUwM0Q2XCIsXG4gIFwicGxhbmNrXCI6XCJcXHUyMTBGXCIsXG4gIFwicGxhbmNraFwiOlwiXFx1MjEwRVwiLFxuICBcInBsYW5rdlwiOlwiXFx1MjEwRlwiLFxuICBcInBsdXNcIjpcIlxcdTAwMkJcIixcbiAgXCJwbHVzYWNpclwiOlwiXFx1MkEyM1wiLFxuICBcInBsdXNiXCI6XCJcXHUyMjlFXCIsXG4gIFwicGx1c2NpclwiOlwiXFx1MkEyMlwiLFxuICBcInBsdXNkb1wiOlwiXFx1MjIxNFwiLFxuICBcInBsdXNkdVwiOlwiXFx1MkEyNVwiLFxuICBcInBsdXNlXCI6XCJcXHUyQTcyXCIsXG4gIFwiUGx1c01pbnVzXCI6XCJcXHUwMEIxXCIsXG4gIFwicGx1c21uXCI6XCJcXHUwMEIxXCIsXG4gIFwicGx1c3NpbVwiOlwiXFx1MkEyNlwiLFxuICBcInBsdXN0d29cIjpcIlxcdTJBMjdcIixcbiAgXCJwbVwiOlwiXFx1MDBCMVwiLFxuICBcIlBvaW5jYXJlcGxhbmVcIjpcIlxcdTIxMENcIixcbiAgXCJwb2ludGludFwiOlwiXFx1MkExNVwiLFxuICBcIlBvcGZcIjpcIlxcdTIxMTlcIixcbiAgXCJwb3BmXCI6XCJcXHVEODM1XFx1REQ2MVwiLFxuICBcInBvdW5kXCI6XCJcXHUwMEEzXCIsXG4gIFwiUHJcIjpcIlxcdTJBQkJcIixcbiAgXCJwclwiOlwiXFx1MjI3QVwiLFxuICBcInByYXBcIjpcIlxcdTJBQjdcIixcbiAgXCJwcmN1ZVwiOlwiXFx1MjI3Q1wiLFxuICBcInByRVwiOlwiXFx1MkFCM1wiLFxuICBcInByZVwiOlwiXFx1MkFBRlwiLFxuICBcInByZWNcIjpcIlxcdTIyN0FcIixcbiAgXCJwcmVjYXBwcm94XCI6XCJcXHUyQUI3XCIsXG4gIFwicHJlY2N1cmx5ZXFcIjpcIlxcdTIyN0NcIixcbiAgXCJQcmVjZWRlc1wiOlwiXFx1MjI3QVwiLFxuICBcIlByZWNlZGVzRXF1YWxcIjpcIlxcdTJBQUZcIixcbiAgXCJQcmVjZWRlc1NsYW50RXF1YWxcIjpcIlxcdTIyN0NcIixcbiAgXCJQcmVjZWRlc1RpbGRlXCI6XCJcXHUyMjdFXCIsXG4gIFwicHJlY2VxXCI6XCJcXHUyQUFGXCIsXG4gIFwicHJlY25hcHByb3hcIjpcIlxcdTJBQjlcIixcbiAgXCJwcmVjbmVxcVwiOlwiXFx1MkFCNVwiLFxuICBcInByZWNuc2ltXCI6XCJcXHUyMkU4XCIsXG4gIFwicHJlY3NpbVwiOlwiXFx1MjI3RVwiLFxuICBcIlByaW1lXCI6XCJcXHUyMDMzXCIsXG4gIFwicHJpbWVcIjpcIlxcdTIwMzJcIixcbiAgXCJwcmltZXNcIjpcIlxcdTIxMTlcIixcbiAgXCJwcm5hcFwiOlwiXFx1MkFCOVwiLFxuICBcInBybkVcIjpcIlxcdTJBQjVcIixcbiAgXCJwcm5zaW1cIjpcIlxcdTIyRThcIixcbiAgXCJwcm9kXCI6XCJcXHUyMjBGXCIsXG4gIFwiUHJvZHVjdFwiOlwiXFx1MjIwRlwiLFxuICBcInByb2ZhbGFyXCI6XCJcXHUyMzJFXCIsXG4gIFwicHJvZmxpbmVcIjpcIlxcdTIzMTJcIixcbiAgXCJwcm9mc3VyZlwiOlwiXFx1MjMxM1wiLFxuICBcInByb3BcIjpcIlxcdTIyMURcIixcbiAgXCJQcm9wb3J0aW9uXCI6XCJcXHUyMjM3XCIsXG4gIFwiUHJvcG9ydGlvbmFsXCI6XCJcXHUyMjFEXCIsXG4gIFwicHJvcHRvXCI6XCJcXHUyMjFEXCIsXG4gIFwicHJzaW1cIjpcIlxcdTIyN0VcIixcbiAgXCJwcnVyZWxcIjpcIlxcdTIyQjBcIixcbiAgXCJQc2NyXCI6XCJcXHVEODM1XFx1RENBQlwiLFxuICBcInBzY3JcIjpcIlxcdUQ4MzVcXHVEQ0M1XCIsXG4gIFwiUHNpXCI6XCJcXHUwM0E4XCIsXG4gIFwicHNpXCI6XCJcXHUwM0M4XCIsXG4gIFwicHVuY3NwXCI6XCJcXHUyMDA4XCIsXG4gIFwiUWZyXCI6XCJcXHVEODM1XFx1REQxNFwiLFxuICBcInFmclwiOlwiXFx1RDgzNVxcdUREMkVcIixcbiAgXCJxaW50XCI6XCJcXHUyQTBDXCIsXG4gIFwiUW9wZlwiOlwiXFx1MjExQVwiLFxuICBcInFvcGZcIjpcIlxcdUQ4MzVcXHVERDYyXCIsXG4gIFwicXByaW1lXCI6XCJcXHUyMDU3XCIsXG4gIFwiUXNjclwiOlwiXFx1RDgzNVxcdURDQUNcIixcbiAgXCJxc2NyXCI6XCJcXHVEODM1XFx1RENDNlwiLFxuICBcInF1YXRlcm5pb25zXCI6XCJcXHUyMTBEXCIsXG4gIFwicXVhdGludFwiOlwiXFx1MkExNlwiLFxuICBcInF1ZXN0XCI6XCJcXHUwMDNGXCIsXG4gIFwicXVlc3RlcVwiOlwiXFx1MjI1RlwiLFxuICBcIlFVT1RcIjpcIlxcdTAwMjJcIixcbiAgXCJxdW90XCI6XCJcXHUwMDIyXCIsXG4gIFwickFhcnJcIjpcIlxcdTIxREJcIixcbiAgXCJyYWNlXCI6XCJcXHUyMjNEXFx1MDMzMVwiLFxuICBcIlJhY3V0ZVwiOlwiXFx1MDE1NFwiLFxuICBcInJhY3V0ZVwiOlwiXFx1MDE1NVwiLFxuICBcInJhZGljXCI6XCJcXHUyMjFBXCIsXG4gIFwicmFlbXB0eXZcIjpcIlxcdTI5QjNcIixcbiAgXCJSYW5nXCI6XCJcXHUyN0VCXCIsXG4gIFwicmFuZ1wiOlwiXFx1MjdFOVwiLFxuICBcInJhbmdkXCI6XCJcXHUyOTkyXCIsXG4gIFwicmFuZ2VcIjpcIlxcdTI5QTVcIixcbiAgXCJyYW5nbGVcIjpcIlxcdTI3RTlcIixcbiAgXCJyYXF1b1wiOlwiXFx1MDBCQlwiLFxuICBcIlJhcnJcIjpcIlxcdTIxQTBcIixcbiAgXCJyQXJyXCI6XCJcXHUyMUQyXCIsXG4gIFwicmFyclwiOlwiXFx1MjE5MlwiLFxuICBcInJhcnJhcFwiOlwiXFx1Mjk3NVwiLFxuICBcInJhcnJiXCI6XCJcXHUyMUU1XCIsXG4gIFwicmFycmJmc1wiOlwiXFx1MjkyMFwiLFxuICBcInJhcnJjXCI6XCJcXHUyOTMzXCIsXG4gIFwicmFycmZzXCI6XCJcXHUyOTFFXCIsXG4gIFwicmFycmhrXCI6XCJcXHUyMUFBXCIsXG4gIFwicmFycmxwXCI6XCJcXHUyMUFDXCIsXG4gIFwicmFycnBsXCI6XCJcXHUyOTQ1XCIsXG4gIFwicmFycnNpbVwiOlwiXFx1Mjk3NFwiLFxuICBcIlJhcnJ0bFwiOlwiXFx1MjkxNlwiLFxuICBcInJhcnJ0bFwiOlwiXFx1MjFBM1wiLFxuICBcInJhcnJ3XCI6XCJcXHUyMTlEXCIsXG4gIFwickF0YWlsXCI6XCJcXHUyOTFDXCIsXG4gIFwicmF0YWlsXCI6XCJcXHUyOTFBXCIsXG4gIFwicmF0aW9cIjpcIlxcdTIyMzZcIixcbiAgXCJyYXRpb25hbHNcIjpcIlxcdTIxMUFcIixcbiAgXCJSQmFyclwiOlwiXFx1MjkxMFwiLFxuICBcInJCYXJyXCI6XCJcXHUyOTBGXCIsXG4gIFwicmJhcnJcIjpcIlxcdTI5MERcIixcbiAgXCJyYmJya1wiOlwiXFx1Mjc3M1wiLFxuICBcInJicmFjZVwiOlwiXFx1MDA3RFwiLFxuICBcInJicmFja1wiOlwiXFx1MDA1RFwiLFxuICBcInJicmtlXCI6XCJcXHUyOThDXCIsXG4gIFwicmJya3NsZFwiOlwiXFx1Mjk4RVwiLFxuICBcInJicmtzbHVcIjpcIlxcdTI5OTBcIixcbiAgXCJSY2Fyb25cIjpcIlxcdTAxNThcIixcbiAgXCJyY2Fyb25cIjpcIlxcdTAxNTlcIixcbiAgXCJSY2VkaWxcIjpcIlxcdTAxNTZcIixcbiAgXCJyY2VkaWxcIjpcIlxcdTAxNTdcIixcbiAgXCJyY2VpbFwiOlwiXFx1MjMwOVwiLFxuICBcInJjdWJcIjpcIlxcdTAwN0RcIixcbiAgXCJSY3lcIjpcIlxcdTA0MjBcIixcbiAgXCJyY3lcIjpcIlxcdTA0NDBcIixcbiAgXCJyZGNhXCI6XCJcXHUyOTM3XCIsXG4gIFwicmRsZGhhclwiOlwiXFx1Mjk2OVwiLFxuICBcInJkcXVvXCI6XCJcXHUyMDFEXCIsXG4gIFwicmRxdW9yXCI6XCJcXHUyMDFEXCIsXG4gIFwicmRzaFwiOlwiXFx1MjFCM1wiLFxuICBcIlJlXCI6XCJcXHUyMTFDXCIsXG4gIFwicmVhbFwiOlwiXFx1MjExQ1wiLFxuICBcInJlYWxpbmVcIjpcIlxcdTIxMUJcIixcbiAgXCJyZWFscGFydFwiOlwiXFx1MjExQ1wiLFxuICBcInJlYWxzXCI6XCJcXHUyMTFEXCIsXG4gIFwicmVjdFwiOlwiXFx1MjVBRFwiLFxuICBcIlJFR1wiOlwiXFx1MDBBRVwiLFxuICBcInJlZ1wiOlwiXFx1MDBBRVwiLFxuICBcIlJldmVyc2VFbGVtZW50XCI6XCJcXHUyMjBCXCIsXG4gIFwiUmV2ZXJzZUVxdWlsaWJyaXVtXCI6XCJcXHUyMUNCXCIsXG4gIFwiUmV2ZXJzZVVwRXF1aWxpYnJpdW1cIjpcIlxcdTI5NkZcIixcbiAgXCJyZmlzaHRcIjpcIlxcdTI5N0RcIixcbiAgXCJyZmxvb3JcIjpcIlxcdTIzMEJcIixcbiAgXCJSZnJcIjpcIlxcdTIxMUNcIixcbiAgXCJyZnJcIjpcIlxcdUQ4MzVcXHVERDJGXCIsXG4gIFwickhhclwiOlwiXFx1Mjk2NFwiLFxuICBcInJoYXJkXCI6XCJcXHUyMUMxXCIsXG4gIFwicmhhcnVcIjpcIlxcdTIxQzBcIixcbiAgXCJyaGFydWxcIjpcIlxcdTI5NkNcIixcbiAgXCJSaG9cIjpcIlxcdTAzQTFcIixcbiAgXCJyaG9cIjpcIlxcdTAzQzFcIixcbiAgXCJyaG92XCI6XCJcXHUwM0YxXCIsXG4gIFwiUmlnaHRBbmdsZUJyYWNrZXRcIjpcIlxcdTI3RTlcIixcbiAgXCJSaWdodEFycm93XCI6XCJcXHUyMTkyXCIsXG4gIFwiUmlnaHRhcnJvd1wiOlwiXFx1MjFEMlwiLFxuICBcInJpZ2h0YXJyb3dcIjpcIlxcdTIxOTJcIixcbiAgXCJSaWdodEFycm93QmFyXCI6XCJcXHUyMUU1XCIsXG4gIFwiUmlnaHRBcnJvd0xlZnRBcnJvd1wiOlwiXFx1MjFDNFwiLFxuICBcInJpZ2h0YXJyb3d0YWlsXCI6XCJcXHUyMUEzXCIsXG4gIFwiUmlnaHRDZWlsaW5nXCI6XCJcXHUyMzA5XCIsXG4gIFwiUmlnaHREb3VibGVCcmFja2V0XCI6XCJcXHUyN0U3XCIsXG4gIFwiUmlnaHREb3duVGVlVmVjdG9yXCI6XCJcXHUyOTVEXCIsXG4gIFwiUmlnaHREb3duVmVjdG9yXCI6XCJcXHUyMUMyXCIsXG4gIFwiUmlnaHREb3duVmVjdG9yQmFyXCI6XCJcXHUyOTU1XCIsXG4gIFwiUmlnaHRGbG9vclwiOlwiXFx1MjMwQlwiLFxuICBcInJpZ2h0aGFycG9vbmRvd25cIjpcIlxcdTIxQzFcIixcbiAgXCJyaWdodGhhcnBvb251cFwiOlwiXFx1MjFDMFwiLFxuICBcInJpZ2h0bGVmdGFycm93c1wiOlwiXFx1MjFDNFwiLFxuICBcInJpZ2h0bGVmdGhhcnBvb25zXCI6XCJcXHUyMUNDXCIsXG4gIFwicmlnaHRyaWdodGFycm93c1wiOlwiXFx1MjFDOVwiLFxuICBcInJpZ2h0c3F1aWdhcnJvd1wiOlwiXFx1MjE5RFwiLFxuICBcIlJpZ2h0VGVlXCI6XCJcXHUyMkEyXCIsXG4gIFwiUmlnaHRUZWVBcnJvd1wiOlwiXFx1MjFBNlwiLFxuICBcIlJpZ2h0VGVlVmVjdG9yXCI6XCJcXHUyOTVCXCIsXG4gIFwicmlnaHR0aHJlZXRpbWVzXCI6XCJcXHUyMkNDXCIsXG4gIFwiUmlnaHRUcmlhbmdsZVwiOlwiXFx1MjJCM1wiLFxuICBcIlJpZ2h0VHJpYW5nbGVCYXJcIjpcIlxcdTI5RDBcIixcbiAgXCJSaWdodFRyaWFuZ2xlRXF1YWxcIjpcIlxcdTIyQjVcIixcbiAgXCJSaWdodFVwRG93blZlY3RvclwiOlwiXFx1Mjk0RlwiLFxuICBcIlJpZ2h0VXBUZWVWZWN0b3JcIjpcIlxcdTI5NUNcIixcbiAgXCJSaWdodFVwVmVjdG9yXCI6XCJcXHUyMUJFXCIsXG4gIFwiUmlnaHRVcFZlY3RvckJhclwiOlwiXFx1Mjk1NFwiLFxuICBcIlJpZ2h0VmVjdG9yXCI6XCJcXHUyMUMwXCIsXG4gIFwiUmlnaHRWZWN0b3JCYXJcIjpcIlxcdTI5NTNcIixcbiAgXCJyaW5nXCI6XCJcXHUwMkRBXCIsXG4gIFwicmlzaW5nZG90c2VxXCI6XCJcXHUyMjUzXCIsXG4gIFwicmxhcnJcIjpcIlxcdTIxQzRcIixcbiAgXCJybGhhclwiOlwiXFx1MjFDQ1wiLFxuICBcInJsbVwiOlwiXFx1MjAwRlwiLFxuICBcInJtb3VzdFwiOlwiXFx1MjNCMVwiLFxuICBcInJtb3VzdGFjaGVcIjpcIlxcdTIzQjFcIixcbiAgXCJybm1pZFwiOlwiXFx1MkFFRVwiLFxuICBcInJvYW5nXCI6XCJcXHUyN0VEXCIsXG4gIFwicm9hcnJcIjpcIlxcdTIxRkVcIixcbiAgXCJyb2Jya1wiOlwiXFx1MjdFN1wiLFxuICBcInJvcGFyXCI6XCJcXHUyOTg2XCIsXG4gIFwiUm9wZlwiOlwiXFx1MjExRFwiLFxuICBcInJvcGZcIjpcIlxcdUQ4MzVcXHVERDYzXCIsXG4gIFwicm9wbHVzXCI6XCJcXHUyQTJFXCIsXG4gIFwicm90aW1lc1wiOlwiXFx1MkEzNVwiLFxuICBcIlJvdW5kSW1wbGllc1wiOlwiXFx1Mjk3MFwiLFxuICBcInJwYXJcIjpcIlxcdTAwMjlcIixcbiAgXCJycGFyZ3RcIjpcIlxcdTI5OTRcIixcbiAgXCJycHBvbGludFwiOlwiXFx1MkExMlwiLFxuICBcInJyYXJyXCI6XCJcXHUyMUM5XCIsXG4gIFwiUnJpZ2h0YXJyb3dcIjpcIlxcdTIxREJcIixcbiAgXCJyc2FxdW9cIjpcIlxcdTIwM0FcIixcbiAgXCJSc2NyXCI6XCJcXHUyMTFCXCIsXG4gIFwicnNjclwiOlwiXFx1RDgzNVxcdURDQzdcIixcbiAgXCJSc2hcIjpcIlxcdTIxQjFcIixcbiAgXCJyc2hcIjpcIlxcdTIxQjFcIixcbiAgXCJyc3FiXCI6XCJcXHUwMDVEXCIsXG4gIFwicnNxdW9cIjpcIlxcdTIwMTlcIixcbiAgXCJyc3F1b3JcIjpcIlxcdTIwMTlcIixcbiAgXCJydGhyZWVcIjpcIlxcdTIyQ0NcIixcbiAgXCJydGltZXNcIjpcIlxcdTIyQ0FcIixcbiAgXCJydHJpXCI6XCJcXHUyNUI5XCIsXG4gIFwicnRyaWVcIjpcIlxcdTIyQjVcIixcbiAgXCJydHJpZlwiOlwiXFx1MjVCOFwiLFxuICBcInJ0cmlsdHJpXCI6XCJcXHUyOUNFXCIsXG4gIFwiUnVsZURlbGF5ZWRcIjpcIlxcdTI5RjRcIixcbiAgXCJydWx1aGFyXCI6XCJcXHUyOTY4XCIsXG4gIFwicnhcIjpcIlxcdTIxMUVcIixcbiAgXCJTYWN1dGVcIjpcIlxcdTAxNUFcIixcbiAgXCJzYWN1dGVcIjpcIlxcdTAxNUJcIixcbiAgXCJzYnF1b1wiOlwiXFx1MjAxQVwiLFxuICBcIlNjXCI6XCJcXHUyQUJDXCIsXG4gIFwic2NcIjpcIlxcdTIyN0JcIixcbiAgXCJzY2FwXCI6XCJcXHUyQUI4XCIsXG4gIFwiU2Nhcm9uXCI6XCJcXHUwMTYwXCIsXG4gIFwic2Nhcm9uXCI6XCJcXHUwMTYxXCIsXG4gIFwic2NjdWVcIjpcIlxcdTIyN0RcIixcbiAgXCJzY0VcIjpcIlxcdTJBQjRcIixcbiAgXCJzY2VcIjpcIlxcdTJBQjBcIixcbiAgXCJTY2VkaWxcIjpcIlxcdTAxNUVcIixcbiAgXCJzY2VkaWxcIjpcIlxcdTAxNUZcIixcbiAgXCJTY2lyY1wiOlwiXFx1MDE1Q1wiLFxuICBcInNjaXJjXCI6XCJcXHUwMTVEXCIsXG4gIFwic2NuYXBcIjpcIlxcdTJBQkFcIixcbiAgXCJzY25FXCI6XCJcXHUyQUI2XCIsXG4gIFwic2Nuc2ltXCI6XCJcXHUyMkU5XCIsXG4gIFwic2Nwb2xpbnRcIjpcIlxcdTJBMTNcIixcbiAgXCJzY3NpbVwiOlwiXFx1MjI3RlwiLFxuICBcIlNjeVwiOlwiXFx1MDQyMVwiLFxuICBcInNjeVwiOlwiXFx1MDQ0MVwiLFxuICBcInNkb3RcIjpcIlxcdTIyQzVcIixcbiAgXCJzZG90YlwiOlwiXFx1MjJBMVwiLFxuICBcInNkb3RlXCI6XCJcXHUyQTY2XCIsXG4gIFwic2VhcmhrXCI6XCJcXHUyOTI1XCIsXG4gIFwic2VBcnJcIjpcIlxcdTIxRDhcIixcbiAgXCJzZWFyclwiOlwiXFx1MjE5OFwiLFxuICBcInNlYXJyb3dcIjpcIlxcdTIxOThcIixcbiAgXCJzZWN0XCI6XCJcXHUwMEE3XCIsXG4gIFwic2VtaVwiOlwiXFx1MDAzQlwiLFxuICBcInNlc3dhclwiOlwiXFx1MjkyOVwiLFxuICBcInNldG1pbnVzXCI6XCJcXHUyMjE2XCIsXG4gIFwic2V0bW5cIjpcIlxcdTIyMTZcIixcbiAgXCJzZXh0XCI6XCJcXHUyNzM2XCIsXG4gIFwiU2ZyXCI6XCJcXHVEODM1XFx1REQxNlwiLFxuICBcInNmclwiOlwiXFx1RDgzNVxcdUREMzBcIixcbiAgXCJzZnJvd25cIjpcIlxcdTIzMjJcIixcbiAgXCJzaGFycFwiOlwiXFx1MjY2RlwiLFxuICBcIlNIQ0hjeVwiOlwiXFx1MDQyOVwiLFxuICBcInNoY2hjeVwiOlwiXFx1MDQ0OVwiLFxuICBcIlNIY3lcIjpcIlxcdTA0MjhcIixcbiAgXCJzaGN5XCI6XCJcXHUwNDQ4XCIsXG4gIFwiU2hvcnREb3duQXJyb3dcIjpcIlxcdTIxOTNcIixcbiAgXCJTaG9ydExlZnRBcnJvd1wiOlwiXFx1MjE5MFwiLFxuICBcInNob3J0bWlkXCI6XCJcXHUyMjIzXCIsXG4gIFwic2hvcnRwYXJhbGxlbFwiOlwiXFx1MjIyNVwiLFxuICBcIlNob3J0UmlnaHRBcnJvd1wiOlwiXFx1MjE5MlwiLFxuICBcIlNob3J0VXBBcnJvd1wiOlwiXFx1MjE5MVwiLFxuICBcInNoeVwiOlwiXFx1MDBBRFwiLFxuICBcIlNpZ21hXCI6XCJcXHUwM0EzXCIsXG4gIFwic2lnbWFcIjpcIlxcdTAzQzNcIixcbiAgXCJzaWdtYWZcIjpcIlxcdTAzQzJcIixcbiAgXCJzaWdtYXZcIjpcIlxcdTAzQzJcIixcbiAgXCJzaW1cIjpcIlxcdTIyM0NcIixcbiAgXCJzaW1kb3RcIjpcIlxcdTJBNkFcIixcbiAgXCJzaW1lXCI6XCJcXHUyMjQzXCIsXG4gIFwic2ltZXFcIjpcIlxcdTIyNDNcIixcbiAgXCJzaW1nXCI6XCJcXHUyQTlFXCIsXG4gIFwic2ltZ0VcIjpcIlxcdTJBQTBcIixcbiAgXCJzaW1sXCI6XCJcXHUyQTlEXCIsXG4gIFwic2ltbEVcIjpcIlxcdTJBOUZcIixcbiAgXCJzaW1uZVwiOlwiXFx1MjI0NlwiLFxuICBcInNpbXBsdXNcIjpcIlxcdTJBMjRcIixcbiAgXCJzaW1yYXJyXCI6XCJcXHUyOTcyXCIsXG4gIFwic2xhcnJcIjpcIlxcdTIxOTBcIixcbiAgXCJTbWFsbENpcmNsZVwiOlwiXFx1MjIxOFwiLFxuICBcInNtYWxsc2V0bWludXNcIjpcIlxcdTIyMTZcIixcbiAgXCJzbWFzaHBcIjpcIlxcdTJBMzNcIixcbiAgXCJzbWVwYXJzbFwiOlwiXFx1MjlFNFwiLFxuICBcInNtaWRcIjpcIlxcdTIyMjNcIixcbiAgXCJzbWlsZVwiOlwiXFx1MjMyM1wiLFxuICBcInNtdFwiOlwiXFx1MkFBQVwiLFxuICBcInNtdGVcIjpcIlxcdTJBQUNcIixcbiAgXCJzbXRlc1wiOlwiXFx1MkFBQ1xcdUZFMDBcIixcbiAgXCJTT0ZUY3lcIjpcIlxcdTA0MkNcIixcbiAgXCJzb2Z0Y3lcIjpcIlxcdTA0NENcIixcbiAgXCJzb2xcIjpcIlxcdTAwMkZcIixcbiAgXCJzb2xiXCI6XCJcXHUyOUM0XCIsXG4gIFwic29sYmFyXCI6XCJcXHUyMzNGXCIsXG4gIFwiU29wZlwiOlwiXFx1RDgzNVxcdURENEFcIixcbiAgXCJzb3BmXCI6XCJcXHVEODM1XFx1REQ2NFwiLFxuICBcInNwYWRlc1wiOlwiXFx1MjY2MFwiLFxuICBcInNwYWRlc3VpdFwiOlwiXFx1MjY2MFwiLFxuICBcInNwYXJcIjpcIlxcdTIyMjVcIixcbiAgXCJzcWNhcFwiOlwiXFx1MjI5M1wiLFxuICBcInNxY2Fwc1wiOlwiXFx1MjI5M1xcdUZFMDBcIixcbiAgXCJzcWN1cFwiOlwiXFx1MjI5NFwiLFxuICBcInNxY3Vwc1wiOlwiXFx1MjI5NFxcdUZFMDBcIixcbiAgXCJTcXJ0XCI6XCJcXHUyMjFBXCIsXG4gIFwic3FzdWJcIjpcIlxcdTIyOEZcIixcbiAgXCJzcXN1YmVcIjpcIlxcdTIyOTFcIixcbiAgXCJzcXN1YnNldFwiOlwiXFx1MjI4RlwiLFxuICBcInNxc3Vic2V0ZXFcIjpcIlxcdTIyOTFcIixcbiAgXCJzcXN1cFwiOlwiXFx1MjI5MFwiLFxuICBcInNxc3VwZVwiOlwiXFx1MjI5MlwiLFxuICBcInNxc3Vwc2V0XCI6XCJcXHUyMjkwXCIsXG4gIFwic3FzdXBzZXRlcVwiOlwiXFx1MjI5MlwiLFxuICBcInNxdVwiOlwiXFx1MjVBMVwiLFxuICBcIlNxdWFyZVwiOlwiXFx1MjVBMVwiLFxuICBcInNxdWFyZVwiOlwiXFx1MjVBMVwiLFxuICBcIlNxdWFyZUludGVyc2VjdGlvblwiOlwiXFx1MjI5M1wiLFxuICBcIlNxdWFyZVN1YnNldFwiOlwiXFx1MjI4RlwiLFxuICBcIlNxdWFyZVN1YnNldEVxdWFsXCI6XCJcXHUyMjkxXCIsXG4gIFwiU3F1YXJlU3VwZXJzZXRcIjpcIlxcdTIyOTBcIixcbiAgXCJTcXVhcmVTdXBlcnNldEVxdWFsXCI6XCJcXHUyMjkyXCIsXG4gIFwiU3F1YXJlVW5pb25cIjpcIlxcdTIyOTRcIixcbiAgXCJzcXVhcmZcIjpcIlxcdTI1QUFcIixcbiAgXCJzcXVmXCI6XCJcXHUyNUFBXCIsXG4gIFwic3JhcnJcIjpcIlxcdTIxOTJcIixcbiAgXCJTc2NyXCI6XCJcXHVEODM1XFx1RENBRVwiLFxuICBcInNzY3JcIjpcIlxcdUQ4MzVcXHVEQ0M4XCIsXG4gIFwic3NldG1uXCI6XCJcXHUyMjE2XCIsXG4gIFwic3NtaWxlXCI6XCJcXHUyMzIzXCIsXG4gIFwic3N0YXJmXCI6XCJcXHUyMkM2XCIsXG4gIFwiU3RhclwiOlwiXFx1MjJDNlwiLFxuICBcInN0YXJcIjpcIlxcdTI2MDZcIixcbiAgXCJzdGFyZlwiOlwiXFx1MjYwNVwiLFxuICBcInN0cmFpZ2h0ZXBzaWxvblwiOlwiXFx1MDNGNVwiLFxuICBcInN0cmFpZ2h0cGhpXCI6XCJcXHUwM0Q1XCIsXG4gIFwic3RybnNcIjpcIlxcdTAwQUZcIixcbiAgXCJTdWJcIjpcIlxcdTIyRDBcIixcbiAgXCJzdWJcIjpcIlxcdTIyODJcIixcbiAgXCJzdWJkb3RcIjpcIlxcdTJBQkRcIixcbiAgXCJzdWJFXCI6XCJcXHUyQUM1XCIsXG4gIFwic3ViZVwiOlwiXFx1MjI4NlwiLFxuICBcInN1YmVkb3RcIjpcIlxcdTJBQzNcIixcbiAgXCJzdWJtdWx0XCI6XCJcXHUyQUMxXCIsXG4gIFwic3VibkVcIjpcIlxcdTJBQ0JcIixcbiAgXCJzdWJuZVwiOlwiXFx1MjI4QVwiLFxuICBcInN1YnBsdXNcIjpcIlxcdTJBQkZcIixcbiAgXCJzdWJyYXJyXCI6XCJcXHUyOTc5XCIsXG4gIFwiU3Vic2V0XCI6XCJcXHUyMkQwXCIsXG4gIFwic3Vic2V0XCI6XCJcXHUyMjgyXCIsXG4gIFwic3Vic2V0ZXFcIjpcIlxcdTIyODZcIixcbiAgXCJzdWJzZXRlcXFcIjpcIlxcdTJBQzVcIixcbiAgXCJTdWJzZXRFcXVhbFwiOlwiXFx1MjI4NlwiLFxuICBcInN1YnNldG5lcVwiOlwiXFx1MjI4QVwiLFxuICBcInN1YnNldG5lcXFcIjpcIlxcdTJBQ0JcIixcbiAgXCJzdWJzaW1cIjpcIlxcdTJBQzdcIixcbiAgXCJzdWJzdWJcIjpcIlxcdTJBRDVcIixcbiAgXCJzdWJzdXBcIjpcIlxcdTJBRDNcIixcbiAgXCJzdWNjXCI6XCJcXHUyMjdCXCIsXG4gIFwic3VjY2FwcHJveFwiOlwiXFx1MkFCOFwiLFxuICBcInN1Y2NjdXJseWVxXCI6XCJcXHUyMjdEXCIsXG4gIFwiU3VjY2VlZHNcIjpcIlxcdTIyN0JcIixcbiAgXCJTdWNjZWVkc0VxdWFsXCI6XCJcXHUyQUIwXCIsXG4gIFwiU3VjY2VlZHNTbGFudEVxdWFsXCI6XCJcXHUyMjdEXCIsXG4gIFwiU3VjY2VlZHNUaWxkZVwiOlwiXFx1MjI3RlwiLFxuICBcInN1Y2NlcVwiOlwiXFx1MkFCMFwiLFxuICBcInN1Y2NuYXBwcm94XCI6XCJcXHUyQUJBXCIsXG4gIFwic3VjY25lcXFcIjpcIlxcdTJBQjZcIixcbiAgXCJzdWNjbnNpbVwiOlwiXFx1MjJFOVwiLFxuICBcInN1Y2NzaW1cIjpcIlxcdTIyN0ZcIixcbiAgXCJTdWNoVGhhdFwiOlwiXFx1MjIwQlwiLFxuICBcIlN1bVwiOlwiXFx1MjIxMVwiLFxuICBcInN1bVwiOlwiXFx1MjIxMVwiLFxuICBcInN1bmdcIjpcIlxcdTI2NkFcIixcbiAgXCJTdXBcIjpcIlxcdTIyRDFcIixcbiAgXCJzdXBcIjpcIlxcdTIyODNcIixcbiAgXCJzdXAxXCI6XCJcXHUwMEI5XCIsXG4gIFwic3VwMlwiOlwiXFx1MDBCMlwiLFxuICBcInN1cDNcIjpcIlxcdTAwQjNcIixcbiAgXCJzdXBkb3RcIjpcIlxcdTJBQkVcIixcbiAgXCJzdXBkc3ViXCI6XCJcXHUyQUQ4XCIsXG4gIFwic3VwRVwiOlwiXFx1MkFDNlwiLFxuICBcInN1cGVcIjpcIlxcdTIyODdcIixcbiAgXCJzdXBlZG90XCI6XCJcXHUyQUM0XCIsXG4gIFwiU3VwZXJzZXRcIjpcIlxcdTIyODNcIixcbiAgXCJTdXBlcnNldEVxdWFsXCI6XCJcXHUyMjg3XCIsXG4gIFwic3VwaHNvbFwiOlwiXFx1MjdDOVwiLFxuICBcInN1cGhzdWJcIjpcIlxcdTJBRDdcIixcbiAgXCJzdXBsYXJyXCI6XCJcXHUyOTdCXCIsXG4gIFwic3VwbXVsdFwiOlwiXFx1MkFDMlwiLFxuICBcInN1cG5FXCI6XCJcXHUyQUNDXCIsXG4gIFwic3VwbmVcIjpcIlxcdTIyOEJcIixcbiAgXCJzdXBwbHVzXCI6XCJcXHUyQUMwXCIsXG4gIFwiU3Vwc2V0XCI6XCJcXHUyMkQxXCIsXG4gIFwic3Vwc2V0XCI6XCJcXHUyMjgzXCIsXG4gIFwic3Vwc2V0ZXFcIjpcIlxcdTIyODdcIixcbiAgXCJzdXBzZXRlcXFcIjpcIlxcdTJBQzZcIixcbiAgXCJzdXBzZXRuZXFcIjpcIlxcdTIyOEJcIixcbiAgXCJzdXBzZXRuZXFxXCI6XCJcXHUyQUNDXCIsXG4gIFwic3Vwc2ltXCI6XCJcXHUyQUM4XCIsXG4gIFwic3Vwc3ViXCI6XCJcXHUyQUQ0XCIsXG4gIFwic3Vwc3VwXCI6XCJcXHUyQUQ2XCIsXG4gIFwic3dhcmhrXCI6XCJcXHUyOTI2XCIsXG4gIFwic3dBcnJcIjpcIlxcdTIxRDlcIixcbiAgXCJzd2FyclwiOlwiXFx1MjE5OVwiLFxuICBcInN3YXJyb3dcIjpcIlxcdTIxOTlcIixcbiAgXCJzd253YXJcIjpcIlxcdTI5MkFcIixcbiAgXCJzemxpZ1wiOlwiXFx1MDBERlwiLFxuICBcIlRhYlwiOlwiXFx1MDAwOVwiLFxuICBcInRhcmdldFwiOlwiXFx1MjMxNlwiLFxuICBcIlRhdVwiOlwiXFx1MDNBNFwiLFxuICBcInRhdVwiOlwiXFx1MDNDNFwiLFxuICBcInRicmtcIjpcIlxcdTIzQjRcIixcbiAgXCJUY2Fyb25cIjpcIlxcdTAxNjRcIixcbiAgXCJ0Y2Fyb25cIjpcIlxcdTAxNjVcIixcbiAgXCJUY2VkaWxcIjpcIlxcdTAxNjJcIixcbiAgXCJ0Y2VkaWxcIjpcIlxcdTAxNjNcIixcbiAgXCJUY3lcIjpcIlxcdTA0MjJcIixcbiAgXCJ0Y3lcIjpcIlxcdTA0NDJcIixcbiAgXCJ0ZG90XCI6XCJcXHUyMERCXCIsXG4gIFwidGVscmVjXCI6XCJcXHUyMzE1XCIsXG4gIFwiVGZyXCI6XCJcXHVEODM1XFx1REQxN1wiLFxuICBcInRmclwiOlwiXFx1RDgzNVxcdUREMzFcIixcbiAgXCJ0aGVyZTRcIjpcIlxcdTIyMzRcIixcbiAgXCJUaGVyZWZvcmVcIjpcIlxcdTIyMzRcIixcbiAgXCJ0aGVyZWZvcmVcIjpcIlxcdTIyMzRcIixcbiAgXCJUaGV0YVwiOlwiXFx1MDM5OFwiLFxuICBcInRoZXRhXCI6XCJcXHUwM0I4XCIsXG4gIFwidGhldGFzeW1cIjpcIlxcdTAzRDFcIixcbiAgXCJ0aGV0YXZcIjpcIlxcdTAzRDFcIixcbiAgXCJ0aGlja2FwcHJveFwiOlwiXFx1MjI0OFwiLFxuICBcInRoaWNrc2ltXCI6XCJcXHUyMjNDXCIsXG4gIFwiVGhpY2tTcGFjZVwiOlwiXFx1MjA1RlxcdTIwMEFcIixcbiAgXCJ0aGluc3BcIjpcIlxcdTIwMDlcIixcbiAgXCJUaGluU3BhY2VcIjpcIlxcdTIwMDlcIixcbiAgXCJ0aGthcFwiOlwiXFx1MjI0OFwiLFxuICBcInRoa3NpbVwiOlwiXFx1MjIzQ1wiLFxuICBcIlRIT1JOXCI6XCJcXHUwMERFXCIsXG4gIFwidGhvcm5cIjpcIlxcdTAwRkVcIixcbiAgXCJUaWxkZVwiOlwiXFx1MjIzQ1wiLFxuICBcInRpbGRlXCI6XCJcXHUwMkRDXCIsXG4gIFwiVGlsZGVFcXVhbFwiOlwiXFx1MjI0M1wiLFxuICBcIlRpbGRlRnVsbEVxdWFsXCI6XCJcXHUyMjQ1XCIsXG4gIFwiVGlsZGVUaWxkZVwiOlwiXFx1MjI0OFwiLFxuICBcInRpbWVzXCI6XCJcXHUwMEQ3XCIsXG4gIFwidGltZXNiXCI6XCJcXHUyMkEwXCIsXG4gIFwidGltZXNiYXJcIjpcIlxcdTJBMzFcIixcbiAgXCJ0aW1lc2RcIjpcIlxcdTJBMzBcIixcbiAgXCJ0aW50XCI6XCJcXHUyMjJEXCIsXG4gIFwidG9lYVwiOlwiXFx1MjkyOFwiLFxuICBcInRvcFwiOlwiXFx1MjJBNFwiLFxuICBcInRvcGJvdFwiOlwiXFx1MjMzNlwiLFxuICBcInRvcGNpclwiOlwiXFx1MkFGMVwiLFxuICBcIlRvcGZcIjpcIlxcdUQ4MzVcXHVERDRCXCIsXG4gIFwidG9wZlwiOlwiXFx1RDgzNVxcdURENjVcIixcbiAgXCJ0b3Bmb3JrXCI6XCJcXHUyQURBXCIsXG4gIFwidG9zYVwiOlwiXFx1MjkyOVwiLFxuICBcInRwcmltZVwiOlwiXFx1MjAzNFwiLFxuICBcIlRSQURFXCI6XCJcXHUyMTIyXCIsXG4gIFwidHJhZGVcIjpcIlxcdTIxMjJcIixcbiAgXCJ0cmlhbmdsZVwiOlwiXFx1MjVCNVwiLFxuICBcInRyaWFuZ2xlZG93blwiOlwiXFx1MjVCRlwiLFxuICBcInRyaWFuZ2xlbGVmdFwiOlwiXFx1MjVDM1wiLFxuICBcInRyaWFuZ2xlbGVmdGVxXCI6XCJcXHUyMkI0XCIsXG4gIFwidHJpYW5nbGVxXCI6XCJcXHUyMjVDXCIsXG4gIFwidHJpYW5nbGVyaWdodFwiOlwiXFx1MjVCOVwiLFxuICBcInRyaWFuZ2xlcmlnaHRlcVwiOlwiXFx1MjJCNVwiLFxuICBcInRyaWRvdFwiOlwiXFx1MjVFQ1wiLFxuICBcInRyaWVcIjpcIlxcdTIyNUNcIixcbiAgXCJ0cmltaW51c1wiOlwiXFx1MkEzQVwiLFxuICBcIlRyaXBsZURvdFwiOlwiXFx1MjBEQlwiLFxuICBcInRyaXBsdXNcIjpcIlxcdTJBMzlcIixcbiAgXCJ0cmlzYlwiOlwiXFx1MjlDRFwiLFxuICBcInRyaXRpbWVcIjpcIlxcdTJBM0JcIixcbiAgXCJ0cnBleml1bVwiOlwiXFx1MjNFMlwiLFxuICBcIlRzY3JcIjpcIlxcdUQ4MzVcXHVEQ0FGXCIsXG4gIFwidHNjclwiOlwiXFx1RDgzNVxcdURDQzlcIixcbiAgXCJUU2N5XCI6XCJcXHUwNDI2XCIsXG4gIFwidHNjeVwiOlwiXFx1MDQ0NlwiLFxuICBcIlRTSGN5XCI6XCJcXHUwNDBCXCIsXG4gIFwidHNoY3lcIjpcIlxcdTA0NUJcIixcbiAgXCJUc3Ryb2tcIjpcIlxcdTAxNjZcIixcbiAgXCJ0c3Ryb2tcIjpcIlxcdTAxNjdcIixcbiAgXCJ0d2l4dFwiOlwiXFx1MjI2Q1wiLFxuICBcInR3b2hlYWRsZWZ0YXJyb3dcIjpcIlxcdTIxOUVcIixcbiAgXCJ0d29oZWFkcmlnaHRhcnJvd1wiOlwiXFx1MjFBMFwiLFxuICBcIlVhY3V0ZVwiOlwiXFx1MDBEQVwiLFxuICBcInVhY3V0ZVwiOlwiXFx1MDBGQVwiLFxuICBcIlVhcnJcIjpcIlxcdTIxOUZcIixcbiAgXCJ1QXJyXCI6XCJcXHUyMUQxXCIsXG4gIFwidWFyclwiOlwiXFx1MjE5MVwiLFxuICBcIlVhcnJvY2lyXCI6XCJcXHUyOTQ5XCIsXG4gIFwiVWJyY3lcIjpcIlxcdTA0MEVcIixcbiAgXCJ1YnJjeVwiOlwiXFx1MDQ1RVwiLFxuICBcIlVicmV2ZVwiOlwiXFx1MDE2Q1wiLFxuICBcInVicmV2ZVwiOlwiXFx1MDE2RFwiLFxuICBcIlVjaXJjXCI6XCJcXHUwMERCXCIsXG4gIFwidWNpcmNcIjpcIlxcdTAwRkJcIixcbiAgXCJVY3lcIjpcIlxcdTA0MjNcIixcbiAgXCJ1Y3lcIjpcIlxcdTA0NDNcIixcbiAgXCJ1ZGFyclwiOlwiXFx1MjFDNVwiLFxuICBcIlVkYmxhY1wiOlwiXFx1MDE3MFwiLFxuICBcInVkYmxhY1wiOlwiXFx1MDE3MVwiLFxuICBcInVkaGFyXCI6XCJcXHUyOTZFXCIsXG4gIFwidWZpc2h0XCI6XCJcXHUyOTdFXCIsXG4gIFwiVWZyXCI6XCJcXHVEODM1XFx1REQxOFwiLFxuICBcInVmclwiOlwiXFx1RDgzNVxcdUREMzJcIixcbiAgXCJVZ3JhdmVcIjpcIlxcdTAwRDlcIixcbiAgXCJ1Z3JhdmVcIjpcIlxcdTAwRjlcIixcbiAgXCJ1SGFyXCI6XCJcXHUyOTYzXCIsXG4gIFwidWhhcmxcIjpcIlxcdTIxQkZcIixcbiAgXCJ1aGFyclwiOlwiXFx1MjFCRVwiLFxuICBcInVoYmxrXCI6XCJcXHUyNTgwXCIsXG4gIFwidWxjb3JuXCI6XCJcXHUyMzFDXCIsXG4gIFwidWxjb3JuZXJcIjpcIlxcdTIzMUNcIixcbiAgXCJ1bGNyb3BcIjpcIlxcdTIzMEZcIixcbiAgXCJ1bHRyaVwiOlwiXFx1MjVGOFwiLFxuICBcIlVtYWNyXCI6XCJcXHUwMTZBXCIsXG4gIFwidW1hY3JcIjpcIlxcdTAxNkJcIixcbiAgXCJ1bWxcIjpcIlxcdTAwQThcIixcbiAgXCJVbmRlckJhclwiOlwiXFx1MDA1RlwiLFxuICBcIlVuZGVyQnJhY2VcIjpcIlxcdTIzREZcIixcbiAgXCJVbmRlckJyYWNrZXRcIjpcIlxcdTIzQjVcIixcbiAgXCJVbmRlclBhcmVudGhlc2lzXCI6XCJcXHUyM0REXCIsXG4gIFwiVW5pb25cIjpcIlxcdTIyQzNcIixcbiAgXCJVbmlvblBsdXNcIjpcIlxcdTIyOEVcIixcbiAgXCJVb2dvblwiOlwiXFx1MDE3MlwiLFxuICBcInVvZ29uXCI6XCJcXHUwMTczXCIsXG4gIFwiVW9wZlwiOlwiXFx1RDgzNVxcdURENENcIixcbiAgXCJ1b3BmXCI6XCJcXHVEODM1XFx1REQ2NlwiLFxuICBcIlVwQXJyb3dcIjpcIlxcdTIxOTFcIixcbiAgXCJVcGFycm93XCI6XCJcXHUyMUQxXCIsXG4gIFwidXBhcnJvd1wiOlwiXFx1MjE5MVwiLFxuICBcIlVwQXJyb3dCYXJcIjpcIlxcdTI5MTJcIixcbiAgXCJVcEFycm93RG93bkFycm93XCI6XCJcXHUyMUM1XCIsXG4gIFwiVXBEb3duQXJyb3dcIjpcIlxcdTIxOTVcIixcbiAgXCJVcGRvd25hcnJvd1wiOlwiXFx1MjFENVwiLFxuICBcInVwZG93bmFycm93XCI6XCJcXHUyMTk1XCIsXG4gIFwiVXBFcXVpbGlicml1bVwiOlwiXFx1Mjk2RVwiLFxuICBcInVwaGFycG9vbmxlZnRcIjpcIlxcdTIxQkZcIixcbiAgXCJ1cGhhcnBvb25yaWdodFwiOlwiXFx1MjFCRVwiLFxuICBcInVwbHVzXCI6XCJcXHUyMjhFXCIsXG4gIFwiVXBwZXJMZWZ0QXJyb3dcIjpcIlxcdTIxOTZcIixcbiAgXCJVcHBlclJpZ2h0QXJyb3dcIjpcIlxcdTIxOTdcIixcbiAgXCJVcHNpXCI6XCJcXHUwM0QyXCIsXG4gIFwidXBzaVwiOlwiXFx1MDNDNVwiLFxuICBcInVwc2loXCI6XCJcXHUwM0QyXCIsXG4gIFwiVXBzaWxvblwiOlwiXFx1MDNBNVwiLFxuICBcInVwc2lsb25cIjpcIlxcdTAzQzVcIixcbiAgXCJVcFRlZVwiOlwiXFx1MjJBNVwiLFxuICBcIlVwVGVlQXJyb3dcIjpcIlxcdTIxQTVcIixcbiAgXCJ1cHVwYXJyb3dzXCI6XCJcXHUyMUM4XCIsXG4gIFwidXJjb3JuXCI6XCJcXHUyMzFEXCIsXG4gIFwidXJjb3JuZXJcIjpcIlxcdTIzMURcIixcbiAgXCJ1cmNyb3BcIjpcIlxcdTIzMEVcIixcbiAgXCJVcmluZ1wiOlwiXFx1MDE2RVwiLFxuICBcInVyaW5nXCI6XCJcXHUwMTZGXCIsXG4gIFwidXJ0cmlcIjpcIlxcdTI1RjlcIixcbiAgXCJVc2NyXCI6XCJcXHVEODM1XFx1RENCMFwiLFxuICBcInVzY3JcIjpcIlxcdUQ4MzVcXHVEQ0NBXCIsXG4gIFwidXRkb3RcIjpcIlxcdTIyRjBcIixcbiAgXCJVdGlsZGVcIjpcIlxcdTAxNjhcIixcbiAgXCJ1dGlsZGVcIjpcIlxcdTAxNjlcIixcbiAgXCJ1dHJpXCI6XCJcXHUyNUI1XCIsXG4gIFwidXRyaWZcIjpcIlxcdTI1QjRcIixcbiAgXCJ1dWFyclwiOlwiXFx1MjFDOFwiLFxuICBcIlV1bWxcIjpcIlxcdTAwRENcIixcbiAgXCJ1dW1sXCI6XCJcXHUwMEZDXCIsXG4gIFwidXdhbmdsZVwiOlwiXFx1MjlBN1wiLFxuICBcInZhbmdydFwiOlwiXFx1Mjk5Q1wiLFxuICBcInZhcmVwc2lsb25cIjpcIlxcdTAzRjVcIixcbiAgXCJ2YXJrYXBwYVwiOlwiXFx1MDNGMFwiLFxuICBcInZhcm5vdGhpbmdcIjpcIlxcdTIyMDVcIixcbiAgXCJ2YXJwaGlcIjpcIlxcdTAzRDVcIixcbiAgXCJ2YXJwaVwiOlwiXFx1MDNENlwiLFxuICBcInZhcnByb3B0b1wiOlwiXFx1MjIxRFwiLFxuICBcInZBcnJcIjpcIlxcdTIxRDVcIixcbiAgXCJ2YXJyXCI6XCJcXHUyMTk1XCIsXG4gIFwidmFycmhvXCI6XCJcXHUwM0YxXCIsXG4gIFwidmFyc2lnbWFcIjpcIlxcdTAzQzJcIixcbiAgXCJ2YXJzdWJzZXRuZXFcIjpcIlxcdTIyOEFcXHVGRTAwXCIsXG4gIFwidmFyc3Vic2V0bmVxcVwiOlwiXFx1MkFDQlxcdUZFMDBcIixcbiAgXCJ2YXJzdXBzZXRuZXFcIjpcIlxcdTIyOEJcXHVGRTAwXCIsXG4gIFwidmFyc3Vwc2V0bmVxcVwiOlwiXFx1MkFDQ1xcdUZFMDBcIixcbiAgXCJ2YXJ0aGV0YVwiOlwiXFx1MDNEMVwiLFxuICBcInZhcnRyaWFuZ2xlbGVmdFwiOlwiXFx1MjJCMlwiLFxuICBcInZhcnRyaWFuZ2xlcmlnaHRcIjpcIlxcdTIyQjNcIixcbiAgXCJWYmFyXCI6XCJcXHUyQUVCXCIsXG4gIFwidkJhclwiOlwiXFx1MkFFOFwiLFxuICBcInZCYXJ2XCI6XCJcXHUyQUU5XCIsXG4gIFwiVmN5XCI6XCJcXHUwNDEyXCIsXG4gIFwidmN5XCI6XCJcXHUwNDMyXCIsXG4gIFwiVkRhc2hcIjpcIlxcdTIyQUJcIixcbiAgXCJWZGFzaFwiOlwiXFx1MjJBOVwiLFxuICBcInZEYXNoXCI6XCJcXHUyMkE4XCIsXG4gIFwidmRhc2hcIjpcIlxcdTIyQTJcIixcbiAgXCJWZGFzaGxcIjpcIlxcdTJBRTZcIixcbiAgXCJWZWVcIjpcIlxcdTIyQzFcIixcbiAgXCJ2ZWVcIjpcIlxcdTIyMjhcIixcbiAgXCJ2ZWViYXJcIjpcIlxcdTIyQkJcIixcbiAgXCJ2ZWVlcVwiOlwiXFx1MjI1QVwiLFxuICBcInZlbGxpcFwiOlwiXFx1MjJFRVwiLFxuICBcIlZlcmJhclwiOlwiXFx1MjAxNlwiLFxuICBcInZlcmJhclwiOlwiXFx1MDA3Q1wiLFxuICBcIlZlcnRcIjpcIlxcdTIwMTZcIixcbiAgXCJ2ZXJ0XCI6XCJcXHUwMDdDXCIsXG4gIFwiVmVydGljYWxCYXJcIjpcIlxcdTIyMjNcIixcbiAgXCJWZXJ0aWNhbExpbmVcIjpcIlxcdTAwN0NcIixcbiAgXCJWZXJ0aWNhbFNlcGFyYXRvclwiOlwiXFx1Mjc1OFwiLFxuICBcIlZlcnRpY2FsVGlsZGVcIjpcIlxcdTIyNDBcIixcbiAgXCJWZXJ5VGhpblNwYWNlXCI6XCJcXHUyMDBBXCIsXG4gIFwiVmZyXCI6XCJcXHVEODM1XFx1REQxOVwiLFxuICBcInZmclwiOlwiXFx1RDgzNVxcdUREMzNcIixcbiAgXCJ2bHRyaVwiOlwiXFx1MjJCMlwiLFxuICBcInZuc3ViXCI6XCJcXHUyMjgyXFx1MjBEMlwiLFxuICBcInZuc3VwXCI6XCJcXHUyMjgzXFx1MjBEMlwiLFxuICBcIlZvcGZcIjpcIlxcdUQ4MzVcXHVERDREXCIsXG4gIFwidm9wZlwiOlwiXFx1RDgzNVxcdURENjdcIixcbiAgXCJ2cHJvcFwiOlwiXFx1MjIxRFwiLFxuICBcInZydHJpXCI6XCJcXHUyMkIzXCIsXG4gIFwiVnNjclwiOlwiXFx1RDgzNVxcdURDQjFcIixcbiAgXCJ2c2NyXCI6XCJcXHVEODM1XFx1RENDQlwiLFxuICBcInZzdWJuRVwiOlwiXFx1MkFDQlxcdUZFMDBcIixcbiAgXCJ2c3VibmVcIjpcIlxcdTIyOEFcXHVGRTAwXCIsXG4gIFwidnN1cG5FXCI6XCJcXHUyQUNDXFx1RkUwMFwiLFxuICBcInZzdXBuZVwiOlwiXFx1MjI4QlxcdUZFMDBcIixcbiAgXCJWdmRhc2hcIjpcIlxcdTIyQUFcIixcbiAgXCJ2emlnemFnXCI6XCJcXHUyOTlBXCIsXG4gIFwiV2NpcmNcIjpcIlxcdTAxNzRcIixcbiAgXCJ3Y2lyY1wiOlwiXFx1MDE3NVwiLFxuICBcIndlZGJhclwiOlwiXFx1MkE1RlwiLFxuICBcIldlZGdlXCI6XCJcXHUyMkMwXCIsXG4gIFwid2VkZ2VcIjpcIlxcdTIyMjdcIixcbiAgXCJ3ZWRnZXFcIjpcIlxcdTIyNTlcIixcbiAgXCJ3ZWllcnBcIjpcIlxcdTIxMThcIixcbiAgXCJXZnJcIjpcIlxcdUQ4MzVcXHVERDFBXCIsXG4gIFwid2ZyXCI6XCJcXHVEODM1XFx1REQzNFwiLFxuICBcIldvcGZcIjpcIlxcdUQ4MzVcXHVERDRFXCIsXG4gIFwid29wZlwiOlwiXFx1RDgzNVxcdURENjhcIixcbiAgXCJ3cFwiOlwiXFx1MjExOFwiLFxuICBcIndyXCI6XCJcXHUyMjQwXCIsXG4gIFwid3JlYXRoXCI6XCJcXHUyMjQwXCIsXG4gIFwiV3NjclwiOlwiXFx1RDgzNVxcdURDQjJcIixcbiAgXCJ3c2NyXCI6XCJcXHVEODM1XFx1RENDQ1wiLFxuICBcInhjYXBcIjpcIlxcdTIyQzJcIixcbiAgXCJ4Y2lyY1wiOlwiXFx1MjVFRlwiLFxuICBcInhjdXBcIjpcIlxcdTIyQzNcIixcbiAgXCJ4ZHRyaVwiOlwiXFx1MjVCRFwiLFxuICBcIlhmclwiOlwiXFx1RDgzNVxcdUREMUJcIixcbiAgXCJ4ZnJcIjpcIlxcdUQ4MzVcXHVERDM1XCIsXG4gIFwieGhBcnJcIjpcIlxcdTI3RkFcIixcbiAgXCJ4aGFyclwiOlwiXFx1MjdGN1wiLFxuICBcIlhpXCI6XCJcXHUwMzlFXCIsXG4gIFwieGlcIjpcIlxcdTAzQkVcIixcbiAgXCJ4bEFyclwiOlwiXFx1MjdGOFwiLFxuICBcInhsYXJyXCI6XCJcXHUyN0Y1XCIsXG4gIFwieG1hcFwiOlwiXFx1MjdGQ1wiLFxuICBcInhuaXNcIjpcIlxcdTIyRkJcIixcbiAgXCJ4b2RvdFwiOlwiXFx1MkEwMFwiLFxuICBcIlhvcGZcIjpcIlxcdUQ4MzVcXHVERDRGXCIsXG4gIFwieG9wZlwiOlwiXFx1RDgzNVxcdURENjlcIixcbiAgXCJ4b3BsdXNcIjpcIlxcdTJBMDFcIixcbiAgXCJ4b3RpbWVcIjpcIlxcdTJBMDJcIixcbiAgXCJ4ckFyclwiOlwiXFx1MjdGOVwiLFxuICBcInhyYXJyXCI6XCJcXHUyN0Y2XCIsXG4gIFwiWHNjclwiOlwiXFx1RDgzNVxcdURDQjNcIixcbiAgXCJ4c2NyXCI6XCJcXHVEODM1XFx1RENDRFwiLFxuICBcInhzcWN1cFwiOlwiXFx1MkEwNlwiLFxuICBcInh1cGx1c1wiOlwiXFx1MkEwNFwiLFxuICBcInh1dHJpXCI6XCJcXHUyNUIzXCIsXG4gIFwieHZlZVwiOlwiXFx1MjJDMVwiLFxuICBcInh3ZWRnZVwiOlwiXFx1MjJDMFwiLFxuICBcIllhY3V0ZVwiOlwiXFx1MDBERFwiLFxuICBcInlhY3V0ZVwiOlwiXFx1MDBGRFwiLFxuICBcIllBY3lcIjpcIlxcdTA0MkZcIixcbiAgXCJ5YWN5XCI6XCJcXHUwNDRGXCIsXG4gIFwiWWNpcmNcIjpcIlxcdTAxNzZcIixcbiAgXCJ5Y2lyY1wiOlwiXFx1MDE3N1wiLFxuICBcIlljeVwiOlwiXFx1MDQyQlwiLFxuICBcInljeVwiOlwiXFx1MDQ0QlwiLFxuICBcInllblwiOlwiXFx1MDBBNVwiLFxuICBcIllmclwiOlwiXFx1RDgzNVxcdUREMUNcIixcbiAgXCJ5ZnJcIjpcIlxcdUQ4MzVcXHVERDM2XCIsXG4gIFwiWUljeVwiOlwiXFx1MDQwN1wiLFxuICBcInlpY3lcIjpcIlxcdTA0NTdcIixcbiAgXCJZb3BmXCI6XCJcXHVEODM1XFx1REQ1MFwiLFxuICBcInlvcGZcIjpcIlxcdUQ4MzVcXHVERDZBXCIsXG4gIFwiWXNjclwiOlwiXFx1RDgzNVxcdURDQjRcIixcbiAgXCJ5c2NyXCI6XCJcXHVEODM1XFx1RENDRVwiLFxuICBcIllVY3lcIjpcIlxcdTA0MkVcIixcbiAgXCJ5dWN5XCI6XCJcXHUwNDRFXCIsXG4gIFwiWXVtbFwiOlwiXFx1MDE3OFwiLFxuICBcInl1bWxcIjpcIlxcdTAwRkZcIixcbiAgXCJaYWN1dGVcIjpcIlxcdTAxNzlcIixcbiAgXCJ6YWN1dGVcIjpcIlxcdTAxN0FcIixcbiAgXCJaY2Fyb25cIjpcIlxcdTAxN0RcIixcbiAgXCJ6Y2Fyb25cIjpcIlxcdTAxN0VcIixcbiAgXCJaY3lcIjpcIlxcdTA0MTdcIixcbiAgXCJ6Y3lcIjpcIlxcdTA0MzdcIixcbiAgXCJaZG90XCI6XCJcXHUwMTdCXCIsXG4gIFwiemRvdFwiOlwiXFx1MDE3Q1wiLFxuICBcInplZXRyZlwiOlwiXFx1MjEyOFwiLFxuICBcIlplcm9XaWR0aFNwYWNlXCI6XCJcXHUyMDBCXCIsXG4gIFwiWmV0YVwiOlwiXFx1MDM5NlwiLFxuICBcInpldGFcIjpcIlxcdTAzQjZcIixcbiAgXCJaZnJcIjpcIlxcdTIxMjhcIixcbiAgXCJ6ZnJcIjpcIlxcdUQ4MzVcXHVERDM3XCIsXG4gIFwiWkhjeVwiOlwiXFx1MDQxNlwiLFxuICBcInpoY3lcIjpcIlxcdTA0MzZcIixcbiAgXCJ6aWdyYXJyXCI6XCJcXHUyMUREXCIsXG4gIFwiWm9wZlwiOlwiXFx1MjEyNFwiLFxuICBcInpvcGZcIjpcIlxcdUQ4MzVcXHVERDZCXCIsXG4gIFwiWnNjclwiOlwiXFx1RDgzNVxcdURDQjVcIixcbiAgXCJ6c2NyXCI6XCJcXHVEODM1XFx1RENDRlwiLFxuICBcInp3alwiOlwiXFx1MjAwRFwiLFxuICBcInp3bmpcIjpcIlxcdTIwMENcIlxufTtcbiIsIi8vIExpc3Qgb2YgdmFsaWQgaHRtbCBibG9ja3MgbmFtZXMsIGFjY29ydGluZyB0byBjb21tb25tYXJrIHNwZWNcbi8vIGh0dHA6Ly9qZ20uZ2l0aHViLmlvL0NvbW1vbk1hcmsvc3BlYy5odG1sI2h0bWwtYmxvY2tzXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGh0bWxfYmxvY2tzID0ge307XG5cbltcbiAgJ2FydGljbGUnLFxuICAnYXNpZGUnLFxuICAnYnV0dG9uJyxcbiAgJ2Jsb2NrcXVvdGUnLFxuICAnYm9keScsXG4gICdjYW52YXMnLFxuICAnY2FwdGlvbicsXG4gICdjb2wnLFxuICAnY29sZ3JvdXAnLFxuICAnZGQnLFxuICAnZGl2JyxcbiAgJ2RsJyxcbiAgJ2R0JyxcbiAgJ2VtYmVkJyxcbiAgJ2ZpZWxkc2V0JyxcbiAgJ2ZpZ2NhcHRpb24nLFxuICAnZmlndXJlJyxcbiAgJ2Zvb3RlcicsXG4gICdmb3JtJyxcbiAgJ2gxJyxcbiAgJ2gyJyxcbiAgJ2gzJyxcbiAgJ2g0JyxcbiAgJ2g1JyxcbiAgJ2g2JyxcbiAgJ2hlYWRlcicsXG4gICdoZ3JvdXAnLFxuICAnaHInLFxuICAnaWZyYW1lJyxcbiAgJ2xpJyxcbiAgJ21hcCcsXG4gICdvYmplY3QnLFxuICAnb2wnLFxuICAnb3V0cHV0JyxcbiAgJ3AnLFxuICAncHJlJyxcbiAgJ3Byb2dyZXNzJyxcbiAgJ3NjcmlwdCcsXG4gICdzZWN0aW9uJyxcbiAgJ3N0eWxlJyxcbiAgJ3RhYmxlJyxcbiAgJ3Rib2R5JyxcbiAgJ3RkJyxcbiAgJ3RleHRhcmVhJyxcbiAgJ3Rmb290JyxcbiAgJ3RoJyxcbiAgJ3RyJyxcbiAgJ3RoZWFkJyxcbiAgJ3VsJyxcbiAgJ3ZpZGVvJ1xuXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7IGh0bWxfYmxvY2tzW25hbWVdID0gdHJ1ZTsgfSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBodG1sX2Jsb2NrcztcbiIsIi8vIFJlZ2V4cHMgdG8gbWF0Y2ggaHRtbCBlbGVtZW50c1xuXG4ndXNlIHN0cmljdCc7XG5cblxuZnVuY3Rpb24gcmVwbGFjZShyZWdleCwgb3B0aW9ucykge1xuICByZWdleCA9IHJlZ2V4LnNvdXJjZTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgJyc7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHNlbGYobmFtZSwgdmFsKSB7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHZhbCA9IHZhbC5zb3VyY2UgfHwgdmFsO1xuICAgIHJlZ2V4ID0gcmVnZXgucmVwbGFjZShuYW1lLCB2YWwpO1xuICAgIHJldHVybiBzZWxmO1xuICB9O1xufVxuXG5cbnZhciBhdHRyX25hbWUgICAgID0gL1thLXpBLVpfOl1bYS16QS1aMC05Oi5fLV0qLztcblxudmFyIHVucXVvdGVkICAgICAgPSAvW15cIic9PD5gXFx4MDAtXFx4MjBdKy87XG52YXIgc2luZ2xlX3F1b3RlZCA9IC8nW14nXSonLztcbnZhciBkb3VibGVfcXVvdGVkID0gL1wiW15cIl0qXCIvO1xuXG4vKmVzbGludCBuby1zcGFjZWQtZnVuYzowKi9cbnZhciBhdHRyX3ZhbHVlICA9IHJlcGxhY2UoLyg/OnVucXVvdGVkfHNpbmdsZV9xdW90ZWR8ZG91YmxlX3F1b3RlZCkvKVxuICAgICAgICAgICAgICAgICAgICAoJ3VucXVvdGVkJywgdW5xdW90ZWQpXG4gICAgICAgICAgICAgICAgICAgICgnc2luZ2xlX3F1b3RlZCcsIHNpbmdsZV9xdW90ZWQpXG4gICAgICAgICAgICAgICAgICAgICgnZG91YmxlX3F1b3RlZCcsIGRvdWJsZV9xdW90ZWQpXG4gICAgICAgICAgICAgICAgICAgICgpO1xuXG52YXIgYXR0cmlidXRlICAgPSByZXBsYWNlKC8oPzpcXHMrYXR0cl9uYW1lKD86XFxzKj1cXHMqYXR0cl92YWx1ZSk/KS8pXG4gICAgICAgICAgICAgICAgICAgICgnYXR0cl9uYW1lJywgYXR0cl9uYW1lKVxuICAgICAgICAgICAgICAgICAgICAoJ2F0dHJfdmFsdWUnLCBhdHRyX3ZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAoKTtcblxudmFyIG9wZW5fdGFnICAgID0gcmVwbGFjZSgvPFtBLVphLXpdW0EtWmEtejAtOV0qYXR0cmlidXRlKlxccypcXC8/Pi8pXG4gICAgICAgICAgICAgICAgICAgICgnYXR0cmlidXRlJywgYXR0cmlidXRlKVxuICAgICAgICAgICAgICAgICAgICAoKTtcblxudmFyIGNsb3NlX3RhZyAgID0gLzxcXC9bQS1aYS16XVtBLVphLXowLTldKlxccyo+LztcbnZhciBjb21tZW50ICAgICA9IC88IS0tKFteLV0rfFstXVteLV0rKSotLT4vO1xudmFyIHByb2Nlc3NpbmcgID0gLzxbP10uKj9bP10+LztcbnZhciBkZWNsYXJhdGlvbiA9IC88IVtBLVpdK1xccytbXj5dKj4vO1xudmFyIGNkYXRhICAgICAgID0gLzwhXFxbQ0RBVEFcXFsoW15cXF1dK3xcXF1bXlxcXV18XFxdXFxdW14+XSkqXFxdXFxdPi87XG5cbnZhciBIVE1MX1RBR19SRSA9IHJlcGxhY2UoL14oPzpvcGVuX3RhZ3xjbG9zZV90YWd8Y29tbWVudHxwcm9jZXNzaW5nfGRlY2xhcmF0aW9ufGNkYXRhKS8pXG4gICgnb3Blbl90YWcnLCBvcGVuX3RhZylcbiAgKCdjbG9zZV90YWcnLCBjbG9zZV90YWcpXG4gICgnY29tbWVudCcsIGNvbW1lbnQpXG4gICgncHJvY2Vzc2luZycsIHByb2Nlc3NpbmcpXG4gICgnZGVjbGFyYXRpb24nLCBkZWNsYXJhdGlvbilcbiAgKCdjZGF0YScsIGNkYXRhKVxuICAoKTtcblxuXG5tb2R1bGUuZXhwb3J0cy5IVE1MX1RBR19SRSA9IEhUTUxfVEFHX1JFO1xuIiwiLy8gTGlzdCBvZiB2YWxpZCB1cmwgc2NoZW1hcywgYWNjb3J0aW5nIHRvIGNvbW1vbm1hcmsgc3BlY1xuLy8gaHR0cDovL2pnbS5naXRodWIuaW8vQ29tbW9uTWFyay9zcGVjLmh0bWwjYXV0b2xpbmtzXG5cbid1c2Ugc3RyaWN0JztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvYXAnLFxuICAnZG9pJyxcbiAgJ2phdmFzY3JpcHQnLFxuICAnYWFhJyxcbiAgJ2FhYXMnLFxuICAnYWJvdXQnLFxuICAnYWNhcCcsXG4gICdjYXAnLFxuICAnY2lkJyxcbiAgJ2NyaWQnLFxuICAnZGF0YScsXG4gICdkYXYnLFxuICAnZGljdCcsXG4gICdkbnMnLFxuICAnZmlsZScsXG4gICdmdHAnLFxuICAnZ2VvJyxcbiAgJ2dvJyxcbiAgJ2dvcGhlcicsXG4gICdoMzIzJyxcbiAgJ2h0dHAnLFxuICAnaHR0cHMnLFxuICAnaWF4JyxcbiAgJ2ljYXAnLFxuICAnaW0nLFxuICAnaW1hcCcsXG4gICdpbmZvJyxcbiAgJ2lwcCcsXG4gICdpcmlzJyxcbiAgJ2lyaXMuYmVlcCcsXG4gICdpcmlzLnhwYycsXG4gICdpcmlzLnhwY3MnLFxuICAnaXJpcy5sd3onLFxuICAnbGRhcCcsXG4gICdtYWlsdG8nLFxuICAnbWlkJyxcbiAgJ21zcnAnLFxuICAnbXNycHMnLFxuICAnbXRxcCcsXG4gICdtdXBkYXRlJyxcbiAgJ25ld3MnLFxuICAnbmZzJyxcbiAgJ25pJyxcbiAgJ25paCcsXG4gICdubnRwJyxcbiAgJ29wYXF1ZWxvY2t0b2tlbicsXG4gICdwb3AnLFxuICAncHJlcycsXG4gICdydHNwJyxcbiAgJ3NlcnZpY2UnLFxuICAnc2Vzc2lvbicsXG4gICdzaHR0cCcsXG4gICdzaWV2ZScsXG4gICdzaXAnLFxuICAnc2lwcycsXG4gICdzbXMnLFxuICAnc25tcCcsXG4gICdzb2FwLmJlZXAnLFxuICAnc29hcC5iZWVwcycsXG4gICd0YWcnLFxuICAndGVsJyxcbiAgJ3RlbG5ldCcsXG4gICd0ZnRwJyxcbiAgJ3RoaXNtZXNzYWdlJyxcbiAgJ3RuMzI3MCcsXG4gICd0aXAnLFxuICAndHYnLFxuICAndXJuJyxcbiAgJ3ZlbW1pJyxcbiAgJ3dzJyxcbiAgJ3dzcycsXG4gICd4Y29uJyxcbiAgJ3hjb24tdXNlcmlkJyxcbiAgJ3htbHJwYy5iZWVwJyxcbiAgJ3htbHJwYy5iZWVwcycsXG4gICd4bXBwJyxcbiAgJ3ozOS41MHInLFxuICAnejM5LjUwcycsXG4gICdhZGl1bXh0cmEnLFxuICAnYWZwJyxcbiAgJ2FmcycsXG4gICdhaW0nLFxuICAnYXB0JyxcbiAgJ2F0dGFjaG1lbnQnLFxuICAnYXcnLFxuICAnYmVzaGFyZScsXG4gICdiaXRjb2luJyxcbiAgJ2JvbG8nLFxuICAnY2FsbHRvJyxcbiAgJ2Nocm9tZScsXG4gICdjaHJvbWUtZXh0ZW5zaW9uJyxcbiAgJ2NvbS1ldmVudGJyaXRlLWF0dGVuZGVlJyxcbiAgJ2NvbnRlbnQnLFxuICAnY3ZzJyxcbiAgJ2RsbmEtcGxheXNpbmdsZScsXG4gICdkbG5hLXBsYXljb250YWluZXInLFxuICAnZHRuJyxcbiAgJ2R2YicsXG4gICdlZDJrJyxcbiAgJ2ZhY2V0aW1lJyxcbiAgJ2ZlZWQnLFxuICAnZmluZ2VyJyxcbiAgJ2Zpc2gnLFxuICAnZ2cnLFxuICAnZ2l0JyxcbiAgJ2dpem1vcHJvamVjdCcsXG4gICdndGFsaycsXG4gICdoY3AnLFxuICAnaWNvbicsXG4gICdpcG4nLFxuICAnaXJjJyxcbiAgJ2lyYzYnLFxuICAnaXJjcycsXG4gICdpdG1zJyxcbiAgJ2phcicsXG4gICdqbXMnLFxuICAna2V5cGFyYycsXG4gICdsYXN0Zm0nLFxuICAnbGRhcHMnLFxuICAnbWFnbmV0JyxcbiAgJ21hcHMnLFxuICAnbWFya2V0JyxcbiAgJ21lc3NhZ2UnLFxuICAnbW1zJyxcbiAgJ21zLWhlbHAnLFxuICAnbXNuaW0nLFxuICAnbXVtYmxlJyxcbiAgJ212bicsXG4gICdub3RlcycsXG4gICdvaWQnLFxuICAncGFsbScsXG4gICdwYXBhcmF6emknLFxuICAncGxhdGZvcm0nLFxuICAncHJveHknLFxuICAncHN5YycsXG4gICdxdWVyeScsXG4gICdyZXMnLFxuICAncmVzb3VyY2UnLFxuICAncm1pJyxcbiAgJ3JzeW5jJyxcbiAgJ3J0bXAnLFxuICAnc2Vjb25kbGlmZScsXG4gICdzZnRwJyxcbiAgJ3NnbicsXG4gICdza3lwZScsXG4gICdzbWInLFxuICAnc29sZGF0JyxcbiAgJ3Nwb3RpZnknLFxuICAnc3NoJyxcbiAgJ3N0ZWFtJyxcbiAgJ3N2bicsXG4gICd0ZWFtc3BlYWsnLFxuICAndGhpbmdzJyxcbiAgJ3VkcCcsXG4gICd1bnJlYWwnLFxuICAndXQyMDA0JyxcbiAgJ3ZlbnRyaWxvJyxcbiAgJ3ZpZXctc291cmNlJyxcbiAgJ3dlYmNhbCcsXG4gICd3dGFpJyxcbiAgJ3d5Y2l3eWcnLFxuICAneGZpcmUnLFxuICAneHJpJyxcbiAgJ3ltc2dyJ1xuXTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uc1xuICovXG5cbmZ1bmN0aW9uIHR5cGVPZihvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xufVxuXG5mdW5jdGlvbiBpc1N0cmluZyhvYmopIHtcbiAgcmV0dXJuIHR5cGVPZihvYmopID09PSAnW29iamVjdCBTdHJpbmddJztcbn1cblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGhhcyhvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0XG4gICAgPyBoYXNPd24uY2FsbChvYmplY3QsIGtleSlcbiAgICA6IGZhbHNlO1xufVxuXG4vLyBFeHRlbmQgb2JqZWN0c1xuLy9cbmZ1bmN0aW9uIGFzc2lnbihvYmogLypmcm9tMSwgZnJvbTIsIGZyb20zLCAuLi4qLykge1xuICB2YXIgc291cmNlcyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblxuICBzb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgIGlmICghc291cmNlKSB7IHJldHVybjsgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICdtdXN0IGJlIG9iamVjdCcpO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKHNvdXJjZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBvYmpba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gb2JqO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG52YXIgVU5FU0NBUEVfTURfUkUgPSAvXFxcXChbXFxcXCFcIiMkJSYnKCkqKywuXFwvOjs8PT4/QFtcXF1eX2B7fH1+LV0pL2c7XG5cbmZ1bmN0aW9uIHVuZXNjYXBlTWQoc3RyKSB7XG4gIGlmIChzdHIuaW5kZXhPZignXFxcXCcpIDwgMCkgeyByZXR1cm4gc3RyOyB9XG4gIHJldHVybiBzdHIucmVwbGFjZShVTkVTQ0FQRV9NRF9SRSwgJyQxJyk7XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbnRpdHlDb2RlKGMpIHtcbiAgLyplc2xpbnQgbm8tYml0d2lzZTowKi9cbiAgLy8gYnJva2VuIHNlcXVlbmNlXG4gIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRikgeyByZXR1cm4gZmFsc2U7IH1cbiAgLy8gbmV2ZXIgdXNlZFxuICBpZiAoYyA+PSAweEZERDAgJiYgYyA8PSAweEZERUYpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmICgoYyAmIDB4RkZGRikgPT09IDB4RkZGRiB8fCAoYyAmIDB4RkZGRikgPT09IDB4RkZGRSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgLy8gY29udHJvbCBjb2Rlc1xuICBpZiAoYyA+PSAweDAwICYmIGMgPD0gMHgwOCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKGMgPT09IDB4MEIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChjID49IDB4MEUgJiYgYyA8PSAweDFGKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoYyA+PSAweDdGICYmIGMgPD0gMHg5RikgeyByZXR1cm4gZmFsc2U7IH1cbiAgLy8gb3V0IG9mIHJhbmdlXG4gIGlmIChjID4gMHgxMEZGRkYpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBmcm9tQ29kZVBvaW50KGMpIHtcbiAgLyplc2xpbnQgbm8tYml0d2lzZTowKi9cbiAgaWYgKGMgPiAweGZmZmYpIHtcbiAgICBjIC09IDB4MTAwMDA7XG4gICAgdmFyIHN1cnJvZ2F0ZTEgPSAweGQ4MDAgKyAoYyA+PiAxMCksXG4gICAgICAgIHN1cnJvZ2F0ZTIgPSAweGRjMDAgKyAoYyAmIDB4M2ZmKTtcblxuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHN1cnJvZ2F0ZTEsIHN1cnJvZ2F0ZTIpO1xuICB9XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xufVxuXG52YXIgTkFNRURfRU5USVRZX1JFICAgPSAvJihbYS16I11bYS16MC05XXsxLDMxfSk7L2dpO1xudmFyIERJR0lUQUxfRU5USVRZX1RFU1RfUkUgPSAvXiMoKD86eFthLWYwLTldezEsOH18WzAtOV17MSw4fSkpL2k7XG52YXIgZW50aXRpZXMgPSByZXF1aXJlKCcuL2VudGl0aWVzJyk7XG5cbmZ1bmN0aW9uIHJlcGxhY2VFbnRpdHlQYXR0ZXJuKG1hdGNoLCBuYW1lKSB7XG4gIHZhciBjb2RlID0gMDtcblxuICBpZiAoaGFzKGVudGl0aWVzLCBuYW1lKSkge1xuICAgIHJldHVybiBlbnRpdGllc1tuYW1lXTtcbiAgfSBlbHNlIGlmIChuYW1lLmNoYXJDb2RlQXQoMCkgPT09IDB4MjMvKiAjICovICYmIERJR0lUQUxfRU5USVRZX1RFU1RfUkUudGVzdChuYW1lKSkge1xuICAgIGNvZGUgPSBuYW1lWzFdLnRvTG93ZXJDYXNlKCkgPT09ICd4JyA/XG4gICAgICBwYXJzZUludChuYW1lLnNsaWNlKDIpLCAxNilcbiAgICA6XG4gICAgICBwYXJzZUludChuYW1lLnNsaWNlKDEpLCAxMCk7XG4gICAgaWYgKGlzVmFsaWRFbnRpdHlDb2RlKGNvZGUpKSB7XG4gICAgICByZXR1cm4gZnJvbUNvZGVQb2ludChjb2RlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hdGNoO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlRW50aXRpZXMoc3RyKSB7XG4gIGlmIChzdHIuaW5kZXhPZignJicpIDwgMCkgeyByZXR1cm4gc3RyOyB9XG5cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKE5BTUVEX0VOVElUWV9SRSwgcmVwbGFjZUVudGl0eVBhdHRlcm4pO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG52YXIgSFRNTF9FU0NBUEVfVEVTVF9SRSA9IC9bJjw+XCJdLztcbnZhciBIVE1MX0VTQ0FQRV9SRVBMQUNFX1JFID0gL1smPD5cIl0vZztcbnZhciBIVE1MX1JFUExBQ0VNRU5UUyA9IHtcbiAgJyYnOiAnJmFtcDsnLFxuICAnPCc6ICcmbHQ7JyxcbiAgJz4nOiAnJmd0OycsXG4gICdcIic6ICcmcXVvdDsnXG59O1xuXG5mdW5jdGlvbiByZXBsYWNlVW5zYWZlQ2hhcihjaCkge1xuICByZXR1cm4gSFRNTF9SRVBMQUNFTUVOVFNbY2hdO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHN0cikge1xuICBpZiAoSFRNTF9FU0NBUEVfVEVTVF9SRS50ZXN0KHN0cikpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoSFRNTF9FU0NBUEVfUkVQTEFDRV9SRSwgcmVwbGFjZVVuc2FmZUNoYXIpO1xuICB9XG4gIHJldHVybiBzdHI7XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4cG9ydHMuYXNzaWduICAgICAgICAgICAgPSBhc3NpZ247XG5leHBvcnRzLmlzU3RyaW5nICAgICAgICAgID0gaXNTdHJpbmc7XG5leHBvcnRzLmhhcyAgICAgICAgICAgICAgID0gaGFzO1xuZXhwb3J0cy51bmVzY2FwZU1kICAgICAgICA9IHVuZXNjYXBlTWQ7XG5leHBvcnRzLmlzVmFsaWRFbnRpdHlDb2RlID0gaXNWYWxpZEVudGl0eUNvZGU7XG5leHBvcnRzLmZyb21Db2RlUG9pbnQgICAgID0gZnJvbUNvZGVQb2ludDtcbmV4cG9ydHMucmVwbGFjZUVudGl0aWVzICAgPSByZXBsYWNlRW50aXRpZXM7XG5leHBvcnRzLmVzY2FwZUh0bWwgICAgICAgID0gZXNjYXBlSHRtbDtcbiIsIi8vIENvbW1vbm1hcmsgZGVmYXVsdCBvcHRpb25zXG5cbid1c2Ugc3RyaWN0JztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgb3B0aW9uczoge1xuICAgIGh0bWw6ICAgICAgICAgdHJ1ZSwgICAgICAgICAvLyBFbmFibGUgSFRNTCB0YWdzIGluIHNvdXJjZVxuICAgIHhodG1sT3V0OiAgICAgdHJ1ZSwgICAgICAgICAvLyBVc2UgJy8nIHRvIGNsb3NlIHNpbmdsZSB0YWdzICg8YnIgLz4pXG4gICAgYnJlYWtzOiAgICAgICBmYWxzZSwgICAgICAgIC8vIENvbnZlcnQgJ1xcbicgaW4gcGFyYWdyYXBocyBpbnRvIDxicj5cbiAgICBsYW5nUHJlZml4OiAgICdsYW5ndWFnZS0nLCAgLy8gQ1NTIGxhbmd1YWdlIHByZWZpeCBmb3IgZmVuY2VkIGJsb2Nrc1xuICAgIGxpbmtpZnk6ICAgICAgZmFsc2UsICAgICAgICAvLyBhdXRvY29udmVydCBVUkwtbGlrZSB0ZXh0cyB0byBsaW5rc1xuICAgIGxpbmtUYXJnZXQ6ICAgJycsICAgICAgICAgICAvLyBzZXQgdGFyZ2V0IHRvIG9wZW4gbGluayBpblxuXG4gICAgLy8gRW5hYmxlIHNvbWUgbGFuZ3VhZ2UtbmV1dHJhbCByZXBsYWNlbWVudHMgKyBxdW90ZXMgYmVhdXRpZmljYXRpb25cbiAgICB0eXBvZ3JhcGhlcjogIGZhbHNlLFxuXG4gICAgLy8gRG91YmxlICsgc2luZ2xlIHF1b3RlcyByZXBsYWNlbWVudCBwYWlycywgd2hlbiB0eXBvZ3JhcGhlciBlbmFibGVkLFxuICAgIC8vIGFuZCBzbWFydHF1b3RlcyBvbi4gU2V0IGRvdWJsZXMgdG8gJ8KrwrsnIGZvciBSdXNzaWFuLCAn4oCe4oCcJyBmb3IgR2VybWFuLlxuICAgIHF1b3RlczogJ+KAnOKAneKAmOKAmScsXG5cbiAgICAvLyBIaWdobGlnaHRlciBmdW5jdGlvbi4gU2hvdWxkIHJldHVybiBlc2NhcGVkIEhUTUwsXG4gICAgLy8gb3IgJycgaWYgaW5wdXQgbm90IGNoYW5nZWRcbiAgICAvL1xuICAgIC8vIGZ1bmN0aW9uICgvKnN0ciwgbGFuZyovKSB7IHJldHVybiAnJzsgfVxuICAgIC8vXG4gICAgaGlnaGxpZ2h0OiBudWxsLFxuXG4gICAgbWF4TmVzdGluZzogICAyMCAgICAgICAgICAgIC8vIEludGVybmFsIHByb3RlY3Rpb24sIHJlY3Vyc2lvbiBsaW1pdFxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHtcblxuICAgIGNvcmU6IHtcbiAgICAgIHJ1bGVzOiBbXG4gICAgICAgICdibG9jaycsXG4gICAgICAgICdpbmxpbmUnLFxuICAgICAgICAncmVmZXJlbmNlcycsXG4gICAgICAgICdhYmJyMidcbiAgICAgIF1cbiAgICB9LFxuXG4gICAgYmxvY2s6IHtcbiAgICAgIHJ1bGVzOiBbXG4gICAgICAgICdibG9ja3F1b3RlJyxcbiAgICAgICAgJ2NvZGUnLFxuICAgICAgICAnZmVuY2VzJyxcbiAgICAgICAgJ2hlYWRpbmcnLFxuICAgICAgICAnaHInLFxuICAgICAgICAnaHRtbGJsb2NrJyxcbiAgICAgICAgJ2xoZWFkaW5nJyxcbiAgICAgICAgJ2xpc3QnLFxuICAgICAgICAncGFyYWdyYXBoJ1xuICAgICAgXVxuICAgIH0sXG5cbiAgICBpbmxpbmU6IHtcbiAgICAgIHJ1bGVzOiBbXG4gICAgICAgICdhdXRvbGluaycsXG4gICAgICAgICdiYWNrdGlja3MnLFxuICAgICAgICAnZW1waGFzaXMnLFxuICAgICAgICAnZW50aXR5JyxcbiAgICAgICAgJ2VzY2FwZScsXG4gICAgICAgICdodG1sdGFnJyxcbiAgICAgICAgJ2xpbmtzJyxcbiAgICAgICAgJ25ld2xpbmUnLFxuICAgICAgICAndGV4dCdcbiAgICAgIF1cbiAgICB9XG4gIH1cbn07XG4iLCIvLyBSZW1hcmthYmxlIGRlZmF1bHQgb3B0aW9uc1xuXG4ndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG9wdGlvbnM6IHtcbiAgICBodG1sOiAgICAgICAgIGZhbHNlLCAgICAgICAgLy8gRW5hYmxlIEhUTUwgdGFncyBpbiBzb3VyY2VcbiAgICB4aHRtbE91dDogICAgIGZhbHNlLCAgICAgICAgLy8gVXNlICcvJyB0byBjbG9zZSBzaW5nbGUgdGFncyAoPGJyIC8+KVxuICAgIGJyZWFrczogICAgICAgZmFsc2UsICAgICAgICAvLyBDb252ZXJ0ICdcXG4nIGluIHBhcmFncmFwaHMgaW50byA8YnI+XG4gICAgbGFuZ1ByZWZpeDogICAnbGFuZ3VhZ2UtJywgIC8vIENTUyBsYW5ndWFnZSBwcmVmaXggZm9yIGZlbmNlZCBibG9ja3NcbiAgICBsaW5raWZ5OiAgICAgIGZhbHNlLCAgICAgICAgLy8gYXV0b2NvbnZlcnQgVVJMLWxpa2UgdGV4dHMgdG8gbGlua3NcbiAgICBsaW5rVGFyZ2V0OiAgICcnLCAgICAgICAgICAgLy8gc2V0IHRhcmdldCB0byBvcGVuIGxpbmsgaW5cblxuICAgIC8vIEVuYWJsZSBzb21lIGxhbmd1YWdlLW5ldXRyYWwgcmVwbGFjZW1lbnRzICsgcXVvdGVzIGJlYXV0aWZpY2F0aW9uXG4gICAgdHlwb2dyYXBoZXI6ICBmYWxzZSxcblxuICAgIC8vIERvdWJsZSArIHNpbmdsZSBxdW90ZXMgcmVwbGFjZW1lbnQgcGFpcnMsIHdoZW4gdHlwb2dyYXBoZXIgZW5hYmxlZCxcbiAgICAvLyBhbmQgc21hcnRxdW90ZXMgb24uIFNldCBkb3VibGVzIHRvICfCq8K7JyBmb3IgUnVzc2lhbiwgJ+KAnuKAnCcgZm9yIEdlcm1hbi5cbiAgICBxdW90ZXM6ICfigJzigJ3igJjigJknLFxuXG4gICAgLy8gSGlnaGxpZ2h0ZXIgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gZXNjYXBlZCBIVE1MLFxuICAgIC8vIG9yICcnIGlmIGlucHV0IG5vdCBjaGFuZ2VkXG4gICAgLy9cbiAgICAvLyBmdW5jdGlvbiAoLypzdHIsIGxhbmcqLykgeyByZXR1cm4gJyc7IH1cbiAgICAvL1xuICAgIGhpZ2hsaWdodDogbnVsbCxcblxuICAgIG1heE5lc3Rpbmc6ICAgMjAgICAgICAgICAgICAvLyBJbnRlcm5hbCBwcm90ZWN0aW9uLCByZWN1cnNpb24gbGltaXRcbiAgfSxcblxuICBjb21wb25lbnRzOiB7XG5cbiAgICBjb3JlOiB7XG4gICAgICBydWxlczogW1xuICAgICAgICAnYmxvY2snLFxuICAgICAgICAnaW5saW5lJyxcbiAgICAgICAgJ3JlZmVyZW5jZXMnLFxuICAgICAgICAncmVwbGFjZW1lbnRzJyxcbiAgICAgICAgJ2xpbmtpZnknLFxuICAgICAgICAnc21hcnRxdW90ZXMnLFxuICAgICAgICAncmVmZXJlbmNlcycsXG4gICAgICAgICdhYmJyMicsXG4gICAgICAgICdmb290bm90ZV90YWlsJ1xuICAgICAgXVxuICAgIH0sXG5cbiAgICBibG9jazoge1xuICAgICAgcnVsZXM6IFtcbiAgICAgICAgJ2Jsb2NrcXVvdGUnLFxuICAgICAgICAnY29kZScsXG4gICAgICAgICdmZW5jZXMnLFxuICAgICAgICAnaGVhZGluZycsXG4gICAgICAgICdocicsXG4gICAgICAgICdodG1sYmxvY2snLFxuICAgICAgICAnbGhlYWRpbmcnLFxuICAgICAgICAnbGlzdCcsXG4gICAgICAgICdwYXJhZ3JhcGgnLFxuICAgICAgICAndGFibGUnXG4gICAgICBdXG4gICAgfSxcblxuICAgIGlubGluZToge1xuICAgICAgcnVsZXM6IFtcbiAgICAgICAgJ2F1dG9saW5rJyxcbiAgICAgICAgJ2JhY2t0aWNrcycsXG4gICAgICAgICdkZWwnLFxuICAgICAgICAnZW1waGFzaXMnLFxuICAgICAgICAnZW50aXR5JyxcbiAgICAgICAgJ2VzY2FwZScsXG4gICAgICAgICdmb290bm90ZV9yZWYnLFxuICAgICAgICAnaHRtbHRhZycsXG4gICAgICAgICdsaW5rcycsXG4gICAgICAgICduZXdsaW5lJyxcbiAgICAgICAgJ3RleHQnXG4gICAgICBdXG4gICAgfVxuICB9XG59O1xuIiwiLy8gUmVtYXJrYWJsZSBkZWZhdWx0IG9wdGlvbnNcblxuJ3VzZSBzdHJpY3QnO1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBvcHRpb25zOiB7XG4gICAgaHRtbDogICAgICAgICBmYWxzZSwgICAgICAgIC8vIEVuYWJsZSBIVE1MIHRhZ3MgaW4gc291cmNlXG4gICAgeGh0bWxPdXQ6ICAgICBmYWxzZSwgICAgICAgIC8vIFVzZSAnLycgdG8gY2xvc2Ugc2luZ2xlIHRhZ3MgKDxiciAvPilcbiAgICBicmVha3M6ICAgICAgIGZhbHNlLCAgICAgICAgLy8gQ29udmVydCAnXFxuJyBpbiBwYXJhZ3JhcGhzIGludG8gPGJyPlxuICAgIGxhbmdQcmVmaXg6ICAgJ2xhbmd1YWdlLScsICAvLyBDU1MgbGFuZ3VhZ2UgcHJlZml4IGZvciBmZW5jZWQgYmxvY2tzXG4gICAgbGlua2lmeTogICAgICBmYWxzZSwgICAgICAgIC8vIGF1dG9jb252ZXJ0IFVSTC1saWtlIHRleHRzIHRvIGxpbmtzXG4gICAgbGlua1RhcmdldDogICAnJywgICAgICAgICAgIC8vIHNldCB0YXJnZXQgdG8gb3BlbiBsaW5rIGluXG5cbiAgICAvLyBFbmFibGUgc29tZSBsYW5ndWFnZS1uZXV0cmFsIHJlcGxhY2VtZW50cyArIHF1b3RlcyBiZWF1dGlmaWNhdGlvblxuICAgIHR5cG9ncmFwaGVyOiAgZmFsc2UsXG5cbiAgICAvLyBEb3VibGUgKyBzaW5nbGUgcXVvdGVzIHJlcGxhY2VtZW50IHBhaXJzLCB3aGVuIHR5cG9ncmFwaGVyIGVuYWJsZWQsXG4gICAgLy8gYW5kIHNtYXJ0cXVvdGVzIG9uLiBTZXQgZG91YmxlcyB0byAnwqvCuycgZm9yIFJ1c3NpYW4sICfigJ7igJwnIGZvciBHZXJtYW4uXG4gICAgcXVvdGVzOiAgICAgICAn4oCc4oCd4oCY4oCZJyxcblxuICAgIC8vIEhpZ2hsaWdodGVyIGZ1bmN0aW9uLiBTaG91bGQgcmV0dXJuIGVzY2FwZWQgSFRNTCxcbiAgICAvLyBvciAnJyBpZiBpbnB1dCBub3QgY2hhbmdlZFxuICAgIC8vXG4gICAgLy8gZnVuY3Rpb24gKC8qc3RyLCBsYW5nKi8pIHsgcmV0dXJuICcnOyB9XG4gICAgLy9cbiAgICBoaWdobGlnaHQ6ICAgICBudWxsLFxuXG4gICAgbWF4TmVzdGluZzogICAgMjAgICAgICAgICAgICAvLyBJbnRlcm5hbCBwcm90ZWN0aW9uLCByZWN1cnNpb24gbGltaXRcbiAgfSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgLy8gRG9uJ3QgcmVzdHJpY3QgY29yZS9ibG9jay9pbmxpbmUgcnVsZXNcbiAgICBjb3JlOiB7fSxcbiAgICBibG9jazoge30sXG4gICAgaW5saW5lOiB7fVxuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVwbGFjZUVudGl0aWVzID0gcmVxdWlyZSgnLi4vY29tbW9uL3V0aWxzJykucmVwbGFjZUVudGl0aWVzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmsodXJsKSB7XG4gIHZhciBub3JtYWxpemVkID0gcmVwbGFjZUVudGl0aWVzKHVybCk7XG4gIC8vIFdlIHNob3VsZG4ndCBjYXJlIGFib3V0IHRoZSByZXN1bHQgb2YgbWFsZm9ybWVkIFVSSXMsXG4gIC8vIGFuZCBzaG91bGQgbm90IHRocm93IGFuIGV4Y2VwdGlvbi5cbiAgdHJ5IHtcbiAgICBub3JtYWxpemVkID0gZGVjb2RlVVJJKG5vcm1hbGl6ZWQpO1xuICB9IGNhdGNoIChlcnIpIHt9XG4gIHJldHVybiBlbmNvZGVVUkkobm9ybWFsaXplZCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlZmVyZW5jZShzdHIpIHtcbiAgLy8gdXNlIC50b1VwcGVyQ2FzZSgpIGluc3RlYWQgb2YgLnRvTG93ZXJDYXNlKClcbiAgLy8gaGVyZSB0byBhdm9pZCBhIGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZVxuICAvLyBtZW1iZXJzIChtb3N0IG5vdGFibHksIGBfX3Byb3RvX19gKVxuICByZXR1cm4gc3RyLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcgJykudG9VcHBlckNhc2UoKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG5vcm1hbGl6ZUxpbmsgPSByZXF1aXJlKCcuL25vcm1hbGl6ZV9saW5rJyk7XG52YXIgdW5lc2NhcGVNZCAgICA9IHJlcXVpcmUoJy4uL2NvbW1vbi91dGlscycpLnVuZXNjYXBlTWQ7XG5cbi8qKlxuICogUGFyc2UgbGluayBkZXN0aW5hdGlvblxuICpcbiAqICAgLSBvbiBzdWNjZXNzIGl0IHJldHVybnMgYSBzdHJpbmcgYW5kIHVwZGF0ZXMgc3RhdGUucG9zO1xuICogICAtIG9uIGZhaWx1cmUgaXQgcmV0dXJucyBudWxsXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtICB7TnVtYmVyfSBwb3NcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFyc2VMaW5rRGVzdGluYXRpb24oc3RhdGUsIHBvcykge1xuICB2YXIgY29kZSwgbGV2ZWwsIGxpbmssXG4gICAgICBzdGFydCA9IHBvcyxcbiAgICAgIG1heCA9IHN0YXRlLnBvc01heDtcblxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgzQyAvKiA8ICovKSB7XG4gICAgcG9zKys7XG4gICAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgICAgY29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcyk7XG4gICAgICBpZiAoY29kZSA9PT0gMHgwQSAvKiBcXG4gKi8pIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICBpZiAoY29kZSA9PT0gMHgzRSAvKiA+ICovKSB7XG4gICAgICAgIGxpbmsgPSBub3JtYWxpemVMaW5rKHVuZXNjYXBlTWQoc3RhdGUuc3JjLnNsaWNlKHN0YXJ0ICsgMSwgcG9zKSkpO1xuICAgICAgICBpZiAoIXN0YXRlLnBhcnNlci52YWxpZGF0ZUxpbmsobGluaykpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIHN0YXRlLnBvcyA9IHBvcyArIDE7XG4gICAgICAgIHN0YXRlLmxpbmtDb250ZW50ID0gbGluaztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoY29kZSA9PT0gMHg1QyAvKiBcXCAqLyAmJiBwb3MgKyAxIDwgbWF4KSB7XG4gICAgICAgIHBvcyArPSAyO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcG9zKys7XG4gICAgfVxuXG4gICAgLy8gbm8gY2xvc2luZyAnPidcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyB0aGlzIHNob3VsZCBiZSAuLi4gfSBlbHNlIHsgLi4uIGJyYW5jaFxuXG4gIGxldmVsID0gMDtcbiAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgIGNvZGUgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpO1xuXG4gICAgaWYgKGNvZGUgPT09IDB4MjApIHsgYnJlYWs7IH1cblxuICAgIGlmIChjb2RlID4gMHgwOCAmJiBjb2RlIDwgMHgwZSkgeyBicmVhazsgfVxuXG4gICAgaWYgKGNvZGUgPT09IDB4NUMgLyogXFwgKi8gJiYgcG9zICsgMSA8IG1heCkge1xuICAgICAgcG9zICs9IDI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gMHgyOCAvKiAoICovKSB7XG4gICAgICBsZXZlbCsrO1xuICAgICAgaWYgKGxldmVsID4gMSkgeyBicmVhazsgfVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSAweDI5IC8qICkgKi8pIHtcbiAgICAgIGxldmVsLS07XG4gICAgICBpZiAobGV2ZWwgPCAwKSB7IGJyZWFrOyB9XG4gICAgfVxuXG4gICAgcG9zKys7XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHBvcykgeyByZXR1cm4gZmFsc2U7IH1cblxuICBsaW5rID0gdW5lc2NhcGVNZChzdGF0ZS5zcmMuc2xpY2Uoc3RhcnQsIHBvcykpO1xuICBpZiAoIXN0YXRlLnBhcnNlci52YWxpZGF0ZUxpbmsobGluaykpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgc3RhdGUubGlua0NvbnRlbnQgPSBsaW5rO1xuICBzdGF0ZS5wb3MgPSBwb3M7XG4gIHJldHVybiB0cnVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBQYXJzZSBsaW5rIGxhYmVsc1xuICpcbiAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGZpcnN0IGNoYXJhY3RlciAoYFtgKSBhbHJlYWR5IG1hdGNoZXM7XG4gKiByZXR1cm5zIHRoZSBlbmQgb2YgdGhlIGxhYmVsLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSAge051bWJlcn0gc3RhcnRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFyc2VMaW5rTGFiZWwoc3RhdGUsIHN0YXJ0KSB7XG4gIHZhciBsZXZlbCwgZm91bmQsIG1hcmtlcixcbiAgICAgIGxhYmVsRW5kID0gLTEsXG4gICAgICBtYXggPSBzdGF0ZS5wb3NNYXgsXG4gICAgICBvbGRQb3MgPSBzdGF0ZS5wb3MsXG4gICAgICBvbGRGbGFnID0gc3RhdGUuaXNJbkxhYmVsO1xuXG4gIGlmIChzdGF0ZS5pc0luTGFiZWwpIHsgcmV0dXJuIC0xOyB9XG5cbiAgaWYgKHN0YXRlLmxhYmVsVW5tYXRjaGVkU2NvcGVzKSB7XG4gICAgc3RhdGUubGFiZWxVbm1hdGNoZWRTY29wZXMtLTtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBzdGF0ZS5wb3MgPSBzdGFydCArIDE7XG4gIHN0YXRlLmlzSW5MYWJlbCA9IHRydWU7XG4gIGxldmVsID0gMTtcblxuICB3aGlsZSAoc3RhdGUucG9zIDwgbWF4KSB7XG4gICAgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhdGUucG9zKTtcbiAgICBpZiAobWFya2VyID09PSAweDVCIC8qIFsgKi8pIHtcbiAgICAgIGxldmVsKys7XG4gICAgfSBlbHNlIGlmIChtYXJrZXIgPT09IDB4NUQgLyogXSAqLykge1xuICAgICAgbGV2ZWwtLTtcbiAgICAgIGlmIChsZXZlbCA9PT0gMCkge1xuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRlLnBhcnNlci5za2lwVG9rZW4oc3RhdGUpO1xuICB9XG5cbiAgaWYgKGZvdW5kKSB7XG4gICAgbGFiZWxFbmQgPSBzdGF0ZS5wb3M7XG4gICAgc3RhdGUubGFiZWxVbm1hdGNoZWRTY29wZXMgPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxhYmVsVW5tYXRjaGVkU2NvcGVzID0gbGV2ZWwgLSAxO1xuICB9XG5cbiAgLy8gcmVzdG9yZSBvbGQgc3RhdGVcbiAgc3RhdGUucG9zID0gb2xkUG9zO1xuICBzdGF0ZS5pc0luTGFiZWwgPSBvbGRGbGFnO1xuXG4gIHJldHVybiBsYWJlbEVuZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHVuZXNjYXBlTWQgPSByZXF1aXJlKCcuLi9jb21tb24vdXRpbHMnKS51bmVzY2FwZU1kO1xuXG4vKipcbiAqIFBhcnNlIGxpbmsgdGl0bGVcbiAqXG4gKiAgIC0gb24gc3VjY2VzcyBpdCByZXR1cm5zIGEgc3RyaW5nIGFuZCB1cGRhdGVzIHN0YXRlLnBvcztcbiAqICAgLSBvbiBmYWlsdXJlIGl0IHJldHVybnMgbnVsbFxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSAge051bWJlcn0gcG9zXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhcnNlTGlua1RpdGxlKHN0YXRlLCBwb3MpIHtcbiAgdmFyIGNvZGUsXG4gICAgICBzdGFydCA9IHBvcyxcbiAgICAgIG1heCA9IHN0YXRlLnBvc01heCxcbiAgICAgIG1hcmtlciA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcyk7XG5cbiAgaWYgKG1hcmtlciAhPT0gMHgyMiAvKiBcIiAqLyAmJiBtYXJrZXIgIT09IDB4MjcgLyogJyAqLyAmJiBtYXJrZXIgIT09IDB4MjggLyogKCAqLykgeyByZXR1cm4gZmFsc2U7IH1cblxuICBwb3MrKztcblxuICAvLyBpZiBvcGVuaW5nIG1hcmtlciBpcyBcIihcIiwgc3dpdGNoIGl0IHRvIGNsb3NpbmcgbWFya2VyIFwiKVwiXG4gIGlmIChtYXJrZXIgPT09IDB4MjgpIHsgbWFya2VyID0gMHgyOTsgfVxuXG4gIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICBjb2RlID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKTtcbiAgICBpZiAoY29kZSA9PT0gbWFya2VyKSB7XG4gICAgICBzdGF0ZS5wb3MgPSBwb3MgKyAxO1xuICAgICAgc3RhdGUubGlua0NvbnRlbnQgPSB1bmVzY2FwZU1kKHN0YXRlLnNyYy5zbGljZShzdGFydCArIDEsIHBvcykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChjb2RlID09PSAweDVDIC8qIFxcICovICYmIHBvcyArIDEgPCBtYXgpIHtcbiAgICAgIHBvcyArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcG9zKys7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIExvY2FsIGRlcGVuZGVuY2llc1xuICovXG5cbnZhciBhc3NpZ24gICAgICAgPSByZXF1aXJlKCcuL2NvbW1vbi91dGlscycpLmFzc2lnbjtcbnZhciBSZW5kZXJlciAgICAgPSByZXF1aXJlKCcuL3JlbmRlcmVyJyk7XG52YXIgUGFyc2VyQ29yZSAgID0gcmVxdWlyZSgnLi9wYXJzZXJfY29yZScpO1xudmFyIFBhcnNlckJsb2NrICA9IHJlcXVpcmUoJy4vcGFyc2VyX2Jsb2NrJyk7XG52YXIgUGFyc2VySW5saW5lID0gcmVxdWlyZSgnLi9wYXJzZXJfaW5saW5lJyk7XG52YXIgUnVsZXIgICAgICAgID0gcmVxdWlyZSgnLi9ydWxlcicpO1xuXG4vKipcbiAqIFByZXNldCBjb25maWdzXG4gKi9cblxudmFyIGNvbmZpZyA9IHtcbiAgJ2RlZmF1bHQnOiAgICByZXF1aXJlKCcuL2NvbmZpZ3MvZGVmYXVsdCcpLFxuICAnZnVsbCc6ICAgICAgIHJlcXVpcmUoJy4vY29uZmlncy9mdWxsJyksXG4gICdjb21tb25tYXJrJzogcmVxdWlyZSgnLi9jb25maWdzL2NvbW1vbm1hcmsnKVxufTtcblxuLyoqXG4gKiBUaGUgYFN0YXRlQ29yZWAgY2xhc3MgbWFuYWdlcyBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYGluc3RhbmNlYCBSZW1hcmthYmxlIGluc3RhbmNlXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmAgTWFya2Rvd24gc3RyaW5nXG4gKiBAcGFyYW0ge09iamVjdH0gYGVudmBcbiAqL1xuXG5mdW5jdGlvbiBTdGF0ZUNvcmUoaW5zdGFuY2UsIHN0ciwgZW52KSB7XG4gIHRoaXMuc3JjID0gc3RyO1xuICB0aGlzLmVudiA9IGVudjtcbiAgdGhpcy5vcHRpb25zID0gaW5zdGFuY2Uub3B0aW9ucztcbiAgdGhpcy50b2tlbnMgPSBbXTtcbiAgdGhpcy5pbmxpbmVNb2RlID0gZmFsc2U7XG5cbiAgdGhpcy5pbmxpbmUgPSBpbnN0YW5jZS5pbmxpbmU7XG4gIHRoaXMuYmxvY2sgPSBpbnN0YW5jZS5ibG9jaztcbiAgdGhpcy5yZW5kZXJlciA9IGluc3RhbmNlLnJlbmRlcmVyO1xuICB0aGlzLnR5cG9ncmFwaGVyID0gaW5zdGFuY2UudHlwb2dyYXBoZXI7XG59XG5cbi8qKlxuICogVGhlIG1haW4gYFJlbWFya2FibGVgIGNsYXNzLiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2ZcbiAqIGBSZW1hcmthYmxlYCB3aXRoIGEgYHByZXNldGAgYW5kL29yIGBvcHRpb25zYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYHByZXNldGAgSWYgbm8gcHJlc2V0IGlzIGdpdmVuLCBgZGVmYXVsdGAgaXMgdXNlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqL1xuXG5mdW5jdGlvbiBSZW1hcmthYmxlKHByZXNldCwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHByZXNldCAhPT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zID0gcHJlc2V0O1xuICAgIHByZXNldCA9ICdkZWZhdWx0JztcbiAgfVxuXG4gIHRoaXMuaW5saW5lICAgPSBuZXcgUGFyc2VySW5saW5lKCk7XG4gIHRoaXMuYmxvY2sgICAgPSBuZXcgUGFyc2VyQmxvY2soKTtcbiAgdGhpcy5jb3JlICAgICA9IG5ldyBQYXJzZXJDb3JlKCk7XG4gIHRoaXMucmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIoKTtcbiAgdGhpcy5ydWxlciAgICA9IG5ldyBSdWxlcigpO1xuXG4gIHRoaXMub3B0aW9ucyAgPSB7fTtcbiAgdGhpcy5jb25maWd1cmUoY29uZmlnW3ByZXNldF0pO1xuICB0aGlzLnNldChvcHRpb25zIHx8IHt9KTtcbn1cblxuLyoqXG4gKiBTZXQgb3B0aW9ucyBhcyBhbiBhbHRlcm5hdGl2ZSB0byBwYXNzaW5nIHRoZW1cbiAqIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBgYGBqc1xuICogbWQuc2V0KHt0eXBvZ3JhcGhlcjogdHJ1ZX0pO1xuICogYGBgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlbWFya2FibGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBCYXRjaCBsb2FkZXIgZm9yIGNvbXBvbmVudHMgcnVsZXMgc3RhdGVzLCBhbmQgb3B0aW9uc1xuICpcbiAqIEBwYXJhbSAge09iamVjdH0gYHByZXNldHNgXG4gKi9cblxuUmVtYXJrYWJsZS5wcm90b3R5cGUuY29uZmlndXJlID0gZnVuY3Rpb24gKHByZXNldHMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIGlmICghcHJlc2V0cykgeyB0aHJvdyBuZXcgRXJyb3IoJ1dyb25nIGByZW1hcmthYmxlYCBwcmVzZXQsIGNoZWNrIG5hbWUvY29udGVudCcpOyB9XG4gIGlmIChwcmVzZXRzLm9wdGlvbnMpIHsgc2VsZi5zZXQocHJlc2V0cy5vcHRpb25zKTsgfVxuICBpZiAocHJlc2V0cy5jb21wb25lbnRzKSB7XG4gICAgT2JqZWN0LmtleXMocHJlc2V0cy5jb21wb25lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBpZiAocHJlc2V0cy5jb21wb25lbnRzW25hbWVdLnJ1bGVzKSB7XG4gICAgICAgIHNlbGZbbmFtZV0ucnVsZXIuZW5hYmxlKHByZXNldHMuY29tcG9uZW50c1tuYW1lXS5ydWxlcywgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogVXNlIGEgcGx1Z2luLlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgbWQgPSBuZXcgUmVtYXJrYWJsZSgpO1xuICpcbiAqIG1kLnVzZShwbHVnaW4xKVxuICogICAudXNlKHBsdWdpbjIsIG9wdHMpXG4gKiAgIC51c2UocGx1Z2luMyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gYHBsdWdpbmBcbiAqIEBwYXJhbSAge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IGBSZW1hcmthYmxlYCBmb3IgY2hhaW5pbmdcbiAqL1xuXG5SZW1hcmthYmxlLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiAocGx1Z2luLCBvcHRpb25zKSB7XG4gIHBsdWdpbih0aGlzLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5cbi8qKlxuICogUGFyc2UgdGhlIGlucHV0IGBzdHJpbmdgIGFuZCByZXR1cm4gYSB0b2tlbnMgYXJyYXkuXG4gKiBNb2RpZmllcyBgZW52YCB3aXRoIGRlZmluaXRpb25zIGRhdGEuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyaW5nYFxuICogQHBhcmFtICB7T2JqZWN0fSBgZW52YFxuICogQHJldHVybiB7QXJyYXl9IEFycmF5IG9mIHRva2Vuc1xuICovXG5cblJlbWFya2FibGUucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHN0ciwgZW52KSB7XG4gIHZhciBzdGF0ZSA9IG5ldyBTdGF0ZUNvcmUodGhpcywgc3RyLCBlbnYpO1xuICB0aGlzLmNvcmUucHJvY2VzcyhzdGF0ZSk7XG4gIHJldHVybiBzdGF0ZS50b2tlbnM7XG59O1xuXG4vKipcbiAqIFRoZSBtYWluIGAucmVuZGVyKClgIG1ldGhvZCB0aGF0IGRvZXMgYWxsIHRoZSBtYWdpYyA6KVxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmluZ2BcbiAqIEBwYXJhbSAge09iamVjdH0gYGVudmBcbiAqIEByZXR1cm4ge1N0cmluZ30gUmVuZGVyZWQgSFRNTC5cbiAqL1xuXG5SZW1hcmthYmxlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoc3RyLCBlbnYpIHtcbiAgZW52ID0gZW52IHx8IHt9O1xuICByZXR1cm4gdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5wYXJzZShzdHIsIGVudiksIHRoaXMub3B0aW9ucywgZW52KTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGNvbnRlbnQgYHN0cmluZ2AgYXMgYSBzaW5nbGUgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmluZ2BcbiAqIEBwYXJhbSAge09iamVjdH0gYGVudmBcbiAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBvZiB0b2tlbnNcbiAqL1xuXG5SZW1hcmthYmxlLnByb3RvdHlwZS5wYXJzZUlubGluZSA9IGZ1bmN0aW9uIChzdHIsIGVudikge1xuICB2YXIgc3RhdGUgPSBuZXcgU3RhdGVDb3JlKHRoaXMsIHN0ciwgZW52KTtcbiAgc3RhdGUuaW5saW5lTW9kZSA9IHRydWU7XG4gIHRoaXMuY29yZS5wcm9jZXNzKHN0YXRlKTtcbiAgcmV0dXJuIHN0YXRlLnRva2Vucztcbn07XG5cbi8qKlxuICogUmVuZGVyIGEgc2luZ2xlIGNvbnRlbnQgYHN0cmluZ2AsIHdpdGhvdXQgd3JhcHBpbmcgaXRcbiAqIHRvIHBhcmFncmFwaHNcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdHJgXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBlbnZgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxuUmVtYXJrYWJsZS5wcm90b3R5cGUucmVuZGVySW5saW5lID0gZnVuY3Rpb24gKHN0ciwgZW52KSB7XG4gIGVudiA9IGVudiB8fCB7fTtcbiAgcmV0dXJuIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMucGFyc2VJbmxpbmUoc3RyLCBlbnYpLCB0aGlzLm9wdGlvbnMsIGVudik7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBgUmVtYXJrYWJsZWBcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlbWFya2FibGU7XG5cbi8qKlxuICogRXhwb3NlIGB1dGlsc2AsIFVzZWZ1bCBoZWxwZXIgZnVuY3Rpb25zIGZvciBjdXN0b21cbiAqIHJlbmRlcmluZy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cy51dGlscyA9IHJlcXVpcmUoJy4vY29tbW9uL3V0aWxzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTG9jYWwgZGVwZW5kZW5jaWVzXG4gKi9cblxudmFyIFJ1bGVyICAgICAgPSByZXF1aXJlKCcuL3J1bGVyJyk7XG52YXIgU3RhdGVCbG9jayA9IHJlcXVpcmUoJy4vcnVsZXNfYmxvY2svc3RhdGVfYmxvY2snKTtcblxuLyoqXG4gKiBQYXJzZXIgcnVsZXNcbiAqL1xuXG52YXIgX3J1bGVzID0gW1xuICBbICdjb2RlJywgICAgICAgcmVxdWlyZSgnLi9ydWxlc19ibG9jay9jb2RlJykgXSxcbiAgWyAnZmVuY2VzJywgICAgIHJlcXVpcmUoJy4vcnVsZXNfYmxvY2svZmVuY2VzJyksICAgICBbICdwYXJhZ3JhcGgnLCAnYmxvY2txdW90ZScsICdsaXN0JyBdIF0sXG4gIFsgJ2Jsb2NrcXVvdGUnLCByZXF1aXJlKCcuL3J1bGVzX2Jsb2NrL2Jsb2NrcXVvdGUnKSwgWyAncGFyYWdyYXBoJywgJ2Jsb2NrcXVvdGUnLCAnbGlzdCcgXSBdLFxuICBbICdocicsICAgICAgICAgcmVxdWlyZSgnLi9ydWxlc19ibG9jay9ocicpLCAgICAgICAgIFsgJ3BhcmFncmFwaCcsICdibG9ja3F1b3RlJywgJ2xpc3QnIF0gXSxcbiAgWyAnbGlzdCcsICAgICAgIHJlcXVpcmUoJy4vcnVsZXNfYmxvY2svbGlzdCcpLCAgICAgICBbICdwYXJhZ3JhcGgnLCAnYmxvY2txdW90ZScgXSBdLFxuICBbICdmb290bm90ZScsICAgcmVxdWlyZSgnLi9ydWxlc19ibG9jay9mb290bm90ZScpLCAgIFsgJ3BhcmFncmFwaCcgXSBdLFxuICBbICdoZWFkaW5nJywgICAgcmVxdWlyZSgnLi9ydWxlc19ibG9jay9oZWFkaW5nJyksICAgIFsgJ3BhcmFncmFwaCcsICdibG9ja3F1b3RlJyBdIF0sXG4gIFsgJ2xoZWFkaW5nJywgICByZXF1aXJlKCcuL3J1bGVzX2Jsb2NrL2xoZWFkaW5nJykgXSxcbiAgWyAnaHRtbGJsb2NrJywgIHJlcXVpcmUoJy4vcnVsZXNfYmxvY2svaHRtbGJsb2NrJyksICBbICdwYXJhZ3JhcGgnLCAnYmxvY2txdW90ZScgXSBdLFxuICBbICd0YWJsZScsICAgICAgcmVxdWlyZSgnLi9ydWxlc19ibG9jay90YWJsZScpLCAgICAgIFsgJ3BhcmFncmFwaCcgXSBdLFxuICBbICdkZWZsaXN0JywgICAgcmVxdWlyZSgnLi9ydWxlc19ibG9jay9kZWZsaXN0JyksICAgIFsgJ3BhcmFncmFwaCcgXSBdLFxuICBbICdwYXJhZ3JhcGgnLCAgcmVxdWlyZSgnLi9ydWxlc19ibG9jay9wYXJhZ3JhcGgnKSBdXG5dO1xuXG4vKipcbiAqIEJsb2NrIFBhcnNlciBjbGFzc1xuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIFBhcnNlckJsb2NrKCkge1xuICB0aGlzLnJ1bGVyID0gbmV3IFJ1bGVyKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgX3J1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5ydWxlci5wdXNoKF9ydWxlc1tpXVswXSwgX3J1bGVzW2ldWzFdLCB7XG4gICAgICBhbHQ6IChfcnVsZXNbaV1bMl0gfHwgW10pLnNsaWNlKClcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIHRva2VucyBmb3IgdGhlIGdpdmVuIGlucHV0IHJhbmdlLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gYHN0YXRlYCBIYXMgcHJvcGVydGllcyBsaWtlIGBzcmNgLCBgcGFyc2VyYCwgYG9wdGlvbnNgIGV0Y1xuICogQHBhcmFtICB7TnVtYmVyfSBgc3RhcnRMaW5lYFxuICogQHBhcmFtICB7TnVtYmVyfSBgZW5kTGluZWBcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblBhcnNlckJsb2NrLnByb3RvdHlwZS50b2tlbml6ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lKSB7XG4gIHZhciBydWxlcyA9IHRoaXMucnVsZXIuZ2V0UnVsZXMoJycpO1xuICB2YXIgbGVuID0gcnVsZXMubGVuZ3RoO1xuICB2YXIgbGluZSA9IHN0YXJ0TGluZTtcbiAgdmFyIGhhc0VtcHR5TGluZXMgPSBmYWxzZTtcbiAgdmFyIG9rLCBpO1xuXG4gIHdoaWxlIChsaW5lIDwgZW5kTGluZSkge1xuICAgIHN0YXRlLmxpbmUgPSBsaW5lID0gc3RhdGUuc2tpcEVtcHR5TGluZXMobGluZSk7XG4gICAgaWYgKGxpbmUgPj0gZW5kTGluZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gVGVybWluYXRpb24gY29uZGl0aW9uIGZvciBuZXN0ZWQgY2FsbHMuXG4gICAgLy8gTmVzdGVkIGNhbGxzIGN1cnJlbnRseSB1c2VkIGZvciBibG9ja3F1b3RlcyAmIGxpc3RzXG4gICAgaWYgKHN0YXRlLnRTaGlmdFtsaW5lXSA8IHN0YXRlLmJsa0luZGVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gVHJ5IGFsbCBwb3NzaWJsZSBydWxlcy5cbiAgICAvLyBPbiBzdWNjZXNzLCBydWxlIHNob3VsZDpcbiAgICAvL1xuICAgIC8vIC0gdXBkYXRlIGBzdGF0ZS5saW5lYFxuICAgIC8vIC0gdXBkYXRlIGBzdGF0ZS50b2tlbnNgXG4gICAgLy8gLSByZXR1cm4gdHJ1ZVxuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBvayA9IHJ1bGVzW2ldKHN0YXRlLCBsaW5lLCBlbmRMaW5lLCBmYWxzZSk7XG4gICAgICBpZiAob2spIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IHN0YXRlLnRpZ2h0IGlmZiB3ZSBoYWQgYW4gZW1wdHkgbGluZSBiZWZvcmUgY3VycmVudCB0YWdcbiAgICAvLyBpLmUuIGxhdGVzdCBlbXB0eSBsaW5lIHNob3VsZCBub3QgY291bnRcbiAgICBzdGF0ZS50aWdodCA9ICFoYXNFbXB0eUxpbmVzO1xuXG4gICAgLy8gcGFyYWdyYXBoIG1pZ2h0IFwiZWF0XCIgb25lIG5ld2xpbmUgYWZ0ZXIgaXQgaW4gbmVzdGVkIGxpc3RzXG4gICAgaWYgKHN0YXRlLmlzRW1wdHkoc3RhdGUubGluZSAtIDEpKSB7XG4gICAgICBoYXNFbXB0eUxpbmVzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBsaW5lID0gc3RhdGUubGluZTtcblxuICAgIGlmIChsaW5lIDwgZW5kTGluZSAmJiBzdGF0ZS5pc0VtcHR5KGxpbmUpKSB7XG4gICAgICBoYXNFbXB0eUxpbmVzID0gdHJ1ZTtcbiAgICAgIGxpbmUrKztcblxuICAgICAgLy8gdHdvIGVtcHR5IGxpbmVzIHNob3VsZCBzdG9wIHRoZSBwYXJzZXIgaW4gbGlzdCBtb2RlXG4gICAgICBpZiAobGluZSA8IGVuZExpbmUgJiYgc3RhdGUucGFyZW50VHlwZSA9PT0gJ2xpc3QnICYmIHN0YXRlLmlzRW1wdHkobGluZSkpIHsgYnJlYWs7IH1cbiAgICAgIHN0YXRlLmxpbmUgPSBsaW5lO1xuICAgIH1cbiAgfVxufTtcblxudmFyIFRBQlNfU0NBTl9SRSA9IC9bXFxuXFx0XS9nO1xudmFyIE5FV0xJTkVTX1JFICA9IC9cXHJbXFxuXFx1MDA4NV18W1xcdTI0MjRcXHUyMDI4XFx1MDA4NV0vZztcbnZhciBTUEFDRVNfUkUgICAgPSAvXFx1MDBhMC9nO1xuXG4vKipcbiAqIFRva2VuaXplIHRoZSBnaXZlbiBgc3RyYC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBzdHJgIFNvdXJjZSBzdHJpbmdcbiAqIEBwYXJhbSAge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBlbnZgXG4gKiBAcGFyYW0gIHtBcnJheX0gYG91dFRva2Vuc2BcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblBhcnNlckJsb2NrLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChzdHIsIG9wdGlvbnMsIGVudiwgb3V0VG9rZW5zKSB7XG4gIHZhciBzdGF0ZSwgbGluZVN0YXJ0ID0gMCwgbGFzdFRhYlBvcyA9IDA7XG4gIGlmICghc3RyKSB7IHJldHVybiBbXTsgfVxuXG4gIC8vIE5vcm1hbGl6ZSBzcGFjZXNcbiAgc3RyID0gc3RyLnJlcGxhY2UoU1BBQ0VTX1JFLCAnICcpO1xuXG4gIC8vIE5vcm1hbGl6ZSBuZXdsaW5lc1xuICBzdHIgPSBzdHIucmVwbGFjZShORVdMSU5FU19SRSwgJ1xcbicpO1xuXG4gIC8vIFJlcGxhY2UgdGFicyB3aXRoIHByb3BlciBudW1iZXIgb2Ygc3BhY2VzICgxLi40KVxuICBpZiAoc3RyLmluZGV4T2YoJ1xcdCcpID49IDApIHtcbiAgICBzdHIgPSBzdHIucmVwbGFjZShUQUJTX1NDQU5fUkUsIGZ1bmN0aW9uIChtYXRjaCwgb2Zmc2V0KSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KG9mZnNldCkgPT09IDB4MEEpIHtcbiAgICAgICAgbGluZVN0YXJ0ID0gb2Zmc2V0ICsgMTtcbiAgICAgICAgbGFzdFRhYlBvcyA9IDA7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9ICcgICAgJy5zbGljZSgob2Zmc2V0IC0gbGluZVN0YXJ0IC0gbGFzdFRhYlBvcykgJSA0KTtcbiAgICAgIGxhc3RUYWJQb3MgPSBvZmZzZXQgLSBsaW5lU3RhcnQgKyAxO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRlID0gbmV3IFN0YXRlQmxvY2soc3RyLCB0aGlzLCBvcHRpb25zLCBlbnYsIG91dFRva2Vucyk7XG4gIHRoaXMudG9rZW5pemUoc3RhdGUsIHN0YXRlLmxpbmUsIHN0YXRlLmxpbmVNYXgpO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgYFBhcnNlckJsb2NrYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gUGFyc2VyQmxvY2s7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTG9jYWwgZGVwZW5kZW5jaWVzXG4gKi9cblxudmFyIFJ1bGVyID0gcmVxdWlyZSgnLi9ydWxlcicpO1xuXG4vKipcbiAqIENvcmUgcGFyc2VyIGBydWxlc2BcbiAqL1xuXG52YXIgX3J1bGVzID0gW1xuICBbICdibG9jaycsICAgICAgICAgIHJlcXVpcmUoJy4vcnVsZXNfY29yZS9ibG9jaycpICAgICAgICAgIF0sXG4gIFsgJ2FiYnInLCAgICAgICAgICAgcmVxdWlyZSgnLi9ydWxlc19jb3JlL2FiYnInKSAgICAgICAgICAgXSxcbiAgWyAncmVmZXJlbmNlcycsICAgICByZXF1aXJlKCcuL3J1bGVzX2NvcmUvcmVmZXJlbmNlcycpICAgICBdLFxuICBbICdpbmxpbmUnLCAgICAgICAgIHJlcXVpcmUoJy4vcnVsZXNfY29yZS9pbmxpbmUnKSAgICAgICAgIF0sXG4gIFsgJ2Zvb3Rub3RlX3RhaWwnLCAgcmVxdWlyZSgnLi9ydWxlc19jb3JlL2Zvb3Rub3RlX3RhaWwnKSAgXSxcbiAgWyAnYWJicjInLCAgICAgICAgICByZXF1aXJlKCcuL3J1bGVzX2NvcmUvYWJicjInKSAgICAgICAgICBdLFxuICBbICdyZXBsYWNlbWVudHMnLCAgIHJlcXVpcmUoJy4vcnVsZXNfY29yZS9yZXBsYWNlbWVudHMnKSAgIF0sXG4gIFsgJ3NtYXJ0cXVvdGVzJywgICAgcmVxdWlyZSgnLi9ydWxlc19jb3JlL3NtYXJ0cXVvdGVzJykgICAgXSxcbiAgWyAnbGlua2lmeScsICAgICAgICByZXF1aXJlKCcuL3J1bGVzX2NvcmUvbGlua2lmeScpICAgICAgICBdXG5dO1xuXG4vKipcbiAqIENsYXNzIGZvciB0b3AgbGV2ZWwgKGBjb3JlYCkgcGFyc2VyIHJ1bGVzXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gQ29yZSgpIHtcbiAgdGhpcy5vcHRpb25zID0ge307XG4gIHRoaXMucnVsZXIgPSBuZXcgUnVsZXIoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBfcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLnJ1bGVyLnB1c2goX3J1bGVzW2ldWzBdLCBfcnVsZXNbaV1bMV0pO1xuICB9XG59XG5cbi8qKlxuICogUHJvY2VzcyBydWxlcyB3aXRoIHRoZSBnaXZlbiBgc3RhdGVgXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBgc3RhdGVgXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db3JlLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHZhciBpLCBsLCBydWxlcztcbiAgcnVsZXMgPSB0aGlzLnJ1bGVyLmdldFJ1bGVzKCcnKTtcbiAgZm9yIChpID0gMCwgbCA9IHJ1bGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHJ1bGVzW2ldKHN0YXRlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBFeHBvc2UgYENvcmVgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBDb3JlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIExvY2FsIGRlcGVuZGVuY2llc1xuICovXG5cbnZhciBSdWxlciAgICAgICA9IHJlcXVpcmUoJy4vcnVsZXInKTtcbnZhciBTdGF0ZUlubGluZSA9IHJlcXVpcmUoJy4vcnVsZXNfaW5saW5lL3N0YXRlX2lubGluZScpO1xudmFyIHV0aWxzICAgICAgID0gcmVxdWlyZSgnLi9jb21tb24vdXRpbHMnKTtcblxuLyoqXG4gKiBJbmxpbmUgUGFyc2VyIGBydWxlc2BcbiAqL1xuXG52YXIgX3J1bGVzID0gW1xuICBbICd0ZXh0JywgICAgICAgICAgICByZXF1aXJlKCcuL3J1bGVzX2lubGluZS90ZXh0JykgXSxcbiAgWyAnbmV3bGluZScsICAgICAgICAgcmVxdWlyZSgnLi9ydWxlc19pbmxpbmUvbmV3bGluZScpIF0sXG4gIFsgJ2VzY2FwZScsICAgICAgICAgIHJlcXVpcmUoJy4vcnVsZXNfaW5saW5lL2VzY2FwZScpIF0sXG4gIFsgJ2JhY2t0aWNrcycsICAgICAgIHJlcXVpcmUoJy4vcnVsZXNfaW5saW5lL2JhY2t0aWNrcycpIF0sXG4gIFsgJ2RlbCcsICAgICAgICAgICAgIHJlcXVpcmUoJy4vcnVsZXNfaW5saW5lL2RlbCcpIF0sXG4gIFsgJ2lucycsICAgICAgICAgICAgIHJlcXVpcmUoJy4vcnVsZXNfaW5saW5lL2lucycpIF0sXG4gIFsgJ21hcmsnLCAgICAgICAgICAgIHJlcXVpcmUoJy4vcnVsZXNfaW5saW5lL21hcmsnKSBdLFxuICBbICdlbXBoYXNpcycsICAgICAgICByZXF1aXJlKCcuL3J1bGVzX2lubGluZS9lbXBoYXNpcycpIF0sXG4gIFsgJ3N1YicsICAgICAgICAgICAgIHJlcXVpcmUoJy4vcnVsZXNfaW5saW5lL3N1YicpIF0sXG4gIFsgJ3N1cCcsICAgICAgICAgICAgIHJlcXVpcmUoJy4vcnVsZXNfaW5saW5lL3N1cCcpIF0sXG4gIFsgJ2xpbmtzJywgICAgICAgICAgIHJlcXVpcmUoJy4vcnVsZXNfaW5saW5lL2xpbmtzJykgXSxcbiAgWyAnZm9vdG5vdGVfaW5saW5lJywgcmVxdWlyZSgnLi9ydWxlc19pbmxpbmUvZm9vdG5vdGVfaW5saW5lJykgXSxcbiAgWyAnZm9vdG5vdGVfcmVmJywgICAgcmVxdWlyZSgnLi9ydWxlc19pbmxpbmUvZm9vdG5vdGVfcmVmJykgXSxcbiAgWyAnYXV0b2xpbmsnLCAgICAgICAgcmVxdWlyZSgnLi9ydWxlc19pbmxpbmUvYXV0b2xpbmsnKSBdLFxuICBbICdodG1sdGFnJywgICAgICAgICByZXF1aXJlKCcuL3J1bGVzX2lubGluZS9odG1sdGFnJykgXSxcbiAgWyAnZW50aXR5JywgICAgICAgICAgcmVxdWlyZSgnLi9ydWxlc19pbmxpbmUvZW50aXR5JykgXVxuXTtcblxuLyoqXG4gKiBJbmxpbmUgUGFyc2VyIGNsYXNzLiBOb3RlIHRoYXQgbGluayB2YWxpZGF0aW9uIGlzIHN0cmljdGVyXG4gKiBpbiBSZW1hcmthYmxlIHRoYW4gd2hhdCBpcyBzcGVjaWZpZWQgYnkgQ29tbW9uTWFyay4gSWYgeW91XG4gKiB3YW50IHRvIGNoYW5nZSB0aGlzIHlvdSBjYW4gdXNlIGEgY3VzdG9tIHZhbGlkYXRvci5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBQYXJzZXJJbmxpbmUoKSB7XG4gIHRoaXMucnVsZXIgPSBuZXcgUnVsZXIoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBfcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLnJ1bGVyLnB1c2goX3J1bGVzW2ldWzBdLCBfcnVsZXNbaV1bMV0pO1xuICB9XG5cbiAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBhIGN1c3RvbSB2YWxpZGF0b3JcbiAgdGhpcy52YWxpZGF0ZUxpbmsgPSB2YWxpZGF0ZUxpbms7XG59XG5cbi8qKlxuICogU2tpcCBhIHNpbmdsZSB0b2tlbiBieSBydW5uaW5nIGFsbCBydWxlcyBpbiB2YWxpZGF0aW9uIG1vZGUuXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgcnVsZSByZXBvcnRzIHN1Y2Nlc3MuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBgc3RhdGVgXG4gKiBAYXBpIHByaXZhZ2VcbiAqL1xuXG5QYXJzZXJJbmxpbmUucHJvdG90eXBlLnNraXBUb2tlbiA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICB2YXIgcnVsZXMgPSB0aGlzLnJ1bGVyLmdldFJ1bGVzKCcnKTtcbiAgdmFyIGxlbiA9IHJ1bGVzLmxlbmd0aDtcbiAgdmFyIHBvcyA9IHN0YXRlLnBvcztcbiAgdmFyIGksIGNhY2hlZF9wb3M7XG5cbiAgaWYgKChjYWNoZWRfcG9zID0gc3RhdGUuY2FjaGVHZXQocG9zKSkgPiAwKSB7XG4gICAgc3RhdGUucG9zID0gY2FjaGVkX3BvcztcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAocnVsZXNbaV0oc3RhdGUsIHRydWUpKSB7XG4gICAgICBzdGF0ZS5jYWNoZVNldChwb3MsIHN0YXRlLnBvcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgc3RhdGUucG9zKys7XG4gIHN0YXRlLmNhY2hlU2V0KHBvcywgc3RhdGUucG9zKTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgdG9rZW5zIGZvciB0aGUgZ2l2ZW4gaW5wdXQgcmFuZ2UuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBgc3RhdGVgXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5QYXJzZXJJbmxpbmUucHJvdG90eXBlLnRva2VuaXplID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHZhciBydWxlcyA9IHRoaXMucnVsZXIuZ2V0UnVsZXMoJycpO1xuICB2YXIgbGVuID0gcnVsZXMubGVuZ3RoO1xuICB2YXIgZW5kID0gc3RhdGUucG9zTWF4O1xuICB2YXIgb2ssIGk7XG5cbiAgd2hpbGUgKHN0YXRlLnBvcyA8IGVuZCkge1xuXG4gICAgLy8gVHJ5IGFsbCBwb3NzaWJsZSBydWxlcy5cbiAgICAvLyBPbiBzdWNjZXNzLCB0aGUgcnVsZSBzaG91bGQ6XG4gICAgLy9cbiAgICAvLyAtIHVwZGF0ZSBgc3RhdGUucG9zYFxuICAgIC8vIC0gdXBkYXRlIGBzdGF0ZS50b2tlbnNgXG4gICAgLy8gLSByZXR1cm4gdHJ1ZVxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgb2sgPSBydWxlc1tpXShzdGF0ZSwgZmFsc2UpO1xuXG4gICAgICBpZiAob2spIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9rKSB7XG4gICAgICBpZiAoc3RhdGUucG9zID49IGVuZCkgeyBicmVhazsgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgc3RhdGUucGVuZGluZyArPSBzdGF0ZS5zcmNbc3RhdGUucG9zKytdO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBlbmRpbmcpIHtcbiAgICBzdGF0ZS5wdXNoUGVuZGluZygpO1xuICB9XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBpbnB1dCBzdHJpbmcuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyYFxuICogQHBhcmFtICB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEBwYXJhbSAge09iamVjdH0gYGVudmBcbiAqIEBwYXJhbSAge0FycmF5fSBgb3V0VG9rZW5zYFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUGFyc2VySW5saW5lLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChzdHIsIG9wdGlvbnMsIGVudiwgb3V0VG9rZW5zKSB7XG4gIHZhciBzdGF0ZSA9IG5ldyBTdGF0ZUlubGluZShzdHIsIHRoaXMsIG9wdGlvbnMsIGVudiwgb3V0VG9rZW5zKTtcbiAgdGhpcy50b2tlbml6ZShzdGF0ZSk7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlIHRoZSBnaXZlbiBgdXJsYCBieSBjaGVja2luZyBmb3IgYmFkIHByb3RvY29scy5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGB1cmxgXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlTGluayh1cmwpIHtcbiAgdmFyIEJBRF9QUk9UT0NPTFMgPSBbICd2YnNjcmlwdCcsICdqYXZhc2NyaXB0JywgJ2ZpbGUnIF07XG4gIHZhciBzdHIgPSB1cmwudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIC8vIENhcmUgYWJvdXQgZGlnaXRhbCBlbnRpdGllcyBcImphdmFzY3JpcHQmI3gzQTthbGVydCgxKVwiXG4gIHN0ciA9IHV0aWxzLnJlcGxhY2VFbnRpdGllcyhzdHIpO1xuICBpZiAoc3RyLmluZGV4T2YoJzonKSAhPT0gLTEgJiYgQkFEX1BST1RPQ09MUy5pbmRleE9mKHN0ci5zcGxpdCgnOicpWzBdKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogRXhwb3NlIGBQYXJzZXJJbmxpbmVgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBQYXJzZXJJbmxpbmU7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTG9jYWwgZGVwZW5kZW5jaWVzXG4gKi9cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi9jb21tb24vdXRpbHMnKTtcbnZhciBydWxlcyA9IHJlcXVpcmUoJy4vcnVsZXMnKTtcblxuLyoqXG4gKiBFeHBvc2UgYFJlbmRlcmVyYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gUmVuZGVyZXI7XG5cbi8qKlxuICogUmVuZGVyZXIgY2xhc3MuIFJlbmRlcnMgSFRNTCBhbmQgZXhwb3NlcyBgcnVsZXNgIHRvIGFsbG93XG4gKiBsb2NhbCBtb2RpZmljYXRpb25zLlxuICovXG5cbmZ1bmN0aW9uIFJlbmRlcmVyKCkge1xuICB0aGlzLnJ1bGVzID0gdXRpbHMuYXNzaWduKHt9LCBydWxlcyk7XG5cbiAgLy8gZXhwb3J0ZWQgaGVscGVyLCBmb3IgY3VzdG9tIHJ1bGVzIG9ubHlcbiAgdGhpcy5nZXRCcmVhayA9IHJ1bGVzLmdldEJyZWFrO1xufVxuXG4vKipcbiAqIFJlbmRlciBhIHN0cmluZyBvZiBpbmxpbmUgSFRNTCB3aXRoIHRoZSBnaXZlbiBgdG9rZW5zYCBhbmRcbiAqIGBvcHRpb25zYC5cbiAqXG4gKiBAcGFyYW0gIHtBcnJheX0gYHRva2Vuc2BcbiAqIEBwYXJhbSAge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBlbnZgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXJJbmxpbmUgPSBmdW5jdGlvbiAodG9rZW5zLCBvcHRpb25zLCBlbnYpIHtcbiAgdmFyIF9ydWxlcyA9IHRoaXMucnVsZXM7XG4gIHZhciBsZW4gPSB0b2tlbnMubGVuZ3RoLCBpID0gMDtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuXG4gIHdoaWxlIChsZW4tLSkge1xuICAgIHJlc3VsdCArPSBfcnVsZXNbdG9rZW5zW2ldLnR5cGVdKHRva2VucywgaSsrLCBvcHRpb25zLCBlbnYsIHRoaXMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogUmVuZGVyIGEgc3RyaW5nIG9mIEhUTUwgd2l0aCB0aGUgZ2l2ZW4gYHRva2Vuc2AgYW5kXG4gKiBgb3B0aW9uc2AuXG4gKlxuICogQHBhcmFtICB7QXJyYXl9IGB0b2tlbnNgXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHBhcmFtICB7T2JqZWN0fSBgZW52YFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZW5kZXJlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKHRva2Vucywgb3B0aW9ucywgZW52KSB7XG4gIHZhciBfcnVsZXMgPSB0aGlzLnJ1bGVzO1xuICB2YXIgbGVuID0gdG9rZW5zLmxlbmd0aCwgaSA9IC0xO1xuICB2YXIgcmVzdWx0ID0gJyc7XG5cbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIGlmICh0b2tlbnNbaV0udHlwZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIHJlc3VsdCArPSB0aGlzLnJlbmRlcklubGluZSh0b2tlbnNbaV0uY2hpbGRyZW4sIG9wdGlvbnMsIGVudik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCArPSBfcnVsZXNbdG9rZW5zW2ldLnR5cGVdKHRva2VucywgaSwgb3B0aW9ucywgZW52LCB0aGlzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUnVsZXIgaXMgYSBoZWxwZXIgY2xhc3MgZm9yIGJ1aWxkaW5nIHJlc3BvbnNpYmlsaXR5IGNoYWlucyBmcm9tXG4gKiBwYXJzZSBydWxlcy4gSXQgYWxsb3dzOlxuICpcbiAqICAgLSBlYXN5IHN0YWNrIHJ1bGVzIGNoYWluc1xuICogICAtIGdldHRpbmcgbWFpbiBjaGFpbiBhbmQgbmFtZWQgY2hhaW5zIGNvbnRlbnQgKGFzIGFycmF5cyBvZiBmdW5jdGlvbnMpXG4gKlxuICogSGVscGVyIG1ldGhvZHMsIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS5cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIFJ1bGVyKCkge1xuICAvLyBMaXN0IG9mIGFkZGVkIHJ1bGVzLiBFYWNoIGVsZW1lbnQgaXM6XG4gIC8vXG4gIC8vIHsgbmFtZTogWFhYLFxuICAvLyAgIGVuYWJsZWQ6IEJvb2xlYW4sXG4gIC8vICAgZm46IEZ1bmN0aW9uKCksXG4gIC8vICAgYWx0OiBbIG5hbWUyLCBuYW1lMyBdIH1cbiAgLy9cbiAgdGhpcy5fX3J1bGVzX18gPSBbXTtcblxuICAvLyBDYWNoZWQgcnVsZSBjaGFpbnMuXG4gIC8vXG4gIC8vIEZpcnN0IGxldmVsIC0gY2hhaW4gbmFtZSwgJycgZm9yIGRlZmF1bHQuXG4gIC8vIFNlY29uZCBsZXZlbCAtIGRpZ2l0YWwgYW5jaG9yIGZvciBmYXN0IGZpbHRlcmluZyBieSBjaGFyY29kZXMuXG4gIC8vXG4gIHRoaXMuX19jYWNoZV9fID0gbnVsbDtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBpbmRleCBvZiBhIHJ1bGUgYnkgYG5hbWVgLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gYG5hbWVgXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IEluZGV4IG9mIHRoZSBnaXZlbiBgbmFtZWBcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJ1bGVyLnByb3RvdHlwZS5fX2ZpbmRfXyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHZhciBsZW4gPSB0aGlzLl9fcnVsZXNfXy5sZW5ndGg7XG4gIHZhciBpID0gLTE7XG5cbiAgd2hpbGUgKGxlbi0tKSB7XG4gICAgaWYgKHRoaXMuX19ydWxlc19fWysraV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn07XG5cbi8qKlxuICogQnVpbGQgdGhlIHJ1bGVzIGxvb2t1cCBjYWNoZVxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJ1bGVyLnByb3RvdHlwZS5fX2NvbXBpbGVfXyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY2hhaW5zID0gWyAnJyBdO1xuXG4gIC8vIGNvbGxlY3QgdW5pcXVlIG5hbWVzXG4gIHNlbGYuX19ydWxlc19fLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICBpZiAoIXJ1bGUuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJ1bGUuYWx0LmZvckVhY2goZnVuY3Rpb24gKGFsdE5hbWUpIHtcbiAgICAgIGlmIChjaGFpbnMuaW5kZXhPZihhbHROYW1lKSA8IDApIHtcbiAgICAgICAgY2hhaW5zLnB1c2goYWx0TmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIHNlbGYuX19jYWNoZV9fID0ge307XG5cbiAgY2hhaW5zLmZvckVhY2goZnVuY3Rpb24gKGNoYWluKSB7XG4gICAgc2VsZi5fX2NhY2hlX19bY2hhaW5dID0gW107XG4gICAgc2VsZi5fX3J1bGVzX18uZm9yRWFjaChmdW5jdGlvbiAocnVsZSkge1xuICAgICAgaWYgKCFydWxlLmVuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhaW4gJiYgcnVsZS5hbHQuaW5kZXhPZihjaGFpbikgPCAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNlbGYuX19jYWNoZV9fW2NoYWluXS5wdXNoKHJ1bGUuZm4pO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogUnVsZXIgcHVibGljIG1ldGhvZHNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbi8qKlxuICogUmVwbGFjZSBydWxlIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBgbmFtZWAgUnVsZSBuYW1lXG4gKiBAcGFyYW0gIHtGdW5jdGlvbiBgZm5gXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBvcHRpb25zYFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUnVsZXIucHJvdG90eXBlLmF0ID0gZnVuY3Rpb24gKG5hbWUsIGZuLCBvcHRpb25zKSB7XG4gIHZhciBpZHggPSB0aGlzLl9fZmluZF9fKG5hbWUpO1xuICB2YXIgb3B0ID0gb3B0aW9ucyB8fCB7fTtcblxuICBpZiAoaWR4ID09PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGFyc2VyIHJ1bGUgbm90IGZvdW5kOiAnICsgbmFtZSk7XG4gIH1cblxuICB0aGlzLl9fcnVsZXNfX1tpZHhdLmZuID0gZm47XG4gIHRoaXMuX19ydWxlc19fW2lkeF0uYWx0ID0gb3B0LmFsdCB8fCBbXTtcbiAgdGhpcy5fX2NhY2hlX18gPSBudWxsO1xufTtcblxuLyoqXG4gKiBBZGQgYSBydWxlIHRvIHRoZSBjaGFpbiBiZWZvcmUgZ2l2ZW4gdGhlIGBydWxlTmFtZWAuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSAgIGBiZWZvcmVOYW1lYFxuICogQHBhcmFtICB7U3RyaW5nfSAgIGBydWxlTmFtZWBcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBgZm5gXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgYG9wdGlvbnNgXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SdWxlci5wcm90b3R5cGUuYmVmb3JlID0gZnVuY3Rpb24gKGJlZm9yZU5hbWUsIHJ1bGVOYW1lLCBmbiwgb3B0aW9ucykge1xuICB2YXIgaWR4ID0gdGhpcy5fX2ZpbmRfXyhiZWZvcmVOYW1lKTtcbiAgdmFyIG9wdCA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNlciBydWxlIG5vdCBmb3VuZDogJyArIGJlZm9yZU5hbWUpO1xuICB9XG5cbiAgdGhpcy5fX3J1bGVzX18uc3BsaWNlKGlkeCwgMCwge1xuICAgIG5hbWU6IHJ1bGVOYW1lLFxuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgZm46IGZuLFxuICAgIGFsdDogb3B0LmFsdCB8fCBbXVxuICB9KTtcblxuICB0aGlzLl9fY2FjaGVfXyA9IG51bGw7XG59O1xuXG4vKipcbiAqIEFkZCBhIHJ1bGUgdG8gdGhlIGNoYWluIGFmdGVyIHRoZSBnaXZlbiBgcnVsZU5hbWVgLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gICBgYWZ0ZXJOYW1lYFxuICogQHBhcmFtICB7U3RyaW5nfSAgIGBydWxlTmFtZWBcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBgZm5gXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgYG9wdGlvbnNgXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SdWxlci5wcm90b3R5cGUuYWZ0ZXIgPSBmdW5jdGlvbiAoYWZ0ZXJOYW1lLCBydWxlTmFtZSwgZm4sIG9wdGlvbnMpIHtcbiAgdmFyIGlkeCA9IHRoaXMuX19maW5kX18oYWZ0ZXJOYW1lKTtcbiAgdmFyIG9wdCA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNlciBydWxlIG5vdCBmb3VuZDogJyArIGFmdGVyTmFtZSk7XG4gIH1cblxuICB0aGlzLl9fcnVsZXNfXy5zcGxpY2UoaWR4ICsgMSwgMCwge1xuICAgIG5hbWU6IHJ1bGVOYW1lLFxuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgZm46IGZuLFxuICAgIGFsdDogb3B0LmFsdCB8fCBbXVxuICB9KTtcblxuICB0aGlzLl9fY2FjaGVfXyA9IG51bGw7XG59O1xuXG4vKipcbiAqIEFkZCBhIHJ1bGUgdG8gdGhlIGVuZCBvZiBjaGFpbi5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgYHJ1bGVOYW1lYFxuICogQHBhcmFtICB7RnVuY3Rpb259IGBmbmBcbiAqIEBwYXJhbSAge09iamVjdH0gICBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG5SdWxlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChydWxlTmFtZSwgZm4sIG9wdGlvbnMpIHtcbiAgdmFyIG9wdCA9IG9wdGlvbnMgfHwge307XG5cbiAgdGhpcy5fX3J1bGVzX18ucHVzaCh7XG4gICAgbmFtZTogcnVsZU5hbWUsXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBmbjogZm4sXG4gICAgYWx0OiBvcHQuYWx0IHx8IFtdXG4gIH0pO1xuXG4gIHRoaXMuX19jYWNoZV9fID0gbnVsbDtcbn07XG5cbi8qKlxuICogRW5hYmxlIGEgcnVsZSBvciBsaXN0IG9mIHJ1bGVzLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ3xBcnJheX0gYGxpc3RgIE5hbWUgb3IgYXJyYXkgb2YgcnVsZSBuYW1lcyB0byBlbmFibGVcbiAqIEBwYXJhbSAge0Jvb2xlYW59IGBzdHJpY3RgIElmIGB0cnVlYCwgYWxsIG5vbiBsaXN0ZWQgcnVsZXMgd2lsbCBiZSBkaXNhYmxlZC5cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJ1bGVyLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAobGlzdCwgc3RyaWN0KSB7XG4gIGxpc3QgPSAhQXJyYXkuaXNBcnJheShsaXN0KVxuICAgID8gWyBsaXN0IF1cbiAgICA6IGxpc3Q7XG5cbiAgLy8gSW4gc3RyaWN0IG1vZGUgZGlzYWJsZSBhbGwgZXhpc3RpbmcgcnVsZXMgZmlyc3RcbiAgaWYgKHN0cmljdCkge1xuICAgIHRoaXMuX19ydWxlc19fLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgIHJ1bGUuZW5hYmxlZCA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gU2VhcmNoIGJ5IG5hbWUgYW5kIGVuYWJsZVxuICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgaWR4ID0gdGhpcy5fX2ZpbmRfXyhuYW1lKTtcbiAgICBpZiAoaWR4IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdWxlcyBtYW5hZ2VyOiBpbnZhbGlkIHJ1bGUgbmFtZSAnICsgbmFtZSk7XG4gICAgfVxuICAgIHRoaXMuX19ydWxlc19fW2lkeF0uZW5hYmxlZCA9IHRydWU7XG4gIH0sIHRoaXMpO1xuXG4gIHRoaXMuX19jYWNoZV9fID0gbnVsbDtcbn07XG5cblxuLyoqXG4gKiBEaXNhYmxlIGEgcnVsZSBvciBsaXN0IG9mIHJ1bGVzLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ3xBcnJheX0gYGxpc3RgIE5hbWUgb3IgYXJyYXkgb2YgcnVsZSBuYW1lcyB0byBkaXNhYmxlXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SdWxlci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gIGxpc3QgPSAhQXJyYXkuaXNBcnJheShsaXN0KVxuICAgID8gWyBsaXN0IF1cbiAgICA6IGxpc3Q7XG5cbiAgLy8gU2VhcmNoIGJ5IG5hbWUgYW5kIGRpc2FibGVcbiAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX19maW5kX18obmFtZSk7XG4gICAgaWYgKGlkeCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUnVsZXMgbWFuYWdlcjogaW52YWxpZCBydWxlIG5hbWUgJyArIG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLl9fcnVsZXNfX1tpZHhdLmVuYWJsZWQgPSBmYWxzZTtcbiAgfSwgdGhpcyk7XG5cbiAgdGhpcy5fX2NhY2hlX18gPSBudWxsO1xufTtcblxuLyoqXG4gKiBHZXQgYSBydWxlcyBsaXN0IGFzIGFuIGFycmF5IG9mIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBjaGFpbk5hbWVgXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SdWxlci5wcm90b3R5cGUuZ2V0UnVsZXMgPSBmdW5jdGlvbiAoY2hhaW5OYW1lKSB7XG4gIGlmICh0aGlzLl9fY2FjaGVfXyA9PT0gbnVsbCkge1xuICAgIHRoaXMuX19jb21waWxlX18oKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fX2NhY2hlX19bY2hhaW5OYW1lXTtcbn07XG5cbi8qKlxuICogRXhwb3NlIGBSdWxlcmBcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJ1bGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIExvY2FsIGRlcGVuZGVuY2llc1xuICovXG5cbnZhciBoYXMgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2NvbW1vbi91dGlscycpLmhhcztcbnZhciB1bmVzY2FwZU1kICAgICAgPSByZXF1aXJlKCcuL2NvbW1vbi91dGlscycpLnVuZXNjYXBlTWQ7XG52YXIgcmVwbGFjZUVudGl0aWVzID0gcmVxdWlyZSgnLi9jb21tb24vdXRpbHMnKS5yZXBsYWNlRW50aXRpZXM7XG52YXIgZXNjYXBlSHRtbCAgICAgID0gcmVxdWlyZSgnLi9jb21tb24vdXRpbHMnKS5lc2NhcGVIdG1sO1xuXG4vKipcbiAqIFJlbmRlcmVyIHJ1bGVzIGNhY2hlXG4gKi9cblxudmFyIHJ1bGVzID0ge307XG5cbi8qKlxuICogQmxvY2txdW90ZXNcbiAqL1xuXG5ydWxlcy5ibG9ja3F1b3RlX29wZW4gPSBmdW5jdGlvbiAoLyogdG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gJzxibG9ja3F1b3RlPlxcbic7XG59O1xuXG5ydWxlcy5ibG9ja3F1b3RlX2Nsb3NlID0gZnVuY3Rpb24gKHRva2VucywgaWR4IC8qLCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuICc8L2Jsb2NrcXVvdGU+JyArIGdldEJyZWFrKHRva2VucywgaWR4KTtcbn07XG5cbi8qKlxuICogQ29kZVxuICovXG5cbnJ1bGVzLmNvZGUgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHggLyosIG9wdGlvbnMsIGVudiAqLykge1xuICBpZiAodG9rZW5zW2lkeF0uYmxvY2spIHtcbiAgICByZXR1cm4gJzxwcmU+PGNvZGU+JyArIGVzY2FwZUh0bWwodG9rZW5zW2lkeF0uY29udGVudCkgKyAnPC9jb2RlPjwvcHJlPicgKyBnZXRCcmVhayh0b2tlbnMsIGlkeCk7XG4gIH1cbiAgcmV0dXJuICc8Y29kZT4nICsgZXNjYXBlSHRtbCh0b2tlbnNbaWR4XS5jb250ZW50KSArICc8L2NvZGU+Jztcbn07XG5cbi8qKlxuICogRmVuY2VkIGNvZGUgYmxvY2tzXG4gKi9cblxucnVsZXMuZmVuY2UgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiwgaW5zdGFuY2UpIHtcbiAgdmFyIHRva2VuID0gdG9rZW5zW2lkeF07XG4gIHZhciBsYW5nQ2xhc3MgPSAnJztcbiAgdmFyIGxhbmdQcmVmaXggPSBvcHRpb25zLmxhbmdQcmVmaXg7XG4gIHZhciBsYW5nTmFtZSA9ICcnLCBmZW5jZU5hbWU7XG4gIHZhciBoaWdobGlnaHRlZDtcblxuICBpZiAodG9rZW4ucGFyYW1zKSB7XG5cbiAgICAvL1xuICAgIC8vIGBgYGZvbyBiYXJcbiAgICAvL1xuICAgIC8vIFRyeSBjdXN0b20gcmVuZGVyZXIgXCJmb29cIiBmaXJzdC4gVGhhdCB3aWxsIHNpbXBsaWZ5IG92ZXJ3cml0ZVxuICAgIC8vIGZvciBkaWFncmFtcywgbGF0ZXgsIGFuZCBhbnkgb3RoZXIgZmVuY2VkIGJsb2NrIHdpdGggY3VzdG9tIGxvb2tcbiAgICAvL1xuXG4gICAgZmVuY2VOYW1lID0gdG9rZW4ucGFyYW1zLnNwbGl0KC9cXHMrL2cpWzBdO1xuXG4gICAgaWYgKGhhcyhpbnN0YW5jZS5ydWxlcy5mZW5jZV9jdXN0b20sIGZlbmNlTmFtZSkpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5ydWxlcy5mZW5jZV9jdXN0b21bZmVuY2VOYW1lXSh0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52LCBpbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgbGFuZ05hbWUgPSBlc2NhcGVIdG1sKHJlcGxhY2VFbnRpdGllcyh1bmVzY2FwZU1kKGZlbmNlTmFtZSkpKTtcbiAgICBsYW5nQ2xhc3MgPSAnIGNsYXNzPVwiJyArIGxhbmdQcmVmaXggKyBsYW5nTmFtZSArICdcIic7XG4gIH1cblxuICBpZiAob3B0aW9ucy5oaWdobGlnaHQpIHtcbiAgICBoaWdobGlnaHRlZCA9IG9wdGlvbnMuaGlnaGxpZ2h0KHRva2VuLmNvbnRlbnQsIGxhbmdOYW1lKSB8fCBlc2NhcGVIdG1sKHRva2VuLmNvbnRlbnQpO1xuICB9IGVsc2Uge1xuICAgIGhpZ2hsaWdodGVkID0gZXNjYXBlSHRtbCh0b2tlbi5jb250ZW50KTtcbiAgfVxuXG4gIHJldHVybiAnPHByZT48Y29kZScgKyBsYW5nQ2xhc3MgKyAnPidcbiAgICAgICAgKyBoaWdobGlnaHRlZFxuICAgICAgICArICc8L2NvZGU+PC9wcmU+J1xuICAgICAgICArIGdldEJyZWFrKHRva2VucywgaWR4KTtcbn07XG5cbnJ1bGVzLmZlbmNlX2N1c3RvbSA9IHt9O1xuXG4vKipcbiAqIEhlYWRpbmdzXG4gKi9cblxucnVsZXMuaGVhZGluZ19vcGVuID0gZnVuY3Rpb24gKHRva2VucywgaWR4IC8qLCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuICc8aCcgKyB0b2tlbnNbaWR4XS5oTGV2ZWwgKyAnPic7XG59O1xucnVsZXMuaGVhZGluZ19jbG9zZSA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCAvKiwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiAnPC9oJyArIHRva2Vuc1tpZHhdLmhMZXZlbCArICc+XFxuJztcbn07XG5cbi8qKlxuICogSG9yaXpvbnRhbCBydWxlc1xuICovXG5cbnJ1bGVzLmhyID0gZnVuY3Rpb24gKHRva2VucywgaWR4LCBvcHRpb25zIC8qLCBlbnYgKi8pIHtcbiAgcmV0dXJuIChvcHRpb25zLnhodG1sT3V0ID8gJzxociAvPicgOiAnPGhyPicpICsgZ2V0QnJlYWsodG9rZW5zLCBpZHgpO1xufTtcblxuLyoqXG4gKiBCdWxsZXRzXG4gKi9cblxucnVsZXMuYnVsbGV0X2xpc3Rfb3BlbiA9IGZ1bmN0aW9uICgvKiB0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiAnPHVsPlxcbic7XG59O1xucnVsZXMuYnVsbGV0X2xpc3RfY2xvc2UgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHggLyosIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gJzwvdWw+JyArIGdldEJyZWFrKHRva2VucywgaWR4KTtcbn07XG5cbi8qKlxuICogTGlzdCBpdGVtc1xuICovXG5cbnJ1bGVzLmxpc3RfaXRlbV9vcGVuID0gZnVuY3Rpb24gKC8qIHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuICc8bGk+Jztcbn07XG5ydWxlcy5saXN0X2l0ZW1fY2xvc2UgPSBmdW5jdGlvbiAoLyogdG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gJzwvbGk+XFxuJztcbn07XG5cbi8qKlxuICogT3JkZXJlZCBsaXN0IGl0ZW1zXG4gKi9cblxucnVsZXMub3JkZXJlZF9saXN0X29wZW4gPSBmdW5jdGlvbiAodG9rZW5zLCBpZHggLyosIG9wdGlvbnMsIGVudiAqLykge1xuICB2YXIgdG9rZW4gPSB0b2tlbnNbaWR4XTtcbiAgdmFyIG9yZGVyID0gdG9rZW4ub3JkZXIgPiAxID8gJyBzdGFydD1cIicgKyB0b2tlbi5vcmRlciArICdcIicgOiAnJztcbiAgcmV0dXJuICc8b2wnICsgb3JkZXIgKyAnPlxcbic7XG59O1xucnVsZXMub3JkZXJlZF9saXN0X2Nsb3NlID0gZnVuY3Rpb24gKHRva2VucywgaWR4IC8qLCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuICc8L29sPicgKyBnZXRCcmVhayh0b2tlbnMsIGlkeCk7XG59O1xuXG4vKipcbiAqIFBhcmFncmFwaHNcbiAqL1xuXG5ydWxlcy5wYXJhZ3JhcGhfb3BlbiA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCAvKiwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiB0b2tlbnNbaWR4XS50aWdodCA/ICcnIDogJzxwPic7XG59O1xucnVsZXMucGFyYWdyYXBoX2Nsb3NlID0gZnVuY3Rpb24gKHRva2VucywgaWR4IC8qLCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgdmFyIGFkZEJyZWFrID0gISh0b2tlbnNbaWR4XS50aWdodCAmJiBpZHggJiYgdG9rZW5zW2lkeCAtIDFdLnR5cGUgPT09ICdpbmxpbmUnICYmICF0b2tlbnNbaWR4IC0gMV0uY29udGVudCk7XG4gIHJldHVybiAodG9rZW5zW2lkeF0udGlnaHQgPyAnJyA6ICc8L3A+JykgKyAoYWRkQnJlYWsgPyBnZXRCcmVhayh0b2tlbnMsIGlkeCkgOiAnJyk7XG59O1xuXG4vKipcbiAqIExpbmtzXG4gKi9cblxucnVsZXMubGlua19vcGVuID0gZnVuY3Rpb24gKHRva2VucywgaWR4LCBvcHRpb25zIC8qIGVudiAqLykge1xuICB2YXIgdGl0bGUgPSB0b2tlbnNbaWR4XS50aXRsZSA/ICgnIHRpdGxlPVwiJyArIGVzY2FwZUh0bWwocmVwbGFjZUVudGl0aWVzKHRva2Vuc1tpZHhdLnRpdGxlKSkgKyAnXCInKSA6ICcnO1xuICB2YXIgdGFyZ2V0ID0gb3B0aW9ucy5saW5rVGFyZ2V0ID8gKCcgdGFyZ2V0PVwiJyArIG9wdGlvbnMubGlua1RhcmdldCArICdcIicpIDogJyc7XG4gIHJldHVybiAnPGEgaHJlZj1cIicgKyBlc2NhcGVIdG1sKHRva2Vuc1tpZHhdLmhyZWYpICsgJ1wiJyArIHRpdGxlICsgdGFyZ2V0ICsgJz4nO1xufTtcbnJ1bGVzLmxpbmtfY2xvc2UgPSBmdW5jdGlvbiAoLyogdG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gJzwvYT4nO1xufTtcblxuLyoqXG4gKiBJbWFnZXNcbiAqL1xuXG5ydWxlcy5pbWFnZSA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCwgb3B0aW9ucyAvKiwgZW52ICovKSB7XG4gIHZhciBzcmMgPSAnIHNyYz1cIicgKyBlc2NhcGVIdG1sKHRva2Vuc1tpZHhdLnNyYykgKyAnXCInO1xuICB2YXIgdGl0bGUgPSB0b2tlbnNbaWR4XS50aXRsZSA/ICgnIHRpdGxlPVwiJyArIGVzY2FwZUh0bWwocmVwbGFjZUVudGl0aWVzKHRva2Vuc1tpZHhdLnRpdGxlKSkgKyAnXCInKSA6ICcnO1xuICB2YXIgYWx0ID0gJyBhbHQ9XCInICsgKHRva2Vuc1tpZHhdLmFsdCA/IGVzY2FwZUh0bWwocmVwbGFjZUVudGl0aWVzKHRva2Vuc1tpZHhdLmFsdCkpIDogJycpICsgJ1wiJztcbiAgdmFyIHN1ZmZpeCA9IG9wdGlvbnMueGh0bWxPdXQgPyAnIC8nIDogJyc7XG4gIHJldHVybiAnPGltZycgKyBzcmMgKyBhbHQgKyB0aXRsZSArIHN1ZmZpeCArICc+Jztcbn07XG5cbi8qKlxuICogVGFibGVzXG4gKi9cblxucnVsZXMudGFibGVfb3BlbiA9IGZ1bmN0aW9uICgvKiB0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiAnPHRhYmxlPlxcbic7XG59O1xucnVsZXMudGFibGVfY2xvc2UgPSBmdW5jdGlvbiAoLyogdG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gJzwvdGFibGU+XFxuJztcbn07XG5ydWxlcy50aGVhZF9vcGVuID0gZnVuY3Rpb24gKC8qIHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuICc8dGhlYWQ+XFxuJztcbn07XG5ydWxlcy50aGVhZF9jbG9zZSA9IGZ1bmN0aW9uICgvKiB0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiAnPC90aGVhZD5cXG4nO1xufTtcbnJ1bGVzLnRib2R5X29wZW4gPSBmdW5jdGlvbiAoLyogdG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gJzx0Ym9keT5cXG4nO1xufTtcbnJ1bGVzLnRib2R5X2Nsb3NlID0gZnVuY3Rpb24gKC8qIHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuICc8L3Rib2R5Plxcbic7XG59O1xucnVsZXMudHJfb3BlbiA9IGZ1bmN0aW9uICgvKiB0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiAnPHRyPic7XG59O1xucnVsZXMudHJfY2xvc2UgPSBmdW5jdGlvbiAoLyogdG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gJzwvdHI+XFxuJztcbn07XG5ydWxlcy50aF9vcGVuID0gZnVuY3Rpb24gKHRva2VucywgaWR4IC8qLCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgdmFyIHRva2VuID0gdG9rZW5zW2lkeF07XG4gIHJldHVybiAnPHRoJ1xuICAgICsgKHRva2VuLmFsaWduID8gJyBzdHlsZT1cInRleHQtYWxpZ246JyArIHRva2VuLmFsaWduICsgJ1wiJyA6ICcnKVxuICAgICsgJz4nO1xufTtcbnJ1bGVzLnRoX2Nsb3NlID0gZnVuY3Rpb24gKC8qIHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuICc8L3RoPic7XG59O1xucnVsZXMudGRfb3BlbiA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCAvKiwgb3B0aW9ucywgZW52ICovKSB7XG4gIHZhciB0b2tlbiA9IHRva2Vuc1tpZHhdO1xuICByZXR1cm4gJzx0ZCdcbiAgICArICh0b2tlbi5hbGlnbiA/ICcgc3R5bGU9XCJ0ZXh0LWFsaWduOicgKyB0b2tlbi5hbGlnbiArICdcIicgOiAnJylcbiAgICArICc+Jztcbn07XG5ydWxlcy50ZF9jbG9zZSA9IGZ1bmN0aW9uICgvKiB0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiAnPC90ZD4nO1xufTtcblxuLyoqXG4gKiBCb2xkXG4gKi9cblxucnVsZXMuc3Ryb25nX29wZW4gPSBmdW5jdGlvbiAoLyogdG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gJzxzdHJvbmc+Jztcbn07XG5ydWxlcy5zdHJvbmdfY2xvc2UgPSBmdW5jdGlvbiAoLyogdG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gJzwvc3Ryb25nPic7XG59O1xuXG4vKipcbiAqIEl0YWxpY2l6ZVxuICovXG5cbnJ1bGVzLmVtX29wZW4gPSBmdW5jdGlvbiAoLyogdG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gJzxlbT4nO1xufTtcbnJ1bGVzLmVtX2Nsb3NlID0gZnVuY3Rpb24gKC8qIHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuICc8L2VtPic7XG59O1xuXG4vKipcbiAqIFN0cmlrZXRocm91Z2hcbiAqL1xuXG5ydWxlcy5kZWxfb3BlbiA9IGZ1bmN0aW9uICgvKiB0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiAnPGRlbD4nO1xufTtcbnJ1bGVzLmRlbF9jbG9zZSA9IGZ1bmN0aW9uICgvKiB0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiAnPC9kZWw+Jztcbn07XG5cbi8qKlxuICogSW5zZXJ0XG4gKi9cblxucnVsZXMuaW5zX29wZW4gPSBmdW5jdGlvbiAoLyogdG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gJzxpbnM+Jztcbn07XG5ydWxlcy5pbnNfY2xvc2UgPSBmdW5jdGlvbiAoLyogdG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gJzwvaW5zPic7XG59O1xuXG4vKipcbiAqIEhpZ2hsaWdodFxuICovXG5cbnJ1bGVzLm1hcmtfb3BlbiA9IGZ1bmN0aW9uICgvKiB0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiAnPG1hcms+Jztcbn07XG5ydWxlcy5tYXJrX2Nsb3NlID0gZnVuY3Rpb24gKC8qIHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuICc8L21hcms+Jztcbn07XG5cbi8qKlxuICogU3VwZXItIGFuZCBzdWItc2NyaXB0XG4gKi9cblxucnVsZXMuc3ViID0gZnVuY3Rpb24gKHRva2VucywgaWR4IC8qLCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuICc8c3ViPicgKyBlc2NhcGVIdG1sKHRva2Vuc1tpZHhdLmNvbnRlbnQpICsgJzwvc3ViPic7XG59O1xucnVsZXMuc3VwID0gZnVuY3Rpb24gKHRva2VucywgaWR4IC8qLCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuICc8c3VwPicgKyBlc2NhcGVIdG1sKHRva2Vuc1tpZHhdLmNvbnRlbnQpICsgJzwvc3VwPic7XG59O1xuXG4vKipcbiAqIEJyZWFrc1xuICovXG5cbnJ1bGVzLmhhcmRicmVhayA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCwgb3B0aW9ucyAvKiwgZW52ICovKSB7XG4gIHJldHVybiBvcHRpb25zLnhodG1sT3V0ID8gJzxiciAvPlxcbicgOiAnPGJyPlxcbic7XG59O1xucnVsZXMuc29mdGJyZWFrID0gZnVuY3Rpb24gKHRva2VucywgaWR4LCBvcHRpb25zIC8qLCBlbnYgKi8pIHtcbiAgcmV0dXJuIG9wdGlvbnMuYnJlYWtzID8gKG9wdGlvbnMueGh0bWxPdXQgPyAnPGJyIC8+XFxuJyA6ICc8YnI+XFxuJykgOiAnXFxuJztcbn07XG5cbi8qKlxuICogVGV4dFxuICovXG5cbnJ1bGVzLnRleHQgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHggLyosIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gZXNjYXBlSHRtbCh0b2tlbnNbaWR4XS5jb250ZW50KTtcbn07XG5cbi8qKlxuICogQ29udGVudFxuICovXG5cbnJ1bGVzLmh0bWxibG9jayA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCAvKiwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiB0b2tlbnNbaWR4XS5jb250ZW50O1xufTtcbnJ1bGVzLmh0bWx0YWcgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHggLyosIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gdG9rZW5zW2lkeF0uY29udGVudDtcbn07XG5cbi8qKlxuICogQWJicmV2aWF0aW9ucywgaW5pdGlhbGlzbVxuICovXG5cbnJ1bGVzLmFiYnJfb3BlbiA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCAvKiwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiAnPGFiYnIgdGl0bGU9XCInICsgZXNjYXBlSHRtbChyZXBsYWNlRW50aXRpZXModG9rZW5zW2lkeF0udGl0bGUpKSArICdcIj4nO1xufTtcbnJ1bGVzLmFiYnJfY2xvc2UgPSBmdW5jdGlvbiAoLyogdG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gJzwvYWJicj4nO1xufTtcblxuLyoqXG4gKiBGb290bm90ZXNcbiAqL1xuXG5ydWxlcy5mb290bm90ZV9yZWYgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHgpIHtcbiAgdmFyIG4gPSBOdW1iZXIodG9rZW5zW2lkeF0uaWQgKyAxKS50b1N0cmluZygpO1xuICB2YXIgaWQgPSAnZm5yZWYnICsgbjtcbiAgaWYgKHRva2Vuc1tpZHhdLnN1YklkID4gMCkge1xuICAgIGlkICs9ICc6JyArIHRva2Vuc1tpZHhdLnN1YklkO1xuICB9XG4gIHJldHVybiAnPHN1cCBjbGFzcz1cImZvb3Rub3RlLXJlZlwiPjxhIGhyZWY9XCIjZm4nICsgbiArICdcIiBpZD1cIicgKyBpZCArICdcIj5bJyArIG4gKyAnXTwvYT48L3N1cD4nO1xufTtcbnJ1bGVzLmZvb3Rub3RlX2Jsb2NrX29wZW4gPSBmdW5jdGlvbiAodG9rZW5zLCBpZHgsIG9wdGlvbnMpIHtcbiAgdmFyIGhyID0gb3B0aW9ucy54aHRtbE91dFxuICAgID8gJzxociBjbGFzcz1cImZvb3Rub3Rlcy1zZXBcIiAvPlxcbidcbiAgICA6ICc8aHIgY2xhc3M9XCJmb290bm90ZXMtc2VwXCI+XFxuJztcbiAgcmV0dXJuICBociArICc8c2VjdGlvbiBjbGFzcz1cImZvb3Rub3Rlc1wiPlxcbjxvbCBjbGFzcz1cImZvb3Rub3Rlcy1saXN0XCI+XFxuJztcbn07XG5ydWxlcy5mb290bm90ZV9ibG9ja19jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICc8L29sPlxcbjwvc2VjdGlvbj5cXG4nO1xufTtcbnJ1bGVzLmZvb3Rub3RlX29wZW4gPSBmdW5jdGlvbiAodG9rZW5zLCBpZHgpIHtcbiAgdmFyIGlkID0gTnVtYmVyKHRva2Vuc1tpZHhdLmlkICsgMSkudG9TdHJpbmcoKTtcbiAgcmV0dXJuICc8bGkgaWQ9XCJmbicgKyBpZCArICdcIiAgY2xhc3M9XCJmb290bm90ZS1pdGVtXCI+Jztcbn07XG5ydWxlcy5mb290bm90ZV9jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICc8L2xpPlxcbic7XG59O1xucnVsZXMuZm9vdG5vdGVfYW5jaG9yID0gZnVuY3Rpb24gKHRva2VucywgaWR4KSB7XG4gIHZhciBuID0gTnVtYmVyKHRva2Vuc1tpZHhdLmlkICsgMSkudG9TdHJpbmcoKTtcbiAgdmFyIGlkID0gJ2ZucmVmJyArIG47XG4gIGlmICh0b2tlbnNbaWR4XS5zdWJJZCA+IDApIHtcbiAgICBpZCArPSAnOicgKyB0b2tlbnNbaWR4XS5zdWJJZDtcbiAgfVxuICByZXR1cm4gJyA8YSBocmVmPVwiIycgKyBpZCArICdcIiBjbGFzcz1cImZvb3Rub3RlLWJhY2tyZWZcIj7ihqk8L2E+Jztcbn07XG5cbi8qKlxuICogRGVmaW5pdGlvbiBsaXN0c1xuICovXG5cbnJ1bGVzLmRsX29wZW4gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICc8ZGw+XFxuJztcbn07XG5ydWxlcy5kdF9vcGVuID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnPGR0Pic7XG59O1xucnVsZXMuZGRfb3BlbiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gJzxkZD4nO1xufTtcbnJ1bGVzLmRsX2Nsb3NlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnPC9kbD5cXG4nO1xufTtcbnJ1bGVzLmR0X2Nsb3NlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnPC9kdD5cXG4nO1xufTtcbnJ1bGVzLmRkX2Nsb3NlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnPC9kZD5cXG4nO1xufTtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zXG4gKi9cblxuZnVuY3Rpb24gbmV4dFRva2VuKHRva2VucywgaWR4KSB7XG4gIGlmICgrK2lkeCA+PSB0b2tlbnMubGVuZ3RoIC0gMikge1xuICAgIHJldHVybiBpZHg7XG4gIH1cbiAgaWYgKCh0b2tlbnNbaWR4XS50eXBlID09PSAncGFyYWdyYXBoX29wZW4nICYmIHRva2Vuc1tpZHhdLnRpZ2h0KSAmJlxuICAgICAgKHRva2Vuc1tpZHggKyAxXS50eXBlID09PSAnaW5saW5lJyAmJiB0b2tlbnNbaWR4ICsgMV0uY29udGVudC5sZW5ndGggPT09IDApICYmXG4gICAgICAodG9rZW5zW2lkeCArIDJdLnR5cGUgPT09ICdwYXJhZ3JhcGhfY2xvc2UnICYmIHRva2Vuc1tpZHggKyAyXS50aWdodCkpIHtcbiAgICByZXR1cm4gbmV4dFRva2VuKHRva2VucywgaWR4ICsgMik7XG4gIH1cbiAgcmV0dXJuIGlkeDtcbn1cblxuLyoqXG4gKiBDaGVjayB0byBzZWUgaWYgYFxcbmAgaXMgbmVlZGVkIGJlZm9yZSB0aGUgbmV4dCB0b2tlbi5cbiAqXG4gKiBAcGFyYW0gIHtBcnJheX0gYHRva2Vuc2BcbiAqIEBwYXJhbSAge051bWJlcn0gYGlkeGBcbiAqIEByZXR1cm4ge1N0cmluZ30gRW1wdHkgc3RyaW5nIG9yIG5ld2xpbmVcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbnZhciBnZXRCcmVhayA9IHJ1bGVzLmdldEJyZWFrID0gZnVuY3Rpb24gZ2V0QnJlYWsodG9rZW5zLCBpZHgpIHtcbiAgaWR4ID0gbmV4dFRva2VuKHRva2VucywgaWR4KTtcbiAgaWYgKGlkeCA8IHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW2lkeF0udHlwZSA9PT0gJ2xpc3RfaXRlbV9jbG9zZScpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuICdcXG4nO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgYHJ1bGVzYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcnVsZXM7XG4iLCIvLyBCbG9jayBxdW90ZXNcblxuJ3VzZSBzdHJpY3QnO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmxvY2txdW90ZShzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLCBzaWxlbnQpIHtcbiAgdmFyIG5leHRMaW5lLCBsYXN0TGluZUVtcHR5LCBvbGRUU2hpZnQsIG9sZEJNYXJrcywgb2xkSW5kZW50LCBvbGRQYXJlbnRUeXBlLCBsaW5lcyxcbiAgICAgIHRlcm1pbmF0b3JSdWxlcyxcbiAgICAgIGksIGwsIHRlcm1pbmF0ZSxcbiAgICAgIHBvcyA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV0sXG4gICAgICBtYXggPSBzdGF0ZS5lTWFya3Nbc3RhcnRMaW5lXTtcblxuICBpZiAocG9zID4gbWF4KSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIC8vIGNoZWNrIHRoZSBibG9jayBxdW90ZSBtYXJrZXJcbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKSAhPT0gMHgzRS8qID4gKi8pIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgaWYgKHN0YXRlLmxldmVsID49IHN0YXRlLm9wdGlvbnMubWF4TmVzdGluZykgeyByZXR1cm4gZmFsc2U7IH1cblxuICAvLyB3ZSBrbm93IHRoYXQgaXQncyBnb2luZyB0byBiZSBhIHZhbGlkIGJsb2NrcXVvdGUsXG4gIC8vIHNvIG5vIHBvaW50IHRyeWluZyB0byBmaW5kIHRoZSBlbmQgb2YgaXQgaW4gc2lsZW50IG1vZGVcbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZTsgfVxuXG4gIC8vIHNraXAgb25lIG9wdGlvbmFsIHNwYWNlIGFmdGVyICc+J1xuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgyMCkgeyBwb3MrKzsgfVxuXG4gIG9sZEluZGVudCA9IHN0YXRlLmJsa0luZGVudDtcbiAgc3RhdGUuYmxrSW5kZW50ID0gMDtcblxuICBvbGRCTWFya3MgPSBbIHN0YXRlLmJNYXJrc1tzdGFydExpbmVdIF07XG4gIHN0YXRlLmJNYXJrc1tzdGFydExpbmVdID0gcG9zO1xuXG4gIC8vIGNoZWNrIGlmIHdlIGhhdmUgYW4gZW1wdHkgYmxvY2txdW90ZVxuICBwb3MgPSBwb3MgPCBtYXggPyBzdGF0ZS5za2lwU3BhY2VzKHBvcykgOiBwb3M7XG4gIGxhc3RMaW5lRW1wdHkgPSBwb3MgPj0gbWF4O1xuXG4gIG9sZFRTaGlmdCA9IFsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV0gXTtcbiAgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV0gPSBwb3MgLSBzdGF0ZS5iTWFya3Nbc3RhcnRMaW5lXTtcblxuICB0ZXJtaW5hdG9yUnVsZXMgPSBzdGF0ZS5wYXJzZXIucnVsZXIuZ2V0UnVsZXMoJ2Jsb2NrcXVvdGUnKTtcblxuICAvLyBTZWFyY2ggdGhlIGVuZCBvZiB0aGUgYmxvY2tcbiAgLy9cbiAgLy8gQmxvY2sgZW5kcyB3aXRoIGVpdGhlcjpcbiAgLy8gIDEuIGFuIGVtcHR5IGxpbmUgb3V0c2lkZTpcbiAgLy8gICAgIGBgYFxuICAvLyAgICAgPiB0ZXN0XG4gIC8vXG4gIC8vICAgICBgYGBcbiAgLy8gIDIuIGFuIGVtcHR5IGxpbmUgaW5zaWRlOlxuICAvLyAgICAgYGBgXG4gIC8vICAgICA+XG4gIC8vICAgICB0ZXN0XG4gIC8vICAgICBgYGBcbiAgLy8gIDMuIGFub3RoZXIgdGFnXG4gIC8vICAgICBgYGBcbiAgLy8gICAgID4gdGVzdFxuICAvLyAgICAgIC0gLSAtXG4gIC8vICAgICBgYGBcbiAgZm9yIChuZXh0TGluZSA9IHN0YXJ0TGluZSArIDE7IG5leHRMaW5lIDwgZW5kTGluZTsgbmV4dExpbmUrKykge1xuICAgIHBvcyA9IHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdO1xuICAgIG1heCA9IHN0YXRlLmVNYXJrc1tuZXh0TGluZV07XG5cbiAgICBpZiAocG9zID49IG1heCkge1xuICAgICAgLy8gQ2FzZSAxOiBsaW5lIGlzIG5vdCBpbnNpZGUgdGhlIGJsb2NrcXVvdGUsIGFuZCB0aGlzIGxpbmUgaXMgZW1wdHkuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKyspID09PSAweDNFLyogPiAqLykge1xuICAgICAgLy8gVGhpcyBsaW5lIGlzIGluc2lkZSB0aGUgYmxvY2txdW90ZS5cblxuICAgICAgLy8gc2tpcCBvbmUgb3B0aW9uYWwgc3BhY2UgYWZ0ZXIgJz4nXG4gICAgICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgyMCkgeyBwb3MrKzsgfVxuXG4gICAgICBvbGRCTWFya3MucHVzaChzdGF0ZS5iTWFya3NbbmV4dExpbmVdKTtcbiAgICAgIHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gPSBwb3M7XG5cbiAgICAgIHBvcyA9IHBvcyA8IG1heCA/IHN0YXRlLnNraXBTcGFjZXMocG9zKSA6IHBvcztcbiAgICAgIGxhc3RMaW5lRW1wdHkgPSBwb3MgPj0gbWF4O1xuXG4gICAgICBvbGRUU2hpZnQucHVzaChzdGF0ZS50U2hpZnRbbmV4dExpbmVdKTtcbiAgICAgIHN0YXRlLnRTaGlmdFtuZXh0TGluZV0gPSBwb3MgLSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gQ2FzZSAyOiBsaW5lIGlzIG5vdCBpbnNpZGUgdGhlIGJsb2NrcXVvdGUsIGFuZCB0aGUgbGFzdCBsaW5lIHdhcyBlbXB0eS5cbiAgICBpZiAobGFzdExpbmVFbXB0eSkgeyBicmVhazsgfVxuXG4gICAgLy8gQ2FzZSAzOiBhbm90aGVyIHRhZyBmb3VuZC5cbiAgICB0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICBmb3IgKGkgPSAwLCBsID0gdGVybWluYXRvclJ1bGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKHRlcm1pbmF0b3JSdWxlc1tpXShzdGF0ZSwgbmV4dExpbmUsIGVuZExpbmUsIHRydWUpKSB7XG4gICAgICAgIHRlcm1pbmF0ZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGVybWluYXRlKSB7IGJyZWFrOyB9XG5cbiAgICBvbGRCTWFya3MucHVzaChzdGF0ZS5iTWFya3NbbmV4dExpbmVdKTtcbiAgICBvbGRUU2hpZnQucHVzaChzdGF0ZS50U2hpZnRbbmV4dExpbmVdKTtcblxuICAgIC8vIEEgbmVnYXRpdmUgbnVtYmVyIG1lYW5zIHRoYXQgdGhpcyBpcyBhIHBhcmFncmFwaCBjb250aW51YXRpb247XG4gICAgLy9cbiAgICAvLyBBbnkgbmVnYXRpdmUgbnVtYmVyIHdpbGwgZG8gdGhlIGpvYiBoZXJlLCBidXQgaXQncyBiZXR0ZXIgZm9yIGl0XG4gICAgLy8gdG8gYmUgbGFyZ2UgZW5vdWdoIHRvIG1ha2UgYW55IGJ1Z3Mgb2J2aW91cy5cbiAgICBzdGF0ZS50U2hpZnRbbmV4dExpbmVdID0gLTEzMzc7XG4gIH1cblxuICBvbGRQYXJlbnRUeXBlID0gc3RhdGUucGFyZW50VHlwZTtcbiAgc3RhdGUucGFyZW50VHlwZSA9ICdibG9ja3F1b3RlJztcbiAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgIHR5cGU6ICdibG9ja3F1b3RlX29wZW4nLFxuICAgIGxpbmVzOiBsaW5lcyA9IFsgc3RhcnRMaW5lLCAwIF0sXG4gICAgbGV2ZWw6IHN0YXRlLmxldmVsKytcbiAgfSk7XG4gIHN0YXRlLnBhcnNlci50b2tlbml6ZShzdGF0ZSwgc3RhcnRMaW5lLCBuZXh0TGluZSk7XG4gIHN0YXRlLnRva2Vucy5wdXNoKHtcbiAgICB0eXBlOiAnYmxvY2txdW90ZV9jbG9zZScsXG4gICAgbGV2ZWw6IC0tc3RhdGUubGV2ZWxcbiAgfSk7XG4gIHN0YXRlLnBhcmVudFR5cGUgPSBvbGRQYXJlbnRUeXBlO1xuICBsaW5lc1sxXSA9IHN0YXRlLmxpbmU7XG5cbiAgLy8gUmVzdG9yZSBvcmlnaW5hbCB0U2hpZnQ7IHRoaXMgbWlnaHQgbm90IGJlIG5lY2Vzc2FyeSBzaW5jZSB0aGUgcGFyc2VyXG4gIC8vIGhhcyBhbHJlYWR5IGJlZW4gaGVyZSwgYnV0IGp1c3QgdG8gbWFrZSBzdXJlIHdlIGNhbiBkbyB0aGF0LlxuICBmb3IgKGkgPSAwOyBpIDwgb2xkVFNoaWZ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgc3RhdGUuYk1hcmtzW2kgKyBzdGFydExpbmVdID0gb2xkQk1hcmtzW2ldO1xuICAgIHN0YXRlLnRTaGlmdFtpICsgc3RhcnRMaW5lXSA9IG9sZFRTaGlmdFtpXTtcbiAgfVxuICBzdGF0ZS5ibGtJbmRlbnQgPSBvbGRJbmRlbnQ7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiLy8gQ29kZSBibG9jayAoNCBzcGFjZXMgcGFkZGVkKVxuXG4ndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb2RlKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUvKiwgc2lsZW50Ki8pIHtcbiAgdmFyIG5leHRMaW5lLCBsYXN0O1xuXG4gIGlmIChzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA8IDQpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgbGFzdCA9IG5leHRMaW5lID0gc3RhcnRMaW5lICsgMTtcblxuICB3aGlsZSAobmV4dExpbmUgPCBlbmRMaW5lKSB7XG4gICAgaWYgKHN0YXRlLmlzRW1wdHkobmV4dExpbmUpKSB7XG4gICAgICBuZXh0TGluZSsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChzdGF0ZS50U2hpZnRbbmV4dExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHtcbiAgICAgIG5leHRMaW5lKys7XG4gICAgICBsYXN0ID0gbmV4dExpbmU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIH1cblxuICBzdGF0ZS5saW5lID0gbmV4dExpbmU7XG4gIHN0YXRlLnRva2Vucy5wdXNoKHtcbiAgICB0eXBlOiAnY29kZScsXG4gICAgY29udGVudDogc3RhdGUuZ2V0TGluZXMoc3RhcnRMaW5lLCBsYXN0LCA0ICsgc3RhdGUuYmxrSW5kZW50LCB0cnVlKSxcbiAgICBibG9jazogdHJ1ZSxcbiAgICBsaW5lczogWyBzdGFydExpbmUsIHN0YXRlLmxpbmUgXSxcbiAgICBsZXZlbDogc3RhdGUubGV2ZWxcbiAgfSk7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiLy8gRGVmaW5pdGlvbiBsaXN0c1xuXG4ndXNlIHN0cmljdCc7XG5cblxuLy8gU2VhcmNoIGBbOn5dW1xcbiBdYCwgcmV0dXJucyBuZXh0IHBvcyBhZnRlciBtYXJrZXIgb24gc3VjY2Vzc1xuLy8gb3IgLTEgb24gZmFpbC5cbmZ1bmN0aW9uIHNraXBNYXJrZXIoc3RhdGUsIGxpbmUpIHtcbiAgdmFyIHBvcywgbWFya2VyLFxuICAgICAgc3RhcnQgPSBzdGF0ZS5iTWFya3NbbGluZV0gKyBzdGF0ZS50U2hpZnRbbGluZV0sXG4gICAgICBtYXggPSBzdGF0ZS5lTWFya3NbbGluZV07XG5cbiAgaWYgKHN0YXJ0ID49IG1heCkgeyByZXR1cm4gLTE7IH1cblxuICAvLyBDaGVjayBidWxsZXRcbiAgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhcnQrKyk7XG4gIGlmIChtYXJrZXIgIT09IDB4N0UvKiB+ICovICYmIG1hcmtlciAhPT0gMHgzQS8qIDogKi8pIHsgcmV0dXJuIC0xOyB9XG5cbiAgcG9zID0gc3RhdGUuc2tpcFNwYWNlcyhzdGFydCk7XG5cbiAgLy8gcmVxdWlyZSBzcGFjZSBhZnRlciBcIjpcIlxuICBpZiAoc3RhcnQgPT09IHBvcykgeyByZXR1cm4gLTE7IH1cblxuICAvLyBubyBlbXB0eSBkZWZpbml0aW9ucywgZS5nLiBcIiAgOiBcIlxuICBpZiAocG9zID49IG1heCkgeyByZXR1cm4gLTE7IH1cblxuICByZXR1cm4gcG9zO1xufVxuXG5mdW5jdGlvbiBtYXJrVGlnaHRQYXJhZ3JhcGhzKHN0YXRlLCBpZHgpIHtcbiAgdmFyIGksIGwsXG4gICAgICBsZXZlbCA9IHN0YXRlLmxldmVsICsgMjtcblxuICBmb3IgKGkgPSBpZHggKyAyLCBsID0gc3RhdGUudG9rZW5zLmxlbmd0aCAtIDI7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoc3RhdGUudG9rZW5zW2ldLmxldmVsID09PSBsZXZlbCAmJiBzdGF0ZS50b2tlbnNbaV0udHlwZSA9PT0gJ3BhcmFncmFwaF9vcGVuJykge1xuICAgICAgc3RhdGUudG9rZW5zW2kgKyAyXS50aWdodCA9IHRydWU7XG4gICAgICBzdGF0ZS50b2tlbnNbaV0udGlnaHQgPSB0cnVlO1xuICAgICAgaSArPSAyO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmxpc3Qoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSwgc2lsZW50KSB7XG4gIHZhciBjb250ZW50U3RhcnQsXG4gICAgICBkZExpbmUsXG4gICAgICBkdExpbmUsXG4gICAgICBpdGVtTGluZXMsXG4gICAgICBsaXN0TGluZXMsXG4gICAgICBsaXN0VG9rSWR4LFxuICAgICAgbmV4dExpbmUsXG4gICAgICBvbGRJbmRlbnQsXG4gICAgICBvbGREREluZGVudCxcbiAgICAgIG9sZFBhcmVudFR5cGUsXG4gICAgICBvbGRUU2hpZnQsXG4gICAgICBvbGRUaWdodCxcbiAgICAgIHByZXZFbXB0eUVuZCxcbiAgICAgIHRpZ2h0O1xuXG4gIGlmIChzaWxlbnQpIHtcbiAgICAvLyBxdWlyazogdmFsaWRhdGlvbiBtb2RlIHZhbGlkYXRlcyBhIGRkIGJsb2NrIG9ubHksIG5vdCBhIHdob2xlIGRlZmxpc3RcbiAgICBpZiAoc3RhdGUuZGRJbmRlbnQgPCAwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiBza2lwTWFya2VyKHN0YXRlLCBzdGFydExpbmUpID49IDA7XG4gIH1cblxuICBuZXh0TGluZSA9IHN0YXJ0TGluZSArIDE7XG4gIGlmIChzdGF0ZS5pc0VtcHR5KG5leHRMaW5lKSkge1xuICAgIGlmICgrK25leHRMaW5lID4gZW5kTGluZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgfVxuXG4gIGlmIChzdGF0ZS50U2hpZnRbbmV4dExpbmVdIDwgc3RhdGUuYmxrSW5kZW50KSB7IHJldHVybiBmYWxzZTsgfVxuICBjb250ZW50U3RhcnQgPSBza2lwTWFya2VyKHN0YXRlLCBuZXh0TGluZSk7XG4gIGlmIChjb250ZW50U3RhcnQgPCAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIGlmIChzdGF0ZS5sZXZlbCA+PSBzdGF0ZS5vcHRpb25zLm1heE5lc3RpbmcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgLy8gU3RhcnQgbGlzdFxuICBsaXN0VG9rSWR4ID0gc3RhdGUudG9rZW5zLmxlbmd0aDtcblxuICBzdGF0ZS50b2tlbnMucHVzaCh7XG4gICAgdHlwZTogJ2RsX29wZW4nLFxuICAgIGxpbmVzOiBsaXN0TGluZXMgPSBbIHN0YXJ0TGluZSwgMCBdLFxuICAgIGxldmVsOiBzdGF0ZS5sZXZlbCsrXG4gIH0pO1xuXG4gIC8vXG4gIC8vIEl0ZXJhdGUgbGlzdCBpdGVtc1xuICAvL1xuXG4gIGR0TGluZSA9IHN0YXJ0TGluZTtcbiAgZGRMaW5lID0gbmV4dExpbmU7XG5cbiAgLy8gT25lIGRlZmluaXRpb24gbGlzdCBjYW4gY29udGFpbiBtdWx0aXBsZSBEVHMsXG4gIC8vIGFuZCBvbmUgRFQgY2FuIGJlIGZvbGxvd2VkIGJ5IG11bHRpcGxlIEREcy5cbiAgLy9cbiAgLy8gVGh1cywgdGhlcmUgaXMgdHdvIGxvb3BzIGhlcmUsIGFuZCBsYWJlbCBpc1xuICAvLyBuZWVkZWQgdG8gYnJlYWsgb3V0IG9mIHRoZSBzZWNvbmQgb25lXG4gIC8vXG4gIC8qZXNsaW50IG5vLWxhYmVsczowLGJsb2NrLXNjb3BlZC12YXI6MCovXG4gIE9VVEVSOlxuICBmb3IgKDs7KSB7XG4gICAgdGlnaHQgPSB0cnVlO1xuICAgIHByZXZFbXB0eUVuZCA9IGZhbHNlO1xuXG4gICAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgICAgdHlwZTogJ2R0X29wZW4nLFxuICAgICAgbGluZXM6IFsgZHRMaW5lLCBkdExpbmUgXSxcbiAgICAgIGxldmVsOiBzdGF0ZS5sZXZlbCsrXG4gICAgfSk7XG4gICAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgICAgdHlwZTogJ2lubGluZScsXG4gICAgICBjb250ZW50OiBzdGF0ZS5nZXRMaW5lcyhkdExpbmUsIGR0TGluZSArIDEsIHN0YXRlLmJsa0luZGVudCwgZmFsc2UpLnRyaW0oKSxcbiAgICAgIGxldmVsOiBzdGF0ZS5sZXZlbCArIDEsXG4gICAgICBsaW5lczogWyBkdExpbmUsIGR0TGluZSBdLFxuICAgICAgY2hpbGRyZW46IFtdXG4gICAgfSk7XG4gICAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgICAgdHlwZTogJ2R0X2Nsb3NlJyxcbiAgICAgIGxldmVsOiAtLXN0YXRlLmxldmVsXG4gICAgfSk7XG5cbiAgICBmb3IgKDs7KSB7XG4gICAgICBzdGF0ZS50b2tlbnMucHVzaCh7XG4gICAgICAgIHR5cGU6ICdkZF9vcGVuJyxcbiAgICAgICAgbGluZXM6IGl0ZW1MaW5lcyA9IFsgbmV4dExpbmUsIDAgXSxcbiAgICAgICAgbGV2ZWw6IHN0YXRlLmxldmVsKytcbiAgICAgIH0pO1xuXG4gICAgICBvbGRUaWdodCA9IHN0YXRlLnRpZ2h0O1xuICAgICAgb2xkRERJbmRlbnQgPSBzdGF0ZS5kZEluZGVudDtcbiAgICAgIG9sZEluZGVudCA9IHN0YXRlLmJsa0luZGVudDtcbiAgICAgIG9sZFRTaGlmdCA9IHN0YXRlLnRTaGlmdFtkZExpbmVdO1xuICAgICAgb2xkUGFyZW50VHlwZSA9IHN0YXRlLnBhcmVudFR5cGU7XG4gICAgICBzdGF0ZS5ibGtJbmRlbnQgPSBzdGF0ZS5kZEluZGVudCA9IHN0YXRlLnRTaGlmdFtkZExpbmVdICsgMjtcbiAgICAgIHN0YXRlLnRTaGlmdFtkZExpbmVdID0gY29udGVudFN0YXJ0IC0gc3RhdGUuYk1hcmtzW2RkTGluZV07XG4gICAgICBzdGF0ZS50aWdodCA9IHRydWU7XG4gICAgICBzdGF0ZS5wYXJlbnRUeXBlID0gJ2RlZmxpc3QnO1xuXG4gICAgICBzdGF0ZS5wYXJzZXIudG9rZW5pemUoc3RhdGUsIGRkTGluZSwgZW5kTGluZSwgdHJ1ZSk7XG5cbiAgICAgIC8vIElmIGFueSBvZiBsaXN0IGl0ZW0gaXMgdGlnaHQsIG1hcmsgbGlzdCBhcyB0aWdodFxuICAgICAgaWYgKCFzdGF0ZS50aWdodCB8fCBwcmV2RW1wdHlFbmQpIHtcbiAgICAgICAgdGlnaHQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEl0ZW0gYmVjb21lIGxvb3NlIGlmIGZpbmlzaCB3aXRoIGVtcHR5IGxpbmUsXG4gICAgICAvLyBidXQgd2Ugc2hvdWxkIGZpbHRlciBsYXN0IGVsZW1lbnQsIGJlY2F1c2UgaXQgbWVhbnMgbGlzdCBmaW5pc2hcbiAgICAgIHByZXZFbXB0eUVuZCA9IChzdGF0ZS5saW5lIC0gZGRMaW5lKSA+IDEgJiYgc3RhdGUuaXNFbXB0eShzdGF0ZS5saW5lIC0gMSk7XG5cbiAgICAgIHN0YXRlLnRTaGlmdFtkZExpbmVdID0gb2xkVFNoaWZ0O1xuICAgICAgc3RhdGUudGlnaHQgPSBvbGRUaWdodDtcbiAgICAgIHN0YXRlLnBhcmVudFR5cGUgPSBvbGRQYXJlbnRUeXBlO1xuICAgICAgc3RhdGUuYmxrSW5kZW50ID0gb2xkSW5kZW50O1xuICAgICAgc3RhdGUuZGRJbmRlbnQgPSBvbGREREluZGVudDtcblxuICAgICAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgICAgICB0eXBlOiAnZGRfY2xvc2UnLFxuICAgICAgICBsZXZlbDogLS1zdGF0ZS5sZXZlbFxuICAgICAgfSk7XG5cbiAgICAgIGl0ZW1MaW5lc1sxXSA9IG5leHRMaW5lID0gc3RhdGUubGluZTtcblxuICAgICAgaWYgKG5leHRMaW5lID49IGVuZExpbmUpIHsgYnJlYWsgT1VURVI7IH1cblxuICAgICAgaWYgKHN0YXRlLnRTaGlmdFtuZXh0TGluZV0gPCBzdGF0ZS5ibGtJbmRlbnQpIHsgYnJlYWsgT1VURVI7IH1cbiAgICAgIGNvbnRlbnRTdGFydCA9IHNraXBNYXJrZXIoc3RhdGUsIG5leHRMaW5lKTtcbiAgICAgIGlmIChjb250ZW50U3RhcnQgPCAwKSB7IGJyZWFrOyB9XG5cbiAgICAgIGRkTGluZSA9IG5leHRMaW5lO1xuXG4gICAgICAvLyBnbyB0byB0aGUgbmV4dCBsb29wIGl0ZXJhdGlvbjpcbiAgICAgIC8vIGluc2VydCBERCB0YWcgYW5kIHJlcGVhdCBjaGVja2luZ1xuICAgIH1cblxuICAgIGlmIChuZXh0TGluZSA+PSBlbmRMaW5lKSB7IGJyZWFrOyB9XG4gICAgZHRMaW5lID0gbmV4dExpbmU7XG5cbiAgICBpZiAoc3RhdGUuaXNFbXB0eShkdExpbmUpKSB7IGJyZWFrOyB9XG4gICAgaWYgKHN0YXRlLnRTaGlmdFtkdExpbmVdIDwgc3RhdGUuYmxrSW5kZW50KSB7IGJyZWFrOyB9XG5cbiAgICBkZExpbmUgPSBkdExpbmUgKyAxO1xuICAgIGlmIChkZExpbmUgPj0gZW5kTGluZSkgeyBicmVhazsgfVxuICAgIGlmIChzdGF0ZS5pc0VtcHR5KGRkTGluZSkpIHsgZGRMaW5lKys7IH1cbiAgICBpZiAoZGRMaW5lID49IGVuZExpbmUpIHsgYnJlYWs7IH1cblxuICAgIGlmIChzdGF0ZS50U2hpZnRbZGRMaW5lXSA8IHN0YXRlLmJsa0luZGVudCkgeyBicmVhazsgfVxuICAgIGNvbnRlbnRTdGFydCA9IHNraXBNYXJrZXIoc3RhdGUsIGRkTGluZSk7XG4gICAgaWYgKGNvbnRlbnRTdGFydCA8IDApIHsgYnJlYWs7IH1cblxuICAgIC8vIGdvIHRvIHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uOlxuICAgIC8vIGluc2VydCBEVCBhbmQgREQgdGFncyBhbmQgcmVwZWF0IGNoZWNraW5nXG4gIH1cblxuICAvLyBGaW5pbGl6ZSBsaXN0XG4gIHN0YXRlLnRva2Vucy5wdXNoKHtcbiAgICB0eXBlOiAnZGxfY2xvc2UnLFxuICAgIGxldmVsOiAtLXN0YXRlLmxldmVsXG4gIH0pO1xuICBsaXN0TGluZXNbMV0gPSBuZXh0TGluZTtcblxuICBzdGF0ZS5saW5lID0gbmV4dExpbmU7XG5cbiAgLy8gbWFyayBwYXJhZ3JhcGhzIHRpZ2h0IGlmIG5lZWRlZFxuICBpZiAodGlnaHQpIHtcbiAgICBtYXJrVGlnaHRQYXJhZ3JhcGhzKHN0YXRlLCBsaXN0VG9rSWR4KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsIi8vIGZlbmNlcyAoYGBgIGxhbmcsIH5+fiBsYW5nKVxuXG4ndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmZW5jZXMoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSwgc2lsZW50KSB7XG4gIHZhciBtYXJrZXIsIGxlbiwgcGFyYW1zLCBuZXh0TGluZSwgbWVtLFxuICAgICAgaGF2ZUVuZE1hcmtlciA9IGZhbHNlLFxuICAgICAgcG9zID0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXSxcbiAgICAgIG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdO1xuXG4gIGlmIChwb3MgKyAzID4gbWF4KSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIG1hcmtlciA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcyk7XG5cbiAgaWYgKG1hcmtlciAhPT0gMHg3RS8qIH4gKi8gJiYgbWFya2VyICE9PSAweDYwIC8qIGAgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBzY2FuIG1hcmtlciBsZW5ndGhcbiAgbWVtID0gcG9zO1xuICBwb3MgPSBzdGF0ZS5za2lwQ2hhcnMocG9zLCBtYXJrZXIpO1xuXG4gIGxlbiA9IHBvcyAtIG1lbTtcblxuICBpZiAobGVuIDwgMykgeyByZXR1cm4gZmFsc2U7IH1cblxuICBwYXJhbXMgPSBzdGF0ZS5zcmMuc2xpY2UocG9zLCBtYXgpLnRyaW0oKTtcblxuICBpZiAocGFyYW1zLmluZGV4T2YoJ2AnKSA+PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIC8vIFNpbmNlIHN0YXJ0IGlzIGZvdW5kLCB3ZSBjYW4gcmVwb3J0IHN1Y2Nlc3MgaGVyZSBpbiB2YWxpZGF0aW9uIG1vZGVcbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZTsgfVxuXG4gIC8vIHNlYXJjaCBlbmQgb2YgYmxvY2tcbiAgbmV4dExpbmUgPSBzdGFydExpbmU7XG5cbiAgZm9yICg7Oykge1xuICAgIG5leHRMaW5lKys7XG4gICAgaWYgKG5leHRMaW5lID49IGVuZExpbmUpIHtcbiAgICAgIC8vIHVuY2xvc2VkIGJsb2NrIHNob3VsZCBiZSBhdXRvY2xvc2VkIGJ5IGVuZCBvZiBkb2N1bWVudC5cbiAgICAgIC8vIGFsc28gYmxvY2sgc2VlbXMgdG8gYmUgYXV0b2Nsb3NlZCBieSBlbmQgb2YgcGFyZW50XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBwb3MgPSBtZW0gPSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdICsgc3RhdGUudFNoaWZ0W25leHRMaW5lXTtcbiAgICBtYXggPSBzdGF0ZS5lTWFya3NbbmV4dExpbmVdO1xuXG4gICAgaWYgKHBvcyA8IG1heCAmJiBzdGF0ZS50U2hpZnRbbmV4dExpbmVdIDwgc3RhdGUuYmxrSW5kZW50KSB7XG4gICAgICAvLyBub24tZW1wdHkgbGluZSB3aXRoIG5lZ2F0aXZlIGluZGVudCBzaG91bGQgc3RvcCB0aGUgbGlzdDpcbiAgICAgIC8vIC0gYGBgXG4gICAgICAvLyAgdGVzdFxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IG1hcmtlcikgeyBjb250aW51ZTsgfVxuXG4gICAgaWYgKHN0YXRlLnRTaGlmdFtuZXh0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkge1xuICAgICAgLy8gY2xvc2luZyBmZW5jZSBzaG91bGQgYmUgaW5kZW50ZWQgbGVzcyB0aGFuIDQgc3BhY2VzXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBwb3MgPSBzdGF0ZS5za2lwQ2hhcnMocG9zLCBtYXJrZXIpO1xuXG4gICAgLy8gY2xvc2luZyBjb2RlIGZlbmNlIG11c3QgYmUgYXQgbGVhc3QgYXMgbG9uZyBhcyB0aGUgb3BlbmluZyBvbmVcbiAgICBpZiAocG9zIC0gbWVtIDwgbGVuKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGFpbCBoYXMgc3BhY2VzIG9ubHlcbiAgICBwb3MgPSBzdGF0ZS5za2lwU3BhY2VzKHBvcyk7XG5cbiAgICBpZiAocG9zIDwgbWF4KSB7IGNvbnRpbnVlOyB9XG5cbiAgICBoYXZlRW5kTWFya2VyID0gdHJ1ZTtcbiAgICAvLyBmb3VuZCFcbiAgICBicmVhaztcbiAgfVxuXG4gIC8vIElmIGEgZmVuY2UgaGFzIGhlYWRpbmcgc3BhY2VzLCB0aGV5IHNob3VsZCBiZSByZW1vdmVkIGZyb20gaXRzIGlubmVyIGJsb2NrXG4gIGxlbiA9IHN0YXRlLnRTaGlmdFtzdGFydExpbmVdO1xuXG4gIHN0YXRlLmxpbmUgPSBuZXh0TGluZSArIChoYXZlRW5kTWFya2VyID8gMSA6IDApO1xuICBzdGF0ZS50b2tlbnMucHVzaCh7XG4gICAgdHlwZTogJ2ZlbmNlJyxcbiAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICBjb250ZW50OiBzdGF0ZS5nZXRMaW5lcyhzdGFydExpbmUgKyAxLCBuZXh0TGluZSwgbGVuLCB0cnVlKSxcbiAgICBsaW5lczogWyBzdGFydExpbmUsIHN0YXRlLmxpbmUgXSxcbiAgICBsZXZlbDogc3RhdGUubGV2ZWxcbiAgfSk7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiLy8gUHJvY2VzcyBmb290bm90ZSByZWZlcmVuY2UgbGlzdFxuXG4ndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmb290bm90ZShzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLCBzaWxlbnQpIHtcbiAgdmFyIG9sZEJNYXJrLCBvbGRUU2hpZnQsIG9sZFBhcmVudFR5cGUsIHBvcywgbGFiZWwsXG4gICAgICBzdGFydCA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV0sXG4gICAgICBtYXggPSBzdGF0ZS5lTWFya3Nbc3RhcnRMaW5lXTtcblxuICAvLyBsaW5lIHNob3VsZCBiZSBhdCBsZWFzdCA1IGNoYXJzIC0gXCJbXnhdOlwiXG4gIGlmIChzdGFydCArIDQgPiBtYXgpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXJ0KSAhPT0gMHg1Qi8qIFsgKi8pIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGFydCArIDEpICE9PSAweDVFLyogXiAqLykgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHN0YXRlLmxldmVsID49IHN0YXRlLm9wdGlvbnMubWF4TmVzdGluZykgeyByZXR1cm4gZmFsc2U7IH1cblxuICBmb3IgKHBvcyA9IHN0YXJ0ICsgMjsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDIwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDVEIC8qIF0gKi8pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwb3MgPT09IHN0YXJ0ICsgMikgeyByZXR1cm4gZmFsc2U7IH0gLy8gbm8gZW1wdHkgZm9vdG5vdGUgbGFiZWxzXG4gIGlmIChwb3MgKyAxID49IG1heCB8fCBzdGF0ZS5zcmMuY2hhckNvZGVBdCgrK3BvcykgIT09IDB4M0EgLyogOiAqLykgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZTsgfVxuICBwb3MrKztcblxuICBpZiAoIXN0YXRlLmVudi5mb290bm90ZXMpIHsgc3RhdGUuZW52LmZvb3Rub3RlcyA9IHt9OyB9XG4gIGlmICghc3RhdGUuZW52LmZvb3Rub3Rlcy5yZWZzKSB7IHN0YXRlLmVudi5mb290bm90ZXMucmVmcyA9IHt9OyB9XG4gIGxhYmVsID0gc3RhdGUuc3JjLnNsaWNlKHN0YXJ0ICsgMiwgcG9zIC0gMik7XG4gIHN0YXRlLmVudi5mb290bm90ZXMucmVmc1snOicgKyBsYWJlbF0gPSAtMTtcblxuICBzdGF0ZS50b2tlbnMucHVzaCh7XG4gICAgdHlwZTogJ2Zvb3Rub3RlX3JlZmVyZW5jZV9vcGVuJyxcbiAgICBsYWJlbDogbGFiZWwsXG4gICAgbGV2ZWw6IHN0YXRlLmxldmVsKytcbiAgfSk7XG5cbiAgb2xkQk1hcmsgPSBzdGF0ZS5iTWFya3Nbc3RhcnRMaW5lXTtcbiAgb2xkVFNoaWZ0ID0gc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV07XG4gIG9sZFBhcmVudFR5cGUgPSBzdGF0ZS5wYXJlbnRUeXBlO1xuICBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXSA9IHN0YXRlLnNraXBTcGFjZXMocG9zKSAtIHBvcztcbiAgc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gPSBwb3M7XG4gIHN0YXRlLmJsa0luZGVudCArPSA0O1xuICBzdGF0ZS5wYXJlbnRUeXBlID0gJ2Zvb3Rub3RlJztcblxuICBpZiAoc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV0gPCBzdGF0ZS5ibGtJbmRlbnQpIHtcbiAgICBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXSArPSBzdGF0ZS5ibGtJbmRlbnQ7XG4gICAgc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gLT0gc3RhdGUuYmxrSW5kZW50O1xuICB9XG5cbiAgc3RhdGUucGFyc2VyLnRva2VuaXplKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUsIHRydWUpO1xuXG4gIHN0YXRlLnBhcmVudFR5cGUgPSBvbGRQYXJlbnRUeXBlO1xuICBzdGF0ZS5ibGtJbmRlbnQgLT0gNDtcbiAgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV0gPSBvbGRUU2hpZnQ7XG4gIHN0YXRlLmJNYXJrc1tzdGFydExpbmVdID0gb2xkQk1hcms7XG5cbiAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgIHR5cGU6ICdmb290bm90ZV9yZWZlcmVuY2VfY2xvc2UnLFxuICAgIGxldmVsOiAtLXN0YXRlLmxldmVsXG4gIH0pO1xuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsIi8vIGhlYWRpbmcgKCMsICMjLCAuLi4pXG5cbid1c2Ugc3RyaWN0JztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhlYWRpbmcoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSwgc2lsZW50KSB7XG4gIHZhciBjaCwgbGV2ZWwsIHRtcCxcbiAgICAgIHBvcyA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV0sXG4gICAgICBtYXggPSBzdGF0ZS5lTWFya3Nbc3RhcnRMaW5lXTtcblxuICBpZiAocG9zID49IG1heCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBjaCAgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpO1xuXG4gIGlmIChjaCAhPT0gMHgyMy8qICMgKi8gfHwgcG9zID49IG1heCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAvLyBjb3VudCBoZWFkaW5nIGxldmVsXG4gIGxldmVsID0gMTtcbiAgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdCgrK3Bvcyk7XG4gIHdoaWxlIChjaCA9PT0gMHgyMy8qICMgKi8gJiYgcG9zIDwgbWF4ICYmIGxldmVsIDw9IDYpIHtcbiAgICBsZXZlbCsrO1xuICAgIGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoKytwb3MpO1xuICB9XG5cbiAgaWYgKGxldmVsID4gNiB8fCAocG9zIDwgbWF4ICYmIGNoICE9PSAweDIwLyogc3BhY2UgKi8pKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIGlmIChzaWxlbnQpIHsgcmV0dXJuIHRydWU7IH1cblxuICAvLyBMZXQncyBjdXQgdGFpbHMgbGlrZSAnICAgICMjIyAgJyBmcm9tIHRoZSBlbmQgb2Ygc3RyaW5nXG5cbiAgbWF4ID0gc3RhdGUuc2tpcENoYXJzQmFjayhtYXgsIDB4MjAsIHBvcyk7IC8vIHNwYWNlXG4gIHRtcCA9IHN0YXRlLnNraXBDaGFyc0JhY2sobWF4LCAweDIzLCBwb3MpOyAvLyAjXG4gIGlmICh0bXAgPiBwb3MgJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQodG1wIC0gMSkgPT09IDB4MjAvKiBzcGFjZSAqLykge1xuICAgIG1heCA9IHRtcDtcbiAgfVxuXG4gIHN0YXRlLmxpbmUgPSBzdGFydExpbmUgKyAxO1xuXG4gIHN0YXRlLnRva2Vucy5wdXNoKHsgdHlwZTogJ2hlYWRpbmdfb3BlbicsXG4gICAgaExldmVsOiBsZXZlbCxcbiAgICBsaW5lczogWyBzdGFydExpbmUsIHN0YXRlLmxpbmUgXSxcbiAgICBsZXZlbDogc3RhdGUubGV2ZWxcbiAgfSk7XG5cbiAgLy8gb25seSBpZiBoZWFkZXIgaXMgbm90IGVtcHR5XG4gIGlmIChwb3MgPCBtYXgpIHtcbiAgICBzdGF0ZS50b2tlbnMucHVzaCh7XG4gICAgICB0eXBlOiAnaW5saW5lJyxcbiAgICAgIGNvbnRlbnQ6IHN0YXRlLnNyYy5zbGljZShwb3MsIG1heCkudHJpbSgpLFxuICAgICAgbGV2ZWw6IHN0YXRlLmxldmVsICsgMSxcbiAgICAgIGxpbmVzOiBbIHN0YXJ0TGluZSwgc3RhdGUubGluZSBdLFxuICAgICAgY2hpbGRyZW46IFtdXG4gICAgfSk7XG4gIH1cbiAgc3RhdGUudG9rZW5zLnB1c2goeyB0eXBlOiAnaGVhZGluZ19jbG9zZScsIGhMZXZlbDogbGV2ZWwsIGxldmVsOiBzdGF0ZS5sZXZlbCB9KTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCIvLyBIb3Jpem9udGFsIHJ1bGVcblxuJ3VzZSBzdHJpY3QnO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaHIoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSwgc2lsZW50KSB7XG4gIHZhciBtYXJrZXIsIGNudCwgY2gsXG4gICAgICBwb3MgPSBzdGF0ZS5iTWFya3Nbc3RhcnRMaW5lXSxcbiAgICAgIG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdO1xuXG4gIHBvcyArPSBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXTtcblxuICBpZiAocG9zID4gbWF4KSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIG1hcmtlciA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKTtcblxuICAvLyBDaGVjayBociBtYXJrZXJcbiAgaWYgKG1hcmtlciAhPT0gMHgyQS8qICogKi8gJiZcbiAgICAgIG1hcmtlciAhPT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIG1hcmtlciAhPT0gMHg1Ri8qIF8gKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBtYXJrZXJzIGNhbiBiZSBtaXhlZCB3aXRoIHNwYWNlcywgYnV0IHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCAzIG9uZVxuXG4gIGNudCA9IDE7XG4gIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKTtcbiAgICBpZiAoY2ggIT09IG1hcmtlciAmJiBjaCAhPT0gMHgyMC8qIHNwYWNlICovKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmIChjaCA9PT0gbWFya2VyKSB7IGNudCsrOyB9XG4gIH1cblxuICBpZiAoY250IDwgMykgeyByZXR1cm4gZmFsc2U7IH1cblxuICBpZiAoc2lsZW50KSB7IHJldHVybiB0cnVlOyB9XG5cbiAgc3RhdGUubGluZSA9IHN0YXJ0TGluZSArIDE7XG4gIHN0YXRlLnRva2Vucy5wdXNoKHtcbiAgICB0eXBlOiAnaHInLFxuICAgIGxpbmVzOiBbIHN0YXJ0TGluZSwgc3RhdGUubGluZSBdLFxuICAgIGxldmVsOiBzdGF0ZS5sZXZlbFxuICB9KTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCIvLyBIVE1MIGJsb2NrXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgYmxvY2tfbmFtZXMgPSByZXF1aXJlKCcuLi9jb21tb24vaHRtbF9ibG9ja3MnKTtcblxuXG52YXIgSFRNTF9UQUdfT1BFTl9SRSA9IC9ePChbYS16QS1aXXsxLDE1fSlbXFxzXFwvPl0vO1xudmFyIEhUTUxfVEFHX0NMT1NFX1JFID0gL148XFwvKFthLXpBLVpdezEsMTV9KVtcXHM+XS87XG5cbmZ1bmN0aW9uIGlzTGV0dGVyKGNoKSB7XG4gIC8qZXNsaW50IG5vLWJpdHdpc2U6MCovXG4gIHZhciBsYyA9IGNoIHwgMHgyMDsgLy8gdG8gbG93ZXIgY2FzZVxuICByZXR1cm4gKGxjID49IDB4NjEvKiBhICovKSAmJiAobGMgPD0gMHg3YS8qIHogKi8pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGh0bWxibG9jayhzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLCBzaWxlbnQpIHtcbiAgdmFyIGNoLCBtYXRjaCwgbmV4dExpbmUsXG4gICAgICBwb3MgPSBzdGF0ZS5iTWFya3Nbc3RhcnRMaW5lXSxcbiAgICAgIG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdLFxuICAgICAgc2hpZnQgPSBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXTtcblxuICBwb3MgKz0gc2hpZnQ7XG5cbiAgaWYgKCFzdGF0ZS5vcHRpb25zLmh0bWwpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgaWYgKHNoaWZ0ID4gMyB8fCBwb3MgKyAyID49IG1heCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgzQy8qIDwgKi8pIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MgKyAxKTtcblxuICBpZiAoY2ggPT09IDB4MjEvKiAhICovIHx8IGNoID09PSAweDNGLyogPyAqLykge1xuICAgIC8vIERpcmVjdGl2ZSBzdGFydCAvIGNvbW1lbnQgc3RhcnQgLyBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHN0YXJ0XG4gICAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZTsgfVxuXG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4MkYvKiAvICovIHx8IGlzTGV0dGVyKGNoKSkge1xuXG4gICAgLy8gUHJvYmFibHkgc3RhcnQgb3IgZW5kIG9mIHRhZ1xuICAgIGlmIChjaCA9PT0gMHgyRi8qIFxcICovKSB7XG4gICAgICAvLyBjbG9zaW5nIHRhZ1xuICAgICAgbWF0Y2ggPSBzdGF0ZS5zcmMuc2xpY2UocG9zLCBtYXgpLm1hdGNoKEhUTUxfVEFHX0NMT1NFX1JFKTtcbiAgICAgIGlmICghbWF0Y2gpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG9wZW5pbmcgdGFnXG4gICAgICBtYXRjaCA9IHN0YXRlLnNyYy5zbGljZShwb3MsIG1heCkubWF0Y2goSFRNTF9UQUdfT1BFTl9SRSk7XG4gICAgICBpZiAoIW1hdGNoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIH1cbiAgICAvLyBNYWtlIHN1cmUgdGFnIG5hbWUgaXMgdmFsaWRcbiAgICBpZiAoYmxvY2tfbmFtZXNbbWF0Y2hbMV0udG9Mb3dlckNhc2UoKV0gIT09IHRydWUpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZTsgfVxuXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gSWYgd2UgYXJlIGhlcmUgLSB3ZSBkZXRlY3RlZCBIVE1MIGJsb2NrLlxuICAvLyBMZXQncyByb2xsIGRvd24gdGlsbCBlbXB0eSBsaW5lIChibG9jayBlbmQpLlxuICBuZXh0TGluZSA9IHN0YXJ0TGluZSArIDE7XG4gIHdoaWxlIChuZXh0TGluZSA8IHN0YXRlLmxpbmVNYXggJiYgIXN0YXRlLmlzRW1wdHkobmV4dExpbmUpKSB7XG4gICAgbmV4dExpbmUrKztcbiAgfVxuXG4gIHN0YXRlLmxpbmUgPSBuZXh0TGluZTtcbiAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgIHR5cGU6ICdodG1sYmxvY2snLFxuICAgIGxldmVsOiBzdGF0ZS5sZXZlbCxcbiAgICBsaW5lczogWyBzdGFydExpbmUsIHN0YXRlLmxpbmUgXSxcbiAgICBjb250ZW50OiBzdGF0ZS5nZXRMaW5lcyhzdGFydExpbmUsIG5leHRMaW5lLCAwLCB0cnVlKVxuICB9KTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCIvLyBsaGVhZGluZyAoLS0tLCA9PT0pXG5cbid1c2Ugc3RyaWN0JztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGxoZWFkaW5nKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUvKiwgc2lsZW50Ki8pIHtcbiAgdmFyIG1hcmtlciwgcG9zLCBtYXgsXG4gICAgICBuZXh0ID0gc3RhcnRMaW5lICsgMTtcblxuICBpZiAobmV4dCA+PSBlbmRMaW5lKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoc3RhdGUudFNoaWZ0W25leHRdIDwgc3RhdGUuYmxrSW5kZW50KSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIC8vIFNjYW4gbmV4dCBsaW5lXG5cbiAgaWYgKHN0YXRlLnRTaGlmdFtuZXh0XSAtIHN0YXRlLmJsa0luZGVudCA+IDMpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgcG9zID0gc3RhdGUuYk1hcmtzW25leHRdICsgc3RhdGUudFNoaWZ0W25leHRdO1xuICBtYXggPSBzdGF0ZS5lTWFya3NbbmV4dF07XG5cbiAgaWYgKHBvcyA+PSBtYXgpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKTtcblxuICBpZiAobWFya2VyICE9PSAweDJELyogLSAqLyAmJiBtYXJrZXIgIT09IDB4M0QvKiA9ICovKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIHBvcyA9IHN0YXRlLnNraXBDaGFycyhwb3MsIG1hcmtlcik7XG5cbiAgcG9zID0gc3RhdGUuc2tpcFNwYWNlcyhwb3MpO1xuXG4gIGlmIChwb3MgPCBtYXgpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgcG9zID0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXTtcblxuICBzdGF0ZS5saW5lID0gbmV4dCArIDE7XG4gIHN0YXRlLnRva2Vucy5wdXNoKHtcbiAgICB0eXBlOiAnaGVhZGluZ19vcGVuJyxcbiAgICBoTGV2ZWw6IG1hcmtlciA9PT0gMHgzRC8qID0gKi8gPyAxIDogMixcbiAgICBsaW5lczogWyBzdGFydExpbmUsIHN0YXRlLmxpbmUgXSxcbiAgICBsZXZlbDogc3RhdGUubGV2ZWxcbiAgfSk7XG4gIHN0YXRlLnRva2Vucy5wdXNoKHtcbiAgICB0eXBlOiAnaW5saW5lJyxcbiAgICBjb250ZW50OiBzdGF0ZS5zcmMuc2xpY2UocG9zLCBzdGF0ZS5lTWFya3Nbc3RhcnRMaW5lXSkudHJpbSgpLFxuICAgIGxldmVsOiBzdGF0ZS5sZXZlbCArIDEsXG4gICAgbGluZXM6IFsgc3RhcnRMaW5lLCBzdGF0ZS5saW5lIC0gMSBdLFxuICAgIGNoaWxkcmVuOiBbXVxuICB9KTtcbiAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgIHR5cGU6ICdoZWFkaW5nX2Nsb3NlJyxcbiAgICBoTGV2ZWw6IG1hcmtlciA9PT0gMHgzRC8qID0gKi8gPyAxIDogMixcbiAgICBsZXZlbDogc3RhdGUubGV2ZWxcbiAgfSk7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiLy8gTGlzdHNcblxuJ3VzZSBzdHJpY3QnO1xuXG5cbi8vIFNlYXJjaCBgWy0rKl1bXFxuIF1gLCByZXR1cm5zIG5leHQgcG9zIGFydGVyIG1hcmtlciBvbiBzdWNjZXNzXG4vLyBvciAtMSBvbiBmYWlsLlxuZnVuY3Rpb24gc2tpcEJ1bGxldExpc3RNYXJrZXIoc3RhdGUsIHN0YXJ0TGluZSkge1xuICB2YXIgbWFya2VyLCBwb3MsIG1heDtcblxuICBwb3MgPSBzdGF0ZS5iTWFya3Nbc3RhcnRMaW5lXSArIHN0YXRlLnRTaGlmdFtzdGFydExpbmVdO1xuICBtYXggPSBzdGF0ZS5lTWFya3Nbc3RhcnRMaW5lXTtcblxuICBpZiAocG9zID49IG1heCkgeyByZXR1cm4gLTE7IH1cblxuICBtYXJrZXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MrKyk7XG4gIC8vIENoZWNrIGJ1bGxldFxuICBpZiAobWFya2VyICE9PSAweDJBLyogKiAqLyAmJlxuICAgICAgbWFya2VyICE9PSAweDJELyogLSAqLyAmJlxuICAgICAgbWFya2VyICE9PSAweDJCLyogKyAqLykge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGlmIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgyMCkge1xuICAgIC8vIFwiIDEudGVzdCBcIiAtIGlzIG5vdCBhIGxpc3QgaXRlbVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHJldHVybiBwb3M7XG59XG5cbi8vIFNlYXJjaCBgXFxkK1suKV1bXFxuIF1gLCByZXR1cm5zIG5leHQgcG9zIGFydGVyIG1hcmtlciBvbiBzdWNjZXNzXG4vLyBvciAtMSBvbiBmYWlsLlxuZnVuY3Rpb24gc2tpcE9yZGVyZWRMaXN0TWFya2VyKHN0YXRlLCBzdGFydExpbmUpIHtcbiAgdmFyIGNoLFxuICAgICAgcG9zID0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXSxcbiAgICAgIG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdO1xuXG4gIGlmIChwb3MgKyAxID49IG1heCkgeyByZXR1cm4gLTE7IH1cblxuICBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKTtcblxuICBpZiAoY2ggPCAweDMwLyogMCAqLyB8fCBjaCA+IDB4MzkvKiA5ICovKSB7IHJldHVybiAtMTsgfVxuXG4gIGZvciAoOzspIHtcbiAgICAvLyBFT0wgLT4gZmFpbFxuICAgIGlmIChwb3MgPj0gbWF4KSB7IHJldHVybiAtMTsgfVxuXG4gICAgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MrKyk7XG5cbiAgICBpZiAoY2ggPj0gMHgzMC8qIDAgKi8gJiYgY2ggPD0gMHgzOS8qIDkgKi8pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGZvdW5kIHZhbGlkIG1hcmtlclxuICAgIGlmIChjaCA9PT0gMHgyOS8qICkgKi8gfHwgY2ggPT09IDB4MmUvKiAuICovKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuXG4gIGlmIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgyMC8qIHNwYWNlICovKSB7XG4gICAgLy8gXCIgMS50ZXN0IFwiIC0gaXMgbm90IGEgbGlzdCBpdGVtXG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHJldHVybiBwb3M7XG59XG5cbmZ1bmN0aW9uIG1hcmtUaWdodFBhcmFncmFwaHMoc3RhdGUsIGlkeCkge1xuICB2YXIgaSwgbCxcbiAgICAgIGxldmVsID0gc3RhdGUubGV2ZWwgKyAyO1xuXG4gIGZvciAoaSA9IGlkeCArIDIsIGwgPSBzdGF0ZS50b2tlbnMubGVuZ3RoIC0gMjsgaSA8IGw7IGkrKykge1xuICAgIGlmIChzdGF0ZS50b2tlbnNbaV0ubGV2ZWwgPT09IGxldmVsICYmIHN0YXRlLnRva2Vuc1tpXS50eXBlID09PSAncGFyYWdyYXBoX29wZW4nKSB7XG4gICAgICBzdGF0ZS50b2tlbnNbaSArIDJdLnRpZ2h0ID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnRva2Vuc1tpXS50aWdodCA9IHRydWU7XG4gICAgICBpICs9IDI7XG4gICAgfVxuICB9XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBsaXN0KHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUsIHNpbGVudCkge1xuICB2YXIgbmV4dExpbmUsXG4gICAgICBpbmRlbnQsXG4gICAgICBvbGRUU2hpZnQsXG4gICAgICBvbGRJbmRlbnQsXG4gICAgICBvbGRUaWdodCxcbiAgICAgIG9sZFBhcmVudFR5cGUsXG4gICAgICBzdGFydCxcbiAgICAgIHBvc0FmdGVyTWFya2VyLFxuICAgICAgbWF4LFxuICAgICAgaW5kZW50QWZ0ZXJNYXJrZXIsXG4gICAgICBtYXJrZXJWYWx1ZSxcbiAgICAgIG1hcmtlckNoYXJDb2RlLFxuICAgICAgaXNPcmRlcmVkLFxuICAgICAgY29udGVudFN0YXJ0LFxuICAgICAgbGlzdFRva0lkeCxcbiAgICAgIHByZXZFbXB0eUVuZCxcbiAgICAgIGxpc3RMaW5lcyxcbiAgICAgIGl0ZW1MaW5lcyxcbiAgICAgIHRpZ2h0ID0gdHJ1ZSxcbiAgICAgIHRlcm1pbmF0b3JSdWxlcyxcbiAgICAgIGksIGwsIHRlcm1pbmF0ZTtcblxuICAvLyBEZXRlY3QgbGlzdCB0eXBlIGFuZCBwb3NpdGlvbiBhZnRlciBtYXJrZXJcbiAgaWYgKChwb3NBZnRlck1hcmtlciA9IHNraXBPcmRlcmVkTGlzdE1hcmtlcihzdGF0ZSwgc3RhcnRMaW5lKSkgPj0gMCkge1xuICAgIGlzT3JkZXJlZCA9IHRydWU7XG4gIH0gZWxzZSBpZiAoKHBvc0FmdGVyTWFya2VyID0gc2tpcEJ1bGxldExpc3RNYXJrZXIoc3RhdGUsIHN0YXJ0TGluZSkpID49IDApIHtcbiAgICBpc09yZGVyZWQgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc3RhdGUubGV2ZWwgPj0gc3RhdGUub3B0aW9ucy5tYXhOZXN0aW5nKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIC8vIFdlIHNob3VsZCB0ZXJtaW5hdGUgbGlzdCBvbiBzdHlsZSBjaGFuZ2UuIFJlbWVtYmVyIGZpcnN0IG9uZSB0byBjb21wYXJlLlxuICBtYXJrZXJDaGFyQ29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvc0FmdGVyTWFya2VyIC0gMSk7XG5cbiAgLy8gRm9yIHZhbGlkYXRpb24gbW9kZSB3ZSBjYW4gdGVybWluYXRlIGltbWVkaWF0ZWx5XG4gIGlmIChzaWxlbnQpIHsgcmV0dXJuIHRydWU7IH1cblxuICAvLyBTdGFydCBsaXN0XG4gIGxpc3RUb2tJZHggPSBzdGF0ZS50b2tlbnMubGVuZ3RoO1xuXG4gIGlmIChpc09yZGVyZWQpIHtcbiAgICBzdGFydCA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV07XG4gICAgbWFya2VyVmFsdWUgPSBOdW1iZXIoc3RhdGUuc3JjLnN1YnN0cihzdGFydCwgcG9zQWZ0ZXJNYXJrZXIgLSBzdGFydCAtIDEpKTtcblxuICAgIHN0YXRlLnRva2Vucy5wdXNoKHtcbiAgICAgIHR5cGU6ICdvcmRlcmVkX2xpc3Rfb3BlbicsXG4gICAgICBvcmRlcjogbWFya2VyVmFsdWUsXG4gICAgICBsaW5lczogbGlzdExpbmVzID0gWyBzdGFydExpbmUsIDAgXSxcbiAgICAgIGxldmVsOiBzdGF0ZS5sZXZlbCsrXG4gICAgfSk7XG5cbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS50b2tlbnMucHVzaCh7XG4gICAgICB0eXBlOiAnYnVsbGV0X2xpc3Rfb3BlbicsXG4gICAgICBsaW5lczogbGlzdExpbmVzID0gWyBzdGFydExpbmUsIDAgXSxcbiAgICAgIGxldmVsOiBzdGF0ZS5sZXZlbCsrXG4gICAgfSk7XG4gIH1cblxuICAvL1xuICAvLyBJdGVyYXRlIGxpc3QgaXRlbXNcbiAgLy9cblxuICBuZXh0TGluZSA9IHN0YXJ0TGluZTtcbiAgcHJldkVtcHR5RW5kID0gZmFsc2U7XG4gIHRlcm1pbmF0b3JSdWxlcyA9IHN0YXRlLnBhcnNlci5ydWxlci5nZXRSdWxlcygnbGlzdCcpO1xuXG4gIHdoaWxlIChuZXh0TGluZSA8IGVuZExpbmUpIHtcbiAgICBjb250ZW50U3RhcnQgPSBzdGF0ZS5za2lwU3BhY2VzKHBvc0FmdGVyTWFya2VyKTtcbiAgICBtYXggPSBzdGF0ZS5lTWFya3NbbmV4dExpbmVdO1xuXG4gICAgaWYgKGNvbnRlbnRTdGFydCA+PSBtYXgpIHtcbiAgICAgIC8vIHRyaW1taW5nIHNwYWNlIGluIFwiLSAgICBcXG4gIDNcIiBjYXNlLCBpbmRlbnQgaXMgMSBoZXJlXG4gICAgICBpbmRlbnRBZnRlck1hcmtlciA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGVudEFmdGVyTWFya2VyID0gY29udGVudFN0YXJ0IC0gcG9zQWZ0ZXJNYXJrZXI7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBtb3JlIHRoYW4gNCBzcGFjZXMsIHRoZSBpbmRlbnQgaXMgMVxuICAgIC8vICh0aGUgcmVzdCBpcyBqdXN0IGluZGVudGVkIGNvZGUgYmxvY2spXG4gICAgaWYgKGluZGVudEFmdGVyTWFya2VyID4gNCkgeyBpbmRlbnRBZnRlck1hcmtlciA9IDE7IH1cblxuICAgIC8vIElmIGluZGVudCBpcyBsZXNzIHRoYW4gMSwgYXNzdW1lIHRoYXQgaXQncyBvbmUsIGV4YW1wbGU6XG4gICAgLy8gIFwiLVxcbiAgdGVzdFwiXG4gICAgaWYgKGluZGVudEFmdGVyTWFya2VyIDwgMSkgeyBpbmRlbnRBZnRlck1hcmtlciA9IDE7IH1cblxuICAgIC8vIFwiICAtICB0ZXN0XCJcbiAgICAvLyAgXl5eXl4gLSBjYWxjdWxhdGluZyB0b3RhbCBsZW5ndGggb2YgdGhpcyB0aGluZ1xuICAgIGluZGVudCA9IChwb3NBZnRlck1hcmtlciAtIHN0YXRlLmJNYXJrc1tuZXh0TGluZV0pICsgaW5kZW50QWZ0ZXJNYXJrZXI7XG5cbiAgICAvLyBSdW4gc3VicGFyc2VyICYgd3JpdGUgdG9rZW5zXG4gICAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgICAgdHlwZTogJ2xpc3RfaXRlbV9vcGVuJyxcbiAgICAgIGxpbmVzOiBpdGVtTGluZXMgPSBbIHN0YXJ0TGluZSwgMCBdLFxuICAgICAgbGV2ZWw6IHN0YXRlLmxldmVsKytcbiAgICB9KTtcblxuICAgIG9sZEluZGVudCA9IHN0YXRlLmJsa0luZGVudDtcbiAgICBvbGRUaWdodCA9IHN0YXRlLnRpZ2h0O1xuICAgIG9sZFRTaGlmdCA9IHN0YXRlLnRTaGlmdFtzdGFydExpbmVdO1xuICAgIG9sZFBhcmVudFR5cGUgPSBzdGF0ZS5wYXJlbnRUeXBlO1xuICAgIHN0YXRlLnRTaGlmdFtzdGFydExpbmVdID0gY29udGVudFN0YXJ0IC0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV07XG4gICAgc3RhdGUuYmxrSW5kZW50ID0gaW5kZW50O1xuICAgIHN0YXRlLnRpZ2h0ID0gdHJ1ZTtcbiAgICBzdGF0ZS5wYXJlbnRUeXBlID0gJ2xpc3QnO1xuXG4gICAgc3RhdGUucGFyc2VyLnRva2VuaXplKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUsIHRydWUpO1xuXG4gICAgLy8gSWYgYW55IG9mIGxpc3QgaXRlbSBpcyB0aWdodCwgbWFyayBsaXN0IGFzIHRpZ2h0XG4gICAgaWYgKCFzdGF0ZS50aWdodCB8fCBwcmV2RW1wdHlFbmQpIHtcbiAgICAgIHRpZ2h0ID0gZmFsc2U7XG4gICAgfVxuICAgIC8vIEl0ZW0gYmVjb21lIGxvb3NlIGlmIGZpbmlzaCB3aXRoIGVtcHR5IGxpbmUsXG4gICAgLy8gYnV0IHdlIHNob3VsZCBmaWx0ZXIgbGFzdCBlbGVtZW50LCBiZWNhdXNlIGl0IG1lYW5zIGxpc3QgZmluaXNoXG4gICAgcHJldkVtcHR5RW5kID0gKHN0YXRlLmxpbmUgLSBzdGFydExpbmUpID4gMSAmJiBzdGF0ZS5pc0VtcHR5KHN0YXRlLmxpbmUgLSAxKTtcblxuICAgIHN0YXRlLmJsa0luZGVudCA9IG9sZEluZGVudDtcbiAgICBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXSA9IG9sZFRTaGlmdDtcbiAgICBzdGF0ZS50aWdodCA9IG9sZFRpZ2h0O1xuICAgIHN0YXRlLnBhcmVudFR5cGUgPSBvbGRQYXJlbnRUeXBlO1xuXG4gICAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgICAgdHlwZTogJ2xpc3RfaXRlbV9jbG9zZScsXG4gICAgICBsZXZlbDogLS1zdGF0ZS5sZXZlbFxuICAgIH0pO1xuXG4gICAgbmV4dExpbmUgPSBzdGFydExpbmUgPSBzdGF0ZS5saW5lO1xuICAgIGl0ZW1MaW5lc1sxXSA9IG5leHRMaW5lO1xuICAgIGNvbnRlbnRTdGFydCA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdO1xuXG4gICAgaWYgKG5leHRMaW5lID49IGVuZExpbmUpIHsgYnJlYWs7IH1cblxuICAgIGlmIChzdGF0ZS5pc0VtcHR5KG5leHRMaW5lKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBUcnkgdG8gY2hlY2sgaWYgbGlzdCBpcyB0ZXJtaW5hdGVkIG9yIGNvbnRpbnVlZC5cbiAgICAvL1xuICAgIGlmIChzdGF0ZS50U2hpZnRbbmV4dExpbmVdIDwgc3RhdGUuYmxrSW5kZW50KSB7IGJyZWFrOyB9XG5cbiAgICAvLyBmYWlsIGlmIHRlcm1pbmF0aW5nIGJsb2NrIGZvdW5kXG4gICAgdGVybWluYXRlID0gZmFsc2U7XG4gICAgZm9yIChpID0gMCwgbCA9IHRlcm1pbmF0b3JSdWxlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0ZXJtaW5hdG9yUnVsZXNbaV0oc3RhdGUsIG5leHRMaW5lLCBlbmRMaW5lLCB0cnVlKSkge1xuICAgICAgICB0ZXJtaW5hdGUgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRlcm1pbmF0ZSkgeyBicmVhazsgfVxuXG4gICAgLy8gZmFpbCBpZiBsaXN0IGhhcyBhbm90aGVyIHR5cGVcbiAgICBpZiAoaXNPcmRlcmVkKSB7XG4gICAgICBwb3NBZnRlck1hcmtlciA9IHNraXBPcmRlcmVkTGlzdE1hcmtlcihzdGF0ZSwgbmV4dExpbmUpO1xuICAgICAgaWYgKHBvc0FmdGVyTWFya2VyIDwgMCkgeyBicmVhazsgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwb3NBZnRlck1hcmtlciA9IHNraXBCdWxsZXRMaXN0TWFya2VyKHN0YXRlLCBuZXh0TGluZSk7XG4gICAgICBpZiAocG9zQWZ0ZXJNYXJrZXIgPCAwKSB7IGJyZWFrOyB9XG4gICAgfVxuXG4gICAgaWYgKG1hcmtlckNoYXJDb2RlICE9PSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3NBZnRlck1hcmtlciAtIDEpKSB7IGJyZWFrOyB9XG4gIH1cblxuICAvLyBGaW5pbGl6ZSBsaXN0XG4gIHN0YXRlLnRva2Vucy5wdXNoKHtcbiAgICB0eXBlOiBpc09yZGVyZWQgPyAnb3JkZXJlZF9saXN0X2Nsb3NlJyA6ICdidWxsZXRfbGlzdF9jbG9zZScsXG4gICAgbGV2ZWw6IC0tc3RhdGUubGV2ZWxcbiAgfSk7XG4gIGxpc3RMaW5lc1sxXSA9IG5leHRMaW5lO1xuXG4gIHN0YXRlLmxpbmUgPSBuZXh0TGluZTtcblxuICAvLyBtYXJrIHBhcmFncmFwaHMgdGlnaHQgaWYgbmVlZGVkXG4gIGlmICh0aWdodCkge1xuICAgIG1hcmtUaWdodFBhcmFncmFwaHMoc3RhdGUsIGxpc3RUb2tJZHgpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiLy8gUGFyYWdyYXBoXG5cbid1c2Ugc3RyaWN0JztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhcmFncmFwaChzdGF0ZSwgc3RhcnRMaW5lLyosIGVuZExpbmUqLykge1xuICB2YXIgZW5kTGluZSwgY29udGVudCwgdGVybWluYXRlLCBpLCBsLFxuICAgICAgbmV4dExpbmUgPSBzdGFydExpbmUgKyAxLFxuICAgICAgdGVybWluYXRvclJ1bGVzO1xuXG4gIGVuZExpbmUgPSBzdGF0ZS5saW5lTWF4O1xuXG4gIC8vIGp1bXAgbGluZS1ieS1saW5lIHVudGlsIGVtcHR5IG9uZSBvciBFT0ZcbiAgaWYgKG5leHRMaW5lIDwgZW5kTGluZSAmJiAhc3RhdGUuaXNFbXB0eShuZXh0TGluZSkpIHtcbiAgICB0ZXJtaW5hdG9yUnVsZXMgPSBzdGF0ZS5wYXJzZXIucnVsZXIuZ2V0UnVsZXMoJ3BhcmFncmFwaCcpO1xuXG4gICAgZm9yICg7IG5leHRMaW5lIDwgZW5kTGluZSAmJiAhc3RhdGUuaXNFbXB0eShuZXh0TGluZSk7IG5leHRMaW5lKyspIHtcbiAgICAgIC8vIHRoaXMgd291bGQgYmUgYSBjb2RlIGJsb2NrIG5vcm1hbGx5LCBidXQgYWZ0ZXIgcGFyYWdyYXBoXG4gICAgICAvLyBpdCdzIGNvbnNpZGVyZWQgYSBsYXp5IGNvbnRpbnVhdGlvbiByZWdhcmRsZXNzIG9mIHdoYXQncyB0aGVyZVxuICAgICAgaWYgKHN0YXRlLnRTaGlmdFtuZXh0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPiAzKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgIC8vIFNvbWUgdGFncyBjYW4gdGVybWluYXRlIHBhcmFncmFwaCB3aXRob3V0IGVtcHR5IGxpbmUuXG4gICAgICB0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgIGZvciAoaSA9IDAsIGwgPSB0ZXJtaW5hdG9yUnVsZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZXJtaW5hdG9yUnVsZXNbaV0oc3RhdGUsIG5leHRMaW5lLCBlbmRMaW5lLCB0cnVlKSkge1xuICAgICAgICAgIHRlcm1pbmF0ZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0ZXJtaW5hdGUpIHsgYnJlYWs7IH1cbiAgICB9XG4gIH1cblxuICBjb250ZW50ID0gc3RhdGUuZ2V0TGluZXMoc3RhcnRMaW5lLCBuZXh0TGluZSwgc3RhdGUuYmxrSW5kZW50LCBmYWxzZSkudHJpbSgpO1xuXG4gIHN0YXRlLmxpbmUgPSBuZXh0TGluZTtcbiAgaWYgKGNvbnRlbnQubGVuZ3RoKSB7XG4gICAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgICAgdHlwZTogJ3BhcmFncmFwaF9vcGVuJyxcbiAgICAgIHRpZ2h0OiBmYWxzZSxcbiAgICAgIGxpbmVzOiBbIHN0YXJ0TGluZSwgc3RhdGUubGluZSBdLFxuICAgICAgbGV2ZWw6IHN0YXRlLmxldmVsXG4gICAgfSk7XG4gICAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgICAgdHlwZTogJ2lubGluZScsXG4gICAgICBjb250ZW50OiBjb250ZW50LFxuICAgICAgbGV2ZWw6IHN0YXRlLmxldmVsICsgMSxcbiAgICAgIGxpbmVzOiBbIHN0YXJ0TGluZSwgc3RhdGUubGluZSBdLFxuICAgICAgY2hpbGRyZW46IFtdXG4gICAgfSk7XG4gICAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgICAgdHlwZTogJ3BhcmFncmFwaF9jbG9zZScsXG4gICAgICB0aWdodDogZmFsc2UsXG4gICAgICBsZXZlbDogc3RhdGUubGV2ZWxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsIi8vIFBhcnNlciBzdGF0ZSBjbGFzc1xuXG4ndXNlIHN0cmljdCc7XG5cblxuZnVuY3Rpb24gU3RhdGVCbG9jayhzcmMsIHBhcnNlciwgb3B0aW9ucywgZW52LCB0b2tlbnMpIHtcbiAgdmFyIGNoLCBzLCBzdGFydCwgcG9zLCBsZW4sIGluZGVudCwgaW5kZW50X2ZvdW5kO1xuXG4gIHRoaXMuc3JjID0gc3JjO1xuXG4gIC8vIFNob3J0Y3V0cyB0byBzaW1wbGlmeSBuZXN0ZWQgY2FsbHNcbiAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG5cbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICB0aGlzLmVudiA9IGVudjtcblxuICAvL1xuICAvLyBJbnRlcm5hbCBzdGF0ZSB2YXJ0aWFibGVzXG4gIC8vXG5cbiAgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG5cbiAgdGhpcy5iTWFya3MgPSBbXTsgIC8vIGxpbmUgYmVnaW4gb2Zmc2V0cyBmb3IgZmFzdCBqdW1wc1xuICB0aGlzLmVNYXJrcyA9IFtdOyAgLy8gbGluZSBlbmQgb2Zmc2V0cyBmb3IgZmFzdCBqdW1wc1xuICB0aGlzLnRTaGlmdCA9IFtdOyAgLy8gaW5kZW50IGZvciBlYWNoIGxpbmVcblxuICAvLyBibG9jayBwYXJzZXIgdmFyaWFibGVzXG4gIHRoaXMuYmxrSW5kZW50ICA9IDA7IC8vIHJlcXVpcmVkIGJsb2NrIGNvbnRlbnQgaW5kZW50XG4gICAgICAgICAgICAgICAgICAgICAgIC8vIChmb3IgZXhhbXBsZSwgaWYgd2UgYXJlIGluIGxpc3QpXG4gIHRoaXMubGluZSAgICAgICA9IDA7IC8vIGxpbmUgaW5kZXggaW4gc3JjXG4gIHRoaXMubGluZU1heCAgICA9IDA7IC8vIGxpbmVzIGNvdW50XG4gIHRoaXMudGlnaHQgICAgICA9IGZhbHNlOyAgLy8gbG9vc2UvdGlnaHQgbW9kZSBmb3IgbGlzdHNcbiAgdGhpcy5wYXJlbnRUeXBlID0gJ3Jvb3QnOyAvLyBpZiBgbGlzdGAsIGJsb2NrIHBhcnNlciBzdG9wcyBvbiB0d28gbmV3bGluZXNcbiAgdGhpcy5kZEluZGVudCAgID0gLTE7IC8vIGluZGVudCBvZiB0aGUgY3VycmVudCBkZCBibG9jayAoLTEgaWYgdGhlcmUgaXNuJ3QgYW55KVxuXG4gIHRoaXMubGV2ZWwgPSAwO1xuXG4gIC8vIHJlbmRlcmVyXG4gIHRoaXMucmVzdWx0ID0gJyc7XG5cbiAgLy8gQ3JlYXRlIGNhY2hlc1xuICAvLyBHZW5lcmF0ZSBtYXJrZXJzLlxuICBzID0gdGhpcy5zcmM7XG4gIGluZGVudCA9IDA7XG4gIGluZGVudF9mb3VuZCA9IGZhbHNlO1xuXG4gIGZvciAoc3RhcnQgPSBwb3MgPSBpbmRlbnQgPSAwLCBsZW4gPSBzLmxlbmd0aDsgcG9zIDwgbGVuOyBwb3MrKykge1xuICAgIGNoID0gcy5jaGFyQ29kZUF0KHBvcyk7XG5cbiAgICBpZiAoIWluZGVudF9mb3VuZCkge1xuICAgICAgaWYgKGNoID09PSAweDIwLyogc3BhY2UgKi8pIHtcbiAgICAgICAgaW5kZW50Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZW50X2ZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2ggPT09IDB4MEEgfHwgcG9zID09PSBsZW4gLSAxKSB7XG4gICAgICBpZiAoY2ggIT09IDB4MEEpIHsgcG9zKys7IH1cbiAgICAgIHRoaXMuYk1hcmtzLnB1c2goc3RhcnQpO1xuICAgICAgdGhpcy5lTWFya3MucHVzaChwb3MpO1xuICAgICAgdGhpcy50U2hpZnQucHVzaChpbmRlbnQpO1xuXG4gICAgICBpbmRlbnRfZm91bmQgPSBmYWxzZTtcbiAgICAgIGluZGVudCA9IDA7XG4gICAgICBzdGFydCA9IHBvcyArIDE7XG4gICAgfVxuICB9XG5cbiAgLy8gUHVzaCBmYWtlIGVudHJ5IHRvIHNpbXBsaWZ5IGNhY2hlIGJvdW5kcyBjaGVja3NcbiAgdGhpcy5iTWFya3MucHVzaChzLmxlbmd0aCk7XG4gIHRoaXMuZU1hcmtzLnB1c2gocy5sZW5ndGgpO1xuICB0aGlzLnRTaGlmdC5wdXNoKDApO1xuXG4gIHRoaXMubGluZU1heCA9IHRoaXMuYk1hcmtzLmxlbmd0aCAtIDE7IC8vIGRvbid0IGNvdW50IGxhc3QgZmFrZSBsaW5lXG59XG5cblN0YXRlQmxvY2sucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiBpc0VtcHR5KGxpbmUpIHtcbiAgcmV0dXJuIHRoaXMuYk1hcmtzW2xpbmVdICsgdGhpcy50U2hpZnRbbGluZV0gPj0gdGhpcy5lTWFya3NbbGluZV07XG59O1xuXG5TdGF0ZUJsb2NrLnByb3RvdHlwZS5za2lwRW1wdHlMaW5lcyA9IGZ1bmN0aW9uIHNraXBFbXB0eUxpbmVzKGZyb20pIHtcbiAgZm9yICh2YXIgbWF4ID0gdGhpcy5saW5lTWF4OyBmcm9tIDwgbWF4OyBmcm9tKyspIHtcbiAgICBpZiAodGhpcy5iTWFya3NbZnJvbV0gKyB0aGlzLnRTaGlmdFtmcm9tXSA8IHRoaXMuZU1hcmtzW2Zyb21dKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZyb207XG59O1xuXG4vLyBTa2lwIHNwYWNlcyBmcm9tIGdpdmVuIHBvc2l0aW9uLlxuU3RhdGVCbG9jay5wcm90b3R5cGUuc2tpcFNwYWNlcyA9IGZ1bmN0aW9uIHNraXBTcGFjZXMocG9zKSB7XG4gIGZvciAodmFyIG1heCA9IHRoaXMuc3JjLmxlbmd0aDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgIGlmICh0aGlzLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IDB4MjAvKiBzcGFjZSAqLykgeyBicmVhazsgfVxuICB9XG4gIHJldHVybiBwb3M7XG59O1xuXG4vLyBTa2lwIGNoYXIgY29kZXMgZnJvbSBnaXZlbiBwb3NpdGlvblxuU3RhdGVCbG9jay5wcm90b3R5cGUuc2tpcENoYXJzID0gZnVuY3Rpb24gc2tpcENoYXJzKHBvcywgY29kZSkge1xuICBmb3IgKHZhciBtYXggPSB0aGlzLnNyYy5sZW5ndGg7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICBpZiAodGhpcy5zcmMuY2hhckNvZGVBdChwb3MpICE9PSBjb2RlKSB7IGJyZWFrOyB9XG4gIH1cbiAgcmV0dXJuIHBvcztcbn07XG5cbi8vIFNraXAgY2hhciBjb2RlcyByZXZlcnNlIGZyb20gZ2l2ZW4gcG9zaXRpb24gLSAxXG5TdGF0ZUJsb2NrLnByb3RvdHlwZS5za2lwQ2hhcnNCYWNrID0gZnVuY3Rpb24gc2tpcENoYXJzQmFjayhwb3MsIGNvZGUsIG1pbikge1xuICBpZiAocG9zIDw9IG1pbikgeyByZXR1cm4gcG9zOyB9XG5cbiAgd2hpbGUgKHBvcyA+IG1pbikge1xuICAgIGlmIChjb2RlICE9PSB0aGlzLnNyYy5jaGFyQ29kZUF0KC0tcG9zKSkgeyByZXR1cm4gcG9zICsgMTsgfVxuICB9XG4gIHJldHVybiBwb3M7XG59O1xuXG4vLyBjdXQgbGluZXMgcmFuZ2UgZnJvbSBzb3VyY2UuXG5TdGF0ZUJsb2NrLnByb3RvdHlwZS5nZXRMaW5lcyA9IGZ1bmN0aW9uIGdldExpbmVzKGJlZ2luLCBlbmQsIGluZGVudCwga2VlcExhc3RMRikge1xuICB2YXIgaSwgZmlyc3QsIGxhc3QsIHF1ZXVlLCBzaGlmdCxcbiAgICAgIGxpbmUgPSBiZWdpbjtcblxuICBpZiAoYmVnaW4gPj0gZW5kKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLy8gT3B0OiBkb24ndCB1c2UgcHVzaCBxdWV1ZSBmb3Igc2luZ2xlIGxpbmU7XG4gIGlmIChsaW5lICsgMSA9PT0gZW5kKSB7XG4gICAgZmlyc3QgPSB0aGlzLmJNYXJrc1tsaW5lXSArIE1hdGgubWluKHRoaXMudFNoaWZ0W2xpbmVdLCBpbmRlbnQpO1xuICAgIGxhc3QgPSBrZWVwTGFzdExGID8gdGhpcy5lTWFya3NbbGluZV0gKyAxIDogdGhpcy5lTWFya3NbbGluZV07XG4gICAgcmV0dXJuIHRoaXMuc3JjLnNsaWNlKGZpcnN0LCBsYXN0KTtcbiAgfVxuXG4gIHF1ZXVlID0gbmV3IEFycmF5KGVuZCAtIGJlZ2luKTtcblxuICBmb3IgKGkgPSAwOyBsaW5lIDwgZW5kOyBsaW5lKyssIGkrKykge1xuICAgIHNoaWZ0ID0gdGhpcy50U2hpZnRbbGluZV07XG4gICAgaWYgKHNoaWZ0ID4gaW5kZW50KSB7IHNoaWZ0ID0gaW5kZW50OyB9XG4gICAgaWYgKHNoaWZ0IDwgMCkgeyBzaGlmdCA9IDA7IH1cblxuICAgIGZpcnN0ID0gdGhpcy5iTWFya3NbbGluZV0gKyBzaGlmdDtcblxuICAgIGlmIChsaW5lICsgMSA8IGVuZCB8fCBrZWVwTGFzdExGKSB7XG4gICAgICAvLyBObyBuZWVkIGZvciBib3VuZHMgY2hlY2sgYmVjYXVzZSB3ZSBoYXZlIGZha2UgZW50cnkgb24gdGFpbC5cbiAgICAgIGxhc3QgPSB0aGlzLmVNYXJrc1tsaW5lXSArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3QgPSB0aGlzLmVNYXJrc1tsaW5lXTtcbiAgICB9XG5cbiAgICBxdWV1ZVtpXSA9IHRoaXMuc3JjLnNsaWNlKGZpcnN0LCBsYXN0KTtcbiAgfVxuXG4gIHJldHVybiBxdWV1ZS5qb2luKCcnKTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTdGF0ZUJsb2NrO1xuIiwiLy8gR0ZNIHRhYmxlLCBub24tc3RhbmRhcmRcblxuJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIGdldExpbmUoc3RhdGUsIGxpbmUpIHtcbiAgdmFyIHBvcyA9IHN0YXRlLmJNYXJrc1tsaW5lXSArIHN0YXRlLmJsa0luZGVudCxcbiAgICAgIG1heCA9IHN0YXRlLmVNYXJrc1tsaW5lXTtcblxuICByZXR1cm4gc3RhdGUuc3JjLnN1YnN0cihwb3MsIG1heCAtIHBvcyk7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0YWJsZShzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLCBzaWxlbnQpIHtcbiAgdmFyIGNoLCBsaW5lVGV4dCwgcG9zLCBpLCBuZXh0TGluZSwgcm93cyxcbiAgICAgIGFsaWducywgdCwgdGFibGVMaW5lcywgdGJvZHlMaW5lcztcblxuICAvLyBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aHJlZSBsaW5lc1xuICBpZiAoc3RhcnRMaW5lICsgMiA+IGVuZExpbmUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgbmV4dExpbmUgPSBzdGFydExpbmUgKyAxO1xuXG4gIGlmIChzdGF0ZS50U2hpZnRbbmV4dExpbmVdIDwgc3RhdGUuYmxrSW5kZW50KSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIC8vIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc2Vjb25kIGxpbmUgc2hvdWxkIGJlICd8JyBvciAnLSdcblxuICBwb3MgPSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdICsgc3RhdGUudFNoaWZ0W25leHRMaW5lXTtcbiAgaWYgKHBvcyA+PSBzdGF0ZS5lTWFya3NbbmV4dExpbmVdKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKTtcbiAgaWYgKGNoICE9PSAweDdDLyogfCAqLyAmJiBjaCAhPT0gMHgyRC8qIC0gKi8gJiYgY2ggIT09IDB4M0EvKiA6ICovKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIGxpbmVUZXh0ID0gZ2V0TGluZShzdGF0ZSwgc3RhcnRMaW5lICsgMSk7XG4gIGlmICghL15bLTp8IF0rJC8udGVzdChsaW5lVGV4dCkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgcm93cyA9IGxpbmVUZXh0LnNwbGl0KCd8Jyk7XG4gIGlmIChyb3dzIDw9IDIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGFsaWducyA9IFtdO1xuICBmb3IgKGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgIHQgPSByb3dzW2ldLnRyaW0oKTtcbiAgICBpZiAoIXQpIHtcbiAgICAgIC8vIGFsbG93IGVtcHR5IGNvbHVtbnMgYmVmb3JlIGFuZCBhZnRlciB0YWJsZSwgYnV0IG5vdCBpbiBiZXR3ZWVuIGNvbHVtbnM7XG4gICAgICAvLyBlLmcuIGFsbG93IGAgfC0tLXwgYCwgZGlzYWxsb3cgYCAtLS18fC0tLSBgXG4gICAgICBpZiAoaSA9PT0gMCB8fCBpID09PSByb3dzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCEvXjo/LSs6PyQvLnRlc3QodCkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKHQuY2hhckNvZGVBdCh0Lmxlbmd0aCAtIDEpID09PSAweDNBLyogOiAqLykge1xuICAgICAgYWxpZ25zLnB1c2godC5jaGFyQ29kZUF0KDApID09PSAweDNBLyogOiAqLyA/ICdjZW50ZXInIDogJ3JpZ2h0Jyk7XG4gICAgfSBlbHNlIGlmICh0LmNoYXJDb2RlQXQoMCkgPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBhbGlnbnMucHVzaCgnbGVmdCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbGlnbnMucHVzaCgnJyk7XG4gICAgfVxuICB9XG5cbiAgbGluZVRleHQgPSBnZXRMaW5lKHN0YXRlLCBzdGFydExpbmUpLnRyaW0oKTtcbiAgaWYgKGxpbmVUZXh0LmluZGV4T2YoJ3wnKSA9PT0gLTEpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIHJvd3MgPSBsaW5lVGV4dC5yZXBsYWNlKC9eXFx8fFxcfCQvZywgJycpLnNwbGl0KCd8Jyk7XG4gIGlmIChhbGlnbnMubGVuZ3RoICE9PSByb3dzLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZTsgfVxuXG4gIHN0YXRlLnRva2Vucy5wdXNoKHtcbiAgICB0eXBlOiAndGFibGVfb3BlbicsXG4gICAgbGluZXM6IHRhYmxlTGluZXMgPSBbIHN0YXJ0TGluZSwgMCBdLFxuICAgIGxldmVsOiBzdGF0ZS5sZXZlbCsrXG4gIH0pO1xuICBzdGF0ZS50b2tlbnMucHVzaCh7XG4gICAgdHlwZTogJ3RoZWFkX29wZW4nLFxuICAgIGxpbmVzOiBbIHN0YXJ0TGluZSwgc3RhcnRMaW5lICsgMSBdLFxuICAgIGxldmVsOiBzdGF0ZS5sZXZlbCsrXG4gIH0pO1xuXG4gIHN0YXRlLnRva2Vucy5wdXNoKHtcbiAgICB0eXBlOiAndHJfb3BlbicsXG4gICAgbGluZXM6IFsgc3RhcnRMaW5lLCBzdGFydExpbmUgKyAxIF0sXG4gICAgbGV2ZWw6IHN0YXRlLmxldmVsKytcbiAgfSk7XG4gIGZvciAoaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgICAgdHlwZTogJ3RoX29wZW4nLFxuICAgICAgYWxpZ246IGFsaWduc1tpXSxcbiAgICAgIGxpbmVzOiBbIHN0YXJ0TGluZSwgc3RhcnRMaW5lICsgMSBdLFxuICAgICAgbGV2ZWw6IHN0YXRlLmxldmVsKytcbiAgICB9KTtcbiAgICBzdGF0ZS50b2tlbnMucHVzaCh7XG4gICAgICB0eXBlOiAnaW5saW5lJyxcbiAgICAgIGNvbnRlbnQ6IHJvd3NbaV0udHJpbSgpLFxuICAgICAgbGluZXM6IFsgc3RhcnRMaW5lLCBzdGFydExpbmUgKyAxIF0sXG4gICAgICBsZXZlbDogc3RhdGUubGV2ZWwsXG4gICAgICBjaGlsZHJlbjogW11cbiAgICB9KTtcbiAgICBzdGF0ZS50b2tlbnMucHVzaCh7IHR5cGU6ICd0aF9jbG9zZScsIGxldmVsOiAtLXN0YXRlLmxldmVsIH0pO1xuICB9XG4gIHN0YXRlLnRva2Vucy5wdXNoKHsgdHlwZTogJ3RyX2Nsb3NlJywgbGV2ZWw6IC0tc3RhdGUubGV2ZWwgfSk7XG4gIHN0YXRlLnRva2Vucy5wdXNoKHsgdHlwZTogJ3RoZWFkX2Nsb3NlJywgbGV2ZWw6IC0tc3RhdGUubGV2ZWwgfSk7XG5cbiAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgIHR5cGU6ICd0Ym9keV9vcGVuJyxcbiAgICBsaW5lczogdGJvZHlMaW5lcyA9IFsgc3RhcnRMaW5lICsgMiwgMCBdLFxuICAgIGxldmVsOiBzdGF0ZS5sZXZlbCsrXG4gIH0pO1xuXG4gIGZvciAobmV4dExpbmUgPSBzdGFydExpbmUgKyAyOyBuZXh0TGluZSA8IGVuZExpbmU7IG5leHRMaW5lKyspIHtcbiAgICBpZiAoc3RhdGUudFNoaWZ0W25leHRMaW5lXSA8IHN0YXRlLmJsa0luZGVudCkgeyBicmVhazsgfVxuXG4gICAgbGluZVRleHQgPSBnZXRMaW5lKHN0YXRlLCBuZXh0TGluZSkudHJpbSgpO1xuICAgIGlmIChsaW5lVGV4dC5pbmRleE9mKCd8JykgPT09IC0xKSB7IGJyZWFrOyB9XG4gICAgcm93cyA9IGxpbmVUZXh0LnJlcGxhY2UoL15cXHx8XFx8JC9nLCAnJykuc3BsaXQoJ3wnKTtcblxuICAgIHN0YXRlLnRva2Vucy5wdXNoKHsgdHlwZTogJ3RyX29wZW4nLCBsZXZlbDogc3RhdGUubGV2ZWwrKyB9KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgc3RhdGUudG9rZW5zLnB1c2goeyB0eXBlOiAndGRfb3BlbicsIGFsaWduOiBhbGlnbnNbaV0sIGxldmVsOiBzdGF0ZS5sZXZlbCsrIH0pO1xuICAgICAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgICAgICB0eXBlOiAnaW5saW5lJyxcbiAgICAgICAgY29udGVudDogcm93c1tpXS5yZXBsYWNlKC9eXFx8PyAqfCAqXFx8PyQvZywgJycpLFxuICAgICAgICBsZXZlbDogc3RhdGUubGV2ZWwsXG4gICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgfSk7XG4gICAgICBzdGF0ZS50b2tlbnMucHVzaCh7IHR5cGU6ICd0ZF9jbG9zZScsIGxldmVsOiAtLXN0YXRlLmxldmVsIH0pO1xuICAgIH1cbiAgICBzdGF0ZS50b2tlbnMucHVzaCh7IHR5cGU6ICd0cl9jbG9zZScsIGxldmVsOiAtLXN0YXRlLmxldmVsIH0pO1xuICB9XG4gIHN0YXRlLnRva2Vucy5wdXNoKHsgdHlwZTogJ3Rib2R5X2Nsb3NlJywgbGV2ZWw6IC0tc3RhdGUubGV2ZWwgfSk7XG4gIHN0YXRlLnRva2Vucy5wdXNoKHsgdHlwZTogJ3RhYmxlX2Nsb3NlJywgbGV2ZWw6IC0tc3RhdGUubGV2ZWwgfSk7XG5cbiAgdGFibGVMaW5lc1sxXSA9IHRib2R5TGluZXNbMV0gPSBuZXh0TGluZTtcbiAgc3RhdGUubGluZSA9IG5leHRMaW5lO1xuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCIvLyBQYXJzZSBhYmJyZXZpYXRpb24gZGVmaW5pdGlvbnMsIGkuZS4gYCpbYWJicl06IGRlc2NyaXB0aW9uYFxuLy9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTdGF0ZUlubGluZSAgICA9IHJlcXVpcmUoJy4uL3J1bGVzX2lubGluZS9zdGF0ZV9pbmxpbmUnKTtcbnZhciBwYXJzZUxpbmtMYWJlbCA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvcGFyc2VfbGlua19sYWJlbCcpO1xuXG5cbmZ1bmN0aW9uIHBhcnNlQWJicihzdHIsIHBhcnNlcklubGluZSwgb3B0aW9ucywgZW52KSB7XG4gIHZhciBzdGF0ZSwgbGFiZWxFbmQsIHBvcywgbWF4LCBsYWJlbCwgdGl0bGU7XG5cbiAgaWYgKHN0ci5jaGFyQ29kZUF0KDApICE9PSAweDJBLyogKiAqLykgeyByZXR1cm4gLTE7IH1cbiAgaWYgKHN0ci5jaGFyQ29kZUF0KDEpICE9PSAweDVCLyogWyAqLykgeyByZXR1cm4gLTE7IH1cblxuICBpZiAoc3RyLmluZGV4T2YoJ106JykgPT09IC0xKSB7IHJldHVybiAtMTsgfVxuXG4gIHN0YXRlID0gbmV3IFN0YXRlSW5saW5lKHN0ciwgcGFyc2VySW5saW5lLCBvcHRpb25zLCBlbnYsIFtdKTtcbiAgbGFiZWxFbmQgPSBwYXJzZUxpbmtMYWJlbChzdGF0ZSwgMSk7XG5cbiAgaWYgKGxhYmVsRW5kIDwgMCB8fCBzdHIuY2hhckNvZGVBdChsYWJlbEVuZCArIDEpICE9PSAweDNBLyogOiAqLykgeyByZXR1cm4gLTE7IH1cblxuICBtYXggPSBzdGF0ZS5wb3NNYXg7XG5cbiAgLy8gYWJiciB0aXRsZSBpcyBhbHdheXMgb25lIGxpbmUsIHNvIGxvb2tpbmcgZm9yIGVuZGluZyBcIlxcblwiIGhlcmVcbiAgZm9yIChwb3MgPSBsYWJlbEVuZCArIDI7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgwQSkgeyBicmVhazsgfVxuICB9XG5cbiAgbGFiZWwgPSBzdHIuc2xpY2UoMiwgbGFiZWxFbmQpO1xuICB0aXRsZSA9IHN0ci5zbGljZShsYWJlbEVuZCArIDIsIHBvcykudHJpbSgpO1xuICBpZiAodGl0bGUubGVuZ3RoID09PSAwKSB7IHJldHVybiAtMTsgfVxuICBpZiAoIWVudi5hYmJyZXZpYXRpb25zKSB7IGVudi5hYmJyZXZpYXRpb25zID0ge307IH1cbiAgLy8gcHJlcGVuZCAnOicgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIG1lbWJlcnNcbiAgaWYgKHR5cGVvZiBlbnYuYWJicmV2aWF0aW9uc1snOicgKyBsYWJlbF0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgZW52LmFiYnJldmlhdGlvbnNbJzonICsgbGFiZWxdID0gdGl0bGU7XG4gIH1cblxuICByZXR1cm4gcG9zO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGFiYnIoc3RhdGUpIHtcbiAgdmFyIHRva2VucyA9IHN0YXRlLnRva2VucywgaSwgbCwgY29udGVudCwgcG9zO1xuXG4gIGlmIChzdGF0ZS5pbmxpbmVNb2RlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUGFyc2UgaW5saW5lc1xuICBmb3IgKGkgPSAxLCBsID0gdG9rZW5zLmxlbmd0aCAtIDE7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAodG9rZW5zW2kgLSAxXS50eXBlID09PSAncGFyYWdyYXBoX29wZW4nICYmXG4gICAgICAgIHRva2Vuc1tpXS50eXBlID09PSAnaW5saW5lJyAmJlxuICAgICAgICB0b2tlbnNbaSArIDFdLnR5cGUgPT09ICdwYXJhZ3JhcGhfY2xvc2UnKSB7XG5cbiAgICAgIGNvbnRlbnQgPSB0b2tlbnNbaV0uY29udGVudDtcbiAgICAgIHdoaWxlIChjb250ZW50Lmxlbmd0aCkge1xuICAgICAgICBwb3MgPSBwYXJzZUFiYnIoY29udGVudCwgc3RhdGUuaW5saW5lLCBzdGF0ZS5vcHRpb25zLCBzdGF0ZS5lbnYpO1xuICAgICAgICBpZiAocG9zIDwgMCkgeyBicmVhazsgfVxuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZShwb3MpLnRyaW0oKTtcbiAgICAgIH1cblxuICAgICAgdG9rZW5zW2ldLmNvbnRlbnQgPSBjb250ZW50O1xuICAgICAgaWYgKCFjb250ZW50Lmxlbmd0aCkge1xuICAgICAgICB0b2tlbnNbaSAtIDFdLnRpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgdG9rZW5zW2kgKyAxXS50aWdodCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuIiwiLy8gRW5jbG9zZSBhYmJyZXZpYXRpb25zIGluIDxhYmJyPiB0YWdzXG4vL1xuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBQVU5DVF9DSEFSUyA9ICcgXFxuKClbXVxcJ1wiLiwhPy0nO1xuXG5cbi8vIGZyb20gR29vZ2xlIGNsb3N1cmUgbGlicmFyeVxuLy8gaHR0cDovL2Nsb3N1cmUtbGlicmFyeS5nb29nbGVjb2RlLmNvbS9naXQtaGlzdG9yeS9kb2NzL2xvY2FsX2Nsb3N1cmVfZ29vZ19zdHJpbmdfc3RyaW5nLmpzLnNvdXJjZS5odG1sI2xpbmUxMDIxXG5mdW5jdGlvbiByZWdFc2NhcGUocykge1xuICByZXR1cm4gcy5yZXBsYWNlKC8oWy0oKVxcW1xcXXt9Kz8qLiRcXF58LDojPCFcXFxcXSkvZywgJ1xcXFwkMScpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYWJicjIoc3RhdGUpIHtcbiAgdmFyIGksIGosIGwsIHRva2VucywgdG9rZW4sIHRleHQsIG5vZGVzLCBwb3MsIGxldmVsLCByZWcsIG0sIHJlZ1RleHQsXG4gICAgICBibG9ja1Rva2VucyA9IHN0YXRlLnRva2VucztcblxuICBpZiAoIXN0YXRlLmVudi5hYmJyZXZpYXRpb25zKSB7IHJldHVybjsgfVxuICBpZiAoIXN0YXRlLmVudi5hYmJyUmVnRXhwKSB7XG4gICAgcmVnVGV4dCA9ICcoXnxbJyArIFBVTkNUX0NIQVJTLnNwbGl0KCcnKS5tYXAocmVnRXNjYXBlKS5qb2luKCcnKSArICddKSdcbiAgICAgICAgICAgICsgJygnICsgT2JqZWN0LmtleXMoc3RhdGUuZW52LmFiYnJldmlhdGlvbnMpLm1hcChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4LnN1YnN0cigxKTtcbiAgICAgICAgICAgICAgICAgICAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9KS5tYXAocmVnRXNjYXBlKS5qb2luKCd8JykgKyAnKSdcbiAgICAgICAgICAgICsgJygkfFsnICsgUFVOQ1RfQ0hBUlMuc3BsaXQoJycpLm1hcChyZWdFc2NhcGUpLmpvaW4oJycpICsgJ10pJztcbiAgICBzdGF0ZS5lbnYuYWJiclJlZ0V4cCA9IG5ldyBSZWdFeHAocmVnVGV4dCwgJ2cnKTtcbiAgfVxuICByZWcgPSBzdGF0ZS5lbnYuYWJiclJlZ0V4cDtcblxuICBmb3IgKGogPSAwLCBsID0gYmxvY2tUb2tlbnMubGVuZ3RoOyBqIDwgbDsgaisrKSB7XG4gICAgaWYgKGJsb2NrVG9rZW5zW2pdLnR5cGUgIT09ICdpbmxpbmUnKSB7IGNvbnRpbnVlOyB9XG4gICAgdG9rZW5zID0gYmxvY2tUb2tlbnNbal0uY2hpbGRyZW47XG5cbiAgICAvLyBXZSBzY2FuIGZyb20gdGhlIGVuZCwgdG8ga2VlcCBwb3NpdGlvbiB3aGVuIG5ldyB0YWdzIGFkZGVkLlxuICAgIGZvciAoaSA9IHRva2Vucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdG9rZW4gPSB0b2tlbnNbaV07XG4gICAgICBpZiAodG9rZW4udHlwZSAhPT0gJ3RleHQnKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgIHBvcyA9IDA7XG4gICAgICB0ZXh0ID0gdG9rZW4uY29udGVudDtcbiAgICAgIHJlZy5sYXN0SW5kZXggPSAwO1xuICAgICAgbGV2ZWwgPSB0b2tlbi5sZXZlbDtcbiAgICAgIG5vZGVzID0gW107XG5cbiAgICAgIHdoaWxlICgobSA9IHJlZy5leGVjKHRleHQpKSkge1xuICAgICAgICBpZiAocmVnLmxhc3RJbmRleCA+IHBvcykge1xuICAgICAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgY29udGVudDogdGV4dC5zbGljZShwb3MsIG0uaW5kZXggKyBtWzFdLmxlbmd0aCksXG4gICAgICAgICAgICBsZXZlbDogbGV2ZWxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdhYmJyX29wZW4nLFxuICAgICAgICAgIHRpdGxlOiBzdGF0ZS5lbnYuYWJicmV2aWF0aW9uc1snOicgKyBtWzJdXSxcbiAgICAgICAgICBsZXZlbDogbGV2ZWwrK1xuICAgICAgICB9KTtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgIGNvbnRlbnQ6IG1bMl0sXG4gICAgICAgICAgbGV2ZWw6IGxldmVsXG4gICAgICAgIH0pO1xuICAgICAgICBub2Rlcy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnYWJicl9jbG9zZScsXG4gICAgICAgICAgbGV2ZWw6IC0tbGV2ZWxcbiAgICAgICAgfSk7XG4gICAgICAgIHBvcyA9IHJlZy5sYXN0SW5kZXggLSBtWzNdLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFub2Rlcy5sZW5ndGgpIHsgY29udGludWU7IH1cblxuICAgICAgaWYgKHBvcyA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICBjb250ZW50OiB0ZXh0LnNsaWNlKHBvcyksXG4gICAgICAgICAgbGV2ZWw6IGxldmVsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyByZXBsYWNlIGN1cnJlbnQgbm9kZVxuICAgICAgYmxvY2tUb2tlbnNbal0uY2hpbGRyZW4gPSB0b2tlbnMgPSBbXS5jb25jYXQodG9rZW5zLnNsaWNlKDAsIGkpLCBub2RlcywgdG9rZW5zLnNsaWNlKGkgKyAxKSk7XG4gICAgfVxuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJsb2NrKHN0YXRlKSB7XG5cbiAgaWYgKHN0YXRlLmlubGluZU1vZGUpIHtcbiAgICBzdGF0ZS50b2tlbnMucHVzaCh7XG4gICAgICB0eXBlOiAnaW5saW5lJyxcbiAgICAgIGNvbnRlbnQ6IHN0YXRlLnNyYy5yZXBsYWNlKC9cXG4vZywgJyAnKS50cmltKCksXG4gICAgICBsZXZlbDogMCxcbiAgICAgIGxpbmVzOiBbIDAsIDEgXSxcbiAgICAgIGNoaWxkcmVuOiBbXVxuICAgIH0pO1xuXG4gIH0gZWxzZSB7XG4gICAgc3RhdGUuYmxvY2sucGFyc2Uoc3RhdGUuc3JjLCBzdGF0ZS5vcHRpb25zLCBzdGF0ZS5lbnYsIHN0YXRlLnRva2Vucyk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmb290bm90ZV9ibG9jayhzdGF0ZSkge1xuICB2YXIgaSwgbCwgaiwgdCwgbGFzdFBhcmFncmFwaCwgbGlzdCwgdG9rZW5zLCBjdXJyZW50LCBjdXJyZW50TGFiZWwsXG4gICAgICBsZXZlbCA9IDAsXG4gICAgICBpbnNpZGVSZWYgPSBmYWxzZSxcbiAgICAgIHJlZlRva2VucyA9IHt9O1xuXG4gIGlmICghc3RhdGUuZW52LmZvb3Rub3RlcykgeyByZXR1cm47IH1cblxuICBzdGF0ZS50b2tlbnMgPSBzdGF0ZS50b2tlbnMuZmlsdGVyKGZ1bmN0aW9uKHRvaykge1xuICAgIGlmICh0b2sudHlwZSA9PT0gJ2Zvb3Rub3RlX3JlZmVyZW5jZV9vcGVuJykge1xuICAgICAgaW5zaWRlUmVmID0gdHJ1ZTtcbiAgICAgIGN1cnJlbnQgPSBbXTtcbiAgICAgIGN1cnJlbnRMYWJlbCA9IHRvay5sYWJlbDtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRvay50eXBlID09PSAnZm9vdG5vdGVfcmVmZXJlbmNlX2Nsb3NlJykge1xuICAgICAgaW5zaWRlUmVmID0gZmFsc2U7XG4gICAgICAvLyBwcmVwZW5kICc6JyB0byBhdm9pZCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgbWVtYmVyc1xuICAgICAgcmVmVG9rZW5zWyc6JyArIGN1cnJlbnRMYWJlbF0gPSBjdXJyZW50O1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaW5zaWRlUmVmKSB7IGN1cnJlbnQucHVzaCh0b2spOyB9XG4gICAgcmV0dXJuICFpbnNpZGVSZWY7XG4gIH0pO1xuXG4gIGlmICghc3RhdGUuZW52LmZvb3Rub3Rlcy5saXN0KSB7IHJldHVybjsgfVxuICBsaXN0ID0gc3RhdGUuZW52LmZvb3Rub3Rlcy5saXN0O1xuXG4gIHN0YXRlLnRva2Vucy5wdXNoKHtcbiAgICB0eXBlOiAnZm9vdG5vdGVfYmxvY2tfb3BlbicsXG4gICAgbGV2ZWw6IGxldmVsKytcbiAgfSk7XG4gIGZvciAoaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHN0YXRlLnRva2Vucy5wdXNoKHtcbiAgICAgIHR5cGU6ICdmb290bm90ZV9vcGVuJyxcbiAgICAgIGlkOiBpLFxuICAgICAgbGV2ZWw6IGxldmVsKytcbiAgICB9KTtcblxuICAgIGlmIChsaXN0W2ldLnRva2Vucykge1xuICAgICAgdG9rZW5zID0gW107XG4gICAgICB0b2tlbnMucHVzaCh7XG4gICAgICAgIHR5cGU6ICdwYXJhZ3JhcGhfb3BlbicsXG4gICAgICAgIHRpZ2h0OiBmYWxzZSxcbiAgICAgICAgbGV2ZWw6IGxldmVsKytcbiAgICAgIH0pO1xuICAgICAgdG9rZW5zLnB1c2goe1xuICAgICAgICB0eXBlOiAnaW5saW5lJyxcbiAgICAgICAgY29udGVudDogJycsXG4gICAgICAgIGxldmVsOiBsZXZlbCxcbiAgICAgICAgY2hpbGRyZW46IGxpc3RbaV0udG9rZW5zXG4gICAgICB9KTtcbiAgICAgIHRva2Vucy5wdXNoKHtcbiAgICAgICAgdHlwZTogJ3BhcmFncmFwaF9jbG9zZScsXG4gICAgICAgIHRpZ2h0OiBmYWxzZSxcbiAgICAgICAgbGV2ZWw6IC0tbGV2ZWxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAobGlzdFtpXS5sYWJlbCkge1xuICAgICAgdG9rZW5zID0gcmVmVG9rZW5zWyc6JyArIGxpc3RbaV0ubGFiZWxdO1xuICAgIH1cblxuICAgIHN0YXRlLnRva2VucyA9IHN0YXRlLnRva2Vucy5jb25jYXQodG9rZW5zKTtcbiAgICBpZiAoc3RhdGUudG9rZW5zW3N0YXRlLnRva2Vucy5sZW5ndGggLSAxXS50eXBlID09PSAncGFyYWdyYXBoX2Nsb3NlJykge1xuICAgICAgbGFzdFBhcmFncmFwaCA9IHN0YXRlLnRva2Vucy5wb3AoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdFBhcmFncmFwaCA9IG51bGw7XG4gICAgfVxuXG4gICAgdCA9IGxpc3RbaV0uY291bnQgPiAwID8gbGlzdFtpXS5jb3VudCA6IDE7XG4gICAgZm9yIChqID0gMDsgaiA8IHQ7IGorKykge1xuICAgICAgc3RhdGUudG9rZW5zLnB1c2goe1xuICAgICAgICB0eXBlOiAnZm9vdG5vdGVfYW5jaG9yJyxcbiAgICAgICAgaWQ6IGksXG4gICAgICAgIHN1YklkOiBqLFxuICAgICAgICBsZXZlbDogbGV2ZWxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChsYXN0UGFyYWdyYXBoKSB7XG4gICAgICBzdGF0ZS50b2tlbnMucHVzaChsYXN0UGFyYWdyYXBoKTtcbiAgICB9XG5cbiAgICBzdGF0ZS50b2tlbnMucHVzaCh7XG4gICAgICB0eXBlOiAnZm9vdG5vdGVfY2xvc2UnLFxuICAgICAgbGV2ZWw6IC0tbGV2ZWxcbiAgICB9KTtcbiAgfVxuICBzdGF0ZS50b2tlbnMucHVzaCh7XG4gICAgdHlwZTogJ2Zvb3Rub3RlX2Jsb2NrX2Nsb3NlJyxcbiAgICBsZXZlbDogLS1sZXZlbFxuICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5saW5lKHN0YXRlKSB7XG4gIHZhciB0b2tlbnMgPSBzdGF0ZS50b2tlbnMsIHRvaywgaSwgbDtcblxuICAvLyBQYXJzZSBpbmxpbmVzXG4gIGZvciAoaSA9IDAsIGwgPSB0b2tlbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdG9rID0gdG9rZW5zW2ldO1xuICAgIGlmICh0b2sudHlwZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIHN0YXRlLmlubGluZS5wYXJzZSh0b2suY29udGVudCwgc3RhdGUub3B0aW9ucywgc3RhdGUuZW52LCB0b2suY2hpbGRyZW4pO1xuICAgIH1cbiAgfVxufTtcbiIsIi8vIFJlcGxhY2UgbGluay1saWtlIHRleHRzIHdpdGggbGluayBub2Rlcy5cbi8vXG4vLyBDdXJyZW50bHkgcmVzdHJpY3RlZCBieSBgaW5saW5lLnZhbGlkYXRlTGluaygpYCB0byBodHRwL2h0dHBzL2Z0cFxuLy9cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgQXV0b2xpbmtlciA9IHJlcXVpcmUoJ2F1dG9saW5rZXInKTtcblxuXG52YXIgTElOS19TQ0FOX1JFID0gL3d3d3xAfFxcOlxcL1xcLy87XG5cblxuZnVuY3Rpb24gaXNMaW5rT3BlbihzdHIpIHtcbiAgcmV0dXJuIC9ePGFbPlxcc10vaS50ZXN0KHN0cik7XG59XG5mdW5jdGlvbiBpc0xpbmtDbG9zZShzdHIpIHtcbiAgcmV0dXJuIC9ePFxcL2FcXHMqPi9pLnRlc3Qoc3RyKTtcbn1cblxuLy8gU3R1cGlkIGZhYnJpYyB0byBhdm9pZCBzaW5nbGV0b25zLCBmb3IgdGhyZWFkIHNhZmV0eS5cbi8vIFJlcXVpcmVkIGZvciBlbmdpbmVzIGxpa2UgTmFzaG9ybi5cbi8vXG5mdW5jdGlvbiBjcmVhdGVMaW5raWZpZXIoKSB7XG4gIHZhciBsaW5rcyA9IFtdO1xuICB2YXIgYXV0b2xpbmtlciA9IG5ldyBBdXRvbGlua2VyKHtcbiAgICBzdHJpcFByZWZpeDogZmFsc2UsXG4gICAgdXJsOiB0cnVlLFxuICAgIGVtYWlsOiB0cnVlLFxuICAgIHR3aXR0ZXI6IGZhbHNlLFxuICAgIHJlcGxhY2VGbjogZnVuY3Rpb24gKGxpbmtlciwgbWF0Y2gpIHtcbiAgICAgIC8vIE9ubHkgY29sbGVjdCBtYXRjaGVkIHN0cmluZ3MgYnV0IGRvbid0IGNoYW5nZSBhbnl0aGluZy5cbiAgICAgIHN3aXRjaCAobWF0Y2guZ2V0VHlwZSgpKSB7XG4gICAgICAgIC8qZXNsaW50IGRlZmF1bHQtY2FzZTowKi9cbiAgICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgICBsaW5rcy5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IG1hdGNoLm1hdGNoZWRUZXh0LFxuICAgICAgICAgICAgdXJsOiBtYXRjaC5nZXRVcmwoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgICAgbGlua3MucHVzaCh7XG4gICAgICAgICAgICB0ZXh0OiBtYXRjaC5tYXRjaGVkVGV4dCxcbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBlbWFpbCBwcm90b2NvbFxuICAgICAgICAgICAgdXJsOiAnbWFpbHRvOicgKyBtYXRjaC5nZXRFbWFpbCgpLnJlcGxhY2UoL15tYWlsdG86L2ksICcnKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBsaW5rczogbGlua3MsXG4gICAgYXV0b2xpbmtlcjogYXV0b2xpbmtlclxuICB9O1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbGlua2lmeShzdGF0ZSkge1xuICB2YXIgaSwgaiwgbCwgdG9rZW5zLCB0b2tlbiwgdGV4dCwgbm9kZXMsIGxuLCBwb3MsIGxldmVsLCBodG1sTGlua0xldmVsLFxuICAgICAgYmxvY2tUb2tlbnMgPSBzdGF0ZS50b2tlbnMsXG4gICAgICBsaW5raWZpZXIgPSBudWxsLCBsaW5rcywgYXV0b2xpbmtlcjtcblxuICBpZiAoIXN0YXRlLm9wdGlvbnMubGlua2lmeSkgeyByZXR1cm47IH1cblxuICBmb3IgKGogPSAwLCBsID0gYmxvY2tUb2tlbnMubGVuZ3RoOyBqIDwgbDsgaisrKSB7XG4gICAgaWYgKGJsb2NrVG9rZW5zW2pdLnR5cGUgIT09ICdpbmxpbmUnKSB7IGNvbnRpbnVlOyB9XG4gICAgdG9rZW5zID0gYmxvY2tUb2tlbnNbal0uY2hpbGRyZW47XG5cbiAgICBodG1sTGlua0xldmVsID0gMDtcblxuICAgIC8vIFdlIHNjYW4gZnJvbSB0aGUgZW5kLCB0byBrZWVwIHBvc2l0aW9uIHdoZW4gbmV3IHRhZ3MgYWRkZWQuXG4gICAgLy8gVXNlIHJldmVyc2VkIGxvZ2ljIGluIGxpbmtzIHN0YXJ0L2VuZCBtYXRjaFxuICAgIGZvciAoaSA9IHRva2Vucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdG9rZW4gPSB0b2tlbnNbaV07XG5cbiAgICAgIC8vIFNraXAgY29udGVudCBvZiBtYXJrZG93biBsaW5rc1xuICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdsaW5rX2Nsb3NlJykge1xuICAgICAgICBpLS07XG4gICAgICAgIHdoaWxlICh0b2tlbnNbaV0ubGV2ZWwgIT09IHRva2VuLmxldmVsICYmIHRva2Vuc1tpXS50eXBlICE9PSAnbGlua19vcGVuJykge1xuICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gU2tpcCBjb250ZW50IG9mIGh0bWwgdGFnIGxpbmtzXG4gICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2h0bWx0YWcnKSB7XG4gICAgICAgIGlmIChpc0xpbmtPcGVuKHRva2VuLmNvbnRlbnQpICYmIGh0bWxMaW5rTGV2ZWwgPiAwKSB7XG4gICAgICAgICAgaHRtbExpbmtMZXZlbC0tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0xpbmtDbG9zZSh0b2tlbi5jb250ZW50KSkge1xuICAgICAgICAgIGh0bWxMaW5rTGV2ZWwrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGh0bWxMaW5rTGV2ZWwgPiAwKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgIGlmICh0b2tlbi50eXBlID09PSAndGV4dCcgJiYgTElOS19TQ0FOX1JFLnRlc3QodG9rZW4uY29udGVudCkpIHtcblxuICAgICAgICAvLyBJbml0IGxpbmtpZmllciBpbiBsYXp5IG1hbm5lciwgb25seSBpZiByZXF1aXJlZC5cbiAgICAgICAgaWYgKCFsaW5raWZpZXIpIHtcbiAgICAgICAgICBsaW5raWZpZXIgPSBjcmVhdGVMaW5raWZpZXIoKTtcbiAgICAgICAgICBsaW5rcyA9IGxpbmtpZmllci5saW5rcztcbiAgICAgICAgICBhdXRvbGlua2VyID0gbGlua2lmaWVyLmF1dG9saW5rZXI7XG4gICAgICAgIH1cblxuICAgICAgICB0ZXh0ID0gdG9rZW4uY29udGVudDtcbiAgICAgICAgbGlua3MubGVuZ3RoID0gMDtcbiAgICAgICAgYXV0b2xpbmtlci5saW5rKHRleHQpO1xuXG4gICAgICAgIGlmICghbGlua3MubGVuZ3RoKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgLy8gTm93IHNwbGl0IHN0cmluZyB0byBub2Rlc1xuICAgICAgICBub2RlcyA9IFtdO1xuICAgICAgICBsZXZlbCA9IHRva2VuLmxldmVsO1xuXG4gICAgICAgIGZvciAobG4gPSAwOyBsbiA8IGxpbmtzLmxlbmd0aDsgbG4rKykge1xuXG4gICAgICAgICAgaWYgKCFzdGF0ZS5pbmxpbmUudmFsaWRhdGVMaW5rKGxpbmtzW2xuXS51cmwpKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgICBwb3MgPSB0ZXh0LmluZGV4T2YobGlua3NbbG5dLnRleHQpO1xuXG4gICAgICAgICAgaWYgKHBvcykge1xuICAgICAgICAgICAgbGV2ZWwgPSBsZXZlbDtcbiAgICAgICAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IHRleHQuc2xpY2UoMCwgcG9zKSxcbiAgICAgICAgICAgICAgbGV2ZWw6IGxldmVsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnbGlua19vcGVuJyxcbiAgICAgICAgICAgIGhyZWY6IGxpbmtzW2xuXS51cmwsXG4gICAgICAgICAgICB0aXRsZTogJycsXG4gICAgICAgICAgICBsZXZlbDogbGV2ZWwrK1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgY29udGVudDogbGlua3NbbG5dLnRleHQsXG4gICAgICAgICAgICBsZXZlbDogbGV2ZWxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBub2Rlcy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdsaW5rX2Nsb3NlJyxcbiAgICAgICAgICAgIGxldmVsOiAtLWxldmVsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGV4dCA9IHRleHQuc2xpY2UocG9zICsgbGlua3NbbG5dLnRleHQubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICBub2Rlcy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRleHQsXG4gICAgICAgICAgICBsZXZlbDogbGV2ZWxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlcGxhY2UgY3VycmVudCBub2RlXG4gICAgICAgIGJsb2NrVG9rZW5zW2pdLmNoaWxkcmVuID0gdG9rZW5zID0gW10uY29uY2F0KHRva2Vucy5zbGljZSgwLCBpKSwgbm9kZXMsIHRva2Vucy5zbGljZShpICsgMSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgU3RhdGVJbmxpbmUgICAgICAgICAgPSByZXF1aXJlKCcuLi9ydWxlc19pbmxpbmUvc3RhdGVfaW5saW5lJyk7XG52YXIgcGFyc2VMaW5rTGFiZWwgICAgICAgPSByZXF1aXJlKCcuLi9oZWxwZXJzL3BhcnNlX2xpbmtfbGFiZWwnKTtcbnZhciBwYXJzZUxpbmtEZXN0aW5hdGlvbiA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvcGFyc2VfbGlua19kZXN0aW5hdGlvbicpO1xudmFyIHBhcnNlTGlua1RpdGxlICAgICAgID0gcmVxdWlyZSgnLi4vaGVscGVycy9wYXJzZV9saW5rX3RpdGxlJyk7XG52YXIgbm9ybWFsaXplUmVmZXJlbmNlICAgPSByZXF1aXJlKCcuLi9oZWxwZXJzL25vcm1hbGl6ZV9yZWZlcmVuY2UnKTtcblxuXG5mdW5jdGlvbiBwYXJzZVJlZmVyZW5jZShzdHIsIHBhcnNlciwgb3B0aW9ucywgZW52KSB7XG4gIHZhciBzdGF0ZSwgbGFiZWxFbmQsIHBvcywgbWF4LCBjb2RlLCBzdGFydCwgaHJlZiwgdGl0bGUsIGxhYmVsO1xuXG4gIGlmIChzdHIuY2hhckNvZGVBdCgwKSAhPT0gMHg1Qi8qIFsgKi8pIHsgcmV0dXJuIC0xOyB9XG5cbiAgaWYgKHN0ci5pbmRleE9mKCddOicpID09PSAtMSkgeyByZXR1cm4gLTE7IH1cblxuICBzdGF0ZSA9IG5ldyBTdGF0ZUlubGluZShzdHIsIHBhcnNlciwgb3B0aW9ucywgZW52LCBbXSk7XG4gIGxhYmVsRW5kID0gcGFyc2VMaW5rTGFiZWwoc3RhdGUsIDApO1xuXG4gIGlmIChsYWJlbEVuZCA8IDAgfHwgc3RyLmNoYXJDb2RlQXQobGFiZWxFbmQgKyAxKSAhPT0gMHgzQS8qIDogKi8pIHsgcmV0dXJuIC0xOyB9XG5cbiAgbWF4ID0gc3RhdGUucG9zTWF4O1xuXG4gIC8vIFtsYWJlbF06ICAgZGVzdGluYXRpb24gICAndGl0bGUnXG4gIC8vICAgICAgICAgXl5eIHNraXAgb3B0aW9uYWwgd2hpdGVzcGFjZSBoZXJlXG4gIGZvciAocG9zID0gbGFiZWxFbmQgKyAyOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgY29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcyk7XG4gICAgaWYgKGNvZGUgIT09IDB4MjAgJiYgY29kZSAhPT0gMHgwQSkgeyBicmVhazsgfVxuICB9XG5cbiAgLy8gW2xhYmVsXTogICBkZXN0aW5hdGlvbiAgICd0aXRsZSdcbiAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXiBwYXJzZSB0aGlzXG4gIGlmICghcGFyc2VMaW5rRGVzdGluYXRpb24oc3RhdGUsIHBvcykpIHsgcmV0dXJuIC0xOyB9XG4gIGhyZWYgPSBzdGF0ZS5saW5rQ29udGVudDtcbiAgcG9zID0gc3RhdGUucG9zO1xuXG4gIC8vIFtsYWJlbF06ICAgZGVzdGluYXRpb24gICAndGl0bGUnXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBeXl4gc2tpcHBpbmcgdGhvc2Ugc3BhY2VzXG4gIHN0YXJ0ID0gcG9zO1xuICBmb3IgKHBvcyA9IHBvcyArIDE7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICBjb2RlID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKTtcbiAgICBpZiAoY29kZSAhPT0gMHgyMCAmJiBjb2RlICE9PSAweDBBKSB7IGJyZWFrOyB9XG4gIH1cblxuICAvLyBbbGFiZWxdOiAgIGRlc3RpbmF0aW9uICAgJ3RpdGxlJ1xuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXiBwYXJzZSB0aGlzXG4gIGlmIChwb3MgPCBtYXggJiYgc3RhcnQgIT09IHBvcyAmJiBwYXJzZUxpbmtUaXRsZShzdGF0ZSwgcG9zKSkge1xuICAgIHRpdGxlID0gc3RhdGUubGlua0NvbnRlbnQ7XG4gICAgcG9zID0gc3RhdGUucG9zO1xuICB9IGVsc2Uge1xuICAgIHRpdGxlID0gJyc7XG4gICAgcG9zID0gc3RhcnQ7XG4gIH1cblxuICAvLyBlbnN1cmUgdGhhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIGlzIGVtcHR5XG4gIHdoaWxlIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgyMC8qIHNwYWNlICovKSB7IHBvcysrOyB9XG4gIGlmIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgwQSkgeyByZXR1cm4gLTE7IH1cblxuICBsYWJlbCA9IG5vcm1hbGl6ZVJlZmVyZW5jZShzdHIuc2xpY2UoMSwgbGFiZWxFbmQpKTtcbiAgaWYgKHR5cGVvZiBlbnYucmVmZXJlbmNlc1tsYWJlbF0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgZW52LnJlZmVyZW5jZXNbbGFiZWxdID0geyB0aXRsZTogdGl0bGUsIGhyZWY6IGhyZWYgfTtcbiAgfVxuXG4gIHJldHVybiBwb3M7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZWZlcmVuY2VzKHN0YXRlKSB7XG4gIHZhciB0b2tlbnMgPSBzdGF0ZS50b2tlbnMsIGksIGwsIGNvbnRlbnQsIHBvcztcblxuICBzdGF0ZS5lbnYucmVmZXJlbmNlcyA9IHN0YXRlLmVudi5yZWZlcmVuY2VzIHx8IHt9O1xuXG4gIGlmIChzdGF0ZS5pbmxpbmVNb2RlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU2NhbiBkZWZpbml0aW9ucyBpbiBwYXJhZ3JhcGggaW5saW5lc1xuICBmb3IgKGkgPSAxLCBsID0gdG9rZW5zLmxlbmd0aCAtIDE7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAodG9rZW5zW2ldLnR5cGUgPT09ICdpbmxpbmUnICYmXG4gICAgICAgIHRva2Vuc1tpIC0gMV0udHlwZSA9PT0gJ3BhcmFncmFwaF9vcGVuJyAmJlxuICAgICAgICB0b2tlbnNbaSArIDFdLnR5cGUgPT09ICdwYXJhZ3JhcGhfY2xvc2UnKSB7XG5cbiAgICAgIGNvbnRlbnQgPSB0b2tlbnNbaV0uY29udGVudDtcbiAgICAgIHdoaWxlIChjb250ZW50Lmxlbmd0aCkge1xuICAgICAgICBwb3MgPSBwYXJzZVJlZmVyZW5jZShjb250ZW50LCBzdGF0ZS5pbmxpbmUsIHN0YXRlLm9wdGlvbnMsIHN0YXRlLmVudik7XG4gICAgICAgIGlmIChwb3MgPCAwKSB7IGJyZWFrOyB9XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKHBvcykudHJpbSgpO1xuICAgICAgfVxuXG4gICAgICB0b2tlbnNbaV0uY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICBpZiAoIWNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgIHRva2Vuc1tpIC0gMV0udGlnaHQgPSB0cnVlO1xuICAgICAgICB0b2tlbnNbaSArIDFdLnRpZ2h0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG4iLCIvLyBTaW1wbGUgdHlwb2dyYXBoaWNhbCByZXBsYWNlbWVudHNcbi8vXG4ndXNlIHN0cmljdCc7XG5cbi8vIFRPRE86XG4vLyAtIGZyYWN0aW9uYWxzIDEvMiwgMS80LCAzLzQgLT4gwr0sIMK8LCDCvlxuLy8gLSBtaWx0aXBsaWNhdGlvbiAyIHggNCAtPiAyIMOXIDRcblxudmFyIFJBUkVfUkUgPSAvXFwrLXxcXC5cXC58XFw/XFw/XFw/XFw/fCEhISF8LCx8LS0vO1xuXG52YXIgU0NPUEVEX0FCQlJfUkUgPSAvXFwoKGN8dG18cnxwKVxcKS9pZztcbnZhciBTQ09QRURfQUJCUiA9IHtcbiAgJ2MnOiAnwqknLFxuICAncic6ICfCricsXG4gICdwJzogJ8KnJyxcbiAgJ3RtJzogJ+KEoidcbn07XG5cbmZ1bmN0aW9uIHJlcGxhY2VTY29wZWRBYmJyKHN0cikge1xuICBpZiAoc3RyLmluZGV4T2YoJygnKSA8IDApIHsgcmV0dXJuIHN0cjsgfVxuXG4gIHJldHVybiBzdHIucmVwbGFjZShTQ09QRURfQUJCUl9SRSwgZnVuY3Rpb24obWF0Y2gsIG5hbWUpIHtcbiAgICByZXR1cm4gU0NPUEVEX0FCQlJbbmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgfSk7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXBsYWNlKHN0YXRlKSB7XG4gIHZhciBpLCB0b2tlbiwgdGV4dCwgaW5saW5lVG9rZW5zLCBibGtJZHg7XG5cbiAgaWYgKCFzdGF0ZS5vcHRpb25zLnR5cG9ncmFwaGVyKSB7IHJldHVybjsgfVxuXG4gIGZvciAoYmxrSWR4ID0gc3RhdGUudG9rZW5zLmxlbmd0aCAtIDE7IGJsa0lkeCA+PSAwOyBibGtJZHgtLSkge1xuXG4gICAgaWYgKHN0YXRlLnRva2Vuc1tibGtJZHhdLnR5cGUgIT09ICdpbmxpbmUnKSB7IGNvbnRpbnVlOyB9XG5cbiAgICBpbmxpbmVUb2tlbnMgPSBzdGF0ZS50b2tlbnNbYmxrSWR4XS5jaGlsZHJlbjtcblxuICAgIGZvciAoaSA9IGlubGluZVRva2Vucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdG9rZW4gPSBpbmxpbmVUb2tlbnNbaV07XG4gICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgIHRleHQgPSB0b2tlbi5jb250ZW50O1xuXG4gICAgICAgIHRleHQgPSByZXBsYWNlU2NvcGVkQWJicih0ZXh0KTtcblxuICAgICAgICBpZiAoUkFSRV9SRS50ZXN0KHRleHQpKSB7XG4gICAgICAgICAgdGV4dCA9IHRleHRcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXCstL2csICfCsScpXG4gICAgICAgICAgICAvLyAuLiwgLi4uLCAuLi4uLi4uIC0+IOKAplxuICAgICAgICAgICAgLy8gYnV0ID8uLi4uLiAmICEuLi4uLiAtPiA/Li4gJiAhLi5cbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXC57Mix9L2csICfigKYnKS5yZXBsYWNlKC8oWz8hXSnigKYvZywgJyQxLi4nKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyhbPyFdKXs0LH0vZywgJyQxJDEkMScpLnJlcGxhY2UoLyx7Mix9L2csICcsJylcbiAgICAgICAgICAgIC8vIGVtLWRhc2hcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oXnxbXi1dKS0tLShbXi1dfCQpL21nLCAnJDFcXHUyMDE0JDInKVxuICAgICAgICAgICAgLy8gZW4tZGFzaFxuICAgICAgICAgICAgLnJlcGxhY2UoLyhefFxccyktLShcXHN8JCkvbWcsICckMVxcdTIwMTMkMicpXG4gICAgICAgICAgICAucmVwbGFjZSgvKF58W14tXFxzXSktLShbXi1cXHNdfCQpL21nLCAnJDFcXHUyMDEzJDInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRva2VuLmNvbnRlbnQgPSB0ZXh0O1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbiIsIi8vIENvbnZlcnQgc3RyYWlnaHQgcXVvdGF0aW9uIG1hcmtzIHRvIHR5cG9ncmFwaGljIG9uZXNcbi8vXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFFVT1RFX1RFU1RfUkUgPSAvWydcIl0vO1xudmFyIFFVT1RFX1JFID0gL1snXCJdL2c7XG52YXIgUFVOQ1RfUkUgPSAvWy1cXHMoKVxcW1xcXV0vO1xudmFyIEFQT1NUUk9QSEUgPSAn4oCZJztcblxuLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBhdCBgcG9zYFxuLy8gY291bGQgYmUgaW5zaWRlIGEgd29yZC5cbmZ1bmN0aW9uIGlzTGV0dGVyKHN0ciwgcG9zKSB7XG4gIGlmIChwb3MgPCAwIHx8IHBvcyA+PSBzdHIubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfVxuICByZXR1cm4gIVBVTkNUX1JFLnRlc3Qoc3RyW3Bvc10pO1xufVxuXG5cbmZ1bmN0aW9uIHJlcGxhY2VBdChzdHIsIGluZGV4LCBjaCkge1xuICByZXR1cm4gc3RyLnN1YnN0cigwLCBpbmRleCkgKyBjaCArIHN0ci5zdWJzdHIoaW5kZXggKyAxKTtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNtYXJ0cXVvdGVzKHN0YXRlKSB7XG4gIC8qZXNsaW50IG1heC1kZXB0aDowKi9cbiAgdmFyIGksIHRva2VuLCB0ZXh0LCB0LCBwb3MsIG1heCwgdGhpc0xldmVsLCBsYXN0U3BhY2UsIG5leHRTcGFjZSwgaXRlbSxcbiAgICAgIGNhbk9wZW4sIGNhbkNsb3NlLCBqLCBpc1NpbmdsZSwgYmxrSWR4LCB0b2tlbnMsXG4gICAgICBzdGFjaztcblxuICBpZiAoIXN0YXRlLm9wdGlvbnMudHlwb2dyYXBoZXIpIHsgcmV0dXJuOyB9XG5cbiAgc3RhY2sgPSBbXTtcblxuICBmb3IgKGJsa0lkeCA9IHN0YXRlLnRva2Vucy5sZW5ndGggLSAxOyBibGtJZHggPj0gMDsgYmxrSWR4LS0pIHtcblxuICAgIGlmIChzdGF0ZS50b2tlbnNbYmxrSWR4XS50eXBlICE9PSAnaW5saW5lJykgeyBjb250aW51ZTsgfVxuXG4gICAgdG9rZW5zID0gc3RhdGUudG9rZW5zW2Jsa0lkeF0uY2hpbGRyZW47XG4gICAgc3RhY2subGVuZ3RoID0gMDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuXG4gICAgICBpZiAodG9rZW4udHlwZSAhPT0gJ3RleHQnIHx8IFFVT1RFX1RFU1RfUkUudGVzdCh0b2tlbi50ZXh0KSkgeyBjb250aW51ZTsgfVxuXG4gICAgICB0aGlzTGV2ZWwgPSB0b2tlbnNbaV0ubGV2ZWw7XG5cbiAgICAgIGZvciAoaiA9IHN0YWNrLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIGlmIChzdGFja1tqXS5sZXZlbCA8PSB0aGlzTGV2ZWwpIHsgYnJlYWs7IH1cbiAgICAgIH1cbiAgICAgIHN0YWNrLmxlbmd0aCA9IGogKyAxO1xuXG4gICAgICB0ZXh0ID0gdG9rZW4uY29udGVudDtcbiAgICAgIHBvcyA9IDA7XG4gICAgICBtYXggPSB0ZXh0Lmxlbmd0aDtcblxuICAgICAgLyplc2xpbnQgbm8tbGFiZWxzOjAsYmxvY2stc2NvcGVkLXZhcjowKi9cbiAgICAgIE9VVEVSOlxuICAgICAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgICAgICBRVU9URV9SRS5sYXN0SW5kZXggPSBwb3M7XG4gICAgICAgIHQgPSBRVU9URV9SRS5leGVjKHRleHQpO1xuICAgICAgICBpZiAoIXQpIHsgYnJlYWs7IH1cblxuICAgICAgICBsYXN0U3BhY2UgPSAhaXNMZXR0ZXIodGV4dCwgdC5pbmRleCAtIDEpO1xuICAgICAgICBwb3MgPSB0LmluZGV4ICsgMTtcbiAgICAgICAgaXNTaW5nbGUgPSAodFswXSA9PT0gXCInXCIpO1xuICAgICAgICBuZXh0U3BhY2UgPSAhaXNMZXR0ZXIodGV4dCwgcG9zKTtcblxuICAgICAgICBpZiAoIW5leHRTcGFjZSAmJiAhbGFzdFNwYWNlKSB7XG4gICAgICAgICAgLy8gbWlkZGxlIG9mIHdvcmRcbiAgICAgICAgICBpZiAoaXNTaW5nbGUpIHtcbiAgICAgICAgICAgIHRva2VuLmNvbnRlbnQgPSByZXBsYWNlQXQodG9rZW4uY29udGVudCwgdC5pbmRleCwgQVBPU1RST1BIRSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FuT3BlbiA9ICFuZXh0U3BhY2U7XG4gICAgICAgIGNhbkNsb3NlID0gIWxhc3RTcGFjZTtcblxuICAgICAgICBpZiAoY2FuQ2xvc2UpIHtcbiAgICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIGEgY2xvc2luZyBxdW90ZSwgcmV3aW5kIHRoZSBzdGFjayB0byBnZXQgYSBtYXRjaFxuICAgICAgICAgIGZvciAoaiA9IHN0YWNrLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgICBpdGVtID0gc3RhY2tbal07XG4gICAgICAgICAgICBpZiAoc3RhY2tbal0ubGV2ZWwgPCB0aGlzTGV2ZWwpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIGlmIChpdGVtLnNpbmdsZSA9PT0gaXNTaW5nbGUgJiYgc3RhY2tbal0ubGV2ZWwgPT09IHRoaXNMZXZlbCkge1xuICAgICAgICAgICAgICBpdGVtID0gc3RhY2tbal07XG4gICAgICAgICAgICAgIGlmIChpc1NpbmdsZSkge1xuICAgICAgICAgICAgICAgIHRva2Vuc1tpdGVtLnRva2VuXS5jb250ZW50ID0gcmVwbGFjZUF0KHRva2Vuc1tpdGVtLnRva2VuXS5jb250ZW50LCBpdGVtLnBvcywgc3RhdGUub3B0aW9ucy5xdW90ZXNbMl0pO1xuICAgICAgICAgICAgICAgIHRva2VuLmNvbnRlbnQgPSByZXBsYWNlQXQodG9rZW4uY29udGVudCwgdC5pbmRleCwgc3RhdGUub3B0aW9ucy5xdW90ZXNbM10pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRva2Vuc1tpdGVtLnRva2VuXS5jb250ZW50ID0gcmVwbGFjZUF0KHRva2Vuc1tpdGVtLnRva2VuXS5jb250ZW50LCBpdGVtLnBvcywgc3RhdGUub3B0aW9ucy5xdW90ZXNbMF0pO1xuICAgICAgICAgICAgICAgIHRva2VuLmNvbnRlbnQgPSByZXBsYWNlQXQodG9rZW4uY29udGVudCwgdC5pbmRleCwgc3RhdGUub3B0aW9ucy5xdW90ZXNbMV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IGo7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIE9VVEVSO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYW5PcGVuKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICB0b2tlbjogaSxcbiAgICAgICAgICAgIHBvczogdC5pbmRleCxcbiAgICAgICAgICAgIHNpbmdsZTogaXNTaW5nbGUsXG4gICAgICAgICAgICBsZXZlbDogdGhpc0xldmVsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2FuQ2xvc2UgJiYgaXNTaW5nbGUpIHtcbiAgICAgICAgICB0b2tlbi5jb250ZW50ID0gcmVwbGFjZUF0KHRva2VuLmNvbnRlbnQsIHQuaW5kZXgsIEFQT1NUUk9QSEUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuIiwiLy8gUHJvY2VzcyBhdXRvbGlua3MgJzxwcm90b2NvbDouLi4+J1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciB1cmxfc2NoZW1hcyAgID0gcmVxdWlyZSgnLi4vY29tbW9uL3VybF9zY2hlbWFzJyk7XG52YXIgbm9ybWFsaXplTGluayA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvbm9ybWFsaXplX2xpbmsnKTtcblxuXG4vKmVzbGludCBtYXgtbGVuOjAqL1xudmFyIEVNQUlMX1JFICAgID0gL148KFthLXpBLVowLTkuISMkJSYnKitcXC89P15fYHt8fX4tXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSopPi87XG52YXIgQVVUT0xJTktfUkUgPSAvXjwoW2EtekEtWi5cXC1dezEsMjV9KTooW148PlxceDAwLVxceDIwXSopPi87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhdXRvbGluayhzdGF0ZSwgc2lsZW50KSB7XG4gIHZhciB0YWlsLCBsaW5rTWF0Y2gsIGVtYWlsTWF0Y2gsIHVybCwgZnVsbFVybCwgcG9zID0gc3RhdGUucG9zO1xuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDNDLyogPCAqLykgeyByZXR1cm4gZmFsc2U7IH1cblxuICB0YWlsID0gc3RhdGUuc3JjLnNsaWNlKHBvcyk7XG5cbiAgaWYgKHRhaWwuaW5kZXhPZignPicpIDwgMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBsaW5rTWF0Y2ggPSB0YWlsLm1hdGNoKEFVVE9MSU5LX1JFKTtcblxuICBpZiAobGlua01hdGNoKSB7XG4gICAgaWYgKHVybF9zY2hlbWFzLmluZGV4T2YobGlua01hdGNoWzFdLnRvTG93ZXJDYXNlKCkpIDwgMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgIHVybCA9IGxpbmtNYXRjaFswXS5zbGljZSgxLCAtMSk7XG4gICAgZnVsbFVybCA9IG5vcm1hbGl6ZUxpbmsodXJsKTtcbiAgICBpZiAoIXN0YXRlLnBhcnNlci52YWxpZGF0ZUxpbmsodXJsKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBzdGF0ZS5wdXNoKHtcbiAgICAgICAgdHlwZTogJ2xpbmtfb3BlbicsXG4gICAgICAgIGhyZWY6IGZ1bGxVcmwsXG4gICAgICAgIGxldmVsOiBzdGF0ZS5sZXZlbFxuICAgICAgfSk7XG4gICAgICBzdGF0ZS5wdXNoKHtcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICBjb250ZW50OiB1cmwsXG4gICAgICAgIGxldmVsOiBzdGF0ZS5sZXZlbCArIDFcbiAgICAgIH0pO1xuICAgICAgc3RhdGUucHVzaCh7IHR5cGU6ICdsaW5rX2Nsb3NlJywgbGV2ZWw6IHN0YXRlLmxldmVsIH0pO1xuICAgIH1cblxuICAgIHN0YXRlLnBvcyArPSBsaW5rTWF0Y2hbMF0ubGVuZ3RoO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZW1haWxNYXRjaCA9IHRhaWwubWF0Y2goRU1BSUxfUkUpO1xuXG4gIGlmIChlbWFpbE1hdGNoKSB7XG5cbiAgICB1cmwgPSBlbWFpbE1hdGNoWzBdLnNsaWNlKDEsIC0xKTtcblxuICAgIGZ1bGxVcmwgPSBub3JtYWxpemVMaW5rKCdtYWlsdG86JyArIHVybCk7XG4gICAgaWYgKCFzdGF0ZS5wYXJzZXIudmFsaWRhdGVMaW5rKGZ1bGxVcmwpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIHN0YXRlLnB1c2goe1xuICAgICAgICB0eXBlOiAnbGlua19vcGVuJyxcbiAgICAgICAgaHJlZjogZnVsbFVybCxcbiAgICAgICAgbGV2ZWw6IHN0YXRlLmxldmVsXG4gICAgICB9KTtcbiAgICAgIHN0YXRlLnB1c2goe1xuICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIGNvbnRlbnQ6IHVybCxcbiAgICAgICAgbGV2ZWw6IHN0YXRlLmxldmVsICsgMVxuICAgICAgfSk7XG4gICAgICBzdGF0ZS5wdXNoKHsgdHlwZTogJ2xpbmtfY2xvc2UnLCBsZXZlbDogc3RhdGUubGV2ZWwgfSk7XG4gICAgfVxuXG4gICAgc3RhdGUucG9zICs9IGVtYWlsTWF0Y2hbMF0ubGVuZ3RoO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcbiIsIi8vIFBhcnNlIGJhY2t0aWNrc1xuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmFja3RpY2tzKHN0YXRlLCBzaWxlbnQpIHtcbiAgdmFyIHN0YXJ0LCBtYXgsIG1hcmtlciwgbWF0Y2hTdGFydCwgbWF0Y2hFbmQsXG4gICAgICBwb3MgPSBzdGF0ZS5wb3MsXG4gICAgICBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcyk7XG5cbiAgaWYgKGNoICE9PSAweDYwLyogYCAqLykgeyByZXR1cm4gZmFsc2U7IH1cblxuICBzdGFydCA9IHBvcztcbiAgcG9zKys7XG4gIG1heCA9IHN0YXRlLnBvc01heDtcblxuICB3aGlsZSAocG9zIDwgbWF4ICYmIHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgPT09IDB4NjAvKiBgICovKSB7IHBvcysrOyB9XG5cbiAgbWFya2VyID0gc3RhdGUuc3JjLnNsaWNlKHN0YXJ0LCBwb3MpO1xuXG4gIG1hdGNoU3RhcnQgPSBtYXRjaEVuZCA9IHBvcztcblxuICB3aGlsZSAoKG1hdGNoU3RhcnQgPSBzdGF0ZS5zcmMuaW5kZXhPZignYCcsIG1hdGNoRW5kKSkgIT09IC0xKSB7XG4gICAgbWF0Y2hFbmQgPSBtYXRjaFN0YXJ0ICsgMTtcblxuICAgIHdoaWxlIChtYXRjaEVuZCA8IG1heCAmJiBzdGF0ZS5zcmMuY2hhckNvZGVBdChtYXRjaEVuZCkgPT09IDB4NjAvKiBgICovKSB7IG1hdGNoRW5kKys7IH1cblxuICAgIGlmIChtYXRjaEVuZCAtIG1hdGNoU3RhcnQgPT09IG1hcmtlci5sZW5ndGgpIHtcbiAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgIHN0YXRlLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdjb2RlJyxcbiAgICAgICAgICBjb250ZW50OiBzdGF0ZS5zcmMuc2xpY2UocG9zLCBtYXRjaFN0YXJ0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1sgXFxuXSsvZywgJyAnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyaW0oKSxcbiAgICAgICAgICBibG9jazogZmFsc2UsXG4gICAgICAgICAgbGV2ZWw6IHN0YXRlLmxldmVsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgc3RhdGUucG9zID0gbWF0Y2hFbmQ7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXNpbGVudCkgeyBzdGF0ZS5wZW5kaW5nICs9IG1hcmtlcjsgfVxuICBzdGF0ZS5wb3MgKz0gbWFya2VyLmxlbmd0aDtcbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiLy8gUHJvY2VzcyB+fmRlbGV0ZWQgdGV4dH5+XG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWwoc3RhdGUsIHNpbGVudCkge1xuICB2YXIgZm91bmQsXG4gICAgICBwb3MsXG4gICAgICBzdGFjayxcbiAgICAgIG1heCA9IHN0YXRlLnBvc01heCxcbiAgICAgIHN0YXJ0ID0gc3RhdGUucG9zLFxuICAgICAgbGFzdENoYXIsXG4gICAgICBuZXh0Q2hhcjtcblxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhcnQpICE9PSAweDdFLyogfiAqLykgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gZmFsc2U7IH0gLy8gZG9uJ3QgcnVuIGFueSBwYWlycyBpbiB2YWxpZGF0aW9uIG1vZGVcbiAgaWYgKHN0YXJ0ICsgNCA+PSBtYXgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGFydCArIDEpICE9PSAweDdFLyogfiAqLykgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHN0YXRlLmxldmVsID49IHN0YXRlLm9wdGlvbnMubWF4TmVzdGluZykgeyByZXR1cm4gZmFsc2U7IH1cblxuICBsYXN0Q2hhciA9IHN0YXJ0ID4gMCA/IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXJ0IC0gMSkgOiAtMTtcbiAgbmV4dENoYXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGFydCArIDIpO1xuXG4gIGlmIChsYXN0Q2hhciA9PT0gMHg3RS8qIH4gKi8pIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChuZXh0Q2hhciA9PT0gMHg3RS8qIH4gKi8pIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChuZXh0Q2hhciA9PT0gMHgyMCB8fCBuZXh0Q2hhciA9PT0gMHgwQSkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBwb3MgPSBzdGFydCArIDI7XG4gIHdoaWxlIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHg3RS8qIH4gKi8pIHsgcG9zKys7IH1cbiAgaWYgKHBvcyA+IHN0YXJ0ICsgMykge1xuICAgIC8vIHNlcXVlbmNlIG9mIDQrIG1hcmtlcnMgdGFraW5nIGFzIGxpdGVyYWwsIHNhbWUgYXMgaW4gYSBlbXBoYXNpc1xuICAgIHN0YXRlLnBvcyArPSBwb3MgLSBzdGFydDtcbiAgICBpZiAoIXNpbGVudCkgeyBzdGF0ZS5wZW5kaW5nICs9IHN0YXRlLnNyYy5zbGljZShzdGFydCwgcG9zKTsgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhdGUucG9zID0gc3RhcnQgKyAyO1xuICBzdGFjayA9IDE7XG5cbiAgd2hpbGUgKHN0YXRlLnBvcyArIDEgPCBtYXgpIHtcbiAgICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhdGUucG9zKSA9PT0gMHg3RS8qIH4gKi8pIHtcbiAgICAgIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGF0ZS5wb3MgKyAxKSA9PT0gMHg3RS8qIH4gKi8pIHtcbiAgICAgICAgbGFzdENoYXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGF0ZS5wb3MgLSAxKTtcbiAgICAgICAgbmV4dENoYXIgPSBzdGF0ZS5wb3MgKyAyIDwgbWF4ID8gc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhdGUucG9zICsgMikgOiAtMTtcbiAgICAgICAgaWYgKG5leHRDaGFyICE9PSAweDdFLyogfiAqLyAmJiBsYXN0Q2hhciAhPT0gMHg3RS8qIH4gKi8pIHtcbiAgICAgICAgICBpZiAobGFzdENoYXIgIT09IDB4MjAgJiYgbGFzdENoYXIgIT09IDB4MEEpIHtcbiAgICAgICAgICAgIC8vIGNsb3NpbmcgJ35+J1xuICAgICAgICAgICAgc3RhY2stLTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5leHRDaGFyICE9PSAweDIwICYmIG5leHRDaGFyICE9PSAweDBBKSB7XG4gICAgICAgICAgICAvLyBvcGVuaW5nICd+fidcbiAgICAgICAgICAgIHN0YWNrKys7XG4gICAgICAgICAgfSAvLyBlbHNlIHtcbiAgICAgICAgICAgIC8vICAvLyBzdGFuZGFsb25lICcgfn4gJyBpbmRlbnRlZCB3aXRoIHNwYWNlc1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgIGlmIChzdGFjayA8PSAwKSB7XG4gICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0ZS5wYXJzZXIuc2tpcFRva2VuKHN0YXRlKTtcbiAgfVxuXG4gIGlmICghZm91bmQpIHtcbiAgICAvLyBwYXJzZXIgZmFpbGVkIHRvIGZpbmQgZW5kaW5nIHRhZywgc28gaXQncyBub3QgdmFsaWQgZW1waGFzaXNcbiAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBmb3VuZCFcbiAgc3RhdGUucG9zTWF4ID0gc3RhdGUucG9zO1xuICBzdGF0ZS5wb3MgPSBzdGFydCArIDI7XG5cbiAgaWYgKCFzaWxlbnQpIHtcbiAgICBzdGF0ZS5wdXNoKHsgdHlwZTogJ2RlbF9vcGVuJywgbGV2ZWw6IHN0YXRlLmxldmVsKysgfSk7XG4gICAgc3RhdGUucGFyc2VyLnRva2VuaXplKHN0YXRlKTtcbiAgICBzdGF0ZS5wdXNoKHsgdHlwZTogJ2RlbF9jbG9zZScsIGxldmVsOiAtLXN0YXRlLmxldmVsIH0pO1xuICB9XG5cbiAgc3RhdGUucG9zID0gc3RhdGUucG9zTWF4ICsgMjtcbiAgc3RhdGUucG9zTWF4ID0gbWF4O1xuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCIvLyBQcm9jZXNzICp0aGlzKiBhbmQgX3RoYXRfXG5cbid1c2Ugc3RyaWN0JztcblxuXG5mdW5jdGlvbiBpc0FscGhhTnVtKGNvZGUpIHtcbiAgcmV0dXJuIChjb2RlID49IDB4MzAgLyogMCAqLyAmJiBjb2RlIDw9IDB4MzkgLyogOSAqLykgfHxcbiAgICAgICAgIChjb2RlID49IDB4NDEgLyogQSAqLyAmJiBjb2RlIDw9IDB4NUEgLyogWiAqLykgfHxcbiAgICAgICAgIChjb2RlID49IDB4NjEgLyogYSAqLyAmJiBjb2RlIDw9IDB4N0EgLyogeiAqLyk7XG59XG5cbi8vIHBhcnNlIHNlcXVlbmNlIG9mIGVtcGhhc2lzIG1hcmtlcnMsXG4vLyBcInN0YXJ0XCIgc2hvdWxkIHBvaW50IGF0IGEgdmFsaWQgbWFya2VyXG5mdW5jdGlvbiBzY2FuRGVsaW1zKHN0YXRlLCBzdGFydCkge1xuICB2YXIgcG9zID0gc3RhcnQsIGxhc3RDaGFyLCBuZXh0Q2hhciwgY291bnQsXG4gICAgICBjYW5fb3BlbiA9IHRydWUsXG4gICAgICBjYW5fY2xvc2UgPSB0cnVlLFxuICAgICAgbWF4ID0gc3RhdGUucG9zTWF4LFxuICAgICAgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhcnQpO1xuXG4gIGxhc3RDaGFyID0gc3RhcnQgPiAwID8gc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhcnQgLSAxKSA6IC0xO1xuXG4gIHdoaWxlIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gbWFya2VyKSB7IHBvcysrOyB9XG4gIGlmIChwb3MgPj0gbWF4KSB7IGNhbl9vcGVuID0gZmFsc2U7IH1cbiAgY291bnQgPSBwb3MgLSBzdGFydDtcblxuICBpZiAoY291bnQgPj0gNCkge1xuICAgIC8vIHNlcXVlbmNlIG9mIGZvdXIgb3IgbW9yZSB1bmVzY2FwZWQgbWFya2VycyBjYW4ndCBzdGFydC9lbmQgYW4gZW1waGFzaXNcbiAgICBjYW5fb3BlbiA9IGNhbl9jbG9zZSA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIG5leHRDaGFyID0gcG9zIDwgbWF4ID8gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA6IC0xO1xuXG4gICAgLy8gY2hlY2sgd2hpdGVzcGFjZSBjb25kaXRpb25zXG4gICAgaWYgKG5leHRDaGFyID09PSAweDIwIHx8IG5leHRDaGFyID09PSAweDBBKSB7IGNhbl9vcGVuID0gZmFsc2U7IH1cbiAgICBpZiAobGFzdENoYXIgPT09IDB4MjAgfHwgbGFzdENoYXIgPT09IDB4MEEpIHsgY2FuX2Nsb3NlID0gZmFsc2U7IH1cblxuICAgIGlmIChtYXJrZXIgPT09IDB4NUYgLyogXyAqLykge1xuICAgICAgLy8gY2hlY2sgaWYgd2UgYXJlbid0IGluc2lkZSB0aGUgd29yZFxuICAgICAgaWYgKGlzQWxwaGFOdW0obGFzdENoYXIpKSB7IGNhbl9vcGVuID0gZmFsc2U7IH1cbiAgICAgIGlmIChpc0FscGhhTnVtKG5leHRDaGFyKSkgeyBjYW5fY2xvc2UgPSBmYWxzZTsgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2FuX29wZW46IGNhbl9vcGVuLFxuICAgIGNhbl9jbG9zZTogY2FuX2Nsb3NlLFxuICAgIGRlbGltczogY291bnRcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlbXBoYXNpcyhzdGF0ZSwgc2lsZW50KSB7XG4gIHZhciBzdGFydENvdW50LFxuICAgICAgY291bnQsXG4gICAgICBmb3VuZCxcbiAgICAgIG9sZENvdW50LFxuICAgICAgbmV3Q291bnQsXG4gICAgICBzdGFjayxcbiAgICAgIHJlcyxcbiAgICAgIG1heCA9IHN0YXRlLnBvc01heCxcbiAgICAgIHN0YXJ0ID0gc3RhdGUucG9zLFxuICAgICAgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhcnQpO1xuXG4gIGlmIChtYXJrZXIgIT09IDB4NUYvKiBfICovICYmIG1hcmtlciAhPT0gMHgyQSAvKiAqICovKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoc2lsZW50KSB7IHJldHVybiBmYWxzZTsgfSAvLyBkb24ndCBydW4gYW55IHBhaXJzIGluIHZhbGlkYXRpb24gbW9kZVxuXG4gIHJlcyA9IHNjYW5EZWxpbXMoc3RhdGUsIHN0YXJ0KTtcbiAgc3RhcnRDb3VudCA9IHJlcy5kZWxpbXM7XG4gIGlmICghcmVzLmNhbl9vcGVuKSB7XG4gICAgc3RhdGUucG9zICs9IHN0YXJ0Q291bnQ7XG4gICAgaWYgKCFzaWxlbnQpIHsgc3RhdGUucGVuZGluZyArPSBzdGF0ZS5zcmMuc2xpY2Uoc3RhcnQsIHN0YXRlLnBvcyk7IH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5sZXZlbCA+PSBzdGF0ZS5vcHRpb25zLm1heE5lc3RpbmcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgc3RhdGUucG9zID0gc3RhcnQgKyBzdGFydENvdW50O1xuICBzdGFjayA9IFsgc3RhcnRDb3VudCBdO1xuXG4gIHdoaWxlIChzdGF0ZS5wb3MgPCBtYXgpIHtcbiAgICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhdGUucG9zKSA9PT0gbWFya2VyKSB7XG4gICAgICByZXMgPSBzY2FuRGVsaW1zKHN0YXRlLCBzdGF0ZS5wb3MpO1xuICAgICAgY291bnQgPSByZXMuZGVsaW1zO1xuICAgICAgaWYgKHJlcy5jYW5fY2xvc2UpIHtcbiAgICAgICAgb2xkQ291bnQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgbmV3Q291bnQgPSBjb3VudDtcblxuICAgICAgICB3aGlsZSAob2xkQ291bnQgIT09IG5ld0NvdW50KSB7XG4gICAgICAgICAgaWYgKG5ld0NvdW50IDwgb2xkQ291bnQpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gob2xkQ291bnQgLSBuZXdDb3VudCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBhc3NlcnQobmV3Q291bnQgPiBvbGRDb3VudClcbiAgICAgICAgICBuZXdDb3VudCAtPSBvbGRDb3VudDtcblxuICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsgYnJlYWs7IH1cbiAgICAgICAgICBzdGF0ZS5wb3MgKz0gb2xkQ291bnQ7XG4gICAgICAgICAgb2xkQ291bnQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBzdGFydENvdW50ID0gb2xkQ291bnQ7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnBvcyArPSBjb3VudDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXMuY2FuX29wZW4pIHsgc3RhY2sucHVzaChjb3VudCk7IH1cbiAgICAgIHN0YXRlLnBvcyArPSBjb3VudDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHN0YXRlLnBhcnNlci5za2lwVG9rZW4oc3RhdGUpO1xuICB9XG5cbiAgaWYgKCFmb3VuZCkge1xuICAgIC8vIHBhcnNlciBmYWlsZWQgdG8gZmluZCBlbmRpbmcgdGFnLCBzbyBpdCdzIG5vdCB2YWxpZCBlbXBoYXNpc1xuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGZvdW5kIVxuICBzdGF0ZS5wb3NNYXggPSBzdGF0ZS5wb3M7XG4gIHN0YXRlLnBvcyA9IHN0YXJ0ICsgc3RhcnRDb3VudDtcblxuICBpZiAoIXNpbGVudCkge1xuICAgIGlmIChzdGFydENvdW50ID09PSAyIHx8IHN0YXJ0Q291bnQgPT09IDMpIHtcbiAgICAgIHN0YXRlLnB1c2goeyB0eXBlOiAnc3Ryb25nX29wZW4nLCBsZXZlbDogc3RhdGUubGV2ZWwrKyB9KTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0Q291bnQgPT09IDEgfHwgc3RhcnRDb3VudCA9PT0gMykge1xuICAgICAgc3RhdGUucHVzaCh7IHR5cGU6ICdlbV9vcGVuJywgbGV2ZWw6IHN0YXRlLmxldmVsKysgfSk7XG4gICAgfVxuXG4gICAgc3RhdGUucGFyc2VyLnRva2VuaXplKHN0YXRlKTtcblxuICAgIGlmIChzdGFydENvdW50ID09PSAxIHx8IHN0YXJ0Q291bnQgPT09IDMpIHtcbiAgICAgIHN0YXRlLnB1c2goeyB0eXBlOiAnZW1fY2xvc2UnLCBsZXZlbDogLS1zdGF0ZS5sZXZlbCB9KTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0Q291bnQgPT09IDIgfHwgc3RhcnRDb3VudCA9PT0gMykge1xuICAgICAgc3RhdGUucHVzaCh7IHR5cGU6ICdzdHJvbmdfY2xvc2UnLCBsZXZlbDogLS1zdGF0ZS5sZXZlbCB9KTtcbiAgICB9XG4gIH1cblxuICBzdGF0ZS5wb3MgPSBzdGF0ZS5wb3NNYXggKyBzdGFydENvdW50O1xuICBzdGF0ZS5wb3NNYXggPSBtYXg7XG4gIHJldHVybiB0cnVlO1xufTtcbiIsIi8vIFByb2Nlc3MgaHRtbCBlbnRpdHkgLSAmIzEyMzssICYjeEFGOywgJnF1b3Q7LCAuLi5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW50aXRpZXMgICAgICAgICAgPSByZXF1aXJlKCcuLi9jb21tb24vZW50aXRpZXMnKTtcbnZhciBoYXMgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4uL2NvbW1vbi91dGlscycpLmhhcztcbnZhciBpc1ZhbGlkRW50aXR5Q29kZSA9IHJlcXVpcmUoJy4uL2NvbW1vbi91dGlscycpLmlzVmFsaWRFbnRpdHlDb2RlO1xudmFyIGZyb21Db2RlUG9pbnQgICAgID0gcmVxdWlyZSgnLi4vY29tbW9uL3V0aWxzJykuZnJvbUNvZGVQb2ludDtcblxuXG52YXIgRElHSVRBTF9SRSA9IC9eJiMoKD86eFthLWYwLTldezEsOH18WzAtOV17MSw4fSkpOy9pO1xudmFyIE5BTUVEX1JFICAgPSAvXiYoW2Etel1bYS16MC05XXsxLDMxfSk7L2k7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlbnRpdHkoc3RhdGUsIHNpbGVudCkge1xuICB2YXIgY2gsIGNvZGUsIG1hdGNoLCBwb3MgPSBzdGF0ZS5wb3MsIG1heCA9IHN0YXRlLnBvc01heDtcblxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgyNi8qICYgKi8pIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgaWYgKHBvcyArIDEgPCBtYXgpIHtcbiAgICBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcyArIDEpO1xuXG4gICAgaWYgKGNoID09PSAweDIzIC8qICMgKi8pIHtcbiAgICAgIG1hdGNoID0gc3RhdGUuc3JjLnNsaWNlKHBvcykubWF0Y2goRElHSVRBTF9SRSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgICBjb2RlID0gbWF0Y2hbMV1bMF0udG9Mb3dlckNhc2UoKSA9PT0gJ3gnID8gcGFyc2VJbnQobWF0Y2hbMV0uc2xpY2UoMSksIDE2KSA6IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgc3RhdGUucGVuZGluZyArPSBpc1ZhbGlkRW50aXR5Q29kZShjb2RlKSA/IGZyb21Db2RlUG9pbnQoY29kZSkgOiBmcm9tQ29kZVBvaW50KDB4RkZGRCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUucG9zICs9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hdGNoID0gc3RhdGUuc3JjLnNsaWNlKHBvcykubWF0Y2goTkFNRURfUkUpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGlmIChoYXMoZW50aXRpZXMsIG1hdGNoWzFdKSkge1xuICAgICAgICAgIGlmICghc2lsZW50KSB7IHN0YXRlLnBlbmRpbmcgKz0gZW50aXRpZXNbbWF0Y2hbMV1dOyB9XG4gICAgICAgICAgc3RhdGUucG9zICs9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghc2lsZW50KSB7IHN0YXRlLnBlbmRpbmcgKz0gJyYnOyB9XG4gIHN0YXRlLnBvcysrO1xuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCIvLyBQcm9jZWVzcyBlc2NhcGVkIGNoYXJzIGFuZCBoYXJkYnJlYWtzXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEVTQ0FQRUQgPSBbXTtcblxuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykgeyBFU0NBUEVELnB1c2goMCk7IH1cblxuJ1xcXFwhXCIjJCUmXFwnKCkqKywuLzo7PD0+P0BbXV5fYHt8fX4tJ1xuICAuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24oY2gpIHsgRVNDQVBFRFtjaC5jaGFyQ29kZUF0KDApXSA9IDE7IH0pO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXNjYXBlKHN0YXRlLCBzaWxlbnQpIHtcbiAgdmFyIGNoLCBwb3MgPSBzdGF0ZS5wb3MsIG1heCA9IHN0YXRlLnBvc01heDtcblxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHg1Qy8qIFxcICovKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIHBvcysrO1xuXG4gIGlmIChwb3MgPCBtYXgpIHtcbiAgICBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcyk7XG5cbiAgICBpZiAoY2ggPCAyNTYgJiYgRVNDQVBFRFtjaF0gIT09IDApIHtcbiAgICAgIGlmICghc2lsZW50KSB7IHN0YXRlLnBlbmRpbmcgKz0gc3RhdGUuc3JjW3Bvc107IH1cbiAgICAgIHN0YXRlLnBvcyArPSAyO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAweDBBKSB7XG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICBzdGF0ZS5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnaGFyZGJyZWFrJyxcbiAgICAgICAgICBsZXZlbDogc3RhdGUubGV2ZWxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHBvcysrO1xuICAgICAgLy8gc2tpcCBsZWFkaW5nIHdoaXRlc3BhY2VzIGZyb20gbmV4dCBsaW5lXG4gICAgICB3aGlsZSAocG9zIDwgbWF4ICYmIHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgPT09IDB4MjApIHsgcG9zKys7IH1cblxuICAgICAgc3RhdGUucG9zID0gcG9zO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFzaWxlbnQpIHsgc3RhdGUucGVuZGluZyArPSAnXFxcXCc7IH1cbiAgc3RhdGUucG9zKys7XG4gIHJldHVybiB0cnVlO1xufTtcbiIsIi8vIFByb2Nlc3MgaW5saW5lIGZvb3Rub3RlcyAoXlsuLi5dKVxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwYXJzZUxpbmtMYWJlbCA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvcGFyc2VfbGlua19sYWJlbCcpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZm9vdG5vdGVfaW5saW5lKHN0YXRlLCBzaWxlbnQpIHtcbiAgdmFyIGxhYmVsU3RhcnQsXG4gICAgICBsYWJlbEVuZCxcbiAgICAgIGZvb3Rub3RlSWQsXG4gICAgICBvbGRMZW5ndGgsXG4gICAgICBtYXggPSBzdGF0ZS5wb3NNYXgsXG4gICAgICBzdGFydCA9IHN0YXRlLnBvcztcblxuICBpZiAoc3RhcnQgKyAyID49IG1heCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXJ0KSAhPT0gMHg1RS8qIF4gKi8pIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGFydCArIDEpICE9PSAweDVCLyogWyAqLykgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHN0YXRlLmxldmVsID49IHN0YXRlLm9wdGlvbnMubWF4TmVzdGluZykgeyByZXR1cm4gZmFsc2U7IH1cblxuICBsYWJlbFN0YXJ0ID0gc3RhcnQgKyAyO1xuICBsYWJlbEVuZCA9IHBhcnNlTGlua0xhYmVsKHN0YXRlLCBzdGFydCArIDEpO1xuXG4gIC8vIHBhcnNlciBmYWlsZWQgdG8gZmluZCAnXScsIHNvIGl0J3Mgbm90IGEgdmFsaWQgbm90ZVxuICBpZiAobGFiZWxFbmQgPCAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIC8vIFdlIGZvdW5kIHRoZSBlbmQgb2YgdGhlIGxpbmssIGFuZCBrbm93IGZvciBhIGZhY3QgaXQncyBhIHZhbGlkIGxpbms7XG4gIC8vIHNvIGFsbCB0aGF0J3MgbGVmdCB0byBkbyBpcyB0byBjYWxsIHRva2VuaXplci5cbiAgLy9cbiAgaWYgKCFzaWxlbnQpIHtcbiAgICBpZiAoIXN0YXRlLmVudi5mb290bm90ZXMpIHsgc3RhdGUuZW52LmZvb3Rub3RlcyA9IHt9OyB9XG4gICAgaWYgKCFzdGF0ZS5lbnYuZm9vdG5vdGVzLmxpc3QpIHsgc3RhdGUuZW52LmZvb3Rub3Rlcy5saXN0ID0gW107IH1cbiAgICBmb290bm90ZUlkID0gc3RhdGUuZW52LmZvb3Rub3Rlcy5saXN0Lmxlbmd0aDtcblxuICAgIHN0YXRlLnBvcyA9IGxhYmVsU3RhcnQ7XG4gICAgc3RhdGUucG9zTWF4ID0gbGFiZWxFbmQ7XG5cbiAgICBzdGF0ZS5wdXNoKHtcbiAgICAgIHR5cGU6ICdmb290bm90ZV9yZWYnLFxuICAgICAgaWQ6IGZvb3Rub3RlSWQsXG4gICAgICBsZXZlbDogc3RhdGUubGV2ZWxcbiAgICB9KTtcbiAgICBzdGF0ZS5saW5rTGV2ZWwrKztcbiAgICBvbGRMZW5ndGggPSBzdGF0ZS50b2tlbnMubGVuZ3RoO1xuICAgIHN0YXRlLnBhcnNlci50b2tlbml6ZShzdGF0ZSk7XG4gICAgc3RhdGUuZW52LmZvb3Rub3Rlcy5saXN0W2Zvb3Rub3RlSWRdID0geyB0b2tlbnM6IHN0YXRlLnRva2Vucy5zcGxpY2Uob2xkTGVuZ3RoKSB9O1xuICAgIHN0YXRlLmxpbmtMZXZlbC0tO1xuICB9XG5cbiAgc3RhdGUucG9zID0gbGFiZWxFbmQgKyAxO1xuICBzdGF0ZS5wb3NNYXggPSBtYXg7XG4gIHJldHVybiB0cnVlO1xufTtcbiIsIi8vIFByb2Nlc3MgZm9vdG5vdGUgcmVmZXJlbmNlcyAoW14uLi5dKVxuXG4ndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmb290bm90ZV9yZWYoc3RhdGUsIHNpbGVudCkge1xuICB2YXIgbGFiZWwsXG4gICAgICBwb3MsXG4gICAgICBmb290bm90ZUlkLFxuICAgICAgZm9vdG5vdGVTdWJJZCxcbiAgICAgIG1heCA9IHN0YXRlLnBvc01heCxcbiAgICAgIHN0YXJ0ID0gc3RhdGUucG9zO1xuXG4gIC8vIHNob3VsZCBiZSBhdCBsZWFzdCA0IGNoYXJzIC0gXCJbXnhdXCJcbiAgaWYgKHN0YXJ0ICsgMyA+IG1heCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBpZiAoIXN0YXRlLmVudi5mb290bm90ZXMgfHwgIXN0YXRlLmVudi5mb290bm90ZXMucmVmcykgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXJ0KSAhPT0gMHg1Qi8qIFsgKi8pIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGFydCArIDEpICE9PSAweDVFLyogXiAqLykgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHN0YXRlLmxldmVsID49IHN0YXRlLm9wdGlvbnMubWF4TmVzdGluZykgeyByZXR1cm4gZmFsc2U7IH1cblxuICBmb3IgKHBvcyA9IHN0YXJ0ICsgMjsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDIwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDBBKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDVEIC8qIF0gKi8pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwb3MgPT09IHN0YXJ0ICsgMikgeyByZXR1cm4gZmFsc2U7IH0gLy8gbm8gZW1wdHkgZm9vdG5vdGUgbGFiZWxzXG4gIGlmIChwb3MgPj0gbWF4KSB7IHJldHVybiBmYWxzZTsgfVxuICBwb3MrKztcblxuICBsYWJlbCA9IHN0YXRlLnNyYy5zbGljZShzdGFydCArIDIsIHBvcyAtIDEpO1xuICBpZiAodHlwZW9mIHN0YXRlLmVudi5mb290bm90ZXMucmVmc1snOicgKyBsYWJlbF0gPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIGlmICghc2lsZW50KSB7XG4gICAgaWYgKCFzdGF0ZS5lbnYuZm9vdG5vdGVzLmxpc3QpIHsgc3RhdGUuZW52LmZvb3Rub3Rlcy5saXN0ID0gW107IH1cblxuICAgIGlmIChzdGF0ZS5lbnYuZm9vdG5vdGVzLnJlZnNbJzonICsgbGFiZWxdIDwgMCkge1xuICAgICAgZm9vdG5vdGVJZCA9IHN0YXRlLmVudi5mb290bm90ZXMubGlzdC5sZW5ndGg7XG4gICAgICBzdGF0ZS5lbnYuZm9vdG5vdGVzLmxpc3RbZm9vdG5vdGVJZF0gPSB7IGxhYmVsOiBsYWJlbCwgY291bnQ6IDAgfTtcbiAgICAgIHN0YXRlLmVudi5mb290bm90ZXMucmVmc1snOicgKyBsYWJlbF0gPSBmb290bm90ZUlkO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb290bm90ZUlkID0gc3RhdGUuZW52LmZvb3Rub3Rlcy5yZWZzWyc6JyArIGxhYmVsXTtcbiAgICB9XG5cbiAgICBmb290bm90ZVN1YklkID0gc3RhdGUuZW52LmZvb3Rub3Rlcy5saXN0W2Zvb3Rub3RlSWRdLmNvdW50O1xuICAgIHN0YXRlLmVudi5mb290bm90ZXMubGlzdFtmb290bm90ZUlkXS5jb3VudCsrO1xuXG4gICAgc3RhdGUucHVzaCh7XG4gICAgICB0eXBlOiAnZm9vdG5vdGVfcmVmJyxcbiAgICAgIGlkOiBmb290bm90ZUlkLFxuICAgICAgc3ViSWQ6IGZvb3Rub3RlU3ViSWQsXG4gICAgICBsZXZlbDogc3RhdGUubGV2ZWxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRlLnBvcyA9IHBvcztcbiAgc3RhdGUucG9zTWF4ID0gbWF4O1xuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCIvLyBQcm9jZXNzIGh0bWwgdGFnc1xuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIEhUTUxfVEFHX1JFID0gcmVxdWlyZSgnLi4vY29tbW9uL2h0bWxfcmUnKS5IVE1MX1RBR19SRTtcblxuXG5mdW5jdGlvbiBpc0xldHRlcihjaCkge1xuICAvKmVzbGludCBuby1iaXR3aXNlOjAqL1xuICB2YXIgbGMgPSBjaCB8IDB4MjA7IC8vIHRvIGxvd2VyIGNhc2VcbiAgcmV0dXJuIChsYyA+PSAweDYxLyogYSAqLykgJiYgKGxjIDw9IDB4N2EvKiB6ICovKTtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGh0bWx0YWcoc3RhdGUsIHNpbGVudCkge1xuICB2YXIgY2gsIG1hdGNoLCBtYXgsIHBvcyA9IHN0YXRlLnBvcztcblxuICBpZiAoIXN0YXRlLm9wdGlvbnMuaHRtbCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAvLyBDaGVjayBzdGFydFxuICBtYXggPSBzdGF0ZS5wb3NNYXg7XG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDNDLyogPCAqLyB8fFxuICAgICAgcG9zICsgMiA+PSBtYXgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBRdWljayBmYWlsIG9uIHNlY29uZCBjaGFyXG4gIGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zICsgMSk7XG4gIGlmIChjaCAhPT0gMHgyMS8qICEgKi8gJiZcbiAgICAgIGNoICE9PSAweDNGLyogPyAqLyAmJlxuICAgICAgY2ggIT09IDB4MkYvKiAvICovICYmXG4gICAgICAhaXNMZXR0ZXIoY2gpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbWF0Y2ggPSBzdGF0ZS5zcmMuc2xpY2UocG9zKS5tYXRjaChIVE1MX1RBR19SRSk7XG4gIGlmICghbWF0Y2gpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgaWYgKCFzaWxlbnQpIHtcbiAgICBzdGF0ZS5wdXNoKHtcbiAgICAgIHR5cGU6ICdodG1sdGFnJyxcbiAgICAgIGNvbnRlbnQ6IHN0YXRlLnNyYy5zbGljZShwb3MsIHBvcyArIG1hdGNoWzBdLmxlbmd0aCksXG4gICAgICBsZXZlbDogc3RhdGUubGV2ZWxcbiAgICB9KTtcbiAgfVxuICBzdGF0ZS5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCIvLyBQcm9jZXNzICsraW5zZXJ0ZWQgdGV4dCsrXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbnMoc3RhdGUsIHNpbGVudCkge1xuICB2YXIgZm91bmQsXG4gICAgICBwb3MsXG4gICAgICBzdGFjayxcbiAgICAgIG1heCA9IHN0YXRlLnBvc01heCxcbiAgICAgIHN0YXJ0ID0gc3RhdGUucG9zLFxuICAgICAgbGFzdENoYXIsXG4gICAgICBuZXh0Q2hhcjtcblxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhcnQpICE9PSAweDJCLyogKyAqLykgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gZmFsc2U7IH0gLy8gZG9uJ3QgcnVuIGFueSBwYWlycyBpbiB2YWxpZGF0aW9uIG1vZGVcbiAgaWYgKHN0YXJ0ICsgNCA+PSBtYXgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGFydCArIDEpICE9PSAweDJCLyogKyAqLykgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHN0YXRlLmxldmVsID49IHN0YXRlLm9wdGlvbnMubWF4TmVzdGluZykgeyByZXR1cm4gZmFsc2U7IH1cblxuICBsYXN0Q2hhciA9IHN0YXJ0ID4gMCA/IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXJ0IC0gMSkgOiAtMTtcbiAgbmV4dENoYXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGFydCArIDIpO1xuXG4gIGlmIChsYXN0Q2hhciA9PT0gMHgyQi8qICsgKi8pIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChuZXh0Q2hhciA9PT0gMHgyQi8qICsgKi8pIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChuZXh0Q2hhciA9PT0gMHgyMCB8fCBuZXh0Q2hhciA9PT0gMHgwQSkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBwb3MgPSBzdGFydCArIDI7XG4gIHdoaWxlIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgyQi8qICsgKi8pIHsgcG9zKys7IH1cbiAgaWYgKHBvcyAhPT0gc3RhcnQgKyAyKSB7XG4gICAgLy8gc2VxdWVuY2Ugb2YgMysgbWFya2VycyB0YWtpbmcgYXMgbGl0ZXJhbCwgc2FtZSBhcyBpbiBhIGVtcGhhc2lzXG4gICAgc3RhdGUucG9zICs9IHBvcyAtIHN0YXJ0O1xuICAgIGlmICghc2lsZW50KSB7IHN0YXRlLnBlbmRpbmcgKz0gc3RhdGUuc3JjLnNsaWNlKHN0YXJ0LCBwb3MpOyB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdGF0ZS5wb3MgPSBzdGFydCArIDI7XG4gIHN0YWNrID0gMTtcblxuICB3aGlsZSAoc3RhdGUucG9zICsgMSA8IG1heCkge1xuICAgIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGF0ZS5wb3MpID09PSAweDJCLyogKyAqLykge1xuICAgICAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXRlLnBvcyArIDEpID09PSAweDJCLyogKyAqLykge1xuICAgICAgICBsYXN0Q2hhciA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXRlLnBvcyAtIDEpO1xuICAgICAgICBuZXh0Q2hhciA9IHN0YXRlLnBvcyArIDIgPCBtYXggPyBzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGF0ZS5wb3MgKyAyKSA6IC0xO1xuICAgICAgICBpZiAobmV4dENoYXIgIT09IDB4MkIvKiArICovICYmIGxhc3RDaGFyICE9PSAweDJCLyogKyAqLykge1xuICAgICAgICAgIGlmIChsYXN0Q2hhciAhPT0gMHgyMCAmJiBsYXN0Q2hhciAhPT0gMHgwQSkge1xuICAgICAgICAgICAgLy8gY2xvc2luZyAnKysnXG4gICAgICAgICAgICBzdGFjay0tO1xuICAgICAgICAgIH0gZWxzZSBpZiAobmV4dENoYXIgIT09IDB4MjAgJiYgbmV4dENoYXIgIT09IDB4MEEpIHtcbiAgICAgICAgICAgIC8vIG9wZW5pbmcgJysrJ1xuICAgICAgICAgICAgc3RhY2srKztcbiAgICAgICAgICB9IC8vIGVsc2Uge1xuICAgICAgICAgICAgLy8gIC8vIHN0YW5kYWxvbmUgJyArKyAnIGluZGVudGVkIHdpdGggc3BhY2VzXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgaWYgKHN0YWNrIDw9IDApIHtcbiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRlLnBhcnNlci5za2lwVG9rZW4oc3RhdGUpO1xuICB9XG5cbiAgaWYgKCFmb3VuZCkge1xuICAgIC8vIHBhcnNlciBmYWlsZWQgdG8gZmluZCBlbmRpbmcgdGFnLCBzbyBpdCdzIG5vdCB2YWxpZCBlbXBoYXNpc1xuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGZvdW5kIVxuICBzdGF0ZS5wb3NNYXggPSBzdGF0ZS5wb3M7XG4gIHN0YXRlLnBvcyA9IHN0YXJ0ICsgMjtcblxuICBpZiAoIXNpbGVudCkge1xuICAgIHN0YXRlLnB1c2goeyB0eXBlOiAnaW5zX29wZW4nLCBsZXZlbDogc3RhdGUubGV2ZWwrKyB9KTtcbiAgICBzdGF0ZS5wYXJzZXIudG9rZW5pemUoc3RhdGUpO1xuICAgIHN0YXRlLnB1c2goeyB0eXBlOiAnaW5zX2Nsb3NlJywgbGV2ZWw6IC0tc3RhdGUubGV2ZWwgfSk7XG4gIH1cblxuICBzdGF0ZS5wb3MgPSBzdGF0ZS5wb3NNYXggKyAyO1xuICBzdGF0ZS5wb3NNYXggPSBtYXg7XG4gIHJldHVybiB0cnVlO1xufTtcbiIsIi8vIFByb2Nlc3MgW2xpbmtzXSg8dG8+IFwic3R1ZmZcIilcblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcGFyc2VMaW5rTGFiZWwgICAgICAgPSByZXF1aXJlKCcuLi9oZWxwZXJzL3BhcnNlX2xpbmtfbGFiZWwnKTtcbnZhciBwYXJzZUxpbmtEZXN0aW5hdGlvbiA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvcGFyc2VfbGlua19kZXN0aW5hdGlvbicpO1xudmFyIHBhcnNlTGlua1RpdGxlICAgICAgID0gcmVxdWlyZSgnLi4vaGVscGVycy9wYXJzZV9saW5rX3RpdGxlJyk7XG52YXIgbm9ybWFsaXplUmVmZXJlbmNlICAgPSByZXF1aXJlKCcuLi9oZWxwZXJzL25vcm1hbGl6ZV9yZWZlcmVuY2UnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGxpbmtzKHN0YXRlLCBzaWxlbnQpIHtcbiAgdmFyIGxhYmVsU3RhcnQsXG4gICAgICBsYWJlbEVuZCxcbiAgICAgIGxhYmVsLFxuICAgICAgaHJlZixcbiAgICAgIHRpdGxlLFxuICAgICAgcG9zLFxuICAgICAgcmVmLFxuICAgICAgY29kZSxcbiAgICAgIGlzSW1hZ2UgPSBmYWxzZSxcbiAgICAgIG9sZFBvcyA9IHN0YXRlLnBvcyxcbiAgICAgIG1heCA9IHN0YXRlLnBvc01heCxcbiAgICAgIHN0YXJ0ID0gc3RhdGUucG9zLFxuICAgICAgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhcnQpO1xuXG4gIGlmIChtYXJrZXIgPT09IDB4MjEvKiAhICovKSB7XG4gICAgaXNJbWFnZSA9IHRydWU7XG4gICAgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoKytzdGFydCk7XG4gIH1cblxuICBpZiAobWFya2VyICE9PSAweDVCLyogWyAqLykgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHN0YXRlLmxldmVsID49IHN0YXRlLm9wdGlvbnMubWF4TmVzdGluZykgeyByZXR1cm4gZmFsc2U7IH1cblxuICBsYWJlbFN0YXJ0ID0gc3RhcnQgKyAxO1xuICBsYWJlbEVuZCA9IHBhcnNlTGlua0xhYmVsKHN0YXRlLCBzdGFydCk7XG5cbiAgLy8gcGFyc2VyIGZhaWxlZCB0byBmaW5kICddJywgc28gaXQncyBub3QgYSB2YWxpZCBsaW5rXG4gIGlmIChsYWJlbEVuZCA8IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgcG9zID0gbGFiZWxFbmQgKyAxO1xuICBpZiAocG9zIDwgbWF4ICYmIHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgPT09IDB4MjgvKiAoICovKSB7XG4gICAgLy9cbiAgICAvLyBJbmxpbmUgbGlua1xuICAgIC8vXG5cbiAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgIC8vICAgICAgICBeXiBza2lwcGluZyB0aGVzZSBzcGFjZXNcbiAgICBwb3MrKztcbiAgICBmb3IgKDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgICAgY29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcyk7XG4gICAgICBpZiAoY29kZSAhPT0gMHgyMCAmJiBjb2RlICE9PSAweDBBKSB7IGJyZWFrOyB9XG4gICAgfVxuICAgIGlmIChwb3MgPj0gbWF4KSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgLy8gW2xpbmtdKCAgPGhyZWY+ICBcInRpdGxlXCIgIClcbiAgICAvLyAgICAgICAgICBeXl5eXl4gcGFyc2luZyBsaW5rIGRlc3RpbmF0aW9uXG4gICAgc3RhcnQgPSBwb3M7XG4gICAgaWYgKHBhcnNlTGlua0Rlc3RpbmF0aW9uKHN0YXRlLCBwb3MpKSB7XG4gICAgICBocmVmID0gc3RhdGUubGlua0NvbnRlbnQ7XG4gICAgICBwb3MgPSBzdGF0ZS5wb3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhyZWYgPSAnJztcbiAgICB9XG5cbiAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgIC8vICAgICAgICAgICAgICAgIF5eIHNraXBwaW5nIHRoZXNlIHNwYWNlc1xuICAgIHN0YXJ0ID0gcG9zO1xuICAgIGZvciAoOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgICBjb2RlID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKTtcbiAgICAgIGlmIChjb2RlICE9PSAweDIwICYmIGNvZGUgIT09IDB4MEEpIHsgYnJlYWs7IH1cbiAgICB9XG5cbiAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgIC8vICAgICAgICAgICAgICAgICAgXl5eXl5eXiBwYXJzaW5nIGxpbmsgdGl0bGVcbiAgICBpZiAocG9zIDwgbWF4ICYmIHN0YXJ0ICE9PSBwb3MgJiYgcGFyc2VMaW5rVGl0bGUoc3RhdGUsIHBvcykpIHtcbiAgICAgIHRpdGxlID0gc3RhdGUubGlua0NvbnRlbnQ7XG4gICAgICBwb3MgPSBzdGF0ZS5wb3M7XG5cbiAgICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBeXiBza2lwcGluZyB0aGVzZSBzcGFjZXNcbiAgICAgIGZvciAoOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgICAgIGNvZGUgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpO1xuICAgICAgICBpZiAoY29kZSAhPT0gMHgyMCAmJiBjb2RlICE9PSAweDBBKSB7IGJyZWFrOyB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRpdGxlID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHBvcyA+PSBtYXggfHwgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgyOS8qICkgKi8pIHtcbiAgICAgIHN0YXRlLnBvcyA9IG9sZFBvcztcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcG9zKys7XG4gIH0gZWxzZSB7XG4gICAgLy9cbiAgICAvLyBMaW5rIHJlZmVyZW5jZVxuICAgIC8vXG5cbiAgICAvLyBkbyBub3QgYWxsb3cgbmVzdGVkIHJlZmVyZW5jZSBsaW5rc1xuICAgIGlmIChzdGF0ZS5saW5rTGV2ZWwgPiAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgLy8gW2Zvb10gIFtiYXJdXG4gICAgLy8gICAgICBeXiBvcHRpb25hbCB3aGl0ZXNwYWNlIChjYW4gaW5jbHVkZSBuZXdsaW5lcylcbiAgICBmb3IgKDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgICAgY29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcyk7XG4gICAgICBpZiAoY29kZSAhPT0gMHgyMCAmJiBjb2RlICE9PSAweDBBKSB7IGJyZWFrOyB9XG4gICAgfVxuXG4gICAgaWYgKHBvcyA8IG1heCAmJiBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDVCLyogWyAqLykge1xuICAgICAgc3RhcnQgPSBwb3MgKyAxO1xuICAgICAgcG9zID0gcGFyc2VMaW5rTGFiZWwoc3RhdGUsIHBvcyk7XG4gICAgICBpZiAocG9zID49IDApIHtcbiAgICAgICAgbGFiZWwgPSBzdGF0ZS5zcmMuc2xpY2Uoc3RhcnQsIHBvcysrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvcyA9IHN0YXJ0IC0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb3ZlcnMgbGFiZWwgPT09ICcnIGFuZCBsYWJlbCA9PT0gdW5kZWZpbmVkXG4gICAgLy8gKGNvbGxhcHNlZCByZWZlcmVuY2UgbGluayBhbmQgc2hvcnRjdXQgcmVmZXJlbmNlIGxpbmsgcmVzcGVjdGl2ZWx5KVxuICAgIGlmICghbGFiZWwpIHtcbiAgICAgIGlmICh0eXBlb2YgbGFiZWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHBvcyA9IGxhYmVsRW5kICsgMTtcbiAgICAgIH1cbiAgICAgIGxhYmVsID0gc3RhdGUuc3JjLnNsaWNlKGxhYmVsU3RhcnQsIGxhYmVsRW5kKTtcbiAgICB9XG5cbiAgICByZWYgPSBzdGF0ZS5lbnYucmVmZXJlbmNlc1tub3JtYWxpemVSZWZlcmVuY2UobGFiZWwpXTtcbiAgICBpZiAoIXJlZikge1xuICAgICAgc3RhdGUucG9zID0gb2xkUG9zO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBocmVmID0gcmVmLmhyZWY7XG4gICAgdGl0bGUgPSByZWYudGl0bGU7XG4gIH1cblxuICAvL1xuICAvLyBXZSBmb3VuZCB0aGUgZW5kIG9mIHRoZSBsaW5rLCBhbmQga25vdyBmb3IgYSBmYWN0IGl0J3MgYSB2YWxpZCBsaW5rO1xuICAvLyBzbyBhbGwgdGhhdCdzIGxlZnQgdG8gZG8gaXMgdG8gY2FsbCB0b2tlbml6ZXIuXG4gIC8vXG4gIGlmICghc2lsZW50KSB7XG4gICAgc3RhdGUucG9zID0gbGFiZWxTdGFydDtcbiAgICBzdGF0ZS5wb3NNYXggPSBsYWJlbEVuZDtcblxuICAgIGlmIChpc0ltYWdlKSB7XG4gICAgICBzdGF0ZS5wdXNoKHtcbiAgICAgICAgdHlwZTogJ2ltYWdlJyxcbiAgICAgICAgc3JjOiBocmVmLFxuICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgIGFsdDogc3RhdGUuc3JjLnN1YnN0cihsYWJlbFN0YXJ0LCBsYWJlbEVuZCAtIGxhYmVsU3RhcnQpLFxuICAgICAgICBsZXZlbDogc3RhdGUubGV2ZWxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wdXNoKHtcbiAgICAgICAgdHlwZTogJ2xpbmtfb3BlbicsXG4gICAgICAgIGhyZWY6IGhyZWYsXG4gICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgbGV2ZWw6IHN0YXRlLmxldmVsKytcbiAgICAgIH0pO1xuICAgICAgc3RhdGUubGlua0xldmVsKys7XG4gICAgICBzdGF0ZS5wYXJzZXIudG9rZW5pemUoc3RhdGUpO1xuICAgICAgc3RhdGUubGlua0xldmVsLS07XG4gICAgICBzdGF0ZS5wdXNoKHsgdHlwZTogJ2xpbmtfY2xvc2UnLCBsZXZlbDogLS1zdGF0ZS5sZXZlbCB9KTtcbiAgICB9XG4gIH1cblxuICBzdGF0ZS5wb3MgPSBwb3M7XG4gIHN0YXRlLnBvc01heCA9IG1heDtcbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiLy8gUHJvY2VzcyA9PWhpZ2hsaWdodGVkIHRleHQ9PVxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVsKHN0YXRlLCBzaWxlbnQpIHtcbiAgdmFyIGZvdW5kLFxuICAgICAgcG9zLFxuICAgICAgc3RhY2ssXG4gICAgICBtYXggPSBzdGF0ZS5wb3NNYXgsXG4gICAgICBzdGFydCA9IHN0YXRlLnBvcyxcbiAgICAgIGxhc3RDaGFyLFxuICAgICAgbmV4dENoYXI7XG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXJ0KSAhPT0gMHgzRC8qID0gKi8pIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChzaWxlbnQpIHsgcmV0dXJuIGZhbHNlOyB9IC8vIGRvbid0IHJ1biBhbnkgcGFpcnMgaW4gdmFsaWRhdGlvbiBtb2RlXG4gIGlmIChzdGFydCArIDQgPj0gbWF4KSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhcnQgKyAxKSAhPT0gMHgzRC8qID0gKi8pIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChzdGF0ZS5sZXZlbCA+PSBzdGF0ZS5vcHRpb25zLm1heE5lc3RpbmcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgbGFzdENoYXIgPSBzdGFydCA+IDAgPyBzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGFydCAtIDEpIDogLTE7XG4gIG5leHRDaGFyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhcnQgKyAyKTtcblxuICBpZiAobGFzdENoYXIgPT09IDB4M0QvKiA9ICovKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAobmV4dENoYXIgPT09IDB4M0QvKiA9ICovKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAobmV4dENoYXIgPT09IDB4MjAgfHwgbmV4dENoYXIgPT09IDB4MEEpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgcG9zID0gc3RhcnQgKyAyO1xuICB3aGlsZSAocG9zIDwgbWF4ICYmIHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgPT09IDB4M0QvKiA9ICovKSB7IHBvcysrOyB9XG4gIGlmIChwb3MgIT09IHN0YXJ0ICsgMikge1xuICAgIC8vIHNlcXVlbmNlIG9mIDMrIG1hcmtlcnMgdGFraW5nIGFzIGxpdGVyYWwsIHNhbWUgYXMgaW4gYSBlbXBoYXNpc1xuICAgIHN0YXRlLnBvcyArPSBwb3MgLSBzdGFydDtcbiAgICBpZiAoIXNpbGVudCkgeyBzdGF0ZS5wZW5kaW5nICs9IHN0YXRlLnNyYy5zbGljZShzdGFydCwgcG9zKTsgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhdGUucG9zID0gc3RhcnQgKyAyO1xuICBzdGFjayA9IDE7XG5cbiAgd2hpbGUgKHN0YXRlLnBvcyArIDEgPCBtYXgpIHtcbiAgICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhdGUucG9zKSA9PT0gMHgzRC8qID0gKi8pIHtcbiAgICAgIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGF0ZS5wb3MgKyAxKSA9PT0gMHgzRC8qID0gKi8pIHtcbiAgICAgICAgbGFzdENoYXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGF0ZS5wb3MgLSAxKTtcbiAgICAgICAgbmV4dENoYXIgPSBzdGF0ZS5wb3MgKyAyIDwgbWF4ID8gc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhdGUucG9zICsgMikgOiAtMTtcbiAgICAgICAgaWYgKG5leHRDaGFyICE9PSAweDNELyogPSAqLyAmJiBsYXN0Q2hhciAhPT0gMHgzRC8qID0gKi8pIHtcbiAgICAgICAgICBpZiAobGFzdENoYXIgIT09IDB4MjAgJiYgbGFzdENoYXIgIT09IDB4MEEpIHtcbiAgICAgICAgICAgIC8vIGNsb3NpbmcgJz09J1xuICAgICAgICAgICAgc3RhY2stLTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5leHRDaGFyICE9PSAweDIwICYmIG5leHRDaGFyICE9PSAweDBBKSB7XG4gICAgICAgICAgICAvLyBvcGVuaW5nICc9PSdcbiAgICAgICAgICAgIHN0YWNrKys7XG4gICAgICAgICAgfSAvLyBlbHNlIHtcbiAgICAgICAgICAgIC8vICAvLyBzdGFuZGFsb25lICcgPT0gJyBpbmRlbnRlZCB3aXRoIHNwYWNlc1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgIGlmIChzdGFjayA8PSAwKSB7XG4gICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0ZS5wYXJzZXIuc2tpcFRva2VuKHN0YXRlKTtcbiAgfVxuXG4gIGlmICghZm91bmQpIHtcbiAgICAvLyBwYXJzZXIgZmFpbGVkIHRvIGZpbmQgZW5kaW5nIHRhZywgc28gaXQncyBub3QgdmFsaWQgZW1waGFzaXNcbiAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBmb3VuZCFcbiAgc3RhdGUucG9zTWF4ID0gc3RhdGUucG9zO1xuICBzdGF0ZS5wb3MgPSBzdGFydCArIDI7XG5cbiAgaWYgKCFzaWxlbnQpIHtcbiAgICBzdGF0ZS5wdXNoKHsgdHlwZTogJ21hcmtfb3BlbicsIGxldmVsOiBzdGF0ZS5sZXZlbCsrIH0pO1xuICAgIHN0YXRlLnBhcnNlci50b2tlbml6ZShzdGF0ZSk7XG4gICAgc3RhdGUucHVzaCh7IHR5cGU6ICdtYXJrX2Nsb3NlJywgbGV2ZWw6IC0tc3RhdGUubGV2ZWwgfSk7XG4gIH1cblxuICBzdGF0ZS5wb3MgPSBzdGF0ZS5wb3NNYXggKyAyO1xuICBzdGF0ZS5wb3NNYXggPSBtYXg7XG4gIHJldHVybiB0cnVlO1xufTtcbiIsIi8vIFByb2NlZXNzICdcXG4nXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBuZXdsaW5lKHN0YXRlLCBzaWxlbnQpIHtcbiAgdmFyIHBtYXgsIG1heCwgcG9zID0gc3RhdGUucG9zO1xuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDBBLyogXFxuICovKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIHBtYXggPSBzdGF0ZS5wZW5kaW5nLmxlbmd0aCAtIDE7XG4gIG1heCA9IHN0YXRlLnBvc01heDtcblxuICAvLyAnICBcXG4nIC0+IGhhcmRicmVha1xuICAvLyBMb29rdXAgaW4gcGVuZGluZyBjaGFycyBpcyBiYWQgcHJhY3RpY2UhIERvbid0IGNvcHkgdG8gb3RoZXIgcnVsZXMhXG4gIC8vIFBlbmRpbmcgc3RyaW5nIGlzIHN0b3JlZCBpbiBjb25jYXQgbW9kZSwgaW5kZXhlZCBsb29rdXBzIHdpbGwgY2F1c2VcbiAgLy8gY29udmVydGlvbiB0byBmbGF0IG1vZGUuXG4gIGlmICghc2lsZW50KSB7XG4gICAgaWYgKHBtYXggPj0gMCAmJiBzdGF0ZS5wZW5kaW5nLmNoYXJDb2RlQXQocG1heCkgPT09IDB4MjApIHtcbiAgICAgIGlmIChwbWF4ID49IDEgJiYgc3RhdGUucGVuZGluZy5jaGFyQ29kZUF0KHBtYXggLSAxKSA9PT0gMHgyMCkge1xuICAgICAgICBzdGF0ZS5wZW5kaW5nID0gc3RhdGUucGVuZGluZy5yZXBsYWNlKC8gKyQvLCAnJyk7XG4gICAgICAgIHN0YXRlLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdoYXJkYnJlYWsnLFxuICAgICAgICAgIGxldmVsOiBzdGF0ZS5sZXZlbFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnBlbmRpbmcgPSBzdGF0ZS5wZW5kaW5nLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgc3RhdGUucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3NvZnRicmVhaycsXG4gICAgICAgICAgbGV2ZWw6IHN0YXRlLmxldmVsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnB1c2goe1xuICAgICAgICB0eXBlOiAnc29mdGJyZWFrJyxcbiAgICAgICAgbGV2ZWw6IHN0YXRlLmxldmVsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwb3MrKztcblxuICAvLyBza2lwIGhlYWRpbmcgc3BhY2VzIGZvciBuZXh0IGxpbmVcbiAgd2hpbGUgKHBvcyA8IG1heCAmJiBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDIwKSB7IHBvcysrOyB9XG5cbiAgc3RhdGUucG9zID0gcG9zO1xuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCIvLyBJbmxpbmUgcGFyc2VyIHN0YXRlXG5cbid1c2Ugc3RyaWN0JztcblxuXG5mdW5jdGlvbiBTdGF0ZUlubGluZShzcmMsIHBhcnNlcklubGluZSwgb3B0aW9ucywgZW52LCBvdXRUb2tlbnMpIHtcbiAgdGhpcy5zcmMgPSBzcmM7XG4gIHRoaXMuZW52ID0gZW52O1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB0aGlzLnBhcnNlciA9IHBhcnNlcklubGluZTtcbiAgdGhpcy50b2tlbnMgPSBvdXRUb2tlbnM7XG4gIHRoaXMucG9zID0gMDtcbiAgdGhpcy5wb3NNYXggPSB0aGlzLnNyYy5sZW5ndGg7XG4gIHRoaXMubGV2ZWwgPSAwO1xuICB0aGlzLnBlbmRpbmcgPSAnJztcbiAgdGhpcy5wZW5kaW5nTGV2ZWwgPSAwO1xuXG4gIHRoaXMuY2FjaGUgPSBbXTsgICAgICAgIC8vIFN0b3JlcyB7IHN0YXJ0OiBlbmQgfSBwYWlycy4gVXNlZnVsIGZvciBiYWNrdHJhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uIG9mIHBhaXJzIHBhcnNlIChlbXBoYXNpcywgc3RyaWtlcykuXG5cbiAgLy8gTGluayBwYXJzZXIgc3RhdGUgdmFyc1xuXG4gIHRoaXMuaXNJbkxhYmVsID0gZmFsc2U7IC8vIFNldCB0cnVlIHdoZW4gc2VlayBsaW5rIGxhYmVsIC0gd2Ugc2hvdWxkIGRpc2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCJwYWlyZWRcIiBydWxlcyAoZW1waGFzaXMsIHN0cmlrZXMpIHRvIG5vdCBza2lwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhaWxpbmcgYF1gXG5cbiAgdGhpcy5saW5rTGV2ZWwgPSAwOyAgICAgLy8gSW5jcmVtZW50IGZvciBlYWNoIG5lc3RpbmcgbGluay4gVXNlZCB0byBwcmV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lc3RpbmcgaW4gZGVmaW5pdGlvbnNcblxuICB0aGlzLmxpbmtDb250ZW50ID0gJyc7ICAvLyBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgbGluayB1cmxcblxuICB0aGlzLmxhYmVsVW5tYXRjaGVkU2NvcGVzID0gMDsgLy8gVHJhY2sgdW5wYWlyZWQgYFtgIGZvciBsaW5rIGxhYmVsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGJhY2t0cmFjayBvcHRpbWl6YXRpb24pXG59XG5cblxuLy8gRmx1c2ggcGVuZGluZyB0ZXh0XG4vL1xuU3RhdGVJbmxpbmUucHJvdG90eXBlLnB1c2hQZW5kaW5nID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnRva2Vucy5wdXNoKHtcbiAgICB0eXBlOiAndGV4dCcsXG4gICAgY29udGVudDogdGhpcy5wZW5kaW5nLFxuICAgIGxldmVsOiB0aGlzLnBlbmRpbmdMZXZlbFxuICB9KTtcbiAgdGhpcy5wZW5kaW5nID0gJyc7XG59O1xuXG5cbi8vIFB1c2ggbmV3IHRva2VuIHRvIFwic3RyZWFtXCIuXG4vLyBJZiBwZW5kaW5nIHRleHQgZXhpc3RzIC0gZmx1c2ggaXQgYXMgdGV4dCB0b2tlblxuLy9cblN0YXRlSW5saW5lLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gIGlmICh0aGlzLnBlbmRpbmcpIHtcbiAgICB0aGlzLnB1c2hQZW5kaW5nKCk7XG4gIH1cblxuICB0aGlzLnRva2Vucy5wdXNoKHRva2VuKTtcbiAgdGhpcy5wZW5kaW5nTGV2ZWwgPSB0aGlzLmxldmVsO1xufTtcblxuXG4vLyBTdG9yZSB2YWx1ZSB0byBjYWNoZS5cbi8vICEhISBJbXBsZW1lbnRhdGlvbiBoYXMgcGFyc2VyLXNwZWNpZmljIG9wdGltaXphdGlvbnNcbi8vICEhISBrZXlzIE1VU1QgYmUgaW50ZWdlciwgPj0gMDsgdmFsdWVzIE1VU1QgYmUgaW50ZWdlciwgPiAwXG4vL1xuU3RhdGVJbmxpbmUucHJvdG90eXBlLmNhY2hlU2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsKSB7XG4gIGZvciAodmFyIGkgPSB0aGlzLmNhY2hlLmxlbmd0aDsgaSA8PSBrZXk7IGkrKykge1xuICAgIHRoaXMuY2FjaGUucHVzaCgwKTtcbiAgfVxuXG4gIHRoaXMuY2FjaGVba2V5XSA9IHZhbDtcbn07XG5cblxuLy8gR2V0IGNhY2hlIHZhbHVlXG4vL1xuU3RhdGVJbmxpbmUucHJvdG90eXBlLmNhY2hlR2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4ga2V5IDwgdGhpcy5jYWNoZS5sZW5ndGggPyB0aGlzLmNhY2hlW2tleV0gOiAwO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFN0YXRlSW5saW5lO1xuIiwiLy8gUHJvY2VzcyB+c3Vic2NyaXB0flxuXG4ndXNlIHN0cmljdCc7XG5cbi8vIHNhbWUgYXMgVU5FU0NBUEVfTURfUkUgcGx1cyBhIHNwYWNlXG52YXIgVU5FU0NBUEVfUkUgPSAvXFxcXChbIFxcXFwhXCIjJCUmJygpKissLlxcLzo7PD0+P0BbXFxdXl9ge3x9fi1dKS9nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN1YihzdGF0ZSwgc2lsZW50KSB7XG4gIHZhciBmb3VuZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtYXggPSBzdGF0ZS5wb3NNYXgsXG4gICAgICBzdGFydCA9IHN0YXRlLnBvcztcblxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhcnQpICE9PSAweDdFLyogfiAqLykgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gZmFsc2U7IH0gLy8gZG9uJ3QgcnVuIGFueSBwYWlycyBpbiB2YWxpZGF0aW9uIG1vZGVcbiAgaWYgKHN0YXJ0ICsgMiA+PSBtYXgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChzdGF0ZS5sZXZlbCA+PSBzdGF0ZS5vcHRpb25zLm1heE5lc3RpbmcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgc3RhdGUucG9zID0gc3RhcnQgKyAxO1xuXG4gIHdoaWxlIChzdGF0ZS5wb3MgPCBtYXgpIHtcbiAgICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhdGUucG9zKSA9PT0gMHg3RS8qIH4gKi8pIHtcbiAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN0YXRlLnBhcnNlci5za2lwVG9rZW4oc3RhdGUpO1xuICB9XG5cbiAgaWYgKCFmb3VuZCB8fCBzdGFydCArIDEgPT09IHN0YXRlLnBvcykge1xuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnRlbnQgPSBzdGF0ZS5zcmMuc2xpY2Uoc3RhcnQgKyAxLCBzdGF0ZS5wb3MpO1xuXG4gIC8vIGRvbid0IGFsbG93IHVuZXNjYXBlZCBzcGFjZXMvbmV3bGluZXMgaW5zaWRlXG4gIGlmIChjb250ZW50Lm1hdGNoKC8oXnxbXlxcXFxdKShcXFxcXFxcXCkqXFxzLykpIHtcbiAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBmb3VuZCFcbiAgc3RhdGUucG9zTWF4ID0gc3RhdGUucG9zO1xuICBzdGF0ZS5wb3MgPSBzdGFydCArIDE7XG5cbiAgaWYgKCFzaWxlbnQpIHtcbiAgICBzdGF0ZS5wdXNoKHtcbiAgICAgIHR5cGU6ICdzdWInLFxuICAgICAgbGV2ZWw6IHN0YXRlLmxldmVsLFxuICAgICAgY29udGVudDogY29udGVudC5yZXBsYWNlKFVORVNDQVBFX1JFLCAnJDEnKVxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGUucG9zID0gc3RhdGUucG9zTWF4ICsgMTtcbiAgc3RhdGUucG9zTWF4ID0gbWF4O1xuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCIvLyBQcm9jZXNzIF5zdXBlcnNjcmlwdF5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBzYW1lIGFzIFVORVNDQVBFX01EX1JFIHBsdXMgYSBzcGFjZVxudmFyIFVORVNDQVBFX1JFID0gL1xcXFwoWyBcXFxcIVwiIyQlJicoKSorLC5cXC86Ozw9Pj9AW1xcXV5fYHt8fX4tXSkvZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdXAoc3RhdGUsIHNpbGVudCkge1xuICB2YXIgZm91bmQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWF4ID0gc3RhdGUucG9zTWF4LFxuICAgICAgc3RhcnQgPSBzdGF0ZS5wb3M7XG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXJ0KSAhPT0gMHg1RS8qIF4gKi8pIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChzaWxlbnQpIHsgcmV0dXJuIGZhbHNlOyB9IC8vIGRvbid0IHJ1biBhbnkgcGFpcnMgaW4gdmFsaWRhdGlvbiBtb2RlXG4gIGlmIChzdGFydCArIDIgPj0gbWF4KSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoc3RhdGUubGV2ZWwgPj0gc3RhdGUub3B0aW9ucy5tYXhOZXN0aW5nKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIHN0YXRlLnBvcyA9IHN0YXJ0ICsgMTtcblxuICB3aGlsZSAoc3RhdGUucG9zIDwgbWF4KSB7XG4gICAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXRlLnBvcykgPT09IDB4NUUvKiBeICovKSB7XG4gICAgICBmb3VuZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzdGF0ZS5wYXJzZXIuc2tpcFRva2VuKHN0YXRlKTtcbiAgfVxuXG4gIGlmICghZm91bmQgfHwgc3RhcnQgKyAxID09PSBzdGF0ZS5wb3MpIHtcbiAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb250ZW50ID0gc3RhdGUuc3JjLnNsaWNlKHN0YXJ0ICsgMSwgc3RhdGUucG9zKTtcblxuICAvLyBkb24ndCBhbGxvdyB1bmVzY2FwZWQgc3BhY2VzL25ld2xpbmVzIGluc2lkZVxuICBpZiAoY29udGVudC5tYXRjaCgvKF58W15cXFxcXSkoXFxcXFxcXFwpKlxccy8pKSB7XG4gICAgc3RhdGUucG9zID0gc3RhcnQ7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gZm91bmQhXG4gIHN0YXRlLnBvc01heCA9IHN0YXRlLnBvcztcbiAgc3RhdGUucG9zID0gc3RhcnQgKyAxO1xuXG4gIGlmICghc2lsZW50KSB7XG4gICAgc3RhdGUucHVzaCh7XG4gICAgICB0eXBlOiAnc3VwJyxcbiAgICAgIGxldmVsOiBzdGF0ZS5sZXZlbCxcbiAgICAgIGNvbnRlbnQ6IGNvbnRlbnQucmVwbGFjZShVTkVTQ0FQRV9SRSwgJyQxJylcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRlLnBvcyA9IHN0YXRlLnBvc01heCArIDE7XG4gIHN0YXRlLnBvc01heCA9IG1heDtcbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiLy8gU2tpcCB0ZXh0IGNoYXJhY3RlcnMgZm9yIHRleHQgdG9rZW4sIHBsYWNlIHRob3NlIHRvIHBlbmRpbmcgYnVmZmVyXG4vLyBhbmQgaW5jcmVtZW50IGN1cnJlbnQgcG9zXG5cbid1c2Ugc3RyaWN0JztcblxuXG4vLyBSdWxlIHRvIHNraXAgcHVyZSB0ZXh0XG4vLyAne30kJUB+Kz06JyByZXNlcnZlZCBmb3IgZXh0ZW50aW9uc1xuXG5mdW5jdGlvbiBpc1Rlcm1pbmF0b3JDaGFyKGNoKSB7XG4gIHN3aXRjaCAoY2gpIHtcbiAgICBjYXNlIDB4MEEvKiBcXG4gKi86XG4gICAgY2FzZSAweDVDLyogXFwgKi86XG4gICAgY2FzZSAweDYwLyogYCAqLzpcbiAgICBjYXNlIDB4MkEvKiAqICovOlxuICAgIGNhc2UgMHg1Ri8qIF8gKi86XG4gICAgY2FzZSAweDVFLyogXiAqLzpcbiAgICBjYXNlIDB4NUIvKiBbICovOlxuICAgIGNhc2UgMHg1RC8qIF0gKi86XG4gICAgY2FzZSAweDIxLyogISAqLzpcbiAgICBjYXNlIDB4MjYvKiAmICovOlxuICAgIGNhc2UgMHgzQy8qIDwgKi86XG4gICAgY2FzZSAweDNFLyogPiAqLzpcbiAgICBjYXNlIDB4N0IvKiB7ICovOlxuICAgIGNhc2UgMHg3RC8qIH0gKi86XG4gICAgY2FzZSAweDI0LyogJCAqLzpcbiAgICBjYXNlIDB4MjUvKiAlICovOlxuICAgIGNhc2UgMHg0MC8qIEAgKi86XG4gICAgY2FzZSAweDdFLyogfiAqLzpcbiAgICBjYXNlIDB4MkIvKiArICovOlxuICAgIGNhc2UgMHgzRC8qID0gKi86XG4gICAgY2FzZSAweDNBLyogOiAqLzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0ZXh0KHN0YXRlLCBzaWxlbnQpIHtcbiAgdmFyIHBvcyA9IHN0YXRlLnBvcztcblxuICB3aGlsZSAocG9zIDwgc3RhdGUucG9zTWF4ICYmICFpc1Rlcm1pbmF0b3JDaGFyKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykpKSB7XG4gICAgcG9zKys7XG4gIH1cblxuICBpZiAocG9zID09PSBzdGF0ZS5wb3MpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgaWYgKCFzaWxlbnQpIHsgc3RhdGUucGVuZGluZyArPSBzdGF0ZS5zcmMuc2xpY2Uoc3RhdGUucG9zLCBwb3MpOyB9XG5cbiAgc3RhdGUucG9zID0gcG9zO1xuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsIi8qIVxuICogcmVwZWF0LWVsZW1lbnQgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L3JlcGVhdC1lbGVtZW50PlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNSBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmVwZWF0KGVsZSwgbnVtKSB7XG4gIHZhciBhcnIgPSBuZXcgQXJyYXkobnVtKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG51bTsgaSsrKSB7XG4gICAgYXJyW2ldID0gZWxlO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn07XG4iLCIvKiFcbiAqIHJlcGVhdC1zdHJpbmcgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L3JlcGVhdC1zdHJpbmc+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBSZXN1bHRzIGNhY2hlXG4gKi9cblxudmFyIHJlcyA9ICcnO1xudmFyIGNhY2hlO1xuXG4vKipcbiAqIEV4cG9zZSBgcmVwZWF0YFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVwZWF0O1xuXG4vKipcbiAqIFJlcGVhdCB0aGUgZ2l2ZW4gYHN0cmluZ2AgdGhlIHNwZWNpZmllZCBgbnVtYmVyYFxuICogb2YgdGltZXMuXG4gKlxuICogKipFeGFtcGxlOioqXG4gKlxuICogYGBganNcbiAqIHZhciByZXBlYXQgPSByZXF1aXJlKCdyZXBlYXQtc3RyaW5nJyk7XG4gKiByZXBlYXQoJ0EnLCA1KTtcbiAqIC8vPT4gQUFBQUFcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyaW5nYCBUaGUgc3RyaW5nIHRvIHJlcGVhdFxuICogQHBhcmFtIHtOdW1iZXJ9IGBudW1iZXJgIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmdcbiAqIEByZXR1cm4ge1N0cmluZ30gUmVwZWF0ZWQgc3RyaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHJlcGVhdChzdHIsIG51bSkge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZXBlYXQtc3RyaW5nIGV4cGVjdHMgYSBzdHJpbmcuJyk7XG4gIH1cblxuICAvLyBjb3ZlciBjb21tb24sIHF1aWNrIHVzZSBjYXNlc1xuICBpZiAobnVtID09PSAxKSByZXR1cm4gc3RyO1xuICBpZiAobnVtID09PSAyKSByZXR1cm4gc3RyICsgc3RyO1xuXG4gIHZhciBtYXggPSBzdHIubGVuZ3RoICogbnVtO1xuICBpZiAoY2FjaGUgIT09IHN0ciB8fCB0eXBlb2YgY2FjaGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgY2FjaGUgPSBzdHI7XG4gICAgcmVzID0gJyc7XG4gIH1cblxuICB3aGlsZSAobWF4ID4gcmVzLmxlbmd0aCAmJiBudW0gPiAwKSB7XG4gICAgaWYgKG51bSAmIDEpIHtcbiAgICAgIHJlcyArPSBzdHI7XG4gICAgfVxuXG4gICAgbnVtID4+PSAxO1xuICAgIGlmICghbnVtKSBicmVhaztcbiAgICBzdHIgKz0gc3RyO1xuICB9XG5cbiAgcmV0dXJuIHJlcy5zdWJzdHIoMCwgbWF4KTtcbn1cblxuIiwiLyohXG4gKiBzZXQtZ2V0dGVyIChodHRwczovL2dpdGh1Yi5jb20vZG9vd2Ivc2V0LWdldHRlcilcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEJyaWFuIFdvb2R3YXJkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHRvUGF0aCA9IHJlcXVpcmUoJ3RvLW9iamVjdC1wYXRoJyk7XG5cbi8qKlxuICogRGVmaW5lcyBhIGdldHRlciBmdW5jdGlvbiBvbiBhbiBvYmplY3QgdXNpbmcgcHJvcGVydHkgcGF0aCBub3RhdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogdmFyIG9iaiA9IHt9O1xuICogZ2V0dGVyKG9iaiwgJ2ZvbycsIGZ1bmN0aW9uKCkge1xuICogICByZXR1cm4gJ2Jhcic7XG4gKiB9KTtcbiAqIGBgYFxuICogQHBhcmFtIHtPYmplY3R9IGBvYmpgIE9iamVjdCB0byBhZGQgcHJvcGVydHkgdG8uXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHByb3BgIFByb3BlcnR5IHN0cmluZyBvciBhcnJheSB0byBhZGQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBgZ2V0dGVyYCBHZXR0ZXIgZnVuY3Rpb24gdG8gYWRkIGFzIGEgcHJvcGVydHkuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHNldEdldHRlcihvYmosIHByb3AsIGdldHRlcikge1xuICB2YXIga2V5ID0gdG9QYXRoKGFyZ3VtZW50cyk7XG4gIHJldHVybiBkZWZpbmUob2JqLCBrZXksIGdldHRlcik7XG59XG5cbi8qKlxuICogRGVmaW5lIGdldHRlciBmdW5jdGlvbiBvbiBvYmplY3Qgb3Igb2JqZWN0IGhpZXJhcmNoeSB1c2luZyBkb3Qgbm90YXRpb24uXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBgb2JqYCBPYmplY3QgdG8gZGVmaW5lIGdldHRlciBwcm9wZXJ0eSBvbi5cbiAqIEBwYXJhbSAge1N0cmluZ30gYHByb3BgIFByb3BlcnR5IHN0cmluZyB0byBkZWZpbmUuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gYGdldHRlcmAgR2V0dGVyIGZ1bmN0aW9uIHRvIGRlZmluZS5cbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBvcmlnaW5hbCBvYmplY3QuXG4gKi9cblxuZnVuY3Rpb24gZGVmaW5lKG9iaiwgcHJvcCwgZ2V0dGVyKSB7XG4gIGlmICghfnByb3AuaW5kZXhPZignLicpKSB7XG4gICAgZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBnZXR0ZXIpO1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB2YXIga2V5cyA9IHByb3Auc3BsaXQoJy4nKTtcbiAgdmFyIGxhc3QgPSBrZXlzLnBvcCgpO1xuICB2YXIgdGFyZ2V0ID0gb2JqO1xuICB2YXIga2V5O1xuXG4gIHdoaWxlICgoa2V5ID0ga2V5cy5zaGlmdCgpKSkge1xuICAgIHdoaWxlIChrZXkuc2xpY2UoLTEpID09PSAnXFxcXCcpIHtcbiAgICAgIGtleSA9IGtleS5zbGljZSgwLCAtMSkgKyAnLicgKyBrZXlzLnNoaWZ0KCk7XG4gICAgfVxuICAgIHRhcmdldCA9IHRhcmdldFtrZXldIHx8ICh0YXJnZXRba2V5XSA9IHt9KTtcbiAgfVxuXG4gIGRlZmluZVByb3BlcnR5KHRhcmdldCwgbGFzdCwgZ2V0dGVyKTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBEZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIG9uIG9iamVjdCBhcyBhIGNvbmZpZ3VyYWJsZSBhbmQgZW51bWVyYWJsZSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBvYmpgIE9iamVjdCB0byBkZWZpbmUgcHJvcGVydHkgb24uXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGBwcm9wYCBQcm9wZXJ0eSB0byBkZWZpbmUuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gYGdldHRlcmAgR2V0dGVyIGZ1bmN0aW9uIHRvIGRlZmluZS5cbiAqL1xuXG5mdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGdldHRlcikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBnZXR0ZXJcbiAgfSk7XG59XG5cbi8qKlxuICogRXhwb3NlIGBzZXRHZXR0ZXJgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRHZXR0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYW5zaVJlZ2V4ID0gcmVxdWlyZSgnYW5zaS1yZWdleCcpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0cikge1xuXHRyZXR1cm4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgPyBzdHIucmVwbGFjZShhbnNpUmVnZXgsICcnKSA6IHN0cjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLlxuICAgICAgICBkZWZpbmUoW10sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0XG4gICAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLFxuICAgICAgICAvLyBsaWtlIE5vZGUuXG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpXG4gICAgICAgIHJvb3Quc3RyaXB0YWdzID0gZmFjdG9yeSgpO1xuICB9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgU1RBVEVfT1VUUFVUICAgICAgID0gMCxcbiAgICAgICAgU1RBVEVfSFRNTCAgICAgICAgID0gMSxcbiAgICAgICAgU1RBVEVfUFJFX0NPTU1FTlQgID0gMixcbiAgICAgICAgU1RBVEVfQ09NTUVOVCAgICAgID0gMyxcbiAgICAgICAgV0hJVEVTUEFDRSAgICAgICAgID0gL1xccy8sXG4gICAgICAgIEFMTE9XRURfVEFHU19SRUdFWCA9IC88KFxcdyopPi9nO1xuXG4gICAgZnVuY3Rpb24gc3RyaXB0YWdzKGh0bWwsIGFsbG93YWJsZVRhZ3MpIHtcbiAgICAgICAgdmFyIGh0bWwgPSBodG1sIHx8ICcnLFxuICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9PVVRQVVQsXG4gICAgICAgICAgICBkZXB0aCA9IDAsXG4gICAgICAgICAgICBvdXRwdXQgPSAnJyxcbiAgICAgICAgICAgIHRhZ0J1ZmZlciA9ICcnLFxuICAgICAgICAgICAgaW5RdW90ZSA9IGZhbHNlLFxuICAgICAgICAgICAgaSwgbGVuZ3RoLCBjO1xuXG4gICAgICAgIGlmICh0eXBlb2YgYWxsb3dhYmxlVGFncyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiB0YWdzXG4gICAgICAgICAgICBhbGxvd2FibGVUYWdzID0gcGFyc2VBbGxvd2FibGVUYWdzKGFsbG93YWJsZVRhZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGFsbG93YWJsZVRhZ3MpKSB7XG4gICAgICAgICAgICAvLyBJZiBpdCBpcyBub3QgYW4gYXJyYXksIGV4cGxpY2l0bHkgc2V0IHRvIG51bGxcbiAgICAgICAgICAgIGFsbG93YWJsZVRhZ3MgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMCwgbGVuZ3RoID0gaHRtbC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYyA9IGh0bWxbaV07XG5cbiAgICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgICAgIGNhc2UgJzwnOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSAnPCcgaWYgaW5zaWRlIGEgcXVvdGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluUXVvdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gJzwnIGZvbGxvd2VkIGJ5IGEgc3BhY2UgaXMgbm90IGEgdmFsaWQgdGFnLCBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaHRtbFtpICsgMV0gPT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lQ2hhcmFjdGVyKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdG8gU1RBVEVfSFRNTFxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfT1VUUFVUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0hUTUw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVDaGFyYWN0ZXIoYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhZGRpdGlvbmFsICc8JyBjaGFyYWN0ZXJzIHdoZW4gaW5zaWRlIGEgdGFnXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9IVE1MKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdW1lQ2hhcmFjdGVyKGMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYXNlICc+Jzoge1xuICAgICAgICAgICAgICAgICAgICAvLyBzb21ldGhpbmcgbGlrZSB0aGlzIGlzIGhhcHBlbmluZzogJzw8Pj4nXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlICc+JyBpZiBpbnNpZGUgYSBxdW90ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5RdW90ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBhbiBIVE1MIHRhZyB3YXMgY2xvc2VkXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9IVE1MKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpblF1b3RlID0gc3RhdGUgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dhYmxlVGFncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0J1ZmZlciArPSAnPic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hUYWdCdWZmZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyAnPCEnIG1ldCBpdHMgZW5kaW5nICc+J1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfUFJFX0NPTU1FTlQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluUXVvdGUgPSBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdCdWZmZXIgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbGFzdCB0d28gY2hhcmFjdGVycyB3ZXJlICctLScsIHRoZW4gZW5kIGNvbW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX0NPTU1FTlQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxbaSAtIDFdID09ICctJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbFtpIC0gMl0gPT0gJy0nKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGluUXVvdGUgPSBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdCdWZmZXIgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3VtZUNoYXJhY3RlcihjKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gY2F0Y2ggYm90aCBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZXNcbiAgICAgICAgICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgICAgICAgY2FzZSAnXFwnJzoge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfSFRNTCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluUXVvdGUgPT0gYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBxdW90ZSBmb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUXVvdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWluUXVvdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBxdW90ZSBvbmx5IGlmIG5vdCBhbHJlYWR5IGluIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUXVvdGUgPSBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3VtZUNoYXJhY3RlcihjKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZSAnISc6IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX0hUTUwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxbaSAtIDFdID09ICc8Jykge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rcyBsaWtlIHdlIG1pZ2h0IGJlIHN0YXJ0aW5nIGEgY29tbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9QUkVfQ09NTUVOVDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3VtZUNoYXJhY3RlcihjKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZSAnLSc6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHByZXZpb3VzIHR3byBjaGFyYWN0ZXJzIHdlcmUgJyEtJywgdGhpcyBpcyBhIGNvbW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX1BSRV9DT01NRU5UICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sW2kgLSAxXSA9PSAnLScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxbaSAtIDJdID09ICchJykge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0NPTU1FTlQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN1bWVDaGFyYWN0ZXIoYyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNhc2UgJ0UnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2UnOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBET0NUWVBFLCBiZWNhdXNlIGl0IGxvb2tzIGxpa2UgYSBjb21tZW50IGFuZCBpc24ndFxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfUFJFX0NPTU1FTlQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwuc3Vic3RyKGkgLSA2LCA3KS50b0xvd2VyQ2FzZSgpID09ICdkb2N0eXBlJykge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0hUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN1bWVDaGFyYWN0ZXIoYyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3VtZUNoYXJhY3RlcihjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjb25zdW1lQ2hhcmFjdGVyKGMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9PVVRQVVQpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gYztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWxsb3dhYmxlVGFncyAmJiBzdGF0ZSA9PSBTVEFURV9IVE1MKSB7XG4gICAgICAgICAgICAgICAgdGFnQnVmZmVyICs9IGM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBmbHVzaFRhZ0J1ZmZlcigpIHtcbiAgICAgICAgICAgIHZhciBub3JtYWxpemVkID0gJycsXG4gICAgICAgICAgICAgICAgbm9uV2hpdGVzcGFjZVNlZW4gPSBmYWxzZSxcbiAgICAgICAgICAgICAgICBpLCBsZW5ndGgsIGM7XG5cbiAgICAgICAgICAgIG5vcm1hbGl6ZVRhZ0J1ZmZlcjpcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IHRhZ0J1ZmZlci5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGMgPSB0YWdCdWZmZXJbaV0udG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICc8Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjYXNlICc+Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbm9ybWFsaXplVGFnQnVmZmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vbldoaXRlc3BhY2VTZWVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjLm1hdGNoKFdISVRFU1BBQ0UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uV2hpdGVzcGFjZVNlZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQgKz0gYztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9uV2hpdGVzcGFjZVNlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBub3JtYWxpemVUYWdCdWZmZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhbGxvd2FibGVUYWdzLmluZGV4T2Yobm9ybWFsaXplZCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IHRhZ0J1ZmZlcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGFnQnVmZmVyID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRhZ3MgdGhhdCBhcmUgYWxsb3dlZCB0byBwYXNzIHRocm91Z2ggdGhlXG4gICAgICogYWxnb3JpdGhtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZyBhbGxvd2FibGVUYWdzIEEgc3RyaW5nIG9mIHRhZ3MgdG8gYWxsb3cgKGUuZy4gXCI8Yj48c3Ryb25nPlwiKS5cbiAgICAgKiBAcmV0dXJuIGFycmF5fG51bGwgQW4gYXJyYXkgb2YgYWxsb3dlZCB0YWdzIG9yIG51bGwgaWYgbm9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJzZUFsbG93YWJsZVRhZ3MoYWxsb3dhYmxlVGFncykge1xuICAgICAgICB2YXIgdGFnc0FycmF5ID0gW10sXG4gICAgICAgICAgICBtYXRjaDtcblxuICAgICAgICB3aGlsZSAoKG1hdGNoID0gQUxMT1dFRF9UQUdTX1JFR0VYLmV4ZWMoYWxsb3dhYmxlVGFncykpICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0YWdzQXJyYXkucHVzaChtYXRjaFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFnc0FycmF5Lmxlbmd0aCAhPT0gMCA/IHRhZ3NBcnJheSA6IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmlwdGFncztcbn0pKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhcmd2ID0gcHJvY2Vzcy5hcmd2O1xuXG52YXIgdGVybWluYXRvciA9IGFyZ3YuaW5kZXhPZignLS0nKTtcbnZhciBoYXNGbGFnID0gZnVuY3Rpb24gKGZsYWcpIHtcblx0ZmxhZyA9ICctLScgKyBmbGFnO1xuXHR2YXIgcG9zID0gYXJndi5pbmRleE9mKGZsYWcpO1xuXHRyZXR1cm4gcG9zICE9PSAtMSAmJiAodGVybWluYXRvciAhPT0gLTEgPyBwb3MgPCB0ZXJtaW5hdG9yIDogdHJ1ZSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbiAoKSB7XG5cdGlmICgnRk9SQ0VfQ09MT1InIGluIHByb2Nlc3MuZW52KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpZiAoaGFzRmxhZygnbm8tY29sb3InKSB8fFxuXHRcdGhhc0ZsYWcoJ25vLWNvbG9ycycpIHx8XG5cdFx0aGFzRmxhZygnY29sb3I9ZmFsc2UnKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmIChoYXNGbGFnKCdjb2xvcicpIHx8XG5cdFx0aGFzRmxhZygnY29sb3JzJykgfHxcblx0XHRoYXNGbGFnKCdjb2xvcj10cnVlJykgfHxcblx0XHRoYXNGbGFnKCdjb2xvcj1hbHdheXMnKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aWYgKHByb2Nlc3Muc3Rkb3V0ICYmICFwcm9jZXNzLnN0ZG91dC5pc1RUWSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpZiAoJ0NPTE9SVEVSTScgaW4gcHJvY2Vzcy5lbnYpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmIChwcm9jZXNzLmVudi5URVJNID09PSAnZHVtYicpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpZiAoL15zY3JlZW58Xnh0ZXJtfF52dDEwMHxjb2xvcnxhbnNpfGN5Z3dpbnxsaW51eC9pLnRlc3QocHJvY2Vzcy5lbnYuVEVSTSkpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn0pKCk7XG4iLCIvKiFcbiAqIHRvLWdmbS1jb2RlLWJsb2NrIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC90by1nZm0tY29kZS1ibG9jaz5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwcmUoc3RyLCBsYW5nKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21hcmtkb3duLXByZSBleHBlY3RzIGEgc3RyaW5nLicpO1xuICB9XG5cbiAgdmFyIGNvZGUgPSAnJztcbiAgY29kZSArPSAnYGBgJyArICh0eXBlb2YgbGFuZyA9PT0gJ3N0cmluZycgPyBsYW5nIDogJycpO1xuICBjb2RlICs9ICdcXG4nO1xuICBjb2RlICs9IHN0cjtcbiAgY29kZSArPSAnXFxuJztcbiAgY29kZSArPSAnYGBgJztcbiAgcmV0dXJuIGNvZGU7XG59O1xuIiwiLyohXG4gKiB0by1vYmplY3QtcGF0aCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvdG8tb2JqZWN0LXBhdGg+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE1LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciB0eXBlT2YgPSByZXF1aXJlKCdraW5kLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdG9QYXRoKGFyZ3MpIHtcbiAgaWYgKHR5cGVPZihhcmdzKSAhPT0gJ2FyZ3VtZW50cycpIHtcbiAgICBhcmdzID0gYXJndW1lbnRzO1xuICB9XG4gIHJldHVybiBmaWx0ZXIoYXJncykuam9pbignLicpO1xufTtcblxuZnVuY3Rpb24gZmlsdGVyKGFycikge1xuICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcbiAgdmFyIGlkeCA9IC0xO1xuICB2YXIgcmVzID0gW107XG5cbiAgd2hpbGUgKCsraWR4IDwgbGVuKSB7XG4gICAgdmFyIGVsZSA9IGFycltpZHhdO1xuICAgIGlmICh0eXBlT2YoZWxlKSA9PT0gJ2FyZ3VtZW50cycgfHwgQXJyYXkuaXNBcnJheShlbGUpKSB7XG4gICAgICByZXMucHVzaC5hcHBseShyZXMsIGZpbHRlcihlbGUpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXMucHVzaChlbGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuIiwidmFyIGlzQnVmZmVyID0gcmVxdWlyZSgnaXMtYnVmZmVyJyk7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIEdldCB0aGUgbmF0aXZlIGB0eXBlb2ZgIGEgdmFsdWUuXG4gKlxuICogQHBhcmFtICB7Kn0gYHZhbGBcbiAqIEByZXR1cm4geyp9IE5hdGl2ZSBqYXZhc2NyaXB0IHR5cGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcbiAgLy8gcHJpbWl0aXZpZXNcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICB9XG4gIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG4gIGlmICh2YWwgPT09IHRydWUgfHwgdmFsID09PSBmYWxzZSB8fCB2YWwgaW5zdGFuY2VvZiBCb29sZWFuKSB7XG4gICAgcmV0dXJuICdib29sZWFuJztcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdmFsIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgcmV0dXJuICdzdHJpbmcnO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyB8fCB2YWwgaW5zdGFuY2VvZiBOdW1iZXIpIHtcbiAgICByZXR1cm4gJ251bWJlcic7XG4gIH1cblxuICAvLyBmdW5jdGlvbnNcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicgfHwgdmFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIC8vIGFycmF5XG4gIGlmICh0eXBlb2YgQXJyYXkuaXNBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgcmV0dXJuICdhcnJheSc7XG4gIH1cblxuICAvLyBjaGVjayBmb3IgaW5zdGFuY2VzIG9mIFJlZ0V4cCBhbmQgRGF0ZSBiZWZvcmUgY2FsbGluZyBgdG9TdHJpbmdgXG4gIGlmICh2YWwgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gIH1cbiAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gJ2RhdGUnO1xuICB9XG5cbiAgLy8gb3RoZXIgb2JqZWN0c1xuICB2YXIgdHlwZSA9IHRvU3RyaW5nLmNhbGwodmFsKTtcblxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcbiAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIHJldHVybiAnZGF0ZSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nKSB7XG4gICAgcmV0dXJuICdhcmd1bWVudHMnO1xuICB9XG5cbiAgLy8gYnVmZmVyXG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBpc0J1ZmZlcih2YWwpKSB7XG4gICAgcmV0dXJuICdidWZmZXInO1xuICB9XG5cbiAgLy8gZXM2OiBNYXAsIFdlYWtNYXAsIFNldCwgV2Vha1NldFxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgU2V0XScpIHtcbiAgICByZXR1cm4gJ3NldCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFdlYWtTZXRdJykge1xuICAgIHJldHVybiAnd2Vha3NldCc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IE1hcF0nKSB7XG4gICAgcmV0dXJuICdtYXAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBXZWFrTWFwXScpIHtcbiAgICByZXR1cm4gJ3dlYWttYXAnO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBTeW1ib2xdJykge1xuICAgIHJldHVybiAnc3ltYm9sJztcbiAgfVxuXG4gIC8vIHR5cGVkIGFycmF5c1xuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSW50OEFycmF5XScpIHtcbiAgICByZXR1cm4gJ2ludDhhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykge1xuICAgIHJldHVybiAndWludDhhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScpIHtcbiAgICByZXR1cm4gJ3VpbnQ4Y2xhbXBlZGFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgSW50MTZBcnJheV0nKSB7XG4gICAgcmV0dXJuICdpbnQxNmFycmF5JztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgVWludDE2QXJyYXldJykge1xuICAgIHJldHVybiAndWludDE2YXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBJbnQzMkFycmF5XScpIHtcbiAgICByZXR1cm4gJ2ludDMyYXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBVaW50MzJBcnJheV0nKSB7XG4gICAgcmV0dXJuICd1aW50MzJhcnJheSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nKSB7XG4gICAgcmV0dXJuICdmbG9hdDMyYXJyYXknO1xuICB9XG4gIGlmICh0eXBlID09PSAnW29iamVjdCBGbG9hdDY0QXJyYXldJykge1xuICAgIHJldHVybiAnZmxvYXQ2NGFycmF5JztcbiAgfVxuXG4gIC8vIG11c3QgYmUgYSBwbGFpbiBvYmplY3RcbiAgcmV0dXJuICdvYmplY3QnO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwdW55Y29kZSA9IHJlcXVpcmUoJ3B1bnljb2RlJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG5leHBvcnRzLnBhcnNlID0gdXJsUGFyc2U7XG5leHBvcnRzLnJlc29sdmUgPSB1cmxSZXNvbHZlO1xuZXhwb3J0cy5yZXNvbHZlT2JqZWN0ID0gdXJsUmVzb2x2ZU9iamVjdDtcbmV4cG9ydHMuZm9ybWF0ID0gdXJsRm9ybWF0O1xuXG5leHBvcnRzLlVybCA9IFVybDtcblxuZnVuY3Rpb24gVXJsKCkge1xuICB0aGlzLnByb3RvY29sID0gbnVsbDtcbiAgdGhpcy5zbGFzaGVzID0gbnVsbDtcbiAgdGhpcy5hdXRoID0gbnVsbDtcbiAgdGhpcy5ob3N0ID0gbnVsbDtcbiAgdGhpcy5wb3J0ID0gbnVsbDtcbiAgdGhpcy5ob3N0bmFtZSA9IG51bGw7XG4gIHRoaXMuaGFzaCA9IG51bGw7XG4gIHRoaXMuc2VhcmNoID0gbnVsbDtcbiAgdGhpcy5xdWVyeSA9IG51bGw7XG4gIHRoaXMucGF0aG5hbWUgPSBudWxsO1xuICB0aGlzLnBhdGggPSBudWxsO1xuICB0aGlzLmhyZWYgPSBudWxsO1xufVxuXG4vLyBSZWZlcmVuY2U6IFJGQyAzOTg2LCBSRkMgMTgwOCwgUkZDIDIzOTZcblxuLy8gZGVmaW5lIHRoZXNlIGhlcmUgc28gYXQgbGVhc3QgdGhleSBvbmx5IGhhdmUgdG8gYmVcbi8vIGNvbXBpbGVkIG9uY2Ugb24gdGhlIGZpcnN0IG1vZHVsZSBsb2FkLlxudmFyIHByb3RvY29sUGF0dGVybiA9IC9eKFthLXowLTkuKy1dKzopL2ksXG4gICAgcG9ydFBhdHRlcm4gPSAvOlswLTldKiQvLFxuXG4gICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhIHNpbXBsZSBwYXRoIFVSTFxuICAgIHNpbXBsZVBhdGhQYXR0ZXJuID0gL14oXFwvXFwvPyg/IVxcLylbXlxcP1xcc10qKShcXD9bXlxcc10qKT8kLyxcblxuICAgIC8vIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIHJlc2VydmVkIGZvciBkZWxpbWl0aW5nIFVSTHMuXG4gICAgLy8gV2UgYWN0dWFsbHkganVzdCBhdXRvLWVzY2FwZSB0aGVzZS5cbiAgICBkZWxpbXMgPSBbJzwnLCAnPicsICdcIicsICdgJywgJyAnLCAnXFxyJywgJ1xcbicsICdcXHQnXSxcblxuICAgIC8vIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGZvciB2YXJpb3VzIHJlYXNvbnMuXG4gICAgdW53aXNlID0gWyd7JywgJ30nLCAnfCcsICdcXFxcJywgJ14nLCAnYCddLmNvbmNhdChkZWxpbXMpLFxuXG4gICAgLy8gQWxsb3dlZCBieSBSRkNzLCBidXQgY2F1c2Ugb2YgWFNTIGF0dGFja3MuICBBbHdheXMgZXNjYXBlIHRoZXNlLlxuICAgIGF1dG9Fc2NhcGUgPSBbJ1xcJyddLmNvbmNhdCh1bndpc2UpLFxuICAgIC8vIENoYXJhY3RlcnMgdGhhdCBhcmUgbmV2ZXIgZXZlciBhbGxvd2VkIGluIGEgaG9zdG5hbWUuXG4gICAgLy8gTm90ZSB0aGF0IGFueSBpbnZhbGlkIGNoYXJzIGFyZSBhbHNvIGhhbmRsZWQsIGJ1dCB0aGVzZVxuICAgIC8vIGFyZSB0aGUgb25lcyB0aGF0IGFyZSAqZXhwZWN0ZWQqIHRvIGJlIHNlZW4sIHNvIHdlIGZhc3QtcGF0aFxuICAgIC8vIHRoZW0uXG4gICAgbm9uSG9zdENoYXJzID0gWyclJywgJy8nLCAnPycsICc7JywgJyMnXS5jb25jYXQoYXV0b0VzY2FwZSksXG4gICAgaG9zdEVuZGluZ0NoYXJzID0gWycvJywgJz8nLCAnIyddLFxuICAgIGhvc3RuYW1lTWF4TGVuID0gMjU1LFxuICAgIGhvc3RuYW1lUGFydFBhdHRlcm4gPSAvXlsrYS16MC05QS1aXy1dezAsNjN9JC8sXG4gICAgaG9zdG5hbWVQYXJ0U3RhcnQgPSAvXihbK2EtejAtOUEtWl8tXXswLDYzfSkoLiopJC8sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgY2FuIGFsbG93IFwidW5zYWZlXCIgYW5kIFwidW53aXNlXCIgY2hhcnMuXG4gICAgdW5zYWZlUHJvdG9jb2wgPSB7XG4gICAgICAnamF2YXNjcmlwdCc6IHRydWUsXG4gICAgICAnamF2YXNjcmlwdDonOiB0cnVlXG4gICAgfSxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBuZXZlciBoYXZlIGEgaG9zdG5hbWUuXG4gICAgaG9zdGxlc3NQcm90b2NvbCA9IHtcbiAgICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgICB9LFxuICAgIC8vIHByb3RvY29scyB0aGF0IGFsd2F5cyBjb250YWluIGEgLy8gYml0LlxuICAgIHNsYXNoZWRQcm90b2NvbCA9IHtcbiAgICAgICdodHRwJzogdHJ1ZSxcbiAgICAgICdodHRwcyc6IHRydWUsXG4gICAgICAnZnRwJzogdHJ1ZSxcbiAgICAgICdnb3BoZXInOiB0cnVlLFxuICAgICAgJ2ZpbGUnOiB0cnVlLFxuICAgICAgJ2h0dHA6JzogdHJ1ZSxcbiAgICAgICdodHRwczonOiB0cnVlLFxuICAgICAgJ2Z0cDonOiB0cnVlLFxuICAgICAgJ2dvcGhlcjonOiB0cnVlLFxuICAgICAgJ2ZpbGU6JzogdHJ1ZVxuICAgIH0sXG4gICAgcXVlcnlzdHJpbmcgPSByZXF1aXJlKCdxdWVyeXN0cmluZycpO1xuXG5mdW5jdGlvbiB1cmxQYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICh1cmwgJiYgdXRpbC5pc09iamVjdCh1cmwpICYmIHVybCBpbnN0YW5jZW9mIFVybCkgcmV0dXJuIHVybDtcblxuICB2YXIgdSA9IG5ldyBVcmw7XG4gIHUucGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCk7XG4gIHJldHVybiB1O1xufVxuXG5VcmwucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24odXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAoIXV0aWwuaXNTdHJpbmcodXJsKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQYXJhbWV0ZXIgJ3VybCcgbXVzdCBiZSBhIHN0cmluZywgbm90IFwiICsgdHlwZW9mIHVybCk7XG4gIH1cblxuICAvLyBDb3B5IGNocm9tZSwgSUUsIG9wZXJhIGJhY2tzbGFzaC1oYW5kbGluZyBiZWhhdmlvci5cbiAgLy8gQmFjayBzbGFzaGVzIGJlZm9yZSB0aGUgcXVlcnkgc3RyaW5nIGdldCBjb252ZXJ0ZWQgdG8gZm9yd2FyZCBzbGFzaGVzXG4gIC8vIFNlZTogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTI1OTE2XG4gIHZhciBxdWVyeUluZGV4ID0gdXJsLmluZGV4T2YoJz8nKSxcbiAgICAgIHNwbGl0dGVyID1cbiAgICAgICAgICAocXVlcnlJbmRleCAhPT0gLTEgJiYgcXVlcnlJbmRleCA8IHVybC5pbmRleE9mKCcjJykpID8gJz8nIDogJyMnLFxuICAgICAgdVNwbGl0ID0gdXJsLnNwbGl0KHNwbGl0dGVyKSxcbiAgICAgIHNsYXNoUmVnZXggPSAvXFxcXC9nO1xuICB1U3BsaXRbMF0gPSB1U3BsaXRbMF0ucmVwbGFjZShzbGFzaFJlZ2V4LCAnLycpO1xuICB1cmwgPSB1U3BsaXQuam9pbihzcGxpdHRlcik7XG5cbiAgdmFyIHJlc3QgPSB1cmw7XG5cbiAgLy8gdHJpbSBiZWZvcmUgcHJvY2VlZGluZy5cbiAgLy8gVGhpcyBpcyB0byBzdXBwb3J0IHBhcnNlIHN0dWZmIGxpa2UgXCIgIGh0dHA6Ly9mb28uY29tICBcXG5cIlxuICByZXN0ID0gcmVzdC50cmltKCk7XG5cbiAgaWYgKCFzbGFzaGVzRGVub3RlSG9zdCAmJiB1cmwuc3BsaXQoJyMnKS5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgZmFzdCBwYXRoIHJlZ2V4cFxuICAgIHZhciBzaW1wbGVQYXRoID0gc2ltcGxlUGF0aFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgICBpZiAoc2ltcGxlUGF0aCkge1xuICAgICAgdGhpcy5wYXRoID0gcmVzdDtcbiAgICAgIHRoaXMuaHJlZiA9IHJlc3Q7XG4gICAgICB0aGlzLnBhdGhuYW1lID0gc2ltcGxlUGF0aFsxXTtcbiAgICAgIGlmIChzaW1wbGVQYXRoWzJdKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gc2ltcGxlUGF0aFsyXTtcbiAgICAgICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5zZWFyY2guc3Vic3RyKDEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5zZWFyY2guc3Vic3RyKDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICAgICAgdGhpcy5xdWVyeSA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF07XG4gICAgdmFyIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMucHJvdG9jb2wgPSBsb3dlclByb3RvO1xuICAgIHJlc3QgPSByZXN0LnN1YnN0cihwcm90by5sZW5ndGgpO1xuICB9XG5cbiAgLy8gZmlndXJlIG91dCBpZiBpdCdzIGdvdCBhIGhvc3RcbiAgLy8gdXNlckBzZXJ2ZXIgaXMgKmFsd2F5cyogaW50ZXJwcmV0ZWQgYXMgYSBob3N0bmFtZSwgYW5kIHVybFxuICAvLyByZXNvbHV0aW9uIHdpbGwgdHJlYXQgLy9mb28vYmFyIGFzIGhvc3Q9Zm9vLHBhdGg9YmFyIGJlY2F1c2UgdGhhdCdzXG4gIC8vIGhvdyB0aGUgYnJvd3NlciByZXNvbHZlcyByZWxhdGl2ZSBVUkxzLlxuICBpZiAoc2xhc2hlc0Rlbm90ZUhvc3QgfHwgcHJvdG8gfHwgcmVzdC5tYXRjaCgvXlxcL1xcL1teQFxcL10rQFteQFxcL10rLykpIHtcbiAgICB2YXIgc2xhc2hlcyA9IHJlc3Quc3Vic3RyKDAsIDIpID09PSAnLy8nO1xuICAgIGlmIChzbGFzaGVzICYmICEocHJvdG8gJiYgaG9zdGxlc3NQcm90b2NvbFtwcm90b10pKSB7XG4gICAgICByZXN0ID0gcmVzdC5zdWJzdHIoMik7XG4gICAgICB0aGlzLnNsYXNoZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaG9zdGxlc3NQcm90b2NvbFtwcm90b10gJiZcbiAgICAgIChzbGFzaGVzIHx8IChwcm90byAmJiAhc2xhc2hlZFByb3RvY29sW3Byb3RvXSkpKSB7XG5cbiAgICAvLyB0aGVyZSdzIGEgaG9zdG5hbWUuXG4gICAgLy8gdGhlIGZpcnN0IGluc3RhbmNlIG9mIC8sID8sIDssIG9yICMgZW5kcyB0aGUgaG9zdC5cbiAgICAvL1xuICAgIC8vIElmIHRoZXJlIGlzIGFuIEAgaW4gdGhlIGhvc3RuYW1lLCB0aGVuIG5vbi1ob3N0IGNoYXJzICphcmUqIGFsbG93ZWRcbiAgICAvLyB0byB0aGUgbGVmdCBvZiB0aGUgbGFzdCBAIHNpZ24sIHVubGVzcyBzb21lIGhvc3QtZW5kaW5nIGNoYXJhY3RlclxuICAgIC8vIGNvbWVzICpiZWZvcmUqIHRoZSBALXNpZ24uXG4gICAgLy8gVVJMcyBhcmUgb2Jub3hpb3VzLlxuICAgIC8vXG4gICAgLy8gZXg6XG4gICAgLy8gaHR0cDovL2FAYkBjLyA9PiB1c2VyOmFAYiBob3N0OmNcbiAgICAvLyBodHRwOi8vYUBiP0BjID0+IHVzZXI6YSBob3N0OmMgcGF0aDovP0BjXG5cbiAgICAvLyB2MC4xMiBUT0RPKGlzYWFjcyk6IFRoaXMgaXMgbm90IHF1aXRlIGhvdyBDaHJvbWUgZG9lcyB0aGluZ3MuXG4gICAgLy8gUmV2aWV3IG91ciB0ZXN0IGNhc2UgYWdhaW5zdCBicm93c2VycyBtb3JlIGNvbXByZWhlbnNpdmVseS5cblxuICAgIC8vIGZpbmQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSBob3N0RW5kaW5nQ2hhcnNcbiAgICB2YXIgaG9zdEVuZCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9zdEVuZGluZ0NoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGVjID0gcmVzdC5pbmRleE9mKGhvc3RFbmRpbmdDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpXG4gICAgICAgIGhvc3RFbmQgPSBoZWM7XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgZWl0aGVyIHdlIGhhdmUgYW4gZXhwbGljaXQgcG9pbnQgd2hlcmUgdGhlXG4gICAgLy8gYXV0aCBwb3J0aW9uIGNhbm5vdCBnbyBwYXN0LCBvciB0aGUgbGFzdCBAIGNoYXIgaXMgdGhlIGRlY2lkZXIuXG4gICAgdmFyIGF1dGgsIGF0U2lnbjtcbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIGF0U2lnbiBjYW4gYmUgYW55d2hlcmUuXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGF0U2lnbiBtdXN0IGJlIGluIGF1dGggcG9ydGlvbi5cbiAgICAgIC8vIGh0dHA6Ly9hQGIvY0BkID0+IGhvc3Q6YiBhdXRoOmEgcGF0aDovY0BkXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJywgaG9zdEVuZCk7XG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGhhdmUgYSBwb3J0aW9uIHdoaWNoIGlzIGRlZmluaXRlbHkgdGhlIGF1dGguXG4gICAgLy8gUHVsbCB0aGF0IG9mZi5cbiAgICBpZiAoYXRTaWduICE9PSAtMSkge1xuICAgICAgYXV0aCA9IHJlc3Quc2xpY2UoMCwgYXRTaWduKTtcbiAgICAgIHJlc3QgPSByZXN0LnNsaWNlKGF0U2lnbiArIDEpO1xuICAgICAgdGhpcy5hdXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIH1cblxuICAgIC8vIHRoZSBob3N0IGlzIHRoZSByZW1haW5pbmcgdG8gdGhlIGxlZnQgb2YgdGhlIGZpcnN0IG5vbi1ob3N0IGNoYXJcbiAgICBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub25Ib3N0Q2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2Yobm9uSG9zdENoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG4gICAgLy8gaWYgd2Ugc3RpbGwgaGF2ZSBub3QgaGl0IGl0LCB0aGVuIHRoZSBlbnRpcmUgdGhpbmcgaXMgYSBob3N0LlxuICAgIGlmIChob3N0RW5kID09PSAtMSlcbiAgICAgIGhvc3RFbmQgPSByZXN0Lmxlbmd0aDtcblxuICAgIHRoaXMuaG9zdCA9IHJlc3Quc2xpY2UoMCwgaG9zdEVuZCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoaG9zdEVuZCk7XG5cbiAgICAvLyBwdWxsIG91dCBwb3J0LlxuICAgIHRoaXMucGFyc2VIb3N0KCk7XG5cbiAgICAvLyB3ZSd2ZSBpbmRpY2F0ZWQgdGhhdCB0aGVyZSBpcyBhIGhvc3RuYW1lLFxuICAgIC8vIHNvIGV2ZW4gaWYgaXQncyBlbXB0eSwgaXQgaGFzIHRvIGJlIHByZXNlbnQuXG4gICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG5cbiAgICAvLyBpZiBob3N0bmFtZSBiZWdpbnMgd2l0aCBbIGFuZCBlbmRzIHdpdGggXVxuICAgIC8vIGFzc3VtZSB0aGF0IGl0J3MgYW4gSVB2NiBhZGRyZXNzLlxuICAgIHZhciBpcHY2SG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lWzBdID09PSAnWycgJiZcbiAgICAgICAgdGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDFdID09PSAnXSc7XG5cbiAgICAvLyB2YWxpZGF0ZSBhIGxpdHRsZS5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgdmFyIGhvc3RwYXJ0cyA9IHRoaXMuaG9zdG5hbWUuc3BsaXQoL1xcLi8pO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBob3N0cGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJ0ID0gaG9zdHBhcnRzW2ldO1xuICAgICAgICBpZiAoIXBhcnQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIXBhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpIHtcbiAgICAgICAgICB2YXIgbmV3cGFydCA9ICcnO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwLCBrID0gcGFydC5sZW5ndGg7IGogPCBrOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LmNoYXJDb2RlQXQoaikgPiAxMjcpIHtcbiAgICAgICAgICAgICAgLy8gd2UgcmVwbGFjZSBub24tQVNDSUkgY2hhciB3aXRoIGEgdGVtcG9yYXJ5IHBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgIC8vIHdlIG5lZWQgdGhpcyB0byBtYWtlIHN1cmUgc2l6ZSBvZiBob3N0bmFtZSBpcyBub3RcbiAgICAgICAgICAgICAgLy8gYnJva2VuIGJ5IHJlcGxhY2luZyBub24tQVNDSUkgYnkgbm90aGluZ1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9ICd4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gcGFydFtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gd2UgdGVzdCBhZ2FpbiB3aXRoIEFTQ0lJIGNoYXIgb25seVxuICAgICAgICAgIGlmICghbmV3cGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkUGFydHMgPSBob3N0cGFydHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB2YXIgbm90SG9zdCA9IGhvc3RwYXJ0cy5zbGljZShpICsgMSk7XG4gICAgICAgICAgICB2YXIgYml0ID0gcGFydC5tYXRjaChob3N0bmFtZVBhcnRTdGFydCk7XG4gICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgIHZhbGlkUGFydHMucHVzaChiaXRbMV0pO1xuICAgICAgICAgICAgICBub3RIb3N0LnVuc2hpZnQoYml0WzJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3RIb3N0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXN0ID0gJy8nICsgbm90SG9zdC5qb2luKCcuJykgKyByZXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ob3N0bmFtZSA9IHZhbGlkUGFydHMuam9pbignLicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaG9zdG5hbWUubGVuZ3RoID4gaG9zdG5hbWVNYXhMZW4pIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9zdG5hbWVzIGFyZSBhbHdheXMgbG93ZXIgY2FzZS5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIC8vIElETkEgU3VwcG9ydDogUmV0dXJucyBhIHB1bnljb2RlZCByZXByZXNlbnRhdGlvbiBvZiBcImRvbWFpblwiLlxuICAgICAgLy8gSXQgb25seSBjb252ZXJ0cyBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgdGhhdFxuICAgICAgLy8gaGF2ZSBub24tQVNDSUkgY2hhcmFjdGVycywgaS5lLiBpdCBkb2Vzbid0IG1hdHRlciBpZlxuICAgICAgLy8geW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0IGFscmVhZHkgaXMgQVNDSUktb25seS5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSBwdW55Y29kZS50b0FTQ0lJKHRoaXMuaG9zdG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBwID0gdGhpcy5wb3J0ID8gJzonICsgdGhpcy5wb3J0IDogJyc7XG4gICAgdmFyIGggPSB0aGlzLmhvc3RuYW1lIHx8ICcnO1xuICAgIHRoaXMuaG9zdCA9IGggKyBwO1xuICAgIHRoaXMuaHJlZiArPSB0aGlzLmhvc3Q7XG5cbiAgICAvLyBzdHJpcCBbIGFuZCBdIGZyb20gdGhlIGhvc3RuYW1lXG4gICAgLy8gdGhlIGhvc3QgZmllbGQgc3RpbGwgcmV0YWlucyB0aGVtLCB0aG91Z2hcbiAgICBpZiAoaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZS5zdWJzdHIoMSwgdGhpcy5ob3N0bmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIGlmIChyZXN0WzBdICE9PSAnLycpIHtcbiAgICAgICAgcmVzdCA9ICcvJyArIHJlc3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gbm93IHJlc3QgaXMgc2V0IHRvIHRoZSBwb3N0LWhvc3Qgc3R1ZmYuXG4gIC8vIGNob3Agb2ZmIGFueSBkZWxpbSBjaGFycy5cbiAgaWYgKCF1bnNhZmVQcm90b2NvbFtsb3dlclByb3RvXSkge1xuXG4gICAgLy8gRmlyc3QsIG1ha2UgMTAwJSBzdXJlIHRoYXQgYW55IFwiYXV0b0VzY2FwZVwiIGNoYXJzIGdldFxuICAgIC8vIGVzY2FwZWQsIGV2ZW4gaWYgZW5jb2RlVVJJQ29tcG9uZW50IGRvZXNuJ3QgdGhpbmsgdGhleVxuICAgIC8vIG5lZWQgdG8gYmUuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhdXRvRXNjYXBlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGFlID0gYXV0b0VzY2FwZVtpXTtcbiAgICAgIGlmIChyZXN0LmluZGV4T2YoYWUpID09PSAtMSlcbiAgICAgICAgY29udGludWU7XG4gICAgICB2YXIgZXNjID0gZW5jb2RlVVJJQ29tcG9uZW50KGFlKTtcbiAgICAgIGlmIChlc2MgPT09IGFlKSB7XG4gICAgICAgIGVzYyA9IGVzY2FwZShhZSk7XG4gICAgICB9XG4gICAgICByZXN0ID0gcmVzdC5zcGxpdChhZSkuam9pbihlc2MpO1xuICAgIH1cbiAgfVxuXG5cbiAgLy8gY2hvcCBvZmYgZnJvbSB0aGUgdGFpbCBmaXJzdC5cbiAgdmFyIGhhc2ggPSByZXN0LmluZGV4T2YoJyMnKTtcbiAgaWYgKGhhc2ggIT09IC0xKSB7XG4gICAgLy8gZ290IGEgZnJhZ21lbnQgc3RyaW5nLlxuICAgIHRoaXMuaGFzaCA9IHJlc3Quc3Vic3RyKGhhc2gpO1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIGhhc2gpO1xuICB9XG4gIHZhciBxbSA9IHJlc3QuaW5kZXhPZignPycpO1xuICBpZiAocW0gIT09IC0xKSB7XG4gICAgdGhpcy5zZWFyY2ggPSByZXN0LnN1YnN0cihxbSk7XG4gICAgdGhpcy5xdWVyeSA9IHJlc3Quc3Vic3RyKHFtICsgMSk7XG4gICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnF1ZXJ5KTtcbiAgICB9XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgcW0pO1xuICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAvLyBubyBxdWVyeSBzdHJpbmcsIGJ1dCBwYXJzZVF1ZXJ5U3RyaW5nIHN0aWxsIHJlcXVlc3RlZFxuICAgIHRoaXMuc2VhcmNoID0gJyc7XG4gICAgdGhpcy5xdWVyeSA9IHt9O1xuICB9XG4gIGlmIChyZXN0KSB0aGlzLnBhdGhuYW1lID0gcmVzdDtcbiAgaWYgKHNsYXNoZWRQcm90b2NvbFtsb3dlclByb3RvXSAmJlxuICAgICAgdGhpcy5ob3N0bmFtZSAmJiAhdGhpcy5wYXRobmFtZSkge1xuICAgIHRoaXMucGF0aG5hbWUgPSAnLyc7XG4gIH1cblxuICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gIGlmICh0aGlzLnBhdGhuYW1lIHx8IHRoaXMuc2VhcmNoKSB7XG4gICAgdmFyIHAgPSB0aGlzLnBhdGhuYW1lIHx8ICcnO1xuICAgIHZhciBzID0gdGhpcy5zZWFyY2ggfHwgJyc7XG4gICAgdGhpcy5wYXRoID0gcCArIHM7XG4gIH1cblxuICAvLyBmaW5hbGx5LCByZWNvbnN0cnVjdCB0aGUgaHJlZiBiYXNlZCBvbiB3aGF0IGhhcyBiZWVuIHZhbGlkYXRlZC5cbiAgdGhpcy5ocmVmID0gdGhpcy5mb3JtYXQoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBmb3JtYXQgYSBwYXJzZWQgb2JqZWN0IGludG8gYSB1cmwgc3RyaW5nXG5mdW5jdGlvbiB1cmxGb3JtYXQob2JqKSB7XG4gIC8vIGVuc3VyZSBpdCdzIGFuIG9iamVjdCwgYW5kIG5vdCBhIHN0cmluZyB1cmwuXG4gIC8vIElmIGl0J3MgYW4gb2JqLCB0aGlzIGlzIGEgbm8tb3AuXG4gIC8vIHRoaXMgd2F5LCB5b3UgY2FuIGNhbGwgdXJsX2Zvcm1hdCgpIG9uIHN0cmluZ3NcbiAgLy8gdG8gY2xlYW4gdXAgcG90ZW50aWFsbHkgd29ua3kgdXJscy5cbiAgaWYgKHV0aWwuaXNTdHJpbmcob2JqKSkgb2JqID0gdXJsUGFyc2Uob2JqKTtcbiAgaWYgKCEob2JqIGluc3RhbmNlb2YgVXJsKSkgcmV0dXJuIFVybC5wcm90b3R5cGUuZm9ybWF0LmNhbGwob2JqKTtcbiAgcmV0dXJuIG9iai5mb3JtYXQoKTtcbn1cblxuVXJsLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGF1dGggPSB0aGlzLmF1dGggfHwgJyc7XG4gIGlmIChhdXRoKSB7XG4gICAgYXV0aCA9IGVuY29kZVVSSUNvbXBvbmVudChhdXRoKTtcbiAgICBhdXRoID0gYXV0aC5yZXBsYWNlKC8lM0EvaSwgJzonKTtcbiAgICBhdXRoICs9ICdAJztcbiAgfVxuXG4gIHZhciBwcm90b2NvbCA9IHRoaXMucHJvdG9jb2wgfHwgJycsXG4gICAgICBwYXRobmFtZSA9IHRoaXMucGF0aG5hbWUgfHwgJycsXG4gICAgICBoYXNoID0gdGhpcy5oYXNoIHx8ICcnLFxuICAgICAgaG9zdCA9IGZhbHNlLFxuICAgICAgcXVlcnkgPSAnJztcblxuICBpZiAodGhpcy5ob3N0KSB7XG4gICAgaG9zdCA9IGF1dGggKyB0aGlzLmhvc3Q7XG4gIH0gZWxzZSBpZiAodGhpcy5ob3N0bmFtZSkge1xuICAgIGhvc3QgPSBhdXRoICsgKHRoaXMuaG9zdG5hbWUuaW5kZXhPZignOicpID09PSAtMSA/XG4gICAgICAgIHRoaXMuaG9zdG5hbWUgOlxuICAgICAgICAnWycgKyB0aGlzLmhvc3RuYW1lICsgJ10nKTtcbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICBob3N0ICs9ICc6JyArIHRoaXMucG9ydDtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5xdWVyeSAmJlxuICAgICAgdXRpbC5pc09iamVjdCh0aGlzLnF1ZXJ5KSAmJlxuICAgICAgT2JqZWN0LmtleXModGhpcy5xdWVyeSkubGVuZ3RoKSB7XG4gICAgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkodGhpcy5xdWVyeSk7XG4gIH1cblxuICB2YXIgc2VhcmNoID0gdGhpcy5zZWFyY2ggfHwgKHF1ZXJ5ICYmICgnPycgKyBxdWVyeSkpIHx8ICcnO1xuXG4gIGlmIChwcm90b2NvbCAmJiBwcm90b2NvbC5zdWJzdHIoLTEpICE9PSAnOicpIHByb3RvY29sICs9ICc6JztcblxuICAvLyBvbmx5IHRoZSBzbGFzaGVkUHJvdG9jb2xzIGdldCB0aGUgLy8uICBOb3QgbWFpbHRvOiwgeG1wcDosIGV0Yy5cbiAgLy8gdW5sZXNzIHRoZXkgaGFkIHRoZW0gdG8gYmVnaW4gd2l0aC5cbiAgaWYgKHRoaXMuc2xhc2hlcyB8fFxuICAgICAgKCFwcm90b2NvbCB8fCBzbGFzaGVkUHJvdG9jb2xbcHJvdG9jb2xdKSAmJiBob3N0ICE9PSBmYWxzZSkge1xuICAgIGhvc3QgPSAnLy8nICsgKGhvc3QgfHwgJycpO1xuICAgIGlmIChwYXRobmFtZSAmJiBwYXRobmFtZS5jaGFyQXQoMCkgIT09ICcvJykgcGF0aG5hbWUgPSAnLycgKyBwYXRobmFtZTtcbiAgfSBlbHNlIGlmICghaG9zdCkge1xuICAgIGhvc3QgPSAnJztcbiAgfVxuXG4gIGlmIChoYXNoICYmIGhhc2guY2hhckF0KDApICE9PSAnIycpIGhhc2ggPSAnIycgKyBoYXNoO1xuICBpZiAoc2VhcmNoICYmIHNlYXJjaC5jaGFyQXQoMCkgIT09ICc/Jykgc2VhcmNoID0gJz8nICsgc2VhcmNoO1xuXG4gIHBhdGhuYW1lID0gcGF0aG5hbWUucmVwbGFjZSgvWz8jXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQobWF0Y2gpO1xuICB9KTtcbiAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoJyMnLCAnJTIzJyk7XG5cbiAgcmV0dXJuIHByb3RvY29sICsgaG9zdCArIHBhdGhuYW1lICsgc2VhcmNoICsgaGFzaDtcbn07XG5cbmZ1bmN0aW9uIHVybFJlc29sdmUoc291cmNlLCByZWxhdGl2ZSkge1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZShyZWxhdGl2ZSk7XG59XG5cblVybC5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG4gIHJldHVybiB0aGlzLnJlc29sdmVPYmplY3QodXJsUGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKSkuZm9ybWF0KCk7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlT2JqZWN0KHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiByZWxhdGl2ZTtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmVPYmplY3QocmVsYXRpdmUpO1xufVxuXG5VcmwucHJvdG90eXBlLnJlc29sdmVPYmplY3QgPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuICBpZiAodXRpbC5pc1N0cmluZyhyZWxhdGl2ZSkpIHtcbiAgICB2YXIgcmVsID0gbmV3IFVybCgpO1xuICAgIHJlbC5wYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpO1xuICAgIHJlbGF0aXZlID0gcmVsO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IG5ldyBVcmwoKTtcbiAgdmFyIHRrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gIGZvciAodmFyIHRrID0gMDsgdGsgPCB0a2V5cy5sZW5ndGg7IHRrKyspIHtcbiAgICB2YXIgdGtleSA9IHRrZXlzW3RrXTtcbiAgICByZXN1bHRbdGtleV0gPSB0aGlzW3RrZXldO1xuICB9XG5cbiAgLy8gaGFzaCBpcyBhbHdheXMgb3ZlcnJpZGRlbiwgbm8gbWF0dGVyIHdoYXQuXG4gIC8vIGV2ZW4gaHJlZj1cIlwiIHdpbGwgcmVtb3ZlIGl0LlxuICByZXN1bHQuaGFzaCA9IHJlbGF0aXZlLmhhc2g7XG5cbiAgLy8gaWYgdGhlIHJlbGF0aXZlIHVybCBpcyBlbXB0eSwgdGhlbiB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyBoZXJlLlxuICBpZiAocmVsYXRpdmUuaHJlZiA9PT0gJycpIHtcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaHJlZnMgbGlrZSAvL2Zvby9iYXIgYWx3YXlzIGN1dCB0byB0aGUgcHJvdG9jb2wuXG4gIGlmIChyZWxhdGl2ZS5zbGFzaGVzICYmICFyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgIC8vIHRha2UgZXZlcnl0aGluZyBleGNlcHQgdGhlIHByb3RvY29sIGZyb20gcmVsYXRpdmVcbiAgICB2YXIgcmtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgZm9yICh2YXIgcmsgPSAwOyByayA8IHJrZXlzLmxlbmd0aDsgcmsrKykge1xuICAgICAgdmFyIHJrZXkgPSBya2V5c1tya107XG4gICAgICBpZiAocmtleSAhPT0gJ3Byb3RvY29sJylcbiAgICAgICAgcmVzdWx0W3JrZXldID0gcmVsYXRpdmVbcmtleV07XG4gICAgfVxuXG4gICAgLy91cmxQYXJzZSBhcHBlbmRzIHRyYWlsaW5nIC8gdG8gdXJscyBsaWtlIGh0dHA6Ly93d3cuZXhhbXBsZS5jb21cbiAgICBpZiAoc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF0gJiZcbiAgICAgICAgcmVzdWx0Lmhvc3RuYW1lICYmICFyZXN1bHQucGF0aG5hbWUpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gcmVzdWx0LnBhdGhuYW1lID0gJy8nO1xuICAgIH1cblxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAocmVsYXRpdmUucHJvdG9jb2wgJiYgcmVsYXRpdmUucHJvdG9jb2wgIT09IHJlc3VsdC5wcm90b2NvbCkge1xuICAgIC8vIGlmIGl0J3MgYSBrbm93biB1cmwgcHJvdG9jb2wsIHRoZW4gY2hhbmdpbmdcbiAgICAvLyB0aGUgcHJvdG9jb2wgZG9lcyB3ZWlyZCB0aGluZ3NcbiAgICAvLyBmaXJzdCwgaWYgaXQncyBub3QgZmlsZTosIHRoZW4gd2UgTVVTVCBoYXZlIGEgaG9zdCxcbiAgICAvLyBhbmQgaWYgdGhlcmUgd2FzIGEgcGF0aFxuICAgIC8vIHRvIGJlZ2luIHdpdGgsIHRoZW4gd2UgTVVTVCBoYXZlIGEgcGF0aC5cbiAgICAvLyBpZiBpdCBpcyBmaWxlOiwgdGhlbiB0aGUgaG9zdCBpcyBkcm9wcGVkLFxuICAgIC8vIGJlY2F1c2UgdGhhdCdzIGtub3duIHRvIGJlIGhvc3RsZXNzLlxuICAgIC8vIGFueXRoaW5nIGVsc2UgaXMgYXNzdW1lZCB0byBiZSBhYnNvbHV0ZS5cbiAgICBpZiAoIXNsYXNoZWRQcm90b2NvbFtyZWxhdGl2ZS5wcm90b2NvbF0pIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocmVsYXRpdmUpO1xuICAgICAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gICAgICAgIHZhciBrID0ga2V5c1t2XTtcbiAgICAgICAgcmVzdWx0W2tdID0gcmVsYXRpdmVba107XG4gICAgICB9XG4gICAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmVzdWx0LnByb3RvY29sID0gcmVsYXRpdmUucHJvdG9jb2w7XG4gICAgaWYgKCFyZWxhdGl2ZS5ob3N0ICYmICFob3N0bGVzc1Byb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIHJlbFBhdGggPSAocmVsYXRpdmUucGF0aG5hbWUgfHwgJycpLnNwbGl0KCcvJyk7XG4gICAgICB3aGlsZSAocmVsUGF0aC5sZW5ndGggJiYgIShyZWxhdGl2ZS5ob3N0ID0gcmVsUGF0aC5zaGlmdCgpKSk7XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3QpIHJlbGF0aXZlLmhvc3QgPSAnJztcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdG5hbWUpIHJlbGF0aXZlLmhvc3RuYW1lID0gJyc7XG4gICAgICBpZiAocmVsUGF0aFswXSAhPT0gJycpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICBpZiAocmVsUGF0aC5sZW5ndGggPCAyKSByZWxQYXRoLnVuc2hpZnQoJycpO1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsUGF0aC5qb2luKCcvJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbGF0aXZlLnBhdGhuYW1lO1xuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHJlc3VsdC5ob3N0ID0gcmVsYXRpdmUuaG9zdCB8fCAnJztcbiAgICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGg7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdDtcbiAgICByZXN1bHQucG9ydCA9IHJlbGF0aXZlLnBvcnQ7XG4gICAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnBhdGhuYW1lIHx8IHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHZhciBwID0gcmVzdWx0LnBhdGhuYW1lIHx8ICcnO1xuICAgICAgdmFyIHMgPSByZXN1bHQuc2VhcmNoIHx8ICcnO1xuICAgICAgcmVzdWx0LnBhdGggPSBwICsgcztcbiAgICB9XG4gICAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgaXNTb3VyY2VBYnMgPSAocmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJyksXG4gICAgICBpc1JlbEFicyA9IChcbiAgICAgICAgICByZWxhdGl2ZS5ob3N0IHx8XG4gICAgICAgICAgcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLydcbiAgICAgICksXG4gICAgICBtdXN0RW5kQWJzID0gKGlzUmVsQWJzIHx8IGlzU291cmNlQWJzIHx8XG4gICAgICAgICAgICAgICAgICAgIChyZXN1bHQuaG9zdCAmJiByZWxhdGl2ZS5wYXRobmFtZSkpLFxuICAgICAgcmVtb3ZlQWxsRG90cyA9IG11c3RFbmRBYnMsXG4gICAgICBzcmNQYXRoID0gcmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5zcGxpdCgnLycpIHx8IFtdLFxuICAgICAgcmVsUGF0aCA9IHJlbGF0aXZlLnBhdGhuYW1lICYmIHJlbGF0aXZlLnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgICBwc3ljaG90aWMgPSByZXN1bHQucHJvdG9jb2wgJiYgIXNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdO1xuXG4gIC8vIGlmIHRoZSB1cmwgaXMgYSBub24tc2xhc2hlZCB1cmwsIHRoZW4gcmVsYXRpdmVcbiAgLy8gbGlua3MgbGlrZSAuLi8uLiBzaG91bGQgYmUgYWJsZVxuICAvLyB0byBjcmF3bCB1cCB0byB0aGUgaG9zdG5hbWUsIGFzIHdlbGwuICBUaGlzIGlzIHN0cmFuZ2UuXG4gIC8vIHJlc3VsdC5wcm90b2NvbCBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSBub3cuXG4gIC8vIExhdGVyIG9uLCBwdXQgdGhlIGZpcnN0IHBhdGggcGFydCBpbnRvIHRoZSBob3N0IGZpZWxkLlxuICBpZiAocHN5Y2hvdGljKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gJyc7XG4gICAgcmVzdWx0LnBvcnQgPSBudWxsO1xuICAgIGlmIChyZXN1bHQuaG9zdCkge1xuICAgICAgaWYgKHNyY1BhdGhbMF0gPT09ICcnKSBzcmNQYXRoWzBdID0gcmVzdWx0Lmhvc3Q7XG4gICAgICBlbHNlIHNyY1BhdGgudW5zaGlmdChyZXN1bHQuaG9zdCk7XG4gICAgfVxuICAgIHJlc3VsdC5ob3N0ID0gJyc7XG4gICAgaWYgKHJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgICByZWxhdGl2ZS5ob3N0bmFtZSA9IG51bGw7XG4gICAgICByZWxhdGl2ZS5wb3J0ID0gbnVsbDtcbiAgICAgIGlmIChyZWxhdGl2ZS5ob3N0KSB7XG4gICAgICAgIGlmIChyZWxQYXRoWzBdID09PSAnJykgcmVsUGF0aFswXSA9IHJlbGF0aXZlLmhvc3Q7XG4gICAgICAgIGVsc2UgcmVsUGF0aC51bnNoaWZ0KHJlbGF0aXZlLmhvc3QpO1xuICAgICAgfVxuICAgICAgcmVsYXRpdmUuaG9zdCA9IG51bGw7XG4gICAgfVxuICAgIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzICYmIChyZWxQYXRoWzBdID09PSAnJyB8fCBzcmNQYXRoWzBdID09PSAnJyk7XG4gIH1cblxuICBpZiAoaXNSZWxBYnMpIHtcbiAgICAvLyBpdCdzIGFic29sdXRlLlxuICAgIHJlc3VsdC5ob3N0ID0gKHJlbGF0aXZlLmhvc3QgfHwgcmVsYXRpdmUuaG9zdCA9PT0gJycpID9cbiAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLmhvc3QgOiByZXN1bHQuaG9zdDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAocmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdG5hbWUgPT09ICcnKSA/XG4gICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgOiByZXN1bHQuaG9zdG5hbWU7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICBzcmNQYXRoID0gcmVsUGF0aDtcbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRvdC1oYW5kbGluZyBiZWxvdy5cbiAgfSBlbHNlIGlmIChyZWxQYXRoLmxlbmd0aCkge1xuICAgIC8vIGl0J3MgcmVsYXRpdmVcbiAgICAvLyB0aHJvdyBhd2F5IHRoZSBleGlzdGluZyBmaWxlLCBhbmQgdGFrZSB0aGUgbmV3IHBhdGggaW5zdGVhZC5cbiAgICBpZiAoIXNyY1BhdGgpIHNyY1BhdGggPSBbXTtcbiAgICBzcmNQYXRoLnBvcCgpO1xuICAgIHNyY1BhdGggPSBzcmNQYXRoLmNvbmNhdChyZWxQYXRoKTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICB9IGVsc2UgaWYgKCF1dGlsLmlzTnVsbE9yVW5kZWZpbmVkKHJlbGF0aXZlLnNlYXJjaCkpIHtcbiAgICAvLyBqdXN0IHB1bGwgb3V0IHRoZSBzZWFyY2guXG4gICAgLy8gbGlrZSBocmVmPSc/Zm9vJy5cbiAgICAvLyBQdXQgdGhpcyBhZnRlciB0aGUgb3RoZXIgdHdvIGNhc2VzIGJlY2F1c2UgaXQgc2ltcGxpZmllcyB0aGUgYm9vbGVhbnNcbiAgICBpZiAocHN5Y2hvdGljKSB7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IHNyY1BhdGguc2hpZnQoKTtcbiAgICAgIC8vb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAgIC8vdGhpcyBlc3BlY2lhbGx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICAgIHZhciBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKCF1dGlsLmlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICF1dGlsLmlzTnVsbChyZXN1bHQuc2VhcmNoKSkge1xuICAgICAgcmVzdWx0LnBhdGggPSAocmVzdWx0LnBhdGhuYW1lID8gcmVzdWx0LnBhdGhuYW1lIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKCFzcmNQYXRoLmxlbmd0aCkge1xuICAgIC8vIG5vIHBhdGggYXQgYWxsLiAgZWFzeS5cbiAgICAvLyB3ZSd2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIG90aGVyIHN0dWZmIGFib3ZlLlxuICAgIHJlc3VsdC5wYXRobmFtZSA9IG51bGw7XG4gICAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQuc2VhcmNoKSB7XG4gICAgICByZXN1bHQucGF0aCA9ICcvJyArIHJlc3VsdC5zZWFyY2g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgICB9XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGlmIGEgdXJsIEVORHMgaW4gLiBvciAuLiwgdGhlbiBpdCBtdXN0IGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICAvLyBob3dldmVyLCBpZiBpdCBlbmRzIGluIGFueXRoaW5nIGVsc2Ugbm9uLXNsYXNoeSxcbiAgLy8gdGhlbiBpdCBtdXN0IE5PVCBnZXQgYSB0cmFpbGluZyBzbGFzaC5cbiAgdmFyIGxhc3QgPSBzcmNQYXRoLnNsaWNlKC0xKVswXTtcbiAgdmFyIGhhc1RyYWlsaW5nU2xhc2ggPSAoXG4gICAgICAocmVzdWx0Lmhvc3QgfHwgcmVsYXRpdmUuaG9zdCB8fCBzcmNQYXRoLmxlbmd0aCA+IDEpICYmXG4gICAgICAobGFzdCA9PT0gJy4nIHx8IGxhc3QgPT09ICcuLicpIHx8IGxhc3QgPT09ICcnKTtcblxuICAvLyBzdHJpcCBzaW5nbGUgZG90cywgcmVzb2x2ZSBkb3VibGUgZG90cyB0byBwYXJlbnQgZGlyXG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBzcmNQYXRoLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICBsYXN0ID0gc3JjUGF0aFtpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoIW11c3RFbmRBYnMgJiYgIXJlbW92ZUFsbERvdHMpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHNyY1BhdGgudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobXVzdEVuZEFicyAmJiBzcmNQYXRoWzBdICE9PSAnJyAmJlxuICAgICAgKCFzcmNQYXRoWzBdIHx8IHNyY1BhdGhbMF0uY2hhckF0KDApICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmIChoYXNUcmFpbGluZ1NsYXNoICYmIChzcmNQYXRoLmpvaW4oJy8nKS5zdWJzdHIoLTEpICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC5wdXNoKCcnKTtcbiAgfVxuXG4gIHZhciBpc0Fic29sdXRlID0gc3JjUGF0aFswXSA9PT0gJycgfHxcbiAgICAgIChzcmNQYXRoWzBdICYmIHNyY1BhdGhbMF0uY2hhckF0KDApID09PSAnLycpO1xuXG4gIC8vIHB1dCB0aGUgaG9zdCBiYWNrXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IGlzQWJzb2x1dGUgPyAnJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQYXRoLmxlbmd0aCA/IHNyY1BhdGguc2hpZnQoKSA6ICcnO1xuICAgIC8vb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAvL3RoaXMgZXNwZWNpYWxseSBoYXBwZW5zIGluIGNhc2VzIGxpa2VcbiAgICAvL3VybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgIHZhciBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICByZXN1bHQuaG9zdC5zcGxpdCgnQCcpIDogZmFsc2U7XG4gICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWUgPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgfVxuICB9XG5cbiAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgfHwgKHJlc3VsdC5ob3N0ICYmIHNyY1BhdGgubGVuZ3RoKTtcblxuICBpZiAobXVzdEVuZEFicyAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHNyY1BhdGgudW5zaGlmdCgnJyk7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gc3JjUGF0aC5qb2luKCcvJyk7XG4gIH1cblxuICAvL3RvIHN1cHBvcnQgcmVxdWVzdC5odHRwXG4gIGlmICghdXRpbC5pc051bGwocmVzdWx0LnBhdGhuYW1lKSB8fCAhdXRpbC5pc051bGwocmVzdWx0LnNlYXJjaCkpIHtcbiAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICB9XG4gIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aCB8fCByZXN1bHQuYXV0aDtcbiAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblVybC5wcm90b3R5cGUucGFyc2VIb3N0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBob3N0ID0gdGhpcy5ob3N0O1xuICB2YXIgcG9ydCA9IHBvcnRQYXR0ZXJuLmV4ZWMoaG9zdCk7XG4gIGlmIChwb3J0KSB7XG4gICAgcG9ydCA9IHBvcnRbMF07XG4gICAgaWYgKHBvcnQgIT09ICc6Jykge1xuICAgICAgdGhpcy5wb3J0ID0gcG9ydC5zdWJzdHIoMSk7XG4gICAgfVxuICAgIGhvc3QgPSBob3N0LnN1YnN0cigwLCBob3N0Lmxlbmd0aCAtIHBvcnQubGVuZ3RoKTtcbiAgfVxuICBpZiAoaG9zdCkgdGhpcy5ob3N0bmFtZSA9IGhvc3Q7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNTdHJpbmc6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YoYXJnKSA9PT0gJ3N0cmluZyc7XG4gIH0sXG4gIGlzT2JqZWN0OiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gdHlwZW9mKGFyZykgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbiAgfSxcbiAgaXNOdWxsOiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnID09PSBudWxsO1xuICB9LFxuICBpc051bGxPclVuZGVmaW5lZDogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGFyZyA9PSBudWxsO1xuICB9XG59O1xuIiwiXG52YXIgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKCdoYW5kbGViYXJzLWhlbHBlcnMnKSh7XG4gIGhhbmRsZWJhcnM6IEhhbmRsZWJhcnNcbn0pO1xuXG4kKGZ1bmN0aW9uKCkge1xuICB2YXIgbmFtZSA9ICQoJyNuYW1lJykub24oJ2tleXVwJywgZnVuY3Rpb24oZSkge1xuICAgIGlmIChuYW1lLnZhbCgpLmxlbmd0aCA+IDEpIHtcbiAgICAgIHZhciBkYXRhID0ge25hbWU6IG5hbWUudmFsKCl9O1xuICAgICAgcmVuZGVyKGRhdGEpO1xuICAgIH1cbiAgfSk7XG5cbiAgbmFtZS5mb2N1cygpO1xuXG4gIGZ1bmN0aW9uIHJlbmRlcihkYXRhKSB7XG4gICAgdmFyIHRtcGwgPSBcIjxoMj57e2Rhc2hjYXNlIG5hbWV9fTwvaDI+XCI7XG4gICAgdmFyIGZuID0gSGFuZGxlYmFycy5jb21waWxlKHRtcGwpO1xuICAgIHZhciBjb250ZW50ID0gZm4oZGF0YSk7XG4gICAgJCgnI2NvbnRlbnQnKS5odG1sKGNvbnRlbnQpO1xuICB9XG59KTtcbiJdfQ==","(function ($) {\r\n $.fn.itemPicker = function (options) {\r\n var opts = $.extend({}, $.fn.itemPicker.defaults, options);\r\n\r\n return this.each(function () {\r\n var comboBox;\r\n var originalTemplate = kendo.template('
      ' + opts.extendedQueryOptions.originalText + '
      ');\r\n var extendedTemplate = kendo.template('
      ' + opts.extendedQueryOptions.alternateText + '
      ');\r\n\r\n //Configure DataSources\r\n var originalDataSourceOptions = {\r\n transport: {\r\n read: {\r\n dataType: \"json\",\r\n type: opts.queryOptions.type,\r\n url: opts.queryOptions.dataSource.url\r\n }\r\n },\r\n schema: {\r\n data: \"Data\",\r\n total: \"Total\",\r\n model: opts.schemaModel\r\n },\r\n sort: [{ field: \"Text\", dir: \"asc\" }],\r\n pageSize: opts.virtualizeOptions.dataSource.pageSize,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n serverPaging: true\r\n }\r\n\r\n var extendedDataSourceOptions = {\r\n transport: {\r\n read: {\r\n dataType: \"json\",\r\n type: opts.extendedQueryOptions.type,\r\n url: opts.extendedQueryOptions.dataSource.url\r\n }\r\n },\r\n schema: {\r\n data: \"Data\",\r\n total: \"Total\",\r\n model: opts.schemaModel\r\n },\r\n sort: [{ field: \"Text\", dir: \"asc\" }],\r\n pageSize: opts.virtualizeOptions.dataSource.pageSize,\r\n serverFiltering: true,\r\n serverSorting: true,\r\n serverPaging: true\r\n }\r\n\r\n //Additional DataSource Options\r\n if (opts.usingMvcForAjax) {\r\n originalDataSourceOptions.type = \"aspnetmvc-ajax\";\r\n extendedDataSourceOptions.type = \"aspnetmvc-ajax\";\r\n } \r\n\r\n //ViewModel containing dataSources and dataSource switching logic. Makes for easy click events\r\n var dataSourcesViewModel = kendo.observable({\r\n originalDataSource: new kendo.data.DataSource(originalDataSourceOptions),\r\n extendedDataSource: new kendo.data.DataSource(extendedDataSourceOptions),\r\n extendedSearch: false,\r\n toggleDataSource: function () {\r\n var originalDataSource = this.get(\"originalDataSource\"),\r\n extendedDataSource = this.get(\"extendedDataSource\");\r\n\r\n\r\n if (this.get(\"extendedSearch\")) {\r\n originalDataSource.filter(extendedDataSource.filter());\r\n\r\n comboBox.setDataSource(originalDataSource);\r\n comboBox.setOptions({ footerTemplate: originalTemplate });\r\n\r\n this.set(\"extendedSearch\", false);\r\n } else {\r\n extendedDataSource.filter(originalDataSource.filter());\r\n\r\n comboBox.setDataSource(extendedDataSource);\r\n comboBox.setOptions({ footerTemplate: extendedTemplate });\r\n\r\n this.set(\"extendedSearch\", true);\r\n }\r\n },\r\n returnToOriginalDataSource: function () {\r\n if (this.get(\"extendedSearch\")) {\r\n comboBox.setDataSource(this.get(\"originalDataSource\"));\r\n comboBox.setOptions({ footerTemplate: originalTemplate });\r\n\r\n this.set(\"extendedSearch\", false);\r\n }\r\n }\r\n });\r\n\r\n //Configure ComboBox\r\n var comboBoxOptions = {\r\n dataTextField: \"Text\",\r\n dataValueField: \"Id\",\r\n filter: opts.filter,\r\n template: opts.displayTemplate,\r\n placeholder: opts.placeHolder,\r\n dataBound: opts.dataBound,\r\n select: opts.select,\r\n height: opts.dropdownHeight,\r\n minLength: opts.minLength,\r\n enforceMinLength: true,\r\n dataSource: dataSourcesViewModel.get(\"originalDataSource\"),\r\n virtual: false,\r\n dataBound: function (e) {\r\n kendo.bind(e.sender.list, dataSourcesViewModel);\r\n\r\n opts.dataBound.call(this, e);\r\n },\r\n filtering: function (e) {\r\n if (e.filter.value.length < opts.minLength) {\r\n e.sender.close()\r\n dataSourcesViewModel.returnToOriginalDataSource();\r\n e.preventDefault();\r\n }\r\n },\r\n select: function (e) {\r\n opts.select.call(this, e);\r\n }\r\n }\r\n\r\n //Additional ComboBox Options\r\n if (opts.hideDropdown) {\r\n comboBoxOptions.autoBind = false;\r\n }\r\n\r\n if (opts.allowExtendedQuery) {\r\n comboBoxOptions.footerTemplate = originalTemplate;\r\n }\r\n\r\n if (opts.virtualizeResults) {\r\n comboBoxOptions.virtual = {\r\n itemHeight: opts.virtualizeOptions.itemHeight,\r\n valueMapper: function (options) {\r\n $.ajax({\r\n url: opts.virtualizeOptions.dataSource.url,\r\n type: opts.virtualizeOptions.dataSource.type,\r\n dataType: \"json\",\r\n data: convertValues(options.value),\r\n success: function (data) {\r\n options.success(data);\r\n }\r\n })\r\n }\r\n }\r\n }\r\n\r\n //Initialize ComboBox\r\n comboBox = $(this).kendoComboBox(comboBoxOptions).data(\"kendoComboBox\");\r\n\r\n //The widget is the highest level element Kendo creates around our initial element.\r\n //All other elements can be found under this one.\r\n var widget = $(this).closest('.k-widget.k-combobox'); \r\n\r\n //Additional option that must come after initialization\r\n if (opts.hideDropdown) {\r\n var select = widget.find(\".k-select\");\r\n var wrapper = widget.find(\".k-dropdown-wrap\");\r\n var input = widget.find('.k-input');\r\n var clearButton = widget.find('.k-clear-value');\r\n\r\n select.hide();\r\n wrapper.css(\"padding-right\", \"0\");\r\n input.css(\"padding-right\", \"0\");\r\n clearButton.css(\"right\", \"1em\");\r\n }\r\n\r\n //minLength enforcement\r\n widget.keydown(function () {\r\n if (comboBox.text().length < opts.minLength) {\r\n comboBox.close();\r\n }\r\n });\r\n widget.keyup(function () {\r\n if (comboBox.text().length < opts.minLength) {\r\n comboBox.close();\r\n }\r\n });\r\n });\r\n\r\n //required method for virtualization\r\n function convertValues(value) {\r\n var data = {};\r\n\r\n value = $.isArray(value) ? value : [value];\r\n\r\n for (var idx = 0; idx < value.length; idx++) {\r\n data[\"values[\" + idx + \"]\"] = value[idx];\r\n }\r\n\r\n return data;\r\n }\r\n };\r\n\r\n $.fn.itemPicker.defaults = {\r\n hideDropdown: false,\r\n allowExtendedQuery: false,\r\n virtualizeResults: false,\r\n usingMvcForAjax: false,\r\n virtualizeOptions: {\r\n itemHeight: 104,\r\n dataSource: {\r\n url: \"\",\r\n type: \"POST\",\r\n pageSize: 80\r\n }\r\n },\r\n queryOptions: {\r\n dataSource: {\r\n type: \"POST\",\r\n url: \"\"\r\n }\r\n },\r\n extendedQueryOptions: {\r\n dataSource: {\r\n type: \"POST\",\r\n url: \"\"\r\n },\r\n originalText: \"Can't find it? Try...\",\r\n originalButtonText: \"Full Campus Search\",\r\n alternateText: \"Return to...\",\r\n alternateButtonText: \"Local Search\"\r\n },\r\n schemaModel: {\r\n fields: {\r\n Id: { field: \"Id\", type: \"string\" },\r\n Text: { field: \"Text\", type: \"string\" }\r\n }\r\n },\r\n placeHolder: \"Select an Item...\",\r\n displayTemplate: '

      #:Text#

      #:Id#

      ',\r\n dropdownHeight: 400,\r\n filter: \"contains\",\r\n minLength: 3,\r\n dataBound: function () { },\r\n select: function () { }\r\n };\r\n}(jQuery));","var gridPrefix = \"Grid\";\r\nvar filterOperatorReadableReplacements = {\r\n contains: \"contains\",\r\n startswith: \"starts with\",\r\n endswith: \"ends with\",\r\n eq: \"is\",\r\n doesnotcontain: \"does not contain\",\r\n neq: \"is not equal to\",\r\n isempty: \"is empty\",\r\n isnotempty: \"is not empty\",\r\n gt: \"is greater than\",\r\n lt: \"is less than\",\r\n gte: \"is greater than or equal to\",\r\n lte: \"is less than or equal to\"\r\n};\r\nvar showInactive = false;\r\n\r\nvar deleteKendoUiWindowOptions = {\r\n title: \"Confirm Deletion\",\r\n visible: false,\r\n minWidth: \"300px\",\r\n maxWidth: \"450px\",\r\n minHeight: \"120px\",\r\n modal: true,\r\n pinned: true,\r\n draggable: false,\r\n resizable: false,\r\n actions: []\r\n};\r\n\r\nvar restoreKendoUiWindowOptions = {\r\n title: \"Confirm Restore\",\r\n visible: false,\r\n minWidth: \"300px\",\r\n maxWidth: \"450px\",\r\n minHeight: \"120px\",\r\n modal: true,\r\n pinned: true,\r\n draggable: false,\r\n resizable: false,\r\n actions: []\r\n};\r\nvar deleteConfirmedKendoUiWindowOptions = {\r\n title: false,\r\n visible: false,\r\n minWidth: \"300px\",\r\n maxWidth: \"450px\",\r\n minHeight: \"120px\",\r\n modal: false,\r\n pinned: true,\r\n draggable: false,\r\n autoFocus: true,\r\n resizable: false,\r\n actions: []\r\n};\r\n\r\nfunction saveGridOptionsToSessionStorage(entityType, options) {\r\n sessionStorage.setItem(gridPrefix + entityType, options);\r\n}\r\n\r\nfunction loadGridOptionsFromSessionStorage(entityType) {\r\n return sessionStorage.getItem(gridPrefix + entityType);\r\n}\r\n\r\nfunction clearAllGridOptions() {\r\n removeSessionStorageItemsByPrefix(gridPrefix);\r\n}\r\n\r\nfunction clearAllOtherGridOptions(gridToPreserve) {\r\n removeSessionStorageItemsByPrefix(gridPrefix, gridPrefix + gridToPreserve);\r\n}\r\n\r\nfunction removeSessionStorageItemsByPrefix(prefix, keyToPreserve) {\r\n var arr = []; // Array to hold the keys\r\n // Iterate over localStorage and insert the keys that meet the condition into arr\r\n for (var i = 0; i < sessionStorage.length; i++) {\r\n if (keyToPreserve) {\r\n if (sessionStorage.key(i).substring(0, 4) === prefix && !sessionStorage.key(i).startsWith(keyToPreserve)) {\r\n arr.push(sessionStorage.key(i));\r\n }\r\n } else {\r\n if (sessionStorage.key(i).substring(0, 4) === prefix) {\r\n arr.push(sessionStorage.key(i));\r\n }\r\n }\r\n\r\n }\r\n\r\n // Iterate over arr and remove the items by key\r\n for (var l = 0; l < arr.length; l++) {\r\n sessionStorage.removeItem(arr[l]);\r\n }\r\n}\r\n\r\nfunction applyExcelExportEventAnimation() {\r\n $(\".k-grid-excel\").off(\"click\");\r\n $(\".k-grid-excel\")\r\n .click(function() {\r\n $(this).attr(\"data-loading-text\", \" Exporting...\");\r\n $(this).button(\"loading\");\r\n });\r\n}\r\n\r\nfunction excelExport(e) {\r\n var gridName = e.sender.element[0].id;\r\n if (!window[\"exportFlag\" + gridName]) {\r\n e.preventDefault();\r\n window[\"exportFlag\" + gridName] = true;\r\n var newGrid = $(\"#placeholderGrid\").kendoGrid(e.sender.getOptions()).data(\"kendoGrid\");\r\n setTimeout(\r\n function() {\r\n newGrid.columns.forEach(function(column) {\r\n column.hidden = false;\r\n });\r\n newGrid.saveAsExcel();\r\n\r\n },\r\n 800);\r\n } else {\r\n window[\"exportFlag\" + gridName] = false;\r\n var $exportBtns = $(\".k-grid-excel\");\r\n $exportBtns.button(\"reset\");\r\n }\r\n}\r\n\r\nfunction splitStringArrayIntoCommaSeparatedWithAnd(array) {\r\n return [array.slice(0, -1).join(\", \"), array.slice(-1)[0]].join(array.length < 2 ? \"\" : \", and \");\r\n}\r\n\r\nfunction setFilterText(grid) {\r\n var filterTexts = [];\r\n var gridFilter = grid.dataSource.filter();\r\n if (gridFilter !== null && gridFilter !== undefined) {\r\n var currentFilters = gridFilter.filters;\r\n if (currentFilters.length > 0) {\r\n for (var filterIndex in currentFilters) {\r\n var filterText = \"\";\r\n var propertyText = \"\";\r\n var filter = currentFilters[filterIndex];\r\n if (filter.field) {\r\n\r\n filterText += filter.field +\r\n \" \" +\r\n filterOperatorReadableReplacements[filter.operator] +\r\n (filter.value !== null && filter.value !== undefined && filter.value !== \"\"\r\n ? ' \"' + filter.value + '\"'\r\n : \"\");\r\n propertyText = filter.field;\r\n } else {\r\n var compositeOperator = filter.logic;\r\n var compositeFilters = filter.filters;\r\n var compositeFilterText = \"\";\r\n if (compositeFilters.length > 0) {\r\n for (var compositeFilterIndex in compositeFilters) {\r\n var compositeFilter = compositeFilters[compositeFilterIndex];\r\n\r\n\r\n if (compositeFilter.field && compositeFilter.field !== \"Active\") {\r\n if (compositeFilterIndex === \"0\") {\r\n compositeFilterText += compositeFilter.field + \" \";\r\n }\r\n compositeFilterText += filterOperatorReadableReplacements[compositeFilter.operator] +\r\n (compositeFilter.value !== null &&\r\n compositeFilter.value !== undefined &&\r\n compositeFilter.value !== \"\"\r\n ? ' \"' + compositeFilter.value + '\"'\r\n : \"\");\r\n\r\n propertyText = compositeFilter.field;\r\n }\r\n\r\n if (compositeFilterIndex !== (compositeFilters.length - 1).toString()) {\r\n compositeFilterText += \" \" + compositeOperator + \" \";\r\n }\r\n }\r\n\r\n filterText += compositeFilterText;\r\n }\r\n\r\n }\r\n\r\n if (propertyText !== \"Active\")\r\n filterTexts.push({ Property: propertyText, FilterText: filterText });\r\n\r\n }\r\n\r\n var sortedFilters = filterTexts.sort(function(a, b) {\r\n var textA = a.Property.toUpperCase();\r\n var textB = b.Property.toUpperCase();\r\n return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;\r\n });\r\n\r\n var sortedFilterTexts = [];\r\n $.each(sortedFilters,\r\n function(i, o) {\r\n sortedFilterTexts[i] = o.FilterText;\r\n });\r\n\r\n var $toolbar = $(grid.element[0]).find(\".k-header.k-grid-toolbar\");\r\n var $clearFilterButton = $toolbar.children(\".gridAllFilterReset\");\r\n var $filterText = $toolbar.children(\".k-text\");\r\n var $activeToggleButton = $(\".k-button-toggleActive\");\r\n\r\n if ($clearFilterButton.length === 0) {\r\n if (sortedFilterTexts.length > 0) {\r\n $toolbar\r\n .prepend(\r\n 'Clear Filters');\r\n }\r\n\r\n } else {\r\n if (sortedFilterTexts.length === 0) {\r\n $clearFilterButton.remove();\r\n }\r\n }\r\n\r\n if ($filterText.length > 0) {\r\n if (sortedFilterTexts.length > 0) {\r\n $filterText.html(\"Where \" + splitStringArrayIntoCommaSeparatedWithAnd(sortedFilterTexts));\r\n } else {\r\n $filterText.remove();\r\n }\r\n } else {\r\n if (sortedFilterTexts.length > 0) {\r\n if ($activeToggleButton.length === 0) {\r\n $toolbar.prepend(' Where ' +\r\n splitStringArrayIntoCommaSeparatedWithAnd(sortedFilterTexts) +\r\n \"\");\r\n } else {\r\n $toolbar.prepend(' Where ' +\r\n splitStringArrayIntoCommaSeparatedWithAnd(sortedFilterTexts) +\r\n \"\");\r\n }\r\n\r\n applyClearFilterClickEvent(grid);\r\n }\r\n }\r\n\r\n }\r\n }\r\n}\r\n\r\nfunction applyClearFilterClickEvent(grid) {\r\n $(\".gridAllFilterReset\").off(\"click\");\r\n\r\n var $gridButton = $(grid.element[0]).find(\".gridAllFilterReset\");\r\n if ($gridButton.length > 0) {\r\n $gridButton.click(function(e) {\r\n e.preventDefault();\r\n var activeFilter = grid.dataSource.filter().filters.find(getActiveFilter);\r\n if (activeFilter) {\r\n grid.dataSource.filter(activeFilter);\r\n } else {\r\n grid.dataSource.filter(null);\r\n }\r\n\r\n clearAllGridOptions();\r\n });\r\n }\r\n}\r\n\r\nfunction getActiveFilter(element) {\r\n return element.field === \"Active\";\r\n}\r\n\r\nfunction applyGridDataBound(controllerName, e) {\r\n\r\n var grid = e.sender;\r\n var gridName = grid.element[0].id;\r\n console.log(\"Grid name for data bound: \" + gridName);\r\n var $toolbar = $(grid.element[0]).find(\".k-header.k-grid-toolbar\");\r\n setFilterText(grid);\r\n console.log(\"toggle bar:\");\r\n console.log($toolbar);\r\n\r\n e.sender.thead\r\n .find(\"th.k-header\")\r\n .each(function () {\r\n $(this).attr(\"title\", $(this).text());\r\n });\r\n\r\n //remove filters text and clear filters button if there are none\r\n if (grid.dataSource.filter() === null || grid.dataSource.filter() === undefined) {\r\n $toolbar.children(\".gridAllFilterReset\").remove();\r\n $toolbar.children(\".k-text\").remove();\r\n }\r\n\r\n //add the inactive/active button\r\n var $activeToggleButton = $(grid.element[0]).find(\".k-button-toggleActive\");\r\n if ($activeToggleButton.length === 0) {\r\n console.log(\"appending show button for grid \" + gridName);\r\n $toolbar\r\n .append(\r\n 'Show ' +\r\n (showInactive === true ? \"Active\" : \"Deleted\") +\r\n \"\");\r\n $(\".k-button-toggleActive\")\r\n .click(function(event) {\r\n event.preventDefault();\r\n toggleGridActiveState(grid, $toolbar);\r\n });\r\n }\r\n\r\n setGridToInactiveDisplay(grid, $toolbar, showInactive);\r\n console.log(\"grid bound!\");\r\n}\r\n\r\nfunction applyGridDataBindings(controllerName, e) {\r\n var grid = e.sender;\r\n var gridName = grid.element[0].id;\r\n var stringifiedOptions = loadGridOptionsFromSessionStorage(controllerName + gridName);\r\n var applyingFilters = window[\"applyingFilters\" + controllerName + gridName];\r\n kendo.ui.progress(grid.element, true);\r\n\r\n if (stringifiedOptions && applyingFilters === false) {\r\n e.preventDefault();\r\n clearAllOtherGridOptions(controllerName);\r\n setFilterText(grid);\r\n\r\n window.setTimeout(\r\n function() {\r\n var loadedOptions = JSON.parse(stringifiedOptions);\r\n var originalOptions = grid.getOptions();\r\n\r\n loadedOptions.columns = originalOptions.columns;\r\n grid.setOptions(loadedOptions);\r\n\r\n },\r\n 750);\r\n\r\n window[\"applyingFilters\" + controllerName + gridName] = true;\r\n } else {\r\n applyExcelExportEventAnimation(grid);\r\n window[\"applyingFilters\" + controllerName + gridName] = true;\r\n }\r\n kendo.ui.progress(grid.element, false);\r\n}\r\n\r\nfunction toggleGridActiveState(grid, $toolbar) {\r\n\r\n var filters;\r\n\r\n if (showInactive === true) {\r\n showInactive = false;\r\n var activeFilter = grid.dataSource.filter().filters.find(getActiveFilter);\r\n filters = jQuery.grep(grid.dataSource.filter().filters,\r\n function(value) {\r\n return value !== activeFilter;\r\n });\r\n if (filters.length === 0) {\r\n grid.dataSource.filter(null);\r\n }\r\n\r\n if (filters.length > 0) {\r\n grid.dataSource.filter(filters);\r\n }\r\n } else {\r\n showInactive = true;\r\n var filterToAdd = { field: \"Active\", operator: \"eq\", value: false };\r\n\r\n if (grid.dataSource.filter() === undefined || grid.dataSource.filter() === null) {\r\n grid.dataSource.filter(filterToAdd);\r\n } else {\r\n filters = grid.dataSource.filter().filters;\r\n filters.push(filterToAdd);\r\n grid.dataSource.filter(filters);\r\n }\r\n }\r\n\r\n grid.dataSource.sync();\r\n}\r\n\r\nfunction setGridToInactiveDisplay(grid, $toolbar, showingInactive) {\r\n if (showingInactive) {\r\n $toolbar.addClass(\"red\");\r\n $(\".k-button-toggleActive\").html('Show Active');\r\n $(\".k-button.k-button-icontext.k-grid-Restore\").toggle(true);\r\n $(\".k-button.k-button-icontext.k-grid-Delete\").toggle(false);\r\n $(\".k-button.k-button-icontext.k-grid-Leave\").toggle(false)\r\n\r\n } else {\r\n $toolbar.removeClass(\"red\");\r\n $(\".k-button-toggleActive\").html('Show Inactive');\r\n $(\".k-button.k-button-icontext.k-grid-Restore\").toggle(false);\r\n $(\".k-button.k-button-icontext.k-grid-Delete\").toggle(true);\r\n $(\".k-button.k-button-icontext.k-grid-Leave\").toggle(true)\r\n }\r\n}\r\n\r\nfunction deleteGridItem(e, controller) {\r\n e.preventDefault(); //prevent page scroll reset\r\n var controllerName = controller;\r\n var gridName = $(e.delegateTarget).data(\"kendoGrid\").element[0].id;\r\n var tr = $(e.target).closest(\"tr\"); //get the row for deletion\r\n tr.addClass(\"deletingGridItem\");\r\n var data = $(e.delegateTarget).data(\"kendoGrid\").dataItem(tr); //get the row data so it can be referred later\r\n window[\"$\" + controllerName + gridName + \"DeleteWindow\"]\r\n .content(window[controllerName + gridName + \"DeleteTemplate\"](data));\r\n//send the row data object to the template and render it\r\n window[\"$\" + controllerName + gridName + \"DeleteWindow\"].center().open();\r\n console.log(\"deleting grid item\");\r\n $(\"#yesDeleteButton\")\r\n .click(function() {\r\n var datasource = $(e.delegateTarget).data(\"kendoGrid\").dataSource;\r\n datasource.remove(data); //prepare a \"destroy\" request\r\n datasource.sync(); //actually send the request (might be ommited if the autoSync option is enabled in the dataSource)\r\n $(\".k-loading-mask\").hide();\r\n window[\"$\" + controllerName + gridName + \"DeleteWindow\"].close();\r\n window[\"$\" + controllerName + gridName + \"DeleteConfirmedWindow\"].content(window[controllerName + gridName + \"DeleteConfirmedTemplate\"](data));\r\n window[\"$\" + controllerName + gridName + \"DeleteConfirmedWindow\"].center().open();\r\n\r\n $(\"#actionConfirmedWindow\")\r\n .click(function() {\r\n window[\"$\" + controllerName + gridName + \"DeleteConfirmedWindow\"].close();\r\n });\r\n\r\n window.setTimeout(function() {\r\n window[\"$\" + controllerName + gridName + \"DeleteConfirmedWindow\"].close();\r\n },\r\n 1000);\r\n });\r\n $(\"#noDeleteButton\")\r\n .click(function() {\r\n tr.removeClass(\"deletingGridItem\");\r\n window[\"$\" + controllerName + gridName + \"DeleteWindow\"].close();\r\n });\r\n}\r\n\r\nfunction restoreGridItem(e, controller) {\r\n console.log(\"restoring item\");\r\n e.preventDefault(); //prevent page scroll reset\r\n var controllerName = controller;\r\n var gridName = $(e.delegateTarget).data(\"kendoGrid\").element[0].id;\r\n var tr = $(e.target).closest(\"tr\"); //get the row for deletion\r\n tr.addClass(\"restoringGridItem\");\r\n var data = $(e.delegateTarget).data(\"kendoGrid\").dataItem(tr); //get the row data so it can be referred later\r\n window[\"$\" + controllerName + gridName + \"RestoreWindow\"]\r\n .content(window[controllerName + gridName + \"RestoreTemplate\"](data));\r\n //send the row data object to the template and render it\r\n window[\"$\" + controllerName + gridName + \"RestoreWindow\"].center().open();\r\n\r\n $(\"#yesRestoreButton\").click(function() {\r\n console.log(\"yes clicked\");\r\n $(window[\"$\" + controllerName + gridName + \"RestoreWindow\"].element).find(\"#yesButton\");\r\n window[\"restore\" + controllerName + gridName] = true;\r\n var datasource = $(e.delegateTarget).data(\"kendoGrid\").dataSource;\r\n datasource.remove(data); //prepare a \"destroy\" request\r\n datasource.sync();\r\n //actually send the request (might be ommited if the autoSync option is enabled in the dataSource)\r\n window[\"$\" + controllerName + gridName + \"RestoreWindow\"].close();\r\n window[\"$\" + controllerName + gridName + \"RestoreConfirmedWindow\"]\r\n .content(window[controllerName + gridName + \"RestoreConfirmedTemplate\"](data));\r\n window[\"$\" + controllerName + gridName + \"RestoreConfirmedWindow\"].center().open();\r\n\r\n $(\"#actionConfirmedWindow\")\r\n .click(function() {\r\n window[\"$\" + controllerName + gridName + \"RestoreConfirmedWindow\"].close();\r\n });\r\n\r\n window.setTimeout(function() {\r\n window[\"$\" + controllerName + gridName + \"RestoreConfirmedWindow\"].close();\r\n },\r\n 1500);\r\n });\r\n $(\"#noRestoreButton\")\r\n .click(function() {\r\n tr.removeClass(\"restoringGridItem\");\r\n window[\"$\" + controllerName + gridName + \"RestoreWindow\"].close();\r\n });\r\n}\r\n\r\nfunction stopScroll(element) {\r\n var activeElement;\r\n\r\n $(document)\r\n .bind(\"mousewheel DOMMouseScroll\",\r\n function(e) {\r\n var scrollTo = null;\r\n\r\n if (!$(activeElement).closest(\".k-popup\").length) {\r\n return;\r\n }\r\n\r\n if (e.type == \"mousewheel\") {\r\n scrollTo = (e.originalEvent.wheelDelta * -1);\r\n } else if (e.type == \"DOMMouseScroll\") {\r\n scrollTo = 40 * e.originalEvent.detail;\r\n }\r\n\r\n if (scrollTo) {\r\n e.preventDefault();\r\n element.scrollTop(scrollTo + element.scrollTop());\r\n }\r\n });\r\n\r\n $(document)\r\n .on(\"mouseover\",\r\n function(e) {\r\n activeElement = e.target;\r\n });\r\n}\r\n\r\nfunction confirmationWindow(text, successText, yesButtonText, noButtonText, windowTitle, callback) {\r\n var windowData = {\r\n text: \"Are you sure you want to delete this item?\",\r\n successText: \"Item successfully deleted.\",\r\n yesButtonText: \"Yes\",\r\n noButtonText: \"No\",\r\n }\r\n if (text) { windowData.text = text; }\r\n if (successText) { windowData.successText = successText; }\r\n if (yesButtonText) { windowData.yesButtonText = yesButtonText; }\r\n if (noButtonText) { windowData.noButtonText = noButtonText; }\r\n\r\n\r\n var genericConfirmTemplate = kendo.template($('#generic-confirm-template').html());\r\n var genericConfirmConfirmedTemplate = kendo.template($('#generic-confirm-confirmed-template').html());\r\n\r\n $('body').append('
      ');\r\n $('body').append('
      ');\r\n\r\n if (windowTitle) {\r\n deleteKendoUiWindowOptions.title = windowTitle;\r\n } else {\r\n deleteKendoUiWindowOptions.title = \"Confirm Action\";\r\n }\r\n\r\n var $genericConfirmWindow = $('#genericConfirmWindow').kendoWindow(deleteKendoUiWindowOptions).data('kendoWindow');\r\n var $genericConfirmConfirmedWindow = $('#genericConfirmConfirmedWindow').kendoWindow(deleteConfirmedKendoUiWindowOptions).data('kendoWindow');\r\n\r\n $genericConfirmWindow.content(genericConfirmTemplate(windowData));\r\n $genericConfirmWindow.center().open(); genericConfirmConfirmedTemplate\r\n\r\n $(\"#genericConfirmWindow #confirmYesButton\")\r\n .click(function () {\r\n callback();\r\n $genericConfirmWindow.close();\r\n $genericConfirmConfirmedWindow.content(genericConfirmConfirmedTemplate(windowData));\r\n $genericConfirmConfirmedWindow.center().open();\r\n\r\n $(\"#actionConfirmedWindow\")\r\n .click(function () {\r\n $genericConfirmConfirmedWindow.close();\r\n });\r\n\r\n window.setTimeout(function () {\r\n $genericConfirmConfirmedWindow.close();\r\n },\r\n 1200);\r\n });\r\n $(\"#genericConfirmWindow #confirmNoButton\")\r\n .click(function () {\r\n $genericConfirmWindow.close();\r\n });\r\n\r\n $('body').remove('#genericConfirmWindow');\r\n $('body').remove('#genericConfirmConfirmedWindow.actionConfirmedWindow');\r\n}\r\n\r\nfunction removeItemFromTreeViewDataSource(pageModelPropertyWithItems, textOfItemToRemove) {\r\n var array = pageModelPropertyWithItems();\r\n removeItemFromTreeViewRecursively(array, textOfItemToRemove);\r\n pageModelPropertyWithItems(array);\r\n}\r\n\r\nfunction removeItemFromTreeViewRecursively(array, textOfItemToRemove) {\r\n var index = 0;\r\n if (array && array.length > 0) {\r\n var matchedItem = $.grep(array, function (item) {\r\n return item.text === textOfItemToRemove;\r\n });\r\n\r\n if (matchedItem && matchedItem.length > 0) {\r\n index = array.indexOf(matchedItem[0]);\r\n if (index > -1) {\r\n array.splice(index, 1);\r\n }\r\n } else {\r\n for (var i = 0; i < array.length; i++) {\r\n var item = array[i];\r\n removeItemFromTreeViewRecursively(item.items, textOfItemToRemove);\r\n }\r\n }\r\n }\r\n}\r\n\r\n//this method should be called inside the logic where a new item gets added to a grid\r\n//the id should be the value of the unique identifer stored in the hidden column in the grid that was just added to the grid\r\n//can be empty to just refresh the yellow highlights, like when removing an item\r\n//grid is the selector of a kendo grid, must have a valid kendo grid associated with it\r\n//the cssClassSuffixForIdColumn is the suffix of the class name, the id column on the grid should have\r\n//its class set to that same suffix plus the id properity\r\n//ex: { field: \"[IdName]\", hidden: true, attributes: { \"class\": \"#= data.[IdName] #-id-column\" } }\r\nfunction setNewlyAddedOnGrid(id, gridSelector, cssClassSuffixForIdColumn) {\r\n var grid = $(gridSelector).data(\"kendoGrid\");\r\n var keyName = gridSelector.replace(\".\", \"\").replace(\"#\", \"\").replace(\"Grid\", \"\")\r\n\r\n if (grid != null) {\r\n if (window[keyName + \"NewlyAdded\"] == undefined) {\r\n window[keyName + \"NewlyAdded\"] = [];\r\n }\r\n\r\n if (window[keyName + \"NewlyAdded\"].indexOf(id) == -1 && id != undefined && id != null && id != \"\") {\r\n window[keyName + \"NewlyAdded\"].push(id);\r\n }\r\n\r\n for (var i = 0; i < window[keyName + \"NewlyAdded\"].length; i++) {\r\n var id = window[keyName + \"NewlyAdded\"][i]\r\n grid.element.find(\"td.\" + id + cssClassSuffixForIdColumn).parent(\"tr\").addClass(\"just-added\");\r\n }\r\n } else {\r\n console.log(\"Error: No kendo grid attached to selector '\" + gridSelector + \"'\");\r\n }\r\n\r\n \r\n}\r\n","(function (a) { if (typeof require === \"function\" && typeof exports === \"object\" && typeof module === \"object\") { a(require(\"knockout\"), exports) } else { if (typeof define === \"function\" && define.amd) { define([\"knockout\", \"exports\"], a) } else { a(ko, ko.mapping = {}) } } }(function (b, B) { var d = true; var n = \"__ko_mapping__\"; var i = b.dependentObservable; var q = 0; var m; var v; var a = [\"create\", \"update\", \"key\", \"arrayChanged\"]; var r = {}; var h = { include: [\"_destroy\"], ignore: [], copy: [], observe: [] }; var w = h; function o(C, H) { var G = {}; for (var F = C.length - 1; F >= 0; --F) { G[C[F]] = C[F] } for (var F = H.length - 1; F >= 0; --F) { G[H[F]] = H[F] } var E = []; for (var D in G) { E.push(G[D]) } return E } function p(C, F) { var G; for (var D in F) { if (F.hasOwnProperty(D) && F[D]) { G = B.getType(C[D]); if (D && C[D] && G !== \"array\" && G !== \"string\") { p(C[D], F[D]) } else { var E = B.getType(C[D]) === \"array\" && B.getType(F[D]) === \"array\"; if (E) { C[D] = o(C[D], F[D]) } else { C[D] = F[D] } } } } } function g(E, D) { var C = {}; p(C, E); p(C, D); return C } B.isMapped = function (D) { var C = b.utils.unwrapObservable(D); return C && C[n] }; B.fromJS = function (D) { if (arguments.length == 0) { throw new Error(\"When calling ko.fromJS, pass the object you want to convert.\") } try { if (!q++) { m = []; v = new c() } var F; var H; if (arguments.length == 2) { if (arguments[1][n]) { H = arguments[1] } else { F = arguments[1] } } if (arguments.length == 3) { F = arguments[1]; H = arguments[2] } if (H) { F = g(F, H[n]) } F = s(F); var C = x(H, D, F); if (H) { C = H } if (!--q) { while (m.length) { var E = m.pop(); if (E) { E(); E.__DO.throttleEvaluation = E.throttleEvaluation } } } C[n] = g(C[n], F); return C } catch (G) { q = 0; throw G } }; B.fromJSON = function (D) { var C = b.utils.parseJson(D); arguments[0] = C; return B.fromJS.apply(this, arguments) }; B.updateFromJS = function (C) { throw new Error(\"ko.mapping.updateFromJS, use ko.mapping.fromJS instead. Please note that the order of parameters is different!\") }; B.updateFromJSON = function (C) { throw new Error(\"ko.mapping.updateFromJSON, use ko.mapping.fromJSON instead. Please note that the order of parameters is different!\") }; B.toJS = function (D, C) { if (!w) { B.resetDefaultOptions() } if (arguments.length == 0) { throw new Error(\"When calling ko.mapping.toJS, pass the object you want to convert.\") } if (B.getType(w.ignore) !== \"array\") { throw new Error(\"ko.mapping.defaultOptions().ignore should be an array.\") } if (B.getType(w.include) !== \"array\") { throw new Error(\"ko.mapping.defaultOptions().include should be an array.\") } if (B.getType(w.copy) !== \"array\") { throw new Error(\"ko.mapping.defaultOptions().copy should be an array.\") } C = s(C, D[n]); return B.visitModel(D, function (E) { return b.utils.unwrapObservable(E) }, C) }; B.toJSON = function (E, C) { var D = B.toJS(E, C); return b.utils.stringifyJson(D) }; B.defaultOptions = function () { if (arguments.length > 0) { w = arguments[0] } else { return w } }; B.resetDefaultOptions = function () { w = { include: h.include.slice(0), ignore: h.ignore.slice(0), copy: h.copy.slice(0) } }; B.getType = function (C) { if ((C) && (typeof (C) === \"object\")) { if (C.constructor === Date) { return \"date\" } if (C.constructor === Array) { return \"array\" } } return typeof C }; function s(F, C) { var D = g({}, F); for (var E = a.length - 1; E >= 0; E--) { var G = a[E]; if (!D[G]) { continue } if (!(D[\"\"] instanceof Object)) { D[\"\"] = {} } D[\"\"][G] = D[G]; delete D[G] } if (C) { D.ignore = k(C.ignore, D.ignore); D.include = k(C.include, D.include); D.copy = k(C.copy, D.copy); D.observe = k(C.observe, D.observe) } D.ignore = k(D.ignore, w.ignore); D.include = k(D.include, w.include); D.copy = k(D.copy, w.copy); D.observe = k(D.observe, w.observe); D.mappedProperties = D.mappedProperties || {}; D.copiedProperties = D.copiedProperties || {}; return D } function k(D, C) { if (B.getType(D) !== \"array\") { if (B.getType(D) === \"undefined\") { D = [] } else { D = [D] } } if (B.getType(C) !== \"array\") { if (B.getType(C) === \"undefined\") { C = [] } else { C = [C] } } return b.utils.arrayGetDistinctValues(D.concat(C)) } function f(D, F) { var E = b.dependentObservable; b.dependentObservable = function (M, G, J) { J = J || {}; if (M && typeof M == \"object\") { J = M } var I = J.deferEvaluation; var H = false; var L = function (N) { var P = b.dependentObservable; b.dependentObservable = i; var Q = b.isWriteableObservable(N); b.dependentObservable = P; var O = i({ read: function () { if (!H) { b.utils.arrayRemoveItem(D, N); H = true } return N.apply(N, arguments) }, write: Q && function (R) { return N(R) }, deferEvaluation: true }); if (d) { O._wrapper = true } O.__DO = N; return O }; J.deferEvaluation = true; var K = new i(M, G, J); if (!I) { K = L(K); D.push(K) } return K }; b.dependentObservable.fn = i.fn; b.computed = b.dependentObservable; var C = F(); b.dependentObservable = E; b.computed = b.dependentObservable; return C } function x(ai, E, T, aj, H, C, al) { var S = B.getType(b.utils.unwrapObservable(E)) === \"array\"; C = C || \"\"; if (B.isMapped(ai)) { var G = b.utils.unwrapObservable(ai)[n]; T = g(G, T) } var ae = { data: E, parent: al || H }; var R = function () { return T[aj] && T[aj].create instanceof Function }; var J = function (an) { return f(m, function () { if (b.utils.unwrapObservable(H) instanceof Array) { return T[aj].create({ data: an || ae.data, parent: ae.parent, skip: r }) } else { return T[aj].create({ data: an || ae.data, parent: ae.parent }) } }) }; var aa = function () { return T[aj] && T[aj].update instanceof Function }; var P = function (ao, an) { var ap = { data: an || ae.data, parent: ae.parent, target: b.utils.unwrapObservable(ao) }; if (b.isWriteableObservable(ao)) { ap.observable = ao } return T[aj].update(ap) }; var Y = v.get(E); if (Y) { return Y } aj = aj || \"\"; if (!S) { if (!t(E)) { switch (B.getType(E)) { case \"function\": if (aa()) { if (b.isWriteableObservable(E)) { E(P(E)); ai = E } else { ai = P(E) } } else { ai = E } break; default: if (b.isWriteableObservable(ai)) { if (aa()) { var V = P(ai); ai(V); return V } else { var V = b.utils.unwrapObservable(E); ai(V); return V } } else { var ab = R() || aa(); if (R()) { ai = J() } else { ai = b.observable(b.utils.unwrapObservable(E)) } if (aa()) { ai(P(ai)) } if (ab) { return ai } } } } else { ai = b.utils.unwrapObservable(ai); if (!ai) { if (R()) { var N = J(); if (aa()) { N = P(N) } return N } else { if (aa()) { return P(N) } ai = {} } } if (aa()) { ai = P(ai) } v.save(E, ai); if (aa()) { return ai } z(E, function (ao) { var ar = C.length ? C + \".\" + ao : ao; if (b.utils.arrayIndexOf(T.ignore, ar) != -1) { return } if (b.utils.arrayIndexOf(T.copy, ar) != -1) { ai[ao] = E[ao]; return } if (typeof E[ao] != \"object\" && typeof E[ao] != \"array\" && T.observe.length > 0 && b.utils.arrayIndexOf(T.observe, ar) == -1) { ai[ao] = E[ao]; T.copiedProperties[ar] = true; return } var aq = v.get(E[ao]); var an = x(ai[ao], E[ao], T, ao, ai, ar, ai); var ap = aq || an; if (T.observe.length > 0 && b.utils.arrayIndexOf(T.observe, ar) == -1) { ai[ao] = ap(); T.copiedProperties[ar] = true; return } if (b.isWriteableObservable(ai[ao])) { ap = b.utils.unwrapObservable(ap); if (ai[ao]() !== ap) { ai[ao](ap) } } else { ap = ai[ao] === undefined ? ap : b.utils.unwrapObservable(ap); ai[ao] = ap } T.mappedProperties[ar] = true }) } } else { var O = []; var L = false; var U = function (an) { return an }; if (T[aj] && T[aj].key) { U = T[aj].key; L = true } if (!b.isObservable(ai)) { ai = b.observableArray([]); ai.mappedRemove = function (ao) { var an = typeof ao == \"function\" ? ao : function (ap) { return ap === U(ao) }; return ai.remove(function (ap) { return an(U(ap)) }) }; ai.mappedRemoveAll = function (ao) { var an = u(ao, U); return ai.remove(function (ap) { return b.utils.arrayIndexOf(an, U(ap)) != -1 }) }; ai.mappedDestroy = function (ao) { var an = typeof ao == \"function\" ? ao : function (ap) { return ap === U(ao) }; return ai.destroy(function (ap) { return an(U(ap)) }) }; ai.mappedDestroyAll = function (ao) { var an = u(ao, U); return ai.destroy(function (ap) { return b.utils.arrayIndexOf(an, U(ap)) != -1 }) }; ai.mappedIndexOf = function (ap) { var ao = u(ai(), U); var an = U(ap); return b.utils.arrayIndexOf(ao, an) }; ai.mappedGet = function (an) { return ai()[ai.mappedIndexOf(an)] }; ai.mappedCreate = function (ao) { if (ai.mappedIndexOf(ao) !== -1) { throw new Error(\"There already is an object with the key that you specified.\") } var an = R() ? J(ao) : ao; if (aa()) { var ap = P(an, ao); if (b.isWriteableObservable(an)) { an(ap) } else { an = ap } } ai.push(an); return an } } var W = u(b.utils.unwrapObservable(ai), U).sort(); var K = u(E, U); if (L) { K.sort() } var ac = b.utils.compareArrays(W, K); var am = {}; var ah, ag; var F = b.utils.unwrapObservable(E); var Q = {}; var ad = true; for (ah = 0, ag = F.length; ah < ag; ah++) { var M = U(F[ah]); if (M === undefined || M instanceof Object) { ad = false; break } Q[M] = F[ah] } var ak = []; var I = 0; for (ah = 0, ag = ac.length; ah < ag; ah++) { var M = ac[ah]; var D; var af = C + \"[\" + ah + \"]\"; switch (M.status) { case \"added\": var X = ad ? Q[M.value] : l(b.utils.unwrapObservable(E), M.value, U); D = x(undefined, X, T, aj, ai, af, H); if (!R()) { D = b.utils.unwrapObservable(D) } var Z = y(b.utils.unwrapObservable(E), X, am); if (D === r) { I++ } else { ak[Z - I] = D } am[Z] = true; break; case \"retained\": var X = ad ? Q[M.value] : l(b.utils.unwrapObservable(E), M.value, U); D = l(ai, M.value, U); x(D, X, T, aj, ai, af, H); var Z = y(b.utils.unwrapObservable(E), X, am); ak[Z] = D; am[Z] = true; break; case \"deleted\": D = l(ai, M.value, U); break }O.push({ event: M.status, item: D }) } ai(ak); if (T[aj] && T[aj].arrayChanged) { b.utils.arrayForEach(O, function (an) { T[aj].arrayChanged(an.event, an.item) }) } } return ai } function y(G, F, E) { for (var D = 0, C = G.length; D < C; D++) { if (E[D] === true) { continue } if (G[D] === F) { return D } } return null } function e(C, E) { var D; if (E) { D = E(C) } if (B.getType(D) === \"undefined\") { D = C } return b.utils.unwrapObservable(D) } function l(H, E, G) { H = b.utils.unwrapObservable(H); for (var D = 0, C = H.length; D < C; D++) { var F = H[D]; if (e(F, G) === E) { return F } } throw new Error(\"When calling ko.update*, the key '\" + E + \"' was not found!\") } function u(D, C) { return b.utils.arrayMap(b.utils.unwrapObservable(D), function (E) { if (C) { return e(E, C) } else { return E } }) } function z(E, F) { if (B.getType(E) === \"array\") { for (var D = 0; D < E.length; D++) { F(D) } } else { for (var C in E) { F(C) } } } function t(C) { var D = B.getType(C); return ((D === \"object\") || (D === \"array\")) && (C !== null) } function j(F, E, D) { var C = F || \"\"; if (B.getType(E) === \"array\") { if (F) { C += \"[\" + D + \"]\" } } else { if (F) { C += \".\" } C += D } return C } B.visitModel = function (F, H, D) { D = D || {}; D.visitedObjects = D.visitedObjects || new c(); var G; var C = b.utils.unwrapObservable(F); if (!t(C)) { return H(F, D.parentName) } else { D = s(D, C[n]); H(F, D.parentName); G = B.getType(C) === \"array\" ? [] : {} } D.visitedObjects.save(F, G); var E = D.parentName; z(C, function (K) { if (D.ignore && b.utils.arrayIndexOf(D.ignore, K) != -1) { return } var I = C[K]; D.parentName = j(E, C, K); if (b.utils.arrayIndexOf(D.copy, K) === -1) { if (b.utils.arrayIndexOf(D.include, K) === -1) { if (C[n] && C[n].mappedProperties && !C[n].mappedProperties[K] && C[n].copiedProperties && !C[n].copiedProperties[K] && !(B.getType(C) === \"array\")) { return } } } var J; switch (B.getType(b.utils.unwrapObservable(I))) { case \"object\": case \"array\": case \"undefined\": var L = D.visitedObjects.get(I); G[K] = (B.getType(L) !== \"undefined\") ? L : B.visitModel(I, H, D); break; default: G[K] = H(I, D.parentName) } }); return G }; function A() { var D = []; var C = []; this.save = function (F, G) { var E = b.utils.arrayIndexOf(D, F); if (E >= 0) { C[E] = G } else { D.push(F); C.push(G) } }; this.get = function (F) { var E = b.utils.arrayIndexOf(D, F); var G = (E >= 0) ? C[E] : undefined; return G } } function c() { var C = {}; var D = function (F) { var E; try { E = F } catch (G) { E = \"$$$\" } var H = C[E]; if (H === undefined) { H = new A(); C[E] = H } return H }; this.save = function (E, F) { D(E).save(E, F) }; this.get = function (E) { return D(E).get(E) } } }));","var globalModel;\r\nvar first=false;\r\nvar callingPopup = false;\r\nvar markedClean = false;\r\n\r\nvar flip = true;\r\nko.extenders.dirty = function (target, startDirty) {\r\n if (first == false) {\r\n first = true;\r\n globalModel = target;\r\n globalCleanValueJson = ko.observable(ko.toJSON(globalModel));\r\n }\r\n var cleanValue = ko.observable(ko.toJSON(target));\r\n var dirtyOverride = ko.observable(ko.utils.unwrapObservable(startDirty));\r\n target.isDirty = ko.computed(function () {\r\n /*\r\n globalCleanValue = cleanValue();\r\n globalTargetValue = ko.toJSON(target);\r\n console.log(dirtyOverride() || ko.toJSON(target) !== cleanValue())\r\n return dirtyOverride() || ko.toJSON(target) !== cleanValue();\r\n */\r\n \r\n globalCleanValue = globalCleanValueJson();\r\n globalTargetValue = ko.observable(ko.toJSON(globalModel))();\r\n //console.log(globalTargetValue)\r\n //console.log(\"Clean Value\");\r\n //console.log(globalCleanValue)\r\n //console.log(globalTargetValue !== globalCleanValue)\r\n //console.log(dirtyOverride() || globalCleanValue !== globalTargetValue)\r\n return dirtyOverride() || globalCleanValue !== globalTargetValue;\r\n \r\n \r\n });\r\n\r\n target.isDirty.subscribe(function () {\r\n if (callingPopup == false) {\r\n callingPopup = true;\r\n var popup = $(\".unsavedChanges\");\r\n if (target.isDirty() && !popup.is(\":visible\")) {\r\n console.log(\"showing isdirty popup\");\r\n //console.log(target());\r\n popup.removeClass(\"fadeOut\");\r\n popup.animateCss('bounceIn');\r\n popup.toggleClass(\"inlineBlock\", true);\r\n callingPopup = false;\r\n $(window).off('beforeunload');\r\n } else {\r\n if (popup.is(\":visible\")) {\r\n console.log(\"hiding isdirty popup\");\r\n popup.removeClass(\"bounceIn\");\r\n popup.animateCss('fadeOut', function () {\r\n popup.toggleClass(\"inlineBlock\", false);\r\n });\r\n callingPopup = false;\r\n }\r\n\r\n }\r\n }\r\n \r\n });\r\n\r\n window.onbeforeunload = function () {\r\n var popup = $(\".unsavedChanges\");\r\n\r\n console.log(popup.is(\":visible\"))\r\n if (popup.is(\":visible\") && markedClean == false)\r\n return \"popup\";\r\n else {\r\n return null;\r\n }\r\n };\r\n\r\n target.markClean = function () {\r\n console.log(\"Marking Clean\");\r\n markedClean = true;\r\n globalCleanValueJson(ko.toJSON(target));\r\n cleanValue(ko.toJSON(target));\r\n dirtyOverride(false);\r\n\r\n };\r\n target.markDirty = function () {\r\n dirtyOverride(true);\r\n };\r\n\r\n return target;\r\n};\r\n\r\nko.bindingHandlers.stopBinding = {\r\n init: function () {\r\n return { controlsDescendantBindings: true };\r\n }\r\n};\r\n\r\nko.bindingHandlers.bidirectionVisible = {\r\n init: function(element, valueAccessor) {\r\n var observer = new MutationObserver(function(mutations) {\r\n mutations.forEach(function(mutationRecord) {\r\n var value = valueAccessor();\r\n\r\n if (mutationRecord.target.style.display === \"none\") {\r\n value(false);\r\n } else {\r\n value(true);\r\n }\r\n }); \r\n });\r\n\r\n observer.observe(element, { attributes : true, attributeFilter : ['style'] });\r\n },\r\n update: function (element, valueAccessor) {\r\n var value = ko.utils.unwrapObservable(valueAccessor());\r\n var isCurrentlyVisible = !(element.style.display === \"none\");\r\n if (value && !isCurrentlyVisible)\r\n element.style.display = \"\";\r\n else if ((!value) && isCurrentlyVisible)\r\n element.style.display = \"none\";\r\n }\r\n};\r\n\r\n\r\n\r\n\r\n","/*=============================================================================\r\n\tAuthor:\t\t\tEric M. Barnard - @ericmbarnard\t\t\t\t\t\t\t\t\r\n\tLicense:\t\tMIT (http://opensource.org/licenses/mit-license.php)\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\tDescription:\tValidation Library for KnockoutJS\t\t\t\t\t\t\t\r\n\tVersion:\t\t2.0.3\t\t\t\t\t\t\t\t\t\t\t\r\n===============================================================================\r\n*/\r\n/*globals require: false, exports: false, define: false, ko: false */\r\n\r\n(function (factory) {\r\n // Module systems magic dance.\r\n\r\n if (typeof require === \"function\" && typeof exports === \"object\" && typeof module === \"object\") {\r\n // CommonJS or Node: hard-coded dependency on \"knockout\"\r\n factory(require(\"knockout\"), exports);\r\n } else if (typeof define === \"function\" && define[\"amd\"]) {\r\n // AMD anonymous module with hard-coded dependency on \"knockout\"\r\n define([\"knockout\", \"exports\"], factory);\r\n } else {\r\n //