{"version":3,"sources":["main.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","1","module","_interopRequireDefault","obj","__esModule","default","_appCrowdfundingPledgeBox","_appCrowdfundingPledgeBox2","widgetName","./app/CrowdfundingPledgeBox","2","create","hb","_create","compile","input","options","_Compiler$compile$precompile","precompile","AST","_AST2","Compiler","JavaScriptCompiler","_JavaScriptCompiler2","Parser","_Parser$parse","parser","parse","_interopRequireWildcard","_runtime","_runtime2","_AST","_JavaScriptCompiler","_Visitor","_Visitor2","_noConflict","_noConflict2","inst","Visitor","./handlebars.runtime","./handlebars/compiler/ast","./handlebars/compiler/base","./handlebars/compiler/compiler","./handlebars/compiler/javascript-compiler","./handlebars/compiler/visitor","./handlebars/no-conflict","3","base","HandlebarsEnvironment","Utils","extend","SafeString","_SafeString2","Exception","_Exception2","escapeExpression","VM","runtime","template","spec","_import","_SafeString","_Exception","_import2","_import3","./handlebars/base","./handlebars/exception","./handlebars/runtime","./handlebars/safe-string","./handlebars/utils","4","helpers","partials","this","registerDefaultHelpers","instance","registerHelper","arguments","name","context","inverse","fn","isArray","ids","each","data","createFrame","contextPath","appendContextPath","execIteration","field","index","last","key","first","ret","blockParams","undefined","isFunction","j","priorKey","hasOwnProperty","conditional","hash","includeZero","isEmpty","message","level","parseInt","log","object","frame","_parent","VERSION","COMPILER_REVISION","REVISION_CHANGES","5","6","toString","objectType","prototype","constructor","logger","unregisterHelper","registerPartial","partial","unregisterPartial","methodMap","0","DEBUG","INFO","WARN","ERROR","console","method","./exception","./utils","Program","statements","strip","locInfo","loc","type","body","MustacheStatement","path","params","escaped","BlockStatement","program","openStrip","inverseStrip","closeStrip","PartialStatement","indent","ContentStatement","string","original","value","CommentStatement","comment","SubExpression","PathExpression","depth","parts","StringLiteral","NumberLiteral","number","Number","BooleanLiteral","bool","UndefinedLiteral","NullLiteral","Hash","pairs","HashPair","helperExpression","node","scopedId","test","simpleId","_parser2","yy","SourceLocation","srcName","_WhitespaceControl2","accept","_parser","_WhitespaceControl","Helpers","_extend","../utils","./ast","./helpers","./parser","./whitespace-control","7","castChunk","chunk","codeGen","_isArray","len","push","wrap","CodeGen","srcFile","source","SourceNode","define","amd","SourceMap","err","line","column","chunks","src","add","join","prepend","toStringWithSourceMap","unshift","merge","empty","iter","currentLocation","start","functionCall","generateList","quotedString","str","replace","objectLiteral","entries","generateArray","source-map","8","env","compat","useDepths","ast","environment","_x","compileInput","templateSpec","execOptions","compiled","_setup","setupOptions","_child","depths","argEquals","b","_isArray$indexOf","transformLiteralToPath","sexpr","literal","slice","compiler","equals","other","opcodes","opcode","otherOpcode","args","children","guid","sourceNode","stringParams","trackIds","knownHelpers","helperMissing","blockHelperMissing","if","unless","with","lookup","_name","compileProgram","childCompiler","result","usePartial","shift","bodyLength","isSimple","block","classifySexpr","helperSexpr","simpleSexpr","ambiguousSexpr","partialName","isDynamic","setupFullMustacheParams","preventIndent","mustache","noEscape","content","isBlock","knownHelpersOnly","falsy","addDepth","scoped","blockParamId","blockParamIndex","pushParam","isBlockParam","isHelper","isEligible","_name2","pushParams","val","blockParamChild","omitEmpty","param","indexOf","../exception","9","first_line","first_column","end","last_line","last_column","id","token","substr","stripFlags","open","close","charAt","stripComment","preparePath","dig","depthString","part","isLiteral","separator","prepareMustache","escapeFlag","prepareRawBlock","openRawBlock","errorNode","prepareBlock","openBlock","inverseAndProgram","inverted","chain","10","Literal","strictLookup","requireTerminal","stack","popStack","nameLookup","aliasable","_COMPILER_REVISION$REVISION_CHANGES","_CodeGen","_CodeGen2","parent","isValidJavaScriptVariableName","depthedLookup","compilerInfo","revision","versions","appendToBuffer","location","explicit","initializeBuffer","asObject","isChild","programs","environments","preamble","stackSlot","stackVars","aliases","registers","list","hashes","compileStack","inlineStack","compileChildren","useBlockParams","firstLoc","apply","pushSource","createFunctionContext","main","useData","compilerOptions","JSON","stringify","file","destName","map","lastContext","varDeclarations","locals","concat","aliasCount","alias","referenceCount","mergeSource","Function","appendOnly","forceBuffer","appendFirst","sourceSeen","bufferStart","bufferEnd","substring","blockValue","contextName","setupHelperArgs","blockName","splice","ambiguousBlockValue","flushInline","current","topStack","lastHelper","appendContent","pendingContent","pendingLocation","append","isInline","replaceStack","local","appendEscaped","getContext","pushContext","pushStackLiteral","lookupOnContext","resolvePath","lookupBlockParam","lookupData","_this","strict","assumeObjects","resolvePossibleLambda","pushStringParam","pushString","emptyHash","pushHash","values","types","contexts","popHash","pop","pushLiteral","pushProgram","programExpression","invokeHelper","paramSize","nonHelper","helper","setupHelper","simple","callParams","invokeKnownHelper","invokeAmbiguous","helperCall","useRegister","helperName","paramsInit","invokePartial","setupParams","assignToHash","pushId","child","matchExistingProgram","programParams","expr","item","callback","prefix","createdStack","usedLiteral","top","incrStack","topStackName","entry","wrapped","inline","blockHelper","foundHelper","hashIds","hashTypes","hashContexts","reservedWords","split","compilerWords","RESERVED_WORDS","../base","./code-gen","11","handlebars","trace","symbols_","error","root","EOF","program_repetition0","statement","rawBlock","COMMENT","CONTENT","END_RAW_BLOCK","OPEN_RAW_BLOCK","openRawBlock_repetition0","openRawBlock_option0","CLOSE_RAW_BLOCK","block_option0","closeBlock","openInverse","block_option1","OPEN_BLOCK","openBlock_repetition0","openBlock_option0","openBlock_option1","CLOSE","OPEN_INVERSE","openInverse_repetition0","openInverse_option0","openInverse_option1","openInverseChain","OPEN_INVERSE_CHAIN","openInverseChain_repetition0","openInverseChain_option0","openInverseChain_option1","INVERSE","inverseChain","inverseChain_option0","OPEN_ENDBLOCK","OPEN","mustache_repetition0","mustache_option0","OPEN_UNESCAPED","mustache_repetition1","mustache_option1","CLOSE_UNESCAPED","OPEN_PARTIAL","partial_repetition0","partial_option0","OPEN_SEXPR","sexpr_repetition0","sexpr_option0","CLOSE_SEXPR","hash_repetition_plus0","hashSegment","ID","EQUALS","OPEN_BLOCK_PARAMS","blockParams_repetition_plus0","CLOSE_BLOCK_PARAMS","dataName","STRING","NUMBER","BOOLEAN","UNDEFINED","NULL","DATA","pathSegments","SEP","$accept","$end","terminals_","13","14","16","17","21","27","31","32","37","42","45","46","49","52","53","59","62","66","67","69","71","74","75","76","77","78","79","81","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","$","chained","table","12","15","22","25","18","72","73","80","54","58","47","50","23","36","41","43","26","55","28","33","19","48","57","63","64","65","51","24","56","60","29","34","20","44","38","61","30","68","35","39","70","40","defaultActions","82","92","99","100","105","107","110","111","123","124","parseError","lex","self","lexer","vstack","lstack","recovering","setInput","yylloc","yyloc","ranges","symbol","preErrorSymbol","state","action","p","newState","expected","yyval","errStr","showPosition","text","match","Array","range","_input","_more","_less","done","matched","conditionStack","offset","ch","lines","unput","oldLines","more","less","pastInput","past","upcomingInput","next","pre","c","tempMatch","rules","_currentRules","flex","matches","begin","condition","popState","conditions","topState","pushState","yy_","$avoiding_name_collisions","YY_START","mu","inclusive","emu","com","raw","INITIAL","print","PrintVisitor","padding","pad","out","paramStrings","joinedPairs","pair","./visitor","parents","mutating","acceptKey","acceptRequired","acceptArray","array","WhitespaceControl","isPrevWhitespace","isRoot","prev","sibling","isNextWhitespace","omitRight","multiple","rightStripped","omitLeft","leftStripped","isRootSeen","_isPrevWhitespace","_isNextWhitespace","openStandalone","closeStandalone","inlineStandalone","exec","firstInverse","lastInverse","tmp","idx","errorProps","captureStackTrace","lineNumber","global","Handlebars","window","$Handlebars","noConflict","checkRevision","compilerRevision","currentRevision","_COMPILER_REVISION$REVISION_CHANGES$createFrame","runtimeVersions","compilerVersions","invokePartialWrapper","resolvePartial","initData","container","lambda","declaredBlockParams","programWrapper","wrapProgram","common","noop","isTop","prog","./base","toHTML","escapeChar","chr","escape","Object","possible","badChars","&","<",">","\"","'","`","extension","filename","fs","templateString","readFileSync","printer","extensions","../dist/cjs/handlebars","../dist/cjs/handlebars/compiler/printer","process","__filename","amdefine","requireFn","trimDots","ary","normalize","baseName","baseParts","makeNormalize","relName","makeLoad","load","loaderCache","fromText","runFactory","deps","factory","m","uri","makeRequire","alreadyCalled","depName","defineCache","stringRequire","systemRequire","relId","amdRequire","nextTick","toUrl","filePath","dirname","plugin","originalId","_process","drainQueue","draining","currentQueue","queue","fun","setTimeout","title","browser","argv","version","on","addListener","once","off","removeListener","removeAllListeners","emit","binding","cwd","chdir","dir","umask","lib$es6$promise$utils$$objectOrFunction","x","lib$es6$promise$utils$$isFunction","lib$es6$promise$utils$$isMaybeThenable","lib$es6$promise$asap$$setScheduler","scheduleFn","lib$es6$promise$asap$$customSchedulerFn","lib$es6$promise$asap$$setAsap","asapFn","lib$es6$promise$asap$$asap","lib$es6$promise$asap$$useNextTick","setImmediate","lib$es6$promise$asap$$flush","lib$es6$promise$asap$$useVertxTimer","lib$es6$promise$asap$$vertxNext","lib$es6$promise$asap$$useMutationObserver","iterations","observer","lib$es6$promise$asap$$BrowserMutationObserver","document","createTextNode","observe","characterData","lib$es6$promise$asap$$useMessageChannel","channel","MessageChannel","port1","onmessage","port2","postMessage","lib$es6$promise$asap$$useSetTimeout","lib$es6$promise$asap$$len","lib$es6$promise$asap$$queue","arg","lib$es6$promise$asap$$attemptVertex","vertx","runOnLoop","runOnContext","lib$es6$promise$$internal$$noop","lib$es6$promise$$internal$$selfFullfillment","TypeError","lib$es6$promise$$internal$$cannotReturnOwn","lib$es6$promise$$internal$$getThen","promise","then","lib$es6$promise$$internal$$GET_THEN_ERROR","lib$es6$promise$$internal$$tryThen","fulfillmentHandler","rejectionHandler","lib$es6$promise$$internal$$handleForeignThenable","thenable","sealed","lib$es6$promise$$internal$$resolve","lib$es6$promise$$internal$$fulfill","reason","lib$es6$promise$$internal$$reject","_label","lib$es6$promise$$internal$$handleOwnThenable","_state","lib$es6$promise$$internal$$FULFILLED","_result","lib$es6$promise$$internal$$REJECTED","lib$es6$promise$$internal$$subscribe","lib$es6$promise$$internal$$handleMaybeThenable","maybeThenable","lib$es6$promise$$internal$$publishRejection","_onerror","lib$es6$promise$$internal$$publish","lib$es6$promise$$internal$$PENDING","_subscribers","onFulfillment","onRejection","subscribers","settled","detail","lib$es6$promise$$internal$$invokeCallback","lib$es6$promise$$internal$$ErrorObject","lib$es6$promise$$internal$$tryCatch","lib$es6$promise$$internal$$TRY_CATCH_ERROR","succeeded","failed","hasCallback","lib$es6$promise$$internal$$initializePromise","resolver","lib$es6$promise$enumerator$$Enumerator","Constructor","enumerator","_instanceConstructor","_validateInput","_remaining","_init","_enumerate","_validationError","lib$es6$promise$promise$all$$all","lib$es6$promise$enumerator$$default","lib$es6$promise$promise$race$$race","lib$es6$promise$utils$$isArray","resolve","lib$es6$promise$promise$resolve$$resolve","lib$es6$promise$promise$reject$$reject","lib$es6$promise$promise$$needsResolver","lib$es6$promise$promise$$needsNew","lib$es6$promise$promise$$Promise","_id","lib$es6$promise$promise$$counter","lib$es6$promise$polyfill$$polyfill","P","Promise","cast","lib$es6$promise$promise$$default","lib$es6$promise$utils$$_isArray","lib$es6$promise$asap$$scheduleFlush","lib$es6$promise$asap$$browserWindow","lib$es6$promise$asap$$browserGlobal","MutationObserver","WebKitMutationObserver","lib$es6$promise$asap$$isNode","lib$es6$promise$asap$$isWorker","Uint8ClampedArray","importScripts","_eachEntry","_settledAt","_willSettleAt","lib$es6$promise$promise$all$$default","lib$es6$promise$promise$race$$default","lib$es6$promise$promise$resolve$$default","lib$es6$promise$promise$reject$$default","all","race","reject","_setScheduler","_setAsap","_asap","catch","lib$es6$promise$polyfill$$default","lib$es6$promise$umd$$ES6Promise","polyfill","forEach","iterator","forEachArray","forEachString","forEachObject","k","is-function","win","alert","confirm","prompt","trim","headers","row","toLowerCase","for-each","normalizeArray","allowAboveRoot","up","filter","xs","res","splitPathRe","splitPath","resolvedPath","resolvedAbsolute","isAbsolute","trailingSlash","paths","relative","from","to","arr","fromParts","toParts","Math","min","samePartsLength","outputParts","sep","delimiter","basename","ext","extname","SourceMapGenerator","SourceMapConsumer","./source-map/source-map-consumer","./source-map/source-map-generator","./source-map/source-node","ArraySet","_array","_set","util","fromArray","aArray","aAllowDuplicates","set","aStr","isDuplicate","has","toSetString","at","aIdx","toArray","./util","toVLQSigned","aValue","fromVLQSigned","isNegative","shifted","base64","VLQ_BASE_SHIFT","VLQ_BASE","VLQ_BASE_MASK","VLQ_CONTINUATION_BIT","encode","digit","encoded","vlq","decode","aOutParam","continuation","strLen","rest","./base64","charToIntMap","intToCharMap","aNumber","aChar","recursiveSearch","aLow","aHigh","aNeedle","aHaystack","aCompare","mid","floor","cmp","search","generatedPositionAfter","mappingA","mappingB","lineA","generatedLine","lineB","columnA","generatedColumn","columnB","compareByGeneratedPositions","MappingList","_sorted","_last","unsortedForEach","aCallback","aThisArg","aMapping","sort","aSourceMap","sourceMap","getArg","sources","names","sourceRoot","sourcesContent","mappings","_version","_names","_sources","_mappings","binarySearch","base64VLQ","fromSourceMap","smc","_sourceRoot","_generateSourcesContent","_file","__generatedMappings","__originalMappings","compareByOriginalPositions","defineProperty","get","_parseMappings","_nextCharIsMappingSeparator","aSourceRoot","mapping","previousGeneratedColumn","previousOriginalLine","previousOriginalColumn","previousSource","previousName","temp","originalLine","originalColumn","_findMapping","aMappings","aLineName","aColumnName","aComparator","computeColumnSpans","_generatedMappings","nextMapping","lastGeneratedColumn","Infinity","originalPositionFor","aArgs","needle","sourceContentFor","aSource","url","urlParse","fileUriAbsPath","scheme","generatedPositionFor","_originalMappings","lastColumn","allGeneratedPositionsFor","reverse","GENERATED_ORDER","ORIGINAL_ORDER","eachMapping","aContext","aOrder","order","./array-set","./base64-vlq","./binary-search","_skipValidation","_sourcesContents","aSourceMapConsumer","generator","newMapping","generated","addMapping","sourceFile","setSourceContent","_validateMapping","aSourceFile","aSourceContent","keys","applySourceMap","aSourceMapPath","newSources","newNames","aGenerated","aOriginal","aName","_serializeMappings","previousGeneratedLine","aSources","toJSON","./mapping-list","aLine","aColumn","aChunks","sourceContents","isSourceNode","REGEX_NEWLINE","NEWLINE_CODE","fromStringWithSourceMap","aGeneratedCode","aRelativePath","addMappingWithCode","remainingLines","shiftNextLine","lineContents","newLine","lastGeneratedLine","lastMapping","nextLine","aChunk","walk","aFn","aSep","newChildren","replaceRight","aPattern","aReplacement","lastChild","walkSourceContents","fromSetString","sourceMappingActive","lastOriginalSource","lastOriginalLine","lastOriginalColumn","lastOriginalName","charCodeAt","sourceContent","./source-map-generator","aDefaultValue","aUrl","urlRegexp","auth","host","port","urlGenerate","aParsedUrl","aPath","aRoot","aPathUrl","aRootUrl","dataUrlRegexp","joined","strcmp","aStr1","aStr2","s1","s2","onlyCompareOriginal","onlyCompareGenerated","left","right","initParams","xtend","createXHR","_createXHR","readystatechange","xhr","readyState","loadFunc","getBody","response","responseText","getXml","isJson","errorFunc","evt","clearTimeout","timeoutTimer","statusCode","failureResponse","aborted","status","useXDR","rawRequest","getAllResponseHeaders","parseHeaders","called","cors","XDomainRequest","XMLHttpRequest","sync","json","onreadystatechange","onload","onerror","onprogress","onabort","ontimeout","username","password","withCredentials","timeout","abort","setRequestHeader","responseType","beforeSend","send","responseXML","firefoxBugTakenEffect","documentElement","nodeName","toUpperCase","global/window","parse-headers","target","_helpers","_partials_list","_partials_list2","ifEquals","./partials/_list","v1","v2","_list","_classCallCheck","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","protoProps","staticProps","Analytics","_ref","widget","configHash","init","widgetEl","querySelector","getAttribute","charityId","frpId","pushConfig","widgetInit","cardsInit","cardImpressions","_kmq","analyticsData","page_type","event","activity_type","charity_id","page_id","analytics","addEventListener","widgetClick","clickData","assign","subtype","event_value","_this2","cards","querySelectorAll","card","setAttribute","activityId","cardRank","cardFrpId","cardUrl","card_id","card_rank","activity_id","card_url","stopPropagation","cardClick","impressionData","card_count","_utilsQueryString","Model","isPaginated","apiPageSize","collectionPath","$model","setParams","lastReturnedPage","collection","currentApiPage","lastPage","pageNum","pageSize","fetchData","reset","getModel","qs","queryStringStringify","_this3","getNextPage","../utils/queryString","es6-promise","_HandlebarsHandlebars","_HandlebarsHandlebars2","View","el","model","pollInterval","pollTrigger","innerHTML","config","pollAtInterval","registerPollTrigger","img","Image","resetHeight","classList","refresh","render","remove","carousel","setInterval","_this4","_this5","frag","createElement","docFrag","createDocumentFragment","events","appendChild","../../Handlebars/handlebars","_utilsDebounce","_utilsDebounce2","_Analytics","_Analytics2","Widget","widgetContainer","responsive","userConfig","appId","makeResponsive","getUserConfig","queryStringParse","postContentHeight","referrer","scrollHeight","../utils/debounce","./Analytics","debounce","func","wait","immediate","later","callNow","reduce","decodeURIComponent","val2","encodeURIComponent","writeUtmCode","utmParams","utm","includes","../../utils/queryString","getPercent","numerator","denominator","parseFloat","commaFormat","_inherits","subClass","superClass","setPrototypeOf","__proto__","_get","_x2","_x3","_again","property","receiver","desc","getOwnPropertyDescriptor","getter","getPrototypeOf","_justgivingWidgetFrameworkComponentsLibJsFrameworkWidget","_justgivingWidgetFrameworkComponentsLibJsFrameworkWidget2","_justgivingWidgetFrameworkComponentsLibJsFrameworkView","_justgivingWidgetFrameworkComponentsLibJsFrameworkView2","_ModelCrowdfundingPageDetails","_ModelCrowdfundingPageDetails2","_ModelCrowdfundingFooter","_ModelCrowdfundingFooter2","CrowdfundingPledgeBox","_Widget","detailsModel","footerModel","bootstrap","detailsView","layout","showStory","prettyTarget","pitchFor","pitch","pitchBecause","because","percentPledged","progressPercent","amountPledged","formattedAmountPledged","pageUrl","avatar","ownerName","owner","ownerLocation","description","projectProblem","story","problem","loadImage","images","Url","footerView","crowdfundingGenericUrl","initAnalytics","./ModelCrowdfundingFooter","./ModelCrowdfundingPageDetails","justgiving-widget-framework/components/lib/js/framework/View","justgiving-widget-framework/components/lib/js/framework/Widget","_justgivingWidgetFrameworkComponentsLibJsFrameworkModel","_justgivingWidgetFrameworkComponentsLibJsFrameworkModel2","_justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode","_justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode2","ModelCrowdfundingFooter","_Model","baseCrowdfundingUrl","utm_name","utm_content","justgiving-widget-framework/components/lib/js/framework/Model","justgiving-widget-framework/components/lib/js/widget/analytics/writeUtmCode","_justgivingWidgetFrameworkComponentsLibJsWidgetModelNumber","ModelCrowdfundingPageDetails","targetAmount","round","profileImageUrls","Size150x150Face","justgiving-widget-framework/components/lib/js/widget/model/number"],"mappings":"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AK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,MAAStB,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKO,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,MAAStB,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKO,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,MAAStB,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKO,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,MAAStB,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKO,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,MAAStB,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKO,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAA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","file":"main.js","sourcesContent":["(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= 2.0.0-beta.1'\n};\n\nexports.REVISION_CHANGES = REVISION_CHANGES;\nvar isArray = Utils.isArray,\n isFunction = Utils.isFunction,\n toString = Utils.toString,\n objectType = '[object Object]';\n\nfunction HandlebarsEnvironment(helpers, partials) {\n this.helpers = helpers || {};\n this.partials = partials || {};\n\n registerDefaultHelpers(this);\n}\n\nHandlebarsEnvironment.prototype = {\n constructor: HandlebarsEnvironment,\n\n logger: logger,\n log: log,\n\n registerHelper: function registerHelper(name, fn) {\n if (toString.call(name) === objectType) {\n if (fn) {\n throw new _Exception2['default']('Arg not supported with multiple helpers');\n }\n Utils.extend(this.helpers, name);\n } else {\n this.helpers[name] = fn;\n }\n },\n unregisterHelper: function unregisterHelper(name) {\n delete this.helpers[name];\n },\n\n registerPartial: function registerPartial(name, partial) {\n if (toString.call(name) === objectType) {\n Utils.extend(this.partials, name);\n } else {\n if (typeof partial === 'undefined') {\n throw new _Exception2['default']('Attempting to register a partial as undefined');\n }\n this.partials[name] = partial;\n }\n },\n unregisterPartial: function unregisterPartial(name) {\n delete this.partials[name];\n }\n};\n\nfunction registerDefaultHelpers(instance) {\n instance.registerHelper('helperMissing', function () {\n if (arguments.length === 1) {\n // A missing field in a {{foo}} constuct.\n return undefined;\n } else {\n // Someone is actually trying to call something, blow up.\n throw new _Exception2['default']('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n }\n });\n\n instance.registerHelper('blockHelperMissing', function (context, options) {\n var inverse = options.inverse,\n fn = options.fn;\n\n if (context === true) {\n return fn(this);\n } else if (context === false || context == null) {\n return inverse(this);\n } else if (isArray(context)) {\n if (context.length > 0) {\n if (options.ids) {\n options.ids = [options.name];\n }\n\n return instance.helpers.each(context, options);\n } else {\n return inverse(this);\n }\n } else {\n if (options.data && options.ids) {\n var data = createFrame(options.data);\n data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name);\n options = { data: data };\n }\n\n return fn(context, options);\n }\n });\n\n instance.registerHelper('each', function (context, options) {\n if (!options) {\n throw new _Exception2['default']('Must pass iterator to #each');\n }\n\n var fn = options.fn,\n inverse = options.inverse,\n i = 0,\n ret = '',\n data = undefined,\n contextPath = undefined;\n\n if (options.data && options.ids) {\n contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n }\n\n if (isFunction(context)) {\n context = context.call(this);\n }\n\n if (options.data) {\n data = createFrame(options.data);\n }\n\n function execIteration(field, index, last) {\n if (data) {\n data.key = field;\n data.index = index;\n data.first = index === 0;\n data.last = !!last;\n\n if (contextPath) {\n data.contextPath = contextPath + field;\n }\n }\n\n ret = ret + fn(context[field], {\n data: data,\n blockParams: Utils.blockParams([context[field], field], [contextPath + field, null])\n });\n }\n\n if (context && typeof context === 'object') {\n if (isArray(context)) {\n for (var j = context.length; i < j; i++) {\n execIteration(i, i, i === context.length - 1);\n }\n } else {\n var priorKey = undefined;\n\n for (var key in context) {\n if (context.hasOwnProperty(key)) {\n // We're running the iterations one step out of sync so we can detect\n // the last iteration without have to scan the object twice and create\n // an itermediate keys array.\n if (priorKey) {\n execIteration(priorKey, i - 1);\n }\n priorKey = key;\n i++;\n }\n }\n if (priorKey) {\n execIteration(priorKey, i - 1, true);\n }\n }\n }\n\n if (i === 0) {\n ret = inverse(this);\n }\n\n return ret;\n });\n\n instance.registerHelper('if', function (conditional, options) {\n if (isFunction(conditional)) {\n conditional = conditional.call(this);\n }\n\n // Default behavior is to render the positive path if the value is truthy and not empty.\n // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n if (!options.hash.includeZero && !conditional || Utils.isEmpty(conditional)) {\n return options.inverse(this);\n } else {\n return options.fn(this);\n }\n });\n\n instance.registerHelper('unless', function (conditional, options) {\n return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });\n });\n\n instance.registerHelper('with', function (context, options) {\n if (isFunction(context)) {\n context = context.call(this);\n }\n\n var fn = options.fn;\n\n if (!Utils.isEmpty(context)) {\n if (options.data && options.ids) {\n var data = createFrame(options.data);\n data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]);\n options = { data: data };\n }\n\n return fn(context, options);\n } else {\n return options.inverse(this);\n }\n });\n\n instance.registerHelper('log', function (message, options) {\n var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;\n instance.log(level, message);\n });\n\n instance.registerHelper('lookup', function (obj, field) {\n return obj && obj[field];\n });\n}\n\nvar logger = {\n methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' },\n\n // State enum\n DEBUG: 0,\n INFO: 1,\n WARN: 2,\n ERROR: 3,\n level: 1,\n\n // Can be overridden in the host environment\n log: function log(level, message) {\n if (typeof console !== 'undefined' && logger.level <= level) {\n var method = logger.methodMap[level];\n (console[method] || console.log).call(console, message); // eslint-disable-line no-console\n }\n }\n};\n\nexports.logger = logger;\nvar log = logger.log;\n\nexports.log = log;\n\nfunction createFrame(object) {\n var frame = Utils.extend({}, object);\n frame._parent = object;\n return frame;\n}\n\n/* [args, ]options */\n},{\"./exception\":15,\"./utils\":19}],5:[function(require,module,exports){\n'use strict';\n\nexports.__esModule = true;\nvar AST = {\n Program: function Program(statements, blockParams, strip, locInfo) {\n this.loc = locInfo;\n this.type = 'Program';\n this.body = statements;\n\n this.blockParams = blockParams;\n this.strip = strip;\n },\n\n MustacheStatement: function MustacheStatement(path, params, hash, escaped, strip, locInfo) {\n this.loc = locInfo;\n this.type = 'MustacheStatement';\n\n this.path = path;\n this.params = params || [];\n this.hash = hash;\n this.escaped = escaped;\n\n this.strip = strip;\n },\n\n BlockStatement: function BlockStatement(path, params, hash, program, inverse, openStrip, inverseStrip, closeStrip, locInfo) {\n this.loc = locInfo;\n this.type = 'BlockStatement';\n\n this.path = path;\n this.params = params || [];\n this.hash = hash;\n this.program = program;\n this.inverse = inverse;\n\n this.openStrip = openStrip;\n this.inverseStrip = inverseStrip;\n this.closeStrip = closeStrip;\n },\n\n PartialStatement: function PartialStatement(name, params, hash, strip, locInfo) {\n this.loc = locInfo;\n this.type = 'PartialStatement';\n\n this.name = name;\n this.params = params || [];\n this.hash = hash;\n\n this.indent = '';\n this.strip = strip;\n },\n\n ContentStatement: function ContentStatement(string, locInfo) {\n this.loc = locInfo;\n this.type = 'ContentStatement';\n this.original = this.value = string;\n },\n\n CommentStatement: function CommentStatement(comment, strip, locInfo) {\n this.loc = locInfo;\n this.type = 'CommentStatement';\n this.value = comment;\n\n this.strip = strip;\n },\n\n SubExpression: function SubExpression(path, params, hash, locInfo) {\n this.loc = locInfo;\n\n this.type = 'SubExpression';\n this.path = path;\n this.params = params || [];\n this.hash = hash;\n },\n\n PathExpression: function PathExpression(data, depth, parts, original, locInfo) {\n this.loc = locInfo;\n this.type = 'PathExpression';\n\n this.data = data;\n this.original = original;\n this.parts = parts;\n this.depth = depth;\n },\n\n StringLiteral: function StringLiteral(string, locInfo) {\n this.loc = locInfo;\n this.type = 'StringLiteral';\n this.original = this.value = string;\n },\n\n NumberLiteral: function NumberLiteral(number, locInfo) {\n this.loc = locInfo;\n this.type = 'NumberLiteral';\n this.original = this.value = Number(number);\n },\n\n BooleanLiteral: function BooleanLiteral(bool, locInfo) {\n this.loc = locInfo;\n this.type = 'BooleanLiteral';\n this.original = this.value = bool === 'true';\n },\n\n UndefinedLiteral: function UndefinedLiteral(locInfo) {\n this.loc = locInfo;\n this.type = 'UndefinedLiteral';\n this.original = this.value = undefined;\n },\n\n NullLiteral: function NullLiteral(locInfo) {\n this.loc = locInfo;\n this.type = 'NullLiteral';\n this.original = this.value = null;\n },\n\n Hash: function Hash(pairs, locInfo) {\n this.loc = locInfo;\n this.type = 'Hash';\n this.pairs = pairs;\n },\n HashPair: function HashPair(key, value, locInfo) {\n this.loc = locInfo;\n this.type = 'HashPair';\n this.key = key;\n this.value = value;\n },\n\n // Public API used to evaluate derived attributes regarding AST nodes\n helpers: {\n // a mustache is definitely a helper if:\n // * it is an eligible helper, and\n // * it has at least one parameter or hash segment\n helperExpression: function helperExpression(node) {\n return !!(node.type === 'SubExpression' || node.params.length || node.hash);\n },\n\n scopedId: function scopedId(path) {\n return /^\\.|this\\b/.test(path.original);\n },\n\n // an ID is simple if it only has one part, and that part is not\n // `..` or `this`.\n simpleId: function simpleId(path) {\n return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth;\n }\n }\n};\n\n// Must be exported as an object rather than the root of the module as the jison lexer\n// must modify the object to operate properly.\nexports['default'] = AST;\nmodule.exports = exports['default'];\n},{}],6:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\nexports.parse = parse;\n\nvar _parser = require('./parser');\n\nvar _parser2 = _interopRequireWildcard(_parser);\n\nvar _AST = require('./ast');\n\nvar _AST2 = _interopRequireWildcard(_AST);\n\nvar _WhitespaceControl = require('./whitespace-control');\n\nvar _WhitespaceControl2 = _interopRequireWildcard(_WhitespaceControl);\n\nvar _import = require('./helpers');\n\nvar Helpers = _interopRequireWildcard(_import);\n\nvar _extend = require('../utils');\n\nexports.parser = _parser2['default'];\n\nvar yy = {};\n_extend.extend(yy, Helpers, _AST2['default']);\n\nfunction parse(input, options) {\n // Just return if an already-compiled AST was passed in.\n if (input.type === 'Program') {\n return input;\n }\n\n _parser2['default'].yy = yy;\n\n // Altering the shared object here, but this is ok as parser is a sync operation\n yy.locInfo = function (locInfo) {\n return new yy.SourceLocation(options && options.srcName, locInfo);\n };\n\n var strip = new _WhitespaceControl2['default']();\n return strip.accept(_parser2['default'].parse(input));\n}\n},{\"../utils\":19,\"./ast\":5,\"./helpers\":9,\"./parser\":11,\"./whitespace-control\":14}],7:[function(require,module,exports){\n'use strict';\n\nexports.__esModule = true;\n/*global define */\n\nvar _isArray = require('../utils');\n\nvar SourceNode = undefined;\n\ntry {\n /* istanbul ignore next */\n if (typeof define !== 'function' || !define.amd) {\n // We don't support this in AMD environments. For these environments, we asusme that\n // they are running on the browser and thus have no need for the source-map library.\n var SourceMap = require('source-map');\n SourceNode = SourceMap.SourceNode;\n }\n} catch (err) {}\n\n/* istanbul ignore if: tested but not covered in istanbul due to dist build */\nif (!SourceNode) {\n SourceNode = function (line, column, srcFile, chunks) {\n this.src = '';\n if (chunks) {\n this.add(chunks);\n }\n };\n /* istanbul ignore next */\n SourceNode.prototype = {\n add: function add(chunks) {\n if (_isArray.isArray(chunks)) {\n chunks = chunks.join('');\n }\n this.src += chunks;\n },\n prepend: function prepend(chunks) {\n if (_isArray.isArray(chunks)) {\n chunks = chunks.join('');\n }\n this.src = chunks + this.src;\n },\n toStringWithSourceMap: function toStringWithSourceMap() {\n return { code: this.toString() };\n },\n toString: function toString() {\n return this.src;\n }\n };\n}\n\nfunction castChunk(chunk, codeGen, loc) {\n if (_isArray.isArray(chunk)) {\n var ret = [];\n\n for (var i = 0, len = chunk.length; i < len; i++) {\n ret.push(codeGen.wrap(chunk[i], loc));\n }\n return ret;\n } else if (typeof chunk === 'boolean' || typeof chunk === 'number') {\n // Handle primitives that the SourceNode will throw up on\n return chunk + '';\n }\n return chunk;\n}\n\nfunction CodeGen(srcFile) {\n this.srcFile = srcFile;\n this.source = [];\n}\n\nCodeGen.prototype = {\n prepend: function prepend(source, loc) {\n this.source.unshift(this.wrap(source, loc));\n },\n push: function push(source, loc) {\n this.source.push(this.wrap(source, loc));\n },\n\n merge: function merge() {\n var source = this.empty();\n this.each(function (line) {\n source.add([' ', line, '\\n']);\n });\n return source;\n },\n\n each: function each(iter) {\n for (var i = 0, len = this.source.length; i < len; i++) {\n iter(this.source[i]);\n }\n },\n\n empty: function empty() {\n var loc = arguments[0] === undefined ? this.currentLocation || { start: {} } : arguments[0];\n\n return new SourceNode(loc.start.line, loc.start.column, this.srcFile);\n },\n wrap: function wrap(chunk) {\n var loc = arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1];\n\n if (chunk instanceof SourceNode) {\n return chunk;\n }\n\n chunk = castChunk(chunk, this, loc);\n\n return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk);\n },\n\n functionCall: function functionCall(fn, type, params) {\n params = this.generateList(params);\n return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']);\n },\n\n quotedString: function quotedString(str) {\n return '\"' + (str + '').replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r').replace(/\\u2028/g, '\\\\u2028') // Per Ecma-262 7.3 + 7.8.4\n .replace(/\\u2029/g, '\\\\u2029') + '\"';\n },\n\n objectLiteral: function objectLiteral(obj) {\n var pairs = [];\n\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n var value = castChunk(obj[key], this);\n if (value !== 'undefined') {\n pairs.push([this.quotedString(key), ':', value]);\n }\n }\n }\n\n var ret = this.generateList(pairs);\n ret.prepend('{');\n ret.add('}');\n return ret;\n },\n\n generateList: function generateList(entries, loc) {\n var ret = this.empty(loc);\n\n for (var i = 0, len = entries.length; i < len; i++) {\n if (i) {\n ret.add(',');\n }\n\n ret.add(castChunk(entries[i], this, loc));\n }\n\n return ret;\n },\n\n generateArray: function generateArray(entries, loc) {\n var ret = this.generateList(entries, loc);\n ret.prepend('[');\n ret.add(']');\n\n return ret;\n }\n};\n\nexports['default'] = CodeGen;\nmodule.exports = exports['default'];\n\n/* NOP */\n},{\"../utils\":19,\"source-map\":30}],8:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\nexports.Compiler = Compiler;\nexports.precompile = precompile;\nexports.compile = compile;\n\nvar _Exception = require('../exception');\n\nvar _Exception2 = _interopRequireWildcard(_Exception);\n\nvar _isArray$indexOf = require('../utils');\n\nvar _AST = require('./ast');\n\nvar _AST2 = _interopRequireWildcard(_AST);\n\nvar slice = [].slice;\n\nfunction Compiler() {}\n\n// the foundHelper register will disambiguate helper lookup from finding a\n// function in a context. This is necessary for mustache compatibility, which\n// requires that context functions in blocks are evaluated by blockHelperMissing,\n// and then proceed as if the resulting value was provided to blockHelperMissing.\n\nCompiler.prototype = {\n compiler: Compiler,\n\n equals: function equals(other) {\n var len = this.opcodes.length;\n if (other.opcodes.length !== len) {\n return false;\n }\n\n for (var i = 0; i < len; i++) {\n var opcode = this.opcodes[i],\n otherOpcode = other.opcodes[i];\n if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) {\n return false;\n }\n }\n\n // We know that length is the same between the two arrays because they are directly tied\n // to the opcode behavior above.\n len = this.children.length;\n for (var i = 0; i < len; i++) {\n if (!this.children[i].equals(other.children[i])) {\n return false;\n }\n }\n\n return true;\n },\n\n guid: 0,\n\n compile: function compile(program, options) {\n this.sourceNode = [];\n this.opcodes = [];\n this.children = [];\n this.options = options;\n this.stringParams = options.stringParams;\n this.trackIds = options.trackIds;\n\n options.blockParams = options.blockParams || [];\n\n // These changes will propagate to the other compiler components\n var knownHelpers = options.knownHelpers;\n options.knownHelpers = {\n helperMissing: true,\n blockHelperMissing: true,\n each: true,\n 'if': true,\n unless: true,\n 'with': true,\n log: true,\n lookup: true\n };\n if (knownHelpers) {\n for (var _name in knownHelpers) {\n if (_name in knownHelpers) {\n options.knownHelpers[_name] = knownHelpers[_name];\n }\n }\n }\n\n return this.accept(program);\n },\n\n compileProgram: function compileProgram(program) {\n var childCompiler = new this.compiler(),\n // eslint-disable-line new-cap\n result = childCompiler.compile(program, this.options),\n guid = this.guid++;\n\n this.usePartial = this.usePartial || result.usePartial;\n\n this.children[guid] = result;\n this.useDepths = this.useDepths || result.useDepths;\n\n return guid;\n },\n\n accept: function accept(node) {\n this.sourceNode.unshift(node);\n var ret = this[node.type](node);\n this.sourceNode.shift();\n return ret;\n },\n\n Program: function Program(program) {\n this.options.blockParams.unshift(program.blockParams);\n\n var body = program.body,\n bodyLength = body.length;\n for (var i = 0; i < bodyLength; i++) {\n this.accept(body[i]);\n }\n\n this.options.blockParams.shift();\n\n this.isSimple = bodyLength === 1;\n this.blockParams = program.blockParams ? program.blockParams.length : 0;\n\n return this;\n },\n\n BlockStatement: function BlockStatement(block) {\n transformLiteralToPath(block);\n\n var program = block.program,\n inverse = block.inverse;\n\n program = program && this.compileProgram(program);\n inverse = inverse && this.compileProgram(inverse);\n\n var type = this.classifySexpr(block);\n\n if (type === 'helper') {\n this.helperSexpr(block, program, inverse);\n } else if (type === 'simple') {\n this.simpleSexpr(block);\n\n // now that the simple mustache is resolved, we need to\n // evaluate it by executing `blockHelperMissing`\n this.opcode('pushProgram', program);\n this.opcode('pushProgram', inverse);\n this.opcode('emptyHash');\n this.opcode('blockValue', block.path.original);\n } else {\n this.ambiguousSexpr(block, program, inverse);\n\n // now that the simple mustache is resolved, we need to\n // evaluate it by executing `blockHelperMissing`\n this.opcode('pushProgram', program);\n this.opcode('pushProgram', inverse);\n this.opcode('emptyHash');\n this.opcode('ambiguousBlockValue');\n }\n\n this.opcode('append');\n },\n\n PartialStatement: function PartialStatement(partial) {\n this.usePartial = true;\n\n var params = partial.params;\n if (params.length > 1) {\n throw new _Exception2['default']('Unsupported number of partial arguments: ' + params.length, partial);\n } else if (!params.length) {\n params.push({ type: 'PathExpression', parts: [], depth: 0 });\n }\n\n var partialName = partial.name.original,\n isDynamic = partial.name.type === 'SubExpression';\n if (isDynamic) {\n this.accept(partial.name);\n }\n\n this.setupFullMustacheParams(partial, undefined, undefined, true);\n\n var indent = partial.indent || '';\n if (this.options.preventIndent && indent) {\n this.opcode('appendContent', indent);\n indent = '';\n }\n\n this.opcode('invokePartial', isDynamic, partialName, indent);\n this.opcode('append');\n },\n\n MustacheStatement: function MustacheStatement(mustache) {\n this.SubExpression(mustache); // eslint-disable-line new-cap\n\n if (mustache.escaped && !this.options.noEscape) {\n this.opcode('appendEscaped');\n } else {\n this.opcode('append');\n }\n },\n\n ContentStatement: function ContentStatement(content) {\n if (content.value) {\n this.opcode('appendContent', content.value);\n }\n },\n\n CommentStatement: function CommentStatement() {},\n\n SubExpression: function SubExpression(sexpr) {\n transformLiteralToPath(sexpr);\n var type = this.classifySexpr(sexpr);\n\n if (type === 'simple') {\n this.simpleSexpr(sexpr);\n } else if (type === 'helper') {\n this.helperSexpr(sexpr);\n } else {\n this.ambiguousSexpr(sexpr);\n }\n },\n ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) {\n var path = sexpr.path,\n name = path.parts[0],\n isBlock = program != null || inverse != null;\n\n this.opcode('getContext', path.depth);\n\n this.opcode('pushProgram', program);\n this.opcode('pushProgram', inverse);\n\n this.accept(path);\n\n this.opcode('invokeAmbiguous', name, isBlock);\n },\n\n simpleSexpr: function simpleSexpr(sexpr) {\n this.accept(sexpr.path);\n this.opcode('resolvePossibleLambda');\n },\n\n helperSexpr: function helperSexpr(sexpr, program, inverse) {\n var params = this.setupFullMustacheParams(sexpr, program, inverse),\n path = sexpr.path,\n name = path.parts[0];\n\n if (this.options.knownHelpers[name]) {\n this.opcode('invokeKnownHelper', params.length, name);\n } else if (this.options.knownHelpersOnly) {\n throw new _Exception2['default']('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr);\n } else {\n path.falsy = true;\n\n this.accept(path);\n this.opcode('invokeHelper', params.length, path.original, _AST2['default'].helpers.simpleId(path));\n }\n },\n\n PathExpression: function PathExpression(path) {\n this.addDepth(path.depth);\n this.opcode('getContext', path.depth);\n\n var name = path.parts[0],\n scoped = _AST2['default'].helpers.scopedId(path),\n blockParamId = !path.depth && !scoped && this.blockParamIndex(name);\n\n if (blockParamId) {\n this.opcode('lookupBlockParam', blockParamId, path.parts);\n } else if (!name) {\n // Context reference, i.e. `{{foo .}}` or `{{foo ..}}`\n this.opcode('pushContext');\n } else if (path.data) {\n this.options.data = true;\n this.opcode('lookupData', path.depth, path.parts);\n } else {\n this.opcode('lookupOnContext', path.parts, path.falsy, scoped);\n }\n },\n\n StringLiteral: function StringLiteral(string) {\n this.opcode('pushString', string.value);\n },\n\n NumberLiteral: function NumberLiteral(number) {\n this.opcode('pushLiteral', number.value);\n },\n\n BooleanLiteral: function BooleanLiteral(bool) {\n this.opcode('pushLiteral', bool.value);\n },\n\n UndefinedLiteral: function UndefinedLiteral() {\n this.opcode('pushLiteral', 'undefined');\n },\n\n NullLiteral: function NullLiteral() {\n this.opcode('pushLiteral', 'null');\n },\n\n Hash: function Hash(hash) {\n var pairs = hash.pairs,\n i = 0,\n l = pairs.length;\n\n this.opcode('pushHash');\n\n for (; i < l; i++) {\n this.pushParam(pairs[i].value);\n }\n while (i--) {\n this.opcode('assignToHash', pairs[i].key);\n }\n this.opcode('popHash');\n },\n\n // HELPERS\n opcode: function opcode(name) {\n this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc });\n },\n\n addDepth: function addDepth(depth) {\n if (!depth) {\n return;\n }\n\n this.useDepths = true;\n },\n\n classifySexpr: function classifySexpr(sexpr) {\n var isSimple = _AST2['default'].helpers.simpleId(sexpr.path);\n\n var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]);\n\n // a mustache is an eligible helper if:\n // * its id is simple (a single part, not `this` or `..`)\n var isHelper = !isBlockParam && _AST2['default'].helpers.helperExpression(sexpr);\n\n // if a mustache is an eligible helper but not a definite\n // helper, it is ambiguous, and will be resolved in a later\n // pass or at runtime.\n var isEligible = !isBlockParam && (isHelper || isSimple);\n\n // if ambiguous, we can possibly resolve the ambiguity now\n // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc.\n if (isEligible && !isHelper) {\n var _name2 = sexpr.path.parts[0],\n options = this.options;\n\n if (options.knownHelpers[_name2]) {\n isHelper = true;\n } else if (options.knownHelpersOnly) {\n isEligible = false;\n }\n }\n\n if (isHelper) {\n return 'helper';\n } else if (isEligible) {\n return 'ambiguous';\n } else {\n return 'simple';\n }\n },\n\n pushParams: function pushParams(params) {\n for (var i = 0, l = params.length; i < l; i++) {\n this.pushParam(params[i]);\n }\n },\n\n pushParam: function pushParam(val) {\n var value = val.value != null ? val.value : val.original || '';\n\n if (this.stringParams) {\n if (value.replace) {\n value = value.replace(/^(\\.?\\.\\/)*/g, '').replace(/\\//g, '.');\n }\n\n if (val.depth) {\n this.addDepth(val.depth);\n }\n this.opcode('getContext', val.depth || 0);\n this.opcode('pushStringParam', value, val.type);\n\n if (val.type === 'SubExpression') {\n // SubExpressions get evaluated and passed in\n // in string params mode.\n this.accept(val);\n }\n } else {\n if (this.trackIds) {\n var blockParamIndex = undefined;\n if (val.parts && !_AST2['default'].helpers.scopedId(val) && !val.depth) {\n blockParamIndex = this.blockParamIndex(val.parts[0]);\n }\n if (blockParamIndex) {\n var blockParamChild = val.parts.slice(1).join('.');\n this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild);\n } else {\n value = val.original || value;\n if (value.replace) {\n value = value.replace(/^\\.\\//g, '').replace(/^\\.$/g, '');\n }\n\n this.opcode('pushId', val.type, value);\n }\n }\n this.accept(val);\n }\n },\n\n setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) {\n var params = sexpr.params;\n this.pushParams(params);\n\n this.opcode('pushProgram', program);\n this.opcode('pushProgram', inverse);\n\n if (sexpr.hash) {\n this.accept(sexpr.hash);\n } else {\n this.opcode('emptyHash', omitEmpty);\n }\n\n return params;\n },\n\n blockParamIndex: function blockParamIndex(name) {\n for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) {\n var blockParams = this.options.blockParams[depth],\n param = blockParams && _isArray$indexOf.indexOf(blockParams, name);\n if (blockParams && param >= 0) {\n return [depth, param];\n }\n }\n }\n};\n\nfunction precompile(input, options, env) {\n if (input == null || typeof input !== 'string' && input.type !== 'Program') {\n throw new _Exception2['default']('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input);\n }\n\n options = options || {};\n if (!('data' in options)) {\n options.data = true;\n }\n if (options.compat) {\n options.useDepths = true;\n }\n\n var ast = env.parse(input, options),\n environment = new env.Compiler().compile(ast, options);\n return new env.JavaScriptCompiler().compile(environment, options);\n}\n\nfunction compile(input, _x, env) {\n var options = arguments[1] === undefined ? {} : arguments[1];\n\n if (input == null || typeof input !== 'string' && input.type !== 'Program') {\n throw new _Exception2['default']('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input);\n }\n\n if (!('data' in options)) {\n options.data = true;\n }\n if (options.compat) {\n options.useDepths = true;\n }\n\n var compiled = undefined;\n\n function compileInput() {\n var ast = env.parse(input, options),\n environment = new env.Compiler().compile(ast, options),\n templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true);\n return env.template(templateSpec);\n }\n\n // Template is only compiled on first use and cached after that point.\n function ret(context, execOptions) {\n if (!compiled) {\n compiled = compileInput();\n }\n return compiled.call(this, context, execOptions);\n }\n ret._setup = function (setupOptions) {\n if (!compiled) {\n compiled = compileInput();\n }\n return compiled._setup(setupOptions);\n };\n ret._child = function (i, data, blockParams, depths) {\n if (!compiled) {\n compiled = compileInput();\n }\n return compiled._child(i, data, blockParams, depths);\n };\n return ret;\n}\n\nfunction argEquals(a, b) {\n if (a === b) {\n return true;\n }\n\n if (_isArray$indexOf.isArray(a) && _isArray$indexOf.isArray(b) && a.length === b.length) {\n for (var i = 0; i < a.length; i++) {\n if (!argEquals(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n}\n\nfunction transformLiteralToPath(sexpr) {\n if (!sexpr.path.parts) {\n var literal = sexpr.path;\n // Casting to string here to make false and 0 literal values play nicely with the rest\n // of the system.\n sexpr.path = new _AST2['default'].PathExpression(false, 0, [literal.original + ''], literal.original + '', literal.loc);\n }\n}\n},{\"../exception\":15,\"../utils\":19,\"./ast\":5}],9:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\nexports.SourceLocation = SourceLocation;\nexports.id = id;\nexports.stripFlags = stripFlags;\nexports.stripComment = stripComment;\nexports.preparePath = preparePath;\nexports.prepareMustache = prepareMustache;\nexports.prepareRawBlock = prepareRawBlock;\nexports.prepareBlock = prepareBlock;\n\nvar _Exception = require('../exception');\n\nvar _Exception2 = _interopRequireWildcard(_Exception);\n\nfunction SourceLocation(source, locInfo) {\n this.source = source;\n this.start = {\n line: locInfo.first_line,\n column: locInfo.first_column\n };\n this.end = {\n line: locInfo.last_line,\n column: locInfo.last_column\n };\n}\n\nfunction id(token) {\n if (/^\\[.*\\]$/.test(token)) {\n return token.substr(1, token.length - 2);\n } else {\n return token;\n }\n}\n\nfunction stripFlags(open, close) {\n return {\n open: open.charAt(2) === '~',\n close: close.charAt(close.length - 3) === '~'\n };\n}\n\nfunction stripComment(comment) {\n return comment.replace(/^\\{\\{~?\\!-?-?/, '').replace(/-?-?~?\\}\\}$/, '');\n}\n\nfunction preparePath(data, parts, locInfo) {\n locInfo = this.locInfo(locInfo);\n\n var original = data ? '@' : '',\n dig = [],\n depth = 0,\n depthString = '';\n\n for (var i = 0, l = parts.length; i < l; i++) {\n var part = parts[i].part,\n\n // If we have [] syntax then we do not treat path references as operators,\n // i.e. foo.[this] resolves to approximately context.foo['this']\n isLiteral = parts[i].original !== part;\n original += (parts[i].separator || '') + part;\n\n if (!isLiteral && (part === '..' || part === '.' || part === 'this')) {\n if (dig.length > 0) {\n throw new _Exception2['default']('Invalid path: ' + original, { loc: locInfo });\n } else if (part === '..') {\n depth++;\n depthString += '../';\n }\n } else {\n dig.push(part);\n }\n }\n\n return new this.PathExpression(data, depth, dig, original, locInfo);\n}\n\nfunction prepareMustache(path, params, hash, open, strip, locInfo) {\n // Must use charAt to support IE pre-10\n var escapeFlag = open.charAt(3) || open.charAt(2),\n escaped = escapeFlag !== '{' && escapeFlag !== '&';\n\n return new this.MustacheStatement(path, params, hash, escaped, strip, this.locInfo(locInfo));\n}\n\nfunction prepareRawBlock(openRawBlock, content, close, locInfo) {\n if (openRawBlock.path.original !== close) {\n var errorNode = { loc: openRawBlock.path.loc };\n\n throw new _Exception2['default'](openRawBlock.path.original + ' doesn\\'t match ' + close, errorNode);\n }\n\n locInfo = this.locInfo(locInfo);\n var program = new this.Program([content], null, {}, locInfo);\n\n return new this.BlockStatement(openRawBlock.path, openRawBlock.params, openRawBlock.hash, program, undefined, {}, {}, {}, locInfo);\n}\n\nfunction prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) {\n // When we are chaining inverse calls, we will not have a close path\n if (close && close.path && openBlock.path.original !== close.path.original) {\n var errorNode = { loc: openBlock.path.loc };\n\n throw new _Exception2['default'](openBlock.path.original + ' doesn\\'t match ' + close.path.original, errorNode);\n }\n\n program.blockParams = openBlock.blockParams;\n\n var inverse = undefined,\n inverseStrip = undefined;\n\n if (inverseAndProgram) {\n if (inverseAndProgram.chain) {\n inverseAndProgram.program.body[0].closeStrip = close.strip;\n }\n\n inverseStrip = inverseAndProgram.strip;\n inverse = inverseAndProgram.program;\n }\n\n if (inverted) {\n inverted = inverse;\n inverse = program;\n program = inverted;\n }\n\n return new this.BlockStatement(openBlock.path, openBlock.params, openBlock.hash, program, inverse, openBlock.strip, inverseStrip, close && close.strip, this.locInfo(locInfo));\n}\n},{\"../exception\":15}],10:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\n\nvar _COMPILER_REVISION$REVISION_CHANGES = require('../base');\n\nvar _Exception = require('../exception');\n\nvar _Exception2 = _interopRequireWildcard(_Exception);\n\nvar _isArray = require('../utils');\n\nvar _CodeGen = require('./code-gen');\n\nvar _CodeGen2 = _interopRequireWildcard(_CodeGen);\n\nfunction Literal(value) {\n this.value = value;\n}\n\nfunction JavaScriptCompiler() {}\n\nJavaScriptCompiler.prototype = {\n // PUBLIC API: You can override these methods in a subclass to provide\n // alternative compiled forms for name lookup and buffering semantics\n nameLookup: function nameLookup(parent, name /* , type*/) {\n if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) {\n return [parent, '.', name];\n } else {\n return [parent, '[\\'', name, '\\']'];\n }\n },\n depthedLookup: function depthedLookup(name) {\n return [this.aliasable('this.lookup'), '(depths, \"', name, '\")'];\n },\n\n compilerInfo: function compilerInfo() {\n var revision = _COMPILER_REVISION$REVISION_CHANGES.COMPILER_REVISION,\n versions = _COMPILER_REVISION$REVISION_CHANGES.REVISION_CHANGES[revision];\n return [revision, versions];\n },\n\n appendToBuffer: function appendToBuffer(source, location, explicit) {\n // Force a source as this simplifies the merge logic.\n if (!_isArray.isArray(source)) {\n source = [source];\n }\n source = this.source.wrap(source, location);\n\n if (this.environment.isSimple) {\n return ['return ', source, ';'];\n } else if (explicit) {\n // This is a case where the buffer operation occurs as a child of another\n // construct, generally braces. We have to explicitly output these buffer\n // operations to ensure that the emitted code goes in the correct location.\n return ['buffer += ', source, ';'];\n } else {\n source.appendToBuffer = true;\n return source;\n }\n },\n\n initializeBuffer: function initializeBuffer() {\n return this.quotedString('');\n },\n // END PUBLIC API\n\n compile: function compile(environment, options, context, asObject) {\n this.environment = environment;\n this.options = options;\n this.stringParams = this.options.stringParams;\n this.trackIds = this.options.trackIds;\n this.precompile = !asObject;\n\n this.name = this.environment.name;\n this.isChild = !!context;\n this.context = context || {\n programs: [],\n environments: []\n };\n\n this.preamble();\n\n this.stackSlot = 0;\n this.stackVars = [];\n this.aliases = {};\n this.registers = { list: [] };\n this.hashes = [];\n this.compileStack = [];\n this.inlineStack = [];\n this.blockParams = [];\n\n this.compileChildren(environment, options);\n\n this.useDepths = this.useDepths || environment.useDepths || this.options.compat;\n this.useBlockParams = this.useBlockParams || environment.useBlockParams;\n\n var opcodes = environment.opcodes,\n opcode = undefined,\n firstLoc = undefined,\n i = undefined,\n l = undefined;\n\n for (i = 0, l = opcodes.length; i < l; i++) {\n opcode = opcodes[i];\n\n this.source.currentLocation = opcode.loc;\n firstLoc = firstLoc || opcode.loc;\n this[opcode.opcode].apply(this, opcode.args);\n }\n\n // Flush any trailing content that might be pending.\n this.source.currentLocation = firstLoc;\n this.pushSource('');\n\n /* istanbul ignore next */\n if (this.stackSlot || this.inlineStack.length || this.compileStack.length) {\n throw new _Exception2['default']('Compile completed with content left on stack');\n }\n\n var fn = this.createFunctionContext(asObject);\n if (!this.isChild) {\n var ret = {\n compiler: this.compilerInfo(),\n main: fn\n };\n var programs = this.context.programs;\n for (i = 0, l = programs.length; i < l; i++) {\n if (programs[i]) {\n ret[i] = programs[i];\n }\n }\n\n if (this.environment.usePartial) {\n ret.usePartial = true;\n }\n if (this.options.data) {\n ret.useData = true;\n }\n if (this.useDepths) {\n ret.useDepths = true;\n }\n if (this.useBlockParams) {\n ret.useBlockParams = true;\n }\n if (this.options.compat) {\n ret.compat = true;\n }\n\n if (!asObject) {\n ret.compiler = JSON.stringify(ret.compiler);\n\n this.source.currentLocation = { start: { line: 1, column: 0 } };\n ret = this.objectLiteral(ret);\n\n if (options.srcName) {\n ret = ret.toStringWithSourceMap({ file: options.destName });\n ret.map = ret.map && ret.map.toString();\n } else {\n ret = ret.toString();\n }\n } else {\n ret.compilerOptions = this.options;\n }\n\n return ret;\n } else {\n return fn;\n }\n },\n\n preamble: function preamble() {\n // track the last context pushed into place to allow skipping the\n // getContext opcode when it would be a noop\n this.lastContext = 0;\n this.source = new _CodeGen2['default'](this.options.srcName);\n },\n\n createFunctionContext: function createFunctionContext(asObject) {\n var varDeclarations = '';\n\n var locals = this.stackVars.concat(this.registers.list);\n if (locals.length > 0) {\n varDeclarations += ', ' + locals.join(', ');\n }\n\n // Generate minimizer alias mappings\n //\n // When using true SourceNodes, this will update all references to the given alias\n // as the source nodes are reused in situ. For the non-source node compilation mode,\n // aliases will not be used, but this case is already being run on the client and\n // we aren't concern about minimizing the template size.\n var aliasCount = 0;\n for (var alias in this.aliases) {\n // eslint-disable-line guard-for-in\n var node = this.aliases[alias];\n\n if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) {\n varDeclarations += ', alias' + ++aliasCount + '=' + alias;\n node.children[0] = 'alias' + aliasCount;\n }\n }\n\n var params = ['depth0', 'helpers', 'partials', 'data'];\n\n if (this.useBlockParams || this.useDepths) {\n params.push('blockParams');\n }\n if (this.useDepths) {\n params.push('depths');\n }\n\n // Perform a second pass over the output to merge content when possible\n var source = this.mergeSource(varDeclarations);\n\n if (asObject) {\n params.push(source);\n\n return Function.apply(this, params);\n } else {\n return this.source.wrap(['function(', params.join(','), ') {\\n ', source, '}']);\n }\n },\n mergeSource: function mergeSource(varDeclarations) {\n var isSimple = this.environment.isSimple,\n appendOnly = !this.forceBuffer,\n appendFirst = undefined,\n sourceSeen = undefined,\n bufferStart = undefined,\n bufferEnd = undefined;\n this.source.each(function (line) {\n if (line.appendToBuffer) {\n if (bufferStart) {\n line.prepend(' + ');\n } else {\n bufferStart = line;\n }\n bufferEnd = line;\n } else {\n if (bufferStart) {\n if (!sourceSeen) {\n appendFirst = true;\n } else {\n bufferStart.prepend('buffer += ');\n }\n bufferEnd.add(';');\n bufferStart = bufferEnd = undefined;\n }\n\n sourceSeen = true;\n if (!isSimple) {\n appendOnly = false;\n }\n }\n });\n\n if (appendOnly) {\n if (bufferStart) {\n bufferStart.prepend('return ');\n bufferEnd.add(';');\n } else if (!sourceSeen) {\n this.source.push('return \"\";');\n }\n } else {\n varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer());\n\n if (bufferStart) {\n bufferStart.prepend('return buffer + ');\n bufferEnd.add(';');\n } else {\n this.source.push('return buffer;');\n }\n }\n\n if (varDeclarations) {\n this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\\n'));\n }\n\n return this.source.merge();\n },\n\n // [blockValue]\n //\n // On stack, before: hash, inverse, program, value\n // On stack, after: return value of blockHelperMissing\n //\n // The purpose of this opcode is to take a block of the form\n // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and\n // replace it on the stack with the result of properly\n // invoking blockHelperMissing.\n blockValue: function blockValue(name) {\n var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'),\n params = [this.contextName(0)];\n this.setupHelperArgs(name, 0, params);\n\n var blockName = this.popStack();\n params.splice(1, 0, blockName);\n\n this.push(this.source.functionCall(blockHelperMissing, 'call', params));\n },\n\n // [ambiguousBlockValue]\n //\n // On stack, before: hash, inverse, program, value\n // Compiler value, before: lastHelper=value of last found helper, if any\n // On stack, after, if no lastHelper: same as [blockValue]\n // On stack, after, if lastHelper: value\n ambiguousBlockValue: function ambiguousBlockValue() {\n // We're being a bit cheeky and reusing the options value from the prior exec\n var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'),\n params = [this.contextName(0)];\n this.setupHelperArgs('', 0, params, true);\n\n this.flushInline();\n\n var current = this.topStack();\n params.splice(1, 0, current);\n\n this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']);\n },\n\n // [appendContent]\n //\n // On stack, before: ...\n // On stack, after: ...\n //\n // Appends the string value of `content` to the current buffer\n appendContent: function appendContent(content) {\n if (this.pendingContent) {\n content = this.pendingContent + content;\n } else {\n this.pendingLocation = this.source.currentLocation;\n }\n\n this.pendingContent = content;\n },\n\n // [append]\n //\n // On stack, before: value, ...\n // On stack, after: ...\n //\n // Coerces `value` to a String and appends it to the current buffer.\n //\n // If `value` is truthy, or 0, it is coerced into a string and appended\n // Otherwise, the empty string is appended\n append: function append() {\n if (this.isInline()) {\n this.replaceStack(function (current) {\n return [' != null ? ', current, ' : \"\"'];\n });\n\n this.pushSource(this.appendToBuffer(this.popStack()));\n } else {\n var local = this.popStack();\n this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']);\n if (this.environment.isSimple) {\n this.pushSource(['else { ', this.appendToBuffer('\\'\\'', undefined, true), ' }']);\n }\n }\n },\n\n // [appendEscaped]\n //\n // On stack, before: value, ...\n // On stack, after: ...\n //\n // Escape `value` and append it to the buffer\n appendEscaped: function appendEscaped() {\n this.pushSource(this.appendToBuffer([this.aliasable('this.escapeExpression'), '(', this.popStack(), ')']));\n },\n\n // [getContext]\n //\n // On stack, before: ...\n // On stack, after: ...\n // Compiler value, after: lastContext=depth\n //\n // Set the value of the `lastContext` compiler value to the depth\n getContext: function getContext(depth) {\n this.lastContext = depth;\n },\n\n // [pushContext]\n //\n // On stack, before: ...\n // On stack, after: currentContext, ...\n //\n // Pushes the value of the current context onto the stack.\n pushContext: function pushContext() {\n this.pushStackLiteral(this.contextName(this.lastContext));\n },\n\n // [lookupOnContext]\n //\n // On stack, before: ...\n // On stack, after: currentContext[name], ...\n //\n // Looks up the value of `name` on the current context and pushes\n // it onto the stack.\n lookupOnContext: function lookupOnContext(parts, falsy, scoped) {\n var i = 0;\n\n if (!scoped && this.options.compat && !this.lastContext) {\n // The depthed query is expected to handle the undefined logic for the root level that\n // is implemented below, so we evaluate that directly in compat mode\n this.push(this.depthedLookup(parts[i++]));\n } else {\n this.pushContext();\n }\n\n this.resolvePath('context', parts, i, falsy);\n },\n\n // [lookupBlockParam]\n //\n // On stack, before: ...\n // On stack, after: blockParam[name], ...\n //\n // Looks up the value of `parts` on the given block param and pushes\n // it onto the stack.\n lookupBlockParam: function lookupBlockParam(blockParamId, parts) {\n this.useBlockParams = true;\n\n this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']);\n this.resolvePath('context', parts, 1);\n },\n\n // [lookupData]\n //\n // On stack, before: ...\n // On stack, after: data, ...\n //\n // Push the data lookup operator\n lookupData: function lookupData(depth, parts) {\n if (!depth) {\n this.pushStackLiteral('data');\n } else {\n this.pushStackLiteral('this.data(data, ' + depth + ')');\n }\n\n this.resolvePath('data', parts, 0, true);\n },\n\n resolvePath: function resolvePath(type, parts, i, falsy) {\n var _this = this;\n\n if (this.options.strict || this.options.assumeObjects) {\n this.push(strictLookup(this.options.strict, this, parts, type));\n return;\n }\n\n var len = parts.length;\n for (; i < len; i++) {\n /*eslint-disable no-loop-func */\n this.replaceStack(function (current) {\n var lookup = _this.nameLookup(current, parts[i], type);\n // We want to ensure that zero and false are handled properly if the context (falsy flag)\n // needs to have the special handling for these values.\n if (!falsy) {\n return [' != null ? ', lookup, ' : ', current];\n } else {\n // Otherwise we can use generic falsy handling\n return [' && ', lookup];\n }\n });\n /*eslint-enable no-loop-func */\n }\n },\n\n // [resolvePossibleLambda]\n //\n // On stack, before: value, ...\n // On stack, after: resolved value, ...\n //\n // If the `value` is a lambda, replace it on the stack by\n // the return value of the lambda\n resolvePossibleLambda: function resolvePossibleLambda() {\n this.push([this.aliasable('this.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']);\n },\n\n // [pushStringParam]\n //\n // On stack, before: ...\n // On stack, after: string, currentContext, ...\n //\n // This opcode is designed for use in string mode, which\n // provides the string value of a parameter along with its\n // depth rather than resolving it immediately.\n pushStringParam: function pushStringParam(string, type) {\n this.pushContext();\n this.pushString(type);\n\n // If it's a subexpression, the string result\n // will be pushed after this opcode.\n if (type !== 'SubExpression') {\n if (typeof string === 'string') {\n this.pushString(string);\n } else {\n this.pushStackLiteral(string);\n }\n }\n },\n\n emptyHash: function emptyHash(omitEmpty) {\n if (this.trackIds) {\n this.push('{}'); // hashIds\n }\n if (this.stringParams) {\n this.push('{}'); // hashContexts\n this.push('{}'); // hashTypes\n }\n this.pushStackLiteral(omitEmpty ? 'undefined' : '{}');\n },\n pushHash: function pushHash() {\n if (this.hash) {\n this.hashes.push(this.hash);\n }\n this.hash = { values: [], types: [], contexts: [], ids: [] };\n },\n popHash: function popHash() {\n var hash = this.hash;\n this.hash = this.hashes.pop();\n\n if (this.trackIds) {\n this.push(this.objectLiteral(hash.ids));\n }\n if (this.stringParams) {\n this.push(this.objectLiteral(hash.contexts));\n this.push(this.objectLiteral(hash.types));\n }\n\n this.push(this.objectLiteral(hash.values));\n },\n\n // [pushString]\n //\n // On stack, before: ...\n // On stack, after: quotedString(string), ...\n //\n // Push a quoted version of `string` onto the stack\n pushString: function pushString(string) {\n this.pushStackLiteral(this.quotedString(string));\n },\n\n // [pushLiteral]\n //\n // On stack, before: ...\n // On stack, after: value, ...\n //\n // Pushes a value onto the stack. This operation prevents\n // the compiler from creating a temporary variable to hold\n // it.\n pushLiteral: function pushLiteral(value) {\n this.pushStackLiteral(value);\n },\n\n // [pushProgram]\n //\n // On stack, before: ...\n // On stack, after: program(guid), ...\n //\n // Push a program expression onto the stack. This takes\n // a compile-time guid and converts it into a runtime-accessible\n // expression.\n pushProgram: function pushProgram(guid) {\n if (guid != null) {\n this.pushStackLiteral(this.programExpression(guid));\n } else {\n this.pushStackLiteral(null);\n }\n },\n\n // [invokeHelper]\n //\n // On stack, before: hash, inverse, program, params..., ...\n // On stack, after: result of helper invocation\n //\n // Pops off the helper's parameters, invokes the helper,\n // and pushes the helper's return value onto the stack.\n //\n // If the helper is not found, `helperMissing` is called.\n invokeHelper: function invokeHelper(paramSize, name, isSimple) {\n var nonHelper = this.popStack(),\n helper = this.setupHelper(paramSize, name),\n simple = isSimple ? [helper.name, ' || '] : '';\n\n var lookup = ['('].concat(simple, nonHelper);\n if (!this.options.strict) {\n lookup.push(' || ', this.aliasable('helpers.helperMissing'));\n }\n lookup.push(')');\n\n this.push(this.source.functionCall(lookup, 'call', helper.callParams));\n },\n\n // [invokeKnownHelper]\n //\n // On stack, before: hash, inverse, program, params..., ...\n // On stack, after: result of helper invocation\n //\n // This operation is used when the helper is known to exist,\n // so a `helperMissing` fallback is not required.\n invokeKnownHelper: function invokeKnownHelper(paramSize, name) {\n var helper = this.setupHelper(paramSize, name);\n this.push(this.source.functionCall(helper.name, 'call', helper.callParams));\n },\n\n // [invokeAmbiguous]\n //\n // On stack, before: hash, inverse, program, params..., ...\n // On stack, after: result of disambiguation\n //\n // This operation is used when an expression like `{{foo}}`\n // is provided, but we don't know at compile-time whether it\n // is a helper or a path.\n //\n // This operation emits more code than the other options,\n // and can be avoided by passing the `knownHelpers` and\n // `knownHelpersOnly` flags at compile-time.\n invokeAmbiguous: function invokeAmbiguous(name, helperCall) {\n this.useRegister('helper');\n\n var nonHelper = this.popStack();\n\n this.emptyHash();\n var helper = this.setupHelper(0, name, helperCall);\n\n var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper');\n\n var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')'];\n if (!this.options.strict) {\n lookup[0] = '(helper = ';\n lookup.push(' != null ? helper : ', this.aliasable('helpers.helperMissing'));\n }\n\n this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('\"function\"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']);\n },\n\n // [invokePartial]\n //\n // On stack, before: context, ...\n // On stack after: result of partial invocation\n //\n // This operation pops off a context, invokes a partial with that context,\n // and pushes the result of the invocation back.\n invokePartial: function invokePartial(isDynamic, name, indent) {\n var params = [],\n options = this.setupParams(name, 1, params, false);\n\n if (isDynamic) {\n name = this.popStack();\n delete options.name;\n }\n\n if (indent) {\n options.indent = JSON.stringify(indent);\n }\n options.helpers = 'helpers';\n options.partials = 'partials';\n\n if (!isDynamic) {\n params.unshift(this.nameLookup('partials', name, 'partial'));\n } else {\n params.unshift(name);\n }\n\n if (this.options.compat) {\n options.depths = 'depths';\n }\n options = this.objectLiteral(options);\n params.push(options);\n\n this.push(this.source.functionCall('this.invokePartial', '', params));\n },\n\n // [assignToHash]\n //\n // On stack, before: value, ..., hash, ...\n // On stack, after: ..., hash, ...\n //\n // Pops a value off the stack and assigns it to the current hash\n assignToHash: function assignToHash(key) {\n var value = this.popStack(),\n context = undefined,\n type = undefined,\n id = undefined;\n\n if (this.trackIds) {\n id = this.popStack();\n }\n if (this.stringParams) {\n type = this.popStack();\n context = this.popStack();\n }\n\n var hash = this.hash;\n if (context) {\n hash.contexts[key] = context;\n }\n if (type) {\n hash.types[key] = type;\n }\n if (id) {\n hash.ids[key] = id;\n }\n hash.values[key] = value;\n },\n\n pushId: function pushId(type, name, child) {\n if (type === 'BlockParam') {\n this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : ''));\n } else if (type === 'PathExpression') {\n this.pushString(name);\n } else if (type === 'SubExpression') {\n this.pushStackLiteral('true');\n } else {\n this.pushStackLiteral('null');\n }\n },\n\n // HELPERS\n\n compiler: JavaScriptCompiler,\n\n compileChildren: function compileChildren(environment, options) {\n var children = environment.children,\n child = undefined,\n compiler = undefined;\n\n for (var i = 0, l = children.length; i < l; i++) {\n child = children[i];\n compiler = new this.compiler(); // eslint-disable-line new-cap\n\n var index = this.matchExistingProgram(child);\n\n if (index == null) {\n this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children\n index = this.context.programs.length;\n child.index = index;\n child.name = 'program' + index;\n this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile);\n this.context.environments[index] = child;\n\n this.useDepths = this.useDepths || compiler.useDepths;\n this.useBlockParams = this.useBlockParams || compiler.useBlockParams;\n } else {\n child.index = index;\n child.name = 'program' + index;\n\n this.useDepths = this.useDepths || child.useDepths;\n this.useBlockParams = this.useBlockParams || child.useBlockParams;\n }\n }\n },\n matchExistingProgram: function matchExistingProgram(child) {\n for (var i = 0, len = this.context.environments.length; i < len; i++) {\n var environment = this.context.environments[i];\n if (environment && environment.equals(child)) {\n return i;\n }\n }\n },\n\n programExpression: function programExpression(guid) {\n var child = this.environment.children[guid],\n programParams = [child.index, 'data', child.blockParams];\n\n if (this.useBlockParams || this.useDepths) {\n programParams.push('blockParams');\n }\n if (this.useDepths) {\n programParams.push('depths');\n }\n\n return 'this.program(' + programParams.join(', ') + ')';\n },\n\n useRegister: function useRegister(name) {\n if (!this.registers[name]) {\n this.registers[name] = true;\n this.registers.list.push(name);\n }\n },\n\n push: function push(expr) {\n if (!(expr instanceof Literal)) {\n expr = this.source.wrap(expr);\n }\n\n this.inlineStack.push(expr);\n return expr;\n },\n\n pushStackLiteral: function pushStackLiteral(item) {\n this.push(new Literal(item));\n },\n\n pushSource: function pushSource(source) {\n if (this.pendingContent) {\n this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation));\n this.pendingContent = undefined;\n }\n\n if (source) {\n this.source.push(source);\n }\n },\n\n replaceStack: function replaceStack(callback) {\n var prefix = ['('],\n stack = undefined,\n createdStack = undefined,\n usedLiteral = undefined;\n\n /* istanbul ignore next */\n if (!this.isInline()) {\n throw new _Exception2['default']('replaceStack on non-inline');\n }\n\n // We want to merge the inline statement into the replacement statement via ','\n var top = this.popStack(true);\n\n if (top instanceof Literal) {\n // Literals do not need to be inlined\n stack = [top.value];\n prefix = ['(', stack];\n usedLiteral = true;\n } else {\n // Get or create the current stack name for use by the inline\n createdStack = true;\n var _name = this.incrStack();\n\n prefix = ['((', this.push(_name), ' = ', top, ')'];\n stack = this.topStack();\n }\n\n var item = callback.call(this, stack);\n\n if (!usedLiteral) {\n this.popStack();\n }\n if (createdStack) {\n this.stackSlot--;\n }\n this.push(prefix.concat(item, ')'));\n },\n\n incrStack: function incrStack() {\n this.stackSlot++;\n if (this.stackSlot > this.stackVars.length) {\n this.stackVars.push('stack' + this.stackSlot);\n }\n return this.topStackName();\n },\n topStackName: function topStackName() {\n return 'stack' + this.stackSlot;\n },\n flushInline: function flushInline() {\n var inlineStack = this.inlineStack;\n this.inlineStack = [];\n for (var i = 0, len = inlineStack.length; i < len; i++) {\n var entry = inlineStack[i];\n /* istanbul ignore if */\n if (entry instanceof Literal) {\n this.compileStack.push(entry);\n } else {\n var stack = this.incrStack();\n this.pushSource([stack, ' = ', entry, ';']);\n this.compileStack.push(stack);\n }\n }\n },\n isInline: function isInline() {\n return this.inlineStack.length;\n },\n\n popStack: function popStack(wrapped) {\n var inline = this.isInline(),\n item = (inline ? this.inlineStack : this.compileStack).pop();\n\n if (!wrapped && item instanceof Literal) {\n return item.value;\n } else {\n if (!inline) {\n /* istanbul ignore next */\n if (!this.stackSlot) {\n throw new _Exception2['default']('Invalid stack pop');\n }\n this.stackSlot--;\n }\n return item;\n }\n },\n\n topStack: function topStack() {\n var stack = this.isInline() ? this.inlineStack : this.compileStack,\n item = stack[stack.length - 1];\n\n /* istanbul ignore if */\n if (item instanceof Literal) {\n return item.value;\n } else {\n return item;\n }\n },\n\n contextName: function contextName(context) {\n if (this.useDepths && context) {\n return 'depths[' + context + ']';\n } else {\n return 'depth' + context;\n }\n },\n\n quotedString: function quotedString(str) {\n return this.source.quotedString(str);\n },\n\n objectLiteral: function objectLiteral(obj) {\n return this.source.objectLiteral(obj);\n },\n\n aliasable: function aliasable(name) {\n var ret = this.aliases[name];\n if (ret) {\n ret.referenceCount++;\n return ret;\n }\n\n ret = this.aliases[name] = this.source.wrap(name);\n ret.aliasable = true;\n ret.referenceCount = 1;\n\n return ret;\n },\n\n setupHelper: function setupHelper(paramSize, name, blockHelper) {\n var params = [],\n paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper);\n var foundHelper = this.nameLookup('helpers', name, 'helper');\n\n return {\n params: params,\n paramsInit: paramsInit,\n name: foundHelper,\n callParams: [this.contextName(0)].concat(params)\n };\n },\n\n setupParams: function setupParams(helper, paramSize, params) {\n var options = {},\n contexts = [],\n types = [],\n ids = [],\n param = undefined;\n\n options.name = this.quotedString(helper);\n options.hash = this.popStack();\n\n if (this.trackIds) {\n options.hashIds = this.popStack();\n }\n if (this.stringParams) {\n options.hashTypes = this.popStack();\n options.hashContexts = this.popStack();\n }\n\n var inverse = this.popStack(),\n program = this.popStack();\n\n // Avoid setting fn and inverse if neither are set. This allows\n // helpers to do a check for `if (options.fn)`\n if (program || inverse) {\n options.fn = program || 'this.noop';\n options.inverse = inverse || 'this.noop';\n }\n\n // The parameters go on to the stack in order (making sure that they are evaluated in order)\n // so we need to pop them off the stack in reverse order\n var i = paramSize;\n while (i--) {\n param = this.popStack();\n params[i] = param;\n\n if (this.trackIds) {\n ids[i] = this.popStack();\n }\n if (this.stringParams) {\n types[i] = this.popStack();\n contexts[i] = this.popStack();\n }\n }\n\n if (this.trackIds) {\n options.ids = this.source.generateArray(ids);\n }\n if (this.stringParams) {\n options.types = this.source.generateArray(types);\n options.contexts = this.source.generateArray(contexts);\n }\n\n if (this.options.data) {\n options.data = 'data';\n }\n if (this.useBlockParams) {\n options.blockParams = 'blockParams';\n }\n return options;\n },\n\n setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) {\n var options = this.setupParams(helper, paramSize, params, true);\n options = this.objectLiteral(options);\n if (useRegister) {\n this.useRegister('options');\n params.push('options');\n return ['options=', options];\n } else {\n params.push(options);\n return '';\n }\n }\n};\n\n(function () {\n var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' ');\n\n var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {};\n\n for (var i = 0, l = reservedWords.length; i < l; i++) {\n compilerWords[reservedWords[i]] = true;\n }\n})();\n\nJavaScriptCompiler.isValidJavaScriptVariableName = function (name) {\n return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name);\n};\n\nfunction strictLookup(requireTerminal, compiler, parts, type) {\n var stack = compiler.popStack(),\n i = 0,\n len = parts.length;\n if (requireTerminal) {\n len--;\n }\n\n for (; i < len; i++) {\n stack = compiler.nameLookup(stack, parts[i], type);\n }\n\n if (requireTerminal) {\n return [compiler.aliasable('this.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')'];\n } else {\n return stack;\n }\n}\n\nexports['default'] = JavaScriptCompiler;\nmodule.exports = exports['default'];\n},{\"../base\":4,\"../exception\":15,\"../utils\":19,\"./code-gen\":7}],11:[function(require,module,exports){\n\"use strict\";\n\nexports.__esModule = true;\n/* istanbul ignore next */\n/* Jison generated parser */\nvar handlebars = (function () {\n var parser = { trace: function trace() {},\n yy: {},\n symbols_: { error: 2, root: 3, program: 4, EOF: 5, program_repetition0: 6, statement: 7, mustache: 8, block: 9, rawBlock: 10, partial: 11, content: 12, COMMENT: 13, CONTENT: 14, openRawBlock: 15, END_RAW_BLOCK: 16, OPEN_RAW_BLOCK: 17, helperName: 18, openRawBlock_repetition0: 19, openRawBlock_option0: 20, CLOSE_RAW_BLOCK: 21, openBlock: 22, block_option0: 23, closeBlock: 24, openInverse: 25, block_option1: 26, OPEN_BLOCK: 27, openBlock_repetition0: 28, openBlock_option0: 29, openBlock_option1: 30, CLOSE: 31, OPEN_INVERSE: 32, openInverse_repetition0: 33, openInverse_option0: 34, openInverse_option1: 35, openInverseChain: 36, OPEN_INVERSE_CHAIN: 37, openInverseChain_repetition0: 38, openInverseChain_option0: 39, openInverseChain_option1: 40, inverseAndProgram: 41, INVERSE: 42, inverseChain: 43, inverseChain_option0: 44, OPEN_ENDBLOCK: 45, OPEN: 46, mustache_repetition0: 47, mustache_option0: 48, OPEN_UNESCAPED: 49, mustache_repetition1: 50, mustache_option1: 51, CLOSE_UNESCAPED: 52, OPEN_PARTIAL: 53, partialName: 54, partial_repetition0: 55, partial_option0: 56, param: 57, sexpr: 58, OPEN_SEXPR: 59, sexpr_repetition0: 60, sexpr_option0: 61, CLOSE_SEXPR: 62, hash: 63, hash_repetition_plus0: 64, hashSegment: 65, ID: 66, EQUALS: 67, blockParams: 68, OPEN_BLOCK_PARAMS: 69, blockParams_repetition_plus0: 70, CLOSE_BLOCK_PARAMS: 71, path: 72, dataName: 73, STRING: 74, NUMBER: 75, BOOLEAN: 76, UNDEFINED: 77, NULL: 78, DATA: 79, pathSegments: 80, SEP: 81, $accept: 0, $end: 1 },\n terminals_: { 2: \"error\", 5: \"EOF\", 13: \"COMMENT\", 14: \"CONTENT\", 16: \"END_RAW_BLOCK\", 17: \"OPEN_RAW_BLOCK\", 21: \"CLOSE_RAW_BLOCK\", 27: \"OPEN_BLOCK\", 31: \"CLOSE\", 32: \"OPEN_INVERSE\", 37: \"OPEN_INVERSE_CHAIN\", 42: \"INVERSE\", 45: \"OPEN_ENDBLOCK\", 46: \"OPEN\", 49: \"OPEN_UNESCAPED\", 52: \"CLOSE_UNESCAPED\", 53: \"OPEN_PARTIAL\", 59: \"OPEN_SEXPR\", 62: \"CLOSE_SEXPR\", 66: \"ID\", 67: \"EQUALS\", 69: \"OPEN_BLOCK_PARAMS\", 71: \"CLOSE_BLOCK_PARAMS\", 74: \"STRING\", 75: \"NUMBER\", 76: \"BOOLEAN\", 77: \"UNDEFINED\", 78: \"NULL\", 79: \"DATA\", 81: \"SEP\" },\n productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [12, 1], [10, 3], [15, 5], [9, 4], [9, 4], [22, 6], [25, 6], [36, 6], [41, 2], [43, 3], [43, 1], [24, 3], [8, 5], [8, 5], [11, 5], [57, 1], [57, 1], [58, 5], [63, 1], [65, 3], [68, 3], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [54, 1], [54, 1], [73, 2], [72, 1], [80, 3], [80, 1], [6, 0], [6, 2], [19, 0], [19, 2], [20, 0], [20, 1], [23, 0], [23, 1], [26, 0], [26, 1], [28, 0], [28, 2], [29, 0], [29, 1], [30, 0], [30, 1], [33, 0], [33, 2], [34, 0], [34, 1], [35, 0], [35, 1], [38, 0], [38, 2], [39, 0], [39, 1], [40, 0], [40, 1], [44, 0], [44, 1], [47, 0], [47, 2], [48, 0], [48, 1], [50, 0], [50, 2], [51, 0], [51, 1], [55, 0], [55, 2], [56, 0], [56, 1], [60, 0], [60, 2], [61, 0], [61, 1], [64, 1], [64, 2], [70, 1], [70, 2]],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {\n\n var $0 = $$.length - 1;\n switch (yystate) {\n case 1:\n return $$[$0 - 1];\n break;\n case 2:\n this.$ = new yy.Program($$[$0], null, {}, yy.locInfo(this._$));\n break;\n case 3:\n this.$ = $$[$0];\n break;\n case 4:\n this.$ = $$[$0];\n break;\n case 5:\n this.$ = $$[$0];\n break;\n case 6:\n this.$ = $$[$0];\n break;\n case 7:\n this.$ = $$[$0];\n break;\n case 8:\n this.$ = new yy.CommentStatement(yy.stripComment($$[$0]), yy.stripFlags($$[$0], $$[$0]), yy.locInfo(this._$));\n break;\n case 9:\n this.$ = new yy.ContentStatement($$[$0], yy.locInfo(this._$));\n break;\n case 10:\n this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);\n break;\n case 11:\n this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] };\n break;\n case 12:\n this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$);\n break;\n case 13:\n this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$);\n break;\n case 14:\n this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };\n break;\n case 15:\n this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };\n break;\n case 16:\n this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };\n break;\n case 17:\n this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] };\n break;\n case 18:\n var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$),\n program = new yy.Program([inverse], null, {}, yy.locInfo(this._$));\n program.chained = true;\n\n this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true };\n\n break;\n case 19:\n this.$ = $$[$0];\n break;\n case 20:\n this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) };\n break;\n case 21:\n this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);\n break;\n case 22:\n this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);\n break;\n case 23:\n this.$ = new yy.PartialStatement($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.stripFlags($$[$0 - 4], $$[$0]), yy.locInfo(this._$));\n break;\n case 24:\n this.$ = $$[$0];\n break;\n case 25:\n this.$ = $$[$0];\n break;\n case 26:\n this.$ = new yy.SubExpression($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.locInfo(this._$));\n break;\n case 27:\n this.$ = new yy.Hash($$[$0], yy.locInfo(this._$));\n break;\n case 28:\n this.$ = new yy.HashPair(yy.id($$[$0 - 2]), $$[$0], yy.locInfo(this._$));\n break;\n case 29:\n this.$ = yy.id($$[$0 - 1]);\n break;\n case 30:\n this.$ = $$[$0];\n break;\n case 31:\n this.$ = $$[$0];\n break;\n case 32:\n this.$ = new yy.StringLiteral($$[$0], yy.locInfo(this._$));\n break;\n case 33:\n this.$ = new yy.NumberLiteral($$[$0], yy.locInfo(this._$));\n break;\n case 34:\n this.$ = new yy.BooleanLiteral($$[$0], yy.locInfo(this._$));\n break;\n case 35:\n this.$ = new yy.UndefinedLiteral(yy.locInfo(this._$));\n break;\n case 36:\n this.$ = new yy.NullLiteral(yy.locInfo(this._$));\n break;\n case 37:\n this.$ = $$[$0];\n break;\n case 38:\n this.$ = $$[$0];\n break;\n case 39:\n this.$ = yy.preparePath(true, $$[$0], this._$);\n break;\n case 40:\n this.$ = yy.preparePath(false, $$[$0], this._$);\n break;\n case 41:\n $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2];\n break;\n case 42:\n this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }];\n break;\n case 43:\n this.$ = [];\n break;\n case 44:\n $$[$0 - 1].push($$[$0]);\n break;\n case 45:\n this.$ = [];\n break;\n case 46:\n $$[$0 - 1].push($$[$0]);\n break;\n case 53:\n this.$ = [];\n break;\n case 54:\n $$[$0 - 1].push($$[$0]);\n break;\n case 59:\n this.$ = [];\n break;\n case 60:\n $$[$0 - 1].push($$[$0]);\n break;\n case 65:\n this.$ = [];\n break;\n case 66:\n $$[$0 - 1].push($$[$0]);\n break;\n case 73:\n this.$ = [];\n break;\n case 74:\n $$[$0 - 1].push($$[$0]);\n break;\n case 77:\n this.$ = [];\n break;\n case 78:\n $$[$0 - 1].push($$[$0]);\n break;\n case 81:\n this.$ = [];\n break;\n case 82:\n $$[$0 - 1].push($$[$0]);\n break;\n case 85:\n this.$ = [];\n break;\n case 86:\n $$[$0 - 1].push($$[$0]);\n break;\n case 89:\n this.$ = [$$[$0]];\n break;\n case 90:\n $$[$0 - 1].push($$[$0]);\n break;\n case 91:\n this.$ = [$$[$0]];\n break;\n case 92:\n $$[$0 - 1].push($$[$0]);\n break;\n }\n },\n table: [{ 3: 1, 4: 2, 5: [2, 43], 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: [1, 11], 14: [1, 18], 15: 16, 17: [1, 21], 22: 14, 25: 15, 27: [1, 19], 32: [1, 20], 37: [2, 2], 42: [2, 2], 45: [2, 2], 46: [1, 12], 49: [1, 13], 53: [1, 17] }, { 1: [2, 1] }, { 5: [2, 44], 13: [2, 44], 14: [2, 44], 17: [2, 44], 27: [2, 44], 32: [2, 44], 37: [2, 44], 42: [2, 44], 45: [2, 44], 46: [2, 44], 49: [2, 44], 53: [2, 44] }, { 5: [2, 3], 13: [2, 3], 14: [2, 3], 17: [2, 3], 27: [2, 3], 32: [2, 3], 37: [2, 3], 42: [2, 3], 45: [2, 3], 46: [2, 3], 49: [2, 3], 53: [2, 3] }, { 5: [2, 4], 13: [2, 4], 14: [2, 4], 17: [2, 4], 27: [2, 4], 32: [2, 4], 37: [2, 4], 42: [2, 4], 45: [2, 4], 46: [2, 4], 49: [2, 4], 53: [2, 4] }, { 5: [2, 5], 13: [2, 5], 14: [2, 5], 17: [2, 5], 27: [2, 5], 32: [2, 5], 37: [2, 5], 42: [2, 5], 45: [2, 5], 46: [2, 5], 49: [2, 5], 53: [2, 5] }, { 5: [2, 6], 13: [2, 6], 14: [2, 6], 17: [2, 6], 27: [2, 6], 32: [2, 6], 37: [2, 6], 42: [2, 6], 45: [2, 6], 46: [2, 6], 49: [2, 6], 53: [2, 6] }, { 5: [2, 7], 13: [2, 7], 14: [2, 7], 17: [2, 7], 27: [2, 7], 32: [2, 7], 37: [2, 7], 42: [2, 7], 45: [2, 7], 46: [2, 7], 49: [2, 7], 53: [2, 7] }, { 5: [2, 8], 13: [2, 8], 14: [2, 8], 17: [2, 8], 27: [2, 8], 32: [2, 8], 37: [2, 8], 42: [2, 8], 45: [2, 8], 46: [2, 8], 49: [2, 8], 53: [2, 8] }, { 18: 22, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 33, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 34, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 4: 35, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 12: 36, 14: [1, 18] }, { 18: 38, 54: 37, 58: 39, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 9], 13: [2, 9], 14: [2, 9], 16: [2, 9], 17: [2, 9], 27: [2, 9], 32: [2, 9], 37: [2, 9], 42: [2, 9], 45: [2, 9], 46: [2, 9], 49: [2, 9], 53: [2, 9] }, { 18: 41, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 42, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 43, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [2, 73], 47: 44, 59: [2, 73], 66: [2, 73], 74: [2, 73], 75: [2, 73], 76: [2, 73], 77: [2, 73], 78: [2, 73], 79: [2, 73] }, { 21: [2, 30], 31: [2, 30], 52: [2, 30], 59: [2, 30], 62: [2, 30], 66: [2, 30], 69: [2, 30], 74: [2, 30], 75: [2, 30], 76: [2, 30], 77: [2, 30], 78: [2, 30], 79: [2, 30] }, { 21: [2, 31], 31: [2, 31], 52: [2, 31], 59: [2, 31], 62: [2, 31], 66: [2, 31], 69: [2, 31], 74: [2, 31], 75: [2, 31], 76: [2, 31], 77: [2, 31], 78: [2, 31], 79: [2, 31] }, { 21: [2, 32], 31: [2, 32], 52: [2, 32], 59: [2, 32], 62: [2, 32], 66: [2, 32], 69: [2, 32], 74: [2, 32], 75: [2, 32], 76: [2, 32], 77: [2, 32], 78: [2, 32], 79: [2, 32] }, { 21: [2, 33], 31: [2, 33], 52: [2, 33], 59: [2, 33], 62: [2, 33], 66: [2, 33], 69: [2, 33], 74: [2, 33], 75: [2, 33], 76: [2, 33], 77: [2, 33], 78: [2, 33], 79: [2, 33] }, { 21: [2, 34], 31: [2, 34], 52: [2, 34], 59: [2, 34], 62: [2, 34], 66: [2, 34], 69: [2, 34], 74: [2, 34], 75: [2, 34], 76: [2, 34], 77: [2, 34], 78: [2, 34], 79: [2, 34] }, { 21: [2, 35], 31: [2, 35], 52: [2, 35], 59: [2, 35], 62: [2, 35], 66: [2, 35], 69: [2, 35], 74: [2, 35], 75: [2, 35], 76: [2, 35], 77: [2, 35], 78: [2, 35], 79: [2, 35] }, { 21: [2, 36], 31: [2, 36], 52: [2, 36], 59: [2, 36], 62: [2, 36], 66: [2, 36], 69: [2, 36], 74: [2, 36], 75: [2, 36], 76: [2, 36], 77: [2, 36], 78: [2, 36], 79: [2, 36] }, { 21: [2, 40], 31: [2, 40], 52: [2, 40], 59: [2, 40], 62: [2, 40], 66: [2, 40], 69: [2, 40], 74: [2, 40], 75: [2, 40], 76: [2, 40], 77: [2, 40], 78: [2, 40], 79: [2, 40], 81: [1, 45] }, { 66: [1, 32], 80: 46 }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 50: 47, 52: [2, 77], 59: [2, 77], 66: [2, 77], 74: [2, 77], 75: [2, 77], 76: [2, 77], 77: [2, 77], 78: [2, 77], 79: [2, 77] }, { 23: 48, 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 49, 45: [2, 49] }, { 26: 54, 41: 55, 42: [1, 53], 45: [2, 51] }, { 16: [1, 56] }, { 31: [2, 81], 55: 57, 59: [2, 81], 66: [2, 81], 74: [2, 81], 75: [2, 81], 76: [2, 81], 77: [2, 81], 78: [2, 81], 79: [2, 81] }, { 31: [2, 37], 59: [2, 37], 66: [2, 37], 74: [2, 37], 75: [2, 37], 76: [2, 37], 77: [2, 37], 78: [2, 37], 79: [2, 37] }, { 31: [2, 38], 59: [2, 38], 66: [2, 38], 74: [2, 38], 75: [2, 38], 76: [2, 38], 77: [2, 38], 78: [2, 38], 79: [2, 38] }, { 18: 58, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 28: 59, 31: [2, 53], 59: [2, 53], 66: [2, 53], 69: [2, 53], 74: [2, 53], 75: [2, 53], 76: [2, 53], 77: [2, 53], 78: [2, 53], 79: [2, 53] }, { 31: [2, 59], 33: 60, 59: [2, 59], 66: [2, 59], 69: [2, 59], 74: [2, 59], 75: [2, 59], 76: [2, 59], 77: [2, 59], 78: [2, 59], 79: [2, 59] }, { 19: 61, 21: [2, 45], 59: [2, 45], 66: [2, 45], 74: [2, 45], 75: [2, 45], 76: [2, 45], 77: [2, 45], 78: [2, 45], 79: [2, 45] }, { 18: 65, 31: [2, 75], 48: 62, 57: 63, 58: 66, 59: [1, 40], 63: 64, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 66: [1, 70] }, { 21: [2, 39], 31: [2, 39], 52: [2, 39], 59: [2, 39], 62: [2, 39], 66: [2, 39], 69: [2, 39], 74: [2, 39], 75: [2, 39], 76: [2, 39], 77: [2, 39], 78: [2, 39], 79: [2, 39], 81: [1, 45] }, { 18: 65, 51: 71, 52: [2, 79], 57: 72, 58: 66, 59: [1, 40], 63: 73, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 24: 74, 45: [1, 75] }, { 45: [2, 50] }, { 4: 76, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 45: [2, 19] }, { 18: 77, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 78, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 24: 79, 45: [1, 75] }, { 45: [2, 52] }, { 5: [2, 10], 13: [2, 10], 14: [2, 10], 17: [2, 10], 27: [2, 10], 32: [2, 10], 37: [2, 10], 42: [2, 10], 45: [2, 10], 46: [2, 10], 49: [2, 10], 53: [2, 10] }, { 18: 65, 31: [2, 83], 56: 80, 57: 81, 58: 66, 59: [1, 40], 63: 82, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 59: [2, 85], 60: 83, 62: [2, 85], 66: [2, 85], 74: [2, 85], 75: [2, 85], 76: [2, 85], 77: [2, 85], 78: [2, 85], 79: [2, 85] }, { 18: 65, 29: 84, 31: [2, 55], 57: 85, 58: 66, 59: [1, 40], 63: 86, 64: 67, 65: 68, 66: [1, 69], 69: [2, 55], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 31: [2, 61], 34: 87, 57: 88, 58: 66, 59: [1, 40], 63: 89, 64: 67, 65: 68, 66: [1, 69], 69: [2, 61], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 20: 90, 21: [2, 47], 57: 91, 58: 66, 59: [1, 40], 63: 92, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [1, 93] }, { 31: [2, 74], 59: [2, 74], 66: [2, 74], 74: [2, 74], 75: [2, 74], 76: [2, 74], 77: [2, 74], 78: [2, 74], 79: [2, 74] }, { 31: [2, 76] }, { 21: [2, 24], 31: [2, 24], 52: [2, 24], 59: [2, 24], 62: [2, 24], 66: [2, 24], 69: [2, 24], 74: [2, 24], 75: [2, 24], 76: [2, 24], 77: [2, 24], 78: [2, 24], 79: [2, 24] }, { 21: [2, 25], 31: [2, 25], 52: [2, 25], 59: [2, 25], 62: [2, 25], 66: [2, 25], 69: [2, 25], 74: [2, 25], 75: [2, 25], 76: [2, 25], 77: [2, 25], 78: [2, 25], 79: [2, 25] }, { 21: [2, 27], 31: [2, 27], 52: [2, 27], 62: [2, 27], 65: 94, 66: [1, 95], 69: [2, 27] }, { 21: [2, 89], 31: [2, 89], 52: [2, 89], 62: [2, 89], 66: [2, 89], 69: [2, 89] }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 67: [1, 96], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 21: [2, 41], 31: [2, 41], 52: [2, 41], 59: [2, 41], 62: [2, 41], 66: [2, 41], 69: [2, 41], 74: [2, 41], 75: [2, 41], 76: [2, 41], 77: [2, 41], 78: [2, 41], 79: [2, 41], 81: [2, 41] }, { 52: [1, 97] }, { 52: [2, 78], 59: [2, 78], 66: [2, 78], 74: [2, 78], 75: [2, 78], 76: [2, 78], 77: [2, 78], 78: [2, 78], 79: [2, 78] }, { 52: [2, 80] }, { 5: [2, 12], 13: [2, 12], 14: [2, 12], 17: [2, 12], 27: [2, 12], 32: [2, 12], 37: [2, 12], 42: [2, 12], 45: [2, 12], 46: [2, 12], 49: [2, 12], 53: [2, 12] }, { 18: 98, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 100, 44: 99, 45: [2, 71] }, { 31: [2, 65], 38: 101, 59: [2, 65], 66: [2, 65], 69: [2, 65], 74: [2, 65], 75: [2, 65], 76: [2, 65], 77: [2, 65], 78: [2, 65], 79: [2, 65] }, { 45: [2, 17] }, { 5: [2, 13], 13: [2, 13], 14: [2, 13], 17: [2, 13], 27: [2, 13], 32: [2, 13], 37: [2, 13], 42: [2, 13], 45: [2, 13], 46: [2, 13], 49: [2, 13], 53: [2, 13] }, { 31: [1, 102] }, { 31: [2, 82], 59: [2, 82], 66: [2, 82], 74: [2, 82], 75: [2, 82], 76: [2, 82], 77: [2, 82], 78: [2, 82], 79: [2, 82] }, { 31: [2, 84] }, { 18: 65, 57: 104, 58: 66, 59: [1, 40], 61: 103, 62: [2, 87], 63: 105, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 30: 106, 31: [2, 57], 68: 107, 69: [1, 108] }, { 31: [2, 54], 59: [2, 54], 66: [2, 54], 69: [2, 54], 74: [2, 54], 75: [2, 54], 76: [2, 54], 77: [2, 54], 78: [2, 54], 79: [2, 54] }, { 31: [2, 56], 69: [2, 56] }, { 31: [2, 63], 35: 109, 68: 110, 69: [1, 108] }, { 31: [2, 60], 59: [2, 60], 66: [2, 60], 69: [2, 60], 74: [2, 60], 75: [2, 60], 76: [2, 60], 77: [2, 60], 78: [2, 60], 79: [2, 60] }, { 31: [2, 62], 69: [2, 62] }, { 21: [1, 111] }, { 21: [2, 46], 59: [2, 46], 66: [2, 46], 74: [2, 46], 75: [2, 46], 76: [2, 46], 77: [2, 46], 78: [2, 46], 79: [2, 46] }, { 21: [2, 48] }, { 5: [2, 21], 13: [2, 21], 14: [2, 21], 17: [2, 21], 27: [2, 21], 32: [2, 21], 37: [2, 21], 42: [2, 21], 45: [2, 21], 46: [2, 21], 49: [2, 21], 53: [2, 21] }, { 21: [2, 90], 31: [2, 90], 52: [2, 90], 62: [2, 90], 66: [2, 90], 69: [2, 90] }, { 67: [1, 96] }, { 18: 65, 57: 112, 58: 66, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 22], 13: [2, 22], 14: [2, 22], 17: [2, 22], 27: [2, 22], 32: [2, 22], 37: [2, 22], 42: [2, 22], 45: [2, 22], 46: [2, 22], 49: [2, 22], 53: [2, 22] }, { 31: [1, 113] }, { 45: [2, 18] }, { 45: [2, 72] }, { 18: 65, 31: [2, 67], 39: 114, 57: 115, 58: 66, 59: [1, 40], 63: 116, 64: 67, 65: 68, 66: [1, 69], 69: [2, 67], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 23], 13: [2, 23], 14: [2, 23], 17: [2, 23], 27: [2, 23], 32: [2, 23], 37: [2, 23], 42: [2, 23], 45: [2, 23], 46: [2, 23], 49: [2, 23], 53: [2, 23] }, { 62: [1, 117] }, { 59: [2, 86], 62: [2, 86], 66: [2, 86], 74: [2, 86], 75: [2, 86], 76: [2, 86], 77: [2, 86], 78: [2, 86], 79: [2, 86] }, { 62: [2, 88] }, { 31: [1, 118] }, { 31: [2, 58] }, { 66: [1, 120], 70: 119 }, { 31: [1, 121] }, { 31: [2, 64] }, { 14: [2, 11] }, { 21: [2, 28], 31: [2, 28], 52: [2, 28], 62: [2, 28], 66: [2, 28], 69: [2, 28] }, { 5: [2, 20], 13: [2, 20], 14: [2, 20], 17: [2, 20], 27: [2, 20], 32: [2, 20], 37: [2, 20], 42: [2, 20], 45: [2, 20], 46: [2, 20], 49: [2, 20], 53: [2, 20] }, { 31: [2, 69], 40: 122, 68: 123, 69: [1, 108] }, { 31: [2, 66], 59: [2, 66], 66: [2, 66], 69: [2, 66], 74: [2, 66], 75: [2, 66], 76: [2, 66], 77: [2, 66], 78: [2, 66], 79: [2, 66] }, { 31: [2, 68], 69: [2, 68] }, { 21: [2, 26], 31: [2, 26], 52: [2, 26], 59: [2, 26], 62: [2, 26], 66: [2, 26], 69: [2, 26], 74: [2, 26], 75: [2, 26], 76: [2, 26], 77: [2, 26], 78: [2, 26], 79: [2, 26] }, { 13: [2, 14], 14: [2, 14], 17: [2, 14], 27: [2, 14], 32: [2, 14], 37: [2, 14], 42: [2, 14], 45: [2, 14], 46: [2, 14], 49: [2, 14], 53: [2, 14] }, { 66: [1, 125], 71: [1, 124] }, { 66: [2, 91], 71: [2, 91] }, { 13: [2, 15], 14: [2, 15], 17: [2, 15], 27: [2, 15], 32: [2, 15], 42: [2, 15], 45: [2, 15], 46: [2, 15], 49: [2, 15], 53: [2, 15] }, { 31: [1, 126] }, { 31: [2, 70] }, { 31: [2, 29] }, { 66: [2, 92], 71: [2, 92] }, { 13: [2, 16], 14: [2, 16], 17: [2, 16], 27: [2, 16], 32: [2, 16], 37: [2, 16], 42: [2, 16], 45: [2, 16], 46: [2, 16], 49: [2, 16], 53: [2, 16] }],\n defaultActions: { 4: [2, 1], 49: [2, 50], 51: [2, 19], 55: [2, 52], 64: [2, 76], 73: [2, 80], 78: [2, 17], 82: [2, 84], 92: [2, 48], 99: [2, 18], 100: [2, 72], 105: [2, 88], 107: [2, 58], 110: [2, 64], 111: [2, 11], 123: [2, 70], 124: [2, 29] },\n parseError: function parseError(str, hash) {\n throw new Error(str);\n },\n parse: function parse(input) {\n var self = this,\n stack = [0],\n vstack = [null],\n lstack = [],\n table = this.table,\n yytext = \"\",\n yylineno = 0,\n yyleng = 0,\n recovering = 0,\n TERROR = 2,\n EOF = 1;\n this.lexer.setInput(input);\n this.lexer.yy = this.yy;\n this.yy.lexer = this.lexer;\n this.yy.parser = this;\n if (typeof this.lexer.yylloc == \"undefined\") this.lexer.yylloc = {};\n var yyloc = this.lexer.yylloc;\n lstack.push(yyloc);\n var ranges = this.lexer.options && this.lexer.options.ranges;\n if (typeof this.yy.parseError === \"function\") this.parseError = this.yy.parseError;\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = self.lexer.lex() || 1;\n if (typeof token !== \"number\") {\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol,\n preErrorSymbol,\n state,\n action,\n a,\n r,\n yyval = {},\n p,\n len,\n newState,\n expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == \"undefined\") {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === \"undefined\" || !action.length || !action[0]) {\n var errStr = \"\";\n if (!recovering) {\n expected = [];\n for (p in table[state]) if (this.terminals_[p] && p > 2) {\n expected.push(\"'\" + this.terminals_[p] + \"'\");\n }\n if (this.lexer.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + this.lexer.showPosition() + \"\\nExpecting \" + expected.join(\", \") + \", got '\" + (this.terminals_[symbol] || symbol) + \"'\";\n } else {\n errStr = \"Parse error on line \" + (yylineno + 1) + \": Unexpected \" + (symbol == 1 ? \"end of input\" : \"'\" + (this.terminals_[symbol] || symbol) + \"'\");\n }\n this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected });\n }\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error(\"Parse Error: multiple actions possible at state: \" + state + \", token: \" + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(this.lexer.yytext);\n lstack.push(this.lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = this.lexer.yyleng;\n yytext = this.lexer.yytext;\n yylineno = this.lexer.yylineno;\n yyloc = this.lexer.yylloc;\n if (recovering > 0) recovering--;\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column };\n if (ranges) {\n yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];\n }\n r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);\n if (typeof r !== \"undefined\") {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n }\n };\n /* Jison generated lexer */\n var lexer = (function () {\n var lexer = { EOF: 1,\n parseError: function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n setInput: function setInput(input) {\n this._input = input;\n this._more = this._less = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = \"\";\n this.conditionStack = [\"INITIAL\"];\n this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 };\n if (this.options.ranges) this.yylloc.range = [0, 0];\n this.offset = 0;\n return this;\n },\n input: function input() {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) this.yylloc.range[1]++;\n\n this._input = this._input.slice(1);\n return ch;\n },\n unput: function unput(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len - 1);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) this.yylineno -= lines.length - 1;\n var r = this.yylloc.range;\n\n this.yylloc = { first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n return this;\n },\n more: function more() {\n this._more = true;\n return this;\n },\n less: function less(n) {\n this.unput(this.match.slice(n));\n },\n pastInput: function pastInput() {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? \"...\" : \"\") + past.substr(-20).replace(/\\n/g, \"\");\n },\n upcomingInput: function upcomingInput() {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20 - next.length);\n }\n return (next.substr(0, 20) + (next.length > 20 ? \"...\" : \"\")).replace(/\\n/g, \"\");\n },\n showPosition: function showPosition() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n next: function next() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) this.done = true;\n\n var token, match, tempMatch, index, col, lines;\n if (!this._more) {\n this.yytext = \"\";\n this.match = \"\";\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (!this.options.flex) break;\n }\n }\n if (match) {\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) this.yylineno += lines.length;\n this.yylloc = { first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : this.yylloc.last_column + match[0].length };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) this.done = false;\n if (token) {\n return token;\n } else {\n return;\n }\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError(\"Lexical error on line \" + (this.yylineno + 1) + \". Unrecognized text.\\n\" + this.showPosition(), { text: \"\", token: null, line: this.yylineno });\n }\n },\n lex: function lex() {\n var r = this.next();\n if (typeof r !== \"undefined\") {\n return r;\n } else {\n return this.lex();\n }\n },\n begin: function begin(condition) {\n this.conditionStack.push(condition);\n },\n popState: function popState() {\n return this.conditionStack.pop();\n },\n _currentRules: function _currentRules() {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n },\n topState: function topState() {\n return this.conditionStack[this.conditionStack.length - 2];\n },\n pushState: function begin(condition) {\n this.begin(condition);\n } };\n lexer.options = {};\n lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n\n function strip(start, end) {\n return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end);\n }\n\n var YYSTATE = YY_START;\n switch ($avoiding_name_collisions) {\n case 0:\n if (yy_.yytext.slice(-2) === \"\\\\\\\\\") {\n strip(0, 1);\n this.begin(\"mu\");\n } else if (yy_.yytext.slice(-1) === \"\\\\\") {\n strip(0, 1);\n this.begin(\"emu\");\n } else {\n this.begin(\"mu\");\n }\n if (yy_.yytext) {\n return 14;\n }break;\n case 1:\n return 14;\n break;\n case 2:\n this.popState();\n return 14;\n\n break;\n case 3:\n yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9);\n this.popState();\n return 16;\n\n break;\n case 4:\n return 14;\n break;\n case 5:\n this.popState();\n return 13;\n\n break;\n case 6:\n return 59;\n break;\n case 7:\n return 62;\n break;\n case 8:\n return 17;\n break;\n case 9:\n this.popState();\n this.begin(\"raw\");\n return 21;\n\n break;\n case 10:\n return 53;\n break;\n case 11:\n return 27;\n break;\n case 12:\n return 45;\n break;\n case 13:\n this.popState();return 42;\n break;\n case 14:\n this.popState();return 42;\n break;\n case 15:\n return 32;\n break;\n case 16:\n return 37;\n break;\n case 17:\n return 49;\n break;\n case 18:\n return 46;\n break;\n case 19:\n this.unput(yy_.yytext);\n this.popState();\n this.begin(\"com\");\n\n break;\n case 20:\n this.popState();\n return 13;\n\n break;\n case 21:\n return 46;\n break;\n case 22:\n return 67;\n break;\n case 23:\n return 66;\n break;\n case 24:\n return 66;\n break;\n case 25:\n return 81;\n break;\n case 26:\n // ignore whitespace\n break;\n case 27:\n this.popState();return 52;\n break;\n case 28:\n this.popState();return 31;\n break;\n case 29:\n yy_.yytext = strip(1, 2).replace(/\\\\\"/g, \"\\\"\");return 74;\n break;\n case 30:\n yy_.yytext = strip(1, 2).replace(/\\\\'/g, \"'\");return 74;\n break;\n case 31:\n return 79;\n break;\n case 32:\n return 76;\n break;\n case 33:\n return 76;\n break;\n case 34:\n return 77;\n break;\n case 35:\n return 78;\n break;\n case 36:\n return 75;\n break;\n case 37:\n return 69;\n break;\n case 38:\n return 71;\n break;\n case 39:\n return 66;\n break;\n case 40:\n return 66;\n break;\n case 41:\n return \"INVALID\";\n break;\n case 42:\n return 5;\n break;\n }\n };\n lexer.rules = [/^(?:[^\\x00]*?(?=(\\{\\{)))/, /^(?:[^\\x00]+)/, /^(?:[^\\x00]{2,}?(?=(\\{\\{|\\\\\\{\\{|\\\\\\\\\\{\\{|$)))/, /^(?:\\{\\{\\{\\{\\/[^\\s!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=[=}\\s\\/.])\\}\\}\\}\\})/, /^(?:[^\\x00]*?(?=(\\{\\{\\{\\{\\/)))/, /^(?:[\\s\\S]*?--(~)?\\}\\})/, /^(?:\\()/, /^(?:\\))/, /^(?:\\{\\{\\{\\{)/, /^(?:\\}\\}\\}\\})/, /^(?:\\{\\{(~)?>)/, /^(?:\\{\\{(~)?#)/, /^(?:\\{\\{(~)?\\/)/, /^(?:\\{\\{(~)?\\^\\s*(~)?\\}\\})/, /^(?:\\{\\{(~)?\\s*else\\s*(~)?\\}\\})/, /^(?:\\{\\{(~)?\\^)/, /^(?:\\{\\{(~)?\\s*else\\b)/, /^(?:\\{\\{(~)?\\{)/, /^(?:\\{\\{(~)?&)/, /^(?:\\{\\{(~)?!--)/, /^(?:\\{\\{(~)?![\\s\\S]*?\\}\\})/, /^(?:\\{\\{(~)?)/, /^(?:=)/, /^(?:\\.\\.)/, /^(?:\\.(?=([=~}\\s\\/.)|])))/, /^(?:[\\/.])/, /^(?:\\s+)/, /^(?:\\}(~)?\\}\\})/, /^(?:(~)?\\}\\})/, /^(?:\"(\\\\[\"]|[^\"])*\")/, /^(?:'(\\\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\\s)])))/, /^(?:false(?=([~}\\s)])))/, /^(?:undefined(?=([~}\\s)])))/, /^(?:null(?=([~}\\s)])))/, /^(?:-?[0-9]+(?:\\.[0-9]+)?(?=([~}\\s)])))/, /^(?:as\\s+\\|)/, /^(?:\\|)/, /^(?:([^\\s!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=([=~}\\s\\/.)|]))))/, /^(?:\\[[^\\]]*\\])/, /^(?:.)/, /^(?:$)/];\n lexer.conditions = { mu: { rules: [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], inclusive: false }, emu: { rules: [2], inclusive: false }, com: { rules: [5], inclusive: false }, raw: { rules: [3, 4], inclusive: false }, INITIAL: { rules: [0, 1, 42], inclusive: true } };\n return lexer;\n })();\n parser.lexer = lexer;\n function Parser() {\n this.yy = {};\n }Parser.prototype = parser;parser.Parser = Parser;\n return new Parser();\n})();exports[\"default\"] = handlebars;\nmodule.exports = exports[\"default\"];\n},{}],12:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\nexports.print = print;\nexports.PrintVisitor = PrintVisitor;\n/*eslint-disable new-cap */\n\nvar _Visitor = require('./visitor');\n\nvar _Visitor2 = _interopRequireWildcard(_Visitor);\n\nfunction print(ast) {\n return new PrintVisitor().accept(ast);\n}\n\nfunction PrintVisitor() {\n this.padding = 0;\n}\n\nPrintVisitor.prototype = new _Visitor2['default']();\n\nPrintVisitor.prototype.pad = function (string) {\n var out = '';\n\n for (var i = 0, l = this.padding; i < l; i++) {\n out = out + ' ';\n }\n\n out = out + string + '\\n';\n return out;\n};\n\nPrintVisitor.prototype.Program = function (program) {\n var out = '',\n body = program.body,\n i = undefined,\n l = undefined;\n\n if (program.blockParams) {\n var blockParams = 'BLOCK PARAMS: [';\n for (i = 0, l = program.blockParams.length; i < l; i++) {\n blockParams += ' ' + program.blockParams[i];\n }\n blockParams += ' ]';\n out += this.pad(blockParams);\n }\n\n for (i = 0, l = body.length; i < l; i++) {\n out = out + this.accept(body[i]);\n }\n\n this.padding--;\n\n return out;\n};\n\nPrintVisitor.prototype.MustacheStatement = function (mustache) {\n return this.pad('{{ ' + this.SubExpression(mustache) + ' }}');\n};\n\nPrintVisitor.prototype.BlockStatement = function (block) {\n var out = '';\n\n out = out + this.pad('BLOCK:');\n this.padding++;\n out = out + this.pad(this.SubExpression(block));\n if (block.program) {\n out = out + this.pad('PROGRAM:');\n this.padding++;\n out = out + this.accept(block.program);\n this.padding--;\n }\n if (block.inverse) {\n if (block.program) {\n this.padding++;\n }\n out = out + this.pad('{{^}}');\n this.padding++;\n out = out + this.accept(block.inverse);\n this.padding--;\n if (block.program) {\n this.padding--;\n }\n }\n this.padding--;\n\n return out;\n};\n\nPrintVisitor.prototype.PartialStatement = function (partial) {\n var content = 'PARTIAL:' + partial.name.original;\n if (partial.params[0]) {\n content += ' ' + this.accept(partial.params[0]);\n }\n if (partial.hash) {\n content += ' ' + this.accept(partial.hash);\n }\n return this.pad('{{> ' + content + ' }}');\n};\n\nPrintVisitor.prototype.ContentStatement = function (content) {\n return this.pad('CONTENT[ \\'' + content.value + '\\' ]');\n};\n\nPrintVisitor.prototype.CommentStatement = function (comment) {\n return this.pad('{{! \\'' + comment.value + '\\' }}');\n};\n\nPrintVisitor.prototype.SubExpression = function (sexpr) {\n var params = sexpr.params,\n paramStrings = [],\n hash = undefined;\n\n for (var i = 0, l = params.length; i < l; i++) {\n paramStrings.push(this.accept(params[i]));\n }\n\n params = '[' + paramStrings.join(', ') + ']';\n\n hash = sexpr.hash ? ' ' + this.accept(sexpr.hash) : '';\n\n return this.accept(sexpr.path) + ' ' + params + hash;\n};\n\nPrintVisitor.prototype.PathExpression = function (id) {\n var path = id.parts.join('/');\n return (id.data ? '@' : '') + 'PATH:' + path;\n};\n\nPrintVisitor.prototype.StringLiteral = function (string) {\n return '\"' + string.value + '\"';\n};\n\nPrintVisitor.prototype.NumberLiteral = function (number) {\n return 'NUMBER{' + number.value + '}';\n};\n\nPrintVisitor.prototype.BooleanLiteral = function (bool) {\n return 'BOOLEAN{' + bool.value + '}';\n};\n\nPrintVisitor.prototype.UndefinedLiteral = function () {\n return 'UNDEFINED';\n};\n\nPrintVisitor.prototype.NullLiteral = function () {\n return 'NULL';\n};\n\nPrintVisitor.prototype.Hash = function (hash) {\n var pairs = hash.pairs,\n joinedPairs = [];\n\n for (var i = 0, l = pairs.length; i < l; i++) {\n joinedPairs.push(this.accept(pairs[i]));\n }\n\n return 'HASH{' + joinedPairs.join(', ') + '}';\n};\nPrintVisitor.prototype.HashPair = function (pair) {\n return pair.key + '=' + this.accept(pair.value);\n};\n/*eslint-enable new-cap */\n},{\"./visitor\":13}],13:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\n\nvar _Exception = require('../exception');\n\nvar _Exception2 = _interopRequireWildcard(_Exception);\n\nvar _AST = require('./ast');\n\nvar _AST2 = _interopRequireWildcard(_AST);\n\nfunction Visitor() {\n this.parents = [];\n}\n\nVisitor.prototype = {\n constructor: Visitor,\n mutating: false,\n\n // Visits a given value. If mutating, will replace the value if necessary.\n acceptKey: function acceptKey(node, name) {\n var value = this.accept(node[name]);\n if (this.mutating) {\n // Hacky sanity check:\n if (value && (!value.type || !_AST2['default'][value.type])) {\n throw new _Exception2['default']('Unexpected node type \"' + value.type + '\" found when accepting ' + name + ' on ' + node.type);\n }\n node[name] = value;\n }\n },\n\n // Performs an accept operation with added sanity check to ensure\n // required keys are not removed.\n acceptRequired: function acceptRequired(node, name) {\n this.acceptKey(node, name);\n\n if (!node[name]) {\n throw new _Exception2['default'](node.type + ' requires ' + name);\n }\n },\n\n // Traverses a given array. If mutating, empty respnses will be removed\n // for child elements.\n acceptArray: function acceptArray(array) {\n for (var i = 0, l = array.length; i < l; i++) {\n this.acceptKey(array, i);\n\n if (!array[i]) {\n array.splice(i, 1);\n i--;\n l--;\n }\n }\n },\n\n accept: function accept(object) {\n if (!object) {\n return;\n }\n\n if (this.current) {\n this.parents.unshift(this.current);\n }\n this.current = object;\n\n var ret = this[object.type](object);\n\n this.current = this.parents.shift();\n\n if (!this.mutating || ret) {\n return ret;\n } else if (ret !== false) {\n return object;\n }\n },\n\n Program: function Program(program) {\n this.acceptArray(program.body);\n },\n\n MustacheStatement: function MustacheStatement(mustache) {\n this.acceptRequired(mustache, 'path');\n this.acceptArray(mustache.params);\n this.acceptKey(mustache, 'hash');\n },\n\n BlockStatement: function BlockStatement(block) {\n this.acceptRequired(block, 'path');\n this.acceptArray(block.params);\n this.acceptKey(block, 'hash');\n\n this.acceptKey(block, 'program');\n this.acceptKey(block, 'inverse');\n },\n\n PartialStatement: function PartialStatement(partial) {\n this.acceptRequired(partial, 'name');\n this.acceptArray(partial.params);\n this.acceptKey(partial, 'hash');\n },\n\n ContentStatement: function ContentStatement() {},\n CommentStatement: function CommentStatement() {},\n\n SubExpression: function SubExpression(sexpr) {\n this.acceptRequired(sexpr, 'path');\n this.acceptArray(sexpr.params);\n this.acceptKey(sexpr, 'hash');\n },\n\n PathExpression: function PathExpression() {},\n\n StringLiteral: function StringLiteral() {},\n NumberLiteral: function NumberLiteral() {},\n BooleanLiteral: function BooleanLiteral() {},\n UndefinedLiteral: function UndefinedLiteral() {},\n NullLiteral: function NullLiteral() {},\n\n Hash: function Hash(hash) {\n this.acceptArray(hash.pairs);\n },\n HashPair: function HashPair(pair) {\n this.acceptRequired(pair, 'value');\n }\n};\n\nexports['default'] = Visitor;\nmodule.exports = exports['default'];\n/* content */ /* comment */ /* path */ /* string */ /* number */ /* bool */ /* literal */ /* literal */\n},{\"../exception\":15,\"./ast\":5}],14:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\n\nvar _Visitor = require('./visitor');\n\nvar _Visitor2 = _interopRequireWildcard(_Visitor);\n\nfunction WhitespaceControl() {}\nWhitespaceControl.prototype = new _Visitor2['default']();\n\nWhitespaceControl.prototype.Program = function (program) {\n var isRoot = !this.isRootSeen;\n this.isRootSeen = true;\n\n var body = program.body;\n for (var i = 0, l = body.length; i < l; i++) {\n var current = body[i],\n strip = this.accept(current);\n\n if (!strip) {\n continue;\n }\n\n var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot),\n _isNextWhitespace = isNextWhitespace(body, i, isRoot),\n openStandalone = strip.openStandalone && _isPrevWhitespace,\n closeStandalone = strip.closeStandalone && _isNextWhitespace,\n inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace;\n\n if (strip.close) {\n omitRight(body, i, true);\n }\n if (strip.open) {\n omitLeft(body, i, true);\n }\n\n if (inlineStandalone) {\n omitRight(body, i);\n\n if (omitLeft(body, i)) {\n // If we are on a standalone node, save the indent info for partials\n if (current.type === 'PartialStatement') {\n // Pull out the whitespace from the final line\n current.indent = /([ \\t]+$)/.exec(body[i - 1].original)[1];\n }\n }\n }\n if (openStandalone) {\n omitRight((current.program || current.inverse).body);\n\n // Strip out the previous content node if it's whitespace only\n omitLeft(body, i);\n }\n if (closeStandalone) {\n // Always strip the next node\n omitRight(body, i);\n\n omitLeft((current.inverse || current.program).body);\n }\n }\n\n return program;\n};\nWhitespaceControl.prototype.BlockStatement = function (block) {\n this.accept(block.program);\n this.accept(block.inverse);\n\n // Find the inverse program that is involed with whitespace stripping.\n var program = block.program || block.inverse,\n inverse = block.program && block.inverse,\n firstInverse = inverse,\n lastInverse = inverse;\n\n if (inverse && inverse.chained) {\n firstInverse = inverse.body[0].program;\n\n // Walk the inverse chain to find the last inverse that is actually in the chain.\n while (lastInverse.chained) {\n lastInverse = lastInverse.body[lastInverse.body.length - 1].program;\n }\n }\n\n var strip = {\n open: block.openStrip.open,\n close: block.closeStrip.close,\n\n // Determine the standalone candiacy. Basically flag our content as being possibly standalone\n // so our parent can determine if we actually are standalone\n openStandalone: isNextWhitespace(program.body),\n closeStandalone: isPrevWhitespace((firstInverse || program).body)\n };\n\n if (block.openStrip.close) {\n omitRight(program.body, null, true);\n }\n\n if (inverse) {\n var inverseStrip = block.inverseStrip;\n\n if (inverseStrip.open) {\n omitLeft(program.body, null, true);\n }\n\n if (inverseStrip.close) {\n omitRight(firstInverse.body, null, true);\n }\n if (block.closeStrip.open) {\n omitLeft(lastInverse.body, null, true);\n }\n\n // Find standalone else statments\n if (isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) {\n omitLeft(program.body);\n omitRight(firstInverse.body);\n }\n } else if (block.closeStrip.open) {\n omitLeft(program.body, null, true);\n }\n\n return strip;\n};\n\nWhitespaceControl.prototype.MustacheStatement = function (mustache) {\n return mustache.strip;\n};\n\nWhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) {\n /* istanbul ignore next */\n var strip = node.strip || {};\n return {\n inlineStandalone: true,\n open: strip.open,\n close: strip.close\n };\n};\n\nfunction isPrevWhitespace(body, i, isRoot) {\n if (i === undefined) {\n i = body.length;\n }\n\n // Nodes that end with newlines are considered whitespace (but are special\n // cased for strip operations)\n var prev = body[i - 1],\n sibling = body[i - 2];\n if (!prev) {\n return isRoot;\n }\n\n if (prev.type === 'ContentStatement') {\n return (sibling || !isRoot ? /\\r?\\n\\s*?$/ : /(^|\\r?\\n)\\s*?$/).test(prev.original);\n }\n}\nfunction isNextWhitespace(body, i, isRoot) {\n if (i === undefined) {\n i = -1;\n }\n\n var next = body[i + 1],\n sibling = body[i + 2];\n if (!next) {\n return isRoot;\n }\n\n if (next.type === 'ContentStatement') {\n return (sibling || !isRoot ? /^\\s*?\\r?\\n/ : /^\\s*?(\\r?\\n|$)/).test(next.original);\n }\n}\n\n// Marks the node to the right of the position as omitted.\n// I.e. {{foo}}' ' will mark the ' ' node as omitted.\n//\n// If i is undefined, then the first child will be marked as such.\n//\n// If mulitple is truthy then all whitespace will be stripped out until non-whitespace\n// content is met.\nfunction omitRight(body, i, multiple) {\n var current = body[i == null ? 0 : i + 1];\n if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) {\n return;\n }\n\n var original = current.value;\n current.value = current.value.replace(multiple ? /^\\s+/ : /^[ \\t]*\\r?\\n?/, '');\n current.rightStripped = current.value !== original;\n}\n\n// Marks the node to the left of the position as omitted.\n// I.e. ' '{{foo}} will mark the ' ' node as omitted.\n//\n// If i is undefined then the last child will be marked as such.\n//\n// If mulitple is truthy then all whitespace will be stripped out until non-whitespace\n// content is met.\nfunction omitLeft(body, i, multiple) {\n var current = body[i == null ? body.length - 1 : i - 1];\n if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) {\n return;\n }\n\n // We omit the last node if it's whitespace only and not preceeded by a non-content node.\n var original = current.value;\n current.value = current.value.replace(multiple ? /\\s+$/ : /[ \\t]+$/, '');\n current.leftStripped = current.value !== original;\n return current.leftStripped;\n}\n\nexports['default'] = WhitespaceControl;\nmodule.exports = exports['default'];\n},{\"./visitor\":13}],15:[function(require,module,exports){\n'use strict';\n\nexports.__esModule = true;\n\nvar errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\nfunction Exception(message, node) {\n var loc = node && node.loc,\n line = undefined,\n column = undefined;\n if (loc) {\n line = loc.start.line;\n column = loc.start.column;\n\n message += ' - ' + line + ':' + column;\n }\n\n var tmp = Error.prototype.constructor.call(this, message);\n\n // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n for (var idx = 0; idx < errorProps.length; idx++) {\n this[errorProps[idx]] = tmp[errorProps[idx]];\n }\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, Exception);\n }\n\n if (loc) {\n this.lineNumber = line;\n this.column = column;\n }\n}\n\nException.prototype = new Error();\n\nexports['default'] = Exception;\nmodule.exports = exports['default'];\n},{}],16:[function(require,module,exports){\n(function (global){\n'use strict';\n\nexports.__esModule = true;\n/*global window */\n\nexports['default'] = function (Handlebars) {\n /* istanbul ignore next */\n var root = typeof global !== 'undefined' ? global : window,\n $Handlebars = root.Handlebars;\n /* istanbul ignore next */\n Handlebars.noConflict = function () {\n if (root.Handlebars === Handlebars) {\n root.Handlebars = $Handlebars;\n }\n };\n};\n\nmodule.exports = exports['default'];\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvbm8tY29uZmxpY3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuLypnbG9iYWwgd2luZG93ICovXG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChIYW5kbGViYXJzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHZhciByb290ID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB3aW5kb3csXG4gICAgICAkSGFuZGxlYmFycyA9IHJvb3QuSGFuZGxlYmFycztcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgSGFuZGxlYmFycy5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChyb290LkhhbmRsZWJhcnMgPT09IEhhbmRsZWJhcnMpIHtcbiAgICAgIHJvb3QuSGFuZGxlYmFycyA9ICRIYW5kbGViYXJzO1xuICAgIH1cbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyJdfQ==\n},{}],17:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\nexports.checkRevision = checkRevision;\n\n// TODO: Remove this line and break up compilePartial\n\nexports.template = template;\nexports.wrapProgram = wrapProgram;\nexports.resolvePartial = resolvePartial;\nexports.invokePartial = invokePartial;\nexports.noop = noop;\n\nvar _import = require('./utils');\n\nvar Utils = _interopRequireWildcard(_import);\n\nvar _Exception = require('./exception');\n\nvar _Exception2 = _interopRequireWildcard(_Exception);\n\nvar _COMPILER_REVISION$REVISION_CHANGES$createFrame = require('./base');\n\nfunction checkRevision(compilerInfo) {\n var compilerRevision = compilerInfo && compilerInfo[0] || 1,\n currentRevision = _COMPILER_REVISION$REVISION_CHANGES$createFrame.COMPILER_REVISION;\n\n if (compilerRevision !== currentRevision) {\n if (compilerRevision < currentRevision) {\n var runtimeVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[currentRevision],\n compilerVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[compilerRevision];\n throw new _Exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n } else {\n // Use the embedded version info since the runtime doesn't know about this revision yet\n throw new _Exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n }\n }\n}\n\nfunction template(templateSpec, env) {\n /* istanbul ignore next */\n if (!env) {\n throw new _Exception2['default']('No environment passed to template');\n }\n if (!templateSpec || !templateSpec.main) {\n throw new _Exception2['default']('Unknown template object: ' + typeof templateSpec);\n }\n\n // Note: Using env.VM references rather than local var references throughout this section to allow\n // for external users to override these as psuedo-supported APIs.\n env.VM.checkRevision(templateSpec.compiler);\n\n function invokePartialWrapper(partial, context, options) {\n if (options.hash) {\n context = Utils.extend({}, context, options.hash);\n }\n\n partial = env.VM.resolvePartial.call(this, partial, context, options);\n var result = env.VM.invokePartial.call(this, partial, context, options);\n\n if (result == null && env.compile) {\n options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n result = options.partials[options.name](context, options);\n }\n if (result != null) {\n if (options.indent) {\n var lines = result.split('\\n');\n for (var i = 0, l = lines.length; i < l; i++) {\n if (!lines[i] && i + 1 === l) {\n break;\n }\n\n lines[i] = options.indent + lines[i];\n }\n result = lines.join('\\n');\n }\n return result;\n } else {\n throw new _Exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n }\n }\n\n // Just add water\n var container = {\n strict: function strict(obj, name) {\n if (!(name in obj)) {\n throw new _Exception2['default']('\"' + name + '\" not defined in ' + obj);\n }\n return obj[name];\n },\n lookup: function lookup(depths, name) {\n var len = depths.length;\n for (var i = 0; i < len; i++) {\n if (depths[i] && depths[i][name] != null) {\n return depths[i][name];\n }\n }\n },\n lambda: function lambda(current, context) {\n return typeof current === 'function' ? current.call(context) : current;\n },\n\n escapeExpression: Utils.escapeExpression,\n invokePartial: invokePartialWrapper,\n\n fn: function fn(i) {\n return templateSpec[i];\n },\n\n programs: [],\n program: function program(i, data, declaredBlockParams, blockParams, depths) {\n var programWrapper = this.programs[i],\n fn = this.fn(i);\n if (data || depths || blockParams || declaredBlockParams) {\n programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n } else if (!programWrapper) {\n programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n }\n return programWrapper;\n },\n\n data: function data(value, depth) {\n while (value && depth--) {\n value = value._parent;\n }\n return value;\n },\n merge: function merge(param, common) {\n var obj = param || common;\n\n if (param && common && param !== common) {\n obj = Utils.extend({}, common, param);\n }\n\n return obj;\n },\n\n noop: env.VM.noop,\n compilerInfo: templateSpec.compiler\n };\n\n function ret(context) {\n var options = arguments[1] === undefined ? {} : arguments[1];\n\n var data = options.data;\n\n ret._setup(options);\n if (!options.partial && templateSpec.useData) {\n data = initData(context, data);\n }\n var depths = undefined,\n blockParams = templateSpec.useBlockParams ? [] : undefined;\n if (templateSpec.useDepths) {\n depths = options.depths ? [context].concat(options.depths) : [context];\n }\n\n return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths);\n }\n ret.isTop = true;\n\n ret._setup = function (options) {\n if (!options.partial) {\n container.helpers = container.merge(options.helpers, env.helpers);\n\n if (templateSpec.usePartial) {\n container.partials = container.merge(options.partials, env.partials);\n }\n } else {\n container.helpers = options.helpers;\n container.partials = options.partials;\n }\n };\n\n ret._child = function (i, data, blockParams, depths) {\n if (templateSpec.useBlockParams && !blockParams) {\n throw new _Exception2['default']('must pass block params');\n }\n if (templateSpec.useDepths && !depths) {\n throw new _Exception2['default']('must pass parent depths');\n }\n\n return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n };\n return ret;\n}\n\nfunction wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n function prog(context) {\n var options = arguments[1] === undefined ? {} : arguments[1];\n\n return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths));\n }\n prog.program = i;\n prog.depth = depths ? depths.length : 0;\n prog.blockParams = declaredBlockParams || 0;\n return prog;\n}\n\nfunction resolvePartial(partial, context, options) {\n if (!partial) {\n partial = options.partials[options.name];\n } else if (!partial.call && !options.name) {\n // This is a dynamic partial that returned a string\n options.name = partial;\n partial = options.partials[partial];\n }\n return partial;\n}\n\nfunction invokePartial(partial, context, options) {\n options.partial = true;\n\n if (partial === undefined) {\n throw new _Exception2['default']('The partial ' + options.name + ' could not be found');\n } else if (partial instanceof Function) {\n return partial(context, options);\n }\n}\n\nfunction noop() {\n return '';\n}\n\nfunction initData(context, data) {\n if (!data || !('root' in data)) {\n data = data ? _COMPILER_REVISION$REVISION_CHANGES$createFrame.createFrame(data) : {};\n data.root = context;\n }\n return data;\n}\n},{\"./base\":4,\"./exception\":15,\"./utils\":19}],18:[function(require,module,exports){\n'use strict';\n\nexports.__esModule = true;\n// Build out our basic SafeString type\nfunction SafeString(string) {\n this.string = string;\n}\n\nSafeString.prototype.toString = SafeString.prototype.toHTML = function () {\n return '' + this.string;\n};\n\nexports['default'] = SafeString;\nmodule.exports = exports['default'];\n},{}],19:[function(require,module,exports){\n'use strict';\n\nexports.__esModule = true;\nexports.extend = extend;\n\n// Older IE versions do not directly support indexOf so we must implement our own, sadly.\nexports.indexOf = indexOf;\nexports.escapeExpression = escapeExpression;\nexports.isEmpty = isEmpty;\nexports.blockParams = blockParams;\nexports.appendContextPath = appendContextPath;\nvar escape = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n '\\'': ''',\n '`': '`'\n};\n\nvar badChars = /[&<>\"'`]/g,\n possible = /[&<>\"'`]/;\n\nfunction escapeChar(chr) {\n return escape[chr];\n}\n\nfunction extend(obj /* , ...source */) {\n for (var i = 1; i < arguments.length; i++) {\n for (var key in arguments[i]) {\n if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n obj[key] = arguments[i][key];\n }\n }\n }\n\n return obj;\n}\n\nvar toString = Object.prototype.toString;\n\nexports.toString = toString;\n// Sourced from lodash\n// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n/*eslint-disable func-style, no-var */\nvar isFunction = function isFunction(value) {\n return typeof value === 'function';\n};\n// fallback for older versions of Chrome and Safari\n/* istanbul ignore next */\nif (isFunction(/x/)) {\n exports.isFunction = isFunction = function (value) {\n return typeof value === 'function' && toString.call(value) === '[object Function]';\n };\n}\nvar isFunction;\nexports.isFunction = isFunction;\n/*eslint-enable func-style, no-var */\n\n/* istanbul ignore next */\nvar isArray = Array.isArray || function (value) {\n return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;\n};exports.isArray = isArray;\n\nfunction indexOf(array, value) {\n for (var i = 0, len = array.length; i < len; i++) {\n if (array[i] === value) {\n return i;\n }\n }\n return -1;\n}\n\nfunction escapeExpression(string) {\n if (typeof string !== 'string') {\n // don't escape SafeStrings, since they're already safe\n if (string && string.toHTML) {\n return string.toHTML();\n } else if (string == null) {\n return '';\n } else if (!string) {\n return string + '';\n }\n\n // Force a string conversion as this will be done by the append regardless and\n // the regex test will do this transparently behind the scenes, causing issues if\n // an object's to string has escaped characters in it.\n string = '' + string;\n }\n\n if (!possible.test(string)) {\n return string;\n }\n return string.replace(badChars, escapeChar);\n}\n\nfunction isEmpty(value) {\n if (!value && value !== 0) {\n return true;\n } else if (isArray(value) && value.length === 0) {\n return true;\n } else {\n return false;\n }\n}\n\nfunction blockParams(params, ids) {\n params.path = ids;\n return params;\n}\n\nfunction appendContextPath(contextPath, id) {\n return (contextPath ? contextPath + '.' : '') + id;\n}\n},{}],20:[function(require,module,exports){\n// USAGE:\n// var handlebars = require('handlebars');\n/* eslint-disable no-var */\n\n// var local = handlebars.create();\n\nvar handlebars = require('../dist/cjs/handlebars')['default'];\n\nvar printer = require('../dist/cjs/handlebars/compiler/printer');\nhandlebars.PrintVisitor = printer.PrintVisitor;\nhandlebars.print = printer.print;\n\nmodule.exports = handlebars;\n\n// Publish a Node.js require() handler for .handlebars and .hbs files\nfunction extension(module, filename) {\n var fs = require('fs');\n var templateString = fs.readFileSync(filename, 'utf8');\n module.exports = handlebars.compile(templateString);\n}\n/* istanbul ignore else */\nif (typeof require !== 'undefined' && require.extensions) {\n require.extensions['.handlebars'] = extension;\n require.extensions['.hbs'] = extension;\n}\n\n},{\"../dist/cjs/handlebars\":2,\"../dist/cjs/handlebars/compiler/printer\":12,\"fs\":22}],21:[function(require,module,exports){\n(function (process,__filename){\n/** vim: et:ts=4:sw=4:sts=4\n * @license amdefine 1.0.1 Copyright (c) 2011-2016, The Dojo Foundation All Rights Reserved.\n * Available via the MIT or new BSD license.\n * see: http://github.com/jrburke/amdefine for details\n */\n\n/*jslint node: true */\n/*global module, process */\n'use strict';\n\n/**\n * Creates a define for node.\n * @param {Object} module the \"module\" object that is defined by Node for the\n * current module.\n * @param {Function} [requireFn]. Node's require function for the current module.\n * It only needs to be passed in Node versions before 0.5, when module.require\n * did not exist.\n * @returns {Function} a define function that is usable for the current node\n * module.\n */\nfunction amdefine(module, requireFn) {\n 'use strict';\n var defineCache = {},\n loaderCache = {},\n alreadyCalled = false,\n path = require('path'),\n makeRequire, stringRequire;\n\n /**\n * Trims the . and .. from an array of path segments.\n * It will keep a leading path segment if a .. will become\n * the first path segment, to help with module name lookups,\n * which act like paths, but can be remapped. But the end result,\n * all paths that use this function should look normalized.\n * NOTE: this method MODIFIES the input array.\n * @param {Array} ary the array of path segments.\n */\n function trimDots(ary) {\n var i, part;\n for (i = 0; ary[i]; i+= 1) {\n part = ary[i];\n if (part === '.') {\n ary.splice(i, 1);\n i -= 1;\n } else if (part === '..') {\n if (i === 1 && (ary[2] === '..' || ary[0] === '..')) {\n //End of the line. Keep at least one non-dot\n //path segment at the front so it can be mapped\n //correctly to disk. Otherwise, there is likely\n //no path mapping for a path starting with '..'.\n //This can still fail, but catches the most reasonable\n //uses of ..\n break;\n } else if (i > 0) {\n ary.splice(i - 1, 2);\n i -= 2;\n }\n }\n }\n }\n\n function normalize(name, baseName) {\n var baseParts;\n\n //Adjust any relative paths.\n if (name && name.charAt(0) === '.') {\n //If have a base name, try to normalize against it,\n //otherwise, assume it is a top-level require that will\n //be relative to baseUrl in the end.\n if (baseName) {\n baseParts = baseName.split('/');\n baseParts = baseParts.slice(0, baseParts.length - 1);\n baseParts = baseParts.concat(name.split('/'));\n trimDots(baseParts);\n name = baseParts.join('/');\n }\n }\n\n return name;\n }\n\n /**\n * Create the normalize() function passed to a loader plugin's\n * normalize method.\n */\n function makeNormalize(relName) {\n return function (name) {\n return normalize(name, relName);\n };\n }\n\n function makeLoad(id) {\n function load(value) {\n loaderCache[id] = value;\n }\n\n load.fromText = function (id, text) {\n //This one is difficult because the text can/probably uses\n //define, and any relative paths and requires should be relative\n //to that id was it would be found on disk. But this would require\n //bootstrapping a module/require fairly deeply from node core.\n //Not sure how best to go about that yet.\n throw new Error('amdefine does not implement load.fromText');\n };\n\n return load;\n }\n\n makeRequire = function (systemRequire, exports, module, relId) {\n function amdRequire(deps, callback) {\n if (typeof deps === 'string') {\n //Synchronous, single module require('')\n return stringRequire(systemRequire, exports, module, deps, relId);\n } else {\n //Array of dependencies with a callback.\n\n //Convert the dependencies to modules.\n deps = deps.map(function (depName) {\n return stringRequire(systemRequire, exports, module, depName, relId);\n });\n\n //Wait for next tick to call back the require call.\n if (callback) {\n process.nextTick(function () {\n callback.apply(null, deps);\n });\n }\n }\n }\n\n amdRequire.toUrl = function (filePath) {\n if (filePath.indexOf('.') === 0) {\n return normalize(filePath, path.dirname(module.filename));\n } else {\n return filePath;\n }\n };\n\n return amdRequire;\n };\n\n //Favor explicit value, passed in if the module wants to support Node 0.4.\n requireFn = requireFn || function req() {\n return module.require.apply(module, arguments);\n };\n\n function runFactory(id, deps, factory) {\n var r, e, m, result;\n\n if (id) {\n e = loaderCache[id] = {};\n m = {\n id: id,\n uri: __filename,\n exports: e\n };\n r = makeRequire(requireFn, e, m, id);\n } else {\n //Only support one define call per file\n if (alreadyCalled) {\n throw new Error('amdefine with no module ID cannot be called more than once per file.');\n }\n alreadyCalled = true;\n\n //Use the real variables from node\n //Use module.exports for exports, since\n //the exports in here is amdefine exports.\n e = module.exports;\n m = module;\n r = makeRequire(requireFn, e, m, module.id);\n }\n\n //If there are dependencies, they are strings, so need\n //to convert them to dependency values.\n if (deps) {\n deps = deps.map(function (depName) {\n return r(depName);\n });\n }\n\n //Call the factory with the right dependencies.\n if (typeof factory === 'function') {\n result = factory.apply(m.exports, deps);\n } else {\n result = factory;\n }\n\n if (result !== undefined) {\n m.exports = result;\n if (id) {\n loaderCache[id] = m.exports;\n }\n }\n }\n\n stringRequire = function (systemRequire, exports, module, id, relId) {\n //Split the ID by a ! so that\n var index = id.indexOf('!'),\n originalId = id,\n prefix, plugin;\n\n if (index === -1) {\n id = normalize(id, relId);\n\n //Straight module lookup. If it is one of the special dependencies,\n //deal with it, otherwise, delegate to node.\n if (id === 'require') {\n return makeRequire(systemRequire, exports, module, relId);\n } else if (id === 'exports') {\n return exports;\n } else if (id === 'module') {\n return module;\n } else if (loaderCache.hasOwnProperty(id)) {\n return loaderCache[id];\n } else if (defineCache[id]) {\n runFactory.apply(null, defineCache[id]);\n return loaderCache[id];\n } else {\n if(systemRequire) {\n return systemRequire(originalId);\n } else {\n throw new Error('No module with ID: ' + id);\n }\n }\n } else {\n //There is a plugin in play.\n prefix = id.substring(0, index);\n id = id.substring(index + 1, id.length);\n\n plugin = stringRequire(systemRequire, exports, module, prefix, relId);\n\n if (plugin.normalize) {\n id = plugin.normalize(id, makeNormalize(relId));\n } else {\n //Normalize the ID normally.\n id = normalize(id, relId);\n }\n\n if (loaderCache[id]) {\n return loaderCache[id];\n } else {\n plugin.load(id, makeRequire(systemRequire, exports, module, relId), makeLoad(id), {});\n\n return loaderCache[id];\n }\n }\n };\n\n //Create a define function specific to the module asking for amdefine.\n function define(id, deps, factory) {\n if (Array.isArray(id)) {\n factory = deps;\n deps = id;\n id = undefined;\n } else if (typeof id !== 'string') {\n factory = id;\n id = deps = undefined;\n }\n\n if (deps && !Array.isArray(deps)) {\n factory = deps;\n deps = undefined;\n }\n\n if (!deps) {\n deps = ['require', 'exports', 'module'];\n }\n\n //Set up properties for this module. If an ID, then use\n //internal cache. If no ID, then use the external variables\n //for this node module.\n if (id) {\n //Put the module in deep freeze until there is a\n //require call for it.\n defineCache[id] = [id, deps, factory];\n } else {\n runFactory(id, deps, factory);\n }\n }\n\n //define.require, which has access to all the values in the\n //cache. Useful for AMD modules that all have IDs in the file,\n //but need to finally export a value to node based on one of those\n //IDs.\n define.require = function (id) {\n if (loaderCache[id]) {\n return loaderCache[id];\n }\n\n if (defineCache[id]) {\n runFactory.apply(null, defineCache[id]);\n return loaderCache[id];\n }\n };\n\n define.amd = {};\n\n return define;\n}\n\nmodule.exports = amdefine;\n\n}).call(this,require('_process'),\"/..\\\\..\\\\node_modules\\\\amdefine\\\\amdefine.js\")\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9hbWRlZmluZS9hbWRlZmluZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIHZpbTogZXQ6dHM9NDpzdz00OnN0cz00XG4gKiBAbGljZW5zZSBhbWRlZmluZSAxLjAuMSBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNiwgVGhlIERvam8gRm91bmRhdGlvbiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogQXZhaWxhYmxlIHZpYSB0aGUgTUlUIG9yIG5ldyBCU0QgbGljZW5zZS5cbiAqIHNlZTogaHR0cDovL2dpdGh1Yi5jb20vanJidXJrZS9hbWRlZmluZSBmb3IgZGV0YWlsc1xuICovXG5cbi8qanNsaW50IG5vZGU6IHRydWUgKi9cbi8qZ2xvYmFsIG1vZHVsZSwgcHJvY2VzcyAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWZpbmUgZm9yIG5vZGUuXG4gKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBcIm1vZHVsZVwiIG9iamVjdCB0aGF0IGlzIGRlZmluZWQgYnkgTm9kZSBmb3IgdGhlXG4gKiBjdXJyZW50IG1vZHVsZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXF1aXJlRm5dLiBOb2RlJ3MgcmVxdWlyZSBmdW5jdGlvbiBmb3IgdGhlIGN1cnJlbnQgbW9kdWxlLlxuICogSXQgb25seSBuZWVkcyB0byBiZSBwYXNzZWQgaW4gTm9kZSB2ZXJzaW9ucyBiZWZvcmUgMC41LCB3aGVuIG1vZHVsZS5yZXF1aXJlXG4gKiBkaWQgbm90IGV4aXN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIGRlZmluZSBmdW5jdGlvbiB0aGF0IGlzIHVzYWJsZSBmb3IgdGhlIGN1cnJlbnQgbm9kZVxuICogbW9kdWxlLlxuICovXG5mdW5jdGlvbiBhbWRlZmluZShtb2R1bGUsIHJlcXVpcmVGbikge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgZGVmaW5lQ2FjaGUgPSB7fSxcbiAgICAgICAgbG9hZGVyQ2FjaGUgPSB7fSxcbiAgICAgICAgYWxyZWFkeUNhbGxlZCA9IGZhbHNlLFxuICAgICAgICBwYXRoID0gcmVxdWlyZSgncGF0aCcpLFxuICAgICAgICBtYWtlUmVxdWlyZSwgc3RyaW5nUmVxdWlyZTtcblxuICAgIC8qKlxuICAgICAqIFRyaW1zIHRoZSAuIGFuZCAuLiBmcm9tIGFuIGFycmF5IG9mIHBhdGggc2VnbWVudHMuXG4gICAgICogSXQgd2lsbCBrZWVwIGEgbGVhZGluZyBwYXRoIHNlZ21lbnQgaWYgYSAuLiB3aWxsIGJlY29tZVxuICAgICAqIHRoZSBmaXJzdCBwYXRoIHNlZ21lbnQsIHRvIGhlbHAgd2l0aCBtb2R1bGUgbmFtZSBsb29rdXBzLFxuICAgICAqIHdoaWNoIGFjdCBsaWtlIHBhdGhzLCBidXQgY2FuIGJlIHJlbWFwcGVkLiBCdXQgdGhlIGVuZCByZXN1bHQsXG4gICAgICogYWxsIHBhdGhzIHRoYXQgdXNlIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGxvb2sgbm9ybWFsaXplZC5cbiAgICAgKiBOT1RFOiB0aGlzIG1ldGhvZCBNT0RJRklFUyB0aGUgaW5wdXQgYXJyYXkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJ5IHRoZSBhcnJheSBvZiBwYXRoIHNlZ21lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW1Eb3RzKGFyeSkge1xuICAgICAgICB2YXIgaSwgcGFydDtcbiAgICAgICAgZm9yIChpID0gMDsgYXJ5W2ldOyBpKz0gMSkge1xuICAgICAgICAgICAgcGFydCA9IGFyeVtpXTtcbiAgICAgICAgICAgIGlmIChwYXJ0ID09PSAnLicpIHtcbiAgICAgICAgICAgICAgICBhcnkuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSAxICYmIChhcnlbMl0gPT09ICcuLicgfHwgYXJ5WzBdID09PSAnLi4nKSkge1xuICAgICAgICAgICAgICAgICAgICAvL0VuZCBvZiB0aGUgbGluZS4gS2VlcCBhdCBsZWFzdCBvbmUgbm9uLWRvdFxuICAgICAgICAgICAgICAgICAgICAvL3BhdGggc2VnbWVudCBhdCB0aGUgZnJvbnQgc28gaXQgY2FuIGJlIG1hcHBlZFxuICAgICAgICAgICAgICAgICAgICAvL2NvcnJlY3RseSB0byBkaXNrLiBPdGhlcndpc2UsIHRoZXJlIGlzIGxpa2VseVxuICAgICAgICAgICAgICAgICAgICAvL25vIHBhdGggbWFwcGluZyBmb3IgYSBwYXRoIHN0YXJ0aW5nIHdpdGggJy4uJy5cbiAgICAgICAgICAgICAgICAgICAgLy9UaGlzIGNhbiBzdGlsbCBmYWlsLCBidXQgY2F0Y2hlcyB0aGUgbW9zdCByZWFzb25hYmxlXG4gICAgICAgICAgICAgICAgICAgIC8vdXNlcyBvZiAuLlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyeS5zcGxpY2UoaSAtIDEsIDIpO1xuICAgICAgICAgICAgICAgICAgICBpIC09IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplKG5hbWUsIGJhc2VOYW1lKSB7XG4gICAgICAgIHZhciBiYXNlUGFydHM7XG5cbiAgICAgICAgLy9BZGp1c3QgYW55IHJlbGF0aXZlIHBhdGhzLlxuICAgICAgICBpZiAobmFtZSAmJiBuYW1lLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgICAgICAvL0lmIGhhdmUgYSBiYXNlIG5hbWUsIHRyeSB0byBub3JtYWxpemUgYWdhaW5zdCBpdCxcbiAgICAgICAgICAgIC8vb3RoZXJ3aXNlLCBhc3N1bWUgaXQgaXMgYSB0b3AtbGV2ZWwgcmVxdWlyZSB0aGF0IHdpbGxcbiAgICAgICAgICAgIC8vYmUgcmVsYXRpdmUgdG8gYmFzZVVybCBpbiB0aGUgZW5kLlxuICAgICAgICAgICAgaWYgKGJhc2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgYmFzZVBhcnRzID0gYmFzZU5hbWUuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgICBiYXNlUGFydHMgPSBiYXNlUGFydHMuc2xpY2UoMCwgYmFzZVBhcnRzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIGJhc2VQYXJ0cyA9IGJhc2VQYXJ0cy5jb25jYXQobmFtZS5zcGxpdCgnLycpKTtcbiAgICAgICAgICAgICAgICB0cmltRG90cyhiYXNlUGFydHMpO1xuICAgICAgICAgICAgICAgIG5hbWUgPSBiYXNlUGFydHMuam9pbignLycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHRoZSBub3JtYWxpemUoKSBmdW5jdGlvbiBwYXNzZWQgdG8gYSBsb2FkZXIgcGx1Z2luJ3NcbiAgICAgKiBub3JtYWxpemUgbWV0aG9kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1ha2VOb3JtYWxpemUocmVsTmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUobmFtZSwgcmVsTmFtZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUxvYWQoaWQpIHtcbiAgICAgICAgZnVuY3Rpb24gbG9hZCh2YWx1ZSkge1xuICAgICAgICAgICAgbG9hZGVyQ2FjaGVbaWRdID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkLmZyb21UZXh0ID0gZnVuY3Rpb24gKGlkLCB0ZXh0KSB7XG4gICAgICAgICAgICAvL1RoaXMgb25lIGlzIGRpZmZpY3VsdCBiZWNhdXNlIHRoZSB0ZXh0IGNhbi9wcm9iYWJseSB1c2VzXG4gICAgICAgICAgICAvL2RlZmluZSwgYW5kIGFueSByZWxhdGl2ZSBwYXRocyBhbmQgcmVxdWlyZXMgc2hvdWxkIGJlIHJlbGF0aXZlXG4gICAgICAgICAgICAvL3RvIHRoYXQgaWQgd2FzIGl0IHdvdWxkIGJlIGZvdW5kIG9uIGRpc2suIEJ1dCB0aGlzIHdvdWxkIHJlcXVpcmVcbiAgICAgICAgICAgIC8vYm9vdHN0cmFwcGluZyBhIG1vZHVsZS9yZXF1aXJlIGZhaXJseSBkZWVwbHkgZnJvbSBub2RlIGNvcmUuXG4gICAgICAgICAgICAvL05vdCBzdXJlIGhvdyBiZXN0IHRvIGdvIGFib3V0IHRoYXQgeWV0LlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbWRlZmluZSBkb2VzIG5vdCBpbXBsZW1lbnQgbG9hZC5mcm9tVGV4dCcpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBsb2FkO1xuICAgIH1cblxuICAgIG1ha2VSZXF1aXJlID0gZnVuY3Rpb24gKHN5c3RlbVJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSwgcmVsSWQpIHtcbiAgICAgICAgZnVuY3Rpb24gYW1kUmVxdWlyZShkZXBzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXBzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIC8vU3luY2hyb25vdXMsIHNpbmdsZSBtb2R1bGUgcmVxdWlyZSgnJylcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nUmVxdWlyZShzeXN0ZW1SZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUsIGRlcHMsIHJlbElkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9BcnJheSBvZiBkZXBlbmRlbmNpZXMgd2l0aCBhIGNhbGxiYWNrLlxuXG4gICAgICAgICAgICAgICAgLy9Db252ZXJ0IHRoZSBkZXBlbmRlbmNpZXMgdG8gbW9kdWxlcy5cbiAgICAgICAgICAgICAgICBkZXBzID0gZGVwcy5tYXAoZnVuY3Rpb24gKGRlcE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1JlcXVpcmUoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCBkZXBOYW1lLCByZWxJZCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvL1dhaXQgZm9yIG5leHQgdGljayB0byBjYWxsIGJhY2sgdGhlIHJlcXVpcmUgY2FsbC5cbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYW1kUmVxdWlyZS50b1VybCA9IGZ1bmN0aW9uIChmaWxlUGF0aCkge1xuICAgICAgICAgICAgaWYgKGZpbGVQYXRoLmluZGV4T2YoJy4nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUoZmlsZVBhdGgsIHBhdGguZGlybmFtZShtb2R1bGUuZmlsZW5hbWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBhbWRSZXF1aXJlO1xuICAgIH07XG5cbiAgICAvL0Zhdm9yIGV4cGxpY2l0IHZhbHVlLCBwYXNzZWQgaW4gaWYgdGhlIG1vZHVsZSB3YW50cyB0byBzdXBwb3J0IE5vZGUgMC40LlxuICAgIHJlcXVpcmVGbiA9IHJlcXVpcmVGbiB8fCBmdW5jdGlvbiByZXEoKSB7XG4gICAgICAgIHJldHVybiBtb2R1bGUucmVxdWlyZS5hcHBseShtb2R1bGUsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHJ1bkZhY3RvcnkoaWQsIGRlcHMsIGZhY3RvcnkpIHtcbiAgICAgICAgdmFyIHIsIGUsIG0sIHJlc3VsdDtcblxuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGUgPSBsb2FkZXJDYWNoZVtpZF0gPSB7fTtcbiAgICAgICAgICAgIG0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIHVyaTogX19maWxlbmFtZSxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgciA9IG1ha2VSZXF1aXJlKHJlcXVpcmVGbiwgZSwgbSwgaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9Pbmx5IHN1cHBvcnQgb25lIGRlZmluZSBjYWxsIHBlciBmaWxlXG4gICAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYW1kZWZpbmUgd2l0aCBubyBtb2R1bGUgSUQgY2Fubm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBwZXIgZmlsZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAvL1VzZSB0aGUgcmVhbCB2YXJpYWJsZXMgZnJvbSBub2RlXG4gICAgICAgICAgICAvL1VzZSBtb2R1bGUuZXhwb3J0cyBmb3IgZXhwb3J0cywgc2luY2VcbiAgICAgICAgICAgIC8vdGhlIGV4cG9ydHMgaW4gaGVyZSBpcyBhbWRlZmluZSBleHBvcnRzLlxuICAgICAgICAgICAgZSA9IG1vZHVsZS5leHBvcnRzO1xuICAgICAgICAgICAgbSA9IG1vZHVsZTtcbiAgICAgICAgICAgIHIgPSBtYWtlUmVxdWlyZShyZXF1aXJlRm4sIGUsIG0sIG1vZHVsZS5pZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL0lmIHRoZXJlIGFyZSBkZXBlbmRlbmNpZXMsIHRoZXkgYXJlIHN0cmluZ3MsIHNvIG5lZWRcbiAgICAgICAgLy90byBjb252ZXJ0IHRoZW0gdG8gZGVwZW5kZW5jeSB2YWx1ZXMuXG4gICAgICAgIGlmIChkZXBzKSB7XG4gICAgICAgICAgICBkZXBzID0gZGVwcy5tYXAoZnVuY3Rpb24gKGRlcE5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcihkZXBOYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9DYWxsIHRoZSBmYWN0b3J5IHdpdGggdGhlIHJpZ2h0IGRlcGVuZGVuY2llcy5cbiAgICAgICAgaWYgKHR5cGVvZiBmYWN0b3J5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWN0b3J5LmFwcGx5KG0uZXhwb3J0cywgZGVwcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWN0b3J5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtLmV4cG9ydHMgPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICBsb2FkZXJDYWNoZVtpZF0gPSBtLmV4cG9ydHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdHJpbmdSZXF1aXJlID0gZnVuY3Rpb24gKHN5c3RlbVJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSwgaWQsIHJlbElkKSB7XG4gICAgICAgIC8vU3BsaXQgdGhlIElEIGJ5IGEgISBzbyB0aGF0XG4gICAgICAgIHZhciBpbmRleCA9IGlkLmluZGV4T2YoJyEnKSxcbiAgICAgICAgICAgIG9yaWdpbmFsSWQgPSBpZCxcbiAgICAgICAgICAgIHByZWZpeCwgcGx1Z2luO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGlkID0gbm9ybWFsaXplKGlkLCByZWxJZCk7XG5cbiAgICAgICAgICAgIC8vU3RyYWlnaHQgbW9kdWxlIGxvb2t1cC4gSWYgaXQgaXMgb25lIG9mIHRoZSBzcGVjaWFsIGRlcGVuZGVuY2llcyxcbiAgICAgICAgICAgIC8vZGVhbCB3aXRoIGl0LCBvdGhlcndpc2UsIGRlbGVnYXRlIHRvIG5vZGUuXG4gICAgICAgICAgICBpZiAoaWQgPT09ICdyZXF1aXJlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYWtlUmVxdWlyZShzeXN0ZW1SZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUsIHJlbElkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT09ICdleHBvcnRzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PT0gJ21vZHVsZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsb2FkZXJDYWNoZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyQ2FjaGVbaWRdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZpbmVDYWNoZVtpZF0pIHtcbiAgICAgICAgICAgICAgICBydW5GYWN0b3J5LmFwcGx5KG51bGwsIGRlZmluZUNhY2hlW2lkXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlckNhY2hlW2lkXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYoc3lzdGVtUmVxdWlyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3lzdGVtUmVxdWlyZShvcmlnaW5hbElkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG1vZHVsZSB3aXRoIElEOiAnICsgaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vVGhlcmUgaXMgYSBwbHVnaW4gaW4gcGxheS5cbiAgICAgICAgICAgIHByZWZpeCA9IGlkLnN1YnN0cmluZygwLCBpbmRleCk7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZyhpbmRleCArIDEsIGlkLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIHBsdWdpbiA9IHN0cmluZ1JlcXVpcmUoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCBwcmVmaXgsIHJlbElkKTtcblxuICAgICAgICAgICAgaWYgKHBsdWdpbi5ub3JtYWxpemUpIHtcbiAgICAgICAgICAgICAgICBpZCA9IHBsdWdpbi5ub3JtYWxpemUoaWQsIG1ha2VOb3JtYWxpemUocmVsSWQpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgdGhlIElEIG5vcm1hbGx5LlxuICAgICAgICAgICAgICAgIGlkID0gbm9ybWFsaXplKGlkLCByZWxJZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsb2FkZXJDYWNoZVtpZF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyQ2FjaGVbaWRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwbHVnaW4ubG9hZChpZCwgbWFrZVJlcXVpcmUoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCByZWxJZCksIG1ha2VMb2FkKGlkKSwge30pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlckNhY2hlW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvL0NyZWF0ZSBhIGRlZmluZSBmdW5jdGlvbiBzcGVjaWZpYyB0byB0aGUgbW9kdWxlIGFza2luZyBmb3IgYW1kZWZpbmUuXG4gICAgZnVuY3Rpb24gZGVmaW5lKGlkLCBkZXBzLCBmYWN0b3J5KSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlkKSkge1xuICAgICAgICAgICAgZmFjdG9yeSA9IGRlcHM7XG4gICAgICAgICAgICBkZXBzID0gaWQ7XG4gICAgICAgICAgICBpZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmYWN0b3J5ID0gaWQ7XG4gICAgICAgICAgICBpZCA9IGRlcHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVwcyAmJiAhQXJyYXkuaXNBcnJheShkZXBzKSkge1xuICAgICAgICAgICAgZmFjdG9yeSA9IGRlcHM7XG4gICAgICAgICAgICBkZXBzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkZXBzKSB7XG4gICAgICAgICAgICBkZXBzID0gWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJ107XG4gICAgICAgIH1cblxuICAgICAgICAvL1NldCB1cCBwcm9wZXJ0aWVzIGZvciB0aGlzIG1vZHVsZS4gSWYgYW4gSUQsIHRoZW4gdXNlXG4gICAgICAgIC8vaW50ZXJuYWwgY2FjaGUuIElmIG5vIElELCB0aGVuIHVzZSB0aGUgZXh0ZXJuYWwgdmFyaWFibGVzXG4gICAgICAgIC8vZm9yIHRoaXMgbm9kZSBtb2R1bGUuXG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgLy9QdXQgdGhlIG1vZHVsZSBpbiBkZWVwIGZyZWV6ZSB1bnRpbCB0aGVyZSBpcyBhXG4gICAgICAgICAgICAvL3JlcXVpcmUgY2FsbCBmb3IgaXQuXG4gICAgICAgICAgICBkZWZpbmVDYWNoZVtpZF0gPSBbaWQsIGRlcHMsIGZhY3RvcnldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcnVuRmFjdG9yeShpZCwgZGVwcywgZmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL2RlZmluZS5yZXF1aXJlLCB3aGljaCBoYXMgYWNjZXNzIHRvIGFsbCB0aGUgdmFsdWVzIGluIHRoZVxuICAgIC8vY2FjaGUuIFVzZWZ1bCBmb3IgQU1EIG1vZHVsZXMgdGhhdCBhbGwgaGF2ZSBJRHMgaW4gdGhlIGZpbGUsXG4gICAgLy9idXQgbmVlZCB0byBmaW5hbGx5IGV4cG9ydCBhIHZhbHVlIHRvIG5vZGUgYmFzZWQgb24gb25lIG9mIHRob3NlXG4gICAgLy9JRHMuXG4gICAgZGVmaW5lLnJlcXVpcmUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgaWYgKGxvYWRlckNhY2hlW2lkXSkge1xuICAgICAgICAgICAgcmV0dXJuIGxvYWRlckNhY2hlW2lkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWZpbmVDYWNoZVtpZF0pIHtcbiAgICAgICAgICAgIHJ1bkZhY3RvcnkuYXBwbHkobnVsbCwgZGVmaW5lQ2FjaGVbaWRdKTtcbiAgICAgICAgICAgIHJldHVybiBsb2FkZXJDYWNoZVtpZF07XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZGVmaW5lLmFtZCA9IHt9O1xuXG4gICAgcmV0dXJuIGRlZmluZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhbWRlZmluZTtcbiJdfQ==\n},{\"_process\":23,\"path\":29}],22:[function(require,module,exports){\n\n},{}],23:[function(require,module,exports){\n// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n draining = true;\n var currentQueue;\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n var i = -1;\n while (++i < len) {\n currentQueue[i]();\n }\n len = queue.length;\n }\n draining = false;\n}\nprocess.nextTick = function (fun) {\n queue.push(fun);\n if (!draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\n// TODO(shtylman)\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],24:[function(require,module,exports){\n(function (process,global){\n/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE\n * @version 2.3.0\n */\n\n(function() {\n \"use strict\";\n function lib$es6$promise$utils$$objectOrFunction(x) {\n return typeof x === 'function' || (typeof x === 'object' && x !== null);\n }\n\n function lib$es6$promise$utils$$isFunction(x) {\n return typeof x === 'function';\n }\n\n function lib$es6$promise$utils$$isMaybeThenable(x) {\n return typeof x === 'object' && x !== null;\n }\n\n var lib$es6$promise$utils$$_isArray;\n if (!Array.isArray) {\n lib$es6$promise$utils$$_isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n } else {\n lib$es6$promise$utils$$_isArray = Array.isArray;\n }\n\n var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray;\n var lib$es6$promise$asap$$len = 0;\n var lib$es6$promise$asap$$toString = {}.toString;\n var lib$es6$promise$asap$$vertxNext;\n var lib$es6$promise$asap$$customSchedulerFn;\n\n var lib$es6$promise$asap$$asap = function asap(callback, arg) {\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback;\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg;\n lib$es6$promise$asap$$len += 2;\n if (lib$es6$promise$asap$$len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (lib$es6$promise$asap$$customSchedulerFn) {\n lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush);\n } else {\n lib$es6$promise$asap$$scheduleFlush();\n }\n }\n }\n\n function lib$es6$promise$asap$$setScheduler(scheduleFn) {\n lib$es6$promise$asap$$customSchedulerFn = scheduleFn;\n }\n\n function lib$es6$promise$asap$$setAsap(asapFn) {\n lib$es6$promise$asap$$asap = asapFn;\n }\n\n var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined;\n var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {};\n var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;\n var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n // test for web worker but not in IE10\n var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' &&\n typeof importScripts !== 'undefined' &&\n typeof MessageChannel !== 'undefined';\n\n // node\n function lib$es6$promise$asap$$useNextTick() {\n var nextTick = process.nextTick;\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // setImmediate should be used instead instead\n var version = process.versions.node.match(/^(?:(\\d+)\\.)?(?:(\\d+)\\.)?(\\*|\\d+)$/);\n if (Array.isArray(version) && version[1] === '0' && version[2] === '10') {\n nextTick = setImmediate;\n }\n return function() {\n nextTick(lib$es6$promise$asap$$flush);\n };\n }\n\n // vertx\n function lib$es6$promise$asap$$useVertxTimer() {\n return function() {\n lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush);\n };\n }\n\n function lib$es6$promise$asap$$useMutationObserver() {\n var iterations = 0;\n var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function() {\n node.data = (iterations = ++iterations % 2);\n };\n }\n\n // web worker\n function lib$es6$promise$asap$$useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = lib$es6$promise$asap$$flush;\n return function () {\n channel.port2.postMessage(0);\n };\n }\n\n function lib$es6$promise$asap$$useSetTimeout() {\n return function() {\n setTimeout(lib$es6$promise$asap$$flush, 1);\n };\n }\n\n var lib$es6$promise$asap$$queue = new Array(1000);\n function lib$es6$promise$asap$$flush() {\n for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) {\n var callback = lib$es6$promise$asap$$queue[i];\n var arg = lib$es6$promise$asap$$queue[i+1];\n\n callback(arg);\n\n lib$es6$promise$asap$$queue[i] = undefined;\n lib$es6$promise$asap$$queue[i+1] = undefined;\n }\n\n lib$es6$promise$asap$$len = 0;\n }\n\n function lib$es6$promise$asap$$attemptVertex() {\n try {\n var r = require;\n var vertx = r('vertx');\n lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return lib$es6$promise$asap$$useVertxTimer();\n } catch(e) {\n return lib$es6$promise$asap$$useSetTimeout();\n }\n }\n\n var lib$es6$promise$asap$$scheduleFlush;\n // Decide what async method to use to triggering processing of queued callbacks:\n if (lib$es6$promise$asap$$isNode) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick();\n } else if (lib$es6$promise$asap$$BrowserMutationObserver) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver();\n } else if (lib$es6$promise$asap$$isWorker) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel();\n } else if (lib$es6$promise$asap$$browserWindow === undefined && typeof require === 'function') {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertex();\n } else {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout();\n }\n\n function lib$es6$promise$$internal$$noop() {}\n\n var lib$es6$promise$$internal$$PENDING = void 0;\n var lib$es6$promise$$internal$$FULFILLED = 1;\n var lib$es6$promise$$internal$$REJECTED = 2;\n\n var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$selfFullfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n }\n\n function lib$es6$promise$$internal$$cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n }\n\n function lib$es6$promise$$internal$$getThen(promise) {\n try {\n return promise.then;\n } catch(error) {\n lib$es6$promise$$internal$$GET_THEN_ERROR.error = error;\n return lib$es6$promise$$internal$$GET_THEN_ERROR;\n }\n }\n\n function lib$es6$promise$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n try {\n then.call(value, fulfillmentHandler, rejectionHandler);\n } catch(e) {\n return e;\n }\n }\n\n function lib$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) {\n lib$es6$promise$asap$$asap(function(promise) {\n var sealed = false;\n var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) {\n if (sealed) { return; }\n sealed = true;\n if (thenable !== value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }, function(reason) {\n if (sealed) { return; }\n sealed = true;\n\n lib$es6$promise$$internal$$reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n lib$es6$promise$$internal$$reject(promise, error);\n }\n }, promise);\n }\n\n function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) {\n if (thenable._state === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, thenable._result);\n } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, thenable._result);\n } else {\n lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n }\n }\n\n function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable) {\n if (maybeThenable.constructor === promise.constructor) {\n lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable);\n } else {\n var then = lib$es6$promise$$internal$$getThen(maybeThenable);\n\n if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error);\n } else if (then === undefined) {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n } else if (lib$es6$promise$utils$$isFunction(then)) {\n lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n }\n }\n }\n\n function lib$es6$promise$$internal$$resolve(promise, value) {\n if (promise === value) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFullfillment());\n } else if (lib$es6$promise$utils$$objectOrFunction(value)) {\n lib$es6$promise$$internal$$handleMaybeThenable(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n lib$es6$promise$$internal$$publish(promise);\n }\n\n function lib$es6$promise$$internal$$fulfill(promise, value) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n\n promise._result = value;\n promise._state = lib$es6$promise$$internal$$FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, promise);\n }\n }\n\n function lib$es6$promise$$internal$$reject(promise, reason) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n promise._state = lib$es6$promise$$internal$$REJECTED;\n promise._result = reason;\n\n lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publishRejection, promise);\n }\n\n function lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection) {\n var subscribers = parent._subscribers;\n var length = subscribers.length;\n\n parent._onerror = null;\n\n subscribers[length] = child;\n subscribers[length + lib$es6$promise$$internal$$FULFILLED] = onFulfillment;\n subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, parent);\n }\n }\n\n function lib$es6$promise$$internal$$publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) { return; }\n\n var child, callback, detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n lib$es6$promise$$internal$$invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n }\n\n function lib$es6$promise$$internal$$ErrorObject() {\n this.error = null;\n }\n\n var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch(e) {\n lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e;\n return lib$es6$promise$$internal$$TRY_CATCH_ERROR;\n }\n }\n\n function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) {\n var hasCallback = lib$es6$promise$utils$$isFunction(callback),\n value, error, succeeded, failed;\n\n if (hasCallback) {\n value = lib$es6$promise$$internal$$tryCatch(callback, detail);\n\n if (value === lib$es6$promise$$internal$$TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn());\n return;\n }\n\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== lib$es6$promise$$internal$$PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else if (failed) {\n lib$es6$promise$$internal$$reject(promise, error);\n } else if (settled === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, value);\n } else if (settled === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value){\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function rejectPromise(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n } catch(e) {\n lib$es6$promise$$internal$$reject(promise, e);\n }\n }\n\n function lib$es6$promise$enumerator$$Enumerator(Constructor, input) {\n var enumerator = this;\n\n enumerator._instanceConstructor = Constructor;\n enumerator.promise = new Constructor(lib$es6$promise$$internal$$noop);\n\n if (enumerator._validateInput(input)) {\n enumerator._input = input;\n enumerator.length = input.length;\n enumerator._remaining = input.length;\n\n enumerator._init();\n\n if (enumerator.length === 0) {\n lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n } else {\n enumerator.length = enumerator.length || 0;\n enumerator._enumerate();\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n }\n }\n } else {\n lib$es6$promise$$internal$$reject(enumerator.promise, enumerator._validationError());\n }\n }\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validateInput = function(input) {\n return lib$es6$promise$utils$$isArray(input);\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function() {\n return new Error('Array Methods must be provided an Array');\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._init = function() {\n this._result = new Array(this.length);\n };\n\n var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator;\n\n lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() {\n var enumerator = this;\n\n var length = enumerator.length;\n var promise = enumerator.promise;\n var input = enumerator._input;\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n enumerator._eachEntry(input[i], i);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) {\n var enumerator = this;\n var c = enumerator._instanceConstructor;\n\n if (lib$es6$promise$utils$$isMaybeThenable(entry)) {\n if (entry.constructor === c && entry._state !== lib$es6$promise$$internal$$PENDING) {\n entry._onerror = null;\n enumerator._settledAt(entry._state, i, entry._result);\n } else {\n enumerator._willSettleAt(c.resolve(entry), i);\n }\n } else {\n enumerator._remaining--;\n enumerator._result[i] = entry;\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) {\n var enumerator = this;\n var promise = enumerator.promise;\n\n if (promise._state === lib$es6$promise$$internal$$PENDING) {\n enumerator._remaining--;\n\n if (state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n } else {\n enumerator._result[i] = value;\n }\n }\n\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(promise, enumerator._result);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) {\n var enumerator = this;\n\n lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) {\n enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value);\n }, function(reason) {\n enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason);\n });\n };\n function lib$es6$promise$promise$all$$all(entries) {\n return new lib$es6$promise$enumerator$$default(this, entries).promise;\n }\n var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all;\n function lib$es6$promise$promise$race$$race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n\n if (!lib$es6$promise$utils$$isArray(entries)) {\n lib$es6$promise$$internal$$reject(promise, new TypeError('You must pass an array to race.'));\n return promise;\n }\n\n var length = entries.length;\n\n function onFulfillment(value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n }\n\n function onRejection(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n }\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);\n }\n\n return promise;\n }\n var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race;\n function lib$es6$promise$promise$resolve$$resolve(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$resolve(promise, object);\n return promise;\n }\n var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve;\n function lib$es6$promise$promise$reject$$reject(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$reject(promise, reason);\n return promise;\n }\n var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject;\n\n var lib$es6$promise$promise$$counter = 0;\n\n function lib$es6$promise$promise$$needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n }\n\n function lib$es6$promise$promise$$needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n }\n\n var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise;\n /**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n var promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n var xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {function} resolver\n Useful for tooling.\n @constructor\n */\n function lib$es6$promise$promise$$Promise(resolver) {\n this._id = lib$es6$promise$promise$$counter++;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n if (lib$es6$promise$$internal$$noop !== resolver) {\n if (!lib$es6$promise$utils$$isFunction(resolver)) {\n lib$es6$promise$promise$$needsResolver();\n }\n\n if (!(this instanceof lib$es6$promise$promise$$Promise)) {\n lib$es6$promise$promise$$needsNew();\n }\n\n lib$es6$promise$$internal$$initializePromise(this, resolver);\n }\n }\n\n lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default;\n lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default;\n lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default;\n lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default;\n lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler;\n lib$es6$promise$promise$$Promise._setAsap = lib$es6$promise$asap$$setAsap;\n lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$asap;\n\n lib$es6$promise$promise$$Promise.prototype = {\n constructor: lib$es6$promise$promise$$Promise,\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n\n Chaining\n --------\n\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n\n Assimilation\n ------------\n\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n\n If the assimliated promise rejects, then the downstream promise will also reject.\n\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n\n Simple Example\n --------------\n\n Synchronous Example\n\n ```javascript\n var result;\n\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n\n Errback Example\n\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n\n Promise Example;\n\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n\n Advanced Example\n --------------\n\n Synchronous Example\n\n ```javascript\n var author, books;\n\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n\n Errback Example\n\n ```js\n\n function foundBooks(books) {\n\n }\n\n function failure(reason) {\n\n }\n\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n\n Promise Example;\n\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n then: function(onFulfillment, onRejection) {\n var parent = this;\n var state = parent._state;\n\n if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) {\n return this;\n }\n\n var child = new this.constructor(lib$es6$promise$$internal$$noop);\n var result = parent._result;\n\n if (state) {\n var callback = arguments[state - 1];\n lib$es6$promise$asap$$asap(function(){\n lib$es6$promise$$internal$$invokeCallback(state, child, callback, result);\n });\n } else {\n lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n },\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n 'catch': function(onRejection) {\n return this.then(null, onRejection);\n }\n };\n function lib$es6$promise$polyfill$$polyfill() {\n var local;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) {\n return;\n }\n\n local.Promise = lib$es6$promise$promise$$default;\n }\n var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill;\n\n var lib$es6$promise$umd$$ES6Promise = {\n 'Promise': lib$es6$promise$promise$$default,\n 'polyfill': lib$es6$promise$polyfill$$default\n };\n\n /* global define:true module:true window: true */\n if (typeof define === 'function' && define['amd']) {\n define(function() { return lib$es6$promise$umd$$ES6Promise; });\n } else if (typeof module !== 'undefined' && module['exports']) {\n module['exports'] = lib$es6$promise$umd$$ES6Promise;\n } else if (typeof this !== 'undefined') {\n this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise;\n }\n\n lib$es6$promise$polyfill$$default();\n}).call(this);\n\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAb3ZlcnZpZXcgZXM2LXByb21pc2UgLSBhIHRpbnkgaW1wbGVtZW50YXRpb24gb2YgUHJvbWlzZXMvQSsuXG4gKiBAY29weXJpZ2h0IENvcHlyaWdodCAoYykgMjAxNCBZZWh1ZGEgS2F0eiwgVG9tIERhbGUsIFN0ZWZhbiBQZW5uZXIgYW5kIGNvbnRyaWJ1dG9ycyAoQ29udmVyc2lvbiB0byBFUzYgQVBJIGJ5IEpha2UgQXJjaGliYWxkKVxuICogQGxpY2Vuc2UgICBMaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZVxuICogICAgICAgICAgICBTZWUgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2pha2VhcmNoaWJhbGQvZXM2LXByb21pc2UvbWFzdGVyL0xJQ0VOU0VcbiAqIEB2ZXJzaW9uICAgMi4zLjBcbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRvYmplY3RPckZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJyB8fCAodHlwZW9mIHggPT09ICdvYmplY3QnICYmIHggIT09IG51bGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNGdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc01heWJlVGhlbmFibGUoeCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkdXRpbHMkJF9pc0FycmF5O1xuICAgIGlmICghQXJyYXkuaXNBcnJheSkge1xuICAgICAgbGliJGVzNiRwcm9taXNlJHV0aWxzJCRfaXNBcnJheSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkdXRpbHMkJF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0FycmF5ID0gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRfaXNBcnJheTtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiA9IDA7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkdmVydHhOZXh0O1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm47XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAgPSBmdW5jdGlvbiBhc2FwKGNhbGxiYWNrLCBhcmcpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuXSA9IGNhbGxiYWNrO1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2xpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gKyAxXSA9IGFyZztcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gKz0gMjtcbiAgICAgIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuID09PSAyKSB7XG4gICAgICAgIC8vIElmIGxlbiBpcyAyLCB0aGF0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byBzY2hlZHVsZSBhbiBhc3luYyBmbHVzaC5cbiAgICAgICAgLy8gSWYgYWRkaXRpb25hbCBjYWxsYmFja3MgYXJlIHF1ZXVlZCBiZWZvcmUgdGhlIHF1ZXVlIGlzIGZsdXNoZWQsIHRoZXlcbiAgICAgICAgLy8gd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBmbHVzaCB0aGF0IHdlIGFyZSBzY2hlZHVsaW5nLlxuICAgICAgICBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGN1c3RvbVNjaGVkdWxlckZuKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGN1c3RvbVNjaGVkdWxlckZuKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2goKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRTY2hlZHVsZXIoc2NoZWR1bGVGbikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGN1c3RvbVNjaGVkdWxlckZuID0gc2NoZWR1bGVGbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2V0QXNhcChhc2FwRm4pIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwID0gYXNhcEZuO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3NlcldpbmRvdyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyR2xvYmFsID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJXaW5kb3cgfHwge307XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyR2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJHbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGlzTm9kZSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiB7fS50b1N0cmluZy5jYWxsKHByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXSc7XG5cbiAgICAvLyB0ZXN0IGZvciB3ZWIgd29ya2VyIGJ1dCBub3QgaW4gSUUxMFxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkaXNXb3JrZXIgPSB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICB0eXBlb2YgaW1wb3J0U2NyaXB0cyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCc7XG5cbiAgICAvLyBub2RlXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU5leHRUaWNrKCkge1xuICAgICAgdmFyIG5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGljaztcbiAgICAgIC8vIG5vZGUgdmVyc2lvbiAwLjEwLnggZGlzcGxheXMgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHdoZW4gbmV4dFRpY2sgaXMgdXNlZCByZWN1cnNpdmVseVxuICAgICAgLy8gc2V0SW1tZWRpYXRlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgaW5zdGVhZFxuICAgICAgdmFyIHZlcnNpb24gPSBwcm9jZXNzLnZlcnNpb25zLm5vZGUubWF0Y2goL14oPzooXFxkKylcXC4pPyg/OihcXGQrKVxcLik/KFxcKnxcXGQrKSQvKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZlcnNpb24pICYmIHZlcnNpb25bMV0gPT09ICcwJyAmJiB2ZXJzaW9uWzJdID09PSAnMTAnKSB7XG4gICAgICAgIG5leHRUaWNrID0gc2V0SW1tZWRpYXRlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBuZXh0VGljayhsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyB2ZXJ0eFxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VWZXJ0eFRpbWVyKCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkdmVydHhOZXh0KGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VNdXRhdGlvbk9ic2VydmVyKCkge1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgdmFyIG9ic2VydmVyID0gbmV3IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRCcm93c2VyTXV0YXRpb25PYnNlcnZlcihsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gpO1xuICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBub2RlLmRhdGEgPSAoaXRlcmF0aW9ucyA9ICsraXRlcmF0aW9ucyAlIDIpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyB3ZWIgd29ya2VyXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU1lc3NhZ2VDaGFubmVsKCkge1xuICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVNldFRpbWVvdXQoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHNldFRpbWVvdXQobGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoLCAxKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZSA9IG5ldyBBcnJheSgxMDAwKTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2goKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW47IGkrPTIpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2ldO1xuICAgICAgICB2YXIgYXJnID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2krMV07XG5cbiAgICAgICAgY2FsbGJhY2soYXJnKTtcblxuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbaV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtpKzFdID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuID0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXR0ZW1wdFZlcnRleCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByID0gcmVxdWlyZTtcbiAgICAgICAgdmFyIHZlcnR4ID0gcigndmVydHgnKTtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHZlcnR4TmV4dCA9IHZlcnR4LnJ1bk9uTG9vcCB8fCB2ZXJ0eC5ydW5PbkNvbnRleHQ7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlVmVydHhUaW1lcigpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlU2V0VGltZW91dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaDtcbiAgICAvLyBEZWNpZGUgd2hhdCBhc3luYyBtZXRob2QgdG8gdXNlIHRvIHRyaWdnZXJpbmcgcHJvY2Vzc2luZyBvZiBxdWV1ZWQgY2FsbGJhY2tzOlxuICAgIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkaXNOb2RlKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VOZXh0VGljaygpO1xuICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VNdXRhdGlvbk9ic2VydmVyKCk7XG4gICAgfSBlbHNlIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkaXNXb3JrZXIpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU1lc3NhZ2VDaGFubmVsKCk7XG4gICAgfSBlbHNlIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3NlcldpbmRvdyA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhdHRlbXB0VmVydGV4KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVNldFRpbWVvdXQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKCkge31cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HICAgPSB2b2lkIDA7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRCA9IDE7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEICA9IDI7XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IgPSBuZXcgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRXJyb3JPYmplY3QoKTtcblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHNlbGZGdWxsZmlsbG1lbnQoKSB7XG4gICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIllvdSBjYW5ub3QgcmVzb2x2ZSBhIHByb21pc2Ugd2l0aCBpdHNlbGZcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkY2Fubm90UmV0dXJuT3duKCkge1xuICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoJ0EgcHJvbWlzZXMgY2FsbGJhY2sgY2Fubm90IHJldHVybiB0aGF0IHNhbWUgcHJvbWlzZS4nKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRnZXRUaGVuKHByb21pc2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW47XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SLmVycm9yID0gZXJyb3I7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlUaGVuKHRoZW4sIHZhbHVlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVGb3JlaWduVGhlbmFibGUocHJvbWlzZSwgdGhlbmFibGUsIHRoZW4pIHtcbiAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChmdW5jdGlvbihwcm9taXNlKSB7XG4gICAgICAgIHZhciBzZWFsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGVycm9yID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkdHJ5VGhlbih0aGVuLCB0aGVuYWJsZSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBpZiAoc2VhbGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIHNlYWxlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHRoZW5hYmxlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgaWYgKHNlYWxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICBzZWFsZWQgPSB0cnVlO1xuXG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgIH0sICdTZXR0bGU6ICcgKyAocHJvbWlzZS5fbGFiZWwgfHwgJyB1bmtub3duIHByb21pc2UnKSk7XG5cbiAgICAgICAgaWYgKCFzZWFsZWQgJiYgZXJyb3IpIHtcbiAgICAgICAgICBzZWFsZWQgPSB0cnVlO1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sIHByb21pc2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZU93blRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlKSB7XG4gICAgICBpZiAodGhlbmFibGUuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgICAgIH0gZWxzZSBpZiAodGhlbmFibGUuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgdGhlbmFibGUuX3Jlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUodGhlbmFibGUsIHVuZGVmaW5lZCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZU1heWJlVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSkge1xuICAgICAgaWYgKG1heWJlVGhlbmFibGUuY29uc3RydWN0b3IgPT09IHByb21pc2UuY29uc3RydWN0b3IpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlT3duVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdGhlbiA9IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGdldFRoZW4obWF5YmVUaGVuYWJsZSk7XG5cbiAgICAgICAgaWYgKHRoZW4gPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SLmVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNGdW5jdGlvbih0aGVuKSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZUZvcmVpZ25UaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlLCB0aGVuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSkge1xuICAgICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzZWxmRnVsbGZpbGxtZW50KCkpO1xuICAgICAgfSBlbHNlIGlmIChsaWIkZXM2JHByb21pc2UkdXRpbHMkJG9iamVjdE9yRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZU1heWJlVGhlbmFibGUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaFJlamVjdGlvbihwcm9taXNlKSB7XG4gICAgICBpZiAocHJvbWlzZS5fb25lcnJvcikge1xuICAgICAgICBwcm9taXNlLl9vbmVycm9yKHByb21pc2UuX3Jlc3VsdCk7XG4gICAgICB9XG5cbiAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2gocHJvbWlzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSkge1xuICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7IHJldHVybjsgfVxuXG4gICAgICBwcm9taXNlLl9yZXN1bHQgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3N0YXRlID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEO1xuXG4gICAgICBpZiAocHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2gsIHByb21pc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pIHtcbiAgICAgIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORykgeyByZXR1cm47IH1cbiAgICAgIHByb21pc2UuX3N0YXRlID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQ7XG4gICAgICBwcm9taXNlLl9yZXN1bHQgPSByZWFzb247XG5cbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2hSZWplY3Rpb24sIHByb21pc2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbikge1xuICAgICAgdmFyIHN1YnNjcmliZXJzID0gcGFyZW50Ll9zdWJzY3JpYmVycztcbiAgICAgIHZhciBsZW5ndGggPSBzdWJzY3JpYmVycy5sZW5ndGg7XG5cbiAgICAgIHBhcmVudC5fb25lcnJvciA9IG51bGw7XG5cbiAgICAgIHN1YnNjcmliZXJzW2xlbmd0aF0gPSBjaGlsZDtcbiAgICAgIHN1YnNjcmliZXJzW2xlbmd0aCArIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRF0gPSBvbkZ1bGZpbGxtZW50O1xuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoICsgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURURdICA9IG9uUmVqZWN0aW9uO1xuXG4gICAgICBpZiAobGVuZ3RoID09PSAwICYmIHBhcmVudC5fc3RhdGUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaCwgcGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoKHByb21pc2UpIHtcbiAgICAgIHZhciBzdWJzY3JpYmVycyA9IHByb21pc2UuX3N1YnNjcmliZXJzO1xuICAgICAgdmFyIHNldHRsZWQgPSBwcm9taXNlLl9zdGF0ZTtcblxuICAgICAgaWYgKHN1YnNjcmliZXJzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cblxuICAgICAgdmFyIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsID0gcHJvbWlzZS5fcmVzdWx0O1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YnNjcmliZXJzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIGNoaWxkID0gc3Vic2NyaWJlcnNbaV07XG4gICAgICAgIGNhbGxiYWNrID0gc3Vic2NyaWJlcnNbaSArIHNldHRsZWRdO1xuXG4gICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGludm9rZUNhbGxiYWNrKHNldHRsZWQsIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjayhkZXRhaWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb21pc2UuX3N1YnNjcmliZXJzLmxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRXJyb3JPYmplY3QoKSB7XG4gICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkVFJZX0NBVENIX0VSUk9SID0gbmV3IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEVycm9yT2JqZWN0KCk7XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlDYXRjaChjYWxsYmFjaywgZGV0YWlsKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZGV0YWlsKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1IuZXJyb3IgPSBlO1xuICAgICAgICByZXR1cm4gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkVFJZX0NBVENIX0VSUk9SO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGludm9rZUNhbGxiYWNrKHNldHRsZWQsIHByb21pc2UsIGNhbGxiYWNrLCBkZXRhaWwpIHtcbiAgICAgIHZhciBoYXNDYWxsYmFjayA9IGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNGdW5jdGlvbihjYWxsYmFjayksXG4gICAgICAgICAgdmFsdWUsIGVycm9yLCBzdWNjZWVkZWQsIGZhaWxlZDtcblxuICAgICAgaWYgKGhhc0NhbGxiYWNrKSB7XG4gICAgICAgIHZhbHVlID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkdHJ5Q2F0Y2goY2FsbGJhY2ssIGRldGFpbCk7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1IpIHtcbiAgICAgICAgICBmYWlsZWQgPSB0cnVlO1xuICAgICAgICAgIGVycm9yID0gdmFsdWUuZXJyb3I7XG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkY2Fubm90UmV0dXJuT3duKCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGRldGFpbDtcbiAgICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7XG4gICAgICAgIC8vIG5vb3BcbiAgICAgIH0gZWxzZSBpZiAoaGFzQ2FsbGJhY2sgJiYgc3VjY2VlZGVkKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChmYWlsZWQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGVycm9yKTtcbiAgICAgIH0gZWxzZSBpZiAoc2V0dGxlZCA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzZXR0bGVkID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGluaXRpYWxpemVQcm9taXNlKHByb21pc2UsIHJlc29sdmVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXNvbHZlcihmdW5jdGlvbiByZXNvbHZlUHJvbWlzZSh2YWx1ZSl7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIHJlamVjdFByb21pc2UocmVhc29uKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvcihDb25zdHJ1Y3RvciwgaW5wdXQpIHtcbiAgICAgIHZhciBlbnVtZXJhdG9yID0gdGhpcztcblxuICAgICAgZW51bWVyYXRvci5faW5zdGFuY2VDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yO1xuICAgICAgZW51bWVyYXRvci5wcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuXG4gICAgICBpZiAoZW51bWVyYXRvci5fdmFsaWRhdGVJbnB1dChpbnB1dCkpIHtcbiAgICAgICAgZW51bWVyYXRvci5faW5wdXQgICAgID0gaW5wdXQ7XG4gICAgICAgIGVudW1lcmF0b3IubGVuZ3RoICAgICA9IGlucHV0Lmxlbmd0aDtcbiAgICAgICAgZW51bWVyYXRvci5fcmVtYWluaW5nID0gaW5wdXQubGVuZ3RoO1xuXG4gICAgICAgIGVudW1lcmF0b3IuX2luaXQoKTtcblxuICAgICAgICBpZiAoZW51bWVyYXRvci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKGVudW1lcmF0b3IucHJvbWlzZSwgZW51bWVyYXRvci5fcmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbnVtZXJhdG9yLmxlbmd0aCA9IGVudW1lcmF0b3IubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgZW51bWVyYXRvci5fZW51bWVyYXRlKCk7XG4gICAgICAgICAgaWYgKGVudW1lcmF0b3IuX3JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChlbnVtZXJhdG9yLnByb21pc2UsIGVudW1lcmF0b3IuX3Jlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QoZW51bWVyYXRvci5wcm9taXNlLCBlbnVtZXJhdG9yLl92YWxpZGF0aW9uRXJyb3IoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl92YWxpZGF0ZUlucHV0ID0gZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzQXJyYXkoaW5wdXQpO1xuICAgIH07XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcignQXJyYXkgTWV0aG9kcyBtdXN0IGJlIHByb3ZpZGVkIGFuIEFycmF5Jyk7XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5fcmVzdWx0ID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICB9O1xuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3I7XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX2VudW1lcmF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuXG4gICAgICB2YXIgbGVuZ3RoICA9IGVudW1lcmF0b3IubGVuZ3RoO1xuICAgICAgdmFyIHByb21pc2UgPSBlbnVtZXJhdG9yLnByb21pc2U7XG4gICAgICB2YXIgaW5wdXQgICA9IGVudW1lcmF0b3IuX2lucHV0O1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgcHJvbWlzZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcgJiYgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVudW1lcmF0b3IuX2VhY2hFbnRyeShpbnB1dFtpXSwgaSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fZWFjaEVudHJ5ID0gZnVuY3Rpb24oZW50cnksIGkpIHtcbiAgICAgIHZhciBlbnVtZXJhdG9yID0gdGhpcztcbiAgICAgIHZhciBjID0gZW51bWVyYXRvci5faW5zdGFuY2VDb25zdHJ1Y3RvcjtcblxuICAgICAgaWYgKGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNNYXliZVRoZW5hYmxlKGVudHJ5KSkge1xuICAgICAgICBpZiAoZW50cnkuY29uc3RydWN0b3IgPT09IGMgJiYgZW50cnkuX3N0YXRlICE9PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7XG4gICAgICAgICAgZW50cnkuX29uZXJyb3IgPSBudWxsO1xuICAgICAgICAgIGVudW1lcmF0b3IuX3NldHRsZWRBdChlbnRyeS5fc3RhdGUsIGksIGVudHJ5Ll9yZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudW1lcmF0b3IuX3dpbGxTZXR0bGVBdChjLnJlc29sdmUoZW50cnkpLCBpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW51bWVyYXRvci5fcmVtYWluaW5nLS07XG4gICAgICAgIGVudW1lcmF0b3IuX3Jlc3VsdFtpXSA9IGVudHJ5O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3NldHRsZWRBdCA9IGZ1bmN0aW9uKHN0YXRlLCBpLCB2YWx1ZSkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuICAgICAgdmFyIHByb21pc2UgPSBlbnVtZXJhdG9yLnByb21pc2U7XG5cbiAgICAgIGlmIChwcm9taXNlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORykge1xuICAgICAgICBlbnVtZXJhdG9yLl9yZW1haW5pbmctLTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbnVtZXJhdG9yLl9yZXN1bHRbaV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZW51bWVyYXRvci5fcmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgZW51bWVyYXRvci5fcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl93aWxsU2V0dGxlQXQgPSBmdW5jdGlvbihwcm9taXNlLCBpKSB7XG4gICAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG5cbiAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZShwcm9taXNlLCB1bmRlZmluZWQsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGVudW1lcmF0b3IuX3NldHRsZWRBdChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQsIGksIHZhbHVlKTtcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICBlbnVtZXJhdG9yLl9zZXR0bGVkQXQobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQsIGksIHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJGFsbCQkYWxsKGVudHJpZXMpIHtcbiAgICAgIHJldHVybiBuZXcgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJGRlZmF1bHQodGhpcywgZW50cmllcykucHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJGFsbCQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJGFsbCQkYWxsO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJhY2UkJHJhY2UoZW50cmllcykge1xuICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG5cbiAgICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuXG4gICAgICBpZiAoIWxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNBcnJheShlbnRyaWVzKSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byByYWNlLicpKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgZnVuY3Rpb24gb25GdWxmaWxsbWVudCh2YWx1ZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25SZWplY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgcHJvbWlzZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcgJiYgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZShDb25zdHJ1Y3Rvci5yZXNvbHZlKGVudHJpZXNbaV0pLCB1bmRlZmluZWQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyYWNlJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmFjZSQkcmFjZTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRyZXNvbHZlKG9iamVjdCkge1xuICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG5cbiAgICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09PSBDb25zdHJ1Y3Rvcikge1xuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgb2JqZWN0KTtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVzb2x2ZSQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJHJlc29sdmU7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRyZWplY3QocmVhc29uKSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlamVjdCQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlamVjdCQkcmVqZWN0O1xuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRjb3VudGVyID0gMDtcblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc1Jlc29sdmVyKCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc05ldygpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gY29uc3RydWN0ICdQcm9taXNlJzogUGxlYXNlIHVzZSB0aGUgJ25ldycgb3BlcmF0b3IsIHRoaXMgb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2U7XG4gICAgLyoqXG4gICAgICBQcm9taXNlIG9iamVjdHMgcmVwcmVzZW50IHRoZSBldmVudHVhbCByZXN1bHQgb2YgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4gVGhlXG4gICAgICBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJvbWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLCB3aGljaFxuICAgICAgcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBvciB0aGUgcmVhc29uXG4gICAgICB3aHkgdGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC5cblxuICAgICAgVGVybWlub2xvZ3lcbiAgICAgIC0tLS0tLS0tLS0tXG5cbiAgICAgIC0gYHByb21pc2VgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB3aXRoIGEgYHRoZW5gIG1ldGhvZCB3aG9zZSBiZWhhdmlvciBjb25mb3JtcyB0byB0aGlzIHNwZWNpZmljYXRpb24uXG4gICAgICAtIGB0aGVuYWJsZWAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyBhIGB0aGVuYCBtZXRob2QuXG4gICAgICAtIGB2YWx1ZWAgaXMgYW55IGxlZ2FsIEphdmFTY3JpcHQgdmFsdWUgKGluY2x1ZGluZyB1bmRlZmluZWQsIGEgdGhlbmFibGUsIG9yIGEgcHJvbWlzZSkuXG4gICAgICAtIGBleGNlcHRpb25gIGlzIGEgdmFsdWUgdGhhdCBpcyB0aHJvd24gdXNpbmcgdGhlIHRocm93IHN0YXRlbWVudC5cbiAgICAgIC0gYHJlYXNvbmAgaXMgYSB2YWx1ZSB0aGF0IGluZGljYXRlcyB3aHkgYSBwcm9taXNlIHdhcyByZWplY3RlZC5cbiAgICAgIC0gYHNldHRsZWRgIHRoZSBmaW5hbCByZXN0aW5nIHN0YXRlIG9mIGEgcHJvbWlzZSwgZnVsZmlsbGVkIG9yIHJlamVjdGVkLlxuXG4gICAgICBBIHByb21pc2UgY2FuIGJlIGluIG9uZSBvZiB0aHJlZSBzdGF0ZXM6IHBlbmRpbmcsIGZ1bGZpbGxlZCwgb3IgcmVqZWN0ZWQuXG5cbiAgICAgIFByb21pc2VzIHRoYXQgYXJlIGZ1bGZpbGxlZCBoYXZlIGEgZnVsZmlsbG1lbnQgdmFsdWUgYW5kIGFyZSBpbiB0aGUgZnVsZmlsbGVkXG4gICAgICBzdGF0ZS4gIFByb21pc2VzIHRoYXQgYXJlIHJlamVjdGVkIGhhdmUgYSByZWplY3Rpb24gcmVhc29uIGFuZCBhcmUgaW4gdGhlXG4gICAgICByZWplY3RlZCBzdGF0ZS4gIEEgZnVsZmlsbG1lbnQgdmFsdWUgaXMgbmV2ZXIgYSB0aGVuYWJsZS5cblxuICAgICAgUHJvbWlzZXMgY2FuIGFsc28gYmUgc2FpZCB0byAqcmVzb2x2ZSogYSB2YWx1ZS4gIElmIHRoaXMgdmFsdWUgaXMgYWxzbyBhXG4gICAgICBwcm9taXNlLCB0aGVuIHRoZSBvcmlnaW5hbCBwcm9taXNlJ3Mgc2V0dGxlZCBzdGF0ZSB3aWxsIG1hdGNoIHRoZSB2YWx1ZSdzXG4gICAgICBzZXR0bGVkIHN0YXRlLiAgU28gYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCByZWplY3RzIHdpbGxcbiAgICAgIGl0c2VsZiByZWplY3QsIGFuZCBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdpbGxcbiAgICAgIGl0c2VsZiBmdWxmaWxsLlxuXG5cbiAgICAgIEJhc2ljIFVzYWdlOlxuICAgICAgLS0tLS0tLS0tLS0tXG5cbiAgICAgIGBgYGpzXG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAvLyBvbiBzdWNjZXNzXG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuXG4gICAgICAgIC8vIG9uIGZhaWx1cmVcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICB9KTtcblxuICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIC8vIG9uIGZ1bGZpbGxtZW50XG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgLy8gb24gcmVqZWN0aW9uXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBBZHZhbmNlZCBVc2FnZTpcbiAgICAgIC0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICBQcm9taXNlcyBzaGluZSB3aGVuIGFic3RyYWN0aW5nIGF3YXkgYXN5bmNocm9ub3VzIGludGVyYWN0aW9ucyBzdWNoIGFzXG4gICAgICBgWE1MSHR0cFJlcXVlc3Rgcy5cblxuICAgICAgYGBganNcbiAgICAgIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwpO1xuICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBoYW5kbGVyO1xuICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnanNvbic7XG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgICAgeGhyLnNlbmQoKTtcblxuICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkRPTkUpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucmVzcG9uc2UpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2dldEpTT046IGAnICsgdXJsICsgJ2AgZmFpbGVkIHdpdGggc3RhdHVzOiBbJyArIHRoaXMuc3RhdHVzICsgJ10nKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZ2V0SlNPTignL3Bvc3RzLmpzb24nKS50aGVuKGZ1bmN0aW9uKGpzb24pIHtcbiAgICAgICAgLy8gb24gZnVsZmlsbG1lbnRcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAvLyBvbiByZWplY3Rpb25cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFVubGlrZSBjYWxsYmFja3MsIHByb21pc2VzIGFyZSBncmVhdCBjb21wb3NhYmxlIHByaW1pdGl2ZXMuXG5cbiAgICAgIGBgYGpzXG4gICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgIGdldEpTT04oJy9wb3N0cycpLFxuICAgICAgICBnZXRKU09OKCcvY29tbWVudHMnKVxuICAgICAgXSkudGhlbihmdW5jdGlvbih2YWx1ZXMpe1xuICAgICAgICB2YWx1ZXNbMF0gLy8gPT4gcG9zdHNKU09OXG4gICAgICAgIHZhbHVlc1sxXSAvLyA9PiBjb21tZW50c0pTT05cblxuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQGNsYXNzIFByb21pc2VcbiAgICAgIEBwYXJhbSB7ZnVuY3Rpb259IHJlc29sdmVyXG4gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gICAgICBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlKHJlc29sdmVyKSB7XG4gICAgICB0aGlzLl9pZCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRjb3VudGVyKys7XG4gICAgICB0aGlzLl9zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3Jlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3N1YnNjcmliZXJzID0gW107XG5cbiAgICAgIGlmIChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wICE9PSByZXNvbHZlcikge1xuICAgICAgICBpZiAoIWxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNGdW5jdGlvbihyZXNvbHZlcikpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNSZXNvbHZlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlKSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc05ldygpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW5pdGlhbGl6ZVByb21pc2UodGhpcywgcmVzb2x2ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLmFsbCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJGFsbCQkZGVmYXVsdDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5yYWNlID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmFjZSQkZGVmYXVsdDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5yZXNvbHZlID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVzb2x2ZSQkZGVmYXVsdDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5yZWplY3QgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZWplY3QkJGRlZmF1bHQ7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UuX3NldFNjaGVkdWxlciA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRTY2hlZHVsZXI7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UuX3NldEFzYXAgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2V0QXNhcDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5fYXNhcCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwO1xuXG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucHJvdG90eXBlID0ge1xuICAgICAgY29uc3RydWN0b3I6IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLFxuXG4gICAgLyoqXG4gICAgICBUaGUgcHJpbWFyeSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHByb21pc2UgaXMgdGhyb3VnaCBpdHMgYHRoZW5gIG1ldGhvZCxcbiAgICAgIHdoaWNoIHJlZ2lzdGVycyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBlaXRoZXIgYSBwcm9taXNlJ3MgZXZlbnR1YWwgdmFsdWUgb3IgdGhlXG4gICAgICByZWFzb24gd2h5IHRoZSBwcm9taXNlIGNhbm5vdCBiZSBmdWxmaWxsZWQuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24odXNlcil7XG4gICAgICAgIC8vIHVzZXIgaXMgYXZhaWxhYmxlXG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyB1c2VyIGlzIHVuYXZhaWxhYmxlLCBhbmQgeW91IGFyZSBnaXZlbiB0aGUgcmVhc29uIHdoeVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQ2hhaW5pbmdcbiAgICAgIC0tLS0tLS0tXG5cbiAgICAgIFRoZSByZXR1cm4gdmFsdWUgb2YgYHRoZW5gIGlzIGl0c2VsZiBhIHByb21pc2UuICBUaGlzIHNlY29uZCwgJ2Rvd25zdHJlYW0nXG4gICAgICBwcm9taXNlIGlzIHJlc29sdmVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZmlyc3QgcHJvbWlzZSdzIGZ1bGZpbGxtZW50XG4gICAgICBvciByZWplY3Rpb24gaGFuZGxlciwgb3IgcmVqZWN0ZWQgaWYgdGhlIGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICByZXR1cm4gdXNlci5uYW1lO1xuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICByZXR1cm4gJ2RlZmF1bHQgbmFtZSc7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh1c2VyTmFtZSkge1xuICAgICAgICAvLyBJZiBgZmluZFVzZXJgIGZ1bGZpbGxlZCwgYHVzZXJOYW1lYCB3aWxsIGJlIHRoZSB1c2VyJ3MgbmFtZSwgb3RoZXJ3aXNlIGl0XG4gICAgICAgIC8vIHdpbGwgYmUgYCdkZWZhdWx0IG5hbWUnYFxuICAgICAgfSk7XG5cbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jyk7XG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGZpbmRVc2VyYCByZWplY3RlZCBhbmQgd2UncmUgdW5oYXBweScpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZFxuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBpZiBgZmluZFVzZXJgIGZ1bGZpbGxlZCwgYHJlYXNvbmAgd2lsbCBiZSAnRm91bmQgdXNlciwgYnV0IHN0aWxsIHVuaGFwcHknLlxuICAgICAgICAvLyBJZiBgZmluZFVzZXJgIHJlamVjdGVkLCBgcmVhc29uYCB3aWxsIGJlICdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Jy5cbiAgICAgIH0pO1xuICAgICAgYGBgXG4gICAgICBJZiB0aGUgZG93bnN0cmVhbSBwcm9taXNlIGRvZXMgbm90IHNwZWNpZnkgYSByZWplY3Rpb24gaGFuZGxlciwgcmVqZWN0aW9uIHJlYXNvbnMgd2lsbCBiZSBwcm9wYWdhdGVkIGZ1cnRoZXIgZG93bnN0cmVhbS5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICB0aHJvdyBuZXcgUGVkYWdvZ2ljYWxFeGNlcHRpb24oJ1Vwc3RyZWFtIGVycm9yJyk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIC8vIFRoZSBgUGVkZ2Fnb2NpYWxFeGNlcHRpb25gIGlzIHByb3BhZ2F0ZWQgYWxsIHRoZSB3YXkgZG93biB0byBoZXJlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBBc3NpbWlsYXRpb25cbiAgICAgIC0tLS0tLS0tLS0tLVxuXG4gICAgICBTb21ldGltZXMgdGhlIHZhbHVlIHlvdSB3YW50IHRvIHByb3BhZ2F0ZSB0byBhIGRvd25zdHJlYW0gcHJvbWlzZSBjYW4gb25seSBiZVxuICAgICAgcmV0cmlldmVkIGFzeW5jaHJvbm91c2x5LiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSByZXR1cm5pbmcgYSBwcm9taXNlIGluIHRoZVxuICAgICAgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIGhhbmRsZXIuIFRoZSBkb3duc3RyZWFtIHByb21pc2Ugd2lsbCB0aGVuIGJlIHBlbmRpbmdcbiAgICAgIHVudGlsIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIHNldHRsZWQuIFRoaXMgaXMgY2FsbGVkICphc3NpbWlsYXRpb24qLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNvbW1lbnRzKSB7XG4gICAgICAgIC8vIFRoZSB1c2VyJ3MgY29tbWVudHMgYXJlIG5vdyBhdmFpbGFibGVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIElmIHRoZSBhc3NpbWxpYXRlZCBwcm9taXNlIHJlamVjdHMsIHRoZW4gdGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIGFsc28gcmVqZWN0LlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNvbW1lbnRzKSB7XG4gICAgICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgZnVsZmlsbHMsIHdlJ2xsIGhhdmUgdGhlIHZhbHVlIGhlcmVcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgLy8gSWYgYGZpbmRDb21tZW50c0J5QXV0aG9yYCByZWplY3RzLCB3ZSdsbCBoYXZlIHRoZSByZWFzb24gaGVyZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgU2ltcGxlIEV4YW1wbGVcbiAgICAgIC0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIFN5bmNocm9ub3VzIEV4YW1wbGVcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgdmFyIHJlc3VsdDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZmluZFJlc3VsdCgpO1xuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9XG4gICAgICBgYGBcblxuICAgICAgRXJyYmFjayBFeGFtcGxlXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kUmVzdWx0KGZ1bmN0aW9uKHJlc3VsdCwgZXJyKXtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIC8vIGZhaWx1cmVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzdWNjZXNzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFByb21pc2UgRXhhbXBsZTtcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgZmluZFJlc3VsdCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQWR2YW5jZWQgRXhhbXBsZVxuICAgICAgLS0tLS0tLS0tLS0tLS1cblxuICAgICAgU3luY2hyb25vdXMgRXhhbXBsZVxuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICB2YXIgYXV0aG9yLCBib29rcztcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXV0aG9yID0gZmluZEF1dGhvcigpO1xuICAgICAgICBib29rcyAgPSBmaW5kQm9va3NCeUF1dGhvcihhdXRob3IpO1xuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9XG4gICAgICBgYGBcblxuICAgICAgRXJyYmFjayBFeGFtcGxlXG5cbiAgICAgIGBgYGpzXG5cbiAgICAgIGZ1bmN0aW9uIGZvdW5kQm9va3MoYm9va3MpIHtcblxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmYWlsdXJlKHJlYXNvbikge1xuXG4gICAgICB9XG5cbiAgICAgIGZpbmRBdXRob3IoZnVuY3Rpb24oYXV0aG9yLCBlcnIpe1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgIC8vIGZhaWx1cmVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZmluZEJvb29rc0J5QXV0aG9yKGF1dGhvciwgZnVuY3Rpb24oYm9va3MsIGVycikge1xuICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBmb3VuZEJvb2tzKGJvb2tzKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgZmFpbHVyZShyZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBzdWNjZXNzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFByb21pc2UgRXhhbXBsZTtcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgZmluZEF1dGhvcigpLlxuICAgICAgICB0aGVuKGZpbmRCb29rc0J5QXV0aG9yKS5cbiAgICAgICAgdGhlbihmdW5jdGlvbihib29rcyl7XG4gICAgICAgICAgLy8gZm91bmQgYm9va3NcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBAbWV0aG9kIHRoZW5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uRnVsZmlsbGVkXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBvblJlamVjdGVkXG4gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gICAgICBAcmV0dXJuIHtQcm9taXNlfVxuICAgICovXG4gICAgICB0aGVuOiBmdW5jdGlvbihvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbikge1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gcGFyZW50Ll9zdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRCAmJiAhb25GdWxmaWxsbWVudCB8fCBzdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQgJiYgIW9uUmVqZWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hpbGQgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHBhcmVudC5fcmVzdWx0O1xuXG4gICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1tzdGF0ZSAtIDFdO1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpbnZva2VDYWxsYmFjayhzdGF0ZSwgY2hpbGQsIGNhbGxiYWNrLCByZXN1bHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9LFxuXG4gICAgLyoqXG4gICAgICBgY2F0Y2hgIGlzIHNpbXBseSBzdWdhciBmb3IgYHRoZW4odW5kZWZpbmVkLCBvblJlamVjdGlvbilgIHdoaWNoIG1ha2VzIGl0IHRoZSBzYW1lXG4gICAgICBhcyB0aGUgY2F0Y2ggYmxvY2sgb2YgYSB0cnkvY2F0Y2ggc3RhdGVtZW50LlxuXG4gICAgICBgYGBqc1xuICAgICAgZnVuY3Rpb24gZmluZEF1dGhvcigpe1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkbid0IGZpbmQgdGhhdCBhdXRob3InKTtcbiAgICAgIH1cblxuICAgICAgLy8gc3luY2hyb25vdXNcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpbmRBdXRob3IoKTtcbiAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICB9XG5cbiAgICAgIC8vIGFzeW5jIHdpdGggcHJvbWlzZXNcbiAgICAgIGZpbmRBdXRob3IoKS5jYXRjaChmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQG1ldGhvZCBjYXRjaFxuICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25SZWplY3Rpb25cbiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICAgKi9cbiAgICAgICdjYXRjaCc6IGZ1bmN0aW9uKG9uUmVqZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3Rpb24pO1xuICAgICAgfVxuICAgIH07XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHBvbHlmaWxsJCRwb2x5ZmlsbCgpIHtcbiAgICAgIHZhciBsb2NhbDtcblxuICAgICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgbG9jYWwgPSBnbG9iYWw7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxvY2FsID0gc2VsZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgbG9jYWwgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwb2x5ZmlsbCBmYWlsZWQgYmVjYXVzZSBnbG9iYWwgb2JqZWN0IGlzIHVuYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQnKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBQID0gbG9jYWwuUHJvbWlzZTtcblxuICAgICAgaWYgKFAgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFAucmVzb2x2ZSgpKSA9PT0gJ1tvYmplY3QgUHJvbWlzZV0nICYmICFQLmNhc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2NhbC5Qcm9taXNlID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQ7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJHBvbHlmaWxsO1xuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2UgPSB7XG4gICAgICAnUHJvbWlzZSc6IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRkZWZhdWx0LFxuICAgICAgJ3BvbHlmaWxsJzogbGliJGVzNiRwcm9taXNlJHBvbHlmaWxsJCRkZWZhdWx0XG4gICAgfTtcblxuICAgIC8qIGdsb2JhbCBkZWZpbmU6dHJ1ZSBtb2R1bGU6dHJ1ZSB3aW5kb3c6IHRydWUgKi9cbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKSB7XG4gICAgICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBsaWIkZXM2JHByb21pc2UkdW1kJCRFUzZQcm9taXNlOyB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZVsnZXhwb3J0cyddKSB7XG4gICAgICBtb2R1bGVbJ2V4cG9ydHMnXSA9IGxpYiRlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2U7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXNbJ0VTNlByb21pc2UnXSA9IGxpYiRlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2U7XG4gICAgfVxuXG4gICAgbGliJGVzNiRwcm9taXNlJHBvbHlmaWxsJCRkZWZhdWx0KCk7XG59KS5jYWxsKHRoaXMpO1xuXG4iXX0=\n},{\"_process\":23}],25:[function(require,module,exports){\nvar isFunction = require('is-function')\n\nmodule.exports = forEach\n\nvar toString = Object.prototype.toString\nvar hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction forEach(list, iterator, context) {\n if (!isFunction(iterator)) {\n throw new TypeError('iterator must be a function')\n }\n\n if (arguments.length < 3) {\n context = this\n }\n \n if (toString.call(list) === '[object Array]')\n forEachArray(list, iterator, context)\n else if (typeof list === 'string')\n forEachString(list, iterator, context)\n else\n forEachObject(list, iterator, context)\n}\n\nfunction forEachArray(array, iterator, context) {\n for (var i = 0, len = array.length; i < len; i++) {\n if (hasOwnProperty.call(array, i)) {\n iterator.call(context, array[i], i, array)\n }\n }\n}\n\nfunction forEachString(string, iterator, context) {\n for (var i = 0, len = string.length; i < len; i++) {\n // no such thing as a sparse string.\n iterator.call(context, string.charAt(i), i, string)\n }\n}\n\nfunction forEachObject(object, iterator, context) {\n for (var k in object) {\n if (hasOwnProperty.call(object, k)) {\n iterator.call(context, object[k], k, object)\n }\n }\n}\n\n},{\"is-function\":27}],26:[function(require,module,exports){\n(function (global){\nvar win;\n\nif (typeof window !== \"undefined\") {\n win = window;\n} else if (typeof global !== \"undefined\") {\n win = global;\n} else if (typeof self !== \"undefined\"){\n win = self;\n} else {\n win = {};\n}\n\nmodule.exports = win;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgd2luO1xuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbiA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbiA9IGdsb2JhbDtcbn0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIpe1xuICAgIHdpbiA9IHNlbGY7XG59IGVsc2Uge1xuICAgIHdpbiA9IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdpbjtcbiJdfQ==\n},{}],27:[function(require,module,exports){\nmodule.exports = isFunction\n\nvar toString = Object.prototype.toString\n\nfunction isFunction (fn) {\n var string = toString.call(fn)\n return string === '[object Function]' ||\n (typeof fn === 'function' && string !== '[object RegExp]') ||\n (typeof window !== 'undefined' &&\n // IE8 and below\n (fn === window.setTimeout ||\n fn === window.alert ||\n fn === window.confirm ||\n fn === window.prompt))\n};\n\n},{}],28:[function(require,module,exports){\nvar trim = require('trim')\n , forEach = require('for-each')\n , isArray = function(arg) {\n return Object.prototype.toString.call(arg) === '[object Array]';\n }\n\nmodule.exports = function (headers) {\n if (!headers)\n return {}\n\n var result = {}\n\n forEach(\n trim(headers).split('\\n')\n , function (row) {\n var index = row.indexOf(':')\n , key = trim(row.slice(0, index)).toLowerCase()\n , value = trim(row.slice(index + 1))\n\n if (typeof(result[key]) === 'undefined') {\n result[key] = value\n } else if (isArray(result[key])) {\n result[key].push(value)\n } else {\n result[key] = [ result[key], value ]\n }\n }\n )\n\n return result\n}\n},{\"for-each\":25,\"trim\":40}],29:[function(require,module,exports){\n(function (process){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n var result = splitPath(path),\n root = result[0],\n dir = result[1];\n\n if (!root && !dir) {\n // No dirname whatsoever\n return '.';\n }\n\n if (dir) {\n // It has a dirname, strip trailing slash\n dir = dir.substr(0, dir.length - 1);\n }\n\n return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n var f = splitPath(path)[2];\n // TODO: make this comparison case-insensitive on windows?\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\n\nexports.extname = function(path) {\n return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n\n}).call(this,require('_process'))\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9wYXRoLWJyb3dzZXJpZnkvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIHJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCBhcnJheSB3aXRoIGRpcmVjdG9yeSBuYW1lcyB0aGVyZVxuLy8gbXVzdCBiZSBubyBzbGFzaGVzLCBlbXB0eSBlbGVtZW50cywgb3IgZGV2aWNlIG5hbWVzIChjOlxcKSBpbiB0aGUgYXJyYXlcbi8vIChzbyBhbHNvIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMgLSBpdCBkb2VzIG5vdCBkaXN0aW5ndWlzaFxuLy8gcmVsYXRpdmUgYW5kIGFic29sdXRlIHBhdGhzKVxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocGFydHMsIGFsbG93QWJvdmVSb290KSB7XG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBsYXN0ID0gcGFydHNbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBwYXJ0cy51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG52YXIgc3BsaXRQYXRoUmUgPVxuICAgIC9eKFxcLz98KShbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXlxcL10rP3wpKFxcLlteLlxcL10qfCkpKD86W1xcL10qKSQvO1xudmFyIHNwbGl0UGF0aCA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTtcbn07XG5cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICB2YXIgcGF0aCA9IChpID49IDApID8gYXJndW1lbnRzW2ldIDogcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDtcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIHJldHVybiAoKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGgpIHx8ICcuJztcbn07XG5cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIGlmICghcGF0aCAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHBhdGggPSAnLic7XG4gIH1cbiAgaWYgKHBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIHBhdGggKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmpvaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGV4cG9ydHMubm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn07XG5cblxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xuICBmcm9tID0gZXhwb3J0cy5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSBleHBvcnRzLnJlc29sdmUodG8pLnN1YnN0cigxKTtcblxuICBmdW5jdGlvbiB0cmltKGFycikge1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgaWYgKGFycltlbmRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTtcbiAgfVxuXG4gIHZhciBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcblxuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn07XG5cbmV4cG9ydHMuc2VwID0gJy8nO1xuZXhwb3J0cy5kZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydHMuZGlybmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKSxcbiAgICAgIHJvb3QgPSByZXN1bHRbMF0sXG4gICAgICBkaXIgPSByZXN1bHRbMV07XG5cbiAgaWYgKCFyb290ICYmICFkaXIpIHtcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcbiAgICByZXR1cm4gJy4nO1xuICB9XG5cbiAgaWYgKGRpcikge1xuICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gcm9vdCArIGRpcjtcbn07XG5cblxuZXhwb3J0cy5iYXNlbmFtZSA9IGZ1bmN0aW9uKHBhdGgsIGV4dCkge1xuICB2YXIgZiA9IHNwbGl0UGF0aChwYXRoKVsyXTtcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBmO1xufTtcblxuXG5leHBvcnRzLmV4dG5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBzcGxpdFBhdGgocGF0aClbM107XG59O1xuXG5mdW5jdGlvbiBmaWx0ZXIgKHhzLCBmKSB7XG4gICAgaWYgKHhzLmZpbHRlcikgcmV0dXJuIHhzLmZpbHRlcihmKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZih4c1tpXSwgaSwgeHMpKSByZXMucHVzaCh4c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8vIFN0cmluZy5wcm90b3R5cGUuc3Vic3RyIC0gbmVnYXRpdmUgaW5kZXggZG9uJ3Qgd29yayBpbiBJRThcbnZhciBzdWJzdHIgPSAnYWInLnN1YnN0cigtMSkgPT09ICdiJ1xuICAgID8gZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikgeyByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKSB9XG4gICAgOiBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gc3RyLmxlbmd0aCArIHN0YXJ0O1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKTtcbiAgICB9XG47XG4iXX0=\n},{\"_process\":23}],30:[function(require,module,exports){\n/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require('./source-map/source-map-generator').SourceMapGenerator;\nexports.SourceMapConsumer = require('./source-map/source-map-consumer').SourceMapConsumer;\nexports.SourceNode = require('./source-map/source-node').SourceNode;\n\n},{\"./source-map/source-map-consumer\":36,\"./source-map/source-map-generator\":37,\"./source-map/source-node\":38}],31:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n var util = require('./util');\n\n /**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\n function ArraySet() {\n this._array = [];\n this._set = {};\n }\n\n /**\n * Static method for creating ArraySet instances from an existing array.\n */\n ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n var set = new ArraySet();\n for (var i = 0, len = aArray.length; i < len; i++) {\n set.add(aArray[i], aAllowDuplicates);\n }\n return set;\n };\n\n /**\n * Add the given string to this set.\n *\n * @param String aStr\n */\n ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n var isDuplicate = this.has(aStr);\n var idx = this._array.length;\n if (!isDuplicate || aAllowDuplicates) {\n this._array.push(aStr);\n }\n if (!isDuplicate) {\n this._set[util.toSetString(aStr)] = idx;\n }\n };\n\n /**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\n ArraySet.prototype.has = function ArraySet_has(aStr) {\n return Object.prototype.hasOwnProperty.call(this._set,\n util.toSetString(aStr));\n };\n\n /**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\n ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n if (this.has(aStr)) {\n return this._set[util.toSetString(aStr)];\n }\n throw new Error('\"' + aStr + '\" is not in the set.');\n };\n\n /**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\n ArraySet.prototype.at = function ArraySet_at(aIdx) {\n if (aIdx >= 0 && aIdx < this._array.length) {\n return this._array[aIdx];\n }\n throw new Error('No element indexed by ' + aIdx);\n };\n\n /**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\n ArraySet.prototype.toArray = function ArraySet_toArray() {\n return this._array.slice();\n };\n\n exports.ArraySet = ArraySet;\n\n});\n\n},{\"./util\":39,\"amdefine\":21}],32:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n * * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n var base64 = require('./base64');\n\n // A single base 64 digit can contain 6 bits of data. For the base 64 variable\n // length quantities we use in the source map spec, the first bit is the sign,\n // the next four bits are the actual value, and the 6th bit is the\n // continuation bit. The continuation bit tells us whether there are more\n // digits in this value following this digit.\n //\n // Continuation\n // | Sign\n // | |\n // V V\n // 101011\n\n var VLQ_BASE_SHIFT = 5;\n\n // binary: 100000\n var VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n // binary: 011111\n var VLQ_BASE_MASK = VLQ_BASE - 1;\n\n // binary: 100000\n var VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n /**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\n function toVLQSigned(aValue) {\n return aValue < 0\n ? ((-aValue) << 1) + 1\n : (aValue << 1) + 0;\n }\n\n /**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\n function fromVLQSigned(aValue) {\n var isNegative = (aValue & 1) === 1;\n var shifted = aValue >> 1;\n return isNegative\n ? -shifted\n : shifted;\n }\n\n /**\n * Returns the base 64 VLQ encoded value.\n */\n exports.encode = function base64VLQ_encode(aValue) {\n var encoded = \"\";\n var digit;\n\n var vlq = toVLQSigned(aValue);\n\n do {\n digit = vlq & VLQ_BASE_MASK;\n vlq >>>= VLQ_BASE_SHIFT;\n if (vlq > 0) {\n // There are still more digits in this value, so we must make sure the\n // continuation bit is marked.\n digit |= VLQ_CONTINUATION_BIT;\n }\n encoded += base64.encode(digit);\n } while (vlq > 0);\n\n return encoded;\n };\n\n /**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\n exports.decode = function base64VLQ_decode(aStr, aOutParam) {\n var i = 0;\n var strLen = aStr.length;\n var result = 0;\n var shift = 0;\n var continuation, digit;\n\n do {\n if (i >= strLen) {\n throw new Error(\"Expected more digits in base 64 VLQ value.\");\n }\n digit = base64.decode(aStr.charAt(i++));\n continuation = !!(digit & VLQ_CONTINUATION_BIT);\n digit &= VLQ_BASE_MASK;\n result = result + (digit << shift);\n shift += VLQ_BASE_SHIFT;\n } while (continuation);\n\n aOutParam.value = fromVLQSigned(result);\n aOutParam.rest = aStr.slice(i);\n };\n\n});\n\n},{\"./base64\":33,\"amdefine\":21}],33:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n var charToIntMap = {};\n var intToCharMap = {};\n\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n .split('')\n .forEach(function (ch, index) {\n charToIntMap[ch] = index;\n intToCharMap[index] = ch;\n });\n\n /**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\n exports.encode = function base64_encode(aNumber) {\n if (aNumber in intToCharMap) {\n return intToCharMap[aNumber];\n }\n throw new TypeError(\"Must be between 0 and 63: \" + aNumber);\n };\n\n /**\n * Decode a single base 64 digit to an integer.\n */\n exports.decode = function base64_decode(aChar) {\n if (aChar in charToIntMap) {\n return charToIntMap[aChar];\n }\n throw new TypeError(\"Not a valid base 64 digit: \" + aChar);\n };\n\n});\n\n},{\"amdefine\":21}],34:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n /**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n */\n function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare) {\n // This function terminates when one of the following is true:\n //\n // 1. We find the exact element we are looking for.\n //\n // 2. We did not find the exact element, but we can return the index of\n // the next closest element that is less than that element.\n //\n // 3. We did not find the exact element, and there is no next-closest\n // element which is less than the one we are searching for, so we\n // return -1.\n var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n var cmp = aCompare(aNeedle, aHaystack[mid], true);\n if (cmp === 0) {\n // Found the element we are looking for.\n return mid;\n }\n else if (cmp > 0) {\n // aHaystack[mid] is greater than our needle.\n if (aHigh - mid > 1) {\n // The element is in the upper half.\n return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare);\n }\n // We did not find an exact match, return the next closest one\n // (termination case 2).\n return mid;\n }\n else {\n // aHaystack[mid] is less than our needle.\n if (mid - aLow > 1) {\n // The element is in the lower half.\n return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare);\n }\n // The exact needle element was not found in this haystack. Determine if\n // we are in termination case (2) or (3) and return the appropriate thing.\n return aLow < 0 ? -1 : aLow;\n }\n }\n\n /**\n * This is an implementation of binary search which will always try and return\n * the index of next lowest value checked if there is no exact hit. This is\n * because mappings between original and generated line/col pairs are single\n * points, and there is an implicit region between each of them, so a miss\n * just means that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n * array and returns -1, 0, or 1 depending on whether the needle is less\n * than, equal to, or greater than the element, respectively.\n */\n exports.search = function search(aNeedle, aHaystack, aCompare) {\n if (aHaystack.length === 0) {\n return -1;\n }\n return recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare)\n };\n\n});\n\n},{\"amdefine\":21}],35:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n var util = require('./util');\n\n /**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\n function generatedPositionAfter(mappingA, mappingB) {\n // Optimized for most common case\n var lineA = mappingA.generatedLine;\n var lineB = mappingB.generatedLine;\n var columnA = mappingA.generatedColumn;\n var columnB = mappingB.generatedColumn;\n return lineB > lineA || lineB == lineA && columnB >= columnA ||\n util.compareByGeneratedPositions(mappingA, mappingB) <= 0;\n }\n\n /**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\n function MappingList() {\n this._array = [];\n this._sorted = true;\n // Serves as infimum\n this._last = {generatedLine: -1, generatedColumn: 0};\n }\n\n /**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\n MappingList.prototype.unsortedForEach =\n function MappingList_forEach(aCallback, aThisArg) {\n this._array.forEach(aCallback, aThisArg);\n };\n\n /**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\n MappingList.prototype.add = function MappingList_add(aMapping) {\n var mapping;\n if (generatedPositionAfter(this._last, aMapping)) {\n this._last = aMapping;\n this._array.push(aMapping);\n } else {\n this._sorted = false;\n this._array.push(aMapping);\n }\n };\n\n /**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\n MappingList.prototype.toArray = function MappingList_toArray() {\n if (!this._sorted) {\n this._array.sort(util.compareByGeneratedPositions);\n this._sorted = true;\n }\n return this._array;\n };\n\n exports.MappingList = MappingList;\n\n});\n\n},{\"./util\":39,\"amdefine\":21}],36:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n var util = require('./util');\n var binarySearch = require('./binary-search');\n var ArraySet = require('./array-set').ArraySet;\n var base64VLQ = require('./base64-vlq');\n\n /**\n * A SourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The only parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - sources: An array of URLs to the original source files.\n * - names: An array of identifiers which can be referrenced by individual mappings.\n * - sourceRoot: Optional. The URL root from which all sources are relative.\n * - sourcesContent: Optional. An array of contents of the original source files.\n * - mappings: A string of base64 VLQs which contain the actual mappings.\n * - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n * {\n * version : 3,\n * file: \"out.js\",\n * sourceRoot : \"\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AA,AB;;ABCDE;\"\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\n function SourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sources = util.getArg(sourceMap, 'sources');\n // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n // requires the array) to play nice here.\n var names = util.getArg(sourceMap, 'names', []);\n var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n var mappings = util.getArg(sourceMap, 'mappings');\n var file = util.getArg(sourceMap, 'file', null);\n\n // Once again, Sass deviates from the spec and supplies the version as a\n // string rather than a number, so we use loose equality checking here.\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n // Some source maps produce relative source paths like \"./foo.js\" instead of\n // \"foo.js\". Normalize these first so that future comparisons will succeed.\n // See bugzil.la/1090768.\n sources = sources.map(util.normalize);\n\n // Pass `true` below to allow duplicate names and sources. While source maps\n // are intended to be compressed and deduplicated, the TypeScript compiler\n // sometimes generates source maps with duplicates in them. See Github issue\n // #72 and bugzil.la/889492.\n this._names = ArraySet.fromArray(names, true);\n this._sources = ArraySet.fromArray(sources, true);\n\n this.sourceRoot = sourceRoot;\n this.sourcesContent = sourcesContent;\n this._mappings = mappings;\n this.file = file;\n }\n\n /**\n * Create a SourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n * The source map that will be consumed.\n * @returns SourceMapConsumer\n */\n SourceMapConsumer.fromSourceMap =\n function SourceMapConsumer_fromSourceMap(aSourceMap) {\n var smc = Object.create(SourceMapConsumer.prototype);\n\n smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n smc.sourceRoot = aSourceMap._sourceRoot;\n smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n smc.sourceRoot);\n smc.file = aSourceMap._file;\n\n smc.__generatedMappings = aSourceMap._mappings.toArray().slice();\n smc.__originalMappings = aSourceMap._mappings.toArray().slice()\n .sort(util.compareByOriginalPositions);\n\n return smc;\n };\n\n /**\n * The version of the source mapping spec that we are consuming.\n */\n SourceMapConsumer.prototype._version = 3;\n\n /**\n * The list of original sources.\n */\n Object.defineProperty(SourceMapConsumer.prototype, 'sources', {\n get: function () {\n return this._sources.toArray().map(function (s) {\n return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;\n }, this);\n }\n });\n\n // `__generatedMappings` and `__originalMappings` are arrays that hold the\n // parsed mapping coordinates from the source map's \"mappings\" attribute. They\n // are lazily instantiated, accessed via the `_generatedMappings` and\n // `_originalMappings` getters respectively, and we only parse the mappings\n // and create these arrays once queried for a source location. We jump through\n // these hoops because there can be many thousands of mappings, and parsing\n // them is expensive, so we only want to do it if we must.\n //\n // Each object in the arrays is of the form:\n //\n // {\n // generatedLine: The line number in the generated code,\n // generatedColumn: The column number in the generated code,\n // source: The path to the original source file that generated this\n // chunk of code,\n // originalLine: The line number in the original source that\n // corresponds to this chunk of generated code,\n // originalColumn: The column number in the original source that\n // corresponds to this chunk of generated code,\n // name: The name of the original symbol which generated this chunk of\n // code.\n // }\n //\n // All properties except for `generatedLine` and `generatedColumn` can be\n // `null`.\n //\n // `_generatedMappings` is ordered by the generated positions.\n //\n // `_originalMappings` is ordered by the original positions.\n\n SourceMapConsumer.prototype.__generatedMappings = null;\n Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n get: function () {\n if (!this.__generatedMappings) {\n this.__generatedMappings = [];\n this.__originalMappings = [];\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__generatedMappings;\n }\n });\n\n SourceMapConsumer.prototype.__originalMappings = null;\n Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n get: function () {\n if (!this.__originalMappings) {\n this.__generatedMappings = [];\n this.__originalMappings = [];\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__originalMappings;\n }\n });\n\n SourceMapConsumer.prototype._nextCharIsMappingSeparator =\n function SourceMapConsumer_nextCharIsMappingSeparator(aStr) {\n var c = aStr.charAt(0);\n return c === \";\" || c === \",\";\n };\n\n /**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\n SourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n var generatedLine = 1;\n var previousGeneratedColumn = 0;\n var previousOriginalLine = 0;\n var previousOriginalColumn = 0;\n var previousSource = 0;\n var previousName = 0;\n var str = aStr;\n var temp = {};\n var mapping;\n\n while (str.length > 0) {\n if (str.charAt(0) === ';') {\n generatedLine++;\n str = str.slice(1);\n previousGeneratedColumn = 0;\n }\n else if (str.charAt(0) === ',') {\n str = str.slice(1);\n }\n else {\n mapping = {};\n mapping.generatedLine = generatedLine;\n\n // Generated column.\n base64VLQ.decode(str, temp);\n mapping.generatedColumn = previousGeneratedColumn + temp.value;\n previousGeneratedColumn = mapping.generatedColumn;\n str = temp.rest;\n\n if (str.length > 0 && !this._nextCharIsMappingSeparator(str)) {\n // Original source.\n base64VLQ.decode(str, temp);\n mapping.source = this._sources.at(previousSource + temp.value);\n previousSource += temp.value;\n str = temp.rest;\n if (str.length === 0 || this._nextCharIsMappingSeparator(str)) {\n throw new Error('Found a source, but no line and column');\n }\n\n // Original line.\n base64VLQ.decode(str, temp);\n mapping.originalLine = previousOriginalLine + temp.value;\n previousOriginalLine = mapping.originalLine;\n // Lines are stored 0-based\n mapping.originalLine += 1;\n str = temp.rest;\n if (str.length === 0 || this._nextCharIsMappingSeparator(str)) {\n throw new Error('Found a source and line, but no column');\n }\n\n // Original column.\n base64VLQ.decode(str, temp);\n mapping.originalColumn = previousOriginalColumn + temp.value;\n previousOriginalColumn = mapping.originalColumn;\n str = temp.rest;\n\n if (str.length > 0 && !this._nextCharIsMappingSeparator(str)) {\n // Original name.\n base64VLQ.decode(str, temp);\n mapping.name = this._names.at(previousName + temp.value);\n previousName += temp.value;\n str = temp.rest;\n }\n }\n\n this.__generatedMappings.push(mapping);\n if (typeof mapping.originalLine === 'number') {\n this.__originalMappings.push(mapping);\n }\n }\n }\n\n this.__generatedMappings.sort(util.compareByGeneratedPositions);\n this.__originalMappings.sort(util.compareByOriginalPositions);\n };\n\n /**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\n SourceMapConsumer.prototype._findMapping =\n function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n aColumnName, aComparator) {\n // To return the position we are searching for, we must first find the\n // mapping for the given position and then return the opposite position it\n // points to. Because the mappings are sorted, we can use binary search to\n // find the best mapping.\n\n if (aNeedle[aLineName] <= 0) {\n throw new TypeError('Line must be greater than or equal to 1, got '\n + aNeedle[aLineName]);\n }\n if (aNeedle[aColumnName] < 0) {\n throw new TypeError('Column must be greater than or equal to 0, got '\n + aNeedle[aColumnName]);\n }\n\n return binarySearch.search(aNeedle, aMappings, aComparator);\n };\n\n /**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\n SourceMapConsumer.prototype.computeColumnSpans =\n function SourceMapConsumer_computeColumnSpans() {\n for (var index = 0; index < this._generatedMappings.length; ++index) {\n var mapping = this._generatedMappings[index];\n\n // Mappings do not contain a field for the last generated columnt. We\n // can come up with an optimistic estimate, however, by assuming that\n // mappings are contiguous (i.e. given two consecutive mappings, the\n // first mapping ends where the second one starts).\n if (index + 1 < this._generatedMappings.length) {\n var nextMapping = this._generatedMappings[index + 1];\n\n if (mapping.generatedLine === nextMapping.generatedLine) {\n mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n continue;\n }\n }\n\n // The last mapping for each line spans the entire line.\n mapping.lastGeneratedColumn = Infinity;\n }\n };\n\n /**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\n SourceMapConsumer.prototype.originalPositionFor =\n function SourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(needle,\n this._generatedMappings,\n \"generatedLine\",\n \"generatedColumn\",\n util.compareByGeneratedPositions);\n\n if (index >= 0) {\n var mapping = this._generatedMappings[index];\n\n if (mapping.generatedLine === needle.generatedLine) {\n var source = util.getArg(mapping, 'source', null);\n if (source != null && this.sourceRoot != null) {\n source = util.join(this.sourceRoot, source);\n }\n return {\n source: source,\n line: util.getArg(mapping, 'originalLine', null),\n column: util.getArg(mapping, 'originalColumn', null),\n name: util.getArg(mapping, 'name', null)\n };\n }\n }\n\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n };\n\n /**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * availible.\n */\n SourceMapConsumer.prototype.sourceContentFor =\n function SourceMapConsumer_sourceContentFor(aSource) {\n if (!this.sourcesContent) {\n return null;\n }\n\n if (this.sourceRoot != null) {\n aSource = util.relative(this.sourceRoot, aSource);\n }\n\n if (this._sources.has(aSource)) {\n return this.sourcesContent[this._sources.indexOf(aSource)];\n }\n\n var url;\n if (this.sourceRoot != null\n && (url = util.urlParse(this.sourceRoot))) {\n // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n // many users. We can help them out when they expect file:// URIs to\n // behave like it would if they were running a local HTTP server. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n var fileUriAbsPath = aSource.replace(/^file:\\/\\//, \"\");\n if (url.scheme == \"file\"\n && this._sources.has(fileUriAbsPath)) {\n return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n }\n\n if ((!url.path || url.path == \"/\")\n && this._sources.has(\"/\" + aSource)) {\n return this.sourcesContent[this._sources.indexOf(\"/\" + aSource)];\n }\n }\n\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n };\n\n /**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\n SourceMapConsumer.prototype.generatedPositionFor =\n function SourceMapConsumer_generatedPositionFor(aArgs) {\n var needle = {\n source: util.getArg(aArgs, 'source'),\n originalLine: util.getArg(aArgs, 'line'),\n originalColumn: util.getArg(aArgs, 'column')\n };\n\n if (this.sourceRoot != null) {\n needle.source = util.relative(this.sourceRoot, needle.source);\n }\n\n var index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions);\n\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n return {\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n };\n }\n\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n };\n\n /**\n * Returns all generated line and column information for the original source\n * and line provided. The only argument is an object with the following\n * properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n *\n * and an array of objects is returned, each with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\n SourceMapConsumer.prototype.allGeneratedPositionsFor =\n function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n // When there is no exact match, SourceMapConsumer.prototype._findMapping\n // returns the index of the closest mapping less than the needle. By\n // setting needle.originalColumn to Infinity, we thus find the last\n // mapping for the given line, provided such a mapping exists.\n var needle = {\n source: util.getArg(aArgs, 'source'),\n originalLine: util.getArg(aArgs, 'line'),\n originalColumn: Infinity\n };\n\n if (this.sourceRoot != null) {\n needle.source = util.relative(this.sourceRoot, needle.source);\n }\n\n var mappings = [];\n\n var index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions);\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n while (mapping && mapping.originalLine === needle.originalLine) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[--index];\n }\n }\n\n return mappings.reverse();\n };\n\n SourceMapConsumer.GENERATED_ORDER = 1;\n SourceMapConsumer.ORIGINAL_ORDER = 2;\n\n /**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n * The function that is called with each mapping.\n * @param Object aContext\n * Optional. If specified, this object will be the value of `this` every\n * time that `aCallback` is called.\n * @param aOrder\n * Either `SourceMapConsumer.GENERATED_ORDER` or\n * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n * iterate over the mappings sorted by the generated file's line/column\n * order or the original's source/line/column order, respectively. Defaults to\n * `SourceMapConsumer.GENERATED_ORDER`.\n */\n SourceMapConsumer.prototype.eachMapping =\n function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n var context = aContext || null;\n var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n var mappings;\n switch (order) {\n case SourceMapConsumer.GENERATED_ORDER:\n mappings = this._generatedMappings;\n break;\n case SourceMapConsumer.ORIGINAL_ORDER:\n mappings = this._originalMappings;\n break;\n default:\n throw new Error(\"Unknown order of iteration.\");\n }\n\n var sourceRoot = this.sourceRoot;\n mappings.map(function (mapping) {\n var source = mapping.source;\n if (source != null && sourceRoot != null) {\n source = util.join(sourceRoot, source);\n }\n return {\n source: source,\n generatedLine: mapping.generatedLine,\n generatedColumn: mapping.generatedColumn,\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: mapping.name\n };\n }).forEach(aCallback, context);\n };\n\n exports.SourceMapConsumer = SourceMapConsumer;\n\n});\n\n},{\"./array-set\":31,\"./base64-vlq\":32,\"./binary-search\":34,\"./util\":39,\"amdefine\":21}],37:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n var base64VLQ = require('./base64-vlq');\n var util = require('./util');\n var ArraySet = require('./array-set').ArraySet;\n var MappingList = require('./mapping-list').MappingList;\n\n /**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n * - file: The filename of the generated source.\n * - sourceRoot: A root for all relative URLs in this source map.\n */\n function SourceMapGenerator(aArgs) {\n if (!aArgs) {\n aArgs = {};\n }\n this._file = util.getArg(aArgs, 'file', null);\n this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n this._sources = new ArraySet();\n this._names = new ArraySet();\n this._mappings = new MappingList();\n this._sourcesContents = null;\n }\n\n SourceMapGenerator.prototype._version = 3;\n\n /**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\n SourceMapGenerator.fromSourceMap =\n function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n var sourceRoot = aSourceMapConsumer.sourceRoot;\n var generator = new SourceMapGenerator({\n file: aSourceMapConsumer.file,\n sourceRoot: sourceRoot\n });\n aSourceMapConsumer.eachMapping(function (mapping) {\n var newMapping = {\n generated: {\n line: mapping.generatedLine,\n column: mapping.generatedColumn\n }\n };\n\n if (mapping.source != null) {\n newMapping.source = mapping.source;\n if (sourceRoot != null) {\n newMapping.source = util.relative(sourceRoot, newMapping.source);\n }\n\n newMapping.original = {\n line: mapping.originalLine,\n column: mapping.originalColumn\n };\n\n if (mapping.name != null) {\n newMapping.name = mapping.name;\n }\n }\n\n generator.addMapping(newMapping);\n });\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n generator.setSourceContent(sourceFile, content);\n }\n });\n return generator;\n };\n\n /**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n * - generated: An object with the generated line and column positions.\n * - original: An object with the original line and column positions.\n * - source: The original source file (relative to the sourceRoot).\n * - name: An optional original token name for this mapping.\n */\n SourceMapGenerator.prototype.addMapping =\n function SourceMapGenerator_addMapping(aArgs) {\n var generated = util.getArg(aArgs, 'generated');\n var original = util.getArg(aArgs, 'original', null);\n var source = util.getArg(aArgs, 'source', null);\n var name = util.getArg(aArgs, 'name', null);\n\n if (!this._skipValidation) {\n this._validateMapping(generated, original, source, name);\n }\n\n if (source != null && !this._sources.has(source)) {\n this._sources.add(source);\n }\n\n if (name != null && !this._names.has(name)) {\n this._names.add(name);\n }\n\n this._mappings.add({\n generatedLine: generated.line,\n generatedColumn: generated.column,\n originalLine: original != null && original.line,\n originalColumn: original != null && original.column,\n source: source,\n name: name\n });\n };\n\n /**\n * Set the source content for a source file.\n */\n SourceMapGenerator.prototype.setSourceContent =\n function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n var source = aSourceFile;\n if (this._sourceRoot != null) {\n source = util.relative(this._sourceRoot, source);\n }\n\n if (aSourceContent != null) {\n // Add the source content to the _sourcesContents map.\n // Create a new _sourcesContents map if the property is null.\n if (!this._sourcesContents) {\n this._sourcesContents = {};\n }\n this._sourcesContents[util.toSetString(source)] = aSourceContent;\n } else if (this._sourcesContents) {\n // Remove the source file from the _sourcesContents map.\n // If the _sourcesContents map is empty, set the property to null.\n delete this._sourcesContents[util.toSetString(source)];\n if (Object.keys(this._sourcesContents).length === 0) {\n this._sourcesContents = null;\n }\n }\n };\n\n /**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n * If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n * to be applied. If relative, it is relative to the SourceMapConsumer.\n * This parameter is needed when the two source maps aren't in the same\n * directory, and the source map to be applied contains relative source\n * paths. If so, those relative source paths need to be rewritten\n * relative to the SourceMapGenerator.\n */\n SourceMapGenerator.prototype.applySourceMap =\n function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n var sourceFile = aSourceFile;\n // If aSourceFile is omitted, we will use the file property of the SourceMap\n if (aSourceFile == null) {\n if (aSourceMapConsumer.file == null) {\n throw new Error(\n 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n 'or the source map\\'s \"file\" property. Both were omitted.'\n );\n }\n sourceFile = aSourceMapConsumer.file;\n }\n var sourceRoot = this._sourceRoot;\n // Make \"sourceFile\" relative if an absolute Url is passed.\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n // Applying the SourceMap can add and remove items from the sources and\n // the names array.\n var newSources = new ArraySet();\n var newNames = new ArraySet();\n\n // Find mappings for the \"sourceFile\"\n this._mappings.unsortedForEach(function (mapping) {\n if (mapping.source === sourceFile && mapping.originalLine != null) {\n // Check if it can be mapped by the source map, then update the mapping.\n var original = aSourceMapConsumer.originalPositionFor({\n line: mapping.originalLine,\n column: mapping.originalColumn\n });\n if (original.source != null) {\n // Copy mapping\n mapping.source = original.source;\n if (aSourceMapPath != null) {\n mapping.source = util.join(aSourceMapPath, mapping.source)\n }\n if (sourceRoot != null) {\n mapping.source = util.relative(sourceRoot, mapping.source);\n }\n mapping.originalLine = original.line;\n mapping.originalColumn = original.column;\n if (original.name != null) {\n mapping.name = original.name;\n }\n }\n }\n\n var source = mapping.source;\n if (source != null && !newSources.has(source)) {\n newSources.add(source);\n }\n\n var name = mapping.name;\n if (name != null && !newNames.has(name)) {\n newNames.add(name);\n }\n\n }, this);\n this._sources = newSources;\n this._names = newNames;\n\n // Copy sourcesContents of applied map.\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aSourceMapPath != null) {\n sourceFile = util.join(aSourceMapPath, sourceFile);\n }\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n this.setSourceContent(sourceFile, content);\n }\n }, this);\n };\n\n /**\n * A mapping can have one of the three levels of data:\n *\n * 1. Just the generated position.\n * 2. The Generated position, original position, and original source.\n * 3. Generated and original position, original source, as well as a name\n * token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\n SourceMapGenerator.prototype._validateMapping =\n function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n aName) {\n if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aGenerated.line > 0 && aGenerated.column >= 0\n && !aOriginal && !aSource && !aName) {\n // Case 1.\n return;\n }\n else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n && aGenerated.line > 0 && aGenerated.column >= 0\n && aOriginal.line > 0 && aOriginal.column >= 0\n && aSource) {\n // Cases 2 and 3.\n return;\n }\n else {\n throw new Error('Invalid mapping: ' + JSON.stringify({\n generated: aGenerated,\n source: aSource,\n original: aOriginal,\n name: aName\n }));\n }\n };\n\n /**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\n SourceMapGenerator.prototype._serializeMappings =\n function SourceMapGenerator_serializeMappings() {\n var previousGeneratedColumn = 0;\n var previousGeneratedLine = 1;\n var previousOriginalColumn = 0;\n var previousOriginalLine = 0;\n var previousName = 0;\n var previousSource = 0;\n var result = '';\n var mapping;\n\n var mappings = this._mappings.toArray();\n\n for (var i = 0, len = mappings.length; i < len; i++) {\n mapping = mappings[i];\n\n if (mapping.generatedLine !== previousGeneratedLine) {\n previousGeneratedColumn = 0;\n while (mapping.generatedLine !== previousGeneratedLine) {\n result += ';';\n previousGeneratedLine++;\n }\n }\n else {\n if (i > 0) {\n if (!util.compareByGeneratedPositions(mapping, mappings[i - 1])) {\n continue;\n }\n result += ',';\n }\n }\n\n result += base64VLQ.encode(mapping.generatedColumn\n - previousGeneratedColumn);\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (mapping.source != null) {\n result += base64VLQ.encode(this._sources.indexOf(mapping.source)\n - previousSource);\n previousSource = this._sources.indexOf(mapping.source);\n\n // lines are stored 0-based in SourceMap spec version 3\n result += base64VLQ.encode(mapping.originalLine - 1\n - previousOriginalLine);\n previousOriginalLine = mapping.originalLine - 1;\n\n result += base64VLQ.encode(mapping.originalColumn\n - previousOriginalColumn);\n previousOriginalColumn = mapping.originalColumn;\n\n if (mapping.name != null) {\n result += base64VLQ.encode(this._names.indexOf(mapping.name)\n - previousName);\n previousName = this._names.indexOf(mapping.name);\n }\n }\n }\n\n return result;\n };\n\n SourceMapGenerator.prototype._generateSourcesContent =\n function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n return aSources.map(function (source) {\n if (!this._sourcesContents) {\n return null;\n }\n if (aSourceRoot != null) {\n source = util.relative(aSourceRoot, source);\n }\n var key = util.toSetString(source);\n return Object.prototype.hasOwnProperty.call(this._sourcesContents,\n key)\n ? this._sourcesContents[key]\n : null;\n }, this);\n };\n\n /**\n * Externalize the source map.\n */\n SourceMapGenerator.prototype.toJSON =\n function SourceMapGenerator_toJSON() {\n var map = {\n version: this._version,\n sources: this._sources.toArray(),\n names: this._names.toArray(),\n mappings: this._serializeMappings()\n };\n if (this._file != null) {\n map.file = this._file;\n }\n if (this._sourceRoot != null) {\n map.sourceRoot = this._sourceRoot;\n }\n if (this._sourcesContents) {\n map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n }\n\n return map;\n };\n\n /**\n * Render the source map being generated to a string.\n */\n SourceMapGenerator.prototype.toString =\n function SourceMapGenerator_toString() {\n return JSON.stringify(this);\n };\n\n exports.SourceMapGenerator = SourceMapGenerator;\n\n});\n\n},{\"./array-set\":31,\"./base64-vlq\":32,\"./mapping-list\":35,\"./util\":39,\"amdefine\":21}],38:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\n var util = require('./util');\n\n // Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n // operating systems these days (capturing the result).\n var REGEX_NEWLINE = /(\\r?\\n)/;\n\n // Newline character code for charCodeAt() comparisons\n var NEWLINE_CODE = 10;\n\n // Private symbol for identifying `SourceNode`s when multiple versions of\n // the source-map library are loaded. This MUST NOT CHANGE across\n // versions!\n var isSourceNode = \"$$$isSourceNode$$$\";\n\n /**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n * generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\n function SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n this.children = [];\n this.sourceContents = {};\n this.line = aLine == null ? null : aLine;\n this.column = aColumn == null ? null : aColumn;\n this.source = aSource == null ? null : aSource;\n this.name = aName == null ? null : aName;\n this[isSourceNode] = true;\n if (aChunks != null) this.add(aChunks);\n }\n\n /**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n * SourceMapConsumer should be relative to.\n */\n SourceNode.fromStringWithSourceMap =\n function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n // The SourceNode we want to fill with the generated code\n // and the SourceMap\n var node = new SourceNode();\n\n // All even indices of this array are one line of the generated code,\n // while all odd indices are the newlines between two adjacent lines\n // (since `REGEX_NEWLINE` captures its match).\n // Processed fragments are removed from this array, by calling `shiftNextLine`.\n var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n var shiftNextLine = function() {\n var lineContents = remainingLines.shift();\n // The last line of a file might not have a newline.\n var newLine = remainingLines.shift() || \"\";\n return lineContents + newLine;\n };\n\n // We need to remember the position of \"remainingLines\"\n var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n // The generate SourceNodes we need a code range.\n // To extract it current and last mapping is used.\n // Here we store the last mapping.\n var lastMapping = null;\n\n aSourceMapConsumer.eachMapping(function (mapping) {\n if (lastMapping !== null) {\n // We add the code from \"lastMapping\" to \"mapping\":\n // First check if there is a new line in between.\n if (lastGeneratedLine < mapping.generatedLine) {\n var code = \"\";\n // Associate first line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n lastGeneratedLine++;\n lastGeneratedColumn = 0;\n // The remaining code is added without mapping\n } else {\n // There is no new line in between.\n // Associate the code between \"lastGeneratedColumn\" and\n // \"mapping.generatedColumn\" with \"lastMapping\"\n var nextLine = remainingLines[0];\n var code = nextLine.substr(0, mapping.generatedColumn -\n lastGeneratedColumn);\n remainingLines[0] = nextLine.substr(mapping.generatedColumn -\n lastGeneratedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n addMappingWithCode(lastMapping, code);\n // No more remaining code, continue\n lastMapping = mapping;\n return;\n }\n }\n // We add the generated code until the first mapping\n // to the SourceNode without any mapping.\n // Each line is added as separate string.\n while (lastGeneratedLine < mapping.generatedLine) {\n node.add(shiftNextLine());\n lastGeneratedLine++;\n }\n if (lastGeneratedColumn < mapping.generatedColumn) {\n var nextLine = remainingLines[0];\n node.add(nextLine.substr(0, mapping.generatedColumn));\n remainingLines[0] = nextLine.substr(mapping.generatedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n }\n lastMapping = mapping;\n }, this);\n // We have processed all mappings.\n if (remainingLines.length > 0) {\n if (lastMapping) {\n // Associate the remaining code in the current line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n }\n // and add the remaining lines without any mapping\n node.add(remainingLines.join(\"\"));\n }\n\n // Copy sourcesContent into SourceNode\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aRelativePath != null) {\n sourceFile = util.join(aRelativePath, sourceFile);\n }\n node.setSourceContent(sourceFile, content);\n }\n });\n\n return node;\n\n function addMappingWithCode(mapping, code) {\n if (mapping === null || mapping.source === undefined) {\n node.add(code);\n } else {\n var source = aRelativePath\n ? util.join(aRelativePath, mapping.source)\n : mapping.source;\n node.add(new SourceNode(mapping.originalLine,\n mapping.originalColumn,\n source,\n code,\n mapping.name));\n }\n }\n };\n\n /**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\n SourceNode.prototype.add = function SourceNode_add(aChunk) {\n if (Array.isArray(aChunk)) {\n aChunk.forEach(function (chunk) {\n this.add(chunk);\n }, this);\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n if (aChunk) {\n this.children.push(aChunk);\n }\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n };\n\n /**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\n SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n if (Array.isArray(aChunk)) {\n for (var i = aChunk.length-1; i >= 0; i--) {\n this.prepend(aChunk[i]);\n }\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n this.children.unshift(aChunk);\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n };\n\n /**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\n SourceNode.prototype.walk = function SourceNode_walk(aFn) {\n var chunk;\n for (var i = 0, len = this.children.length; i < len; i++) {\n chunk = this.children[i];\n if (chunk[isSourceNode]) {\n chunk.walk(aFn);\n }\n else {\n if (chunk !== '') {\n aFn(chunk, { source: this.source,\n line: this.line,\n column: this.column,\n name: this.name });\n }\n }\n }\n };\n\n /**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\n SourceNode.prototype.join = function SourceNode_join(aSep) {\n var newChildren;\n var i;\n var len = this.children.length;\n if (len > 0) {\n newChildren = [];\n for (i = 0; i < len-1; i++) {\n newChildren.push(this.children[i]);\n newChildren.push(aSep);\n }\n newChildren.push(this.children[i]);\n this.children = newChildren;\n }\n return this;\n };\n\n /**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\n SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n var lastChild = this.children[this.children.length - 1];\n if (lastChild[isSourceNode]) {\n lastChild.replaceRight(aPattern, aReplacement);\n }\n else if (typeof lastChild === 'string') {\n this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n }\n else {\n this.children.push(''.replace(aPattern, aReplacement));\n }\n return this;\n };\n\n /**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\n SourceNode.prototype.setSourceContent =\n function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n };\n\n /**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\n SourceNode.prototype.walkSourceContents =\n function SourceNode_walkSourceContents(aFn) {\n for (var i = 0, len = this.children.length; i < len; i++) {\n if (this.children[i][isSourceNode]) {\n this.children[i].walkSourceContents(aFn);\n }\n }\n\n var sources = Object.keys(this.sourceContents);\n for (var i = 0, len = sources.length; i < len; i++) {\n aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n }\n };\n\n /**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\n SourceNode.prototype.toString = function SourceNode_toString() {\n var str = \"\";\n this.walk(function (chunk) {\n str += chunk;\n });\n return str;\n };\n\n /**\n * Returns the string representation of this source node along with a source\n * map.\n */\n SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n var generated = {\n code: \"\",\n line: 1,\n column: 0\n };\n var map = new SourceMapGenerator(aArgs);\n var sourceMappingActive = false;\n var lastOriginalSource = null;\n var lastOriginalLine = null;\n var lastOriginalColumn = null;\n var lastOriginalName = null;\n this.walk(function (chunk, original) {\n generated.code += chunk;\n if (original.source !== null\n && original.line !== null\n && original.column !== null) {\n if(lastOriginalSource !== original.source\n || lastOriginalLine !== original.line\n || lastOriginalColumn !== original.column\n || lastOriginalName !== original.name) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n lastOriginalSource = original.source;\n lastOriginalLine = original.line;\n lastOriginalColumn = original.column;\n lastOriginalName = original.name;\n sourceMappingActive = true;\n } else if (sourceMappingActive) {\n map.addMapping({\n generated: {\n line: generated.line,\n column: generated.column\n }\n });\n lastOriginalSource = null;\n sourceMappingActive = false;\n }\n for (var idx = 0, length = chunk.length; idx < length; idx++) {\n if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n generated.line++;\n generated.column = 0;\n // Mappings end at eol\n if (idx + 1 === length) {\n lastOriginalSource = null;\n sourceMappingActive = false;\n } else if (sourceMappingActive) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n } else {\n generated.column++;\n }\n }\n });\n this.walkSourceContents(function (sourceFile, sourceContent) {\n map.setSourceContent(sourceFile, sourceContent);\n });\n\n return { code: generated.code, map: map };\n };\n\n exports.SourceNode = SourceNode;\n\n});\n\n},{\"./source-map-generator\":37,\"./util\":39,\"amdefine\":21}],39:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n /**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\n function getArg(aArgs, aName, aDefaultValue) {\n if (aName in aArgs) {\n return aArgs[aName];\n } else if (arguments.length === 3) {\n return aDefaultValue;\n } else {\n throw new Error('\"' + aName + '\" is a required argument.');\n }\n }\n exports.getArg = getArg;\n\n var urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/;\n var dataUrlRegexp = /^data:.+\\,.+$/;\n\n function urlParse(aUrl) {\n var match = aUrl.match(urlRegexp);\n if (!match) {\n return null;\n }\n return {\n scheme: match[1],\n auth: match[2],\n host: match[3],\n port: match[4],\n path: match[5]\n };\n }\n exports.urlParse = urlParse;\n\n function urlGenerate(aParsedUrl) {\n var url = '';\n if (aParsedUrl.scheme) {\n url += aParsedUrl.scheme + ':';\n }\n url += '//';\n if (aParsedUrl.auth) {\n url += aParsedUrl.auth + '@';\n }\n if (aParsedUrl.host) {\n url += aParsedUrl.host;\n }\n if (aParsedUrl.port) {\n url += \":\" + aParsedUrl.port\n }\n if (aParsedUrl.path) {\n url += aParsedUrl.path;\n }\n return url;\n }\n exports.urlGenerate = urlGenerate;\n\n /**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consequtive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\n function normalize(aPath) {\n var path = aPath;\n var url = urlParse(aPath);\n if (url) {\n if (!url.path) {\n return aPath;\n }\n path = url.path;\n }\n var isAbsolute = (path.charAt(0) === '/');\n\n var parts = path.split(/\\/+/);\n for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n part = parts[i];\n if (part === '.') {\n parts.splice(i, 1);\n } else if (part === '..') {\n up++;\n } else if (up > 0) {\n if (part === '') {\n // The first part is blank if the path is absolute. Trying to go\n // above the root is a no-op. Therefore we can remove all '..' parts\n // directly after the root.\n parts.splice(i + 1, up);\n up = 0;\n } else {\n parts.splice(i, 2);\n up--;\n }\n }\n }\n path = parts.join('/');\n\n if (path === '') {\n path = isAbsolute ? '/' : '.';\n }\n\n if (url) {\n url.path = path;\n return urlGenerate(url);\n }\n return path;\n }\n exports.normalize = normalize;\n\n /**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n * first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n * is updated with the result and aRoot is returned. Otherwise the result\n * is returned.\n * - If aPath is absolute, the result is aPath.\n * - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\n function join(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n if (aPath === \"\") {\n aPath = \".\";\n }\n var aPathUrl = urlParse(aPath);\n var aRootUrl = urlParse(aRoot);\n if (aRootUrl) {\n aRoot = aRootUrl.path || '/';\n }\n\n // `join(foo, '//www.example.org')`\n if (aPathUrl && !aPathUrl.scheme) {\n if (aRootUrl) {\n aPathUrl.scheme = aRootUrl.scheme;\n }\n return urlGenerate(aPathUrl);\n }\n\n if (aPathUrl || aPath.match(dataUrlRegexp)) {\n return aPath;\n }\n\n // `join('http://', 'www.example.com')`\n if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n aRootUrl.host = aPath;\n return urlGenerate(aRootUrl);\n }\n\n var joined = aPath.charAt(0) === '/'\n ? aPath\n : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n if (aRootUrl) {\n aRootUrl.path = joined;\n return urlGenerate(aRootUrl);\n }\n return joined;\n }\n exports.join = join;\n\n /**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\n function relative(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n\n aRoot = aRoot.replace(/\\/$/, '');\n\n // XXX: It is possible to remove this block, and the tests still pass!\n var url = urlParse(aRoot);\n if (aPath.charAt(0) == \"/\" && url && url.path == \"/\") {\n return aPath.slice(1);\n }\n\n return aPath.indexOf(aRoot + '/') === 0\n ? aPath.substr(aRoot.length + 1)\n : aPath;\n }\n exports.relative = relative;\n\n /**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\n function toSetString(aStr) {\n return '$' + aStr;\n }\n exports.toSetString = toSetString;\n\n function fromSetString(aStr) {\n return aStr.substr(1);\n }\n exports.fromSetString = fromSetString;\n\n function strcmp(aStr1, aStr2) {\n var s1 = aStr1 || \"\";\n var s2 = aStr2 || \"\";\n return (s1 > s2) - (s1 < s2);\n }\n\n /**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\n function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n var cmp;\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp || onlyCompareOriginal) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.name, mappingB.name);\n if (cmp) {\n return cmp;\n }\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n return mappingA.generatedColumn - mappingB.generatedColumn;\n };\n exports.compareByOriginalPositions = compareByOriginalPositions;\n\n /**\n * Comparator between two mappings where the generated positions are\n * compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\n function compareByGeneratedPositions(mappingA, mappingB, onlyCompareGenerated) {\n var cmp;\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp || onlyCompareGenerated) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n };\n exports.compareByGeneratedPositions = compareByGeneratedPositions;\n\n});\n\n},{\"amdefine\":21}],40:[function(require,module,exports){\n\nexports = module.exports = trim;\n\nfunction trim(str){\n return str.replace(/^\\s*|\\s*$/g, '');\n}\n\nexports.left = function(str){\n return str.replace(/^\\s*/, '');\n};\n\nexports.right = function(str){\n return str.replace(/\\s*$/, '');\n};\n\n},{}],41:[function(require,module,exports){\n\"use strict\";\nvar window = require(\"global/window\")\nvar isFunction = require(\"is-function\")\nvar parseHeaders = require(\"parse-headers\")\nvar xtend = require(\"xtend\")\n\nmodule.exports = createXHR\ncreateXHR.XMLHttpRequest = window.XMLHttpRequest || noop\ncreateXHR.XDomainRequest = \"withCredentials\" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest\n\nforEachArray([\"get\", \"put\", \"post\", \"patch\", \"head\", \"delete\"], function(method) {\n createXHR[method === \"delete\" ? \"del\" : method] = function(uri, options, callback) {\n options = initParams(uri, options, callback)\n options.method = method.toUpperCase()\n return _createXHR(options)\n }\n})\n\nfunction forEachArray(array, iterator) {\n for (var i = 0; i < array.length; i++) {\n iterator(array[i])\n }\n}\n\nfunction isEmpty(obj){\n for(var i in obj){\n if(obj.hasOwnProperty(i)) return false\n }\n return true\n}\n\nfunction initParams(uri, options, callback) {\n var params = uri\n\n if (isFunction(options)) {\n callback = options\n if (typeof uri === \"string\") {\n params = {uri:uri}\n }\n } else {\n params = xtend(options, {uri: uri})\n }\n\n params.callback = callback\n return params\n}\n\nfunction createXHR(uri, options, callback) {\n options = initParams(uri, options, callback)\n return _createXHR(options)\n}\n\nfunction _createXHR(options) {\n if(typeof options.callback === \"undefined\"){\n throw new Error(\"callback argument missing\")\n }\n\n var called = false\n var callback = function cbOnce(err, response, body){\n if(!called){\n called = true\n options.callback(err, response, body)\n }\n }\n\n function readystatechange() {\n if (xhr.readyState === 4) {\n setTimeout(loadFunc, 0)\n }\n }\n\n function getBody() {\n // Chrome with requestType=blob throws errors arround when even testing access to responseText\n var body = undefined\n\n if (xhr.response) {\n body = xhr.response\n } else {\n body = xhr.responseText || getXml(xhr)\n }\n\n if (isJson) {\n try {\n body = JSON.parse(body)\n } catch (e) {}\n }\n\n return body\n }\n\n function errorFunc(evt) {\n clearTimeout(timeoutTimer)\n if(!(evt instanceof Error)){\n evt = new Error(\"\" + (evt || \"Unknown XMLHttpRequest Error\") )\n }\n evt.statusCode = 0\n return callback(evt, failureResponse)\n }\n\n // will load the data & process the response in a special response object\n function loadFunc() {\n if (aborted) return\n var status\n clearTimeout(timeoutTimer)\n if(options.useXDR && xhr.status===undefined) {\n //IE8 CORS GET successful response doesn't have a status field, but body is fine\n status = 200\n } else {\n status = (xhr.status === 1223 ? 204 : xhr.status)\n }\n var response = failureResponse\n var err = null\n\n if (status !== 0){\n response = {\n body: getBody(),\n statusCode: status,\n method: method,\n headers: {},\n url: uri,\n rawRequest: xhr\n }\n if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE\n response.headers = parseHeaders(xhr.getAllResponseHeaders())\n }\n } else {\n err = new Error(\"Internal XMLHttpRequest Error\")\n }\n return callback(err, response, response.body)\n }\n\n var xhr = options.xhr || null\n\n if (!xhr) {\n if (options.cors || options.useXDR) {\n xhr = new createXHR.XDomainRequest()\n }else{\n xhr = new createXHR.XMLHttpRequest()\n }\n }\n\n var key\n var aborted\n var uri = xhr.url = options.uri || options.url\n var method = xhr.method = options.method || \"GET\"\n var body = options.body || options.data\n var headers = xhr.headers = options.headers || {}\n var sync = !!options.sync\n var isJson = false\n var timeoutTimer\n var failureResponse = {\n body: undefined,\n headers: {},\n statusCode: 0,\n method: method,\n url: uri,\n rawRequest: xhr\n }\n\n if (\"json\" in options && options.json !== false) {\n isJson = true\n headers[\"accept\"] || headers[\"Accept\"] || (headers[\"Accept\"] = \"application/json\") //Don't override existing accept header declared by user\n if (method !== \"GET\" && method !== \"HEAD\") {\n headers[\"content-type\"] || headers[\"Content-Type\"] || (headers[\"Content-Type\"] = \"application/json\") //Don't override existing accept header declared by user\n body = JSON.stringify(options.json === true ? body : options.json)\n }\n }\n\n xhr.onreadystatechange = readystatechange\n xhr.onload = loadFunc\n xhr.onerror = errorFunc\n // IE9 must have onprogress be set to a unique function.\n xhr.onprogress = function () {\n // IE must die\n }\n xhr.onabort = function(){\n aborted = true;\n }\n xhr.ontimeout = errorFunc\n xhr.open(method, uri, !sync, options.username, options.password)\n //has to be after open\n if(!sync) {\n xhr.withCredentials = !!options.withCredentials\n }\n // Cannot set timeout with sync request\n // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly\n // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent\n if (!sync && options.timeout > 0 ) {\n timeoutTimer = setTimeout(function(){\n if (aborted) return\n aborted = true//IE9 may still call readystatechange\n xhr.abort(\"timeout\")\n var e = new Error(\"XMLHttpRequest timeout\")\n e.code = \"ETIMEDOUT\"\n errorFunc(e)\n }, options.timeout )\n }\n\n if (xhr.setRequestHeader) {\n for(key in headers){\n if(headers.hasOwnProperty(key)){\n xhr.setRequestHeader(key, headers[key])\n }\n }\n } else if (options.headers && !isEmpty(options.headers)) {\n throw new Error(\"Headers cannot be set on an XDomainRequest object\")\n }\n\n if (\"responseType\" in options) {\n xhr.responseType = options.responseType\n }\n\n if (\"beforeSend\" in options &&\n typeof options.beforeSend === \"function\"\n ) {\n options.beforeSend(xhr)\n }\n\n // Microsoft Edge browser sends \"undefined\" when send is called with undefined value.\n // XMLHttpRequest spec says to pass null as body to indicate no body\n // See https://github.com/naugtur/xhr/issues/100.\n xhr.send(body || null)\n\n return xhr\n\n\n}\n\nfunction getXml(xhr) {\n // xhr.responseXML will throw Exception \"InvalidStateError\" or \"DOMException\"\n // See https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseXML.\n try {\n if (xhr.responseType === \"document\") {\n return xhr.responseXML\n }\n var firefoxBugTakenEffect = xhr.responseXML && xhr.responseXML.documentElement.nodeName === \"parsererror\"\n if (xhr.responseType === \"\" && !firefoxBugTakenEffect) {\n return xhr.responseXML\n }\n } catch (e) {}\n\n return null\n}\n\nfunction noop() {}\n\n},{\"global/window\":26,\"is-function\":27,\"parse-headers\":28,\"xtend\":42}],42:[function(require,module,exports){\nmodule.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n var target = {}\n\n for (var i = 0; i < arguments.length; i++) {\n var source = arguments[i]\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n\n return target\n}\n\n},{}],43:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n//Import helpers\n\nvar _helpers = require('./helpers');\n\n//Import partials\n\nvar _partials_list = require('./partials/_list');\n\nvar _partials_list2 = _interopRequireDefault(_partials_list);\n\nvar Handlebars = require('Handlebars');\n(0, _helpers.ifEquals)();\n(0, _partials_list2['default'])();\n\nexports['default'] = Handlebars;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL0hhbmRsZWJhcnMvaGFuZGxlYmFycy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7dUJBS1ksV0FBVzs7Ozs2QkFJbEIsa0JBQWtCOzs7O0FBUHBDLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUl2Qyx3QkFBVSxDQUFDO0FBSVgsaUNBQU8sQ0FBQzs7cUJBRU8sVUFBVSIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jcm93ZGZ1bmRpbmctcGxlZGdlLWJveC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9IYW5kbGViYXJzL2hhbmRsZWJhcnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG5sZXQgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ0hhbmRsZWJhcnMnKTtcclxuXHJcbi8vSW1wb3J0IGhlbHBlcnNcclxuaW1wb3J0IHsgaWZFcXVhbHMgfSBmcm9tICcuL2hlbHBlcnMnO1xyXG5pZkVxdWFscygpO1xyXG5cclxuLy9JbXBvcnQgcGFydGlhbHNcclxuaW1wb3J0IF9saXN0IGZyb20gJy4vcGFydGlhbHMvX2xpc3QnO1xyXG5fbGlzdCgpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgSGFuZGxlYmFyczsiXX0=\n},{\"./helpers\":44,\"./partials/_list\":45,\"Handlebars\":20}],44:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\nexports.ifEquals = ifEquals;\nvar Handlebars = require('Handlebars');\n\n/**\r\n * Strict comparison helper for use in Handlebars templates\r\n * @param {String} First condition to compare\r\n * @param {String} Second condition to compare\r\n * @return {Boolean} Whether conditions are equal\r\n */\n\nfunction ifEquals() {\n\tHandlebars.registerHelper('ifEquals', function (v1, v2, options) {\n\t\tif (v1 === v2) {\n\t\t\treturn options.fn(this);\n\t\t}\n\t\treturn options.inverse(this);\n\t});\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL0hhbmRsZWJhcnMvaGVscGVycy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7OztBQUViLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzs7Ozs7Ozs7O0FBUWhDLFNBQVMsUUFBUSxHQUFJO0FBQzNCLFdBQVUsQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUc7QUFDaEUsTUFBSSxFQUFFLEtBQUssRUFBRSxFQUFHO0FBQ2QsVUFBTyxPQUFPLENBQUMsRUFBRSxDQUFFLElBQUksQ0FBRSxDQUFDO0dBQzNCO0FBQ0QsU0FBTyxPQUFPLENBQUMsT0FBTyxDQUFFLElBQUksQ0FBRSxDQUFDO0VBQ2hDLENBQUMsQ0FBQztDQUNIIiwiZmlsZSI6IkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL0hhbmRsZWJhcnMvaGVscGVycy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmxldCBIYW5kbGViYXJzID0gcmVxdWlyZSgnSGFuZGxlYmFycycpO1xyXG5cclxuLyoqXHJcbiAqIFN0cmljdCBjb21wYXJpc29uIGhlbHBlciBmb3IgdXNlIGluIEhhbmRsZWJhcnMgdGVtcGxhdGVzXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBGaXJzdCBjb25kaXRpb24gdG8gY29tcGFyZVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gU2Vjb25kIGNvbmRpdGlvbiB0byBjb21wYXJlXHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgY29uZGl0aW9ucyBhcmUgZXF1YWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpZkVxdWFscyAoKSB7XHJcblx0SGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignaWZFcXVhbHMnLCBmdW5jdGlvbiggdjEsIHYyLCBvcHRpb25zICkge1xyXG5cdCAgaWYoIHYxID09PSB2MiApIHtcclxuXHQgICAgcmV0dXJuIG9wdGlvbnMuZm4oIHRoaXMgKTtcclxuXHQgIH1cclxuXHQgIHJldHVybiBvcHRpb25zLmludmVyc2UoIHRoaXMgKTtcclxuXHR9KTtcdFxyXG59IFxyXG4iXX0=\n},{\"Handlebars\":20}],45:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\nexports['default'] = _list;\nvar Handlebars = require('Handlebars');\n\nfunction _list() {\n\tHandlebars.registerPartial('list', '{{#ifEquals hasCarousel \\'true\\'}}\\t\\n \\t\\t
\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t
\\n\\t\\t\\t\\t\\t
    \\n\\t\\t\\t\\t
    \\n\\t\\t\\t\\t\\n\\t\\t\\t
    \\n\\t\\t{{/ifEquals}}\\n\\t\\t');\n}\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL0hhbmRsZWJhcnMvcGFydGlhbHMvX2xpc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7OztxQkFJVyxLQUFLO0FBRjdCLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzs7QUFFeEIsU0FBUyxLQUFLLEdBQUk7QUFDaEMsV0FBVSxDQUFDLGVBQWUsQ0FBQyxNQUFNLGttQ0FxQmhDLENBQUM7Q0FDRiIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jcm93ZGZ1bmRpbmctcGxlZGdlLWJveC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9IYW5kbGViYXJzL3BhcnRpYWxzL19saXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG5cclxubGV0IEhhbmRsZWJhcnMgPSByZXF1aXJlKCdIYW5kbGViYXJzJyk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfbGlzdCAoKSB7XHJcblx0SGFuZGxlYmFycy5yZWdpc3RlclBhcnRpYWwoJ2xpc3QnLFxyXG4gICAgXHRge3sjaWZFcXVhbHMgaGFzQ2Fyb3VzZWwgJ3RydWUnfX1cdFxyXG4gICAgXHRcdDxkaXYgY2xhc3M9XCJjYXJvdXNlbC1zdGFja2VkXCIgZGF0YS1jYXJvdXNlbD1cInt7dmlld05hbWV9fVwiPlxyXG5cdFx0XHRcdDxidXR0b24gY2xhc3M9XCJidG4taWNvbi1sIGNvbnRyb2wtcHJldlwiIGRhdGEtY29udHJvbC1wcmV2IGRhdGEtYW5hbHl0aWNzLWV2ZW50PVwiR2V0IHByZXZpb3VzIHBhZ2VcIiBkYXRhLWFuYWx5dGljcy1zdWJ0eXBlPVwiYnV0dG9uXCI+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImhpZGVWaXN1YWxseVwiPlByZXZpb3VzIHBhZ2U8L3NwYW4+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImJ0bi1pY29uLWNvbnRlbnRcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJzcHJpdGUtY2hldnJvbi11cC1sXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvYnV0dG9uPlxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJvdXNlbC1hcGVydHVyZVwiIGRhdGEtY2Fyb3VzZWwtYXBlcnR1cmU+XHJcblx0XHRcdFx0XHQ8dWwgY2xhc3M9XCJsaXN0LXN0YWNrZWQtZGl2aWRlclwiIGRhdGEtY2Fyb3VzZWwtbGlzdCBkYXRhLXZpZXcte3t2aWV3TmFtZX19LWxpc3Q+PC91bD5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwiYnRuLXRlcnRpYXJ5IGJ0bi10ZXh0LW0gY29udHJvbC1uZXh0XCIgZGF0YS1jb250cm9sLW5leHQgZGF0YS1hbmFseXRpY3MtZXZlbnQ9XCJHZXQgbmV4dCBwYWdlXCIgZGF0YS1hbmFseXRpY3Mtc3VidHlwZT1cImJ1dHRvblwiPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJidG4tdGV4dC1jb250ZW50XCI+U2hvdyBtb3JlPC9zcGFuPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJwcm9ncmVzcy1zcGlubmVyXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaGlkZVZpc3VhbGx5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+UGxlYXNlIHdhaXQgYSBtb21lbnQsIGRhdGEgaXMgbG9hZGluZzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHR7ey9pZkVxdWFsc319XHJcblx0XHQ8dWwgY2xhc3M9XCJsaXN0LXN0YWNrZWQtZGl2aWRlclwiIGRhdGEtdmlldy17e3ZpZXdOYW1lfX0tbGlzdD48L3VsPmBcclxuXHQpO1xyXG59Il19\n},{\"Handlebars\":20}],46:[function(require,module,exports){\n'use strict';\n\n/**\r\n * Add analytics tracking to a widget\r\n * @classdesc Add analytics listeners and events for [kissmetrics] analytics framework\r\n * @param {Object} options\r\n * @param {Object} options.config. Hash of widget config options\r\n * @param {Object} options.widget. The widget instance [required]\r\n * @class Set analytics instance properties; initialise analytics\r\n */\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Analytics = (function () {\n\tfunction Analytics() {\n\t\tvar _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n\t\tvar widget = _ref.widget;\n\t\tvar configHash = _ref.configHash;\n\n\t\t_classCallCheck(this, Analytics);\n\n\t\tthis.widget = widget;\n\t\tif (!this.widget) {\n\t\t\treturn;\n\t\t}\n\t\tthis.configHash = configHash || {};\n\t\tthis.init();\n\t}\n\n\t/**\r\n \t* Initialise analytics\r\n \t* @description Cache the widget element; fetch analytics values on the widget element; trigger analytics methods\r\n \t*/\n\n\t_createClass(Analytics, [{\n\t\tkey: 'init',\n\t\tvalue: function init() {\n\t\t\tthis.widgetEl = document.querySelector('[data-analytics-widget]');\n\t\t\tif (this.widgetEl) {\n\t\t\t\tthis.widgetName = this.widgetEl.getAttribute('data-analytics-widget');\n\t\t\t\tthis.charityId = document.querySelector('[data-charity-id]') ? document.querySelector('[data-charity-id]').getAttribute('data-charity-id') : '';\n\t\t\t\tthis.frpId = document.querySelector('[data-charity-frpId]') ? document.querySelector('[data-charity-frpId]').getAttribute('data-charity-frpId') : '';\n\n\t\t\t\tthis.pushConfig();\n\t\t\t\tthis.widgetInit();\n\t\t\t\tthis.cardsInit();\n\t\t\t\tthis.cardImpressions();\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n \t* Push user config hash [including parent page's referrer] to kissmetrics as property\r\n \t*/\n\t}, {\n\t\tkey: 'pushConfig',\n\t\tvalue: function pushConfig() {\n\t\t\t_kmq.push(['set', this.configHash]);\n\t\t}\n\n\t\t/**\r\n \t* Initialise widget analytics data hash\r\n \t* @description Create a hash of widget-level analytics values; store it on the widget element; \r\n \t* register click listener on widget element\r\n \t*/\n\t}, {\n\t\tkey: 'widgetInit',\n\t\tvalue: function widgetInit() {\n\t\t\tvar _this = this;\n\n\t\t\tvar analyticsData = {\n\t\t\t\tpage_type: 'widget', // jshint ignore:line\n\t\t\t\t'event': 'page click',\n\t\t\t\tactivity_type: this.widgetName, // jshint ignore:line\n\t\t\t\tcharity_id: this.charityId, // jshint ignore:line\n\t\t\t\tpage_id: this.frpId // jshint ignore:line\n\t\t\t};\n\t\t\tthis.widgetEl.analytics = analyticsData;\n\n\t\t\tthis.widgetEl.addEventListener('click', function (e) {\n\t\t\t\t_this.widgetClick(e);\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n \t* Push kissmetrics NON-card click events\r\n \t* @description Handle non-card click events on the widget using event delegation. Create click values hash for target elements \r\n \t* and fire kissmetrics page click event\r\n \t*/\n\t}, {\n\t\tkey: 'widgetClick',\n\t\tvalue: function widgetClick(e) {\n\t\t\tvar evt = e.target.getAttribute('data-analytics-event');\n\t\t\tif (evt) {\n\t\t\t\tvar clickData = Object.assign({}, this.widgetEl.analytics);\n\t\t\t\tclickData.subtype = e.target.getAttribute('data-analytics-subtype');\n\t\t\t\tclickData.event_value = evt; // jshint ignore:line\n\t\t\t\t_kmq.push(['record', 'page click', clickData]);\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n \t* Initialise card analytics data hash\r\n \t* @description For each card in the DOM create a card analytics hash and store it on the card [if none already present];\r\n \t* and add click listner\r\n \t*/\n\t}, {\n\t\tkey: 'cardsInit',\n\t\tvalue: function cardsInit() {\n\t\t\tvar _this2 = this;\n\n\t\t\tvar cards = document.querySelectorAll('[data-analytics-card]');\n\t\t\tvar self = this;\n\n\t\t\t[].slice.call(cards).forEach(function (card, index) {\n\t\t\t\tcard.setAttribute('data-card-rank', index);\n\t\t\t\tif (!card.analytics) {\n\t\t\t\t\tvar analyticsData = {};\n\t\t\t\t\tvar charityId = card.getAttribute('data-charity-id') || '';\n\t\t\t\t\tvar activityId = card.getAttribute('data-activity-id') || '';\n\t\t\t\t\tvar cardRank = card.getAttribute('data-card-rank');\n\t\t\t\t\tvar cardFrpId = card.getAttribute('data-frp-id') || '';\n\t\t\t\t\tvar cardUrl = card.getAttribute('data-card-url') || '';\n\n\t\t\t\t\tanalyticsData.page_type = 'widget'; // jshint ignore:line\n\t\t\t\t\tanalyticsData.card_id = _this2.widgetName + '-' + charityId + '-' + activityId; // jshint ignore:line\n\t\t\t\t\tanalyticsData.card_rank = cardRank; // jshint ignore:line\n\t\t\t\t\tanalyticsData.activity_id = activityId; // jshint ignore:line\n\t\t\t\t\tanalyticsData.activity_type = _this2.widgetName; // jshint ignore:line\n\t\t\t\t\tanalyticsData.charity_id = charityId; // jshint ignore:line\n\t\t\t\t\tanalyticsData.page_id = cardFrpId; // jshint ignore:line\n\t\t\t\t\tanalyticsData.card_url = cardUrl; // jshint ignore:line\n\n\t\t\t\t\tcard.analytics = analyticsData;\n\n\t\t\t\t\tcard.addEventListener('click', function (e) {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tself.cardClick(e, this);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n \t* Push kissmetrics card impressions\r\n \t* @description For all visible cards, create a card impression analytics hash and fire a kissmetrics card impression event\r\n \t*/\n\t}, {\n\t\tkey: 'cardImpressions',\n\t\tvalue: function cardImpressions() {\n\t\t\tvar cards = document.querySelectorAll('[data-analytics-card]:not([data-hidden])');\n\t\t\t[].slice.call(cards).forEach(function (card) {\n\t\t\t\tvar impressionData = Object.assign({}, card.analytics);\n\t\t\t\timpressionData.event = 'impression';\n\t\t\t\timpressionData.card_count = cards.length; // jshint ignore:line\n\t\t\t\t_kmq.push(['record', 'impression', impressionData]);\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n \t* Push kissmetrics card click events\r\n \t* @description Handle card click events on the widget using event delegation. Create a card click values hash for taregt card\r\n \t* and fire a kissmetrics card click event \r\n \t*/\n\t}, {\n\t\tkey: 'cardClick',\n\t\tvalue: function cardClick(e, card) {\n\t\t\tvar evt = e.target.getAttribute('data-analytics-event');\n\t\t\tif (evt) {\n\t\t\t\tvar clickData = Object.assign({}, card.analytics);\n\t\t\t\tclickData.event = 'card click';\n\t\t\t\tclickData.subtype = e.target.getAttribute('data-analytics-subtype');\n\t\t\t\tclickData.event_value = evt; // jshint ignore:line\n\t\t\t\tclickData.card_count = document.querySelectorAll('[data-analytics-card]:not([data-hidden])').length; // jshint ignore:line\n\t\t\t\t_kmq.push(['record', 'card click', clickData]);\n\t\t\t}\n\t\t}\n\t}]);\n\n\treturn Analytics;\n})();\n\nexports['default'] = Analytics;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9BbmFseXRpY3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFVUCxTQUFTO0FBQ0YsVUFEUCxTQUFTLEdBQzhCO21FQUFMLEVBQUU7O01BQXpCLE1BQU0sUUFBTixNQUFNO01BQUUsVUFBVSxRQUFWLFVBQVU7O3dCQUQ3QixTQUFTOztBQUViLE1BQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3JCLE1BQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFHO0FBQ25CLFVBQU87R0FDUDtBQUNELE1BQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxJQUFJLEVBQUUsQ0FBQztBQUNuQyxNQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7RUFDWjs7Ozs7OztjQVJJLFNBQVM7O1NBYVQsZ0JBQUc7QUFDUCxPQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUNsRSxPQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7QUFDbEIsUUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ3RFLFFBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxHQUMzRCxRQUFRLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xGLFFBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxHQUMxRCxRQUFRLENBQUMs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QyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUN4RCxPQUFJLEdBQUcsRUFBRTtBQUNSLFFBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNsRCxhQUFTLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQztBQUMvQixhQUFTLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLENBQUM7QUFDcEUsYUFBUyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7QUFDNUIsYUFBUyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsMENBQTBDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDcEcsUUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUMvQztHQUNEOzs7UUFwSUksU0FBUzs7O3FCQXVJQSxTQUFTIiwiZmlsZSI6IkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9BbmFseXRpY3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG4vKipcclxuICogQWRkIGFuYWx5dGljcyB0cmFja2luZyB0byBhIHdpZGdldFxyXG4gKiBAY2xhc3NkZXNjIEFkZCBhbmFseXRpY3MgbGlzdGVuZXJzIGFuZCBldmVudHMgZm9yIFtraXNzbWV0cmljc10gYW5hbHl0aWNzIGZyYW1ld29ya1xyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5jb25maWcuIEhhc2ggb2Ygd2lkZ2V0IGNvbmZpZyBvcHRpb25zXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLndpZGdldC4gVGhlIHdpZGdldCBpbnN0YW5jZSBbcmVxdWlyZWRdXHJcbiAqIEBjbGFzcyBTZXQgYW5hbHl0aWNzIGluc3RhbmNlIHByb3BlcnRpZXM7IGluaXRpYWxpc2UgYW5hbHl0aWNzXHJcbiAqL1xyXG5jbGFzcyBBbmFseXRpY3Mge1xyXG5cdGNvbnN0cnVjdG9yICggeyB3aWRnZXQsIGNvbmZpZ0hhc2ggfSA9IHt9ICkge1xyXG5cdFx0dGhpcy53aWRnZXQgPSB3aWRnZXQ7XHJcblx0XHRpZiAoICF0aGlzLndpZGdldCApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5jb25maWdIYXNoID0gY29uZmlnSGFzaCB8fCB7fTtcclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBJbml0aWFsaXNlIGFuYWx5dGljc1xyXG4gXHQqIEBkZXNjcmlwdGlvbiBDYWNoZSB0aGUgd2lkZ2V0IGVsZW1lbnQ7IGZldGNoIGFuYWx5dGljcyB2YWx1ZXMgb24gdGhlIHdpZGdldCBlbGVtZW50OyB0cmlnZ2VyIGFuYWx5dGljcyBtZXRob2RzXHJcbiBcdCovXHJcblx0aW5pdCAoKSB7XHJcblx0XHR0aGlzLndpZGdldEVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtYW5hbHl0aWNzLXdpZGdldF0nKTtcclxuXHRcdGlmICh0aGlzLndpZGdldEVsKSB7XHJcblx0XHRcdHRoaXMud2lkZ2V0TmFtZSA9IHRoaXMud2lkZ2V0RWwuZ2V0QXR0cmlidXRlKCdkYXRhLWFuYWx5dGljcy13aWRnZXQnKTtcclxuXHRcdFx0dGhpcy5jaGFyaXR5SWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jaGFyaXR5LWlkXScpID8gXHJcblx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2hhcml0eS1pZF0nKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2hhcml0eS1pZCcpIDogJyc7XHJcblx0XHRcdHRoaXMuZnJwSWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jaGFyaXR5LWZycElkXScpID8gXHJcblx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2hhcml0eS1mcnBJZF0nKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2hhcml0eS1mcnBJZCcpIDogJyc7XHJcblx0XHRcdFxyXG5cdFx0XHR0aGlzLnB1c2hDb25maWcoKTtcclxuXHRcdFx0dGhpcy53aWRnZXRJbml0KCk7XHJcblx0XHRcdHRoaXMuY2FyZHNJbml0KCk7XHJcblx0XHRcdHRoaXMuY2FyZEltcHJlc3Npb25zKCk7XHJcblx0XHR9XHJcblx0fVx0XHJcblx0LyoqXHJcbiBcdCogUHVzaCB1c2VyIGNvbmZpZyBoYXNoIFtpbmNsdWRpbmcgcGFyZW50IHBhZ2UncyByZWZlcnJlcl0gdG8ga2lzc21ldHJpY3MgYXMgcHJvcGVydHlcclxuIFx0Ki9cclxuXHRwdXNoQ29uZmlnICgpIHtcclxuXHRcdF9rbXEucHVzaChbJ3NldCcsIHRoaXMuY29uZmlnSGFzaF0pO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBJbml0aWFsaXNlIHdpZGdldCBhbmFseXRpY3MgZGF0YSBoYXNoXHJcbiBcdCogQGRlc2NyaXB0aW9uIENyZWF0ZSBhIGhhc2ggb2Ygd2lkZ2V0LWxldmVsIGFuYWx5dGljcyB2YWx1ZXM7IHN0b3JlIGl0IG9uIHRoZSB3aWRnZXQgZWxlbWVudDsgXHJcbiBcdCogcmVnaXN0ZXIgY2xpY2sgbGlzdGVuZXIgb24gd2lkZ2V0IGVsZW1lbnRcclxuIFx0Ki9cclxuXHR3aWRnZXRJbml0ICgpIHsgXHJcblx0XHRsZXQgYW5hbHl0aWNzRGF0YSA9IHtcclxuXHRcdFx0cGFnZV90eXBlOiAnd2lkZ2V0JywgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdCdldmVudCc6ICdwYWdlIGNsaWNrJyxcclxuXHRcdFx0YWN0aXZpdHlfdHlwZTogdGhpcy53aWRnZXROYW1lLCAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0Y2hhcml0eV9pZDogdGhpcy5jaGFyaXR5SWQsIC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHRwYWdlX2lkOiB0aGlzLmZycElkIC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0fTtcclxuXHRcdHRoaXMud2lkZ2V0RWwuYW5hbHl0aWNzID0gYW5hbHl0aWNzRGF0YTtcclxuXHRcdFxyXG5cdFx0dGhpcy53aWRnZXRFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICggZSApID0+IHtcclxuXHRcdFx0dGhpcy53aWRnZXRDbGljayggZSApO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIFB1c2gga2lzc21ldHJpY3MgTk9OLWNhcmQgY2xpY2sgZXZlbnRzXHJcbiBcdCogQGRlc2NyaXB0aW9uIEhhbmRsZSBub24tY2FyZCBjbGljayBldmVudHMgb24gdGhlIHdpZGdldCB1c2luZyBldmVudCBkZWxlZ2F0aW9uLiBDcmVhdGUgY2xpY2sgdmFsdWVzIGhhc2ggZm9yIHRhcmdldCBlbGVtZW50cyBcclxuIFx0KiBhbmQgZmlyZSBraXNzbWV0cmljcyBwYWdlIGNsaWNrIGV2ZW50XHJcbiBcdCovXHJcbiBcdHdpZGdldENsaWNrICggZSApIHtcclxuXHRcdGxldCBldnQgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzLWV2ZW50Jyk7XHJcblx0XHRpZiAoZXZ0KSB7XHJcblx0XHRcdGxldCBjbGlja0RhdGEgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLndpZGdldEVsLmFuYWx5dGljcyApO1xyXG5cdFx0XHRjbGlja0RhdGEuc3VidHlwZSA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hbmFseXRpY3Mtc3VidHlwZScpO1xyXG5cdFx0XHRjbGlja0RhdGEuZXZlbnRfdmFsdWUgPSBldnQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHRfa21xLnB1c2goWydyZWNvcmQnLCAncGFnZSBjbGljaycsIGNsaWNrRGF0YV0pO1x0XHRcclxuXHRcdH1cclxuXHR9XHJcblx0LyoqXHJcbiBcdCogSW5pdGlhbGlzZSBjYXJkIGFuYWx5dGljcyBkYXRhIGhhc2hcclxuIFx0KiBAZGVzY3JpcHRpb24gRm9yIGVhY2ggY2FyZCBpbiB0aGUgRE9NIGNyZWF0ZSBhIGNhcmQgYW5hbHl0aWNzIGhhc2ggYW5kIHN0b3JlIGl0IG9uIHRoZSBjYXJkIFtpZiBub25lIGFscmVhZHkgcHJlc2VudF07XHJcbiBcdCogYW5kIGFkZCBjbGljayBsaXN0bmVyXHJcbiBcdCovXHJcbiBcdGNhcmRzSW5pdCAoKSB7XHJcblx0XHRsZXQgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hbmFseXRpY3MtY2FyZF0nKTtcclxuXHRcdGxldCBzZWxmID0gdGhpcztcclxuXHRcdFxyXG5cdFx0W10uc2xpY2UuY2FsbCggY2FyZHMgKS5mb3JFYWNoKCggY2FyZCwgaW5kZXggKSA9PiB7XHJcblx0XHRcdGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLWNhcmQtcmFuaycsIGluZGV4KTtcclxuXHRcdFx0aWYgKCAhY2FyZC5hbmFseXRpY3MgKSB7XHJcblx0XHRcdFx0bGV0IGFuYWx5dGljc0RhdGEgPSB7fTtcclxuXHRcdFx0XHRsZXQgY2hhcml0eUlkID0gY2FyZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2hhcml0eS1pZCcpIHx8ICcnO1xyXG5cdFx0XHRcdGxldCBhY3Rpdml0eUlkID0gY2FyZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYWN0aXZpdHktaWQnKSB8fCAnJztcclxuXHRcdFx0XHRsZXQgY2FyZFJhbmsgPSBjYXJkLmdldEF0dHJpYnV0ZSgnZGF0YS1jYXJkLXJhbmsnKTtcclxuXHRcdFx0XHRsZXQgY2FyZEZycElkID0gY2FyZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZnJwLWlkJykgfHwgJyc7XHJcblx0XHRcdFx0bGV0IGNhcmRVcmwgPSBjYXJkLmdldEF0dHJpYnV0ZSgnZGF0YS1jYXJkLXVybCcpIHx8ICcnO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGFuYWx5dGljc0RhdGEucGFnZV90eXBlID0gJ3dpZGdldCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHRcdGFuYWx5dGljc0RhdGEuY2FyZF9pZCA9IGAke3RoaXMud2lkZ2V0TmFtZX0tJHtjaGFyaXR5SWR9LSR7YWN0aXZpdHlJZH1gOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0XHRhbmFseXRpY3NEYXRhLmNhcmRfcmFuayA9IGNhcmRSYW5rOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0XHRhbmFseXRpY3NEYXRhLmFjdGl2aXR5X2lkID0gYWN0aXZpdHlJZDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdFx0YW5hbHl0aWNzRGF0YS5hY3Rpdml0eV90eXBlID0gdGhpcy53aWRnZXROYW1lOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0XHRhbmFseXRpY3NEYXRhLmNoYXJpdHlfaWQgPSBjaGFyaXR5SWQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHRcdGFuYWx5dGljc0RhdGEucGFnZV9pZCA9IGNhcmRGcnBJZDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdFx0YW5hbHl0aWNzRGF0YS5jYXJkX3VybCA9IGNhcmRVcmw7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGNhcmQuYW5hbHl0aWNzID0gYW5hbHl0aWNzRGF0YTtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCBlICkge1xyXG5cdFx0XHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0XHRcdHNlbGYuY2FyZENsaWNrKCBlLCB0aGlzICk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBQdXNoIGtpc3NtZXRyaWNzIGNhcmQgaW1wcmVzc2lvbnNcclxuIFx0KiBAZGVzY3JpcHRpb24gRm9yIGFsbCB2aXNpYmxlIGNhcmRzLCBjcmVhdGUgYSBjYXJkIGltcHJlc3Npb24gYW5hbHl0aWNzIGhhc2ggYW5kIGZpcmUgYSBraXNzbWV0cmljcyBjYXJkIGltcHJlc3Npb24gZXZlbnRcclxuIFx0Ki9cclxuXHRjYXJkSW1wcmVzc2lvbnMgKCkge1xyXG5cdFx0bGV0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYW5hbHl0aWNzLWNhcmRdOm5vdChbZGF0YS1oaWRkZW5dKScpO1xyXG5cdFx0W10uc2xpY2UuY2FsbCggY2FyZHMgKS5mb3JFYWNoKCggY2FyZCApID0+IHtcclxuXHRcdFx0bGV0IGltcHJlc3Npb25EYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgY2FyZC5hbmFseXRpY3MgKTtcclxuXHRcdFx0aW1wcmVzc2lvbkRhdGEuZXZlbnQgPSAnaW1wcmVzc2lvbic7XHJcblx0XHRcdGltcHJlc3Npb25EYXRhLmNhcmRfY291bnQgPSBjYXJkcy5sZW5ndGg7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHRfa21xLnB1c2goWydyZWNvcmQnLCAnaW1wcmVzc2lvbicsIGltcHJlc3Npb25EYXRhXSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0LyoqXHJcbiBcdCogUHVzaCBraXNzbWV0cmljcyBjYXJkIGNsaWNrIGV2ZW50c1xyXG4gXHQqIEBkZXNjcmlwdGlvbiBIYW5kbGUgY2FyZCBjbGljayBldmVudHMgb24gdGhlIHdpZGdldCB1c2luZyBldmVudCBkZWxlZ2F0aW9uLiBDcmVhdGUgYSBjYXJkIGNsaWNrIHZhbHVlcyBoYXNoIGZvciB0YXJlZ3QgY2FyZFxyXG4gXHQqIGFuZCBmaXJlIGEga2lzc21ldHJpY3MgY2FyZCBjbGljayBldmVudCBcclxuIFx0Ki9cclxuXHRjYXJkQ2xpY2sgKCBlLCBjYXJkICkge1xyXG5cdFx0bGV0IGV2dCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hbmFseXRpY3MtZXZlbnQnKTtcclxuXHRcdGlmIChldnQpIHtcclxuXHRcdFx0bGV0IGNsaWNrRGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGNhcmQuYW5hbHl0aWNzKTtcclxuXHRcdFx0Y2xpY2tEYXRhLmV2ZW50ID0gJ2NhcmQgY2xpY2snO1xyXG5cdFx0XHRjbGlja0RhdGEuc3VidHlwZSA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hbmFseXRpY3Mtc3VidHlwZScpO1xyXG5cdFx0XHRjbGlja0RhdGEuZXZlbnRfdmFsdWUgPSBldnQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHRjbGlja0RhdGEuY2FyZF9jb3VudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFuYWx5dGljcy1jYXJkXTpub3QoW2RhdGEtaGlkZGVuXSknKS5sZW5ndGg7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHRfa21xLnB1c2goWydyZWNvcmQnLCAnY2FyZCBjbGljaycsIGNsaWNrRGF0YV0pO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQW5hbHl0aWNzOyJdfQ==\n},{}],47:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _utilsQueryString = require('../utils/queryString');\n\n/**\r\n * Create a widget model\r\n * @classdesc Create a model object \r\n * @param {Object} options.widget. The widget instance [required]\r\n * @param {Boolean} options.isPaginated. Whether the model consumes a paginated REST API\r\n * @class Stores the returned model data as this.$model. Stores model URL parameters as this.params. For paginated models\r\n * stores the collection as this.collection, stores the last fetched API page as this.lastReturnedPage; sets apiPage size to default 12\r\n * sets pageNum and pageSize params on the model API [initialises to page 1]\r\n */\nvar Promise = require('es6-promise').Promise;\nvar xhr = require('xhr');\n\nvar Model = (function () {\n\tfunction Model() {\n\t\tvar _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n\t\tvar widget = _ref.widget;\n\t\tvar url = _ref.url;\n\t\tvar params = _ref.params;\n\t\tvar isPaginated = _ref.isPaginated;\n\t\tvar apiPageSize = _ref.apiPageSize;\n\t\tvar collectionPath = _ref.collectionPath;\n\n\t\t_classCallCheck(this, Model);\n\n\t\tthis.widget = widget;\n\t\tthis.url = url;\n\t\tif (!this.widget || !this.url) {\n\t\t\treturn;\n\t\t}\n\t\tthis.$model = {};\n\t\tthis.params = this.params || {};\n\t\tthis.setParams(params);\n\n\t\tthis.isPaginated = isPaginated === undefined ? false : isPaginated;\n\t\tif (this.isPaginated) {\n\t\t\tthis.collectionPath = collectionPath;\n\t\t\tthis.lastReturnedPage = [];\n\t\t\tthis.collection = [];\n\t\t\tthis.apiPageSize = apiPageSize || 12;\n\t\t\tthis.currentApiPage = 1;\n\t\t\tthis.lastPage = undefined;\n\t\t\tthis.setParams({\n\t\t\t\tpageNum: this.currentApiPage,\n\t\t\t\tpageSize: this.apiPageSize\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\r\n * Get the model data from the REST API [NON-paginated REST API only]\r\n * @description Fetch the data from the REST API and store as this.$model\r\n */\n\n\t_createClass(Model, [{\n\t\tkey: 'getModel',\n\t\tvalue: function getModel() {\n\t\t\tvar _this = this;\n\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\t_this.fetchData(_this.url).then(function (data) {\n\t\t\t\t\t_this.$model = data;\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n * Get the next API page from the REST API [paginated REST API only]\r\n * @description Fetch the next API page from the server, based on the last page fetched. Store the returned data\r\n * as this.$model; add the returned paginated data as to the end of this.collection\r\n * @returns {Object} Promise object\r\n */\n\t}, {\n\t\tkey: 'getNextPage',\n\t\tvalue: function getNextPage(reset) {\n\t\t\tvar _this2 = this;\n\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\t_this2.params.pageNum = _this2.currentApiPage++;\n\t\t\t\t_this2.getModel().then(function () {\n\t\t\t\t\tif (_this2.$model[_this2.collectionPath].length === 0) {\n\t\t\t\t\t\t_this2.lastPage = _this2.currentApiPage;\n\t\t\t\t\t}\n\t\t\t\t\tif (reset) {\n\t\t\t\t\t\t_this2.collection = [];\n\t\t\t\t\t}\n\t\t\t\t\t_this2.lastReturnedPage = _this2.$model[_this2.collectionPath];\n\t\t\t\t\t_this2.collection = _this2.collection.concat(_this2.lastReturnedPage);\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n * Add supplied parameters to the model URL\r\n * @description Convert hash of parameters to query string and append to model url\r\n */\n\t}, {\n\t\tkey: 'setParams',\n\t\tvalue: function setParams(obj) {\n\t\t\tthis.params = Object.assign(this.params, obj);\n\t\t}\n\n\t\t/**\r\n * Fetch data from the server\r\n * @description Make a get request for the REST API data\r\n * @returns {Object} Promise object\r\n */\n\t}, {\n\t\tkey: 'fetchData',\n\t\tvalue: function fetchData(url) {\n\t\t\tvar qs = (0, _utilsQueryString.queryStringStringify)(this.params);\n\t\t\t//TODO: remove & if no qs\n\t\t\turl += '?format=json&' + qs;\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\txhr({\n\t\t\t\t\turi: url,\n\t\t\t\t\tuseXDR: true\n\t\t\t\t}, function (error, response, body) {\n\t\t\t\t\tif (body !== undefined) {\n\t\t\t\t\t\tresolve(JSON.parse(body));\n\t\t\t\t\t} else if (error !== null) {\n\t\t\t\t\t\t// alert('http error: status code: ' + response.statusCode + '; error: ' + error);\n\t\t\t\t\t\treject(Error(error));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n * Refresh the local model and collection\r\n * @description Re-fetch and overwrite the local model and collection with [latest] server data\r\n * @returns {Object} Promise object\r\n */\n\t}, {\n\t\tkey: 'refresh',\n\t\tvalue: function refresh() {\n\t\t\tvar _this3 = this;\n\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\tif (_this3.isPaginated) {\n\t\t\t\t\t_this3.collection = [];\n\t\t\t\t\t_this3.currentApiPage = 1;\n\t\t\t\t\t_this3.getNextPage(true).then(function () {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t_this3.getModel().then(function () {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}]);\n\n\treturn Model;\n})();\n\nexports['default'] = Model;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9Nb2RlbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Z0NBSXdCLHNCQUFzQjs7Ozs7Ozs7Ozs7QUFGM0QsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUM3QyxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7O0lBWW5CLEtBQUs7QUFDRSxVQURQLEtBQUssR0FDNkU7bUVBQUwsRUFBRTs7TUFBcEUsTUFBTSxRQUFOLE1BQU07TUFBRSxHQUFHLFFBQUgsR0FBRztNQUFFLE1BQU0sUUFBTixNQUFNO01BQUUsV0FBVyxRQUFYLFdBQVc7TUFBRSxXQUFXLFFBQVgsV0FBVztNQUFFLGNBQWMsUUFBZCxjQUFjOzt3QkFEeEUsS0FBSzs7QUFFVCxNQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNyQixNQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNmLE1BQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRztBQUNoQyxVQUFPO0dBQ1A7QUFDRCxNQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNqQixNQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0FBQ2hDLE1BQUksQ0FBQyxTQUFTLENBQUUsTUFBTSxDQUFFLENBQUM7O0FBRXpCLE1BQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxLQUFLLFNBQVMsR0FBRyxLQUFLLEdBQUcsV0FBVyxDQUFDO0FBQ25FLE1BQUssSUFBSSxDQUFDLFdBQVcsRUFBRztBQUN2QixPQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztBQUNyQyxPQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzNCLE9BQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ3JCLE9BQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxJQUFJLEVBQUUsQ0FBQztBQUNyQyxPQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN4QixPQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUMxQixPQUFJLENBQUMsU0FBUyxDQUFDO0FBQ2QsV0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjO0FBQzVCLFlBQVEsRUFBRSxJQUFJLENBQUMsV0FBVztJQUMxQixDQUFDLENBQUM7R0FDSDtFQUNEOzs7Ozs7O2NBeEJJLEtBQUs7O1NBNkJELG9CQUFHOzs7QUFDWCxVQUFPLElBQUksT0FBTyxDQUFFLFVBQUUsT0FBTyxFQUFNO0FBQ2xDLFVBQUssU0FBUyxDQUFFLE1BQUssR0FBRyxDQUFFLENBQUMsSUFBSSxDQUFFLFVBQUUsSUFBSSxFQUFNO0FBQzVDLFdBQUssTUFBTSxHQUFHLElBQUksQ0FBQztBQUNuQixZQUFPLEVBQUUsQ0FBQztLQUNWLENBQUMsQ0FBQztJQUNILENBQUMsQ0FBQztHQUNIOzs7Ozs7Ozs7O1NBT1cscUJBQUUsS0FBSyxFQUFHOzs7QUFDckIsVUFBTyxJQUFJLE9BQU8sQ0FBRSxVQUFFLE9BQU8sRUFBTTtBQUNsQyxXQUFLLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBSyxjQUFjLEVBQUUsQ0FBQztBQUM1QyxXQUFLLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBRSxZQUFNO0FBQzNCLFNBQUssT0FBSyxNQUFNLENBQUMsT0FBSyxjQUFjLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFHO0FBQ3BELGFBQUssUUFBUSxHQUFHLE9BQUssY0FBYyxDQUFDO01BQ3BDO0FBQ0QsU0FBSyxLQUFLLEVBQUc7QUFDWixhQUFLLFVBQVUsR0FBRyxFQUFFLENBQUM7TUFDckI7QUFDRCxZQUFLLGdCQUFnQixHQUFHLE9BQUssTUFBTSxDQUFDLE9BQUssY0FBYyxDQUFDLENBQUM7QUFDekQsWUFBSyxVQUFVLEdBQUcsT0FBSyxVQUFVLENBQUMsTUFBTSxDQUFFLE9BQUssZ0JBQWdCLENBQUUsQ0FBQztBQUNsRSxZQUFPLEVBQUUsQ0FBQztLQUNWLENBQUMsQ0FBQztJQUNILENBQUMsQ0FBQztHQUNIOzs7Ozs7OztTQUtTLG1CQUFFLEdBQUcsRUFBRztBQUNqQixPQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUUsQ0FBQztHQUNoRDs7Ozs7Ozs7O1NBTVMsbUJBQUUsR0FBRyxFQUFHO0FBQ2pCLE9BQUksRUFBRSxHQUFHLDRDQUFzQixJQUFJLENBQUMsTUFBTSxDQUFFLENBQUM7O0FBRTdDLE1BQUcsc0JBQW9CLEVBQUUsQUFBRSxDQUFDO0FBQzVCLFVBQU8sSUFBSSxPQUFPLENBQUMsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFHO0FBQzlDLE9BQUcsQ0FBQztBQUNBLFFBQUcsRUFBRSxHQUFHO0FBQ1IsV0FBTSxFQUFFLElBQUk7S0FDZixFQUFFLFVBQVcsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUc7QUFDbEMsU0FBSyxJQUFJLEtBQUssU0FBUyxFQUFHO0FBQ3pCLGFBQU8sQ0FBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFFLENBQUM7TUFDNUIsTUFBTSxJQUFLLEtBQUssS0FBSyxJQUFJLEVBQUc7O0FBRTVCLFlBQU0sQ0FBRSxLQUFLLENBQUUsS0FBSyxDQUFFLENBQUUsQ0FBQztNQUN6QjtLQUNKLENBQUMsQ0FBQztJQUNILENBQUMsQ0FBQztHQUNIOzs7Ozs7Ozs7U0FNTyxtQkFBRzs7O0FBQ1YsVUFBTyxJQUFJLE9BQU8sQ0FBRSxVQUFFLE9BQU8sRUFBTTtBQUNsQyxRQUFLLE9BQUssV0FBVyxFQUFHO0FBQ3ZCLFlBQUssVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUNyQixZQUFLLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDeEIsWUFBSyxXQUFXLENBQUUsSUFBSSxDQUFFLENBQUMsSUFBSSxDQUFFLFlBQU07QUFDcEMsYUFBTyxFQUFFLENBQUM7TUFDVixDQUFDLENBQUM7S0FDSCxNQUFNO0FBQ04sWUFBSyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUUsWUFBTTtBQUMzQixhQUFPLEVBQUUsQ0FBQztNQUNWLENBQUMsQ0FBQztLQUNIO0lBQ0QsQ0FBQyxDQUFDO0dBQ0g7OztRQTVHSSxLQUFLOzs7cUJBK0dJLEtBQUsiLCJmaWxlIjoiQzovdGVtcC9HRy5Gcm9udEVuZC5XaWRnZXRzL3dpZGdldHMvY3Jvd2RmdW5kaW5nLXBsZWRnZS1ib3gvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvZnJhbWV3b3JrL01vZGVsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG5cclxubGV0IFByb21pc2UgPSByZXF1aXJlKCdlczYtcHJvbWlzZScpLlByb21pc2U7XHJcbmxldCB4aHIgPSByZXF1aXJlKCd4aHInKTtcclxuaW1wb3J0IHsgcXVlcnlTdHJpbmdTdHJpbmdpZnkgfSBmcm9tICcuLi91dGlscy9xdWVyeVN0cmluZyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgd2lkZ2V0IG1vZGVsXHJcbiAqIEBjbGFzc2Rlc2MgQ3JlYXRlIGEgbW9kZWwgb2JqZWN0IFxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy53aWRnZXQuIFRoZSB3aWRnZXQgaW5zdGFuY2UgW3JlcXVpcmVkXVxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMuaXNQYWdpbmF0ZWQuIFdoZXRoZXIgdGhlIG1vZGVsIGNvbnN1bWVzIGEgcGFnaW5hdGVkIFJFU1QgQVBJXHJcbiAqIEBjbGFzcyBTdG9yZXMgdGhlIHJldHVybmVkIG1vZGVsIGRhdGEgYXMgdGhpcy4kbW9kZWwuIFN0b3JlcyBtb2RlbCBVUkwgcGFyYW1ldGVycyBhcyB0aGlzLnBhcmFtcy4gRm9yIHBhZ2luYXRlZCBtb2RlbHNcclxuICogc3RvcmVzIHRoZSBjb2xsZWN0aW9uIGFzIHRoaXMuY29sbGVjdGlvbiwgc3RvcmVzIHRoZSBsYXN0IGZldGNoZWQgQVBJIHBhZ2UgYXMgdGhpcy5sYXN0UmV0dXJuZWRQYWdlOyBzZXRzIGFwaVBhZ2Ugc2l6ZSB0byBkZWZhdWx0IDEyXHJcbiAqIHNldHMgcGFnZU51bSBhbmQgcGFnZVNpemUgcGFyYW1zIG9uIHRoZSBtb2RlbCBBUEkgW2luaXRpYWxpc2VzIHRvIHBhZ2UgMV1cclxuICovXHJcbmNsYXNzIE1vZGVsIHtcclxuXHRjb25zdHJ1Y3RvciAoIHsgd2lkZ2V0LCB1cmwsIHBhcmFtcywgaXNQYWdpbmF0ZWQsIGFwaVBhZ2VTaXplLCBjb2xsZWN0aW9uUGF0aCB9ID0ge30gKSB7XHJcblx0XHR0aGlzLndpZGdldCA9IHdpZGdldDtcclxuXHRcdHRoaXMudXJsID0gdXJsO1xyXG5cdFx0aWYgKCAhdGhpcy53aWRnZXQgfHwgIXRoaXMudXJsICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHR0aGlzLiRtb2RlbCA9IHt9O1xyXG5cdFx0dGhpcy5wYXJhbXMgPSB0aGlzLnBhcmFtcyB8fCB7fTtcclxuXHRcdHRoaXMuc2V0UGFyYW1zKCBwYXJhbXMgKTtcclxuXHJcblx0XHR0aGlzLmlzUGFnaW5hdGVkID0gaXNQYWdpbmF0ZWQgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogaXNQYWdpbmF0ZWQ7XHJcblx0XHRpZiAoIHRoaXMuaXNQYWdpbmF0ZWQgKSB7XHJcblx0XHRcdHRoaXMuY29sbGVjdGlvblBhdGggPSBjb2xsZWN0aW9uUGF0aDtcclxuXHRcdFx0dGhpcy5sYXN0UmV0dXJuZWRQYWdlID0gW107XHJcblx0XHRcdHRoaXMuY29sbGVjdGlvbiA9IFtdO1xyXG5cdFx0XHR0aGlzLmFwaVBhZ2VTaXplID0gYXBpUGFnZVNpemUgfHwgMTI7XHJcblx0XHRcdHRoaXMuY3VycmVudEFwaVBhZ2UgPSAxO1xyXG5cdFx0XHR0aGlzLmxhc3RQYWdlID0gdW5kZWZpbmVkO1xyXG5cdFx0XHR0aGlzLnNldFBhcmFtcyh7XHJcblx0XHRcdFx0cGFnZU51bTogdGhpcy5jdXJyZW50QXBpUGFnZSxcclxuXHRcdFx0XHRwYWdlU2l6ZTogdGhpcy5hcGlQYWdlU2l6ZSBcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEdldCB0aGUgbW9kZWwgZGF0YSBmcm9tIHRoZSBSRVNUIEFQSSBbTk9OLXBhZ2luYXRlZCBSRVNUIEFQSSBvbmx5XVxyXG5cdCAqIEBkZXNjcmlwdGlvbiBGZXRjaCB0aGUgZGF0YSBmcm9tIHRoZSBSRVNUIEFQSSBhbmQgc3RvcmUgYXMgdGhpcy4kbW9kZWxcclxuXHQgKi9cclxuXHRnZXRNb2RlbCAoKSB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoICggcmVzb2x2ZSApID0+IHtcclxuXHRcdFx0dGhpcy5mZXRjaERhdGEoIHRoaXMudXJsICkudGhlbiggKCBkYXRhICkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuJG1vZGVsID0gZGF0YTtcclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEdldCB0aGUgbmV4dCBBUEkgcGFnZSBmcm9tIHRoZSBSRVNUIEFQSSBbcGFnaW5hdGVkIFJFU1QgQVBJIG9ubHldXHJcblx0ICogQGRlc2NyaXB0aW9uIEZldGNoIHRoZSBuZXh0IEFQSSBwYWdlIGZyb20gdGhlIHNlcnZlciwgYmFzZWQgb24gdGhlIGxhc3QgcGFnZSBmZXRjaGVkLiBTdG9yZSB0aGUgcmV0dXJuZWQgZGF0YVxyXG5cdCAqIGFzIHRoaXMuJG1vZGVsOyBhZGQgdGhlIHJldHVybmVkIHBhZ2luYXRlZCBkYXRhIGFzIHRvIHRoZSBlbmQgb2YgdGhpcy5jb2xsZWN0aW9uXHJcblx0ICogQHJldHVybnMge09iamVjdH0gUHJvbWlzZSBvYmplY3RcclxuXHQgKi9cclxuXHRnZXROZXh0UGFnZSAoIHJlc2V0ICkge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKCAoIHJlc29sdmUgKSA9PiB7XHJcblx0XHRcdHRoaXMucGFyYW1zLnBhZ2VOdW0gPSB0aGlzLmN1cnJlbnRBcGlQYWdlKys7XHJcblx0XHRcdHRoaXMuZ2V0TW9kZWwoKS50aGVuKCAoKSA9PiB7XHJcblx0XHRcdFx0aWYgKCB0aGlzLiRtb2RlbFt0aGlzLmNvbGxlY3Rpb25QYXRoXS5sZW5ndGggPT09IDAgKSB7XHJcblx0XHRcdFx0XHR0aGlzLmxhc3RQYWdlID0gdGhpcy5jdXJyZW50QXBpUGFnZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKCByZXNldCApIHtcclxuXHRcdFx0XHRcdHRoaXMuY29sbGVjdGlvbiA9IFtdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLmxhc3RSZXR1cm5lZFBhZ2UgPSB0aGlzLiRtb2RlbFt0aGlzLmNvbGxlY3Rpb25QYXRoXTtcclxuXHRcdFx0XHR0aGlzLmNvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb24uY29uY2F0KCB0aGlzLmxhc3RSZXR1cm5lZFBhZ2UgKTtcclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHRcclxuXHR9XHJcblx0LyoqXHJcblx0ICogQWRkIHN1cHBsaWVkIHBhcmFtZXRlcnMgdG8gdGhlIG1vZGVsIFVSTFxyXG5cdCAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0IGhhc2ggb2YgcGFyYW1ldGVycyB0byBxdWVyeSBzdHJpbmcgYW5kIGFwcGVuZCB0byBtb2RlbCB1cmxcclxuXHQgKi9cclxuXHRzZXRQYXJhbXMgKCBvYmogKSB7XHJcblx0XHR0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oIHRoaXMucGFyYW1zLCBvYmogKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogRmV0Y2ggZGF0YSBmcm9tIHRoZSBzZXJ2ZXJcclxuXHQgKiBAZGVzY3JpcHRpb24gTWFrZSBhIGdldCByZXF1ZXN0IGZvciB0aGUgUkVTVCBBUEkgZGF0YVxyXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IFByb21pc2Ugb2JqZWN0XHJcblx0ICovXHJcblx0ZmV0Y2hEYXRhICggdXJsICkge1xyXG5cdFx0bGV0IHFzID0gcXVlcnlTdHJpbmdTdHJpbmdpZnkoIHRoaXMucGFyYW1zICk7XHJcblx0XHQvL1RPRE86IHJlbW92ZSAmIGlmIG5vIHFzXHJcblx0XHR1cmwgKz0gYD9mb3JtYXQ9anNvbiYke3FzfWA7XHRcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiggcmVzb2x2ZSwgcmVqZWN0ICkge1xyXG5cdFx0XHR4aHIoe1xyXG5cdFx0XHQgICAgdXJpOiB1cmwsXHJcblx0XHRcdCAgICB1c2VYRFI6IHRydWUsXHJcblx0XHRcdH0sIGZ1bmN0aW9uICggZXJyb3IsIHJlc3BvbnNlLCBib2R5ICkge1xyXG5cdFx0XHQgICAgaWYgKCBib2R5ICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdCAgICBcdHJlc29sdmUoIEpTT04ucGFyc2UoYm9keSkgKTtcclxuXHRcdFx0ICAgIH0gZWxzZSBpZiAoIGVycm9yICE9PSBudWxsICkge1xyXG5cdFx0XHQgICAgXHQvLyBhbGVydCgnaHR0cCBlcnJvcjogc3RhdHVzIGNvZGU6ICcgKyByZXNwb25zZS5zdGF0dXNDb2RlICsgJzsgZXJyb3I6ICcgKyBlcnJvcik7XHJcblx0XHRcdCAgICBcdHJlamVjdCggRXJyb3IoIGVycm9yICkgKTtcclxuXHRcdFx0ICAgIH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogUmVmcmVzaCB0aGUgbG9jYWwgbW9kZWwgYW5kIGNvbGxlY3Rpb25cclxuXHQgKiBAZGVzY3JpcHRpb24gUmUtZmV0Y2ggYW5kIG92ZXJ3cml0ZSB0aGUgbG9jYWwgbW9kZWwgYW5kIGNvbGxlY3Rpb24gd2l0aCBbbGF0ZXN0XSBzZXJ2ZXIgZGF0YVxyXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IFByb21pc2Ugb2JqZWN0XHJcblx0ICovXHJcblx0cmVmcmVzaCAoKSB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoICggcmVzb2x2ZSApID0+IHsgXHJcblx0XHRcdGlmICggdGhpcy5pc1BhZ2luYXRlZCApIHtcclxuXHRcdFx0XHR0aGlzLmNvbGxlY3Rpb24gPSBbXTtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRBcGlQYWdlID0gMTtcclxuXHRcdFx0XHR0aGlzLmdldE5leHRQYWdlKCB0cnVlICkudGhlbiggKCkgPT4ge1xyXG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuZ2V0TW9kZWwoKS50aGVuKCAoKSA9PiB7XHJcblx0XHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTW9kZWw7Il19\n},{\"../utils/queryString\":51,\"es6-promise\":24,\"xhr\":41}],48:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _HandlebarsHandlebars = require('../../Handlebars/handlebars');\n\nvar _HandlebarsHandlebars2 = _interopRequireDefault(_HandlebarsHandlebars);\n\n/**\r\n * Create a widget view\r\n * @classdesc Create a view object \r\n * @param {Object} options.widget. The widget instance [required]\r\n * @param {Number} options.pollInterval. Interval in millseconds to auto-refresh the view's data\r\n * @param {String} options.pollTrigger. CSS selector for element to click-trigger a refresh of the view's data\r\n * @class Set view instance properties and initialise view\r\n */\n\nvar View = (function () {\n\tfunction View() {\n\t\tvar _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n\t\tvar widget = _ref.widget;\n\t\tvar el = _ref.el;\n\t\tvar template = _ref.template;\n\t\tvar model = _ref.model;\n\t\tvar pollInterval = _ref.pollInterval;\n\t\tvar pollTrigger = _ref.pollTrigger;\n\n\t\t_classCallCheck(this, View);\n\n\t\tthis.widget = widget;\n\t\tthis.el = document.querySelector(el);\n\t\tthis.template = document.querySelector(template).innerHTML;\n\t\tthis.model = model;\n\t\tif (!this.widget || !this.el || !this.template) {\n\t\t\treturn;\n\t\t}\n\t\tthis.config = this.widget.config;\n\t\tthis.pollInterval = pollInterval;\n\t\tthis.pollTrigger = pollTrigger ? document.querySelector(pollTrigger) : undefined;\n\n\t\tthis.init();\n\t}\n\n\t/**\r\n \t* Initialise view\r\n \t* @description Start view model update poller; register view model update trigger\r\n \t*/\n\n\t_createClass(View, [{\n\t\tkey: 'init',\n\t\tvalue: function init() {\n\t\t\tif (this.pollInterval) {\n\t\t\t\tthis.pollAtInterval();\n\t\t\t}\n\t\t\tif (this.pollTrigger) {\n\t\t\t\tthis.registerPollTrigger();\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n \t* Render the view\r\n \t* @description Render the template with supplied data and append to view's element\r\n \t*/\n\t}, {\n\t\tkey: 'render',\n\t\tvalue: function render() {\n\t\t\tvar data = arguments.length <= 0 || arguments[0] === undefined ? this.data : arguments[0];\n\n\t\t\tthis.data = data;\n\t\t\tvar template = _HandlebarsHandlebars2['default'].compile(this.template);\n\t\t\tthis.el.innerHTML = template(data);\n\t\t}\n\n\t\t/**\r\n \t* Pre-load images and reset the widget height\r\n \t* @description When some images load, the height of the widget may change and a widget.resetHeight() \r\n \t* may need to be fired. Use this function to manage the loading of these images that generate a widget \r\n \t* dimension change to ensure the widget height is adapted once the image has loaded\r\n \t* @param {String} Path to the image to load\r\n \t* @param {String} Unique css3 selector targetting the element to load the path into\r\n \t*/\n\t}, {\n\t\tkey: 'loadImage',\n\t\tvalue: function loadImage(path, el) {\n\t\t\tvar _this = this;\n\n\t\t\tvar img = new Image();\n\t\t\timg.addEventListener('load', function () {\n\t\t\t\tdocument.querySelector(el).src = path;\n\t\t\t\t_this.widget.resetHeight();\n\t\t\t});\n\t\t\timg.src = path;\n\t\t}\n\n\t\t/**\r\n \t* Refresh view with latest server data\r\n \t* @description Set control 'loading' CSS state on poll trigger; trigger a model refresh; then re-render thr view, \r\n \t* reset poll trigger CSS state, reset widget height, reset the view's carousel, initialise analytics on new cards,\r\n \t* fire new analytics card impressions\r\n \t*/\n\t}, {\n\t\tkey: 'refresh',\n\t\tvalue: function refresh() {\n\t\t\tvar _this2 = this;\n\n\t\t\tthis.pollTrigger && this.pollTrigger.classList.add('is-loading', 'is-disabled');\n\t\t\tthis.model.refresh().then(function () {\n\t\t\t\t_this2.render();\n\t\t\t\t_this2.pollTrigger && _this2.pollTrigger.classList.remove('is-loading', 'is-disabled');\n\t\t\t\t_this2.widget.resetHeight();\n\t\t\t\t_this2.carousel && _this2.carousel.reset();\n\t\t\t\t_this2.widget.analytics.cardsInit();\n\t\t\t\t_this2.widget.analytics.cardImpressions();\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n \t* Refresh view with latest server data at specified interval\r\n \t*/\n\t}, {\n\t\tkey: 'pollAtInterval',\n\t\tvalue: function pollAtInterval() {\n\t\t\tvar _this3 = this;\n\n\t\t\twindow.setInterval(function () {\n\t\t\t\t_this3.refresh();\n\t\t\t}, this.pollInterval);\n\t\t}\n\n\t\t/**\r\n \t* Register a click listener on specified DOM element to refresh view with latest server data\r\n \t*/\n\t}, {\n\t\tkey: 'registerPollTrigger',\n\t\tvalue: function registerPollTrigger() {\n\t\t\tvar _this4 = this;\n\n\t\t\tthis.pollTrigger.addEventListener('click', function () {\n\t\t\t\t_this4.refresh();\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n \t* Append the next set of cards to the view [for paginated models only]\r\n \t* @description Get the view's model's next API page, render the view template with new data and append nodes to view element\r\n \t*/\n\t}, {\n\t\tkey: 'appendNextPage',\n\t\tvalue: function appendNextPage() {\n\t\t\tvar _this5 = this;\n\n\t\t\tif (!this.model.isPaginated) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\t_this5.model.getNextPage().then(function () {\n\t\t\t\t\tvar template = _HandlebarsHandlebars2['default'].compile(_this5.template);\n\t\t\t\t\tvar frag = document.createElement('div');\n\t\t\t\t\tvar docFrag = document.createDocumentFragment();\n\t\t\t\t\tfrag.innerHTML = template({\n\t\t\t\t\t\tevents: _this5.model.lastReturnedPage\n\t\t\t\t\t});\n\t\t\t\t\t[].slice.call(frag.children).forEach(function (el) {\n\t\t\t\t\t\tdocFrag.appendChild(el);\n\t\t\t\t\t});\n\t\t\t\t\t_this5.el.appendChild(docFrag);\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}]);\n\n\treturn View;\n})();\n\nexports['default'] = View;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9WaWV3LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7O29DQUVVLDZCQUE2Qjs7Ozs7Ozs7Ozs7OztJQVU5QyxJQUFJO0FBQ0csVUFEUCxJQUFJLEdBQ3VFO21FQUFMLEVBQUU7O01BQTdELE1BQU0sUUFBTixNQUFNO01BQUUsRUFBRSxRQUFGLEVBQUU7TUFBRSxRQUFRLFFBQVIsUUFBUTtNQUFFLEtBQUssUUFBTCxLQUFLO01BQUUsWUFBWSxRQUFaLFlBQVk7TUFBRSxXQUFXLFFBQVgsV0FBVzs7d0JBRGpFLElBQUk7O0FBRVIsTUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDckIsTUFBSSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFFLEVBQUUsQ0FBRSxDQUFDO0FBQ3ZDLE1BQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBRSxRQUFRLENBQUUsQ0FBQyxTQUFTLENBQUM7QUFDN0QsTUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDbkIsTUFBSyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRztBQUNqRCxVQUFPO0dBQ1A7QUFDRCxNQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ2pDLE1BQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBQ2pDLE1BQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUUsV0FBVyxDQUFFLEdBQUcsU0FBUyxDQUFDOztB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QUFLLEtBQUssQ0FBQyxnQkFBZ0I7TUFDbkMsQ0FBQyxDQUFDO0FBQ0gsT0FBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBRSxDQUFDLE9BQU8sQ0FBQyxVQUFFLEVBQUUsRUFBTTtBQUNoRCxhQUFPLENBQUMsV0FBVyxDQUFFLEVBQUUsQ0FBRSxDQUFDO01BQzFCLENBQUMsQ0FBQztBQUNILFlBQUssRUFBRSxDQUFDLFdBQVcsQ0FBRSxPQUFPLENBQUUsQ0FBQztBQUMvQixZQUFPLEVBQUUsQ0FBQztLQUNWLENBQUMsQ0FBQztJQUNILENBQUMsQ0FBQztHQUNIOzs7UUE1R0ksSUFBSTs7O3FCQStHSyxJQUFJIiwiZmlsZSI6IkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9WaWV3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IEhhbmRsZWJhcnMgZnJvbSAnLi4vLi4vSGFuZGxlYmFycy9oYW5kbGViYXJzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSB3aWRnZXQgdmlld1xyXG4gKiBAY2xhc3NkZXNjIENyZWF0ZSBhIHZpZXcgb2JqZWN0IFxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy53aWRnZXQuIFRoZSB3aWRnZXQgaW5zdGFuY2UgW3JlcXVpcmVkXVxyXG4gKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5wb2xsSW50ZXJ2YWwuIEludGVydmFsIGluIG1pbGxzZWNvbmRzIHRvIGF1dG8tcmVmcmVzaCB0aGUgdmlldydzIGRhdGFcclxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMucG9sbFRyaWdnZXIuIENTUyBzZWxlY3RvciBmb3IgZWxlbWVudCB0byBjbGljay10cmlnZ2VyIGEgcmVmcmVzaCBvZiB0aGUgdmlldydzIGRhdGFcclxuICogQGNsYXNzIFNldCB2aWV3IGluc3RhbmNlIHByb3BlcnRpZXMgYW5kIGluaXRpYWxpc2Ugdmlld1xyXG4gKi9cclxuY2xhc3MgVmlldyB7XHJcblx0Y29uc3RydWN0b3IgKCB7IHdpZGdldCwgZWwsIHRlbXBsYXRlLCBtb2RlbCwgcG9sbEludGVydmFsLCBwb2xsVHJpZ2dlciB9ID0ge30gKSB7XHJcblx0XHR0aGlzLndpZGdldCA9IHdpZGdldDtcclxuXHRcdHRoaXMuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBlbCApO1xyXG5cdFx0dGhpcy50ZW1wbGF0ZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIHRlbXBsYXRlICkuaW5uZXJIVE1MO1xyXG5cdFx0dGhpcy5tb2RlbCA9IG1vZGVsO1xyXG5cdFx0aWYgKCAhdGhpcy53aWRnZXQgfHwgIXRoaXMuZWwgfHwgIXRoaXMudGVtcGxhdGUgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHRoaXMuY29uZmlnID0gdGhpcy53aWRnZXQuY29uZmlnO1xyXG5cdFx0dGhpcy5wb2xsSW50ZXJ2YWwgPSBwb2xsSW50ZXJ2YWw7XHJcblx0XHR0aGlzLnBvbGxUcmlnZ2VyID0gcG9sbFRyaWdnZXIgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBwb2xsVHJpZ2dlciApIDogdW5kZWZpbmVkO1xyXG5cdFx0XHJcblx0XHR0aGlzLmluaXQoKTtcclxuXHR9XHJcblx0LyoqXHJcbiBcdCogSW5pdGlhbGlzZSB2aWV3XHJcbiBcdCogQGRlc2NyaXB0aW9uIFN0YXJ0IHZpZXcgbW9kZWwgdXBkYXRlIHBvbGxlcjsgcmVnaXN0ZXIgdmlldyBtb2RlbCB1cGRhdGUgdHJpZ2dlclxyXG4gXHQqL1xyXG4gXHRpbml0ICgpIHtcclxuXHRcdGlmICggdGhpcy5wb2xsSW50ZXJ2YWwgKSB7XHJcblx0XHRcdHRoaXMucG9sbEF0SW50ZXJ2YWwoKTtcclxuXHRcdH1cclxuXHRcdGlmICggdGhpcy5wb2xsVHJpZ2dlciApIHtcclxuXHRcdFx0dGhpcy5yZWdpc3RlclBvbGxUcmlnZ2VyKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIFJlbmRlciB0aGUgdmlld1xyXG4gXHQqIEBkZXNjcmlwdGlvbiBSZW5kZXIgdGhlIHRlbXBsYXRlIHdpdGggc3VwcGxpZWQgZGF0YSBhbmQgYXBwZW5kIHRvIHZpZXcncyBlbGVtZW50XHJcbiBcdCovXHJcblx0cmVuZGVyICggZGF0YT10aGlzLmRhdGEgKSB7XHJcblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xyXG5cdFx0bGV0IHRlbXBsYXRlID0gSGFuZGxlYmFycy5jb21waWxlKCB0aGlzLnRlbXBsYXRlICk7XHJcblx0XHR0aGlzLmVsLmlubmVySFRNTCA9IHRlbXBsYXRlKCBkYXRhICk7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIFByZS1sb2FkIGltYWdlcyBhbmQgcmVzZXQgdGhlIHdpZGdldCBoZWlnaHRcclxuIFx0KiBAZGVzY3JpcHRpb24gV2hlbiBzb21lIGltYWdlcyBsb2FkLCB0aGUgaGVpZ2h0IG9mIHRoZSB3aWRnZXQgbWF5IGNoYW5nZSBhbmQgYSB3aWRnZXQucmVzZXRIZWlnaHQoKSBcclxuIFx0KiBtYXkgbmVlZCB0byBiZSBmaXJlZC4gVXNlIHRoaXMgZnVuY3Rpb24gdG8gbWFuYWdlIHRoZSBsb2FkaW5nIG9mIHRoZXNlIGltYWdlcyB0aGF0IGdlbmVyYXRlIGEgd2lkZ2V0IFxyXG4gXHQqIGRpbWVuc2lvbiBjaGFuZ2UgdG8gZW5zdXJlIHRoZSB3aWRnZXQgaGVpZ2h0IGlzIGFkYXB0ZWQgb25jZSB0aGUgaW1hZ2UgaGFzIGxvYWRlZFxyXG4gXHQqIEBwYXJhbSB7U3RyaW5nfSBQYXRoIHRvIHRoZSBpbWFnZSB0byBsb2FkXHJcbiBcdCogQHBhcmFtIHtTdHJpbmd9IFVuaXF1ZSBjc3MzIHNlbGVjdG9yIHRhcmdldHRpbmcgdGhlIDxpbWcgLz4gZWxlbWVudCB0byBsb2FkIHRoZSBwYXRoIGludG9cclxuIFx0Ki9cclxuXHRsb2FkSW1hZ2UgKCBwYXRoLCBlbCApIHtcclxuXHRcdGxldCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuXHRcdGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4gIHsgXHJcblx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGVsICkuc3JjID0gcGF0aDtcclxuXHRcdFx0dGhpcy53aWRnZXQucmVzZXRIZWlnaHQoKTtcclxuXHRcdH0pO1xyXG5cdFx0aW1nLnNyYyA9IHBhdGg7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIFJlZnJlc2ggdmlldyB3aXRoIGxhdGVzdCBzZXJ2ZXIgZGF0YVxyXG4gXHQqIEBkZXNjcmlwdGlvbiBTZXQgY29udHJvbCAnbG9hZGluZycgQ1NTIHN0YXRlIG9uIHBvbGwgdHJpZ2dlcjsgdHJpZ2dlciBhIG1vZGVsIHJlZnJlc2g7IHRoZW4gcmUtcmVuZGVyIHRociB2aWV3LCBcclxuIFx0KiByZXNldCBwb2xsIHRyaWdnZXIgQ1NTIHN0YXRlLCByZXNldCB3aWRnZXQgaGVpZ2h0LCByZXNldCB0aGUgdmlldydzIGNhcm91c2VsLCBpbml0aWFsaXNlIGFuYWx5dGljcyBvbiBuZXcgY2FyZHMsXHJcbiBcdCogZmlyZSBuZXcgYW5hbHl0aWNzIGNhcmQgaW1wcmVzc2lvbnNcclxuIFx0Ki9cclxuXHRyZWZyZXNoICgpIHtcclxuXHRcdHRoaXMucG9sbFRyaWdnZXIgJiYgdGhpcy5wb2xsVHJpZ2dlci5jbGFzc0xpc3QuYWRkKCdpcy1sb2FkaW5nJywgJ2lzLWRpc2FibGVkJyk7IFxyXG5cdFx0dGhpcy5tb2RlbC5yZWZyZXNoKCkudGhlbiggKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnJlbmRlcigpO1xyXG5cdFx0XHR0aGlzLnBvbGxUcmlnZ2VyICYmIHRoaXMucG9sbFRyaWdnZXIuY2xhc3NMaXN0LnJlbW92ZSgnaXMtbG9hZGluZycsICdpcy1kaXNhYmxlZCcpO1xyXG5cdFx0XHR0aGlzLndpZGdldC5yZXNldEhlaWdodCgpO1xyXG5cdFx0XHR0aGlzLmNhcm91c2VsICYmIHRoaXMuY2Fyb3VzZWwucmVzZXQoKTtcclxuXHRcdFx0dGhpcy53aWRnZXQuYW5hbHl0aWNzLmNhcmRzSW5pdCgpO1xyXG5cdFx0XHR0aGlzLndpZGdldC5hbmFseXRpY3MuY2FyZEltcHJlc3Npb25zKCk7XHRcclxuXHRcdH0pO1x0XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIFJlZnJlc2ggdmlldyB3aXRoIGxhdGVzdCBzZXJ2ZXIgZGF0YSBhdCBzcGVjaWZpZWQgaW50ZXJ2YWxcclxuIFx0Ki9cclxuXHRwb2xsQXRJbnRlcnZhbCAoKSB7XHJcblx0XHR3aW5kb3cuc2V0SW50ZXJ2YWwoICgpID0+IHtcclxuXHRcdFx0dGhpcy5yZWZyZXNoKCk7XHJcblx0XHR9LCB0aGlzLnBvbGxJbnRlcnZhbCApO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBSZWdpc3RlciBhIGNsaWNrIGxpc3RlbmVyIG9uIHNwZWNpZmllZCBET00gZWxlbWVudCB0byByZWZyZXNoIHZpZXcgd2l0aCBsYXRlc3Qgc2VydmVyIGRhdGFcclxuIFx0Ki9cclxuXHRyZWdpc3RlclBvbGxUcmlnZ2VyICgpIHtcclxuXHRcdHRoaXMucG9sbFRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVmcmVzaCgpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIEFwcGVuZCB0aGUgbmV4dCBzZXQgb2YgY2FyZHMgdG8gdGhlIHZpZXcgW2ZvciBwYWdpbmF0ZWQgbW9kZWxzIG9ubHldXHJcbiBcdCogQGRlc2NyaXB0aW9uIEdldCB0aGUgdmlldydzIG1vZGVsJ3MgbmV4dCBBUEkgcGFnZSwgcmVuZGVyIHRoZSB2aWV3IHRlbXBsYXRlIHdpdGggbmV3IGRhdGEgYW5kIGFwcGVuZCBub2RlcyB0byB2aWV3IGVsZW1lbnRcclxuIFx0Ki9cclxuXHRhcHBlbmROZXh0UGFnZSAoKSB7XHJcblx0XHRpZiAoICF0aGlzLm1vZGVsLmlzUGFnaW5hdGVkICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKCByZXNvbHZlICkgPT4ge1xyXG5cdFx0XHR0aGlzLm1vZGVsLmdldE5leHRQYWdlKCkudGhlbiggKCkgPT4ge1xyXG5cdFx0XHRcdGxldCB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMuY29tcGlsZSggdGhpcy50ZW1wbGF0ZSApO1xyXG5cdFx0XHRcdGxldCBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcclxuXHRcdFx0XHRsZXQgZG9jRnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHRcdFx0XHRmcmFnLmlubmVySFRNTCA9IHRlbXBsYXRlKHtcclxuXHRcdFx0XHRcdGV2ZW50czogdGhpcy5tb2RlbC5sYXN0UmV0dXJuZWRQYWdlXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0W10uc2xpY2UuY2FsbCggZnJhZy5jaGlsZHJlbiApLmZvckVhY2goKCBlbCApID0+IHtcclxuXHRcdFx0XHRcdGRvY0ZyYWcuYXBwZW5kQ2hpbGQoIGVsICk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0dGhpcy5lbC5hcHBlbmRDaGlsZCggZG9jRnJhZyApO1xyXG5cdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZpZXc7Il19\n},{\"../../Handlebars/handlebars\":43}],49:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _utilsQueryString = require('../utils/queryString');\n\nvar _utilsDebounce = require('../utils/debounce');\n\nvar _utilsDebounce2 = _interopRequireDefault(_utilsDebounce);\n\nvar _Analytics = require('./Analytics');\n\nvar _Analytics2 = _interopRequireDefault(_Analytics);\n\n/**\r\n * Create a widget\r\n * @classdesc Create a widget object \r\n * @param {Boolean} options.widgetContainer. The widget container element\r\n * @param {Boolean} options.responsive. Whether the widget is responsive\r\n * @param {Boolean} options.userConfig. Whether the widget has user configurable settings\r\n * @class Set widget instance properties and initialise widget\r\n */\n\nvar Widget = (function () {\n\tfunction Widget() {\n\t\tvar _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n\t\tvar widgetContainer = _ref.widgetContainer;\n\t\tvar responsive = _ref.responsive;\n\t\tvar userConfig = _ref.userConfig;\n\t\tvar widgetName = _ref.widgetName;\n\n\t\t_classCallCheck(this, Widget);\n\n\t\tthis.widgetContainer = widgetContainer || document.querySelector('[data-widget-container]');\n\t\tthis.responsive = responsive === undefined ? true : responsive;\n\t\tthis.userConfig = userConfig === undefined ? true : userConfig;\n\t\tthis.widgetName = widgetName || '';\n\t\tthis.appId = '437bca42';\n\t\tif (!this.widgetName) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/**\r\n \t* Initialise the widget\r\n \t* @description Make the widget responsive; fetch and cache on the widget instance the user config hash\r\n \t*/\n\n\t_createClass(Widget, [{\n\t\tkey: 'init',\n\t\tvalue: function init() {\n\t\t\tthis.responsive && this.makeResponsive(this.widgetContainer);\n\t\t\tthis.config = this.userConfig ? this.getUserConfig() : undefined;\n\t\t}\n\n\t\t/**\r\n \t* Initialise widget analytics\r\n \t* @description Create a new instance of Analytics class for caching on the widget instance\r\n \t* @returns {Object} Analytics instance\r\n \t*/\n\t}, {\n\t\tkey: 'initAnalytics',\n\t\tvalue: function initAnalytics() {\n\t\t\treturn new _Analytics2['default']({\n\t\t\t\tconfigHash: this.config,\n\t\t\t\twidget: this\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n \t* Create a hash map of user config from widget query string\r\n \t* @returns {Object} hash map of user config\r\n \t*/\n\t}, {\n\t\tkey: 'getUserConfig',\n\t\tvalue: function getUserConfig() {\n\t\t\treturn (0, _utilsQueryString.queryStringParse)(location.search);\n\t\t}\n\n\t\t/**\r\n \t* Make widget responsive to its current content on win resize\r\n \t* @param {Element} The widget container\r\n \t*/\n\t}, {\n\t\tkey: 'makeResponsive',\n\t\tvalue: function makeResponsive(widgetContainer) {\n\t\t\tvar _this = this;\n\n\t\t\twindow.addEventListener('resize', (0, _utilsDebounce2['default'])(function () {\n\t\t\t\treturn _this.postContentHeight(widgetContainer);\n\t\t\t}, 250));\n\t\t}\n\n\t\t/**\r\n \t* Post the current scroll height value of an element to the parent window\r\n \t* @param {Element} The elemnt whose height to send\r\n \t* @param {String} URL of parent to post message to; defaults to document.referrer\r\n \t*/\n\t}, {\n\t\tkey: 'postContentHeight',\n\t\tvalue: function postContentHeight(el) {\n\t\t\tvar url = arguments.length <= 1 || arguments[1] === undefined ? document.referrer : arguments[1];\n\n\t\t\t//Don't post to self\n\t\t\tif (window === window.top || window.location === window.top.location) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tparent.postMessage('widgetName=' + this.widgetName + '&contentHeight=' + el.scrollHeight, url);\n\t\t}\n\n\t\t/**\r\n \t* Reset the height of the widget\r\n \t*/\n\t}, {\n\t\tkey: 'resetHeight',\n\t\tvalue: function resetHeight() {\n\t\t\tthis.postContentHeight(this.widgetContainer);\n\t\t}\n\t}]);\n\n\treturn Widget;\n})();\n\nexports['default'] = Widget;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9XaWRnZXQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7Z0NBRW9CLHNCQUFzQjs7NkJBQ2xDLG1CQUFtQjs7Ozt5QkFDbEIsYUFBYTs7Ozs7Ozs7Ozs7OztJQVU3QixNQUFNO0FBQ0EsVUFETixNQUFNLEdBQ2lFO21FQUFMLEVBQUU7O01BQTFELGVBQWUsUUFBZixlQUFlO01BQUUsVUFBVSxRQUFWLFVBQVU7TUFBRSxVQUFVLFFBQVYsVUFBVTtNQUFFLFVBQVUsUUFBVixVQUFVOzt3QkFEN0QsTUFBTTs7QUFFVixNQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDNUYsTUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLEtBQUssU0FBUyxHQUFHLElBQUksR0FBRyxVQUFVLENBQUM7QUFDL0QsTUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLEtBQUssU0FBUyxHQUFHLElBQUksR0FBRyxVQUFVLENBQUM7QUFDL0QsTUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLElBQUksRUFBRSxDQUFDO0FBQ25DLE1BQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO0FBQ3hCLE1BQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFHO0FBQ3ZCLFVBQU87R0FDUDtFQUNEOzs7Ozs7O2NBVkksTUFBTTs7U0FlTixnQkFBRztBQUNQLE9BQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsZUFBZSxDQUFFLENBQUM7QUFDL0QsT0FBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxTQUFTLENBQUM7R0FDakU7Ozs7Ozs7OztTQU1hLHlCQUFHO0FBQ2hCLFVBQU8sMkJBQWM7QUFDcEIsY0FBVSxFQUFFLElBQUksQ0FBQyxNQUFNO0FBQ3ZCLFVBQU0sRUFBRSxJQUFJO0lBQ1osQ0FBQyxDQUFDO0dBQ0g7Ozs7Ozs7O1NBS2EseUJBQUc7QUFDaEIsVUFBTyx3Q0FBa0IsUUFBUSxDQUFDLE1BQU0sQ0FBRSxDQUFDO0dBQzNDOzs7Ozs7OztTQUtjLHdCQUFFLGVBQWUsRUFBRzs7O0FBQ2xDLFNBQU0sQ0FBQyxnQkFBZ0IsQ0FBRSxRQUFRLEVBQUUsZ0NBQVU7V0FBTSxNQUFLLGlCQUFpQixDQUFDLGVBQWUsQ0FBQztJQUFBLEVBQUUsR0FBRyxDQUFDLENBQUUsQ0FBQztHQUNuRzs7Ozs7Ozs7O1NBTWlCLDJCQUFFLEVBQUUsRUFBMEI7T0FBeEIsR0FBRyx5REFBQyxRQUFRLENBQUMsUUFBUTs7O0FBRTVDLE9BQUssTUFBTSxLQUFLLE1BQU0sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRztBQUN2RSxXQUFPO0lBQ1A7QUFDRCxTQUFNLENBQUMsV0FBVyxpQkFBZ0IsSUFBSSxDQUFDLFVBQVUsdUJBQWtCLEVBQUUsQ0FBQyxZQUFZLEVBQUksR0FBRyxDQUFFLENBQUM7R0FDNUY7Ozs7Ozs7U0FJVyx1QkFBRztBQUNkLE9BQUksQ0FBQyxpQkFBaUIsQ0FBRSxJQUFJLENBQUMsZUFBZSxDQUFFLENBQUM7R0FDL0M7OztRQTdESSxNQUFNOzs7cUJBZ0VHLE1BQU0iLCJmaWxlIjoiQzovdGVtcC9HRy5Gcm9udEVuZC5XaWRnZXRzL3dpZGdldHMvY3Jvd2RmdW5kaW5nLXBsZWRnZS1ib3gvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvZnJhbWV3b3JrL1dpZGdldC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCB7IHF1ZXJ5U3RyaW5nUGFyc2UgfSBmcm9tICcuLi91dGlscy9xdWVyeVN0cmluZyc7XHJcbmltcG9ydCBkZWJvdW5jZSBmcm9tICcuLi91dGlscy9kZWJvdW5jZSc7XHJcbmltcG9ydCBBbmFseXRpY3MgZnJvbSAnLi9BbmFseXRpY3MnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIHdpZGdldFxyXG4gKiBAY2xhc3NkZXNjIENyZWF0ZSBhIHdpZGdldCBvYmplY3QgXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy53aWRnZXRDb250YWluZXIuIFRoZSB3aWRnZXQgY29udGFpbmVyIGVsZW1lbnRcclxuICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLnJlc3BvbnNpdmUuIFdoZXRoZXIgdGhlIHdpZGdldCBpcyByZXNwb25zaXZlXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy51c2VyQ29uZmlnLiBXaGV0aGVyIHRoZSB3aWRnZXQgaGFzIHVzZXIgY29uZmlndXJhYmxlIHNldHRpbmdzXHJcbiAqIEBjbGFzcyBTZXQgd2lkZ2V0IGluc3RhbmNlIHByb3BlcnRpZXMgYW5kIGluaXRpYWxpc2Ugd2lkZ2V0XHJcbiAqL1xyXG5jbGFzcyBXaWRnZXQge1xyXG5cdGNvbnN0cnVjdG9yKCB7IHdpZGdldENvbnRhaW5lciwgcmVzcG9uc2l2ZSwgdXNlckNvbmZpZywgd2lkZ2V0TmFtZSB9ID0ge30gKSB7XHJcblx0XHR0aGlzLndpZGdldENvbnRhaW5lciA9IHdpZGdldENvbnRhaW5lciB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS13aWRnZXQtY29udGFpbmVyXScpO1xyXG5cdFx0dGhpcy5yZXNwb25zaXZlID0gcmVzcG9uc2l2ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHJlc3BvbnNpdmU7XHJcblx0XHR0aGlzLnVzZXJDb25maWcgPSB1c2VyQ29uZmlnID09PSB1bmRlZmluZWQgPyB0cnVlIDogdXNlckNvbmZpZztcclxuXHRcdHRoaXMud2lkZ2V0TmFtZSA9IHdpZGdldE5hbWUgfHwgJyc7XHJcblx0XHR0aGlzLmFwcElkID0gJzQzN2JjYTQyJztcclxuXHRcdGlmICggIXRoaXMud2lkZ2V0TmFtZSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdH1cclxuXHQvKipcclxuIFx0KiBJbml0aWFsaXNlIHRoZSB3aWRnZXRcclxuIFx0KiBAZGVzY3JpcHRpb24gTWFrZSB0aGUgd2lkZ2V0IHJlc3BvbnNpdmU7IGZldGNoIGFuZCBjYWNoZSBvbiB0aGUgd2lkZ2V0IGluc3RhbmNlIHRoZSB1c2VyIGNvbmZpZyBoYXNoXHJcbiBcdCovXHJcblx0aW5pdCAoKSB7XHJcblx0XHR0aGlzLnJlc3BvbnNpdmUgJiYgdGhpcy5tYWtlUmVzcG9uc2l2ZSggdGhpcy53aWRnZXRDb250YWluZXIgKTtcclxuXHRcdHRoaXMuY29uZmlnID0gdGhpcy51c2VyQ29uZmlnID8gdGhpcy5nZXRVc2VyQ29uZmlnKCkgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIEluaXRpYWxpc2Ugd2lkZ2V0IGFuYWx5dGljc1xyXG4gXHQqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQW5hbHl0aWNzIGNsYXNzIGZvciBjYWNoaW5nIG9uIHRoZSB3aWRnZXQgaW5zdGFuY2VcclxuIFx0KiBAcmV0dXJucyB7T2JqZWN0fSBBbmFseXRpY3MgaW5zdGFuY2VcclxuIFx0Ki9cclxuXHRpbml0QW5hbHl0aWNzICgpIHtcclxuXHRcdHJldHVybiBuZXcgQW5hbHl0aWNzKHtcclxuXHRcdFx0Y29uZmlnSGFzaDogdGhpcy5jb25maWcsXHJcblx0XHRcdHdpZGdldDogdGhpc1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIENyZWF0ZSBhIGhhc2ggbWFwIG9mIHVzZXIgY29uZmlnIGZyb20gd2lkZ2V0IHF1ZXJ5IHN0cmluZ1xyXG4gXHQqIEByZXR1cm5zIHtPYmplY3R9IGhhc2ggbWFwIG9mIHVzZXIgY29uZmlnXHJcbiBcdCovXHJcblx0Z2V0VXNlckNvbmZpZyAoKSB7XHJcblx0XHRyZXR1cm4gcXVlcnlTdHJpbmdQYXJzZSggbG9jYXRpb24uc2VhcmNoICk7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIE1ha2Ugd2lkZ2V0IHJlc3BvbnNpdmUgdG8gaXRzIGN1cnJlbnQgY29udGVudCBvbiB3aW4gcmVzaXplXHJcbiBcdCogQHBhcmFtIHtFbGVtZW50fSBUaGUgd2lkZ2V0IGNvbnRhaW5lclxyXG4gXHQqL1xyXG5cdG1ha2VSZXNwb25zaXZlICggd2lkZ2V0Q29udGFpbmVyICkge1xyXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdyZXNpemUnLCBkZWJvdW5jZSggKCkgPT4gdGhpcy5wb3N0Q29udGVudEhlaWdodCh3aWRnZXRDb250YWluZXIpLCAyNTApICk7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIFBvc3QgdGhlIGN1cnJlbnQgc2Nyb2xsIGhlaWdodCB2YWx1ZSBvZiBhbiBlbGVtZW50IHRvIHRoZSBwYXJlbnQgd2luZG93XHJcbiBcdCogQHBhcmFtIHtFbGVtZW50fSBUaGUgZWxlbW50IHdob3NlIGhlaWdodCB0byBzZW5kXHJcbiBcdCogQHBhcmFtIHtTdHJpbmd9IFVSTCBvZiBwYXJlbnQgdG8gcG9zdCBtZXNzYWdlIHRvOyBkZWZhdWx0cyB0byBkb2N1bWVudC5yZWZlcnJlclxyXG4gXHQqL1xyXG5cdHBvc3RDb250ZW50SGVpZ2h0ICggZWwsIHVybD1kb2N1bWVudC5yZWZlcnJlciApIHtcclxuXHRcdC8vRG9uJ3QgcG9zdCB0byBzZWxmXHJcblx0XHRpZiAoIHdpbmRvdyA9PT0gd2luZG93LnRvcCB8fCB3aW5kb3cubG9jYXRpb24gPT09IHdpbmRvdy50b3AubG9jYXRpb24gKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH0gXHJcblx0XHRwYXJlbnQucG9zdE1lc3NhZ2UoIGB3aWRnZXROYW1lPSR7dGhpcy53aWRnZXROYW1lfSZjb250ZW50SGVpZ2h0PSR7ZWwuc2Nyb2xsSGVpZ2h0fWAsIHVybCApO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBSZXNldCB0aGUgaGVpZ2h0IG9mIHRoZSB3aWRnZXRcclxuIFx0Ki9cclxuXHRyZXNldEhlaWdodCAoKSB7XHJcblx0XHR0aGlzLnBvc3RDb250ZW50SGVpZ2h0KCB0aGlzLndpZGdldENvbnRhaW5lciApO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2lkZ2V0O1xyXG5cclxuIl19\n},{\"../utils/debounce\":50,\"../utils/queryString\":51,\"./Analytics\":46}],50:[function(require,module,exports){\n'use strict';\n/**\r\n * Debounces a function call\r\n * @param {function} The function to debounce\r\n * @param {number} Duration of debounce\r\n * @param {boolean} If true, trigger function on leading edge\r\n * @return {function} The debouncer function\r\n */\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\nfunction debounce(func, wait, immediate) {\n\tvar timeout = undefined;\n\treturn function () {\n\t\tvar context = this,\n\t\t args = arguments;\n\t\tvar later = function later() {\n\t\t\ttimeout = null;\n\t\t\tif (!immediate) {\n\t\t\t\tfunc.apply(context, args);\n\t\t\t}\n\t\t};\n\t\tvar callNow = immediate && !timeout;\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t\tif (callNow) {\n\t\t\tfunc.apply(context, args);\n\t\t}\n\t};\n}\n\nexports['default'] = debounce;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3V0aWxzL2RlYm91bmNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7QUFRYixTQUFTLFFBQVEsQ0FBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRztBQUMxQyxLQUFJLE9BQU8sWUFBQSxDQUFDO0FBQ1osUUFBTyxZQUFXO0FBQ2pCLE1BQUksT0FBTyxHQUFHLElBQUk7TUFBRSxJQUFJLEdBQUcsU0FBUyxDQUFDO0FBQ3JDLE1BQUksS0FBSyxHQUFHLFNBQVIsS0FBSyxHQUFjO0FBQ3RCLFVBQU8sR0FBRyxJQUFJLENBQUM7QUFDZixPQUFLLENBQUMsU0FBUyxFQUFHO0FBQ2pCLFFBQUksQ0FBQyxLQUFLLENBQUUsT0FBTyxFQUFFLElBQUksQ0FBRSxDQUFDO0lBQzVCO0dBQ0QsQ0FBQztBQUNGLE1BQUksT0FBTyxHQUFHLFNBQVMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUNwQyxjQUFZLENBQUUsT0FBTyxDQUFFLENBQUM7QUFDeEIsU0FBTyxHQUFHLFVBQVUsQ0FBRSxLQUFLLEVBQUUsSUFBSSxDQUFFLENBQUM7QUFDcEMsTUFBSyxPQUFPLEVBQUc7QUFDZCxPQUFJLENBQUMsS0FBSyxDQUFFLE9BQU8sRUFBRSxJQUFJLENBQUUsQ0FBQztHQUM1QjtFQUNELENBQUM7Q0FDRjs7cUJBRWMsUUFBUSIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jcm93ZGZ1bmRpbmctcGxlZGdlLWJveC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy91dGlscy9kZWJvdW5jZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuLyoqXHJcbiAqIERlYm91bmNlcyBhIGZ1bmN0aW9uIGNhbGxcclxuICogQHBhcmFtIHtmdW5jdGlvbn0gVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBEdXJhdGlvbiBvZiBkZWJvdW5jZVxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IElmIHRydWUsIHRyaWdnZXIgZnVuY3Rpb24gb24gbGVhZGluZyBlZGdlXHJcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSBUaGUgZGVib3VuY2VyIGZ1bmN0aW9uXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWJvdW5jZSggZnVuYywgd2FpdCwgaW1tZWRpYXRlICkge1xyXG5cdGxldCB0aW1lb3V0O1xyXG5cdHJldHVybiBmdW5jdGlvbigpIHtcclxuXHRcdGxldCBjb250ZXh0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50cztcclxuXHRcdGxldCBsYXRlciA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR0aW1lb3V0ID0gbnVsbDtcclxuXHRcdFx0aWYgKCAhaW1tZWRpYXRlICkgeyBcclxuXHRcdFx0XHRmdW5jLmFwcGx5KCBjb250ZXh0LCBhcmdzICk7XHJcblx0XHRcdH1cdFxyXG5cdFx0fTtcclxuXHRcdGxldCBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0O1xyXG5cdFx0Y2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XHJcblx0XHR0aW1lb3V0ID0gc2V0VGltZW91dCggbGF0ZXIsIHdhaXQgKTtcclxuXHRcdGlmICggY2FsbE5vdyApIHsgXHJcblx0XHRcdGZ1bmMuYXBwbHkoIGNvbnRleHQsIGFyZ3MgKTtcclxuXHRcdH1cclxuXHR9O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBkZWJvdW5jZTsiXX0=\n},{}],51:[function(require,module,exports){\n'use strict';\n/**\r\n * Create a hash map of query string key-value pairs.\r\n * @param {string} location.search string to hash\r\n * @returns {object} hash map of query string key-value pairs\r\n * @author by Sindre Sorhus\r\n * @license MIT License\r\n * @see https://github.com/sindresorhus/query-string\r\n */\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\nexports.queryStringParse = queryStringParse;\nexports.queryStringStringify = queryStringStringify;\n\nfunction queryStringParse(str) {\n\tif (typeof str !== 'string') {\n\t\treturn {};\n\t}\n\n\tstr = str.trim().replace(/^(\\?|#)/, '');\n\n\tif (!str) {\n\t\treturn {};\n\t}\n\n\treturn str.trim().split('&').reduce(function (ret, param) {\n\t\tvar parts = param.replace(/\\+/g, ' ').split('=');\n\t\tvar key = parts[0];\n\t\tvar val = parts[1];\n\n\t\tkey = decodeURIComponent(key);\n\t\t// missing `=` should be `null`:\n\t\t// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n\t\tval = val === undefined ? null : decodeURIComponent(val);\n\n\t\tif (!ret.hasOwnProperty(key)) {\n\t\t\tret[key] = val;\n\t\t} else if (Array.isArray(ret[key])) {\n\t\t\tret[key].push(val);\n\t\t} else {\n\t\t\tret[key] = [ret[key], val];\n\t\t}\n\n\t\treturn ret;\n\t}, {});\n}\n\n/**\r\n * Create query string of key-value pairs from a hash map.\r\n * @param {obj} hashmap source\r\n * @returns {string} queryString\r\n * @author by Sindre Sorhus\r\n * @license MIT License\r\n * @see https://github.com/sindresorhus/query-string\r\n */\n\nfunction queryStringStringify(obj) {\n\treturn obj ? Object.keys(obj).sort().map(function (key) {\n\t\tvar val = obj[key];\n\n\t\tif (Array.isArray(val)) {\n\t\t\treturn val.sort().map(function (val2) {\n\t\t\t\treturn encodeURIComponent(key) + '=' + encodeURIComponent(val2);\n\t\t\t}).join('&');\n\t\t}\n\n\t\treturn encodeURIComponent(key) + '=' + encodeURIComponent(val);\n\t}).join('&') : '';\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3V0aWxzL3F1ZXJ5U3RyaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBU04sU0FBUyxnQkFBZ0IsQ0FBRyxHQUFHLEVBQUc7QUFDeEMsS0FBSyxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUc7QUFDOUIsU0FBTyxFQUFFLENBQUM7RUFDVjs7QUFFRCxJQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7O0FBRXhDLEtBQUssQ0FBQyxHQUFHLEVBQUc7QUFDWCxTQUFPLEVBQUUsQ0FBQztFQUNWOztBQUVELFFBQU8sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBRSxHQUFHLENBQUUsQ0FBQyxNQUFNLENBQUUsVUFBVyxHQUFHLEVBQUUsS0FBSyxFQUFHO0FBQzlELE1BQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBRSxHQUFHLENBQUUsQ0FBQztBQUNuRCxNQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsTUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVuQixLQUFHLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7OztBQUc5QixLQUFHLEdBQUcsR0FBRyxLQUFLLFNBQVMsR0FBRyxJQUFJLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7O0FBRXpELE1BQUssQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFHO0FBQy9CLE1BQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7R0FDZixNQUFNLElBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRztBQUNyQyxNQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFFLEdBQUcsQ0FBRSxDQUFDO0dBQ3JCLE1BQU07QUFDTixNQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDM0I7O0FBRUQsU0FBTyxHQUFHLENBQUM7RUFDWCxFQUFFLEVBQUUsQ0FBRSxDQUFDO0NBQ1I7Ozs7Ozs7Ozs7O0FBVU0sU0FBUyxvQkFBb0IsQ0FBRyxHQUFHLEVBQUc7QUFDNUMsUUFBTyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBRSxHQUFHLENBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUUsVUFBVSxHQUFHLEVBQUc7QUFDM0QsTUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztBQUVuQixNQUFLLEtBQUssQ0FBQyxPQUFPLENBQUUsR0FBRyxDQUFFLEVBQUc7QUFDM0IsVUFBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFFLFVBQVcsSUFBSSxFQUFHO0FBQ3hDLFdBQU8sa0JBQWtCLENBQUUsR0FBRyxDQUFFLEdBQUcsR0FBRyxHQUFHLGtCQUFrQixDQUFFLElBQUksQ0FBRSxDQUFDO0lBQ3BFLENBQUMsQ0FBQyxJQUFJLENBQUUsR0FBRyxDQUFFLENBQUM7R0FDZjs7QUFFRCxTQUFPLGtCQUFrQixDQUFFLEdBQUcsQ0FBRSxHQUFHLEdBQUcsR0FBRyxrQkFBa0IsQ0FBRSxHQUFHLENBQUUsQ0FBQztFQUNuRSxDQUFDLENBQUMsSUFBSSxDQUFFLEdBQUcsQ0FBRSxHQUFHLEVBQUUsQ0FBQztDQUNwQiIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jcm93ZGZ1bmRpbmctcGxlZGdlLWJveC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy91dGlscy9xdWVyeVN0cmluZy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuLyoqXHJcbiAqIENyZWF0ZSBhIGhhc2ggbWFwIG9mIHF1ZXJ5IHN0cmluZyBrZXktdmFsdWUgcGFpcnMuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbi5zZWFyY2ggc3RyaW5nIHRvIGhhc2hcclxuICogQHJldHVybnMge29iamVjdH0gaGFzaCBtYXAgb2YgcXVlcnkgc3RyaW5nIGtleS12YWx1ZSBwYWlyc1xyXG4gKiBAYXV0aG9yIGJ5IFNpbmRyZSBTb3JodXNcclxuICogQGxpY2Vuc2UgTUlUIExpY2Vuc2VcclxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3F1ZXJ5LXN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5U3RyaW5nUGFyc2UgKCBzdHIgKSB7XHJcblx0aWYgKCB0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyApIHtcclxuXHRcdHJldHVybiB7fTtcclxuXHR9XHJcblxyXG5cdHN0ciA9IHN0ci50cmltKCkucmVwbGFjZSgvXihcXD98IykvLCAnJyk7XHJcblxyXG5cdGlmICggIXN0ciApIHtcclxuXHRcdHJldHVybiB7fTtcclxuXHR9XHJcblxyXG5cdHJldHVybiBzdHIudHJpbSgpLnNwbGl0KCAnJicgKS5yZWR1Y2UoIGZ1bmN0aW9uICggcmV0LCBwYXJhbSApIHtcclxuXHRcdGxldCBwYXJ0cyA9IHBhcmFtLnJlcGxhY2UoL1xcKy9nLCAnICcpLnNwbGl0KCAnPScgKTtcclxuXHRcdGxldCBrZXkgPSBwYXJ0c1swXTtcclxuXHRcdGxldCB2YWwgPSBwYXJ0c1sxXTtcclxuXHJcblx0XHRrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5KTtcclxuXHRcdC8vIG1pc3NpbmcgYD1gIHNob3VsZCBiZSBgbnVsbGA6XHJcblx0XHQvLyBodHRwOi8vdzMub3JnL1RSLzIwMTIvV0QtdXJsLTIwMTIwNTI0LyNjb2xsZWN0LXVybC1wYXJhbWV0ZXJzXHJcblx0XHR2YWwgPSB2YWwgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZWNvZGVVUklDb21wb25lbnQodmFsKTtcclxuXHJcblx0XHRpZiAoICFyZXQuaGFzT3duUHJvcGVydHkoa2V5KSApIHtcclxuXHRcdFx0cmV0W2tleV0gPSB2YWw7XHJcblx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KHJldFtrZXldKSApIHtcclxuXHRcdFx0cmV0W2tleV0ucHVzaCggdmFsICk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXRba2V5XSA9IFtyZXRba2V5XSwgdmFsXTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmV0O1xyXG5cdH0sIHt9ICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgcXVlcnkgc3RyaW5nIG9mIGtleS12YWx1ZSBwYWlycyBmcm9tIGEgaGFzaCBtYXAuXHJcbiAqIEBwYXJhbSB7b2JqfSBoYXNobWFwIHNvdXJjZVxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBxdWVyeVN0cmluZ1xyXG4gKiBAYXV0aG9yIGJ5IFNpbmRyZSBTb3JodXNcclxuICogQGxpY2Vuc2UgTUlUIExpY2Vuc2VcclxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3F1ZXJ5LXN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5U3RyaW5nU3RyaW5naWZ5ICggb2JqICkge1xyXG5cdHJldHVybiBvYmogPyBPYmplY3Qua2V5cyggb2JqICkuc29ydCgpLm1hcCggZnVuY3Rpb24oIGtleSApIHtcclxuXHRcdGxldCB2YWwgPSBvYmpba2V5XTtcclxuXHJcblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkge1xyXG5cdFx0XHRyZXR1cm4gdmFsLnNvcnQoKS5tYXAgKGZ1bmN0aW9uICggdmFsMiApIHtcclxuXHRcdFx0XHRyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsMiApO1xyXG5cdFx0XHR9KS5qb2luKCAnJicgKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsICk7XHJcblx0fSkuam9pbiggJyYnICkgOiAnJztcclxufSJdfQ==\n},{}],52:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _utilsQueryString = require('../../utils/queryString');\n\n/**\r\n * Write a UTM code string for appending to domain URLs\r\n * @param {String} url to append utm code to\r\n * @param {object} Hash of utm key-value pairs\r\n */\nfunction writeUtmCode(url, utmParams) {\n var utm = url.includes('?') ? '' : '?';\n utm += '&utm_source=website&utm_medium=jg-widget';\n utm += '&' + (0, _utilsQueryString.queryStringStringify)(utmParams);\n return utm;\n}\n\nexports['default'] = writeUtmCode;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3dpZGdldC9hbmFseXRpY3Mvd3JpdGVVdG1Db2RlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7O2dDQUV3Qix5QkFBeUI7Ozs7Ozs7QUFPOUQsU0FBUyxZQUFZLENBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRztBQUN2QyxNQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFFLEdBQUcsQ0FBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDekMsS0FBRyw4Q0FBOEMsQ0FBQztBQUNsRCxLQUFHLFVBQVMsNENBQXNCLFNBQVMsQ0FBRSxBQUFHLENBQUM7QUFDakQsU0FBTyxHQUFHLENBQUM7Q0FDWDs7cUJBRWMsWUFBWSIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jcm93ZGZ1bmRpbmctcGxlZGdlLWJveC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy93aWRnZXQvYW5hbHl0aWNzL3dyaXRlVXRtQ29kZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCB7IHF1ZXJ5U3RyaW5nU3RyaW5naWZ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvcXVlcnlTdHJpbmcnO1xyXG5cclxuLyoqXHJcbiAqIFdyaXRlIGEgVVRNIGNvZGUgc3RyaW5nIGZvciBhcHBlbmRpbmcgdG8gZG9tYWluIFVSTHNcclxuICogQHBhcmFtIHtTdHJpbmd9IHVybCB0byBhcHBlbmQgdXRtIGNvZGUgdG9cclxuICogQHBhcmFtIHtvYmplY3R9IEhhc2ggb2YgdXRtIGtleS12YWx1ZSBwYWlyc1xyXG4gKi9cclxuZnVuY3Rpb24gd3JpdGVVdG1Db2RlKCB1cmwsIHV0bVBhcmFtcyApIHtcclxuXHRsZXQgdXRtID0gdXJsLmluY2x1ZGVzKCAnPycgKSA/ICcnIDogJz8nO1xyXG5cdHV0bSArPSBgJnV0bV9zb3VyY2U9d2Vic2l0ZSZ1dG1fbWVkaXVtPWpnLXdpZGdldGA7XHJcblx0dXRtICs9IGAmJHsgcXVlcnlTdHJpbmdTdHJpbmdpZnkoIHV0bVBhcmFtcyApIH1gO1xyXG5cdHJldHVybiB1dG07XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHdyaXRlVXRtQ29kZTtcclxuXHJcbiJdfQ==\n},{\"../../utils/queryString\":51}],53:[function(require,module,exports){\n'use strict';\n/**\r\n * Find a percentage value from supplied numerator and denominator values\r\n * @return {String} Rounded percetange value including % sign or empty string if denominator is falsy\r\n */\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports.getPercent = getPercent;\nexports.commaFormat = commaFormat;\n\nfunction getPercent(numerator, denominator) {\n if (!denominator) {\n return '';\n } else {\n return parseInt(parseFloat(numerator) / parseFloat(denominator) * 100, 10);\n }\n}\n\n/**\r\n * Format a large number (>999) with commas\r\n * @return {String} Comma-formatted number\r\n */\n\nfunction commaFormat(number) {\n return number.toString().replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, '$1,');\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3dpZGdldC9tb2RlbC9udW1iZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7OztBQUtOLFNBQVMsVUFBVSxDQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUc7QUFDcEQsTUFBSyxDQUFDLFdBQVcsRUFBRztBQUNuQixXQUFPLEVBQUUsQ0FBQztHQUNWLE1BQU07QUFDTixXQUFPLFFBQVEsQ0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsRUFBRyxFQUFFLENBQUUsQ0FBQztHQUMvRTtDQUNEOzs7Ozs7O0FBS00sU0FBUyxXQUFXLENBQUUsTUFBTSxFQUFHO0FBQ3JDLFNBQU8sTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztDQUNwRSIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jcm93ZGZ1bmRpbmctcGxlZGdlLWJveC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy93aWRnZXQvbW9kZWwvbnVtYmVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG4vKipcclxuICogRmluZCBhIHBlcmNlbnRhZ2UgdmFsdWUgZnJvbSBzdXBwbGllZCBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIHZhbHVlc1xyXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFJvdW5kZWQgcGVyY2V0YW5nZSB2YWx1ZSBpbmNsdWRpbmcgJSBzaWduIG9yIGVtcHR5IHN0cmluZyBpZiBkZW5vbWluYXRvciBpcyBmYWxzeVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBlcmNlbnQoIG51bWVyYXRvciwgZGVub21pbmF0b3IgKSB7XHJcblx0aWYgKCAhZGVub21pbmF0b3IgKSB7XHJcblx0XHRyZXR1cm4gJyc7XHJcblx0fSBlbHNlIHtcclxuXHRcdHJldHVybiBwYXJzZUludCggKHBhcnNlRmxvYXQobnVtZXJhdG9yKSAvIHBhcnNlRmxvYXQoZGVub21pbmF0b3IpICogMTAwKSwgMTAgKTtcdFxyXG5cdH1cclxufVxyXG4vKipcclxuICogRm9ybWF0IGEgbGFyZ2UgbnVtYmVyICg+OTk5KSB3aXRoIGNvbW1hc1xyXG4gKiBAcmV0dXJuIHtTdHJpbmd9IENvbW1hLWZvcm1hdHRlZCBudW1iZXJcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjb21tYUZvcm1hdCggbnVtYmVyICkge1xyXG5cdHJldHVybiBudW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKC8oXFxkKSg/PShcXGRcXGRcXGQpKyg/IVxcZCkpL2csICckMSwnKTtcclxufSJdfQ==\n},{}],54:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkWidget = require('justgiving-widget-framework/components/lib/js/framework/Widget');\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkWidget2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibJsFrameworkWidget);\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkView = require('justgiving-widget-framework/components/lib/js/framework/View');\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkView2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibJsFrameworkView);\n\nvar _ModelCrowdfundingPageDetails = require('./ModelCrowdfundingPageDetails');\n\nvar _ModelCrowdfundingPageDetails2 = _interopRequireDefault(_ModelCrowdfundingPageDetails);\n\nvar _ModelCrowdfundingFooter = require('./ModelCrowdfundingFooter');\n\nvar _ModelCrowdfundingFooter2 = _interopRequireDefault(_ModelCrowdfundingFooter);\n\n/**\r\n * Create a crowdfunding pledge box widget\r\n */\nvar Promise = require('es6-promise').Promise;\n\nvar CrowdfundingPledgeBox = (function (_Widget) {\n\t_inherits(CrowdfundingPledgeBox, _Widget);\n\n\tfunction CrowdfundingPledgeBox(options) {\n\t\t_classCallCheck(this, CrowdfundingPledgeBox);\n\n\t\t_get(Object.getPrototypeOf(CrowdfundingPledgeBox.prototype), 'constructor', this).call(this, options);\n\t\tthis.init();\n\t}\n\n\t/**\r\n * Initialise the pledge box\r\n * @description Create and cache new crowdfunding page details model and crowdfunding page main image model; bootstrap the widget\r\n */\n\n\t_createClass(CrowdfundingPledgeBox, [{\n\t\tkey: 'init',\n\t\tvalue: function init() {\n\t\t\t_get(Object.getPrototypeOf(CrowdfundingPledgeBox.prototype), 'init', this).call(this);\n\t\t\tthis.detailsModel = new _ModelCrowdfundingPageDetails2['default']({\n\t\t\t\twidget: this,\n\t\t\t\turl: 'https://api.justgiving.com/' + this.appId + '/v1/crowdfunding/pages/' + this.config.id\n\t\t\t});\n\n\t\t\tthis.footerModel = new _ModelCrowdfundingFooter2['default']({\n\t\t\t\twidget: this,\n\t\t\t\turl: 'https://api.justgiving.com/' + this.appId + '/v1/crowdfunding/pages/' + this.config.id\n\t\t\t});\n\n\t\t\tthis.bootstrap();\n\t\t}\n\n\t\t/**\r\n * Bootstrap the widget\r\n * @description Fetch all server data for crowdfunding page details model and crowdfunding page main image model; \r\n * then create and render new crowdfunding page details and crowdfunding page main image views;\r\n * reset the widget height; finally initialise a new analytics instance on the widget\r\n */\n\t}, {\n\t\tkey: 'bootstrap',\n\t\tvalue: function bootstrap() {\n\t\t\tvar _this = this;\n\n\t\t\tPromise.all([this.detailsModel.getModel(), this.footerModel.getModel()]).then(function () {\n\t\t\t\t// Crowdfunding page details view\n\t\t\t\t_this.detailsView = new _justgivingWidgetFrameworkComponentsLibJsFrameworkView2['default']({\n\t\t\t\t\twidget: _this,\n\t\t\t\t\tel: '[data-view-crowdfunding-details]',\n\t\t\t\t\ttemplate: '[data-tmpl-crowdfunding-details]',\n\t\t\t\t\tmodel: _this.detailsModel\n\t\t\t\t});\n\t\t\t\t_this.detailsView.render({\n\t\t\t\t\tlayout: _this.config.layout,\n\t\t\t\t\tshowStory: _this.config.showStory,\n\t\t\t\t\tprettyTarget: _this.detailsView.model.$model.prettyTarget,\n\t\t\t\t\tpitchFor: _this.detailsView.model.$model.pitch['for'],\n\t\t\t\t\tpitchBecause: _this.detailsView.model.$model.pitch.because,\n\t\t\t\t\tpercentPledged: _this.detailsView.model.$model.percentPledged,\n\t\t\t\t\tprogressPercent: _this.detailsView.model.$model.progressPercent,\n\t\t\t\t\tamountPledged: _this.detailsView.model.$model.formattedAmountPledged,\n\t\t\t\t\tpageUrl: _this.detailsView.model.$model.pageUrl,\n\t\t\t\t\tavatar: _this.detailsView.model.$model.avatar,\n\t\t\t\t\townerName: _this.detailsView.model.$model.owner.name,\n\t\t\t\t\townerLocation: _this.detailsView.model.$model.location.description,\n\t\t\t\t\tprojectProblem: _this.detailsView.model.$model.story.problem\n\t\t\t\t});\n\t\t\t\t_this.detailsView.loadImage(_this.detailsModel.$model.images[0].Url, '.js-project-image');\n\n\t\t\t\t// Footer view\n\t\t\t\t_this.footerView = new _justgivingWidgetFrameworkComponentsLibJsFrameworkView2['default']({\n\t\t\t\t\twidget: _this,\n\t\t\t\t\tel: '[data-view-footer]',\n\t\t\t\t\ttemplate: '[data-tmpl-footer]',\n\t\t\t\t\tmodel: _this.footerModel\n\t\t\t\t});\n\t\t\t\t_this.footerView.render({\n\t\t\t\t\tlayout: _this.config.layout,\n\t\t\t\t\tcrowdfundingGenericUrl: _this.footerView.model.$model.crowdfundingGenericUrl\n\t\t\t\t});\n\t\t\t}).then(function () {\n\t\t\t\t_this.resetHeight();\n\t\t\t\t_this.analytics = _this.initAnalytics();\n\t\t\t});\n\t\t}\n\t}]);\n\n\treturn CrowdfundingPledgeBox;\n})(_justgivingWidgetFrameworkComponentsLibJsFrameworkWidget2['default']);\n\nexports['default'] = CrowdfundingPledgeBox;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L3NyYy9zY3JpcHRzL2FwcC9Dcm93ZGZ1bmRpbmdQbGVkZ2VCb3guanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O3VFQUdNLGdFQUFnRTs7OztxRUFDbEUsOERBQThEOzs7OzRDQUN0QyxnQ0FBZ0M7Ozs7dUNBQ3JDLDJCQUEyQjs7Ozs7OztBQUovRCxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDOztJQVN2QyxxQkFBcUI7V0FBckIscUJBQXFCOztBQUNkLFVBRFAscUJBQXFCLENBQ1osT0FBTyxFQUFHO3dCQURuQixxQkFBcUI7O0FBRXpCLDZCQUZJLHFCQUFxQiw2Q0FFbEIsT0FBTyxFQUFHO0FBQ2pCLE1BQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztFQUNaOzs7Ozs7O2NBSkkscUJBQXFCOztTQVNyQixnQkFBRztBQUNQLDhCQVZJLHFCQUFxQixzQ0FVWjtBQUNiLE9BQUksQ0FBQyxZQUFZLEdBQUcsOENBQWlDO0FBQ3BELFVBQU0sRUFBRSxJQUFJO0FBQ1osT0FBRyxrQ0FBbUMsSUFBSSxDQUFDLEtBQUssK0JBQThCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxBQUFFO0lBQzlGLENBQUMsQ0FBQzs7QUFFSCxPQUFJLENBQUMsV0FBVyxHQUFHLHlDQUE0QjtBQUM5QyxVQUFNLEVBQUUsSUFBSTtBQUNaLE9BQUcsa0NBQW1DLElBQUksQ0FBQyxLQUFLLCtCQUE4QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQUFBRTtJQUM5RixDQUFDLENBQUM7O0FBRUgsT0FBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0dBQ2pCOzs7Ozs7Ozs7O1NBT1MscUJBQUc7OztBQUNaLFVBQU8sQ0FBQyxHQUFHLENBQUMsQ0FDWCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUMzQixDQUFDLENBQUMsSUFBSSxDQUFFLFlBQU07O0FBRWQsVUFBSyxXQUFXLEdBQUcsdUVBQVM7QUFDM0IsV0FBTSxPQUFNO0FBQ1osT0FBRSxFQUFFLGtDQUFrQztBQUN0QyxhQUFRLEVBQUUsa0NBQWtDO0FBQzVDLFVBQUssRUFBRSxNQUFLLFlBQVk7S0FDeEIsQ0FBQyxDQUFDO0FBQ0gsVUFBSyxXQUFXLENBQUMsTUFBTSxDQUFDO0FBQ3ZCLFdBQU0sRUFBRSxNQUFLLE1BQU0sQ0FBQyxNQUFNO0FBQzFCLGNBQVMsRUFBRSxNQUFLLE1BQU0sQ0FBQyxTQUFTO0FBQ2hDLGlCQUFZLEVBQUUsTUFBSyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZO0FBQ3hELGFBQVEsRUFBRSxNQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssT0FBSTtBQUNqRCxpQkFBWSxFQUFFLE1BQUssV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU87QUFDekQsbUJBQWMsRUFBRSxNQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWM7QUFDNUQsb0JBQWUsRUFBRSxNQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWU7QUFDOUQsa0JBQWEsRUFBRSxNQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLHNCQUFzQjtBQUNuRSxZQUFPLEVBQUUsTUFBSyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPO0FBQzlDLFdBQU0sRUFBRSxNQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU07QUFDNUMsY0FBUyxFQUFFLE1BQUssV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUk7QUFDbkQsa0JBQWEsRUFBRSxNQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXO0FBQ2pFLG1CQUFjLEVBQUUsTUFBSyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTztLQUMzRCxDQUFDLENBQUM7QUFDSCxVQUFLLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBSyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLENBQUMsQ0FBQzs7O0FBR3hGLFVBQUssVUFBVSxHQUFHLHVFQUFTO0FBQzFCLFdBQU0sT0FBTTtBQUNaLE9BQUUsRUFBRSxvQkFBb0I7QUFDeEIsYUFBUSxFQUFFLG9CQUFvQjtBQUM5QixVQUFLLEVBQUUsTUFBSyxXQUFXO0tBQ3ZCLENBQUMsQ0FBQztBQUNILFVBQUssVUFBVSxDQUFDLE1BQU0sQ0FBQztBQUN0QixXQUFNLEVBQUUsTUFBSyxNQUFNLENBQUMsTUFBTTtBQUMxQiwyQkFBc0IsRUFBRSxNQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLHNCQUFzQjtLQUMzRSxDQUFDLENBQUM7SUFDSCxDQUFDLENBQUMsSUFBSSxDQUFFLFlBQU07QUFDZCxVQUFLLFdBQVcsRUFBRSxDQUFDO0FBQ25CLFVBQUssU0FBUyxHQUFHLE1BQUssYUFBYSxFQUFFLENBQUM7SUFDdEMsQ0FBQyxDQUFDO0dBQ0g7OztRQXpFSSxxQkFBcUI7OztxQkE0RVoscUJBQXFCIiwiZmlsZSI6IkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L3NyYy9zY3JpcHRzL2FwcC9Dcm93ZGZ1bmRpbmdQbGVkZ2VCb3guanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG5sZXQgUHJvbWlzZSA9IHJlcXVpcmUoJ2VzNi1wcm9taXNlJykuUHJvbWlzZTtcclxuaW1wb3J0IFdpZGdldCBmcm9tICdqdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvZnJhbWV3b3JrL1dpZGdldCc7XHJcbmltcG9ydCBWaWV3IGZyb20gJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvVmlldyc7XHJcbmltcG9ydCBNb2RlbENyb3dkZnVuZGluZ1BhZ2VEZXRhaWxzIGZyb20gJy4vTW9kZWxDcm93ZGZ1bmRpbmdQYWdlRGV0YWlscyc7XHJcbmltcG9ydCBNb2RlbENyb3dkZnVuZGluZ0Zvb3RlciBmcm9tICcuL01vZGVsQ3Jvd2RmdW5kaW5nRm9vdGVyJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBjcm93ZGZ1bmRpbmcgcGxlZGdlIGJveCB3aWRnZXRcclxuICovXHJcbmNsYXNzIENyb3dkZnVuZGluZ1BsZWRnZUJveCBleHRlbmRzIFdpZGdldCB7XHJcblx0Y29uc3RydWN0b3IgKCBvcHRpb25zICkge1xyXG5cdFx0c3VwZXIoIG9wdGlvbnMgKTtcclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBJbml0aWFsaXNlIHRoZSBwbGVkZ2UgYm94XHJcblx0ICogQGRlc2NyaXB0aW9uIENyZWF0ZSBhbmQgY2FjaGUgbmV3IGNyb3dkZnVuZGluZyBwYWdlIGRldGFpbHMgbW9kZWwgYW5kIGNyb3dkZnVuZGluZyBwYWdlIG1haW4gaW1hZ2UgbW9kZWw7IGJvb3RzdHJhcCB0aGUgd2lkZ2V0XHJcblx0ICovXHJcblx0aW5pdCAoKSB7XHJcblx0XHRzdXBlci5pbml0KCk7XHJcblx0XHR0aGlzLmRldGFpbHNNb2RlbCA9IG5ldyBNb2RlbENyb3dkZnVuZGluZ1BhZ2VEZXRhaWxzKHsgXHJcblx0XHRcdHdpZGdldDogdGhpcyxcclxuXHRcdFx0dXJsOiBgaHR0cHM6XFwvXFwvYXBpLmp1c3RnaXZpbmcuY29tXFwvJHt0aGlzLmFwcElkfVxcL3YxXFwvY3Jvd2RmdW5kaW5nXFwvcGFnZXNcXC8ke3RoaXMuY29uZmlnLmlkfWAsXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmZvb3Rlck1vZGVsID0gbmV3IE1vZGVsQ3Jvd2RmdW5kaW5nRm9vdGVyKHsgXHJcblx0XHRcdHdpZGdldDogdGhpcyxcclxuXHRcdFx0dXJsOiBgaHR0cHM6XFwvXFwvYXBpLmp1c3RnaXZpbmcuY29tXFwvJHt0aGlzLmFwcElkfVxcL3YxXFwvY3Jvd2RmdW5kaW5nXFwvcGFnZXNcXC8ke3RoaXMuY29uZmlnLmlkfWAsXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmJvb3RzdHJhcCgpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBCb290c3RyYXAgdGhlIHdpZGdldFxyXG5cdCAqIEBkZXNjcmlwdGlvbiBGZXRjaCBhbGwgc2VydmVyIGRhdGEgZm9yIGNyb3dkZnVuZGluZyBwYWdlIGRldGFpbHMgbW9kZWwgYW5kIGNyb3dkZnVuZGluZyBwYWdlIG1haW4gaW1hZ2UgbW9kZWw7IFxyXG5cdCAqIHRoZW4gY3JlYXRlIGFuZCByZW5kZXIgbmV3IGNyb3dkZnVuZGluZyBwYWdlIGRldGFpbHMgYW5kIGNyb3dkZnVuZGluZyBwYWdlIG1haW4gaW1hZ2Ugdmlld3M7XHJcblx0ICogcmVzZXQgdGhlIHdpZGdldCBoZWlnaHQ7IGZpbmFsbHkgaW5pdGlhbGlzZSBhIG5ldyBhbmFseXRpY3MgaW5zdGFuY2Ugb24gdGhlIHdpZGdldFxyXG5cdCAqL1xyXG5cdGJvb3RzdHJhcCAoKSB7XHJcblx0XHRQcm9taXNlLmFsbChbXHJcblx0XHRcdHRoaXMuZGV0YWlsc01vZGVsLmdldE1vZGVsKCksXHJcblx0XHRcdHRoaXMuZm9vdGVyTW9kZWwuZ2V0TW9kZWwoKVxyXG5cdFx0XSkudGhlbiggKCkgPT4ge1xyXG5cdFx0XHQvLyBDcm93ZGZ1bmRpbmcgcGFnZSBkZXRhaWxzIHZpZXdcclxuXHRcdFx0dGhpcy5kZXRhaWxzVmlldyA9IG5ldyBWaWV3KHsgXHJcblx0XHRcdFx0d2lkZ2V0OiB0aGlzLCBcclxuXHRcdFx0XHRlbDogJ1tkYXRhLXZpZXctY3Jvd2RmdW5kaW5nLWRldGFpbHNdJyxcclxuXHRcdFx0XHR0ZW1wbGF0ZTogJ1tkYXRhLXRtcGwtY3Jvd2RmdW5kaW5nLWRldGFpbHNdJyxcclxuXHRcdFx0XHRtb2RlbDogdGhpcy5kZXRhaWxzTW9kZWxcclxuXHRcdFx0fSk7XHJcblx0XHRcdHRoaXMuZGV0YWlsc1ZpZXcucmVuZGVyKHtcclxuXHRcdFx0XHRsYXlvdXQ6IHRoaXMuY29uZmlnLmxheW91dCxcclxuXHRcdFx0XHRzaG93U3Rvcnk6IHRoaXMuY29uZmlnLnNob3dTdG9yeSxcclxuXHRcdFx0XHRwcmV0dHlUYXJnZXQ6IHRoaXMuZGV0YWlsc1ZpZXcubW9kZWwuJG1vZGVsLnByZXR0eVRhcmdldCxcclxuXHRcdFx0XHRwaXRjaEZvcjogdGhpcy5kZXRhaWxzVmlldy5tb2RlbC4kbW9kZWwucGl0Y2guZm9yLFx0XHJcblx0XHRcdFx0cGl0Y2hCZWNhdXNlOiB0aGlzLmRldGFpbHNWaWV3Lm1vZGVsLiRtb2RlbC5waXRjaC5iZWNhdXNlLFxyXG5cdFx0XHRcdHBlcmNlbnRQbGVkZ2VkOiB0aGlzLmRldGFpbHNWaWV3Lm1vZGVsLiRtb2RlbC5wZXJjZW50UGxlZGdlZCxcclxuXHRcdFx0XHRwcm9ncmVzc1BlcmNlbnQ6IHRoaXMuZGV0YWlsc1ZpZXcubW9kZWwuJG1vZGVsLnByb2dyZXNzUGVyY2VudCxcclxuXHRcdFx0XHRhbW91bnRQbGVkZ2VkOiB0aGlzLmRldGFpbHNWaWV3Lm1vZGVsLiRtb2RlbC5mb3JtYXR0ZWRBbW91bnRQbGVkZ2VkLFxyXG5cdFx0XHRcdHBhZ2VVcmw6IHRoaXMuZGV0YWlsc1ZpZXcubW9kZWwuJG1vZGVsLnBhZ2VVcmwsXHJcblx0XHRcdFx0YXZhdGFyOiB0aGlzLmRldGFpbHNWaWV3Lm1vZGVsLiRtb2RlbC5hdmF0YXIsXHJcblx0XHRcdFx0b3duZXJOYW1lOiB0aGlzLmRldGFpbHNWaWV3Lm1vZGVsLiRtb2RlbC5vd25lci5uYW1lLFxyXG5cdFx0XHRcdG93bmVyTG9jYXRpb246IHRoaXMuZGV0YWlsc1ZpZXcubW9kZWwuJG1vZGVsLmxvY2F0aW9uLmRlc2NyaXB0aW9uLFxyXG5cdFx0XHRcdHByb2plY3RQcm9ibGVtOiB0aGlzLmRldGFpbHNWaWV3Lm1vZGVsLiRtb2RlbC5zdG9yeS5wcm9ibGVtXHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmRldGFpbHNWaWV3LmxvYWRJbWFnZSh0aGlzLmRldGFpbHNNb2RlbC4kbW9kZWwuaW1hZ2VzWzBdLlVybCwgJy5qcy1wcm9qZWN0LWltYWdlJyk7XHJcblx0XHRcdFxyXG5cdFx0XHQvLyBGb290ZXIgdmlld1xyXG5cdFx0XHR0aGlzLmZvb3RlclZpZXcgPSBuZXcgVmlldyh7IFxyXG5cdFx0XHRcdHdpZGdldDogdGhpcywgXHJcblx0XHRcdFx0ZWw6ICdbZGF0YS12aWV3LWZvb3Rlcl0nLFxyXG5cdFx0XHRcdHRlbXBsYXRlOiAnW2RhdGEtdG1wbC1mb290ZXJdJyxcclxuXHRcdFx0XHRtb2RlbDogdGhpcy5mb290ZXJNb2RlbFxyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5mb290ZXJWaWV3LnJlbmRlcih7XHJcblx0XHRcdFx0bGF5b3V0OiB0aGlzLmNvbmZpZy5sYXlvdXQsXHJcblx0XHRcdFx0Y3Jvd2RmdW5kaW5nR2VuZXJpY1VybDogdGhpcy5mb290ZXJWaWV3Lm1vZGVsLiRtb2RlbC5jcm93ZGZ1bmRpbmdHZW5lcmljVXJsXHJcblx0XHRcdH0pO1x0XHJcblx0XHR9KS50aGVuKCAoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVzZXRIZWlnaHQoKTtcdFxyXG5cdFx0XHR0aGlzLmFuYWx5dGljcyA9IHRoaXMuaW5pdEFuYWx5dGljcygpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDcm93ZGZ1bmRpbmdQbGVkZ2VCb3g7Il19\n},{\"./ModelCrowdfundingFooter\":55,\"./ModelCrowdfundingPageDetails\":56,\"es6-promise\":24,\"justgiving-widget-framework/components/lib/js/framework/View\":48,\"justgiving-widget-framework/components/lib/js/framework/Widget\":49}],55:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkModel = require('justgiving-widget-framework/components/lib/js/framework/Model');\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkModel2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibJsFrameworkModel);\n\nvar _justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode = require('justgiving-widget-framework/components/lib/js/widget/analytics/writeUtmCode');\n\nvar _justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode);\n\n/**\r\n * Create a crowdfunding footer model \r\n * @classdesc Augment model to add the CF generic URL with UTM\r\n */\nvar Promise = require('es6-promise').Promise;\n\nvar ModelCrowdfundingFooter = (function (_Model) {\n\t_inherits(ModelCrowdfundingFooter, _Model);\n\n\tfunction ModelCrowdfundingFooter(options) {\n\t\t_classCallCheck(this, ModelCrowdfundingFooter);\n\n\t\t_get(Object.getPrototypeOf(ModelCrowdfundingFooter.prototype), 'constructor', this).call(this, options);\n\t}\n\n\t/**\r\n * Extend model's get model method\r\n * @description Extend model's get model method to include data augmentation of returned collection data\r\n */\n\n\t_createClass(ModelCrowdfundingFooter, [{\n\t\tkey: 'getModel',\n\t\tvalue: function getModel() {\n\t\t\tvar _this = this;\n\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\t_get(Object.getPrototypeOf(ModelCrowdfundingFooter.prototype), 'getModel', _this).call(_this).then(function () {\n\t\t\t\t\tvar baseCrowdfundingUrl = 'https://crowdfunding.justgiving.com/';\n\t\t\t\t\t_this.$model.crowdfundingGenericUrl = baseCrowdfundingUrl + (0, _justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode2['default'])(baseCrowdfundingUrl, {\n\t\t\t\t\t\tutm_name: 'CrowdfundingPledgeBox', // jshint ignore:line\n\t\t\t\t\t\tutm_content: _this.$model.name // jshint ignore:line\n\t\t\t\t\t});\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}]);\n\n\treturn ModelCrowdfundingFooter;\n})(_justgivingWidgetFrameworkComponentsLibJsFrameworkModel2['default']);\n\nexports['default'] = ModelCrowdfundingFooter;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L3NyYy9zY3JpcHRzL2FwcC9Nb2RlbENyb3dkZnVuZGluZ0Zvb3Rlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7c0VBR0ssK0RBQStEOzs7O21GQUN4RCw2RUFBNkU7Ozs7Ozs7O0FBRnRHLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUM7O0lBUXZDLHVCQUF1QjtXQUF2Qix1QkFBdUI7O0FBQ2pCLFVBRE4sdUJBQXVCLENBQ2YsT0FBTyxFQUFHO3dCQURsQix1QkFBdUI7O0FBRTNCLDZCQUZJLHVCQUF1Qiw2Q0FFcEIsT0FBTyxFQUFHO0VBQ2pCOzs7Ozs7O2NBSEksdUJBQXVCOztTQVFuQixvQkFBRzs7O0FBQ1gsVUFBTyxJQUFJLE9BQU8sQ0FBRSxVQUFFLE9BQU8sRUFBTTtBQUNsQywrQkFWRyx1QkFBdUIsNENBVVQsSUFBSSxDQUFFLFlBQU07QUFDNUIsU0FBSSxtQkFBbUIsR0FBRyxzQ0FBc0MsQ0FBQztBQUNqRSxXQUFLLE1BQU0sQ0FBQyxzQkFBc0IsR0FBRyxtQkFBbUIsR0FBRyxzRkFBYSxtQkFBbUIsRUFBRTtBQUM1RixjQUFRLEVBQUUsdUJBQXVCO0FBQ2pDLGlCQUFXLEVBQUUsTUFBSyxNQUFNLENBQUMsSUFBSTtNQUM3QixDQUFDLENBQUM7QUFDSCxZQUFPLEVBQUUsQ0FBQztLQUNWLENBQUMsQ0FBQztJQUNILENBQUMsQ0FBQztHQUNIOzs7UUFuQkksdUJBQXVCOzs7cUJBc0JkLHVCQUF1QiIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jcm93ZGZ1bmRpbmctcGxlZGdlLWJveC9zcmMvc2NyaXB0cy9hcHAvTW9kZWxDcm93ZGZ1bmRpbmdGb290ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG5sZXQgUHJvbWlzZSA9IHJlcXVpcmUoJ2VzNi1wcm9taXNlJykuUHJvbWlzZTtcclxuaW1wb3J0IE1vZGVsIGZyb20gJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvTW9kZWwnO1xyXG5pbXBvcnQgd3JpdGVVdG1Db2RlIGZyb20gJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy93aWRnZXQvYW5hbHl0aWNzL3dyaXRlVXRtQ29kZSc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgY3Jvd2RmdW5kaW5nIGZvb3RlciBtb2RlbCBcclxuICogQGNsYXNzZGVzYyBBdWdtZW50IG1vZGVsIHRvIGFkZCB0aGUgQ0YgZ2VuZXJpYyBVUkwgd2l0aCBVVE1cclxuICovXHJcbmNsYXNzIE1vZGVsQ3Jvd2RmdW5kaW5nRm9vdGVyIGV4dGVuZHMgTW9kZWwge1xyXG5cdGNvbnN0cnVjdG9yKCBvcHRpb25zICkge1xyXG5cdFx0c3VwZXIoIG9wdGlvbnMgKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogRXh0ZW5kIG1vZGVsJ3MgZ2V0IG1vZGVsIG1ldGhvZFxyXG5cdCAqIEBkZXNjcmlwdGlvbiBFeHRlbmQgbW9kZWwncyBnZXQgbW9kZWwgbWV0aG9kIHRvIGluY2x1ZGUgZGF0YSBhdWdtZW50YXRpb24gb2YgcmV0dXJuZWQgY29sbGVjdGlvbiBkYXRhXHJcblx0ICovXHJcblx0Z2V0TW9kZWwgKCkge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKCAoIHJlc29sdmUgKSA9PiB7IFxyXG5cdFx0XHRzdXBlci5nZXRNb2RlbCgpLnRoZW4oICgpID0+IHtcclxuXHRcdFx0XHRsZXQgYmFzZUNyb3dkZnVuZGluZ1VybCA9ICdodHRwczovL2Nyb3dkZnVuZGluZy5qdXN0Z2l2aW5nLmNvbS8nO1xyXG5cdFx0XHRcdHRoaXMuJG1vZGVsLmNyb3dkZnVuZGluZ0dlbmVyaWNVcmwgPSBiYXNlQ3Jvd2RmdW5kaW5nVXJsICsgd3JpdGVVdG1Db2RlKGJhc2VDcm93ZGZ1bmRpbmdVcmwsIHtcclxuXHRcdFx0XHRcdHV0bV9uYW1lOiAnQ3Jvd2RmdW5kaW5nUGxlZGdlQm94JywgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdFx0XHR1dG1fY29udGVudDogdGhpcy4kbW9kZWwubmFtZSAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNb2RlbENyb3dkZnVuZGluZ0Zvb3RlcjsiXX0=\n},{\"es6-promise\":24,\"justgiving-widget-framework/components/lib/js/framework/Model\":47,\"justgiving-widget-framework/components/lib/js/widget/analytics/writeUtmCode\":52}],56:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkModel = require('justgiving-widget-framework/components/lib/js/framework/Model');\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkModel2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibJsFrameworkModel);\n\nvar _justgivingWidgetFrameworkComponentsLibJsWidgetModelNumber = require('justgiving-widget-framework/components/lib/js/widget/model/number');\n\nvar _justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode = require('justgiving-widget-framework/components/lib/js/widget/analytics/writeUtmCode');\n\nvar _justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode);\n\n/**\r\n * Create a crowdfunding page details model \r\n * @classdesc Augment model to add the % of target reached, CFP URL with UTM and avatar url\r\n */\nvar Promise = require('es6-promise').Promise;\n\nvar ModelCrowdfundingPageDetails = (function (_Model) {\n\t_inherits(ModelCrowdfundingPageDetails, _Model);\n\n\tfunction ModelCrowdfundingPageDetails(options) {\n\t\t_classCallCheck(this, ModelCrowdfundingPageDetails);\n\n\t\t_get(Object.getPrototypeOf(ModelCrowdfundingPageDetails.prototype), 'constructor', this).call(this, options);\n\t}\n\n\t/**\r\n * Extend model's get model method\r\n * @description Extend model's get model method to include data augmentation of returned collection data\r\n */\n\n\t_createClass(ModelCrowdfundingPageDetails, [{\n\t\tkey: 'getModel',\n\t\tvalue: function getModel() {\n\t\t\tvar _this = this;\n\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\t_get(Object.getPrototypeOf(ModelCrowdfundingPageDetails.prototype), 'getModel', _this).call(_this).then(function () {\n\t\t\t\t\tvar pageUrl = 'https://crowdfunding.justgiving.com/' + _this.$model.name;\n\t\t\t\t\tvar percentPledged = (0, _justgivingWidgetFrameworkComponentsLibJsWidgetModelNumber.getPercent)(_this.$model.amountPledged, _this.$model.pitch.targetAmount);\n\n\t\t\t\t\t_this.$model.pageUrl = pageUrl + (0, _justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode2['default'])(pageUrl, {\n\t\t\t\t\t\tutm_name: 'CrowdfundingPledgeBox', // jshint ignore:line\n\t\t\t\t\t\tutm_content: _this.$model.name // jshint ignore:line\n\t\t\t\t\t});\n\t\t\t\t\t_this.$model.percentPledged = percentPledged;\n\t\t\t\t\t_this.$model.progressPercent = percentPledged > 100 ? 100 : percentPledged;\n\t\t\t\t\t_this.$model.prettyTarget = (0, _justgivingWidgetFrameworkComponentsLibJsWidgetModelNumber.commaFormat)(parseInt(_this.$model.pitch.targetAmount, 10));\n\t\t\t\t\t_this.$model.formattedAmountPledged = (0, _justgivingWidgetFrameworkComponentsLibJsWidgetModelNumber.commaFormat)(Math.round(_this.$model.amountPledged));\n\t\t\t\t\t_this.$model.avatar = _this.$model.owner.profileImageUrls.Size150x150Face;\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}]);\n\n\treturn ModelCrowdfundingPageDetails;\n})(_justgivingWidgetFrameworkComponentsLibJsFrameworkModel2['default']);\n\nexports['default'] = ModelCrowdfundingPageDetails;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94L3NyYy9zY3JpcHRzL2FwcC9Nb2RlbENyb3dkZnVuZGluZ1BhZ2VEZXRhaWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztzRUFHSywrREFBK0Q7Ozs7eUVBQ3RELG1FQUFtRTs7bUZBRXJFLDZFQUE2RTs7Ozs7Ozs7QUFKdEcsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQzs7SUFVdkMsNEJBQTRCO1dBQTVCLDRCQUE0Qjs7QUFDdEIsVUFETiw0QkFBNEIsQ0FDcEIsT0FBTyxFQUFHO3dCQURsQiw0QkFBNEI7O0FBRWhDLDZCQUZJLDRCQUE0Qiw2Q0FFekIsT0FBTyxFQUFHO0VBQ2pCOzs7Ozs7O2NBSEksNEJBQTRCOztTQVF4QixvQkFBRzs7O0FBQ1gsVUFBTyxJQUFJLE9BQU8sQ0FBRSxVQUFFLE9BQU8sRUFBTTtBQUNsQywrQkFWRyw0QkFBNEIsNENBVWQsSUFBSSxDQUFFLFlBQU07QUFDNUIsU0FBSSxPQUFPLDRDQUE2QyxNQUFLLE1BQU0sQ0FBQyxJQUFJLEFBQUUsQ0FBQztBQUMzRSxTQUFJLGNBQWMsR0FBRywyRUFBWSxNQUFLLE1BQU0sQ0FBQyxhQUFhLEVBQUUsTUFBSyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBRSxDQUFDOztBQUU3RixXQUFLLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxHQUFHLHNGQUFhLE9BQU8sRUFBRTtBQUNyRCxjQUFRLEVBQUUsdUJBQXVCO0FBQ2pDLGlCQUFXLEVBQUUsTUFBSyxNQUFNLENBQUMsSUFBSTtNQUM3QixDQUFDLENBQUM7QUFDSCxXQUFLLE1BQU0sQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0FBQzVDLFdBQUssTUFBTSxDQUFDLGVBQWUsR0FBRyxjQUFjLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxjQUFjLENBQUM7QUFDMUUsV0FBSyxNQUFNLENBQUMsWUFBWSxHQUFHLDRFQUFhLFFBQVEsQ0FBQyxNQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFFLENBQUM7QUFDdkYsV0FBSyxNQUFNLENBQUMsc0JBQXNCLEdBQUcsNEVBQWEsSUFBSSxDQUFDLEtBQUssQ0FBRSxNQUFLLE1BQU0sQ0FBQyxhQUFhLENBQUUsQ0FBRSxDQUFDO0FBQzVGLFdBQUssTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDO0FBQ3hFLFlBQU8sRUFBRSxDQUFDO0tBQ1YsQ0FBQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0dBQ0g7OztRQTFCSSw0QkFBNEI7OztxQkE2Qm5CLDRCQUE0QiIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jcm93ZGZ1bmRpbmctcGxlZGdlLWJveC9zcmMvc2NyaXB0cy9hcHAvTW9kZWxDcm93ZGZ1bmRpbmdQYWdlRGV0YWlscy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmxldCBQcm9taXNlID0gcmVxdWlyZSgnZXM2LXByb21pc2UnKS5Qcm9taXNlO1xyXG5pbXBvcnQgTW9kZWwgZnJvbSAnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9Nb2RlbCc7XHJcbmltcG9ydCB7IGdldFBlcmNlbnQgfSBmcm9tICdqdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvd2lkZ2V0L21vZGVsL251bWJlcic7XHJcbmltcG9ydCB7IGNvbW1hRm9ybWF0IH0gZnJvbSAnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3dpZGdldC9tb2RlbC9udW1iZXInO1xyXG5pbXBvcnQgd3JpdGVVdG1Db2RlIGZyb20gJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy93aWRnZXQvYW5hbHl0aWNzL3dyaXRlVXRtQ29kZSc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgY3Jvd2RmdW5kaW5nIHBhZ2UgZGV0YWlscyBtb2RlbCBcclxuICogQGNsYXNzZGVzYyBBdWdtZW50IG1vZGVsIHRvIGFkZCB0aGUgJSBvZiB0YXJnZXQgcmVhY2hlZCwgQ0ZQIFVSTCB3aXRoIFVUTSBhbmQgYXZhdGFyIHVybFxyXG4gKi9cclxuY2xhc3MgTW9kZWxDcm93ZGZ1bmRpbmdQYWdlRGV0YWlscyBleHRlbmRzIE1vZGVsIHtcclxuXHRjb25zdHJ1Y3Rvciggb3B0aW9ucyApIHtcclxuXHRcdHN1cGVyKCBvcHRpb25zICk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEV4dGVuZCBtb2RlbCdzIGdldCBtb2RlbCBtZXRob2RcclxuXHQgKiBAZGVzY3JpcHRpb24gRXh0ZW5kIG1vZGVsJ3MgZ2V0IG1vZGVsIG1ldGhvZCB0byBpbmNsdWRlIGRhdGEgYXVnbWVudGF0aW9uIG9mIHJldHVybmVkIGNvbGxlY3Rpb24gZGF0YVxyXG5cdCAqL1xyXG5cdGdldE1vZGVsICgpIHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSggKCByZXNvbHZlICkgPT4geyBcclxuXHRcdFx0c3VwZXIuZ2V0TW9kZWwoKS50aGVuKCAoKSA9PiB7XHJcblx0XHRcdFx0bGV0IHBhZ2VVcmwgPSBgaHR0cHM6XFwvXFwvY3Jvd2RmdW5kaW5nLmp1c3RnaXZpbmcuY29tXFwvJHt0aGlzLiRtb2RlbC5uYW1lfWA7XHJcblx0XHRcdFx0bGV0IHBlcmNlbnRQbGVkZ2VkID0gZ2V0UGVyY2VudCggdGhpcy4kbW9kZWwuYW1vdW50UGxlZGdlZCwgdGhpcy4kbW9kZWwucGl0Y2gudGFyZ2V0QW1vdW50ICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuJG1vZGVsLnBhZ2VVcmwgPSBwYWdlVXJsICsgd3JpdGVVdG1Db2RlKHBhZ2VVcmwsIHtcclxuXHRcdFx0XHRcdHV0bV9uYW1lOiAnQ3Jvd2RmdW5kaW5nUGxlZGdlQm94JywgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdFx0XHR1dG1fY29udGVudDogdGhpcy4kbW9kZWwubmFtZSAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHR0aGlzLiRtb2RlbC5wZXJjZW50UGxlZGdlZCA9IHBlcmNlbnRQbGVkZ2VkO1xyXG5cdFx0XHRcdHRoaXMuJG1vZGVsLnByb2dyZXNzUGVyY2VudCA9IHBlcmNlbnRQbGVkZ2VkID4gMTAwID8gMTAwIDogcGVyY2VudFBsZWRnZWQ7XHJcblx0XHRcdFx0dGhpcy4kbW9kZWwucHJldHR5VGFyZ2V0ID0gY29tbWFGb3JtYXQoIHBhcnNlSW50KHRoaXMuJG1vZGVsLnBpdGNoLnRhcmdldEFtb3VudCwgMTApICk7XHJcblx0XHRcdFx0dGhpcy4kbW9kZWwuZm9ybWF0dGVkQW1vdW50UGxlZGdlZCA9IGNvbW1hRm9ybWF0KCBNYXRoLnJvdW5kKCB0aGlzLiRtb2RlbC5hbW91bnRQbGVkZ2VkICkgKTtcclxuXHRcdFx0XHR0aGlzLiRtb2RlbC5hdmF0YXIgPSB0aGlzLiRtb2RlbC5vd25lci5wcm9maWxlSW1hZ2VVcmxzLlNpemUxNTB4MTUwRmFjZTtcclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNb2RlbENyb3dkZnVuZGluZ1BhZ2VEZXRhaWxzOyJdfQ==\n},{\"es6-promise\":24,\"justgiving-widget-framework/components/lib/js/framework/Model\":47,\"justgiving-widget-framework/components/lib/js/widget/analytics/writeUtmCode\":52,\"justgiving-widget-framework/components/lib/js/widget/model/number\":53}]},{},[1])\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvc2NyaXB0cy9tYWluLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMucnVudGltZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvYmFzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvYXN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9jb21waWxlci9iYXNlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9jb21waWxlci9jb2RlLWdlbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvY29tcGlsZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2NvbXBpbGVyL2hlbHBlcnMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2NvbXBpbGVyL2phdmFzY3JpcHQtY29tcGlsZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2NvbXBpbGVyL3BhcnNlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvcHJpbnRlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvdmlzaXRvci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvd2hpdGVzcGFjZS1jb250cm9sLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9leGNlcHRpb24uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL25vLWNvbmZsaWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9ydW50aW1lLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9zYWZlLXN0cmluZy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvdXRpbHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9saWIvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvYW1kZWZpbmUvYW1kZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9saWIvX2VtcHR5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Zvci1lYWNoL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2dsb2JhbC93aW5kb3cuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvaXMtZnVuY3Rpb24vaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvcGFyc2UtaGVhZGVycy9wYXJzZS1oZWFkZXJzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAvYXJyYXktc2V0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAvYmFzZTY0LXZscS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwL2Jhc2U2NC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwL2JpbmFyeS1zZWFyY2guanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC9tYXBwaW5nLWxpc3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC9zb3VyY2UtbWFwLWNvbnN1bWVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAvc291cmNlLW1hcC1nZW5lcmF0b3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC9zb3VyY2Utbm9kZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwL3V0aWwuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvdHJpbS9pbmRleC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy94aHIvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMveHRlbmQvaW1tdXRhYmxlLmpzIiwiYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvSGFuZGxlYmFycy9oYW5kbGViYXJzLmpzIiwiYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvSGFuZGxlYmFycy9oZWxwZXJzLmpzIiwiYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvSGFuZGxlYmFycy9wYXJ0aWFscy9fbGlzdC5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9BbmFseXRpY3MuanMiLCJib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvTW9kZWwuanMiLCJib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvVmlldy5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9XaWRnZXQuanMiLCJib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy91dGlscy9kZWJvdW5jZS5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3V0aWxzL3F1ZXJ5U3RyaW5nLmpzIiwiYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvd2lkZ2V0L2FuYWx5dGljcy93cml0ZVV0bUNvZGUuanMiLCJib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy93aWRnZXQvbW9kZWwvbnVtYmVyLmpzIiwic3JjL3NjcmlwdHMvYXBwL0Nyb3dkZnVuZGluZ1BsZWRnZUJveC5qcyIsInNyYy9zY3JpcHRzL2FwcC9Nb2RlbENyb3dkZnVuZGluZ0Zvb3Rlci5qcyIsInNyYy9zY3JpcHRzL2FwcC9Nb2RlbENyb3dkZnVuZGluZ1BhZ2VEZXRhaWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcmlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcnFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFRBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy84QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9qQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDclBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBfYXBwQ3Jvd2RmdW5kaW5nUGxlZGdlQm94ID0gcmVxdWlyZSgnLi9hcHAvQ3Jvd2RmdW5kaW5nUGxlZGdlQm94Jyk7XG5cbnZhciBfYXBwQ3Jvd2RmdW5kaW5nUGxlZGdlQm94MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FwcENyb3dkZnVuZGluZ1BsZWRnZUJveCk7XG5cbm5ldyBfYXBwQ3Jvd2RmdW5kaW5nUGxlZGdlQm94MlsnZGVmYXVsdCddKHsgd2lkZ2V0TmFtZTogJ2Nyb3dkZnVuZGluZy1wbGVkZ2UtYm94JyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTnliM2RrWm5WdVpHbHVaeTF3YkdWa1oyVXRZbTk0TDNOeVl5OXpZM0pwY0hSekwyMWhhVzR1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlFVRXNXVUZCV1N4RFFVRkRPenM3TzNkRFFVVnhRaXcyUWtGQk5rSTdPenM3UVVGRkwwUXNNRU5CUVRCQ0xFVkJRVVVzVlVGQlZTeEZRVUZGTEhsQ1FVRjVRaXhGUVVGRkxFTkJRVU1zUTBGQlF5SXNJbVpwYkdVaU9pSkRPaTkwWlcxd0wwZEhMa1p5YjI1MFJXNWtMbGRwWkdkbGRITXZkMmxrWjJWMGN5OWpjbTkzWkdaMWJtUnBibWN0Y0d4bFpHZGxMV0p2ZUM5emNtTXZjMk55YVhCMGN5OXRZV2x1TG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lKM1Z6WlNCemRISnBZM1FuTzF4eVhHNWNjbHh1YVcxd2IzSjBJRU55YjNka1puVnVaR2x1WjFCc1pXUm5aVUp2ZUNCbWNtOXRJQ2N1TDJGd2NDOURjbTkzWkdaMWJtUnBibWRRYkdWa1oyVkNiM2duTzF4eVhHNWNjbHh1Ym1WM0lFTnliM2RrWm5WdVpHbHVaMUJzWldSblpVSnZlQ2g3SUhkcFpHZGxkRTVoYldVNklDZGpjbTkzWkdaMWJtUnBibWN0Y0d4bFpHZGxMV0p2ZUNjZ2ZTazdYSEpjYmx4eVhHNGlYWDA9IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH07XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfcnVudGltZSA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy5ydW50aW1lJyk7XG5cbnZhciBfcnVudGltZTIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfcnVudGltZSk7XG5cbi8vIENvbXBpbGVyIGltcG9ydHNcblxudmFyIF9BU1QgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvY29tcGlsZXIvYXN0Jyk7XG5cbnZhciBfQVNUMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9BU1QpO1xuXG52YXIgX1BhcnNlciRwYXJzZSA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9jb21waWxlci9iYXNlJyk7XG5cbnZhciBfQ29tcGlsZXIkY29tcGlsZSRwcmVjb21waWxlID0gcmVxdWlyZSgnLi9oYW5kbGViYXJzL2NvbXBpbGVyL2NvbXBpbGVyJyk7XG5cbnZhciBfSmF2YVNjcmlwdENvbXBpbGVyID0gcmVxdWlyZSgnLi9oYW5kbGViYXJzL2NvbXBpbGVyL2phdmFzY3JpcHQtY29tcGlsZXInKTtcblxudmFyIF9KYXZhU2NyaXB0Q29tcGlsZXIyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0phdmFTY3JpcHRDb21waWxlcik7XG5cbnZhciBfVmlzaXRvciA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9jb21waWxlci92aXNpdG9yJyk7XG5cbnZhciBfVmlzaXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfVmlzaXRvcik7XG5cbnZhciBfbm9Db25mbGljdCA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9uby1jb25mbGljdCcpO1xuXG52YXIgX25vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX25vQ29uZmxpY3QpO1xuXG52YXIgX2NyZWF0ZSA9IF9ydW50aW1lMlsnZGVmYXVsdCddLmNyZWF0ZTtcbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIGhiID0gX2NyZWF0ZSgpO1xuXG4gIGhiLmNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gX0NvbXBpbGVyJGNvbXBpbGUkcHJlY29tcGlsZS5jb21waWxlKGlucHV0LCBvcHRpb25zLCBoYik7XG4gIH07XG4gIGhiLnByZWNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gX0NvbXBpbGVyJGNvbXBpbGUkcHJlY29tcGlsZS5wcmVjb21waWxlKGlucHV0LCBvcHRpb25zLCBoYik7XG4gIH07XG5cbiAgaGIuQVNUID0gX0FTVDJbJ2RlZmF1bHQnXTtcbiAgaGIuQ29tcGlsZXIgPSBfQ29tcGlsZXIkY29tcGlsZSRwcmVjb21waWxlLkNvbXBpbGVyO1xuICBoYi5KYXZhU2NyaXB0Q29tcGlsZXIgPSBfSmF2YVNjcmlwdENvbXBpbGVyMlsnZGVmYXVsdCddO1xuICBoYi5QYXJzZXIgPSBfUGFyc2VyJHBhcnNlLnBhcnNlcjtcbiAgaGIucGFyc2UgPSBfUGFyc2VyJHBhcnNlLnBhcnNlO1xuXG4gIHJldHVybiBoYjtcbn1cblxudmFyIGluc3QgPSBjcmVhdGUoKTtcbmluc3QuY3JlYXRlID0gY3JlYXRlO1xuXG5fbm9Db25mbGljdDJbJ2RlZmF1bHQnXShpbnN0KTtcblxuaW5zdC5WaXNpdG9yID0gX1Zpc2l0b3IyWydkZWZhdWx0J107XG5cbmluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGluc3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9pbXBvcnQgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvYmFzZScpO1xuXG52YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9pbXBvcnQpO1xuXG4vLyBFYWNoIG9mIHRoZXNlIGF1Z21lbnQgdGhlIEhhbmRsZWJhcnMgb2JqZWN0LiBObyBuZWVkIHRvIHNldHVwIGhlcmUuXG4vLyAoVGhpcyBpcyBkb25lIHRvIGVhc2lseSBzaGFyZSBjb2RlIGJldHdlZW4gY29tbW9uanMgYW5kIGJyb3dzZSBlbnZzKVxuXG52YXIgX1NhZmVTdHJpbmcgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvc2FmZS1zdHJpbmcnKTtcblxudmFyIF9TYWZlU3RyaW5nMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9TYWZlU3RyaW5nKTtcblxudmFyIF9FeGNlcHRpb24gPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvZXhjZXB0aW9uJyk7XG5cbnZhciBfRXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9FeGNlcHRpb24pO1xuXG52YXIgX2ltcG9ydDIgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvdXRpbHMnKTtcblxudmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2ltcG9ydDIpO1xuXG52YXIgX2ltcG9ydDMgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvcnVudGltZScpO1xuXG52YXIgcnVudGltZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9pbXBvcnQzKTtcblxudmFyIF9ub0NvbmZsaWN0ID0gcmVxdWlyZSgnLi9oYW5kbGViYXJzL25vLWNvbmZsaWN0Jyk7XG5cbnZhciBfbm9Db25mbGljdDIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfbm9Db25mbGljdCk7XG5cbi8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZVxuZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTtcblxuICBVdGlscy5leHRlbmQoaGIsIGJhc2UpO1xuICBoYi5TYWZlU3RyaW5nID0gX1NhZmVTdHJpbmcyWydkZWZhdWx0J107XG4gIGhiLkV4Y2VwdGlvbiA9IF9FeGNlcHRpb24yWydkZWZhdWx0J107XG4gIGhiLlV0aWxzID0gVXRpbHM7XG4gIGhiLmVzY2FwZUV4cHJlc3Npb24gPSBVdGlscy5lc2NhcGVFeHByZXNzaW9uO1xuXG4gIGhiLlZNID0gcnVudGltZTtcbiAgaGIudGVtcGxhdGUgPSBmdW5jdGlvbiAoc3BlYykge1xuICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTtcbiAgfTtcblxuICByZXR1cm4gaGI7XG59XG5cbnZhciBpbnN0ID0gY3JlYXRlKCk7XG5pbnN0LmNyZWF0ZSA9IGNyZWF0ZTtcblxuX25vQ29uZmxpY3QyWydkZWZhdWx0J10oaW5zdCk7XG5cbmluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGluc3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuSGFuZGxlYmFyc0Vudmlyb25tZW50ID0gSGFuZGxlYmFyc0Vudmlyb25tZW50O1xuZXhwb3J0cy5jcmVhdGVGcmFtZSA9IGNyZWF0ZUZyYW1lO1xuXG52YXIgX2ltcG9ydCA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2ltcG9ydCk7XG5cbnZhciBfRXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcblxudmFyIF9FeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0V4Y2VwdGlvbik7XG5cbnZhciBWRVJTSU9OID0gJzMuMC4xJztcbmV4cG9ydHMuVkVSU0lPTiA9IFZFUlNJT047XG52YXIgQ09NUElMRVJfUkVWSVNJT04gPSA2O1xuXG5leHBvcnRzLkNPTVBJTEVSX1JFVklTSU9OID0gQ09NUElMRVJfUkVWSVNJT047XG52YXIgUkVWSVNJT05fQ0hBTkdFUyA9IHtcbiAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXRcbiAgMjogJz09IDEuMC4wLXJjLjMnLFxuICAzOiAnPT0gMS4wLjAtcmMuNCcsXG4gIDQ6ICc9PSAxLngueCcsXG4gIDU6ICc9PSAyLjAuMC1hbHBoYS54JyxcbiAgNjogJz49IDIuMC4wLWJldGEuMSdcbn07XG5cbmV4cG9ydHMuUkVWSVNJT05fQ0hBTkdFUyA9IFJFVklTSU9OX0NIQU5HRVM7XG52YXIgaXNBcnJheSA9IFV0aWxzLmlzQXJyYXksXG4gICAgaXNGdW5jdGlvbiA9IFV0aWxzLmlzRnVuY3Rpb24sXG4gICAgdG9TdHJpbmcgPSBVdGlscy50b1N0cmluZyxcbiAgICBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbmZ1bmN0aW9uIEhhbmRsZWJhcnNFbnZpcm9ubWVudChoZWxwZXJzLCBwYXJ0aWFscykge1xuICB0aGlzLmhlbHBlcnMgPSBoZWxwZXJzIHx8IHt9O1xuICB0aGlzLnBhcnRpYWxzID0gcGFydGlhbHMgfHwge307XG5cbiAgcmVnaXN0ZXJEZWZhdWx0SGVscGVycyh0aGlzKTtcbn1cblxuSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCxcblxuICBsb2dnZXI6IGxvZ2dlcixcbiAgbG9nOiBsb2csXG5cbiAgcmVnaXN0ZXJIZWxwZXI6IGZ1bmN0aW9uIHJlZ2lzdGVySGVscGVyKG5hbWUsIGZuKSB7XG4gICAgaWYgKHRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5cGUpIHtcbiAgICAgIGlmIChmbikge1xuICAgICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXJnIG5vdCBzdXBwb3J0ZWQgd2l0aCBtdWx0aXBsZSBoZWxwZXJzJyk7XG4gICAgICB9XG4gICAgICBVdGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdO1xuICB9LFxuXG4gIHJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gcmVnaXN0ZXJQYXJ0aWFsKG5hbWUsIHBhcnRpYWwpIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgVXRpbHMuZXh0ZW5kKHRoaXMucGFydGlhbHMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHBhcnRpYWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIGEgcGFydGlhbCBhcyB1bmRlZmluZWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFydGlhbHNbbmFtZV0gPSBwYXJ0aWFsO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uIHVucmVnaXN0ZXJQYXJ0aWFsKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5wYXJ0aWFsc1tuYW1lXTtcbiAgfVxufTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0SGVscGVycyhpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaGVscGVyTWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gQSBtaXNzaW5nIGZpZWxkIGluIGEge3tmb299fSBjb25zdHVjdC5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNvbWVvbmUgaXMgYWN0dWFsbHkgdHJ5aW5nIHRvIGNhbGwgc29tZXRoaW5nLCBibG93IHVwLlxuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ01pc3NpbmcgaGVscGVyOiBcIicgKyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLm5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH0pO1xuXG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykge1xuICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLFxuICAgICAgICBmbiA9IG9wdGlvbnMuZm47XG5cbiAgICBpZiAoY29udGV4dCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZuKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoY29udGV4dCA9PT0gZmFsc2UgfHwgY29udGV4dCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gaW52ZXJzZSh0aGlzKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoY29udGV4dCkpIHtcbiAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5oZWxwZXJzLmVhY2goY29udGV4dCwgb3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW52ZXJzZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykge1xuICAgICAgICB2YXIgZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBVdGlscy5hcHBlbmRDb250ZXh0UGF0aChvcHRpb25zLmRhdGEuY29udGV4dFBhdGgsIG9wdGlvbnMubmFtZSk7XG4gICAgICAgIG9wdGlvbnMgPSB7IGRhdGE6IGRhdGEgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2VhY2gnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpO1xuICAgIH1cblxuICAgIHZhciBmbiA9IG9wdGlvbnMuZm4sXG4gICAgICAgIGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICByZXQgPSAnJyxcbiAgICAgICAgZGF0YSA9IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGV4dFBhdGggPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICBjb250ZXh0UGF0aCA9IFV0aWxzLmFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pICsgJy4nO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQpKSB7XG4gICAgICBjb250ZXh0ID0gY29udGV4dC5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4ZWNJdGVyYXRpb24oZmllbGQsIGluZGV4LCBsYXN0KSB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmtleSA9IGZpZWxkO1xuICAgICAgICBkYXRhLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGRhdGEuZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICAgICAgZGF0YS5sYXN0ID0gISFsYXN0O1xuXG4gICAgICAgIGlmIChjb250ZXh0UGF0aCkge1xuICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldCA9IHJldCArIGZuKGNvbnRleHRbZmllbGRdLCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBVdGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgICBmb3IgKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwcmlvcktleSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dCkge1xuICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdFxuICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS5cbiAgICAgICAgICAgIGlmIChwcmlvcktleSkge1xuICAgICAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmlvcktleSA9IGtleTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByaW9yS2V5KSB7XG4gICAgICAgICAgZXhlY0l0ZXJhdGlvbihwcmlvcktleSwgaSAtIDEsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIHJldCA9IGludmVyc2UodGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2lmJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7XG4gICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBiZWhhdmlvciBpcyB0byByZW5kZXIgdGhlIHBvc2l0aXZlIHBhdGggaWYgdGhlIHZhbHVlIGlzIHRydXRoeSBhbmQgbm90IGVtcHR5LlxuICAgIC8vIFRoZSBgaW5jbHVkZVplcm9gIG9wdGlvbiBtYXkgYmUgc2V0IHRvIHRyZWF0IHRoZSBjb25kdGlvbmFsIGFzIHB1cmVseSBub3QgZW1wdHkgYmFzZWQgb24gdGhlXG4gICAgLy8gYmVoYXZpb3Igb2YgaXNFbXB0eS4gRWZmZWN0aXZlbHkgdGhpcyBkZXRlcm1pbmVzIGlmIDAgaXMgaGFuZGxlZCBieSB0aGUgcG9zaXRpdmUgcGF0aCBvciBuZWdhdGl2ZS5cbiAgICBpZiAoIW9wdGlvbnMuaGFzaC5pbmNsdWRlWmVybyAmJiAhY29uZGl0aW9uYWwgfHwgVXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3VubGVzcycsIGZ1bmN0aW9uIChjb25kaXRpb25hbCwgb3B0aW9ucykge1xuICAgIHJldHVybiBpbnN0YW5jZS5oZWxwZXJzWydpZiddLmNhbGwodGhpcywgY29uZGl0aW9uYWwsIHsgZm46IG9wdGlvbnMuaW52ZXJzZSwgaW52ZXJzZTogb3B0aW9ucy5mbiwgaGFzaDogb3B0aW9ucy5oYXNoIH0pO1xuICB9KTtcblxuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignd2l0aCcsIGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dCkpIHtcbiAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgdmFyIGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmICghVXRpbHMuaXNFbXB0eShjb250ZXh0KSkge1xuICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykge1xuICAgICAgICB2YXIgZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBVdGlscy5hcHBlbmRDb250ZXh0UGF0aChvcHRpb25zLmRhdGEuY29udGV4dFBhdGgsIG9wdGlvbnMuaWRzWzBdKTtcbiAgICAgICAgb3B0aW9ucyA9IHsgZGF0YTogZGF0YSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfVxuICB9KTtcblxuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICB2YXIgbGV2ZWwgPSBvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5kYXRhLmxldmVsICE9IG51bGwgPyBwYXJzZUludChvcHRpb25zLmRhdGEubGV2ZWwsIDEwKSA6IDE7XG4gICAgaW5zdGFuY2UubG9nKGxldmVsLCBtZXNzYWdlKTtcbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkKSB7XG4gICAgcmV0dXJuIG9iaiAmJiBvYmpbZmllbGRdO1xuICB9KTtcbn1cblxudmFyIGxvZ2dlciA9IHtcbiAgbWV0aG9kTWFwOiB7IDA6ICdkZWJ1ZycsIDE6ICdpbmZvJywgMjogJ3dhcm4nLCAzOiAnZXJyb3InIH0sXG5cbiAgLy8gU3RhdGUgZW51bVxuICBERUJVRzogMCxcbiAgSU5GTzogMSxcbiAgV0FSTjogMixcbiAgRVJST1I6IDMsXG4gIGxldmVsOiAxLFxuXG4gIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50XG4gIGxvZzogZnVuY3Rpb24gbG9nKGxldmVsLCBtZXNzYWdlKSB7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBsb2dnZXIubGV2ZWwgPD0gbGV2ZWwpIHtcbiAgICAgIHZhciBtZXRob2QgPSBsb2dnZXIubWV0aG9kTWFwW2xldmVsXTtcbiAgICAgIChjb25zb2xlW21ldGhvZF0gfHwgY29uc29sZS5sb2cpLmNhbGwoY29uc29sZSwgbWVzc2FnZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0cy5sb2dnZXIgPSBsb2dnZXI7XG52YXIgbG9nID0gbG9nZ2VyLmxvZztcblxuZXhwb3J0cy5sb2cgPSBsb2c7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYW1lKG9iamVjdCkge1xuICB2YXIgZnJhbWUgPSBVdGlscy5leHRlbmQoe30sIG9iamVjdCk7XG4gIGZyYW1lLl9wYXJlbnQgPSBvYmplY3Q7XG4gIHJldHVybiBmcmFtZTtcbn1cblxuLyogW2FyZ3MsIF1vcHRpb25zICovIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIEFTVCA9IHtcbiAgUHJvZ3JhbTogZnVuY3Rpb24gUHJvZ3JhbShzdGF0ZW1lbnRzLCBibG9ja1BhcmFtcywgc3RyaXAsIGxvY0luZm8pIHtcbiAgICB0aGlzLmxvYyA9IGxvY0luZm87XG4gICAgdGhpcy50eXBlID0gJ1Byb2dyYW0nO1xuICAgIHRoaXMuYm9keSA9IHN0YXRlbWVudHM7XG5cbiAgICB0aGlzLmJsb2NrUGFyYW1zID0gYmxvY2tQYXJhbXM7XG4gICAgdGhpcy5zdHJpcCA9IHN0cmlwO1xuICB9LFxuXG4gIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChwYXRoLCBwYXJhbXMsIGhhc2gsIGVzY2FwZWQsIHN0cmlwLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdNdXN0YWNoZVN0YXRlbWVudCc7XG5cbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zIHx8IFtdO1xuICAgIHRoaXMuaGFzaCA9IGhhc2g7XG4gICAgdGhpcy5lc2NhcGVkID0gZXNjYXBlZDtcblxuICAgIHRoaXMuc3RyaXAgPSBzdHJpcDtcbiAgfSxcblxuICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQocGF0aCwgcGFyYW1zLCBoYXNoLCBwcm9ncmFtLCBpbnZlcnNlLCBvcGVuU3RyaXAsIGludmVyc2VTdHJpcCwgY2xvc2VTdHJpcCwgbG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcbiAgICB0aGlzLnR5cGUgPSAnQmxvY2tTdGF0ZW1lbnQnO1xuXG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcyB8fCBbXTtcbiAgICB0aGlzLmhhc2ggPSBoYXNoO1xuICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG4gICAgdGhpcy5pbnZlcnNlID0gaW52ZXJzZTtcblxuICAgIHRoaXMub3BlblN0cmlwID0gb3BlblN0cmlwO1xuICAgIHRoaXMuaW52ZXJzZVN0cmlwID0gaW52ZXJzZVN0cmlwO1xuICAgIHRoaXMuY2xvc2VTdHJpcCA9IGNsb3NlU3RyaXA7XG4gIH0sXG5cbiAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChuYW1lLCBwYXJhbXMsIGhhc2gsIHN0cmlwLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdQYXJ0aWFsU3RhdGVtZW50JztcblxuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXMgfHwgW107XG4gICAgdGhpcy5oYXNoID0gaGFzaDtcblxuICAgIHRoaXMuaW5kZW50ID0gJyc7XG4gICAgdGhpcy5zdHJpcCA9IHN0cmlwO1xuICB9LFxuXG4gIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoc3RyaW5nLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdDb250ZW50U3RhdGVtZW50JztcbiAgICB0aGlzLm9yaWdpbmFsID0gdGhpcy52YWx1ZSA9IHN0cmluZztcbiAgfSxcblxuICBDb21tZW50U3RhdGVtZW50OiBmdW5jdGlvbiBDb21tZW50U3RhdGVtZW50KGNvbW1lbnQsIHN0cmlwLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdDb21tZW50U3RhdGVtZW50JztcbiAgICB0aGlzLnZhbHVlID0gY29tbWVudDtcblxuICAgIHRoaXMuc3RyaXAgPSBzdHJpcDtcbiAgfSxcblxuICBTdWJFeHByZXNzaW9uOiBmdW5jdGlvbiBTdWJFeHByZXNzaW9uKHBhdGgsIHBhcmFtcywgaGFzaCwgbG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcblxuICAgIHRoaXMudHlwZSA9ICdTdWJFeHByZXNzaW9uJztcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zIHx8IFtdO1xuICAgIHRoaXMuaGFzaCA9IGhhc2g7XG4gIH0sXG5cbiAgUGF0aEV4cHJlc3Npb246IGZ1bmN0aW9uIFBhdGhFeHByZXNzaW9uKGRhdGEsIGRlcHRoLCBwYXJ0cywgb3JpZ2luYWwsIGxvY0luZm8pIHtcbiAgICB0aGlzLmxvYyA9IGxvY0luZm87XG4gICAgdGhpcy50eXBlID0gJ1BhdGhFeHByZXNzaW9uJztcblxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5vcmlnaW5hbCA9IG9yaWdpbmFsO1xuICAgIHRoaXMucGFydHMgPSBwYXJ0cztcbiAgICB0aGlzLmRlcHRoID0gZGVwdGg7XG4gIH0sXG5cbiAgU3RyaW5nTGl0ZXJhbDogZnVuY3Rpb24gU3RyaW5nTGl0ZXJhbChzdHJpbmcsIGxvY0luZm8pIHtcbiAgICB0aGlzLmxvYyA9IGxvY0luZm87XG4gICAgdGhpcy50eXBlID0gJ1N0cmluZ0xpdGVyYWwnO1xuICAgIHRoaXMub3JpZ2luYWwgPSB0aGlzLnZhbHVlID0gc3RyaW5nO1xuICB9LFxuXG4gIE51bWJlckxpdGVyYWw6IGZ1bmN0aW9uIE51bWJlckxpdGVyYWwobnVtYmVyLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdOdW1iZXJMaXRlcmFsJztcbiAgICB0aGlzLm9yaWdpbmFsID0gdGhpcy52YWx1ZSA9IE51bWJlcihudW1iZXIpO1xuICB9LFxuXG4gIEJvb2xlYW5MaXRlcmFsOiBmdW5jdGlvbiBCb29sZWFuTGl0ZXJhbChib29sLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdCb29sZWFuTGl0ZXJhbCc7XG4gICAgdGhpcy5vcmlnaW5hbCA9IHRoaXMudmFsdWUgPSBib29sID09PSAndHJ1ZSc7XG4gIH0sXG5cbiAgVW5kZWZpbmVkTGl0ZXJhbDogZnVuY3Rpb24gVW5kZWZpbmVkTGl0ZXJhbChsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdVbmRlZmluZWRMaXRlcmFsJztcbiAgICB0aGlzLm9yaWdpbmFsID0gdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgfSxcblxuICBOdWxsTGl0ZXJhbDogZnVuY3Rpb24gTnVsbExpdGVyYWwobG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcbiAgICB0aGlzLnR5cGUgPSAnTnVsbExpdGVyYWwnO1xuICAgIHRoaXMub3JpZ2luYWwgPSB0aGlzLnZhbHVlID0gbnVsbDtcbiAgfSxcblxuICBIYXNoOiBmdW5jdGlvbiBIYXNoKHBhaXJzLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdIYXNoJztcbiAgICB0aGlzLnBhaXJzID0gcGFpcnM7XG4gIH0sXG4gIEhhc2hQYWlyOiBmdW5jdGlvbiBIYXNoUGFpcihrZXksIHZhbHVlLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdIYXNoUGFpcic7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9LFxuXG4gIC8vIFB1YmxpYyBBUEkgdXNlZCB0byBldmFsdWF0ZSBkZXJpdmVkIGF0dHJpYnV0ZXMgcmVnYXJkaW5nIEFTVCBub2Rlc1xuICBoZWxwZXJzOiB7XG4gICAgLy8gYSBtdXN0YWNoZSBpcyBkZWZpbml0ZWx5IGEgaGVscGVyIGlmOlxuICAgIC8vICogaXQgaXMgYW4gZWxpZ2libGUgaGVscGVyLCBhbmRcbiAgICAvLyAqIGl0IGhhcyBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIG9yIGhhc2ggc2VnbWVudFxuICAgIGhlbHBlckV4cHJlc3Npb246IGZ1bmN0aW9uIGhlbHBlckV4cHJlc3Npb24obm9kZSkge1xuICAgICAgcmV0dXJuICEhKG5vZGUudHlwZSA9PT0gJ1N1YkV4cHJlc3Npb24nIHx8IG5vZGUucGFyYW1zLmxlbmd0aCB8fCBub2RlLmhhc2gpO1xuICAgIH0sXG5cbiAgICBzY29wZWRJZDogZnVuY3Rpb24gc2NvcGVkSWQocGF0aCkge1xuICAgICAgcmV0dXJuIC9eXFwufHRoaXNcXGIvLnRlc3QocGF0aC5vcmlnaW5hbCk7XG4gICAgfSxcblxuICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3RcbiAgICAvLyBgLi5gIG9yIGB0aGlzYC5cbiAgICBzaW1wbGVJZDogZnVuY3Rpb24gc2ltcGxlSWQocGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGgucGFydHMubGVuZ3RoID09PSAxICYmICFBU1QuaGVscGVycy5zY29wZWRJZChwYXRoKSAmJiAhcGF0aC5kZXB0aDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIE11c3QgYmUgZXhwb3J0ZWQgYXMgYW4gb2JqZWN0IHJhdGhlciB0aGFuIHRoZSByb290IG9mIHRoZSBtb2R1bGUgYXMgdGhlIGppc29uIGxleGVyXG4vLyBtdXN0IG1vZGlmeSB0aGUgb2JqZWN0IHRvIG9wZXJhdGUgcHJvcGVybHkuXG5leHBvcnRzWydkZWZhdWx0J10gPSBBU1Q7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMucGFyc2UgPSBwYXJzZTtcblxudmFyIF9wYXJzZXIgPSByZXF1aXJlKCcuL3BhcnNlcicpO1xuXG52YXIgX3BhcnNlcjIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfcGFyc2VyKTtcblxudmFyIF9BU1QgPSByZXF1aXJlKCcuL2FzdCcpO1xuXG52YXIgX0FTVDIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfQVNUKTtcblxudmFyIF9XaGl0ZXNwYWNlQ29udHJvbCA9IHJlcXVpcmUoJy4vd2hpdGVzcGFjZS1jb250cm9sJyk7XG5cbnZhciBfV2hpdGVzcGFjZUNvbnRyb2wyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX1doaXRlc3BhY2VDb250cm9sKTtcblxudmFyIF9pbXBvcnQgPSByZXF1aXJlKCcuL2hlbHBlcnMnKTtcblxudmFyIEhlbHBlcnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaW1wb3J0KTtcblxudmFyIF9leHRlbmQgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5leHBvcnRzLnBhcnNlciA9IF9wYXJzZXIyWydkZWZhdWx0J107XG5cbnZhciB5eSA9IHt9O1xuX2V4dGVuZC5leHRlbmQoeXksIEhlbHBlcnMsIF9BU1QyWydkZWZhdWx0J10pO1xuXG5mdW5jdGlvbiBwYXJzZShpbnB1dCwgb3B0aW9ucykge1xuICAvLyBKdXN0IHJldHVybiBpZiBhbiBhbHJlYWR5LWNvbXBpbGVkIEFTVCB3YXMgcGFzc2VkIGluLlxuICBpZiAoaW5wdXQudHlwZSA9PT0gJ1Byb2dyYW0nKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG5cbiAgX3BhcnNlcjJbJ2RlZmF1bHQnXS55eSA9IHl5O1xuXG4gIC8vIEFsdGVyaW5nIHRoZSBzaGFyZWQgb2JqZWN0IGhlcmUsIGJ1dCB0aGlzIGlzIG9rIGFzIHBhcnNlciBpcyBhIHN5bmMgb3BlcmF0aW9uXG4gIHl5LmxvY0luZm8gPSBmdW5jdGlvbiAobG9jSW5mbykge1xuICAgIHJldHVybiBuZXcgeXkuU291cmNlTG9jYXRpb24ob3B0aW9ucyAmJiBvcHRpb25zLnNyY05hbWUsIGxvY0luZm8pO1xuICB9O1xuXG4gIHZhciBzdHJpcCA9IG5ldyBfV2hpdGVzcGFjZUNvbnRyb2wyWydkZWZhdWx0J10oKTtcbiAgcmV0dXJuIHN0cmlwLmFjY2VwdChfcGFyc2VyMlsnZGVmYXVsdCddLnBhcnNlKGlucHV0KSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuLypnbG9iYWwgZGVmaW5lICovXG5cbnZhciBfaXNBcnJheSA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBTb3VyY2VOb2RlID0gdW5kZWZpbmVkO1xuXG50cnkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJyB8fCAhZGVmaW5lLmFtZCkge1xuICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgdGhpcyBpbiBBTUQgZW52aXJvbm1lbnRzLiBGb3IgdGhlc2UgZW52aXJvbm1lbnRzLCB3ZSBhc3VzbWUgdGhhdFxuICAgIC8vIHRoZXkgYXJlIHJ1bm5pbmcgb24gdGhlIGJyb3dzZXIgYW5kIHRodXMgaGF2ZSBubyBuZWVkIGZvciB0aGUgc291cmNlLW1hcCBsaWJyYXJ5LlxuICAgIHZhciBTb3VyY2VNYXAgPSByZXF1aXJlKCdzb3VyY2UtbWFwJyk7XG4gICAgU291cmNlTm9kZSA9IFNvdXJjZU1hcC5Tb3VyY2VOb2RlO1xuICB9XG59IGNhdGNoIChlcnIpIHt9XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGVzdGVkIGJ1dCBub3QgY292ZXJlZCBpbiBpc3RhbmJ1bCBkdWUgdG8gZGlzdCBidWlsZCAgKi9cbmlmICghU291cmNlTm9kZSkge1xuICBTb3VyY2VOb2RlID0gZnVuY3Rpb24gKGxpbmUsIGNvbHVtbiwgc3JjRmlsZSwgY2h1bmtzKSB7XG4gICAgdGhpcy5zcmMgPSAnJztcbiAgICBpZiAoY2h1bmtzKSB7XG4gICAgICB0aGlzLmFkZChjaHVua3MpO1xuICAgIH1cbiAgfTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUgPSB7XG4gICAgYWRkOiBmdW5jdGlvbiBhZGQoY2h1bmtzKSB7XG4gICAgICBpZiAoX2lzQXJyYXkuaXNBcnJheShjaHVua3MpKSB7XG4gICAgICAgIGNodW5rcyA9IGNodW5rcy5qb2luKCcnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3JjICs9IGNodW5rcztcbiAgICB9LFxuICAgIHByZXBlbmQ6IGZ1bmN0aW9uIHByZXBlbmQoY2h1bmtzKSB7XG4gICAgICBpZiAoX2lzQXJyYXkuaXNBcnJheShjaHVua3MpKSB7XG4gICAgICAgIGNodW5rcyA9IGNodW5rcy5qb2luKCcnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3JjID0gY2h1bmtzICsgdGhpcy5zcmM7XG4gICAgfSxcbiAgICB0b1N0cmluZ1dpdGhTb3VyY2VNYXA6IGZ1bmN0aW9uIHRvU3RyaW5nV2l0aFNvdXJjZU1hcCgpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IHRoaXMudG9TdHJpbmcoKSB9O1xuICAgIH0sXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3JjO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY2FzdENodW5rKGNodW5rLCBjb2RlR2VuLCBsb2MpIHtcbiAgaWYgKF9pc0FycmF5LmlzQXJyYXkoY2h1bmspKSB7XG4gICAgdmFyIHJldCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNodW5rLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICByZXQucHVzaChjb2RlR2VuLndyYXAoY2h1bmtbaV0sIGxvYykpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiBjaHVuayA9PT0gJ251bWJlcicpIHtcbiAgICAvLyBIYW5kbGUgcHJpbWl0aXZlcyB0aGF0IHRoZSBTb3VyY2VOb2RlIHdpbGwgdGhyb3cgdXAgb25cbiAgICByZXR1cm4gY2h1bmsgKyAnJztcbiAgfVxuICByZXR1cm4gY2h1bms7XG59XG5cbmZ1bmN0aW9uIENvZGVHZW4oc3JjRmlsZSkge1xuICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlO1xuICB0aGlzLnNvdXJjZSA9IFtdO1xufVxuXG5Db2RlR2VuLnByb3RvdHlwZSA9IHtcbiAgcHJlcGVuZDogZnVuY3Rpb24gcHJlcGVuZChzb3VyY2UsIGxvYykge1xuICAgIHRoaXMuc291cmNlLnVuc2hpZnQodGhpcy53cmFwKHNvdXJjZSwgbG9jKSk7XG4gIH0sXG4gIHB1c2g6IGZ1bmN0aW9uIHB1c2goc291cmNlLCBsb2MpIHtcbiAgICB0aGlzLnNvdXJjZS5wdXNoKHRoaXMud3JhcChzb3VyY2UsIGxvYykpO1xuICB9LFxuXG4gIG1lcmdlOiBmdW5jdGlvbiBtZXJnZSgpIHtcbiAgICB2YXIgc291cmNlID0gdGhpcy5lbXB0eSgpO1xuICAgIHRoaXMuZWFjaChmdW5jdGlvbiAobGluZSkge1xuICAgICAgc291cmNlLmFkZChbJyAgJywgbGluZSwgJ1xcbiddKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc291cmNlO1xuICB9LFxuXG4gIGVhY2g6IGZ1bmN0aW9uIGVhY2goaXRlcikge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLnNvdXJjZS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaXRlcih0aGlzLnNvdXJjZVtpXSk7XG4gICAgfVxuICB9LFxuXG4gIGVtcHR5OiBmdW5jdGlvbiBlbXB0eSgpIHtcbiAgICB2YXIgbG9jID0gYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB0aGlzLmN1cnJlbnRMb2NhdGlvbiB8fCB7IHN0YXJ0OiB7fSB9IDogYXJndW1lbnRzWzBdO1xuXG4gICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKGxvYy5zdGFydC5saW5lLCBsb2Muc3RhcnQuY29sdW1uLCB0aGlzLnNyY0ZpbGUpO1xuICB9LFxuICB3cmFwOiBmdW5jdGlvbiB3cmFwKGNodW5rKSB7XG4gICAgdmFyIGxvYyA9IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5jdXJyZW50TG9jYXRpb24gfHwgeyBzdGFydDoge30gfSA6IGFyZ3VtZW50c1sxXTtcblxuICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHtcbiAgICAgIHJldHVybiBjaHVuaztcbiAgICB9XG5cbiAgICBjaHVuayA9IGNhc3RDaHVuayhjaHVuaywgdGhpcywgbG9jKTtcblxuICAgIHJldHVybiBuZXcgU291cmNlTm9kZShsb2Muc3RhcnQubGluZSwgbG9jLnN0YXJ0LmNvbHVtbiwgdGhpcy5zcmNGaWxlLCBjaHVuayk7XG4gIH0sXG5cbiAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbiBmdW5jdGlvbkNhbGwoZm4sIHR5cGUsIHBhcmFtcykge1xuICAgIHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMud3JhcChbZm4sIHR5cGUgPyAnLicgKyB0eXBlICsgJygnIDogJygnLCBwYXJhbXMsICcpJ10pO1xuICB9LFxuXG4gIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikge1xuICAgIHJldHVybiAnXCInICsgKHN0ciArICcnKS5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgJ1xcXFxuJykucmVwbGFjZSgvXFxyL2csICdcXFxccicpLnJlcGxhY2UoL1xcdTIwMjgvZywgJ1xcXFx1MjAyOCcpIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNFxuICAgIC5yZXBsYWNlKC9cXHUyMDI5L2csICdcXFxcdTIwMjknKSArICdcIic7XG4gIH0sXG5cbiAgb2JqZWN0TGl0ZXJhbDogZnVuY3Rpb24gb2JqZWN0TGl0ZXJhbChvYmopIHtcbiAgICB2YXIgcGFpcnMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBjYXN0Q2h1bmsob2JqW2tleV0sIHRoaXMpO1xuICAgICAgICBpZiAodmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcGFpcnMucHVzaChbdGhpcy5xdW90ZWRTdHJpbmcoa2V5KSwgJzonLCB2YWx1ZV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhaXJzKTtcbiAgICByZXQucHJlcGVuZCgneycpO1xuICAgIHJldC5hZGQoJ30nKTtcbiAgICByZXR1cm4gcmV0O1xuICB9LFxuXG4gIGdlbmVyYXRlTGlzdDogZnVuY3Rpb24gZ2VuZXJhdGVMaXN0KGVudHJpZXMsIGxvYykge1xuICAgIHZhciByZXQgPSB0aGlzLmVtcHR5KGxvYyk7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKGkpIHtcbiAgICAgICAgcmV0LmFkZCgnLCcpO1xuICAgICAgfVxuXG4gICAgICByZXQuYWRkKGNhc3RDaHVuayhlbnRyaWVzW2ldLCB0aGlzLCBsb2MpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuXG4gIGdlbmVyYXRlQXJyYXk6IGZ1bmN0aW9uIGdlbmVyYXRlQXJyYXkoZW50cmllcywgbG9jKSB7XG4gICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KGVudHJpZXMsIGxvYyk7XG4gICAgcmV0LnByZXBlbmQoJ1snKTtcbiAgICByZXQuYWRkKCddJyk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG59O1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBDb2RlR2VuO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qIE5PUCAqLyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9O1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5Db21waWxlciA9IENvbXBpbGVyO1xuZXhwb3J0cy5wcmVjb21waWxlID0gcHJlY29tcGlsZTtcbmV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7XG5cbnZhciBfRXhjZXB0aW9uID0gcmVxdWlyZSgnLi4vZXhjZXB0aW9uJyk7XG5cbnZhciBfRXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9FeGNlcHRpb24pO1xuXG52YXIgX2lzQXJyYXkkaW5kZXhPZiA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBfQVNUID0gcmVxdWlyZSgnLi9hc3QnKTtcblxudmFyIF9BU1QyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0FTVCk7XG5cbnZhciBzbGljZSA9IFtdLnNsaWNlO1xuXG5mdW5jdGlvbiBDb21waWxlcigpIHt9XG5cbi8vIHRoZSBmb3VuZEhlbHBlciByZWdpc3RlciB3aWxsIGRpc2FtYmlndWF0ZSBoZWxwZXIgbG9va3VwIGZyb20gZmluZGluZyBhXG4vLyBmdW5jdGlvbiBpbiBhIGNvbnRleHQuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBtdXN0YWNoZSBjb21wYXRpYmlsaXR5LCB3aGljaFxuLy8gcmVxdWlyZXMgdGhhdCBjb250ZXh0IGZ1bmN0aW9ucyBpbiBibG9ja3MgYXJlIGV2YWx1YXRlZCBieSBibG9ja0hlbHBlck1pc3NpbmcsXG4vLyBhbmQgdGhlbiBwcm9jZWVkIGFzIGlmIHRoZSByZXN1bHRpbmcgdmFsdWUgd2FzIHByb3ZpZGVkIHRvIGJsb2NrSGVscGVyTWlzc2luZy5cblxuQ29tcGlsZXIucHJvdG90eXBlID0ge1xuICBjb21waWxlcjogQ29tcGlsZXIsXG5cbiAgZXF1YWxzOiBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICB2YXIgbGVuID0gdGhpcy5vcGNvZGVzLmxlbmd0aDtcbiAgICBpZiAob3RoZXIub3Bjb2Rlcy5sZW5ndGggIT09IGxlbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciBvcGNvZGUgPSB0aGlzLm9wY29kZXNbaV0sXG4gICAgICAgICAgb3RoZXJPcGNvZGUgPSBvdGhlci5vcGNvZGVzW2ldO1xuICAgICAgaWYgKG9wY29kZS5vcGNvZGUgIT09IG90aGVyT3Bjb2RlLm9wY29kZSB8fCAhYXJnRXF1YWxzKG9wY29kZS5hcmdzLCBvdGhlck9wY29kZS5hcmdzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2Uga25vdyB0aGF0IGxlbmd0aCBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgdGllZFxuICAgIC8vIHRvIHRoZSBvcGNvZGUgYmVoYXZpb3IgYWJvdmUuXG4gICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhvdGhlci5jaGlsZHJlbltpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuXG4gIGd1aWQ6IDAsXG5cbiAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShwcm9ncmFtLCBvcHRpb25zKSB7XG4gICAgdGhpcy5zb3VyY2VOb2RlID0gW107XG4gICAgdGhpcy5vcGNvZGVzID0gW107XG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtcztcbiAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkcztcblxuICAgIG9wdGlvbnMuYmxvY2tQYXJhbXMgPSBvcHRpb25zLmJsb2NrUGFyYW1zIHx8IFtdO1xuXG4gICAgLy8gVGhlc2UgY2hhbmdlcyB3aWxsIHByb3BhZ2F0ZSB0byB0aGUgb3RoZXIgY29tcGlsZXIgY29tcG9uZW50c1xuICAgIHZhciBrbm93bkhlbHBlcnMgPSBvcHRpb25zLmtub3duSGVscGVycztcbiAgICBvcHRpb25zLmtub3duSGVscGVycyA9IHtcbiAgICAgIGhlbHBlck1pc3Npbmc6IHRydWUsXG4gICAgICBibG9ja0hlbHBlck1pc3Npbmc6IHRydWUsXG4gICAgICBlYWNoOiB0cnVlLFxuICAgICAgJ2lmJzogdHJ1ZSxcbiAgICAgIHVubGVzczogdHJ1ZSxcbiAgICAgICd3aXRoJzogdHJ1ZSxcbiAgICAgIGxvZzogdHJ1ZSxcbiAgICAgIGxvb2t1cDogdHJ1ZVxuICAgIH07XG4gICAgaWYgKGtub3duSGVscGVycykge1xuICAgICAgZm9yICh2YXIgX25hbWUgaW4ga25vd25IZWxwZXJzKSB7XG4gICAgICAgIGlmIChfbmFtZSBpbiBrbm93bkhlbHBlcnMpIHtcbiAgICAgICAgICBvcHRpb25zLmtub3duSGVscGVyc1tfbmFtZV0gPSBrbm93bkhlbHBlcnNbX25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pO1xuICB9LFxuXG4gIGNvbXBpbGVQcm9ncmFtOiBmdW5jdGlvbiBjb21waWxlUHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgdmFyIGNoaWxkQ29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcbiAgICByZXN1bHQgPSBjaGlsZENvbXBpbGVyLmNvbXBpbGUocHJvZ3JhbSwgdGhpcy5vcHRpb25zKSxcbiAgICAgICAgZ3VpZCA9IHRoaXMuZ3VpZCsrO1xuXG4gICAgdGhpcy51c2VQYXJ0aWFsID0gdGhpcy51c2VQYXJ0aWFsIHx8IHJlc3VsdC51c2VQYXJ0aWFsO1xuXG4gICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDtcbiAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7XG5cbiAgICByZXR1cm4gZ3VpZDtcbiAgfSxcblxuICBhY2NlcHQ6IGZ1bmN0aW9uIGFjY2VwdChub2RlKSB7XG4gICAgdGhpcy5zb3VyY2VOb2RlLnVuc2hpZnQobm9kZSk7XG4gICAgdmFyIHJldCA9IHRoaXNbbm9kZS50eXBlXShub2RlKTtcbiAgICB0aGlzLnNvdXJjZU5vZGUuc2hpZnQoKTtcbiAgICByZXR1cm4gcmV0O1xuICB9LFxuXG4gIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkge1xuICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpO1xuXG4gICAgdmFyIGJvZHkgPSBwcm9ncmFtLmJvZHksXG4gICAgICAgIGJvZHlMZW5ndGggPSBib2R5Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZHlMZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hY2NlcHQoYm9keVtpXSk7XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLnNoaWZ0KCk7XG5cbiAgICB0aGlzLmlzU2ltcGxlID0gYm9keUxlbmd0aCA9PT0gMTtcbiAgICB0aGlzLmJsb2NrUGFyYW1zID0gcHJvZ3JhbS5ibG9ja1BhcmFtcyA/IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoIDogMDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBCbG9ja1N0YXRlbWVudChibG9jaykge1xuICAgIHRyYW5zZm9ybUxpdGVyYWxUb1BhdGgoYmxvY2spO1xuXG4gICAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtLFxuICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTtcblxuICAgIHByb2dyYW0gPSBwcm9ncmFtICYmIHRoaXMuY29tcGlsZVByb2dyYW0ocHJvZ3JhbSk7XG4gICAgaW52ZXJzZSA9IGludmVyc2UgJiYgdGhpcy5jb21waWxlUHJvZ3JhbShpbnZlcnNlKTtcblxuICAgIHZhciB0eXBlID0gdGhpcy5jbGFzc2lmeVNleHByKGJsb2NrKTtcblxuICAgIGlmICh0eXBlID09PSAnaGVscGVyJykge1xuICAgICAgdGhpcy5oZWxwZXJTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykge1xuICAgICAgdGhpcy5zaW1wbGVTZXhwcihibG9jayk7XG5cbiAgICAgIC8vIG5vdyB0aGF0IHRoZSBzaW1wbGUgbXVzdGFjaGUgaXMgcmVzb2x2ZWQsIHdlIG5lZWQgdG9cbiAgICAgIC8vIGV2YWx1YXRlIGl0IGJ5IGV4ZWN1dGluZyBgYmxvY2tIZWxwZXJNaXNzaW5nYFxuICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7XG4gICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBpbnZlcnNlKTtcbiAgICAgIHRoaXMub3Bjb2RlKCdlbXB0eUhhc2gnKTtcbiAgICAgIHRoaXMub3Bjb2RlKCdibG9ja1ZhbHVlJywgYmxvY2sucGF0aC5vcmlnaW5hbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoYmxvY2ssIHByb2dyYW0sIGludmVyc2UpO1xuXG4gICAgICAvLyBub3cgdGhhdCB0aGUgc2ltcGxlIG11c3RhY2hlIGlzIHJlc29sdmVkLCB3ZSBuZWVkIHRvXG4gICAgICAvLyBldmFsdWF0ZSBpdCBieSBleGVjdXRpbmcgYGJsb2NrSGVscGVyTWlzc2luZ2BcbiAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pO1xuICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7XG4gICAgICB0aGlzLm9wY29kZSgnZW1wdHlIYXNoJyk7XG4gICAgICB0aGlzLm9wY29kZSgnYW1iaWd1b3VzQmxvY2tWYWx1ZScpO1xuICAgIH1cblxuICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTtcbiAgfSxcblxuICBQYXJ0aWFsU3RhdGVtZW50OiBmdW5jdGlvbiBQYXJ0aWFsU3RhdGVtZW50KHBhcnRpYWwpIHtcbiAgICB0aGlzLnVzZVBhcnRpYWwgPSB0cnVlO1xuXG4gICAgdmFyIHBhcmFtcyA9IHBhcnRpYWwucGFyYW1zO1xuICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ1Vuc3VwcG9ydGVkIG51bWJlciBvZiBwYXJ0aWFsIGFyZ3VtZW50czogJyArIHBhcmFtcy5sZW5ndGgsIHBhcnRpYWwpO1xuICAgIH0gZWxzZSBpZiAoIXBhcmFtcy5sZW5ndGgpIHtcbiAgICAgIHBhcmFtcy5wdXNoKHsgdHlwZTogJ1BhdGhFeHByZXNzaW9uJywgcGFydHM6IFtdLCBkZXB0aDogMCB9KTtcbiAgICB9XG5cbiAgICB2YXIgcGFydGlhbE5hbWUgPSBwYXJ0aWFsLm5hbWUub3JpZ2luYWwsXG4gICAgICAgIGlzRHluYW1pYyA9IHBhcnRpYWwubmFtZS50eXBlID09PSAnU3ViRXhwcmVzc2lvbic7XG4gICAgaWYgKGlzRHluYW1pYykge1xuICAgICAgdGhpcy5hY2NlcHQocGFydGlhbC5uYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKHBhcnRpYWwsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgIHZhciBpbmRlbnQgPSBwYXJ0aWFsLmluZGVudCB8fCAnJztcbiAgICBpZiAodGhpcy5vcHRpb25zLnByZXZlbnRJbmRlbnQgJiYgaW5kZW50KSB7XG4gICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGluZGVudCk7XG4gICAgICBpbmRlbnQgPSAnJztcbiAgICB9XG5cbiAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7XG4gICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpO1xuICB9LFxuXG4gIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkge1xuICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuXG4gICAgaWYgKG11c3RhY2hlLmVzY2FwZWQgJiYgIXRoaXMub3B0aW9ucy5ub0VzY2FwZSkge1xuICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZEVzY2FwZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpO1xuICAgIH1cbiAgfSxcblxuICBDb250ZW50U3RhdGVtZW50OiBmdW5jdGlvbiBDb250ZW50U3RhdGVtZW50KGNvbnRlbnQpIHtcbiAgICBpZiAoY29udGVudC52YWx1ZSkge1xuICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBjb250ZW50LnZhbHVlKTtcbiAgICB9XG4gIH0sXG5cbiAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIHt9LFxuXG4gIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHtcbiAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKTtcbiAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7XG5cbiAgICBpZiAodHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgIHRoaXMuc2ltcGxlU2V4cHIoc2V4cHIpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2hlbHBlcicpIHtcbiAgICAgIHRoaXMuaGVscGVyU2V4cHIoc2V4cHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFtYmlndW91c1NleHByKHNleHByKTtcbiAgICB9XG4gIH0sXG4gIGFtYmlndW91c1NleHByOiBmdW5jdGlvbiBhbWJpZ3VvdXNTZXhwcihzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSkge1xuICAgIHZhciBwYXRoID0gc2V4cHIucGF0aCxcbiAgICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF0sXG4gICAgICAgIGlzQmxvY2sgPSBwcm9ncmFtICE9IG51bGwgfHwgaW52ZXJzZSAhPSBudWxsO1xuXG4gICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXRoLmRlcHRoKTtcblxuICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pO1xuICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpO1xuXG4gICAgdGhpcy5hY2NlcHQocGF0aCk7XG5cbiAgICB0aGlzLm9wY29kZSgnaW52b2tlQW1iaWd1b3VzJywgbmFtZSwgaXNCbG9jayk7XG4gIH0sXG5cbiAgc2ltcGxlU2V4cHI6IGZ1bmN0aW9uIHNpbXBsZVNleHByKHNleHByKSB7XG4gICAgdGhpcy5hY2NlcHQoc2V4cHIucGF0aCk7XG4gICAgdGhpcy5vcGNvZGUoJ3Jlc29sdmVQb3NzaWJsZUxhbWJkYScpO1xuICB9LFxuXG4gIGhlbHBlclNleHByOiBmdW5jdGlvbiBoZWxwZXJTZXhwcihzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSkge1xuICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSxcbiAgICAgICAgcGF0aCA9IHNleHByLnBhdGgsXG4gICAgICAgIG5hbWUgPSBwYXRoLnBhcnRzWzBdO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNbbmFtZV0pIHtcbiAgICAgIHRoaXMub3Bjb2RlKCdpbnZva2VLbm93bkhlbHBlcicsIHBhcmFtcy5sZW5ndGgsIG5hbWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmtub3duSGVscGVyc09ubHkpIHtcbiAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3Ugc3BlY2lmaWVkIGtub3duSGVscGVyc09ubHksIGJ1dCB1c2VkIHRoZSB1bmtub3duIGhlbHBlciAnICsgbmFtZSwgc2V4cHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoLmZhbHN5ID0gdHJ1ZTtcblxuICAgICAgdGhpcy5hY2NlcHQocGF0aCk7XG4gICAgICB0aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgcGF0aC5vcmlnaW5hbCwgX0FTVDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHBhdGgpKTtcbiAgICB9XG4gIH0sXG5cbiAgUGF0aEV4cHJlc3Npb246IGZ1bmN0aW9uIFBhdGhFeHByZXNzaW9uKHBhdGgpIHtcbiAgICB0aGlzLmFkZERlcHRoKHBhdGguZGVwdGgpO1xuICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7XG5cbiAgICB2YXIgbmFtZSA9IHBhdGgucGFydHNbMF0sXG4gICAgICAgIHNjb3BlZCA9IF9BU1QyWydkZWZhdWx0J10uaGVscGVycy5zY29wZWRJZChwYXRoKSxcbiAgICAgICAgYmxvY2tQYXJhbUlkID0gIXBhdGguZGVwdGggJiYgIXNjb3BlZCAmJiB0aGlzLmJsb2NrUGFyYW1JbmRleChuYW1lKTtcblxuICAgIGlmIChibG9ja1BhcmFtSWQpIHtcbiAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUlkLCBwYXRoLnBhcnRzKTtcbiAgICB9IGVsc2UgaWYgKCFuYW1lKSB7XG4gICAgICAvLyBDb250ZXh0IHJlZmVyZW5jZSwgaS5lLiBge3tmb28gLn19YCBvciBge3tmb28gLi59fWBcbiAgICAgIHRoaXMub3Bjb2RlKCdwdXNoQ29udGV4dCcpO1xuICAgIH0gZWxzZSBpZiAocGF0aC5kYXRhKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7XG4gICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIHBhdGguZGVwdGgsIHBhdGgucGFydHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wY29kZSgnbG9va3VwT25Db250ZXh0JywgcGF0aC5wYXJ0cywgcGF0aC5mYWxzeSwgc2NvcGVkKTtcbiAgICB9XG4gIH0sXG5cbiAgU3RyaW5nTGl0ZXJhbDogZnVuY3Rpb24gU3RyaW5nTGl0ZXJhbChzdHJpbmcpIHtcbiAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZycsIHN0cmluZy52YWx1ZSk7XG4gIH0sXG5cbiAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbChudW1iZXIpIHtcbiAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpO1xuICB9LFxuXG4gIEJvb2xlYW5MaXRlcmFsOiBmdW5jdGlvbiBCb29sZWFuTGl0ZXJhbChib29sKSB7XG4gICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgYm9vbC52YWx1ZSk7XG4gIH0sXG5cbiAgVW5kZWZpbmVkTGl0ZXJhbDogZnVuY3Rpb24gVW5kZWZpbmVkTGl0ZXJhbCgpIHtcbiAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCAndW5kZWZpbmVkJyk7XG4gIH0sXG5cbiAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkge1xuICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICdudWxsJyk7XG4gIH0sXG5cbiAgSGFzaDogZnVuY3Rpb24gSGFzaChoYXNoKSB7XG4gICAgdmFyIHBhaXJzID0gaGFzaC5wYWlycyxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIGwgPSBwYWlycy5sZW5ndGg7XG5cbiAgICB0aGlzLm9wY29kZSgncHVzaEhhc2gnKTtcblxuICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB0aGlzLnB1c2hQYXJhbShwYWlyc1tpXS52YWx1ZSk7XG4gICAgfVxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyc1tpXS5rZXkpO1xuICAgIH1cbiAgICB0aGlzLm9wY29kZSgncG9wSGFzaCcpO1xuICB9LFxuXG4gIC8vIEhFTFBFUlNcbiAgb3Bjb2RlOiBmdW5jdGlvbiBvcGNvZGUobmFtZSkge1xuICAgIHRoaXMub3Bjb2Rlcy5wdXNoKHsgb3Bjb2RlOiBuYW1lLCBhcmdzOiBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSksIGxvYzogdGhpcy5zb3VyY2VOb2RlWzBdLmxvYyB9KTtcbiAgfSxcblxuICBhZGREZXB0aDogZnVuY3Rpb24gYWRkRGVwdGgoZGVwdGgpIHtcbiAgICBpZiAoIWRlcHRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51c2VEZXB0aHMgPSB0cnVlO1xuICB9LFxuXG4gIGNsYXNzaWZ5U2V4cHI6IGZ1bmN0aW9uIGNsYXNzaWZ5U2V4cHIoc2V4cHIpIHtcbiAgICB2YXIgaXNTaW1wbGUgPSBfQVNUMlsnZGVmYXVsdCddLmhlbHBlcnMuc2ltcGxlSWQoc2V4cHIucGF0aCk7XG5cbiAgICB2YXIgaXNCbG9ja1BhcmFtID0gaXNTaW1wbGUgJiYgISF0aGlzLmJsb2NrUGFyYW1JbmRleChzZXhwci5wYXRoLnBhcnRzWzBdKTtcblxuICAgIC8vIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGlmOlxuICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKVxuICAgIHZhciBpc0hlbHBlciA9ICFpc0Jsb2NrUGFyYW0gJiYgX0FTVDJbJ2RlZmF1bHQnXS5oZWxwZXJzLmhlbHBlckV4cHJlc3Npb24oc2V4cHIpO1xuXG4gICAgLy8gaWYgYSBtdXN0YWNoZSBpcyBhbiBlbGlnaWJsZSBoZWxwZXIgYnV0IG5vdCBhIGRlZmluaXRlXG4gICAgLy8gaGVscGVyLCBpdCBpcyBhbWJpZ3VvdXMsIGFuZCB3aWxsIGJlIHJlc29sdmVkIGluIGEgbGF0ZXJcbiAgICAvLyBwYXNzIG9yIGF0IHJ1bnRpbWUuXG4gICAgdmFyIGlzRWxpZ2libGUgPSAhaXNCbG9ja1BhcmFtICYmIChpc0hlbHBlciB8fCBpc1NpbXBsZSk7XG5cbiAgICAvLyBpZiBhbWJpZ3VvdXMsIHdlIGNhbiBwb3NzaWJseSByZXNvbHZlIHRoZSBhbWJpZ3VpdHkgbm93XG4gICAgLy8gQW4gZWxpZ2libGUgaGVscGVyIGlzIG9uZSB0aGF0IGRvZXMgbm90IGhhdmUgYSBjb21wbGV4IHBhdGgsIGkuZS4gYHRoaXMuZm9vYCwgYC4uL2Zvb2AgZXRjLlxuICAgIGlmIChpc0VsaWdpYmxlICYmICFpc0hlbHBlcikge1xuICAgICAgdmFyIF9uYW1lMiA9IHNleHByLnBhdGgucGFydHNbMF0sXG4gICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgICAgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzW19uYW1lMl0pIHtcbiAgICAgICAgaXNIZWxwZXIgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtub3duSGVscGVyc09ubHkpIHtcbiAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0hlbHBlcikge1xuICAgICAgcmV0dXJuICdoZWxwZXInO1xuICAgIH0gZWxzZSBpZiAoaXNFbGlnaWJsZSkge1xuICAgICAgcmV0dXJuICdhbWJpZ3VvdXMnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ3NpbXBsZSc7XG4gICAgfVxuICB9LFxuXG4gIHB1c2hQYXJhbXM6IGZ1bmN0aW9uIHB1c2hQYXJhbXMocGFyYW1zKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJhbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB0aGlzLnB1c2hQYXJhbShwYXJhbXNbaV0pO1xuICAgIH1cbiAgfSxcblxuICBwdXNoUGFyYW06IGZ1bmN0aW9uIHB1c2hQYXJhbSh2YWwpIHtcbiAgICB2YXIgdmFsdWUgPSB2YWwudmFsdWUgIT0gbnVsbCA/IHZhbC52YWx1ZSA6IHZhbC5vcmlnaW5hbCB8fCAnJztcblxuICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykge1xuICAgICAgaWYgKHZhbHVlLnJlcGxhY2UpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eKFxcLj9cXC5cXC8pKi9nLCAnJykucmVwbGFjZSgvXFwvL2csICcuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWwuZGVwdGgpIHtcbiAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCB2YWwuZGVwdGggfHwgMCk7XG4gICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsdWUsIHZhbC50eXBlKTtcblxuICAgICAgaWYgKHZhbC50eXBlID09PSAnU3ViRXhwcmVzc2lvbicpIHtcbiAgICAgICAgLy8gU3ViRXhwcmVzc2lvbnMgZ2V0IGV2YWx1YXRlZCBhbmQgcGFzc2VkIGluXG4gICAgICAgIC8vIGluIHN0cmluZyBwYXJhbXMgbW9kZS5cbiAgICAgICAgdGhpcy5hY2NlcHQodmFsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHtcbiAgICAgICAgdmFyIGJsb2NrUGFyYW1JbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHZhbC5wYXJ0cyAmJiAhX0FTVDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNjb3BlZElkKHZhbCkgJiYgIXZhbC5kZXB0aCkge1xuICAgICAgICAgIGJsb2NrUGFyYW1JbmRleCA9IHRoaXMuYmxvY2tQYXJhbUluZGV4KHZhbC5wYXJ0c1swXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJsb2NrUGFyYW1JbmRleCkge1xuICAgICAgICAgIHZhciBibG9ja1BhcmFtQ2hpbGQgPSB2YWwucGFydHMuc2xpY2UoMSkuam9pbignLicpO1xuICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCAnQmxvY2tQYXJhbScsIGJsb2NrUGFyYW1JbmRleCwgYmxvY2tQYXJhbUNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbC5vcmlnaW5hbCB8fCB2YWx1ZTtcbiAgICAgICAgICBpZiAodmFsdWUucmVwbGFjZSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eXFwuXFwvL2csICcnKS5yZXBsYWNlKC9eXFwuJC9nLCAnJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hJZCcsIHZhbC50eXBlLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuYWNjZXB0KHZhbCk7XG4gICAgfVxuICB9LFxuXG4gIHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbiBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSwgb21pdEVtcHR5KSB7XG4gICAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtcztcbiAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTtcblxuICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pO1xuICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpO1xuXG4gICAgaWYgKHNleHByLmhhc2gpIHtcbiAgICAgIHRoaXMuYWNjZXB0KHNleHByLmhhc2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wY29kZSgnZW1wdHlIYXNoJywgb21pdEVtcHR5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9LFxuXG4gIGJsb2NrUGFyYW1JbmRleDogZnVuY3Rpb24gYmxvY2tQYXJhbUluZGV4KG5hbWUpIHtcbiAgICBmb3IgKHZhciBkZXB0aCA9IDAsIGxlbiA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5sZW5ndGg7IGRlcHRoIDwgbGVuOyBkZXB0aCsrKSB7XG4gICAgICB2YXIgYmxvY2tQYXJhbXMgPSB0aGlzLm9wdGlvbnMuYmxvY2tQYXJhbXNbZGVwdGhdLFxuICAgICAgICAgIHBhcmFtID0gYmxvY2tQYXJhbXMgJiYgX2lzQXJyYXkkaW5kZXhPZi5pbmRleE9mKGJsb2NrUGFyYW1zLCBuYW1lKTtcbiAgICAgIGlmIChibG9ja1BhcmFtcyAmJiBwYXJhbSA+PSAwKSB7XG4gICAgICAgIHJldHVybiBbZGVwdGgsIHBhcmFtXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHByZWNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGVudikge1xuICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykge1xuICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpO1xuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGlmICghKCdkYXRhJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuZGF0YSA9IHRydWU7XG4gIH1cbiAgaWYgKG9wdGlvbnMuY29tcGF0KSB7XG4gICAgb3B0aW9ucy51c2VEZXB0aHMgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGFzdCA9IGVudi5wYXJzZShpbnB1dCwgb3B0aW9ucyksXG4gICAgICBlbnZpcm9ubWVudCA9IG5ldyBlbnYuQ29tcGlsZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBjb21waWxlKGlucHV0LCBfeCwgZW52KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTtcblxuICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykge1xuICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMuY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpO1xuICB9XG5cbiAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTtcbiAgfVxuICBpZiAob3B0aW9ucy5jb21wYXQpIHtcbiAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7XG4gIH1cblxuICB2YXIgY29tcGlsZWQgPSB1bmRlZmluZWQ7XG5cbiAgZnVuY3Rpb24gY29tcGlsZUlucHV0KCkge1xuICAgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLFxuICAgICAgICBlbnZpcm9ubWVudCA9IG5ldyBlbnYuQ29tcGlsZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyksXG4gICAgICAgIHRlbXBsYXRlU3BlYyA9IG5ldyBlbnYuSmF2YVNjcmlwdENvbXBpbGVyKCkuY29tcGlsZShlbnZpcm9ubWVudCwgb3B0aW9ucywgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICByZXR1cm4gZW52LnRlbXBsYXRlKHRlbXBsYXRlU3BlYyk7XG4gIH1cblxuICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuXG4gIGZ1bmN0aW9uIHJldChjb250ZXh0LCBleGVjT3B0aW9ucykge1xuICAgIGlmICghY29tcGlsZWQpIHtcbiAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7XG4gICAgfVxuICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIGV4ZWNPcHRpb25zKTtcbiAgfVxuICByZXQuX3NldHVwID0gZnVuY3Rpb24gKHNldHVwT3B0aW9ucykge1xuICAgIGlmICghY29tcGlsZWQpIHtcbiAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7XG4gICAgfVxuICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTtcbiAgfTtcbiAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gICAgaWYgKCFjb21waWxlZCkge1xuICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBpbGVkLl9jaGlsZChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gYXJnRXF1YWxzKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChfaXNBcnJheSRpbmRleE9mLmlzQXJyYXkoYSkgJiYgX2lzQXJyYXkkaW5kZXhPZi5pc0FycmF5KGIpICYmIGEubGVuZ3RoID09PSBiLmxlbmd0aCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFhcmdFcXVhbHMoYVtpXSwgYltpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKSB7XG4gIGlmICghc2V4cHIucGF0aC5wYXJ0cykge1xuICAgIHZhciBsaXRlcmFsID0gc2V4cHIucGF0aDtcbiAgICAvLyBDYXN0aW5nIHRvIHN0cmluZyBoZXJlIHRvIG1ha2UgZmFsc2UgYW5kIDAgbGl0ZXJhbCB2YWx1ZXMgcGxheSBuaWNlbHkgd2l0aCB0aGUgcmVzdFxuICAgIC8vIG9mIHRoZSBzeXN0ZW0uXG4gICAgc2V4cHIucGF0aCA9IG5ldyBfQVNUMlsnZGVmYXVsdCddLlBhdGhFeHByZXNzaW9uKGZhbHNlLCAwLCBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSwgbGl0ZXJhbC5vcmlnaW5hbCArICcnLCBsaXRlcmFsLmxvYyk7XG4gIH1cbn0iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjtcbmV4cG9ydHMuaWQgPSBpZDtcbmV4cG9ydHMuc3RyaXBGbGFncyA9IHN0cmlwRmxhZ3M7XG5leHBvcnRzLnN0cmlwQ29tbWVudCA9IHN0cmlwQ29tbWVudDtcbmV4cG9ydHMucHJlcGFyZVBhdGggPSBwcmVwYXJlUGF0aDtcbmV4cG9ydHMucHJlcGFyZU11c3RhY2hlID0gcHJlcGFyZU11c3RhY2hlO1xuZXhwb3J0cy5wcmVwYXJlUmF3QmxvY2sgPSBwcmVwYXJlUmF3QmxvY2s7XG5leHBvcnRzLnByZXBhcmVCbG9jayA9IHByZXBhcmVCbG9jaztcblxudmFyIF9FeGNlcHRpb24gPSByZXF1aXJlKCcuLi9leGNlcHRpb24nKTtcblxudmFyIF9FeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0V4Y2VwdGlvbik7XG5cbmZ1bmN0aW9uIFNvdXJjZUxvY2F0aW9uKHNvdXJjZSwgbG9jSW5mbykge1xuICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgdGhpcy5zdGFydCA9IHtcbiAgICBsaW5lOiBsb2NJbmZvLmZpcnN0X2xpbmUsXG4gICAgY29sdW1uOiBsb2NJbmZvLmZpcnN0X2NvbHVtblxuICB9O1xuICB0aGlzLmVuZCA9IHtcbiAgICBsaW5lOiBsb2NJbmZvLmxhc3RfbGluZSxcbiAgICBjb2x1bW46IGxvY0luZm8ubGFzdF9jb2x1bW5cbiAgfTtcbn1cblxuZnVuY3Rpb24gaWQodG9rZW4pIHtcbiAgaWYgKC9eXFxbLipcXF0kLy50ZXN0KHRva2VuKSkge1xuICAgIHJldHVybiB0b2tlbi5zdWJzdHIoMSwgdG9rZW4ubGVuZ3RoIC0gMik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmlwRmxhZ3Mob3BlbiwgY2xvc2UpIHtcbiAgcmV0dXJuIHtcbiAgICBvcGVuOiBvcGVuLmNoYXJBdCgyKSA9PT0gJ34nLFxuICAgIGNsb3NlOiBjbG9zZS5jaGFyQXQoY2xvc2UubGVuZ3RoIC0gMykgPT09ICd+J1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHJpcENvbW1lbnQoY29tbWVudCkge1xuICByZXR1cm4gY29tbWVudC5yZXBsYWNlKC9eXFx7XFx7fj9cXCEtPy0/LywgJycpLnJlcGxhY2UoLy0/LT9+P1xcfVxcfSQvLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVQYXRoKGRhdGEsIHBhcnRzLCBsb2NJbmZvKSB7XG4gIGxvY0luZm8gPSB0aGlzLmxvY0luZm8obG9jSW5mbyk7XG5cbiAgdmFyIG9yaWdpbmFsID0gZGF0YSA/ICdAJyA6ICcnLFxuICAgICAgZGlnID0gW10sXG4gICAgICBkZXB0aCA9IDAsXG4gICAgICBkZXB0aFN0cmluZyA9ICcnO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gcGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIHBhcnQgPSBwYXJ0c1tpXS5wYXJ0LFxuXG4gICAgLy8gSWYgd2UgaGF2ZSBbXSBzeW50YXggdGhlbiB3ZSBkbyBub3QgdHJlYXQgcGF0aCByZWZlcmVuY2VzIGFzIG9wZXJhdG9ycyxcbiAgICAvLyBpLmUuIGZvby5bdGhpc10gcmVzb2x2ZXMgdG8gYXBwcm94aW1hdGVseSBjb250ZXh0LmZvb1sndGhpcyddXG4gICAgaXNMaXRlcmFsID0gcGFydHNbaV0ub3JpZ2luYWwgIT09IHBhcnQ7XG4gICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNlcGFyYXRvciB8fCAnJykgKyBwYXJ0O1xuXG4gICAgaWYgKCFpc0xpdGVyYWwgJiYgKHBhcnQgPT09ICcuLicgfHwgcGFydCA9PT0gJy4nIHx8IHBhcnQgPT09ICd0aGlzJykpIHtcbiAgICAgIGlmIChkaWcubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnSW52YWxpZCBwYXRoOiAnICsgb3JpZ2luYWwsIHsgbG9jOiBsb2NJbmZvIH0pO1xuICAgICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICAgIGRlcHRoU3RyaW5nICs9ICcuLi8nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkaWcucHVzaChwYXJ0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IHRoaXMuUGF0aEV4cHJlc3Npb24oZGF0YSwgZGVwdGgsIGRpZywgb3JpZ2luYWwsIGxvY0luZm8pO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlTXVzdGFjaGUocGF0aCwgcGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykge1xuICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTBcbiAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKSxcbiAgICAgIGVzY2FwZWQgPSBlc2NhcGVGbGFnICE9PSAneycgJiYgZXNjYXBlRmxhZyAhPT0gJyYnO1xuXG4gIHJldHVybiBuZXcgdGhpcy5NdXN0YWNoZVN0YXRlbWVudChwYXRoLCBwYXJhbXMsIGhhc2gsIGVzY2FwZWQsIHN0cmlwLCB0aGlzLmxvY0luZm8obG9jSW5mbykpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlUmF3QmxvY2sob3BlblJhd0Jsb2NrLCBjb250ZW50LCBjbG9zZSwgbG9jSW5mbykge1xuICBpZiAob3BlblJhd0Jsb2NrLnBhdGgub3JpZ2luYWwgIT09IGNsb3NlKSB7XG4gICAgdmFyIGVycm9yTm9kZSA9IHsgbG9jOiBvcGVuUmF3QmxvY2sucGF0aC5sb2MgfTtcblxuICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKG9wZW5SYXdCbG9jay5wYXRoLm9yaWdpbmFsICsgJyBkb2VzblxcJ3QgbWF0Y2ggJyArIGNsb3NlLCBlcnJvck5vZGUpO1xuICB9XG5cbiAgbG9jSW5mbyA9IHRoaXMubG9jSW5mbyhsb2NJbmZvKTtcbiAgdmFyIHByb2dyYW0gPSBuZXcgdGhpcy5Qcm9ncmFtKFtjb250ZW50XSwgbnVsbCwge30sIGxvY0luZm8pO1xuXG4gIHJldHVybiBuZXcgdGhpcy5CbG9ja1N0YXRlbWVudChvcGVuUmF3QmxvY2sucGF0aCwgb3BlblJhd0Jsb2NrLnBhcmFtcywgb3BlblJhd0Jsb2NrLmhhc2gsIHByb2dyYW0sIHVuZGVmaW5lZCwge30sIHt9LCB7fSwgbG9jSW5mbyk7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVCbG9jayhvcGVuQmxvY2ssIHByb2dyYW0sIGludmVyc2VBbmRQcm9ncmFtLCBjbG9zZSwgaW52ZXJ0ZWQsIGxvY0luZm8pIHtcbiAgLy8gV2hlbiB3ZSBhcmUgY2hhaW5pbmcgaW52ZXJzZSBjYWxscywgd2Ugd2lsbCBub3QgaGF2ZSBhIGNsb3NlIHBhdGhcbiAgaWYgKGNsb3NlICYmIGNsb3NlLnBhdGggJiYgb3BlbkJsb2NrLnBhdGgub3JpZ2luYWwgIT09IGNsb3NlLnBhdGgub3JpZ2luYWwpIHtcbiAgICB2YXIgZXJyb3JOb2RlID0geyBsb2M6IG9wZW5CbG9jay5wYXRoLmxvYyB9O1xuXG4gICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10ob3BlbkJsb2NrLnBhdGgub3JpZ2luYWwgKyAnIGRvZXNuXFwndCBtYXRjaCAnICsgY2xvc2UucGF0aC5vcmlnaW5hbCwgZXJyb3JOb2RlKTtcbiAgfVxuXG4gIHByb2dyYW0uYmxvY2tQYXJhbXMgPSBvcGVuQmxvY2suYmxvY2tQYXJhbXM7XG5cbiAgdmFyIGludmVyc2UgPSB1bmRlZmluZWQsXG4gICAgICBpbnZlcnNlU3RyaXAgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKGludmVyc2VBbmRQcm9ncmFtKSB7XG4gICAgaWYgKGludmVyc2VBbmRQcm9ncmFtLmNoYWluKSB7XG4gICAgICBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtLmJvZHlbMF0uY2xvc2VTdHJpcCA9IGNsb3NlLnN0cmlwO1xuICAgIH1cblxuICAgIGludmVyc2VTdHJpcCA9IGludmVyc2VBbmRQcm9ncmFtLnN0cmlwO1xuICAgIGludmVyc2UgPSBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtO1xuICB9XG5cbiAgaWYgKGludmVydGVkKSB7XG4gICAgaW52ZXJ0ZWQgPSBpbnZlcnNlO1xuICAgIGludmVyc2UgPSBwcm9ncmFtO1xuICAgIHByb2dyYW0gPSBpbnZlcnRlZDtcbiAgfVxuXG4gIHJldHVybiBuZXcgdGhpcy5CbG9ja1N0YXRlbWVudChvcGVuQmxvY2sucGF0aCwgb3BlbkJsb2NrLnBhcmFtcywgb3BlbkJsb2NrLmhhc2gsIHByb2dyYW0sIGludmVyc2UsIG9wZW5CbG9jay5zdHJpcCwgaW52ZXJzZVN0cmlwLCBjbG9zZSAmJiBjbG9zZS5zdHJpcCwgdGhpcy5sb2NJbmZvKGxvY0luZm8pKTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9DT01QSUxFUl9SRVZJU0lPTiRSRVZJU0lPTl9DSEFOR0VTID0gcmVxdWlyZSgnLi4vYmFzZScpO1xuXG52YXIgX0V4Y2VwdGlvbiA9IHJlcXVpcmUoJy4uL2V4Y2VwdGlvbicpO1xuXG52YXIgX0V4Y2VwdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfRXhjZXB0aW9uKTtcblxudmFyIF9pc0FycmF5ID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxudmFyIF9Db2RlR2VuID0gcmVxdWlyZSgnLi9jb2RlLWdlbicpO1xuXG52YXIgX0NvZGVHZW4yID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0NvZGVHZW4pO1xuXG5mdW5jdGlvbiBMaXRlcmFsKHZhbHVlKSB7XG4gIHRoaXMudmFsdWUgPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gSmF2YVNjcmlwdENvbXBpbGVyKCkge31cblxuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZSA9IHtcbiAgLy8gUFVCTElDIEFQSTogWW91IGNhbiBvdmVycmlkZSB0aGVzZSBtZXRob2RzIGluIGEgc3ViY2xhc3MgdG8gcHJvdmlkZVxuICAvLyBhbHRlcm5hdGl2ZSBjb21waWxlZCBmb3JtcyBmb3IgbmFtZSBsb29rdXAgYW5kIGJ1ZmZlcmluZyBzZW1hbnRpY3NcbiAgbmFtZUxvb2t1cDogZnVuY3Rpb24gbmFtZUxvb2t1cChwYXJlbnQsIG5hbWUgLyogLCB0eXBlKi8pIHtcbiAgICBpZiAoSmF2YVNjcmlwdENvbXBpbGVyLmlzVmFsaWRKYXZhU2NyaXB0VmFyaWFibGVOYW1lKG5hbWUpKSB7XG4gICAgICByZXR1cm4gW3BhcmVudCwgJy4nLCBuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtwYXJlbnQsICdbXFwnJywgbmFtZSwgJ1xcJ10nXTtcbiAgICB9XG4gIH0sXG4gIGRlcHRoZWRMb29rdXA6IGZ1bmN0aW9uIGRlcHRoZWRMb29rdXAobmFtZSkge1xuICAgIHJldHVybiBbdGhpcy5hbGlhc2FibGUoJ3RoaXMubG9va3VwJyksICcoZGVwdGhzLCBcIicsIG5hbWUsICdcIiknXTtcbiAgfSxcblxuICBjb21waWxlckluZm86IGZ1bmN0aW9uIGNvbXBpbGVySW5mbygpIHtcbiAgICB2YXIgcmV2aXNpb24gPSBfQ09NUElMRVJfUkVWSVNJT04kUkVWSVNJT05fQ0hBTkdFUy5DT01QSUxFUl9SRVZJU0lPTixcbiAgICAgICAgdmVyc2lvbnMgPSBfQ09NUElMRVJfUkVWSVNJT04kUkVWSVNJT05fQ0hBTkdFUy5SRVZJU0lPTl9DSEFOR0VTW3JldmlzaW9uXTtcbiAgICByZXR1cm4gW3JldmlzaW9uLCB2ZXJzaW9uc107XG4gIH0sXG5cbiAgYXBwZW5kVG9CdWZmZXI6IGZ1bmN0aW9uIGFwcGVuZFRvQnVmZmVyKHNvdXJjZSwgbG9jYXRpb24sIGV4cGxpY2l0KSB7XG4gICAgLy8gRm9yY2UgYSBzb3VyY2UgYXMgdGhpcyBzaW1wbGlmaWVzIHRoZSBtZXJnZSBsb2dpYy5cbiAgICBpZiAoIV9pc0FycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgc291cmNlID0gW3NvdXJjZV07XG4gICAgfVxuICAgIHNvdXJjZSA9IHRoaXMuc291cmNlLndyYXAoc291cmNlLCBsb2NhdGlvbik7XG5cbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudC5pc1NpbXBsZSkge1xuICAgICAgcmV0dXJuIFsncmV0dXJuICcsIHNvdXJjZSwgJzsnXTtcbiAgICB9IGVsc2UgaWYgKGV4cGxpY2l0KSB7XG4gICAgICAvLyBUaGlzIGlzIGEgY2FzZSB3aGVyZSB0aGUgYnVmZmVyIG9wZXJhdGlvbiBvY2N1cnMgYXMgYSBjaGlsZCBvZiBhbm90aGVyXG4gICAgICAvLyBjb25zdHJ1Y3QsIGdlbmVyYWxseSBicmFjZXMuIFdlIGhhdmUgdG8gZXhwbGljaXRseSBvdXRwdXQgdGhlc2UgYnVmZmVyXG4gICAgICAvLyBvcGVyYXRpb25zIHRvIGVuc3VyZSB0aGF0IHRoZSBlbWl0dGVkIGNvZGUgZ29lcyBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbi5cbiAgICAgIHJldHVybiBbJ2J1ZmZlciArPSAnLCBzb3VyY2UsICc7J107XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZS5hcHBlbmRUb0J1ZmZlciA9IHRydWU7XG4gICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgfSxcblxuICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbiBpbml0aWFsaXplQnVmZmVyKCkge1xuICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygnJyk7XG4gIH0sXG4gIC8vIEVORCBQVUJMSUMgQVBJXG5cbiAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShlbnZpcm9ubWVudCwgb3B0aW9ucywgY29udGV4dCwgYXNPYmplY3QpIHtcbiAgICB0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnN0cmluZ1BhcmFtcyA9IHRoaXMub3B0aW9ucy5zdHJpbmdQYXJhbXM7XG4gICAgdGhpcy50cmFja0lkcyA9IHRoaXMub3B0aW9ucy50cmFja0lkcztcbiAgICB0aGlzLnByZWNvbXBpbGUgPSAhYXNPYmplY3Q7XG5cbiAgICB0aGlzLm5hbWUgPSB0aGlzLmVudmlyb25tZW50Lm5hbWU7XG4gICAgdGhpcy5pc0NoaWxkID0gISFjb250ZXh0O1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQgfHwge1xuICAgICAgcHJvZ3JhbXM6IFtdLFxuICAgICAgZW52aXJvbm1lbnRzOiBbXVxuICAgIH07XG5cbiAgICB0aGlzLnByZWFtYmxlKCk7XG5cbiAgICB0aGlzLnN0YWNrU2xvdCA9IDA7XG4gICAgdGhpcy5zdGFja1ZhcnMgPSBbXTtcbiAgICB0aGlzLmFsaWFzZXMgPSB7fTtcbiAgICB0aGlzLnJlZ2lzdGVycyA9IHsgbGlzdDogW10gfTtcbiAgICB0aGlzLmhhc2hlcyA9IFtdO1xuICAgIHRoaXMuY29tcGlsZVN0YWNrID0gW107XG4gICAgdGhpcy5pbmxpbmVTdGFjayA9IFtdO1xuICAgIHRoaXMuYmxvY2tQYXJhbXMgPSBbXTtcblxuICAgIHRoaXMuY29tcGlsZUNoaWxkcmVuKGVudmlyb25tZW50LCBvcHRpb25zKTtcblxuICAgIHRoaXMudXNlRGVwdGhzID0gdGhpcy51c2VEZXB0aHMgfHwgZW52aXJvbm1lbnQudXNlRGVwdGhzIHx8IHRoaXMub3B0aW9ucy5jb21wYXQ7XG4gICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgZW52aXJvbm1lbnQudXNlQmxvY2tQYXJhbXM7XG5cbiAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsXG4gICAgICAgIG9wY29kZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgZmlyc3RMb2MgPSB1bmRlZmluZWQsXG4gICAgICAgIGkgPSB1bmRlZmluZWQsXG4gICAgICAgIGwgPSB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGkgPSAwLCBsID0gb3Bjb2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIG9wY29kZSA9IG9wY29kZXNbaV07XG5cbiAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IG9wY29kZS5sb2M7XG4gICAgICBmaXJzdExvYyA9IGZpcnN0TG9jIHx8IG9wY29kZS5sb2M7XG4gICAgICB0aGlzW29wY29kZS5vcGNvZGVdLmFwcGx5KHRoaXMsIG9wY29kZS5hcmdzKTtcbiAgICB9XG5cbiAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuXG4gICAgdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uID0gZmlyc3RMb2M7XG4gICAgdGhpcy5wdXNoU291cmNlKCcnKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuc3RhY2tTbG90IHx8IHRoaXMuaW5saW5lU3RhY2subGVuZ3RoIHx8IHRoaXMuY29tcGlsZVN0YWNrLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ0NvbXBpbGUgY29tcGxldGVkIHdpdGggY29udGVudCBsZWZ0IG9uIHN0YWNrJyk7XG4gICAgfVxuXG4gICAgdmFyIGZuID0gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpO1xuICAgIGlmICghdGhpcy5pc0NoaWxkKSB7XG4gICAgICB2YXIgcmV0ID0ge1xuICAgICAgICBjb21waWxlcjogdGhpcy5jb21waWxlckluZm8oKSxcbiAgICAgICAgbWFpbjogZm5cbiAgICAgIH07XG4gICAgICB2YXIgcHJvZ3JhbXMgPSB0aGlzLmNvbnRleHQucHJvZ3JhbXM7XG4gICAgICBmb3IgKGkgPSAwLCBsID0gcHJvZ3JhbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChwcm9ncmFtc1tpXSkge1xuICAgICAgICAgIHJldFtpXSA9IHByb2dyYW1zW2ldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmVudmlyb25tZW50LnVzZVBhcnRpYWwpIHtcbiAgICAgICAgcmV0LnVzZVBhcnRpYWwgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7XG4gICAgICAgIHJldC51c2VEYXRhID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnVzZURlcHRocykge1xuICAgICAgICByZXQudXNlRGVwdGhzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zKSB7XG4gICAgICAgIHJldC51c2VCbG9ja1BhcmFtcyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhdCkge1xuICAgICAgICByZXQuY29tcGF0ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhc09iamVjdCkge1xuICAgICAgICByZXQuY29tcGlsZXIgPSBKU09OLnN0cmluZ2lmeShyZXQuY29tcGlsZXIpO1xuXG4gICAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IHsgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAwIH0gfTtcbiAgICAgICAgcmV0ID0gdGhpcy5vYmplY3RMaXRlcmFsKHJldCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc3JjTmFtZSkge1xuICAgICAgICAgIHJldCA9IHJldC50b1N0cmluZ1dpdGhTb3VyY2VNYXAoeyBmaWxlOiBvcHRpb25zLmRlc3ROYW1lIH0pO1xuICAgICAgICAgIHJldC5tYXAgPSByZXQubWFwICYmIHJldC5tYXAudG9TdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgPSByZXQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0LmNvbXBpbGVyT3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZuO1xuICAgIH1cbiAgfSxcblxuICBwcmVhbWJsZTogZnVuY3Rpb24gcHJlYW1ibGUoKSB7XG4gICAgLy8gdHJhY2sgdGhlIGxhc3QgY29udGV4dCBwdXNoZWQgaW50byBwbGFjZSB0byBhbGxvdyBza2lwcGluZyB0aGVcbiAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcFxuICAgIHRoaXMubGFzdENvbnRleHQgPSAwO1xuICAgIHRoaXMuc291cmNlID0gbmV3IF9Db2RlR2VuMlsnZGVmYXVsdCddKHRoaXMub3B0aW9ucy5zcmNOYW1lKTtcbiAgfSxcblxuICBjcmVhdGVGdW5jdGlvbkNvbnRleHQ6IGZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uQ29udGV4dChhc09iamVjdCkge1xuICAgIHZhciB2YXJEZWNsYXJhdGlvbnMgPSAnJztcblxuICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7XG4gICAgaWYgKGxvY2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgJyArIGxvY2Fscy5qb2luKCcsICcpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIG1pbmltaXplciBhbGlhcyBtYXBwaW5nc1xuICAgIC8vXG4gICAgLy8gV2hlbiB1c2luZyB0cnVlIFNvdXJjZU5vZGVzLCB0aGlzIHdpbGwgdXBkYXRlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbiBhbGlhc1xuICAgIC8vIGFzIHRoZSBzb3VyY2Ugbm9kZXMgYXJlIHJldXNlZCBpbiBzaXR1LiBGb3IgdGhlIG5vbi1zb3VyY2Ugbm9kZSBjb21waWxhdGlvbiBtb2RlLFxuICAgIC8vIGFsaWFzZXMgd2lsbCBub3QgYmUgdXNlZCwgYnV0IHRoaXMgY2FzZSBpcyBhbHJlYWR5IGJlaW5nIHJ1biBvbiB0aGUgY2xpZW50IGFuZFxuICAgIC8vIHdlIGFyZW4ndCBjb25jZXJuIGFib3V0IG1pbmltaXppbmcgdGhlIHRlbXBsYXRlIHNpemUuXG4gICAgdmFyIGFsaWFzQ291bnQgPSAwO1xuICAgIGZvciAodmFyIGFsaWFzIGluIHRoaXMuYWxpYXNlcykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBndWFyZC1mb3ItaW5cbiAgICAgIHZhciBub2RlID0gdGhpcy5hbGlhc2VzW2FsaWFzXTtcblxuICAgICAgaWYgKHRoaXMuYWxpYXNlcy5oYXNPd25Qcm9wZXJ0eShhbGlhcykgJiYgbm9kZS5jaGlsZHJlbiAmJiBub2RlLnJlZmVyZW5jZUNvdW50ID4gMSkge1xuICAgICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgYWxpYXMnICsgKythbGlhc0NvdW50ICsgJz0nICsgYWxpYXM7XG4gICAgICAgIG5vZGUuY2hpbGRyZW5bMF0gPSAnYWxpYXMnICsgYWxpYXNDb3VudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcGFyYW1zID0gWydkZXB0aDAnLCAnaGVscGVycycsICdwYXJ0aWFscycsICdkYXRhJ107XG5cbiAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykge1xuICAgICAgcGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnVzZURlcHRocykge1xuICAgICAgcGFyYW1zLnB1c2goJ2RlcHRocycpO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gYSBzZWNvbmQgcGFzcyBvdmVyIHRoZSBvdXRwdXQgdG8gbWVyZ2UgY29udGVudCB3aGVuIHBvc3NpYmxlXG4gICAgdmFyIHNvdXJjZSA9IHRoaXMubWVyZ2VTb3VyY2UodmFyRGVjbGFyYXRpb25zKTtcblxuICAgIGlmIChhc09iamVjdCkge1xuICAgICAgcGFyYW1zLnB1c2goc291cmNlKTtcblxuICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnNvdXJjZS53cmFwKFsnZnVuY3Rpb24oJywgcGFyYW1zLmpvaW4oJywnKSwgJykge1xcbiAgJywgc291cmNlLCAnfSddKTtcbiAgICB9XG4gIH0sXG4gIG1lcmdlU291cmNlOiBmdW5jdGlvbiBtZXJnZVNvdXJjZSh2YXJEZWNsYXJhdGlvbnMpIHtcbiAgICB2YXIgaXNTaW1wbGUgPSB0aGlzLmVudmlyb25tZW50LmlzU2ltcGxlLFxuICAgICAgICBhcHBlbmRPbmx5ID0gIXRoaXMuZm9yY2VCdWZmZXIsXG4gICAgICAgIGFwcGVuZEZpcnN0ID0gdW5kZWZpbmVkLFxuICAgICAgICBzb3VyY2VTZWVuID0gdW5kZWZpbmVkLFxuICAgICAgICBidWZmZXJTdGFydCA9IHVuZGVmaW5lZCxcbiAgICAgICAgYnVmZmVyRW5kID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc291cmNlLmVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIGlmIChsaW5lLmFwcGVuZFRvQnVmZmVyKSB7XG4gICAgICAgIGlmIChidWZmZXJTdGFydCkge1xuICAgICAgICAgIGxpbmUucHJlcGVuZCgnICArICcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1ZmZlclN0YXJ0ID0gbGluZTtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXJFbmQgPSBsaW5lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7XG4gICAgICAgICAgaWYgKCFzb3VyY2VTZWVuKSB7XG4gICAgICAgICAgICBhcHBlbmRGaXJzdCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZmZlclN0YXJ0LnByZXBlbmQoJ2J1ZmZlciArPSAnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnVmZmVyRW5kLmFkZCgnOycpO1xuICAgICAgICAgIGJ1ZmZlclN0YXJ0ID0gYnVmZmVyRW5kID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgc291cmNlU2VlbiA9IHRydWU7XG4gICAgICAgIGlmICghaXNTaW1wbGUpIHtcbiAgICAgICAgICBhcHBlbmRPbmx5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChhcHBlbmRPbmx5KSB7XG4gICAgICBpZiAoYnVmZmVyU3RhcnQpIHtcbiAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuICcpO1xuICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7XG4gICAgICB9IGVsc2UgaWYgKCFzb3VyY2VTZWVuKSB7XG4gICAgICAgIHRoaXMuc291cmNlLnB1c2goJ3JldHVybiBcIlwiOycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgYnVmZmVyID0gJyArIChhcHBlbmRGaXJzdCA/ICcnIDogdGhpcy5pbml0aWFsaXplQnVmZmVyKCkpO1xuXG4gICAgICBpZiAoYnVmZmVyU3RhcnQpIHtcbiAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuIGJ1ZmZlciArICcpO1xuICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gYnVmZmVyOycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YXJEZWNsYXJhdGlvbnMpIHtcbiAgICAgIHRoaXMuc291cmNlLnByZXBlbmQoJ3ZhciAnICsgdmFyRGVjbGFyYXRpb25zLnN1YnN0cmluZygyKSArIChhcHBlbmRGaXJzdCA/ICcnIDogJztcXG4nKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc291cmNlLm1lcmdlKCk7XG4gIH0sXG5cbiAgLy8gW2Jsb2NrVmFsdWVdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHZhbHVlXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogcmV0dXJuIHZhbHVlIG9mIGJsb2NrSGVscGVyTWlzc2luZ1xuICAvL1xuICAvLyBUaGUgcHVycG9zZSBvZiB0aGlzIG9wY29kZSBpcyB0byB0YWtlIGEgYmxvY2sgb2YgdGhlIGZvcm1cbiAgLy8gYHt7I3RoaXMuZm9vfX0uLi57ey90aGlzLmZvb319YCwgcmVzb2x2ZSB0aGUgdmFsdWUgb2YgYGZvb2AsIGFuZFxuICAvLyByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayB3aXRoIHRoZSByZXN1bHQgb2YgcHJvcGVybHlcbiAgLy8gaW52b2tpbmcgYmxvY2tIZWxwZXJNaXNzaW5nLlxuICBibG9ja1ZhbHVlOiBmdW5jdGlvbiBibG9ja1ZhbHVlKG5hbWUpIHtcbiAgICB2YXIgYmxvY2tIZWxwZXJNaXNzaW5nID0gdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJyksXG4gICAgICAgIHBhcmFtcyA9IFt0aGlzLmNvbnRleHROYW1lKDApXTtcbiAgICB0aGlzLnNldHVwSGVscGVyQXJncyhuYW1lLCAwLCBwYXJhbXMpO1xuXG4gICAgdmFyIGJsb2NrTmFtZSA9IHRoaXMucG9wU3RhY2soKTtcbiAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGJsb2NrTmFtZSk7XG5cbiAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpKTtcbiAgfSxcblxuICAvLyBbYW1iaWd1b3VzQmxvY2tWYWx1ZV1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWVcbiAgLy8gQ29tcGlsZXIgdmFsdWUsIGJlZm9yZTogbGFzdEhlbHBlcj12YWx1ZSBvZiBsYXN0IGZvdW5kIGhlbHBlciwgaWYgYW55XG4gIC8vIE9uIHN0YWNrLCBhZnRlciwgaWYgbm8gbGFzdEhlbHBlcjogc2FtZSBhcyBbYmxvY2tWYWx1ZV1cbiAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBsYXN0SGVscGVyOiB2YWx1ZVxuICBhbWJpZ3VvdXNCbG9ja1ZhbHVlOiBmdW5jdGlvbiBhbWJpZ3VvdXNCbG9ja1ZhbHVlKCkge1xuICAgIC8vIFdlJ3JlIGJlaW5nIGEgYml0IGNoZWVreSBhbmQgcmV1c2luZyB0aGUgb3B0aW9ucyB2YWx1ZSBmcm9tIHRoZSBwcmlvciBleGVjXG4gICAgdmFyIGJsb2NrSGVscGVyTWlzc2luZyA9IHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZycpLFxuICAgICAgICBwYXJhbXMgPSBbdGhpcy5jb250ZXh0TmFtZSgwKV07XG4gICAgdGhpcy5zZXR1cEhlbHBlckFyZ3MoJycsIDAsIHBhcmFtcywgdHJ1ZSk7XG5cbiAgICB0aGlzLmZsdXNoSW5saW5lKCk7XG5cbiAgICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTtcbiAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpO1xuXG4gICAgdGhpcy5wdXNoU291cmNlKFsnaWYgKCEnLCB0aGlzLmxhc3RIZWxwZXIsICcpIHsgJywgY3VycmVudCwgJyA9ICcsIHRoaXMuc291cmNlLmZ1bmN0aW9uQ2FsbChibG9ja0hlbHBlck1pc3NpbmcsICdjYWxsJywgcGFyYW1zKSwgJ30nXSk7XG4gIH0sXG5cbiAgLy8gW2FwcGVuZENvbnRlbnRdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLlxuICAvL1xuICAvLyBBcHBlbmRzIHRoZSBzdHJpbmcgdmFsdWUgb2YgYGNvbnRlbnRgIHRvIHRoZSBjdXJyZW50IGJ1ZmZlclxuICBhcHBlbmRDb250ZW50OiBmdW5jdGlvbiBhcHBlbmRDb250ZW50KGNvbnRlbnQpIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkge1xuICAgICAgY29udGVudCA9IHRoaXMucGVuZGluZ0NvbnRlbnQgKyBjb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBlbmRpbmdMb2NhdGlvbiA9IHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbjtcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gY29udGVudDtcbiAgfSxcblxuICAvLyBbYXBwZW5kXVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uXG4gIC8vXG4gIC8vIENvZXJjZXMgYHZhbHVlYCB0byBhIFN0cmluZyBhbmQgYXBwZW5kcyBpdCB0byB0aGUgY3VycmVudCBidWZmZXIuXG4gIC8vXG4gIC8vIElmIGB2YWx1ZWAgaXMgdHJ1dGh5LCBvciAwLCBpdCBpcyBjb2VyY2VkIGludG8gYSBzdHJpbmcgYW5kIGFwcGVuZGVkXG4gIC8vIE90aGVyd2lzZSwgdGhlIGVtcHR5IHN0cmluZyBpcyBhcHBlbmRlZFxuICBhcHBlbmQ6IGZ1bmN0aW9uIGFwcGVuZCgpIHtcbiAgICBpZiAodGhpcy5pc0lubGluZSgpKSB7XG4gICAgICB0aGlzLnJlcGxhY2VTdGFjayhmdW5jdGlvbiAoY3VycmVudCkge1xuICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGN1cnJlbnQsICcgOiBcIlwiJ107XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5wdXNoU291cmNlKHRoaXMuYXBwZW5kVG9CdWZmZXIodGhpcy5wb3BTdGFjaygpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsb2NhbCA9IHRoaXMucG9wU3RhY2soKTtcbiAgICAgIHRoaXMucHVzaFNvdXJjZShbJ2lmICgnLCBsb2NhbCwgJyAhPSBudWxsKSB7ICcsIHRoaXMuYXBwZW5kVG9CdWZmZXIobG9jYWwsIHVuZGVmaW5lZCwgdHJ1ZSksICcgfSddKTtcbiAgICAgIGlmICh0aGlzLmVudmlyb25tZW50LmlzU2ltcGxlKSB7XG4gICAgICAgIHRoaXMucHVzaFNvdXJjZShbJ2Vsc2UgeyAnLCB0aGlzLmFwcGVuZFRvQnVmZmVyKCdcXCdcXCcnLCB1bmRlZmluZWQsIHRydWUpLCAnIH0nXSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIFthcHBlbmRFc2NhcGVkXVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uXG4gIC8vXG4gIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlclxuICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbiBhcHBlbmRFc2NhcGVkKCkge1xuICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZSgndGhpcy5lc2NhcGVFeHByZXNzaW9uJyksICcoJywgdGhpcy5wb3BTdGFjaygpLCAnKSddKSk7XG4gIH0sXG5cbiAgLy8gW2dldENvbnRleHRdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLlxuICAvLyBDb21waWxlciB2YWx1ZSwgYWZ0ZXI6IGxhc3RDb250ZXh0PWRlcHRoXG4gIC8vXG4gIC8vIFNldCB0aGUgdmFsdWUgb2YgdGhlIGBsYXN0Q29udGV4dGAgY29tcGlsZXIgdmFsdWUgdG8gdGhlIGRlcHRoXG4gIGdldENvbnRleHQ6IGZ1bmN0aW9uIGdldENvbnRleHQoZGVwdGgpIHtcbiAgICB0aGlzLmxhc3RDb250ZXh0ID0gZGVwdGg7XG4gIH0sXG5cbiAgLy8gW3B1c2hDb250ZXh0XVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uXG4gIC8vXG4gIC8vIFB1c2hlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBvbnRvIHRoZSBzdGFjay5cbiAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uIHB1c2hDb250ZXh0KCkge1xuICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLmNvbnRleHROYW1lKHRoaXMubGFzdENvbnRleHQpKTtcbiAgfSxcblxuICAvLyBbbG9va3VwT25Db250ZXh0XVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dFtuYW1lXSwgLi4uXG4gIC8vXG4gIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgbmFtZWAgb24gdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgcHVzaGVzXG4gIC8vIGl0IG9udG8gdGhlIHN0YWNrLlxuICBsb29rdXBPbkNvbnRleHQ6IGZ1bmN0aW9uIGxvb2t1cE9uQ29udGV4dChwYXJ0cywgZmFsc3ksIHNjb3BlZCkge1xuICAgIHZhciBpID0gMDtcblxuICAgIGlmICghc2NvcGVkICYmIHRoaXMub3B0aW9ucy5jb21wYXQgJiYgIXRoaXMubGFzdENvbnRleHQpIHtcbiAgICAgIC8vIFRoZSBkZXB0aGVkIHF1ZXJ5IGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGUgdW5kZWZpbmVkIGxvZ2ljIGZvciB0aGUgcm9vdCBsZXZlbCB0aGF0XG4gICAgICAvLyBpcyBpbXBsZW1lbnRlZCBiZWxvdywgc28gd2UgZXZhbHVhdGUgdGhhdCBkaXJlY3RseSBpbiBjb21wYXQgbW9kZVxuICAgICAgdGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChwYXJ0c1tpKytdKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHVzaENvbnRleHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc29sdmVQYXRoKCdjb250ZXh0JywgcGFydHMsIGksIGZhbHN5KTtcbiAgfSxcblxuICAvLyBbbG9va3VwQmxvY2tQYXJhbV1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogYmxvY2tQYXJhbVtuYW1lXSwgLi4uXG4gIC8vXG4gIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgcGFydHNgIG9uIHRoZSBnaXZlbiBibG9jayBwYXJhbSBhbmQgcHVzaGVzXG4gIC8vIGl0IG9udG8gdGhlIHN0YWNrLlxuICBsb29rdXBCbG9ja1BhcmFtOiBmdW5jdGlvbiBsb29rdXBCbG9ja1BhcmFtKGJsb2NrUGFyYW1JZCwgcGFydHMpIHtcbiAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTtcblxuICAgIHRoaXMucHVzaChbJ2Jsb2NrUGFyYW1zWycsIGJsb2NrUGFyYW1JZFswXSwgJ11bJywgYmxvY2tQYXJhbUlkWzFdLCAnXSddKTtcbiAgICB0aGlzLnJlc29sdmVQYXRoKCdjb250ZXh0JywgcGFydHMsIDEpO1xuICB9LFxuXG4gIC8vIFtsb29rdXBEYXRhXVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiBkYXRhLCAuLi5cbiAgLy9cbiAgLy8gUHVzaCB0aGUgZGF0YSBsb29rdXAgb3BlcmF0b3JcbiAgbG9va3VwRGF0YTogZnVuY3Rpb24gbG9va3VwRGF0YShkZXB0aCwgcGFydHMpIHtcbiAgICBpZiAoIWRlcHRoKSB7XG4gICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0aGlzLmRhdGEoZGF0YSwgJyArIGRlcHRoICsgJyknKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc29sdmVQYXRoKCdkYXRhJywgcGFydHMsIDAsIHRydWUpO1xuICB9LFxuXG4gIHJlc29sdmVQYXRoOiBmdW5jdGlvbiByZXNvbHZlUGF0aCh0eXBlLCBwYXJ0cywgaSwgZmFsc3kpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgfHwgdGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpIHtcbiAgICAgIHRoaXMucHVzaChzdHJpY3RMb29rdXAodGhpcy5vcHRpb25zLnN0cmljdCwgdGhpcywgcGFydHMsIHR5cGUpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbGVuID0gcGFydHMubGVuZ3RoO1xuICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIC8qZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG4gICAgICB0aGlzLnJlcGxhY2VTdGFjayhmdW5jdGlvbiAoY3VycmVudCkge1xuICAgICAgICB2YXIgbG9va3VwID0gX3RoaXMubmFtZUxvb2t1cChjdXJyZW50LCBwYXJ0c1tpXSwgdHlwZSk7XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgemVybyBhbmQgZmFsc2UgYXJlIGhhbmRsZWQgcHJvcGVybHkgaWYgdGhlIGNvbnRleHQgKGZhbHN5IGZsYWcpXG4gICAgICAgIC8vIG5lZWRzIHRvIGhhdmUgdGhlIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZXNlIHZhbHVlcy5cbiAgICAgICAgaWYgKCFmYWxzeSkge1xuICAgICAgICAgIHJldHVybiBbJyAhPSBudWxsID8gJywgbG9va3VwLCAnIDogJywgY3VycmVudF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGNhbiB1c2UgZ2VuZXJpYyBmYWxzeSBoYW5kbGluZ1xuICAgICAgICAgIHJldHVybiBbJyAmJiAnLCBsb29rdXBdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8qZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi9cbiAgICB9XG4gIH0sXG5cbiAgLy8gW3Jlc29sdmVQb3NzaWJsZUxhbWJkYV1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogdmFsdWUsIC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHJlc29sdmVkIHZhbHVlLCAuLi5cbiAgLy9cbiAgLy8gSWYgdGhlIGB2YWx1ZWAgaXMgYSBsYW1iZGEsIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIGJ5XG4gIC8vIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGxhbWJkYVxuICByZXNvbHZlUG9zc2libGVMYW1iZGE6IGZ1bmN0aW9uIHJlc29sdmVQb3NzaWJsZUxhbWJkYSgpIHtcbiAgICB0aGlzLnB1c2goW3RoaXMuYWxpYXNhYmxlKCd0aGlzLmxhbWJkYScpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJywgJywgdGhpcy5jb250ZXh0TmFtZSgwKSwgJyknXSk7XG4gIH0sXG5cbiAgLy8gW3B1c2hTdHJpbmdQYXJhbV1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogc3RyaW5nLCBjdXJyZW50Q29udGV4dCwgLi4uXG4gIC8vXG4gIC8vIFRoaXMgb3Bjb2RlIGlzIGRlc2lnbmVkIGZvciB1c2UgaW4gc3RyaW5nIG1vZGUsIHdoaWNoXG4gIC8vIHByb3ZpZGVzIHRoZSBzdHJpbmcgdmFsdWUgb2YgYSBwYXJhbWV0ZXIgYWxvbmcgd2l0aCBpdHNcbiAgLy8gZGVwdGggcmF0aGVyIHRoYW4gcmVzb2x2aW5nIGl0IGltbWVkaWF0ZWx5LlxuICBwdXNoU3RyaW5nUGFyYW06IGZ1bmN0aW9uIHB1c2hTdHJpbmdQYXJhbShzdHJpbmcsIHR5cGUpIHtcbiAgICB0aGlzLnB1c2hDb250ZXh0KCk7XG4gICAgdGhpcy5wdXNoU3RyaW5nKHR5cGUpO1xuXG4gICAgLy8gSWYgaXQncyBhIHN1YmV4cHJlc3Npb24sIHRoZSBzdHJpbmcgcmVzdWx0XG4gICAgLy8gd2lsbCBiZSBwdXNoZWQgYWZ0ZXIgdGhpcyBvcGNvZGUuXG4gICAgaWYgKHR5cGUgIT09ICdTdWJFeHByZXNzaW9uJykge1xuICAgICAgaWYgKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucHVzaFN0cmluZyhzdHJpbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHN0cmluZyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGVtcHR5SGFzaDogZnVuY3Rpb24gZW1wdHlIYXNoKG9taXRFbXB0eSkge1xuICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7XG4gICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hJZHNcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7XG4gICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hDb250ZXh0c1xuICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXNcbiAgICB9XG4gICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKG9taXRFbXB0eSA/ICd1bmRlZmluZWQnIDogJ3t9Jyk7XG4gIH0sXG4gIHB1c2hIYXNoOiBmdW5jdGlvbiBwdXNoSGFzaCgpIHtcbiAgICBpZiAodGhpcy5oYXNoKSB7XG4gICAgICB0aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7XG4gICAgfVxuICAgIHRoaXMuaGFzaCA9IHsgdmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW10sIGlkczogW10gfTtcbiAgfSxcbiAgcG9wSGFzaDogZnVuY3Rpb24gcG9wSGFzaCgpIHtcbiAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDtcbiAgICB0aGlzLmhhc2ggPSB0aGlzLmhhc2hlcy5wb3AoKTtcblxuICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7XG4gICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2guaWRzKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykge1xuICAgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLmNvbnRleHRzKSk7XG4gICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2gudHlwZXMpKTtcbiAgICB9XG5cbiAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2gudmFsdWVzKSk7XG4gIH0sXG5cbiAgLy8gW3B1c2hTdHJpbmddXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi5cbiAgLy9cbiAgLy8gUHVzaCBhIHF1b3RlZCB2ZXJzaW9uIG9mIGBzdHJpbmdgIG9udG8gdGhlIHN0YWNrXG4gIHB1c2hTdHJpbmc6IGZ1bmN0aW9uIHB1c2hTdHJpbmcoc3RyaW5nKSB7XG4gICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpO1xuICB9LFxuXG4gIC8vIFtwdXNoTGl0ZXJhbF1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogdmFsdWUsIC4uLlxuICAvL1xuICAvLyBQdXNoZXMgYSB2YWx1ZSBvbnRvIHRoZSBzdGFjay4gVGhpcyBvcGVyYXRpb24gcHJldmVudHNcbiAgLy8gdGhlIGNvbXBpbGVyIGZyb20gY3JlYXRpbmcgYSB0ZW1wb3JhcnkgdmFyaWFibGUgdG8gaG9sZFxuICAvLyBpdC5cbiAgcHVzaExpdGVyYWw6IGZ1bmN0aW9uIHB1c2hMaXRlcmFsKHZhbHVlKSB7XG4gICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHZhbHVlKTtcbiAgfSxcblxuICAvLyBbcHVzaFByb2dyYW1dXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHByb2dyYW0oZ3VpZCksIC4uLlxuICAvL1xuICAvLyBQdXNoIGEgcHJvZ3JhbSBleHByZXNzaW9uIG9udG8gdGhlIHN0YWNrLiBUaGlzIHRha2VzXG4gIC8vIGEgY29tcGlsZS10aW1lIGd1aWQgYW5kIGNvbnZlcnRzIGl0IGludG8gYSBydW50aW1lLWFjY2Vzc2libGVcbiAgLy8gZXhwcmVzc2lvbi5cbiAgcHVzaFByb2dyYW06IGZ1bmN0aW9uIHB1c2hQcm9ncmFtKGd1aWQpIHtcbiAgICBpZiAoZ3VpZCAhPSBudWxsKSB7XG4gICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodGhpcy5wcm9ncmFtRXhwcmVzc2lvbihndWlkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChudWxsKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gW2ludm9rZUhlbHBlcl1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb25cbiAgLy9cbiAgLy8gUG9wcyBvZmYgdGhlIGhlbHBlcidzIHBhcmFtZXRlcnMsIGludm9rZXMgdGhlIGhlbHBlcixcbiAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLlxuICAvL1xuICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxlZC5cbiAgaW52b2tlSGVscGVyOiBmdW5jdGlvbiBpbnZva2VIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBpc1NpbXBsZSkge1xuICAgIHZhciBub25IZWxwZXIgPSB0aGlzLnBvcFN0YWNrKCksXG4gICAgICAgIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKSxcbiAgICAgICAgc2ltcGxlID0gaXNTaW1wbGUgPyBbaGVscGVyLm5hbWUsICcgfHwgJ10gOiAnJztcblxuICAgIHZhciBsb29rdXAgPSBbJygnXS5jb25jYXQoc2ltcGxlLCBub25IZWxwZXIpO1xuICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkge1xuICAgICAgbG9va3VwLnB1c2goJyB8fCAnLCB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5oZWxwZXJNaXNzaW5nJykpO1xuICAgIH1cbiAgICBsb29rdXAucHVzaCgnKScpO1xuXG4gICAgdGhpcy5wdXNoKHRoaXMuc291cmNlLmZ1bmN0aW9uQ2FsbChsb29rdXAsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTtcbiAgfSxcblxuICAvLyBbaW52b2tlS25vd25IZWxwZXJdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uXG4gIC8vXG4gIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LFxuICAvLyBzbyBhIGBoZWxwZXJNaXNzaW5nYCBmYWxsYmFjayBpcyBub3QgcmVxdWlyZWQuXG4gIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbiBpbnZva2VLbm93bkhlbHBlcihwYXJhbVNpemUsIG5hbWUpIHtcbiAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpO1xuICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoaGVscGVyLm5hbWUsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTtcbiAgfSxcblxuICAvLyBbaW52b2tlQW1iaWd1b3VzXVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHJlc3VsdCBvZiBkaXNhbWJpZ3VhdGlvblxuICAvL1xuICAvLyBUaGlzIG9wZXJhdGlvbiBpcyB1c2VkIHdoZW4gYW4gZXhwcmVzc2lvbiBsaWtlIGB7e2Zvb319YFxuICAvLyBpcyBwcm92aWRlZCwgYnV0IHdlIGRvbid0IGtub3cgYXQgY29tcGlsZS10aW1lIHdoZXRoZXIgaXRcbiAgLy8gaXMgYSBoZWxwZXIgb3IgYSBwYXRoLlxuICAvL1xuICAvLyBUaGlzIG9wZXJhdGlvbiBlbWl0cyBtb3JlIGNvZGUgdGhhbiB0aGUgb3RoZXIgb3B0aW9ucyxcbiAgLy8gYW5kIGNhbiBiZSBhdm9pZGVkIGJ5IHBhc3NpbmcgdGhlIGBrbm93bkhlbHBlcnNgIGFuZFxuICAvLyBga25vd25IZWxwZXJzT25seWAgZmxhZ3MgYXQgY29tcGlsZS10aW1lLlxuICBpbnZva2VBbWJpZ3VvdXM6IGZ1bmN0aW9uIGludm9rZUFtYmlndW91cyhuYW1lLCBoZWxwZXJDYWxsKSB7XG4gICAgdGhpcy51c2VSZWdpc3RlcignaGVscGVyJyk7XG5cbiAgICB2YXIgbm9uSGVscGVyID0gdGhpcy5wb3BTdGFjaygpO1xuXG4gICAgdGhpcy5lbXB0eUhhc2goKTtcbiAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTtcblxuICAgIHZhciBoZWxwZXJOYW1lID0gdGhpcy5sYXN0SGVscGVyID0gdGhpcy5uYW1lTG9va3VwKCdoZWxwZXJzJywgbmFtZSwgJ2hlbHBlcicpO1xuXG4gICAgdmFyIGxvb2t1cCA9IFsnKCcsICcoaGVscGVyID0gJywgaGVscGVyTmFtZSwgJyB8fCAnLCBub25IZWxwZXIsICcpJ107XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICBsb29rdXBbMF0gPSAnKGhlbHBlciA9ICc7XG4gICAgICBsb29rdXAucHVzaCgnICE9IG51bGwgPyBoZWxwZXIgOiAnLCB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5oZWxwZXJNaXNzaW5nJykpO1xuICAgIH1cblxuICAgIHRoaXMucHVzaChbJygnLCBsb29rdXAsIGhlbHBlci5wYXJhbXNJbml0ID8gWycpLCgnLCBoZWxwZXIucGFyYW1zSW5pdF0gOiBbXSwgJyksJywgJyh0eXBlb2YgaGVscGVyID09PSAnLCB0aGlzLmFsaWFzYWJsZSgnXCJmdW5jdGlvblwiJyksICcgPyAnLCB0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoJ2hlbHBlcicsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpLCAnIDogaGVscGVyKSknXSk7XG4gIH0sXG5cbiAgLy8gW2ludm9rZVBhcnRpYWxdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGNvbnRleHQsIC4uLlxuICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvblxuICAvL1xuICAvLyBUaGlzIG9wZXJhdGlvbiBwb3BzIG9mZiBhIGNvbnRleHQsIGludm9rZXMgYSBwYXJ0aWFsIHdpdGggdGhhdCBjb250ZXh0LFxuICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay5cbiAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24gaW52b2tlUGFydGlhbChpc0R5bmFtaWMsIG5hbWUsIGluZGVudCkge1xuICAgIHZhciBwYXJhbXMgPSBbXSxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBQYXJhbXMobmFtZSwgMSwgcGFyYW1zLCBmYWxzZSk7XG5cbiAgICBpZiAoaXNEeW5hbWljKSB7XG4gICAgICBuYW1lID0gdGhpcy5wb3BTdGFjaygpO1xuICAgICAgZGVsZXRlIG9wdGlvbnMubmFtZTtcbiAgICB9XG5cbiAgICBpZiAoaW5kZW50KSB7XG4gICAgICBvcHRpb25zLmluZGVudCA9IEpTT04uc3RyaW5naWZ5KGluZGVudCk7XG4gICAgfVxuICAgIG9wdGlvbnMuaGVscGVycyA9ICdoZWxwZXJzJztcbiAgICBvcHRpb25zLnBhcnRpYWxzID0gJ3BhcnRpYWxzJztcblxuICAgIGlmICghaXNEeW5hbWljKSB7XG4gICAgICBwYXJhbXMudW5zaGlmdCh0aGlzLm5hbWVMb29rdXAoJ3BhcnRpYWxzJywgbmFtZSwgJ3BhcnRpYWwnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtcy51bnNoaWZ0KG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7XG4gICAgICBvcHRpb25zLmRlcHRocyA9ICdkZXB0aHMnO1xuICAgIH1cbiAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpO1xuICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5wdXNoKHRoaXMuc291cmNlLmZ1bmN0aW9uQ2FsbCgndGhpcy5pbnZva2VQYXJ0aWFsJywgJycsIHBhcmFtcykpO1xuICB9LFxuXG4gIC8vIFthc3NpZ25Ub0hhc2hdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4sIGhhc2gsIC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLiwgaGFzaCwgLi4uXG4gIC8vXG4gIC8vIFBvcHMgYSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBjdXJyZW50IGhhc2hcbiAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbiBhc3NpZ25Ub0hhc2goa2V5KSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLFxuICAgICAgICBjb250ZXh0ID0gdW5kZWZpbmVkLFxuICAgICAgICB0eXBlID0gdW5kZWZpbmVkLFxuICAgICAgICBpZCA9IHVuZGVmaW5lZDtcblxuICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7XG4gICAgICBpZCA9IHRoaXMucG9wU3RhY2soKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7XG4gICAgICB0eXBlID0gdGhpcy5wb3BTdGFjaygpO1xuICAgICAgY29udGV4dCA9IHRoaXMucG9wU3RhY2soKTtcbiAgICB9XG5cbiAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDtcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgaGFzaC5jb250ZXh0c1trZXldID0gY29udGV4dDtcbiAgICB9XG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIGhhc2gudHlwZXNba2V5XSA9IHR5cGU7XG4gICAgfVxuICAgIGlmIChpZCkge1xuICAgICAgaGFzaC5pZHNba2V5XSA9IGlkO1xuICAgIH1cbiAgICBoYXNoLnZhbHVlc1trZXldID0gdmFsdWU7XG4gIH0sXG5cbiAgcHVzaElkOiBmdW5jdGlvbiBwdXNoSWQodHlwZSwgbmFtZSwgY2hpbGQpIHtcbiAgICBpZiAodHlwZSA9PT0gJ0Jsb2NrUGFyYW0nKSB7XG4gICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2Jsb2NrUGFyYW1zWycgKyBuYW1lWzBdICsgJ10ucGF0aFsnICsgbmFtZVsxXSArICddJyArIChjaGlsZCA/ICcgKyAnICsgSlNPTi5zdHJpbmdpZnkoJy4nICsgY2hpbGQpIDogJycpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHtcbiAgICAgIHRoaXMucHVzaFN0cmluZyhuYW1lKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykge1xuICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0cnVlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnbnVsbCcpO1xuICAgIH1cbiAgfSxcblxuICAvLyBIRUxQRVJTXG5cbiAgY29tcGlsZXI6IEphdmFTY3JpcHRDb21waWxlcixcblxuICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucykge1xuICAgIHZhciBjaGlsZHJlbiA9IGVudmlyb25tZW50LmNoaWxkcmVuLFxuICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZCxcbiAgICAgICAgY29tcGlsZXIgPSB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIGNvbXBpbGVyID0gbmV3IHRoaXMuY29tcGlsZXIoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG5cbiAgICAgIHZhciBpbmRleCA9IHRoaXMubWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpO1xuXG4gICAgICBpZiAoaW5kZXggPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgnJyk7IC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlblxuICAgICAgICBpbmRleCA9IHRoaXMuY29udGV4dC5wcm9ncmFtcy5sZW5ndGg7XG4gICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDtcbiAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zW2luZGV4XSA9IGNvbXBpbGVyLmNvbXBpbGUoY2hpbGQsIG9wdGlvbnMsIHRoaXMuY29udGV4dCwgIXRoaXMucHJlY29tcGlsZSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7XG5cbiAgICAgICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCBjb21waWxlci51c2VEZXB0aHM7XG4gICAgICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGNvbXBpbGVyLnVzZUJsb2NrUGFyYW1zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGQuaW5kZXggPSBpbmRleDtcbiAgICAgICAgY2hpbGQubmFtZSA9ICdwcm9ncmFtJyArIGluZGV4O1xuXG4gICAgICAgIHRoaXMudXNlRGVwdGhzID0gdGhpcy51c2VEZXB0aHMgfHwgY2hpbGQudXNlRGVwdGhzO1xuICAgICAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdGhpcy51c2VCbG9ja1BhcmFtcyB8fCBjaGlsZC51c2VCbG9ja1BhcmFtcztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIG1hdGNoRXhpc3RpbmdQcm9ncmFtOiBmdW5jdGlvbiBtYXRjaEV4aXN0aW5nUHJvZ3JhbShjaGlsZCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLmNvbnRleHQuZW52aXJvbm1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgZW52aXJvbm1lbnQgPSB0aGlzLmNvbnRleHQuZW52aXJvbm1lbnRzW2ldO1xuICAgICAgaWYgKGVudmlyb25tZW50ICYmIGVudmlyb25tZW50LmVxdWFscyhjaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHByb2dyYW1FeHByZXNzaW9uOiBmdW5jdGlvbiBwcm9ncmFtRXhwcmVzc2lvbihndWlkKSB7XG4gICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSxcbiAgICAgICAgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgJ2RhdGEnLCBjaGlsZC5ibG9ja1BhcmFtc107XG5cbiAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykge1xuICAgICAgcHJvZ3JhbVBhcmFtcy5wdXNoKCdibG9ja1BhcmFtcycpO1xuICAgIH1cbiAgICBpZiAodGhpcy51c2VEZXB0aHMpIHtcbiAgICAgIHByb2dyYW1QYXJhbXMucHVzaCgnZGVwdGhzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuICd0aGlzLnByb2dyYW0oJyArIHByb2dyYW1QYXJhbXMuam9pbignLCAnKSArICcpJztcbiAgfSxcblxuICB1c2VSZWdpc3RlcjogZnVuY3Rpb24gdXNlUmVnaXN0ZXIobmFtZSkge1xuICAgIGlmICghdGhpcy5yZWdpc3RlcnNbbmFtZV0pIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJzW25hbWVdID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVnaXN0ZXJzLmxpc3QucHVzaChuYW1lKTtcbiAgICB9XG4gIH0sXG5cbiAgcHVzaDogZnVuY3Rpb24gcHVzaChleHByKSB7XG4gICAgaWYgKCEoZXhwciBpbnN0YW5jZW9mIExpdGVyYWwpKSB7XG4gICAgICBleHByID0gdGhpcy5zb3VyY2Uud3JhcChleHByKTtcbiAgICB9XG5cbiAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7XG4gICAgcmV0dXJuIGV4cHI7XG4gIH0sXG5cbiAgcHVzaFN0YWNrTGl0ZXJhbDogZnVuY3Rpb24gcHVzaFN0YWNrTGl0ZXJhbChpdGVtKSB7XG4gICAgdGhpcy5wdXNoKG5ldyBMaXRlcmFsKGl0ZW0pKTtcbiAgfSxcblxuICBwdXNoU291cmNlOiBmdW5jdGlvbiBwdXNoU291cmNlKHNvdXJjZSkge1xuICAgIGlmICh0aGlzLnBlbmRpbmdDb250ZW50KSB7XG4gICAgICB0aGlzLnNvdXJjZS5wdXNoKHRoaXMuYXBwZW5kVG9CdWZmZXIodGhpcy5zb3VyY2UucXVvdGVkU3RyaW5nKHRoaXMucGVuZGluZ0NvbnRlbnQpLCB0aGlzLnBlbmRpbmdMb2NhdGlvbikpO1xuICAgICAgdGhpcy5wZW5kaW5nQ29udGVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlKSB7XG4gICAgICB0aGlzLnNvdXJjZS5wdXNoKHNvdXJjZSk7XG4gICAgfVxuICB9LFxuXG4gIHJlcGxhY2VTdGFjazogZnVuY3Rpb24gcmVwbGFjZVN0YWNrKGNhbGxiYWNrKSB7XG4gICAgdmFyIHByZWZpeCA9IFsnKCddLFxuICAgICAgICBzdGFjayA9IHVuZGVmaW5lZCxcbiAgICAgICAgY3JlYXRlZFN0YWNrID0gdW5kZWZpbmVkLFxuICAgICAgICB1c2VkTGl0ZXJhbCA9IHVuZGVmaW5lZDtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKCF0aGlzLmlzSW5saW5lKCkpIHtcbiAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdyZXBsYWNlU3RhY2sgb24gbm9uLWlubGluZScpO1xuICAgIH1cblxuICAgIC8vIFdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHZpYSAnLCdcbiAgICB2YXIgdG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTtcblxuICAgIGlmICh0b3AgaW5zdGFuY2VvZiBMaXRlcmFsKSB7XG4gICAgICAvLyBMaXRlcmFscyBkbyBub3QgbmVlZCB0byBiZSBpbmxpbmVkXG4gICAgICBzdGFjayA9IFt0b3AudmFsdWVdO1xuICAgICAgcHJlZml4ID0gWycoJywgc3RhY2tdO1xuICAgICAgdXNlZExpdGVyYWwgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBjdXJyZW50IHN0YWNrIG5hbWUgZm9yIHVzZSBieSB0aGUgaW5saW5lXG4gICAgICBjcmVhdGVkU3RhY2sgPSB0cnVlO1xuICAgICAgdmFyIF9uYW1lID0gdGhpcy5pbmNyU3RhY2soKTtcblxuICAgICAgcHJlZml4ID0gWycoKCcsIHRoaXMucHVzaChfbmFtZSksICcgPSAnLCB0b3AsICcpJ107XG4gICAgICBzdGFjayA9IHRoaXMudG9wU3RhY2soKTtcbiAgICB9XG5cbiAgICB2YXIgaXRlbSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RhY2spO1xuXG4gICAgaWYgKCF1c2VkTGl0ZXJhbCkge1xuICAgICAgdGhpcy5wb3BTdGFjaygpO1xuICAgIH1cbiAgICBpZiAoY3JlYXRlZFN0YWNrKSB7XG4gICAgICB0aGlzLnN0YWNrU2xvdC0tO1xuICAgIH1cbiAgICB0aGlzLnB1c2gocHJlZml4LmNvbmNhdChpdGVtLCAnKScpKTtcbiAgfSxcblxuICBpbmNyU3RhY2s6IGZ1bmN0aW9uIGluY3JTdGFjaygpIHtcbiAgICB0aGlzLnN0YWNrU2xvdCsrO1xuICAgIGlmICh0aGlzLnN0YWNrU2xvdCA+IHRoaXMuc3RhY2tWYXJzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zdGFja1ZhcnMucHVzaCgnc3RhY2snICsgdGhpcy5zdGFja1Nsb3QpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b3BTdGFja05hbWUoKTtcbiAgfSxcbiAgdG9wU3RhY2tOYW1lOiBmdW5jdGlvbiB0b3BTdGFja05hbWUoKSB7XG4gICAgcmV0dXJuICdzdGFjaycgKyB0aGlzLnN0YWNrU2xvdDtcbiAgfSxcbiAgZmx1c2hJbmxpbmU6IGZ1bmN0aW9uIGZsdXNoSW5saW5lKCkge1xuICAgIHZhciBpbmxpbmVTdGFjayA9IHRoaXMuaW5saW5lU3RhY2s7XG4gICAgdGhpcy5pbmxpbmVTdGFjayA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBpbmxpbmVTdGFjay5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIGVudHJ5ID0gaW5saW5lU3RhY2tbaV07XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChlbnRyeSBpbnN0YW5jZW9mIExpdGVyYWwpIHtcbiAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChlbnRyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc3RhY2sgPSB0aGlzLmluY3JTdGFjaygpO1xuICAgICAgICB0aGlzLnB1c2hTb3VyY2UoW3N0YWNrLCAnID0gJywgZW50cnksICc7J10pO1xuICAgICAgICB0aGlzLmNvbXBpbGVTdGFjay5wdXNoKHN0YWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGlzSW5saW5lOiBmdW5jdGlvbiBpc0lubGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmxpbmVTdGFjay5sZW5ndGg7XG4gIH0sXG5cbiAgcG9wU3RhY2s6IGZ1bmN0aW9uIHBvcFN0YWNrKHdyYXBwZWQpIHtcbiAgICB2YXIgaW5saW5lID0gdGhpcy5pc0lubGluZSgpLFxuICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7XG5cbiAgICBpZiAoIXdyYXBwZWQgJiYgaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHtcbiAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWlubGluZSkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBpZiAoIXRoaXMuc3RhY2tTbG90KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ0ludmFsaWQgc3RhY2sgcG9wJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGFja1Nsb3QtLTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cbiAgfSxcblxuICB0b3BTdGFjazogZnVuY3Rpb24gdG9wU3RhY2soKSB7XG4gICAgdmFyIHN0YWNrID0gdGhpcy5pc0lubGluZSgpID8gdGhpcy5pbmxpbmVTdGFjayA6IHRoaXMuY29tcGlsZVN0YWNrLFxuICAgICAgICBpdGVtID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHtcbiAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gIH0sXG5cbiAgY29udGV4dE5hbWU6IGZ1bmN0aW9uIGNvbnRleHROYW1lKGNvbnRleHQpIHtcbiAgICBpZiAodGhpcy51c2VEZXB0aHMgJiYgY29udGV4dCkge1xuICAgICAgcmV0dXJuICdkZXB0aHNbJyArIGNvbnRleHQgKyAnXSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnZGVwdGgnICsgY29udGV4dDtcbiAgICB9XG4gIH0sXG5cbiAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbiBxdW90ZWRTdHJpbmcoc3RyKSB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyhzdHIpO1xuICB9LFxuXG4gIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLm9iamVjdExpdGVyYWwob2JqKTtcbiAgfSxcblxuICBhbGlhc2FibGU6IGZ1bmN0aW9uIGFsaWFzYWJsZShuYW1lKSB7XG4gICAgdmFyIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXTtcbiAgICBpZiAocmV0KSB7XG4gICAgICByZXQucmVmZXJlbmNlQ291bnQrKztcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgcmV0ID0gdGhpcy5hbGlhc2VzW25hbWVdID0gdGhpcy5zb3VyY2Uud3JhcChuYW1lKTtcbiAgICByZXQuYWxpYXNhYmxlID0gdHJ1ZTtcbiAgICByZXQucmVmZXJlbmNlQ291bnQgPSAxO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBzZXR1cEhlbHBlcjogZnVuY3Rpb24gc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBibG9ja0hlbHBlcikge1xuICAgIHZhciBwYXJhbXMgPSBbXSxcbiAgICAgICAgcGFyYW1zSW5pdCA9IHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIHBhcmFtU2l6ZSwgcGFyYW1zLCBibG9ja0hlbHBlcik7XG4gICAgdmFyIGZvdW5kSGVscGVyID0gdGhpcy5uYW1lTG9va3VwKCdoZWxwZXJzJywgbmFtZSwgJ2hlbHBlcicpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgcGFyYW1zSW5pdDogcGFyYW1zSW5pdCxcbiAgICAgIG5hbWU6IGZvdW5kSGVscGVyLFxuICAgICAgY2FsbFBhcmFtczogW3RoaXMuY29udGV4dE5hbWUoMCldLmNvbmNhdChwYXJhbXMpXG4gICAgfTtcbiAgfSxcblxuICBzZXR1cFBhcmFtczogZnVuY3Rpb24gc2V0dXBQYXJhbXMoaGVscGVyLCBwYXJhbVNpemUsIHBhcmFtcykge1xuICAgIHZhciBvcHRpb25zID0ge30sXG4gICAgICAgIGNvbnRleHRzID0gW10sXG4gICAgICAgIHR5cGVzID0gW10sXG4gICAgICAgIGlkcyA9IFtdLFxuICAgICAgICBwYXJhbSA9IHVuZGVmaW5lZDtcblxuICAgIG9wdGlvbnMubmFtZSA9IHRoaXMucXVvdGVkU3RyaW5nKGhlbHBlcik7XG4gICAgb3B0aW9ucy5oYXNoID0gdGhpcy5wb3BTdGFjaygpO1xuXG4gICAgaWYgKHRoaXMudHJhY2tJZHMpIHtcbiAgICAgIG9wdGlvbnMuaGFzaElkcyA9IHRoaXMucG9wU3RhY2soKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7XG4gICAgICBvcHRpb25zLmhhc2hUeXBlcyA9IHRoaXMucG9wU3RhY2soKTtcbiAgICAgIG9wdGlvbnMuaGFzaENvbnRleHRzID0gdGhpcy5wb3BTdGFjaygpO1xuICAgIH1cblxuICAgIHZhciBpbnZlcnNlID0gdGhpcy5wb3BTdGFjaygpLFxuICAgICAgICBwcm9ncmFtID0gdGhpcy5wb3BTdGFjaygpO1xuXG4gICAgLy8gQXZvaWQgc2V0dGluZyBmbiBhbmQgaW52ZXJzZSBpZiBuZWl0aGVyIGFyZSBzZXQuIFRoaXMgYWxsb3dzXG4gICAgLy8gaGVscGVycyB0byBkbyBhIGNoZWNrIGZvciBgaWYgKG9wdGlvbnMuZm4pYFxuICAgIGlmIChwcm9ncmFtIHx8IGludmVyc2UpIHtcbiAgICAgIG9wdGlvbnMuZm4gPSBwcm9ncmFtIHx8ICd0aGlzLm5vb3AnO1xuICAgICAgb3B0aW9ucy5pbnZlcnNlID0gaW52ZXJzZSB8fCAndGhpcy5ub29wJztcbiAgICB9XG5cbiAgICAvLyBUaGUgcGFyYW1ldGVycyBnbyBvbiB0byB0aGUgc3RhY2sgaW4gb3JkZXIgKG1ha2luZyBzdXJlIHRoYXQgdGhleSBhcmUgZXZhbHVhdGVkIGluIG9yZGVyKVxuICAgIC8vIHNvIHdlIG5lZWQgdG8gcG9wIHRoZW0gb2ZmIHRoZSBzdGFjayBpbiByZXZlcnNlIG9yZGVyXG4gICAgdmFyIGkgPSBwYXJhbVNpemU7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgcGFyYW0gPSB0aGlzLnBvcFN0YWNrKCk7XG4gICAgICBwYXJhbXNbaV0gPSBwYXJhbTtcblxuICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHtcbiAgICAgICAgaWRzW2ldID0gdGhpcy5wb3BTdGFjaygpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7XG4gICAgICAgIHR5cGVzW2ldID0gdGhpcy5wb3BTdGFjaygpO1xuICAgICAgICBjb250ZXh0c1tpXSA9IHRoaXMucG9wU3RhY2soKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFja0lkcykge1xuICAgICAgb3B0aW9ucy5pZHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGlkcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykge1xuICAgICAgb3B0aW9ucy50eXBlcyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkodHlwZXMpO1xuICAgICAgb3B0aW9ucy5jb250ZXh0cyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoY29udGV4dHMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGF0YSkge1xuICAgICAgb3B0aW9ucy5kYXRhID0gJ2RhdGEnO1xuICAgIH1cbiAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcykge1xuICAgICAgb3B0aW9ucy5ibG9ja1BhcmFtcyA9ICdibG9ja1BhcmFtcyc7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zO1xuICB9LFxuXG4gIHNldHVwSGVscGVyQXJnczogZnVuY3Rpb24gc2V0dXBIZWxwZXJBcmdzKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMsIHVzZVJlZ2lzdGVyKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLnNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMsIHRydWUpO1xuICAgIG9wdGlvbnMgPSB0aGlzLm9iamVjdExpdGVyYWwob3B0aW9ucyk7XG4gICAgaWYgKHVzZVJlZ2lzdGVyKSB7XG4gICAgICB0aGlzLnVzZVJlZ2lzdGVyKCdvcHRpb25zJyk7XG4gICAgICBwYXJhbXMucHVzaCgnb3B0aW9ucycpO1xuICAgICAgcmV0dXJuIFsnb3B0aW9ucz0nLCBvcHRpb25zXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zLnB1c2gob3B0aW9ucyk7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgcmVzZXJ2ZWRXb3JkcyA9ICgnYnJlYWsgZWxzZSBuZXcgdmFyJyArICcgY2FzZSBmaW5hbGx5IHJldHVybiB2b2lkJyArICcgY2F0Y2ggZm9yIHN3aXRjaCB3aGlsZScgKyAnIGNvbnRpbnVlIGZ1bmN0aW9uIHRoaXMgd2l0aCcgKyAnIGRlZmF1bHQgaWYgdGhyb3cnICsgJyBkZWxldGUgaW4gdHJ5JyArICcgZG8gaW5zdGFuY2VvZiB0eXBlb2YnICsgJyBhYnN0cmFjdCBlbnVtIGludCBzaG9ydCcgKyAnIGJvb2xlYW4gZXhwb3J0IGludGVyZmFjZSBzdGF0aWMnICsgJyBieXRlIGV4dGVuZHMgbG9uZyBzdXBlcicgKyAnIGNoYXIgZmluYWwgbmF0aXZlIHN5bmNocm9uaXplZCcgKyAnIGNsYXNzIGZsb2F0IHBhY2thZ2UgdGhyb3dzJyArICcgY29uc3QgZ290byBwcml2YXRlIHRyYW5zaWVudCcgKyAnIGRlYnVnZ2VyIGltcGxlbWVudHMgcHJvdGVjdGVkIHZvbGF0aWxlJyArICcgZG91YmxlIGltcG9ydCBwdWJsaWMgbGV0IHlpZWxkIGF3YWl0JyArICcgbnVsbCB0cnVlIGZhbHNlJykuc3BsaXQoJyAnKTtcblxuICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9O1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gcmVzZXJ2ZWRXb3Jkcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb21waWxlcldvcmRzW3Jlc2VydmVkV29yZHNbaV1dID0gdHJ1ZTtcbiAgfVxufSkoKTtcblxuSmF2YVNjcmlwdENvbXBpbGVyLmlzVmFsaWRKYXZhU2NyaXB0VmFyaWFibGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuICFKYXZhU2NyaXB0Q29tcGlsZXIuUkVTRVJWRURfV09SRFNbbmFtZV0gJiYgL15bYS16QS1aXyRdWzAtOWEtekEtWl8kXSokLy50ZXN0KG5hbWUpO1xufTtcblxuZnVuY3Rpb24gc3RyaWN0TG9va3VwKHJlcXVpcmVUZXJtaW5hbCwgY29tcGlsZXIsIHBhcnRzLCB0eXBlKSB7XG4gIHZhciBzdGFjayA9IGNvbXBpbGVyLnBvcFN0YWNrKCksXG4gICAgICBpID0gMCxcbiAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDtcbiAgaWYgKHJlcXVpcmVUZXJtaW5hbCkge1xuICAgIGxlbi0tO1xuICB9XG5cbiAgZm9yICg7IGkgPCBsZW47IGkrKykge1xuICAgIHN0YWNrID0gY29tcGlsZXIubmFtZUxvb2t1cChzdGFjaywgcGFydHNbaV0sIHR5cGUpO1xuICB9XG5cbiAgaWYgKHJlcXVpcmVUZXJtaW5hbCkge1xuICAgIHJldHVybiBbY29tcGlsZXIuYWxpYXNhYmxlKCd0aGlzLnN0cmljdCcpLCAnKCcsIHN0YWNrLCAnLCAnLCBjb21waWxlci5xdW90ZWRTdHJpbmcocGFydHNbaV0pLCAnKSddO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdGFjaztcbiAgfVxufVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSBKYXZhU2NyaXB0Q29tcGlsZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovXG52YXIgaGFuZGxlYmFycyA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcnNlciA9IHsgdHJhY2U6IGZ1bmN0aW9uIHRyYWNlKCkge30sXG4gICAgICAgIHl5OiB7fSxcbiAgICAgICAgc3ltYm9sc186IHsgZXJyb3I6IDIsIHJvb3Q6IDMsIHByb2dyYW06IDQsIEVPRjogNSwgcHJvZ3JhbV9yZXBldGl0aW9uMDogNiwgc3RhdGVtZW50OiA3LCBtdXN0YWNoZTogOCwgYmxvY2s6IDksIHJhd0Jsb2NrOiAxMCwgcGFydGlhbDogMTEsIGNvbnRlbnQ6IDEyLCBDT01NRU5UOiAxMywgQ09OVEVOVDogMTQsIG9wZW5SYXdCbG9jazogMTUsIEVORF9SQVdfQkxPQ0s6IDE2LCBPUEVOX1JBV19CTE9DSzogMTcsIGhlbHBlck5hbWU6IDE4LCBvcGVuUmF3QmxvY2tfcmVwZXRpdGlvbjA6IDE5LCBvcGVuUmF3QmxvY2tfb3B0aW9uMDogMjAsIENMT1NFX1JBV19CTE9DSzogMjEsIG9wZW5CbG9jazogMjIsIGJsb2NrX29wdGlvbjA6IDIzLCBjbG9zZUJsb2NrOiAyNCwgb3BlbkludmVyc2U6IDI1LCBibG9ja19vcHRpb24xOiAyNiwgT1BFTl9CTE9DSzogMjcsIG9wZW5CbG9ja19yZXBldGl0aW9uMDogMjgsIG9wZW5CbG9ja19vcHRpb24wOiAyOSwgb3BlbkJsb2NrX29wdGlvbjE6IDMwLCBDTE9TRTogMzEsIE9QRU5fSU5WRVJTRTogMzIsIG9wZW5JbnZlcnNlX3JlcGV0aXRpb24wOiAzMywgb3BlbkludmVyc2Vfb3B0aW9uMDogMzQsIG9wZW5JbnZlcnNlX29wdGlvbjE6IDM1LCBvcGVuSW52ZXJzZUNoYWluOiAzNiwgT1BFTl9JTlZFUlNFX0NIQUlOOiAzNywgb3BlbkludmVyc2VDaGFpbl9yZXBldGl0aW9uMDogMzgsIG9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMDogMzksIG9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMTogNDAsIGludmVyc2VBbmRQcm9ncmFtOiA0MSwgSU5WRVJTRTogNDIsIGludmVyc2VDaGFpbjogNDMsIGludmVyc2VDaGFpbl9vcHRpb24wOiA0NCwgT1BFTl9FTkRCTE9DSzogNDUsIE9QRU46IDQ2LCBtdXN0YWNoZV9yZXBldGl0aW9uMDogNDcsIG11c3RhY2hlX29wdGlvbjA6IDQ4LCBPUEVOX1VORVNDQVBFRDogNDksIG11c3RhY2hlX3JlcGV0aXRpb24xOiA1MCwgbXVzdGFjaGVfb3B0aW9uMTogNTEsIENMT1NFX1VORVNDQVBFRDogNTIsIE9QRU5fUEFSVElBTDogNTMsIHBhcnRpYWxOYW1lOiA1NCwgcGFydGlhbF9yZXBldGl0aW9uMDogNTUsIHBhcnRpYWxfb3B0aW9uMDogNTYsIHBhcmFtOiA1Nywgc2V4cHI6IDU4LCBPUEVOX1NFWFBSOiA1OSwgc2V4cHJfcmVwZXRpdGlvbjA6IDYwLCBzZXhwcl9vcHRpb24wOiA2MSwgQ0xPU0VfU0VYUFI6IDYyLCBoYXNoOiA2MywgaGFzaF9yZXBldGl0aW9uX3BsdXMwOiA2NCwgaGFzaFNlZ21lbnQ6IDY1LCBJRDogNjYsIEVRVUFMUzogNjcsIGJsb2NrUGFyYW1zOiA2OCwgT1BFTl9CTE9DS19QQVJBTVM6IDY5LCBibG9ja1BhcmFtc19yZXBldGl0aW9uX3BsdXMwOiA3MCwgQ0xPU0VfQkxPQ0tfUEFSQU1TOiA3MSwgcGF0aDogNzIsIGRhdGFOYW1lOiA3MywgU1RSSU5HOiA3NCwgTlVNQkVSOiA3NSwgQk9PTEVBTjogNzYsIFVOREVGSU5FRDogNzcsIE5VTEw6IDc4LCBEQVRBOiA3OSwgcGF0aFNlZ21lbnRzOiA4MCwgU0VQOiA4MSwgJGFjY2VwdDogMCwgJGVuZDogMSB9LFxuICAgICAgICB0ZXJtaW5hbHNfOiB7IDI6IFwiZXJyb3JcIiwgNTogXCJFT0ZcIiwgMTM6IFwiQ09NTUVOVFwiLCAxNDogXCJDT05URU5UXCIsIDE2OiBcIkVORF9SQVdfQkxPQ0tcIiwgMTc6IFwiT1BFTl9SQVdfQkxPQ0tcIiwgMjE6IFwiQ0xPU0VfUkFXX0JMT0NLXCIsIDI3OiBcIk9QRU5fQkxPQ0tcIiwgMzE6IFwiQ0xPU0VcIiwgMzI6IFwiT1BFTl9JTlZFUlNFXCIsIDM3OiBcIk9QRU5fSU5WRVJTRV9DSEFJTlwiLCA0MjogXCJJTlZFUlNFXCIsIDQ1OiBcIk9QRU5fRU5EQkxPQ0tcIiwgNDY6IFwiT1BFTlwiLCA0OTogXCJPUEVOX1VORVNDQVBFRFwiLCA1MjogXCJDTE9TRV9VTkVTQ0FQRURcIiwgNTM6IFwiT1BFTl9QQVJUSUFMXCIsIDU5OiBcIk9QRU5fU0VYUFJcIiwgNjI6IFwiQ0xPU0VfU0VYUFJcIiwgNjY6IFwiSURcIiwgNjc6IFwiRVFVQUxTXCIsIDY5OiBcIk9QRU5fQkxPQ0tfUEFSQU1TXCIsIDcxOiBcIkNMT1NFX0JMT0NLX1BBUkFNU1wiLCA3NDogXCJTVFJJTkdcIiwgNzU6IFwiTlVNQkVSXCIsIDc2OiBcIkJPT0xFQU5cIiwgNzc6IFwiVU5ERUZJTkVEXCIsIDc4OiBcIk5VTExcIiwgNzk6IFwiREFUQVwiLCA4MTogXCJTRVBcIiB9LFxuICAgICAgICBwcm9kdWN0aW9uc186IFswLCBbMywgMl0sIFs0LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzEyLCAxXSwgWzEwLCAzXSwgWzE1LCA1XSwgWzksIDRdLCBbOSwgNF0sIFsyMiwgNl0sIFsyNSwgNl0sIFszNiwgNl0sIFs0MSwgMl0sIFs0MywgM10sIFs0MywgMV0sIFsyNCwgM10sIFs4LCA1XSwgWzgsIDVdLCBbMTEsIDVdLCBbNTcsIDFdLCBbNTcsIDFdLCBbNTgsIDVdLCBbNjMsIDFdLCBbNjUsIDNdLCBbNjgsIDNdLCBbMTgsIDFdLCBbMTgsIDFdLCBbMTgsIDFdLCBbMTgsIDFdLCBbMTgsIDFdLCBbMTgsIDFdLCBbMTgsIDFdLCBbNTQsIDFdLCBbNTQsIDFdLCBbNzMsIDJdLCBbNzIsIDFdLCBbODAsIDNdLCBbODAsIDFdLCBbNiwgMF0sIFs2LCAyXSwgWzE5LCAwXSwgWzE5LCAyXSwgWzIwLCAwXSwgWzIwLCAxXSwgWzIzLCAwXSwgWzIzLCAxXSwgWzI2LCAwXSwgWzI2LCAxXSwgWzI4LCAwXSwgWzI4LCAyXSwgWzI5LCAwXSwgWzI5LCAxXSwgWzMwLCAwXSwgWzMwLCAxXSwgWzMzLCAwXSwgWzMzLCAyXSwgWzM0LCAwXSwgWzM0LCAxXSwgWzM1LCAwXSwgWzM1LCAxXSwgWzM4LCAwXSwgWzM4LCAyXSwgWzM5LCAwXSwgWzM5LCAxXSwgWzQwLCAwXSwgWzQwLCAxXSwgWzQ0LCAwXSwgWzQ0LCAxXSwgWzQ3LCAwXSwgWzQ3LCAyXSwgWzQ4LCAwXSwgWzQ4LCAxXSwgWzUwLCAwXSwgWzUwLCAyXSwgWzUxLCAwXSwgWzUxLCAxXSwgWzU1LCAwXSwgWzU1LCAyXSwgWzU2LCAwXSwgWzU2LCAxXSwgWzYwLCAwXSwgWzYwLCAyXSwgWzYxLCAwXSwgWzYxLCAxXSwgWzY0LCAxXSwgWzY0LCAyXSwgWzcwLCAxXSwgWzcwLCAyXV0sXG4gICAgICAgIHBlcmZvcm1BY3Rpb246IGZ1bmN0aW9uIGFub255bW91cyh5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHl5LCB5eXN0YXRlLCAkJCwgXyQpIHtcblxuICAgICAgICAgICAgdmFyICQwID0gJCQubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHN3aXRjaCAoeXlzdGF0ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQkWyQwIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gbmV3IHl5LlByb2dyYW0oJCRbJDBdLCBudWxsLCB7fSwgeXkubG9jSW5mbyh0aGlzLl8kKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBuZXcgeXkuQ29tbWVudFN0YXRlbWVudCh5eS5zdHJpcENvbW1lbnQoJCRbJDBdKSwgeXkuc3RyaXBGbGFncygkJFskMF0sICQkWyQwXSksIHl5LmxvY0luZm8odGhpcy5fJCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IG5ldyB5eS5Db250ZW50U3RhdGVtZW50KCQkWyQwXSwgeXkubG9jSW5mbyh0aGlzLl8kKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVSYXdCbG9jaygkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRoaXMuXyQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gM10sIHBhcmFtczogJCRbJDAgLSAyXSwgaGFzaDogJCRbJDAgLSAxXSB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVCbG9jaygkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRydWUsIHRoaXMuXyQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gMV0sICQkWyQwIC0gMV0pLCBwcm9ncmFtOiAkJFskMF0gfTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludmVyc2UgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCAkJFskMF0sIGZhbHNlLCB0aGlzLl8kKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSBuZXcgeXkuUHJvZ3JhbShbaW52ZXJzZV0sIG51bGwsIHt9LCB5eS5sb2NJbmZvKHRoaXMuXyQpKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5jaGFpbmVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiAkJFskMCAtIDJdLnN0cmlwLCBwcm9ncmFtOiBwcm9ncmFtLCBjaGFpbjogdHJ1ZSB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDJdLCAkJFskMF0pIH07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVNdXN0YWNoZSgkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMCAtIDRdLCB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSksIHRoaXMuXyQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gbmV3IHl5LlBhcnRpYWxTdGF0ZW1lbnQoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB5eS5sb2NJbmZvKHRoaXMuXyQpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IG5ldyB5eS5TdWJFeHByZXNzaW9uKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sIHl5LmxvY0luZm8odGhpcy5fJCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBuZXcgeXkuSGFzaCgkJFskMF0sIHl5LmxvY0luZm8odGhpcy5fJCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI4OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBuZXcgeXkuSGFzaFBhaXIoeXkuaWQoJCRbJDAgLSAyXSksICQkWyQwXSwgeXkubG9jSW5mbyh0aGlzLl8kKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LmlkKCQkWyQwIC0gMV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gbmV3IHl5LlN0cmluZ0xpdGVyYWwoJCRbJDBdLCB5eS5sb2NJbmZvKHRoaXMuXyQpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzMzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gbmV3IHl5Lk51bWJlckxpdGVyYWwoJCRbJDBdLCB5eS5sb2NJbmZvKHRoaXMuXyQpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gbmV3IHl5LkJvb2xlYW5MaXRlcmFsKCQkWyQwXSwgeXkubG9jSW5mbyh0aGlzLl8kKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IG5ldyB5eS5VbmRlZmluZWRMaXRlcmFsKHl5LmxvY0luZm8odGhpcy5fJCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM2OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBuZXcgeXkuTnVsbExpdGVyYWwoeXkubG9jSW5mbyh0aGlzLl8kKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aCh0cnVlLCAkJFskMF0sIHRoaXMuXyQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aChmYWxzZSwgJCRbJDBdLCB0aGlzLl8kKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MTpcbiAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAyXS5wdXNoKHsgcGFydDogeXkuaWQoJCRbJDBdKSwgb3JpZ2luYWw6ICQkWyQwXSwgc2VwYXJhdG9yOiAkJFskMCAtIDFdIH0pO3RoaXMuJCA9ICQkWyQwIC0gMl07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFt7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0gfV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDM6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ0OlxuICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0NTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDY6XG4gICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDUzOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1NDpcbiAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTk6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDYwOlxuICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2NTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjY6XG4gICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDczOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3NDpcbiAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc4OlxuICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4MTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODI6XG4gICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg1OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4NjpcbiAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODk6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFskJFskMF1dO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5MTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gWyQkWyQwXV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTI6XG4gICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdGFibGU6IFt7IDM6IDEsIDQ6IDIsIDU6IFsyLCA0M10sIDY6IDMsIDEzOiBbMiwgNDNdLCAxNDogWzIsIDQzXSwgMTc6IFsyLCA0M10sIDI3OiBbMiwgNDNdLCAzMjogWzIsIDQzXSwgNDY6IFsyLCA0M10sIDQ5OiBbMiwgNDNdLCA1MzogWzIsIDQzXSB9LCB7IDE6IFszXSB9LCB7IDU6IFsxLCA0XSB9LCB7IDU6IFsyLCAyXSwgNzogNSwgODogNiwgOTogNywgMTA6IDgsIDExOiA5LCAxMjogMTAsIDEzOiBbMSwgMTFdLCAxNDogWzEsIDE4XSwgMTU6IDE2LCAxNzogWzEsIDIxXSwgMjI6IDE0LCAyNTogMTUsIDI3OiBbMSwgMTldLCAzMjogWzEsIDIwXSwgMzc6IFsyLCAyXSwgNDI6IFsyLCAyXSwgNDU6IFsyLCAyXSwgNDY6IFsxLCAxMl0sIDQ5OiBbMSwgMTNdLCA1MzogWzEsIDE3XSB9LCB7IDE6IFsyLCAxXSB9LCB7IDU6IFsyLCA0NF0sIDEzOiBbMiwgNDRdLCAxNDogWzIsIDQ0XSwgMTc6IFsyLCA0NF0sIDI3OiBbMiwgNDRdLCAzMjogWzIsIDQ0XSwgMzc6IFsyLCA0NF0sIDQyOiBbMiwgNDRdLCA0NTogWzIsIDQ0XSwgNDY6IFsyLCA0NF0sIDQ5OiBbMiwgNDRdLCA1MzogWzIsIDQ0XSB9LCB7IDU6IFsyLCAzXSwgMTM6IFsyLCAzXSwgMTQ6IFsyLCAzXSwgMTc6IFsyLCAzXSwgMjc6IFsyLCAzXSwgMzI6IFsyLCAzXSwgMzc6IFsyLCAzXSwgNDI6IFsyLCAzXSwgNDU6IFsyLCAzXSwgNDY6IFsyLCAzXSwgNDk6IFsyLCAzXSwgNTM6IFsyLCAzXSB9LCB7IDU6IFsyLCA0XSwgMTM6IFsyLCA0XSwgMTQ6IFsyLCA0XSwgMTc6IFsyLCA0XSwgMjc6IFsyLCA0XSwgMzI6IFsyLCA0XSwgMzc6IFsyLCA0XSwgNDI6IFsyLCA0XSwgNDU6IFsyLCA0XSwgNDY6IFsyLCA0XSwgNDk6IFsyLCA0XSwgNTM6IFsyLCA0XSB9LCB7IDU6IFsyLCA1XSwgMTM6IFsyLCA1XSwgMTQ6IFsyLCA1XSwgMTc6IFsyLCA1XSwgMjc6IFsyLCA1XSwgMzI6IFsyLCA1XSwgMzc6IFsyLCA1XSwgNDI6IFsyLCA1XSwgNDU6IFsyLCA1XSwgNDY6IFsyLCA1XSwgNDk6IFsyLCA1XSwgNTM6IFsyLCA1XSB9LCB7IDU6IFsyLCA2XSwgMTM6IFsyLCA2XSwgMTQ6IFsyLCA2XSwgMTc6IFsyLCA2XSwgMjc6IFsyLCA2XSwgMzI6IFsyLCA2XSwgMzc6IFsyLCA2XSwgNDI6IFsyLCA2XSwgNDU6IFsyLCA2XSwgNDY6IFsyLCA2XSwgNDk6IFsyLCA2XSwgNTM6IFsyLCA2XSB9LCB7IDU6IFsyLCA3XSwgMTM6IFsyLCA3XSwgMTQ6IFsyLCA3XSwgMTc6IFsyLCA3XSwgMjc6IFsyLCA3XSwgMzI6IFsyLCA3XSwgMzc6IFsyLCA3XSwgNDI6IFsyLCA3XSwgNDU6IFsyLCA3XSwgNDY6IFsyLCA3XSwgNDk6IFsyLCA3XSwgNTM6IFsyLCA3XSB9LCB7IDU6IFsyLCA4XSwgMTM6IFsyLCA4XSwgMTQ6IFsyLCA4XSwgMTc6IFsyLCA4XSwgMjc6IFsyLCA4XSwgMzI6IFsyLCA4XSwgMzc6IFsyLCA4XSwgNDI6IFsyLCA4XSwgNDU6IFsyLCA4XSwgNDY6IFsyLCA4XSwgNDk6IFsyLCA4XSwgNTM6IFsyLCA4XSB9LCB7IDE4OiAyMiwgNjY6IFsxLCAzMl0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyAxODogMzMsIDY2OiBbMSwgMzJdLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgNDogMzQsIDY6IDMsIDEzOiBbMiwgNDNdLCAxNDogWzIsIDQzXSwgMTc6IFsyLCA0M10sIDI3OiBbMiwgNDNdLCAzMjogWzIsIDQzXSwgMzc6IFsyLCA0M10sIDQyOiBbMiwgNDNdLCA0NTogWzIsIDQzXSwgNDY6IFsyLCA0M10sIDQ5OiBbMiwgNDNdLCA1MzogWzIsIDQzXSB9LCB7IDQ6IDM1LCA2OiAzLCAxMzogWzIsIDQzXSwgMTQ6IFsyLCA0M10sIDE3OiBbMiwgNDNdLCAyNzogWzIsIDQzXSwgMzI6IFsyLCA0M10sIDQyOiBbMiwgNDNdLCA0NTogWzIsIDQzXSwgNDY6IFsyLCA0M10sIDQ5OiBbMiwgNDNdLCA1MzogWzIsIDQzXSB9LCB7IDEyOiAzNiwgMTQ6IFsxLCAxOF0gfSwgeyAxODogMzgsIDU0OiAzNywgNTg6IDM5LCA1OTogWzEsIDQwXSwgNjY6IFsxLCAzMl0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyA1OiBbMiwgOV0sIDEzOiBbMiwgOV0sIDE0OiBbMiwgOV0sIDE2OiBbMiwgOV0sIDE3OiBbMiwgOV0sIDI3OiBbMiwgOV0sIDMyOiBbMiwgOV0sIDM3OiBbMiwgOV0sIDQyOiBbMiwgOV0sIDQ1OiBbMiwgOV0sIDQ2OiBbMiwgOV0sIDQ5OiBbMiwgOV0sIDUzOiBbMiwgOV0gfSwgeyAxODogNDEsIDY2OiBbMSwgMzJdLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgMTg6IDQyLCA2NjogWzEsIDMyXSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDE4OiA0MywgNjY6IFsxLCAzMl0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyAzMTogWzIsIDczXSwgNDc6IDQ0LCA1OTogWzIsIDczXSwgNjY6IFsyLCA3M10sIDc0OiBbMiwgNzNdLCA3NTogWzIsIDczXSwgNzY6IFsyLCA3M10sIDc3OiBbMiwgNzNdLCA3ODogWzIsIDczXSwgNzk6IFsyLCA3M10gfSwgeyAyMTogWzIsIDMwXSwgMzE6IFsyLCAzMF0sIDUyOiBbMiwgMzBdLCA1OTogWzIsIDMwXSwgNjI6IFsyLCAzMF0sIDY2OiBbMiwgMzBdLCA2OTogWzIsIDMwXSwgNzQ6IFsyLCAzMF0sIDc1OiBbMiwgMzBdLCA3NjogWzIsIDMwXSwgNzc6IFsyLCAzMF0sIDc4OiBbMiwgMzBdLCA3OTogWzIsIDMwXSB9LCB7IDIxOiBbMiwgMzFdLCAzMTogWzIsIDMxXSwgNTI6IFsyLCAzMV0sIDU5OiBbMiwgMzFdLCA2MjogWzIsIDMxXSwgNjY6IFsyLCAzMV0sIDY5OiBbMiwgMzFdLCA3NDogWzIsIDMxXSwgNzU6IFsyLCAzMV0sIDc2OiBbMiwgMzFdLCA3NzogWzIsIDMxXSwgNzg6IFsyLCAzMV0sIDc5OiBbMiwgMzFdIH0sIHsgMjE6IFsyLCAzMl0sIDMxOiBbMiwgMzJdLCA1MjogWzIsIDMyXSwgNTk6IFsyLCAzMl0sIDYyOiBbMiwgMzJdLCA2NjogWzIsIDMyXSwgNjk6IFsyLCAzMl0sIDc0OiBbMiwgMzJdLCA3NTogWzIsIDMyXSwgNzY6IFsyLCAzMl0sIDc3OiBbMiwgMzJdLCA3ODogWzIsIDMyXSwgNzk6IFsyLCAzMl0gfSwgeyAyMTogWzIsIDMzXSwgMzE6IFsyLCAzM10sIDUyOiBbMiwgMzNdLCA1OTogWzIsIDMzXSwgNjI6IFsyLCAzM10sIDY2OiBbMiwgMzNdLCA2OTogWzIsIDMzXSwgNzQ6IFsyLCAzM10sIDc1OiBbMiwgMzNdLCA3NjogWzIsIDMzXSwgNzc6IFsyLCAzM10sIDc4OiBbMiwgMzNdLCA3OTogWzIsIDMzXSB9LCB7IDIxOiBbMiwgMzRdLCAzMTogWzIsIDM0XSwgNTI6IFsyLCAzNF0sIDU5OiBbMiwgMzRdLCA2MjogWzIsIDM0XSwgNjY6IFsyLCAzNF0sIDY5OiBbMiwgMzRdLCA3NDogWzIsIDM0XSwgNzU6IFsyLCAzNF0sIDc2OiBbMiwgMzRdLCA3NzogWzIsIDM0XSwgNzg6IFsyLCAzNF0sIDc5OiBbMiwgMzRdIH0sIHsgMjE6IFsyLCAzNV0sIDMxOiBbMiwgMzVdLCA1MjogWzIsIDM1XSwgNTk6IFsyLCAzNV0sIDYyOiBbMiwgMzVdLCA2NjogWzIsIDM1XSwgNjk6IFsyLCAzNV0sIDc0OiBbMiwgMzVdLCA3NTogWzIsIDM1XSwgNzY6IFsyLCAzNV0sIDc3OiBbMiwgMzVdLCA3ODogWzIsIDM1XSwgNzk6IFsyLCAzNV0gfSwgeyAyMTogWzIsIDM2XSwgMzE6IFsyLCAzNl0sIDUyOiBbMiwgMzZdLCA1OTogWzIsIDM2XSwgNjI6IFsyLCAzNl0sIDY2OiBbMiwgMzZdLCA2OTogWzIsIDM2XSwgNzQ6IFsyLCAzNl0sIDc1OiBbMiwgMzZdLCA3NjogWzIsIDM2XSwgNzc6IFsyLCAzNl0sIDc4OiBbMiwgMzZdLCA3OTogWzIsIDM2XSB9LCB7IDIxOiBbMiwgNDBdLCAzMTogWzIsIDQwXSwgNTI6IFsyLCA0MF0sIDU5OiBbMiwgNDBdLCA2MjogWzIsIDQwXSwgNjY6IFsyLCA0MF0sIDY5OiBbMiwgNDBdLCA3NDogWzIsIDQwXSwgNzU6IFsyLCA0MF0sIDc2OiBbMiwgNDBdLCA3NzogWzIsIDQwXSwgNzg6IFsyLCA0MF0sIDc5OiBbMiwgNDBdLCA4MTogWzEsIDQ1XSB9LCB7IDY2OiBbMSwgMzJdLCA4MDogNDYgfSwgeyAyMTogWzIsIDQyXSwgMzE6IFsyLCA0Ml0sIDUyOiBbMiwgNDJdLCA1OTogWzIsIDQyXSwgNjI6IFsyLCA0Ml0sIDY2OiBbMiwgNDJdLCA2OTogWzIsIDQyXSwgNzQ6IFsyLCA0Ml0sIDc1OiBbMiwgNDJdLCA3NjogWzIsIDQyXSwgNzc6IFsyLCA0Ml0sIDc4OiBbMiwgNDJdLCA3OTogWzIsIDQyXSwgODE6IFsyLCA0Ml0gfSwgeyA1MDogNDcsIDUyOiBbMiwgNzddLCA1OTogWzIsIDc3XSwgNjY6IFsyLCA3N10sIDc0OiBbMiwgNzddLCA3NTogWzIsIDc3XSwgNzY6IFsyLCA3N10sIDc3OiBbMiwgNzddLCA3ODogWzIsIDc3XSwgNzk6IFsyLCA3N10gfSwgeyAyMzogNDgsIDM2OiA1MCwgMzc6IFsxLCA1Ml0sIDQxOiA1MSwgNDI6IFsxLCA1M10sIDQzOiA0OSwgNDU6IFsyLCA0OV0gfSwgeyAyNjogNTQsIDQxOiA1NSwgNDI6IFsxLCA1M10sIDQ1OiBbMiwgNTFdIH0sIHsgMTY6IFsxLCA1Nl0gfSwgeyAzMTogWzIsIDgxXSwgNTU6IDU3LCA1OTogWzIsIDgxXSwgNjY6IFsyLCA4MV0sIDc0OiBbMiwgODFdLCA3NTogWzIsIDgxXSwgNzY6IFsyLCA4MV0sIDc3OiBbMiwgODFdLCA3ODogWzIsIDgxXSwgNzk6IFsyLCA4MV0gfSwgeyAzMTogWzIsIDM3XSwgNTk6IFsyLCAzN10sIDY2OiBbMiwgMzddLCA3NDogWzIsIDM3XSwgNzU6IFsyLCAzN10sIDc2OiBbMiwgMzddLCA3NzogWzIsIDM3XSwgNzg6IFsyLCAzN10sIDc5OiBbMiwgMzddIH0sIHsgMzE6IFsyLCAzOF0sIDU5OiBbMiwgMzhdLCA2NjogWzIsIDM4XSwgNzQ6IFsyLCAzOF0sIDc1OiBbMiwgMzhdLCA3NjogWzIsIDM4XSwgNzc6IFsyLCAzOF0sIDc4OiBbMiwgMzhdLCA3OTogWzIsIDM4XSB9LCB7IDE4OiA1OCwgNjY6IFsxLCAzMl0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyAyODogNTksIDMxOiBbMiwgNTNdLCA1OTogWzIsIDUzXSwgNjY6IFsyLCA1M10sIDY5OiBbMiwgNTNdLCA3NDogWzIsIDUzXSwgNzU6IFsyLCA1M10sIDc2OiBbMiwgNTNdLCA3NzogWzIsIDUzXSwgNzg6IFsyLCA1M10sIDc5OiBbMiwgNTNdIH0sIHsgMzE6IFsyLCA1OV0sIDMzOiA2MCwgNTk6IFsyLCA1OV0sIDY2OiBbMiwgNTldLCA2OTogWzIsIDU5XSwgNzQ6IFsyLCA1OV0sIDc1OiBbMiwgNTldLCA3NjogWzIsIDU5XSwgNzc6IFsyLCA1OV0sIDc4OiBbMiwgNTldLCA3OTogWzIsIDU5XSB9LCB7IDE5OiA2MSwgMjE6IFsyLCA0NV0sIDU5OiBbMiwgNDVdLCA2NjogWzIsIDQ1XSwgNzQ6IFsyLCA0NV0sIDc1OiBbMiwgNDVdLCA3NjogWzIsIDQ1XSwgNzc6IFsyLCA0NV0sIDc4OiBbMiwgNDVdLCA3OTogWzIsIDQ1XSB9LCB7IDE4OiA2NSwgMzE6IFsyLCA3NV0sIDQ4OiA2MiwgNTc6IDYzLCA1ODogNjYsIDU5OiBbMSwgNDBdLCA2MzogNjQsIDY0OiA2NywgNjU6IDY4LCA2NjogWzEsIDY5XSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDY2OiBbMSwgNzBdIH0sIHsgMjE6IFsyLCAzOV0sIDMxOiBbMiwgMzldLCA1MjogWzIsIDM5XSwgNTk6IFsyLCAzOV0sIDYyOiBbMiwgMzldLCA2NjogWzIsIDM5XSwgNjk6IFsyLCAzOV0sIDc0OiBbMiwgMzldLCA3NTogWzIsIDM5XSwgNzY6IFsyLCAzOV0sIDc3OiBbMiwgMzldLCA3ODogWzIsIDM5XSwgNzk6IFsyLCAzOV0sIDgxOiBbMSwgNDVdIH0sIHsgMTg6IDY1LCA1MTogNzEsIDUyOiBbMiwgNzldLCA1NzogNzIsIDU4OiA2NiwgNTk6IFsxLCA0MF0sIDYzOiA3MywgNjQ6IDY3LCA2NTogNjgsIDY2OiBbMSwgNjldLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgMjQ6IDc0LCA0NTogWzEsIDc1XSB9LCB7IDQ1OiBbMiwgNTBdIH0sIHsgNDogNzYsIDY6IDMsIDEzOiBbMiwgNDNdLCAxNDogWzIsIDQzXSwgMTc6IFsyLCA0M10sIDI3OiBbMiwgNDNdLCAzMjogWzIsIDQzXSwgMzc6IFsyLCA0M10sIDQyOiBbMiwgNDNdLCA0NTogWzIsIDQzXSwgNDY6IFsyLCA0M10sIDQ5OiBbMiwgNDNdLCA1MzogWzIsIDQzXSB9LCB7IDQ1OiBbMiwgMTldIH0sIHsgMTg6IDc3LCA2NjogWzEsIDMyXSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDQ6IDc4LCA2OiAzLCAxMzogWzIsIDQzXSwgMTQ6IFsyLCA0M10sIDE3OiBbMiwgNDNdLCAyNzogWzIsIDQzXSwgMzI6IFsyLCA0M10sIDQ1OiBbMiwgNDNdLCA0NjogWzIsIDQzXSwgNDk6IFsyLCA0M10sIDUzOiBbMiwgNDNdIH0sIHsgMjQ6IDc5LCA0NTogWzEsIDc1XSB9LCB7IDQ1OiBbMiwgNTJdIH0sIHsgNTogWzIsIDEwXSwgMTM6IFsyLCAxMF0sIDE0OiBbMiwgMTBdLCAxNzogWzIsIDEwXSwgMjc6IFsyLCAxMF0sIDMyOiBbMiwgMTBdLCAzNzogWzIsIDEwXSwgNDI6IFsyLCAxMF0sIDQ1OiBbMiwgMTBdLCA0NjogWzIsIDEwXSwgNDk6IFsyLCAxMF0sIDUzOiBbMiwgMTBdIH0sIHsgMTg6IDY1LCAzMTogWzIsIDgzXSwgNTY6IDgwLCA1NzogODEsIDU4OiA2NiwgNTk6IFsxLCA0MF0sIDYzOiA4MiwgNjQ6IDY3LCA2NTogNjgsIDY2OiBbMSwgNjldLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgNTk6IFsyLCA4NV0sIDYwOiA4MywgNjI6IFsyLCA4NV0sIDY2OiBbMiwgODVdLCA3NDogWzIsIDg1XSwgNzU6IFsyLCA4NV0sIDc2OiBbMiwgODVdLCA3NzogWzIsIDg1XSwgNzg6IFsyLCA4NV0sIDc5OiBbMiwgODVdIH0sIHsgMTg6IDY1LCAyOTogODQsIDMxOiBbMiwgNTVdLCA1NzogODUsIDU4OiA2NiwgNTk6IFsxLCA0MF0sIDYzOiA4NiwgNjQ6IDY3LCA2NTogNjgsIDY2OiBbMSwgNjldLCA2OTogWzIsIDU1XSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDE4OiA2NSwgMzE6IFsyLCA2MV0sIDM0OiA4NywgNTc6IDg4LCA1ODogNjYsIDU5OiBbMSwgNDBdLCA2MzogODksIDY0OiA2NywgNjU6IDY4LCA2NjogWzEsIDY5XSwgNjk6IFsyLCA2MV0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyAxODogNjUsIDIwOiA5MCwgMjE6IFsyLCA0N10sIDU3OiA5MSwgNTg6IDY2LCA1OTogWzEsIDQwXSwgNjM6IDkyLCA2NDogNjcsIDY1OiA2OCwgNjY6IFsxLCA2OV0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyAzMTogWzEsIDkzXSB9LCB7IDMxOiBbMiwgNzRdLCA1OTogWzIsIDc0XSwgNjY6IFsyLCA3NF0sIDc0OiBbMiwgNzRdLCA3NTogWzIsIDc0XSwgNzY6IFsyLCA3NF0sIDc3OiBbMiwgNzRdLCA3ODogWzIsIDc0XSwgNzk6IFsyLCA3NF0gfSwgeyAzMTogWzIsIDc2XSB9LCB7IDIxOiBbMiwgMjRdLCAzMTogWzIsIDI0XSwgNTI6IFsyLCAyNF0sIDU5OiBbMiwgMjRdLCA2MjogWzIsIDI0XSwgNjY6IFsyLCAyNF0sIDY5OiBbMiwgMjRdLCA3NDogWzIsIDI0XSwgNzU6IFsyLCAyNF0sIDc2OiBbMiwgMjRdLCA3NzogWzIsIDI0XSwgNzg6IFsyLCAyNF0sIDc5OiBbMiwgMjRdIH0sIHsgMjE6IFsyLCAyNV0sIDMxOiBbMiwgMjVdLCA1MjogWzIsIDI1XSwgNTk6IFsyLCAyNV0sIDYyOiBbMiwgMjVdLCA2NjogWzIsIDI1XSwgNjk6IFsyLCAyNV0sIDc0OiBbMiwgMjVdLCA3NTogWzIsIDI1XSwgNzY6IFsyLCAyNV0sIDc3OiBbMiwgMjVdLCA3ODogWzIsIDI1XSwgNzk6IFsyLCAyNV0gfSwgeyAyMTogWzIsIDI3XSwgMzE6IFsyLCAyN10sIDUyOiBbMiwgMjddLCA2MjogWzIsIDI3XSwgNjU6IDk0LCA2NjogWzEsIDk1XSwgNjk6IFsyLCAyN10gfSwgeyAyMTogWzIsIDg5XSwgMzE6IFsyLCA4OV0sIDUyOiBbMiwgODldLCA2MjogWzIsIDg5XSwgNjY6IFsyLCA4OV0sIDY5OiBbMiwgODldIH0sIHsgMjE6IFsyLCA0Ml0sIDMxOiBbMiwgNDJdLCA1MjogWzIsIDQyXSwgNTk6IFsyLCA0Ml0sIDYyOiBbMiwgNDJdLCA2NjogWzIsIDQyXSwgNjc6IFsxLCA5Nl0sIDY5OiBbMiwgNDJdLCA3NDogWzIsIDQyXSwgNzU6IFsyLCA0Ml0sIDc2OiBbMiwgNDJdLCA3NzogWzIsIDQyXSwgNzg6IFsyLCA0Ml0sIDc5OiBbMiwgNDJdLCA4MTogWzIsIDQyXSB9LCB7IDIxOiBbMiwgNDFdLCAzMTogWzIsIDQxXSwgNTI6IFsyLCA0MV0sIDU5OiBbMiwgNDFdLCA2MjogWzIsIDQxXSwgNjY6IFsyLCA0MV0sIDY5OiBbMiwgNDFdLCA3NDogWzIsIDQxXSwgNzU6IFsyLCA0MV0sIDc2OiBbMiwgNDFdLCA3NzogWzIsIDQxXSwgNzg6IFsyLCA0MV0sIDc5OiBbMiwgNDFdLCA4MTogWzIsIDQxXSB9LCB7IDUyOiBbMSwgOTddIH0sIHsgNTI6IFsyLCA3OF0sIDU5OiBbMiwgNzhdLCA2NjogWzIsIDc4XSwgNzQ6IFsyLCA3OF0sIDc1OiBbMiwgNzhdLCA3NjogWzIsIDc4XSwgNzc6IFsyLCA3OF0sIDc4OiBbMiwgNzhdLCA3OTogWzIsIDc4XSB9LCB7IDUyOiBbMiwgODBdIH0sIHsgNTogWzIsIDEyXSwgMTM6IFsyLCAxMl0sIDE0OiBbMiwgMTJdLCAxNzogWzIsIDEyXSwgMjc6IFsyLCAxMl0sIDMyOiBbMiwgMTJdLCAzNzogWzIsIDEyXSwgNDI6IFsyLCAxMl0sIDQ1OiBbMiwgMTJdLCA0NjogWzIsIDEyXSwgNDk6IFsyLCAxMl0sIDUzOiBbMiwgMTJdIH0sIHsgMTg6IDk4LCA2NjogWzEsIDMyXSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDM2OiA1MCwgMzc6IFsxLCA1Ml0sIDQxOiA1MSwgNDI6IFsxLCA1M10sIDQzOiAxMDAsIDQ0OiA5OSwgNDU6IFsyLCA3MV0gfSwgeyAzMTogWzIsIDY1XSwgMzg6IDEwMSwgNTk6IFsyLCA2NV0sIDY2OiBbMiwgNjVdLCA2OTogWzIsIDY1XSwgNzQ6IFsyLCA2NV0sIDc1OiBbMiwgNjVdLCA3NjogWzIsIDY1XSwgNzc6IFsyLCA2NV0sIDc4OiBbMiwgNjVdLCA3OTogWzIsIDY1XSB9LCB7IDQ1OiBbMiwgMTddIH0sIHsgNTogWzIsIDEzXSwgMTM6IFsyLCAxM10sIDE0OiBbMiwgMTNdLCAxNzogWzIsIDEzXSwgMjc6IFsyLCAxM10sIDMyOiBbMiwgMTNdLCAzNzogWzIsIDEzXSwgNDI6IFsyLCAxM10sIDQ1OiBbMiwgMTNdLCA0NjogWzIsIDEzXSwgNDk6IFsyLCAxM10sIDUzOiBbMiwgMTNdIH0sIHsgMzE6IFsxLCAxMDJdIH0sIHsgMzE6IFsyLCA4Ml0sIDU5OiBbMiwgODJdLCA2NjogWzIsIDgyXSwgNzQ6IFsyLCA4Ml0sIDc1OiBbMiwgODJdLCA3NjogWzIsIDgyXSwgNzc6IFsyLCA4Ml0sIDc4OiBbMiwgODJdLCA3OTogWzIsIDgyXSB9LCB7IDMxOiBbMiwgODRdIH0sIHsgMTg6IDY1LCA1NzogMTA0LCA1ODogNjYsIDU5OiBbMSwgNDBdLCA2MTogMTAzLCA2MjogWzIsIDg3XSwgNjM6IDEwNSwgNjQ6IDY3LCA2NTogNjgsIDY2OiBbMSwgNjldLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgMzA6IDEwNiwgMzE6IFsyLCA1N10sIDY4OiAxMDcsIDY5OiBbMSwgMTA4XSB9LCB7IDMxOiBbMiwgNTRdLCA1OTogWzIsIDU0XSwgNjY6IFsyLCA1NF0sIDY5OiBbMiwgNTRdLCA3NDogWzIsIDU0XSwgNzU6IFsyLCA1NF0sIDc2OiBbMiwgNTRdLCA3NzogWzIsIDU0XSwgNzg6IFsyLCA1NF0sIDc5OiBbMiwgNTRdIH0sIHsgMzE6IFsyLCA1Nl0sIDY5OiBbMiwgNTZdIH0sIHsgMzE6IFsyLCA2M10sIDM1OiAxMDksIDY4OiAxMTAsIDY5OiBbMSwgMTA4XSB9LCB7IDMxOiBbMiwgNjBdLCA1OTogWzIsIDYwXSwgNjY6IFsyLCA2MF0sIDY5OiBbMiwgNjBdLCA3NDogWzIsIDYwXSwgNzU6IFsyLCA2MF0sIDc2OiBbMiwgNjBdLCA3NzogWzIsIDYwXSwgNzg6IFsyLCA2MF0sIDc5OiBbMiwgNjBdIH0sIHsgMzE6IFsyLCA2Ml0sIDY5OiBbMiwgNjJdIH0sIHsgMjE6IFsxLCAxMTFdIH0sIHsgMjE6IFsyLCA0Nl0sIDU5OiBbMiwgNDZdLCA2NjogWzIsIDQ2XSwgNzQ6IFsyLCA0Nl0sIDc1OiBbMiwgNDZdLCA3NjogWzIsIDQ2XSwgNzc6IFsyLCA0Nl0sIDc4OiBbMiwgNDZdLCA3OTogWzIsIDQ2XSB9LCB7IDIxOiBbMiwgNDhdIH0sIHsgNTogWzIsIDIxXSwgMTM6IFsyLCAyMV0sIDE0OiBbMiwgMjFdLCAxNzogWzIsIDIxXSwgMjc6IFsyLCAyMV0sIDMyOiBbMiwgMjFdLCAzNzogWzIsIDIxXSwgNDI6IFsyLCAyMV0sIDQ1OiBbMiwgMjFdLCA0NjogWzIsIDIxXSwgNDk6IFsyLCAyMV0sIDUzOiBbMiwgMjFdIH0sIHsgMjE6IFsyLCA5MF0sIDMxOiBbMiwgOTBdLCA1MjogWzIsIDkwXSwgNjI6IFsyLCA5MF0sIDY2OiBbMiwgOTBdLCA2OTogWzIsIDkwXSB9LCB7IDY3OiBbMSwgOTZdIH0sIHsgMTg6IDY1LCA1NzogMTEyLCA1ODogNjYsIDU5OiBbMSwgNDBdLCA2NjogWzEsIDMyXSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDU6IFsyLCAyMl0sIDEzOiBbMiwgMjJdLCAxNDogWzIsIDIyXSwgMTc6IFsyLCAyMl0sIDI3OiBbMiwgMjJdLCAzMjogWzIsIDIyXSwgMzc6IFsyLCAyMl0sIDQyOiBbMiwgMjJdLCA0NTogWzIsIDIyXSwgNDY6IFsyLCAyMl0sIDQ5OiBbMiwgMjJdLCA1MzogWzIsIDIyXSB9LCB7IDMxOiBbMSwgMTEzXSB9LCB7IDQ1OiBbMiwgMThdIH0sIHsgNDU6IFsyLCA3Ml0gfSwgeyAxODogNjUsIDMxOiBbMiwgNjddLCAzOTogMTE0LCA1NzogMTE1LCA1ODogNjYsIDU5OiBbMSwgNDBdLCA2MzogMTE2LCA2NDogNjcsIDY1OiA2OCwgNjY6IFsxLCA2OV0sIDY5OiBbMiwgNjddLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgNTogWzIsIDIzXSwgMTM6IFsyLCAyM10sIDE0OiBbMiwgMjNdLCAxNzogWzIsIDIzXSwgMjc6IFsyLCAyM10sIDMyOiBbMiwgMjNdLCAzNzogWzIsIDIzXSwgNDI6IFsyLCAyM10sIDQ1OiBbMiwgMjNdLCA0NjogWzIsIDIzXSwgNDk6IFsyLCAyM10sIDUzOiBbMiwgMjNdIH0sIHsgNjI6IFsxLCAxMTddIH0sIHsgNTk6IFsyLCA4Nl0sIDYyOiBbMiwgODZdLCA2NjogWzIsIDg2XSwgNzQ6IFsyLCA4Nl0sIDc1OiBbMiwgODZdLCA3NjogWzIsIDg2XSwgNzc6IFsyLCA4Nl0sIDc4OiBbMiwgODZdLCA3OTogWzIsIDg2XSB9LCB7IDYyOiBbMiwgODhdIH0sIHsgMzE6IFsxLCAxMThdIH0sIHsgMzE6IFsyLCA1OF0gfSwgeyA2NjogWzEsIDEyMF0sIDcwOiAxMTkgfSwgeyAzMTogWzEsIDEyMV0gfSwgeyAzMTogWzIsIDY0XSB9LCB7IDE0OiBbMiwgMTFdIH0sIHsgMjE6IFsyLCAyOF0sIDMxOiBbMiwgMjhdLCA1MjogWzIsIDI4XSwgNjI6IFsyLCAyOF0sIDY2OiBbMiwgMjhdLCA2OTogWzIsIDI4XSB9LCB7IDU6IFsyLCAyMF0sIDEzOiBbMiwgMjBdLCAxNDogWzIsIDIwXSwgMTc6IFsyLCAyMF0sIDI3OiBbMiwgMjBdLCAzMjogWzIsIDIwXSwgMzc6IFsyLCAyMF0sIDQyOiBbMiwgMjBdLCA0NTogWzIsIDIwXSwgNDY6IFsyLCAyMF0sIDQ5OiBbMiwgMjBdLCA1MzogWzIsIDIwXSB9LCB7IDMxOiBbMiwgNjldLCA0MDogMTIyLCA2ODogMTIzLCA2OTogWzEsIDEwOF0gfSwgeyAzMTogWzIsIDY2XSwgNTk6IFsyLCA2Nl0sIDY2OiBbMiwgNjZdLCA2OTogWzIsIDY2XSwgNzQ6IFsyLCA2Nl0sIDc1OiBbMiwgNjZdLCA3NjogWzIsIDY2XSwgNzc6IFsyLCA2Nl0sIDc4OiBbMiwgNjZdLCA3OTogWzIsIDY2XSB9LCB7IDMxOiBbMiwgNjhdLCA2OTogWzIsIDY4XSB9LCB7IDIxOiBbMiwgMjZdLCAzMTogWzIsIDI2XSwgNTI6IFsyLCAyNl0sIDU5OiBbMiwgMjZdLCA2MjogWzIsIDI2XSwgNjY6IFsyLCAyNl0sIDY5OiBbMiwgMjZdLCA3NDogWzIsIDI2XSwgNzU6IFsyLCAyNl0sIDc2OiBbMiwgMjZdLCA3NzogWzIsIDI2XSwgNzg6IFsyLCAyNl0sIDc5OiBbMiwgMjZdIH0sIHsgMTM6IFsyLCAxNF0sIDE0OiBbMiwgMTRdLCAxNzogWzIsIDE0XSwgMjc6IFsyLCAxNF0sIDMyOiBbMiwgMTRdLCAzNzogWzIsIDE0XSwgNDI6IFsyLCAxNF0sIDQ1OiBbMiwgMTRdLCA0NjogWzIsIDE0XSwgNDk6IFsyLCAxNF0sIDUzOiBbMiwgMTRdIH0sIHsgNjY6IFsxLCAxMjVdLCA3MTogWzEsIDEyNF0gfSwgeyA2NjogWzIsIDkxXSwgNzE6IFsyLCA5MV0gfSwgeyAxMzogWzIsIDE1XSwgMTQ6IFsyLCAxNV0sIDE3OiBbMiwgMTVdLCAyNzogWzIsIDE1XSwgMzI6IFsyLCAxNV0sIDQyOiBbMiwgMTVdLCA0NTogWzIsIDE1XSwgNDY6IFsyLCAxNV0sIDQ5OiBbMiwgMTVdLCA1MzogWzIsIDE1XSB9LCB7IDMxOiBbMSwgMTI2XSB9LCB7IDMxOiBbMiwgNzBdIH0sIHsgMzE6IFsyLCAyOV0gfSwgeyA2NjogWzIsIDkyXSwgNzE6IFsyLCA5Ml0gfSwgeyAxMzogWzIsIDE2XSwgMTQ6IFsyLCAxNl0sIDE3OiBbMiwgMTZdLCAyNzogWzIsIDE2XSwgMzI6IFsyLCAxNl0sIDM3OiBbMiwgMTZdLCA0MjogWzIsIDE2XSwgNDU6IFsyLCAxNl0sIDQ2OiBbMiwgMTZdLCA0OTogWzIsIDE2XSwgNTM6IFsyLCAxNl0gfV0sXG4gICAgICAgIGRlZmF1bHRBY3Rpb25zOiB7IDQ6IFsyLCAxXSwgNDk6IFsyLCA1MF0sIDUxOiBbMiwgMTldLCA1NTogWzIsIDUyXSwgNjQ6IFsyLCA3Nl0sIDczOiBbMiwgODBdLCA3ODogWzIsIDE3XSwgODI6IFsyLCA4NF0sIDkyOiBbMiwgNDhdLCA5OTogWzIsIDE4XSwgMTAwOiBbMiwgNzJdLCAxMDU6IFsyLCA4OF0sIDEwNzogWzIsIDU4XSwgMTEwOiBbMiwgNjRdLCAxMTE6IFsyLCAxMV0sIDEyMzogWzIsIDcwXSwgMTI0OiBbMiwgMjldIH0sXG4gICAgICAgIHBhcnNlRXJyb3I6IGZ1bmN0aW9uIHBhcnNlRXJyb3Ioc3RyLCBoYXNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3RyKTtcbiAgICAgICAgfSxcbiAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGlucHV0KSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgICAgICAgICAgc3RhY2sgPSBbMF0sXG4gICAgICAgICAgICAgICAgdnN0YWNrID0gW251bGxdLFxuICAgICAgICAgICAgICAgIGxzdGFjayA9IFtdLFxuICAgICAgICAgICAgICAgIHRhYmxlID0gdGhpcy50YWJsZSxcbiAgICAgICAgICAgICAgICB5eXRleHQgPSBcIlwiLFxuICAgICAgICAgICAgICAgIHl5bGluZW5vID0gMCxcbiAgICAgICAgICAgICAgICB5eWxlbmcgPSAwLFxuICAgICAgICAgICAgICAgIHJlY292ZXJpbmcgPSAwLFxuICAgICAgICAgICAgICAgIFRFUlJPUiA9IDIsXG4gICAgICAgICAgICAgICAgRU9GID0gMTtcbiAgICAgICAgICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7XG4gICAgICAgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjtcbiAgICAgICAgICAgIHRoaXMueXkucGFyc2VyID0gdGhpcztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gXCJ1bmRlZmluZWRcIikgdGhpcy5sZXhlci55eWxsb2MgPSB7fTtcbiAgICAgICAgICAgIHZhciB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jO1xuICAgICAgICAgICAgbHN0YWNrLnB1c2goeXlsb2MpO1xuICAgICAgICAgICAgdmFyIHJhbmdlcyA9IHRoaXMubGV4ZXIub3B0aW9ucyAmJiB0aGlzLmxleGVyLm9wdGlvbnMucmFuZ2VzO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnl5LnBhcnNlRXJyb3IgPT09IFwiZnVuY3Rpb25cIikgdGhpcy5wYXJzZUVycm9yID0gdGhpcy55eS5wYXJzZUVycm9yO1xuICAgICAgICAgICAgZnVuY3Rpb24gcG9wU3RhY2sobikge1xuICAgICAgICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IHN0YWNrLmxlbmd0aCAtIDIgKiBuO1xuICAgICAgICAgICAgICAgIHZzdGFjay5sZW5ndGggPSB2c3RhY2subGVuZ3RoIC0gbjtcbiAgICAgICAgICAgICAgICBsc3RhY2subGVuZ3RoID0gbHN0YWNrLmxlbmd0aCAtIG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBsZXgoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRva2VuO1xuICAgICAgICAgICAgICAgIHRva2VuID0gc2VsZi5sZXhlci5sZXgoKSB8fCAxO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdG9rZW4gIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHN5bWJvbCxcbiAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCxcbiAgICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgICAgYSxcbiAgICAgICAgICAgICAgICByLFxuICAgICAgICAgICAgICAgIHl5dmFsID0ge30sXG4gICAgICAgICAgICAgICAgcCxcbiAgICAgICAgICAgICAgICBsZW4sXG4gICAgICAgICAgICAgICAgbmV3U3RhdGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBsZXgoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSB0YWJsZVtzdGF0ZV0gJiYgdGFibGVbc3RhdGVdW3N5bWJvbF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSBcInVuZGVmaW5lZFwiIHx8ICFhY3Rpb24ubGVuZ3RoIHx8ICFhY3Rpb25bMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVyclN0ciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKFwiJ1wiICsgdGhpcy50ZXJtaW5hbHNfW3BdICsgXCInXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gXCJQYXJzZSBlcnJvciBvbiBsaW5lIFwiICsgKHl5bGluZW5vICsgMSkgKyBcIjpcXG5cIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyBcIlxcbkV4cGVjdGluZyBcIiArIGV4cGVjdGVkLmpvaW4oXCIsIFwiKSArIFwiLCBnb3QgJ1wiICsgKHRoaXMudGVybWluYWxzX1tzeW1ib2xdIHx8IHN5bWJvbCkgKyBcIidcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gXCJQYXJzZSBlcnJvciBvbiBsaW5lIFwiICsgKHl5bGluZW5vICsgMSkgKyBcIjogVW5leHBlY3RlZCBcIiArIChzeW1ib2wgPT0gMSA/IFwiZW5kIG9mIGlucHV0XCIgOiBcIidcIiArICh0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wpICsgXCInXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUVycm9yKGVyclN0ciwgeyB0ZXh0OiB0aGlzLmxleGVyLm1hdGNoLCB0b2tlbjogdGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sLCBsaW5lOiB0aGlzLmxleGVyLnl5bGluZW5vLCBsb2M6IHl5bG9jLCBleHBlY3RlZDogZXhwZWN0ZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvblswXSBpbnN0YW5jZW9mIEFycmF5ICYmIGFjdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhcnNlIEVycm9yOiBtdWx0aXBsZSBhY3Rpb25zIHBvc3NpYmxlIGF0IHN0YXRlOiBcIiArIHN0YXRlICsgXCIsIHRva2VuOiBcIiArIHN5bWJvbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goc3ltYm9sKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZzdGFjay5wdXNoKHRoaXMubGV4ZXIueXl0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjay5wdXNoKHRoaXMubGV4ZXIueXlsbG9jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYWN0aW9uWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZUVycm9yU3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlsZW5nID0gdGhpcy5sZXhlci55eWxlbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeXl0ZXh0ID0gdGhpcy5sZXhlci55eXRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlsaW5lbm8gPSB0aGlzLmxleGVyLnl5bGluZW5vO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bG9jID0gdGhpcy5sZXhlci55eWxsb2M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY292ZXJpbmcgPiAwKSByZWNvdmVyaW5nLS07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCA9IHByZUVycm9yU3ltYm9sO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZUVycm9yU3ltYm9sID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSB0aGlzLnByb2R1Y3Rpb25zX1thY3Rpb25bMV1dWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgeXl2YWwuJCA9IHZzdGFja1t2c3RhY2subGVuZ3RoIC0gbGVuXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kID0geyBmaXJzdF9saW5lOiBsc3RhY2tbbHN0YWNrLmxlbmd0aCAtIChsZW4gfHwgMSldLmZpcnN0X2xpbmUsIGxhc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2xpbmUsIGZpcnN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9jb2x1bW4sIGxhc3RfY29sdW1uOiBsc3RhY2tbbHN0YWNrLmxlbmd0aCAtIDFdLmxhc3RfY29sdW1uIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeXl2YWwuXyQucmFuZ2UgPSBbbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5yYW5nZVswXSwgbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5yYW5nZVsxXV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByID0gdGhpcy5wZXJmb3JtQWN0aW9uLmNhbGwoeXl2YWwsIHl5dGV4dCwgeXlsZW5nLCB5eWxpbmVubywgdGhpcy55eSwgYWN0aW9uWzFdLCB2c3RhY2ssIGxzdGFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjayA9IHN0YWNrLnNsaWNlKDAsIC0xICogbGVuICogMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdnN0YWNrID0gdnN0YWNrLnNsaWNlKDAsIC0xICogbGVuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sgPSBsc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0aGlzLnByb2R1Y3Rpb25zX1thY3Rpb25bMV1dWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZzdGFjay5wdXNoKHl5dmFsLiQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbHN0YWNrLnB1c2goeXl2YWwuXyQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPSB0YWJsZVtzdGFja1tzdGFjay5sZW5ndGggLSAyXV1bc3RhY2tbc3RhY2subGVuZ3RoIC0gMV1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXdTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qIEppc29uIGdlbmVyYXRlZCBsZXhlciAqL1xuICAgIHZhciBsZXhlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsZXhlciA9IHsgRU9GOiAxLFxuICAgICAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy55eS5wYXJzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55eS5wYXJzZXIucGFyc2VFcnJvcihzdHIsIGhhc2gpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXRJbnB1dDogZnVuY3Rpb24gc2V0SW5wdXQoaW5wdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSB0aGlzLl9sZXNzID0gdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubyA9IHRoaXMueXlsZW5nID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9IHRoaXMubWF0Y2hlZCA9IHRoaXMubWF0Y2ggPSBcIlwiO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbXCJJTklUSUFMXCJdO1xuICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jID0geyBmaXJzdF9saW5lOiAxLCBmaXJzdF9jb2x1bW46IDAsIGxhc3RfbGluZTogMSwgbGFzdF9jb2x1bW46IDAgfTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2UgPSBbMCwgMF07XG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlucHV0OiBmdW5jdGlvbiBpbnB1dCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLl9pbnB1dFswXTtcbiAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCArPSBjaDtcbiAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZysrO1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaCArPSBjaDtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWQgKz0gY2g7XG4gICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gY2gubWF0Y2goLyg/Olxcclxcbj98XFxuKS4qL2cpO1xuICAgICAgICAgICAgICAgIGlmIChsaW5lcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGluZW5vKys7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLmxhc3RfbGluZSsrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLmxhc3RfY29sdW1uKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmFuZ2VzKSB0aGlzLnl5bGxvYy5yYW5nZVsxXSsrO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2g7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5wdXQ6IGZ1bmN0aW9uIHVucHV0KGNoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XFxyXFxuP3xcXG4pL2cpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSBjaCArIHRoaXMuX2lucHV0O1xuICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy55eXRleHQuc3Vic3RyKDAsIHRoaXMueXl0ZXh0Lmxlbmd0aCAtIGxlbiAtIDEpO1xuICAgICAgICAgICAgICAgIC8vdGhpcy55eWxlbmcgLT0gbGVuO1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0IC09IGxlbjtcbiAgICAgICAgICAgICAgICB2YXIgb2xkTGluZXMgPSB0aGlzLm1hdGNoLnNwbGl0KC8oPzpcXHJcXG4/fFxcbikvZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaCA9IHRoaXMubWF0Y2guc3Vic3RyKDAsIHRoaXMubWF0Y2gubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaGVkLnN1YnN0cigwLCB0aGlzLm1hdGNoZWQubGVuZ3RoIC0gMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoIC0gMSkgdGhpcy55eWxpbmVubyAtPSBsaW5lcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy55eWxsb2MucmFuZ2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSxcbiAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IChsaW5lcy5sZW5ndGggPT09IG9sZExpbmVzLmxlbmd0aCA/IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiA6IDApICsgb2xkTGluZXNbb2xkTGluZXMubGVuZ3RoIC0gbGluZXMubGVuZ3RoXS5sZW5ndGggLSBsaW5lc1swXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW5cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxsb2MucmFuZ2UgPSBbclswXSwgclswXSArIHRoaXMueXlsZW5nIC0gbGVuXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW9yZTogZnVuY3Rpb24gbW9yZSgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZXNzOiBmdW5jdGlvbiBsZXNzKG4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVucHV0KHRoaXMubWF0Y2guc2xpY2UobikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhc3RJbnB1dDogZnVuY3Rpb24gcGFzdElucHV0KCkge1xuICAgICAgICAgICAgICAgIHZhciBwYXN0ID0gdGhpcy5tYXRjaGVkLnN1YnN0cigwLCB0aGlzLm1hdGNoZWQubGVuZ3RoIC0gdGhpcy5tYXRjaC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHJldHVybiAocGFzdC5sZW5ndGggPiAyMCA/IFwiLi4uXCIgOiBcIlwiKSArIHBhc3Quc3Vic3RyKC0yMCkucmVwbGFjZSgvXFxuL2csIFwiXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwY29taW5nSW5wdXQ6IGZ1bmN0aW9uIHVwY29taW5nSW5wdXQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5leHQgPSB0aGlzLm1hdGNoO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0Lmxlbmd0aCA8IDIwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQgKz0gdGhpcy5faW5wdXQuc3Vic3RyKDAsIDIwIC0gbmV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKG5leHQuc3Vic3RyKDAsIDIwKSArIChuZXh0Lmxlbmd0aCA+IDIwID8gXCIuLi5cIiA6IFwiXCIpKS5yZXBsYWNlKC9cXG4vZywgXCJcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbiBzaG93UG9zaXRpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oXCItXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmUgKyB0aGlzLnVwY29taW5nSW5wdXQoKSArIFwiXFxuXCIgKyBjICsgXCJeXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkVPRjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pbnB1dCkgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHZhciB0b2tlbiwgbWF0Y2gsIHRlbXBNYXRjaCwgaW5kZXgsIGNvbCwgbGluZXM7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9tb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHRoaXMuX2N1cnJlbnRSdWxlcygpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGVtcE1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE1hdGNoICYmICghbWF0Y2ggfHwgdGVtcE1hdGNoWzBdLmxlbmd0aCA+IG1hdGNoWzBdLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmxleCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/Olxcclxcbj98XFxuKS4qL2cpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggLSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5tYXRjaCgvXFxyP1xcbj8vKVswXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbiArIG1hdGNoWzBdLmxlbmd0aCB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCArPSBtYXRjaFswXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaCArPSBtYXRjaFswXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVzID0gbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueXlsZW5nID0gdGhpcy55eXRleHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxsb2MucmFuZ2UgPSBbdGhpcy5vZmZzZXQsIHRoaXMub2Zmc2V0ICs9IHRoaXMueXlsZW5nXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gdGhpcy5faW5wdXQuc2xpY2UobWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IG1hdGNoWzBdO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHRoaXMsIHRoaXMueXksIHRoaXMsIHJ1bGVzW2luZGV4XSwgdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZG9uZSAmJiB0aGlzLl9pbnB1dCkgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbnB1dCA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcihcIkxleGljYWwgZXJyb3Igb24gbGluZSBcIiArICh0aGlzLnl5bGluZW5vICsgMSkgKyBcIi4gVW5yZWNvZ25pemVkIHRleHQuXFxuXCIgKyB0aGlzLnNob3dQb3NpdGlvbigpLCB7IHRleHQ6IFwiXCIsIHRva2VuOiBudWxsLCBsaW5lOiB0aGlzLnl5bGluZW5vIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZXg6IGZ1bmN0aW9uIGxleCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmVnaW46IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbiBwb3BTdGF0ZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24gdG9wU3RhdGUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAyXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTtcbiAgICAgICAgICAgIH0gfTtcbiAgICAgICAgbGV4ZXIub3B0aW9ucyA9IHt9O1xuICAgICAgICBsZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUKSB7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHN0cmlwKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKHN0YXJ0LCB5eV8ueXlsZW5nIC0gZW5kKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIFlZU1RBVEUgPSBZWV9TVEFSVDtcbiAgICAgICAgICAgIHN3aXRjaCAoJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTIpID09PSBcIlxcXFxcXFxcXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbihcIm11XCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTEpID09PSBcIlxcXFxcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAoMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKFwiZW11XCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbihcIm11XCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh5eV8ueXl0ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTQ7XG4gICAgICAgICAgICAgICAgICAgIH1icmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cig1LCB5eV8ueXlsZW5nIC0gOSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2O1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEzO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU5O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA2MjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKFwicmF3XCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjE7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUzO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA0NTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpO3JldHVybiA0MjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpO3JldHVybiA0MjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA0OTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ2O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVucHV0KHl5Xy55eXRleHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oXCJjb21cIik7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTM7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ2O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA2NjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY2O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gODE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTtyZXR1cm4gNTI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjg6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTtyZXR1cm4gMzE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgICAgICAgICAgIHl5Xy55eXRleHQgPSBzdHJpcCgxLCAyKS5yZXBsYWNlKC9cXFxcXCIvZywgXCJcXFwiXCIpO3JldHVybiA3NDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICAgICAgICAgICAgeXlfLnl5dGV4dCA9IHN0cmlwKDEsIDIpLnJlcGxhY2UoL1xcXFwnL2csIFwiJ1wiKTtyZXR1cm4gNzQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA3OTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDc2O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA3NztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDc4O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA2OTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA2NjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiSU5WQUxJRFwiO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQyOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGxleGVyLnJ1bGVzID0gWy9eKD86W15cXHgwMF0qPyg/PShcXHtcXHspKSkvLCAvXig/OlteXFx4MDBdKykvLCAvXig/OlteXFx4MDBdezIsfT8oPz0oXFx7XFx7fFxcXFxcXHtcXHt8XFxcXFxcXFxcXHtcXHt8JCkpKS8sIC9eKD86XFx7XFx7XFx7XFx7XFwvW15cXHMhXCIjJS0sXFwuXFwvOy0+QFxcWy1cXF5gXFx7LX5dKyg/PVs9fVxcc1xcLy5dKVxcfVxcfVxcfVxcfSkvLCAvXig/OlteXFx4MDBdKj8oPz0oXFx7XFx7XFx7XFx7XFwvKSkpLywgL14oPzpbXFxzXFxTXSo/LS0ofik/XFx9XFx9KS8sIC9eKD86XFwoKS8sIC9eKD86XFwpKS8sIC9eKD86XFx7XFx7XFx7XFx7KS8sIC9eKD86XFx9XFx9XFx9XFx9KS8sIC9eKD86XFx7XFx7KH4pPz4pLywgL14oPzpcXHtcXHsofik/IykvLCAvXig/Olxce1xceyh+KT9cXC8pLywgL14oPzpcXHtcXHsofik/XFxeXFxzKih+KT9cXH1cXH0pLywgL14oPzpcXHtcXHsofik/XFxzKmVsc2VcXHMqKH4pP1xcfVxcfSkvLCAvXig/Olxce1xceyh+KT9cXF4pLywgL14oPzpcXHtcXHsofik/XFxzKmVsc2VcXGIpLywgL14oPzpcXHtcXHsofik/XFx7KS8sIC9eKD86XFx7XFx7KH4pPyYpLywgL14oPzpcXHtcXHsofik/IS0tKS8sIC9eKD86XFx7XFx7KH4pPyFbXFxzXFxTXSo/XFx9XFx9KS8sIC9eKD86XFx7XFx7KH4pPykvLCAvXig/Oj0pLywgL14oPzpcXC5cXC4pLywgL14oPzpcXC4oPz0oWz1+fVxcc1xcLy4pfF0pKSkvLCAvXig/OltcXC8uXSkvLCAvXig/OlxccyspLywgL14oPzpcXH0ofik/XFx9XFx9KS8sIC9eKD86KH4pP1xcfVxcfSkvLCAvXig/OlwiKFxcXFxbXCJdfFteXCJdKSpcIikvLCAvXig/OicoXFxcXFsnXXxbXiddKSonKS8sIC9eKD86QCkvLCAvXig/OnRydWUoPz0oW359XFxzKV0pKSkvLCAvXig/OmZhbHNlKD89KFt+fVxccyldKSkpLywgL14oPzp1bmRlZmluZWQoPz0oW359XFxzKV0pKSkvLCAvXig/Om51bGwoPz0oW359XFxzKV0pKSkvLCAvXig/Oi0/WzAtOV0rKD86XFwuWzAtOV0rKT8oPz0oW359XFxzKV0pKSkvLCAvXig/OmFzXFxzK1xcfCkvLCAvXig/OlxcfCkvLCAvXig/OihbXlxccyFcIiMlLSxcXC5cXC87LT5AXFxbLVxcXmBcXHstfl0rKD89KFs9fn1cXHNcXC8uKXxdKSkpKS8sIC9eKD86XFxbW15cXF1dKlxcXSkvLCAvXig/Oi4pLywgL14oPzokKS9dO1xuICAgICAgICBsZXhlci5jb25kaXRpb25zID0geyBtdTogeyBydWxlczogWzYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDJdLCBpbmNsdXNpdmU6IGZhbHNlIH0sIGVtdTogeyBydWxlczogWzJdLCBpbmNsdXNpdmU6IGZhbHNlIH0sIGNvbTogeyBydWxlczogWzVdLCBpbmNsdXNpdmU6IGZhbHNlIH0sIHJhdzogeyBydWxlczogWzMsIDRdLCBpbmNsdXNpdmU6IGZhbHNlIH0sIElOSVRJQUw6IHsgcnVsZXM6IFswLCAxLCA0Ml0sIGluY2x1c2l2ZTogdHJ1ZSB9IH07XG4gICAgICAgIHJldHVybiBsZXhlcjtcbiAgICB9KSgpO1xuICAgIHBhcnNlci5sZXhlciA9IGxleGVyO1xuICAgIGZ1bmN0aW9uIFBhcnNlcigpIHtcbiAgICAgICAgdGhpcy55eSA9IHt9O1xuICAgIH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7XG4gICAgcmV0dXJuIG5ldyBQYXJzZXIoKTtcbn0pKCk7ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBoYW5kbGViYXJzO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMucHJpbnQgPSBwcmludDtcbmV4cG9ydHMuUHJpbnRWaXNpdG9yID0gUHJpbnRWaXNpdG9yO1xuLyplc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5cbnZhciBfVmlzaXRvciA9IHJlcXVpcmUoJy4vdmlzaXRvcicpO1xuXG52YXIgX1Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX1Zpc2l0b3IpO1xuXG5mdW5jdGlvbiBwcmludChhc3QpIHtcbiAgcmV0dXJuIG5ldyBQcmludFZpc2l0b3IoKS5hY2NlcHQoYXN0KTtcbn1cblxuZnVuY3Rpb24gUHJpbnRWaXNpdG9yKCkge1xuICB0aGlzLnBhZGRpbmcgPSAwO1xufVxuXG5QcmludFZpc2l0b3IucHJvdG90eXBlID0gbmV3IF9WaXNpdG9yMlsnZGVmYXVsdCddKCk7XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUucGFkID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgb3V0ID0gJyc7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLnBhZGRpbmc7IGkgPCBsOyBpKyspIHtcbiAgICBvdXQgPSBvdXQgKyAnICAnO1xuICB9XG5cbiAgb3V0ID0gb3V0ICsgc3RyaW5nICsgJ1xcbic7XG4gIHJldHVybiBvdXQ7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkge1xuICB2YXIgb3V0ID0gJycsXG4gICAgICBib2R5ID0gcHJvZ3JhbS5ib2R5LFxuICAgICAgaSA9IHVuZGVmaW5lZCxcbiAgICAgIGwgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKHByb2dyYW0uYmxvY2tQYXJhbXMpIHtcbiAgICB2YXIgYmxvY2tQYXJhbXMgPSAnQkxPQ0sgUEFSQU1TOiBbJztcbiAgICBmb3IgKGkgPSAwLCBsID0gcHJvZ3JhbS5ibG9ja1BhcmFtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGJsb2NrUGFyYW1zICs9ICcgJyArIHByb2dyYW0uYmxvY2tQYXJhbXNbaV07XG4gICAgfVxuICAgIGJsb2NrUGFyYW1zICs9ICcgXSc7XG4gICAgb3V0ICs9IHRoaXMucGFkKGJsb2NrUGFyYW1zKTtcbiAgfVxuXG4gIGZvciAoaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIG91dCA9IG91dCArIHRoaXMuYWNjZXB0KGJvZHlbaV0pO1xuICB9XG5cbiAgdGhpcy5wYWRkaW5nLS07XG5cbiAgcmV0dXJuIG91dDtcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuTXVzdGFjaGVTdGF0ZW1lbnQgPSBmdW5jdGlvbiAobXVzdGFjaGUpIHtcbiAgcmV0dXJuIHRoaXMucGFkKCd7eyAnICsgdGhpcy5TdWJFeHByZXNzaW9uKG11c3RhY2hlKSArICcgfX0nKTtcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuQmxvY2tTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoYmxvY2spIHtcbiAgdmFyIG91dCA9ICcnO1xuXG4gIG91dCA9IG91dCArIHRoaXMucGFkKCdCTE9DSzonKTtcbiAgdGhpcy5wYWRkaW5nKys7XG4gIG91dCA9IG91dCArIHRoaXMucGFkKHRoaXMuU3ViRXhwcmVzc2lvbihibG9jaykpO1xuICBpZiAoYmxvY2sucHJvZ3JhbSkge1xuICAgIG91dCA9IG91dCArIHRoaXMucGFkKCdQUk9HUkFNOicpO1xuICAgIHRoaXMucGFkZGluZysrO1xuICAgIG91dCA9IG91dCArIHRoaXMuYWNjZXB0KGJsb2NrLnByb2dyYW0pO1xuICAgIHRoaXMucGFkZGluZy0tO1xuICB9XG4gIGlmIChibG9jay5pbnZlcnNlKSB7XG4gICAgaWYgKGJsb2NrLnByb2dyYW0pIHtcbiAgICAgIHRoaXMucGFkZGluZysrO1xuICAgIH1cbiAgICBvdXQgPSBvdXQgKyB0aGlzLnBhZCgne3tefX0nKTtcbiAgICB0aGlzLnBhZGRpbmcrKztcbiAgICBvdXQgPSBvdXQgKyB0aGlzLmFjY2VwdChibG9jay5pbnZlcnNlKTtcbiAgICB0aGlzLnBhZGRpbmctLTtcbiAgICBpZiAoYmxvY2sucHJvZ3JhbSkge1xuICAgICAgdGhpcy5wYWRkaW5nLS07XG4gICAgfVxuICB9XG4gIHRoaXMucGFkZGluZy0tO1xuXG4gIHJldHVybiBvdXQ7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBmdW5jdGlvbiAocGFydGlhbCkge1xuICB2YXIgY29udGVudCA9ICdQQVJUSUFMOicgKyBwYXJ0aWFsLm5hbWUub3JpZ2luYWw7XG4gIGlmIChwYXJ0aWFsLnBhcmFtc1swXSkge1xuICAgIGNvbnRlbnQgKz0gJyAnICsgdGhpcy5hY2NlcHQocGFydGlhbC5wYXJhbXNbMF0pO1xuICB9XG4gIGlmIChwYXJ0aWFsLmhhc2gpIHtcbiAgICBjb250ZW50ICs9ICcgJyArIHRoaXMuYWNjZXB0KHBhcnRpYWwuaGFzaCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMucGFkKCd7ez4gJyArIGNvbnRlbnQgKyAnIH19Jyk7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLkNvbnRlbnRTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4gdGhpcy5wYWQoJ0NPTlRFTlRbIFxcJycgKyBjb250ZW50LnZhbHVlICsgJ1xcJyBdJyk7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLkNvbW1lbnRTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoY29tbWVudCkge1xuICByZXR1cm4gdGhpcy5wYWQoJ3t7ISBcXCcnICsgY29tbWVudC52YWx1ZSArICdcXCcgfX0nKTtcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuU3ViRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChzZXhwcikge1xuICB2YXIgcGFyYW1zID0gc2V4cHIucGFyYW1zLFxuICAgICAgcGFyYW1TdHJpbmdzID0gW10sXG4gICAgICBoYXNoID0gdW5kZWZpbmVkO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHBhcmFtU3RyaW5ncy5wdXNoKHRoaXMuYWNjZXB0KHBhcmFtc1tpXSkpO1xuICB9XG5cbiAgcGFyYW1zID0gJ1snICsgcGFyYW1TdHJpbmdzLmpvaW4oJywgJykgKyAnXSc7XG5cbiAgaGFzaCA9IHNleHByLmhhc2ggPyAnICcgKyB0aGlzLmFjY2VwdChzZXhwci5oYXNoKSA6ICcnO1xuXG4gIHJldHVybiB0aGlzLmFjY2VwdChzZXhwci5wYXRoKSArICcgJyArIHBhcmFtcyArIGhhc2g7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLlBhdGhFeHByZXNzaW9uID0gZnVuY3Rpb24gKGlkKSB7XG4gIHZhciBwYXRoID0gaWQucGFydHMuam9pbignLycpO1xuICByZXR1cm4gKGlkLmRhdGEgPyAnQCcgOiAnJykgKyAnUEFUSDonICsgcGF0aDtcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuU3RyaW5nTGl0ZXJhbCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuICdcIicgKyBzdHJpbmcudmFsdWUgKyAnXCInO1xufTtcblxuUHJpbnRWaXNpdG9yLnByb3RvdHlwZS5OdW1iZXJMaXRlcmFsID0gZnVuY3Rpb24gKG51bWJlcikge1xuICByZXR1cm4gJ05VTUJFUnsnICsgbnVtYmVyLnZhbHVlICsgJ30nO1xufTtcblxuUHJpbnRWaXNpdG9yLnByb3RvdHlwZS5Cb29sZWFuTGl0ZXJhbCA9IGZ1bmN0aW9uIChib29sKSB7XG4gIHJldHVybiAnQk9PTEVBTnsnICsgYm9vbC52YWx1ZSArICd9Jztcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuVW5kZWZpbmVkTGl0ZXJhbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdVTkRFRklORUQnO1xufTtcblxuUHJpbnRWaXNpdG9yLnByb3RvdHlwZS5OdWxsTGl0ZXJhbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdOVUxMJztcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuSGFzaCA9IGZ1bmN0aW9uIChoYXNoKSB7XG4gIHZhciBwYWlycyA9IGhhc2gucGFpcnMsXG4gICAgICBqb2luZWRQYWlycyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gcGFpcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgam9pbmVkUGFpcnMucHVzaCh0aGlzLmFjY2VwdChwYWlyc1tpXSkpO1xuICB9XG5cbiAgcmV0dXJuICdIQVNIeycgKyBqb2luZWRQYWlycy5qb2luKCcsICcpICsgJ30nO1xufTtcblByaW50VmlzaXRvci5wcm90b3R5cGUuSGFzaFBhaXIgPSBmdW5jdGlvbiAocGFpcikge1xuICByZXR1cm4gcGFpci5rZXkgKyAnPScgKyB0aGlzLmFjY2VwdChwYWlyLnZhbHVlKTtcbn07XG4vKmVzbGludC1lbmFibGUgbmV3LWNhcCAqLyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9O1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX0V4Y2VwdGlvbiA9IHJlcXVpcmUoJy4uL2V4Y2VwdGlvbicpO1xuXG52YXIgX0V4Y2VwdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfRXhjZXB0aW9uKTtcblxudmFyIF9BU1QgPSByZXF1aXJlKCcuL2FzdCcpO1xuXG52YXIgX0FTVDIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfQVNUKTtcblxuZnVuY3Rpb24gVmlzaXRvcigpIHtcbiAgdGhpcy5wYXJlbnRzID0gW107XG59XG5cblZpc2l0b3IucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVmlzaXRvcixcbiAgbXV0YXRpbmc6IGZhbHNlLFxuXG4gIC8vIFZpc2l0cyBhIGdpdmVuIHZhbHVlLiBJZiBtdXRhdGluZywgd2lsbCByZXBsYWNlIHRoZSB2YWx1ZSBpZiBuZWNlc3NhcnkuXG4gIGFjY2VwdEtleTogZnVuY3Rpb24gYWNjZXB0S2V5KG5vZGUsIG5hbWUpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmFjY2VwdChub2RlW25hbWVdKTtcbiAgICBpZiAodGhpcy5tdXRhdGluZykge1xuICAgICAgLy8gSGFja3kgc2FuaXR5IGNoZWNrOlxuICAgICAgaWYgKHZhbHVlICYmICghdmFsdWUudHlwZSB8fCAhX0FTVDJbJ2RlZmF1bHQnXVt2YWx1ZS50eXBlXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ1VuZXhwZWN0ZWQgbm9kZSB0eXBlIFwiJyArIHZhbHVlLnR5cGUgKyAnXCIgZm91bmQgd2hlbiBhY2NlcHRpbmcgJyArIG5hbWUgKyAnIG9uICcgKyBub2RlLnR5cGUpO1xuICAgICAgfVxuICAgICAgbm9kZVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfSxcblxuICAvLyBQZXJmb3JtcyBhbiBhY2NlcHQgb3BlcmF0aW9uIHdpdGggYWRkZWQgc2FuaXR5IGNoZWNrIHRvIGVuc3VyZVxuICAvLyByZXF1aXJlZCBrZXlzIGFyZSBub3QgcmVtb3ZlZC5cbiAgYWNjZXB0UmVxdWlyZWQ6IGZ1bmN0aW9uIGFjY2VwdFJlcXVpcmVkKG5vZGUsIG5hbWUpIHtcbiAgICB0aGlzLmFjY2VwdEtleShub2RlLCBuYW1lKTtcblxuICAgIGlmICghbm9kZVtuYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10obm9kZS50eXBlICsgJyByZXF1aXJlcyAnICsgbmFtZSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFRyYXZlcnNlcyBhIGdpdmVuIGFycmF5LiBJZiBtdXRhdGluZywgZW1wdHkgcmVzcG5zZXMgd2lsbCBiZSByZW1vdmVkXG4gIC8vIGZvciBjaGlsZCBlbGVtZW50cy5cbiAgYWNjZXB0QXJyYXk6IGZ1bmN0aW9uIGFjY2VwdEFycmF5KGFycmF5KSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHRoaXMuYWNjZXB0S2V5KGFycmF5LCBpKTtcblxuICAgICAgaWYgKCFhcnJheVtpXSkge1xuICAgICAgICBhcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGktLTtcbiAgICAgICAgbC0tO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBhY2NlcHQ6IGZ1bmN0aW9uIGFjY2VwdChvYmplY3QpIHtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmN1cnJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50cy51bnNoaWZ0KHRoaXMuY3VycmVudCk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudCA9IG9iamVjdDtcblxuICAgIHZhciByZXQgPSB0aGlzW29iamVjdC50eXBlXShvYmplY3QpO1xuXG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5wYXJlbnRzLnNoaWZ0KCk7XG5cbiAgICBpZiAoIXRoaXMubXV0YXRpbmcgfHwgcmV0KSB7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0gZWxzZSBpZiAocmV0ICE9PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG4gIH0sXG5cbiAgUHJvZ3JhbTogZnVuY3Rpb24gUHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgdGhpcy5hY2NlcHRBcnJheShwcm9ncmFtLmJvZHkpO1xuICB9LFxuXG4gIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkge1xuICAgIHRoaXMuYWNjZXB0UmVxdWlyZWQobXVzdGFjaGUsICdwYXRoJyk7XG4gICAgdGhpcy5hY2NlcHRBcnJheShtdXN0YWNoZS5wYXJhbXMpO1xuICAgIHRoaXMuYWNjZXB0S2V5KG11c3RhY2hlLCAnaGFzaCcpO1xuICB9LFxuXG4gIEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBCbG9ja1N0YXRlbWVudChibG9jaykge1xuICAgIHRoaXMuYWNjZXB0UmVxdWlyZWQoYmxvY2ssICdwYXRoJyk7XG4gICAgdGhpcy5hY2NlcHRBcnJheShibG9jay5wYXJhbXMpO1xuICAgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaGFzaCcpO1xuXG4gICAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdwcm9ncmFtJyk7XG4gICAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdpbnZlcnNlJyk7XG4gIH0sXG5cbiAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7XG4gICAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYXJ0aWFsLCAnbmFtZScpO1xuICAgIHRoaXMuYWNjZXB0QXJyYXkocGFydGlhbC5wYXJhbXMpO1xuICAgIHRoaXMuYWNjZXB0S2V5KHBhcnRpYWwsICdoYXNoJyk7XG4gIH0sXG5cbiAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudCgpIHt9LFxuICBDb21tZW50U3RhdGVtZW50OiBmdW5jdGlvbiBDb21tZW50U3RhdGVtZW50KCkge30sXG5cbiAgU3ViRXhwcmVzc2lvbjogZnVuY3Rpb24gU3ViRXhwcmVzc2lvbihzZXhwcikge1xuICAgIHRoaXMuYWNjZXB0UmVxdWlyZWQoc2V4cHIsICdwYXRoJyk7XG4gICAgdGhpcy5hY2NlcHRBcnJheShzZXhwci5wYXJhbXMpO1xuICAgIHRoaXMuYWNjZXB0S2V5KHNleHByLCAnaGFzaCcpO1xuICB9LFxuXG4gIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbigpIHt9LFxuXG4gIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoKSB7fSxcbiAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbCgpIHt9LFxuICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoKSB7fSxcbiAgVW5kZWZpbmVkTGl0ZXJhbDogZnVuY3Rpb24gVW5kZWZpbmVkTGl0ZXJhbCgpIHt9LFxuICBOdWxsTGl0ZXJhbDogZnVuY3Rpb24gTnVsbExpdGVyYWwoKSB7fSxcblxuICBIYXNoOiBmdW5jdGlvbiBIYXNoKGhhc2gpIHtcbiAgICB0aGlzLmFjY2VwdEFycmF5KGhhc2gucGFpcnMpO1xuICB9LFxuICBIYXNoUGFpcjogZnVuY3Rpb24gSGFzaFBhaXIocGFpcikge1xuICAgIHRoaXMuYWNjZXB0UmVxdWlyZWQocGFpciwgJ3ZhbHVlJyk7XG4gIH1cbn07XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IFZpc2l0b3I7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8qIGNvbnRlbnQgKi8gLyogY29tbWVudCAqLyAvKiBwYXRoICovIC8qIHN0cmluZyAqLyAvKiBudW1iZXIgKi8gLyogYm9vbCAqLyAvKiBsaXRlcmFsICovIC8qIGxpdGVyYWwgKi8iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9WaXNpdG9yID0gcmVxdWlyZSgnLi92aXNpdG9yJyk7XG5cbnZhciBfVmlzaXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfVmlzaXRvcik7XG5cbmZ1bmN0aW9uIFdoaXRlc3BhY2VDb250cm9sKCkge31cbldoaXRlc3BhY2VDb250cm9sLnByb3RvdHlwZSA9IG5ldyBfVmlzaXRvcjJbJ2RlZmF1bHQnXSgpO1xuXG5XaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuUHJvZ3JhbSA9IGZ1bmN0aW9uIChwcm9ncmFtKSB7XG4gIHZhciBpc1Jvb3QgPSAhdGhpcy5pc1Jvb3RTZWVuO1xuICB0aGlzLmlzUm9vdFNlZW4gPSB0cnVlO1xuXG4gIHZhciBib2R5ID0gcHJvZ3JhbS5ib2R5O1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGJvZHkubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBib2R5W2ldLFxuICAgICAgICBzdHJpcCA9IHRoaXMuYWNjZXB0KGN1cnJlbnQpO1xuXG4gICAgaWYgKCFzdHJpcCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIF9pc1ByZXZXaGl0ZXNwYWNlID0gaXNQcmV2V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpLFxuICAgICAgICBfaXNOZXh0V2hpdGVzcGFjZSA9IGlzTmV4dFdoaXRlc3BhY2UoYm9keSwgaSwgaXNSb290KSxcbiAgICAgICAgb3BlblN0YW5kYWxvbmUgPSBzdHJpcC5vcGVuU3RhbmRhbG9uZSAmJiBfaXNQcmV2V2hpdGVzcGFjZSxcbiAgICAgICAgY2xvc2VTdGFuZGFsb25lID0gc3RyaXAuY2xvc2VTdGFuZGFsb25lICYmIF9pc05leHRXaGl0ZXNwYWNlLFxuICAgICAgICBpbmxpbmVTdGFuZGFsb25lID0gc3RyaXAuaW5saW5lU3RhbmRhbG9uZSAmJiBfaXNQcmV2V2hpdGVzcGFjZSAmJiBfaXNOZXh0V2hpdGVzcGFjZTtcblxuICAgIGlmIChzdHJpcC5jbG9zZSkge1xuICAgICAgb21pdFJpZ2h0KGJvZHksIGksIHRydWUpO1xuICAgIH1cbiAgICBpZiAoc3RyaXAub3Blbikge1xuICAgICAgb21pdExlZnQoYm9keSwgaSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGlubGluZVN0YW5kYWxvbmUpIHtcbiAgICAgIG9taXRSaWdodChib2R5LCBpKTtcblxuICAgICAgaWYgKG9taXRMZWZ0KGJvZHksIGkpKSB7XG4gICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHN0YW5kYWxvbmUgbm9kZSwgc2F2ZSB0aGUgaW5kZW50IGluZm8gZm9yIHBhcnRpYWxzXG4gICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQYXJ0aWFsU3RhdGVtZW50Jykge1xuICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpbmFsIGxpbmVcbiAgICAgICAgICBjdXJyZW50LmluZGVudCA9IC8oWyBcXHRdKyQpLy5leGVjKGJvZHlbaSAtIDFdLm9yaWdpbmFsKVsxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3BlblN0YW5kYWxvbmUpIHtcbiAgICAgIG9taXRSaWdodCgoY3VycmVudC5wcm9ncmFtIHx8IGN1cnJlbnQuaW52ZXJzZSkuYm9keSk7XG5cbiAgICAgIC8vIFN0cmlwIG91dCB0aGUgcHJldmlvdXMgY29udGVudCBub2RlIGlmIGl0J3Mgd2hpdGVzcGFjZSBvbmx5XG4gICAgICBvbWl0TGVmdChib2R5LCBpKTtcbiAgICB9XG4gICAgaWYgKGNsb3NlU3RhbmRhbG9uZSkge1xuICAgICAgLy8gQWx3YXlzIHN0cmlwIHRoZSBuZXh0IG5vZGVcbiAgICAgIG9taXRSaWdodChib2R5LCBpKTtcblxuICAgICAgb21pdExlZnQoKGN1cnJlbnQuaW52ZXJzZSB8fCBjdXJyZW50LnByb2dyYW0pLmJvZHkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcm9ncmFtO1xufTtcbldoaXRlc3BhY2VDb250cm9sLnByb3RvdHlwZS5CbG9ja1N0YXRlbWVudCA9IGZ1bmN0aW9uIChibG9jaykge1xuICB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTtcbiAgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7XG5cbiAgLy8gRmluZCB0aGUgaW52ZXJzZSBwcm9ncmFtIHRoYXQgaXMgaW52b2xlZCB3aXRoIHdoaXRlc3BhY2Ugc3RyaXBwaW5nLlxuICB2YXIgcHJvZ3JhbSA9IGJsb2NrLnByb2dyYW0gfHwgYmxvY2suaW52ZXJzZSxcbiAgICAgIGludmVyc2UgPSBibG9jay5wcm9ncmFtICYmIGJsb2NrLmludmVyc2UsXG4gICAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLFxuICAgICAgbGFzdEludmVyc2UgPSBpbnZlcnNlO1xuXG4gIGlmIChpbnZlcnNlICYmIGludmVyc2UuY2hhaW5lZCkge1xuICAgIGZpcnN0SW52ZXJzZSA9IGludmVyc2UuYm9keVswXS5wcm9ncmFtO1xuXG4gICAgLy8gV2FsayB0aGUgaW52ZXJzZSBjaGFpbiB0byBmaW5kIHRoZSBsYXN0IGludmVyc2UgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgY2hhaW4uXG4gICAgd2hpbGUgKGxhc3RJbnZlcnNlLmNoYWluZWQpIHtcbiAgICAgIGxhc3RJbnZlcnNlID0gbGFzdEludmVyc2UuYm9keVtsYXN0SW52ZXJzZS5ib2R5Lmxlbmd0aCAtIDFdLnByb2dyYW07XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0cmlwID0ge1xuICAgIG9wZW46IGJsb2NrLm9wZW5TdHJpcC5vcGVuLFxuICAgIGNsb3NlOiBibG9jay5jbG9zZVN0cmlwLmNsb3NlLFxuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBzdGFuZGFsb25lIGNhbmRpYWN5LiBCYXNpY2FsbHkgZmxhZyBvdXIgY29udGVudCBhcyBiZWluZyBwb3NzaWJseSBzdGFuZGFsb25lXG4gICAgLy8gc28gb3VyIHBhcmVudCBjYW4gZGV0ZXJtaW5lIGlmIHdlIGFjdHVhbGx5IGFyZSBzdGFuZGFsb25lXG4gICAgb3BlblN0YW5kYWxvbmU6IGlzTmV4dFdoaXRlc3BhY2UocHJvZ3JhbS5ib2R5KSxcbiAgICBjbG9zZVN0YW5kYWxvbmU6IGlzUHJldldoaXRlc3BhY2UoKGZpcnN0SW52ZXJzZSB8fCBwcm9ncmFtKS5ib2R5KVxuICB9O1xuXG4gIGlmIChibG9jay5vcGVuU3RyaXAuY2xvc2UpIHtcbiAgICBvbWl0UmlnaHQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTtcbiAgfVxuXG4gIGlmIChpbnZlcnNlKSB7XG4gICAgdmFyIGludmVyc2VTdHJpcCA9IGJsb2NrLmludmVyc2VTdHJpcDtcblxuICAgIGlmIChpbnZlcnNlU3RyaXAub3Blbikge1xuICAgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoaW52ZXJzZVN0cmlwLmNsb3NlKSB7XG4gICAgICBvbWl0UmlnaHQoZmlyc3RJbnZlcnNlLmJvZHksIG51bGwsIHRydWUpO1xuICAgIH1cbiAgICBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7XG4gICAgICBvbWl0TGVmdChsYXN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHN0YW5kYWxvbmUgZWxzZSBzdGF0bWVudHNcbiAgICBpZiAoaXNQcmV2V2hpdGVzcGFjZShwcm9ncmFtLmJvZHkpICYmIGlzTmV4dFdoaXRlc3BhY2UoZmlyc3RJbnZlcnNlLmJvZHkpKSB7XG4gICAgICBvbWl0TGVmdChwcm9ncmFtLmJvZHkpO1xuICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7XG4gICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTtcbiAgfVxuXG4gIHJldHVybiBzdHJpcDtcbn07XG5cbldoaXRlc3BhY2VDb250cm9sLnByb3RvdHlwZS5NdXN0YWNoZVN0YXRlbWVudCA9IGZ1bmN0aW9uIChtdXN0YWNoZSkge1xuICByZXR1cm4gbXVzdGFjaGUuc3RyaXA7XG59O1xuXG5XaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuUGFydGlhbFN0YXRlbWVudCA9IFdoaXRlc3BhY2VDb250cm9sLnByb3RvdHlwZS5Db21tZW50U3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgdmFyIHN0cmlwID0gbm9kZS5zdHJpcCB8fCB7fTtcbiAgcmV0dXJuIHtcbiAgICBpbmxpbmVTdGFuZGFsb25lOiB0cnVlLFxuICAgIG9wZW46IHN0cmlwLm9wZW4sXG4gICAgY2xvc2U6IHN0cmlwLmNsb3NlXG4gIH07XG59O1xuXG5mdW5jdGlvbiBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkge1xuICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaSA9IGJvZHkubGVuZ3RoO1xuICB9XG5cbiAgLy8gTm9kZXMgdGhhdCBlbmQgd2l0aCBuZXdsaW5lcyBhcmUgY29uc2lkZXJlZCB3aGl0ZXNwYWNlIChidXQgYXJlIHNwZWNpYWxcbiAgLy8gY2FzZWQgZm9yIHN0cmlwIG9wZXJhdGlvbnMpXG4gIHZhciBwcmV2ID0gYm9keVtpIC0gMV0sXG4gICAgICBzaWJsaW5nID0gYm9keVtpIC0gMl07XG4gIGlmICghcHJldikge1xuICAgIHJldHVybiBpc1Jvb3Q7XG4gIH1cblxuICBpZiAocHJldi50eXBlID09PSAnQ29udGVudFN0YXRlbWVudCcpIHtcbiAgICByZXR1cm4gKHNpYmxpbmcgfHwgIWlzUm9vdCA/IC9cXHI/XFxuXFxzKj8kLyA6IC8oXnxcXHI/XFxuKVxccyo/JC8pLnRlc3QocHJldi5vcmlnaW5hbCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzTmV4dFdoaXRlc3BhY2UoYm9keSwgaSwgaXNSb290KSB7XG4gIGlmIChpID09PSB1bmRlZmluZWQpIHtcbiAgICBpID0gLTE7XG4gIH1cblxuICB2YXIgbmV4dCA9IGJvZHlbaSArIDFdLFxuICAgICAgc2libGluZyA9IGJvZHlbaSArIDJdO1xuICBpZiAoIW5leHQpIHtcbiAgICByZXR1cm4gaXNSb290O1xuICB9XG5cbiAgaWYgKG5leHQudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7XG4gICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXlxccyo/XFxyP1xcbi8gOiAvXlxccyo/KFxccj9cXG58JCkvKS50ZXN0KG5leHQub3JpZ2luYWwpO1xuICB9XG59XG5cbi8vIE1hcmtzIHRoZSBub2RlIHRvIHRoZSByaWdodCBvZiB0aGUgcG9zaXRpb24gYXMgb21pdHRlZC5cbi8vIEkuZS4ge3tmb299fScgJyB3aWxsIG1hcmsgdGhlICcgJyBub2RlIGFzIG9taXR0ZWQuXG4vL1xuLy8gSWYgaSBpcyB1bmRlZmluZWQsIHRoZW4gdGhlIGZpcnN0IGNoaWxkIHdpbGwgYmUgbWFya2VkIGFzIHN1Y2guXG4vL1xuLy8gSWYgbXVsaXRwbGUgaXMgdHJ1dGh5IHRoZW4gYWxsIHdoaXRlc3BhY2Ugd2lsbCBiZSBzdHJpcHBlZCBvdXQgdW50aWwgbm9uLXdoaXRlc3BhY2Vcbi8vIGNvbnRlbnQgaXMgbWV0LlxuZnVuY3Rpb24gb21pdFJpZ2h0KGJvZHksIGksIG11bHRpcGxlKSB7XG4gIHZhciBjdXJyZW50ID0gYm9keVtpID09IG51bGwgPyAwIDogaSArIDFdO1xuICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQucmlnaHRTdHJpcHBlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBvcmlnaW5hbCA9IGN1cnJlbnQudmFsdWU7XG4gIGN1cnJlbnQudmFsdWUgPSBjdXJyZW50LnZhbHVlLnJlcGxhY2UobXVsdGlwbGUgPyAvXlxccysvIDogL15bIFxcdF0qXFxyP1xcbj8vLCAnJyk7XG4gIGN1cnJlbnQucmlnaHRTdHJpcHBlZCA9IGN1cnJlbnQudmFsdWUgIT09IG9yaWdpbmFsO1xufVxuXG4vLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgbGVmdCBvZiB0aGUgcG9zaXRpb24gYXMgb21pdHRlZC5cbi8vIEkuZS4gJyAne3tmb299fSB3aWxsIG1hcmsgdGhlICcgJyBub2RlIGFzIG9taXR0ZWQuXG4vL1xuLy8gSWYgaSBpcyB1bmRlZmluZWQgdGhlbiB0aGUgbGFzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLlxuLy9cbi8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlXG4vLyBjb250ZW50IGlzIG1ldC5cbmZ1bmN0aW9uIG9taXRMZWZ0KGJvZHksIGksIG11bHRpcGxlKSB7XG4gIHZhciBjdXJyZW50ID0gYm9keVtpID09IG51bGwgPyBib2R5Lmxlbmd0aCAtIDEgOiBpIC0gMV07XG4gIGlmICghY3VycmVudCB8fCBjdXJyZW50LnR5cGUgIT09ICdDb250ZW50U3RhdGVtZW50JyB8fCAhbXVsdGlwbGUgJiYgY3VycmVudC5sZWZ0U3RyaXBwZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBXZSBvbWl0IHRoZSBsYXN0IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkgYW5kIG5vdCBwcmVjZWVkZWQgYnkgYSBub24tY29udGVudCBub2RlLlxuICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlO1xuICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL1xccyskLyA6IC9bIFxcdF0rJC8sICcnKTtcbiAgY3VycmVudC5sZWZ0U3RyaXBwZWQgPSBjdXJyZW50LnZhbHVlICE9PSBvcmlnaW5hbDtcbiAgcmV0dXJuIGN1cnJlbnQubGVmdFN0cmlwcGVkO1xufVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSBXaGl0ZXNwYWNlQ29udHJvbDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddO1xuXG5mdW5jdGlvbiBFeGNlcHRpb24obWVzc2FnZSwgbm9kZSkge1xuICB2YXIgbG9jID0gbm9kZSAmJiBub2RlLmxvYyxcbiAgICAgIGxpbmUgPSB1bmRlZmluZWQsXG4gICAgICBjb2x1bW4gPSB1bmRlZmluZWQ7XG4gIGlmIChsb2MpIHtcbiAgICBsaW5lID0gbG9jLnN0YXJ0LmxpbmU7XG4gICAgY29sdW1uID0gbG9jLnN0YXJ0LmNvbHVtbjtcblxuICAgIG1lc3NhZ2UgKz0gJyAtICcgKyBsaW5lICsgJzonICsgY29sdW1uO1xuICB9XG5cbiAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuXG4gIC8vIFVuZm9ydHVuYXRlbHkgZXJyb3JzIGFyZSBub3QgZW51bWVyYWJsZSBpbiBDaHJvbWUgKGF0IGxlYXN0KSwgc28gYGZvciBwcm9wIGluIHRtcGAgZG9lc24ndCB3b3JrLlxuICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBlcnJvclByb3BzLmxlbmd0aDsgaWR4KyspIHtcbiAgICB0aGlzW2Vycm9yUHJvcHNbaWR4XV0gPSB0bXBbZXJyb3JQcm9wc1tpZHhdXTtcbiAgfVxuXG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEV4Y2VwdGlvbik7XG4gIH1cblxuICBpZiAobG9jKSB7XG4gICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTtcbiAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgfVxufVxuXG5FeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IEV4Y2VwdGlvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8qZ2xvYmFsIHdpbmRvdyAqL1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoSGFuZGxlYmFycykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICB2YXIgcm9vdCA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93LFxuICAgICAgJEhhbmRsZWJhcnMgPSByb290LkhhbmRsZWJhcnM7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIEhhbmRsZWJhcnMubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocm9vdC5IYW5kbGViYXJzID09PSBIYW5kbGViYXJzKSB7XG4gICAgICByb290LkhhbmRsZWJhcnMgPSAkSGFuZGxlYmFycztcbiAgICB9XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMMjV2WkdWZmJXOWtkV3hsY3k5SVlXNWtiR1ZpWVhKekwyUnBjM1F2WTJwekwyaGhibVJzWldKaGNuTXZibTh0WTI5dVpteHBZM1F1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWp0QlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lKM1Z6WlNCemRISnBZM1FuTzF4dVhHNWxlSEJ2Y25SekxsOWZaWE5OYjJSMWJHVWdQU0IwY25WbE8xeHVMeXBuYkc5aVlXd2dkMmx1Wkc5M0lDb3ZYRzVjYm1WNGNHOXlkSE5iSjJSbFptRjFiSFFuWFNBOUlHWjFibU4wYVc5dUlDaElZVzVrYkdWaVlYSnpLU0I3WEc0Z0lDOHFJR2x6ZEdGdVluVnNJR2xuYm05eVpTQnVaWGgwSUNvdlhHNGdJSFpoY2lCeWIyOTBJRDBnZEhsd1pXOW1JR2RzYjJKaGJDQWhQVDBnSjNWdVpHVm1hVzVsWkNjZ1B5Qm5iRzlpWVd3Z09pQjNhVzVrYjNjc1hHNGdJQ0FnSUNBa1NHRnVaR3hsWW1GeWN5QTlJSEp2YjNRdVNHRnVaR3hsWW1GeWN6dGNiaUFnTHlvZ2FYTjBZVzVpZFd3Z2FXZHViM0psSUc1bGVIUWdLaTljYmlBZ1NHRnVaR3hsWW1GeWN5NXViME52Ym1ac2FXTjBJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUdsbUlDaHliMjkwTGtoaGJtUnNaV0poY25NZ1BUMDlJRWhoYm1Sc1pXSmhjbk1wSUh0Y2JpQWdJQ0FnSUhKdmIzUXVTR0Z1Wkd4bFltRnljeUE5SUNSSVlXNWtiR1ZpWVhKek8xeHVJQ0FnSUgxY2JpQWdmVHRjYm4wN1hHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdaWGh3YjNKMGMxc25aR1ZtWVhWc2RDZGRPeUpkZlE9PSIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9O1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5jaGVja1JldmlzaW9uID0gY2hlY2tSZXZpc2lvbjtcblxuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbGluZSBhbmQgYnJlYWsgdXAgY29tcGlsZVBhcnRpYWxcblxuZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtO1xuZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsO1xuZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDtcbmV4cG9ydHMubm9vcCA9IG5vb3A7XG5cbnZhciBfaW1wb3J0ID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgVXRpbHMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaW1wb3J0KTtcblxudmFyIF9FeGNlcHRpb24gPSByZXF1aXJlKCcuL2V4Y2VwdGlvbicpO1xuXG52YXIgX0V4Y2VwdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfRXhjZXB0aW9uKTtcblxudmFyIF9DT01QSUxFUl9SRVZJU0lPTiRSRVZJU0lPTl9DSEFOR0VTJGNyZWF0ZUZyYW1lID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5cbmZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7XG4gIHZhciBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLFxuICAgICAgY3VycmVudFJldmlzaW9uID0gX0NPTVBJTEVSX1JFVklTSU9OJFJFVklTSU9OX0NIQU5HRVMkY3JlYXRlRnJhbWUuQ09NUElMRVJfUkVWSVNJT047XG5cbiAgaWYgKGNvbXBpbGVyUmV2aXNpb24gIT09IGN1cnJlbnRSZXZpc2lvbikge1xuICAgIGlmIChjb21waWxlclJldmlzaW9uIDwgY3VycmVudFJldmlzaW9uKSB7XG4gICAgICB2YXIgcnVudGltZVZlcnNpb25zID0gX0NPTVBJTEVSX1JFVklTSU9OJFJFVklTSU9OX0NIQU5HRVMkY3JlYXRlRnJhbWUuUkVWSVNJT05fQ0hBTkdFU1tjdXJyZW50UmV2aXNpb25dLFxuICAgICAgICAgIGNvbXBpbGVyVmVyc2lvbnMgPSBfQ09NUElMRVJfUkVWSVNJT04kUkVWSVNJT05fQ0hBTkdFUyRjcmVhdGVGcmFtZS5SRVZJU0lPTl9DSEFOR0VTW2NvbXBpbGVyUmV2aXNpb25dO1xuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ1RlbXBsYXRlIHdhcyBwcmVjb21waWxlZCB3aXRoIGFuIG9sZGVyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHByZWNvbXBpbGVyIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIHJ1bnRpbWVWZXJzaW9ucyArICcpIG9yIGRvd25ncmFkZSB5b3VyIHJ1bnRpbWUgdG8gYW4gb2xkZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVyVmVyc2lvbnMgKyAnKS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIHRoZSBlbWJlZGRlZCB2ZXJzaW9uIGluZm8gc2luY2UgdGhlIHJ1bnRpbWUgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgcmV2aXNpb24geWV0XG4gICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUgY3VycmVudCBydW50aW1lLiAnICsgJ1BsZWFzZSB1cGRhdGUgeW91ciBydW50aW1lIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVySW5mb1sxXSArICcpLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMsIGVudikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoIWVudikge1xuICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdObyBlbnZpcm9ubWVudCBwYXNzZWQgdG8gdGVtcGxhdGUnKTtcbiAgfVxuICBpZiAoIXRlbXBsYXRlU3BlYyB8fCAhdGVtcGxhdGVTcGVjLm1haW4pIHtcbiAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5rbm93biB0ZW1wbGF0ZSBvYmplY3Q6ICcgKyB0eXBlb2YgdGVtcGxhdGVTcGVjKTtcbiAgfVxuXG4gIC8vIE5vdGU6IFVzaW5nIGVudi5WTSByZWZlcmVuY2VzIHJhdGhlciB0aGFuIGxvY2FsIHZhciByZWZlcmVuY2VzIHRocm91Z2hvdXQgdGhpcyBzZWN0aW9uIHRvIGFsbG93XG4gIC8vIGZvciBleHRlcm5hbCB1c2VycyB0byBvdmVycmlkZSB0aGVzZSBhcyBwc3VlZG8tc3VwcG9ydGVkIEFQSXMuXG4gIGVudi5WTS5jaGVja1JldmlzaW9uKHRlbXBsYXRlU3BlYy5jb21waWxlcik7XG5cbiAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmhhc2gpIHtcbiAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7XG4gICAgfVxuXG4gICAgcGFydGlhbCA9IGVudi5WTS5yZXNvbHZlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIHZhciByZXN1bHQgPSBlbnYuVk0uaW52b2tlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHJlc3VsdCA9PSBudWxsICYmIGVudi5jb21waWxlKSB7XG4gICAgICBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0gPSBlbnYuY29tcGlsZShwYXJ0aWFsLCB0ZW1wbGF0ZVNwZWMuY29tcGlsZXJPcHRpb25zLCBlbnYpO1xuICAgICAgcmVzdWx0ID0gb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgIGlmIChvcHRpb25zLmluZGVudCkge1xuICAgICAgICB2YXIgbGluZXMgPSByZXN1bHQuc3BsaXQoJ1xcbicpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpbmVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGlmICghbGluZXNbaV0gJiYgaSArIDEgPT09IGwpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcXG4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgY29tcGlsZWQgd2hlbiBydW5uaW5nIGluIHJ1bnRpbWUtb25seSBtb2RlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gSnVzdCBhZGQgd2F0ZXJcbiAgdmFyIGNvbnRhaW5lciA9IHtcbiAgICBzdHJpY3Q6IGZ1bmN0aW9uIHN0cmljdChvYmosIG5hbWUpIHtcbiAgICAgIGlmICghKG5hbWUgaW4gb2JqKSkge1xuICAgICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnXCInICsgbmFtZSArICdcIiBub3QgZGVmaW5lZCBpbiAnICsgb2JqKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpbbmFtZV07XG4gICAgfSxcbiAgICBsb29rdXA6IGZ1bmN0aW9uIGxvb2t1cChkZXB0aHMsIG5hbWUpIHtcbiAgICAgIHZhciBsZW4gPSBkZXB0aHMubGVuZ3RoO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZGVwdGhzW2ldICYmIGRlcHRoc1tpXVtuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGRlcHRoc1tpXVtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbGFtYmRhOiBmdW5jdGlvbiBsYW1iZGEoY3VycmVudCwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBjdXJyZW50ID09PSAnZnVuY3Rpb24nID8gY3VycmVudC5jYWxsKGNvbnRleHQpIDogY3VycmVudDtcbiAgICB9LFxuXG4gICAgZXNjYXBlRXhwcmVzc2lvbjogVXRpbHMuZXNjYXBlRXhwcmVzc2lvbixcbiAgICBpbnZva2VQYXJ0aWFsOiBpbnZva2VQYXJ0aWFsV3JhcHBlcixcblxuICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7XG4gICAgICByZXR1cm4gdGVtcGxhdGVTcGVjW2ldO1xuICAgIH0sXG5cbiAgICBwcm9ncmFtczogW10sXG4gICAgcHJvZ3JhbTogZnVuY3Rpb24gcHJvZ3JhbShpLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gICAgICB2YXIgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldLFxuICAgICAgICAgIGZuID0gdGhpcy5mbihpKTtcbiAgICAgIGlmIChkYXRhIHx8IGRlcHRocyB8fCBibG9ja1BhcmFtcyB8fCBkZWNsYXJlZEJsb2NrUGFyYW1zKSB7XG4gICAgICAgIHByb2dyYW1XcmFwcGVyID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4sIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgICAgfSBlbHNlIGlmICghcHJvZ3JhbVdyYXBwZXIpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2dyYW1XcmFwcGVyO1xuICAgIH0sXG5cbiAgICBkYXRhOiBmdW5jdGlvbiBkYXRhKHZhbHVlLCBkZXB0aCkge1xuICAgICAgd2hpbGUgKHZhbHVlICYmIGRlcHRoLS0pIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5fcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgbWVyZ2U6IGZ1bmN0aW9uIG1lcmdlKHBhcmFtLCBjb21tb24pIHtcbiAgICAgIHZhciBvYmogPSBwYXJhbSB8fCBjb21tb247XG5cbiAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgcGFyYW0gIT09IGNvbW1vbikge1xuICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG5cbiAgICBub29wOiBlbnYuVk0ubm9vcCxcbiAgICBjb21waWxlckluZm86IHRlbXBsYXRlU3BlYy5jb21waWxlclxuICB9O1xuXG4gIGZ1bmN0aW9uIHJldChjb250ZXh0KSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzFdO1xuXG4gICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7XG5cbiAgICByZXQuX3NldHVwKG9wdGlvbnMpO1xuICAgIGlmICghb3B0aW9ucy5wYXJ0aWFsICYmIHRlbXBsYXRlU3BlYy51c2VEYXRhKSB7XG4gICAgICBkYXRhID0gaW5pdERhdGEoY29udGV4dCwgZGF0YSk7XG4gICAgfVxuICAgIHZhciBkZXB0aHMgPSB1bmRlZmluZWQsXG4gICAgICAgIGJsb2NrUGFyYW1zID0gdGVtcGxhdGVTcGVjLnVzZUJsb2NrUGFyYW1zID8gW10gOiB1bmRlZmluZWQ7XG4gICAgaWYgKHRlbXBsYXRlU3BlYy51c2VEZXB0aHMpIHtcbiAgICAgIGRlcHRocyA9IG9wdGlvbnMuZGVwdGhzID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBbY29udGV4dF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlbXBsYXRlU3BlYy5tYWluLmNhbGwoY29udGFpbmVyLCBjb250ZXh0LCBjb250YWluZXIuaGVscGVycywgY29udGFpbmVyLnBhcnRpYWxzLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgfVxuICByZXQuaXNUb3AgPSB0cnVlO1xuXG4gIHJldC5fc2V0dXAgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucy5wYXJ0aWFsKSB7XG4gICAgICBjb250YWluZXIuaGVscGVycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmhlbHBlcnMsIGVudi5oZWxwZXJzKTtcblxuICAgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VQYXJ0aWFsKSB7XG4gICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLnBhcnRpYWxzLCBlbnYucGFydGlhbHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuaGVscGVycyA9IG9wdGlvbnMuaGVscGVycztcbiAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IG9wdGlvbnMucGFydGlhbHM7XG4gICAgfVxuICB9O1xuXG4gIHJldC5fY2hpbGQgPSBmdW5jdGlvbiAoaSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocykge1xuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgJiYgIWJsb2NrUGFyYW1zKSB7XG4gICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnbXVzdCBwYXNzIGJsb2NrIHBhcmFtcycpO1xuICAgIH1cbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocyAmJiAhZGVwdGhzKSB7XG4gICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnbXVzdCBwYXNzIHBhcmVudCBkZXB0aHMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcFByb2dyYW0oY29udGFpbmVyLCBpLCB0ZW1wbGF0ZVNwZWNbaV0sIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICB9O1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gIGZ1bmN0aW9uIHByb2coY29udGV4dCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTtcblxuICAgIHJldHVybiBmbi5jYWxsKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBkZXB0aHMgJiYgW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpKTtcbiAgfVxuICBwcm9nLnByb2dyYW0gPSBpO1xuICBwcm9nLmRlcHRoID0gZGVwdGhzID8gZGVwdGhzLmxlbmd0aCA6IDA7XG4gIHByb2cuYmxvY2tQYXJhbXMgPSBkZWNsYXJlZEJsb2NrUGFyYW1zIHx8IDA7XG4gIHJldHVybiBwcm9nO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIGlmICghcGFydGlhbCkge1xuICAgIHBhcnRpYWwgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV07XG4gIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7XG4gICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nXG4gICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDtcbiAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTtcbiAgfVxuICByZXR1cm4gcGFydGlhbDtcbn1cblxuZnVuY3Rpb24gaW52b2tlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMucGFydGlhbCA9IHRydWU7XG5cbiAgaWYgKHBhcnRpYWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgZm91bmQnKTtcbiAgfSBlbHNlIGlmIChwYXJ0aWFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gcGFydGlhbChjb250ZXh0LCBvcHRpb25zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub29wKCkge1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGluaXREYXRhKGNvbnRleHQsIGRhdGEpIHtcbiAgaWYgKCFkYXRhIHx8ICEoJ3Jvb3QnIGluIGRhdGEpKSB7XG4gICAgZGF0YSA9IGRhdGEgPyBfQ09NUElMRVJfUkVWSVNJT04kUkVWSVNJT05fQ0hBTkdFUyRjcmVhdGVGcmFtZS5jcmVhdGVGcmFtZShkYXRhKSA6IHt9O1xuICAgIGRhdGEucm9vdCA9IGNvbnRleHQ7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGVcbmZ1bmN0aW9uIFNhZmVTdHJpbmcoc3RyaW5nKSB7XG4gIHRoaXMuc3RyaW5nID0gc3RyaW5nO1xufVxuXG5TYWZlU3RyaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IFNhZmVTdHJpbmcucHJvdG90eXBlLnRvSFRNTCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICcnICsgdGhpcy5zdHJpbmc7XG59O1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBTYWZlU3RyaW5nO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5leHRlbmQgPSBleHRlbmQ7XG5cbi8vIE9sZGVyIElFIHZlcnNpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGluZGV4T2Ygc28gd2UgbXVzdCBpbXBsZW1lbnQgb3VyIG93biwgc2FkbHkuXG5leHBvcnRzLmluZGV4T2YgPSBpbmRleE9mO1xuZXhwb3J0cy5lc2NhcGVFeHByZXNzaW9uID0gZXNjYXBlRXhwcmVzc2lvbjtcbmV4cG9ydHMuaXNFbXB0eSA9IGlzRW1wdHk7XG5leHBvcnRzLmJsb2NrUGFyYW1zID0gYmxvY2tQYXJhbXM7XG5leHBvcnRzLmFwcGVuZENvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGg7XG52YXIgZXNjYXBlID0ge1xuICAnJic6ICcmYW1wOycsXG4gICc8JzogJyZsdDsnLFxuICAnPic6ICcmZ3Q7JyxcbiAgJ1wiJzogJyZxdW90OycsXG4gICdcXCcnOiAnJiN4Mjc7JyxcbiAgJ2AnOiAnJiN4NjA7J1xufTtcblxudmFyIGJhZENoYXJzID0gL1smPD5cIidgXS9nLFxuICAgIHBvc3NpYmxlID0gL1smPD5cIidgXS87XG5cbmZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7XG4gIHJldHVybiBlc2NhcGVbY2hyXTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKG9iaiAvKiAsIC4uLnNvdXJjZSAqLykge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAodmFyIGtleSBpbiBhcmd1bWVudHNbaV0pIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJndW1lbnRzW2ldLCBrZXkpKSB7XG4gICAgICAgIG9ialtrZXldID0gYXJndW1lbnRzW2ldW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZXhwb3J0cy50b1N0cmluZyA9IHRvU3RyaW5nO1xuLy8gU291cmNlZCBmcm9tIGxvZGFzaFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dFxuLyplc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlLCBuby12YXIgKi9cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufTtcbi8vIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChpc0Z1bmN0aW9uKC94LykpIHtcbiAgZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiYgdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gIH07XG59XG52YXIgaXNGdW5jdGlvbjtcbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG4vKmVzbGludC1lbmFibGUgZnVuYy1zdHlsZSwgbm8tdmFyICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XScgOiBmYWxzZTtcbn07ZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGFycmF5W2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZVxuICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkge1xuICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nICsgJyc7XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kXG4gICAgLy8gdGhlIHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMsIGNhdXNpbmcgaXNzdWVzIGlmXG4gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gaXQuXG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmc7XG4gIH1cblxuICBpZiAoIXBvc3NpYmxlLnRlc3Qoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH1cbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKGJhZENoYXJzLCBlc2NhcGVDaGFyKTtcbn1cblxuZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7XG4gIHBhcmFtcy5wYXRoID0gaWRzO1xuICByZXR1cm4gcGFyYW1zO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRDb250ZXh0UGF0aChjb250ZXh0UGF0aCwgaWQpIHtcbiAgcmV0dXJuIChjb250ZXh0UGF0aCA/IGNvbnRleHRQYXRoICsgJy4nIDogJycpICsgaWQ7XG59IiwiLy8gVVNBR0U6XG4vLyB2YXIgaGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG4vLyB2YXIgbG9jYWwgPSBoYW5kbGViYXJzLmNyZWF0ZSgpO1xuXG52YXIgaGFuZGxlYmFycyA9IHJlcXVpcmUoJy4uL2Rpc3QvY2pzL2hhbmRsZWJhcnMnKVsnZGVmYXVsdCddO1xuXG52YXIgcHJpbnRlciA9IHJlcXVpcmUoJy4uL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvcHJpbnRlcicpO1xuaGFuZGxlYmFycy5QcmludFZpc2l0b3IgPSBwcmludGVyLlByaW50VmlzaXRvcjtcbmhhbmRsZWJhcnMucHJpbnQgPSBwcmludGVyLnByaW50O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhhbmRsZWJhcnM7XG5cbi8vIFB1Ymxpc2ggYSBOb2RlLmpzIHJlcXVpcmUoKSBoYW5kbGVyIGZvciAuaGFuZGxlYmFycyBhbmQgLmhicyBmaWxlc1xuZnVuY3Rpb24gZXh0ZW5zaW9uKG1vZHVsZSwgZmlsZW5hbWUpIHtcbiAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgdmFyIHRlbXBsYXRlU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGZpbGVuYW1lLCAndXRmOCcpO1xuICBtb2R1bGUuZXhwb3J0cyA9IGhhbmRsZWJhcnMuY29tcGlsZSh0ZW1wbGF0ZVN0cmluZyk7XG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJyAmJiByZXF1aXJlLmV4dGVuc2lvbnMpIHtcbiAgcmVxdWlyZS5leHRlbnNpb25zWycuaGFuZGxlYmFycyddID0gZXh0ZW5zaW9uO1xuICByZXF1aXJlLmV4dGVuc2lvbnNbJy5oYnMnXSA9IGV4dGVuc2lvbjtcbn1cbiIsIihmdW5jdGlvbiAocHJvY2VzcyxfX2ZpbGVuYW1lKXtcbi8qKiB2aW06IGV0OnRzPTQ6c3c9NDpzdHM9NFxuICogQGxpY2Vuc2UgYW1kZWZpbmUgMS4wLjEgQ29weXJpZ2h0IChjKSAyMDExLTIwMTYsIFRoZSBEb2pvIEZvdW5kYXRpb24gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIEF2YWlsYWJsZSB2aWEgdGhlIE1JVCBvciBuZXcgQlNEIGxpY2Vuc2UuXG4gKiBzZWU6IGh0dHA6Ly9naXRodWIuY29tL2pyYnVya2UvYW1kZWZpbmUgZm9yIGRldGFpbHNcbiAqL1xuXG4vKmpzbGludCBub2RlOiB0cnVlICovXG4vKmdsb2JhbCBtb2R1bGUsIHByb2Nlc3MgKi9cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVmaW5lIGZvciBub2RlLlxuICogQHBhcmFtIHtPYmplY3R9IG1vZHVsZSB0aGUgXCJtb2R1bGVcIiBvYmplY3QgdGhhdCBpcyBkZWZpbmVkIGJ5IE5vZGUgZm9yIHRoZVxuICogY3VycmVudCBtb2R1bGUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVxdWlyZUZuXS4gTm9kZSdzIHJlcXVpcmUgZnVuY3Rpb24gZm9yIHRoZSBjdXJyZW50IG1vZHVsZS5cbiAqIEl0IG9ubHkgbmVlZHMgdG8gYmUgcGFzc2VkIGluIE5vZGUgdmVyc2lvbnMgYmVmb3JlIDAuNSwgd2hlbiBtb2R1bGUucmVxdWlyZVxuICogZGlkIG5vdCBleGlzdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBkZWZpbmUgZnVuY3Rpb24gdGhhdCBpcyB1c2FibGUgZm9yIHRoZSBjdXJyZW50IG5vZGVcbiAqIG1vZHVsZS5cbiAqL1xuZnVuY3Rpb24gYW1kZWZpbmUobW9kdWxlLCByZXF1aXJlRm4pIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIGRlZmluZUNhY2hlID0ge30sXG4gICAgICAgIGxvYWRlckNhY2hlID0ge30sXG4gICAgICAgIGFscmVhZHlDYWxsZWQgPSBmYWxzZSxcbiAgICAgICAgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKSxcbiAgICAgICAgbWFrZVJlcXVpcmUsIHN0cmluZ1JlcXVpcmU7XG5cbiAgICAvKipcbiAgICAgKiBUcmltcyB0aGUgLiBhbmQgLi4gZnJvbSBhbiBhcnJheSBvZiBwYXRoIHNlZ21lbnRzLlxuICAgICAqIEl0IHdpbGwga2VlcCBhIGxlYWRpbmcgcGF0aCBzZWdtZW50IGlmIGEgLi4gd2lsbCBiZWNvbWVcbiAgICAgKiB0aGUgZmlyc3QgcGF0aCBzZWdtZW50LCB0byBoZWxwIHdpdGggbW9kdWxlIG5hbWUgbG9va3VwcyxcbiAgICAgKiB3aGljaCBhY3QgbGlrZSBwYXRocywgYnV0IGNhbiBiZSByZW1hcHBlZC4gQnV0IHRoZSBlbmQgcmVzdWx0LFxuICAgICAqIGFsbCBwYXRocyB0aGF0IHVzZSB0aGlzIGZ1bmN0aW9uIHNob3VsZCBsb29rIG5vcm1hbGl6ZWQuXG4gICAgICogTk9URTogdGhpcyBtZXRob2QgTU9ESUZJRVMgdGhlIGlucHV0IGFycmF5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyeSB0aGUgYXJyYXkgb2YgcGF0aCBzZWdtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltRG90cyhhcnkpIHtcbiAgICAgICAgdmFyIGksIHBhcnQ7XG4gICAgICAgIGZvciAoaSA9IDA7IGFyeVtpXTsgaSs9IDEpIHtcbiAgICAgICAgICAgIHBhcnQgPSBhcnlbaV07XG4gICAgICAgICAgICBpZiAocGFydCA9PT0gJy4nKSB7XG4gICAgICAgICAgICAgICAgYXJ5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICBpIC09IDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuLicpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMSAmJiAoYXJ5WzJdID09PSAnLi4nIHx8IGFyeVswXSA9PT0gJy4uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9FbmQgb2YgdGhlIGxpbmUuIEtlZXAgYXQgbGVhc3Qgb25lIG5vbi1kb3RcbiAgICAgICAgICAgICAgICAgICAgLy9wYXRoIHNlZ21lbnQgYXQgdGhlIGZyb250IHNvIGl0IGNhbiBiZSBtYXBwZWRcbiAgICAgICAgICAgICAgICAgICAgLy9jb3JyZWN0bHkgdG8gZGlzay4gT3RoZXJ3aXNlLCB0aGVyZSBpcyBsaWtlbHlcbiAgICAgICAgICAgICAgICAgICAgLy9ubyBwYXRoIG1hcHBpbmcgZm9yIGEgcGF0aCBzdGFydGluZyB3aXRoICcuLicuXG4gICAgICAgICAgICAgICAgICAgIC8vVGhpcyBjYW4gc3RpbGwgZmFpbCwgYnV0IGNhdGNoZXMgdGhlIG1vc3QgcmVhc29uYWJsZVxuICAgICAgICAgICAgICAgICAgICAvL3VzZXMgb2YgLi5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBhcnkuc3BsaWNlKGkgLSAxLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgaSAtPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShuYW1lLCBiYXNlTmFtZSkge1xuICAgICAgICB2YXIgYmFzZVBhcnRzO1xuXG4gICAgICAgIC8vQWRqdXN0IGFueSByZWxhdGl2ZSBwYXRocy5cbiAgICAgICAgaWYgKG5hbWUgJiYgbmFtZS5jaGFyQXQoMCkgPT09ICcuJykge1xuICAgICAgICAgICAgLy9JZiBoYXZlIGEgYmFzZSBuYW1lLCB0cnkgdG8gbm9ybWFsaXplIGFnYWluc3QgaXQsXG4gICAgICAgICAgICAvL290aGVyd2lzZSwgYXNzdW1lIGl0IGlzIGEgdG9wLWxldmVsIHJlcXVpcmUgdGhhdCB3aWxsXG4gICAgICAgICAgICAvL2JlIHJlbGF0aXZlIHRvIGJhc2VVcmwgaW4gdGhlIGVuZC5cbiAgICAgICAgICAgIGlmIChiYXNlTmFtZSkge1xuICAgICAgICAgICAgICAgIGJhc2VQYXJ0cyA9IGJhc2VOYW1lLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICAgICAgYmFzZVBhcnRzID0gYmFzZVBhcnRzLnNsaWNlKDAsIGJhc2VQYXJ0cy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICBiYXNlUGFydHMgPSBiYXNlUGFydHMuY29uY2F0KG5hbWUuc3BsaXQoJy8nKSk7XG4gICAgICAgICAgICAgICAgdHJpbURvdHMoYmFzZVBhcnRzKTtcbiAgICAgICAgICAgICAgICBuYW1lID0gYmFzZVBhcnRzLmpvaW4oJy8nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSB0aGUgbm9ybWFsaXplKCkgZnVuY3Rpb24gcGFzc2VkIHRvIGEgbG9hZGVyIHBsdWdpbidzXG4gICAgICogbm9ybWFsaXplIG1ldGhvZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYWtlTm9ybWFsaXplKHJlbE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKG5hbWUsIHJlbE5hbWUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VMb2FkKGlkKSB7XG4gICAgICAgIGZ1bmN0aW9uIGxvYWQodmFsdWUpIHtcbiAgICAgICAgICAgIGxvYWRlckNhY2hlW2lkXSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9hZC5mcm9tVGV4dCA9IGZ1bmN0aW9uIChpZCwgdGV4dCkge1xuICAgICAgICAgICAgLy9UaGlzIG9uZSBpcyBkaWZmaWN1bHQgYmVjYXVzZSB0aGUgdGV4dCBjYW4vcHJvYmFibHkgdXNlc1xuICAgICAgICAgICAgLy9kZWZpbmUsIGFuZCBhbnkgcmVsYXRpdmUgcGF0aHMgYW5kIHJlcXVpcmVzIHNob3VsZCBiZSByZWxhdGl2ZVxuICAgICAgICAgICAgLy90byB0aGF0IGlkIHdhcyBpdCB3b3VsZCBiZSBmb3VuZCBvbiBkaXNrLiBCdXQgdGhpcyB3b3VsZCByZXF1aXJlXG4gICAgICAgICAgICAvL2Jvb3RzdHJhcHBpbmcgYSBtb2R1bGUvcmVxdWlyZSBmYWlybHkgZGVlcGx5IGZyb20gbm9kZSBjb3JlLlxuICAgICAgICAgICAgLy9Ob3Qgc3VyZSBob3cgYmVzdCB0byBnbyBhYm91dCB0aGF0IHlldC5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYW1kZWZpbmUgZG9lcyBub3QgaW1wbGVtZW50IGxvYWQuZnJvbVRleHQnKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbG9hZDtcbiAgICB9XG5cbiAgICBtYWtlUmVxdWlyZSA9IGZ1bmN0aW9uIChzeXN0ZW1SZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUsIHJlbElkKSB7XG4gICAgICAgIGZ1bmN0aW9uIGFtZFJlcXVpcmUoZGVwcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGVwcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAvL1N5bmNocm9ub3VzLCBzaW5nbGUgbW9kdWxlIHJlcXVpcmUoJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1JlcXVpcmUoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCBkZXBzLCByZWxJZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vQXJyYXkgb2YgZGVwZW5kZW5jaWVzIHdpdGggYSBjYWxsYmFjay5cblxuICAgICAgICAgICAgICAgIC8vQ29udmVydCB0aGUgZGVwZW5kZW5jaWVzIHRvIG1vZHVsZXMuXG4gICAgICAgICAgICAgICAgZGVwcyA9IGRlcHMubWFwKGZ1bmN0aW9uIChkZXBOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdSZXF1aXJlKHN5c3RlbVJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSwgZGVwTmFtZSwgcmVsSWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy9XYWl0IGZvciBuZXh0IHRpY2sgdG8gY2FsbCBiYWNrIHRoZSByZXF1aXJlIGNhbGwuXG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgZGVwcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFtZFJlcXVpcmUudG9VcmwgPSBmdW5jdGlvbiAoZmlsZVBhdGgpIHtcbiAgICAgICAgICAgIGlmIChmaWxlUGF0aC5pbmRleE9mKCcuJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKGZpbGVQYXRoLCBwYXRoLmRpcm5hbWUobW9kdWxlLmZpbGVuYW1lKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gYW1kUmVxdWlyZTtcbiAgICB9O1xuXG4gICAgLy9GYXZvciBleHBsaWNpdCB2YWx1ZSwgcGFzc2VkIGluIGlmIHRoZSBtb2R1bGUgd2FudHMgdG8gc3VwcG9ydCBOb2RlIDAuNC5cbiAgICByZXF1aXJlRm4gPSByZXF1aXJlRm4gfHwgZnVuY3Rpb24gcmVxKCkge1xuICAgICAgICByZXR1cm4gbW9kdWxlLnJlcXVpcmUuYXBwbHkobW9kdWxlLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBydW5GYWN0b3J5KGlkLCBkZXBzLCBmYWN0b3J5KSB7XG4gICAgICAgIHZhciByLCBlLCBtLCByZXN1bHQ7XG5cbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBlID0gbG9hZGVyQ2FjaGVbaWRdID0ge307XG4gICAgICAgICAgICBtID0ge1xuICAgICAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgICAgICB1cmk6IF9fZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgZXhwb3J0czogZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHIgPSBtYWtlUmVxdWlyZShyZXF1aXJlRm4sIGUsIG0sIGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vT25seSBzdXBwb3J0IG9uZSBkZWZpbmUgY2FsbCBwZXIgZmlsZVxuICAgICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FtZGVmaW5lIHdpdGggbm8gbW9kdWxlIElEIGNhbm5vdCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgcGVyIGZpbGUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy9Vc2UgdGhlIHJlYWwgdmFyaWFibGVzIGZyb20gbm9kZVxuICAgICAgICAgICAgLy9Vc2UgbW9kdWxlLmV4cG9ydHMgZm9yIGV4cG9ydHMsIHNpbmNlXG4gICAgICAgICAgICAvL3RoZSBleHBvcnRzIGluIGhlcmUgaXMgYW1kZWZpbmUgZXhwb3J0cy5cbiAgICAgICAgICAgIGUgPSBtb2R1bGUuZXhwb3J0cztcbiAgICAgICAgICAgIG0gPSBtb2R1bGU7XG4gICAgICAgICAgICByID0gbWFrZVJlcXVpcmUocmVxdWlyZUZuLCBlLCBtLCBtb2R1bGUuaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9JZiB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzLCB0aGV5IGFyZSBzdHJpbmdzLCBzbyBuZWVkXG4gICAgICAgIC8vdG8gY29udmVydCB0aGVtIHRvIGRlcGVuZGVuY3kgdmFsdWVzLlxuICAgICAgICBpZiAoZGVwcykge1xuICAgICAgICAgICAgZGVwcyA9IGRlcHMubWFwKGZ1bmN0aW9uIChkZXBOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHIoZGVwTmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vQ2FsbCB0aGUgZmFjdG9yeSB3aXRoIHRoZSByaWdodCBkZXBlbmRlbmNpZXMuXG4gICAgICAgIGlmICh0eXBlb2YgZmFjdG9yeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmVzdWx0ID0gZmFjdG9yeS5hcHBseShtLmV4cG9ydHMsIGRlcHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gZmFjdG9yeTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbS5leHBvcnRzID0gcmVzdWx0O1xuICAgICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAgICAgbG9hZGVyQ2FjaGVbaWRdID0gbS5leHBvcnRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RyaW5nUmVxdWlyZSA9IGZ1bmN0aW9uIChzeXN0ZW1SZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUsIGlkLCByZWxJZCkge1xuICAgICAgICAvL1NwbGl0IHRoZSBJRCBieSBhICEgc28gdGhhdFxuICAgICAgICB2YXIgaW5kZXggPSBpZC5pbmRleE9mKCchJyksXG4gICAgICAgICAgICBvcmlnaW5hbElkID0gaWQsXG4gICAgICAgICAgICBwcmVmaXgsIHBsdWdpbjtcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBpZCA9IG5vcm1hbGl6ZShpZCwgcmVsSWQpO1xuXG4gICAgICAgICAgICAvL1N0cmFpZ2h0IG1vZHVsZSBsb29rdXAuIElmIGl0IGlzIG9uZSBvZiB0aGUgc3BlY2lhbCBkZXBlbmRlbmNpZXMsXG4gICAgICAgICAgICAvL2RlYWwgd2l0aCBpdCwgb3RoZXJ3aXNlLCBkZWxlZ2F0ZSB0byBub2RlLlxuICAgICAgICAgICAgaWYgKGlkID09PSAncmVxdWlyZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVJlcXVpcmUoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCByZWxJZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlkID09PSAnZXhwb3J0cycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0cztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT09ICdtb2R1bGUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobG9hZGVyQ2FjaGUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlckNhY2hlW2lkXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVmaW5lQ2FjaGVbaWRdKSB7XG4gICAgICAgICAgICAgICAgcnVuRmFjdG9yeS5hcHBseShudWxsLCBkZWZpbmVDYWNoZVtpZF0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2FkZXJDYWNoZVtpZF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmKHN5c3RlbVJlcXVpcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5c3RlbVJlcXVpcmUob3JpZ2luYWxJZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBtb2R1bGUgd2l0aCBJRDogJyArIGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RoZXJlIGlzIGEgcGx1Z2luIGluIHBsYXkuXG4gICAgICAgICAgICBwcmVmaXggPSBpZC5zdWJzdHJpbmcoMCwgaW5kZXgpO1xuICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHJpbmcoaW5kZXggKyAxLCBpZC5sZW5ndGgpO1xuXG4gICAgICAgICAgICBwbHVnaW4gPSBzdHJpbmdSZXF1aXJlKHN5c3RlbVJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSwgcHJlZml4LCByZWxJZCk7XG5cbiAgICAgICAgICAgIGlmIChwbHVnaW4ubm9ybWFsaXplKSB7XG4gICAgICAgICAgICAgICAgaWQgPSBwbHVnaW4ubm9ybWFsaXplKGlkLCBtYWtlTm9ybWFsaXplKHJlbElkKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIHRoZSBJRCBub3JtYWxseS5cbiAgICAgICAgICAgICAgICBpZCA9IG5vcm1hbGl6ZShpZCwgcmVsSWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobG9hZGVyQ2FjaGVbaWRdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlckNhY2hlW2lkXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmxvYWQoaWQsIG1ha2VSZXF1aXJlKHN5c3RlbVJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSwgcmVsSWQpLCBtYWtlTG9hZChpZCksIHt9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBsb2FkZXJDYWNoZVtpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy9DcmVhdGUgYSBkZWZpbmUgZnVuY3Rpb24gc3BlY2lmaWMgdG8gdGhlIG1vZHVsZSBhc2tpbmcgZm9yIGFtZGVmaW5lLlxuICAgIGZ1bmN0aW9uIGRlZmluZShpZCwgZGVwcywgZmFjdG9yeSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICAgICAgICAgIGZhY3RvcnkgPSBkZXBzO1xuICAgICAgICAgICAgZGVwcyA9IGlkO1xuICAgICAgICAgICAgaWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZmFjdG9yeSA9IGlkO1xuICAgICAgICAgICAgaWQgPSBkZXBzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlcHMgJiYgIUFycmF5LmlzQXJyYXkoZGVwcykpIHtcbiAgICAgICAgICAgIGZhY3RvcnkgPSBkZXBzO1xuICAgICAgICAgICAgZGVwcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGVwcykge1xuICAgICAgICAgICAgZGVwcyA9IFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZSddO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9TZXQgdXAgcHJvcGVydGllcyBmb3IgdGhpcyBtb2R1bGUuIElmIGFuIElELCB0aGVuIHVzZVxuICAgICAgICAvL2ludGVybmFsIGNhY2hlLiBJZiBubyBJRCwgdGhlbiB1c2UgdGhlIGV4dGVybmFsIHZhcmlhYmxlc1xuICAgICAgICAvL2ZvciB0aGlzIG5vZGUgbW9kdWxlLlxuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIC8vUHV0IHRoZSBtb2R1bGUgaW4gZGVlcCBmcmVlemUgdW50aWwgdGhlcmUgaXMgYVxuICAgICAgICAgICAgLy9yZXF1aXJlIGNhbGwgZm9yIGl0LlxuICAgICAgICAgICAgZGVmaW5lQ2FjaGVbaWRdID0gW2lkLCBkZXBzLCBmYWN0b3J5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1bkZhY3RvcnkoaWQsIGRlcHMsIGZhY3RvcnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9kZWZpbmUucmVxdWlyZSwgd2hpY2ggaGFzIGFjY2VzcyB0byBhbGwgdGhlIHZhbHVlcyBpbiB0aGVcbiAgICAvL2NhY2hlLiBVc2VmdWwgZm9yIEFNRCBtb2R1bGVzIHRoYXQgYWxsIGhhdmUgSURzIGluIHRoZSBmaWxlLFxuICAgIC8vYnV0IG5lZWQgdG8gZmluYWxseSBleHBvcnQgYSB2YWx1ZSB0byBub2RlIGJhc2VkIG9uIG9uZSBvZiB0aG9zZVxuICAgIC8vSURzLlxuICAgIGRlZmluZS5yZXF1aXJlID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGlmIChsb2FkZXJDYWNoZVtpZF0pIHtcbiAgICAgICAgICAgIHJldHVybiBsb2FkZXJDYWNoZVtpZF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVmaW5lQ2FjaGVbaWRdKSB7XG4gICAgICAgICAgICBydW5GYWN0b3J5LmFwcGx5KG51bGwsIGRlZmluZUNhY2hlW2lkXSk7XG4gICAgICAgICAgICByZXR1cm4gbG9hZGVyQ2FjaGVbaWRdO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGRlZmluZS5hbWQgPSB7fTtcblxuICAgIHJldHVybiBkZWZpbmU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYW1kZWZpbmU7XG5cbn0pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpLFwiLy4uXFxcXC4uXFxcXG5vZGVfbW9kdWxlc1xcXFxhbWRlZmluZVxcXFxhbWRlZmluZS5qc1wiKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMMjV2WkdWZmJXOWtkV3hsY3k5aGJXUmxabWx1WlM5aGJXUmxabWx1WlM1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU8wRkJRVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeW9xSUhacGJUb2daWFE2ZEhNOU5EcHpkejAwT25OMGN6MDBYRzRnS2lCQWJHbGpaVzV6WlNCaGJXUmxabWx1WlNBeExqQXVNU0JEYjNCNWNtbG5hSFFnS0dNcElESXdNVEV0TWpBeE5pd2dWR2hsSUVSdmFtOGdSbTkxYm1SaGRHbHZiaUJCYkd3Z1VtbG5hSFJ6SUZKbGMyVnlkbVZrTGx4dUlDb2dRWFpoYVd4aFlteGxJSFpwWVNCMGFHVWdUVWxVSUc5eUlHNWxkeUJDVTBRZ2JHbGpaVzV6WlM1Y2JpQXFJSE5sWlRvZ2FIUjBjRG92TDJkcGRHaDFZaTVqYjIwdmFuSmlkWEpyWlM5aGJXUmxabWx1WlNCbWIzSWdaR1YwWVdsc2MxeHVJQ292WEc1Y2JpOHFhbk5zYVc1MElHNXZaR1U2SUhSeWRXVWdLaTljYmk4cVoyeHZZbUZzSUcxdlpIVnNaU3dnY0hKdlkyVnpjeUFxTDF4dUozVnpaU0J6ZEhKcFkzUW5PMXh1WEc0dktpcGNiaUFxSUVOeVpXRjBaWE1nWVNCa1pXWnBibVVnWm05eUlHNXZaR1V1WEc0Z0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2JXOWtkV3hsSUhSb1pTQmNJbTF2WkhWc1pWd2lJRzlpYW1WamRDQjBhR0YwSUdseklHUmxabWx1WldRZ1lua2dUbTlrWlNCbWIzSWdkR2hsWEc0Z0tpQmpkWEp5Wlc1MElHMXZaSFZzWlM1Y2JpQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJRnR5WlhGMWFYSmxSbTVkTGlCT2IyUmxKM01nY21WeGRXbHlaU0JtZFc1amRHbHZiaUJtYjNJZ2RHaGxJR04xY25KbGJuUWdiVzlrZFd4bExseHVJQ29nU1hRZ2IyNXNlU0J1WldWa2N5QjBieUJpWlNCd1lYTnpaV1FnYVc0Z1RtOWtaU0IyWlhKemFXOXVjeUJpWldadmNtVWdNQzQxTENCM2FHVnVJRzF2WkhWc1pTNXlaWEYxYVhKbFhHNGdLaUJrYVdRZ2JtOTBJR1Y0YVhOMExseHVJQ29nUUhKbGRIVnlibk1nZTBaMWJtTjBhVzl1ZlNCaElHUmxabWx1WlNCbWRXNWpkR2x2YmlCMGFHRjBJR2x6SUhWellXSnNaU0JtYjNJZ2RHaGxJR04xY25KbGJuUWdibTlrWlZ4dUlDb2diVzlrZFd4bExseHVJQ292WEc1bWRXNWpkR2x2YmlCaGJXUmxabWx1WlNodGIyUjFiR1VzSUhKbGNYVnBjbVZHYmlrZ2UxeHVJQ0FnSUNkMWMyVWdjM1J5YVdOMEp6dGNiaUFnSUNCMllYSWdaR1ZtYVc1bFEyRmphR1VnUFNCN2ZTeGNiaUFnSUNBZ0lDQWdiRzloWkdWeVEyRmphR1VnUFNCN2ZTeGNiaUFnSUNBZ0lDQWdZV3h5WldGa2VVTmhiR3hsWkNBOUlHWmhiSE5sTEZ4dUlDQWdJQ0FnSUNCd1lYUm9JRDBnY21WeGRXbHlaU2duY0dGMGFDY3BMRnh1SUNBZ0lDQWdJQ0J0WVd0bFVtVnhkV2x5WlN3Z2MzUnlhVzVuVW1WeGRXbHlaVHRjYmx4dUlDQWdJQzhxS2x4dUlDQWdJQ0FxSUZSeWFXMXpJSFJvWlNBdUlHRnVaQ0F1TGlCbWNtOXRJR0Z1SUdGeWNtRjVJRzltSUhCaGRHZ2djMlZuYldWdWRITXVYRzRnSUNBZ0lDb2dTWFFnZDJsc2JDQnJaV1Z3SUdFZ2JHVmhaR2x1WnlCd1lYUm9JSE5sWjIxbGJuUWdhV1lnWVNBdUxpQjNhV3hzSUdKbFkyOXRaVnh1SUNBZ0lDQXFJSFJvWlNCbWFYSnpkQ0J3WVhSb0lITmxaMjFsYm5Rc0lIUnZJR2hsYkhBZ2QybDBhQ0J0YjJSMWJHVWdibUZ0WlNCc2IyOXJkWEJ6TEZ4dUlDQWdJQ0FxSUhkb2FXTm9JR0ZqZENCc2FXdGxJSEJoZEdoekxDQmlkWFFnWTJGdUlHSmxJSEpsYldGd2NHVmtMaUJDZFhRZ2RHaGxJR1Z1WkNCeVpYTjFiSFFzWEc0Z0lDQWdJQ29nWVd4c0lIQmhkR2h6SUhSb1lYUWdkWE5sSUhSb2FYTWdablZ1WTNScGIyNGdjMmh2ZFd4a0lHeHZiMnNnYm05eWJXRnNhWHBsWkM1Y2JpQWdJQ0FnS2lCT1QxUkZPaUIwYUdseklHMWxkR2h2WkNCTlQwUkpSa2xGVXlCMGFHVWdhVzV3ZFhRZ1lYSnlZWGt1WEc0Z0lDQWdJQ29nUUhCaGNtRnRJSHRCY25KaGVYMGdZWEo1SUhSb1pTQmhjbkpoZVNCdlppQndZWFJvSUhObFoyMWxiblJ6TGx4dUlDQWdJQ0FxTDF4dUlDQWdJR1oxYm1OMGFXOXVJSFJ5YVcxRWIzUnpLR0Z5ZVNrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnYVN3Z2NHRnlkRHRjYmlBZ0lDQWdJQ0FnWm05eUlDaHBJRDBnTURzZ1lYSjVXMmxkT3lCcEt6MGdNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjR0Z5ZENBOUlHRnllVnRwWFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNod1lYSjBJRDA5UFNBbkxpY3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoY25rdWMzQnNhV05sS0drc0lERXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2tnTFQwZ01UdGNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2NHRnlkQ0E5UFQwZ0p5NHVKeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHBJRDA5UFNBeElDWW1JQ2hoY25sYk1sMGdQVDA5SUNjdUxpY2dmSHdnWVhKNVd6QmRJRDA5UFNBbkxpNG5LU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMMFZ1WkNCdlppQjBhR1VnYkdsdVpTNGdTMlZsY0NCaGRDQnNaV0Z6ZENCdmJtVWdibTl1TFdSdmRGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2TDNCaGRHZ2djMlZuYldWdWRDQmhkQ0IwYUdVZ1puSnZiblFnYzI4Z2FYUWdZMkZ1SUdKbElHMWhjSEJsWkZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMMk52Y25KbFkzUnNlU0IwYnlCa2FYTnJMaUJQZEdobGNuZHBjMlVzSUhSb1pYSmxJR2x6SUd4cGEyVnNlVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkwyNXZJSEJoZEdnZ2JXRndjR2x1WnlCbWIzSWdZU0J3WVhSb0lITjBZWEowYVc1bklIZHBkR2dnSnk0dUp5NWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk5VWFHbHpJR05oYmlCemRHbHNiQ0JtWVdsc0xDQmlkWFFnWTJGMFkyaGxjeUIwYUdVZ2JXOXpkQ0J5WldGemIyNWhZbXhsWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZkWE5sY3lCdlppQXVMbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0drZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnllUzV6Y0d4cFkyVW9hU0F0SURFc0lESXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcElDMDlJREk3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdibTl5YldGc2FYcGxLRzVoYldVc0lHSmhjMlZPWVcxbEtTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCaVlYTmxVR0Z5ZEhNN1hHNWNiaUFnSUNBZ0lDQWdMeTlCWkdwMWMzUWdZVzU1SUhKbGJHRjBhWFpsSUhCaGRHaHpMbHh1SUNBZ0lDQWdJQ0JwWmlBb2JtRnRaU0FtSmlCdVlXMWxMbU5vWVhKQmRDZ3dLU0E5UFQwZ0p5NG5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMMGxtSUdoaGRtVWdZU0JpWVhObElHNWhiV1VzSUhSeWVTQjBieUJ1YjNKdFlXeHBlbVVnWVdkaGFXNXpkQ0JwZEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2YjNSb1pYSjNhWE5sTENCaGMzTjFiV1VnYVhRZ2FYTWdZU0IwYjNBdGJHVjJaV3dnY21WeGRXbHlaU0IwYUdGMElIZHBiR3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZZbVVnY21Wc1lYUnBkbVVnZEc4Z1ltRnpaVlZ5YkNCcGJpQjBhR1VnWlc1a0xseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHSmhjMlZPWVcxbEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZ6WlZCaGNuUnpJRDBnWW1GelpVNWhiV1V1YzNCc2FYUW9KeThuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlYTmxVR0Z5ZEhNZ1BTQmlZWE5sVUdGeWRITXVjMnhwWTJVb01Dd2dZbUZ6WlZCaGNuUnpMbXhsYm1kMGFDQXRJREVwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaGMyVlFZWEowY3lBOUlHSmhjMlZRWVhKMGN5NWpiMjVqWVhRb2JtRnRaUzV6Y0d4cGRDZ25MeWNwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGNtbHRSRzkwY3loaVlYTmxVR0Z5ZEhNcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCaVlYTmxVR0Z5ZEhNdWFtOXBiaWduTHljcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHNWhiV1U3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdMeW9xWEc0Z0lDQWdJQ29nUTNKbFlYUmxJSFJvWlNCdWIzSnRZV3hwZW1Vb0tTQm1kVzVqZEdsdmJpQndZWE56WldRZ2RHOGdZU0JzYjJGa1pYSWdjR3gxWjJsdUozTmNiaUFnSUNBZ0tpQnViM0p0WVd4cGVtVWdiV1YwYUc5a0xseHVJQ0FnSUNBcUwxeHVJQ0FnSUdaMWJtTjBhVzl1SUcxaGEyVk9iM0p0WVd4cGVtVW9jbVZzVG1GdFpTa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdablZ1WTNScGIyNGdLRzVoYldVcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ1YjNKdFlXeHBlbVVvYm1GdFpTd2djbVZzVG1GdFpTazdYRzRnSUNBZ0lDQWdJSDA3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdiV0ZyWlV4dllXUW9hV1FwSUh0Y2JpQWdJQ0FnSUNBZ1puVnVZM1JwYjI0Z2JHOWhaQ2gyWVd4MVpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2JHOWhaR1Z5UTJGamFHVmJhV1JkSUQwZ2RtRnNkV1U3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnNiMkZrTG1aeWIyMVVaWGgwSUQwZ1puVnVZM1JwYjI0Z0tHbGtMQ0IwWlhoMEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBdkwxUm9hWE1nYjI1bElHbHpJR1JwWm1acFkzVnNkQ0JpWldOaGRYTmxJSFJvWlNCMFpYaDBJR05oYmk5d2NtOWlZV0pzZVNCMWMyVnpYRzRnSUNBZ0lDQWdJQ0FnSUNBdkwyUmxabWx1WlN3Z1lXNWtJR0Z1ZVNCeVpXeGhkR2wyWlNCd1lYUm9jeUJoYm1RZ2NtVnhkV2x5WlhNZ2MyaHZkV3hrSUdKbElISmxiR0YwYVhabFhHNGdJQ0FnSUNBZ0lDQWdJQ0F2TDNSdklIUm9ZWFFnYVdRZ2QyRnpJR2wwSUhkdmRXeGtJR0psSUdadmRXNWtJRzl1SUdScGMyc3VJRUoxZENCMGFHbHpJSGR2ZFd4a0lISmxjWFZwY21WY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2WW05dmRITjBjbUZ3Y0dsdVp5QmhJRzF2WkhWc1pTOXlaWEYxYVhKbElHWmhhWEpzZVNCa1pXVndiSGtnWm5KdmJTQnViMlJsSUdOdmNtVXVYRzRnSUNBZ0lDQWdJQ0FnSUNBdkwwNXZkQ0J6ZFhKbElHaHZkeUJpWlhOMElIUnZJR2R2SUdGaWIzVjBJSFJvWVhRZ2VXVjBMbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkaGJXUmxabWx1WlNCa2IyVnpJRzV2ZENCcGJYQnNaVzFsYm5RZ2JHOWhaQzVtY205dFZHVjRkQ2NwTzF4dUlDQWdJQ0FnSUNCOU8xeHVYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnNiMkZrTzF4dUlDQWdJSDFjYmx4dUlDQWdJRzFoYTJWU1pYRjFhWEpsSUQwZ1puVnVZM1JwYjI0Z0tITjVjM1JsYlZKbGNYVnBjbVVzSUdWNGNHOXlkSE1zSUcxdlpIVnNaU3dnY21Wc1NXUXBJSHRjYmlBZ0lDQWdJQ0FnWm5WdVkzUnBiMjRnWVcxa1VtVnhkV2x5WlNoa1pYQnpMQ0JqWVd4c1ltRmpheWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSNWNHVnZaaUJrWlhCeklEMDlQU0FuYzNSeWFXNW5KeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dlUzbHVZMmh5YjI1dmRYTXNJSE5wYm1kc1pTQnRiMlIxYkdVZ2NtVnhkV2x5WlNnbkp5bGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2MzUnlhVzVuVW1WeGRXbHlaU2h6ZVhOMFpXMVNaWEYxYVhKbExDQmxlSEJ2Y25SekxDQnRiMlIxYkdVc0lHUmxjSE1zSUhKbGJFbGtLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OUJjbkpoZVNCdlppQmtaWEJsYm1SbGJtTnBaWE1nZDJsMGFDQmhJR05oYkd4aVlXTnJMbHh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk5RGIyNTJaWEowSUhSb1pTQmtaWEJsYm1SbGJtTnBaWE1nZEc4Z2JXOWtkV3hsY3k1Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa1pYQnpJRDBnWkdWd2N5NXRZWEFvWm5WdVkzUnBiMjRnS0dSbGNFNWhiV1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlITjBjbWx1WjFKbGNYVnBjbVVvYzNsemRHVnRVbVZ4ZFdseVpTd2daWGh3YjNKMGN5d2diVzlrZFd4bExDQmtaWEJPWVcxbExDQnlaV3hKWkNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2TDFkaGFYUWdabTl5SUc1bGVIUWdkR2xqYXlCMGJ5QmpZV3hzSUdKaFkyc2dkR2hsSUhKbGNYVnBjbVVnWTJGc2JDNWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWTJGc2JHSmhZMnNwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjSEp2WTJWemN5NXVaWGgwVkdsamF5aG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWVd4c1ltRmpheTVoY0hCc2VTaHVkV3hzTENCa1pYQnpLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnWVcxa1VtVnhkV2x5WlM1MGIxVnliQ0E5SUdaMWJtTjBhVzl1SUNobWFXeGxVR0YwYUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHWnBiR1ZRWVhSb0xtbHVaR1Y0VDJZb0p5NG5LU0E5UFQwZ01Da2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnViM0p0WVd4cGVtVW9abWxzWlZCaGRHZ3NJSEJoZEdndVpHbHlibUZ0WlNodGIyUjFiR1V1Wm1sc1pXNWhiV1VwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHWnBiR1ZRWVhSb08xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOU8xeHVYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmhiV1JTWlhGMWFYSmxPMXh1SUNBZ0lIMDdYRzVjYmlBZ0lDQXZMMFpoZG05eUlHVjRjR3hwWTJsMElIWmhiSFZsTENCd1lYTnpaV1FnYVc0Z2FXWWdkR2hsSUcxdlpIVnNaU0IzWVc1MGN5QjBieUJ6ZFhCd2IzSjBJRTV2WkdVZ01DNDBMbHh1SUNBZ0lISmxjWFZwY21WR2JpQTlJSEpsY1hWcGNtVkdiaUI4ZkNCbWRXNWpkR2x2YmlCeVpYRW9LU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ0YjJSMWJHVXVjbVZ4ZFdseVpTNWhjSEJzZVNodGIyUjFiR1VzSUdGeVozVnRaVzUwY3lrN1hHNGdJQ0FnZlR0Y2JseHVJQ0FnSUdaMWJtTjBhVzl1SUhKMWJrWmhZM1J2Y25rb2FXUXNJR1JsY0hNc0lHWmhZM1J2Y25rcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUhJc0lHVXNJRzBzSUhKbGMzVnNkRHRjYmx4dUlDQWdJQ0FnSUNCcFppQW9hV1FwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR1VnUFNCc2IyRmtaWEpEWVdOb1pWdHBaRjBnUFNCN2ZUdGNiaUFnSUNBZ0lDQWdJQ0FnSUcwZ1BTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1E2SUdsa0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIVnlhVG9nWDE5bWFXeGxibUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGVIQnZjblJ6T2lCbFhHNGdJQ0FnSUNBZ0lDQWdJQ0I5TzF4dUlDQWdJQ0FnSUNBZ0lDQWdjaUE5SUcxaGEyVlNaWEYxYVhKbEtISmxjWFZwY21WR2Jpd2daU3dnYlN3Z2FXUXBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OVBibXg1SUhOMWNIQnZjblFnYjI1bElHUmxabWx1WlNCallXeHNJSEJsY2lCbWFXeGxYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9ZV3h5WldGa2VVTmhiR3hsWkNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnbllXMWtaV1pwYm1VZ2QybDBhQ0J1YnlCdGIyUjFiR1VnU1VRZ1kyRnVibTkwSUdKbElHTmhiR3hsWkNCdGIzSmxJSFJvWVc0Z2IyNWpaU0J3WlhJZ1ptbHNaUzRuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lHRnNjbVZoWkhsRFlXeHNaV1FnUFNCMGNuVmxPMXh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMMVZ6WlNCMGFHVWdjbVZoYkNCMllYSnBZV0pzWlhNZ1puSnZiU0J1YjJSbFhHNGdJQ0FnSUNBZ0lDQWdJQ0F2TDFWelpTQnRiMlIxYkdVdVpYaHdiM0owY3lCbWIzSWdaWGh3YjNKMGN5d2djMmx1WTJWY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2ZEdobElHVjRjRzl5ZEhNZ2FXNGdhR1Z5WlNCcGN5QmhiV1JsWm1sdVpTQmxlSEJ2Y25SekxseHVJQ0FnSUNBZ0lDQWdJQ0FnWlNBOUlHMXZaSFZzWlM1bGVIQnZjblJ6TzF4dUlDQWdJQ0FnSUNBZ0lDQWdiU0E5SUcxdlpIVnNaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISWdQU0J0WVd0bFVtVnhkV2x5WlNoeVpYRjFhWEpsUm00c0lHVXNJRzBzSUcxdlpIVnNaUzVwWkNrN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0F2TDBsbUlIUm9aWEpsSUdGeVpTQmtaWEJsYm1SbGJtTnBaWE1zSUhSb1pYa2dZWEpsSUhOMGNtbHVaM01zSUhOdklHNWxaV1JjYmlBZ0lDQWdJQ0FnTHk5MGJ5QmpiMjUyWlhKMElIUm9aVzBnZEc4Z1pHVndaVzVrWlc1amVTQjJZV3gxWlhNdVhHNGdJQ0FnSUNBZ0lHbG1JQ2hrWlhCektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCa1pYQnpJRDBnWkdWd2N5NXRZWEFvWm5WdVkzUnBiMjRnS0dSbGNFNWhiV1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnY2loa1pYQk9ZVzFsS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdMeTlEWVd4c0lIUm9aU0JtWVdOMGIzSjVJSGRwZEdnZ2RHaGxJSEpwWjJoMElHUmxjR1Z1WkdWdVkybGxjeTVjYmlBZ0lDQWdJQ0FnYVdZZ0tIUjVjR1Z2WmlCbVlXTjBiM0o1SUQwOVBTQW5ablZ1WTNScGIyNG5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQm1ZV04wYjNKNUxtRndjR3g1S0cwdVpYaHdiM0owY3l3Z1pHVndjeWs3WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQm1ZV04wYjNKNU8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnYVdZZ0tISmxjM1ZzZENBaFBUMGdkVzVrWldacGJtVmtLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnRMbVY0Y0c5eWRITWdQU0J5WlhOMWJIUTdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hV1FwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyRmtaWEpEWVdOb1pWdHBaRjBnUFNCdExtVjRjRzl5ZEhNN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0J6ZEhKcGJtZFNaWEYxYVhKbElEMGdablZ1WTNScGIyNGdLSE41YzNSbGJWSmxjWFZwY21Vc0lHVjRjRzl5ZEhNc0lHMXZaSFZzWlN3Z2FXUXNJSEpsYkVsa0tTQjdYRzRnSUNBZ0lDQWdJQzh2VTNCc2FYUWdkR2hsSUVsRUlHSjVJR0VnSVNCemJ5QjBhR0YwWEc0Z0lDQWdJQ0FnSUhaaGNpQnBibVJsZUNBOUlHbGtMbWx1WkdWNFQyWW9KeUVuS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzl5YVdkcGJtRnNTV1FnUFNCcFpDeGNiaUFnSUNBZ0lDQWdJQ0FnSUhCeVpXWnBlQ3dnY0d4MVoybHVPMXh1WEc0Z0lDQWdJQ0FnSUdsbUlDaHBibVJsZUNBOVBUMGdMVEVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xrSUQwZ2JtOXliV0ZzYVhwbEtHbGtMQ0J5Wld4SlpDazdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZVM1J5WVdsbmFIUWdiVzlrZFd4bElHeHZiMnQxY0M0Z1NXWWdhWFFnYVhNZ2IyNWxJRzltSUhSb1pTQnpjR1ZqYVdGc0lHUmxjR1Z1WkdWdVkybGxjeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZaR1ZoYkNCM2FYUm9JR2wwTENCdmRHaGxjbmRwYzJVc0lHUmxiR1ZuWVhSbElIUnZJRzV2WkdVdVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FXUWdQVDA5SUNkeVpYRjFhWEpsSnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCdFlXdGxVbVZ4ZFdseVpTaHplWE4wWlcxU1pYRjFhWEpsTENCbGVIQnZjblJ6TENCdGIyUjFiR1VzSUhKbGJFbGtLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9hV1FnUFQwOUlDZGxlSEJ2Y25Sekp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQmxlSEJ2Y25Sek8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNocFpDQTlQVDBnSjIxdlpIVnNaU2NwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYlc5a2RXeGxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaHNiMkZrWlhKRFlXTm9aUzVvWVhOUGQyNVFjbTl3WlhKMGVTaHBaQ2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYkc5aFpHVnlRMkZqYUdWYmFXUmRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGtaV1pwYm1WRFlXTm9aVnRwWkYwcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlkVzVHWVdOMGIzSjVMbUZ3Y0d4NUtHNTFiR3dzSUdSbFptbHVaVU5oWTJobFcybGtYU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR3h2WVdSbGNrTmhZMmhsVzJsa1hUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZb2MzbHpkR1Z0VW1WeGRXbHlaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2MzbHpkR1Z0VW1WeGRXbHlaU2h2Y21sbmFXNWhiRWxrS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0owNXZJRzF2WkhWc1pTQjNhWFJvSUVsRU9pQW5JQ3NnYVdRcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2VkdobGNtVWdhWE1nWVNCd2JIVm5hVzRnYVc0Z2NHeGhlUzVjYmlBZ0lDQWdJQ0FnSUNBZ0lIQnlaV1pwZUNBOUlHbGtMbk4xWW5OMGNtbHVaeWd3TENCcGJtUmxlQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaQ0E5SUdsa0xuTjFZbk4wY21sdVp5aHBibVJsZUNBcklERXNJR2xrTG14bGJtZDBhQ2s3WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJSEJzZFdkcGJpQTlJSE4wY21sdVoxSmxjWFZwY21Vb2MzbHpkR1Z0VW1WeGRXbHlaU3dnWlhod2IzSjBjeXdnYlc5a2RXeGxMQ0J3Y21WbWFYZ3NJSEpsYkVsa0tUdGNibHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSEJzZFdkcGJpNXViM0p0WVd4cGVtVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlIQnNkV2RwYmk1dWIzSnRZV3hwZW1Vb2FXUXNJRzFoYTJWT2IzSnRZV3hwZW1Vb2NtVnNTV1FwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeTlPYjNKdFlXeHBlbVVnZEdobElFbEVJRzV2Y20xaGJHeDVMbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xrSUQwZ2JtOXliV0ZzYVhwbEtHbGtMQ0J5Wld4SlpDazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHNiMkZrWlhKRFlXTm9aVnRwWkYwcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2JHOWhaR1Z5UTJGamFHVmJhV1JkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndiSFZuYVc0dWJHOWhaQ2hwWkN3Z2JXRnJaVkpsY1hWcGNtVW9jM2x6ZEdWdFVtVnhkV2x5WlN3Z1pYaHdiM0owY3l3Z2JXOWtkV3hsTENCeVpXeEpaQ2tzSUcxaGEyVk1iMkZrS0dsa0tTd2dlMzBwTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUd4dllXUmxja05oWTJobFcybGtYVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lIMDdYRzVjYmlBZ0lDQXZMME55WldGMFpTQmhJR1JsWm1sdVpTQm1kVzVqZEdsdmJpQnpjR1ZqYVdacFl5QjBieUIwYUdVZ2JXOWtkV3hsSUdGemEybHVaeUJtYjNJZ1lXMWtaV1pwYm1VdVhHNGdJQ0FnWm5WdVkzUnBiMjRnWkdWbWFXNWxLR2xrTENCa1pYQnpMQ0JtWVdOMGIzSjVLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaEJjbkpoZVM1cGMwRnljbUY1S0dsa0tTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1ptRmpkRzl5ZVNBOUlHUmxjSE03WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaWEJ6SUQwZ2FXUTdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFpDQTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNoMGVYQmxiMllnYVdRZ0lUMDlJQ2R6ZEhKcGJtY25LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQm1ZV04wYjNKNUlEMGdhV1E3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaQ0E5SUdSbGNITWdQU0IxYm1SbFptbHVaV1E3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnBaaUFvWkdWd2N5QW1KaUFoUVhKeVlYa3VhWE5CY25KaGVTaGtaWEJ6S1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWm1GamRHOXllU0E5SUdSbGNITTdYRzRnSUNBZ0lDQWdJQ0FnSUNCa1pYQnpJRDBnZFc1a1pXWnBibVZrTzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdhV1lnS0NGa1pYQnpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaWEJ6SUQwZ1d5ZHlaWEYxYVhKbEp5d2dKMlY0Y0c5eWRITW5MQ0FuYlc5a2RXeGxKMTA3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQXZMMU5sZENCMWNDQndjbTl3WlhKMGFXVnpJR1p2Y2lCMGFHbHpJRzF2WkhWc1pTNGdTV1lnWVc0Z1NVUXNJSFJvWlc0Z2RYTmxYRzRnSUNBZ0lDQWdJQzh2YVc1MFpYSnVZV3dnWTJGamFHVXVJRWxtSUc1dklFbEVMQ0IwYUdWdUlIVnpaU0IwYUdVZ1pYaDBaWEp1WVd3Z2RtRnlhV0ZpYkdWelhHNGdJQ0FnSUNBZ0lDOHZabTl5SUhSb2FYTWdibTlrWlNCdGIyUjFiR1V1WEc0Z0lDQWdJQ0FnSUdsbUlDaHBaQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdMeTlRZFhRZ2RHaGxJRzF2WkhWc1pTQnBiaUJrWldWd0lHWnlaV1Y2WlNCMWJuUnBiQ0IwYUdWeVpTQnBjeUJoWEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMM0psY1hWcGNtVWdZMkZzYkNCbWIzSWdhWFF1WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaV1pwYm1WRFlXTm9aVnRwWkYwZ1BTQmJhV1FzSUdSbGNITXNJR1poWTNSdmNubGRPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NuVnVSbUZqZEc5eWVTaHBaQ3dnWkdWd2N5d2dabUZqZEc5eWVTazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMMlJsWm1sdVpTNXlaWEYxYVhKbExDQjNhR2xqYUNCb1lYTWdZV05qWlhOeklIUnZJR0ZzYkNCMGFHVWdkbUZzZFdWeklHbHVJSFJvWlZ4dUlDQWdJQzh2WTJGamFHVXVJRlZ6WldaMWJDQm1iM0lnUVUxRUlHMXZaSFZzWlhNZ2RHaGhkQ0JoYkd3Z2FHRjJaU0JKUkhNZ2FXNGdkR2hsSUdacGJHVXNYRzRnSUNBZ0x5OWlkWFFnYm1WbFpDQjBieUJtYVc1aGJHeDVJR1Y0Y0c5eWRDQmhJSFpoYkhWbElIUnZJRzV2WkdVZ1ltRnpaV1FnYjI0Z2IyNWxJRzltSUhSb2IzTmxYRzRnSUNBZ0x5OUpSSE11WEc0Z0lDQWdaR1ZtYVc1bExuSmxjWFZwY21VZ1BTQm1kVzVqZEdsdmJpQW9hV1FwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLR3h2WVdSbGNrTmhZMmhsVzJsa1hTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUd4dllXUmxja05oWTJobFcybGtYVHRjYmlBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2hrWldacGJtVkRZV05vWlZ0cFpGMHBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISjFia1poWTNSdmNua3VZWEJ3Ykhrb2JuVnNiQ3dnWkdWbWFXNWxRMkZqYUdWYmFXUmRLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCc2IyRmtaWEpEWVdOb1pWdHBaRjA3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5TzF4dVhHNGdJQ0FnWkdWbWFXNWxMbUZ0WkNBOUlIdDlPMXh1WEc0Z0lDQWdjbVYwZFhKdUlHUmxabWx1WlR0Y2JuMWNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0JoYldSbFptbHVaVHRjYmlKZGZRPT0iLG51bGwsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gdHJ1ZTtcbiAgICB2YXIgY3VycmVudFF1ZXVlO1xuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB2YXIgaSA9IC0xO1xuICAgICAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICAgICAgICBjdXJyZW50UXVldWVbaV0oKTtcbiAgICAgICAgfVxuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG59XG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHF1ZXVlLnB1c2goZnVuKTtcbiAgICBpZiAoIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIoZnVuY3Rpb24gKHByb2Nlc3MsZ2xvYmFsKXtcbi8qIVxuICogQG92ZXJ2aWV3IGVzNi1wcm9taXNlIC0gYSB0aW55IGltcGxlbWVudGF0aW9uIG9mIFByb21pc2VzL0ErLlxuICogQGNvcHlyaWdodCBDb3B5cmlnaHQgKGMpIDIwMTQgWWVodWRhIEthdHosIFRvbSBEYWxlLCBTdGVmYW4gUGVubmVyIGFuZCBjb250cmlidXRvcnMgKENvbnZlcnNpb24gdG8gRVM2IEFQSSBieSBKYWtlIEFyY2hpYmFsZClcbiAqIEBsaWNlbnNlICAgTGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2VcbiAqICAgICAgICAgICAgU2VlIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qYWtlYXJjaGliYWxkL2VzNi1wcm9taXNlL21hc3Rlci9MSUNFTlNFXG4gKiBAdmVyc2lvbiAgIDIuMy4wXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkb2JqZWN0T3JGdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzRnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNNYXliZVRoZW5hYmxlKHgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHV0aWxzJCRfaXNBcnJheTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkX2lzQXJyYXkgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGliJGVzNiRwcm9taXNlJHV0aWxzJCRfaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNBcnJheSA9IGxpYiRlczYkcHJvbWlzZSR1dGlscyQkX2lzQXJyYXk7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gPSAwO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkdG9TdHJpbmcgPSB7fS50b1N0cmluZztcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJHZlcnR4TmV4dDtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGN1c3RvbVNjaGVkdWxlckZuO1xuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwID0gZnVuY3Rpb24gYXNhcChjYWxsYmFjaywgYXJnKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbl0gPSBjYWxsYmFjaztcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuICsgMV0gPSBhcmc7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuICs9IDI7XG4gICAgICBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiA9PT0gMikge1xuICAgICAgICAvLyBJZiBsZW4gaXMgMiwgdGhhdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gc2NoZWR1bGUgYW4gYXN5bmMgZmx1c2guXG4gICAgICAgIC8vIElmIGFkZGl0aW9uYWwgY2FsbGJhY2tzIGFyZSBxdWV1ZWQgYmVmb3JlIHRoZSBxdWV1ZSBpcyBmbHVzaGVkLCB0aGV5XG4gICAgICAgIC8vIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgZmx1c2ggdGhhdCB3ZSBhcmUgc2NoZWR1bGluZy5cbiAgICAgICAgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRjdXN0b21TY2hlZHVsZXJGbikge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRjdXN0b21TY2hlZHVsZXJGbihsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2V0U2NoZWR1bGVyKHNjaGVkdWxlRm4pIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRjdXN0b21TY2hlZHVsZXJGbiA9IHNjaGVkdWxlRm47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHNldEFzYXAoYXNhcEZuKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcCA9IGFzYXBGbjtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJXaW5kb3cgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpID8gd2luZG93IDogdW5kZWZpbmVkO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3Nlckdsb2JhbCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyV2luZG93IHx8IHt9O1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3Nlckdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyR2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRpc05vZGUgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYge30udG9TdHJpbmcuY2FsbChwcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nO1xuXG4gICAgLy8gdGVzdCBmb3Igd2ViIHdvcmtlciBidXQgbm90IGluIElFMTBcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGlzV29ya2VyID0gdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdHlwZW9mIGltcG9ydFNjcmlwdHMgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICB0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09ICd1bmRlZmluZWQnO1xuXG4gICAgLy8gbm9kZVxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VOZXh0VGljaygpIHtcbiAgICAgIHZhciBuZXh0VGljayA9IHByb2Nlc3MubmV4dFRpY2s7XG4gICAgICAvLyBub2RlIHZlcnNpb24gMC4xMC54IGRpc3BsYXlzIGEgZGVwcmVjYXRpb24gd2FybmluZyB3aGVuIG5leHRUaWNrIGlzIHVzZWQgcmVjdXJzaXZlbHlcbiAgICAgIC8vIHNldEltbWVkaWF0ZSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIGluc3RlYWRcbiAgICAgIHZhciB2ZXJzaW9uID0gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLm1hdGNoKC9eKD86KFxcZCspXFwuKT8oPzooXFxkKylcXC4pPyhcXCp8XFxkKykkLyk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2ZXJzaW9uKSAmJiB2ZXJzaW9uWzFdID09PSAnMCcgJiYgdmVyc2lvblsyXSA9PT0gJzEwJykge1xuICAgICAgICBuZXh0VGljayA9IHNldEltbWVkaWF0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgbmV4dFRpY2sobGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gdmVydHhcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlVmVydHhUaW1lcigpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHZlcnR4TmV4dChsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTXV0YXRpb25PYnNlcnZlcigpIHtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBsaWIkZXM2JHByb21pc2UkYXNhcCQkQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIobGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKTtcbiAgICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgbm9kZS5kYXRhID0gKGl0ZXJhdGlvbnMgPSArK2l0ZXJhdGlvbnMgJSAyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gd2ViIHdvcmtlclxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VNZXNzYWdlQ2hhbm5lbCgpIHtcbiAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaDtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VTZXRUaW1lb3V0KCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXRUaW1lb3V0KGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCwgMSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWUgPSBuZXcgQXJyYXkoMTAwMCk7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuOyBpKz0yKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtpXTtcbiAgICAgICAgdmFyIGFyZyA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtpKzFdO1xuXG4gICAgICAgIGNhbGxiYWNrKGFyZyk7XG5cbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2ldID0gdW5kZWZpbmVkO1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbaSsxXSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiA9IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJGF0dGVtcHRWZXJ0ZXgoKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgciA9IHJlcXVpcmU7XG4gICAgICAgIHZhciB2ZXJ0eCA9IHIoJ3ZlcnR4Jyk7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR2ZXJ0eE5leHQgPSB2ZXJ0eC5ydW5Pbkxvb3AgfHwgdmVydHgucnVuT25Db250ZXh0O1xuICAgICAgICByZXR1cm4gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVZlcnR4VGltZXIoKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVNldFRpbWVvdXQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2g7XG4gICAgLy8gRGVjaWRlIHdoYXQgYXN5bmMgbWV0aG9kIHRvIHVzZSB0byB0cmlnZ2VyaW5nIHByb2Nlc3Npbmcgb2YgcXVldWVkIGNhbGxiYWNrczpcbiAgICBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGlzTm9kZSkge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTmV4dFRpY2soKTtcbiAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRCcm93c2VyTXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTXV0YXRpb25PYnNlcnZlcigpO1xuICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGlzV29ya2VyKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJXaW5kb3cgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXR0ZW1wdFZlcnRleCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VTZXRUaW1lb3V0KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCgpIHt9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORyAgID0gdm9pZCAwO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQgPSAxO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCAgPSAyO1xuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SID0gbmV3IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEVycm9yT2JqZWN0KCk7XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzZWxmRnVsbGZpbGxtZW50KCkge1xuICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoXCJZb3UgY2Fubm90IHJlc29sdmUgYSBwcm9taXNlIHdpdGggaXRzZWxmXCIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGNhbm5vdFJldHVybk93bigpIHtcbiAgICAgIHJldHVybiBuZXcgVHlwZUVycm9yKCdBIHByb21pc2VzIGNhbGxiYWNrIGNhbm5vdCByZXR1cm4gdGhhdCBzYW1lIHByb21pc2UuJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZ2V0VGhlbihwcm9taXNlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUi5lcnJvciA9IGVycm9yO1xuICAgICAgICByZXR1cm4gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkdHJ5VGhlbih0aGVuLCB2YWx1ZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcik7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlRm9yZWlnblRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlLCB0aGVuKSB7XG4gICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAoZnVuY3Rpb24ocHJvbWlzZSkge1xuICAgICAgICB2YXIgc2VhbGVkID0gZmFsc2U7XG4gICAgICAgIHZhciBlcnJvciA9IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHRyeVRoZW4odGhlbiwgdGhlbmFibGUsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKHNlYWxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICBzZWFsZWQgPSB0cnVlO1xuICAgICAgICAgIGlmICh0aGVuYWJsZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgIGlmIChzZWFsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgc2VhbGVkID0gdHJ1ZTtcblxuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgICB9LCAnU2V0dGxlOiAnICsgKHByb21pc2UuX2xhYmVsIHx8ICcgdW5rbm93biBwcm9taXNlJykpO1xuXG4gICAgICAgIGlmICghc2VhbGVkICYmIGVycm9yKSB7XG4gICAgICAgICAgc2VhbGVkID0gdHJ1ZTtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LCBwcm9taXNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVPd25UaGVuYWJsZShwcm9taXNlLCB0aGVuYWJsZSkge1xuICAgICAgaWYgKHRoZW5hYmxlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdGhlbmFibGUuX3Jlc3VsdCk7XG4gICAgICB9IGVsc2UgaWYgKHRoZW5hYmxlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHRoZW5hYmxlLl9yZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHRoZW5hYmxlLCB1bmRlZmluZWQsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUpIHtcbiAgICAgIGlmIChtYXliZVRoZW5hYmxlLmNvbnN0cnVjdG9yID09PSBwcm9taXNlLmNvbnN0cnVjdG9yKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZU93blRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHRoZW4gPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRnZXRUaGVuKG1heWJlVGhlbmFibGUpO1xuXG4gICAgICAgIGlmICh0aGVuID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUikge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUi5lcnJvcik7XG4gICAgICAgIH0gZWxzZSBpZiAodGhlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzRnVuY3Rpb24odGhlbikpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVGb3JlaWduVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSwgdGhlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpIHtcbiAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc2VsZkZ1bGxmaWxsbWVudCgpKTtcbiAgICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJHV0aWxzJCRvYmplY3RPckZ1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2hSZWplY3Rpb24ocHJvbWlzZSkge1xuICAgICAgaWYgKHByb21pc2UuX29uZXJyb3IpIHtcbiAgICAgICAgcHJvbWlzZS5fb25lcnJvcihwcm9taXNlLl9yZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoKHByb21pc2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpIHtcbiAgICAgIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORykgeyByZXR1cm47IH1cblxuICAgICAgcHJvbWlzZS5fcmVzdWx0ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zdGF0ZSA9IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRDtcblxuICAgICAgaWYgKHByb21pc2UuX3N1YnNjcmliZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoLCBwcm9taXNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKSB7XG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHsgcmV0dXJuOyB9XG4gICAgICBwcm9taXNlLl9zdGF0ZSA9IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEO1xuICAgICAgcHJvbWlzZS5fcmVzdWx0ID0gcmVhc29uO1xuXG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoUmVqZWN0aW9uLCBwcm9taXNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUocGFyZW50LCBjaGlsZCwgb25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pIHtcbiAgICAgIHZhciBzdWJzY3JpYmVycyA9IHBhcmVudC5fc3Vic2NyaWJlcnM7XG4gICAgICB2YXIgbGVuZ3RoID0gc3Vic2NyaWJlcnMubGVuZ3RoO1xuXG4gICAgICBwYXJlbnQuX29uZXJyb3IgPSBudWxsO1xuXG4gICAgICBzdWJzY3JpYmVyc1tsZW5ndGhdID0gY2hpbGQ7XG4gICAgICBzdWJzY3JpYmVyc1tsZW5ndGggKyBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRURdID0gb25GdWxmaWxsbWVudDtcbiAgICAgIHN1YnNjcmliZXJzW2xlbmd0aCArIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEXSAgPSBvblJlamVjdGlvbjtcblxuICAgICAgaWYgKGxlbmd0aCA9PT0gMCAmJiBwYXJlbnQuX3N0YXRlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2gsIHBhcmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaChwcm9taXNlKSB7XG4gICAgICB2YXIgc3Vic2NyaWJlcnMgPSBwcm9taXNlLl9zdWJzY3JpYmVycztcbiAgICAgIHZhciBzZXR0bGVkID0gcHJvbWlzZS5fc3RhdGU7XG5cbiAgICAgIGlmIChzdWJzY3JpYmVycy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICAgIHZhciBjaGlsZCwgY2FsbGJhY2ssIGRldGFpbCA9IHByb21pc2UuX3Jlc3VsdDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJzY3JpYmVycy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICBjaGlsZCA9IHN1YnNjcmliZXJzW2ldO1xuICAgICAgICBjYWxsYmFjayA9IHN1YnNjcmliZXJzW2kgKyBzZXR0bGVkXTtcblxuICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpbnZva2VDYWxsYmFjayhzZXR0bGVkLCBjaGlsZCwgY2FsbGJhY2ssIGRldGFpbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2soZGV0YWlsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcm9taXNlLl9zdWJzY3JpYmVycy5sZW5ndGggPSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEVycm9yT2JqZWN0KCkge1xuICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUiA9IG5ldyBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRFcnJvck9iamVjdCgpO1xuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkdHJ5Q2F0Y2goY2FsbGJhY2ssIGRldGFpbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGRldGFpbCk7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkVFJZX0NBVENIX0VSUk9SLmVycm9yID0gZTtcbiAgICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpbnZva2VDYWxsYmFjayhzZXR0bGVkLCBwcm9taXNlLCBjYWxsYmFjaywgZGV0YWlsKSB7XG4gICAgICB2YXIgaGFzQ2FsbGJhY2sgPSBsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzRnVuY3Rpb24oY2FsbGJhY2spLFxuICAgICAgICAgIHZhbHVlLCBlcnJvciwgc3VjY2VlZGVkLCBmYWlsZWQ7XG5cbiAgICAgIGlmIChoYXNDYWxsYmFjaykge1xuICAgICAgICB2YWx1ZSA9IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHRyeUNhdGNoKGNhbGxiYWNrLCBkZXRhaWwpO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkVFJZX0NBVENIX0VSUk9SKSB7XG4gICAgICAgICAgZmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICBlcnJvciA9IHZhbHVlLmVycm9yO1xuICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGNhbm5vdFJldHVybk93bigpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBkZXRhaWw7XG4gICAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORykge1xuICAgICAgICAvLyBub29wXG4gICAgICB9IGVsc2UgaWYgKGhhc0NhbGxiYWNrICYmIHN1Y2NlZWRlZCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZmFpbGVkKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBlcnJvcik7XG4gICAgICB9IGVsc2UgaWYgKHNldHRsZWQgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc2V0dGxlZCA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpbml0aWFsaXplUHJvbWlzZShwcm9taXNlLCByZXNvbHZlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZXIoZnVuY3Rpb24gcmVzb2x2ZVByb21pc2UodmFsdWUpe1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICB9LCBmdW5jdGlvbiByZWplY3RQcm9taXNlKHJlYXNvbikge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IoQ29uc3RydWN0b3IsIGlucHV0KSB7XG4gICAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG5cbiAgICAgIGVudW1lcmF0b3IuX2luc3RhbmNlQ29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICAgIGVudW1lcmF0b3IucHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcblxuICAgICAgaWYgKGVudW1lcmF0b3IuX3ZhbGlkYXRlSW5wdXQoaW5wdXQpKSB7XG4gICAgICAgIGVudW1lcmF0b3IuX2lucHV0ICAgICA9IGlucHV0O1xuICAgICAgICBlbnVtZXJhdG9yLmxlbmd0aCAgICAgPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgIGVudW1lcmF0b3IuX3JlbWFpbmluZyA9IGlucHV0Lmxlbmd0aDtcblxuICAgICAgICBlbnVtZXJhdG9yLl9pbml0KCk7XG5cbiAgICAgICAgaWYgKGVudW1lcmF0b3IubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChlbnVtZXJhdG9yLnByb21pc2UsIGVudW1lcmF0b3IuX3Jlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW51bWVyYXRvci5sZW5ndGggPSBlbnVtZXJhdG9yLmxlbmd0aCB8fCAwO1xuICAgICAgICAgIGVudW1lcmF0b3IuX2VudW1lcmF0ZSgpO1xuICAgICAgICAgIGlmIChlbnVtZXJhdG9yLl9yZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwoZW51bWVyYXRvci5wcm9taXNlLCBlbnVtZXJhdG9yLl9yZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KGVudW1lcmF0b3IucHJvbWlzZSwgZW51bWVyYXRvci5fdmFsaWRhdGlvbkVycm9yKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGVJbnB1dCA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICByZXR1cm4gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0FycmF5KGlucHV0KTtcbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl92YWxpZGF0aW9uRXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoJ0FycmF5IE1ldGhvZHMgbXVzdCBiZSBwcm92aWRlZCBhbiBBcnJheScpO1xuICAgIH07XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuX3Jlc3VsdCA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgfTtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yO1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9lbnVtZXJhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlbnVtZXJhdG9yID0gdGhpcztcblxuICAgICAgdmFyIGxlbmd0aCAgPSBlbnVtZXJhdG9yLmxlbmd0aDtcbiAgICAgIHZhciBwcm9taXNlID0gZW51bWVyYXRvci5wcm9taXNlO1xuICAgICAgdmFyIGlucHV0ICAgPSBlbnVtZXJhdG9yLl9pbnB1dDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IHByb21pc2UuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HICYmIGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBlbnVtZXJhdG9yLl9lYWNoRW50cnkoaW5wdXRbaV0sIGkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX2VhY2hFbnRyeSA9IGZ1bmN0aW9uKGVudHJ5LCBpKSB7XG4gICAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG4gICAgICB2YXIgYyA9IGVudW1lcmF0b3IuX2luc3RhbmNlQ29uc3RydWN0b3I7XG5cbiAgICAgIGlmIChsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzTWF5YmVUaGVuYWJsZShlbnRyeSkpIHtcbiAgICAgICAgaWYgKGVudHJ5LmNvbnN0cnVjdG9yID09PSBjICYmIGVudHJ5Ll9zdGF0ZSAhPT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORykge1xuICAgICAgICAgIGVudHJ5Ll9vbmVycm9yID0gbnVsbDtcbiAgICAgICAgICBlbnVtZXJhdG9yLl9zZXR0bGVkQXQoZW50cnkuX3N0YXRlLCBpLCBlbnRyeS5fcmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbnVtZXJhdG9yLl93aWxsU2V0dGxlQXQoYy5yZXNvbHZlKGVudHJ5KSwgaSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudW1lcmF0b3IuX3JlbWFpbmluZy0tO1xuICAgICAgICBlbnVtZXJhdG9yLl9yZXN1bHRbaV0gPSBlbnRyeTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9zZXR0bGVkQXQgPSBmdW5jdGlvbihzdGF0ZSwgaSwgdmFsdWUpIHtcbiAgICAgIHZhciBlbnVtZXJhdG9yID0gdGhpcztcbiAgICAgIHZhciBwcm9taXNlID0gZW51bWVyYXRvci5wcm9taXNlO1xuXG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgZW51bWVyYXRvci5fcmVtYWluaW5nLS07XG5cbiAgICAgICAgaWYgKHN0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW51bWVyYXRvci5fcmVzdWx0W2ldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGVudW1lcmF0b3IuX3JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIGVudW1lcmF0b3IuX3Jlc3VsdCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fd2lsbFNldHRsZUF0ID0gZnVuY3Rpb24ocHJvbWlzZSwgaSkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuXG4gICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUocHJvbWlzZSwgdW5kZWZpbmVkLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBlbnVtZXJhdG9yLl9zZXR0bGVkQXQobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVELCBpLCB2YWx1ZSk7XG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgZW51bWVyYXRvci5fc2V0dGxlZEF0KGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVELCBpLCByZWFzb24pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRhbGwkJGFsbChlbnRyaWVzKSB7XG4gICAgICByZXR1cm4gbmV3IGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRkZWZhdWx0KHRoaXMsIGVudHJpZXMpLnByb21pc2U7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRhbGwkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRhbGwkJGFsbDtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyYWNlJCRyYWNlKGVudHJpZXMpIHtcbiAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuXG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcblxuICAgICAgaWYgKCFsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzQXJyYXkoZW50cmllcykpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gcmFjZS4nKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIGZ1bmN0aW9uIG9uRnVsZmlsbG1lbnQodmFsdWUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9uUmVqZWN0aW9uKHJlYXNvbikge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IHByb21pc2UuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HICYmIGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUoQ29uc3RydWN0b3IucmVzb2x2ZShlbnRyaWVzW2ldKSwgdW5kZWZpbmVkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmFjZSQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJhY2UkJHJhY2U7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVzb2x2ZSQkcmVzb2x2ZShvYmplY3QpIHtcbiAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuXG4gICAgICBpZiAob2JqZWN0ICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gQ29uc3RydWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG4gICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIG9iamVjdCk7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRyZXNvbHZlO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlamVjdCQkcmVqZWN0KHJlYXNvbikge1xuICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZWplY3QkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZWplY3QkJHJlamVjdDtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkY291bnRlciA9IDA7XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNSZXNvbHZlcigpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYSByZXNvbHZlciBmdW5jdGlvbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIHByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNOZXcoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmFpbGVkIHRvIGNvbnN0cnVjdCAnUHJvbWlzZSc6IFBsZWFzZSB1c2UgdGhlICduZXcnIG9wZXJhdG9yLCB0aGlzIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlO1xuICAgIC8qKlxuICAgICAgUHJvbWlzZSBvYmplY3RzIHJlcHJlc2VudCB0aGUgZXZlbnR1YWwgcmVzdWx0IG9mIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uIFRoZVxuICAgICAgcHJpbWFyeSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHByb21pc2UgaXMgdGhyb3VnaCBpdHMgYHRoZW5gIG1ldGhvZCwgd2hpY2hcbiAgICAgIHJlZ2lzdGVycyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBlaXRoZXIgYSBwcm9taXNlJ3MgZXZlbnR1YWwgdmFsdWUgb3IgdGhlIHJlYXNvblxuICAgICAgd2h5IHRoZSBwcm9taXNlIGNhbm5vdCBiZSBmdWxmaWxsZWQuXG5cbiAgICAgIFRlcm1pbm9sb2d5XG4gICAgICAtLS0tLS0tLS0tLVxuXG4gICAgICAtIGBwcm9taXNlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gd2l0aCBhIGB0aGVuYCBtZXRob2Qgd2hvc2UgYmVoYXZpb3IgY29uZm9ybXMgdG8gdGhpcyBzcGVjaWZpY2F0aW9uLlxuICAgICAgLSBgdGhlbmFibGVgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBgdGhlbmAgbWV0aG9kLlxuICAgICAgLSBgdmFsdWVgIGlzIGFueSBsZWdhbCBKYXZhU2NyaXB0IHZhbHVlIChpbmNsdWRpbmcgdW5kZWZpbmVkLCBhIHRoZW5hYmxlLCBvciBhIHByb21pc2UpLlxuICAgICAgLSBgZXhjZXB0aW9uYCBpcyBhIHZhbHVlIHRoYXQgaXMgdGhyb3duIHVzaW5nIHRoZSB0aHJvdyBzdGF0ZW1lbnQuXG4gICAgICAtIGByZWFzb25gIGlzIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2h5IGEgcHJvbWlzZSB3YXMgcmVqZWN0ZWQuXG4gICAgICAtIGBzZXR0bGVkYCB0aGUgZmluYWwgcmVzdGluZyBzdGF0ZSBvZiBhIHByb21pc2UsIGZ1bGZpbGxlZCBvciByZWplY3RlZC5cblxuICAgICAgQSBwcm9taXNlIGNhbiBiZSBpbiBvbmUgb2YgdGhyZWUgc3RhdGVzOiBwZW5kaW5nLCBmdWxmaWxsZWQsIG9yIHJlamVjdGVkLlxuXG4gICAgICBQcm9taXNlcyB0aGF0IGFyZSBmdWxmaWxsZWQgaGF2ZSBhIGZ1bGZpbGxtZW50IHZhbHVlIGFuZCBhcmUgaW4gdGhlIGZ1bGZpbGxlZFxuICAgICAgc3RhdGUuICBQcm9taXNlcyB0aGF0IGFyZSByZWplY3RlZCBoYXZlIGEgcmVqZWN0aW9uIHJlYXNvbiBhbmQgYXJlIGluIHRoZVxuICAgICAgcmVqZWN0ZWQgc3RhdGUuICBBIGZ1bGZpbGxtZW50IHZhbHVlIGlzIG5ldmVyIGEgdGhlbmFibGUuXG5cbiAgICAgIFByb21pc2VzIGNhbiBhbHNvIGJlIHNhaWQgdG8gKnJlc29sdmUqIGEgdmFsdWUuICBJZiB0aGlzIHZhbHVlIGlzIGFsc28gYVxuICAgICAgcHJvbWlzZSwgdGhlbiB0aGUgb3JpZ2luYWwgcHJvbWlzZSdzIHNldHRsZWQgc3RhdGUgd2lsbCBtYXRjaCB0aGUgdmFsdWUnc1xuICAgICAgc2V0dGxlZCBzdGF0ZS4gIFNvIGEgcHJvbWlzZSB0aGF0ICpyZXNvbHZlcyogYSBwcm9taXNlIHRoYXQgcmVqZWN0cyB3aWxsXG4gICAgICBpdHNlbGYgcmVqZWN0LCBhbmQgYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCBmdWxmaWxscyB3aWxsXG4gICAgICBpdHNlbGYgZnVsZmlsbC5cblxuXG4gICAgICBCYXNpYyBVc2FnZTpcbiAgICAgIC0tLS0tLS0tLS0tLVxuXG4gICAgICBgYGBqc1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgLy8gb24gc3VjY2Vzc1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcblxuICAgICAgICAvLyBvbiBmYWlsdXJlXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgfSk7XG5cbiAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAvLyBvbiBmdWxmaWxsbWVudFxuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIC8vIG9uIHJlamVjdGlvblxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQWR2YW5jZWQgVXNhZ2U6XG4gICAgICAtLS0tLS0tLS0tLS0tLS1cblxuICAgICAgUHJvbWlzZXMgc2hpbmUgd2hlbiBhYnN0cmFjdGluZyBhd2F5IGFzeW5jaHJvbm91cyBpbnRlcmFjdGlvbnMgc3VjaCBhc1xuICAgICAgYFhNTEh0dHBSZXF1ZXN0YHMuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmdW5jdGlvbiBnZXRKU09OKHVybCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgICAgICB4aHIub3BlbignR0VUJywgdXJsKTtcbiAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gaGFuZGxlcjtcbiAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICAgIHhoci5zZW5kKCk7XG5cbiAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gdGhpcy5ET05FKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdnZXRKU09OOiBgJyArIHVybCArICdgIGZhaWxlZCB3aXRoIHN0YXR1czogWycgKyB0aGlzLnN0YXR1cyArICddJykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGdldEpTT04oJy9wb3N0cy5qc29uJykudGhlbihmdW5jdGlvbihqc29uKSB7XG4gICAgICAgIC8vIG9uIGZ1bGZpbGxtZW50XG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgLy8gb24gcmVqZWN0aW9uXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBVbmxpa2UgY2FsbGJhY2tzLCBwcm9taXNlcyBhcmUgZ3JlYXQgY29tcG9zYWJsZSBwcmltaXRpdmVzLlxuXG4gICAgICBgYGBqc1xuICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZXRKU09OKCcvcG9zdHMnKSxcbiAgICAgICAgZ2V0SlNPTignL2NvbW1lbnRzJylcbiAgICAgIF0pLnRoZW4oZnVuY3Rpb24odmFsdWVzKXtcbiAgICAgICAgdmFsdWVzWzBdIC8vID0+IHBvc3RzSlNPTlxuICAgICAgICB2YWx1ZXNbMV0gLy8gPT4gY29tbWVudHNKU09OXG5cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEBjbGFzcyBQcm9taXNlXG4gICAgICBAcGFyYW0ge2Z1bmN0aW9ufSByZXNvbHZlclxuICAgICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgICAgQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZShyZXNvbHZlcikge1xuICAgICAgdGhpcy5faWQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkY291bnRlcisrO1xuICAgICAgdGhpcy5fc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9yZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zdWJzY3JpYmVycyA9IFtdO1xuXG4gICAgICBpZiAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCAhPT0gcmVzb2x2ZXIpIHtcbiAgICAgICAgaWYgKCFsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzRnVuY3Rpb24ocmVzb2x2ZXIpKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzUmVzb2x2ZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZSkpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNOZXcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGluaXRpYWxpemVQcm9taXNlKHRoaXMsIHJlc29sdmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5hbGwgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRhbGwkJGRlZmF1bHQ7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucmFjZSA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJhY2UkJGRlZmF1bHQ7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucmVzb2x2ZSA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJGRlZmF1bHQ7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucmVqZWN0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLl9zZXRTY2hlZHVsZXIgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2V0U2NoZWR1bGVyO1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLl9zZXRBc2FwID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHNldEFzYXA7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UuX2FzYXAgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcDtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnByb3RvdHlwZSA9IHtcbiAgICAgIGNvbnN0cnVjdG9yOiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZSxcblxuICAgIC8qKlxuICAgICAgVGhlIHByaW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRob2QsXG4gICAgICB3aGljaCByZWdpc3RlcnMgY2FsbGJhY2tzIHRvIHJlY2VpdmUgZWl0aGVyIGEgcHJvbWlzZSdzIGV2ZW50dWFsIHZhbHVlIG9yIHRoZVxuICAgICAgcmVhc29uIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uKHVzZXIpe1xuICAgICAgICAvLyB1c2VyIGlzIGF2YWlsYWJsZVxuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gdXNlciBpcyB1bmF2YWlsYWJsZSwgYW5kIHlvdSBhcmUgZ2l2ZW4gdGhlIHJlYXNvbiB3aHlcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIENoYWluaW5nXG4gICAgICAtLS0tLS0tLVxuXG4gICAgICBUaGUgcmV0dXJuIHZhbHVlIG9mIGB0aGVuYCBpcyBpdHNlbGYgYSBwcm9taXNlLiAgVGhpcyBzZWNvbmQsICdkb3duc3RyZWFtJ1xuICAgICAgcHJvbWlzZSBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZpcnN0IHByb21pc2UncyBmdWxmaWxsbWVudFxuICAgICAgb3IgcmVqZWN0aW9uIGhhbmRsZXIsIG9yIHJlamVjdGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24uXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHVzZXIubmFtZTtcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0IG5hbWUnO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAodXNlck5hbWUpIHtcbiAgICAgICAgLy8gSWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGB1c2VyTmFtZWAgd2lsbCBiZSB0aGUgdXNlcidzIG5hbWUsIG90aGVyd2lzZSBpdFxuICAgICAgICAvLyB3aWxsIGJlIGAnZGVmYXVsdCBuYW1lJ2BcbiAgICAgIH0pO1xuXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweScpO1xuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2BmaW5kVXNlcmAgcmVqZWN0ZWQgYW5kIHdlJ3JlIHVuaGFwcHknKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgLy8gaWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGByZWFzb25gIHdpbGwgYmUgJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jy5cbiAgICAgICAgLy8gSWYgYGZpbmRVc2VyYCByZWplY3RlZCwgYHJlYXNvbmAgd2lsbCBiZSAnYGZpbmRVc2VyYCByZWplY3RlZCBhbmQgd2UncmUgdW5oYXBweScuXG4gICAgICB9KTtcbiAgICAgIGBgYFxuICAgICAgSWYgdGhlIGRvd25zdHJlYW0gcHJvbWlzZSBkb2VzIG5vdCBzcGVjaWZ5IGEgcmVqZWN0aW9uIGhhbmRsZXIsIHJlamVjdGlvbiByZWFzb25zIHdpbGwgYmUgcHJvcGFnYXRlZCBmdXJ0aGVyIGRvd25zdHJlYW0uXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBlZGFnb2dpY2FsRXhjZXB0aW9uKCdVcHN0cmVhbSBlcnJvcicpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZFxuICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZFxuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBUaGUgYFBlZGdhZ29jaWFsRXhjZXB0aW9uYCBpcyBwcm9wYWdhdGVkIGFsbCB0aGUgd2F5IGRvd24gdG8gaGVyZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQXNzaW1pbGF0aW9uXG4gICAgICAtLS0tLS0tLS0tLS1cblxuICAgICAgU29tZXRpbWVzIHRoZSB2YWx1ZSB5b3Ugd2FudCB0byBwcm9wYWdhdGUgdG8gYSBkb3duc3RyZWFtIHByb21pc2UgY2FuIG9ubHkgYmVcbiAgICAgIHJldHJpZXZlZCBhc3luY2hyb25vdXNseS4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgcmV0dXJuaW5nIGEgcHJvbWlzZSBpbiB0aGVcbiAgICAgIGZ1bGZpbGxtZW50IG9yIHJlamVjdGlvbiBoYW5kbGVyLiBUaGUgZG93bnN0cmVhbSBwcm9taXNlIHdpbGwgdGhlbiBiZSBwZW5kaW5nXG4gICAgICB1bnRpbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBzZXR0bGVkLiBUaGlzIGlzIGNhbGxlZCAqYXNzaW1pbGF0aW9uKi5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICByZXR1cm4gZmluZENvbW1lbnRzQnlBdXRob3IodXNlcik7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgICAgICAvLyBUaGUgdXNlcidzIGNvbW1lbnRzIGFyZSBub3cgYXZhaWxhYmxlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBJZiB0aGUgYXNzaW1saWF0ZWQgcHJvbWlzZSByZWplY3RzLCB0aGVuIHRoZSBkb3duc3RyZWFtIHByb21pc2Ugd2lsbCBhbHNvIHJlamVjdC5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICByZXR1cm4gZmluZENvbW1lbnRzQnlBdXRob3IodXNlcik7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgICAgICAvLyBJZiBgZmluZENvbW1lbnRzQnlBdXRob3JgIGZ1bGZpbGxzLCB3ZSdsbCBoYXZlIHRoZSB2YWx1ZSBoZXJlXG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgcmVqZWN0cywgd2UnbGwgaGF2ZSB0aGUgcmVhc29uIGhlcmVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFNpbXBsZSBFeGFtcGxlXG4gICAgICAtLS0tLS0tLS0tLS0tLVxuXG4gICAgICBTeW5jaHJvbm91cyBFeGFtcGxlXG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIHZhciByZXN1bHQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGZpbmRSZXN1bHQoKTtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfVxuICAgICAgYGBgXG5cbiAgICAgIEVycmJhY2sgRXhhbXBsZVxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFJlc3VsdChmdW5jdGlvbihyZXN1bHQsIGVycil7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAvLyBmYWlsdXJlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBQcm9taXNlIEV4YW1wbGU7XG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIGZpbmRSZXN1bHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7XG4gICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIGZhaWx1cmVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEFkdmFuY2VkIEV4YW1wbGVcbiAgICAgIC0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIFN5bmNocm9ub3VzIEV4YW1wbGVcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgdmFyIGF1dGhvciwgYm9va3M7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF1dGhvciA9IGZpbmRBdXRob3IoKTtcbiAgICAgICAgYm9va3MgID0gZmluZEJvb2tzQnlBdXRob3IoYXV0aG9yKTtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfVxuICAgICAgYGBgXG5cbiAgICAgIEVycmJhY2sgRXhhbXBsZVxuXG4gICAgICBgYGBqc1xuXG4gICAgICBmdW5jdGlvbiBmb3VuZEJvb2tzKGJvb2tzKSB7XG5cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZmFpbHVyZShyZWFzb24pIHtcblxuICAgICAgfVxuXG4gICAgICBmaW5kQXV0aG9yKGZ1bmN0aW9uKGF1dGhvciwgZXJyKXtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgICAvLyBmYWlsdXJlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZpbmRCb29va3NCeUF1dGhvcihhdXRob3IsIGZ1bmN0aW9uKGJvb2tzLCBlcnIpIHtcbiAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgZm91bmRCb29rcyhib29rcyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgIGZhaWx1cmUocmVhc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBQcm9taXNlIEV4YW1wbGU7XG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIGZpbmRBdXRob3IoKS5cbiAgICAgICAgdGhlbihmaW5kQm9va3NCeUF1dGhvcikuXG4gICAgICAgIHRoZW4oZnVuY3Rpb24oYm9va3Mpe1xuICAgICAgICAgIC8vIGZvdW5kIGJvb2tzXG4gICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQG1ldGhvZCB0aGVuXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBvbkZ1bGZpbGxlZFxuICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25SZWplY3RlZFxuICAgICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgICAgQHJldHVybiB7UHJvbWlzZX1cbiAgICAqL1xuICAgICAgdGhlbjogZnVuY3Rpb24ob25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IHBhcmVudC5fc3RhdGU7XG5cbiAgICAgICAgaWYgKHN0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQgJiYgIW9uRnVsZmlsbG1lbnQgfHwgc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEICYmICFvblJlamVjdGlvbikge1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoaWxkID0gbmV3IHRoaXMuY29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG4gICAgICAgIHZhciByZXN1bHQgPSBwYXJlbnQuX3Jlc3VsdDtcblxuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbc3RhdGUgLSAxXTtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChmdW5jdGlvbigpe1xuICAgICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW52b2tlQ2FsbGJhY2soc3RhdGUsIGNoaWxkLCBjYWxsYmFjaywgcmVzdWx0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUocGFyZW50LCBjaGlsZCwgb25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfSxcblxuICAgIC8qKlxuICAgICAgYGNhdGNoYCBpcyBzaW1wbHkgc3VnYXIgZm9yIGB0aGVuKHVuZGVmaW5lZCwgb25SZWplY3Rpb24pYCB3aGljaCBtYWtlcyBpdCB0aGUgc2FtZVxuICAgICAgYXMgdGhlIGNhdGNoIGJsb2NrIG9mIGEgdHJ5L2NhdGNoIHN0YXRlbWVudC5cblxuICAgICAgYGBganNcbiAgICAgIGZ1bmN0aW9uIGZpbmRBdXRob3IoKXtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZG4ndCBmaW5kIHRoYXQgYXV0aG9yJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIHN5bmNocm9ub3VzXG4gICAgICB0cnkge1xuICAgICAgICBmaW5kQXV0aG9yKCk7XG4gICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgfVxuXG4gICAgICAvLyBhc3luYyB3aXRoIHByb21pc2VzXG4gICAgICBmaW5kQXV0aG9yKCkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEBtZXRob2QgY2F0Y2hcbiAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0aW9uXG4gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gICAgICBAcmV0dXJuIHtQcm9taXNlfVxuICAgICovXG4gICAgICAnY2F0Y2gnOiBmdW5jdGlvbihvblJlamVjdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkcG9seWZpbGwoKSB7XG4gICAgICB2YXIgbG9jYWw7XG5cbiAgICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxvY2FsID0gZ2xvYmFsO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBsb2NhbCA9IHNlbGY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGxvY2FsID0gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncG9seWZpbGwgZmFpbGVkIGJlY2F1c2UgZ2xvYmFsIG9iamVjdCBpcyB1bmF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgUCA9IGxvY2FsLlByb21pc2U7XG5cbiAgICAgIGlmIChQICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQLnJlc29sdmUoKSkgPT09ICdbb2JqZWN0IFByb21pc2VdJyAmJiAhUC5jYXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbG9jYWwuUHJvbWlzZSA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRkZWZhdWx0O1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHBvbHlmaWxsJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHBvbHlmaWxsJCRwb2x5ZmlsbDtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkdW1kJCRFUzZQcm9taXNlID0ge1xuICAgICAgJ1Byb21pc2UnOiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkZGVmYXVsdCxcbiAgICAgICdwb2x5ZmlsbCc6IGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkZGVmYXVsdFxuICAgIH07XG5cbiAgICAvKiBnbG9iYWwgZGVmaW5lOnRydWUgbW9kdWxlOnRydWUgd2luZG93OiB0cnVlICovXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSkge1xuICAgICAgZGVmaW5lKGZ1bmN0aW9uKCkgeyByZXR1cm4gbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTsgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGVbJ2V4cG9ydHMnXSkge1xuICAgICAgbW9kdWxlWydleHBvcnRzJ10gPSBsaWIkZXM2JHByb21pc2UkdW1kJCRFUzZQcm9taXNlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzWydFUzZQcm9taXNlJ10gPSBsaWIkZXM2JHByb21pc2UkdW1kJCRFUzZQcm9taXNlO1xuICAgIH1cblxuICAgIGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkZGVmYXVsdCgpO1xufSkuY2FsbCh0aGlzKTtcblxuXG59KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMMjV2WkdWZmJXOWtkV3hsY3k5bGN6WXRjSEp2YldselpTOWthWE4wTDJWek5pMXdjbTl0YVhObExtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdRVUZCUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeW9oWEc0Z0tpQkFiM1psY25acFpYY2daWE0yTFhCeWIyMXBjMlVnTFNCaElIUnBibmtnYVcxd2JHVnRaVzUwWVhScGIyNGdiMllnVUhKdmJXbHpaWE12UVNzdVhHNGdLaUJBWTI5d2VYSnBaMmgwSUVOdmNIbHlhV2RvZENBb1l5a2dNakF4TkNCWlpXaDFaR0VnUzJGMGVpd2dWRzl0SUVSaGJHVXNJRk4wWldaaGJpQlFaVzV1WlhJZ1lXNWtJR052Ym5SeWFXSjFkRzl5Y3lBb1EyOXVkbVZ5YzJsdmJpQjBieUJGVXpZZ1FWQkpJR0o1SUVwaGEyVWdRWEpqYUdsaVlXeGtLVnh1SUNvZ1FHeHBZMlZ1YzJVZ0lDQk1hV05sYm5ObFpDQjFibVJsY2lCTlNWUWdiR2xqWlc1elpWeHVJQ29nSUNBZ0lDQWdJQ0FnSUNCVFpXVWdhSFIwY0hNNkx5OXlZWGN1WjJsMGFIVmlkWE5sY21OdmJuUmxiblF1WTI5dEwycGhhMlZoY21Ob2FXSmhiR1F2WlhNMkxYQnliMjFwYzJVdmJXRnpkR1Z5TDB4SlEwVk9VMFZjYmlBcUlFQjJaWEp6YVc5dUlDQWdNaTR6TGpCY2JpQXFMMXh1WEc0b1puVnVZM1JwYjI0b0tTQjdYRzRnSUNBZ1hDSjFjMlVnYzNSeWFXTjBYQ0k3WEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpIVjBhV3h6SkNSdlltcGxZM1JQY2taMWJtTjBhVzl1S0hncElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCMGVYQmxiMllnZUNBOVBUMGdKMloxYm1OMGFXOXVKeUI4ZkNBb2RIbHdaVzltSUhnZ1BUMDlJQ2R2WW1wbFkzUW5JQ1ltSUhnZ0lUMDlJRzUxYkd3cE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1IxZEdsc2N5UWthWE5HZFc1amRHbHZiaWg0S1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnZEhsd1pXOW1JSGdnUFQwOUlDZG1kVzVqZEdsdmJpYzdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhWMGFXeHpKQ1JwYzAxaGVXSmxWR2hsYm1GaWJHVW9lQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSFI1Y0dWdlppQjRJRDA5UFNBbmIySnFaV04wSnlBbUppQjRJQ0U5UFNCdWRXeHNPMXh1SUNBZ0lIMWNibHh1SUNBZ0lIWmhjaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtkWFJwYkhNa0pGOXBjMEZ5Y21GNU8xeHVJQ0FnSUdsbUlDZ2hRWEp5WVhrdWFYTkJjbkpoZVNrZ2UxeHVJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhWMGFXeHpKQ1JmYVhOQmNuSmhlU0E5SUdaMWJtTjBhVzl1SUNoNEtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQlBZbXBsWTNRdWNISnZkRzkwZVhCbExuUnZVM1J5YVc1bkxtTmhiR3dvZUNrZ1BUMDlJQ2RiYjJKcVpXTjBJRUZ5Y21GNVhTYzdYRzRnSUNBZ0lDQjlPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrZFhScGJITWtKRjlwYzBGeWNtRjVJRDBnUVhKeVlYa3VhWE5CY25KaGVUdGNiaUFnSUNCOVhHNWNiaUFnSUNCMllYSWdiR2xpSkdWek5pUndjbTl0YVhObEpIVjBhV3h6SkNScGMwRnljbUY1SUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhWMGFXeHpKQ1JmYVhOQmNuSmhlVHRjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHeGxiaUE5SURBN1hHNGdJQ0FnZG1GeUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1IwYjFOMGNtbHVaeUE5SUh0OUxuUnZVM1J5YVc1bk8xeHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrZG1WeWRIaE9aWGgwTzF4dUlDQWdJSFpoY2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtZM1Z6ZEc5dFUyTm9aV1IxYkdWeVJtNDdYRzVjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHRnpZWEFnUFNCbWRXNWpkR2x2YmlCaGMyRndLR05oYkd4aVlXTnJMQ0JoY21jcElIdGNiaUFnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1J4ZFdWMVpWdHNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYkdWdVhTQTlJR05oYkd4aVlXTnJPMXh1SUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhGMVpYVmxXMnhwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSc1pXNGdLeUF4WFNBOUlHRnlaenRjYmlBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSc1pXNGdLejBnTWp0Y2JpQWdJQ0FnSUdsbUlDaHNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYkdWdUlEMDlQU0F5S1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRWxtSUd4bGJpQnBjeUF5TENCMGFHRjBJRzFsWVc1eklIUm9ZWFFnZDJVZ2JtVmxaQ0IwYnlCelkyaGxaSFZzWlNCaGJpQmhjM2x1WXlCbWJIVnphQzVjYmlBZ0lDQWdJQ0FnTHk4Z1NXWWdZV1JrYVhScGIyNWhiQ0JqWVd4c1ltRmphM01nWVhKbElIRjFaWFZsWkNCaVpXWnZjbVVnZEdobElIRjFaWFZsSUdseklHWnNkWE5vWldRc0lIUm9aWGxjYmlBZ0lDQWdJQ0FnTHk4Z2QybHNiQ0JpWlNCd2NtOWpaWE56WldRZ1lua2dkR2hwY3lCbWJIVnphQ0IwYUdGMElIZGxJR0Z5WlNCelkyaGxaSFZzYVc1bkxseHVJQ0FnSUNBZ0lDQnBaaUFvYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHTjFjM1J2YlZOamFHVmtkV3hsY2tadUtTQjdYRzRnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHTjFjM1J2YlZOamFHVmtkV3hsY2tadUtHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JtYkhWemFDazdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pITmphR1ZrZFd4bFJteDFjMmdvS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnpaWFJUWTJobFpIVnNaWElvYzJOb1pXUjFiR1ZHYmlrZ2UxeHVJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR04xYzNSdmJWTmphR1ZrZFd4bGNrWnVJRDBnYzJOb1pXUjFiR1ZHYmp0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2MyVjBRWE5oY0NoaGMyRndSbTRwSUh0Y2JpQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUmhjMkZ3SUQwZ1lYTmhjRVp1TzF4dUlDQWdJSDFjYmx4dUlDQWdJSFpoY2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtZbkp2ZDNObGNsZHBibVJ2ZHlBOUlDaDBlWEJsYjJZZ2QybHVaRzkzSUNFOVBTQW5kVzVrWldacGJtVmtKeWtnUHlCM2FXNWtiM2NnT2lCMWJtUmxabWx1WldRN1hHNGdJQ0FnZG1GeUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JpY205M2MyVnlSMnh2WW1Gc0lEMGdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkdKeWIzZHpaWEpYYVc1a2IzY2dmSHdnZTMwN1hHNGdJQ0FnZG1GeUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JDY205M2MyVnlUWFYwWVhScGIyNVBZbk5sY25abGNpQTlJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSaWNtOTNjMlZ5UjJ4dlltRnNMazExZEdGMGFXOXVUMkp6WlhKMlpYSWdmSHdnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHSnliM2R6WlhKSGJHOWlZV3d1VjJWaVMybDBUWFYwWVhScGIyNVBZbk5sY25abGNqdGNiaUFnSUNCMllYSWdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkdselRtOWtaU0E5SUhSNWNHVnZaaUJ3Y205alpYTnpJQ0U5UFNBbmRXNWtaV1pwYm1Wa0p5QW1KaUI3ZlM1MGIxTjBjbWx1Wnk1allXeHNLSEJ5YjJObGMzTXBJRDA5UFNBblcyOWlhbVZqZENCd2NtOWpaWE56WFNjN1hHNWNiaUFnSUNBdkx5QjBaWE4wSUdadmNpQjNaV0lnZDI5eWEyVnlJR0oxZENCdWIzUWdhVzRnU1VVeE1GeHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYVhOWGIzSnJaWElnUFNCMGVYQmxiMllnVldsdWREaERiR0Z0Y0dWa1FYSnlZWGtnSVQwOUlDZDFibVJsWm1sdVpXUW5JQ1ltWEc0Z0lDQWdJQ0IwZVhCbGIyWWdhVzF3YjNKMFUyTnlhWEIwY3lBaFBUMGdKM1Z1WkdWbWFXNWxaQ2NnSmlaY2JpQWdJQ0FnSUhSNWNHVnZaaUJOWlhOellXZGxRMmhoYm01bGJDQWhQVDBnSjNWdVpHVm1hVzVsWkNjN1hHNWNiaUFnSUNBdkx5QnViMlJsWEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhWelpVNWxlSFJVYVdOcktDa2dlMXh1SUNBZ0lDQWdkbUZ5SUc1bGVIUlVhV05ySUQwZ2NISnZZMlZ6Y3k1dVpYaDBWR2xqYXp0Y2JpQWdJQ0FnSUM4dklHNXZaR1VnZG1WeWMybHZiaUF3TGpFd0xuZ2daR2x6Y0d4aGVYTWdZU0JrWlhCeVpXTmhkR2x2YmlCM1lYSnVhVzVuSUhkb1pXNGdibVY0ZEZScFkyc2dhWE1nZFhObFpDQnlaV04xY25OcGRtVnNlVnh1SUNBZ0lDQWdMeThnYzJWMFNXMXRaV1JwWVhSbElITm9iM1ZzWkNCaVpTQjFjMlZrSUdsdWMzUmxZV1FnYVc1emRHVmhaRnh1SUNBZ0lDQWdkbUZ5SUhabGNuTnBiMjRnUFNCd2NtOWpaWE56TG5abGNuTnBiMjV6TG01dlpHVXViV0YwWTJnb0wxNG9Qem9vWEZ4a0t5bGNYQzRwUHlnL09paGNYR1FyS1Z4Y0xpay9LRnhjS254Y1hHUXJLU1F2S1R0Y2JpQWdJQ0FnSUdsbUlDaEJjbkpoZVM1cGMwRnljbUY1S0habGNuTnBiMjRwSUNZbUlIWmxjbk5wYjI1Yk1WMGdQVDA5SUNjd0p5QW1KaUIyWlhKemFXOXVXekpkSUQwOVBTQW5NVEFuS1NCN1hHNGdJQ0FnSUNBZ0lHNWxlSFJVYVdOcklEMGdjMlYwU1cxdFpXUnBZWFJsTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdJQ0FnSUNCdVpYaDBWR2xqYXloc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtabXgxYzJncE8xeHVJQ0FnSUNBZ2ZUdGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QjJaWEowZUZ4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSMWMyVldaWEowZUZScGJXVnlLQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtkbVZ5ZEhoT1pYaDBLR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSbWJIVnphQ2s3WEc0Z0lDQWdJQ0I5TzF4dUlDQWdJSDFjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSMWMyVk5kWFJoZEdsdmJrOWljMlZ5ZG1WeUtDa2dlMXh1SUNBZ0lDQWdkbUZ5SUdsMFpYSmhkR2x2Ym5NZ1BTQXdPMXh1SUNBZ0lDQWdkbUZ5SUc5aWMyVnlkbVZ5SUQwZ2JtVjNJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSQ2NtOTNjMlZ5VFhWMFlYUnBiMjVQWW5ObGNuWmxjaWhzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa1pteDFjMmdwTzF4dUlDQWdJQ0FnZG1GeUlHNXZaR1VnUFNCa2IyTjFiV1Z1ZEM1amNtVmhkR1ZVWlhoMFRtOWtaU2duSnlrN1hHNGdJQ0FnSUNCdlluTmxjblpsY2k1dlluTmxjblpsS0c1dlpHVXNJSHNnWTJoaGNtRmpkR1Z5UkdGMFlUb2dkSEoxWlNCOUtUdGNibHh1SUNBZ0lDQWdjbVYwZFhKdUlHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lDQWdJQ0J1YjJSbExtUmhkR0VnUFNBb2FYUmxjbUYwYVc5dWN5QTlJQ3NyYVhSbGNtRjBhVzl1Y3lBbElESXBPMXh1SUNBZ0lDQWdmVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUIzWldJZ2QyOXlhMlZ5WEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhWelpVMWxjM05oWjJWRGFHRnVibVZzS0NrZ2UxeHVJQ0FnSUNBZ2RtRnlJR05vWVc1dVpXd2dQU0J1WlhjZ1RXVnpjMkZuWlVOb1lXNXVaV3dvS1R0Y2JpQWdJQ0FnSUdOb1lXNXVaV3d1Y0c5eWRERXViMjV0WlhOellXZGxJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHWnNkWE5vTzF4dUlDQWdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ1kyaGhibTVsYkM1d2IzSjBNaTV3YjNOMFRXVnpjMkZuWlNnd0tUdGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKSFZ6WlZObGRGUnBiV1Z2ZFhRb0tTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z1puVnVZM1JwYjI0b0tTQjdYRzRnSUNBZ0lDQWdJSE5sZEZScGJXVnZkWFFvYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHWnNkWE5vTENBeEtUdGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSeGRXVjFaU0E5SUc1bGR5QkJjbkpoZVNneE1EQXdLVHRjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrWm14MWMyZ29LU0I3WEc0Z0lDQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnNaVzQ3SUdrclBUSXBJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHTmhiR3hpWVdOcklEMGdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhGMVpYVmxXMmxkTzF4dUlDQWdJQ0FnSUNCMllYSWdZWEpuSUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKSEYxWlhWbFcya3JNVjA3WEc1Y2JpQWdJQ0FnSUNBZ1kyRnNiR0poWTJzb1lYSm5LVHRjYmx4dUlDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtjWFZsZFdWYmFWMGdQU0IxYm1SbFptbHVaV1E3WEc0Z0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnhkV1YxWlZ0cEt6RmRJRDBnZFc1a1pXWnBibVZrTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtiR1Z1SUQwZ01EdGNiaUFnSUNCOVhHNWNiaUFnSUNCbWRXNWpkR2x2YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtZWFIwWlcxd2RGWmxjblJsZUNncElIdGNiaUFnSUNBZ0lIUnllU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQnlJRDBnY21WeGRXbHlaVHRjYmlBZ0lDQWdJQ0FnZG1GeUlIWmxjblI0SUQwZ2NpZ25kbVZ5ZEhnbktUdGNiaUFnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhabGNuUjRUbVY0ZENBOUlIWmxjblI0TG5KMWJrOXVURzl2Y0NCOGZDQjJaWEowZUM1eWRXNVBia052Ym5SbGVIUTdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrZFhObFZtVnlkSGhVYVcxbGNpZ3BPMXh1SUNBZ0lDQWdmU0JqWVhSamFDaGxLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2RYTmxVMlYwVkdsdFpXOTFkQ2dwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmx4dUlDQWdJSFpoY2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtjMk5vWldSMWJHVkdiSFZ6YUR0Y2JpQWdJQ0F2THlCRVpXTnBaR1VnZDJoaGRDQmhjM2x1WXlCdFpYUm9iMlFnZEc4Z2RYTmxJSFJ2SUhSeWFXZG5aWEpwYm1jZ2NISnZZMlZ6YzJsdVp5QnZaaUJ4ZFdWMVpXUWdZMkZzYkdKaFkydHpPbHh1SUNBZ0lHbG1JQ2hzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2FYTk9iMlJsS1NCN1hHNGdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtjMk5vWldSMWJHVkdiSFZ6YUNBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1IxYzJWT1pYaDBWR2xqYXlncE8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKRUp5YjNkelpYSk5kWFJoZEdsdmJrOWljMlZ5ZG1WeUtTQjdYRzRnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYzJOb1pXUjFiR1ZHYkhWemFDQTlJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSMWMyVk5kWFJoZEdsdmJrOWljMlZ5ZG1WeUtDazdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaHNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYVhOWGIzSnJaWElwSUh0Y2JpQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnpZMmhsWkhWc1pVWnNkWE5vSUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKSFZ6WlUxbGMzTmhaMlZEYUdGdWJtVnNLQ2s3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2hzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa1luSnZkM05sY2xkcGJtUnZkeUE5UFQwZ2RXNWtaV1pwYm1Wa0lDWW1JSFI1Y0dWdlppQnlaWEYxYVhKbElEMDlQU0FuWm5WdVkzUnBiMjRuS1NCN1hHNGdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtjMk5vWldSMWJHVkdiSFZ6YUNBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JoZEhSbGJYQjBWbVZ5ZEdWNEtDazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnpZMmhsWkhWc1pVWnNkWE5vSUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKSFZ6WlZObGRGUnBiV1Z2ZFhRb0tUdGNiaUFnSUNCOVhHNWNiaUFnSUNCbWRXNWpkR2x2YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSdWIyOXdLQ2tnZTMxY2JseHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlFSVTVFU1U1SElDQWdQU0IyYjJsa0lEQTdYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRVpWVEVaSlRFeEZSQ0E5SURFN1hHNGdJQ0FnZG1GeUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pGSkZTa1ZEVkVWRUlDQTlJREk3WEc1Y2JpQWdJQ0IyWVhJZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1IwVlVYMVJJUlU1ZlJWSlNUMUlnUFNCdVpYY2diR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtSWEp5YjNKUFltcGxZM1FvS1R0Y2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhObGJHWkdkV3hzWm1sc2JHMWxiblFvS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYm1WM0lGUjVjR1ZGY25KdmNpaGNJbGx2ZFNCallXNXViM1FnY21WemIyeDJaU0JoSUhCeWIyMXBjMlVnZDJsMGFDQnBkSE5sYkdaY0lpazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1kyRnVibTkwVW1WMGRYSnVUM2R1S0NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUc1bGR5QlVlWEJsUlhKeWIzSW9KMEVnY0hKdmJXbHpaWE1nWTJGc2JHSmhZMnNnWTJGdWJtOTBJSEpsZEhWeWJpQjBhR0YwSUhOaGJXVWdjSEp2YldselpTNG5LVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUm5aWFJVYUdWdUtIQnliMjFwYzJVcElIdGNiaUFnSUNBZ0lIUnllU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ3Y205dGFYTmxMblJvWlc0N1hHNGdJQ0FnSUNCOUlHTmhkR05vS0dWeWNtOXlLU0I3WEc0Z0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkVkRlZGOVVTRVZPWDBWU1VrOVNMbVZ5Y205eUlEMGdaWEp5YjNJN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSSFJWUmZWRWhGVGw5RlVsSlBVanRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUjBjbmxVYUdWdUtIUm9aVzRzSUhaaGJIVmxMQ0JtZFd4bWFXeHNiV1Z1ZEVoaGJtUnNaWElzSUhKbGFtVmpkR2x2YmtoaGJtUnNaWElwSUh0Y2JpQWdJQ0FnSUhSeWVTQjdYRzRnSUNBZ0lDQWdJSFJvWlc0dVkyRnNiQ2gyWVd4MVpTd2dablZzWm1sc2JHMWxiblJJWVc1a2JHVnlMQ0J5WldwbFkzUnBiMjVJWVc1a2JHVnlLVHRjYmlBZ0lDQWdJSDBnWTJGMFkyZ29aU2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWlR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JvWVc1a2JHVkdiM0psYVdkdVZHaGxibUZpYkdVb2NISnZiV2x6WlN3Z2RHaGxibUZpYkdVc0lIUm9aVzRwSUh0Y2JpQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtZWE5oY0NobWRXNWpkR2x2Ymlod2NtOXRhWE5sS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJ6WldGc1pXUWdQU0JtWVd4elpUdGNiaUFnSUNBZ0lDQWdkbUZ5SUdWeWNtOXlJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrZEhKNVZHaGxiaWgwYUdWdUxDQjBhR1Z1WVdKc1pTd2dablZ1WTNScGIyNG9kbUZzZFdVcElIdGNiaUFnSUNBZ0lDQWdJQ0JwWmlBb2MyVmhiR1ZrS1NCN0lISmxkSFZ5YmpzZ2ZWeHVJQ0FnSUNBZ0lDQWdJSE5sWVd4bFpDQTlJSFJ5ZFdVN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0hSb1pXNWhZbXhsSUNFOVBTQjJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WemIyeDJaU2h3Y205dGFYTmxMQ0IyWVd4MVpTazdYRzRnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHWjFiR1pwYkd3b2NISnZiV2x6WlN3Z2RtRnNkV1VwTzF4dUlDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdmU3dnWm5WdVkzUnBiMjRvY21WaGMyOXVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLSE5sWVd4bFpDa2dleUJ5WlhSMWNtNDdJSDFjYmlBZ0lDQWdJQ0FnSUNCelpXRnNaV1FnUFNCMGNuVmxPMXh1WEc0Z0lDQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NtVnFaV04wS0hCeWIyMXBjMlVzSUhKbFlYTnZiaWs3WEc0Z0lDQWdJQ0FnSUgwc0lDZFRaWFIwYkdVNklDY2dLeUFvY0hKdmJXbHpaUzVmYkdGaVpXd2dmSHdnSnlCMWJtdHViM2R1SUhCeWIyMXBjMlVuS1NrN1hHNWNiaUFnSUNBZ0lDQWdhV1lnS0NGelpXRnNaV1FnSmlZZ1pYSnliM0lwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnpaV0ZzWldRZ1BTQjBjblZsTzF4dUlDQWdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pISmxhbVZqZENod2NtOXRhWE5sTENCbGNuSnZjaWs3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgwc0lIQnliMjFwYzJVcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkdoaGJtUnNaVTkzYmxSb1pXNWhZbXhsS0hCeWIyMXBjMlVzSUhSb1pXNWhZbXhsS1NCN1hHNGdJQ0FnSUNCcFppQW9kR2hsYm1GaWJHVXVYM04wWVhSbElEMDlQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JHVlV4R1NVeE1SVVFwSUh0Y2JpQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1puVnNabWxzYkNod2NtOXRhWE5sTENCMGFHVnVZV0pzWlM1ZmNtVnpkV3gwS1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2RHaGxibUZpYkdVdVgzTjBZWFJsSUQwOVBTQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlNSVXBGUTFSRlJDa2dlMXh1SUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J5WldwbFkzUW9jSEp2YldselpTd2dkR2hsYm1GaWJHVXVYM0psYzNWc2RDazdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnpkV0p6WTNKcFltVW9kR2hsYm1GaWJHVXNJSFZ1WkdWbWFXNWxaQ3dnWm5WdVkzUnBiMjRvZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSeVpYTnZiSFpsS0hCeWIyMXBjMlVzSUhaaGJIVmxLVHRjYmlBZ0lDQWdJQ0FnZlN3Z1puVnVZM1JwYjI0b2NtVmhjMjl1S1NCN1hHNGdJQ0FnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtjbVZxWldOMEtIQnliMjFwYzJVc0lISmxZWE52YmlrN1hHNGdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHaGhibVJzWlUxaGVXSmxWR2hsYm1GaWJHVW9jSEp2YldselpTd2diV0Y1WW1WVWFHVnVZV0pzWlNrZ2UxeHVJQ0FnSUNBZ2FXWWdLRzFoZVdKbFZHaGxibUZpYkdVdVkyOXVjM1J5ZFdOMGIzSWdQVDA5SUhCeWIyMXBjMlV1WTI5dWMzUnlkV04wYjNJcElIdGNiaUFnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWthR0Z1Wkd4bFQzZHVWR2hsYm1GaWJHVW9jSEp2YldselpTd2diV0Y1WW1WVWFHVnVZV0pzWlNrN1hHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCMllYSWdkR2hsYmlBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHZGxkRlJvWlc0b2JXRjVZbVZVYUdWdVlXSnNaU2s3WEc1Y2JpQWdJQ0FnSUNBZ2FXWWdLSFJvWlc0Z1BUMDlJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRWRGVkY5VVNFVk9YMFZTVWs5U0tTQjdYRzRnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WcVpXTjBLSEJ5YjIxcGMyVXNJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRWRGVkY5VVNFVk9YMFZTVWs5U0xtVnljbTl5S1R0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaDBhR1Z1SUQwOVBTQjFibVJsWm1sdVpXUXBJSHRjYmlBZ0lDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSbWRXeG1hV3hzS0hCeWIyMXBjMlVzSUcxaGVXSmxWR2hsYm1GaWJHVXBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0d4cFlpUmxjellrY0hKdmJXbHpaU1IxZEdsc2N5UWthWE5HZFc1amRHbHZiaWgwYUdWdUtTa2dlMXh1SUNBZ0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkdoaGJtUnNaVVp2Y21WcFoyNVVhR1Z1WVdKc1pTaHdjbTl0YVhObExDQnRZWGxpWlZSb1pXNWhZbXhsTENCMGFHVnVLVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSbWRXeG1hV3hzS0hCeWIyMXBjMlVzSUcxaGVXSmxWR2hsYm1GaWJHVXBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtjbVZ6YjJ4MlpTaHdjbTl0YVhObExDQjJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ2FXWWdLSEJ5YjIxcGMyVWdQVDA5SUhaaGJIVmxLU0I3WEc0Z0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhKbGFtVmpkQ2h3Y205dGFYTmxMQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J6Wld4bVJuVnNiR1pwYkd4dFpXNTBLQ2twTzF4dUlDQWdJQ0FnZlNCbGJITmxJR2xtSUNoc2FXSWtaWE0ySkhCeWIyMXBjMlVrZFhScGJITWtKRzlpYW1WamRFOXlSblZ1WTNScGIyNG9kbUZzZFdVcEtTQjdYRzRnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKR2hoYm1Sc1pVMWhlV0psVkdobGJtRmliR1VvY0hKdmJXbHpaU3dnZG1Gc2RXVXBPMXh1SUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtablZzWm1sc2JDaHdjbTl0YVhObExDQjJZV3gxWlNrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY0hWaWJHbHphRkpsYW1WamRHbHZiaWh3Y205dGFYTmxLU0I3WEc0Z0lDQWdJQ0JwWmlBb2NISnZiV2x6WlM1ZmIyNWxjbkp2Y2lrZ2UxeHVJQ0FnSUNBZ0lDQndjbTl0YVhObExsOXZibVZ5Y205eUtIQnliMjFwYzJVdVgzSmxjM1ZzZENrN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pIQjFZbXhwYzJnb2NISnZiV2x6WlNrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrWm5Wc1ptbHNiQ2h3Y205dGFYTmxMQ0IyWVd4MVpTa2dlMXh1SUNBZ0lDQWdhV1lnS0hCeWIyMXBjMlV1WDNOMFlYUmxJQ0U5UFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSUVJVNUVTVTVIS1NCN0lISmxkSFZ5YmpzZ2ZWeHVYRzRnSUNBZ0lDQndjbTl0YVhObExsOXlaWE4xYkhRZ1BTQjJZV3gxWlR0Y2JpQWdJQ0FnSUhCeWIyMXBjMlV1WDNOMFlYUmxJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrUmxWTVJrbE1URVZFTzF4dVhHNGdJQ0FnSUNCcFppQW9jSEp2YldselpTNWZjM1ZpYzJOeWFXSmxjbk11YkdWdVozUm9JQ0U5UFNBd0tTQjdYRzRnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSaGMyRndLR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSEIxWW14cGMyZ3NJSEJ5YjIxcGMyVXBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pISmxhbVZqZENod2NtOXRhWE5sTENCeVpXRnpiMjRwSUh0Y2JpQWdJQ0FnSUdsbUlDaHdjbTl0YVhObExsOXpkR0YwWlNBaFBUMGdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtVRVZPUkVsT1J5a2dleUJ5WlhSMWNtNDdJSDFjYmlBZ0lDQWdJSEJ5YjIxcGMyVXVYM04wWVhSbElEMGdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtVa1ZLUlVOVVJVUTdYRzRnSUNBZ0lDQndjbTl0YVhObExsOXlaWE4xYkhRZ1BTQnlaV0Z6YjI0N1hHNWNiaUFnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JoYzJGd0tHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pIQjFZbXhwYzJoU1pXcGxZM1JwYjI0c0lIQnliMjFwYzJVcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhOMVluTmpjbWxpWlNod1lYSmxiblFzSUdOb2FXeGtMQ0J2YmtaMWJHWnBiR3h0Wlc1MExDQnZibEpsYW1WamRHbHZiaWtnZTF4dUlDQWdJQ0FnZG1GeUlITjFZbk5qY21saVpYSnpJRDBnY0dGeVpXNTBMbDl6ZFdKelkzSnBZbVZ5Y3p0Y2JpQWdJQ0FnSUhaaGNpQnNaVzVuZEdnZ1BTQnpkV0p6WTNKcFltVnljeTVzWlc1bmRHZzdYRzVjYmlBZ0lDQWdJSEJoY21WdWRDNWZiMjVsY25KdmNpQTlJRzUxYkd3N1hHNWNiaUFnSUNBZ0lITjFZbk5qY21saVpYSnpXMnhsYm1kMGFGMGdQU0JqYUdsc1pEdGNiaUFnSUNBZ0lITjFZbk5qY21saVpYSnpXMnhsYm1kMGFDQXJJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRVpWVEVaSlRFeEZSRjBnUFNCdmJrWjFiR1pwYkd4dFpXNTBPMXh1SUNBZ0lDQWdjM1ZpYzJOeWFXSmxjbk5iYkdWdVozUm9JQ3NnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrVWtWS1JVTlVSVVJkSUNBOUlHOXVVbVZxWldOMGFXOXVPMXh1WEc0Z0lDQWdJQ0JwWmlBb2JHVnVaM1JvSUQwOVBTQXdJQ1ltSUhCaGNtVnVkQzVmYzNSaGRHVXBJSHRjYmlBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHRnpZWEFvYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY0hWaWJHbHphQ3dnY0dGeVpXNTBLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUndkV0pzYVhOb0tIQnliMjFwYzJVcElIdGNiaUFnSUNBZ0lIWmhjaUJ6ZFdKelkzSnBZbVZ5Y3lBOUlIQnliMjFwYzJVdVgzTjFZbk5qY21saVpYSnpPMXh1SUNBZ0lDQWdkbUZ5SUhObGRIUnNaV1FnUFNCd2NtOXRhWE5sTGw5emRHRjBaVHRjYmx4dUlDQWdJQ0FnYVdZZ0tITjFZbk5qY21saVpYSnpMbXhsYm1kMGFDQTlQVDBnTUNrZ2V5QnlaWFIxY200N0lIMWNibHh1SUNBZ0lDQWdkbUZ5SUdOb2FXeGtMQ0JqWVd4c1ltRmpheXdnWkdWMFlXbHNJRDBnY0hKdmJXbHpaUzVmY21WemRXeDBPMXh1WEc0Z0lDQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUhOMVluTmpjbWxpWlhKekxteGxibWQwYURzZ2FTQXJQU0F6S1NCN1hHNGdJQ0FnSUNBZ0lHTm9hV3hrSUQwZ2MzVmljMk55YVdKbGNuTmJhVjA3WEc0Z0lDQWdJQ0FnSUdOaGJHeGlZV05ySUQwZ2MzVmljMk55YVdKbGNuTmJhU0FySUhObGRIUnNaV1JkTzF4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2hqYUdsc1pDa2dlMXh1SUNBZ0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkdsdWRtOXJaVU5oYkd4aVlXTnJLSE5sZEhSc1pXUXNJR05vYVd4a0xDQmpZV3hzWW1GamF5d2daR1YwWVdsc0tUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0JqWVd4c1ltRmpheWhrWlhSaGFXd3BPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUhCeWIyMXBjMlV1WDNOMVluTmpjbWxpWlhKekxteGxibWQwYUNBOUlEQTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1JYSnliM0pQWW1wbFkzUW9LU0I3WEc0Z0lDQWdJQ0IwYUdsekxtVnljbTl5SUQwZ2JuVnNiRHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrVkZKWlgwTkJWRU5JWDBWU1VrOVNJRDBnYm1WM0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pFVnljbTl5VDJKcVpXTjBLQ2s3WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1IwY25sRFlYUmphQ2hqWVd4c1ltRmpheXdnWkdWMFlXbHNLU0I3WEc0Z0lDQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1kyRnNiR0poWTJzb1pHVjBZV2xzS1R0Y2JpQWdJQ0FnSUgwZ1kyRjBZMmdvWlNrZ2UxeHVJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlVVbGxmUTBGVVEwaGZSVkpTVDFJdVpYSnliM0lnUFNCbE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1ZGSlpYME5CVkVOSVgwVlNVazlTTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKR2x1ZG05clpVTmhiR3hpWVdOcktITmxkSFJzWldRc0lIQnliMjFwYzJVc0lHTmhiR3hpWVdOckxDQmtaWFJoYVd3cElIdGNiaUFnSUNBZ0lIWmhjaUJvWVhORFlXeHNZbUZqYXlBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSMWRHbHNjeVFrYVhOR2RXNWpkR2x2YmloallXeHNZbUZqYXlrc1hHNGdJQ0FnSUNBZ0lDQWdkbUZzZFdVc0lHVnljbTl5TENCemRXTmpaV1ZrWldRc0lHWmhhV3hsWkR0Y2JseHVJQ0FnSUNBZ2FXWWdLR2hoYzBOaGJHeGlZV05yS1NCN1hHNGdJQ0FnSUNBZ0lIWmhiSFZsSUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2RISjVRMkYwWTJnb1kyRnNiR0poWTJzc0lHUmxkR0ZwYkNrN1hHNWNiaUFnSUNBZ0lDQWdhV1lnS0haaGJIVmxJRDA5UFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSVVVsbGZRMEZVUTBoZlJWSlNUMUlwSUh0Y2JpQWdJQ0FnSUNBZ0lDQm1ZV2xzWldRZ1BTQjBjblZsTzF4dUlDQWdJQ0FnSUNBZ0lHVnljbTl5SUQwZ2RtRnNkV1V1WlhKeWIzSTdYRzRnSUNBZ0lDQWdJQ0FnZG1Gc2RXVWdQU0J1ZFd4c08xeHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJSE4xWTJObFpXUmxaQ0E5SUhSeWRXVTdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCcFppQW9jSEp2YldselpTQTlQVDBnZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSeVpXcGxZM1FvY0hKdmJXbHpaU3dnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrWTJGdWJtOTBVbVYwZFhKdVQzZHVLQ2twTzF4dUlDQWdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQjJZV3gxWlNBOUlHUmxkR0ZwYkR0Y2JpQWdJQ0FnSUNBZ2MzVmpZMlZsWkdWa0lEMGdkSEoxWlR0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2FXWWdLSEJ5YjIxcGMyVXVYM04wWVhSbElDRTlQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JRUlU1RVNVNUhLU0I3WEc0Z0lDQWdJQ0FnSUM4dklHNXZiM0JjYmlBZ0lDQWdJSDBnWld4elpTQnBaaUFvYUdGelEyRnNiR0poWTJzZ0ppWWdjM1ZqWTJWbFpHVmtLU0I3WEc0Z0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhKbGMyOXNkbVVvY0hKdmJXbHpaU3dnZG1Gc2RXVXBPMXh1SUNBZ0lDQWdmU0JsYkhObElHbG1JQ2htWVdsc1pXUXBJSHRjYmlBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WcVpXTjBLSEJ5YjIxcGMyVXNJR1Z5Y205eUtUdGNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9jMlYwZEd4bFpDQTlQVDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrUmxWTVJrbE1URVZFS1NCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHWjFiR1pwYkd3b2NISnZiV2x6WlN3Z2RtRnNkV1VwTzF4dUlDQWdJQ0FnZlNCbGJITmxJR2xtSUNoelpYUjBiR1ZrSUQwOVBTQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlNSVXBGUTFSRlJDa2dlMXh1SUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J5WldwbFkzUW9jSEp2YldselpTd2dkbUZzZFdVcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkdsdWFYUnBZV3hwZW1WUWNtOXRhWE5sS0hCeWIyMXBjMlVzSUhKbGMyOXNkbVZ5S1NCN1hHNGdJQ0FnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0J5WlhOdmJIWmxjaWhtZFc1amRHbHZiaUJ5WlhOdmJIWmxVSEp2YldselpTaDJZV3gxWlNsN1hHNGdJQ0FnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtjbVZ6YjJ4MlpTaHdjbTl0YVhObExDQjJZV3gxWlNrN1hHNGdJQ0FnSUNBZ0lIMHNJR1oxYm1OMGFXOXVJSEpsYW1WamRGQnliMjFwYzJVb2NtVmhjMjl1S1NCN1hHNGdJQ0FnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtjbVZxWldOMEtIQnliMjFwYzJVc0lISmxZWE52YmlrN1hHNGdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdmU0JqWVhSamFDaGxLU0I3WEc0Z0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhKbGFtVmpkQ2h3Y205dGFYTmxMQ0JsS1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtaVzUxYldWeVlYUnZjaVFrUlc1MWJXVnlZWFJ2Y2loRGIyNXpkSEoxWTNSdmNpd2dhVzV3ZFhRcElIdGNiaUFnSUNBZ0lIWmhjaUJsYm5WdFpYSmhkRzl5SUQwZ2RHaHBjenRjYmx4dUlDQWdJQ0FnWlc1MWJXVnlZWFJ2Y2k1ZmFXNXpkR0Z1WTJWRGIyNXpkSEoxWTNSdmNpQTlJRU52Ym5OMGNuVmpkRzl5TzF4dUlDQWdJQ0FnWlc1MWJXVnlZWFJ2Y2k1d2NtOXRhWE5sSUQwZ2JtVjNJRU52Ym5OMGNuVmpkRzl5S0d4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkc1dmIzQXBPMXh1WEc0Z0lDQWdJQ0JwWmlBb1pXNTFiV1Z5WVhSdmNpNWZkbUZzYVdSaGRHVkpibkIxZENocGJuQjFkQ2twSUh0Y2JpQWdJQ0FnSUNBZ1pXNTFiV1Z5WVhSdmNpNWZhVzV3ZFhRZ0lDQWdJRDBnYVc1d2RYUTdYRzRnSUNBZ0lDQWdJR1Z1ZFcxbGNtRjBiM0l1YkdWdVozUm9JQ0FnSUNBOUlHbHVjSFYwTG14bGJtZDBhRHRjYmlBZ0lDQWdJQ0FnWlc1MWJXVnlZWFJ2Y2k1ZmNtVnRZV2x1YVc1bklEMGdhVzV3ZFhRdWJHVnVaM1JvTzF4dVhHNGdJQ0FnSUNBZ0lHVnVkVzFsY21GMGIzSXVYMmx1YVhRb0tUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb1pXNTFiV1Z5WVhSdmNpNXNaVzVuZEdnZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUm1kV3htYVd4c0tHVnVkVzFsY21GMGIzSXVjSEp2YldselpTd2daVzUxYldWeVlYUnZjaTVmY21WemRXeDBLVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNCbGJuVnRaWEpoZEc5eUxteGxibWQwYUNBOUlHVnVkVzFsY21GMGIzSXViR1Z1WjNSb0lIeDhJREE3WEc0Z0lDQWdJQ0FnSUNBZ1pXNTFiV1Z5WVhSdmNpNWZaVzUxYldWeVlYUmxLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLR1Z1ZFcxbGNtRjBiM0l1WDNKbGJXRnBibWx1WnlBOVBUMGdNQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtablZzWm1sc2JDaGxiblZ0WlhKaGRHOXlMbkJ5YjIxcGMyVXNJR1Z1ZFcxbGNtRjBiM0l1WDNKbGMzVnNkQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnlaV3BsWTNRb1pXNTFiV1Z5WVhSdmNpNXdjbTl0YVhObExDQmxiblZ0WlhKaGRHOXlMbDkyWVd4cFpHRjBhVzl1UlhKeWIzSW9LU2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpHVnVkVzFsY21GMGIzSWtKRVZ1ZFcxbGNtRjBiM0l1Y0hKdmRHOTBlWEJsTGw5MllXeHBaR0YwWlVsdWNIVjBJRDBnWm5WdVkzUnBiMjRvYVc1d2RYUXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa2RYUnBiSE1rSkdselFYSnlZWGtvYVc1d2RYUXBPMXh1SUNBZ0lIMDdYRzVjYmlBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1pXNTFiV1Z5WVhSdmNpUWtSVzUxYldWeVlYUnZjaTV3Y205MGIzUjVjR1V1WDNaaGJHbGtZWFJwYjI1RmNuSnZjaUE5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUc1bGR5QkZjbkp2Y2lnblFYSnlZWGtnVFdWMGFHOWtjeUJ0ZFhOMElHSmxJSEJ5YjNacFpHVmtJR0Z1SUVGeWNtRjVKeWs3WEc0Z0lDQWdmVHRjYmx4dUlDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUmxiblZ0WlhKaGRHOXlKQ1JGYm5WdFpYSmhkRzl5TG5CeWIzUnZkSGx3WlM1ZmFXNXBkQ0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVmY21WemRXeDBJRDBnYm1WM0lFRnljbUY1S0hSb2FYTXViR1Z1WjNSb0tUdGNiaUFnSUNCOU8xeHVYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUmxiblZ0WlhKaGRHOXlKQ1JrWldaaGRXeDBJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR1Z1ZFcxbGNtRjBiM0lrSkVWdWRXMWxjbUYwYjNJN1hHNWNiaUFnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWlc1MWJXVnlZWFJ2Y2lRa1JXNTFiV1Z5WVhSdmNpNXdjbTkwYjNSNWNHVXVYMlZ1ZFcxbGNtRjBaU0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ2RtRnlJR1Z1ZFcxbGNtRjBiM0lnUFNCMGFHbHpPMXh1WEc0Z0lDQWdJQ0IyWVhJZ2JHVnVaM1JvSUNBOUlHVnVkVzFsY21GMGIzSXViR1Z1WjNSb08xeHVJQ0FnSUNBZ2RtRnlJSEJ5YjIxcGMyVWdQU0JsYm5WdFpYSmhkRzl5TG5CeWIyMXBjMlU3WEc0Z0lDQWdJQ0IyWVhJZ2FXNXdkWFFnSUNBOUlHVnVkVzFsY21GMGIzSXVYMmx1Y0hWME8xeHVYRzRnSUNBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2NISnZiV2x6WlM1ZmMzUmhkR1VnUFQwOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pGQkZUa1JKVGtjZ0ppWWdhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQWdJR1Z1ZFcxbGNtRjBiM0l1WDJWaFkyaEZiblJ5ZVNocGJuQjFkRnRwWFN3Z2FTazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZUdGNibHh1SUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSbGJuVnRaWEpoZEc5eUpDUkZiblZ0WlhKaGRHOXlMbkJ5YjNSdmRIbHdaUzVmWldGamFFVnVkSEo1SUQwZ1puVnVZM1JwYjI0b1pXNTBjbmtzSUdrcElIdGNiaUFnSUNBZ0lIWmhjaUJsYm5WdFpYSmhkRzl5SUQwZ2RHaHBjenRjYmlBZ0lDQWdJSFpoY2lCaklEMGdaVzUxYldWeVlYUnZjaTVmYVc1emRHRnVZMlZEYjI1emRISjFZM1J2Y2p0Y2JseHVJQ0FnSUNBZ2FXWWdLR3hwWWlSbGN6WWtjSEp2YldselpTUjFkR2xzY3lRa2FYTk5ZWGxpWlZSb1pXNWhZbXhsS0dWdWRISjVLU2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9aVzUwY25rdVkyOXVjM1J5ZFdOMGIzSWdQVDA5SUdNZ0ppWWdaVzUwY25rdVgzTjBZWFJsSUNFOVBTQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlFSVTVFU1U1SEtTQjdYRzRnSUNBZ0lDQWdJQ0FnWlc1MGNua3VYMjl1WlhKeWIzSWdQU0J1ZFd4c08xeHVJQ0FnSUNBZ0lDQWdJR1Z1ZFcxbGNtRjBiM0l1WDNObGRIUnNaV1JCZENobGJuUnllUzVmYzNSaGRHVXNJR2tzSUdWdWRISjVMbDl5WlhOMWJIUXBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUdWdWRXMWxjbUYwYjNJdVgzZHBiR3hUWlhSMGJHVkJkQ2hqTG5KbGMyOXNkbVVvWlc1MGNua3BMQ0JwS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ1pXNTFiV1Z5WVhSdmNpNWZjbVZ0WVdsdWFXNW5MUzA3WEc0Z0lDQWdJQ0FnSUdWdWRXMWxjbUYwYjNJdVgzSmxjM1ZzZEZ0cFhTQTlJR1Z1ZEhKNU8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgwN1hHNWNiaUFnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWlc1MWJXVnlZWFJ2Y2lRa1JXNTFiV1Z5WVhSdmNpNXdjbTkwYjNSNWNHVXVYM05sZEhSc1pXUkJkQ0E5SUdaMWJtTjBhVzl1S0hOMFlYUmxMQ0JwTENCMllXeDFaU2tnZTF4dUlDQWdJQ0FnZG1GeUlHVnVkVzFsY21GMGIzSWdQU0IwYUdsek8xeHVJQ0FnSUNBZ2RtRnlJSEJ5YjIxcGMyVWdQU0JsYm5WdFpYSmhkRzl5TG5CeWIyMXBjMlU3WEc1Y2JpQWdJQ0FnSUdsbUlDaHdjbTl0YVhObExsOXpkR0YwWlNBOVBUMGdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtVRVZPUkVsT1J5a2dlMXh1SUNBZ0lDQWdJQ0JsYm5WdFpYSmhkRzl5TGw5eVpXMWhhVzVwYm1jdExUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb2MzUmhkR1VnUFQwOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pGSkZTa1ZEVkVWRUtTQjdYRzRnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WcVpXTjBLSEJ5YjIxcGMyVXNJSFpoYkhWbEtUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0JsYm5WdFpYSmhkRzl5TGw5eVpYTjFiSFJiYVYwZ1BTQjJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQnBaaUFvWlc1MWJXVnlZWFJ2Y2k1ZmNtVnRZV2x1YVc1bklEMDlQU0F3S1NCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHWjFiR1pwYkd3b2NISnZiV2x6WlN3Z1pXNTFiV1Z5WVhSdmNpNWZjbVZ6ZFd4MEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOU8xeHVYRzRnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdWdWRXMWxjbUYwYjNJa0pFVnVkVzFsY21GMGIzSXVjSEp2ZEc5MGVYQmxMbDkzYVd4c1UyVjBkR3hsUVhRZ1BTQm1kVzVqZEdsdmJpaHdjbTl0YVhObExDQnBLU0I3WEc0Z0lDQWdJQ0IyWVhJZ1pXNTFiV1Z5WVhSdmNpQTlJSFJvYVhNN1hHNWNiaUFnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pITjFZbk5qY21saVpTaHdjbTl0YVhObExDQjFibVJsWm1sdVpXUXNJR1oxYm1OMGFXOXVLSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQWdJR1Z1ZFcxbGNtRjBiM0l1WDNObGRIUnNaV1JCZENoc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSR1ZVeEdTVXhNUlVRc0lHa3NJSFpoYkhWbEtUdGNiaUFnSUNBZ0lIMHNJR1oxYm1OMGFXOXVLSEpsWVhOdmJpa2dlMXh1SUNBZ0lDQWdJQ0JsYm5WdFpYSmhkRzl5TGw5elpYUjBiR1ZrUVhRb2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1VrVktSVU5VUlVRc0lHa3NJSEpsWVhOdmJpazdYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlPMXh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkdGc2JDUWtZV3hzS0dWdWRISnBaWE1wSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJ1WlhjZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdWdWRXMWxjbUYwYjNJa0pHUmxabUYxYkhRb2RHaHBjeXdnWlc1MGNtbGxjeWt1Y0hKdmJXbHpaVHRjYmlBZ0lDQjlYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpHRnNiQ1FrWkdWbVlYVnNkQ0E5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKR0ZzYkNRa1lXeHNPMXh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkhKaFkyVWtKSEpoWTJVb1pXNTBjbWxsY3lrZ2UxeHVJQ0FnSUNBZ0x5cHFjMmhwYm5RZ2RtRnNhV1IwYUdsek9uUnlkV1VnS2k5Y2JpQWdJQ0FnSUhaaGNpQkRiMjV6ZEhKMVkzUnZjaUE5SUhSb2FYTTdYRzVjYmlBZ0lDQWdJSFpoY2lCd2NtOXRhWE5sSUQwZ2JtVjNJRU52Ym5OMGNuVmpkRzl5S0d4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkc1dmIzQXBPMXh1WEc0Z0lDQWdJQ0JwWmlBb0lXeHBZaVJsY3pZa2NISnZiV2x6WlNSMWRHbHNjeVFrYVhOQmNuSmhlU2hsYm5SeWFXVnpLU2tnZTF4dUlDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSeVpXcGxZM1FvY0hKdmJXbHpaU3dnYm1WM0lGUjVjR1ZGY25KdmNpZ25XVzkxSUcxMWMzUWdjR0Z6Y3lCaGJpQmhjbkpoZVNCMGJ5QnlZV05sTGljcEtUdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIQnliMjFwYzJVN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lIWmhjaUJzWlc1bmRHZ2dQU0JsYm5SeWFXVnpMbXhsYm1kMGFEdGNibHh1SUNBZ0lDQWdablZ1WTNScGIyNGdiMjVHZFd4bWFXeHNiV1Z1ZENoMllXeDFaU2tnZTF4dUlDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSeVpYTnZiSFpsS0hCeWIyMXBjMlVzSUhaaGJIVmxLVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnWm5WdVkzUnBiMjRnYjI1U1pXcGxZM1JwYjI0b2NtVmhjMjl1S1NCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pISmxhbVZqZENod2NtOXRhWE5sTENCeVpXRnpiMjRwTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnY0hKdmJXbHpaUzVmYzNSaGRHVWdQVDA5SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkZCRlRrUkpUa2NnSmlZZ2FTQThJR3hsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pITjFZbk5qY21saVpTaERiMjV6ZEhKMVkzUnZjaTV5WlhOdmJIWmxLR1Z1ZEhKcFpYTmJhVjBwTENCMWJtUmxabWx1WldRc0lHOXVSblZzWm1sc2JHMWxiblFzSUc5dVVtVnFaV04wYVc5dUtUdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdjbVYwZFhKdUlIQnliMjFwYzJVN1hHNGdJQ0FnZlZ4dUlDQWdJSFpoY2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrY0hKdmJXbHpaU1J5WVdObEpDUmtaV1poZFd4MElEMGdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa2NtRmpaU1FrY21GalpUdGNiaUFnSUNCbWRXNWpkR2x2YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrY0hKdmJXbHpaU1J5WlhOdmJIWmxKQ1J5WlhOdmJIWmxLRzlpYW1WamRDa2dlMXh1SUNBZ0lDQWdMeXBxYzJocGJuUWdkbUZzYVdSMGFHbHpPblJ5ZFdVZ0tpOWNiaUFnSUNBZ0lIWmhjaUJEYjI1emRISjFZM1J2Y2lBOUlIUm9hWE03WEc1Y2JpQWdJQ0FnSUdsbUlDaHZZbXBsWTNRZ0ppWWdkSGx3Wlc5bUlHOWlhbVZqZENBOVBUMGdKMjlpYW1WamRDY2dKaVlnYjJKcVpXTjBMbU52Ym5OMGNuVmpkRzl5SUQwOVBTQkRiMjV6ZEhKMVkzUnZjaWtnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYjJKcVpXTjBPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0IyWVhJZ2NISnZiV2x6WlNBOUlHNWxkeUJEYjI1emRISjFZM1J2Y2loc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSdWIyOXdLVHRjYmlBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSEpsYzI5c2RtVW9jSEp2YldselpTd2diMkpxWldOMEtUdGNiaUFnSUNBZ0lISmxkSFZ5YmlCd2NtOXRhWE5sTzF4dUlDQWdJSDFjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtjbVZ6YjJ4MlpTUWtaR1ZtWVhWc2RDQTlJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpISmxjMjlzZG1Va0pISmxjMjlzZG1VN1hHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtjbVZxWldOMEpDUnlaV3BsWTNRb2NtVmhjMjl1S1NCN1hHNGdJQ0FnSUNBdkttcHphR2x1ZENCMllXeHBaSFJvYVhNNmRISjFaU0FxTDF4dUlDQWdJQ0FnZG1GeUlFTnZibk4wY25WamRHOXlJRDBnZEdocGN6dGNiaUFnSUNBZ0lIWmhjaUJ3Y205dGFYTmxJRDBnYm1WM0lFTnZibk4wY25WamRHOXlLR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRzV2YjNBcE8xeHVJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NtVnFaV04wS0hCeWIyMXBjMlVzSUhKbFlYTnZiaWs3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdjSEp2YldselpUdGNiaUFnSUNCOVhHNGdJQ0FnZG1GeUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkhKbGFtVmpkQ1FrWkdWbVlYVnNkQ0E5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKSEpsYW1WamRDUWtjbVZxWldOME8xeHVYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpDUmpiM1Z1ZEdWeUlEMGdNRHRjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpDUnVaV1ZrYzFKbGMyOXNkbVZ5S0NrZ2UxeHVJQ0FnSUNBZ2RHaHliM2NnYm1WM0lGUjVjR1ZGY25KdmNpZ25XVzkxSUcxMWMzUWdjR0Z6Y3lCaElISmxjMjlzZG1WeUlHWjFibU4wYVc5dUlHRnpJSFJvWlNCbWFYSnpkQ0JoY21kMWJXVnVkQ0IwYnlCMGFHVWdjSEp2YldselpTQmpiMjV6ZEhKMVkzUnZjaWNwTzF4dUlDQWdJSDFjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpDUnVaV1ZrYzA1bGR5Z3BJSHRjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJVZVhCbFJYSnliM0lvWENKR1lXbHNaV1FnZEc4Z1kyOXVjM1J5ZFdOMElDZFFjbTl0YVhObEp6b2dVR3hsWVhObElIVnpaU0IwYUdVZ0oyNWxkeWNnYjNCbGNtRjBiM0lzSUhSb2FYTWdiMkpxWldOMElHTnZibk4wY25WamRHOXlJR05oYm01dmRDQmlaU0JqWVd4c1pXUWdZWE1nWVNCbWRXNWpkR2x2Ymk1Y0lpazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpDUmtaV1poZFd4MElEMGdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa0pGQnliMjFwYzJVN1hHNGdJQ0FnTHlvcVhHNGdJQ0FnSUNCUWNtOXRhWE5sSUc5aWFtVmpkSE1nY21Wd2NtVnpaVzUwSUhSb1pTQmxkbVZ1ZEhWaGJDQnlaWE4xYkhRZ2IyWWdZVzRnWVhONWJtTm9jbTl1YjNWeklHOXdaWEpoZEdsdmJpNGdWR2hsWEc0Z0lDQWdJQ0J3Y21sdFlYSjVJSGRoZVNCdlppQnBiblJsY21GamRHbHVaeUIzYVhSb0lHRWdjSEp2YldselpTQnBjeUIwYUhKdmRXZG9JR2wwY3lCZ2RHaGxibUFnYldWMGFHOWtMQ0IzYUdsamFGeHVJQ0FnSUNBZ2NtVm5hWE4wWlhKeklHTmhiR3hpWVdOcmN5QjBieUJ5WldObGFYWmxJR1ZwZEdobGNpQmhJSEJ5YjIxcGMyVW5jeUJsZG1WdWRIVmhiQ0IyWVd4MVpTQnZjaUIwYUdVZ2NtVmhjMjl1WEc0Z0lDQWdJQ0IzYUhrZ2RHaGxJSEJ5YjIxcGMyVWdZMkZ1Ym05MElHSmxJR1oxYkdacGJHeGxaQzVjYmx4dUlDQWdJQ0FnVkdWeWJXbHViMnh2WjNsY2JpQWdJQ0FnSUMwdExTMHRMUzB0TFMwdFhHNWNiaUFnSUNBZ0lDMGdZSEJ5YjIxcGMyVmdJR2x6SUdGdUlHOWlhbVZqZENCdmNpQm1kVzVqZEdsdmJpQjNhWFJvSUdFZ1lIUm9aVzVnSUcxbGRHaHZaQ0IzYUc5elpTQmlaV2hoZG1sdmNpQmpiMjVtYjNKdGN5QjBieUIwYUdseklITndaV05wWm1sallYUnBiMjR1WEc0Z0lDQWdJQ0F0SUdCMGFHVnVZV0pzWldBZ2FYTWdZVzRnYjJKcVpXTjBJRzl5SUdaMWJtTjBhVzl1SUhSb1lYUWdaR1ZtYVc1bGN5QmhJR0IwYUdWdVlDQnRaWFJvYjJRdVhHNGdJQ0FnSUNBdElHQjJZV3gxWldBZ2FYTWdZVzU1SUd4bFoyRnNJRXBoZG1GVFkzSnBjSFFnZG1Gc2RXVWdLR2x1WTJ4MVpHbHVaeUIxYm1SbFptbHVaV1FzSUdFZ2RHaGxibUZpYkdVc0lHOXlJR0VnY0hKdmJXbHpaU2t1WEc0Z0lDQWdJQ0F0SUdCbGVHTmxjSFJwYjI1Z0lHbHpJR0VnZG1Gc2RXVWdkR2hoZENCcGN5QjBhSEp2ZDI0Z2RYTnBibWNnZEdobElIUm9jbTkzSUhOMFlYUmxiV1Z1ZEM1Y2JpQWdJQ0FnSUMwZ1lISmxZWE52Ym1BZ2FYTWdZU0IyWVd4MVpTQjBhR0YwSUdsdVpHbGpZWFJsY3lCM2FIa2dZU0J3Y205dGFYTmxJSGRoY3lCeVpXcGxZM1JsWkM1Y2JpQWdJQ0FnSUMwZ1lITmxkSFJzWldSZ0lIUm9aU0JtYVc1aGJDQnlaWE4wYVc1bklITjBZWFJsSUc5bUlHRWdjSEp2YldselpTd2dablZzWm1sc2JHVmtJRzl5SUhKbGFtVmpkR1ZrTGx4dVhHNGdJQ0FnSUNCQklIQnliMjFwYzJVZ1kyRnVJR0psSUdsdUlHOXVaU0J2WmlCMGFISmxaU0J6ZEdGMFpYTTZJSEJsYm1ScGJtY3NJR1oxYkdacGJHeGxaQ3dnYjNJZ2NtVnFaV04wWldRdVhHNWNiaUFnSUNBZ0lGQnliMjFwYzJWeklIUm9ZWFFnWVhKbElHWjFiR1pwYkd4bFpDQm9ZWFpsSUdFZ1puVnNabWxzYkcxbGJuUWdkbUZzZFdVZ1lXNWtJR0Z5WlNCcGJpQjBhR1VnWm5Wc1ptbHNiR1ZrWEc0Z0lDQWdJQ0J6ZEdGMFpTNGdJRkJ5YjIxcGMyVnpJSFJvWVhRZ1lYSmxJSEpsYW1WamRHVmtJR2hoZG1VZ1lTQnlaV3BsWTNScGIyNGdjbVZoYzI5dUlHRnVaQ0JoY21VZ2FXNGdkR2hsWEc0Z0lDQWdJQ0J5WldwbFkzUmxaQ0J6ZEdGMFpTNGdJRUVnWm5Wc1ptbHNiRzFsYm5RZ2RtRnNkV1VnYVhNZ2JtVjJaWElnWVNCMGFHVnVZV0pzWlM1Y2JseHVJQ0FnSUNBZ1VISnZiV2x6WlhNZ1kyRnVJR0ZzYzI4Z1ltVWdjMkZwWkNCMGJ5QXFjbVZ6YjJ4MlpTb2dZU0IyWVd4MVpTNGdJRWxtSUhSb2FYTWdkbUZzZFdVZ2FYTWdZV3h6YnlCaFhHNGdJQ0FnSUNCd2NtOXRhWE5sTENCMGFHVnVJSFJvWlNCdmNtbG5hVzVoYkNCd2NtOXRhWE5sSjNNZ2MyVjBkR3hsWkNCemRHRjBaU0IzYVd4c0lHMWhkR05vSUhSb1pTQjJZV3gxWlNkelhHNGdJQ0FnSUNCelpYUjBiR1ZrSUhOMFlYUmxMaUFnVTI4Z1lTQndjbTl0YVhObElIUm9ZWFFnS25KbGMyOXNkbVZ6S2lCaElIQnliMjFwYzJVZ2RHaGhkQ0J5WldwbFkzUnpJSGRwYkd4Y2JpQWdJQ0FnSUdsMGMyVnNaaUJ5WldwbFkzUXNJR0Z1WkNCaElIQnliMjFwYzJVZ2RHaGhkQ0FxY21WemIyeDJaWE1xSUdFZ2NISnZiV2x6WlNCMGFHRjBJR1oxYkdacGJHeHpJSGRwYkd4Y2JpQWdJQ0FnSUdsMGMyVnNaaUJtZFd4bWFXeHNMbHh1WEc1Y2JpQWdJQ0FnSUVKaGMybGpJRlZ6WVdkbE9seHVJQ0FnSUNBZ0xTMHRMUzB0TFMwdExTMHRYRzVjYmlBZ0lDQWdJR0JnWUdwelhHNGdJQ0FnSUNCMllYSWdjSEp2YldselpTQTlJRzVsZHlCUWNtOXRhWE5sS0daMWJtTjBhVzl1S0hKbGMyOXNkbVVzSUhKbGFtVmpkQ2tnZTF4dUlDQWdJQ0FnSUNBdkx5QnZiaUJ6ZFdOalpYTnpYRzRnSUNBZ0lDQWdJSEpsYzI5c2RtVW9kbUZzZFdVcE8xeHVYRzRnSUNBZ0lDQWdJQzh2SUc5dUlHWmhhV3gxY21WY2JpQWdJQ0FnSUNBZ2NtVnFaV04wS0hKbFlYTnZiaWs3WEc0Z0lDQWdJQ0I5S1R0Y2JseHVJQ0FnSUNBZ2NISnZiV2x6WlM1MGFHVnVLR1oxYm1OMGFXOXVLSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQWdJQzh2SUc5dUlHWjFiR1pwYkd4dFpXNTBYRzRnSUNBZ0lDQjlMQ0JtZFc1amRHbHZiaWh5WldGemIyNHBJSHRjYmlBZ0lDQWdJQ0FnTHk4Z2IyNGdjbVZxWldOMGFXOXVYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJR0JnWUZ4dVhHNGdJQ0FnSUNCQlpIWmhibU5sWkNCVmMyRm5aVHBjYmlBZ0lDQWdJQzB0TFMwdExTMHRMUzB0TFMwdExWeHVYRzRnSUNBZ0lDQlFjbTl0YVhObGN5QnphR2x1WlNCM2FHVnVJR0ZpYzNSeVlXTjBhVzVuSUdGM1lYa2dZWE41Ym1Ob2NtOXViM1Z6SUdsdWRHVnlZV04wYVc5dWN5QnpkV05vSUdGelhHNGdJQ0FnSUNCZ1dFMU1TSFIwY0ZKbGNYVmxjM1JnY3k1Y2JseHVJQ0FnSUNBZ1lHQmdhbk5jYmlBZ0lDQWdJR1oxYm1OMGFXOXVJR2RsZEVwVFQwNG9kWEpzS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCdVpYY2dVSEp2YldselpTaG1kVzVqZEdsdmJpaHlaWE52YkhabExDQnlaV3BsWTNRcGUxeHVJQ0FnSUNBZ0lDQWdJSFpoY2lCNGFISWdQU0J1WlhjZ1dFMU1TSFIwY0ZKbGNYVmxjM1FvS1R0Y2JseHVJQ0FnSUNBZ0lDQWdJSGhvY2k1dmNHVnVLQ2RIUlZRbkxDQjFjbXdwTzF4dUlDQWdJQ0FnSUNBZ0lIaG9jaTV2Ym5KbFlXUjVjM1JoZEdWamFHRnVaMlVnUFNCb1lXNWtiR1Z5TzF4dUlDQWdJQ0FnSUNBZ0lIaG9jaTV5WlhOd2IyNXpaVlI1Y0dVZ1BTQW5hbk52YmljN1hHNGdJQ0FnSUNBZ0lDQWdlR2h5TG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSjBGalkyVndkQ2NzSUNkaGNIQnNhV05oZEdsdmJpOXFjMjl1SnlrN1hHNGdJQ0FnSUNBZ0lDQWdlR2h5TG5ObGJtUW9LVHRjYmx4dUlDQWdJQ0FnSUNBZ0lHWjFibU4wYVc5dUlHaGhibVJzWlhJb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1eVpXRmtlVk4wWVhSbElEMDlQU0IwYUdsekxrUlBUa1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YzNSaGRIVnpJRDA5UFNBeU1EQXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOdmJIWmxLSFJvYVhNdWNtVnpjRzl1YzJVcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGFtVmpkQ2h1WlhjZ1JYSnliM0lvSjJkbGRFcFRUMDQ2SUdBbklDc2dkWEpzSUNzZ0oyQWdabUZwYkdWa0lIZHBkR2dnYzNSaGRIVnpPaUJiSnlBcklIUm9hWE11YzNSaGRIVnpJQ3NnSjEwbktTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQjlPMXh1SUNBZ0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ1oyVjBTbE5QVGlnbkwzQnZjM1J6TG1wemIyNG5LUzUwYUdWdUtHWjFibU4wYVc5dUtHcHpiMjRwSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdiMjRnWm5Wc1ptbHNiRzFsYm5SY2JpQWdJQ0FnSUgwc0lHWjFibU4wYVc5dUtISmxZWE52YmlrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJ2YmlCeVpXcGxZM1JwYjI1Y2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ1lHQmdYRzVjYmlBZ0lDQWdJRlZ1YkdsclpTQmpZV3hzWW1GamEzTXNJSEJ5YjIxcGMyVnpJR0Z5WlNCbmNtVmhkQ0JqYjIxd2IzTmhZbXhsSUhCeWFXMXBkR2wyWlhNdVhHNWNiaUFnSUNBZ0lHQmdZR3B6WEc0Z0lDQWdJQ0JRY205dGFYTmxMbUZzYkNoYlhHNGdJQ0FnSUNBZ0lHZGxkRXBUVDA0b0p5OXdiM04wY3ljcExGeHVJQ0FnSUNBZ0lDQm5aWFJLVTA5T0tDY3ZZMjl0YldWdWRITW5LVnh1SUNBZ0lDQWdYU2t1ZEdobGJpaG1kVzVqZEdsdmJpaDJZV3gxWlhNcGUxeHVJQ0FnSUNBZ0lDQjJZV3gxWlhOYk1GMGdMeThnUFQ0Z2NHOXpkSE5LVTA5T1hHNGdJQ0FnSUNBZ0lIWmhiSFZsYzFzeFhTQXZMeUE5UGlCamIyMXRaVzUwYzBwVFQwNWNibHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkbUZzZFdWek8xeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQmdZR0JjYmx4dUlDQWdJQ0FnUUdOc1lYTnpJRkJ5YjIxcGMyVmNiaUFnSUNBZ0lFQndZWEpoYlNCN1puVnVZM1JwYjI1OUlISmxjMjlzZG1WeVhHNGdJQ0FnSUNCVmMyVm1kV3dnWm05eUlIUnZiMnhwYm1jdVhHNGdJQ0FnSUNCQVkyOXVjM1J5ZFdOMGIzSmNiaUFnSUNBcUwxeHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKQ1JRY205dGFYTmxLSEpsYzI5c2RtVnlLU0I3WEc0Z0lDQWdJQ0IwYUdsekxsOXBaQ0E5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKQ1JqYjNWdWRHVnlLeXM3WEc0Z0lDQWdJQ0IwYUdsekxsOXpkR0YwWlNBOUlIVnVaR1ZtYVc1bFpEdGNiaUFnSUNBZ0lIUm9hWE11WDNKbGMzVnNkQ0E5SUhWdVpHVm1hVzVsWkR0Y2JpQWdJQ0FnSUhSb2FYTXVYM04xWW5OamNtbGlaWEp6SUQwZ1cxMDdYRzVjYmlBZ0lDQWdJR2xtSUNoc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSdWIyOXdJQ0U5UFNCeVpYTnZiSFpsY2lrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvSVd4cFlpUmxjellrY0hKdmJXbHpaU1IxZEdsc2N5UWthWE5HZFc1amRHbHZiaWh5WlhOdmJIWmxjaWtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa2NISnZiV2x6WlNRa2JtVmxaSE5TWlhOdmJIWmxjaWdwTzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdhV1lnS0NFb2RHaHBjeUJwYm5OMFlXNWpaVzltSUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKQ1JRY205dGFYTmxLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkNSdVpXVmtjMDVsZHlncE8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrYVc1cGRHbGhiR2w2WlZCeWIyMXBjMlVvZEdocGN5d2djbVZ6YjJ4MlpYSXBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkNSUWNtOXRhWE5sTG1Gc2JDQTlJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpHRnNiQ1FrWkdWbVlYVnNkRHRjYmlBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa2NISnZiV2x6WlNRa1VISnZiV2x6WlM1eVlXTmxJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtjbUZqWlNRa1pHVm1ZWFZzZER0Y2JpQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtjSEp2YldselpTUWtVSEp2YldselpTNXlaWE52YkhabElEMGdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa2NtVnpiMngyWlNRa1pHVm1ZWFZzZER0Y2JpQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtjSEp2YldselpTUWtVSEp2YldselpTNXlaV3BsWTNRZ1BTQnNhV0lrWlhNMkpIQnliMjFwYzJVa2NISnZiV2x6WlNSeVpXcGxZM1FrSkdSbFptRjFiSFE3WEc0Z0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa0pGQnliMjFwYzJVdVgzTmxkRk5qYUdWa2RXeGxjaUE5SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnpaWFJUWTJobFpIVnNaWEk3WEc0Z0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa0pGQnliMjFwYzJVdVgzTmxkRUZ6WVhBZ1BTQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYzJWMFFYTmhjRHRjYmlBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa2NISnZiV2x6WlNRa1VISnZiV2x6WlM1ZllYTmhjQ0E5SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUmhjMkZ3TzF4dVhHNGdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtKRkJ5YjIxcGMyVXVjSEp2ZEc5MGVYQmxJRDBnZTF4dUlDQWdJQ0FnWTI5dWMzUnlkV04wYjNJNklHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkNSUWNtOXRhWE5sTEZ4dVhHNGdJQ0FnTHlvcVhHNGdJQ0FnSUNCVWFHVWdjSEpwYldGeWVTQjNZWGtnYjJZZ2FXNTBaWEpoWTNScGJtY2dkMmwwYUNCaElIQnliMjFwYzJVZ2FYTWdkR2h5YjNWbmFDQnBkSE1nWUhSb1pXNWdJRzFsZEdodlpDeGNiaUFnSUNBZ0lIZG9hV05vSUhKbFoybHpkR1Z5Y3lCallXeHNZbUZqYTNNZ2RHOGdjbVZqWldsMlpTQmxhWFJvWlhJZ1lTQndjbTl0YVhObEozTWdaWFpsYm5SMVlXd2dkbUZzZFdVZ2IzSWdkR2hsWEc0Z0lDQWdJQ0J5WldGemIyNGdkMmg1SUhSb1pTQndjbTl0YVhObElHTmhibTV2ZENCaVpTQm1kV3htYVd4c1pXUXVYRzVjYmlBZ0lDQWdJR0JnWUdwelhHNGdJQ0FnSUNCbWFXNWtWWE5sY2lncExuUm9aVzRvWm5WdVkzUnBiMjRvZFhObGNpbDdYRzRnSUNBZ0lDQWdJQzh2SUhWelpYSWdhWE1nWVhaaGFXeGhZbXhsWEc0Z0lDQWdJQ0I5TENCbWRXNWpkR2x2YmloeVpXRnpiMjRwZTF4dUlDQWdJQ0FnSUNBdkx5QjFjMlZ5SUdseklIVnVZWFpoYVd4aFlteGxMQ0JoYm1RZ2VXOTFJR0Z5WlNCbmFYWmxiaUIwYUdVZ2NtVmhjMjl1SUhkb2VWeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQmdZR0JjYmx4dUlDQWdJQ0FnUTJoaGFXNXBibWRjYmlBZ0lDQWdJQzB0TFMwdExTMHRYRzVjYmlBZ0lDQWdJRlJvWlNCeVpYUjFjbTRnZG1Gc2RXVWdiMllnWUhSb1pXNWdJR2x6SUdsMGMyVnNaaUJoSUhCeWIyMXBjMlV1SUNCVWFHbHpJSE5sWTI5dVpDd2dKMlJ2ZDI1emRISmxZVzBuWEc0Z0lDQWdJQ0J3Y205dGFYTmxJR2x6SUhKbGMyOXNkbVZrSUhkcGRHZ2dkR2hsSUhKbGRIVnliaUIyWVd4MVpTQnZaaUIwYUdVZ1ptbHljM1FnY0hKdmJXbHpaU2R6SUdaMWJHWnBiR3h0Wlc1MFhHNGdJQ0FnSUNCdmNpQnlaV3BsWTNScGIyNGdhR0Z1Wkd4bGNpd2diM0lnY21WcVpXTjBaV1FnYVdZZ2RHaGxJR2hoYm1Sc1pYSWdkR2h5YjNkeklHRnVJR1Y0WTJWd2RHbHZiaTVjYmx4dUlDQWdJQ0FnWUdCZ2FuTmNiaUFnSUNBZ0lHWnBibVJWYzJWeUtDa3VkR2hsYmlobWRXNWpkR2x2YmlBb2RYTmxjaWtnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZFhObGNpNXVZVzFsTzF4dUlDQWdJQ0FnZlN3Z1puVnVZM1JwYjI0Z0tISmxZWE52YmlrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z0oyUmxabUYxYkhRZ2JtRnRaU2M3WEc0Z0lDQWdJQ0I5S1M1MGFHVnVLR1oxYm1OMGFXOXVJQ2gxYzJWeVRtRnRaU2tnZTF4dUlDQWdJQ0FnSUNBdkx5QkpaaUJnWm1sdVpGVnpaWEpnSUdaMWJHWnBiR3hsWkN3Z1lIVnpaWEpPWVcxbFlDQjNhV3hzSUdKbElIUm9aU0IxYzJWeUozTWdibUZ0WlN3Z2IzUm9aWEozYVhObElHbDBYRzRnSUNBZ0lDQWdJQzh2SUhkcGJHd2dZbVVnWUNka1pXWmhkV3gwSUc1aGJXVW5ZRnh1SUNBZ0lDQWdmU2s3WEc1Y2JpQWdJQ0FnSUdacGJtUlZjMlZ5S0NrdWRHaGxiaWhtZFc1amRHbHZiaUFvZFhObGNpa2dlMXh1SUNBZ0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9KMFp2ZFc1a0lIVnpaWElzSUdKMWRDQnpkR2xzYkNCMWJtaGhjSEI1SnlrN1hHNGdJQ0FnSUNCOUxDQm1kVzVqZEdsdmJpQW9jbVZoYzI5dUtTQjdYRzRnSUNBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpZ25ZR1pwYm1SVmMyVnlZQ0J5WldwbFkzUmxaQ0JoYm1RZ2QyVW5jbVVnZFc1b1lYQndlU2NwTzF4dUlDQWdJQ0FnZlNrdWRHaGxiaWhtZFc1amRHbHZiaUFvZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnTHk4Z2JtVjJaWElnY21WaFkyaGxaRnh1SUNBZ0lDQWdmU3dnWm5WdVkzUnBiMjRnS0hKbFlYTnZiaWtnZTF4dUlDQWdJQ0FnSUNBdkx5QnBaaUJnWm1sdVpGVnpaWEpnSUdaMWJHWnBiR3hsWkN3Z1lISmxZWE52Ym1BZ2QybHNiQ0JpWlNBblJtOTFibVFnZFhObGNpd2dZblYwSUhOMGFXeHNJSFZ1YUdGd2NIa25MbHh1SUNBZ0lDQWdJQ0F2THlCSlppQmdabWx1WkZWelpYSmdJSEpsYW1WamRHVmtMQ0JnY21WaGMyOXVZQ0IzYVd4c0lHSmxJQ2RnWm1sdVpGVnpaWEpnSUhKbGFtVmpkR1ZrSUdGdVpDQjNaU2R5WlNCMWJtaGhjSEI1Snk1Y2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ1lHQmdYRzRnSUNBZ0lDQkpaaUIwYUdVZ1pHOTNibk4wY21WaGJTQndjbTl0YVhObElHUnZaWE1nYm05MElITndaV05wWm5rZ1lTQnlaV3BsWTNScGIyNGdhR0Z1Wkd4bGNpd2djbVZxWldOMGFXOXVJSEpsWVhOdmJuTWdkMmxzYkNCaVpTQndjbTl3WVdkaGRHVmtJR1oxY25Sb1pYSWdaRzkzYm5OMGNtVmhiUzVjYmx4dUlDQWdJQ0FnWUdCZ2FuTmNiaUFnSUNBZ0lHWnBibVJWYzJWeUtDa3VkR2hsYmlobWRXNWpkR2x2YmlBb2RYTmxjaWtnZTF4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1VHVmtZV2R2WjJsallXeEZlR05sY0hScGIyNG9KMVZ3YzNSeVpXRnRJR1Z5Y205eUp5azdYRzRnSUNBZ0lDQjlLUzUwYUdWdUtHWjFibU4wYVc5dUlDaDJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJ1WlhabGNpQnlaV0ZqYUdWa1hHNGdJQ0FnSUNCOUtTNTBhR1Z1S0daMWJtTjBhVzl1SUNoMllXeDFaU2tnZTF4dUlDQWdJQ0FnSUNBdkx5QnVaWFpsY2lCeVpXRmphR1ZrWEc0Z0lDQWdJQ0I5TENCbWRXNWpkR2x2YmlBb2NtVmhjMjl1S1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRlJvWlNCZ1VHVmtaMkZuYjJOcFlXeEZlR05sY0hScGIyNWdJR2x6SUhCeWIzQmhaMkYwWldRZ1lXeHNJSFJvWlNCM1lYa2daRzkzYmlCMGJ5Qm9aWEpsWEc0Z0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUdCZ1lGeHVYRzRnSUNBZ0lDQkJjM05wYldsc1lYUnBiMjVjYmlBZ0lDQWdJQzB0TFMwdExTMHRMUzB0TFZ4dVhHNGdJQ0FnSUNCVGIyMWxkR2x0WlhNZ2RHaGxJSFpoYkhWbElIbHZkU0IzWVc1MElIUnZJSEJ5YjNCaFoyRjBaU0IwYnlCaElHUnZkMjV6ZEhKbFlXMGdjSEp2YldselpTQmpZVzRnYjI1c2VTQmlaVnh1SUNBZ0lDQWdjbVYwY21sbGRtVmtJR0Z6ZVc1amFISnZibTkxYzJ4NUxpQlVhR2x6SUdOaGJpQmlaU0JoWTJocFpYWmxaQ0JpZVNCeVpYUjFjbTVwYm1jZ1lTQndjbTl0YVhObElHbHVJSFJvWlZ4dUlDQWdJQ0FnWm5Wc1ptbHNiRzFsYm5RZ2IzSWdjbVZxWldOMGFXOXVJR2hoYm1Sc1pYSXVJRlJvWlNCa2IzZHVjM1J5WldGdElIQnliMjFwYzJVZ2QybHNiQ0IwYUdWdUlHSmxJSEJsYm1ScGJtZGNiaUFnSUNBZ0lIVnVkR2xzSUhSb1pTQnlaWFIxY201bFpDQndjbTl0YVhObElHbHpJSE5sZEhSc1pXUXVJRlJvYVhNZ2FYTWdZMkZzYkdWa0lDcGhjM05wYldsc1lYUnBiMjRxTGx4dVhHNGdJQ0FnSUNCZ1lHQnFjMXh1SUNBZ0lDQWdabWx1WkZWelpYSW9LUzUwYUdWdUtHWjFibU4wYVc5dUlDaDFjMlZ5S1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCbWFXNWtRMjl0YldWdWRITkNlVUYxZEdodmNpaDFjMlZ5S1R0Y2JpQWdJQ0FnSUgwcExuUm9aVzRvWm5WdVkzUnBiMjRnS0dOdmJXMWxiblJ6S1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRlJvWlNCMWMyVnlKM01nWTI5dGJXVnVkSE1nWVhKbElHNXZkeUJoZG1GcGJHRmliR1ZjYmlBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnWUdCZ1hHNWNiaUFnSUNBZ0lFbG1JSFJvWlNCaGMzTnBiV3hwWVhSbFpDQndjbTl0YVhObElISmxhbVZqZEhNc0lIUm9aVzRnZEdobElHUnZkMjV6ZEhKbFlXMGdjSEp2YldselpTQjNhV3hzSUdGc2MyOGdjbVZxWldOMExseHVYRzRnSUNBZ0lDQmdZR0JxYzF4dUlDQWdJQ0FnWm1sdVpGVnpaWElvS1M1MGFHVnVLR1oxYm1OMGFXOXVJQ2gxYzJWeUtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQm1hVzVrUTI5dGJXVnVkSE5DZVVGMWRHaHZjaWgxYzJWeUtUdGNiaUFnSUNBZ0lIMHBMblJvWlc0b1puVnVZM1JwYjI0Z0tHTnZiVzFsYm5SektTQjdYRzRnSUNBZ0lDQWdJQzh2SUVsbUlHQm1hVzVrUTI5dGJXVnVkSE5DZVVGMWRHaHZjbUFnWm5Wc1ptbHNiSE1zSUhkbEoyeHNJR2hoZG1VZ2RHaGxJSFpoYkhWbElHaGxjbVZjYmlBZ0lDQWdJSDBzSUdaMWJtTjBhVzl1SUNoeVpXRnpiMjRwSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdTV1lnWUdacGJtUkRiMjF0Wlc1MGMwSjVRWFYwYUc5eVlDQnlaV3BsWTNSekxDQjNaU2RzYkNCb1lYWmxJSFJvWlNCeVpXRnpiMjRnYUdWeVpWeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQmdZR0JjYmx4dUlDQWdJQ0FnVTJsdGNHeGxJRVY0WVcxd2JHVmNiaUFnSUNBZ0lDMHRMUzB0TFMwdExTMHRMUzB0WEc1Y2JpQWdJQ0FnSUZONWJtTm9jbTl1YjNWeklFVjRZVzF3YkdWY2JseHVJQ0FnSUNBZ1lHQmdhbUYyWVhOamNtbHdkRnh1SUNBZ0lDQWdkbUZ5SUhKbGMzVnNkRHRjYmx4dUlDQWdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdabWx1WkZKbGMzVnNkQ2dwTzF4dUlDQWdJQ0FnSUNBdkx5QnpkV05qWlhOelhHNGdJQ0FnSUNCOUlHTmhkR05vS0hKbFlYTnZiaWtnZTF4dUlDQWdJQ0FnSUNBdkx5Qm1ZV2xzZFhKbFhHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCZ1lHQmNibHh1SUNBZ0lDQWdSWEp5WW1GamF5QkZlR0Z0Y0d4bFhHNWNiaUFnSUNBZ0lHQmdZR3B6WEc0Z0lDQWdJQ0JtYVc1a1VtVnpkV3gwS0daMWJtTjBhVzl1S0hKbGMzVnNkQ3dnWlhKeUtYdGNiaUFnSUNBZ0lDQWdhV1lnS0dWeWNpa2dlMXh1SUNBZ0lDQWdJQ0FnSUM4dklHWmhhV3gxY21WY2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQXZMeUJ6ZFdOalpYTnpYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnWUdCZ1hHNWNiaUFnSUNBZ0lGQnliMjFwYzJVZ1JYaGhiWEJzWlR0Y2JseHVJQ0FnSUNBZ1lHQmdhbUYyWVhOamNtbHdkRnh1SUNBZ0lDQWdabWx1WkZKbGMzVnNkQ2dwTG5Sb1pXNG9ablZ1WTNScGIyNG9jbVZ6ZFd4MEtYdGNiaUFnSUNBZ0lDQWdMeThnYzNWalkyVnpjMXh1SUNBZ0lDQWdmU3dnWm5WdVkzUnBiMjRvY21WaGMyOXVLWHRjYmlBZ0lDQWdJQ0FnTHk4Z1ptRnBiSFZ5WlZ4dUlDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNCZ1lHQmNibHh1SUNBZ0lDQWdRV1IyWVc1alpXUWdSWGhoYlhCc1pWeHVJQ0FnSUNBZ0xTMHRMUzB0TFMwdExTMHRMUzFjYmx4dUlDQWdJQ0FnVTNsdVkyaHliMjV2ZFhNZ1JYaGhiWEJzWlZ4dVhHNGdJQ0FnSUNCZ1lHQnFZWFpoYzJOeWFYQjBYRzRnSUNBZ0lDQjJZWElnWVhWMGFHOXlMQ0JpYjI5cmN6dGNibHh1SUNBZ0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUNBZ1lYVjBhRzl5SUQwZ1ptbHVaRUYxZEdodmNpZ3BPMXh1SUNBZ0lDQWdJQ0JpYjI5cmN5QWdQU0JtYVc1a1FtOXZhM05DZVVGMWRHaHZjaWhoZFhSb2IzSXBPMXh1SUNBZ0lDQWdJQ0F2THlCemRXTmpaWE56WEc0Z0lDQWdJQ0I5SUdOaGRHTm9LSEpsWVhOdmJpa2dlMXh1SUNBZ0lDQWdJQ0F2THlCbVlXbHNkWEpsWEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JnWUdCY2JseHVJQ0FnSUNBZ1JYSnlZbUZqYXlCRmVHRnRjR3hsWEc1Y2JpQWdJQ0FnSUdCZ1lHcHpYRzVjYmlBZ0lDQWdJR1oxYm1OMGFXOXVJR1p2ZFc1a1FtOXZhM01vWW05dmEzTXBJSHRjYmx4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCbWRXNWpkR2x2YmlCbVlXbHNkWEpsS0hKbFlYTnZiaWtnZTF4dVhHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lHWnBibVJCZFhSb2IzSW9ablZ1WTNScGIyNG9ZWFYwYUc5eUxDQmxjbklwZTF4dUlDQWdJQ0FnSUNCcFppQW9aWEp5S1NCN1hHNGdJQ0FnSUNBZ0lDQWdabUZwYkhWeVpTaGxjbklwTzF4dUlDQWdJQ0FnSUNBZ0lDOHZJR1poYVd4MWNtVmNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWm1sdVpFSnZiMjlyYzBKNVFYVjBhRzl5S0dGMWRHaHZjaXdnWm5WdVkzUnBiMjRvWW05dmEzTXNJR1Z5Y2lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aWEp5S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptRnBiSFZ5WlNobGNuSXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnllU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWIzVnVaRUp2YjJ0ektHSnZiMnR6S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHTmhkR05vS0hKbFlYTnZiaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptRnBiSFZ5WlNoeVpXRnpiMjRwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZTQmpZWFJqYUNobGNuSnZjaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdabUZwYkhWeVpTaGxjbklwTzF4dUlDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0F2THlCemRXTmpaWE56WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ1lHQmdYRzVjYmlBZ0lDQWdJRkJ5YjIxcGMyVWdSWGhoYlhCc1pUdGNibHh1SUNBZ0lDQWdZR0JnYW1GMllYTmpjbWx3ZEZ4dUlDQWdJQ0FnWm1sdVpFRjFkR2h2Y2lncExseHVJQ0FnSUNBZ0lDQjBhR1Z1S0dacGJtUkNiMjlyYzBKNVFYVjBhRzl5S1M1Y2JpQWdJQ0FnSUNBZ2RHaGxiaWhtZFc1amRHbHZiaWhpYjI5cmN5bDdYRzRnSUNBZ0lDQWdJQ0FnTHk4Z1ptOTFibVFnWW05dmEzTmNiaUFnSUNBZ0lIMHBMbU5oZEdOb0tHWjFibU4wYVc5dUtISmxZWE52YmlsN1hHNGdJQ0FnSUNBZ0lDOHZJSE52YldWMGFHbHVaeUIzWlc1MElIZHliMjVuWEc0Z0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUdCZ1lGeHVYRzRnSUNBZ0lDQkFiV1YwYUc5a0lIUm9aVzVjYmlBZ0lDQWdJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJRzl1Um5Wc1ptbHNiR1ZrWEc0Z0lDQWdJQ0JBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0J2YmxKbGFtVmpkR1ZrWEc0Z0lDQWdJQ0JWYzJWbWRXd2dabTl5SUhSdmIyeHBibWN1WEc0Z0lDQWdJQ0JBY21WMGRYSnVJSHRRY205dGFYTmxmVnh1SUNBZ0lDb3ZYRzRnSUNBZ0lDQjBhR1Z1T2lCbWRXNWpkR2x2YmlodmJrWjFiR1pwYkd4dFpXNTBMQ0J2YmxKbGFtVmpkR2x2YmlrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnY0dGeVpXNTBJRDBnZEdocGN6dGNiaUFnSUNBZ0lDQWdkbUZ5SUhOMFlYUmxJRDBnY0dGeVpXNTBMbDl6ZEdGMFpUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb2MzUmhkR1VnUFQwOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pFWlZURVpKVEV4RlJDQW1KaUFoYjI1R2RXeG1hV3hzYldWdWRDQjhmQ0J6ZEdGMFpTQTlQVDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrVWtWS1JVTlVSVVFnSmlZZ0lXOXVVbVZxWldOMGFXOXVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTTdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCMllYSWdZMmhwYkdRZ1BTQnVaWGNnZEdocGN5NWpiMjV6ZEhKMVkzUnZjaWhzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J1YjI5d0tUdGNiaUFnSUNBZ0lDQWdkbUZ5SUhKbGMzVnNkQ0E5SUhCaGNtVnVkQzVmY21WemRXeDBPMXh1WEc0Z0lDQWdJQ0FnSUdsbUlDaHpkR0YwWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJSFpoY2lCallXeHNZbUZqYXlBOUlHRnlaM1Z0Wlc1MGMxdHpkR0YwWlNBdElERmRPMXh1SUNBZ0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUmhjMkZ3S0daMWJtTjBhVzl1S0NsN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JwYm5admEyVkRZV3hzWW1GamF5aHpkR0YwWlN3Z1kyaHBiR1FzSUdOaGJHeGlZV05yTENCeVpYTjFiSFFwTzF4dUlDQWdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhOMVluTmpjbWxpWlNod1lYSmxiblFzSUdOb2FXeGtMQ0J2YmtaMWJHWnBiR3h0Wlc1MExDQnZibEpsYW1WamRHbHZiaWs3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1kyaHBiR1E3WEc0Z0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnTHlvcVhHNGdJQ0FnSUNCZ1kyRjBZMmhnSUdseklITnBiWEJzZVNCemRXZGhjaUJtYjNJZ1lIUm9aVzRvZFc1a1pXWnBibVZrTENCdmJsSmxhbVZqZEdsdmJpbGdJSGRvYVdOb0lHMWhhMlZ6SUdsMElIUm9aU0J6WVcxbFhHNGdJQ0FnSUNCaGN5QjBhR1VnWTJGMFkyZ2dZbXh2WTJzZ2IyWWdZU0IwY25rdlkyRjBZMmdnYzNSaGRHVnRaVzUwTGx4dVhHNGdJQ0FnSUNCZ1lHQnFjMXh1SUNBZ0lDQWdablZ1WTNScGIyNGdabWx1WkVGMWRHaHZjaWdwZTF4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjJOdmRXeGtiaWQwSUdacGJtUWdkR2hoZENCaGRYUm9iM0luS1R0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0x5OGdjM2x1WTJoeWIyNXZkWE5jYmlBZ0lDQWdJSFJ5ZVNCN1hHNGdJQ0FnSUNBZ0lHWnBibVJCZFhSb2IzSW9LVHRjYmlBZ0lDQWdJSDBnWTJGMFkyZ29jbVZoYzI5dUtTQjdYRzRnSUNBZ0lDQWdJQzh2SUhOdmJXVjBhR2x1WnlCM1pXNTBJSGR5YjI1blhHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDOHZJR0Z6ZVc1aklIZHBkR2dnY0hKdmJXbHpaWE5jYmlBZ0lDQWdJR1pwYm1SQmRYUm9iM0lvS1M1allYUmphQ2htZFc1amRHbHZiaWh5WldGemIyNHBlMXh1SUNBZ0lDQWdJQ0F2THlCemIyMWxkR2hwYm1jZ2QyVnVkQ0IzY205dVoxeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQmdZR0JjYmx4dUlDQWdJQ0FnUUcxbGRHaHZaQ0JqWVhSamFGeHVJQ0FnSUNBZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ2IyNVNaV3BsWTNScGIyNWNiaUFnSUNBZ0lGVnpaV1oxYkNCbWIzSWdkRzl2YkdsdVp5NWNiaUFnSUNBZ0lFQnlaWFIxY200Z2UxQnliMjFwYzJWOVhHNGdJQ0FnS2k5Y2JpQWdJQ0FnSUNkallYUmphQ2M2SUdaMWJtTjBhVzl1S0c5dVVtVnFaV04wYVc5dUtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5Sb1pXNG9iblZzYkN3Z2IyNVNaV3BsWTNScGIyNHBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMDdYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCdmJIbG1hV3hzSkNSd2IyeDVabWxzYkNncElIdGNiaUFnSUNBZ0lIWmhjaUJzYjJOaGJEdGNibHh1SUNBZ0lDQWdhV1lnS0hSNWNHVnZaaUJuYkc5aVlXd2dJVDA5SUNkMWJtUmxabWx1WldRbktTQjdYRzRnSUNBZ0lDQWdJQ0FnYkc5allXd2dQU0JuYkc5aVlXdzdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFI1Y0dWdlppQnpaV3htSUNFOVBTQW5kVzVrWldacGJtVmtKeWtnZTF4dUlDQWdJQ0FnSUNBZ0lHeHZZMkZzSUQwZ2MyVnNaanRjYmlBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2JHOWpZV3dnUFNCR2RXNWpkR2x2YmlnbmNtVjBkWEp1SUhSb2FYTW5LU2dwTzF4dUlDQWdJQ0FnSUNBZ0lIMGdZMkYwWTJnZ0tHVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZHdiMng1Wm1sc2JDQm1ZV2xzWldRZ1ltVmpZWFZ6WlNCbmJHOWlZV3dnYjJKcVpXTjBJR2x6SUhWdVlYWmhhV3hoWW14bElHbHVJSFJvYVhNZ1pXNTJhWEp2Ym0xbGJuUW5LVHRjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lIWmhjaUJRSUQwZ2JHOWpZV3d1VUhKdmJXbHpaVHRjYmx4dUlDQWdJQ0FnYVdZZ0tGQWdKaVlnVDJKcVpXTjBMbkJ5YjNSdmRIbHdaUzUwYjFOMGNtbHVaeTVqWVd4c0tGQXVjbVZ6YjJ4MlpTZ3BLU0E5UFQwZ0oxdHZZbXBsWTNRZ1VISnZiV2x6WlYwbklDWW1JQ0ZRTG1OaGMzUXBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JzYjJOaGJDNVFjbTl0YVhObElEMGdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa0pHUmxabUYxYkhRN1hHNGdJQ0FnZlZ4dUlDQWdJSFpoY2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrY0c5c2VXWnBiR3drSkdSbFptRjFiSFFnUFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrY0c5c2VXWnBiR3drSkhCdmJIbG1hV3hzTzF4dVhHNGdJQ0FnZG1GeUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSMWJXUWtKRVZUTmxCeWIyMXBjMlVnUFNCN1hHNGdJQ0FnSUNBblVISnZiV2x6WlNjNklHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkNSa1pXWmhkV3gwTEZ4dUlDQWdJQ0FnSjNCdmJIbG1hV3hzSnpvZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCdmJIbG1hV3hzSkNSa1pXWmhkV3gwWEc0Z0lDQWdmVHRjYmx4dUlDQWdJQzhxSUdkc2IySmhiQ0JrWldacGJtVTZkSEoxWlNCdGIyUjFiR1U2ZEhKMVpTQjNhVzVrYjNjNklIUnlkV1VnS2k5Y2JpQWdJQ0JwWmlBb2RIbHdaVzltSUdSbFptbHVaU0E5UFQwZ0oyWjFibU4wYVc5dUp5QW1KaUJrWldacGJtVmJKMkZ0WkNkZEtTQjdYRzRnSUNBZ0lDQmtaV1pwYm1Vb1puVnVZM1JwYjI0b0tTQjdJSEpsZEhWeWJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa2RXMWtKQ1JGVXpaUWNtOXRhWE5sT3lCOUtUdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1Z2WmlCdGIyUjFiR1VnSVQwOUlDZDFibVJsWm1sdVpXUW5JQ1ltSUcxdlpIVnNaVnNuWlhod2IzSjBjeWRkS1NCN1hHNGdJQ0FnSUNCdGIyUjFiR1ZiSjJWNGNHOXlkSE1uWFNBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSMWJXUWtKRVZUTmxCeWIyMXBjMlU3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2gwZVhCbGIyWWdkR2hwY3lBaFBUMGdKM1Z1WkdWbWFXNWxaQ2NwSUh0Y2JpQWdJQ0FnSUhSb2FYTmJKMFZUTmxCeWIyMXBjMlVuWFNBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSMWJXUWtKRVZUTmxCeWIyMXBjMlU3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpIQnZiSGxtYVd4c0pDUmtaV1poZFd4MEtDazdYRzU5S1M1allXeHNLSFJvYVhNcE8xeHVYRzRpWFgwPSIsInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnaXMtZnVuY3Rpb24nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2hcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuXG5mdW5jdGlvbiBmb3JFYWNoKGxpc3QsIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGl0ZXJhdG9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpdGVyYXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKVxuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykge1xuICAgICAgICBjb250ZXh0ID0gdGhpc1xuICAgIH1cbiAgICBcbiAgICBpZiAodG9TdHJpbmcuY2FsbChsaXN0KSA9PT0gJ1tvYmplY3QgQXJyYXldJylcbiAgICAgICAgZm9yRWFjaEFycmF5KGxpc3QsIGl0ZXJhdG9yLCBjb250ZXh0KVxuICAgIGVsc2UgaWYgKHR5cGVvZiBsaXN0ID09PSAnc3RyaW5nJylcbiAgICAgICAgZm9yRWFjaFN0cmluZyhsaXN0LCBpdGVyYXRvciwgY29udGV4dClcbiAgICBlbHNlXG4gICAgICAgIGZvckVhY2hPYmplY3QobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpXG59XG5cbmZ1bmN0aW9uIGZvckVhY2hBcnJheShhcnJheSwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksIGkpKSB7XG4gICAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIGFycmF5W2ldLCBpLCBhcnJheSlcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaFN0cmluZyhzdHJpbmcsIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAvLyBubyBzdWNoIHRoaW5nIGFzIGEgc3BhcnNlIHN0cmluZy5cbiAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBzdHJpbmcuY2hhckF0KGkpLCBpLCBzdHJpbmcpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoT2JqZWN0KG9iamVjdCwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICBmb3IgKHZhciBrIGluIG9iamVjdCkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGspKSB7XG4gICAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9iamVjdFtrXSwgaywgb2JqZWN0KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiKGZ1bmN0aW9uIChnbG9iYWwpe1xudmFyIHdpbjtcblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW4gPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW4gPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiKXtcbiAgICB3aW4gPSBzZWxmO1xufSBlbHNlIHtcbiAgICB3aW4gPSB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3aW47XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMMjV2WkdWZmJXOWtkV3hsY3k5bmJHOWlZV3d2ZDJsdVpHOTNMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUk3UVVGQlFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJJaXdpWm1sc1pTSTZJbWRsYm1WeVlYUmxaQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKMllYSWdkMmx1TzF4dVhHNXBaaUFvZEhsd1pXOW1JSGRwYm1SdmR5QWhQVDBnWENKMWJtUmxabWx1WldSY0lpa2dlMXh1SUNBZ0lIZHBiaUE5SUhkcGJtUnZkenRjYm4wZ1pXeHpaU0JwWmlBb2RIbHdaVzltSUdkc2IySmhiQ0FoUFQwZ1hDSjFibVJsWm1sdVpXUmNJaWtnZTF4dUlDQWdJSGRwYmlBOUlHZHNiMkpoYkR0Y2JuMGdaV3h6WlNCcFppQW9kSGx3Wlc5bUlITmxiR1lnSVQwOUlGd2lkVzVrWldacGJtVmtYQ0lwZTF4dUlDQWdJSGRwYmlBOUlITmxiR1k3WEc1OUlHVnNjMlVnZTF4dUlDQWdJSGRwYmlBOUlIdDlPMXh1ZlZ4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlIZHBianRjYmlKZGZRPT0iLCJtb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb25cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmbikge1xuICB2YXIgc3RyaW5nID0gdG9TdHJpbmcuY2FsbChmbilcbiAgcmV0dXJuIHN0cmluZyA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJyB8fFxuICAgICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgc3RyaW5nICE9PSAnW29iamVjdCBSZWdFeHBdJykgfHxcbiAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgLy8gSUU4IGFuZCBiZWxvd1xuICAgICAoZm4gPT09IHdpbmRvdy5zZXRUaW1lb3V0IHx8XG4gICAgICBmbiA9PT0gd2luZG93LmFsZXJ0IHx8XG4gICAgICBmbiA9PT0gd2luZG93LmNvbmZpcm0gfHxcbiAgICAgIGZuID09PSB3aW5kb3cucHJvbXB0KSlcbn07XG4iLCJ2YXIgdHJpbSA9IHJlcXVpcmUoJ3RyaW0nKVxuICAsIGZvckVhY2ggPSByZXF1aXJlKCdmb3ItZWFjaCcpXG4gICwgaXNBcnJheSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaGVhZGVycykge1xuICBpZiAoIWhlYWRlcnMpXG4gICAgcmV0dXJuIHt9XG5cbiAgdmFyIHJlc3VsdCA9IHt9XG5cbiAgZm9yRWFjaChcbiAgICAgIHRyaW0oaGVhZGVycykuc3BsaXQoJ1xcbicpXG4gICAgLCBmdW5jdGlvbiAocm93KSB7XG4gICAgICAgIHZhciBpbmRleCA9IHJvdy5pbmRleE9mKCc6JylcbiAgICAgICAgICAsIGtleSA9IHRyaW0ocm93LnNsaWNlKDAsIGluZGV4KSkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICwgdmFsdWUgPSB0cmltKHJvdy5zbGljZShpbmRleCArIDEpKVxuXG4gICAgICAgIGlmICh0eXBlb2YocmVzdWx0W2tleV0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KHJlc3VsdFtrZXldKSkge1xuICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBbIHJlc3VsdFtrZXldLCB2YWx1ZSBdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgKVxuXG4gIHJldHVybiByZXN1bHRcbn0iLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIHJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCBhcnJheSB3aXRoIGRpcmVjdG9yeSBuYW1lcyB0aGVyZVxuLy8gbXVzdCBiZSBubyBzbGFzaGVzLCBlbXB0eSBlbGVtZW50cywgb3IgZGV2aWNlIG5hbWVzIChjOlxcKSBpbiB0aGUgYXJyYXlcbi8vIChzbyBhbHNvIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMgLSBpdCBkb2VzIG5vdCBkaXN0aW5ndWlzaFxuLy8gcmVsYXRpdmUgYW5kIGFic29sdXRlIHBhdGhzKVxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocGFydHMsIGFsbG93QWJvdmVSb290KSB7XG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBsYXN0ID0gcGFydHNbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBwYXJ0cy51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG52YXIgc3BsaXRQYXRoUmUgPVxuICAgIC9eKFxcLz98KShbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXlxcL10rP3wpKFxcLlteLlxcL10qfCkpKD86W1xcL10qKSQvO1xudmFyIHNwbGl0UGF0aCA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTtcbn07XG5cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICB2YXIgcGF0aCA9IChpID49IDApID8gYXJndW1lbnRzW2ldIDogcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDtcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIHJldHVybiAoKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGgpIHx8ICcuJztcbn07XG5cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIGlmICghcGF0aCAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHBhdGggPSAnLic7XG4gIH1cbiAgaWYgKHBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIHBhdGggKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmpvaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGV4cG9ydHMubm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn07XG5cblxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xuICBmcm9tID0gZXhwb3J0cy5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSBleHBvcnRzLnJlc29sdmUodG8pLnN1YnN0cigxKTtcblxuICBmdW5jdGlvbiB0cmltKGFycikge1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgaWYgKGFycltlbmRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTtcbiAgfVxuXG4gIHZhciBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcblxuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn07XG5cbmV4cG9ydHMuc2VwID0gJy8nO1xuZXhwb3J0cy5kZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydHMuZGlybmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKSxcbiAgICAgIHJvb3QgPSByZXN1bHRbMF0sXG4gICAgICBkaXIgPSByZXN1bHRbMV07XG5cbiAgaWYgKCFyb290ICYmICFkaXIpIHtcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcbiAgICByZXR1cm4gJy4nO1xuICB9XG5cbiAgaWYgKGRpcikge1xuICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gcm9vdCArIGRpcjtcbn07XG5cblxuZXhwb3J0cy5iYXNlbmFtZSA9IGZ1bmN0aW9uKHBhdGgsIGV4dCkge1xuICB2YXIgZiA9IHNwbGl0UGF0aChwYXRoKVsyXTtcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBmO1xufTtcblxuXG5leHBvcnRzLmV4dG5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBzcGxpdFBhdGgocGF0aClbM107XG59O1xuXG5mdW5jdGlvbiBmaWx0ZXIgKHhzLCBmKSB7XG4gICAgaWYgKHhzLmZpbHRlcikgcmV0dXJuIHhzLmZpbHRlcihmKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZih4c1tpXSwgaSwgeHMpKSByZXMucHVzaCh4c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8vIFN0cmluZy5wcm90b3R5cGUuc3Vic3RyIC0gbmVnYXRpdmUgaW5kZXggZG9uJ3Qgd29yayBpbiBJRThcbnZhciBzdWJzdHIgPSAnYWInLnN1YnN0cigtMSkgPT09ICdiJ1xuICAgID8gZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikgeyByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKSB9XG4gICAgOiBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gc3RyLmxlbmd0aCArIHN0YXJ0O1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKTtcbiAgICB9XG47XG5cbn0pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMMjV2WkdWZmJXOWtkV3hsY3k5d1lYUm9MV0p5YjNkelpYSnBabmt2YVc1a1pYZ3Vhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanRCUVVGQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRU0lzSW1acGJHVWlPaUpuWlc1bGNtRjBaV1F1YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUx5OGdRMjl3ZVhKcFoyaDBJRXB2ZVdWdWRDd2dTVzVqTGlCaGJtUWdiM1JvWlhJZ1RtOWtaU0JqYjI1MGNtbGlkWFJ2Y25NdVhHNHZMMXh1THk4Z1VHVnliV2x6YzJsdmJpQnBjeUJvWlhKbFlua2daM0poYm5SbFpDd2dabkpsWlNCdlppQmphR0Z5WjJVc0lIUnZJR0Z1ZVNCd1pYSnpiMjRnYjJKMFlXbHVhVzVuSUdGY2JpOHZJR052Y0hrZ2IyWWdkR2hwY3lCemIyWjBkMkZ5WlNCaGJtUWdZWE56YjJOcFlYUmxaQ0JrYjJOMWJXVnVkR0YwYVc5dUlHWnBiR1Z6SUNoMGFHVmNiaTh2SUZ3aVUyOW1kSGRoY21WY0lpa3NJSFJ2SUdSbFlXd2dhVzRnZEdobElGTnZablIzWVhKbElIZHBkR2h2ZFhRZ2NtVnpkSEpwWTNScGIyNHNJR2x1WTJ4MVpHbHVaMXh1THk4Z2QybDBhRzkxZENCc2FXMXBkR0YwYVc5dUlIUm9aU0J5YVdkb2RITWdkRzhnZFhObExDQmpiM0I1TENCdGIyUnBabmtzSUcxbGNtZGxMQ0J3ZFdKc2FYTm9MRnh1THk4Z1pHbHpkSEpwWW5WMFpTd2djM1ZpYkdsalpXNXpaU3dnWVc1a0wyOXlJSE5sYkd3Z1kyOXdhV1Z6SUc5bUlIUm9aU0JUYjJaMGQyRnlaU3dnWVc1a0lIUnZJSEJsY20xcGRGeHVMeThnY0dWeWMyOXVjeUIwYnlCM2FHOXRJSFJvWlNCVGIyWjBkMkZ5WlNCcGN5Qm1kWEp1YVhOb1pXUWdkRzhnWkc4Z2MyOHNJSE4xWW1wbFkzUWdkRzhnZEdobFhHNHZMeUJtYjJ4c2IzZHBibWNnWTI5dVpHbDBhVzl1Y3pwY2JpOHZYRzR2THlCVWFHVWdZV0p2ZG1VZ1kyOXdlWEpwWjJoMElHNXZkR2xqWlNCaGJtUWdkR2hwY3lCd1pYSnRhWE56YVc5dUlHNXZkR2xqWlNCemFHRnNiQ0JpWlNCcGJtTnNkV1JsWkZ4dUx5OGdhVzRnWVd4c0lHTnZjR2xsY3lCdmNpQnpkV0p6ZEdGdWRHbGhiQ0J3YjNKMGFXOXVjeUJ2WmlCMGFHVWdVMjltZEhkaGNtVXVYRzR2TDF4dUx5OGdWRWhGSUZOUFJsUlhRVkpGSUVsVElGQlNUMVpKUkVWRUlGd2lRVk1nU1ZOY0lpd2dWMGxVU0U5VlZDQlhRVkpTUVU1VVdTQlBSaUJCVGxrZ1MwbE9SQ3dnUlZoUVVrVlRVMXh1THk4Z1QxSWdTVTFRVEVsRlJDd2dTVTVEVEZWRVNVNUhJRUpWVkNCT1QxUWdURWxOU1ZSRlJDQlVUeUJVU0VVZ1YwRlNVa0ZPVkVsRlV5QlBSbHh1THk4Z1RVVlNRMGhCVGxSQlFrbE1TVlJaTENCR1NWUk9SVk5USUVaUFVpQkJJRkJCVWxSSlExVk1RVklnVUZWU1VFOVRSU0JCVGtRZ1RrOU9TVTVHVWtsT1IwVk5SVTVVTGlCSlRseHVMeThnVGs4Z1JWWkZUbFFnVTBoQlRFd2dWRWhGSUVGVlZFaFBVbE1nVDFJZ1EwOVFXVkpKUjBoVUlFaFBURVJGVWxNZ1FrVWdURWxCUWt4RklFWlBVaUJCVGxrZ1EweEJTVTBzWEc0dkx5QkVRVTFCUjBWVElFOVNJRTlVU0VWU0lFeEpRVUpKVEVsVVdTd2dWMGhGVkVoRlVpQkpUaUJCVGlCQlExUkpUMDRnVDBZZ1EwOU9WRkpCUTFRc0lGUlBVbFFnVDFKY2JpOHZJRTlVU0VWU1YwbFRSU3dnUVZKSlUwbE9SeUJHVWs5TkxDQlBWVlFnVDBZZ1QxSWdTVTRnUTA5T1RrVkRWRWxQVGlCWFNWUklJRlJJUlNCVFQwWlVWMEZTUlNCUFVpQlVTRVZjYmk4dklGVlRSU0JQVWlCUFZFaEZVaUJFUlVGTVNVNUhVeUJKVGlCVVNFVWdVMDlHVkZkQlVrVXVYRzVjYmk4dklISmxjMjlzZG1WeklDNGdZVzVrSUM0dUlHVnNaVzFsYm5SeklHbHVJR0VnY0dGMGFDQmhjbkpoZVNCM2FYUm9JR1JwY21WamRHOXllU0J1WVcxbGN5QjBhR1Z5WlZ4dUx5OGdiWFZ6ZENCaVpTQnVieUJ6YkdGemFHVnpMQ0JsYlhCMGVTQmxiR1Z0Wlc1MGN5d2diM0lnWkdWMmFXTmxJRzVoYldWeklDaGpPbHhjS1NCcGJpQjBhR1VnWVhKeVlYbGNiaTh2SUNoemJ5QmhiSE52SUc1dklHeGxZV1JwYm1jZ1lXNWtJSFJ5WVdsc2FXNW5JSE5zWVhOb1pYTWdMU0JwZENCa2IyVnpJRzV2ZENCa2FYTjBhVzVuZFdsemFGeHVMeThnY21Wc1lYUnBkbVVnWVc1a0lHRmljMjlzZFhSbElIQmhkR2h6S1Z4dVpuVnVZM1JwYjI0Z2JtOXliV0ZzYVhwbFFYSnlZWGtvY0dGeWRITXNJR0ZzYkc5M1FXSnZkbVZTYjI5MEtTQjdYRzRnSUM4dklHbG1JSFJvWlNCd1lYUm9JSFJ5YVdWeklIUnZJR2R2SUdGaWIzWmxJSFJvWlNCeWIyOTBMQ0JnZFhCZ0lHVnVaSE1nZFhBZ1BpQXdYRzRnSUhaaGNpQjFjQ0E5SURBN1hHNGdJR1p2Y2lBb2RtRnlJR2tnUFNCd1lYSjBjeTVzWlc1bmRHZ2dMU0F4T3lCcElENDlJREE3SUdrdExTa2dlMXh1SUNBZ0lIWmhjaUJzWVhOMElEMGdjR0Z5ZEhOYmFWMDdYRzRnSUNBZ2FXWWdLR3hoYzNRZ1BUMDlJQ2N1SnlrZ2UxeHVJQ0FnSUNBZ2NHRnlkSE11YzNCc2FXTmxLR2tzSURFcE8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb2JHRnpkQ0E5UFQwZ0p5NHVKeWtnZTF4dUlDQWdJQ0FnY0dGeWRITXVjM0JzYVdObEtHa3NJREVwTzF4dUlDQWdJQ0FnZFhBckt6dGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIVndLU0I3WEc0Z0lDQWdJQ0J3WVhKMGN5NXpjR3hwWTJVb2FTd2dNU2s3WEc0Z0lDQWdJQ0IxY0MwdE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lDOHZJR2xtSUhSb1pTQndZWFJvSUdseklHRnNiRzkzWldRZ2RHOGdaMjhnWVdKdmRtVWdkR2hsSUhKdmIzUXNJSEpsYzNSdmNtVWdiR1ZoWkdsdVp5QXVMbk5jYmlBZ2FXWWdLR0ZzYkc5M1FXSnZkbVZTYjI5MEtTQjdYRzRnSUNBZ1ptOXlJQ2c3SUhWd0xTMDdJSFZ3S1NCN1hHNGdJQ0FnSUNCd1lYSjBjeTUxYm5Ob2FXWjBLQ2N1TGljcE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lISmxkSFZ5YmlCd1lYSjBjenRjYm4xY2JseHVMeThnVTNCc2FYUWdZU0JtYVd4bGJtRnRaU0JwYm5SdklGdHliMjkwTENCa2FYSXNJR0poYzJWdVlXMWxMQ0JsZUhSZExDQjFibWw0SUhabGNuTnBiMjVjYmk4dklDZHliMjkwSnlCcGN5QnFkWE4wSUdFZ2MyeGhjMmdzSUc5eUlHNXZkR2hwYm1jdVhHNTJZWElnYzNCc2FYUlFZWFJvVW1VZ1BWeHVJQ0FnSUM5ZUtGeGNMejk4S1NoYlhGeHpYRnhUWFNvL0tTZ29QenBjWEM1N01Td3lmWHhiWGx4Y0wxMHJQM3dwS0Z4Y0xsdGVMbHhjTDEwcWZDa3BLRDg2VzF4Y0wxMHFLU1F2TzF4dWRtRnlJSE53YkdsMFVHRjBhQ0E5SUdaMWJtTjBhVzl1S0dacGJHVnVZVzFsS1NCN1hHNGdJSEpsZEhWeWJpQnpjR3hwZEZCaGRHaFNaUzVsZUdWaktHWnBiR1Z1WVcxbEtTNXpiR2xqWlNneEtUdGNibjA3WEc1Y2JpOHZJSEJoZEdndWNtVnpiMngyWlNoYlpuSnZiU0F1TGk1ZExDQjBieWxjYmk4dklIQnZjMmw0SUhabGNuTnBiMjVjYm1WNGNHOXlkSE11Y21WemIyeDJaU0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0IyWVhJZ2NtVnpiMngyWldSUVlYUm9JRDBnSnljc1hHNGdJQ0FnSUNCeVpYTnZiSFpsWkVGaWMyOXNkWFJsSUQwZ1ptRnNjMlU3WEc1Y2JpQWdabTl5SUNoMllYSWdhU0E5SUdGeVozVnRaVzUwY3k1c1pXNW5kR2dnTFNBeE95QnBJRDQ5SUMweElDWW1JQ0Z5WlhOdmJIWmxaRUZpYzI5c2RYUmxPeUJwTFMwcElIdGNiaUFnSUNCMllYSWdjR0YwYUNBOUlDaHBJRDQ5SURBcElEOGdZWEpuZFcxbGJuUnpXMmxkSURvZ2NISnZZMlZ6Y3k1amQyUW9LVHRjYmx4dUlDQWdJQzh2SUZOcmFYQWdaVzF3ZEhrZ1lXNWtJR2x1ZG1Gc2FXUWdaVzUwY21sbGMxeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ2NHRjBhQ0FoUFQwZ0ozTjBjbWx1WnljcElIdGNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QlVlWEJsUlhKeWIzSW9KMEZ5WjNWdFpXNTBjeUIwYnlCd1lYUm9MbkpsYzI5c2RtVWdiWFZ6ZENCaVpTQnpkSEpwYm1kekp5azdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDZ2hjR0YwYUNrZ2UxeHVJQ0FnSUNBZ1kyOXVkR2x1ZFdVN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnY21WemIyeDJaV1JRWVhSb0lEMGdjR0YwYUNBcklDY3ZKeUFySUhKbGMyOXNkbVZrVUdGMGFEdGNiaUFnSUNCeVpYTnZiSFpsWkVGaWMyOXNkWFJsSUQwZ2NHRjBhQzVqYUdGeVFYUW9NQ2tnUFQwOUlDY3ZKenRjYmlBZ2ZWeHVYRzRnSUM4dklFRjBJSFJvYVhNZ2NHOXBiblFnZEdobElIQmhkR2dnYzJodmRXeGtJR0psSUhKbGMyOXNkbVZrSUhSdklHRWdablZzYkNCaFluTnZiSFYwWlNCd1lYUm9MQ0JpZFhSY2JpQWdMeThnYUdGdVpHeGxJSEpsYkdGMGFYWmxJSEJoZEdoeklIUnZJR0psSUhOaFptVWdLRzFwWjJoMElHaGhjSEJsYmlCM2FHVnVJSEJ5YjJObGMzTXVZM2RrS0NrZ1ptRnBiSE1wWEc1Y2JpQWdMeThnVG05eWJXRnNhWHBsSUhSb1pTQndZWFJvWEc0Z0lISmxjMjlzZG1Wa1VHRjBhQ0E5SUc1dmNtMWhiR2w2WlVGeWNtRjVLR1pwYkhSbGNpaHlaWE52YkhabFpGQmhkR2d1YzNCc2FYUW9KeThuS1N3Z1puVnVZM1JwYjI0b2NDa2dlMXh1SUNBZ0lISmxkSFZ5YmlBaElYQTdYRzRnSUgwcExDQWhjbVZ6YjJ4MlpXUkJZbk52YkhWMFpTa3VhbTlwYmlnbkx5Y3BPMXh1WEc0Z0lISmxkSFZ5YmlBb0tISmxjMjlzZG1Wa1FXSnpiMngxZEdVZ1B5QW5MeWNnT2lBbkp5a2dLeUJ5WlhOdmJIWmxaRkJoZEdncElIeDhJQ2N1Snp0Y2JuMDdYRzVjYmk4dklIQmhkR2d1Ym05eWJXRnNhWHBsS0hCaGRHZ3BYRzR2THlCd2IzTnBlQ0IyWlhKemFXOXVYRzVsZUhCdmNuUnpMbTV2Y20xaGJHbDZaU0E5SUdaMWJtTjBhVzl1S0hCaGRHZ3BJSHRjYmlBZ2RtRnlJR2x6UVdKemIyeDFkR1VnUFNCbGVIQnZjblJ6TG1selFXSnpiMngxZEdVb2NHRjBhQ2tzWEc0Z0lDQWdJQ0IwY21GcGJHbHVaMU5zWVhOb0lEMGdjM1ZpYzNSeUtIQmhkR2dzSUMweEtTQTlQVDBnSnk4bk8xeHVYRzRnSUM4dklFNXZjbTFoYkdsNlpTQjBhR1VnY0dGMGFGeHVJQ0J3WVhSb0lEMGdibTl5YldGc2FYcGxRWEp5WVhrb1ptbHNkR1Z5S0hCaGRHZ3VjM0JzYVhRb0p5OG5LU3dnWm5WdVkzUnBiMjRvY0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUFoSVhBN1hHNGdJSDBwTENBaGFYTkJZbk52YkhWMFpTa3VhbTlwYmlnbkx5Y3BPMXh1WEc0Z0lHbG1JQ2doY0dGMGFDQW1KaUFoYVhOQlluTnZiSFYwWlNrZ2UxeHVJQ0FnSUhCaGRHZ2dQU0FuTGljN1hHNGdJSDFjYmlBZ2FXWWdLSEJoZEdnZ0ppWWdkSEpoYVd4cGJtZFRiR0Z6YUNrZ2UxeHVJQ0FnSUhCaGRHZ2dLejBnSnk4bk8xeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlDaHBjMEZpYzI5c2RYUmxJRDhnSnk4bklEb2dKeWNwSUNzZ2NHRjBhRHRjYm4wN1hHNWNiaTh2SUhCdmMybDRJSFpsY25OcGIyNWNibVY0Y0c5eWRITXVhWE5CWW5OdmJIVjBaU0E5SUdaMWJtTjBhVzl1S0hCaGRHZ3BJSHRjYmlBZ2NtVjBkWEp1SUhCaGRHZ3VZMmhoY2tGMEtEQXBJRDA5UFNBbkx5YzdYRzU5TzF4dVhHNHZMeUJ3YjNOcGVDQjJaWEp6YVc5dVhHNWxlSEJ2Y25SekxtcHZhVzRnUFNCbWRXNWpkR2x2YmlncElIdGNiaUFnZG1GeUlIQmhkR2h6SUQwZ1FYSnlZWGt1Y0hKdmRHOTBlWEJsTG5Oc2FXTmxMbU5oYkd3b1lYSm5kVzFsYm5SekxDQXdLVHRjYmlBZ2NtVjBkWEp1SUdWNGNHOXlkSE11Ym05eWJXRnNhWHBsS0dacGJIUmxjaWh3WVhSb2N5d2dablZ1WTNScGIyNG9jQ3dnYVc1a1pYZ3BJSHRjYmlBZ0lDQnBaaUFvZEhsd1pXOW1JSEFnSVQwOUlDZHpkSEpwYm1jbktTQjdYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLQ2RCY21kMWJXVnVkSE1nZEc4Z2NHRjBhQzVxYjJsdUlHMTFjM1FnWW1VZ2MzUnlhVzVuY3ljcE8xeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdjRHRjYmlBZ2ZTa3VhbTlwYmlnbkx5Y3BLVHRjYm4wN1hHNWNibHh1THk4Z2NHRjBhQzV5Wld4aGRHbDJaU2htY205dExDQjBieWxjYmk4dklIQnZjMmw0SUhabGNuTnBiMjVjYm1WNGNHOXlkSE11Y21Wc1lYUnBkbVVnUFNCbWRXNWpkR2x2YmlobWNtOXRMQ0IwYnlrZ2UxeHVJQ0JtY205dElEMGdaWGh3YjNKMGN5NXlaWE52YkhabEtHWnliMjBwTG5OMVluTjBjaWd4S1R0Y2JpQWdkRzhnUFNCbGVIQnZjblJ6TG5KbGMyOXNkbVVvZEc4cExuTjFZbk4wY2lneEtUdGNibHh1SUNCbWRXNWpkR2x2YmlCMGNtbHRLR0Z5Y2lrZ2UxeHVJQ0FnSUhaaGNpQnpkR0Z5ZENBOUlEQTdYRzRnSUNBZ1ptOXlJQ2c3SUhOMFlYSjBJRHdnWVhKeUxteGxibWQwYURzZ2MzUmhjblFyS3lrZ2UxeHVJQ0FnSUNBZ2FXWWdLR0Z5Y2x0emRHRnlkRjBnSVQwOUlDY25LU0JpY21WaGF6dGNiaUFnSUNCOVhHNWNiaUFnSUNCMllYSWdaVzVrSUQwZ1lYSnlMbXhsYm1kMGFDQXRJREU3WEc0Z0lDQWdabTl5SUNnN0lHVnVaQ0ErUFNBd095QmxibVF0TFNrZ2UxeHVJQ0FnSUNBZ2FXWWdLR0Z5Y2x0bGJtUmRJQ0U5UFNBbkp5a2dZbkpsWVdzN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnYVdZZ0tITjBZWEowSUQ0Z1pXNWtLU0J5WlhSMWNtNGdXMTA3WEc0Z0lDQWdjbVYwZFhKdUlHRnljaTV6YkdsalpTaHpkR0Z5ZEN3Z1pXNWtJQzBnYzNSaGNuUWdLeUF4S1R0Y2JpQWdmVnh1WEc0Z0lIWmhjaUJtY205dFVHRnlkSE1nUFNCMGNtbHRLR1p5YjIwdWMzQnNhWFFvSnk4bktTazdYRzRnSUhaaGNpQjBiMUJoY25SeklEMGdkSEpwYlNoMGJ5NXpjR3hwZENnbkx5Y3BLVHRjYmx4dUlDQjJZWElnYkdWdVozUm9JRDBnVFdGMGFDNXRhVzRvWm5KdmJWQmhjblJ6TG14bGJtZDBhQ3dnZEc5UVlYSjBjeTVzWlc1bmRHZ3BPMXh1SUNCMllYSWdjMkZ0WlZCaGNuUnpUR1Z1WjNSb0lEMGdiR1Z1WjNSb08xeHVJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ2FXWWdLR1p5YjIxUVlYSjBjMXRwWFNBaFBUMGdkRzlRWVhKMGMxdHBYU2tnZTF4dUlDQWdJQ0FnYzJGdFpWQmhjblJ6VEdWdVozUm9JRDBnYVR0Y2JpQWdJQ0FnSUdKeVpXRnJPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSFpoY2lCdmRYUndkWFJRWVhKMGN5QTlJRnRkTzF4dUlDQm1iM0lnS0haaGNpQnBJRDBnYzJGdFpWQmhjblJ6VEdWdVozUm9PeUJwSUR3Z1puSnZiVkJoY25SekxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdiM1YwY0hWMFVHRnlkSE11Y0hWemFDZ25MaTRuS1R0Y2JpQWdmVnh1WEc0Z0lHOTFkSEIxZEZCaGNuUnpJRDBnYjNWMGNIVjBVR0Z5ZEhNdVkyOXVZMkYwS0hSdlVHRnlkSE11YzJ4cFkyVW9jMkZ0WlZCaGNuUnpUR1Z1WjNSb0tTazdYRzVjYmlBZ2NtVjBkWEp1SUc5MWRIQjFkRkJoY25SekxtcHZhVzRvSnk4bktUdGNibjA3WEc1Y2JtVjRjRzl5ZEhNdWMyVndJRDBnSnk4bk8xeHVaWGh3YjNKMGN5NWtaV3hwYldsMFpYSWdQU0FuT2ljN1hHNWNibVY0Y0c5eWRITXVaR2x5Ym1GdFpTQTlJR1oxYm1OMGFXOXVLSEJoZEdncElIdGNiaUFnZG1GeUlISmxjM1ZzZENBOUlITndiR2wwVUdGMGFDaHdZWFJvS1N4Y2JpQWdJQ0FnSUhKdmIzUWdQU0J5WlhOMWJIUmJNRjBzWEc0Z0lDQWdJQ0JrYVhJZ1BTQnlaWE4xYkhSYk1WMDdYRzVjYmlBZ2FXWWdLQ0Z5YjI5MElDWW1JQ0ZrYVhJcElIdGNiaUFnSUNBdkx5Qk9ieUJrYVhKdVlXMWxJSGRvWVhSemIyVjJaWEpjYmlBZ0lDQnlaWFIxY200Z0p5NG5PMXh1SUNCOVhHNWNiaUFnYVdZZ0tHUnBjaWtnZTF4dUlDQWdJQzh2SUVsMElHaGhjeUJoSUdScGNtNWhiV1VzSUhOMGNtbHdJSFJ5WVdsc2FXNW5JSE5zWVhOb1hHNGdJQ0FnWkdseUlEMGdaR2x5TG5OMVluTjBjaWd3TENCa2FYSXViR1Z1WjNSb0lDMGdNU2s3WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnY205dmRDQXJJR1JwY2p0Y2JuMDdYRzVjYmx4dVpYaHdiM0owY3k1aVlYTmxibUZ0WlNBOUlHWjFibU4wYVc5dUtIQmhkR2dzSUdWNGRDa2dlMXh1SUNCMllYSWdaaUE5SUhOd2JHbDBVR0YwYUNod1lYUm9LVnN5WFR0Y2JpQWdMeThnVkU5RVR6b2diV0ZyWlNCMGFHbHpJR052YlhCaGNtbHpiMjRnWTJGelpTMXBibk5sYm5OcGRHbDJaU0J2YmlCM2FXNWtiM2R6UDF4dUlDQnBaaUFvWlhoMElDWW1JR1l1YzNWaWMzUnlLQzB4SUNvZ1pYaDBMbXhsYm1kMGFDa2dQVDA5SUdWNGRDa2dlMXh1SUNBZ0lHWWdQU0JtTG5OMVluTjBjaWd3TENCbUxteGxibWQwYUNBdElHVjRkQzVzWlc1bmRHZ3BPMXh1SUNCOVhHNGdJSEpsZEhWeWJpQm1PMXh1ZlR0Y2JseHVYRzVsZUhCdmNuUnpMbVY0ZEc1aGJXVWdQU0JtZFc1amRHbHZiaWh3WVhSb0tTQjdYRzRnSUhKbGRIVnliaUJ6Y0d4cGRGQmhkR2dvY0dGMGFDbGJNMTA3WEc1OU8xeHVYRzVtZFc1amRHbHZiaUJtYVd4MFpYSWdLSGh6TENCbUtTQjdYRzRnSUNBZ2FXWWdLSGh6TG1acGJIUmxjaWtnY21WMGRYSnVJSGh6TG1acGJIUmxjaWhtS1R0Y2JpQWdJQ0IyWVhJZ2NtVnpJRDBnVzEwN1hHNGdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCNGN5NXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJQ0FnSUNCcFppQW9aaWg0YzF0cFhTd2dhU3dnZUhNcEtTQnlaWE11Y0hWemFDaDRjMXRwWFNrN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQnlaWE03WEc1OVhHNWNiaTh2SUZOMGNtbHVaeTV3Y205MGIzUjVjR1V1YzNWaWMzUnlJQzBnYm1WbllYUnBkbVVnYVc1a1pYZ2daRzl1SjNRZ2QyOXlheUJwYmlCSlJUaGNiblpoY2lCemRXSnpkSElnUFNBbllXSW5Mbk4xWW5OMGNpZ3RNU2tnUFQwOUlDZGlKMXh1SUNBZ0lEOGdablZ1WTNScGIyNGdLSE4wY2l3Z2MzUmhjblFzSUd4bGJpa2dleUJ5WlhSMWNtNGdjM1J5TG5OMVluTjBjaWh6ZEdGeWRDd2diR1Z1S1NCOVhHNGdJQ0FnT2lCbWRXNWpkR2x2YmlBb2MzUnlMQ0J6ZEdGeWRDd2diR1Z1S1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2h6ZEdGeWRDQThJREFwSUhOMFlYSjBJRDBnYzNSeUxteGxibWQwYUNBcklITjBZWEowTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYzNSeUxuTjFZbk4wY2loemRHRnlkQ3dnYkdWdUtUdGNiaUFnSUNCOVhHNDdYRzRpWFgwPSIsIi8qXG4gKiBDb3B5cmlnaHQgMjAwOS0yMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRS50eHQgb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9zb3VyY2UtbWFwL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IHJlcXVpcmUoJy4vc291cmNlLW1hcC9zb3VyY2UtbWFwLWNvbnN1bWVyJykuU291cmNlTWFwQ29uc3VtZXI7XG5leHBvcnRzLlNvdXJjZU5vZGUgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAvc291cmNlLW5vZGUnKS5Tb3VyY2VOb2RlO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZGVmaW5lID0gcmVxdWlyZSgnYW1kZWZpbmUnKShtb2R1bGUsIHJlcXVpcmUpO1xufVxuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcblxuICB2YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4gIC8qKlxuICAgKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAgICogbWVtYmVyIGlzIE8oMSksIHRlc3RpbmcgZm9yIG1lbWJlcnNoaXAgaXMgTygxKSwgYW5kIGZpbmRpbmcgdGhlIGluZGV4IG9mIGFuXG4gICAqIGVsZW1lbnQgaXMgTygxKS4gUmVtb3ZpbmcgZWxlbWVudHMgZnJvbSB0aGUgc2V0IGlzIG5vdCBzdXBwb3J0ZWQuIE9ubHlcbiAgICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICAgKi9cbiAgZnVuY3Rpb24gQXJyYXlTZXQoKSB7XG4gICAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgICB0aGlzLl9zZXQgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAgICovXG4gIEFycmF5U2V0LmZyb21BcnJheSA9IGZ1bmN0aW9uIEFycmF5U2V0X2Zyb21BcnJheShhQXJyYXksIGFBbGxvd0R1cGxpY2F0ZXMpIHtcbiAgICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFBcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgc2V0LmFkZChhQXJyYXlbaV0sIGFBbGxvd0R1cGxpY2F0ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gc2V0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAgICpcbiAgICogQHBhcmFtIFN0cmluZyBhU3RyXG4gICAqL1xuICBBcnJheVNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gQXJyYXlTZXRfYWRkKGFTdHIsIGFBbGxvd0R1cGxpY2F0ZXMpIHtcbiAgICB2YXIgaXNEdXBsaWNhdGUgPSB0aGlzLmhhcyhhU3RyKTtcbiAgICB2YXIgaWR4ID0gdGhpcy5fYXJyYXkubGVuZ3RoO1xuICAgIGlmICghaXNEdXBsaWNhdGUgfHwgYUFsbG93RHVwbGljYXRlcykge1xuICAgICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgICB9XG4gICAgaWYgKCFpc0R1cGxpY2F0ZSkge1xuICAgICAgdGhpcy5fc2V0W3V0aWwudG9TZXRTdHJpbmcoYVN0cildID0gaWR4O1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGdpdmVuIHN0cmluZyBhIG1lbWJlciBvZiB0aGlzIHNldD9cbiAgICpcbiAgICogQHBhcmFtIFN0cmluZyBhU3RyXG4gICAqL1xuICBBcnJheVNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gQXJyYXlTZXRfaGFzKGFTdHIpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwudG9TZXRTdHJpbmcoYVN0cikpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXaGF0IGlzIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gc3RyaW5nIGluIHRoZSBhcnJheT9cbiAgICpcbiAgICogQHBhcmFtIFN0cmluZyBhU3RyXG4gICAqL1xuICBBcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICAgIGlmICh0aGlzLmhhcyhhU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFt1dGlsLnRvU2V0U3RyaW5nKGFTdHIpXTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU3RyICsgJ1wiIGlzIG5vdCBpbiB0aGUgc2V0LicpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXaGF0IGlzIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleD9cbiAgICpcbiAgICogQHBhcmFtIE51bWJlciBhSWR4XG4gICAqL1xuICBBcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gICAgaWYgKGFJZHggPj0gMCAmJiBhSWR4IDwgdGhpcy5fYXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYXJyYXlbYUlkeF07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignTm8gZWxlbWVudCBpbmRleGVkIGJ5ICcgKyBhSWR4KTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZXQgKHdoaWNoIGhhcyB0aGUgcHJvcGVyIGluZGljZXNcbiAgICogaW5kaWNhdGVkIGJ5IGluZGV4T2YpLiBOb3RlIHRoYXQgdGhpcyBpcyBhIGNvcHkgb2YgdGhlIGludGVybmFsIGFycmF5IHVzZWRcbiAgICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAgICovXG4gIEFycmF5U2V0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfdG9BcnJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbiAgfTtcblxuICBleHBvcnRzLkFycmF5U2V0ID0gQXJyYXlTZXQ7XG5cbn0pO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqXG4gKiBCYXNlZCBvbiB0aGUgQmFzZSA2NCBWTFEgaW1wbGVtZW50YXRpb24gaW4gQ2xvc3VyZSBDb21waWxlcjpcbiAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2xvc3VyZS1jb21waWxlci9zb3VyY2UvYnJvd3NlL3RydW5rL3NyYy9jb20vZ29vZ2xlL2RlYnVnZ2luZy9zb3VyY2VtYXAvQmFzZTY0VkxRLmphdmFcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSBUaGUgQ2xvc3VyZSBDb21waWxlciBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmVcbiAqICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4gKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWRcbiAqICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsXG4gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZGVmaW5lID0gcmVxdWlyZSgnYW1kZWZpbmUnKShtb2R1bGUsIHJlcXVpcmUpO1xufVxuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcblxuICB2YXIgYmFzZTY0ID0gcmVxdWlyZSgnLi9iYXNlNjQnKTtcblxuICAvLyBBIHNpbmdsZSBiYXNlIDY0IGRpZ2l0IGNhbiBjb250YWluIDYgYml0cyBvZiBkYXRhLiBGb3IgdGhlIGJhc2UgNjQgdmFyaWFibGVcbiAgLy8gbGVuZ3RoIHF1YW50aXRpZXMgd2UgdXNlIGluIHRoZSBzb3VyY2UgbWFwIHNwZWMsIHRoZSBmaXJzdCBiaXQgaXMgdGhlIHNpZ24sXG4gIC8vIHRoZSBuZXh0IGZvdXIgYml0cyBhcmUgdGhlIGFjdHVhbCB2YWx1ZSwgYW5kIHRoZSA2dGggYml0IGlzIHRoZVxuICAvLyBjb250aW51YXRpb24gYml0LiBUaGUgY29udGludWF0aW9uIGJpdCB0ZWxscyB1cyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlXG4gIC8vIGRpZ2l0cyBpbiB0aGlzIHZhbHVlIGZvbGxvd2luZyB0aGlzIGRpZ2l0LlxuICAvL1xuICAvLyAgIENvbnRpbnVhdGlvblxuICAvLyAgIHwgICAgU2lnblxuICAvLyAgIHwgICAgfFxuICAvLyAgIFYgICAgVlxuICAvLyAgIDEwMTAxMVxuXG4gIHZhciBWTFFfQkFTRV9TSElGVCA9IDU7XG5cbiAgLy8gYmluYXJ5OiAxMDAwMDBcbiAgdmFyIFZMUV9CQVNFID0gMSA8PCBWTFFfQkFTRV9TSElGVDtcblxuICAvLyBiaW5hcnk6IDAxMTExMVxuICB2YXIgVkxRX0JBU0VfTUFTSyA9IFZMUV9CQVNFIC0gMTtcblxuICAvLyBiaW5hcnk6IDEwMDAwMFxuICB2YXIgVkxRX0NPTlRJTlVBVElPTl9CSVQgPSBWTFFfQkFTRTtcblxuICAvKipcbiAgICogQ29udmVydHMgZnJvbSBhIHR3by1jb21wbGVtZW50IHZhbHVlIHRvIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gICAqIHBsYWNlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LiAgRm9yIGV4YW1wbGUsIGFzIGRlY2ltYWxzOlxuICAgKiAgIDEgYmVjb21lcyAyICgxMCBiaW5hcnkpLCAtMSBiZWNvbWVzIDMgKDExIGJpbmFyeSlcbiAgICogICAyIGJlY29tZXMgNCAoMTAwIGJpbmFyeSksIC0yIGJlY29tZXMgNSAoMTAxIGJpbmFyeSlcbiAgICovXG4gIGZ1bmN0aW9uIHRvVkxRU2lnbmVkKGFWYWx1ZSkge1xuICAgIHJldHVybiBhVmFsdWUgPCAwXG4gICAgICA/ICgoLWFWYWx1ZSkgPDwgMSkgKyAxXG4gICAgICA6IChhVmFsdWUgPDwgMSkgKyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRvIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgZnJvbSBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICAgKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAgICogICAyICgxMCBiaW5hcnkpIGJlY29tZXMgMSwgMyAoMTEgYmluYXJ5KSBiZWNvbWVzIC0xXG4gICAqICAgNCAoMTAwIGJpbmFyeSkgYmVjb21lcyAyLCA1ICgxMDEgYmluYXJ5KSBiZWNvbWVzIC0yXG4gICAqL1xuICBmdW5jdGlvbiBmcm9tVkxRU2lnbmVkKGFWYWx1ZSkge1xuICAgIHZhciBpc05lZ2F0aXZlID0gKGFWYWx1ZSAmIDEpID09PSAxO1xuICAgIHZhciBzaGlmdGVkID0gYVZhbHVlID4+IDE7XG4gICAgcmV0dXJuIGlzTmVnYXRpdmVcbiAgICAgID8gLXNoaWZ0ZWRcbiAgICAgIDogc2hpZnRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBiYXNlIDY0IFZMUSBlbmNvZGVkIHZhbHVlLlxuICAgKi9cbiAgZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZW5jb2RlKGFWYWx1ZSkge1xuICAgIHZhciBlbmNvZGVkID0gXCJcIjtcbiAgICB2YXIgZGlnaXQ7XG5cbiAgICB2YXIgdmxxID0gdG9WTFFTaWduZWQoYVZhbHVlKTtcblxuICAgIGRvIHtcbiAgICAgIGRpZ2l0ID0gdmxxICYgVkxRX0JBU0VfTUFTSztcbiAgICAgIHZscSA+Pj49IFZMUV9CQVNFX1NISUZUO1xuICAgICAgaWYgKHZscSA+IDApIHtcbiAgICAgICAgLy8gVGhlcmUgYXJlIHN0aWxsIG1vcmUgZGlnaXRzIGluIHRoaXMgdmFsdWUsIHNvIHdlIG11c3QgbWFrZSBzdXJlIHRoZVxuICAgICAgICAvLyBjb250aW51YXRpb24gYml0IGlzIG1hcmtlZC5cbiAgICAgICAgZGlnaXQgfD0gVkxRX0NPTlRJTlVBVElPTl9CSVQ7XG4gICAgICB9XG4gICAgICBlbmNvZGVkICs9IGJhc2U2NC5lbmNvZGUoZGlnaXQpO1xuICAgIH0gd2hpbGUgKHZscSA+IDApO1xuXG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlY29kZXMgdGhlIG5leHQgYmFzZSA2NCBWTFEgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCByZXR1cm5zIHRoZVxuICAgKiB2YWx1ZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB2aWEgdGhlIG91dCBwYXJhbWV0ZXIuXG4gICAqL1xuICBleHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIGJhc2U2NFZMUV9kZWNvZGUoYVN0ciwgYU91dFBhcmFtKSB7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBzdHJMZW4gPSBhU3RyLmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICB2YXIgc2hpZnQgPSAwO1xuICAgIHZhciBjb250aW51YXRpb24sIGRpZ2l0O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKGkgPj0gc3RyTGVuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG1vcmUgZGlnaXRzIGluIGJhc2UgNjQgVkxRIHZhbHVlLlwiKTtcbiAgICAgIH1cbiAgICAgIGRpZ2l0ID0gYmFzZTY0LmRlY29kZShhU3RyLmNoYXJBdChpKyspKTtcbiAgICAgIGNvbnRpbnVhdGlvbiA9ICEhKGRpZ2l0ICYgVkxRX0NPTlRJTlVBVElPTl9CSVQpO1xuICAgICAgZGlnaXQgJj0gVkxRX0JBU0VfTUFTSztcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCArIChkaWdpdCA8PCBzaGlmdCk7XG4gICAgICBzaGlmdCArPSBWTFFfQkFTRV9TSElGVDtcbiAgICB9IHdoaWxlIChjb250aW51YXRpb24pO1xuXG4gICAgYU91dFBhcmFtLnZhbHVlID0gZnJvbVZMUVNpZ25lZChyZXN1bHQpO1xuICAgIGFPdXRQYXJhbS5yZXN0ID0gYVN0ci5zbGljZShpKTtcbiAgfTtcblxufSk7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5pZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSwgcmVxdWlyZSk7XG59XG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuXG4gIHZhciBjaGFyVG9JbnRNYXAgPSB7fTtcbiAgdmFyIGludFRvQ2hhck1hcCA9IHt9O1xuXG4gICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuICAgIC5zcGxpdCgnJylcbiAgICAuZm9yRWFjaChmdW5jdGlvbiAoY2gsIGluZGV4KSB7XG4gICAgICBjaGFyVG9JbnRNYXBbY2hdID0gaW5kZXg7XG4gICAgICBpbnRUb0NoYXJNYXBbaW5kZXhdID0gY2g7XG4gICAgfSk7XG5cbiAgLyoqXG4gICAqIEVuY29kZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBvZiAwIHRvIDYzIHRvIGEgc2luZ2xlIGJhc2UgNjQgZGlnaXQuXG4gICAqL1xuICBleHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIGJhc2U2NF9lbmNvZGUoYU51bWJlcikge1xuICAgIGlmIChhTnVtYmVyIGluIGludFRvQ2hhck1hcCkge1xuICAgICAgcmV0dXJuIGludFRvQ2hhck1hcFthTnVtYmVyXTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk11c3QgYmUgYmV0d2VlbiAwIGFuZCA2MzogXCIgKyBhTnVtYmVyKTtcbiAgfTtcblxuICAvKipcbiAgICogRGVjb2RlIGEgc2luZ2xlIGJhc2UgNjQgZGlnaXQgdG8gYW4gaW50ZWdlci5cbiAgICovXG4gIGV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gYmFzZTY0X2RlY29kZShhQ2hhcikge1xuICAgIGlmIChhQ2hhciBpbiBjaGFyVG9JbnRNYXApIHtcbiAgICAgIHJldHVybiBjaGFyVG9JbnRNYXBbYUNoYXJdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm90IGEgdmFsaWQgYmFzZSA2NCBkaWdpdDogXCIgKyBhQ2hhcik7XG4gIH07XG5cbn0pO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZGVmaW5lID0gcmVxdWlyZSgnYW1kZWZpbmUnKShtb2R1bGUsIHJlcXVpcmUpO1xufVxuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcblxuICAvKipcbiAgICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gICAqXG4gICAqIEBwYXJhbSBhTG93IEluZGljZXMgaGVyZSBhbmQgbG93ZXIgZG8gbm90IGNvbnRhaW4gdGhlIG5lZWRsZS5cbiAgICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gICAqIEBwYXJhbSBhTmVlZGxlIFRoZSBlbGVtZW50IGJlaW5nIHNlYXJjaGVkIGZvci5cbiAgICogQHBhcmFtIGFIYXlzdGFjayBUaGUgbm9uLWVtcHR5IGFycmF5IGJlaW5nIHNlYXJjaGVkLlxuICAgKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVjdXJzaXZlU2VhcmNoKGFMb3csIGFIaWdoLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlKSB7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiB0ZXJtaW5hdGVzIHdoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgLy9cbiAgICAvLyAgIDIuIFdlIGRpZCBub3QgZmluZCB0aGUgZXhhY3QgZWxlbWVudCwgYnV0IHdlIGNhbiByZXR1cm4gdGhlIGluZGV4IG9mXG4gICAgLy8gICAgICB0aGUgbmV4dCBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBsZXNzIHRoYW4gdGhhdCBlbGVtZW50LlxuICAgIC8vXG4gICAgLy8gICAzLiBXZSBkaWQgbm90IGZpbmQgdGhlIGV4YWN0IGVsZW1lbnQsIGFuZCB0aGVyZSBpcyBubyBuZXh0LWNsb3Nlc3RcbiAgICAvLyAgICAgIGVsZW1lbnQgd2hpY2ggaXMgbGVzcyB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlXG4gICAgLy8gICAgICByZXR1cm4gLTEuXG4gICAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gICAgdmFyIGNtcCA9IGFDb21wYXJlKGFOZWVkbGUsIGFIYXlzdGFja1ttaWRdLCB0cnVlKTtcbiAgICBpZiAoY21wID09PSAwKSB7XG4gICAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgICByZXR1cm4gbWlkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgICAvLyBhSGF5c3RhY2tbbWlkXSBpcyBncmVhdGVyIHRoYW4gb3VyIG5lZWRsZS5cbiAgICAgIGlmIChhSGlnaCAtIG1pZCA+IDEpIHtcbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2gobWlkLCBhSGlnaCwgYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSk7XG4gICAgICB9XG4gICAgICAvLyBXZSBkaWQgbm90IGZpbmQgYW4gZXhhY3QgbWF0Y2gsIHJldHVybiB0aGUgbmV4dCBjbG9zZXN0IG9uZVxuICAgICAgLy8gKHRlcm1pbmF0aW9uIGNhc2UgMikuXG4gICAgICByZXR1cm4gbWlkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIGFIYXlzdGFja1ttaWRdIGlzIGxlc3MgdGhhbiBvdXIgbmVlZGxlLlxuICAgICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAgIC8vIFRoZSBlbGVtZW50IGlzIGluIHRoZSBsb3dlciBoYWxmLlxuICAgICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKGFMb3csIG1pZCwgYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSk7XG4gICAgICB9XG4gICAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAgIC8vIHdlIGFyZSBpbiB0ZXJtaW5hdGlvbiBjYXNlICgyKSBvciAoMykgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgdGhpbmcuXG4gICAgICByZXR1cm4gYUxvdyA8IDAgPyAtMSA6IGFMb3c7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICAgKiB0aGUgaW5kZXggb2YgbmV4dCBsb3dlc3QgdmFsdWUgY2hlY2tlZCBpZiB0aGVyZSBpcyBubyBleGFjdCBoaXQuIFRoaXMgaXNcbiAgICogYmVjYXVzZSBtYXBwaW5ncyBiZXR3ZWVuIG9yaWdpbmFsIGFuZCBnZW5lcmF0ZWQgbGluZS9jb2wgcGFpcnMgYXJlIHNpbmdsZVxuICAgKiBwb2ludHMsIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzc1xuICAgKiBqdXN0IG1lYW5zIHRoYXQgeW91IGFyZW4ndCBvbiB0aGUgdmVyeSBzdGFydCBvZiBhIHJlZ2lvbi5cbiAgICpcbiAgICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAgICogQHBhcmFtIGFIYXlzdGFjayBUaGUgYXJyYXkgdGhhdCBpcyBiZWluZyBzZWFyY2hlZC5cbiAgICogQHBhcmFtIGFDb21wYXJlIEEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgdGhlIG5lZWRsZSBhbmQgYW4gZWxlbWVudCBpbiB0aGVcbiAgICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICAgKiAgICAgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgZWxlbWVudCwgcmVzcGVjdGl2ZWx5LlxuICAgKi9cbiAgZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSkge1xuICAgIGlmIChhSGF5c3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUpXG4gIH07XG5cbn0pO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZGVmaW5lID0gcmVxdWlyZSgnYW1kZWZpbmUnKShtb2R1bGUsIHJlcXVpcmUpO1xufVxuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcblxuICB2YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgd2hldGhlciBtYXBwaW5nQiBpcyBhZnRlciBtYXBwaW5nQSB3aXRoIHJlc3BlY3QgdG8gZ2VuZXJhdGVkXG4gICAqIHBvc2l0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2VuZXJhdGVkUG9zaXRpb25BZnRlcihtYXBwaW5nQSwgbWFwcGluZ0IpIHtcbiAgICAvLyBPcHRpbWl6ZWQgZm9yIG1vc3QgY29tbW9uIGNhc2VcbiAgICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICAgIHZhciBsaW5lQiA9IG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gICAgdmFyIGNvbHVtbkEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW47XG4gICAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gICAgcmV0dXJuIGxpbmVCID4gbGluZUEgfHwgbGluZUIgPT0gbGluZUEgJiYgY29sdW1uQiA+PSBjb2x1bW5BIHx8XG4gICAgICAgICAgIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zKG1hcHBpbmdBLCBtYXBwaW5nQikgPD0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGRhdGEgc3RydWN0dXJlIHRvIHByb3ZpZGUgYSBzb3J0ZWQgdmlldyBvZiBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiBhXG4gICAqIHBlcmZvcm1hbmNlIGNvbnNjaW91cyBtYW5uZXIuIEl0IHRyYWRlcyBhIG5lZ2xpYmFibGUgb3ZlcmhlYWQgaW4gZ2VuZXJhbFxuICAgKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAgICovXG4gIGZ1bmN0aW9uIE1hcHBpbmdMaXN0KCkge1xuICAgIHRoaXMuX2FycmF5ID0gW107XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgICAvLyBTZXJ2ZXMgYXMgaW5maW11bVxuICAgIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICAgKiBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIHRha2VzLlxuICAgKlxuICAgKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICAgKi9cbiAgTWFwcGluZ0xpc3QucHJvdG90eXBlLnVuc29ydGVkRm9yRWFjaCA9XG4gICAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgICB0aGlzLl9hcnJheS5mb3JFYWNoKGFDYWxsYmFjaywgYVRoaXNBcmcpO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgZ2l2ZW4gc291cmNlIG1hcHBpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAgICovXG4gIE1hcHBpbmdMaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF9hZGQoYU1hcHBpbmcpIHtcbiAgICB2YXIgbWFwcGluZztcbiAgICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICAgIHRoaXMuX2xhc3QgPSBhTWFwcGluZztcbiAgICAgIHRoaXMuX2FycmF5LnB1c2goYU1hcHBpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zb3J0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2FycmF5LnB1c2goYU1hcHBpbmcpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICAgKiBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gICAqXG4gICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICAgKiBwZXJmb3JtYW5jZS4gVGhlIHJldHVybiB2YWx1ZSBtdXN0IE5PVCBiZSBtdXRhdGVkLCBhbmQgc2hvdWxkIGJlIHRyZWF0ZWQgYXNcbiAgICogYW4gaW1tdXRhYmxlIGJvcnJvdy4gSWYgeW91IHdhbnQgdG8gdGFrZSBvd25lcnNoaXAsIHlvdSBtdXN0IG1ha2UgeW91ciBvd25cbiAgICogY29weS5cbiAgICovXG4gIE1hcHBpbmdMaXN0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gTWFwcGluZ0xpc3RfdG9BcnJheSgpIHtcbiAgICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgICAgdGhpcy5fYXJyYXkuc29ydCh1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9ucyk7XG4gICAgICB0aGlzLl9zb3J0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYXJyYXk7XG4gIH07XG5cbiAgZXhwb3J0cy5NYXBwaW5nTGlzdCA9IE1hcHBpbmdMaXN0O1xuXG59KTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmlmICh0eXBlb2YgZGVmaW5lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGRlZmluZSA9IHJlcXVpcmUoJ2FtZGVmaW5lJykobW9kdWxlLCByZXF1aXJlKTtcbn1cbmRlZmluZShmdW5jdGlvbiAocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7XG5cbiAgdmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbiAgdmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xuICB2YXIgQXJyYXlTZXQgPSByZXF1aXJlKCcuL2FycmF5LXNldCcpLkFycmF5U2V0O1xuICB2YXIgYmFzZTY0VkxRID0gcmVxdWlyZSgnLi9iYXNlNjQtdmxxJyk7XG5cbiAgLyoqXG4gICAqIEEgU291cmNlTWFwQ29uc3VtZXIgaW5zdGFuY2UgcmVwcmVzZW50cyBhIHBhcnNlZCBzb3VyY2UgbWFwIHdoaWNoIHdlIGNhblxuICAgKiBxdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGZpbGUgcG9zaXRpb25zIGJ5IGdpdmluZyBpdCBhIGZpbGVcbiAgICogcG9zaXRpb24gaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gICAqXG4gICAqIFRoZSBvbmx5IHBhcmFtZXRlciBpcyB0aGUgcmF3IHNvdXJjZSBtYXAgKGVpdGhlciBhcyBhIEpTT04gc3RyaW5nLCBvclxuICAgKiBhbHJlYWR5IHBhcnNlZCB0byBhbiBvYmplY3QpLiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHNvdXJjZSBtYXBzIGhhdmUgdGhlXG4gICAqIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICAgKlxuICAgKiAgIC0gdmVyc2lvbjogV2hpY2ggdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcCBzcGVjIHRoaXMgbWFwIGlzIGZvbGxvd2luZy5cbiAgICogICAtIHNvdXJjZXM6IEFuIGFycmF5IG9mIFVSTHMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAgICogICAtIG5hbWVzOiBBbiBhcnJheSBvZiBpZGVudGlmaWVycyB3aGljaCBjYW4gYmUgcmVmZXJyZW5jZWQgYnkgaW5kaXZpZHVhbCBtYXBwaW5ncy5cbiAgICogICAtIHNvdXJjZVJvb3Q6IE9wdGlvbmFsLiBUaGUgVVJMIHJvb3QgZnJvbSB3aGljaCBhbGwgc291cmNlcyBhcmUgcmVsYXRpdmUuXG4gICAqICAgLSBzb3VyY2VzQ29udGVudDogT3B0aW9uYWwuIEFuIGFycmF5IG9mIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gICAqICAgLSBtYXBwaW5nczogQSBzdHJpbmcgb2YgYmFzZTY0IFZMUXMgd2hpY2ggY29udGFpbiB0aGUgYWN0dWFsIG1hcHBpbmdzLlxuICAgKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgKlxuICAgKiBIZXJlIGlzIGFuIGV4YW1wbGUgc291cmNlIG1hcCwgdGFrZW4gZnJvbSB0aGUgc291cmNlIG1hcCBzcGVjWzBdOlxuICAgKlxuICAgKiAgICAge1xuICAgKiAgICAgICB2ZXJzaW9uIDogMyxcbiAgICogICAgICAgZmlsZTogXCJvdXQuanNcIixcbiAgICogICAgICAgc291cmNlUm9vdCA6IFwiXCIsXG4gICAqICAgICAgIHNvdXJjZXM6IFtcImZvby5qc1wiLCBcImJhci5qc1wiXSxcbiAgICogICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gICAqICAgICAgIG1hcHBpbmdzOiBcIkFBLEFCOztBQkNERTtcIlxuICAgKiAgICAgfVxuICAgKlxuICAgKiBbMF06IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMVUxUkdBZWhRd1J5cFVUb3ZGMUtSbHBpT0Z6ZTBiLV8yZ2M2ZkFIMEtZMGsvZWRpdD9wbGk9MSNcbiAgICovXG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXApIHtcbiAgICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgICBpZiAodHlwZW9mIGFTb3VyY2VNYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzb3VyY2VNYXAgPSBKU09OLnBhcnNlKGFTb3VyY2VNYXAucmVwbGFjZSgvXlxcKVxcXVxcfScvLCAnJykpO1xuICAgIH1cblxuICAgIHZhciB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAndmVyc2lvbicpO1xuICAgIHZhciBzb3VyY2VzID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc291cmNlcycpO1xuICAgIC8vIFNhc3MgMy4zIGxlYXZlcyBvdXQgdGhlICduYW1lcycgYXJyYXksIHNvIHdlIGRldmlhdGUgZnJvbSB0aGUgc3BlYyAod2hpY2hcbiAgICAvLyByZXF1aXJlcyB0aGUgYXJyYXkpIHRvIHBsYXkgbmljZSBoZXJlLlxuICAgIHZhciBuYW1lcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ25hbWVzJywgW10pO1xuICAgIHZhciBzb3VyY2VSb290ID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICAgIHZhciBzb3VyY2VzQ29udGVudCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXNDb250ZW50JywgbnVsbCk7XG4gICAgdmFyIG1hcHBpbmdzID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnbWFwcGluZ3MnKTtcbiAgICB2YXIgZmlsZSA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ2ZpbGUnLCBudWxsKTtcblxuICAgIC8vIE9uY2UgYWdhaW4sIFNhc3MgZGV2aWF0ZXMgZnJvbSB0aGUgc3BlYyBhbmQgc3VwcGxpZXMgdGhlIHZlcnNpb24gYXMgYVxuICAgIC8vIHN0cmluZyByYXRoZXIgdGhhbiBhIG51bWJlciwgc28gd2UgdXNlIGxvb3NlIGVxdWFsaXR5IGNoZWNraW5nIGhlcmUuXG4gICAgaWYgKHZlcnNpb24gIT0gdGhpcy5fdmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gICAgfVxuXG4gICAgLy8gU29tZSBzb3VyY2UgbWFwcyBwcm9kdWNlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBsaWtlIFwiLi9mb28uanNcIiBpbnN0ZWFkIG9mXG4gICAgLy8gXCJmb28uanNcIi4gIE5vcm1hbGl6ZSB0aGVzZSBmaXJzdCBzbyB0aGF0IGZ1dHVyZSBjb21wYXJpc29ucyB3aWxsIHN1Y2NlZWQuXG4gICAgLy8gU2VlIGJ1Z3ppbC5sYS8xMDkwNzY4LlxuICAgIHNvdXJjZXMgPSBzb3VyY2VzLm1hcCh1dGlsLm5vcm1hbGl6ZSk7XG5cbiAgICAvLyBQYXNzIGB0cnVlYCBiZWxvdyB0byBhbGxvdyBkdXBsaWNhdGUgbmFtZXMgYW5kIHNvdXJjZXMuIFdoaWxlIHNvdXJjZSBtYXBzXG4gICAgLy8gYXJlIGludGVuZGVkIHRvIGJlIGNvbXByZXNzZWQgYW5kIGRlZHVwbGljYXRlZCwgdGhlIFR5cGVTY3JpcHQgY29tcGlsZXJcbiAgICAvLyBzb21ldGltZXMgZ2VuZXJhdGVzIHNvdXJjZSBtYXBzIHdpdGggZHVwbGljYXRlcyBpbiB0aGVtLiBTZWUgR2l0aHViIGlzc3VlXG4gICAgLy8gIzcyIGFuZCBidWd6aWwubGEvODg5NDkyLlxuICAgIHRoaXMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KG5hbWVzLCB0cnVlKTtcbiAgICB0aGlzLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KHNvdXJjZXMsIHRydWUpO1xuXG4gICAgdGhpcy5zb3VyY2VSb290ID0gc291cmNlUm9vdDtcbiAgICB0aGlzLnNvdXJjZXNDb250ZW50ID0gc291cmNlc0NvbnRlbnQ7XG4gICAgdGhpcy5fbWFwcGluZ3MgPSBtYXBwaW5ncztcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFNvdXJjZU1hcENvbnN1bWVyIGZyb20gYSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBTb3VyY2VNYXBHZW5lcmF0b3IgYVNvdXJjZU1hcFxuICAgKiAgICAgICAgVGhlIHNvdXJjZSBtYXAgdGhhdCB3aWxsIGJlIGNvbnN1bWVkLlxuICAgKiBAcmV0dXJucyBTb3VyY2VNYXBDb25zdW1lclxuICAgKi9cbiAgU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcCA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwKSB7XG4gICAgICB2YXIgc21jID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuXG4gICAgICBzbWMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX25hbWVzLnRvQXJyYXkoKSwgdHJ1ZSk7XG4gICAgICBzbWMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fc291cmNlcy50b0FycmF5KCksIHRydWUpO1xuICAgICAgc21jLnNvdXJjZVJvb3QgPSBhU291cmNlTWFwLl9zb3VyY2VSb290O1xuICAgICAgc21jLnNvdXJjZXNDb250ZW50ID0gYVNvdXJjZU1hcC5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChzbWMuX3NvdXJjZXMudG9BcnJheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWMuc291cmNlUm9vdCk7XG4gICAgICBzbWMuZmlsZSA9IGFTb3VyY2VNYXAuX2ZpbGU7XG5cbiAgICAgIHNtYy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gYVNvdXJjZU1hcC5fbWFwcGluZ3MudG9BcnJheSgpLnNsaWNlKCk7XG4gICAgICBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gYVNvdXJjZU1hcC5fbWFwcGluZ3MudG9BcnJheSgpLnNsaWNlKClcbiAgICAgICAgLnNvcnQodXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG5cbiAgICAgIHJldHVybiBzbWM7XG4gICAgfTtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICAgKi9cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl92ZXJzaW9uID0gMztcblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAgICovXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VSb290ICE9IG51bGwgPyB1dGlsLmpvaW4odGhpcy5zb3VyY2VSb290LCBzKSA6IHM7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIGBfX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmQgYF9fb3JpZ2luYWxNYXBwaW5nc2AgYXJlIGFycmF5cyB0aGF0IGhvbGQgdGhlXG4gIC8vIHBhcnNlZCBtYXBwaW5nIGNvb3JkaW5hdGVzIGZyb20gdGhlIHNvdXJjZSBtYXAncyBcIm1hcHBpbmdzXCIgYXR0cmlidXRlLiBUaGV5XG4gIC8vIGFyZSBsYXppbHkgaW5zdGFudGlhdGVkLCBhY2Nlc3NlZCB2aWEgdGhlIGBfZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICAvLyBgX29yaWdpbmFsTWFwcGluZ3NgIGdldHRlcnMgcmVzcGVjdGl2ZWx5LCBhbmQgd2Ugb25seSBwYXJzZSB0aGUgbWFwcGluZ3NcbiAgLy8gYW5kIGNyZWF0ZSB0aGVzZSBhcnJheXMgb25jZSBxdWVyaWVkIGZvciBhIHNvdXJjZSBsb2NhdGlvbi4gV2UganVtcCB0aHJvdWdoXG4gIC8vIHRoZXNlIGhvb3BzIGJlY2F1c2UgdGhlcmUgY2FuIGJlIG1hbnkgdGhvdXNhbmRzIG9mIG1hcHBpbmdzLCBhbmQgcGFyc2luZ1xuICAvLyB0aGVtIGlzIGV4cGVuc2l2ZSwgc28gd2Ugb25seSB3YW50IHRvIGRvIGl0IGlmIHdlIG11c3QuXG4gIC8vXG4gIC8vIEVhY2ggb2JqZWN0IGluIHRoZSBhcnJheXMgaXMgb2YgdGhlIGZvcm06XG4gIC8vXG4gIC8vICAgICB7XG4gIC8vICAgICAgIGdlbmVyYXRlZExpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gIC8vICAgICAgIGdlbmVyYXRlZENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLFxuICAvLyAgICAgICBzb3VyY2U6IFRoZSBwYXRoIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSB0aGF0IGdlbmVyYXRlZCB0aGlzXG4gIC8vICAgICAgICAgICAgICAgY2h1bmsgb2YgY29kZSxcbiAgLy8gICAgICAgb3JpZ2luYWxMaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4gIC8vICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhpcyBjaHVuayBvZiBnZW5lcmF0ZWQgY29kZSxcbiAgLy8gICAgICAgb3JpZ2luYWxDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhpcyBjaHVuayBvZiBnZW5lcmF0ZWQgY29kZSxcbiAgLy8gICAgICAgbmFtZTogVGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIHN5bWJvbCB3aGljaCBnZW5lcmF0ZWQgdGhpcyBjaHVuayBvZlxuICAvLyAgICAgICAgICAgICBjb2RlLlxuICAvLyAgICAgfVxuICAvL1xuICAvLyBBbGwgcHJvcGVydGllcyBleGNlcHQgZm9yIGBnZW5lcmF0ZWRMaW5lYCBhbmQgYGdlbmVyYXRlZENvbHVtbmAgY2FuIGJlXG4gIC8vIGBudWxsYC5cbiAgLy9cbiAgLy8gYF9nZW5lcmF0ZWRNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucy5cbiAgLy9cbiAgLy8gYF9vcmlnaW5hbE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBvcmlnaW5hbCBwb3NpdGlvbnMuXG5cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBudWxsO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX2dlbmVyYXRlZE1hcHBpbmdzJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCF0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MpIHtcbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgICAgIHRoaXMuX3BhcnNlTWFwcGluZ3ModGhpcy5fbWFwcGluZ3MsIHRoaXMuc291cmNlUm9vdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gICAgfVxuICB9KTtcblxuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19vcmlnaW5hbE1hcHBpbmdzID0gbnVsbDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19vcmlnaW5hbE1hcHBpbmdzJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCF0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncykge1xuICAgICAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICAgICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBbXTtcbiAgICAgICAgdGhpcy5fcGFyc2VNYXBwaW5ncyh0aGlzLl9tYXBwaW5ncywgdGhpcy5zb3VyY2VSb290KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzO1xuICAgIH1cbiAgfSk7XG5cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9uZXh0Q2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfbmV4dENoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0cikge1xuICAgICAgdmFyIGMgPSBhU3RyLmNoYXJBdCgwKTtcbiAgICAgIHJldHVybiBjID09PSBcIjtcIiB8fCBjID09PSBcIixcIjtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gICAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICAgKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICAgKi9cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9wYXJzZU1hcHBpbmdzID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgICB2YXIgZ2VuZXJhdGVkTGluZSA9IDE7XG4gICAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICAgIHZhciBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gMDtcbiAgICAgIHZhciBwcmV2aW91c1NvdXJjZSA9IDA7XG4gICAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICAgIHZhciBzdHIgPSBhU3RyO1xuICAgICAgdmFyIHRlbXAgPSB7fTtcbiAgICAgIHZhciBtYXBwaW5nO1xuXG4gICAgICB3aGlsZSAoc3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHN0ci5jaGFyQXQoMCkgPT09ICc7Jykge1xuICAgICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMSk7XG4gICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0ci5jaGFyQXQoMCkgPT09ICcsJykge1xuICAgICAgICAgIHN0ciA9IHN0ci5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBtYXBwaW5nID0ge307XG4gICAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAgIC8vIEdlbmVyYXRlZCBjb2x1bW4uXG4gICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShzdHIsIHRlbXApO1xuICAgICAgICAgIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uID0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gKyB0ZW1wLnZhbHVlO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgc3RyID0gdGVtcC5yZXN0O1xuXG4gICAgICAgICAgaWYgKHN0ci5sZW5ndGggPiAwICYmICF0aGlzLl9uZXh0Q2hhcklzTWFwcGluZ1NlcGFyYXRvcihzdHIpKSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBzb3VyY2UuXG4gICAgICAgICAgICBiYXNlNjRWTFEuZGVjb2RlKHN0ciwgdGVtcCk7XG4gICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuYXQocHJldmlvdXNTb3VyY2UgKyB0ZW1wLnZhbHVlKTtcbiAgICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBzdHIgPSB0ZW1wLnJlc3Q7XG4gICAgICAgICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCB8fCB0aGlzLl9uZXh0Q2hhcklzTWFwcGluZ1NlcGFyYXRvcihzdHIpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgYSBzb3VyY2UsIGJ1dCBubyBsaW5lIGFuZCBjb2x1bW4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT3JpZ2luYWwgbGluZS5cbiAgICAgICAgICAgIGJhc2U2NFZMUS5kZWNvZGUoc3RyLCB0ZW1wKTtcbiAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyB0ZW1wLnZhbHVlO1xuICAgICAgICAgICAgcHJldmlvdXNPcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZTtcbiAgICAgICAgICAgIC8vIExpbmVzIGFyZSBzdG9yZWQgMC1iYXNlZFxuICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcbiAgICAgICAgICAgIHN0ciA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIGlmIChzdHIubGVuZ3RoID09PSAwIHx8IHRoaXMuX25leHRDaGFySXNNYXBwaW5nU2VwYXJhdG9yKHN0cikpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBhIHNvdXJjZSBhbmQgbGluZSwgYnV0IG5vIGNvbHVtbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBjb2x1bW4uXG4gICAgICAgICAgICBiYXNlNjRWTFEuZGVjb2RlKHN0ciwgdGVtcCk7XG4gICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHRlbXAudmFsdWU7XG4gICAgICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcbiAgICAgICAgICAgIHN0ciA9IHRlbXAucmVzdDtcblxuICAgICAgICAgICAgaWYgKHN0ci5sZW5ndGggPiAwICYmICF0aGlzLl9uZXh0Q2hhcklzTWFwcGluZ1NlcGFyYXRvcihzdHIpKSB7XG4gICAgICAgICAgICAgIC8vIE9yaWdpbmFsIG5hbWUuXG4gICAgICAgICAgICAgIGJhc2U2NFZMUS5kZWNvZGUoc3RyLCB0ZW1wKTtcbiAgICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gdGhpcy5fbmFtZXMuYXQocHJldmlvdXNOYW1lICsgdGVtcC52YWx1ZSk7XG4gICAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSB0ZW1wLnZhbHVlO1xuICAgICAgICAgICAgICBzdHIgPSB0ZW1wLnJlc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncy5zb3J0KHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zKTtcbiAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnNvcnQodXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gICAgfTtcblxuICAvKipcbiAgICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gICAqIHdlIGFyZSBzZWFyY2hpbmcgZm9yIGluIHRoZSBnaXZlbiBcImhheXN0YWNrXCIgb2YgbWFwcGluZ3MuXG4gICAqL1xuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2ZpbmRNYXBwaW5nID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ29sdW1uTmFtZSwgYUNvbXBhcmF0b3IpIHtcbiAgICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAgIC8vIG1hcHBpbmcgZm9yIHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgdGhlbiByZXR1cm4gdGhlIG9wcG9zaXRlIHBvc2l0aW9uIGl0XG4gICAgICAvLyBwb2ludHMgdG8uIEJlY2F1c2UgdGhlIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHdlIGNhbiB1c2UgYmluYXJ5IHNlYXJjaCB0b1xuICAgICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgICBpZiAoYU5lZWRsZVthTGluZU5hbWVdIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTGluZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLCBnb3QgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICAgIH1cbiAgICAgIGlmIChhTmVlZGxlW2FDb2x1bW5OYW1lXSA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhTmVlZGxlW2FDb2x1bW5OYW1lXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IpO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgdGhlIGxhc3QgY29sdW1uIGZvciBlYWNoIGdlbmVyYXRlZCBtYXBwaW5nLiBUaGUgbGFzdCBjb2x1bW4gaXNcbiAgICogaW5jbHVzaXZlLlxuICAgKi9cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfY29tcHV0ZUNvbHVtblNwYW5zKCkge1xuICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLmxlbmd0aDsgKytpbmRleCkge1xuICAgICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgICAvLyBNYXBwaW5ncyBkbyBub3QgY29udGFpbiBhIGZpZWxkIGZvciB0aGUgbGFzdCBnZW5lcmF0ZWQgY29sdW1udC4gV2VcbiAgICAgICAgLy8gY2FuIGNvbWUgdXAgd2l0aCBhbiBvcHRpbWlzdGljIGVzdGltYXRlLCBob3dldmVyLCBieSBhc3N1bWluZyB0aGF0XG4gICAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAgIC8vIGZpcnN0IG1hcHBpbmcgZW5kcyB3aGVyZSB0aGUgc2Vjb25kIG9uZSBzdGFydHMpLlxuICAgICAgICBpZiAoaW5kZXggKyAxIDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgPT09IG5leHRNYXBwaW5nLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgICAgIG1hcHBpbmcubGFzdEdlbmVyYXRlZENvbHVtbiA9IG5leHRNYXBwaW5nLmdlbmVyYXRlZENvbHVtbiAtIDE7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgICBtYXBwaW5nLmxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBJbmZpbml0eTtcbiAgICAgIH1cbiAgICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAgICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gICAqIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAgICpcbiAgICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuXG4gICAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuXG4gICAqICAgLSBuYW1lOiBUaGUgb3JpZ2luYWwgaWRlbnRpZmllciwgb3IgbnVsbC5cbiAgICovXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9vcmlnaW5hbFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgICB9O1xuXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhuZWVkbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuZXJhdGVkTGluZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJnZW5lcmF0ZWRDb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zKTtcblxuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgICB2YXIgc291cmNlID0gdXRpbC5nZXRBcmcobWFwcGluZywgJ3NvdXJjZScsIG51bGwpO1xuICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiB0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgc291cmNlID0gdXRpbC5qb2luKHRoaXMuc291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ29yaWdpbmFsTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnb3JpZ2luYWxDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgIG5hbWU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICduYW1lJywgbnVsbClcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICBuYW1lOiBudWxsXG4gICAgICB9O1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50LiBUaGUgb25seSBhcmd1bWVudCBpcyB0aGUgdXJsIG9mIHRoZVxuICAgKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gICAqIGF2YWlsaWJsZS5cbiAgICovXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UpIHtcbiAgICAgIGlmICghdGhpcy5zb3VyY2VzQ29udGVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgIGFTb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgYVNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhhU291cmNlKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoYVNvdXJjZSldO1xuICAgICAgfVxuXG4gICAgICB2YXIgdXJsO1xuICAgICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsXG4gICAgICAgICAgJiYgKHVybCA9IHV0aWwudXJsUGFyc2UodGhpcy5zb3VyY2VSb290KSkpIHtcbiAgICAgICAgLy8gWFhYOiBmaWxlOi8vIFVSSXMgYW5kIGFic29sdXRlIHBhdGhzIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvciBmb3JcbiAgICAgICAgLy8gbWFueSB1c2Vycy4gV2UgY2FuIGhlbHAgdGhlbSBvdXQgd2hlbiB0aGV5IGV4cGVjdCBmaWxlOi8vIFVSSXMgdG9cbiAgICAgICAgLy8gYmVoYXZlIGxpa2UgaXQgd291bGQgaWYgdGhleSB3ZXJlIHJ1bm5pbmcgYSBsb2NhbCBIVFRQIHNlcnZlci4gU2VlXG4gICAgICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTg4NTU5Ny5cbiAgICAgICAgdmFyIGZpbGVVcmlBYnNQYXRoID0gYVNvdXJjZS5yZXBsYWNlKC9eZmlsZTpcXC9cXC8vLCBcIlwiKTtcbiAgICAgICAgaWYgKHVybC5zY2hlbWUgPT0gXCJmaWxlXCJcbiAgICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKGZpbGVVcmlBYnNQYXRoKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihmaWxlVXJpQWJzUGF0aCldXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKCF1cmwucGF0aCB8fCB1cmwucGF0aCA9PSBcIi9cIilcbiAgICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKFwiL1wiICsgYVNvdXJjZSkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoXCIvXCIgKyBhU291cmNlKV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gICAqIGxpbmUsIGFuZCBjb2x1bW4gcG9zaXRpb25zIHByb3ZpZGVkLiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aFxuICAgKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqXG4gICAqICAgLSBzb3VyY2U6IFRoZSBmaWxlbmFtZSBvZiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gICAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gICAqXG4gICAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqXG4gICAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gICAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICAgKi9cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmdlbmVyYXRlZFBvc2l0aW9uRm9yID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgICAgc291cmNlOiB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpLFxuICAgICAgICBvcmlnaW5hbExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgICBvcmlnaW5hbENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgIG5lZWRsZS5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgbmVlZGxlLnNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsTWFwcGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsTGluZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG5cbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICBsYXN0Q29sdW1uOiBudWxsXG4gICAgICB9O1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2VcbiAgICogYW5kIGxpbmUgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAgICogcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gICAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAgICpcbiAgICogYW5kIGFuIGFycmF5IG9mIG9iamVjdHMgaXMgcmV0dXJuZWQsIGVhY2ggd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqXG4gICAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gICAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICAgKi9cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmFsbEdlbmVyYXRlZFBvc2l0aW9uc0ZvciA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yKGFBcmdzKSB7XG4gICAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGV4YWN0IG1hdGNoLCBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2ZpbmRNYXBwaW5nXG4gICAgICAvLyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY2xvc2VzdCBtYXBwaW5nIGxlc3MgdGhhbiB0aGUgbmVlZGxlLiBCeVxuICAgICAgLy8gc2V0dGluZyBuZWVkbGUub3JpZ2luYWxDb2x1bW4gdG8gSW5maW5pdHksIHdlIHRodXMgZmluZCB0aGUgbGFzdFxuICAgICAgLy8gbWFwcGluZyBmb3IgdGhlIGdpdmVuIGxpbmUsIHByb3ZpZGVkIHN1Y2ggYSBtYXBwaW5nIGV4aXN0cy5cbiAgICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICAgIHNvdXJjZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSxcbiAgICAgICAgb3JpZ2luYWxMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgICAgb3JpZ2luYWxDb2x1bW46IEluZmluaXR5XG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgbmVlZGxlLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCBuZWVkbGUuc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1hcHBpbmdzID0gW107XG5cbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsTWFwcGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsTGluZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICAgIHdoaWxlIChtYXBwaW5nICYmIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBuZWVkbGUub3JpZ2luYWxMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1stLWluZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFwcGluZ3MucmV2ZXJzZSgpO1xuICAgIH07XG5cbiAgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcbiAgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVIgPSAyO1xuXG4gIC8qKlxuICAgKiBJdGVyYXRlIG92ZXIgZWFjaCBtYXBwaW5nIGJldHdlZW4gYW4gb3JpZ2luYWwgc291cmNlL2xpbmUvY29sdW1uIGFuZCBhXG4gICAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gICAqXG4gICAqIEBwYXJhbSBGdW5jdGlvbiBhQ2FsbGJhY2tcbiAgICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAgICogQHBhcmFtIE9iamVjdCBhQ29udGV4dFxuICAgKiAgICAgICAgT3B0aW9uYWwuIElmIHNwZWNpZmllZCwgdGhpcyBvYmplY3Qgd2lsbCBiZSB0aGUgdmFsdWUgb2YgYHRoaXNgIGV2ZXJ5XG4gICAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICAgKiBAcGFyYW0gYU9yZGVyXG4gICAqICAgICAgICBFaXRoZXIgYFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUmAgb3JcbiAgICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gICAqICAgICAgICBpdGVyYXRlIG92ZXIgdGhlIG1hcHBpbmdzIHNvcnRlZCBieSB0aGUgZ2VuZXJhdGVkIGZpbGUncyBsaW5lL2NvbHVtblxuICAgKiAgICAgICAgb3JkZXIgb3IgdGhlIG9yaWdpbmFsJ3Mgc291cmNlL2xpbmUvY29sdW1uIG9yZGVyLCByZXNwZWN0aXZlbHkuIERlZmF1bHRzIHRvXG4gICAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAgICovXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5lYWNoTWFwcGluZyA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgICB2YXIgY29udGV4dCA9IGFDb250ZXh0IHx8IG51bGw7XG4gICAgICB2YXIgb3JkZXIgPSBhT3JkZXIgfHwgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSO1xuXG4gICAgICB2YXIgbWFwcGluZ3M7XG4gICAgICBzd2l0Y2ggKG9yZGVyKSB7XG4gICAgICBjYXNlIFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUjpcbiAgICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSOlxuICAgICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuc291cmNlUm9vdDtcbiAgICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgICB2YXIgc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2UgPSB1dGlsLmpvaW4oc291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGdlbmVyYXRlZExpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSxcbiAgICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uLFxuICAgICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgb3JpZ2luYWxDb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sXG4gICAgICAgICAgbmFtZTogbWFwcGluZy5uYW1lXG4gICAgICAgIH07XG4gICAgICB9KS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gICAgfTtcblxuICBleHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gU291cmNlTWFwQ29uc3VtZXI7XG5cbn0pO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZGVmaW5lID0gcmVxdWlyZSgnYW1kZWZpbmUnKShtb2R1bGUsIHJlcXVpcmUpO1xufVxuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcblxuICB2YXIgYmFzZTY0VkxRID0gcmVxdWlyZSgnLi9iYXNlNjQtdmxxJyk7XG4gIHZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG4gIHZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG4gIHZhciBNYXBwaW5nTGlzdCA9IHJlcXVpcmUoJy4vbWFwcGluZy1saXN0JykuTWFwcGluZ0xpc3Q7XG5cbiAgLyoqXG4gICAqIEFuIGluc3RhbmNlIG9mIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IgcmVwcmVzZW50cyBhIHNvdXJjZSBtYXAgd2hpY2ggaXNcbiAgICogYmVpbmcgYnVpbHQgaW5jcmVtZW50YWxseS4gWW91IG1heSBwYXNzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAgICogcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIGZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAgICogICAtIHNvdXJjZVJvb3Q6IEEgcm9vdCBmb3IgYWxsIHJlbGF0aXZlIFVSTHMgaW4gdGhpcyBzb3VyY2UgbWFwLlxuICAgKi9cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKSB7XG4gICAgaWYgKCFhQXJncykge1xuICAgICAgYUFyZ3MgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5fZmlsZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZmlsZScsIG51bGwpO1xuICAgIHRoaXMuX3NvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgICB0aGlzLl9za2lwVmFsaWRhdGlvbiA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc2tpcFZhbGlkYXRpb24nLCBmYWxzZSk7XG4gICAgdGhpcy5fc291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG4gICAgdGhpcy5fbWFwcGluZ3MgPSBuZXcgTWFwcGluZ0xpc3QoKTtcbiAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICB9XG5cbiAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXJcbiAgICpcbiAgICogQHBhcmFtIGFTb3VyY2VNYXBDb25zdW1lciBUaGUgU291cmNlTWFwLlxuICAgKi9cbiAgU291cmNlTWFwR2VuZXJhdG9yLmZyb21Tb3VyY2VNYXAgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXBDb25zdW1lcikge1xuICAgICAgdmFyIHNvdXJjZVJvb3QgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlUm9vdDtcbiAgICAgIHZhciBnZW5lcmF0b3IgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKHtcbiAgICAgICAgZmlsZTogYVNvdXJjZU1hcENvbnN1bWVyLmZpbGUsXG4gICAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3RcbiAgICAgIH0pO1xuICAgICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICAgIHZhciBuZXdNYXBwaW5nID0ge1xuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lLFxuICAgICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAgIG5ld01hcHBpbmcuc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG5ld01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXdNYXBwaW5nLm9yaWdpbmFsID0ge1xuICAgICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgICBjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW5cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBuZXdNYXBwaW5nLm5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZ2VuZXJhdG9yLmFkZE1hcHBpbmcobmV3TWFwcGluZyk7XG4gICAgICB9KTtcbiAgICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICAgIGdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBnZW5lcmF0b3I7XG4gICAgfTtcblxuICAvKipcbiAgICogQWRkIGEgc2luZ2xlIG1hcHBpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2UgbGluZSBhbmQgY29sdW1uIHRvIHRoZSBnZW5lcmF0ZWRcbiAgICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIGZvciB0aGlzIHNvdXJjZSBtYXAgYmVpbmcgY3JlYXRlZC4gVGhlIG1hcHBpbmdcbiAgICogb2JqZWN0IHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIGdlbmVyYXRlZDogQW4gb2JqZWN0IHdpdGggdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zLlxuICAgKiAgIC0gb3JpZ2luYWw6IEFuIG9iamVjdCB3aXRoIHRoZSBvcmlnaW5hbCBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zLlxuICAgKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2VSb290KS5cbiAgICogICAtIG5hbWU6IEFuIG9wdGlvbmFsIG9yaWdpbmFsIHRva2VuIG5hbWUgZm9yIHRoaXMgbWFwcGluZy5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYWRkTWFwcGluZyA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2FkZE1hcHBpbmcoYUFyZ3MpIHtcbiAgICAgIHZhciBnZW5lcmF0ZWQgPSB1dGlsLmdldEFyZyhhQXJncywgJ2dlbmVyYXRlZCcpO1xuICAgICAgdmFyIG9yaWdpbmFsID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdvcmlnaW5hbCcsIG51bGwpO1xuICAgICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJywgbnVsbCk7XG4gICAgICB2YXIgbmFtZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbmFtZScsIG51bGwpO1xuXG4gICAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlTWFwcGluZyhnZW5lcmF0ZWQsIG9yaWdpbmFsLCBzb3VyY2UsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgIXRoaXMuX3NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgdGhpcy5fc291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhdGhpcy5fbmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbWFwcGluZ3MuYWRkKHtcbiAgICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogZ2VuZXJhdGVkLmNvbHVtbixcbiAgICAgICAgb3JpZ2luYWxMaW5lOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmxpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbixcbiAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgIG5hbWU6IG5hbWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuXG4gICAqL1xuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnNldFNvdXJjZUNvbnRlbnQgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgICAgdmFyIHNvdXJjZSA9IGFTb3VyY2VGaWxlO1xuICAgICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuX3NvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhU291cmNlQ29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIC8vIEFkZCB0aGUgc291cmNlIGNvbnRlbnQgdG8gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgX3NvdXJjZXNDb250ZW50cyBtYXAgaWYgdGhlIHByb3BlcnR5IGlzIG51bGwuXG4gICAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoc291cmNlKV0gPSBhU291cmNlQ29udGVudDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAgIC8vIElmIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcCBpcyBlbXB0eSwgc2V0IHRoZSBwcm9wZXJ0eSB0byBudWxsLlxuICAgICAgICBkZWxldGUgdGhpcy5fc291cmNlc0NvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoc291cmNlKV07XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzQ29udGVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZVxuICAgKiBzb3VyY2UgbWFwIGJlaW5nIGdlbmVyYXRlZC4gRWFjaCBtYXBwaW5nIHRvIHRoZSBzdXBwbGllZCBzb3VyY2UgZmlsZSBpc1xuICAgKiByZXdyaXR0ZW4gdXNpbmcgdGhlIHN1cHBsaWVkIHNvdXJjZSBtYXAuIE5vdGU6IFRoZSByZXNvbHV0aW9uIGZvciB0aGVcbiAgICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC5cbiAgICpcbiAgICogQHBhcmFtIGFTb3VyY2VNYXBDb25zdW1lciBUaGUgc291cmNlIG1hcCB0byBiZSBhcHBsaWVkLlxuICAgKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuXG4gICAqICAgICAgICBJZiBvbWl0dGVkLCBTb3VyY2VNYXBDb25zdW1lcidzIGZpbGUgcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICAgKiBAcGFyYW0gYVNvdXJjZU1hcFBhdGggT3B0aW9uYWwuIFRoZSBkaXJuYW1lIG9mIHRoZSBwYXRoIHRvIHRoZSBzb3VyY2UgbWFwXG4gICAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLlxuICAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgbmVlZGVkIHdoZW4gdGhlIHR3byBzb3VyY2UgbWFwcyBhcmVuJ3QgaW4gdGhlIHNhbWVcbiAgICogICAgICAgIGRpcmVjdG9yeSwgYW5kIHRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQgY29udGFpbnMgcmVsYXRpdmUgc291cmNlXG4gICAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlblxuICAgKiAgICAgICAgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcEdlbmVyYXRvci5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hcHBseVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIsIGFTb3VyY2VGaWxlLCBhU291cmNlTWFwUGF0aCkge1xuICAgICAgdmFyIHNvdXJjZUZpbGUgPSBhU291cmNlRmlsZTtcbiAgICAgIC8vIElmIGFTb3VyY2VGaWxlIGlzIG9taXR0ZWQsIHdlIHdpbGwgdXNlIHRoZSBmaWxlIHByb3BlcnR5IG9mIHRoZSBTb3VyY2VNYXBcbiAgICAgIGlmIChhU291cmNlRmlsZSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChhU291cmNlTWFwQ29uc3VtZXIuZmlsZSA9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1NvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgcmVxdWlyZXMgZWl0aGVyIGFuIGV4cGxpY2l0IHNvdXJjZSBmaWxlLCAnICtcbiAgICAgICAgICAgICdvciB0aGUgc291cmNlIG1hcFxcJ3MgXCJmaWxlXCIgcHJvcGVydHkuIEJvdGggd2VyZSBvbWl0dGVkLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHNvdXJjZUZpbGUgPSBhU291cmNlTWFwQ29uc3VtZXIuZmlsZTtcbiAgICAgIH1cbiAgICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5fc291cmNlUm9vdDtcbiAgICAgIC8vIE1ha2UgXCJzb3VyY2VGaWxlXCIgcmVsYXRpdmUgaWYgYW4gYWJzb2x1dGUgVXJsIGlzIHBhc3NlZC5cbiAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlRmlsZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICB9XG4gICAgICAvLyBBcHBseWluZyB0aGUgU291cmNlTWFwIGNhbiBhZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2VzIGFuZFxuICAgICAgLy8gdGhlIG5hbWVzIGFycmF5LlxuICAgICAgdmFyIG5ld1NvdXJjZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgICAgIHZhciBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gICAgICAvLyBGaW5kIG1hcHBpbmdzIGZvciB0aGUgXCJzb3VyY2VGaWxlXCJcbiAgICAgIHRoaXMuX21hcHBpbmdzLnVuc29ydGVkRm9yRWFjaChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIGl0IGNhbiBiZSBtYXBwZWQgYnkgdGhlIHNvdXJjZSBtYXAsIHRoZW4gdXBkYXRlIHRoZSBtYXBwaW5nLlxuICAgICAgICAgIHZhciBvcmlnaW5hbCA9IGFTb3VyY2VNYXBDb25zdW1lci5vcmlnaW5hbFBvc2l0aW9uRm9yKHtcbiAgICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBDb3B5IG1hcHBpbmdcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gb3JpZ2luYWwuc291cmNlO1xuICAgICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIG1hcHBpbmcuc291cmNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbWFwcGluZy5zb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbC5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiAhbmV3U291cmNlcy5oYXMoc291cmNlKSkge1xuICAgICAgICAgIG5ld1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmFtZSA9IG1hcHBpbmcubmFtZTtcbiAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgbmV3TmFtZXMuYWRkKG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgIH0sIHRoaXMpO1xuICAgICAgdGhpcy5fc291cmNlcyA9IG5ld1NvdXJjZXM7XG4gICAgICB0aGlzLl9uYW1lcyA9IG5ld05hbWVzO1xuXG4gICAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50cyBvZiBhcHBsaWVkIG1hcC5cbiAgICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChhU291cmNlTWFwUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcyk7XG4gICAgfTtcblxuICAvKipcbiAgICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6XG4gICAqXG4gICAqICAgMS4gSnVzdCB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICAgKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLlxuICAgKiAgIDMuIEdlbmVyYXRlZCBhbmQgb3JpZ2luYWwgcG9zaXRpb24sIG9yaWdpbmFsIHNvdXJjZSwgYXMgd2VsbCBhcyBhIG5hbWVcbiAgICogICAgICB0b2tlbi5cbiAgICpcbiAgICogVG8gbWFpbnRhaW4gY29uc2lzdGVuY3ksIHdlIHZhbGlkYXRlIHRoYXQgYW55IG5ldyBtYXBwaW5nIGJlaW5nIGFkZGVkIGZhbGxzXG4gICAqIGluIHRvIG9uZSBvZiB0aGVzZSBjYXRlZ29yaWVzLlxuICAgKi9cbiAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGVNYXBwaW5nID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdmFsaWRhdGVNYXBwaW5nKGFHZW5lcmF0ZWQsIGFPcmlnaW5hbCwgYVNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lKSB7XG4gICAgICBpZiAoYUdlbmVyYXRlZCAmJiAnbGluZScgaW4gYUdlbmVyYXRlZCAmJiAnY29sdW1uJyBpbiBhR2VuZXJhdGVkXG4gICAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICAgJiYgIWFPcmlnaW5hbCAmJiAhYVNvdXJjZSAmJiAhYU5hbWUpIHtcbiAgICAgICAgLy8gQ2FzZSAxLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgICAgICAgICYmIGFPcmlnaW5hbCAmJiAnbGluZScgaW4gYU9yaWdpbmFsICYmICdjb2x1bW4nIGluIGFPcmlnaW5hbFxuICAgICAgICAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICAgICAgICAmJiBhT3JpZ2luYWwubGluZSA+IDAgJiYgYU9yaWdpbmFsLmNvbHVtbiA+PSAwXG4gICAgICAgICAgICAgICAmJiBhU291cmNlKSB7XG4gICAgICAgIC8vIENhc2VzIDIgYW5kIDMuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbWFwcGluZzogJyArIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsXG4gICAgICAgICAgc291cmNlOiBhU291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiBhT3JpZ2luYWwsXG4gICAgICAgICAgbmFtZTogYU5hbWVcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGUgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gdG8gdGhlIHN0cmVhbSBvZiBiYXNlIDY0IFZMUXNcbiAgICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3NlcmlhbGl6ZU1hcHBpbmdzID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2VyaWFsaXplTWFwcGluZ3MoKSB7XG4gICAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkTGluZSA9IDE7XG4gICAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgICB2YXIgcHJldmlvdXNPcmlnaW5hbExpbmUgPSAwO1xuICAgICAgdmFyIHByZXZpb3VzTmFtZSA9IDA7XG4gICAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgdmFyIG1hcHBpbmc7XG5cbiAgICAgIHZhciBtYXBwaW5ncyA9IHRoaXMuX21hcHBpbmdzLnRvQXJyYXkoKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG1hcHBpbmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIG1hcHBpbmcgPSBtYXBwaW5nc1tpXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lICE9PSBwcmV2aW91c0dlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgd2hpbGUgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJzsnO1xuICAgICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgaWYgKCF1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9ucyhtYXBwaW5nLCBtYXBwaW5nc1tpIC0gMV0pKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ICs9ICcsJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdCArPSBiYXNlNjRWTFEuZW5jb2RlKHRoaXMuX3NvdXJjZXMuaW5kZXhPZihtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzU291cmNlKTtcbiAgICAgICAgICBwcmV2aW91c1NvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihtYXBwaW5nLnNvdXJjZSk7XG5cbiAgICAgICAgICAvLyBsaW5lcyBhcmUgc3RvcmVkIDAtYmFzZWQgaW4gU291cmNlTWFwIHNwZWMgdmVyc2lvbiAzXG4gICAgICAgICAgcmVzdWx0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbExpbmUgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c09yaWdpbmFsTGluZSk7XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZSAtIDE7XG5cbiAgICAgICAgICByZXN1bHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c09yaWdpbmFsQ29sdW1uKTtcbiAgICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICAgIGlmIChtYXBwaW5nLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGJhc2U2NFZMUS5lbmNvZGUodGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzTmFtZSk7XG4gICAgICAgICAgICBwcmV2aW91c05hbWUgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG1hcHBpbmcubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50ID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZ2VuZXJhdGVTb3VyY2VzQ29udGVudChhU291cmNlcywgYVNvdXJjZVJvb3QpIHtcbiAgICAgIHJldHVybiBhU291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhU291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZShhU291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIga2V5ID0gdXRpbC50b1NldFN0cmluZyhzb3VyY2UpO1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkpXG4gICAgICAgICAgPyB0aGlzLl9zb3VyY2VzQ29udGVudHNba2V5XVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIEV4dGVybmFsaXplIHRoZSBzb3VyY2UgbWFwLlxuICAgKi9cbiAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b0pTT04gPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl90b0pTT04oKSB7XG4gICAgICB2YXIgbWFwID0ge1xuICAgICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgICBzb3VyY2VzOiB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKSxcbiAgICAgICAgbmFtZXM6IHRoaXMuX25hbWVzLnRvQXJyYXkoKSxcbiAgICAgICAgbWFwcGluZ3M6IHRoaXMuX3NlcmlhbGl6ZU1hcHBpbmdzKClcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5fZmlsZSAhPSBudWxsKSB7XG4gICAgICAgIG1hcC5maWxlID0gdGhpcy5fZmlsZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgbWFwLnNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSB0aGlzLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KG1hcC5zb3VyY2VzLCBtYXAuc291cmNlUm9vdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXA7XG4gICAgfTtcblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBzb3VyY2UgbWFwIGJlaW5nIGdlbmVyYXRlZCB0byBhIHN0cmluZy5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUudG9TdHJpbmcgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl90b1N0cmluZygpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcbiAgICB9O1xuXG4gIGV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gU291cmNlTWFwR2VuZXJhdG9yO1xuXG59KTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmlmICh0eXBlb2YgZGVmaW5lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGRlZmluZSA9IHJlcXVpcmUoJ2FtZGVmaW5lJykobW9kdWxlLCByZXF1aXJlKTtcbn1cbmRlZmluZShmdW5jdGlvbiAocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7XG5cbiAgdmFyIFNvdXJjZU1hcEdlbmVyYXRvciA9IHJlcXVpcmUoJy4vc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG4gIHZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbiAgLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbiAgLy8gb3BlcmF0aW5nIHN5c3RlbXMgdGhlc2UgZGF5cyAoY2FwdHVyaW5nIHRoZSByZXN1bHQpLlxuICB2YXIgUkVHRVhfTkVXTElORSA9IC8oXFxyP1xcbikvO1xuXG4gIC8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xuICB2YXIgTkVXTElORV9DT0RFID0gMTA7XG5cbiAgLy8gUHJpdmF0ZSBzeW1ib2wgZm9yIGlkZW50aWZ5aW5nIGBTb3VyY2VOb2RlYHMgd2hlbiBtdWx0aXBsZSB2ZXJzaW9ucyBvZlxuICAvLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuICAvLyB2ZXJzaW9ucyFcbiAgdmFyIGlzU291cmNlTm9kZSA9IFwiJCQkaXNTb3VyY2VOb2RlJCQkXCI7XG5cbiAgLyoqXG4gICAqIFNvdXJjZU5vZGVzIHByb3ZpZGUgYSB3YXkgdG8gYWJzdHJhY3Qgb3ZlciBpbnRlcnBvbGF0aW5nL2NvbmNhdGVuYXRpbmdcbiAgICogc25pcHBldHMgb2YgZ2VuZXJhdGVkIEphdmFTY3JpcHQgc291cmNlIGNvZGUgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIGxpbmUgYW5kXG4gICAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICAgKlxuICAgKiBAcGFyYW0gYUxpbmUgVGhlIG9yaWdpbmFsIGxpbmUgbnVtYmVyLlxuICAgKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAgICogQHBhcmFtIGFTb3VyY2UgVGhlIG9yaWdpbmFsIHNvdXJjZSdzIGZpbGVuYW1lLlxuICAgKiBAcGFyYW0gYUNodW5rcyBPcHRpb25hbC4gQW4gYXJyYXkgb2Ygc3RyaW5ncyB3aGljaCBhcmUgc25pcHBldHMgb2ZcbiAgICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gICAqIEBwYXJhbSBhTmFtZSBUaGUgb3JpZ2luYWwgaWRlbnRpZmllci5cbiAgICovXG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIHRoaXMuc291cmNlQ29udGVudHMgPSB7fTtcbiAgICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICAgIHRoaXMuY29sdW1uID0gYUNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGFDb2x1bW47XG4gICAgdGhpcy5zb3VyY2UgPSBhU291cmNlID09IG51bGwgPyBudWxsIDogYVNvdXJjZTtcbiAgICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICAgIHRoaXNbaXNTb3VyY2VOb2RlXSA9IHRydWU7XG4gICAgaWYgKGFDaHVua3MgIT0gbnVsbCkgdGhpcy5hZGQoYUNodW5rcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIFNvdXJjZU5vZGUgZnJvbSBnZW5lcmF0ZWQgY29kZSBhbmQgYSBTb3VyY2VNYXBDb25zdW1lci5cbiAgICpcbiAgICogQHBhcmFtIGFHZW5lcmF0ZWRDb2RlIFRoZSBnZW5lcmF0ZWQgY29kZVxuICAgKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICAgKiAgICAgICAgU291cmNlTWFwQ29uc3VtZXIgc2hvdWxkIGJlIHJlbGF0aXZlIHRvLlxuICAgKi9cbiAgU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gICAgZnVuY3Rpb24gU291cmNlTm9kZV9mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcChhR2VuZXJhdGVkQ29kZSwgYVNvdXJjZU1hcENvbnN1bWVyLCBhUmVsYXRpdmVQYXRoKSB7XG4gICAgICAvLyBUaGUgU291cmNlTm9kZSB3ZSB3YW50IHRvIGZpbGwgd2l0aCB0aGUgZ2VuZXJhdGVkIGNvZGVcbiAgICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgICB2YXIgbm9kZSA9IG5ldyBTb3VyY2VOb2RlKCk7XG5cbiAgICAgIC8vIEFsbCBldmVuIGluZGljZXMgb2YgdGhpcyBhcnJheSBhcmUgb25lIGxpbmUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlLFxuICAgICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAgIC8vIChzaW5jZSBgUkVHRVhfTkVXTElORWAgY2FwdHVyZXMgaXRzIG1hdGNoKS5cbiAgICAgIC8vIFByb2Nlc3NlZCBmcmFnbWVudHMgYXJlIHJlbW92ZWQgZnJvbSB0aGlzIGFycmF5LCBieSBjYWxsaW5nIGBzaGlmdE5leHRMaW5lYC5cbiAgICAgIHZhciByZW1haW5pbmdMaW5lcyA9IGFHZW5lcmF0ZWRDb2RlLnNwbGl0KFJFR0VYX05FV0xJTkUpO1xuICAgICAgdmFyIHNoaWZ0TmV4dExpbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGxpbmVDb250ZW50cyA9IHJlbWFpbmluZ0xpbmVzLnNoaWZ0KCk7XG4gICAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgICAgdmFyIG5ld0xpbmUgPSByZW1haW5pbmdMaW5lcy5zaGlmdCgpIHx8IFwiXCI7XG4gICAgICAgIHJldHVybiBsaW5lQ29udGVudHMgKyBuZXdMaW5lO1xuICAgICAgfTtcblxuICAgICAgLy8gV2UgbmVlZCB0byByZW1lbWJlciB0aGUgcG9zaXRpb24gb2YgXCJyZW1haW5pbmdMaW5lc1wiXG4gICAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgICAgLy8gVGhlIGdlbmVyYXRlIFNvdXJjZU5vZGVzIHdlIG5lZWQgYSBjb2RlIHJhbmdlLlxuICAgICAgLy8gVG8gZXh0cmFjdCBpdCBjdXJyZW50IGFuZCBsYXN0IG1hcHBpbmcgaXMgdXNlZC5cbiAgICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICAgIHZhciBsYXN0TWFwcGluZyA9IG51bGw7XG5cbiAgICAgIGFTb3VyY2VNYXBDb25zdW1lci5lYWNoTWFwcGluZyhmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBhZGQgdGhlIGNvZGUgZnJvbSBcImxhc3RNYXBwaW5nXCIgdG8gXCJtYXBwaW5nXCI6XG4gICAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgYSBuZXcgbGluZSBpbiBiZXR3ZWVuLlxuICAgICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgICAgdmFyIGNvZGUgPSBcIlwiO1xuICAgICAgICAgICAgLy8gQXNzb2NpYXRlIGZpcnN0IGxpbmUgd2l0aCBcImxhc3RNYXBwaW5nXCJcbiAgICAgICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgICAgICAgIC8vIFRoZSByZW1haW5pbmcgY29kZSBpcyBhZGRlZCB3aXRob3V0IG1hcHBpbmdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gbmV3IGxpbmUgaW4gYmV0d2Vlbi5cbiAgICAgICAgICAgIC8vIEFzc29jaWF0ZSB0aGUgY29kZSBiZXR3ZWVuIFwibGFzdEdlbmVyYXRlZENvbHVtblwiIGFuZFxuICAgICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgICB2YXIgbmV4dExpbmUgPSByZW1haW5pbmdMaW5lc1swXTtcbiAgICAgICAgICAgIHZhciBjb2RlID0gbmV4dExpbmUuc3Vic3RyKDAsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgICAgcmVtYWluaW5nTGluZXNbMF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbik7XG4gICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgICBhZGRNYXBwaW5nV2l0aENvZGUobGFzdE1hcHBpbmcsIGNvZGUpO1xuICAgICAgICAgICAgLy8gTm8gbW9yZSByZW1haW5pbmcgY29kZSwgY29udGludWVcbiAgICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgYWRkIHRoZSBnZW5lcmF0ZWQgY29kZSB1bnRpbCB0aGUgZmlyc3QgbWFwcGluZ1xuICAgICAgICAvLyB0byB0aGUgU291cmNlTm9kZSB3aXRob3V0IGFueSBtYXBwaW5nLlxuICAgICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgICB3aGlsZSAobGFzdEdlbmVyYXRlZExpbmUgPCBtYXBwaW5nLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgICBub2RlLmFkZChzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RHZW5lcmF0ZWRDb2x1bW4gPCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbikge1xuICAgICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzWzBdO1xuICAgICAgICAgIG5vZGUuYWRkKG5leHRMaW5lLnN1YnN0cigwLCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbikpO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzWzBdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgbGFzdE1hcHBpbmcgPSBtYXBwaW5nO1xuICAgICAgfSwgdGhpcyk7XG4gICAgICAvLyBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgbWFwcGluZ3MuXG4gICAgICBpZiAocmVtYWluaW5nTGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIHJlbWFpbmluZyBjb2RlIGluIHRoZSBjdXJyZW50IGxpbmUgd2l0aCBcImxhc3RNYXBwaW5nXCJcbiAgICAgICAgICBhZGRNYXBwaW5nV2l0aENvZGUobGFzdE1hcHBpbmcsIHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYW5kIGFkZCB0aGUgcmVtYWluaW5nIGxpbmVzIHdpdGhvdXQgYW55IG1hcHBpbmdcbiAgICAgICAgbm9kZS5hZGQocmVtYWluaW5nTGluZXMuam9pbihcIlwiKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvcHkgc291cmNlc0NvbnRlbnQgaW50byBTb3VyY2VOb2RlXG4gICAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5qb2luKGFSZWxhdGl2ZVBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbm9kZTtcblxuICAgICAgZnVuY3Rpb24gYWRkTWFwcGluZ1dpdGhDb2RlKG1hcHBpbmcsIGNvZGUpIHtcbiAgICAgICAgaWYgKG1hcHBpbmcgPT09IG51bGwgfHwgbWFwcGluZy5zb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBhUmVsYXRpdmVQYXRoXG4gICAgICAgICAgICA/IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICAgIDogbWFwcGluZy5zb3VyY2U7XG4gICAgICAgICAgbm9kZS5hZGQobmV3IFNvdXJjZU5vZGUobWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNodW5rIG9mIGdlbmVyYXRlZCBKUyB0byB0aGlzIHNvdXJjZSBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAgICogICAgICAgIFNvdXJjZU5vZGUsIG9yIGFuIGFycmF5IHdoZXJlIGVhY2ggbWVtYmVyIGlzIG9uZSBvZiB0aG9zZSB0aGluZ3MuXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2FkZChhQ2h1bmspIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgICBhQ2h1bmsuZm9yRWFjaChmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgdGhpcy5hZGQoY2h1bmspO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFDaHVua1tpc1NvdXJjZU5vZGVdIHx8IHR5cGVvZiBhQ2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChhQ2h1bmspIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGFDaHVuayk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJFeHBlY3RlZCBhIFNvdXJjZU5vZGUsIHN0cmluZywgb3IgYW4gYXJyYXkgb2YgU291cmNlTm9kZXMgYW5kIHN0cmluZ3MuIEdvdCBcIiArIGFDaHVua1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNodW5rIG9mIGdlbmVyYXRlZCBKUyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc291cmNlIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSBhQ2h1bmsgQSBzdHJpbmcgc25pcHBldCBvZiBnZW5lcmF0ZWQgSlMgY29kZSwgYW5vdGhlciBpbnN0YW5jZSBvZlxuICAgKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLnByZXBlbmQgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3ByZXBlbmQoYUNodW5rKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYUNodW5rKSkge1xuICAgICAgZm9yICh2YXIgaSA9IGFDaHVuay5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdGhpcy5wcmVwZW5kKGFDaHVua1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGFDaHVua1tpc1NvdXJjZU5vZGVdIHx8IHR5cGVvZiBhQ2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuY2hpbGRyZW4udW5zaGlmdChhQ2h1bmspO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgSlMgc25pcHBldHMgaW4gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uIFRoZVxuICAgKiB3YWxraW5nIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIHNuaXBwZXQgb2YgSlMgYW5kIGlzIHBhc3NlZCB0aGF0XG4gICAqIHNuaXBwZXQgYW5kIHRoZSBpdHMgb3JpZ2luYWwgYXNzb2NpYXRlZCBzb3VyY2UncyBsaW5lL2NvbHVtbiBsb2NhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGFGbiBUaGUgdHJhdmVyc2FsIGZ1bmN0aW9uLlxuICAgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2FsayhhRm4pIHtcbiAgICB2YXIgY2h1bms7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNodW5rID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChjaHVua1tpc1NvdXJjZU5vZGVdKSB7XG4gICAgICAgIGNodW5rLndhbGsoYUZuKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoY2h1bmsgIT09ICcnKSB7XG4gICAgICAgICAgYUZuKGNodW5rLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMubGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBMaWtlIGBTdHJpbmcucHJvdG90eXBlLmpvaW5gIGV4Y2VwdCBmb3IgU291cmNlTm9kZXMuIEluc2VydHMgYGFTdHJgIGJldHdlZW5cbiAgICogZWFjaCBvZiBgdGhpcy5jaGlsZHJlbmAuXG4gICAqXG4gICAqIEBwYXJhbSBhU2VwIFRoZSBzZXBhcmF0b3IuXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gU291cmNlTm9kZV9qb2luKGFTZXApIHtcbiAgICB2YXIgbmV3Q2hpbGRyZW47XG4gICAgdmFyIGk7XG4gICAgdmFyIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICBuZXdDaGlsZHJlbiA9IFtdO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbi0xOyBpKyspIHtcbiAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChhU2VwKTtcbiAgICAgIH1cbiAgICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgICB0aGlzLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWxcbiAgICogZm9yIHRyaW1taW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZW5kIG9mIGEgc291cmNlIG5vZGUsIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gICAqIEBwYXJhbSBhUmVwbGFjZW1lbnQgVGhlIHRoaW5nIHRvIHJlcGxhY2UgdGhlIHBhdHRlcm4gd2l0aC5cbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLnJlcGxhY2VSaWdodCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpIHtcbiAgICB2YXIgbGFzdENoaWxkID0gdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0Q2hpbGRbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGxhc3RDaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXSA9IGxhc3RDaGlsZC5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaCgnJy5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuIFRoaXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgU291cmNlTWFwR2VuZXJhdG9yXG4gICAqIGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZC5cbiAgICpcbiAgICogQHBhcmFtIGFTb3VyY2VGaWxlIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGVcbiAgICogQHBhcmFtIGFTb3VyY2VDb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZVxuICAgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gICAgZnVuY3Rpb24gU291cmNlTm9kZV9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgICAgdGhpcy5zb3VyY2VDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKGFTb3VyY2VGaWxlKV0gPSBhU291cmNlQ29udGVudDtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgU291cmNlTm9kZXMuIFRoZSB3YWxraW5nIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaFxuICAgKiBzb3VyY2UgZmlsZSBjb250ZW50IGFuZCBpcyBwYXNzZWQgdGhlIGZpbGVuYW1lIGFuZCBzb3VyY2UgY29udGVudC5cbiAgICpcbiAgICogQHBhcmFtIGFGbiBUaGUgdHJhdmVyc2FsIGZ1bmN0aW9uLlxuICAgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUud2Fsa1NvdXJjZUNvbnRlbnRzID1cbiAgICBmdW5jdGlvbiBTb3VyY2VOb2RlX3dhbGtTb3VyY2VDb250ZW50cyhhRm4pIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLndhbGtTb3VyY2VDb250ZW50cyhhRm4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBzb3VyY2VzID0gT2JqZWN0LmtleXModGhpcy5zb3VyY2VDb250ZW50cyk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc291cmNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlLiBXYWxrcyBvdmVyIHRoZSB0cmVlXG4gICAqIGFuZCBjb25jYXRlbmF0ZXMgYWxsIHRoZSB2YXJpb3VzIHNuaXBwZXRzIHRvZ2V0aGVyIHRvIG9uZSBzdHJpbmcuXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfdG9TdHJpbmcoKSB7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgc3RyICs9IGNodW5rO1xuICAgIH0pO1xuICAgIHJldHVybiBzdHI7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlIGFsb25nIHdpdGggYSBzb3VyY2VcbiAgICogbWFwLlxuICAgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmdXaXRoU291cmNlTWFwID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZ1dpdGhTb3VyY2VNYXAoYUFyZ3MpIHtcbiAgICB2YXIgZ2VuZXJhdGVkID0ge1xuICAgICAgY29kZTogXCJcIixcbiAgICAgIGxpbmU6IDEsXG4gICAgICBjb2x1bW46IDBcbiAgICB9O1xuICAgIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKTtcbiAgICB2YXIgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlO1xuICAgIHZhciBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgIHZhciBsYXN0T3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgICB2YXIgbGFzdE9yaWdpbmFsQ29sdW1uID0gbnVsbDtcbiAgICB2YXIgbGFzdE9yaWdpbmFsTmFtZSA9IG51bGw7XG4gICAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaywgb3JpZ2luYWwpIHtcbiAgICAgIGdlbmVyYXRlZC5jb2RlICs9IGNodW5rO1xuICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPT0gbnVsbFxuICAgICAgICAgICYmIG9yaWdpbmFsLmxpbmUgIT09IG51bGxcbiAgICAgICAgICAmJiBvcmlnaW5hbC5jb2x1bW4gIT09IG51bGwpIHtcbiAgICAgICAgaWYobGFzdE9yaWdpbmFsU291cmNlICE9PSBvcmlnaW5hbC5zb3VyY2VcbiAgICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZVxuICAgICAgICAgICB8fCBsYXN0T3JpZ2luYWxDb2x1bW4gIT09IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICB8fCBsYXN0T3JpZ2luYWxOYW1lICE9PSBvcmlnaW5hbC5uYW1lKSB7XG4gICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG9yaWdpbmFsLnNvdXJjZTtcbiAgICAgICAgbGFzdE9yaWdpbmFsTGluZSA9IG9yaWdpbmFsLmxpbmU7XG4gICAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgICAgbGFzdE9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsLm5hbWU7XG4gICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgIG1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDtcbiAgICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuZ3RoID0gY2h1bmsubGVuZ3RoOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgIGlmIChjaHVuay5jaGFyQ29kZUF0KGlkeCkgPT09IE5FV0xJTkVfQ09ERSkge1xuICAgICAgICAgIGdlbmVyYXRlZC5saW5lKys7XG4gICAgICAgICAgZ2VuZXJhdGVkLmNvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gTWFwcGluZ3MgZW5kIGF0IGVvbFxuICAgICAgICAgIGlmIChpZHggKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICAgICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICAgIGxpbmU6IG9yaWdpbmFsLmxpbmUsXG4gICAgICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBnZW5lcmF0ZWQuY29sdW1uKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLndhbGtTb3VyY2VDb250ZW50cyhmdW5jdGlvbiAoc291cmNlRmlsZSwgc291cmNlQ29udGVudCkge1xuICAgICAgbWFwLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgc291cmNlQ29udGVudCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBjb2RlOiBnZW5lcmF0ZWQuY29kZSwgbWFwOiBtYXAgfTtcbiAgfTtcblxuICBleHBvcnRzLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlO1xuXG59KTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmlmICh0eXBlb2YgZGVmaW5lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGRlZmluZSA9IHJlcXVpcmUoJ2FtZGVmaW5lJykobW9kdWxlLCByZXF1aXJlKTtcbn1cbmRlZmluZShmdW5jdGlvbiAocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIGdldHRpbmcgdmFsdWVzIGZyb20gcGFyYW1ldGVyL29wdGlvbnNcbiAgICogb2JqZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgVGhlIG9iamVjdCB3ZSBhcmUgZXh0cmFjdGluZyB2YWx1ZXMgZnJvbVxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2UgYXJlIGdldHRpbmcuXG4gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgQW4gb3B0aW9uYWwgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nXG4gICAqIGZyb20gdGhlIG9iamVjdC4gSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkIGFuZCB0aGUgcHJvcGVydHkgaXMgbWlzc2luZywgYW5cbiAgICogZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAqL1xuICBmdW5jdGlvbiBnZXRBcmcoYUFyZ3MsIGFOYW1lLCBhRGVmYXVsdFZhbHVlKSB7XG4gICAgaWYgKGFOYW1lIGluIGFBcmdzKSB7XG4gICAgICByZXR1cm4gYUFyZ3NbYU5hbWVdO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgcmV0dXJuIGFEZWZhdWx0VmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgYU5hbWUgKyAnXCIgaXMgYSByZXF1aXJlZCBhcmd1bWVudC4nKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0cy5nZXRBcmcgPSBnZXRBcmc7XG5cbiAgdmFyIHVybFJlZ2V4cCA9IC9eKD86KFtcXHcrXFwtLl0rKTopP1xcL1xcLyg/OihcXHcrOlxcdyspQCk/KFtcXHcuXSopKD86OihcXGQrKSk/KFxcUyopJC87XG4gIHZhciBkYXRhVXJsUmVnZXhwID0gL15kYXRhOi4rXFwsLiskLztcblxuICBmdW5jdGlvbiB1cmxQYXJzZShhVXJsKSB7XG4gICAgdmFyIG1hdGNoID0gYVVybC5tYXRjaCh1cmxSZWdleHApO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1lOiBtYXRjaFsxXSxcbiAgICAgIGF1dGg6IG1hdGNoWzJdLFxuICAgICAgaG9zdDogbWF0Y2hbM10sXG4gICAgICBwb3J0OiBtYXRjaFs0XSxcbiAgICAgIHBhdGg6IG1hdGNoWzVdXG4gICAgfTtcbiAgfVxuICBleHBvcnRzLnVybFBhcnNlID0gdXJsUGFyc2U7XG5cbiAgZnVuY3Rpb24gdXJsR2VuZXJhdGUoYVBhcnNlZFVybCkge1xuICAgIHZhciB1cmwgPSAnJztcbiAgICBpZiAoYVBhcnNlZFVybC5zY2hlbWUpIHtcbiAgICAgIHVybCArPSBhUGFyc2VkVXJsLnNjaGVtZSArICc6JztcbiAgICB9XG4gICAgdXJsICs9ICcvLyc7XG4gICAgaWYgKGFQYXJzZWRVcmwuYXV0aCkge1xuICAgICAgdXJsICs9IGFQYXJzZWRVcmwuYXV0aCArICdAJztcbiAgICB9XG4gICAgaWYgKGFQYXJzZWRVcmwuaG9zdCkge1xuICAgICAgdXJsICs9IGFQYXJzZWRVcmwuaG9zdDtcbiAgICB9XG4gICAgaWYgKGFQYXJzZWRVcmwucG9ydCkge1xuICAgICAgdXJsICs9IFwiOlwiICsgYVBhcnNlZFVybC5wb3J0XG4gICAgfVxuICAgIGlmIChhUGFyc2VkVXJsLnBhdGgpIHtcbiAgICAgIHVybCArPSBhUGFyc2VkVXJsLnBhdGg7XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgZXhwb3J0cy51cmxHZW5lcmF0ZSA9IHVybEdlbmVyYXRlO1xuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIGEgcGF0aCwgb3IgdGhlIHBhdGggcG9ydGlvbiBvZiBhIFVSTDpcbiAgICpcbiAgICogLSBSZXBsYWNlcyBjb25zZXF1dGl2ZSBzbGFzaGVzIHdpdGggb25lIHNsYXNoLlxuICAgKiAtIFJlbW92ZXMgdW5uZWNlc3NhcnkgJy4nIHBhcnRzLlxuICAgKiAtIFJlbW92ZXMgdW5uZWNlc3NhcnkgJzxkaXI+Ly4uJyBwYXJ0cy5cbiAgICpcbiAgICogQmFzZWQgb24gY29kZSBpbiB0aGUgTm9kZS5qcyAncGF0aCcgY29yZSBtb2R1bGUuXG4gICAqXG4gICAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciB1cmwgdG8gbm9ybWFsaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplKGFQYXRoKSB7XG4gICAgdmFyIHBhdGggPSBhUGF0aDtcbiAgICB2YXIgdXJsID0gdXJsUGFyc2UoYVBhdGgpO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIGlmICghdXJsLnBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGFQYXRoO1xuICAgICAgfVxuICAgICAgcGF0aCA9IHVybC5wYXRoO1xuICAgIH1cbiAgICB2YXIgaXNBYnNvbHV0ZSA9IChwYXRoLmNoYXJBdCgwKSA9PT0gJy8nKTtcblxuICAgIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoL1xcLysvKTtcbiAgICBmb3IgKHZhciBwYXJ0LCB1cCA9IDAsIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuLicpIHtcbiAgICAgICAgdXArKztcbiAgICAgIH0gZWxzZSBpZiAodXAgPiAwKSB7XG4gICAgICAgIGlmIChwYXJ0ID09PSAnJykge1xuICAgICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IGlzIGJsYW5rIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLiBUcnlpbmcgdG8gZ29cbiAgICAgICAgICAvLyBhYm92ZSB0aGUgcm9vdCBpcyBhIG5vLW9wLiBUaGVyZWZvcmUgd2UgY2FuIHJlbW92ZSBhbGwgJy4uJyBwYXJ0c1xuICAgICAgICAgIC8vIGRpcmVjdGx5IGFmdGVyIHRoZSByb290LlxuICAgICAgICAgIHBhcnRzLnNwbGljZShpICsgMSwgdXApO1xuICAgICAgICAgIHVwID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMik7XG4gICAgICAgICAgdXAtLTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwYXRoID0gcGFydHMuam9pbignLycpO1xuXG4gICAgaWYgKHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gaXNBYnNvbHV0ZSA/ICcvJyA6ICcuJztcbiAgICB9XG5cbiAgICBpZiAodXJsKSB7XG4gICAgICB1cmwucGF0aCA9IHBhdGg7XG4gICAgICByZXR1cm4gdXJsR2VuZXJhdGUodXJsKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cbiAgZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG5cbiAgLyoqXG4gICAqIEpvaW5zIHR3byBwYXRocy9VUkxzLlxuICAgKlxuICAgKiBAcGFyYW0gYVJvb3QgVGhlIHJvb3QgcGF0aCBvciBVUkwuXG4gICAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciBVUkwgdG8gYmUgam9pbmVkIHdpdGggdGhlIHJvb3QuXG4gICAqXG4gICAqIC0gSWYgYVBhdGggaXMgYSBVUkwgb3IgYSBkYXRhIFVSSSwgYVBhdGggaXMgcmV0dXJuZWQsIHVubGVzcyBhUGF0aCBpcyBhXG4gICAqICAgc2NoZW1lLXJlbGF0aXZlIFVSTDogVGhlbiB0aGUgc2NoZW1lIG9mIGFSb290LCBpZiBhbnksIGlzIHByZXBlbmRlZFxuICAgKiAgIGZpcnN0LlxuICAgKiAtIE90aGVyd2lzZSBhUGF0aCBpcyBhIHBhdGguIElmIGFSb290IGlzIGEgVVJMLCB0aGVuIGl0cyBwYXRoIHBvcnRpb25cbiAgICogICBpcyB1cGRhdGVkIHdpdGggdGhlIHJlc3VsdCBhbmQgYVJvb3QgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgcmVzdWx0XG4gICAqICAgaXMgcmV0dXJuZWQuXG4gICAqICAgLSBJZiBhUGF0aCBpcyBhYnNvbHV0ZSwgdGhlIHJlc3VsdCBpcyBhUGF0aC5cbiAgICogICAtIE90aGVyd2lzZSB0aGUgdHdvIHBhdGhzIGFyZSBqb2luZWQgd2l0aCBhIHNsYXNoLlxuICAgKiAtIEpvaW5pbmcgZm9yIGV4YW1wbGUgJ2h0dHA6Ly8nIGFuZCAnd3d3LmV4YW1wbGUuY29tJyBpcyBhbHNvIHN1cHBvcnRlZC5cbiAgICovXG4gIGZ1bmN0aW9uIGpvaW4oYVJvb3QsIGFQYXRoKSB7XG4gICAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgICBhUm9vdCA9IFwiLlwiO1xuICAgIH1cbiAgICBpZiAoYVBhdGggPT09IFwiXCIpIHtcbiAgICAgIGFQYXRoID0gXCIuXCI7XG4gICAgfVxuICAgIHZhciBhUGF0aFVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgICB2YXIgYVJvb3RVcmwgPSB1cmxQYXJzZShhUm9vdCk7XG4gICAgaWYgKGFSb290VXJsKSB7XG4gICAgICBhUm9vdCA9IGFSb290VXJsLnBhdGggfHwgJy8nO1xuICAgIH1cblxuICAgIC8vIGBqb2luKGZvbywgJy8vd3d3LmV4YW1wbGUub3JnJylgXG4gICAgaWYgKGFQYXRoVXJsICYmICFhUGF0aFVybC5zY2hlbWUpIHtcbiAgICAgIGlmIChhUm9vdFVybCkge1xuICAgICAgICBhUGF0aFVybC5zY2hlbWUgPSBhUm9vdFVybC5zY2hlbWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXJsR2VuZXJhdGUoYVBhdGhVcmwpO1xuICAgIH1cblxuICAgIGlmIChhUGF0aFVybCB8fCBhUGF0aC5tYXRjaChkYXRhVXJsUmVnZXhwKSkge1xuICAgICAgcmV0dXJuIGFQYXRoO1xuICAgIH1cblxuICAgIC8vIGBqb2luKCdodHRwOi8vJywgJ3d3dy5leGFtcGxlLmNvbScpYFxuICAgIGlmIChhUm9vdFVybCAmJiAhYVJvb3RVcmwuaG9zdCAmJiAhYVJvb3RVcmwucGF0aCkge1xuICAgICAgYVJvb3RVcmwuaG9zdCA9IGFQYXRoO1xuICAgICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgICB9XG5cbiAgICB2YXIgam9pbmVkID0gYVBhdGguY2hhckF0KDApID09PSAnLydcbiAgICAgID8gYVBhdGhcbiAgICAgIDogbm9ybWFsaXplKGFSb290LnJlcGxhY2UoL1xcLyskLywgJycpICsgJy8nICsgYVBhdGgpO1xuXG4gICAgaWYgKGFSb290VXJsKSB7XG4gICAgICBhUm9vdFVybC5wYXRoID0gam9pbmVkO1xuICAgICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgICB9XG4gICAgcmV0dXJuIGpvaW5lZDtcbiAgfVxuICBleHBvcnRzLmpvaW4gPSBqb2luO1xuXG4gIC8qKlxuICAgKiBNYWtlIGEgcGF0aCByZWxhdGl2ZSB0byBhIFVSTCBvciBhbm90aGVyIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBhUm9vdCBUaGUgcm9vdCBwYXRoIG9yIFVSTC5cbiAgICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBtYWRlIHJlbGF0aXZlIHRvIGFSb290LlxuICAgKi9cbiAgZnVuY3Rpb24gcmVsYXRpdmUoYVJvb3QsIGFQYXRoKSB7XG4gICAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgICBhUm9vdCA9IFwiLlwiO1xuICAgIH1cblxuICAgIGFSb290ID0gYVJvb3QucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAgIC8vIFhYWDogSXQgaXMgcG9zc2libGUgdG8gcmVtb3ZlIHRoaXMgYmxvY2ssIGFuZCB0aGUgdGVzdHMgc3RpbGwgcGFzcyFcbiAgICB2YXIgdXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICAgIGlmIChhUGF0aC5jaGFyQXQoMCkgPT0gXCIvXCIgJiYgdXJsICYmIHVybC5wYXRoID09IFwiL1wiKSB7XG4gICAgICByZXR1cm4gYVBhdGguc2xpY2UoMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFQYXRoLmluZGV4T2YoYVJvb3QgKyAnLycpID09PSAwXG4gICAgICA/IGFQYXRoLnN1YnN0cihhUm9vdC5sZW5ndGggKyAxKVxuICAgICAgOiBhUGF0aDtcbiAgfVxuICBleHBvcnRzLnJlbGF0aXZlID0gcmVsYXRpdmU7XG5cbiAgLyoqXG4gICAqIEJlY2F1c2UgYmVoYXZpb3IgZ29lcyB3YWNreSB3aGVuIHlvdSBzZXQgYF9fcHJvdG9fX2Agb24gb2JqZWN0cywgd2VcbiAgICogaGF2ZSB0byBwcmVmaXggYWxsIHRoZSBzdHJpbmdzIGluIG91ciBzZXQgd2l0aCBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyLlxuICAgKlxuICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9wdWxsLzMxIGFuZFxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8zMFxuICAgKlxuICAgKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAgICovXG4gIGZ1bmN0aW9uIHRvU2V0U3RyaW5nKGFTdHIpIHtcbiAgICByZXR1cm4gJyQnICsgYVN0cjtcbiAgfVxuICBleHBvcnRzLnRvU2V0U3RyaW5nID0gdG9TZXRTdHJpbmc7XG5cbiAgZnVuY3Rpb24gZnJvbVNldFN0cmluZyhhU3RyKSB7XG4gICAgcmV0dXJuIGFTdHIuc3Vic3RyKDEpO1xuICB9XG4gIGV4cG9ydHMuZnJvbVNldFN0cmluZyA9IGZyb21TZXRTdHJpbmc7XG5cbiAgZnVuY3Rpb24gc3RyY21wKGFTdHIxLCBhU3RyMikge1xuICAgIHZhciBzMSA9IGFTdHIxIHx8IFwiXCI7XG4gICAgdmFyIHMyID0gYVN0cjIgfHwgXCJcIjtcbiAgICByZXR1cm4gKHMxID4gczIpIC0gKHMxIDwgczIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2hlcmUgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gICAqXG4gICAqIE9wdGlvbmFsbHkgcGFzcyBpbiBgdHJ1ZWAgYXMgYG9ubHlDb21wYXJlR2VuZXJhdGVkYCB0byBjb25zaWRlciB0d29cbiAgICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4sIGJ1dCBkaWZmZXJlbnQgZ2VuZXJhdGVkXG4gICAqIGxpbmUgYW5kIGNvbHVtbiB0aGUgc2FtZS4gVXNlZnVsIHdoZW4gc2VhcmNoaW5nIGZvciBhIG1hcHBpbmcgd2l0aCBhXG4gICAqIHN0dWJiZWQgb3V0IG1hcHBpbmcuXG4gICAqL1xuICBmdW5jdGlvbiBjb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyhtYXBwaW5nQSwgbWFwcGluZ0IsIG9ubHlDb21wYXJlT3JpZ2luYWwpIHtcbiAgICB2YXIgY21wO1xuXG4gICAgY21wID0gc3RyY21wKG1hcHBpbmdBLnNvdXJjZSwgbWFwcGluZ0Iuc291cmNlKTtcbiAgICBpZiAoY21wKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgICBpZiAoY21wKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gICAgaWYgKGNtcCB8fCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbiAgICBpZiAoY21wKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICAgIGlmIChjbXApIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgfTtcbiAgZXhwb3J0cy5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyA9IGNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zO1xuXG4gIC8qKlxuICAgKiBDb21wYXJhdG9yIGJldHdlZW4gdHdvIG1hcHBpbmdzIHdoZXJlIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zIGFyZVxuICAgKiBjb21wYXJlZC5cbiAgICpcbiAgICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICAgKiBtYXBwaW5ncyB3aXRoIHRoZSBzYW1lIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4sIGJ1dCBkaWZmZXJlbnRcbiAgICogc291cmNlL25hbWUvb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHRoZSBzYW1lLiBVc2VmdWwgd2hlbiBzZWFyY2hpbmcgZm9yIGFcbiAgICogbWFwcGluZyB3aXRoIGEgc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9ucyhtYXBwaW5nQSwgbWFwcGluZ0IsIG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gICAgdmFyIGNtcDtcblxuICAgIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICAgIGlmIChjbXApIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICAgIGlmIChjbXAgfHwgb25seUNvbXBhcmVHZW5lcmF0ZWQpIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgY21wID0gc3RyY21wKG1hcHBpbmdBLnNvdXJjZSwgbWFwcGluZ0Iuc291cmNlKTtcbiAgICBpZiAoY21wKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgICBpZiAoY21wKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gICAgaWYgKGNtcCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyY21wKG1hcHBpbmdBLm5hbWUsIG1hcHBpbmdCLm5hbWUpO1xuICB9O1xuICBleHBvcnRzLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9ucyA9IGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9ucztcblxufSk7XG4iLCJcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHRyaW07XG5cbmZ1bmN0aW9uIHRyaW0oc3RyKXtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzKnxcXHMqJC9nLCAnJyk7XG59XG5cbmV4cG9ydHMubGVmdCA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyovLCAnJyk7XG59O1xuXG5leHBvcnRzLnJpZ2h0ID0gZnVuY3Rpb24oc3RyKXtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciB3aW5kb3cgPSByZXF1aXJlKFwiZ2xvYmFsL3dpbmRvd1wiKVxudmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKFwiaXMtZnVuY3Rpb25cIilcbnZhciBwYXJzZUhlYWRlcnMgPSByZXF1aXJlKFwicGFyc2UtaGVhZGVyc1wiKVxudmFyIHh0ZW5kID0gcmVxdWlyZShcInh0ZW5kXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlWEhSXG5jcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QgPSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QgfHwgbm9vcFxuY3JlYXRlWEhSLlhEb21haW5SZXF1ZXN0ID0gXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiAobmV3IGNyZWF0ZVhIUi5YTUxIdHRwUmVxdWVzdCgpKSA/IGNyZWF0ZVhIUi5YTUxIdHRwUmVxdWVzdCA6IHdpbmRvdy5YRG9tYWluUmVxdWVzdFxuXG5mb3JFYWNoQXJyYXkoW1wiZ2V0XCIsIFwicHV0XCIsIFwicG9zdFwiLCBcInBhdGNoXCIsIFwiaGVhZFwiLCBcImRlbGV0ZVwiXSwgZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgY3JlYXRlWEhSW21ldGhvZCA9PT0gXCJkZWxldGVcIiA/IFwiZGVsXCIgOiBtZXRob2RdID0gZnVuY3Rpb24odXJpLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICBvcHRpb25zID0gaW5pdFBhcmFtcyh1cmksIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgICAgICBvcHRpb25zLm1ldGhvZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gICAgICAgIHJldHVybiBfY3JlYXRlWEhSKG9wdGlvbnMpXG4gICAgfVxufSlcblxuZnVuY3Rpb24gZm9yRWFjaEFycmF5KGFycmF5LCBpdGVyYXRvcikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlcmF0b3IoYXJyYXlbaV0pXG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0VtcHR5KG9iail7XG4gICAgZm9yKHZhciBpIGluIG9iail7XG4gICAgICAgIGlmKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGluaXRQYXJhbXModXJpLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIHZhciBwYXJhbXMgPSB1cmlcblxuICAgIGlmIChpc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9uc1xuICAgICAgICBpZiAodHlwZW9mIHVyaSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcGFyYW1zID0ge3VyaTp1cml9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbXMgPSB4dGVuZChvcHRpb25zLCB7dXJpOiB1cml9KVxuICAgIH1cblxuICAgIHBhcmFtcy5jYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgcmV0dXJuIHBhcmFtc1xufVxuXG5mdW5jdGlvbiBjcmVhdGVYSFIodXJpLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIG9wdGlvbnMgPSBpbml0UGFyYW1zKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICAgcmV0dXJuIF9jcmVhdGVYSFIob3B0aW9ucylcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZVhIUihvcHRpb25zKSB7XG4gICAgaWYodHlwZW9mIG9wdGlvbnMuY2FsbGJhY2sgPT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYWxsYmFjayBhcmd1bWVudCBtaXNzaW5nXCIpXG4gICAgfVxuXG4gICAgdmFyIGNhbGxlZCA9IGZhbHNlXG4gICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gY2JPbmNlKGVyciwgcmVzcG9uc2UsIGJvZHkpe1xuICAgICAgICBpZighY2FsbGVkKXtcbiAgICAgICAgICAgIGNhbGxlZCA9IHRydWVcbiAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2soZXJyLCByZXNwb25zZSwgYm9keSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlYWR5c3RhdGVjaGFuZ2UoKSB7XG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgc2V0VGltZW91dChsb2FkRnVuYywgMClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEJvZHkoKSB7XG4gICAgICAgIC8vIENocm9tZSB3aXRoIHJlcXVlc3RUeXBlPWJsb2IgdGhyb3dzIGVycm9ycyBhcnJvdW5kIHdoZW4gZXZlbiB0ZXN0aW5nIGFjY2VzcyB0byByZXNwb25zZVRleHRcbiAgICAgICAgdmFyIGJvZHkgPSB1bmRlZmluZWRcblxuICAgICAgICBpZiAoeGhyLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBib2R5ID0geGhyLnJlc3BvbnNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib2R5ID0geGhyLnJlc3BvbnNlVGV4dCB8fCBnZXRYbWwoeGhyKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzSnNvbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBib2R5XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJyb3JGdW5jKGV2dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dFRpbWVyKVxuICAgICAgICBpZighKGV2dCBpbnN0YW5jZW9mIEVycm9yKSl7XG4gICAgICAgICAgICBldnQgPSBuZXcgRXJyb3IoXCJcIiArIChldnQgfHwgXCJVbmtub3duIFhNTEh0dHBSZXF1ZXN0IEVycm9yXCIpIClcbiAgICAgICAgfVxuICAgICAgICBldnQuc3RhdHVzQ29kZSA9IDBcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGV2dCwgZmFpbHVyZVJlc3BvbnNlKVxuICAgIH1cblxuICAgIC8vIHdpbGwgbG9hZCB0aGUgZGF0YSAmIHByb2Nlc3MgdGhlIHJlc3BvbnNlIGluIGEgc3BlY2lhbCByZXNwb25zZSBvYmplY3RcbiAgICBmdW5jdGlvbiBsb2FkRnVuYygpIHtcbiAgICAgICAgaWYgKGFib3J0ZWQpIHJldHVyblxuICAgICAgICB2YXIgc3RhdHVzXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0VGltZXIpXG4gICAgICAgIGlmKG9wdGlvbnMudXNlWERSICYmIHhoci5zdGF0dXM9PT11bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vSUU4IENPUlMgR0VUIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgZG9lc24ndCBoYXZlIGEgc3RhdHVzIGZpZWxkLCBidXQgYm9keSBpcyBmaW5lXG4gICAgICAgICAgICBzdGF0dXMgPSAyMDBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXR1cyA9ICh4aHIuc3RhdHVzID09PSAxMjIzID8gMjA0IDogeGhyLnN0YXR1cylcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzcG9uc2UgPSBmYWlsdXJlUmVzcG9uc2VcbiAgICAgICAgdmFyIGVyciA9IG51bGxcblxuICAgICAgICBpZiAoc3RhdHVzICE9PSAwKXtcbiAgICAgICAgICAgIHJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgIGJvZHk6IGdldEJvZHkoKSxcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiBzdGF0dXMsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgICAgICAgdXJsOiB1cmksXG4gICAgICAgICAgICAgICAgcmF3UmVxdWVzdDogeGhyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKXsgLy9yZW1lbWJlciB4aHIgY2FuIGluIGZhY3QgYmUgWERSIGZvciBDT1JTIGluIElFXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IHBhcnNlSGVhZGVycyh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoXCJJbnRlcm5hbCBYTUxIdHRwUmVxdWVzdCBFcnJvclwiKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIsIHJlc3BvbnNlLCByZXNwb25zZS5ib2R5KVxuICAgIH1cblxuICAgIHZhciB4aHIgPSBvcHRpb25zLnhociB8fCBudWxsXG5cbiAgICBpZiAoIXhocikge1xuICAgICAgICBpZiAob3B0aW9ucy5jb3JzIHx8IG9wdGlvbnMudXNlWERSKSB7XG4gICAgICAgICAgICB4aHIgPSBuZXcgY3JlYXRlWEhSLlhEb21haW5SZXF1ZXN0KClcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB4aHIgPSBuZXcgY3JlYXRlWEhSLlhNTEh0dHBSZXF1ZXN0KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlcbiAgICB2YXIgYWJvcnRlZFxuICAgIHZhciB1cmkgPSB4aHIudXJsID0gb3B0aW9ucy51cmkgfHwgb3B0aW9ucy51cmxcbiAgICB2YXIgbWV0aG9kID0geGhyLm1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8IFwiR0VUXCJcbiAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keSB8fCBvcHRpb25zLmRhdGFcbiAgICB2YXIgaGVhZGVycyA9IHhoci5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9XG4gICAgdmFyIHN5bmMgPSAhIW9wdGlvbnMuc3luY1xuICAgIHZhciBpc0pzb24gPSBmYWxzZVxuICAgIHZhciB0aW1lb3V0VGltZXJcbiAgICB2YXIgZmFpbHVyZVJlc3BvbnNlID0ge1xuICAgICAgICBib2R5OiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBzdGF0dXNDb2RlOiAwLFxuICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgdXJsOiB1cmksXG4gICAgICAgIHJhd1JlcXVlc3Q6IHhoclxuICAgIH1cblxuICAgIGlmIChcImpzb25cIiBpbiBvcHRpb25zICYmIG9wdGlvbnMuanNvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgaXNKc29uID0gdHJ1ZVxuICAgICAgICBoZWFkZXJzW1wiYWNjZXB0XCJdIHx8IGhlYWRlcnNbXCJBY2NlcHRcIl0gfHwgKGhlYWRlcnNbXCJBY2NlcHRcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIikgLy9Eb24ndCBvdmVycmlkZSBleGlzdGluZyBhY2NlcHQgaGVhZGVyIGRlY2xhcmVkIGJ5IHVzZXJcbiAgICAgICAgaWYgKG1ldGhvZCAhPT0gXCJHRVRcIiAmJiBtZXRob2QgIT09IFwiSEVBRFwiKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiY29udGVudC10eXBlXCJdIHx8IGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gfHwgKGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIikgLy9Eb24ndCBvdmVycmlkZSBleGlzdGluZyBhY2NlcHQgaGVhZGVyIGRlY2xhcmVkIGJ5IHVzZXJcbiAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmpzb24gPT09IHRydWUgPyBib2R5IDogb3B0aW9ucy5qc29uKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHJlYWR5c3RhdGVjaGFuZ2VcbiAgICB4aHIub25sb2FkID0gbG9hZEZ1bmNcbiAgICB4aHIub25lcnJvciA9IGVycm9yRnVuY1xuICAgIC8vIElFOSBtdXN0IGhhdmUgb25wcm9ncmVzcyBiZSBzZXQgdG8gYSB1bmlxdWUgZnVuY3Rpb24uXG4gICAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIElFIG11c3QgZGllXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgYWJvcnRlZCA9IHRydWU7XG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBlcnJvckZ1bmNcbiAgICB4aHIub3BlbihtZXRob2QsIHVyaSwgIXN5bmMsIG9wdGlvbnMudXNlcm5hbWUsIG9wdGlvbnMucGFzc3dvcmQpXG4gICAgLy9oYXMgdG8gYmUgYWZ0ZXIgb3BlblxuICAgIGlmKCFzeW5jKSB7XG4gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSAhIW9wdGlvbnMud2l0aENyZWRlbnRpYWxzXG4gICAgfVxuICAgIC8vIENhbm5vdCBzZXQgdGltZW91dCB3aXRoIHN5bmMgcmVxdWVzdFxuICAgIC8vIG5vdCBzZXR0aW5nIHRpbWVvdXQgb24gdGhlIHhociBvYmplY3QsIGJlY2F1c2Ugb2Ygb2xkIHdlYmtpdHMgZXRjLiBub3QgaGFuZGxpbmcgdGhhdCBjb3JyZWN0bHlcbiAgICAvLyBib3RoIG5wbSdzIHJlcXVlc3QgYW5kIGpxdWVyeSAxLnggdXNlIHRoaXMga2luZCBvZiB0aW1lb3V0LCBzbyB0aGlzIGlzIGJlaW5nIGNvbnNpc3RlbnRcbiAgICBpZiAoIXN5bmMgJiYgb3B0aW9ucy50aW1lb3V0ID4gMCApIHtcbiAgICAgICAgdGltZW91dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYgKGFib3J0ZWQpIHJldHVyblxuICAgICAgICAgICAgYWJvcnRlZCA9IHRydWUvL0lFOSBtYXkgc3RpbGwgY2FsbCByZWFkeXN0YXRlY2hhbmdlXG4gICAgICAgICAgICB4aHIuYWJvcnQoXCJ0aW1lb3V0XCIpXG4gICAgICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcihcIlhNTEh0dHBSZXF1ZXN0IHRpbWVvdXRcIilcbiAgICAgICAgICAgIGUuY29kZSA9IFwiRVRJTUVET1VUXCJcbiAgICAgICAgICAgIGVycm9yRnVuYyhlKVxuICAgICAgICB9LCBvcHRpb25zLnRpbWVvdXQgKVxuICAgIH1cblxuICAgIGlmICh4aHIuc2V0UmVxdWVzdEhlYWRlcikge1xuICAgICAgICBmb3Ioa2V5IGluIGhlYWRlcnMpe1xuICAgICAgICAgICAgaWYoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRlcnNba2V5XSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5oZWFkZXJzICYmICFpc0VtcHR5KG9wdGlvbnMuaGVhZGVycykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSGVhZGVycyBjYW5ub3QgYmUgc2V0IG9uIGFuIFhEb21haW5SZXF1ZXN0IG9iamVjdFwiKVxuICAgIH1cblxuICAgIGlmIChcInJlc3BvbnNlVHlwZVwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9IG9wdGlvbnMucmVzcG9uc2VUeXBlXG4gICAgfVxuXG4gICAgaWYgKFwiYmVmb3JlU2VuZFwiIGluIG9wdGlvbnMgJiZcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMuYmVmb3JlU2VuZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgKSB7XG4gICAgICAgIG9wdGlvbnMuYmVmb3JlU2VuZCh4aHIpXG4gICAgfVxuXG4gICAgLy8gTWljcm9zb2Z0IEVkZ2UgYnJvd3NlciBzZW5kcyBcInVuZGVmaW5lZFwiIHdoZW4gc2VuZCBpcyBjYWxsZWQgd2l0aCB1bmRlZmluZWQgdmFsdWUuXG4gICAgLy8gWE1MSHR0cFJlcXVlc3Qgc3BlYyBzYXlzIHRvIHBhc3MgbnVsbCBhcyBib2R5IHRvIGluZGljYXRlIG5vIGJvZHlcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25hdWd0dXIveGhyL2lzc3Vlcy8xMDAuXG4gICAgeGhyLnNlbmQoYm9keSB8fCBudWxsKVxuXG4gICAgcmV0dXJuIHhoclxuXG5cbn1cblxuZnVuY3Rpb24gZ2V0WG1sKHhocikge1xuICAgIC8vIHhoci5yZXNwb25zZVhNTCB3aWxsIHRocm93IEV4Y2VwdGlvbiBcIkludmFsaWRTdGF0ZUVycm9yXCIgb3IgXCJET01FeGNlcHRpb25cIlxuICAgIC8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvWE1MSHR0cFJlcXVlc3QvcmVzcG9uc2VYTUwuXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHhoci5yZXNwb25zZVR5cGUgPT09IFwiZG9jdW1lbnRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVhNTFxuICAgICAgICB9XG4gICAgICAgIHZhciBmaXJlZm94QnVnVGFrZW5FZmZlY3QgPSB4aHIucmVzcG9uc2VYTUwgJiYgeGhyLnJlc3BvbnNlWE1MLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSA9PT0gXCJwYXJzZXJlcnJvclwiXG4gICAgICAgIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSBcIlwiICYmICFmaXJlZm94QnVnVGFrZW5FZmZlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB4aHIucmVzcG9uc2VYTUxcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBub29wKCkge31cbiIsIm1vZHVsZS5leHBvcnRzID0gZXh0ZW5kXG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGV4dGVuZCgpIHtcbiAgICB2YXIgdGFyZ2V0ID0ge31cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV1cblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbi8vSW1wb3J0IGhlbHBlcnNcblxudmFyIF9oZWxwZXJzID0gcmVxdWlyZSgnLi9oZWxwZXJzJyk7XG5cbi8vSW1wb3J0IHBhcnRpYWxzXG5cbnZhciBfcGFydGlhbHNfbGlzdCA9IHJlcXVpcmUoJy4vcGFydGlhbHMvX2xpc3QnKTtcblxudmFyIF9wYXJ0aWFsc19saXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BhcnRpYWxzX2xpc3QpO1xuXG52YXIgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ0hhbmRsZWJhcnMnKTtcbigwLCBfaGVscGVycy5pZkVxdWFscykoKTtcbigwLCBfcGFydGlhbHNfbGlzdDJbJ2RlZmF1bHQnXSkoKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gSGFuZGxlYmFycztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJOeWIzZGtablZ1WkdsdVp5MXdiR1ZrWjJVdFltOTRMMkp2ZDJWeVgyTnZiWEJ2Ym1WdWRITXZhblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwwaGhibVJzWldKaGNuTXZhR0Z1Wkd4bFltRnljeTVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeFpRVUZaTEVOQlFVTTdPenM3T3pzN096czdkVUpCUzFrc1YwRkJWenM3T3pzMlFrRkpiRUlzYTBKQlFXdENPenM3TzBGQlVIQkRMRWxCUVVrc1ZVRkJWU3hIUVVGSExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNRMEZCUXp0QlFVbDJReXgzUWtGQlZTeERRVUZETzBGQlNWZ3NhVU5CUVU4c1EwRkJRenM3Y1VKQlJVOHNWVUZCVlNJc0ltWnBiR1VpT2lKRE9pOTBaVzF3TDBkSExrWnliMjUwUlc1a0xsZHBaR2RsZEhNdmQybGtaMlYwY3k5amNtOTNaR1oxYm1ScGJtY3RjR3hsWkdkbExXSnZlQzlpYjNkbGNsOWpiMjF3YjI1bGJuUnpMMnAxYzNSbmFYWnBibWN0ZDJsa1oyVjBMV1p5WVcxbGQyOXlheTlqYjIxd2IyNWxiblJ6TDJ4cFlpOUlZVzVrYkdWaVlYSnpMMmhoYm1Sc1pXSmhjbk11YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SW5kWE5sSUhOMGNtbGpkQ2M3WEhKY2JseHlYRzVzWlhRZ1NHRnVaR3hsWW1GeWN5QTlJSEpsY1hWcGNtVW9KMGhoYm1Sc1pXSmhjbk1uS1R0Y2NseHVYSEpjYmk4dlNXMXdiM0owSUdobGJIQmxjbk5jY2x4dWFXMXdiM0owSUhzZ2FXWkZjWFZoYkhNZ2ZTQm1jbTl0SUNjdUwyaGxiSEJsY25Nbk8xeHlYRzVwWmtWeGRXRnNjeWdwTzF4eVhHNWNjbHh1THk5SmJYQnZjblFnY0dGeWRHbGhiSE5jY2x4dWFXMXdiM0owSUY5c2FYTjBJR1p5YjIwZ0p5NHZjR0Z5ZEdsaGJITXZYMnhwYzNRbk8xeHlYRzVmYkdsemRDZ3BPMXh5WEc1Y2NseHVaWGh3YjNKMElHUmxabUYxYkhRZ1NHRnVaR3hsWW1GeWN6c2lYWDA9IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG5cdHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuaWZFcXVhbHMgPSBpZkVxdWFscztcbnZhciBIYW5kbGViYXJzID0gcmVxdWlyZSgnSGFuZGxlYmFycycpO1xuXG4vKipcclxuICogU3RyaWN0IGNvbXBhcmlzb24gaGVscGVyIGZvciB1c2UgaW4gSGFuZGxlYmFycyB0ZW1wbGF0ZXNcclxuICogQHBhcmFtIHtTdHJpbmd9IEZpcnN0IGNvbmRpdGlvbiB0byBjb21wYXJlXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBTZWNvbmQgY29uZGl0aW9uIHRvIGNvbXBhcmVcclxuICogQHJldHVybiB7Qm9vbGVhbn0gV2hldGhlciBjb25kaXRpb25zIGFyZSBlcXVhbFxyXG4gKi9cblxuZnVuY3Rpb24gaWZFcXVhbHMoKSB7XG5cdEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2lmRXF1YWxzJywgZnVuY3Rpb24gKHYxLCB2Miwgb3B0aW9ucykge1xuXHRcdGlmICh2MSA9PT0gdjIpIHtcblx0XHRcdHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xuXHR9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTnliM2RrWm5WdVpHbHVaeTF3YkdWa1oyVXRZbTk0TDJKdmQyVnlYMk52YlhCdmJtVnVkSE12YW5WemRHZHBkbWx1WnkxM2FXUm5aWFF0Wm5KaGJXVjNiM0pyTDJOdmJYQnZibVZ1ZEhNdmJHbGlMMGhoYm1Sc1pXSmhjbk12YUdWc2NHVnljeTVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeFpRVUZaTEVOQlFVTTdPenM3T3p0QlFVVmlMRWxCUVVrc1ZVRkJWU3hIUVVGSExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNRMEZCUXpzN096czdPenM3TzBGQlVXaERMRk5CUVZNc1VVRkJVU3hIUVVGSk8wRkJRek5DTEZkQlFWVXNRMEZCUXl4alFVRmpMRU5CUVVNc1ZVRkJWU3hGUVVGRkxGVkJRVlVzUlVGQlJTeEZRVUZGTEVWQlFVVXNSVUZCUlN4UFFVRlBMRVZCUVVjN1FVRkRhRVVzVFVGQlNTeEZRVUZGTEV0QlFVc3NSVUZCUlN4RlFVRkhPMEZCUTJRc1ZVRkJUeXhQUVVGUExFTkJRVU1zUlVGQlJTeERRVUZGTEVsQlFVa3NRMEZCUlN4RFFVRkRPMGRCUXpOQ08wRkJRMFFzVTBGQlR5eFBRVUZQTEVOQlFVTXNUMEZCVHl4RFFVRkZMRWxCUVVrc1EwRkJSU3hEUVVGRE8wVkJRMmhETEVOQlFVTXNRMEZCUXp0RFFVTklJaXdpWm1sc1pTSTZJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMk55YjNka1puVnVaR2x1Wnkxd2JHVmtaMlV0WW05NEwySnZkMlZ5WDJOdmJYQnZibVZ1ZEhNdmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDBoaGJtUnNaV0poY25NdmFHVnNjR1Z5Y3k1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaWQxYzJVZ2MzUnlhV04wSnp0Y2NseHVYSEpjYm14bGRDQklZVzVrYkdWaVlYSnpJRDBnY21WeGRXbHlaU2duU0dGdVpHeGxZbUZ5Y3ljcE8xeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlGTjBjbWxqZENCamIyMXdZWEpwYzI5dUlHaGxiSEJsY2lCbWIzSWdkWE5sSUdsdUlFaGhibVJzWldKaGNuTWdkR1Z0Y0d4aGRHVnpYSEpjYmlBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCR2FYSnpkQ0JqYjI1a2FYUnBiMjRnZEc4Z1kyOXRjR0Z5WlZ4eVhHNGdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdVMlZqYjI1a0lHTnZibVJwZEdsdmJpQjBieUJqYjIxd1lYSmxYSEpjYmlBcUlFQnlaWFIxY200Z2UwSnZiMnhsWVc1OUlGZG9aWFJvWlhJZ1kyOXVaR2wwYVc5dWN5QmhjbVVnWlhGMVlXeGNjbHh1SUNvdlhISmNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQnBaa1Z4ZFdGc2N5QW9LU0I3WEhKY2JseDBTR0Z1Wkd4bFltRnljeTV5WldkcGMzUmxja2hsYkhCbGNpZ25hV1pGY1hWaGJITW5MQ0JtZFc1amRHbHZiaWdnZGpFc0lIWXlMQ0J2Y0hScGIyNXpJQ2tnZTF4eVhHNWNkQ0FnYVdZb0lIWXhJRDA5UFNCMk1pQXBJSHRjY2x4dVhIUWdJQ0FnY21WMGRYSnVJRzl3ZEdsdmJuTXVabTRvSUhSb2FYTWdLVHRjY2x4dVhIUWdJSDFjY2x4dVhIUWdJSEpsZEhWeWJpQnZjSFJwYjI1ekxtbHVkbVZ5YzJVb0lIUm9hWE1nS1R0Y2NseHVYSFI5S1R0Y2RGeHlYRzU5SUZ4eVhHNGlYWDA9IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG5cdHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IF9saXN0O1xudmFyIEhhbmRsZWJhcnMgPSByZXF1aXJlKCdIYW5kbGViYXJzJyk7XG5cbmZ1bmN0aW9uIF9saXN0KCkge1xuXHRIYW5kbGViYXJzLnJlZ2lzdGVyUGFydGlhbCgnbGlzdCcsICd7eyNpZkVxdWFscyBoYXNDYXJvdXNlbCBcXCd0cnVlXFwnfX1cXHRcXG4gICAgXFx0XFx0PGRpdiBjbGFzcz1cImNhcm91c2VsLXN0YWNrZWRcIiBkYXRhLWNhcm91c2VsPVwie3t2aWV3TmFtZX19XCI+XFxuXFx0XFx0XFx0XFx0PGJ1dHRvbiBjbGFzcz1cImJ0bi1pY29uLWwgY29udHJvbC1wcmV2XCIgZGF0YS1jb250cm9sLXByZXYgZGF0YS1hbmFseXRpY3MtZXZlbnQ9XCJHZXQgcHJldmlvdXMgcGFnZVwiIGRhdGEtYW5hbHl0aWNzLXN1YnR5cGU9XCJidXR0b25cIj5cXG5cXHRcXHRcXHRcXHRcXHQ8c3BhbiBjbGFzcz1cImhpZGVWaXN1YWxseVwiPlByZXZpb3VzIHBhZ2U8L3NwYW4+XFxuXFx0XFx0XFx0XFx0XFx0PHNwYW4gY2xhc3M9XCJidG4taWNvbi1jb250ZW50XCI+XFxuXFx0XFx0XFx0XFx0XFx0XFx0PHNwYW4gY2xhc3M9XCJzcHJpdGUtY2hldnJvbi11cC1sXCI+PC9zcGFuPlxcblxcdFxcdFxcdFxcdFxcdDwvc3Bhbj5cXG5cXHRcXHRcXHRcXHQ8L2J1dHRvbj5cXG5cXHRcXHRcXHRcXHQ8ZGl2IGNsYXNzPVwiY2Fyb3VzZWwtYXBlcnR1cmVcIiBkYXRhLWNhcm91c2VsLWFwZXJ0dXJlPlxcblxcdFxcdFxcdFxcdFxcdDx1bCBjbGFzcz1cImxpc3Qtc3RhY2tlZC1kaXZpZGVyXCIgZGF0YS1jYXJvdXNlbC1saXN0IGRhdGEtdmlldy17e3ZpZXdOYW1lfX0tbGlzdD48L3VsPlxcblxcdFxcdFxcdFxcdDwvZGl2PlxcblxcdFxcdFxcdFxcdDxidXR0b24gY2xhc3M9XCJidG4tdGVydGlhcnkgYnRuLXRleHQtbSBjb250cm9sLW5leHRcIiBkYXRhLWNvbnRyb2wtbmV4dCBkYXRhLWFuYWx5dGljcy1ldmVudD1cIkdldCBuZXh0IHBhZ2VcIiBkYXRhLWFuYWx5dGljcy1zdWJ0eXBlPVwiYnV0dG9uXCI+XFxuXFx0XFx0XFx0XFx0XFx0PHNwYW4gY2xhc3M9XCJidG4tdGV4dC1jb250ZW50XCI+U2hvdyBtb3JlPC9zcGFuPlxcblxcdFxcdFxcdFxcdFxcdDxzcGFuIGNsYXNzPVwicHJvZ3Jlc3Mtc3Bpbm5lclwiPlxcblxcdFxcdFxcdFxcdFxcdFxcdDxzcGFuIGNsYXNzPVwiaGlkZVZpc3VhbGx5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+UGxlYXNlIHdhaXQgYSBtb21lbnQsIGRhdGEgaXMgbG9hZGluZzwvc3Bhbj5cXG5cXHRcXHRcXHRcXHRcXHQ8L3NwYW4+XFxuXFx0XFx0XFx0XFx0PC9idXR0b24+XFxuXFx0XFx0XFx0PC9kaXY+XFxuXFx0XFx0e3svaWZFcXVhbHN9fVxcblxcdFxcdDx1bCBjbGFzcz1cImxpc3Qtc3RhY2tlZC1kaXZpZGVyXCIgZGF0YS12aWV3LXt7dmlld05hbWV9fS1saXN0PjwvdWw+Jyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJOeWIzZGtablZ1WkdsdVp5MXdiR1ZrWjJVdFltOTRMMkp2ZDJWeVgyTnZiWEJ2Ym1WdWRITXZhblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwwaGhibVJzWldKaGNuTXZjR0Z5ZEdsaGJITXZYMnhwYzNRdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzV1VGQldTeERRVUZET3pzN096dHhRa0ZKVnl4TFFVRkxPMEZCUmpkQ0xFbEJRVWtzVlVGQlZTeEhRVUZITEU5QlFVOHNRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJRenM3UVVGRmVFSXNVMEZCVXl4TFFVRkxMRWRCUVVrN1FVRkRhRU1zVjBGQlZTeERRVUZETEdWQlFXVXNRMEZCUXl4TlFVRk5MR3R0UTBGeFFtaERMRU5CUVVNN1EwRkRSaUlzSW1acGJHVWlPaUpET2k5MFpXMXdMMGRITGtaeWIyNTBSVzVrTGxkcFpHZGxkSE12ZDJsa1oyVjBjeTlqY205M1pHWjFibVJwYm1jdGNHeGxaR2RsTFdKdmVDOWliM2RsY2w5amIyMXdiMjVsYm5SekwycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5SVlXNWtiR1ZpWVhKekwzQmhjblJwWVd4ekwxOXNhWE4wTG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lKM1Z6WlNCemRISnBZM1FuTzF4eVhHNWNjbHh1YkdWMElFaGhibVJzWldKaGNuTWdQU0J5WlhGMWFYSmxLQ2RJWVc1a2JHVmlZWEp6SnlrN1hISmNibHh5WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0JtZFc1amRHbHZiaUJmYkdsemRDQW9LU0I3WEhKY2JseDBTR0Z1Wkd4bFltRnljeTV5WldkcGMzUmxjbEJoY25ScFlXd29KMnhwYzNRbkxGeHlYRzRnSUNBZ1hIUmdlM3NqYVdaRmNYVmhiSE1nYUdGelEyRnliM1Z6Wld3Z0ozUnlkV1VuZlgxY2RGeHlYRzRnSUNBZ1hIUmNkRHhrYVhZZ1kyeGhjM005WENKallYSnZkWE5sYkMxemRHRmphMlZrWENJZ1pHRjBZUzFqWVhKdmRYTmxiRDFjSW50N2RtbGxkMDVoYldWOWZWd2lQbHh5WEc1Y2RGeDBYSFJjZER4aWRYUjBiMjRnWTJ4aGMzTTlYQ0ppZEc0dGFXTnZiaTFzSUdOdmJuUnliMnd0Y0hKbGRsd2lJR1JoZEdFdFkyOXVkSEp2YkMxd2NtVjJJR1JoZEdFdFlXNWhiSGwwYVdOekxXVjJaVzUwUFZ3aVIyVjBJSEJ5WlhacGIzVnpJSEJoWjJWY0lpQmtZWFJoTFdGdVlXeDVkR2xqY3kxemRXSjBlWEJsUFZ3aVluVjBkRzl1WENJK1hISmNibHgwWEhSY2RGeDBYSFE4YzNCaGJpQmpiR0Z6Y3oxY0ltaHBaR1ZXYVhOMVlXeHNlVndpUGxCeVpYWnBiM1Z6SUhCaFoyVThMM053WVc0K1hISmNibHgwWEhSY2RGeDBYSFE4YzNCaGJpQmpiR0Z6Y3oxY0ltSjBiaTFwWTI5dUxXTnZiblJsYm5SY0lqNWNjbHh1WEhSY2RGeDBYSFJjZEZ4MFBITndZVzRnWTJ4aGMzTTlYQ0p6Y0hKcGRHVXRZMmhsZG5KdmJpMTFjQzFzWENJK1BDOXpjR0Z1UGx4eVhHNWNkRngwWEhSY2RGeDBQQzl6Y0dGdVBseHlYRzVjZEZ4MFhIUmNkRHd2WW5WMGRHOXVQbHh5WEc1Y2RGeDBYSFJjZER4a2FYWWdZMnhoYzNNOVhDSmpZWEp2ZFhObGJDMWhjR1Z5ZEhWeVpWd2lJR1JoZEdFdFkyRnliM1Z6Wld3dFlYQmxjblIxY21VK1hISmNibHgwWEhSY2RGeDBYSFE4ZFd3Z1kyeGhjM005WENKc2FYTjBMWE4wWVdOclpXUXRaR2wyYVdSbGNsd2lJR1JoZEdFdFkyRnliM1Z6Wld3dGJHbHpkQ0JrWVhSaExYWnBaWGN0ZTN0MmFXVjNUbUZ0WlgxOUxXeHBjM1ErUEM5MWJENWNjbHh1WEhSY2RGeDBYSFE4TDJScGRqNWNjbHh1WEhSY2RGeDBYSFE4WW5WMGRHOXVJR05zWVhOelBWd2lZblJ1TFhSbGNuUnBZWEo1SUdKMGJpMTBaWGgwTFcwZ1kyOXVkSEp2YkMxdVpYaDBYQ0lnWkdGMFlTMWpiMjUwY205c0xXNWxlSFFnWkdGMFlTMWhibUZzZVhScFkzTXRaWFpsYm5ROVhDSkhaWFFnYm1WNGRDQndZV2RsWENJZ1pHRjBZUzFoYm1Gc2VYUnBZM010YzNWaWRIbHdaVDFjSW1KMWRIUnZibHdpUGx4eVhHNWNkRngwWEhSY2RGeDBQSE53WVc0Z1kyeGhjM005WENKaWRHNHRkR1Y0ZEMxamIyNTBaVzUwWENJK1UyaHZkeUJ0YjNKbFBDOXpjR0Z1UGx4eVhHNWNkRngwWEhSY2RGeDBQSE53WVc0Z1kyeGhjM005WENKd2NtOW5jbVZ6Y3kxemNHbHVibVZ5WENJK1hISmNibHgwWEhSY2RGeDBYSFJjZER4emNHRnVJR05zWVhOelBWd2lhR2xrWlZacGMzVmhiR3g1WENJZ1lYSnBZUzFvYVdSa1pXNDlYQ0owY25WbFhDSStVR3hsWVhObElIZGhhWFFnWVNCdGIyMWxiblFzSUdSaGRHRWdhWE1nYkc5aFpHbHVaend2YzNCaGJqNWNjbHh1WEhSY2RGeDBYSFJjZER3dmMzQmhiajVjY2x4dVhIUmNkRngwWEhROEwySjFkSFJ2Ymo1Y2NseHVYSFJjZEZ4MFBDOWthWFkrWEhKY2JseDBYSFI3ZXk5cFprVnhkV0ZzYzMxOVhISmNibHgwWEhROGRXd2dZMnhoYzNNOVhDSnNhWE4wTFhOMFlXTnJaV1F0WkdsMmFXUmxjbHdpSUdSaGRHRXRkbWxsZHkxN2UzWnBaWGRPWVcxbGZYMHRiR2x6ZEQ0OEwzVnNQbUJjY2x4dVhIUXBPMXh5WEc1OUlsMTkiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxyXG4gKiBBZGQgYW5hbHl0aWNzIHRyYWNraW5nIHRvIGEgd2lkZ2V0XHJcbiAqIEBjbGFzc2Rlc2MgQWRkIGFuYWx5dGljcyBsaXN0ZW5lcnMgYW5kIGV2ZW50cyBmb3IgW2tpc3NtZXRyaWNzXSBhbmFseXRpY3MgZnJhbWV3b3JrXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLmNvbmZpZy4gSGFzaCBvZiB3aWRnZXQgY29uZmlnIG9wdGlvbnNcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMud2lkZ2V0LiBUaGUgd2lkZ2V0IGluc3RhbmNlIFtyZXF1aXJlZF1cclxuICogQGNsYXNzIFNldCBhbmFseXRpY3MgaW5zdGFuY2UgcHJvcGVydGllczsgaW5pdGlhbGlzZSBhbmFseXRpY3NcclxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG5cdHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbnZhciBBbmFseXRpY3MgPSAoZnVuY3Rpb24gKCkge1xuXHRmdW5jdGlvbiBBbmFseXRpY3MoKSB7XG5cdFx0dmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuXHRcdHZhciB3aWRnZXQgPSBfcmVmLndpZGdldDtcblx0XHR2YXIgY29uZmlnSGFzaCA9IF9yZWYuY29uZmlnSGFzaDtcblxuXHRcdF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbmFseXRpY3MpO1xuXG5cdFx0dGhpcy53aWRnZXQgPSB3aWRnZXQ7XG5cdFx0aWYgKCF0aGlzLndpZGdldCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmNvbmZpZ0hhc2ggPSBjb25maWdIYXNoIHx8IHt9O1xuXHRcdHRoaXMuaW5pdCgpO1xuXHR9XG5cblx0LyoqXHJcbiBcdCogSW5pdGlhbGlzZSBhbmFseXRpY3NcclxuIFx0KiBAZGVzY3JpcHRpb24gQ2FjaGUgdGhlIHdpZGdldCBlbGVtZW50OyBmZXRjaCBhbmFseXRpY3MgdmFsdWVzIG9uIHRoZSB3aWRnZXQgZWxlbWVudDsgdHJpZ2dlciBhbmFseXRpY3MgbWV0aG9kc1xyXG4gXHQqL1xuXG5cdF9jcmVhdGVDbGFzcyhBbmFseXRpY3MsIFt7XG5cdFx0a2V5OiAnaW5pdCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG5cdFx0XHR0aGlzLndpZGdldEVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtYW5hbHl0aWNzLXdpZGdldF0nKTtcblx0XHRcdGlmICh0aGlzLndpZGdldEVsKSB7XG5cdFx0XHRcdHRoaXMud2lkZ2V0TmFtZSA9IHRoaXMud2lkZ2V0RWwuZ2V0QXR0cmlidXRlKCdkYXRhLWFuYWx5dGljcy13aWRnZXQnKTtcblx0XHRcdFx0dGhpcy5jaGFyaXR5SWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jaGFyaXR5LWlkXScpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2hhcml0eS1pZF0nKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2hhcml0eS1pZCcpIDogJyc7XG5cdFx0XHRcdHRoaXMuZnJwSWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jaGFyaXR5LWZycElkXScpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2hhcml0eS1mcnBJZF0nKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2hhcml0eS1mcnBJZCcpIDogJyc7XG5cblx0XHRcdFx0dGhpcy5wdXNoQ29uZmlnKCk7XG5cdFx0XHRcdHRoaXMud2lkZ2V0SW5pdCgpO1xuXHRcdFx0XHR0aGlzLmNhcmRzSW5pdCgpO1xuXHRcdFx0XHR0aGlzLmNhcmRJbXByZXNzaW9ucygpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBQdXNoIHVzZXIgY29uZmlnIGhhc2ggW2luY2x1ZGluZyBwYXJlbnQgcGFnZSdzIHJlZmVycmVyXSB0byBraXNzbWV0cmljcyBhcyBwcm9wZXJ0eVxyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ3B1c2hDb25maWcnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBwdXNoQ29uZmlnKCkge1xuXHRcdFx0X2ttcS5wdXNoKFsnc2V0JywgdGhpcy5jb25maWdIYXNoXSk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIEluaXRpYWxpc2Ugd2lkZ2V0IGFuYWx5dGljcyBkYXRhIGhhc2hcclxuICBcdCogQGRlc2NyaXB0aW9uIENyZWF0ZSBhIGhhc2ggb2Ygd2lkZ2V0LWxldmVsIGFuYWx5dGljcyB2YWx1ZXM7IHN0b3JlIGl0IG9uIHRoZSB3aWRnZXQgZWxlbWVudDsgXHJcbiAgXHQqIHJlZ2lzdGVyIGNsaWNrIGxpc3RlbmVyIG9uIHdpZGdldCBlbGVtZW50XHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAnd2lkZ2V0SW5pdCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHdpZGdldEluaXQoKSB7XG5cdFx0XHR2YXIgX3RoaXMgPSB0aGlzO1xuXG5cdFx0XHR2YXIgYW5hbHl0aWNzRGF0YSA9IHtcblx0XHRcdFx0cGFnZV90eXBlOiAnd2lkZ2V0JywgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHRcdCdldmVudCc6ICdwYWdlIGNsaWNrJyxcblx0XHRcdFx0YWN0aXZpdHlfdHlwZTogdGhpcy53aWRnZXROYW1lLCAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0Y2hhcml0eV9pZDogdGhpcy5jaGFyaXR5SWQsIC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRwYWdlX2lkOiB0aGlzLmZycElkIC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0fTtcblx0XHRcdHRoaXMud2lkZ2V0RWwuYW5hbHl0aWNzID0gYW5hbHl0aWNzRGF0YTtcblxuXHRcdFx0dGhpcy53aWRnZXRFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdF90aGlzLndpZGdldENsaWNrKGUpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIFB1c2gga2lzc21ldHJpY3MgTk9OLWNhcmQgY2xpY2sgZXZlbnRzXHJcbiAgXHQqIEBkZXNjcmlwdGlvbiBIYW5kbGUgbm9uLWNhcmQgY2xpY2sgZXZlbnRzIG9uIHRoZSB3aWRnZXQgdXNpbmcgZXZlbnQgZGVsZWdhdGlvbi4gQ3JlYXRlIGNsaWNrIHZhbHVlcyBoYXNoIGZvciB0YXJnZXQgZWxlbWVudHMgXHJcbiAgXHQqIGFuZCBmaXJlIGtpc3NtZXRyaWNzIHBhZ2UgY2xpY2sgZXZlbnRcclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICd3aWRnZXRDbGljaycsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHdpZGdldENsaWNrKGUpIHtcblx0XHRcdHZhciBldnQgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzLWV2ZW50Jyk7XG5cdFx0XHRpZiAoZXZ0KSB7XG5cdFx0XHRcdHZhciBjbGlja0RhdGEgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLndpZGdldEVsLmFuYWx5dGljcyk7XG5cdFx0XHRcdGNsaWNrRGF0YS5zdWJ0eXBlID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWFuYWx5dGljcy1zdWJ0eXBlJyk7XG5cdFx0XHRcdGNsaWNrRGF0YS5ldmVudF92YWx1ZSA9IGV2dDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHRcdF9rbXEucHVzaChbJ3JlY29yZCcsICdwYWdlIGNsaWNrJywgY2xpY2tEYXRhXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIEluaXRpYWxpc2UgY2FyZCBhbmFseXRpY3MgZGF0YSBoYXNoXHJcbiAgXHQqIEBkZXNjcmlwdGlvbiBGb3IgZWFjaCBjYXJkIGluIHRoZSBET00gY3JlYXRlIGEgY2FyZCBhbmFseXRpY3MgaGFzaCBhbmQgc3RvcmUgaXQgb24gdGhlIGNhcmQgW2lmIG5vbmUgYWxyZWFkeSBwcmVzZW50XTtcclxuICBcdCogYW5kIGFkZCBjbGljayBsaXN0bmVyXHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAnY2FyZHNJbml0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gY2FyZHNJbml0KCkge1xuXHRcdFx0dmFyIF90aGlzMiA9IHRoaXM7XG5cblx0XHRcdHZhciBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFuYWx5dGljcy1jYXJkXScpO1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0XHRbXS5zbGljZS5jYWxsKGNhcmRzKS5mb3JFYWNoKGZ1bmN0aW9uIChjYXJkLCBpbmRleCkge1xuXHRcdFx0XHRjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1jYXJkLXJhbmsnLCBpbmRleCk7XG5cdFx0XHRcdGlmICghY2FyZC5hbmFseXRpY3MpIHtcblx0XHRcdFx0XHR2YXIgYW5hbHl0aWNzRGF0YSA9IHt9O1xuXHRcdFx0XHRcdHZhciBjaGFyaXR5SWQgPSBjYXJkLmdldEF0dHJpYnV0ZSgnZGF0YS1jaGFyaXR5LWlkJykgfHwgJyc7XG5cdFx0XHRcdFx0dmFyIGFjdGl2aXR5SWQgPSBjYXJkLmdldEF0dHJpYnV0ZSgnZGF0YS1hY3Rpdml0eS1pZCcpIHx8ICcnO1xuXHRcdFx0XHRcdHZhciBjYXJkUmFuayA9IGNhcmQuZ2V0QXR0cmlidXRlKCdkYXRhLWNhcmQtcmFuaycpO1xuXHRcdFx0XHRcdHZhciBjYXJkRnJwSWQgPSBjYXJkLmdldEF0dHJpYnV0ZSgnZGF0YS1mcnAtaWQnKSB8fCAnJztcblx0XHRcdFx0XHR2YXIgY2FyZFVybCA9IGNhcmQuZ2V0QXR0cmlidXRlKCdkYXRhLWNhcmQtdXJsJykgfHwgJyc7XG5cblx0XHRcdFx0XHRhbmFseXRpY3NEYXRhLnBhZ2VfdHlwZSA9ICd3aWRnZXQnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0XHRhbmFseXRpY3NEYXRhLmNhcmRfaWQgPSBfdGhpczIud2lkZ2V0TmFtZSArICctJyArIGNoYXJpdHlJZCArICctJyArIGFjdGl2aXR5SWQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRcdGFuYWx5dGljc0RhdGEuY2FyZF9yYW5rID0gY2FyZFJhbms7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRcdGFuYWx5dGljc0RhdGEuYWN0aXZpdHlfaWQgPSBhY3Rpdml0eUlkOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0XHRhbmFseXRpY3NEYXRhLmFjdGl2aXR5X3R5cGUgPSBfdGhpczIud2lkZ2V0TmFtZTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHRcdFx0YW5hbHl0aWNzRGF0YS5jaGFyaXR5X2lkID0gY2hhcml0eUlkOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0XHRhbmFseXRpY3NEYXRhLnBhZ2VfaWQgPSBjYXJkRnJwSWQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRcdGFuYWx5dGljc0RhdGEuY2FyZF91cmwgPSBjYXJkVXJsOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuXHRcdFx0XHRcdGNhcmQuYW5hbHl0aWNzID0gYW5hbHl0aWNzRGF0YTtcblxuXHRcdFx0XHRcdGNhcmQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdHNlbGYuY2FyZENsaWNrKGUsIHRoaXMpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogUHVzaCBraXNzbWV0cmljcyBjYXJkIGltcHJlc3Npb25zXHJcbiAgXHQqIEBkZXNjcmlwdGlvbiBGb3IgYWxsIHZpc2libGUgY2FyZHMsIGNyZWF0ZSBhIGNhcmQgaW1wcmVzc2lvbiBhbmFseXRpY3MgaGFzaCBhbmQgZmlyZSBhIGtpc3NtZXRyaWNzIGNhcmQgaW1wcmVzc2lvbiBldmVudFxyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ2NhcmRJbXByZXNzaW9ucycsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGNhcmRJbXByZXNzaW9ucygpIHtcblx0XHRcdHZhciBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFuYWx5dGljcy1jYXJkXTpub3QoW2RhdGEtaGlkZGVuXSknKTtcblx0XHRcdFtdLnNsaWNlLmNhbGwoY2FyZHMpLmZvckVhY2goZnVuY3Rpb24gKGNhcmQpIHtcblx0XHRcdFx0dmFyIGltcHJlc3Npb25EYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgY2FyZC5hbmFseXRpY3MpO1xuXHRcdFx0XHRpbXByZXNzaW9uRGF0YS5ldmVudCA9ICdpbXByZXNzaW9uJztcblx0XHRcdFx0aW1wcmVzc2lvbkRhdGEuY2FyZF9jb3VudCA9IGNhcmRzLmxlbmd0aDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHRcdF9rbXEucHVzaChbJ3JlY29yZCcsICdpbXByZXNzaW9uJywgaW1wcmVzc2lvbkRhdGFdKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBQdXNoIGtpc3NtZXRyaWNzIGNhcmQgY2xpY2sgZXZlbnRzXHJcbiAgXHQqIEBkZXNjcmlwdGlvbiBIYW5kbGUgY2FyZCBjbGljayBldmVudHMgb24gdGhlIHdpZGdldCB1c2luZyBldmVudCBkZWxlZ2F0aW9uLiBDcmVhdGUgYSBjYXJkIGNsaWNrIHZhbHVlcyBoYXNoIGZvciB0YXJlZ3QgY2FyZFxyXG4gIFx0KiBhbmQgZmlyZSBhIGtpc3NtZXRyaWNzIGNhcmQgY2xpY2sgZXZlbnQgXHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAnY2FyZENsaWNrJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gY2FyZENsaWNrKGUsIGNhcmQpIHtcblx0XHRcdHZhciBldnQgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzLWV2ZW50Jyk7XG5cdFx0XHRpZiAoZXZ0KSB7XG5cdFx0XHRcdHZhciBjbGlja0RhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBjYXJkLmFuYWx5dGljcyk7XG5cdFx0XHRcdGNsaWNrRGF0YS5ldmVudCA9ICdjYXJkIGNsaWNrJztcblx0XHRcdFx0Y2xpY2tEYXRhLnN1YnR5cGUgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzLXN1YnR5cGUnKTtcblx0XHRcdFx0Y2xpY2tEYXRhLmV2ZW50X3ZhbHVlID0gZXZ0OyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0Y2xpY2tEYXRhLmNhcmRfY291bnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hbmFseXRpY3MtY2FyZF06bm90KFtkYXRhLWhpZGRlbl0pJykubGVuZ3RoOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0X2ttcS5wdXNoKFsncmVjb3JkJywgJ2NhcmQgY2xpY2snLCBjbGlja0RhdGFdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gQW5hbHl0aWNzO1xufSkoKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gQW5hbHl0aWNzO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMk55YjNka1puVnVaR2x1Wnkxd2JHVmtaMlV0WW05NEwySnZkMlZ5WDJOdmJYQnZibVZ1ZEhNdmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDJwekwyWnlZVzFsZDI5eWF5OUJibUZzZVhScFkzTXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUVVFc1dVRkJXU3hEUVVGRE96czdPenM3T3pzN096czdPenM3T3pzN1NVRlZVQ3hUUVVGVE8wRkJRMFlzVlVGRVVDeFRRVUZUTEVkQlF6aENPMjFGUVVGTUxFVkJRVVU3TzAxQlFYcENMRTFCUVUwc1VVRkJUaXhOUVVGTk8wMUJRVVVzVlVGQlZTeFJRVUZXTEZWQlFWVTdPM2RDUVVRM1FpeFRRVUZUT3p0QlFVVmlMRTFCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzVFVGQlRTeERRVUZETzBGQlEzSkNMRTFCUVVzc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZITzBGQlEyNUNMRlZCUVU4N1IwRkRVRHRCUVVORUxFMUJRVWtzUTBGQlF5eFZRVUZWTEVkQlFVY3NWVUZCVlN4SlFVRkpMRVZCUVVVc1EwRkJRenRCUVVOdVF5eE5RVUZKTEVOQlFVTXNTVUZCU1N4RlFVRkZMRU5CUVVNN1JVRkRXanM3T3pzN096dGpRVkpKTEZOQlFWTTdPMU5CWVZRc1owSkJRVWM3UVVGRFVDeFBRVUZKTEVOQlFVTXNVVUZCVVN4SFFVRkhMRkZCUVZFc1EwRkJReXhoUVVGaExFTkJRVU1zZVVKQlFYbENMRU5CUVVNc1EwRkJRenRCUVVOc1JTeFBRVUZKTEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVVN1FVRkRiRUlzVVVGQlNTeERRVUZETEZWQlFWVXNSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExGbEJRVmtzUTBGQlF5eDFRa0ZCZFVJc1EwRkJReXhEUVVGRE8wRkJRM1JGTEZGQlFVa3NRMEZCUXl4VFFVRlRMRWRCUVVjc1VVRkJVU3hEUVVGRExHRkJRV0VzUTBGQlF5eHRRa0ZCYlVJc1EwRkJReXhIUVVNelJDeFJRVUZSTEVOQlFVTXNZVUZCWVN4RFFVRkRMRzFDUVVGdFFpeERRVUZETEVOQlFVTXNXVUZCV1N4RFFVRkRMR2xDUVVGcFFpeERRVUZETEVkQlFVY3NSVUZCUlN4RFFVRkRPMEZCUTJ4R0xGRkJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJReXh6UWtGQmMwSXNRMEZCUXl4SFFVTXhSQ3hSUVVGUkxFTkJRVU1zWVVGQllTeERRVUZETEhOQ1FVRnpRaXhEUVVGRExFTkJRVU1zV1VGQldTeERRVUZETEc5Q1FVRnZRaXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZET3p0QlFVVjRSaXhSUVVGSkxFTkJRVU1zVlVGQlZTeEZRVUZGTEVOQlFVTTdRVUZEYkVJc1VVRkJTU3hEUVVGRExGVkJRVlVzUlVGQlJTeERRVUZETzBGQlEyeENMRkZCUVVrc1EwRkJReXhUUVVGVExFVkJRVVVzUTBGQlF6dEJRVU5xUWl4UlFVRkpMRU5CUVVNc1pVRkJaU3hGUVVGRkxFTkJRVU03U1VGRGRrSTdSMEZEUkRzN096czdPenRUUVVsVkxITkNRVUZITzBGQlEySXNUMEZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFdEJRVXNzUlVGQlJTeEpRVUZKTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNc1EwRkJRenRIUVVOd1F6czdPenM3T3pzN08xTkJUVlVzYzBKQlFVYzdPenRCUVVOaUxFOUJRVWtzWVVGQllTeEhRVUZITzBGQlEyNUNMR0ZCUVZNc1JVRkJSU3hSUVVGUk8wRkJRMjVDTEZkQlFVOHNSVUZCUlN4WlFVRlpPMEZCUTNKQ0xHbENRVUZoTEVWQlFVVXNTVUZCU1N4RFFVRkRMRlZCUVZVN1FVRkRPVUlzWTBGQlZTeEZRVUZGTEVsQlFVa3NRMEZCUXl4VFFVRlRPMEZCUXpGQ0xGZEJRVThzUlVGQlJTeEpRVUZKTEVOQlFVTXNTMEZCU3p0SlFVTnVRaXhEUVVGRE8wRkJRMFlzVDBGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4VFFVRlRMRWRCUVVjc1lVRkJZU3hEUVVGRE96dEJRVVY0UXl4UFFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExHZENRVUZuUWl4RFFVRkRMRTlCUVU4c1JVRkJSU3hWUVVGRkxFTkJRVU1zUlVGQlRUdEJRVU5vUkN4VlFVRkxMRmRCUVZjc1EwRkJSU3hEUVVGRExFTkJRVVVzUTBGQlF6dEpRVU4wUWl4RFFVRkRMRU5CUVVNN1IwRkRTRHM3T3pzN096czdPMU5CVFZrc2NVSkJRVVVzUTBGQlF5eEZRVUZITzBGQlEyeENMRTlCUVVrc1IwRkJSeXhIUVVGSExFTkJRVU1zUTBGQlF5eE5RVUZOTEVOQlFVTXNXVUZCV1N4RFFVRkRMSE5DUVVGelFpeERRVUZETEVOQlFVTTdRVUZEZUVRc1QwRkJTU3hIUVVGSExFVkJRVVU3UVVGRFVpeFJRVUZKTEZOQlFWTXNSMEZCUnl4TlFVRk5MRU5CUVVNc1RVRkJUU3hEUVVGRExFVkJRVVVzUlVGQlJTeEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRk5CUVZNc1EwRkJSU3hEUVVGRE8wRkJRelZFTEdGQlFWTXNRMEZCUXl4UFFVRlBMRWRCUVVjc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eFpRVUZaTEVOQlFVTXNkMEpCUVhkQ0xFTkJRVU1zUTBGQlF6dEJRVU53UlN4aFFVRlRMRU5CUVVNc1YwRkJWeXhIUVVGSExFZEJRVWNzUTBGQlF6dEJRVU0xUWl4UlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zVVVGQlVTeEZRVUZGTEZsQlFWa3NSVUZCUlN4VFFVRlRMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJReTlETzBkQlEwUTdPenM3T3pzN096dFRRVTFWTEhGQ1FVRkhPenM3UVVGRFlpeFBRVUZKTEV0QlFVc3NSMEZCUnl4UlFVRlJMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNkVUpCUVhWQ0xFTkJRVU1zUTBGQlF6dEJRVU12UkN4UFFVRkpMRWxCUVVrc1IwRkJSeXhKUVVGSkxFTkJRVU03TzBGQlJXaENMRXRCUVVVc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZGTEV0QlFVc3NRMEZCUlN4RFFVRkRMRTlCUVU4c1EwRkJReXhWUVVGRkxFbEJRVWtzUlVGQlJTeExRVUZMTEVWQlFVMDdRVUZEYWtRc1VVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eG5Ra0ZCWjBJc1JVRkJSU3hMUVVGTExFTkJRVU1zUTBGQlF6dEJRVU16UXl4UlFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRExGTkJRVk1zUlVGQlJ6dEJRVU4wUWl4VFFVRkpMR0ZCUVdFc1IwRkJSeXhGUVVGRkxFTkJRVU03UVVGRGRrSXNVMEZCU1N4VFFVRlRMRWRCUVVjc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eHBRa0ZCYVVJc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF6dEJRVU16UkN4VFFVRkpMRlZCUVZVc1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEd0Q1FVRnJRaXhEUVVGRExFbEJRVWtzUlVGQlJTeERRVUZETzBGQlF6ZEVMRk5CUVVrc1VVRkJVU3hIUVVGSExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zUTBGQlF6dEJRVU51UkN4VFFVRkpMRk5CUVZNc1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEdGQlFXRXNRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJRenRCUVVOMlJDeFRRVUZKTEU5QlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExHVkJRV1VzUTBGQlF5eEpRVUZKTEVWQlFVVXNRMEZCUXpzN1FVRkZka1FzYTBKQlFXRXNRMEZCUXl4VFFVRlRMRWRCUVVjc1VVRkJVU3hEUVVGRE8wRkJRMjVETEd0Q1FVRmhMRU5CUVVNc1QwRkJUeXhIUVVGTkxFOUJRVXNzVlVGQlZTeFRRVUZKTEZOQlFWTXNVMEZCU1N4VlFVRlZMRUZCUVVVc1EwRkJRenRCUVVONFJTeHJRa0ZCWVN4RFFVRkRMRk5CUVZNc1IwRkJSeXhSUVVGUkxFTkJRVU03UVVGRGJrTXNhMEpCUVdFc1EwRkJReXhYUVVGWExFZEJRVWNzVlVGQlZTeERRVUZETzBGQlEzWkRMR3RDUVVGaExFTkJRVU1zWVVGQllTeEhRVUZITEU5QlFVc3NWVUZCVlN4RFFVRkRPMEZCUXpsRExHdENRVUZoTEVOQlFVTXNWVUZCVlN4SFFVRkhMRk5CUVZNc1EwRkJRenRCUVVOeVF5eHJRa0ZCWVN4RFFVRkRMRTlCUVU4c1IwRkJSeXhUUVVGVExFTkJRVU03UVVGRGJFTXNhMEpCUVdFc1EwRkJReXhSUVVGUkxFZEJRVWNzVDBGQlR5eERRVUZET3p0QlFVVnFReXhUUVVGSkxFTkJRVU1zVTBGQlV5eEhRVUZITEdGQlFXRXNRMEZCUXpzN1FVRkZMMElzVTBGQlNTeERRVUZETEdkQ1FVRm5RaXhEUVVGRExFOUJRVThzUlVGQlJTeFZRVUZYTEVOQlFVTXNSVUZCUnp0QlFVTTNReXhQUVVGRExFTkJRVU1zWlVGQlpTeEZRVUZGTEVOQlFVTTdRVUZEY0VJc1ZVRkJTU3hEUVVGRExGTkJRVk1zUTBGQlJTeERRVUZETEVWQlFVVXNTVUZCU1N4RFFVRkZMRU5CUVVNN1RVRkRNVUlzUTBGQlF5eERRVUZETzB0QlEwZzdTVUZEUkN4RFFVRkRMRU5CUVVNN1IwRkRTRHM3T3pzN096czdVMEZMWlN3eVFrRkJSenRCUVVOc1FpeFBRVUZKTEV0QlFVc3NSMEZCUnl4UlFVRlJMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNNRU5CUVRCRExFTkJRVU1zUTBGQlF6dEJRVU5zUml4TFFVRkZMRU5CUVVNc1MwRkJTeXhEUVVGRExFbEJRVWtzUTBGQlJTeExRVUZMTEVOQlFVVXNRMEZCUXl4UFFVRlBMRU5CUVVNc1ZVRkJSU3hKUVVGSkxFVkJRVTA3UVVGRE1VTXNVVUZCU1N4alFVRmpMRWRCUVVjc1RVRkJUU3hEUVVGRExFMUJRVTBzUTBGQlF5eEZRVUZGTEVWQlFVVXNTVUZCU1N4RFFVRkRMRk5CUVZNc1EwRkJSU3hEUVVGRE8wRkJRM2hFTEd0Q1FVRmpMRU5CUVVNc1MwRkJTeXhIUVVGSExGbEJRVmtzUTBGQlF6dEJRVU53UXl4clFrRkJZeXhEUVVGRExGVkJRVlVzUjBGQlJ5eExRVUZMTEVOQlFVTXNUVUZCVFN4RFFVRkRPMEZCUTNwRExGRkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4UlFVRlJMRVZCUVVVc1dVRkJXU3hGUVVGRkxHTkJRV01zUTBGQlF5eERRVUZETEVOQlFVTTdTVUZEY0VRc1EwRkJReXhEUVVGRE8wZEJRMGc3T3pzN096czdPenRUUVUxVExHMUNRVUZGTEVOQlFVTXNSVUZCUlN4SlFVRkpMRVZCUVVjN1FVRkRja0lzVDBGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhaUVVGWkxFTkJRVU1zYzBKQlFYTkNMRU5CUVVNc1EwRkJRenRCUVVONFJDeFBRVUZKTEVkQlFVY3NSVUZCUlR0QlFVTlNMRkZCUVVrc1UwRkJVeXhIUVVGSExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4RlFVRkZMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dEJRVU5zUkN4aFFVRlRMRU5CUVVNc1MwRkJTeXhIUVVGSExGbEJRVmtzUTBGQlF6dEJRVU12UWl4aFFVRlRMRU5CUVVNc1QwRkJUeXhIUVVGSExFTkJRVU1zUTBGQlF5eE5RVUZOTEVOQlFVTXNXVUZCV1N4RFFVRkRMSGRDUVVGM1FpeERRVUZETEVOQlFVTTdRVUZEY0VVc1lVRkJVeXhEUVVGRExGZEJRVmNzUjBGQlJ5eEhRVUZITEVOQlFVTTdRVUZETlVJc1lVRkJVeXhEUVVGRExGVkJRVlVzUjBGQlJ5eFJRVUZSTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zTUVOQlFUQkRMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU03UVVGRGNFY3NVVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExGRkJRVkVzUlVGQlJTeFpRVUZaTEVWQlFVVXNVMEZCVXl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVNdlF6dEhRVU5FT3pzN1VVRndTVWtzVTBGQlV6czdPM0ZDUVhWSlFTeFRRVUZUSWl3aVptbHNaU0k2SWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJOeWIzZGtablZ1WkdsdVp5MXdiR1ZrWjJVdFltOTRMMkp2ZDJWeVgyTnZiWEJ2Ym1WdWRITXZhblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwycHpMMlp5WVcxbGQyOXlheTlCYm1Gc2VYUnBZM011YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SW5kWE5sSUhOMGNtbGpkQ2M3WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nUVdSa0lHRnVZV3g1ZEdsamN5QjBjbUZqYTJsdVp5QjBieUJoSUhkcFpHZGxkRnh5WEc0Z0tpQkFZMnhoYzNOa1pYTmpJRUZrWkNCaGJtRnNlWFJwWTNNZ2JHbHpkR1Z1WlhKeklHRnVaQ0JsZG1WdWRITWdabTl5SUZ0cmFYTnpiV1YwY21samMxMGdZVzVoYkhsMGFXTnpJR1p5WVcxbGQyOXlhMXh5WEc0Z0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2IzQjBhVzl1YzF4eVhHNGdLaUJBY0dGeVlXMGdlMDlpYW1WamRIMGdiM0IwYVc5dWN5NWpiMjVtYVdjdUlFaGhjMmdnYjJZZ2QybGtaMlYwSUdOdmJtWnBaeUJ2Y0hScGIyNXpYSEpjYmlBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCdmNIUnBiMjV6TG5kcFpHZGxkQzRnVkdobElIZHBaR2RsZENCcGJuTjBZVzVqWlNCYmNtVnhkV2x5WldSZFhISmNiaUFxSUVCamJHRnpjeUJUWlhRZ1lXNWhiSGwwYVdOeklHbHVjM1JoYm1ObElIQnliM0JsY25ScFpYTTdJR2x1YVhScFlXeHBjMlVnWVc1aGJIbDBhV056WEhKY2JpQXFMMXh5WEc1amJHRnpjeUJCYm1Gc2VYUnBZM01nZTF4eVhHNWNkR052Ym5OMGNuVmpkRzl5SUNnZ2V5QjNhV1JuWlhRc0lHTnZibVpwWjBoaGMyZ2dmU0E5SUh0OUlDa2dlMXh5WEc1Y2RGeDBkR2hwY3k1M2FXUm5aWFFnUFNCM2FXUm5aWFE3WEhKY2JseDBYSFJwWmlBb0lDRjBhR2x6TG5kcFpHZGxkQ0FwSUh0Y2NseHVYSFJjZEZ4MGNtVjBkWEp1TzF4eVhHNWNkRngwZlZ4eVhHNWNkRngwZEdocGN5NWpiMjVtYVdkSVlYTm9JRDBnWTI5dVptbG5TR0Z6YUNCOGZDQjdmVHRjY2x4dVhIUmNkSFJvYVhNdWFXNXBkQ2dwTzF4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dUlGeDBLaUJKYm1sMGFXRnNhWE5sSUdGdVlXeDVkR2xqYzF4eVhHNGdYSFFxSUVCa1pYTmpjbWx3ZEdsdmJpQkRZV05vWlNCMGFHVWdkMmxrWjJWMElHVnNaVzFsYm5RN0lHWmxkR05vSUdGdVlXeDVkR2xqY3lCMllXeDFaWE1nYjI0Z2RHaGxJSGRwWkdkbGRDQmxiR1Z0Wlc1ME95QjBjbWxuWjJWeUlHRnVZV3g1ZEdsamN5QnRaWFJvYjJSelhISmNiaUJjZENvdlhISmNibHgwYVc1cGRDQW9LU0I3WEhKY2JseDBYSFIwYUdsekxuZHBaR2RsZEVWc0lEMGdaRzlqZFcxbGJuUXVjWFZsY25sVFpXeGxZM1J2Y2lnblcyUmhkR0V0WVc1aGJIbDBhV056TFhkcFpHZGxkRjBuS1R0Y2NseHVYSFJjZEdsbUlDaDBhR2x6TG5kcFpHZGxkRVZzS1NCN1hISmNibHgwWEhSY2RIUm9hWE11ZDJsa1oyVjBUbUZ0WlNBOUlIUm9hWE11ZDJsa1oyVjBSV3d1WjJWMFFYUjBjbWxpZFhSbEtDZGtZWFJoTFdGdVlXeDVkR2xqY3kxM2FXUm5aWFFuS1R0Y2NseHVYSFJjZEZ4MGRHaHBjeTVqYUdGeWFYUjVTV1FnUFNCa2IyTjFiV1Z1ZEM1eGRXVnllVk5sYkdWamRHOXlLQ2RiWkdGMFlTMWphR0Z5YVhSNUxXbGtYU2NwSUQ4Z1hISmNibHgwWEhSY2RGeDBaRzlqZFcxbGJuUXVjWFZsY25sVFpXeGxZM1J2Y2lnblcyUmhkR0V0WTJoaGNtbDBlUzFwWkYwbktTNW5aWFJCZEhSeWFXSjFkR1VvSjJSaGRHRXRZMmhoY21sMGVTMXBaQ2NwSURvZ0p5YzdYSEpjYmx4MFhIUmNkSFJvYVhNdVpuSndTV1FnUFNCa2IyTjFiV1Z1ZEM1eGRXVnllVk5sYkdWamRHOXlLQ2RiWkdGMFlTMWphR0Z5YVhSNUxXWnljRWxrWFNjcElEOGdYSEpjYmx4MFhIUmNkRngwWkc5amRXMWxiblF1Y1hWbGNubFRaV3hsWTNSdmNpZ25XMlJoZEdFdFkyaGhjbWwwZVMxbWNuQkpaRjBuS1M1blpYUkJkSFJ5YVdKMWRHVW9KMlJoZEdFdFkyaGhjbWwwZVMxbWNuQkpaQ2NwSURvZ0p5YzdYSEpjYmx4MFhIUmNkRnh5WEc1Y2RGeDBYSFIwYUdsekxuQjFjMmhEYjI1bWFXY29LVHRjY2x4dVhIUmNkRngwZEdocGN5NTNhV1JuWlhSSmJtbDBLQ2s3WEhKY2JseDBYSFJjZEhSb2FYTXVZMkZ5WkhOSmJtbDBLQ2s3WEhKY2JseDBYSFJjZEhSb2FYTXVZMkZ5WkVsdGNISmxjM05wYjI1ektDazdYSEpjYmx4MFhIUjlYSEpjYmx4MGZWeDBYSEpjYmx4MEx5b3FYSEpjYmlCY2RDb2dVSFZ6YUNCMWMyVnlJR052Ym1acFp5Qm9ZWE5vSUZ0cGJtTnNkV1JwYm1jZ2NHRnlaVzUwSUhCaFoyVW5jeUJ5WldabGNuSmxjbDBnZEc4Z2EybHpjMjFsZEhKcFkzTWdZWE1nY0hKdmNHVnlkSGxjY2x4dUlGeDBLaTljY2x4dVhIUndkWE5vUTI5dVptbG5JQ2dwSUh0Y2NseHVYSFJjZEY5cmJYRXVjSFZ6YUNoYkozTmxkQ2NzSUhSb2FYTXVZMjl1Wm1sblNHRnphRjBwTzF4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dUlGeDBLaUJKYm1sMGFXRnNhWE5sSUhkcFpHZGxkQ0JoYm1Gc2VYUnBZM01nWkdGMFlTQm9ZWE5vWEhKY2JpQmNkQ29nUUdSbGMyTnlhWEIwYVc5dUlFTnlaV0YwWlNCaElHaGhjMmdnYjJZZ2QybGtaMlYwTFd4bGRtVnNJR0Z1WVd4NWRHbGpjeUIyWVd4MVpYTTdJSE4wYjNKbElHbDBJRzl1SUhSb1pTQjNhV1JuWlhRZ1pXeGxiV1Z1ZERzZ1hISmNiaUJjZENvZ2NtVm5hWE4wWlhJZ1kyeHBZMnNnYkdsemRHVnVaWElnYjI0Z2QybGtaMlYwSUdWc1pXMWxiblJjY2x4dUlGeDBLaTljY2x4dVhIUjNhV1JuWlhSSmJtbDBJQ2dwSUhzZ1hISmNibHgwWEhSc1pYUWdZVzVoYkhsMGFXTnpSR0YwWVNBOUlIdGNjbHh1WEhSY2RGeDBjR0ZuWlY5MGVYQmxPaUFuZDJsa1oyVjBKeXdnTHk4Z2FuTm9hVzUwSUdsbmJtOXlaVHBzYVc1bFhISmNibHgwWEhSY2RDZGxkbVZ1ZENjNklDZHdZV2RsSUdOc2FXTnJKeXhjY2x4dVhIUmNkRngwWVdOMGFYWnBkSGxmZEhsd1pUb2dkR2hwY3k1M2FXUm5aWFJPWVcxbExDQXZMeUJxYzJocGJuUWdhV2R1YjNKbE9teHBibVZjY2x4dVhIUmNkRngwWTJoaGNtbDBlVjlwWkRvZ2RHaHBjeTVqYUdGeWFYUjVTV1FzSUM4dklHcHphR2x1ZENCcFoyNXZjbVU2YkdsdVpWeHlYRzVjZEZ4MFhIUndZV2RsWDJsa09pQjBhR2x6TG1aeWNFbGtJQzh2SUdwemFHbHVkQ0JwWjI1dmNtVTZiR2x1WlZ4eVhHNWNkRngwZlR0Y2NseHVYSFJjZEhSb2FYTXVkMmxrWjJWMFJXd3VZVzVoYkhsMGFXTnpJRDBnWVc1aGJIbDBhV056UkdGMFlUdGNjbHh1WEhSY2RGeHlYRzVjZEZ4MGRHaHBjeTUzYVdSblpYUkZiQzVoWkdSRmRtVnVkRXhwYzNSbGJtVnlLQ2RqYkdsamF5Y3NJQ2dnWlNBcElEMCtJSHRjY2x4dVhIUmNkRngwZEdocGN5NTNhV1JuWlhSRGJHbGpheWdnWlNBcE8xeHlYRzVjZEZ4MGZTazdYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzRnWEhRcUlGQjFjMmdnYTJsemMyMWxkSEpwWTNNZ1RrOU9MV05oY21RZ1kyeHBZMnNnWlhabGJuUnpYSEpjYmlCY2RDb2dRR1JsYzJOeWFYQjBhVzl1SUVoaGJtUnNaU0J1YjI0dFkyRnlaQ0JqYkdsamF5QmxkbVZ1ZEhNZ2IyNGdkR2hsSUhkcFpHZGxkQ0IxYzJsdVp5QmxkbVZ1ZENCa1pXeGxaMkYwYVc5dUxpQkRjbVZoZEdVZ1kyeHBZMnNnZG1Gc2RXVnpJR2hoYzJnZ1ptOXlJSFJoY21kbGRDQmxiR1Z0Wlc1MGN5QmNjbHh1SUZ4MEtpQmhibVFnWm1seVpTQnJhWE56YldWMGNtbGpjeUJ3WVdkbElHTnNhV05ySUdWMlpXNTBYSEpjYmlCY2RDb3ZYSEpjYmlCY2RIZHBaR2RsZEVOc2FXTnJJQ2dnWlNBcElIdGNjbHh1WEhSY2RHeGxkQ0JsZG5RZ1BTQmxMblJoY21kbGRDNW5aWFJCZEhSeWFXSjFkR1VvSjJSaGRHRXRZVzVoYkhsMGFXTnpMV1YyWlc1MEp5azdYSEpjYmx4MFhIUnBaaUFvWlhaMEtTQjdYSEpjYmx4MFhIUmNkR3hsZENCamJHbGphMFJoZEdFZ1BTQlBZbXBsWTNRdVlYTnphV2R1S0h0OUxDQjBhR2x6TG5kcFpHZGxkRVZzTG1GdVlXeDVkR2xqY3lBcE8xeHlYRzVjZEZ4MFhIUmpiR2xqYTBSaGRHRXVjM1ZpZEhsd1pTQTlJR1V1ZEdGeVoyVjBMbWRsZEVGMGRISnBZblYwWlNnblpHRjBZUzFoYm1Gc2VYUnBZM010YzNWaWRIbHdaU2NwTzF4eVhHNWNkRngwWEhSamJHbGphMFJoZEdFdVpYWmxiblJmZG1Gc2RXVWdQU0JsZG5RN0lDOHZJR3B6YUdsdWRDQnBaMjV2Y21VNmJHbHVaVnh5WEc1Y2RGeDBYSFJmYTIxeExuQjFjMmdvV3lkeVpXTnZjbVFuTENBbmNHRm5aU0JqYkdsamF5Y3NJR05zYVdOclJHRjBZVjBwTzF4MFhIUmNjbHh1WEhSY2RIMWNjbHh1WEhSOVhISmNibHgwTHlvcVhISmNiaUJjZENvZ1NXNXBkR2xoYkdselpTQmpZWEprSUdGdVlXeDVkR2xqY3lCa1lYUmhJR2hoYzJoY2NseHVJRngwS2lCQVpHVnpZM0pwY0hScGIyNGdSbTl5SUdWaFkyZ2dZMkZ5WkNCcGJpQjBhR1VnUkU5TklHTnlaV0YwWlNCaElHTmhjbVFnWVc1aGJIbDBhV056SUdoaGMyZ2dZVzVrSUhOMGIzSmxJR2wwSUc5dUlIUm9aU0JqWVhKa0lGdHBaaUJ1YjI1bElHRnNjbVZoWkhrZ2NISmxjMlZ1ZEYwN1hISmNiaUJjZENvZ1lXNWtJR0ZrWkNCamJHbGpheUJzYVhOMGJtVnlYSEpjYmlCY2RDb3ZYSEpjYmlCY2RHTmhjbVJ6U1c1cGRDQW9LU0I3WEhKY2JseDBYSFJzWlhRZ1kyRnlaSE1nUFNCa2IyTjFiV1Z1ZEM1eGRXVnllVk5sYkdWamRHOXlRV3hzS0NkYlpHRjBZUzFoYm1Gc2VYUnBZM010WTJGeVpGMG5LVHRjY2x4dVhIUmNkR3hsZENCelpXeG1JRDBnZEdocGN6dGNjbHh1WEhSY2RGeHlYRzVjZEZ4MFcxMHVjMnhwWTJVdVkyRnNiQ2dnWTJGeVpITWdLUzVtYjNKRllXTm9LQ2dnWTJGeVpDd2dhVzVrWlhnZ0tTQTlQaUI3WEhKY2JseDBYSFJjZEdOaGNtUXVjMlYwUVhSMGNtbGlkWFJsS0Nka1lYUmhMV05oY21RdGNtRnVheWNzSUdsdVpHVjRLVHRjY2x4dVhIUmNkRngwYVdZZ0tDQWhZMkZ5WkM1aGJtRnNlWFJwWTNNZ0tTQjdYSEpjYmx4MFhIUmNkRngwYkdWMElHRnVZV3g1ZEdsamMwUmhkR0VnUFNCN2ZUdGNjbHh1WEhSY2RGeDBYSFJzWlhRZ1kyaGhjbWwwZVVsa0lEMGdZMkZ5WkM1blpYUkJkSFJ5YVdKMWRHVW9KMlJoZEdFdFkyaGhjbWwwZVMxcFpDY3BJSHg4SUNjbk8xeHlYRzVjZEZ4MFhIUmNkR3hsZENCaFkzUnBkbWwwZVVsa0lEMGdZMkZ5WkM1blpYUkJkSFJ5YVdKMWRHVW9KMlJoZEdFdFlXTjBhWFpwZEhrdGFXUW5LU0I4ZkNBbkp6dGNjbHh1WEhSY2RGeDBYSFJzWlhRZ1kyRnlaRkpoYm1zZ1BTQmpZWEprTG1kbGRFRjBkSEpwWW5WMFpTZ25aR0YwWVMxallYSmtMWEpoYm1zbktUdGNjbHh1WEhSY2RGeDBYSFJzWlhRZ1kyRnlaRVp5Y0Vsa0lEMGdZMkZ5WkM1blpYUkJkSFJ5YVdKMWRHVW9KMlJoZEdFdFpuSndMV2xrSnlrZ2ZId2dKeWM3WEhKY2JseDBYSFJjZEZ4MGJHVjBJR05oY21SVmNtd2dQU0JqWVhKa0xtZGxkRUYwZEhKcFluVjBaU2duWkdGMFlTMWpZWEprTFhWeWJDY3BJSHg4SUNjbk8xeHlYRzVjZEZ4MFhIUmNkRnh5WEc1Y2RGeDBYSFJjZEdGdVlXeDVkR2xqYzBSaGRHRXVjR0ZuWlY5MGVYQmxJRDBnSjNkcFpHZGxkQ2M3SUM4dklHcHphR2x1ZENCcFoyNXZjbVU2YkdsdVpWeHlYRzVjZEZ4MFhIUmNkR0Z1WVd4NWRHbGpjMFJoZEdFdVkyRnlaRjlwWkNBOUlHQWtlM1JvYVhNdWQybGtaMlYwVG1GdFpYMHRKSHRqYUdGeWFYUjVTV1I5TFNSN1lXTjBhWFpwZEhsSlpIMWdPeUF2THlCcWMyaHBiblFnYVdkdWIzSmxPbXhwYm1WY2NseHVYSFJjZEZ4MFhIUmhibUZzZVhScFkzTkVZWFJoTG1OaGNtUmZjbUZ1YXlBOUlHTmhjbVJTWVc1ck95QXZMeUJxYzJocGJuUWdhV2R1YjNKbE9teHBibVZjY2x4dVhIUmNkRngwWEhSaGJtRnNlWFJwWTNORVlYUmhMbUZqZEdsMmFYUjVYMmxrSUQwZ1lXTjBhWFpwZEhsSlpEc2dMeThnYW5Ob2FXNTBJR2xuYm05eVpUcHNhVzVsWEhKY2JseDBYSFJjZEZ4MFlXNWhiSGwwYVdOelJHRjBZUzVoWTNScGRtbDBlVjkwZVhCbElEMGdkR2hwY3k1M2FXUm5aWFJPWVcxbE95QXZMeUJxYzJocGJuUWdhV2R1YjNKbE9teHBibVZjY2x4dVhIUmNkRngwWEhSaGJtRnNlWFJwWTNORVlYUmhMbU5vWVhKcGRIbGZhV1FnUFNCamFHRnlhWFI1U1dRN0lDOHZJR3B6YUdsdWRDQnBaMjV2Y21VNmJHbHVaVnh5WEc1Y2RGeDBYSFJjZEdGdVlXeDVkR2xqYzBSaGRHRXVjR0ZuWlY5cFpDQTlJR05oY21SR2NuQkpaRHNnTHk4Z2FuTm9hVzUwSUdsbmJtOXlaVHBzYVc1bFhISmNibHgwWEhSY2RGeDBZVzVoYkhsMGFXTnpSR0YwWVM1allYSmtYM1Z5YkNBOUlHTmhjbVJWY213N0lDOHZJR3B6YUdsdWRDQnBaMjV2Y21VNmJHbHVaVnh5WEc1Y2RGeDBYSFJjZEZ4eVhHNWNkRngwWEhSY2RHTmhjbVF1WVc1aGJIbDBhV056SUQwZ1lXNWhiSGwwYVdOelJHRjBZVHRjY2x4dVhIUmNkRngwWEhSY2NseHVYSFJjZEZ4MFhIUmpZWEprTG1Ga1pFVjJaVzUwVEdsemRHVnVaWElvSjJOc2FXTnJKeXdnWm5WdVkzUnBiMjRnS0NCbElDa2dlMXh5WEc1Y2RGeDBYSFJjZEZ4MFpTNXpkRzl3VUhKdmNHRm5ZWFJwYjI0b0tUdGNjbHh1WEhSY2RGeDBYSFJjZEhObGJHWXVZMkZ5WkVOc2FXTnJLQ0JsTENCMGFHbHpJQ2s3WEhKY2JseDBYSFJjZEZ4MGZTazdYSEpjYmx4MFhIUmNkSDFjY2x4dVhIUmNkSDBwTzF4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dUlGeDBLaUJRZFhOb0lHdHBjM050WlhSeWFXTnpJR05oY21RZ2FXMXdjbVZ6YzJsdmJuTmNjbHh1SUZ4MEtpQkFaR1Z6WTNKcGNIUnBiMjRnUm05eUlHRnNiQ0IyYVhOcFlteGxJR05oY21SekxDQmpjbVZoZEdVZ1lTQmpZWEprSUdsdGNISmxjM05wYjI0Z1lXNWhiSGwwYVdOeklHaGhjMmdnWVc1a0lHWnBjbVVnWVNCcmFYTnpiV1YwY21samN5QmpZWEprSUdsdGNISmxjM05wYjI0Z1pYWmxiblJjY2x4dUlGeDBLaTljY2x4dVhIUmpZWEprU1cxd2NtVnpjMmx2Ym5NZ0tDa2dlMXh5WEc1Y2RGeDBiR1YwSUdOaGNtUnpJRDBnWkc5amRXMWxiblF1Y1hWbGNubFRaV3hsWTNSdmNrRnNiQ2duVzJSaGRHRXRZVzVoYkhsMGFXTnpMV05oY21SZE9tNXZkQ2hiWkdGMFlTMW9hV1JrWlc1ZEtTY3BPMXh5WEc1Y2RGeDBXMTB1YzJ4cFkyVXVZMkZzYkNnZ1kyRnlaSE1nS1M1bWIzSkZZV05vS0NnZ1kyRnlaQ0FwSUQwK0lIdGNjbHh1WEhSY2RGeDBiR1YwSUdsdGNISmxjM05wYjI1RVlYUmhJRDBnVDJKcVpXTjBMbUZ6YzJsbmJpaDdmU3dnWTJGeVpDNWhibUZzZVhScFkzTWdLVHRjY2x4dVhIUmNkRngwYVcxd2NtVnpjMmx2YmtSaGRHRXVaWFpsYm5RZ1BTQW5hVzF3Y21WemMybHZiaWM3WEhKY2JseDBYSFJjZEdsdGNISmxjM05wYjI1RVlYUmhMbU5oY21SZlkyOTFiblFnUFNCallYSmtjeTVzWlc1bmRHZzdJQzh2SUdwemFHbHVkQ0JwWjI1dmNtVTZiR2x1WlZ4eVhHNWNkRngwWEhSZmEyMXhMbkIxYzJnb1d5ZHlaV052Y21RbkxDQW5hVzF3Y21WemMybHZiaWNzSUdsdGNISmxjM05wYjI1RVlYUmhYU2s3WEhKY2JseDBYSFI5S1R0Y2NseHVYSFI5WEhKY2JseDBMeW9xWEhKY2JpQmNkQ29nVUhWemFDQnJhWE56YldWMGNtbGpjeUJqWVhKa0lHTnNhV05ySUdWMlpXNTBjMXh5WEc0Z1hIUXFJRUJrWlhOamNtbHdkR2x2YmlCSVlXNWtiR1VnWTJGeVpDQmpiR2xqYXlCbGRtVnVkSE1nYjI0Z2RHaGxJSGRwWkdkbGRDQjFjMmx1WnlCbGRtVnVkQ0JrWld4bFoyRjBhVzl1TGlCRGNtVmhkR1VnWVNCallYSmtJR05zYVdOcklIWmhiSFZsY3lCb1lYTm9JR1p2Y2lCMFlYSmxaM1FnWTJGeVpGeHlYRzRnWEhRcUlHRnVaQ0JtYVhKbElHRWdhMmx6YzIxbGRISnBZM01nWTJGeVpDQmpiR2xqYXlCbGRtVnVkQ0JjY2x4dUlGeDBLaTljY2x4dVhIUmpZWEprUTJ4cFkyc2dLQ0JsTENCallYSmtJQ2tnZTF4eVhHNWNkRngwYkdWMElHVjJkQ0E5SUdVdWRHRnlaMlYwTG1kbGRFRjBkSEpwWW5WMFpTZ25aR0YwWVMxaGJtRnNlWFJwWTNNdFpYWmxiblFuS1R0Y2NseHVYSFJjZEdsbUlDaGxkblFwSUh0Y2NseHVYSFJjZEZ4MGJHVjBJR05zYVdOclJHRjBZU0E5SUU5aWFtVmpkQzVoYzNOcFoyNG9lMzBzSUdOaGNtUXVZVzVoYkhsMGFXTnpLVHRjY2x4dVhIUmNkRngwWTJ4cFkydEVZWFJoTG1WMlpXNTBJRDBnSjJOaGNtUWdZMnhwWTJzbk8xeHlYRzVjZEZ4MFhIUmpiR2xqYTBSaGRHRXVjM1ZpZEhsd1pTQTlJR1V1ZEdGeVoyVjBMbWRsZEVGMGRISnBZblYwWlNnblpHRjBZUzFoYm1Gc2VYUnBZM010YzNWaWRIbHdaU2NwTzF4eVhHNWNkRngwWEhSamJHbGphMFJoZEdFdVpYWmxiblJmZG1Gc2RXVWdQU0JsZG5RN0lDOHZJR3B6YUdsdWRDQnBaMjV2Y21VNmJHbHVaVnh5WEc1Y2RGeDBYSFJqYkdsamEwUmhkR0V1WTJGeVpGOWpiM1Z1ZENBOUlHUnZZM1Z0Wlc1MExuRjFaWEo1VTJWc1pXTjBiM0pCYkd3b0oxdGtZWFJoTFdGdVlXeDVkR2xqY3kxallYSmtYVHB1YjNRb1cyUmhkR0V0YUdsa1pHVnVYU2tuS1M1c1pXNW5kR2c3SUM4dklHcHphR2x1ZENCcFoyNXZjbVU2YkdsdVpWeHlYRzVjZEZ4MFhIUmZhMjF4TG5CMWMyZ29XeWR5WldOdmNtUW5MQ0FuWTJGeVpDQmpiR2xqYXljc0lHTnNhV05yUkdGMFlWMHBPMXh5WEc1Y2RGeDBmVnh5WEc1Y2RIMWNjbHh1ZlZ4eVhHNWNjbHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdRVzVoYkhsMGFXTnpPeUpkZlE9PSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHR2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG52YXIgX3V0aWxzUXVlcnlTdHJpbmcgPSByZXF1aXJlKCcuLi91dGlscy9xdWVyeVN0cmluZycpO1xuXG4vKipcclxuICogQ3JlYXRlIGEgd2lkZ2V0IG1vZGVsXHJcbiAqIEBjbGFzc2Rlc2MgQ3JlYXRlIGEgbW9kZWwgb2JqZWN0IFxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy53aWRnZXQuIFRoZSB3aWRnZXQgaW5zdGFuY2UgW3JlcXVpcmVkXVxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMuaXNQYWdpbmF0ZWQuIFdoZXRoZXIgdGhlIG1vZGVsIGNvbnN1bWVzIGEgcGFnaW5hdGVkIFJFU1QgQVBJXHJcbiAqIEBjbGFzcyBTdG9yZXMgdGhlIHJldHVybmVkIG1vZGVsIGRhdGEgYXMgdGhpcy4kbW9kZWwuIFN0b3JlcyBtb2RlbCBVUkwgcGFyYW1ldGVycyBhcyB0aGlzLnBhcmFtcy4gRm9yIHBhZ2luYXRlZCBtb2RlbHNcclxuICogc3RvcmVzIHRoZSBjb2xsZWN0aW9uIGFzIHRoaXMuY29sbGVjdGlvbiwgc3RvcmVzIHRoZSBsYXN0IGZldGNoZWQgQVBJIHBhZ2UgYXMgdGhpcy5sYXN0UmV0dXJuZWRQYWdlOyBzZXRzIGFwaVBhZ2Ugc2l6ZSB0byBkZWZhdWx0IDEyXHJcbiAqIHNldHMgcGFnZU51bSBhbmQgcGFnZVNpemUgcGFyYW1zIG9uIHRoZSBtb2RlbCBBUEkgW2luaXRpYWxpc2VzIHRvIHBhZ2UgMV1cclxuICovXG52YXIgUHJvbWlzZSA9IHJlcXVpcmUoJ2VzNi1wcm9taXNlJykuUHJvbWlzZTtcbnZhciB4aHIgPSByZXF1aXJlKCd4aHInKTtcblxudmFyIE1vZGVsID0gKGZ1bmN0aW9uICgpIHtcblx0ZnVuY3Rpb24gTW9kZWwoKSB7XG5cdFx0dmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuXHRcdHZhciB3aWRnZXQgPSBfcmVmLndpZGdldDtcblx0XHR2YXIgdXJsID0gX3JlZi51cmw7XG5cdFx0dmFyIHBhcmFtcyA9IF9yZWYucGFyYW1zO1xuXHRcdHZhciBpc1BhZ2luYXRlZCA9IF9yZWYuaXNQYWdpbmF0ZWQ7XG5cdFx0dmFyIGFwaVBhZ2VTaXplID0gX3JlZi5hcGlQYWdlU2l6ZTtcblx0XHR2YXIgY29sbGVjdGlvblBhdGggPSBfcmVmLmNvbGxlY3Rpb25QYXRoO1xuXG5cdFx0X2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1vZGVsKTtcblxuXHRcdHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xuXHRcdHRoaXMudXJsID0gdXJsO1xuXHRcdGlmICghdGhpcy53aWRnZXQgfHwgIXRoaXMudXJsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuJG1vZGVsID0ge307XG5cdFx0dGhpcy5wYXJhbXMgPSB0aGlzLnBhcmFtcyB8fCB7fTtcblx0XHR0aGlzLnNldFBhcmFtcyhwYXJhbXMpO1xuXG5cdFx0dGhpcy5pc1BhZ2luYXRlZCA9IGlzUGFnaW5hdGVkID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IGlzUGFnaW5hdGVkO1xuXHRcdGlmICh0aGlzLmlzUGFnaW5hdGVkKSB7XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25QYXRoID0gY29sbGVjdGlvblBhdGg7XG5cdFx0XHR0aGlzLmxhc3RSZXR1cm5lZFBhZ2UgPSBbXTtcblx0XHRcdHRoaXMuY29sbGVjdGlvbiA9IFtdO1xuXHRcdFx0dGhpcy5hcGlQYWdlU2l6ZSA9IGFwaVBhZ2VTaXplIHx8IDEyO1xuXHRcdFx0dGhpcy5jdXJyZW50QXBpUGFnZSA9IDE7XG5cdFx0XHR0aGlzLmxhc3RQYWdlID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5zZXRQYXJhbXMoe1xuXHRcdFx0XHRwYWdlTnVtOiB0aGlzLmN1cnJlbnRBcGlQYWdlLFxuXHRcdFx0XHRwYWdlU2l6ZTogdGhpcy5hcGlQYWdlU2l6ZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXHJcbiAgKiBHZXQgdGhlIG1vZGVsIGRhdGEgZnJvbSB0aGUgUkVTVCBBUEkgW05PTi1wYWdpbmF0ZWQgUkVTVCBBUEkgb25seV1cclxuICAqIEBkZXNjcmlwdGlvbiBGZXRjaCB0aGUgZGF0YSBmcm9tIHRoZSBSRVNUIEFQSSBhbmQgc3RvcmUgYXMgdGhpcy4kbW9kZWxcclxuICAqL1xuXG5cdF9jcmVhdGVDbGFzcyhNb2RlbCwgW3tcblx0XHRrZXk6ICdnZXRNb2RlbCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGdldE1vZGVsKCkge1xuXHRcdFx0dmFyIF90aGlzID0gdGhpcztcblxuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdFx0XHRcdF90aGlzLmZldGNoRGF0YShfdGhpcy51cmwpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcblx0XHRcdFx0XHRfdGhpcy4kbW9kZWwgPSBkYXRhO1xuXHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcclxuICAgKiBHZXQgdGhlIG5leHQgQVBJIHBhZ2UgZnJvbSB0aGUgUkVTVCBBUEkgW3BhZ2luYXRlZCBSRVNUIEFQSSBvbmx5XVxyXG4gICAqIEBkZXNjcmlwdGlvbiBGZXRjaCB0aGUgbmV4dCBBUEkgcGFnZSBmcm9tIHRoZSBzZXJ2ZXIsIGJhc2VkIG9uIHRoZSBsYXN0IHBhZ2UgZmV0Y2hlZC4gU3RvcmUgdGhlIHJldHVybmVkIGRhdGFcclxuICAgKiBhcyB0aGlzLiRtb2RlbDsgYWRkIHRoZSByZXR1cm5lZCBwYWdpbmF0ZWQgZGF0YSBhcyB0byB0aGUgZW5kIG9mIHRoaXMuY29sbGVjdGlvblxyXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFByb21pc2Ugb2JqZWN0XHJcbiAgICovXG5cdH0sIHtcblx0XHRrZXk6ICdnZXROZXh0UGFnZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGdldE5leHRQYWdlKHJlc2V0KSB7XG5cdFx0XHR2YXIgX3RoaXMyID0gdGhpcztcblxuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdFx0XHRcdF90aGlzMi5wYXJhbXMucGFnZU51bSA9IF90aGlzMi5jdXJyZW50QXBpUGFnZSsrO1xuXHRcdFx0XHRfdGhpczIuZ2V0TW9kZWwoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRpZiAoX3RoaXMyLiRtb2RlbFtfdGhpczIuY29sbGVjdGlvblBhdGhdLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0X3RoaXMyLmxhc3RQYWdlID0gX3RoaXMyLmN1cnJlbnRBcGlQYWdlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocmVzZXQpIHtcblx0XHRcdFx0XHRcdF90aGlzMi5jb2xsZWN0aW9uID0gW107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF90aGlzMi5sYXN0UmV0dXJuZWRQYWdlID0gX3RoaXMyLiRtb2RlbFtfdGhpczIuY29sbGVjdGlvblBhdGhdO1xuXHRcdFx0XHRcdF90aGlzMi5jb2xsZWN0aW9uID0gX3RoaXMyLmNvbGxlY3Rpb24uY29uY2F0KF90aGlzMi5sYXN0UmV0dXJuZWRQYWdlKTtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogQWRkIHN1cHBsaWVkIHBhcmFtZXRlcnMgdG8gdGhlIG1vZGVsIFVSTFxyXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0IGhhc2ggb2YgcGFyYW1ldGVycyB0byBxdWVyeSBzdHJpbmcgYW5kIGFwcGVuZCB0byBtb2RlbCB1cmxcclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ3NldFBhcmFtcycsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHNldFBhcmFtcyhvYmopIHtcblx0XHRcdHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih0aGlzLnBhcmFtcywgb2JqKTtcblx0XHR9XG5cblx0XHQvKipcclxuICAgKiBGZXRjaCBkYXRhIGZyb20gdGhlIHNlcnZlclxyXG4gICAqIEBkZXNjcmlwdGlvbiBNYWtlIGEgZ2V0IHJlcXVlc3QgZm9yIHRoZSBSRVNUIEFQSSBkYXRhXHJcbiAgICogQHJldHVybnMge09iamVjdH0gUHJvbWlzZSBvYmplY3RcclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ2ZldGNoRGF0YScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGZldGNoRGF0YSh1cmwpIHtcblx0XHRcdHZhciBxcyA9ICgwLCBfdXRpbHNRdWVyeVN0cmluZy5xdWVyeVN0cmluZ1N0cmluZ2lmeSkodGhpcy5wYXJhbXMpO1xuXHRcdFx0Ly9UT0RPOiByZW1vdmUgJiBpZiBubyBxc1xuXHRcdFx0dXJsICs9ICc/Zm9ybWF0PWpzb24mJyArIHFzO1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdFx0eGhyKHtcblx0XHRcdFx0XHR1cmk6IHVybCxcblx0XHRcdFx0XHR1c2VYRFI6IHRydWVcblx0XHRcdFx0fSwgZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSwgYm9keSkge1xuXHRcdFx0XHRcdGlmIChib2R5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoSlNPTi5wYXJzZShib2R5KSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChlcnJvciAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Ly8gYWxlcnQoJ2h0dHAgZXJyb3I6IHN0YXR1cyBjb2RlOiAnICsgcmVzcG9uc2Uuc3RhdHVzQ29kZSArICc7IGVycm9yOiAnICsgZXJyb3IpO1xuXHRcdFx0XHRcdFx0cmVqZWN0KEVycm9yKGVycm9yKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqIFJlZnJlc2ggdGhlIGxvY2FsIG1vZGVsIGFuZCBjb2xsZWN0aW9uXHJcbiAgICogQGRlc2NyaXB0aW9uIFJlLWZldGNoIGFuZCBvdmVyd3JpdGUgdGhlIGxvY2FsIG1vZGVsIGFuZCBjb2xsZWN0aW9uIHdpdGggW2xhdGVzdF0gc2VydmVyIGRhdGFcclxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBQcm9taXNlIG9iamVjdFxyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAncmVmcmVzaCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHJlZnJlc2goKSB7XG5cdFx0XHR2YXIgX3RoaXMzID0gdGhpcztcblxuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdFx0XHRcdGlmIChfdGhpczMuaXNQYWdpbmF0ZWQpIHtcblx0XHRcdFx0XHRfdGhpczMuY29sbGVjdGlvbiA9IFtdO1xuXHRcdFx0XHRcdF90aGlzMy5jdXJyZW50QXBpUGFnZSA9IDE7XG5cdFx0XHRcdFx0X3RoaXMzLmdldE5leHRQYWdlKHRydWUpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdF90aGlzMy5nZXRNb2RlbCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gTW9kZWw7XG59KSgpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBNb2RlbDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJOeWIzZGtablZ1WkdsdVp5MXdiR1ZrWjJVdFltOTRMMkp2ZDJWeVgyTnZiWEJ2Ym1WdWRITXZhblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwycHpMMlp5WVcxbGQyOXlheTlOYjJSbGJDNXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4WlFVRlpMRU5CUVVNN096czdPenM3T3pzN1owTkJTWGRDTEhOQ1FVRnpRanM3T3pzN096czdPenM3UVVGR00wUXNTVUZCU1N4UFFVRlBMRWRCUVVjc1QwRkJUeXhEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUXp0QlFVTTNReXhKUVVGSkxFZEJRVWNzUjBGQlJ5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN08wbEJXVzVDTEV0QlFVczdRVUZEUlN4VlFVUlFMRXRCUVVzc1IwRkROa1U3YlVWQlFVd3NSVUZCUlRzN1RVRkJjRVVzVFVGQlRTeFJRVUZPTEUxQlFVMDdUVUZCUlN4SFFVRkhMRkZCUVVnc1IwRkJSenROUVVGRkxFMUJRVTBzVVVGQlRpeE5RVUZOTzAxQlFVVXNWMEZCVnl4UlFVRllMRmRCUVZjN1RVRkJSU3hYUVVGWExGRkJRVmdzVjBGQlZ6dE5RVUZGTEdOQlFXTXNVVUZCWkN4alFVRmpPenQzUWtGRWVFVXNTMEZCU3pzN1FVRkZWQ3hOUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZITEUxQlFVMHNRMEZCUXp0QlFVTnlRaXhOUVVGSkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVkQlFVY3NRMEZCUXp0QlFVTm1MRTFCUVVzc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWRCUVVjc1JVRkJSenRCUVVOb1F5eFZRVUZQTzBkQlExQTdRVUZEUkN4TlFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFVkJRVVVzUTBGQlF6dEJRVU5xUWl4TlFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVsQlFVa3NSVUZCUlN4RFFVRkRPMEZCUTJoRExFMUJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVVXNUVUZCVFN4RFFVRkZMRU5CUVVNN08wRkJSWHBDTEUxQlFVa3NRMEZCUXl4WFFVRlhMRWRCUVVjc1YwRkJWeXhMUVVGTExGTkJRVk1zUjBGQlJ5eExRVUZMTEVkQlFVY3NWMEZCVnl4RFFVRkRPMEZCUTI1RkxFMUJRVXNzU1VGQlNTeERRVUZETEZkQlFWY3NSVUZCUnp0QlFVTjJRaXhQUVVGSkxFTkJRVU1zWTBGQll5eEhRVUZITEdOQlFXTXNRMEZCUXp0QlFVTnlReXhQUVVGSkxFTkJRVU1zWjBKQlFXZENMRWRCUVVjc1JVRkJSU3hEUVVGRE8wRkJRek5DTEU5QlFVa3NRMEZCUXl4VlFVRlZMRWRCUVVjc1JVRkJSU3hEUVVGRE8wRkJRM0pDTEU5QlFVa3NRMEZCUXl4WFFVRlhMRWRCUVVjc1YwRkJWeXhKUVVGSkxFVkJRVVVzUTBGQlF6dEJRVU55UXl4UFFVRkpMRU5CUVVNc1kwRkJZeXhIUVVGSExFTkJRVU1zUTBGQlF6dEJRVU40UWl4UFFVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSExGTkJRVk1zUTBGQlF6dEJRVU14UWl4UFFVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRE8wRkJRMlFzVjBGQlR5eEZRVUZGTEVsQlFVa3NRMEZCUXl4alFVRmpPMEZCUXpWQ0xGbEJRVkVzUlVGQlJTeEpRVUZKTEVOQlFVTXNWMEZCVnp0SlFVTXhRaXhEUVVGRExFTkJRVU03UjBGRFNEdEZRVU5FT3pzN096czdPMk5CZUVKSkxFdEJRVXM3TzFOQk5rSkVMRzlDUVVGSE96czdRVUZEV0N4VlFVRlBMRWxCUVVrc1QwRkJUeXhEUVVGRkxGVkJRVVVzVDBGQlR5eEZRVUZOTzBGQlEyeERMRlZCUVVzc1UwRkJVeXhEUVVGRkxFMUJRVXNzUjBGQlJ5eERRVUZGTEVOQlFVTXNTVUZCU1N4RFFVRkZMRlZCUVVVc1NVRkJTU3hGUVVGTk8wRkJRelZETEZkQlFVc3NUVUZCVFN4SFFVRkhMRWxCUVVrc1EwRkJRenRCUVVOdVFpeFpRVUZQTEVWQlFVVXNRMEZCUXp0TFFVTldMRU5CUVVNc1EwRkJRenRKUVVOSUxFTkJRVU1zUTBGQlF6dEhRVU5JT3pzN096czdPenM3TzFOQlQxY3NjVUpCUVVVc1MwRkJTeXhGUVVGSE96czdRVUZEY2tJc1ZVRkJUeXhKUVVGSkxFOUJRVThzUTBGQlJTeFZRVUZGTEU5QlFVOHNSVUZCVFR0QlFVTnNReXhYUVVGTExFMUJRVTBzUTBGQlF5eFBRVUZQTEVkQlFVY3NUMEZCU3l4alFVRmpMRVZCUVVVc1EwRkJRenRCUVVNMVF5eFhRVUZMTEZGQlFWRXNSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJSU3haUVVGTk8wRkJRek5DTEZOQlFVc3NUMEZCU3l4TlFVRk5MRU5CUVVNc1QwRkJTeXhqUVVGakxFTkJRVU1zUTBGQlF5eE5RVUZOTEV0QlFVc3NRMEZCUXl4RlFVRkhPMEZCUTNCRUxHRkJRVXNzVVVGQlVTeEhRVUZITEU5QlFVc3NZMEZCWXl4RFFVRkRPMDFCUTNCRE8wRkJRMFFzVTBGQlN5eExRVUZMTEVWQlFVYzdRVUZEV2l4aFFVRkxMRlZCUVZVc1IwRkJSeXhGUVVGRkxFTkJRVU03VFVGRGNrSTdRVUZEUkN4WlFVRkxMR2RDUVVGblFpeEhRVUZITEU5QlFVc3NUVUZCVFN4RFFVRkRMRTlCUVVzc1kwRkJZeXhEUVVGRExFTkJRVU03UVVGRGVrUXNXVUZCU3l4VlFVRlZMRWRCUVVjc1QwRkJTeXhWUVVGVkxFTkJRVU1zVFVGQlRTeERRVUZGTEU5QlFVc3NaMEpCUVdkQ0xFTkJRVVVzUTBGQlF6dEJRVU5zUlN4WlFVRlBMRVZCUVVVc1EwRkJRenRMUVVOV0xFTkJRVU1zUTBGQlF6dEpRVU5JTEVOQlFVTXNRMEZCUXp0SFFVTklPenM3T3pzN096dFRRVXRUTEcxQ1FVRkZMRWRCUVVjc1JVRkJSenRCUVVOcVFpeFBRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRTFCUVUwc1EwRkJReXhOUVVGTkxFTkJRVVVzU1VGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4SFFVRkhMRU5CUVVVc1EwRkJRenRIUVVOb1JEczdPenM3T3pzN08xTkJUVk1zYlVKQlFVVXNSMEZCUnl4RlFVRkhPMEZCUTJwQ0xFOUJRVWtzUlVGQlJTeEhRVUZITERSRFFVRnpRaXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZGTEVOQlFVTTdPMEZCUlRkRExFMUJRVWNzYzBKQlFXOUNMRVZCUVVVc1FVRkJSU3hEUVVGRE8wRkJRelZDTEZWQlFVOHNTVUZCU1N4UFFVRlBMRU5CUVVNc1ZVRkJWU3hQUVVGUExFVkJRVVVzVFVGQlRTeEZRVUZITzBGQlF6bERMRTlCUVVjc1EwRkJRenRCUVVOQkxGRkJRVWNzUlVGQlJTeEhRVUZITzBGQlExSXNWMEZCVFN4RlFVRkZMRWxCUVVrN1MwRkRaaXhGUVVGRkxGVkJRVmNzUzBGQlN5eEZRVUZGTEZGQlFWRXNSVUZCUlN4SlFVRkpMRVZCUVVjN1FVRkRiRU1zVTBGQlN5eEpRVUZKTEV0QlFVc3NVMEZCVXl4RlFVRkhPMEZCUTNwQ0xHRkJRVThzUTBGQlJTeEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRkxFTkJRVU03VFVGRE5VSXNUVUZCVFN4SlFVRkxMRXRCUVVzc1MwRkJTeXhKUVVGSkxFVkJRVWM3TzBGQlJUVkNMRmxCUVUwc1EwRkJSU3hMUVVGTExFTkJRVVVzUzBGQlN5eERRVUZGTEVOQlFVVXNRMEZCUXp0TlFVTjZRanRMUVVOS0xFTkJRVU1zUTBGQlF6dEpRVU5JTEVOQlFVTXNRMEZCUXp0SFFVTklPenM3T3pzN096czdVMEZOVHl4dFFrRkJSenM3TzBGQlExWXNWVUZCVHl4SlFVRkpMRTlCUVU4c1EwRkJSU3hWUVVGRkxFOUJRVThzUlVGQlRUdEJRVU5zUXl4UlFVRkxMRTlCUVVzc1YwRkJWeXhGUVVGSE8wRkJRM1pDTEZsQlFVc3NWVUZCVlN4SFFVRkhMRVZCUVVVc1EwRkJRenRCUVVOeVFpeFpRVUZMTEdOQlFXTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1FVRkRlRUlzV1VGQlN5eFhRVUZYTEVOQlFVVXNTVUZCU1N4RFFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRkxGbEJRVTA3UVVGRGNFTXNZVUZCVHl4RlFVRkZMRU5CUVVNN1RVRkRWaXhEUVVGRExFTkJRVU03UzBGRFNDeE5RVUZOTzBGQlEwNHNXVUZCU3l4UlFVRlJMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVVVzV1VGQlRUdEJRVU16UWl4aFFVRlBMRVZCUVVVc1EwRkJRenROUVVOV0xFTkJRVU1zUTBGQlF6dExRVU5JTzBsQlEwUXNRMEZCUXl4RFFVRkRPMGRCUTBnN096dFJRVFZIU1N4TFFVRkxPenM3Y1VKQkswZEpMRXRCUVVzaUxDSm1hV3hsSWpvaVF6b3ZkR1Z0Y0M5SFJ5NUdjbTl1ZEVWdVpDNVhhV1JuWlhSekwzZHBaR2RsZEhNdlkzSnZkMlJtZFc1a2FXNW5MWEJzWldSblpTMWliM2d2WW05M1pYSmZZMjl0Y0c5dVpXNTBjeTlxZFhOMFoybDJhVzVuTFhkcFpHZGxkQzFtY21GdFpYZHZjbXN2WTI5dGNHOXVaVzUwY3k5c2FXSXZhbk12Wm5KaGJXVjNiM0pyTDAxdlpHVnNMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUozVnpaU0J6ZEhKcFkzUW5PMXh5WEc1Y2NseHViR1YwSUZCeWIyMXBjMlVnUFNCeVpYRjFhWEpsS0NkbGN6WXRjSEp2YldselpTY3BMbEJ5YjIxcGMyVTdYSEpjYm14bGRDQjRhSElnUFNCeVpYRjFhWEpsS0NkNGFISW5LVHRjY2x4dWFXMXdiM0owSUhzZ2NYVmxjbmxUZEhKcGJtZFRkSEpwYm1kcFpua2dmU0JtY205dElDY3VMaTkxZEdsc2N5OXhkV1Z5ZVZOMGNtbHVaeWM3WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nUTNKbFlYUmxJR0VnZDJsa1oyVjBJRzF2WkdWc1hISmNiaUFxSUVCamJHRnpjMlJsYzJNZ1EzSmxZWFJsSUdFZ2JXOWtaV3dnYjJKcVpXTjBJRnh5WEc0Z0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2IzQjBhVzl1Y3k1M2FXUm5aWFF1SUZSb1pTQjNhV1JuWlhRZ2FXNXpkR0Z1WTJVZ1czSmxjWFZwY21Wa1hWeHlYRzRnS2lCQWNHRnlZVzBnZTBKdmIyeGxZVzU5SUc5d2RHbHZibk11YVhOUVlXZHBibUYwWldRdUlGZG9aWFJvWlhJZ2RHaGxJRzF2WkdWc0lHTnZibk4xYldWeklHRWdjR0ZuYVc1aGRHVmtJRkpGVTFRZ1FWQkpYSEpjYmlBcUlFQmpiR0Z6Y3lCVGRHOXlaWE1nZEdobElISmxkSFZ5Ym1Wa0lHMXZaR1ZzSUdSaGRHRWdZWE1nZEdocGN5NGtiVzlrWld3dUlGTjBiM0psY3lCdGIyUmxiQ0JWVWt3Z2NHRnlZVzFsZEdWeWN5QmhjeUIwYUdsekxuQmhjbUZ0Y3k0Z1JtOXlJSEJoWjJsdVlYUmxaQ0J0YjJSbGJITmNjbHh1SUNvZ2MzUnZjbVZ6SUhSb1pTQmpiMnhzWldOMGFXOXVJR0Z6SUhSb2FYTXVZMjlzYkdWamRHbHZiaXdnYzNSdmNtVnpJSFJvWlNCc1lYTjBJR1psZEdOb1pXUWdRVkJKSUhCaFoyVWdZWE1nZEdocGN5NXNZWE4wVW1WMGRYSnVaV1JRWVdkbE95QnpaWFJ6SUdGd2FWQmhaMlVnYzJsNlpTQjBieUJrWldaaGRXeDBJREV5WEhKY2JpQXFJSE5sZEhNZ2NHRm5aVTUxYlNCaGJtUWdjR0ZuWlZOcGVtVWdjR0Z5WVcxeklHOXVJSFJvWlNCdGIyUmxiQ0JCVUVrZ1cybHVhWFJwWVd4cGMyVnpJSFJ2SUhCaFoyVWdNVjFjY2x4dUlDb3ZYSEpjYm1Oc1lYTnpJRTF2WkdWc0lIdGNjbHh1WEhSamIyNXpkSEoxWTNSdmNpQW9JSHNnZDJsa1oyVjBMQ0IxY213c0lIQmhjbUZ0Y3l3Z2FYTlFZV2RwYm1GMFpXUXNJR0Z3YVZCaFoyVlRhWHBsTENCamIyeHNaV04wYVc5dVVHRjBhQ0I5SUQwZ2UzMGdLU0I3WEhKY2JseDBYSFIwYUdsekxuZHBaR2RsZENBOUlIZHBaR2RsZER0Y2NseHVYSFJjZEhSb2FYTXVkWEpzSUQwZ2RYSnNPMXh5WEc1Y2RGeDBhV1lnS0NBaGRHaHBjeTUzYVdSblpYUWdmSHdnSVhSb2FYTXVkWEpzSUNrZ2UxeHlYRzVjZEZ4MFhIUnlaWFIxY200N1hISmNibHgwWEhSOVhISmNibHgwWEhSMGFHbHpMaVJ0YjJSbGJDQTlJSHQ5TzF4eVhHNWNkRngwZEdocGN5NXdZWEpoYlhNZ1BTQjBhR2x6TG5CaGNtRnRjeUI4ZkNCN2ZUdGNjbHh1WEhSY2RIUm9hWE11YzJWMFVHRnlZVzF6S0NCd1lYSmhiWE1nS1R0Y2NseHVYSEpjYmx4MFhIUjBhR2x6TG1selVHRm5hVzVoZEdWa0lEMGdhWE5RWVdkcGJtRjBaV1FnUFQwOUlIVnVaR1ZtYVc1bFpDQS9JR1poYkhObElEb2dhWE5RWVdkcGJtRjBaV1E3WEhKY2JseDBYSFJwWmlBb0lIUm9hWE11YVhOUVlXZHBibUYwWldRZ0tTQjdYSEpjYmx4MFhIUmNkSFJvYVhNdVkyOXNiR1ZqZEdsdmJsQmhkR2dnUFNCamIyeHNaV04wYVc5dVVHRjBhRHRjY2x4dVhIUmNkRngwZEdocGN5NXNZWE4wVW1WMGRYSnVaV1JRWVdkbElEMGdXMTA3WEhKY2JseDBYSFJjZEhSb2FYTXVZMjlzYkdWamRHbHZiaUE5SUZ0ZE8xeHlYRzVjZEZ4MFhIUjBhR2x6TG1Gd2FWQmhaMlZUYVhwbElEMGdZWEJwVUdGblpWTnBlbVVnZkh3Z01USTdYSEpjYmx4MFhIUmNkSFJvYVhNdVkzVnljbVZ1ZEVGd2FWQmhaMlVnUFNBeE8xeHlYRzVjZEZ4MFhIUjBhR2x6TG14aGMzUlFZV2RsSUQwZ2RXNWtaV1pwYm1Wa08xeHlYRzVjZEZ4MFhIUjBhR2x6TG5ObGRGQmhjbUZ0Y3loN1hISmNibHgwWEhSY2RGeDBjR0ZuWlU1MWJUb2dkR2hwY3k1amRYSnlaVzUwUVhCcFVHRm5aU3hjY2x4dVhIUmNkRngwWEhSd1lXZGxVMmw2WlRvZ2RHaHBjeTVoY0dsUVlXZGxVMmw2WlNCY2NseHVYSFJjZEZ4MGZTazdYSEpjYmx4MFhIUjlYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzVjZENBcUlFZGxkQ0IwYUdVZ2JXOWtaV3dnWkdGMFlTQm1jbTl0SUhSb1pTQlNSVk5VSUVGUVNTQmJUazlPTFhCaFoybHVZWFJsWkNCU1JWTlVJRUZRU1NCdmJteDVYVnh5WEc1Y2RDQXFJRUJrWlhOamNtbHdkR2x2YmlCR1pYUmphQ0IwYUdVZ1pHRjBZU0JtY205dElIUm9aU0JTUlZOVUlFRlFTU0JoYm1RZ2MzUnZjbVVnWVhNZ2RHaHBjeTRrYlc5a1pXeGNjbHh1WEhRZ0tpOWNjbHh1WEhSblpYUk5iMlJsYkNBb0tTQjdYSEpjYmx4MFhIUnlaWFIxY200Z2JtVjNJRkJ5YjIxcGMyVW9JQ2dnY21WemIyeDJaU0FwSUQwK0lIdGNjbHh1WEhSY2RGeDBkR2hwY3k1bVpYUmphRVJoZEdFb0lIUm9hWE11ZFhKc0lDa3VkR2hsYmlnZ0tDQmtZWFJoSUNrZ1BUNGdlMXh5WEc1Y2RGeDBYSFJjZEhSb2FYTXVKRzF2WkdWc0lEMGdaR0YwWVR0Y2NseHVYSFJjZEZ4MFhIUnlaWE52YkhabEtDazdYSEpjYmx4MFhIUmNkSDBwTzF4eVhHNWNkRngwZlNrN1hISmNibHgwZlZ4eVhHNWNkQzhxS2x4eVhHNWNkQ0FxSUVkbGRDQjBhR1VnYm1WNGRDQkJVRWtnY0dGblpTQm1jbTl0SUhSb1pTQlNSVk5VSUVGUVNTQmJjR0ZuYVc1aGRHVmtJRkpGVTFRZ1FWQkpJRzl1YkhsZFhISmNibHgwSUNvZ1FHUmxjMk55YVhCMGFXOXVJRVpsZEdOb0lIUm9aU0J1WlhoMElFRlFTU0J3WVdkbElHWnliMjBnZEdobElITmxjblpsY2l3Z1ltRnpaV1FnYjI0Z2RHaGxJR3hoYzNRZ2NHRm5aU0JtWlhSamFHVmtMaUJUZEc5eVpTQjBhR1VnY21WMGRYSnVaV1FnWkdGMFlWeHlYRzVjZENBcUlHRnpJSFJvYVhNdUpHMXZaR1ZzT3lCaFpHUWdkR2hsSUhKbGRIVnlibVZrSUhCaFoybHVZWFJsWkNCa1lYUmhJR0Z6SUhSdklIUm9aU0JsYm1RZ2IyWWdkR2hwY3k1amIyeHNaV04wYVc5dVhISmNibHgwSUNvZ1FISmxkSFZ5Ym5NZ2UwOWlhbVZqZEgwZ1VISnZiV2x6WlNCdlltcGxZM1JjY2x4dVhIUWdLaTljY2x4dVhIUm5aWFJPWlhoMFVHRm5aU0FvSUhKbGMyVjBJQ2tnZTF4eVhHNWNkRngwY21WMGRYSnVJRzVsZHlCUWNtOXRhWE5sS0NBb0lISmxjMjlzZG1VZ0tTQTlQaUI3WEhKY2JseDBYSFJjZEhSb2FYTXVjR0Z5WVcxekxuQmhaMlZPZFcwZ1BTQjBhR2x6TG1OMWNuSmxiblJCY0dsUVlXZGxLeXM3WEhKY2JseDBYSFJjZEhSb2FYTXVaMlYwVFc5a1pXd29LUzUwYUdWdUtDQW9LU0E5UGlCN1hISmNibHgwWEhSY2RGeDBhV1lnS0NCMGFHbHpMaVJ0YjJSbGJGdDBhR2x6TG1OdmJHeGxZM1JwYjI1UVlYUm9YUzVzWlc1bmRHZ2dQVDA5SURBZ0tTQjdYSEpjYmx4MFhIUmNkRngwWEhSMGFHbHpMbXhoYzNSUVlXZGxJRDBnZEdocGN5NWpkWEp5Wlc1MFFYQnBVR0ZuWlR0Y2NseHVYSFJjZEZ4MFhIUjlYSEpjYmx4MFhIUmNkRngwYVdZZ0tDQnlaWE5sZENBcElIdGNjbHh1WEhSY2RGeDBYSFJjZEhSb2FYTXVZMjlzYkdWamRHbHZiaUE5SUZ0ZE8xeHlYRzVjZEZ4MFhIUmNkSDFjY2x4dVhIUmNkRngwWEhSMGFHbHpMbXhoYzNSU1pYUjFjbTVsWkZCaFoyVWdQU0IwYUdsekxpUnRiMlJsYkZ0MGFHbHpMbU52Ykd4bFkzUnBiMjVRWVhSb1hUdGNjbHh1WEhSY2RGeDBYSFIwYUdsekxtTnZiR3hsWTNScGIyNGdQU0IwYUdsekxtTnZiR3hsWTNScGIyNHVZMjl1WTJGMEtDQjBhR2x6TG14aGMzUlNaWFIxY201bFpGQmhaMlVnS1R0Y2NseHVYSFJjZEZ4MFhIUnlaWE52YkhabEtDazdYSEpjYmx4MFhIUmNkSDBwTzF4eVhHNWNkRngwZlNrN1hIUmNjbHh1WEhSOVhISmNibHgwTHlvcVhISmNibHgwSUNvZ1FXUmtJSE4xY0hCc2FXVmtJSEJoY21GdFpYUmxjbk1nZEc4Z2RHaGxJRzF2WkdWc0lGVlNURnh5WEc1Y2RDQXFJRUJrWlhOamNtbHdkR2x2YmlCRGIyNTJaWEowSUdoaGMyZ2diMllnY0dGeVlXMWxkR1Z5Y3lCMGJ5QnhkV1Z5ZVNCemRISnBibWNnWVc1a0lHRndjR1Z1WkNCMGJ5QnRiMlJsYkNCMWNteGNjbHh1WEhRZ0tpOWNjbHh1WEhSelpYUlFZWEpoYlhNZ0tDQnZZbW9nS1NCN1hISmNibHgwWEhSMGFHbHpMbkJoY21GdGN5QTlJRTlpYW1WamRDNWhjM05wWjI0b0lIUm9hWE11Y0dGeVlXMXpMQ0J2WW1vZ0tUdGNjbHh1WEhSOVhISmNibHgwTHlvcVhISmNibHgwSUNvZ1JtVjBZMmdnWkdGMFlTQm1jbTl0SUhSb1pTQnpaWEoyWlhKY2NseHVYSFFnS2lCQVpHVnpZM0pwY0hScGIyNGdUV0ZyWlNCaElHZGxkQ0J5WlhGMVpYTjBJR1p2Y2lCMGFHVWdVa1ZUVkNCQlVFa2daR0YwWVZ4eVhHNWNkQ0FxSUVCeVpYUjFjbTV6SUh0UFltcGxZM1I5SUZCeWIyMXBjMlVnYjJKcVpXTjBYSEpjYmx4MElDb3ZYSEpjYmx4MFptVjBZMmhFWVhSaElDZ2dkWEpzSUNrZ2UxeHlYRzVjZEZ4MGJHVjBJSEZ6SUQwZ2NYVmxjbmxUZEhKcGJtZFRkSEpwYm1kcFpua29JSFJvYVhNdWNHRnlZVzF6SUNrN1hISmNibHgwWEhRdkwxUlBSRTg2SUhKbGJXOTJaU0FtSUdsbUlHNXZJSEZ6WEhKY2JseDBYSFIxY213Z0t6MGdZRDltYjNKdFlYUTlhbk52YmlZa2UzRnpmV0E3WEhSY2NseHVYSFJjZEhKbGRIVnliaUJ1WlhjZ1VISnZiV2x6WlNobWRXNWpkR2x2YmlnZ2NtVnpiMngyWlN3Z2NtVnFaV04wSUNrZ2UxeHlYRzVjZEZ4MFhIUjRhSElvZTF4eVhHNWNkRngwWEhRZ0lDQWdkWEpwT2lCMWNtd3NYSEpjYmx4MFhIUmNkQ0FnSUNCMWMyVllSRkk2SUhSeWRXVXNYSEpjYmx4MFhIUmNkSDBzSUdaMWJtTjBhVzl1SUNnZ1pYSnliM0lzSUhKbGMzQnZibk5sTENCaWIyUjVJQ2tnZTF4eVhHNWNkRngwWEhRZ0lDQWdhV1lnS0NCaWIyUjVJQ0U5UFNCMWJtUmxabWx1WldRZ0tTQjdYSEpjYmx4MFhIUmNkQ0FnSUNCY2RISmxjMjlzZG1Vb0lFcFRUMDR1Y0dGeWMyVW9ZbTlrZVNrZ0tUdGNjbHh1WEhSY2RGeDBJQ0FnSUgwZ1pXeHpaU0JwWmlBb0lHVnljbTl5SUNFOVBTQnVkV3hzSUNrZ2UxeHlYRzVjZEZ4MFhIUWdJQ0FnWEhRdkx5QmhiR1Z5ZENnbmFIUjBjQ0JsY25KdmNqb2djM1JoZEhWeklHTnZaR1U2SUNjZ0t5QnlaWE53YjI1elpTNXpkR0YwZFhORGIyUmxJQ3NnSnpzZ1pYSnliM0k2SUNjZ0t5Qmxjbkp2Y2lrN1hISmNibHgwWEhSY2RDQWdJQ0JjZEhKbGFtVmpkQ2dnUlhKeWIzSW9JR1Z5Y205eUlDa2dLVHRjY2x4dVhIUmNkRngwSUNBZ0lIMWNjbHh1WEhSY2RGeDBmU2s3WEhKY2JseDBYSFI5S1R0Y2NseHVYSFI5WEhKY2JseDBMeW9xWEhKY2JseDBJQ29nVW1WbWNtVnphQ0IwYUdVZ2JHOWpZV3dnYlc5a1pXd2dZVzVrSUdOdmJHeGxZM1JwYjI1Y2NseHVYSFFnS2lCQVpHVnpZM0pwY0hScGIyNGdVbVV0Wm1WMFkyZ2dZVzVrSUc5MlpYSjNjbWwwWlNCMGFHVWdiRzlqWVd3Z2JXOWtaV3dnWVc1a0lHTnZiR3hsWTNScGIyNGdkMmwwYUNCYmJHRjBaWE4wWFNCelpYSjJaWElnWkdGMFlWeHlYRzVjZENBcUlFQnlaWFIxY201eklIdFBZbXBsWTNSOUlGQnliMjFwYzJVZ2IySnFaV04wWEhKY2JseDBJQ292WEhKY2JseDBjbVZtY21WemFDQW9LU0I3WEhKY2JseDBYSFJ5WlhSMWNtNGdibVYzSUZCeWIyMXBjMlVvSUNnZ2NtVnpiMngyWlNBcElEMCtJSHNnWEhKY2JseDBYSFJjZEdsbUlDZ2dkR2hwY3k1cGMxQmhaMmx1WVhSbFpDQXBJSHRjY2x4dVhIUmNkRngwWEhSMGFHbHpMbU52Ykd4bFkzUnBiMjRnUFNCYlhUdGNjbHh1WEhSY2RGeDBYSFIwYUdsekxtTjFjbkpsYm5SQmNHbFFZV2RsSUQwZ01UdGNjbHh1WEhSY2RGeDBYSFIwYUdsekxtZGxkRTVsZUhSUVlXZGxLQ0IwY25WbElDa3VkR2hsYmlnZ0tDa2dQVDRnZTF4eVhHNWNkRngwWEhSY2RGeDBjbVZ6YjJ4MlpTZ3BPMXh5WEc1Y2RGeDBYSFJjZEgwcE8xeHlYRzVjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHlYRzVjZEZ4MFhIUmNkSFJvYVhNdVoyVjBUVzlrWld3b0tTNTBhR1Z1S0NBb0tTQTlQaUI3WEhKY2JseDBYSFJjZEZ4MFhIUnlaWE52YkhabEtDazdYSEpjYmx4MFhIUmNkRngwZlNrN1hISmNibHgwWEhSY2RIMWNjbHh1WEhSY2RIMHBPMXh5WEc1Y2RIMWNjbHh1ZlZ4eVhHNWNjbHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdUVzlrWld3N0lsMTkiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0dmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG52YXIgX0hhbmRsZWJhcnNIYW5kbGViYXJzID0gcmVxdWlyZSgnLi4vLi4vSGFuZGxlYmFycy9oYW5kbGViYXJzJyk7XG5cbnZhciBfSGFuZGxlYmFyc0hhbmRsZWJhcnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfSGFuZGxlYmFyc0hhbmRsZWJhcnMpO1xuXG4vKipcclxuICogQ3JlYXRlIGEgd2lkZ2V0IHZpZXdcclxuICogQGNsYXNzZGVzYyBDcmVhdGUgYSB2aWV3IG9iamVjdCBcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMud2lkZ2V0LiBUaGUgd2lkZ2V0IGluc3RhbmNlIFtyZXF1aXJlZF1cclxuICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMucG9sbEludGVydmFsLiBJbnRlcnZhbCBpbiBtaWxsc2Vjb25kcyB0byBhdXRvLXJlZnJlc2ggdGhlIHZpZXcncyBkYXRhXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnBvbGxUcmlnZ2VyLiBDU1Mgc2VsZWN0b3IgZm9yIGVsZW1lbnQgdG8gY2xpY2stdHJpZ2dlciBhIHJlZnJlc2ggb2YgdGhlIHZpZXcncyBkYXRhXHJcbiAqIEBjbGFzcyBTZXQgdmlldyBpbnN0YW5jZSBwcm9wZXJ0aWVzIGFuZCBpbml0aWFsaXNlIHZpZXdcclxuICovXG5cbnZhciBWaWV3ID0gKGZ1bmN0aW9uICgpIHtcblx0ZnVuY3Rpb24gVmlldygpIHtcblx0XHR2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdO1xuXG5cdFx0dmFyIHdpZGdldCA9IF9yZWYud2lkZ2V0O1xuXHRcdHZhciBlbCA9IF9yZWYuZWw7XG5cdFx0dmFyIHRlbXBsYXRlID0gX3JlZi50ZW1wbGF0ZTtcblx0XHR2YXIgbW9kZWwgPSBfcmVmLm1vZGVsO1xuXHRcdHZhciBwb2xsSW50ZXJ2YWwgPSBfcmVmLnBvbGxJbnRlcnZhbDtcblx0XHR2YXIgcG9sbFRyaWdnZXIgPSBfcmVmLnBvbGxUcmlnZ2VyO1xuXG5cdFx0X2NsYXNzQ2FsbENoZWNrKHRoaXMsIFZpZXcpO1xuXG5cdFx0dGhpcy53aWRnZXQgPSB3aWRnZXQ7XG5cdFx0dGhpcy5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWwpO1xuXHRcdHRoaXMudGVtcGxhdGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRlbXBsYXRlKS5pbm5lckhUTUw7XG5cdFx0dGhpcy5tb2RlbCA9IG1vZGVsO1xuXHRcdGlmICghdGhpcy53aWRnZXQgfHwgIXRoaXMuZWwgfHwgIXRoaXMudGVtcGxhdGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5jb25maWcgPSB0aGlzLndpZGdldC5jb25maWc7XG5cdFx0dGhpcy5wb2xsSW50ZXJ2YWwgPSBwb2xsSW50ZXJ2YWw7XG5cdFx0dGhpcy5wb2xsVHJpZ2dlciA9IHBvbGxUcmlnZ2VyID8gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihwb2xsVHJpZ2dlcikgOiB1bmRlZmluZWQ7XG5cblx0XHR0aGlzLmluaXQoKTtcblx0fVxuXG5cdC8qKlxyXG4gXHQqIEluaXRpYWxpc2Ugdmlld1xyXG4gXHQqIEBkZXNjcmlwdGlvbiBTdGFydCB2aWV3IG1vZGVsIHVwZGF0ZSBwb2xsZXI7IHJlZ2lzdGVyIHZpZXcgbW9kZWwgdXBkYXRlIHRyaWdnZXJcclxuIFx0Ki9cblxuXHRfY3JlYXRlQ2xhc3MoVmlldywgW3tcblx0XHRrZXk6ICdpbml0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gaW5pdCgpIHtcblx0XHRcdGlmICh0aGlzLnBvbGxJbnRlcnZhbCkge1xuXHRcdFx0XHR0aGlzLnBvbGxBdEludGVydmFsKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5wb2xsVHJpZ2dlcikge1xuXHRcdFx0XHR0aGlzLnJlZ2lzdGVyUG9sbFRyaWdnZXIoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogUmVuZGVyIHRoZSB2aWV3XHJcbiAgXHQqIEBkZXNjcmlwdGlvbiBSZW5kZXIgdGhlIHRlbXBsYXRlIHdpdGggc3VwcGxpZWQgZGF0YSBhbmQgYXBwZW5kIHRvIHZpZXcncyBlbGVtZW50XHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAncmVuZGVyJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHRcdFx0dmFyIGRhdGEgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB0aGlzLmRhdGEgOiBhcmd1bWVudHNbMF07XG5cblx0XHRcdHRoaXMuZGF0YSA9IGRhdGE7XG5cdFx0XHR2YXIgdGVtcGxhdGUgPSBfSGFuZGxlYmFyc0hhbmRsZWJhcnMyWydkZWZhdWx0J10uY29tcGlsZSh0aGlzLnRlbXBsYXRlKTtcblx0XHRcdHRoaXMuZWwuaW5uZXJIVE1MID0gdGVtcGxhdGUoZGF0YSk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIFByZS1sb2FkIGltYWdlcyBhbmQgcmVzZXQgdGhlIHdpZGdldCBoZWlnaHRcclxuICBcdCogQGRlc2NyaXB0aW9uIFdoZW4gc29tZSBpbWFnZXMgbG9hZCwgdGhlIGhlaWdodCBvZiB0aGUgd2lkZ2V0IG1heSBjaGFuZ2UgYW5kIGEgd2lkZ2V0LnJlc2V0SGVpZ2h0KCkgXHJcbiAgXHQqIG1heSBuZWVkIHRvIGJlIGZpcmVkLiBVc2UgdGhpcyBmdW5jdGlvbiB0byBtYW5hZ2UgdGhlIGxvYWRpbmcgb2YgdGhlc2UgaW1hZ2VzIHRoYXQgZ2VuZXJhdGUgYSB3aWRnZXQgXHJcbiAgXHQqIGRpbWVuc2lvbiBjaGFuZ2UgdG8gZW5zdXJlIHRoZSB3aWRnZXQgaGVpZ2h0IGlzIGFkYXB0ZWQgb25jZSB0aGUgaW1hZ2UgaGFzIGxvYWRlZFxyXG4gIFx0KiBAcGFyYW0ge1N0cmluZ30gUGF0aCB0byB0aGUgaW1hZ2UgdG8gbG9hZFxyXG4gIFx0KiBAcGFyYW0ge1N0cmluZ30gVW5pcXVlIGNzczMgc2VsZWN0b3IgdGFyZ2V0dGluZyB0aGUgPGltZyAvPiBlbGVtZW50IHRvIGxvYWQgdGhlIHBhdGggaW50b1xyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ2xvYWRJbWFnZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGxvYWRJbWFnZShwYXRoLCBlbCkge1xuXHRcdFx0dmFyIF90aGlzID0gdGhpcztcblxuXHRcdFx0dmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuXHRcdFx0aW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWwpLnNyYyA9IHBhdGg7XG5cdFx0XHRcdF90aGlzLndpZGdldC5yZXNldEhlaWdodCgpO1xuXHRcdFx0fSk7XG5cdFx0XHRpbWcuc3JjID0gcGF0aDtcblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogUmVmcmVzaCB2aWV3IHdpdGggbGF0ZXN0IHNlcnZlciBkYXRhXHJcbiAgXHQqIEBkZXNjcmlwdGlvbiBTZXQgY29udHJvbCAnbG9hZGluZycgQ1NTIHN0YXRlIG9uIHBvbGwgdHJpZ2dlcjsgdHJpZ2dlciBhIG1vZGVsIHJlZnJlc2g7IHRoZW4gcmUtcmVuZGVyIHRociB2aWV3LCBcclxuICBcdCogcmVzZXQgcG9sbCB0cmlnZ2VyIENTUyBzdGF0ZSwgcmVzZXQgd2lkZ2V0IGhlaWdodCwgcmVzZXQgdGhlIHZpZXcncyBjYXJvdXNlbCwgaW5pdGlhbGlzZSBhbmFseXRpY3Mgb24gbmV3IGNhcmRzLFxyXG4gIFx0KiBmaXJlIG5ldyBhbmFseXRpY3MgY2FyZCBpbXByZXNzaW9uc1xyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ3JlZnJlc2gnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiByZWZyZXNoKCkge1xuXHRcdFx0dmFyIF90aGlzMiA9IHRoaXM7XG5cblx0XHRcdHRoaXMucG9sbFRyaWdnZXIgJiYgdGhpcy5wb2xsVHJpZ2dlci5jbGFzc0xpc3QuYWRkKCdpcy1sb2FkaW5nJywgJ2lzLWRpc2FibGVkJyk7XG5cdFx0XHR0aGlzLm1vZGVsLnJlZnJlc2goKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0X3RoaXMyLnJlbmRlcigpO1xuXHRcdFx0XHRfdGhpczIucG9sbFRyaWdnZXIgJiYgX3RoaXMyLnBvbGxUcmlnZ2VyLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWxvYWRpbmcnLCAnaXMtZGlzYWJsZWQnKTtcblx0XHRcdFx0X3RoaXMyLndpZGdldC5yZXNldEhlaWdodCgpO1xuXHRcdFx0XHRfdGhpczIuY2Fyb3VzZWwgJiYgX3RoaXMyLmNhcm91c2VsLnJlc2V0KCk7XG5cdFx0XHRcdF90aGlzMi53aWRnZXQuYW5hbHl0aWNzLmNhcmRzSW5pdCgpO1xuXHRcdFx0XHRfdGhpczIud2lkZ2V0LmFuYWx5dGljcy5jYXJkSW1wcmVzc2lvbnMoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBSZWZyZXNoIHZpZXcgd2l0aCBsYXRlc3Qgc2VydmVyIGRhdGEgYXQgc3BlY2lmaWVkIGludGVydmFsXHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAncG9sbEF0SW50ZXJ2YWwnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBwb2xsQXRJbnRlcnZhbCgpIHtcblx0XHRcdHZhciBfdGhpczMgPSB0aGlzO1xuXG5cdFx0XHR3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRfdGhpczMucmVmcmVzaCgpO1xuXHRcdFx0fSwgdGhpcy5wb2xsSW50ZXJ2YWwpO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBSZWdpc3RlciBhIGNsaWNrIGxpc3RlbmVyIG9uIHNwZWNpZmllZCBET00gZWxlbWVudCB0byByZWZyZXNoIHZpZXcgd2l0aCBsYXRlc3Qgc2VydmVyIGRhdGFcclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICdyZWdpc3RlclBvbGxUcmlnZ2VyJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gcmVnaXN0ZXJQb2xsVHJpZ2dlcigpIHtcblx0XHRcdHZhciBfdGhpczQgPSB0aGlzO1xuXG5cdFx0XHR0aGlzLnBvbGxUcmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRfdGhpczQucmVmcmVzaCgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIEFwcGVuZCB0aGUgbmV4dCBzZXQgb2YgY2FyZHMgdG8gdGhlIHZpZXcgW2ZvciBwYWdpbmF0ZWQgbW9kZWxzIG9ubHldXHJcbiAgXHQqIEBkZXNjcmlwdGlvbiBHZXQgdGhlIHZpZXcncyBtb2RlbCdzIG5leHQgQVBJIHBhZ2UsIHJlbmRlciB0aGUgdmlldyB0ZW1wbGF0ZSB3aXRoIG5ldyBkYXRhIGFuZCBhcHBlbmQgbm9kZXMgdG8gdmlldyBlbGVtZW50XHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAnYXBwZW5kTmV4dFBhZ2UnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBhcHBlbmROZXh0UGFnZSgpIHtcblx0XHRcdHZhciBfdGhpczUgPSB0aGlzO1xuXG5cdFx0XHRpZiAoIXRoaXMubW9kZWwuaXNQYWdpbmF0ZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdFx0XHRcdF90aGlzNS5tb2RlbC5nZXROZXh0UGFnZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHZhciB0ZW1wbGF0ZSA9IF9IYW5kbGViYXJzSGFuZGxlYmFyczJbJ2RlZmF1bHQnXS5jb21waWxlKF90aGlzNS50ZW1wbGF0ZSk7XG5cdFx0XHRcdFx0dmFyIGZyYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdFx0XHR2YXIgZG9jRnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblx0XHRcdFx0XHRmcmFnLmlubmVySFRNTCA9IHRlbXBsYXRlKHtcblx0XHRcdFx0XHRcdGV2ZW50czogX3RoaXM1Lm1vZGVsLmxhc3RSZXR1cm5lZFBhZ2Vcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRbXS5zbGljZS5jYWxsKGZyYWcuY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdFx0XHRcdFx0XHRkb2NGcmFnLmFwcGVuZENoaWxkKGVsKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRfdGhpczUuZWwuYXBwZW5kQ2hpbGQoZG9jRnJhZyk7XG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fV0pO1xuXG5cdHJldHVybiBWaWV3O1xufSkoKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gVmlldztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJOeWIzZGtablZ1WkdsdVp5MXdiR1ZrWjJVdFltOTRMMkp2ZDJWeVgyTnZiWEJ2Ym1WdWRITXZhblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwycHpMMlp5WVcxbGQyOXlheTlXYVdWM0xtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSkJRVUZCTEZsQlFWa3NRMEZCUXpzN096czdPenM3T3pzN08yOURRVVZWTERaQ1FVRTJRanM3T3pzN096czdPenM3T3p0SlFWVTVReXhKUVVGSk8wRkJRMGNzVlVGRVVDeEpRVUZKTEVkQlEzVkZPMjFGUVVGTUxFVkJRVVU3TzAxQlFUZEVMRTFCUVUwc1VVRkJUaXhOUVVGTk8wMUJRVVVzUlVGQlJTeFJRVUZHTEVWQlFVVTdUVUZCUlN4UlFVRlJMRkZCUVZJc1VVRkJVVHROUVVGRkxFdEJRVXNzVVVGQlRDeExRVUZMTzAxQlFVVXNXVUZCV1N4UlFVRmFMRmxCUVZrN1RVRkJSU3hYUVVGWExGRkJRVmdzVjBGQlZ6czdkMEpCUkdwRkxFbEJRVWs3TzBGQlJWSXNUVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhOUVVGTkxFTkJRVU03UVVGRGNrSXNUVUZCU1N4RFFVRkRMRVZCUVVVc1IwRkJSeXhSUVVGUkxFTkJRVU1zWVVGQllTeERRVUZGTEVWQlFVVXNRMEZCUlN4RFFVRkRPMEZCUTNaRExFMUJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVY3NVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJSU3hSUVVGUkxFTkJRVVVzUTBGQlF5eFRRVUZUTEVOQlFVTTdRVUZETjBRc1RVRkJTU3hEUVVGRExFdEJRVXNzUjBGQlJ5eExRVUZMTEVOQlFVTTdRVUZEYmtJc1RVRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNSVUZCUnp0QlFVTnFSQ3hWUVVGUE8wZEJRMUE3UVVGRFJDeE5RVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETzBGQlEycERMRTFCUVVrc1EwRkJReXhaUVVGWkxFZEJRVWNzV1VGQldTeERRVUZETzBGQlEycERMRTFCUVVrc1EwRkJReXhYUVVGWExFZEJRVWNzVjBGQlZ5eEhRVUZITEZGQlFWRXNRMEZCUXl4aFFVRmhMRU5CUVVVc1YwRkJWeXhEUVVGRkxFZEJRVWNzVTBGQlV5eERRVUZET3p0QlFVVnVSaXhOUVVGSkxFTkJRVU1zU1VGQlNTeEZRVUZGTEVOQlFVTTdSVUZEV2pzN096czdPenRqUVdSSkxFbEJRVWs3TzFOQmJVSklMR2RDUVVGSE8wRkJRMUlzVDBGQlN5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RlFVRkhPMEZCUTNoQ0xGRkJRVWtzUTBGQlF5eGpRVUZqTEVWQlFVVXNRMEZCUXp0SlFVTjBRanRCUVVORUxFOUJRVXNzU1VGQlNTeERRVUZETEZkQlFWY3NSVUZCUnp0QlFVTjJRaXhSUVVGSkxFTkJRVU1zYlVKQlFXMUNMRVZCUVVVc1EwRkJRenRKUVVNelFqdEhRVU5FT3pzN096czdPenRUUVV0TkxHdENRVUZ0UWp0UFFVRnFRaXhKUVVGSkxIbEVRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpPenRCUVVOMFFpeFBRVUZKTEVOQlFVTXNTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJRenRCUVVOcVFpeFBRVUZKTEZGQlFWRXNSMEZCUnl4clEwRkJWeXhQUVVGUExFTkJRVVVzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUlN4RFFVRkRPMEZCUTI1RUxFOUJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNVMEZCVXl4SFFVRkhMRkZCUVZFc1EwRkJSU3hKUVVGSkxFTkJRVVVzUTBGQlF6dEhRVU55UXpzN096czdPenM3T3pzN08xTkJVMU1zYlVKQlFVVXNTVUZCU1N4RlFVRkZMRVZCUVVVc1JVRkJSenM3TzBGQlEzUkNMRTlCUVVrc1IwRkJSeXhIUVVGSExFbEJRVWtzUzBGQlN5eEZRVUZGTEVOQlFVTTdRVUZEZEVJc1RVRkJSeXhEUVVGRExHZENRVUZuUWl4RFFVRkRMRTFCUVUwc1JVRkJSU3haUVVGUE8wRkJRMjVETEZsQlFWRXNRMEZCUXl4aFFVRmhMRU5CUVVVc1JVRkJSU3hEUVVGRkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVsQlFVa3NRMEZCUXp0QlFVTjRReXhWUVVGTExFMUJRVTBzUTBGQlF5eFhRVUZYTEVWQlFVVXNRMEZCUXp0SlFVTXhRaXhEUVVGRExFTkJRVU03UVVGRFNDeE5RVUZITEVOQlFVTXNSMEZCUnl4SFFVRkhMRWxCUVVrc1EwRkJRenRIUVVObU96czdPenM3T3pzN08xTkJUMDhzYlVKQlFVYzdPenRCUVVOV0xFOUJRVWtzUTBGQlF5eFhRVUZYTEVsQlFVa3NTVUZCU1N4RFFVRkRMRmRCUVZjc1EwRkJReXhUUVVGVExFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NSVUZCUlN4aFFVRmhMRU5CUVVNc1EwRkJRenRCUVVOb1JpeFBRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTlCUVU4c1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlJTeFpRVUZOTzBGQlEyaERMRmRCUVVzc1RVRkJUU3hGUVVGRkxFTkJRVU03UVVGRFpDeFhRVUZMTEZkQlFWY3NTVUZCU1N4UFFVRkxMRmRCUVZjc1EwRkJReXhUUVVGVExFTkJRVU1zVFVGQlRTeERRVUZETEZsQlFWa3NSVUZCUlN4aFFVRmhMRU5CUVVNc1EwRkJRenRCUVVOdVJpeFhRVUZMTEUxQlFVMHNRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJRenRCUVVNeFFpeFhRVUZMTEZGQlFWRXNTVUZCU1N4UFFVRkxMRkZCUVZFc1EwRkJReXhMUVVGTExFVkJRVVVzUTBGQlF6dEJRVU4yUXl4WFFVRkxMRTFCUVUwc1EwRkJReXhUUVVGVExFTkJRVU1zVTBGQlV5eEZRVUZGTEVOQlFVTTdRVUZEYkVNc1YwRkJTeXhOUVVGTkxFTkJRVU1zVTBGQlV5eERRVUZETEdWQlFXVXNSVUZCUlN4RFFVRkRPMGxCUTNoRExFTkJRVU1zUTBGQlF6dEhRVU5JT3pzN096czdPMU5CU1dNc01FSkJRVWM3T3p0QlFVTnFRaXhUUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZGTEZsQlFVMDdRVUZEZWtJc1YwRkJTeXhQUVVGUExFVkJRVVVzUTBGQlF6dEpRVU5tTEVWQlFVVXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJSU3hEUVVGRE8wZEJRM1pDT3pzN096czdPMU5CU1cxQ0xDdENRVUZIT3pzN1FVRkRkRUlzVDBGQlNTeERRVUZETEZkQlFWY3NRMEZCUXl4blFrRkJaMElzUTBGQlF5eFBRVUZQTEVWQlFVVXNXVUZCVFR0QlFVTm9SQ3hYUVVGTExFOUJRVThzUlVGQlJTeERRVUZETzBsQlEyWXNRMEZCUXl4RFFVRkRPMGRCUTBnN096czdPenM3TzFOQlMyTXNNRUpCUVVjN096dEJRVU5xUWl4UFFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eFhRVUZYTEVWQlFVYzdRVUZET1VJc1YwRkJUenRKUVVOUU8wRkJRMFFzVlVGQlR5eEpRVUZKTEU5QlFVOHNRMEZCUXl4VlFVRkZMRTlCUVU4c1JVRkJUVHRCUVVOcVF5eFhRVUZMTEV0QlFVc3NRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVVVzV1VGQlRUdEJRVU53UXl4VFFVRkpMRkZCUVZFc1IwRkJSeXhyUTBGQlZ5eFBRVUZQTEVOQlFVVXNUMEZCU3l4UlFVRlJMRU5CUVVVc1EwRkJRenRCUVVOdVJDeFRRVUZKTEVsQlFVa3NSMEZCUnl4UlFVRlJMRU5CUVVNc1lVRkJZU3hEUVVGRkxFdEJRVXNzUTBGQlJTeERRVUZETzBGQlF6TkRMRk5CUVVrc1QwRkJUeXhIUVVGSExGRkJRVkVzUTBGQlF5eHpRa0ZCYzBJc1JVRkJSU3hEUVVGRE8wRkJRMmhFTEZOQlFVa3NRMEZCUXl4VFFVRlRMRWRCUVVjc1VVRkJVU3hEUVVGRE8wRkJRM3BDTEZsQlFVMHNSVUZCUlN4UFFVRkxMRXRCUVVzc1EwRkJReXhuUWtGQlowSTdUVUZEYmtNc1EwRkJReXhEUVVGRE8wRkJRMGdzVDBGQlJTeERRVUZETEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVVc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlJTeERRVUZETEU5QlFVOHNRMEZCUXl4VlFVRkZMRVZCUVVVc1JVRkJUVHRCUVVOb1JDeGhRVUZQTEVOQlFVTXNWMEZCVnl4RFFVRkZMRVZCUVVVc1EwRkJSU3hEUVVGRE8wMUJRekZDTEVOQlFVTXNRMEZCUXp0QlFVTklMRmxCUVVzc1JVRkJSU3hEUVVGRExGZEJRVmNzUTBGQlJTeFBRVUZQTEVOQlFVVXNRMEZCUXp0QlFVTXZRaXhaUVVGUExFVkJRVVVzUTBGQlF6dExRVU5XTEVOQlFVTXNRMEZCUXp0SlFVTklMRU5CUVVNc1EwRkJRenRIUVVOSU96czdVVUUxUjBrc1NVRkJTVHM3TzNGQ1FTdEhTeXhKUVVGSklpd2labWxzWlNJNklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTnliM2RrWm5WdVpHbHVaeTF3YkdWa1oyVXRZbTk0TDJKdmQyVnlYMk52YlhCdmJtVnVkSE12YW5WemRHZHBkbWx1WnkxM2FXUm5aWFF0Wm5KaGJXVjNiM0pyTDJOdmJYQnZibVZ1ZEhNdmJHbGlMMnB6TDJaeVlXMWxkMjl5YXk5V2FXVjNMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUozVnpaU0J6ZEhKcFkzUW5PMXh5WEc1Y2NseHVhVzF3YjNKMElFaGhibVJzWldKaGNuTWdabkp2YlNBbkxpNHZMaTR2U0dGdVpHeGxZbUZ5Y3k5b1lXNWtiR1ZpWVhKekp6dGNjbHh1WEhKY2JpOHFLbHh5WEc0Z0tpQkRjbVZoZEdVZ1lTQjNhV1JuWlhRZ2RtbGxkMXh5WEc0Z0tpQkFZMnhoYzNOa1pYTmpJRU55WldGMFpTQmhJSFpwWlhjZ2IySnFaV04wSUZ4eVhHNGdLaUJBY0dGeVlXMGdlMDlpYW1WamRIMGdiM0IwYVc5dWN5NTNhV1JuWlhRdUlGUm9aU0IzYVdSblpYUWdhVzV6ZEdGdVkyVWdXM0psY1hWcGNtVmtYVnh5WEc0Z0tpQkFjR0Z5WVcwZ2UwNTFiV0psY24wZ2IzQjBhVzl1Y3k1d2IyeHNTVzUwWlhKMllXd3VJRWx1ZEdWeWRtRnNJR2x1SUcxcGJHeHpaV052Ym1SeklIUnZJR0YxZEc4dGNtVm1jbVZ6YUNCMGFHVWdkbWxsZHlkeklHUmhkR0ZjY2x4dUlDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlHOXdkR2x2Ym5NdWNHOXNiRlJ5YVdkblpYSXVJRU5UVXlCelpXeGxZM1J2Y2lCbWIzSWdaV3hsYldWdWRDQjBieUJqYkdsamF5MTBjbWxuWjJWeUlHRWdjbVZtY21WemFDQnZaaUIwYUdVZ2RtbGxkeWR6SUdSaGRHRmNjbHh1SUNvZ1FHTnNZWE56SUZObGRDQjJhV1YzSUdsdWMzUmhibU5sSUhCeWIzQmxjblJwWlhNZ1lXNWtJR2x1YVhScFlXeHBjMlVnZG1sbGQxeHlYRzRnS2k5Y2NseHVZMnhoYzNNZ1ZtbGxkeUI3WEhKY2JseDBZMjl1YzNSeWRXTjBiM0lnS0NCN0lIZHBaR2RsZEN3Z1pXd3NJSFJsYlhCc1lYUmxMQ0J0YjJSbGJDd2djRzlzYkVsdWRHVnlkbUZzTENCd2IyeHNWSEpwWjJkbGNpQjlJRDBnZTMwZ0tTQjdYSEpjYmx4MFhIUjBhR2x6TG5kcFpHZGxkQ0E5SUhkcFpHZGxkRHRjY2x4dVhIUmNkSFJvYVhNdVpXd2dQU0JrYjJOMWJXVnVkQzV4ZFdWeWVWTmxiR1ZqZEc5eUtDQmxiQ0FwTzF4eVhHNWNkRngwZEdocGN5NTBaVzF3YkdGMFpTQTlJR1J2WTNWdFpXNTBMbkYxWlhKNVUyVnNaV04wYjNJb0lIUmxiWEJzWVhSbElDa3VhVzV1WlhKSVZFMU1PMXh5WEc1Y2RGeDBkR2hwY3k1dGIyUmxiQ0E5SUcxdlpHVnNPMXh5WEc1Y2RGeDBhV1lnS0NBaGRHaHBjeTUzYVdSblpYUWdmSHdnSVhSb2FYTXVaV3dnZkh3Z0lYUm9hWE11ZEdWdGNHeGhkR1VnS1NCN1hISmNibHgwWEhSY2RISmxkSFZ5Ymp0Y2NseHVYSFJjZEgxY2NseHVYSFJjZEhSb2FYTXVZMjl1Wm1sbklEMGdkR2hwY3k1M2FXUm5aWFF1WTI5dVptbG5PMXh5WEc1Y2RGeDBkR2hwY3k1d2IyeHNTVzUwWlhKMllXd2dQU0J3YjJ4c1NXNTBaWEoyWVd3N1hISmNibHgwWEhSMGFHbHpMbkJ2Ykd4VWNtbG5aMlZ5SUQwZ2NHOXNiRlJ5YVdkblpYSWdQeUJrYjJOMWJXVnVkQzV4ZFdWeWVWTmxiR1ZqZEc5eUtDQndiMnhzVkhKcFoyZGxjaUFwSURvZ2RXNWtaV1pwYm1Wa08xeHlYRzVjZEZ4MFhISmNibHgwWEhSMGFHbHpMbWx1YVhRb0tUdGNjbHh1WEhSOVhISmNibHgwTHlvcVhISmNiaUJjZENvZ1NXNXBkR2xoYkdselpTQjJhV1YzWEhKY2JpQmNkQ29nUUdSbGMyTnlhWEIwYVc5dUlGTjBZWEowSUhacFpYY2diVzlrWld3Z2RYQmtZWFJsSUhCdmJHeGxjanNnY21WbmFYTjBaWElnZG1sbGR5QnRiMlJsYkNCMWNHUmhkR1VnZEhKcFoyZGxjbHh5WEc0Z1hIUXFMMXh5WEc0Z1hIUnBibWwwSUNncElIdGNjbHh1WEhSY2RHbG1JQ2dnZEdocGN5NXdiMnhzU1c1MFpYSjJZV3dnS1NCN1hISmNibHgwWEhSY2RIUm9hWE11Y0c5c2JFRjBTVzUwWlhKMllXd29LVHRjY2x4dVhIUmNkSDFjY2x4dVhIUmNkR2xtSUNnZ2RHaHBjeTV3YjJ4c1ZISnBaMmRsY2lBcElIdGNjbHh1WEhSY2RGeDBkR2hwY3k1eVpXZHBjM1JsY2xCdmJHeFVjbWxuWjJWeUtDazdYSEpjYmx4MFhIUjlYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzRnWEhRcUlGSmxibVJsY2lCMGFHVWdkbWxsZDF4eVhHNGdYSFFxSUVCa1pYTmpjbWx3ZEdsdmJpQlNaVzVrWlhJZ2RHaGxJSFJsYlhCc1lYUmxJSGRwZEdnZ2MzVndjR3hwWldRZ1pHRjBZU0JoYm1RZ1lYQndaVzVrSUhSdklIWnBaWGNuY3lCbGJHVnRaVzUwWEhKY2JpQmNkQ292WEhKY2JseDBjbVZ1WkdWeUlDZ2daR0YwWVQxMGFHbHpMbVJoZEdFZ0tTQjdYSEpjYmx4MFhIUjBhR2x6TG1SaGRHRWdQU0JrWVhSaE8xeHlYRzVjZEZ4MGJHVjBJSFJsYlhCc1lYUmxJRDBnU0dGdVpHeGxZbUZ5Y3k1amIyMXdhV3hsS0NCMGFHbHpMblJsYlhCc1lYUmxJQ2s3WEhKY2JseDBYSFIwYUdsekxtVnNMbWx1Ym1WeVNGUk5UQ0E5SUhSbGJYQnNZWFJsS0NCa1lYUmhJQ2s3WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc0Z1hIUXFJRkJ5WlMxc2IyRmtJR2x0WVdkbGN5QmhibVFnY21WelpYUWdkR2hsSUhkcFpHZGxkQ0JvWldsbmFIUmNjbHh1SUZ4MEtpQkFaR1Z6WTNKcGNIUnBiMjRnVjJobGJpQnpiMjFsSUdsdFlXZGxjeUJzYjJGa0xDQjBhR1VnYUdWcFoyaDBJRzltSUhSb1pTQjNhV1JuWlhRZ2JXRjVJR05vWVc1blpTQmhibVFnWVNCM2FXUm5aWFF1Y21WelpYUklaV2xuYUhRb0tTQmNjbHh1SUZ4MEtpQnRZWGtnYm1WbFpDQjBieUJpWlNCbWFYSmxaQzRnVlhObElIUm9hWE1nWm5WdVkzUnBiMjRnZEc4Z2JXRnVZV2RsSUhSb1pTQnNiMkZrYVc1bklHOW1JSFJvWlhObElHbHRZV2RsY3lCMGFHRjBJR2RsYm1WeVlYUmxJR0VnZDJsa1oyVjBJRnh5WEc0Z1hIUXFJR1JwYldWdWMybHZiaUJqYUdGdVoyVWdkRzhnWlc1emRYSmxJSFJvWlNCM2FXUm5aWFFnYUdWcFoyaDBJR2x6SUdGa1lYQjBaV1FnYjI1alpTQjBhR1VnYVcxaFoyVWdhR0Z6SUd4dllXUmxaRnh5WEc0Z1hIUXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQlFZWFJvSUhSdklIUm9aU0JwYldGblpTQjBieUJzYjJGa1hISmNiaUJjZENvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUZWdWFYRjFaU0JqYzNNeklITmxiR1ZqZEc5eUlIUmhjbWRsZEhScGJtY2dkR2hsSUR4cGJXY2dMejRnWld4bGJXVnVkQ0IwYnlCc2IyRmtJSFJvWlNCd1lYUm9JR2x1ZEc5Y2NseHVJRngwS2k5Y2NseHVYSFJzYjJGa1NXMWhaMlVnS0NCd1lYUm9MQ0JsYkNBcElIdGNjbHh1WEhSY2RHeGxkQ0JwYldjZ1BTQnVaWGNnU1cxaFoyVW9LVHRjY2x4dVhIUmNkR2x0Wnk1aFpHUkZkbVZ1ZEV4cGMzUmxibVZ5S0Nkc2IyRmtKeXdnS0NrZ1BUNGdJSHNnWEhKY2JseDBYSFJjZEdSdlkzVnRaVzUwTG5GMVpYSjVVMlZzWldOMGIzSW9JR1ZzSUNrdWMzSmpJRDBnY0dGMGFEdGNjbHh1WEhSY2RGeDBkR2hwY3k1M2FXUm5aWFF1Y21WelpYUklaV2xuYUhRb0tUdGNjbHh1WEhSY2RIMHBPMXh5WEc1Y2RGeDBhVzFuTG5OeVl5QTlJSEJoZEdnN1hISmNibHgwZlZ4eVhHNWNkQzhxS2x4eVhHNGdYSFFxSUZKbFpuSmxjMmdnZG1sbGR5QjNhWFJvSUd4aGRHVnpkQ0J6WlhKMlpYSWdaR0YwWVZ4eVhHNGdYSFFxSUVCa1pYTmpjbWx3ZEdsdmJpQlRaWFFnWTI5dWRISnZiQ0FuYkc5aFpHbHVaeWNnUTFOVElITjBZWFJsSUc5dUlIQnZiR3dnZEhKcFoyZGxjanNnZEhKcFoyZGxjaUJoSUcxdlpHVnNJSEpsWm5KbGMyZzdJSFJvWlc0Z2NtVXRjbVZ1WkdWeUlIUm9jaUIyYVdWM0xDQmNjbHh1SUZ4MEtpQnlaWE5sZENCd2IyeHNJSFJ5YVdkblpYSWdRMU5USUhOMFlYUmxMQ0J5WlhObGRDQjNhV1JuWlhRZ2FHVnBaMmgwTENCeVpYTmxkQ0IwYUdVZ2RtbGxkeWR6SUdOaGNtOTFjMlZzTENCcGJtbDBhV0ZzYVhObElHRnVZV3g1ZEdsamN5QnZiaUJ1WlhjZ1kyRnlaSE1zWEhKY2JpQmNkQ29nWm1seVpTQnVaWGNnWVc1aGJIbDBhV056SUdOaGNtUWdhVzF3Y21WemMybHZibk5jY2x4dUlGeDBLaTljY2x4dVhIUnlaV1p5WlhOb0lDZ3BJSHRjY2x4dVhIUmNkSFJvYVhNdWNHOXNiRlJ5YVdkblpYSWdKaVlnZEdocGN5NXdiMnhzVkhKcFoyZGxjaTVqYkdGemMweHBjM1F1WVdSa0tDZHBjeTFzYjJGa2FXNW5KeXdnSjJsekxXUnBjMkZpYkdWa0p5azdJRnh5WEc1Y2RGeDBkR2hwY3k1dGIyUmxiQzV5WldaeVpYTm9LQ2t1ZEdobGJpZ2dLQ2tnUFQ0Z2UxeHlYRzVjZEZ4MFhIUjBhR2x6TG5KbGJtUmxjaWdwTzF4eVhHNWNkRngwWEhSMGFHbHpMbkJ2Ykd4VWNtbG5aMlZ5SUNZbUlIUm9hWE11Y0c5c2JGUnlhV2RuWlhJdVkyeGhjM05NYVhOMExuSmxiVzkyWlNnbmFYTXRiRzloWkdsdVp5Y3NJQ2RwY3kxa2FYTmhZbXhsWkNjcE8xeHlYRzVjZEZ4MFhIUjBhR2x6TG5kcFpHZGxkQzV5WlhObGRFaGxhV2RvZENncE8xeHlYRzVjZEZ4MFhIUjBhR2x6TG1OaGNtOTFjMlZzSUNZbUlIUm9hWE11WTJGeWIzVnpaV3d1Y21WelpYUW9LVHRjY2x4dVhIUmNkRngwZEdocGN5NTNhV1JuWlhRdVlXNWhiSGwwYVdOekxtTmhjbVJ6U1c1cGRDZ3BPMXh5WEc1Y2RGeDBYSFIwYUdsekxuZHBaR2RsZEM1aGJtRnNlWFJwWTNNdVkyRnlaRWx0Y0hKbGMzTnBiMjV6S0NrN1hIUmNjbHh1WEhSY2RIMHBPMXgwWEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc0Z1hIUXFJRkpsWm5KbGMyZ2dkbWxsZHlCM2FYUm9JR3hoZEdWemRDQnpaWEoyWlhJZ1pHRjBZU0JoZENCemNHVmphV1pwWldRZ2FXNTBaWEoyWVd4Y2NseHVJRngwS2k5Y2NseHVYSFJ3YjJ4c1FYUkpiblJsY25aaGJDQW9LU0I3WEhKY2JseDBYSFIzYVc1a2IzY3VjMlYwU1c1MFpYSjJZV3dvSUNncElEMCtJSHRjY2x4dVhIUmNkRngwZEdocGN5NXlaV1p5WlhOb0tDazdYSEpjYmx4MFhIUjlMQ0IwYUdsekxuQnZiR3hKYm5SbGNuWmhiQ0FwTzF4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dUlGeDBLaUJTWldkcGMzUmxjaUJoSUdOc2FXTnJJR3hwYzNSbGJtVnlJRzl1SUhOd1pXTnBabWxsWkNCRVQwMGdaV3hsYldWdWRDQjBieUJ5WldaeVpYTm9JSFpwWlhjZ2QybDBhQ0JzWVhSbGMzUWdjMlZ5ZG1WeUlHUmhkR0ZjY2x4dUlGeDBLaTljY2x4dVhIUnlaV2RwYzNSbGNsQnZiR3hVY21sbloyVnlJQ2dwSUh0Y2NseHVYSFJjZEhSb2FYTXVjRzlzYkZSeWFXZG5aWEl1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWduWTJ4cFkyc25MQ0FvS1NBOVBpQjdYSEpjYmx4MFhIUmNkSFJvYVhNdWNtVm1jbVZ6YUNncE8xeHlYRzVjZEZ4MGZTazdYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzRnWEhRcUlFRndjR1Z1WkNCMGFHVWdibVY0ZENCelpYUWdiMllnWTJGeVpITWdkRzhnZEdobElIWnBaWGNnVzJadmNpQndZV2RwYm1GMFpXUWdiVzlrWld4eklHOXViSGxkWEhKY2JpQmNkQ29nUUdSbGMyTnlhWEIwYVc5dUlFZGxkQ0IwYUdVZ2RtbGxkeWR6SUcxdlpHVnNKM01nYm1WNGRDQkJVRWtnY0dGblpTd2djbVZ1WkdWeUlIUm9aU0IyYVdWM0lIUmxiWEJzWVhSbElIZHBkR2dnYm1WM0lHUmhkR0VnWVc1a0lHRndjR1Z1WkNCdWIyUmxjeUIwYnlCMmFXVjNJR1ZzWlcxbGJuUmNjbHh1SUZ4MEtpOWNjbHh1WEhSaGNIQmxibVJPWlhoMFVHRm5aU0FvS1NCN1hISmNibHgwWEhScFppQW9JQ0YwYUdsekxtMXZaR1ZzTG1selVHRm5hVzVoZEdWa0lDa2dlMXh5WEc1Y2RGeDBYSFJ5WlhSMWNtNDdYSEpjYmx4MFhIUjlYSEpjYmx4MFhIUnlaWFIxY200Z2JtVjNJRkJ5YjIxcGMyVW9LQ0J5WlhOdmJIWmxJQ2tnUFQ0Z2UxeHlYRzVjZEZ4MFhIUjBhR2x6TG0xdlpHVnNMbWRsZEU1bGVIUlFZV2RsS0NrdWRHaGxiaWdnS0NrZ1BUNGdlMXh5WEc1Y2RGeDBYSFJjZEd4bGRDQjBaVzF3YkdGMFpTQTlJRWhoYm1Sc1pXSmhjbk11WTI5dGNHbHNaU2dnZEdocGN5NTBaVzF3YkdGMFpTQXBPMXh5WEc1Y2RGeDBYSFJjZEd4bGRDQm1jbUZuSUQwZ1pHOWpkVzFsYm5RdVkzSmxZWFJsUld4bGJXVnVkQ2dnSjJScGRpY2dLVHRjY2x4dVhIUmNkRngwWEhSc1pYUWdaRzlqUm5KaFp5QTlJR1J2WTNWdFpXNTBMbU55WldGMFpVUnZZM1Z0Wlc1MFJuSmhaMjFsYm5Rb0tUdGNjbHh1WEhSY2RGeDBYSFJtY21GbkxtbHVibVZ5U0ZSTlRDQTlJSFJsYlhCc1lYUmxLSHRjY2x4dVhIUmNkRngwWEhSY2RHVjJaVzUwY3pvZ2RHaHBjeTV0YjJSbGJDNXNZWE4wVW1WMGRYSnVaV1JRWVdkbFhISmNibHgwWEhSY2RGeDBmU2s3WEhKY2JseDBYSFJjZEZ4MFcxMHVjMnhwWTJVdVkyRnNiQ2dnWm5KaFp5NWphR2xzWkhKbGJpQXBMbVp2Y2tWaFkyZ29LQ0JsYkNBcElEMCtJSHRjY2x4dVhIUmNkRngwWEhSY2RHUnZZMFp5WVdjdVlYQndaVzVrUTJocGJHUW9JR1ZzSUNrN1hISmNibHgwWEhSY2RGeDBmU2s3WEhKY2JseDBYSFJjZEZ4MGRHaHBjeTVsYkM1aGNIQmxibVJEYUdsc1pDZ2daRzlqUm5KaFp5QXBPMXh5WEc1Y2RGeDBYSFJjZEhKbGMyOXNkbVVvS1R0Y2NseHVYSFJjZEZ4MGZTazdYSEpjYmx4MFhIUjlLVHRjY2x4dVhIUjlYSEpjYm4xY2NseHVYSEpjYm1WNGNHOXlkQ0JrWldaaGRXeDBJRlpwWlhjN0lsMTkiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0dmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG52YXIgX3V0aWxzUXVlcnlTdHJpbmcgPSByZXF1aXJlKCcuLi91dGlscy9xdWVyeVN0cmluZycpO1xuXG52YXIgX3V0aWxzRGVib3VuY2UgPSByZXF1aXJlKCcuLi91dGlscy9kZWJvdW5jZScpO1xuXG52YXIgX3V0aWxzRGVib3VuY2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbHNEZWJvdW5jZSk7XG5cbnZhciBfQW5hbHl0aWNzID0gcmVxdWlyZSgnLi9BbmFseXRpY3MnKTtcblxudmFyIF9BbmFseXRpY3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQW5hbHl0aWNzKTtcblxuLyoqXHJcbiAqIENyZWF0ZSBhIHdpZGdldFxyXG4gKiBAY2xhc3NkZXNjIENyZWF0ZSBhIHdpZGdldCBvYmplY3QgXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy53aWRnZXRDb250YWluZXIuIFRoZSB3aWRnZXQgY29udGFpbmVyIGVsZW1lbnRcclxuICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLnJlc3BvbnNpdmUuIFdoZXRoZXIgdGhlIHdpZGdldCBpcyByZXNwb25zaXZlXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy51c2VyQ29uZmlnLiBXaGV0aGVyIHRoZSB3aWRnZXQgaGFzIHVzZXIgY29uZmlndXJhYmxlIHNldHRpbmdzXHJcbiAqIEBjbGFzcyBTZXQgd2lkZ2V0IGluc3RhbmNlIHByb3BlcnRpZXMgYW5kIGluaXRpYWxpc2Ugd2lkZ2V0XHJcbiAqL1xuXG52YXIgV2lkZ2V0ID0gKGZ1bmN0aW9uICgpIHtcblx0ZnVuY3Rpb24gV2lkZ2V0KCkge1xuXHRcdHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG5cblx0XHR2YXIgd2lkZ2V0Q29udGFpbmVyID0gX3JlZi53aWRnZXRDb250YWluZXI7XG5cdFx0dmFyIHJlc3BvbnNpdmUgPSBfcmVmLnJlc3BvbnNpdmU7XG5cdFx0dmFyIHVzZXJDb25maWcgPSBfcmVmLnVzZXJDb25maWc7XG5cdFx0dmFyIHdpZGdldE5hbWUgPSBfcmVmLndpZGdldE5hbWU7XG5cblx0XHRfY2xhc3NDYWxsQ2hlY2sodGhpcywgV2lkZ2V0KTtcblxuXHRcdHRoaXMud2lkZ2V0Q29udGFpbmVyID0gd2lkZ2V0Q29udGFpbmVyIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXdpZGdldC1jb250YWluZXJdJyk7XG5cdFx0dGhpcy5yZXNwb25zaXZlID0gcmVzcG9uc2l2ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHJlc3BvbnNpdmU7XG5cdFx0dGhpcy51c2VyQ29uZmlnID0gdXNlckNvbmZpZyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHVzZXJDb25maWc7XG5cdFx0dGhpcy53aWRnZXROYW1lID0gd2lkZ2V0TmFtZSB8fCAnJztcblx0XHR0aGlzLmFwcElkID0gJzQzN2JjYTQyJztcblx0XHRpZiAoIXRoaXMud2lkZ2V0TmFtZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxyXG4gXHQqIEluaXRpYWxpc2UgdGhlIHdpZGdldFxyXG4gXHQqIEBkZXNjcmlwdGlvbiBNYWtlIHRoZSB3aWRnZXQgcmVzcG9uc2l2ZTsgZmV0Y2ggYW5kIGNhY2hlIG9uIHRoZSB3aWRnZXQgaW5zdGFuY2UgdGhlIHVzZXIgY29uZmlnIGhhc2hcclxuIFx0Ki9cblxuXHRfY3JlYXRlQ2xhc3MoV2lkZ2V0LCBbe1xuXHRcdGtleTogJ2luaXQnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBpbml0KCkge1xuXHRcdFx0dGhpcy5yZXNwb25zaXZlICYmIHRoaXMubWFrZVJlc3BvbnNpdmUodGhpcy53aWRnZXRDb250YWluZXIpO1xuXHRcdFx0dGhpcy5jb25maWcgPSB0aGlzLnVzZXJDb25maWcgPyB0aGlzLmdldFVzZXJDb25maWcoKSA6IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogSW5pdGlhbGlzZSB3aWRnZXQgYW5hbHl0aWNzXHJcbiAgXHQqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQW5hbHl0aWNzIGNsYXNzIGZvciBjYWNoaW5nIG9uIHRoZSB3aWRnZXQgaW5zdGFuY2VcclxuICBcdCogQHJldHVybnMge09iamVjdH0gQW5hbHl0aWNzIGluc3RhbmNlXHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAnaW5pdEFuYWx5dGljcycsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGluaXRBbmFseXRpY3MoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IF9BbmFseXRpY3MyWydkZWZhdWx0J10oe1xuXHRcdFx0XHRjb25maWdIYXNoOiB0aGlzLmNvbmZpZyxcblx0XHRcdFx0d2lkZ2V0OiB0aGlzXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogQ3JlYXRlIGEgaGFzaCBtYXAgb2YgdXNlciBjb25maWcgZnJvbSB3aWRnZXQgcXVlcnkgc3RyaW5nXHJcbiAgXHQqIEByZXR1cm5zIHtPYmplY3R9IGhhc2ggbWFwIG9mIHVzZXIgY29uZmlnXHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAnZ2V0VXNlckNvbmZpZycsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGdldFVzZXJDb25maWcoKSB7XG5cdFx0XHRyZXR1cm4gKDAsIF91dGlsc1F1ZXJ5U3RyaW5nLnF1ZXJ5U3RyaW5nUGFyc2UpKGxvY2F0aW9uLnNlYXJjaCk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIE1ha2Ugd2lkZ2V0IHJlc3BvbnNpdmUgdG8gaXRzIGN1cnJlbnQgY29udGVudCBvbiB3aW4gcmVzaXplXHJcbiAgXHQqIEBwYXJhbSB7RWxlbWVudH0gVGhlIHdpZGdldCBjb250YWluZXJcclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICdtYWtlUmVzcG9uc2l2ZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIG1ha2VSZXNwb25zaXZlKHdpZGdldENvbnRhaW5lcikge1xuXHRcdFx0dmFyIF90aGlzID0gdGhpcztcblxuXHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgwLCBfdXRpbHNEZWJvdW5jZTJbJ2RlZmF1bHQnXSkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gX3RoaXMucG9zdENvbnRlbnRIZWlnaHQod2lkZ2V0Q29udGFpbmVyKTtcblx0XHRcdH0sIDI1MCkpO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBQb3N0IHRoZSBjdXJyZW50IHNjcm9sbCBoZWlnaHQgdmFsdWUgb2YgYW4gZWxlbWVudCB0byB0aGUgcGFyZW50IHdpbmRvd1xyXG4gIFx0KiBAcGFyYW0ge0VsZW1lbnR9IFRoZSBlbGVtbnQgd2hvc2UgaGVpZ2h0IHRvIHNlbmRcclxuICBcdCogQHBhcmFtIHtTdHJpbmd9IFVSTCBvZiBwYXJlbnQgdG8gcG9zdCBtZXNzYWdlIHRvOyBkZWZhdWx0cyB0byBkb2N1bWVudC5yZWZlcnJlclxyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ3Bvc3RDb250ZW50SGVpZ2h0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gcG9zdENvbnRlbnRIZWlnaHQoZWwpIHtcblx0XHRcdHZhciB1cmwgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBkb2N1bWVudC5yZWZlcnJlciA6IGFyZ3VtZW50c1sxXTtcblxuXHRcdFx0Ly9Eb24ndCBwb3N0IHRvIHNlbGZcblx0XHRcdGlmICh3aW5kb3cgPT09IHdpbmRvdy50b3AgfHwgd2luZG93LmxvY2F0aW9uID09PSB3aW5kb3cudG9wLmxvY2F0aW9uKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHBhcmVudC5wb3N0TWVzc2FnZSgnd2lkZ2V0TmFtZT0nICsgdGhpcy53aWRnZXROYW1lICsgJyZjb250ZW50SGVpZ2h0PScgKyBlbC5zY3JvbGxIZWlnaHQsIHVybCk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIFJlc2V0IHRoZSBoZWlnaHQgb2YgdGhlIHdpZGdldFxyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ3Jlc2V0SGVpZ2h0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gcmVzZXRIZWlnaHQoKSB7XG5cdFx0XHR0aGlzLnBvc3RDb250ZW50SGVpZ2h0KHRoaXMud2lkZ2V0Q29udGFpbmVyKTtcblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gV2lkZ2V0O1xufSkoKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gV2lkZ2V0O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMk55YjNka1puVnVaR2x1Wnkxd2JHVmtaMlV0WW05NEwySnZkMlZ5WDJOdmJYQnZibVZ1ZEhNdmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDJwekwyWnlZVzFsZDI5eWF5OVhhV1JuWlhRdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzV1VGQldTeERRVUZET3pzN096czdPenM3T3pzN1owTkJSVzlDTEhOQ1FVRnpRanM3TmtKQlEyeERMRzFDUVVGdFFqczdPenQ1UWtGRGJFSXNZVUZCWVRzN096czdPenM3T3pzN096dEpRVlUzUWl4TlFVRk5PMEZCUTBFc1ZVRkVUaXhOUVVGTkxFZEJRMmxGTzIxRlFVRk1MRVZCUVVVN08wMUJRVEZFTEdWQlFXVXNVVUZCWml4bFFVRmxPMDFCUVVVc1ZVRkJWU3hSUVVGV0xGVkJRVlU3VFVGQlJTeFZRVUZWTEZGQlFWWXNWVUZCVlR0TlFVRkZMRlZCUVZVc1VVRkJWaXhWUVVGVk96dDNRa0ZFTjBRc1RVRkJUVHM3UVVGRlZpeE5RVUZKTEVOQlFVTXNaVUZCWlN4SFFVRkhMR1ZCUVdVc1NVRkJTU3hSUVVGUkxFTkJRVU1zWVVGQllTeERRVUZETEhsQ1FVRjVRaXhEUVVGRExFTkJRVU03UVVGRE5VWXNUVUZCU1N4RFFVRkRMRlZCUVZVc1IwRkJSeXhWUVVGVkxFdEJRVXNzVTBGQlV5eEhRVUZITEVsQlFVa3NSMEZCUnl4VlFVRlZMRU5CUVVNN1FVRkRMMFFzVFVGQlNTeERRVUZETEZWQlFWVXNSMEZCUnl4VlFVRlZMRXRCUVVzc1UwRkJVeXhIUVVGSExFbEJRVWtzUjBGQlJ5eFZRVUZWTEVOQlFVTTdRVUZETDBRc1RVRkJTU3hEUVVGRExGVkJRVlVzUjBGQlJ5eFZRVUZWTEVsQlFVa3NSVUZCUlN4RFFVRkRPMEZCUTI1RExFMUJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NWVUZCVlN4RFFVRkRPMEZCUTNoQ0xFMUJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNWVUZCVlN4RlFVRkhPMEZCUTNaQ0xGVkJRVTg3UjBGRFVEdEZRVU5FT3pzN096czdPMk5CVmtrc1RVRkJUVHM3VTBGbFRpeG5Ra0ZCUnp0QlFVTlFMRTlCUVVrc1EwRkJReXhWUVVGVkxFbEJRVWtzU1VGQlNTeERRVUZETEdOQlFXTXNRMEZCUlN4SlFVRkpMRU5CUVVNc1pVRkJaU3hEUVVGRkxFTkJRVU03UVVGREwwUXNUMEZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhKUVVGSkxFTkJRVU1zVlVGQlZTeEhRVUZITEVsQlFVa3NRMEZCUXl4aFFVRmhMRVZCUVVVc1IwRkJSeXhUUVVGVExFTkJRVU03UjBGRGFrVTdPenM3T3pzN096dFRRVTFoTEhsQ1FVRkhPMEZCUTJoQ0xGVkJRVThzTWtKQlFXTTdRVUZEY0VJc1kwRkJWU3hGUVVGRkxFbEJRVWtzUTBGQlF5eE5RVUZOTzBGQlEzWkNMRlZCUVUwc1JVRkJSU3hKUVVGSk8wbEJRMW9zUTBGQlF5eERRVUZETzBkQlEwZzdPenM3T3pzN08xTkJTMkVzZVVKQlFVYzdRVUZEYUVJc1ZVRkJUeXgzUTBGQmEwSXNVVUZCVVN4RFFVRkRMRTFCUVUwc1EwRkJSU3hEUVVGRE8wZEJRek5ET3pzN096czdPenRUUVV0akxIZENRVUZGTEdWQlFXVXNSVUZCUnpzN08wRkJRMnhETEZOQlFVMHNRMEZCUXl4blFrRkJaMElzUTBGQlJTeFJRVUZSTEVWQlFVVXNaME5CUVZVN1YwRkJUU3hOUVVGTExHbENRVUZwUWl4RFFVRkRMR1ZCUVdVc1EwRkJRenRKUVVGQkxFVkJRVVVzUjBGQlJ5eERRVUZETEVOQlFVVXNRMEZCUXp0SFFVTnVSenM3T3pzN096czdPMU5CVFdsQ0xESkNRVUZGTEVWQlFVVXNSVUZCTUVJN1QwRkJlRUlzUjBGQlJ5eDVSRUZCUXl4UlFVRlJMRU5CUVVNc1VVRkJVVHM3TzBGQlJUVkRMRTlCUVVzc1RVRkJUU3hMUVVGTExFMUJRVTBzUTBGQlF5eEhRVUZITEVsQlFVa3NUVUZCVFN4RFFVRkRMRkZCUVZFc1MwRkJTeXhOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEZGQlFWRXNSVUZCUnp0QlFVTjJSU3hYUVVGUE8wbEJRMUE3UVVGRFJDeFRRVUZOTEVOQlFVTXNWMEZCVnl4cFFrRkJaMElzU1VGQlNTeERRVUZETEZWQlFWVXNkVUpCUVd0Q0xFVkJRVVVzUTBGQlF5eFpRVUZaTEVWQlFVa3NSMEZCUnl4RFFVRkZMRU5CUVVNN1IwRkROVVk3T3pzN096czdVMEZKVnl4MVFrRkJSenRCUVVOa0xFOUJRVWtzUTBGQlF5eHBRa0ZCYVVJc1EwRkJSU3hKUVVGSkxFTkJRVU1zWlVGQlpTeERRVUZGTEVOQlFVTTdSMEZETDBNN096dFJRVGRFU1N4TlFVRk5PenM3Y1VKQlowVkhMRTFCUVUwaUxDSm1hV3hsSWpvaVF6b3ZkR1Z0Y0M5SFJ5NUdjbTl1ZEVWdVpDNVhhV1JuWlhSekwzZHBaR2RsZEhNdlkzSnZkMlJtZFc1a2FXNW5MWEJzWldSblpTMWliM2d2WW05M1pYSmZZMjl0Y0c5dVpXNTBjeTlxZFhOMFoybDJhVzVuTFhkcFpHZGxkQzFtY21GdFpYZHZjbXN2WTI5dGNHOXVaVzUwY3k5c2FXSXZhbk12Wm5KaGJXVjNiM0pyTDFkcFpHZGxkQzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpZDFjMlVnYzNSeWFXTjBKenRjY2x4dVhISmNibWx0Y0c5eWRDQjdJSEYxWlhKNVUzUnlhVzVuVUdGeWMyVWdmU0JtY205dElDY3VMaTkxZEdsc2N5OXhkV1Z5ZVZOMGNtbHVaeWM3WEhKY2JtbHRjRzl5ZENCa1pXSnZkVzVqWlNCbWNtOXRJQ2N1TGk5MWRHbHNjeTlrWldKdmRXNWpaU2M3WEhKY2JtbHRjRzl5ZENCQmJtRnNlWFJwWTNNZ1puSnZiU0FuTGk5QmJtRnNlWFJwWTNNbk8xeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlFTnlaV0YwWlNCaElIZHBaR2RsZEZ4eVhHNGdLaUJBWTJ4aGMzTmtaWE5qSUVOeVpXRjBaU0JoSUhkcFpHZGxkQ0J2WW1wbFkzUWdYSEpjYmlBcUlFQndZWEpoYlNCN1FtOXZiR1ZoYm4wZ2IzQjBhVzl1Y3k1M2FXUm5aWFJEYjI1MFlXbHVaWEl1SUZSb1pTQjNhV1JuWlhRZ1kyOXVkR0ZwYm1WeUlHVnNaVzFsYm5SY2NseHVJQ29nUUhCaGNtRnRJSHRDYjI5c1pXRnVmU0J2Y0hScGIyNXpMbkpsYzNCdmJuTnBkbVV1SUZkb1pYUm9aWElnZEdobElIZHBaR2RsZENCcGN5QnlaWE53YjI1emFYWmxYSEpjYmlBcUlFQndZWEpoYlNCN1FtOXZiR1ZoYm4wZ2IzQjBhVzl1Y3k1MWMyVnlRMjl1Wm1sbkxpQlhhR1YwYUdWeUlIUm9aU0IzYVdSblpYUWdhR0Z6SUhWelpYSWdZMjl1Wm1sbmRYSmhZbXhsSUhObGRIUnBibWR6WEhKY2JpQXFJRUJqYkdGemN5QlRaWFFnZDJsa1oyVjBJR2x1YzNSaGJtTmxJSEJ5YjNCbGNuUnBaWE1nWVc1a0lHbHVhWFJwWVd4cGMyVWdkMmxrWjJWMFhISmNiaUFxTDF4eVhHNWpiR0Z6Y3lCWGFXUm5aWFFnZTF4eVhHNWNkR052Ym5OMGNuVmpkRzl5S0NCN0lIZHBaR2RsZEVOdmJuUmhhVzVsY2l3Z2NtVnpjRzl1YzJsMlpTd2dkWE5sY2tOdmJtWnBaeXdnZDJsa1oyVjBUbUZ0WlNCOUlEMGdlMzBnS1NCN1hISmNibHgwWEhSMGFHbHpMbmRwWkdkbGRFTnZiblJoYVc1bGNpQTlJSGRwWkdkbGRFTnZiblJoYVc1bGNpQjhmQ0JrYjJOMWJXVnVkQzV4ZFdWeWVWTmxiR1ZqZEc5eUtDZGJaR0YwWVMxM2FXUm5aWFF0WTI5dWRHRnBibVZ5WFNjcE8xeHlYRzVjZEZ4MGRHaHBjeTV5WlhOd2IyNXphWFpsSUQwZ2NtVnpjRzl1YzJsMlpTQTlQVDBnZFc1a1pXWnBibVZrSUQ4Z2RISjFaU0E2SUhKbGMzQnZibk5wZG1VN1hISmNibHgwWEhSMGFHbHpMblZ6WlhKRGIyNW1hV2NnUFNCMWMyVnlRMjl1Wm1sbklEMDlQU0IxYm1SbFptbHVaV1FnUHlCMGNuVmxJRG9nZFhObGNrTnZibVpwWnp0Y2NseHVYSFJjZEhSb2FYTXVkMmxrWjJWMFRtRnRaU0E5SUhkcFpHZGxkRTVoYldVZ2ZId2dKeWM3WEhKY2JseDBYSFIwYUdsekxtRndjRWxrSUQwZ0p6UXpOMkpqWVRReUp6dGNjbHh1WEhSY2RHbG1JQ2dnSVhSb2FYTXVkMmxrWjJWMFRtRnRaU0FwSUh0Y2NseHVYSFJjZEZ4MGNtVjBkWEp1TzF4eVhHNWNkRngwZlZ4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dUlGeDBLaUJKYm1sMGFXRnNhWE5sSUhSb1pTQjNhV1JuWlhSY2NseHVJRngwS2lCQVpHVnpZM0pwY0hScGIyNGdUV0ZyWlNCMGFHVWdkMmxrWjJWMElISmxjM0J2Ym5OcGRtVTdJR1psZEdOb0lHRnVaQ0JqWVdOb1pTQnZiaUIwYUdVZ2QybGtaMlYwSUdsdWMzUmhibU5sSUhSb1pTQjFjMlZ5SUdOdmJtWnBaeUJvWVhOb1hISmNiaUJjZENvdlhISmNibHgwYVc1cGRDQW9LU0I3WEhKY2JseDBYSFIwYUdsekxuSmxjM0J2Ym5OcGRtVWdKaVlnZEdocGN5NXRZV3RsVW1WemNHOXVjMmwyWlNnZ2RHaHBjeTUzYVdSblpYUkRiMjUwWVdsdVpYSWdLVHRjY2x4dVhIUmNkSFJvYVhNdVkyOXVabWxuSUQwZ2RHaHBjeTUxYzJWeVEyOXVabWxuSUQ4Z2RHaHBjeTVuWlhSVmMyVnlRMjl1Wm1sbktDa2dPaUIxYm1SbFptbHVaV1E3WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc0Z1hIUXFJRWx1YVhScFlXeHBjMlVnZDJsa1oyVjBJR0Z1WVd4NWRHbGpjMXh5WEc0Z1hIUXFJRUJrWlhOamNtbHdkR2x2YmlCRGNtVmhkR1VnWVNCdVpYY2dhVzV6ZEdGdVkyVWdiMllnUVc1aGJIbDBhV056SUdOc1lYTnpJR1p2Y2lCallXTm9hVzVuSUc5dUlIUm9aU0IzYVdSblpYUWdhVzV6ZEdGdVkyVmNjbHh1SUZ4MEtpQkFjbVYwZFhKdWN5QjdUMkpxWldOMGZTQkJibUZzZVhScFkzTWdhVzV6ZEdGdVkyVmNjbHh1SUZ4MEtpOWNjbHh1WEhScGJtbDBRVzVoYkhsMGFXTnpJQ2dwSUh0Y2NseHVYSFJjZEhKbGRIVnliaUJ1WlhjZ1FXNWhiSGwwYVdOektIdGNjbHh1WEhSY2RGeDBZMjl1Wm1sblNHRnphRG9nZEdocGN5NWpiMjVtYVdjc1hISmNibHgwWEhSY2RIZHBaR2RsZERvZ2RHaHBjMXh5WEc1Y2RGeDBmU2s3WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc0Z1hIUXFJRU55WldGMFpTQmhJR2hoYzJnZ2JXRndJRzltSUhWelpYSWdZMjl1Wm1sbklHWnliMjBnZDJsa1oyVjBJSEYxWlhKNUlITjBjbWx1WjF4eVhHNGdYSFFxSUVCeVpYUjFjbTV6SUh0UFltcGxZM1I5SUdoaGMyZ2diV0Z3SUc5bUlIVnpaWElnWTI5dVptbG5YSEpjYmlCY2RDb3ZYSEpjYmx4MFoyVjBWWE5sY2tOdmJtWnBaeUFvS1NCN1hISmNibHgwWEhSeVpYUjFjbTRnY1hWbGNubFRkSEpwYm1kUVlYSnpaU2dnYkc5allYUnBiMjR1YzJWaGNtTm9JQ2s3WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc0Z1hIUXFJRTFoYTJVZ2QybGtaMlYwSUhKbGMzQnZibk5wZG1VZ2RHOGdhWFJ6SUdOMWNuSmxiblFnWTI5dWRHVnVkQ0J2YmlCM2FXNGdjbVZ6YVhwbFhISmNiaUJjZENvZ1FIQmhjbUZ0SUh0RmJHVnRaVzUwZlNCVWFHVWdkMmxrWjJWMElHTnZiblJoYVc1bGNseHlYRzRnWEhRcUwxeHlYRzVjZEcxaGEyVlNaWE53YjI1emFYWmxJQ2dnZDJsa1oyVjBRMjl1ZEdGcGJtVnlJQ2tnZTF4eVhHNWNkRngwZDJsdVpHOTNMbUZrWkVWMlpXNTBUR2x6ZEdWdVpYSW9JQ2R5WlhOcGVtVW5MQ0JrWldKdmRXNWpaU2dnS0NrZ1BUNGdkR2hwY3k1d2IzTjBRMjl1ZEdWdWRFaGxhV2RvZENoM2FXUm5aWFJEYjI1MFlXbHVaWElwTENBeU5UQXBJQ2s3WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc0Z1hIUXFJRkJ2YzNRZ2RHaGxJR04xY25KbGJuUWdjMk55YjJ4c0lHaGxhV2RvZENCMllXeDFaU0J2WmlCaGJpQmxiR1Z0Wlc1MElIUnZJSFJvWlNCd1lYSmxiblFnZDJsdVpHOTNYSEpjYmlCY2RDb2dRSEJoY21GdElIdEZiR1Z0Wlc1MGZTQlVhR1VnWld4bGJXNTBJSGRvYjNObElHaGxhV2RvZENCMGJ5QnpaVzVrWEhKY2JpQmNkQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJRlZTVENCdlppQndZWEpsYm5RZ2RHOGdjRzl6ZENCdFpYTnpZV2RsSUhSdk95QmtaV1poZFd4MGN5QjBieUJrYjJOMWJXVnVkQzV5WldabGNuSmxjbHh5WEc0Z1hIUXFMMXh5WEc1Y2RIQnZjM1JEYjI1MFpXNTBTR1ZwWjJoMElDZ2daV3dzSUhWeWJEMWtiMk4xYldWdWRDNXlaV1psY25KbGNpQXBJSHRjY2x4dVhIUmNkQzh2Ukc5dUozUWdjRzl6ZENCMGJ5QnpaV3htWEhKY2JseDBYSFJwWmlBb0lIZHBibVJ2ZHlBOVBUMGdkMmx1Wkc5M0xuUnZjQ0I4ZkNCM2FXNWtiM2N1Ykc5allYUnBiMjRnUFQwOUlIZHBibVJ2ZHk1MGIzQXViRzlqWVhScGIyNGdLU0I3WEhKY2JseDBYSFJjZEhKbGRIVnlianRjY2x4dVhIUmNkSDBnWEhKY2JseDBYSFJ3WVhKbGJuUXVjRzl6ZEUxbGMzTmhaMlVvSUdCM2FXUm5aWFJPWVcxbFBTUjdkR2hwY3k1M2FXUm5aWFJPWVcxbGZTWmpiMjUwWlc1MFNHVnBaMmgwUFNSN1pXd3VjMk55YjJ4c1NHVnBaMmgwZldBc0lIVnliQ0FwTzF4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dUlGeDBLaUJTWlhObGRDQjBhR1VnYUdWcFoyaDBJRzltSUhSb1pTQjNhV1JuWlhSY2NseHVJRngwS2k5Y2NseHVYSFJ5WlhObGRFaGxhV2RvZENBb0tTQjdYSEpjYmx4MFhIUjBhR2x6TG5CdmMzUkRiMjUwWlc1MFNHVnBaMmgwS0NCMGFHbHpMbmRwWkdkbGRFTnZiblJoYVc1bGNpQXBPMXh5WEc1Y2RIMWNjbHh1ZlZ4eVhHNWNjbHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdWMmxrWjJWME8xeHlYRzVjY2x4dUlsMTkiLCIndXNlIHN0cmljdCc7XG4vKipcclxuICogRGVib3VuY2VzIGEgZnVuY3Rpb24gY2FsbFxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2VcclxuICogQHBhcmFtIHtudW1iZXJ9IER1cmF0aW9uIG9mIGRlYm91bmNlXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gSWYgdHJ1ZSwgdHJpZ2dlciBmdW5jdGlvbiBvbiBsZWFkaW5nIGVkZ2VcclxuICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBkZWJvdW5jZXIgZnVuY3Rpb25cclxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG5cdHZhbHVlOiB0cnVlXG59KTtcbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSkge1xuXHR2YXIgdGltZW91dCA9IHVuZGVmaW5lZDtcblx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgY29udGV4dCA9IHRoaXMsXG5cdFx0ICAgIGFyZ3MgPSBhcmd1bWVudHM7XG5cdFx0dmFyIGxhdGVyID0gZnVuY3Rpb24gbGF0ZXIoKSB7XG5cdFx0XHR0aW1lb3V0ID0gbnVsbDtcblx0XHRcdGlmICghaW1tZWRpYXRlKSB7XG5cdFx0XHRcdGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHR2YXIgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcblx0XHRjbGVhclRpbWVvdXQodGltZW91dCk7XG5cdFx0dGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuXHRcdGlmIChjYWxsTm93KSB7XG5cdFx0XHRmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0c1snZGVmYXVsdCddID0gZGVib3VuY2U7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTnliM2RrWm5WdVpHbHVaeTF3YkdWa1oyVXRZbTk0TDJKdmQyVnlYMk52YlhCdmJtVnVkSE12YW5WemRHZHBkbWx1WnkxM2FXUm5aWFF0Wm5KaGJXVjNiM0pyTDJOdmJYQnZibVZ1ZEhNdmJHbGlMMnB6TDNWMGFXeHpMMlJsWW05MWJtTmxMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUpCUVVGQkxGbEJRVmtzUTBGQlF6czdPenM3T3pzN096czdRVUZSWWl4VFFVRlRMRkZCUVZFc1EwRkJSU3hKUVVGSkxFVkJRVVVzU1VGQlNTeEZRVUZGTEZOQlFWTXNSVUZCUnp0QlFVTXhReXhMUVVGSkxFOUJRVThzV1VGQlFTeERRVUZETzBGQlExb3NVVUZCVHl4WlFVRlhPMEZCUTJwQ0xFMUJRVWtzVDBGQlR5eEhRVUZITEVsQlFVazdUVUZCUlN4SlFVRkpMRWRCUVVjc1UwRkJVeXhEUVVGRE8wRkJRM0pETEUxQlFVa3NTMEZCU3l4SFFVRkhMRk5CUVZJc1MwRkJTeXhIUVVGak8wRkJRM1JDTEZWQlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNN1FVRkRaaXhQUVVGTExFTkJRVU1zVTBGQlV5eEZRVUZITzBGQlEycENMRkZCUVVrc1EwRkJReXhMUVVGTExFTkJRVVVzVDBGQlR5eEZRVUZGTEVsQlFVa3NRMEZCUlN4RFFVRkRPMGxCUXpWQ08wZEJRMFFzUTBGQlF6dEJRVU5HTEUxQlFVa3NUMEZCVHl4SFFVRkhMRk5CUVZNc1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF6dEJRVU53UXl4alFVRlpMRU5CUVVVc1QwRkJUeXhEUVVGRkxFTkJRVU03UVVGRGVFSXNVMEZCVHl4SFFVRkhMRlZCUVZVc1EwRkJSU3hMUVVGTExFVkJRVVVzU1VGQlNTeERRVUZGTEVOQlFVTTdRVUZEY0VNc1RVRkJTeXhQUVVGUExFVkJRVWM3UVVGRFpDeFBRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkZMRTlCUVU4c1JVRkJSU3hKUVVGSkxFTkJRVVVzUTBGQlF6dEhRVU0xUWp0RlFVTkVMRU5CUVVNN1EwRkRSanM3Y1VKQlJXTXNVVUZCVVNJc0ltWnBiR1VpT2lKRE9pOTBaVzF3TDBkSExrWnliMjUwUlc1a0xsZHBaR2RsZEhNdmQybGtaMlYwY3k5amNtOTNaR1oxYm1ScGJtY3RjR3hsWkdkbExXSnZlQzlpYjNkbGNsOWpiMjF3YjI1bGJuUnpMMnAxYzNSbmFYWnBibWN0ZDJsa1oyVjBMV1p5WVcxbGQyOXlheTlqYjIxd2IyNWxiblJ6TDJ4cFlpOXFjeTkxZEdsc2N5OWtaV0p2ZFc1alpTNXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWlkMWMyVWdjM1J5YVdOMEp6dGNjbHh1THlvcVhISmNiaUFxSUVSbFltOTFibU5sY3lCaElHWjFibU4wYVc5dUlHTmhiR3hjY2x4dUlDb2dRSEJoY21GdElIdG1kVzVqZEdsdmJuMGdWR2hsSUdaMWJtTjBhVzl1SUhSdklHUmxZbTkxYm1ObFhISmNiaUFxSUVCd1lYSmhiU0I3Ym5WdFltVnlmU0JFZFhKaGRHbHZiaUJ2WmlCa1pXSnZkVzVqWlZ4eVhHNGdLaUJBY0dGeVlXMGdlMkp2YjJ4bFlXNTlJRWxtSUhSeWRXVXNJSFJ5YVdkblpYSWdablZ1WTNScGIyNGdiMjRnYkdWaFpHbHVaeUJsWkdkbFhISmNiaUFxSUVCeVpYUjFjbTRnZTJaMWJtTjBhVzl1ZlNCVWFHVWdaR1ZpYjNWdVkyVnlJR1oxYm1OMGFXOXVYSEpjYmlBcUwxeHlYRzVtZFc1amRHbHZiaUJrWldKdmRXNWpaU2dnWm5WdVl5d2dkMkZwZEN3Z2FXMXRaV1JwWVhSbElDa2dlMXh5WEc1Y2RHeGxkQ0IwYVcxbGIzVjBPMXh5WEc1Y2RISmxkSFZ5YmlCbWRXNWpkR2x2YmlncElIdGNjbHh1WEhSY2RHeGxkQ0JqYjI1MFpYaDBJRDBnZEdocGN5d2dZWEpuY3lBOUlHRnlaM1Z0Wlc1MGN6dGNjbHh1WEhSY2RHeGxkQ0JzWVhSbGNpQTlJR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNWNkRngwWEhSMGFXMWxiM1YwSUQwZ2JuVnNiRHRjY2x4dVhIUmNkRngwYVdZZ0tDQWhhVzF0WldScFlYUmxJQ2tnZXlCY2NseHVYSFJjZEZ4MFhIUm1kVzVqTG1Gd2NHeDVLQ0JqYjI1MFpYaDBMQ0JoY21keklDazdYSEpjYmx4MFhIUmNkSDFjZEZ4eVhHNWNkRngwZlR0Y2NseHVYSFJjZEd4bGRDQmpZV3hzVG05M0lEMGdhVzF0WldScFlYUmxJQ1ltSUNGMGFXMWxiM1YwTzF4eVhHNWNkRngwWTJ4bFlYSlVhVzFsYjNWMEtDQjBhVzFsYjNWMElDazdYSEpjYmx4MFhIUjBhVzFsYjNWMElEMGdjMlYwVkdsdFpXOTFkQ2dnYkdGMFpYSXNJSGRoYVhRZ0tUdGNjbHh1WEhSY2RHbG1JQ2dnWTJGc2JFNXZkeUFwSUhzZ1hISmNibHgwWEhSY2RHWjFibU11WVhCd2JIa29JR052Ym5SbGVIUXNJR0Z5WjNNZ0tUdGNjbHh1WEhSY2RIMWNjbHh1WEhSOU8xeHlYRzU5WEhKY2JseHlYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQmtaV0p2ZFc1alpUc2lYWDA9IiwiJ3VzZSBzdHJpY3QnO1xuLyoqXHJcbiAqIENyZWF0ZSBhIGhhc2ggbWFwIG9mIHF1ZXJ5IHN0cmluZyBrZXktdmFsdWUgcGFpcnMuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbi5zZWFyY2ggc3RyaW5nIHRvIGhhc2hcclxuICogQHJldHVybnMge29iamVjdH0gaGFzaCBtYXAgb2YgcXVlcnkgc3RyaW5nIGtleS12YWx1ZSBwYWlyc1xyXG4gKiBAYXV0aG9yIGJ5IFNpbmRyZSBTb3JodXNcclxuICogQGxpY2Vuc2UgTUlUIExpY2Vuc2VcclxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3F1ZXJ5LXN0cmluZ1xyXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0dmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5xdWVyeVN0cmluZ1BhcnNlID0gcXVlcnlTdHJpbmdQYXJzZTtcbmV4cG9ydHMucXVlcnlTdHJpbmdTdHJpbmdpZnkgPSBxdWVyeVN0cmluZ1N0cmluZ2lmeTtcblxuZnVuY3Rpb24gcXVlcnlTdHJpbmdQYXJzZShzdHIpIHtcblx0aWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9XG5cblx0c3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKC9eKFxcP3wjKS8sICcnKTtcblxuXHRpZiAoIXN0cikge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXG5cdHJldHVybiBzdHIudHJpbSgpLnNwbGl0KCcmJykucmVkdWNlKGZ1bmN0aW9uIChyZXQsIHBhcmFtKSB7XG5cdFx0dmFyIHBhcnRzID0gcGFyYW0ucmVwbGFjZSgvXFwrL2csICcgJykuc3BsaXQoJz0nKTtcblx0XHR2YXIga2V5ID0gcGFydHNbMF07XG5cdFx0dmFyIHZhbCA9IHBhcnRzWzFdO1xuXG5cdFx0a2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KGtleSk7XG5cdFx0Ly8gbWlzc2luZyBgPWAgc2hvdWxkIGJlIGBudWxsYDpcblx0XHQvLyBodHRwOi8vdzMub3JnL1RSLzIwMTIvV0QtdXJsLTIwMTIwNTI0LyNjb2xsZWN0LXVybC1wYXJhbWV0ZXJzXG5cdFx0dmFsID0gdmFsID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KHZhbCk7XG5cblx0XHRpZiAoIXJldC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRyZXRba2V5XSA9IHZhbDtcblx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmV0W2tleV0pKSB7XG5cdFx0XHRyZXRba2V5XS5wdXNoKHZhbCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldFtrZXldID0gW3JldFtrZXldLCB2YWxdO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXQ7XG5cdH0sIHt9KTtcbn1cblxuLyoqXHJcbiAqIENyZWF0ZSBxdWVyeSBzdHJpbmcgb2Yga2V5LXZhbHVlIHBhaXJzIGZyb20gYSBoYXNoIG1hcC5cclxuICogQHBhcmFtIHtvYmp9IGhhc2htYXAgc291cmNlXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHF1ZXJ5U3RyaW5nXHJcbiAqIEBhdXRob3IgYnkgU2luZHJlIFNvcmh1c1xyXG4gKiBAbGljZW5zZSBNSVQgTGljZW5zZVxyXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvcXVlcnktc3RyaW5nXHJcbiAqL1xuXG5mdW5jdGlvbiBxdWVyeVN0cmluZ1N0cmluZ2lmeShvYmopIHtcblx0cmV0dXJuIG9iaiA/IE9iamVjdC5rZXlzKG9iaikuc29ydCgpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0dmFyIHZhbCA9IG9ialtrZXldO1xuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuXHRcdFx0cmV0dXJuIHZhbC5zb3J0KCkubWFwKGZ1bmN0aW9uICh2YWwyKSB7XG5cdFx0XHRcdHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWwyKTtcblx0XHRcdH0pLmpvaW4oJyYnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsKTtcblx0fSkuam9pbignJicpIDogJyc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMk55YjNka1puVnVaR2x1Wnkxd2JHVmtaMlV0WW05NEwySnZkMlZ5WDJOdmJYQnZibVZ1ZEhNdmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDJwekwzVjBhV3h6TDNGMVpYSjVVM1J5YVc1bkxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSkJRVUZCTEZsQlFWa3NRMEZCUXpzN096czdPenM3T3pzN096czdPMEZCVTA0c1UwRkJVeXhuUWtGQlowSXNRMEZCUnl4SFFVRkhMRVZCUVVjN1FVRkRlRU1zUzBGQlN5eFBRVUZQTEVkQlFVY3NTMEZCU3l4UlFVRlJMRVZCUVVjN1FVRkRPVUlzVTBGQlR5eEZRVUZGTEVOQlFVTTdSVUZEVmpzN1FVRkZSQ3hKUVVGSExFZEJRVWNzUjBGQlJ5eERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRMRTlCUVU4c1EwRkJReXhUUVVGVExFVkJRVVVzUlVGQlJTeERRVUZETEVOQlFVTTdPMEZCUlhoRExFdEJRVXNzUTBGQlF5eEhRVUZITEVWQlFVYzdRVUZEV0N4VFFVRlBMRVZCUVVVc1EwRkJRenRGUVVOV096dEJRVVZFTEZGQlFVOHNSMEZCUnl4RFFVRkRMRWxCUVVrc1JVRkJSU3hEUVVGRExFdEJRVXNzUTBGQlJTeEhRVUZITEVOQlFVVXNRMEZCUXl4TlFVRk5MRU5CUVVVc1ZVRkJWeXhIUVVGSExFVkJRVVVzUzBGQlN5eEZRVUZITzBGQlF6bEVMRTFCUVVrc1MwRkJTeXhIUVVGSExFdEJRVXNzUTBGQlF5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RlFVRkZMRWRCUVVjc1EwRkJReXhEUVVGRExFdEJRVXNzUTBGQlJTeEhRVUZITEVOQlFVVXNRMEZCUXp0QlFVTnVSQ3hOUVVGSkxFZEJRVWNzUjBGQlJ5eExRVUZMTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkRia0lzVFVGQlNTeEhRVUZITEVkQlFVY3NTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE96dEJRVVZ1UWl4TFFVRkhMRWRCUVVjc2EwSkJRV3RDTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN096dEJRVWM1UWl4TFFVRkhMRWRCUVVjc1IwRkJSeXhMUVVGTExGTkJRVk1zUjBGQlJ5eEpRVUZKTEVkQlFVY3NhMEpCUVd0Q0xFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdPMEZCUlhwRUxFMUJRVXNzUTBGQlF5eEhRVUZITEVOQlFVTXNZMEZCWXl4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGSE8wRkJReTlDTEUxQlFVY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU03UjBGRFppeE5RVUZOTEVsQlFVc3NTMEZCU3l4RFFVRkRMRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNSVUZCUnp0QlFVTnlReXhOUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkZMRWRCUVVjc1EwRkJSU3hEUVVGRE8wZEJRM0pDTEUxQlFVMDdRVUZEVGl4TlFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1IwRkJSeXhEUVVGRExFTkJRVU03UjBGRE0wSTdPMEZCUlVRc1UwRkJUeXhIUVVGSExFTkJRVU03UlVGRFdDeEZRVUZGTEVWQlFVVXNRMEZCUlN4RFFVRkRPME5CUTFJN096czdPenM3T3pzN08wRkJWVTBzVTBGQlV5eHZRa0ZCYjBJc1EwRkJSeXhIUVVGSExFVkJRVWM3UVVGRE5VTXNVVUZCVHl4SFFVRkhMRWRCUVVjc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlJTeEhRVUZITEVOQlFVVXNRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJReXhIUVVGSExFTkJRVVVzVlVGQlZTeEhRVUZITEVWQlFVYzdRVUZETTBRc1RVRkJTU3hIUVVGSExFZEJRVWNzUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPenRCUVVWdVFpeE5RVUZMTEV0QlFVc3NRMEZCUXl4UFFVRlBMRU5CUVVVc1IwRkJSeXhEUVVGRkxFVkJRVWM3UVVGRE0wSXNWVUZCVHl4SFFVRkhMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU1zUjBGQlJ5eERRVUZGTEZWQlFWY3NTVUZCU1N4RlFVRkhPMEZCUTNoRExGZEJRVThzYTBKQlFXdENMRU5CUVVVc1IwRkJSeXhEUVVGRkxFZEJRVWNzUjBGQlJ5eEhRVUZITEd0Q1FVRnJRaXhEUVVGRkxFbEJRVWtzUTBGQlJTeERRVUZETzBsQlEzQkZMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVVVzUjBGQlJ5eERRVUZGTEVOQlFVTTdSMEZEWmpzN1FVRkZSQ3hUUVVGUExHdENRVUZyUWl4RFFVRkZMRWRCUVVjc1EwRkJSU3hIUVVGSExFZEJRVWNzUjBGQlJ5eHJRa0ZCYTBJc1EwRkJSU3hIUVVGSExFTkJRVVVzUTBGQlF6dEZRVU51UlN4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRkxFZEJRVWNzUTBGQlJTeEhRVUZITEVWQlFVVXNRMEZCUXp0RFFVTndRaUlzSW1acGJHVWlPaUpET2k5MFpXMXdMMGRITGtaeWIyNTBSVzVrTGxkcFpHZGxkSE12ZDJsa1oyVjBjeTlqY205M1pHWjFibVJwYm1jdGNHeGxaR2RsTFdKdmVDOWliM2RsY2w5amIyMXdiMjVsYm5SekwycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5cWN5OTFkR2xzY3k5eGRXVnllVk4wY21sdVp5NXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWlkMWMyVWdjM1J5YVdOMEp6dGNjbHh1THlvcVhISmNiaUFxSUVOeVpXRjBaU0JoSUdoaGMyZ2diV0Z3SUc5bUlIRjFaWEo1SUhOMGNtbHVaeUJyWlhrdGRtRnNkV1VnY0dGcGNuTXVYSEpjYmlBcUlFQndZWEpoYlNCN2MzUnlhVzVuZlNCc2IyTmhkR2x2Ymk1elpXRnlZMmdnYzNSeWFXNW5JSFJ2SUdoaGMyaGNjbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UyOWlhbVZqZEgwZ2FHRnphQ0J0WVhBZ2IyWWdjWFZsY25rZ2MzUnlhVzVuSUd0bGVTMTJZV3gxWlNCd1lXbHljMXh5WEc0Z0tpQkFZWFYwYUc5eUlHSjVJRk5wYm1SeVpTQlRiM0pvZFhOY2NseHVJQ29nUUd4cFkyVnVjMlVnVFVsVUlFeHBZMlZ1YzJWY2NseHVJQ29nUUhObFpTQm9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZjMmx1WkhKbGMyOXlhSFZ6TDNGMVpYSjVMWE4wY21sdVoxeHlYRzRnS2k5Y2NseHVaWGh3YjNKMElHWjFibU4wYVc5dUlIRjFaWEo1VTNSeWFXNW5VR0Z5YzJVZ0tDQnpkSElnS1NCN1hISmNibHgwYVdZZ0tDQjBlWEJsYjJZZ2MzUnlJQ0U5UFNBbmMzUnlhVzVuSnlBcElIdGNjbHh1WEhSY2RISmxkSFZ5YmlCN2ZUdGNjbHh1WEhSOVhISmNibHh5WEc1Y2RITjBjaUE5SUhOMGNpNTBjbWx0S0NrdWNtVndiR0ZqWlNndlhpaGNYRDk4SXlrdkxDQW5KeWs3WEhKY2JseHlYRzVjZEdsbUlDZ2dJWE4wY2lBcElIdGNjbHh1WEhSY2RISmxkSFZ5YmlCN2ZUdGNjbHh1WEhSOVhISmNibHh5WEc1Y2RISmxkSFZ5YmlCemRISXVkSEpwYlNncExuTndiR2wwS0NBbkppY2dLUzV5WldSMVkyVW9JR1oxYm1OMGFXOXVJQ2dnY21WMExDQndZWEpoYlNBcElIdGNjbHh1WEhSY2RHeGxkQ0J3WVhKMGN5QTlJSEJoY21GdExuSmxjR3hoWTJVb0wxeGNLeTluTENBbklDY3BMbk53YkdsMEtDQW5QU2NnS1R0Y2NseHVYSFJjZEd4bGRDQnJaWGtnUFNCd1lYSjBjMXN3WFR0Y2NseHVYSFJjZEd4bGRDQjJZV3dnUFNCd1lYSjBjMXN4WFR0Y2NseHVYSEpjYmx4MFhIUnJaWGtnUFNCa1pXTnZaR1ZWVWtsRGIyMXdiMjVsYm5Rb2EyVjVLVHRjY2x4dVhIUmNkQzh2SUcxcGMzTnBibWNnWUQxZ0lITm9iM1ZzWkNCaVpTQmdiblZzYkdBNlhISmNibHgwWEhRdkx5Qm9kSFJ3T2k4dmR6TXViM0puTDFSU0x6SXdNVEl2VjBRdGRYSnNMVEl3TVRJd05USTBMeU5qYjJ4c1pXTjBMWFZ5YkMxd1lYSmhiV1YwWlhKelhISmNibHgwWEhSMllXd2dQU0IyWVd3Z1BUMDlJSFZ1WkdWbWFXNWxaQ0EvSUc1MWJHd2dPaUJrWldOdlpHVlZVa2xEYjIxd2IyNWxiblFvZG1Gc0tUdGNjbHh1WEhKY2JseDBYSFJwWmlBb0lDRnlaWFF1YUdGelQzZHVVSEp2Y0dWeWRIa29hMlY1S1NBcElIdGNjbHh1WEhSY2RGeDBjbVYwVzJ0bGVWMGdQU0IyWVd3N1hISmNibHgwWEhSOUlHVnNjMlVnYVdZZ0tDQkJjbkpoZVM1cGMwRnljbUY1S0hKbGRGdHJaWGxkS1NBcElIdGNjbHh1WEhSY2RGeDBjbVYwVzJ0bGVWMHVjSFZ6YUNnZ2RtRnNJQ2s3WEhKY2JseDBYSFI5SUdWc2MyVWdlMXh5WEc1Y2RGeDBYSFJ5WlhSYmEyVjVYU0E5SUZ0eVpYUmJhMlY1WFN3Z2RtRnNYVHRjY2x4dVhIUmNkSDFjY2x4dVhISmNibHgwWEhSeVpYUjFjbTRnY21WME8xeHlYRzVjZEgwc0lIdDlJQ2s3WEhKY2JuMWNjbHh1WEhKY2JpOHFLbHh5WEc0Z0tpQkRjbVZoZEdVZ2NYVmxjbmtnYzNSeWFXNW5JRzltSUd0bGVTMTJZV3gxWlNCd1lXbHljeUJtY205dElHRWdhR0Z6YUNCdFlYQXVYSEpjYmlBcUlFQndZWEpoYlNCN2IySnFmU0JvWVhOb2JXRndJSE52ZFhKalpWeHlYRzRnS2lCQWNtVjBkWEp1Y3lCN2MzUnlhVzVuZlNCeGRXVnllVk4wY21sdVoxeHlYRzRnS2lCQVlYVjBhRzl5SUdKNUlGTnBibVJ5WlNCVGIzSm9kWE5jY2x4dUlDb2dRR3hwWTJWdWMyVWdUVWxVSUV4cFkyVnVjMlZjY2x4dUlDb2dRSE5sWlNCb2RIUndjem92TDJkcGRHaDFZaTVqYjIwdmMybHVaSEpsYzI5eWFIVnpMM0YxWlhKNUxYTjBjbWx1WjF4eVhHNGdLaTljY2x4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUhGMVpYSjVVM1J5YVc1blUzUnlhVzVuYVdaNUlDZ2diMkpxSUNrZ2UxeHlYRzVjZEhKbGRIVnliaUJ2WW1vZ1B5QlBZbXBsWTNRdWEyVjVjeWdnYjJKcUlDa3VjMjl5ZENncExtMWhjQ2dnWm5WdVkzUnBiMjRvSUd0bGVTQXBJSHRjY2x4dVhIUmNkR3hsZENCMllXd2dQU0J2WW1wYmEyVjVYVHRjY2x4dVhISmNibHgwWEhScFppQW9JRUZ5Y21GNUxtbHpRWEp5WVhrb0lIWmhiQ0FwSUNrZ2UxeHlYRzVjZEZ4MFhIUnlaWFIxY200Z2RtRnNMbk52Y25Rb0tTNXRZWEFnS0daMWJtTjBhVzl1SUNnZ2RtRnNNaUFwSUh0Y2NseHVYSFJjZEZ4MFhIUnlaWFIxY200Z1pXNWpiMlJsVlZKSlEyOXRjRzl1Wlc1MEtDQnJaWGtnS1NBcklDYzlKeUFySUdWdVkyOWtaVlZTU1VOdmJYQnZibVZ1ZENnZ2RtRnNNaUFwTzF4eVhHNWNkRngwWEhSOUtTNXFiMmx1S0NBbkppY2dLVHRjY2x4dVhIUmNkSDFjY2x4dVhISmNibHgwWEhSeVpYUjFjbTRnWlc1amIyUmxWVkpKUTI5dGNHOXVaVzUwS0NCclpYa2dLU0FySUNjOUp5QXJJR1Z1WTI5a1pWVlNTVU52YlhCdmJtVnVkQ2dnZG1Gc0lDazdYSEpjYmx4MGZTa3VhbTlwYmlnZ0p5WW5JQ2tnT2lBbkp6dGNjbHh1ZlNKZGZRPT0iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3V0aWxzUXVlcnlTdHJpbmcgPSByZXF1aXJlKCcuLi8uLi91dGlscy9xdWVyeVN0cmluZycpO1xuXG4vKipcclxuICogV3JpdGUgYSBVVE0gY29kZSBzdHJpbmcgZm9yIGFwcGVuZGluZyB0byBkb21haW4gVVJMc1xyXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsIHRvIGFwcGVuZCB1dG0gY29kZSB0b1xyXG4gKiBAcGFyYW0ge29iamVjdH0gSGFzaCBvZiB1dG0ga2V5LXZhbHVlIHBhaXJzXHJcbiAqL1xuZnVuY3Rpb24gd3JpdGVVdG1Db2RlKHVybCwgdXRtUGFyYW1zKSB7XG4gIHZhciB1dG0gPSB1cmwuaW5jbHVkZXMoJz8nKSA/ICcnIDogJz8nO1xuICB1dG0gKz0gJyZ1dG1fc291cmNlPXdlYnNpdGUmdXRtX21lZGl1bT1qZy13aWRnZXQnO1xuICB1dG0gKz0gJyYnICsgKDAsIF91dGlsc1F1ZXJ5U3RyaW5nLnF1ZXJ5U3RyaW5nU3RyaW5naWZ5KSh1dG1QYXJhbXMpO1xuICByZXR1cm4gdXRtO1xufVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSB3cml0ZVV0bUNvZGU7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTnliM2RrWm5WdVpHbHVaeTF3YkdWa1oyVXRZbTk0TDJKdmQyVnlYMk52YlhCdmJtVnVkSE12YW5WemRHZHBkbWx1WnkxM2FXUm5aWFF0Wm5KaGJXVjNiM0pyTDJOdmJYQnZibVZ1ZEhNdmJHbGlMMnB6TDNkcFpHZGxkQzloYm1Gc2VYUnBZM012ZDNKcGRHVlZkRzFEYjJSbExtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSkJRVUZCTEZsQlFWa3NRMEZCUXpzN096czdPMmREUVVWM1FpeDVRa0ZCZVVJN096czdPenM3UVVGUE9VUXNVMEZCVXl4WlFVRlpMRU5CUVVVc1IwRkJSeXhGUVVGRkxGTkJRVk1zUlVGQlJ6dEJRVU4yUXl4TlFVRkpMRWRCUVVjc1IwRkJSeXhIUVVGSExFTkJRVU1zVVVGQlVTeERRVUZGTEVkQlFVY3NRMEZCUlN4SFFVRkhMRVZCUVVVc1IwRkJSeXhIUVVGSExFTkJRVU03UVVGRGVrTXNTMEZCUnl3NFEwRkJPRU1zUTBGQlF6dEJRVU5zUkN4TFFVRkhMRlZCUVZNc05FTkJRWE5DTEZOQlFWTXNRMEZCUlN4QlFVRkhMRU5CUVVNN1FVRkRha1FzVTBGQlR5eEhRVUZITEVOQlFVTTdRMEZEV0RzN2NVSkJSV01zV1VGQldTSXNJbVpwYkdVaU9pSkRPaTkwWlcxd0wwZEhMa1p5YjI1MFJXNWtMbGRwWkdkbGRITXZkMmxrWjJWMGN5OWpjbTkzWkdaMWJtUnBibWN0Y0d4bFpHZGxMV0p2ZUM5aWIzZGxjbDlqYjIxd2IyNWxiblJ6TDJwMWMzUm5hWFpwYm1jdGQybGtaMlYwTFdaeVlXMWxkMjl5YXk5amIyMXdiMjVsYm5SekwyeHBZaTlxY3k5M2FXUm5aWFF2WVc1aGJIbDBhV056TDNkeWFYUmxWWFJ0UTI5a1pTNXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWlkMWMyVWdjM1J5YVdOMEp6dGNjbHh1WEhKY2JtbHRjRzl5ZENCN0lIRjFaWEo1VTNSeWFXNW5VM1J5YVc1bmFXWjVJSDBnWm5KdmJTQW5MaTR2TGk0dmRYUnBiSE12Y1hWbGNubFRkSEpwYm1jbk8xeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlGZHlhWFJsSUdFZ1ZWUk5JR052WkdVZ2MzUnlhVzVuSUdadmNpQmhjSEJsYm1ScGJtY2dkRzhnWkc5dFlXbHVJRlZTVEhOY2NseHVJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJSFZ5YkNCMGJ5QmhjSEJsYm1RZ2RYUnRJR052WkdVZ2RHOWNjbHh1SUNvZ1FIQmhjbUZ0SUh0dlltcGxZM1I5SUVoaGMyZ2diMllnZFhSdElHdGxlUzEyWVd4MVpTQndZV2x5YzF4eVhHNGdLaTljY2x4dVpuVnVZM1JwYjI0Z2QzSnBkR1ZWZEcxRGIyUmxLQ0IxY213c0lIVjBiVkJoY21GdGN5QXBJSHRjY2x4dVhIUnNaWFFnZFhSdElEMGdkWEpzTG1sdVkyeDFaR1Z6S0NBblB5Y2dLU0EvSUNjbklEb2dKejhuTzF4eVhHNWNkSFYwYlNBclBTQmdKblYwYlY5emIzVnlZMlU5ZDJWaWMybDBaU1oxZEcxZmJXVmthWFZ0UFdwbkxYZHBaR2RsZEdBN1hISmNibHgwZFhSdElDczlJR0FtSkhzZ2NYVmxjbmxUZEhKcGJtZFRkSEpwYm1kcFpua29JSFYwYlZCaGNtRnRjeUFwSUgxZ08xeHlYRzVjZEhKbGRIVnliaUIxZEcwN1hISmNibjFjY2x4dVhISmNibVY0Y0c5eWRDQmtaV1poZFd4MElIZHlhWFJsVlhSdFEyOWtaVHRjY2x4dVhISmNiaUpkZlE9PSIsIid1c2Ugc3RyaWN0Jztcbi8qKlxyXG4gKiBGaW5kIGEgcGVyY2VudGFnZSB2YWx1ZSBmcm9tIHN1cHBsaWVkIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IgdmFsdWVzXHJcbiAqIEByZXR1cm4ge1N0cmluZ30gUm91bmRlZCBwZXJjZXRhbmdlIHZhbHVlIGluY2x1ZGluZyAlIHNpZ24gb3IgZW1wdHkgc3RyaW5nIGlmIGRlbm9taW5hdG9yIGlzIGZhbHN5XHJcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldFBlcmNlbnQgPSBnZXRQZXJjZW50O1xuZXhwb3J0cy5jb21tYUZvcm1hdCA9IGNvbW1hRm9ybWF0O1xuXG5mdW5jdGlvbiBnZXRQZXJjZW50KG51bWVyYXRvciwgZGVub21pbmF0b3IpIHtcbiAgaWYgKCFkZW5vbWluYXRvcikge1xuICAgIHJldHVybiAnJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcGFyc2VJbnQocGFyc2VGbG9hdChudW1lcmF0b3IpIC8gcGFyc2VGbG9hdChkZW5vbWluYXRvcikgKiAxMDAsIDEwKTtcbiAgfVxufVxuXG4vKipcclxuICogRm9ybWF0IGEgbGFyZ2UgbnVtYmVyICg+OTk5KSB3aXRoIGNvbW1hc1xyXG4gKiBAcmV0dXJuIHtTdHJpbmd9IENvbW1hLWZvcm1hdHRlZCBudW1iZXJcclxuICovXG5cbmZ1bmN0aW9uIGNvbW1hRm9ybWF0KG51bWJlcikge1xuICByZXR1cm4gbnVtYmVyLnRvU3RyaW5nKCkucmVwbGFjZSgvKFxcZCkoPz0oXFxkXFxkXFxkKSsoPyFcXGQpKS9nLCAnJDEsJyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMk55YjNka1puVnVaR2x1Wnkxd2JHVmtaMlV0WW05NEwySnZkMlZ5WDJOdmJYQnZibVZ1ZEhNdmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDJwekwzZHBaR2RsZEM5dGIyUmxiQzl1ZFcxaVpYSXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUVVFc1dVRkJXU3hEUVVGRE96czdPenM3T3pzN096dEJRVXRPTEZOQlFWTXNWVUZCVlN4RFFVRkZMRk5CUVZNc1JVRkJSU3hYUVVGWExFVkJRVWM3UVVGRGNFUXNUVUZCU3l4RFFVRkRMRmRCUVZjc1JVRkJSenRCUVVOdVFpeFhRVUZQTEVWQlFVVXNRMEZCUXp0SFFVTldMRTFCUVUwN1FVRkRUaXhYUVVGUExGRkJRVkVzUTBGQlJ5eFZRVUZWTEVOQlFVTXNVMEZCVXl4RFFVRkRMRWRCUVVjc1ZVRkJWU3hEUVVGRExGZEJRVmNzUTBGQlF5eEhRVUZITEVkQlFVY3NSVUZCUnl4RlFVRkZMRU5CUVVVc1EwRkJRenRIUVVNdlJUdERRVU5FT3pzN096czdPMEZCUzAwc1UwRkJVeXhYUVVGWExFTkJRVVVzVFVGQlRTeEZRVUZITzBGQlEzSkRMRk5CUVU4c1RVRkJUU3hEUVVGRExGRkJRVkVzUlVGQlJTeERRVUZETEU5QlFVOHNRMEZCUXl3d1FrRkJNRUlzUlVGQlJTeExRVUZMTEVOQlFVTXNRMEZCUXp0RFFVTndSU0lzSW1acGJHVWlPaUpET2k5MFpXMXdMMGRITGtaeWIyNTBSVzVrTGxkcFpHZGxkSE12ZDJsa1oyVjBjeTlqY205M1pHWjFibVJwYm1jdGNHeGxaR2RsTFdKdmVDOWliM2RsY2w5amIyMXdiMjVsYm5SekwycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5cWN5OTNhV1JuWlhRdmJXOWtaV3d2Ym5WdFltVnlMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUozVnpaU0J6ZEhKcFkzUW5PMXh5WEc0dktpcGNjbHh1SUNvZ1JtbHVaQ0JoSUhCbGNtTmxiblJoWjJVZ2RtRnNkV1VnWm5KdmJTQnpkWEJ3YkdsbFpDQnVkVzFsY21GMGIzSWdZVzVrSUdSbGJtOXRhVzVoZEc5eUlIWmhiSFZsYzF4eVhHNGdLaUJBY21WMGRYSnVJSHRUZEhKcGJtZDlJRkp2ZFc1a1pXUWdjR1Z5WTJWMFlXNW5aU0IyWVd4MVpTQnBibU5zZFdScGJtY2dKU0J6YVdkdUlHOXlJR1Z0Y0hSNUlITjBjbWx1WnlCcFppQmtaVzV2YldsdVlYUnZjaUJwY3lCbVlXeHplVnh5WEc0Z0tpOWNjbHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR2RsZEZCbGNtTmxiblFvSUc1MWJXVnlZWFJ2Y2l3Z1pHVnViMjFwYm1GMGIzSWdLU0I3WEhKY2JseDBhV1lnS0NBaFpHVnViMjFwYm1GMGIzSWdLU0I3WEhKY2JseDBYSFJ5WlhSMWNtNGdKeWM3WEhKY2JseDBmU0JsYkhObElIdGNjbHh1WEhSY2RISmxkSFZ5YmlCd1lYSnpaVWx1ZENnZ0tIQmhjbk5sUm14dllYUW9iblZ0WlhKaGRHOXlLU0F2SUhCaGNuTmxSbXh2WVhRb1pHVnViMjFwYm1GMGIzSXBJQ29nTVRBd0tTd2dNVEFnS1R0Y2RGeHlYRzVjZEgxY2NseHVmVnh5WEc0dktpcGNjbHh1SUNvZ1JtOXliV0YwSUdFZ2JHRnlaMlVnYm5WdFltVnlJQ2crT1RrNUtTQjNhWFJvSUdOdmJXMWhjMXh5WEc0Z0tpQkFjbVYwZFhKdUlIdFRkSEpwYm1kOUlFTnZiVzFoTFdadmNtMWhkSFJsWkNCdWRXMWlaWEpjY2x4dUlDb3ZYSEpjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJqYjIxdFlVWnZjbTFoZENnZ2JuVnRZbVZ5SUNrZ2UxeHlYRzVjZEhKbGRIVnliaUJ1ZFcxaVpYSXVkRzlUZEhKcGJtY29LUzV5WlhCc1lXTmxLQzhvWEZ4a0tTZy9QU2hjWEdSY1hHUmNYR1FwS3lnL0lWeGNaQ2twTDJjc0lDY2tNU3duS1R0Y2NseHVmU0pkZlE9PSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHR2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKCd2YWx1ZScgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrV2lkZ2V0ID0gcmVxdWlyZSgnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9XaWRnZXQnKTtcblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrV2lkZ2V0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtXaWRnZXQpO1xuXG52YXIgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtWaWV3ID0gcmVxdWlyZSgnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9WaWV3Jyk7XG5cbnZhciBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya1ZpZXcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya1ZpZXcpO1xuXG52YXIgX01vZGVsQ3Jvd2RmdW5kaW5nUGFnZURldGFpbHMgPSByZXF1aXJlKCcuL01vZGVsQ3Jvd2RmdW5kaW5nUGFnZURldGFpbHMnKTtcblxudmFyIF9Nb2RlbENyb3dkZnVuZGluZ1BhZ2VEZXRhaWxzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01vZGVsQ3Jvd2RmdW5kaW5nUGFnZURldGFpbHMpO1xuXG52YXIgX01vZGVsQ3Jvd2RmdW5kaW5nRm9vdGVyID0gcmVxdWlyZSgnLi9Nb2RlbENyb3dkZnVuZGluZ0Zvb3RlcicpO1xuXG52YXIgX01vZGVsQ3Jvd2RmdW5kaW5nRm9vdGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01vZGVsQ3Jvd2RmdW5kaW5nRm9vdGVyKTtcblxuLyoqXHJcbiAqIENyZWF0ZSBhIGNyb3dkZnVuZGluZyBwbGVkZ2UgYm94IHdpZGdldFxyXG4gKi9cbnZhciBQcm9taXNlID0gcmVxdWlyZSgnZXM2LXByb21pc2UnKS5Qcm9taXNlO1xuXG52YXIgQ3Jvd2RmdW5kaW5nUGxlZGdlQm94ID0gKGZ1bmN0aW9uIChfV2lkZ2V0KSB7XG5cdF9pbmhlcml0cyhDcm93ZGZ1bmRpbmdQbGVkZ2VCb3gsIF9XaWRnZXQpO1xuXG5cdGZ1bmN0aW9uIENyb3dkZnVuZGluZ1BsZWRnZUJveChvcHRpb25zKSB7XG5cdFx0X2NsYXNzQ2FsbENoZWNrKHRoaXMsIENyb3dkZnVuZGluZ1BsZWRnZUJveCk7XG5cblx0XHRfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihDcm93ZGZ1bmRpbmdQbGVkZ2VCb3gucHJvdG90eXBlKSwgJ2NvbnN0cnVjdG9yJywgdGhpcykuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0XHR0aGlzLmluaXQoKTtcblx0fVxuXG5cdC8qKlxyXG4gICogSW5pdGlhbGlzZSB0aGUgcGxlZGdlIGJveFxyXG4gICogQGRlc2NyaXB0aW9uIENyZWF0ZSBhbmQgY2FjaGUgbmV3IGNyb3dkZnVuZGluZyBwYWdlIGRldGFpbHMgbW9kZWwgYW5kIGNyb3dkZnVuZGluZyBwYWdlIG1haW4gaW1hZ2UgbW9kZWw7IGJvb3RzdHJhcCB0aGUgd2lkZ2V0XHJcbiAgKi9cblxuXHRfY3JlYXRlQ2xhc3MoQ3Jvd2RmdW5kaW5nUGxlZGdlQm94LCBbe1xuXHRcdGtleTogJ2luaXQnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBpbml0KCkge1xuXHRcdFx0X2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3Jvd2RmdW5kaW5nUGxlZGdlQm94LnByb3RvdHlwZSksICdpbml0JywgdGhpcykuY2FsbCh0aGlzKTtcblx0XHRcdHRoaXMuZGV0YWlsc01vZGVsID0gbmV3IF9Nb2RlbENyb3dkZnVuZGluZ1BhZ2VEZXRhaWxzMlsnZGVmYXVsdCddKHtcblx0XHRcdFx0d2lkZ2V0OiB0aGlzLFxuXHRcdFx0XHR1cmw6ICdodHRwczovL2FwaS5qdXN0Z2l2aW5nLmNvbS8nICsgdGhpcy5hcHBJZCArICcvdjEvY3Jvd2RmdW5kaW5nL3BhZ2VzLycgKyB0aGlzLmNvbmZpZy5pZFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuZm9vdGVyTW9kZWwgPSBuZXcgX01vZGVsQ3Jvd2RmdW5kaW5nRm9vdGVyMlsnZGVmYXVsdCddKHtcblx0XHRcdFx0d2lkZ2V0OiB0aGlzLFxuXHRcdFx0XHR1cmw6ICdodHRwczovL2FwaS5qdXN0Z2l2aW5nLmNvbS8nICsgdGhpcy5hcHBJZCArICcvdjEvY3Jvd2RmdW5kaW5nL3BhZ2VzLycgKyB0aGlzLmNvbmZpZy5pZFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuYm9vdHN0cmFwKCk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogQm9vdHN0cmFwIHRoZSB3aWRnZXRcclxuICAgKiBAZGVzY3JpcHRpb24gRmV0Y2ggYWxsIHNlcnZlciBkYXRhIGZvciBjcm93ZGZ1bmRpbmcgcGFnZSBkZXRhaWxzIG1vZGVsIGFuZCBjcm93ZGZ1bmRpbmcgcGFnZSBtYWluIGltYWdlIG1vZGVsOyBcclxuICAgKiB0aGVuIGNyZWF0ZSBhbmQgcmVuZGVyIG5ldyBjcm93ZGZ1bmRpbmcgcGFnZSBkZXRhaWxzIGFuZCBjcm93ZGZ1bmRpbmcgcGFnZSBtYWluIGltYWdlIHZpZXdzO1xyXG4gICAqIHJlc2V0IHRoZSB3aWRnZXQgaGVpZ2h0OyBmaW5hbGx5IGluaXRpYWxpc2UgYSBuZXcgYW5hbHl0aWNzIGluc3RhbmNlIG9uIHRoZSB3aWRnZXRcclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ2Jvb3RzdHJhcCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcblx0XHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cblx0XHRcdFByb21pc2UuYWxsKFt0aGlzLmRldGFpbHNNb2RlbC5nZXRNb2RlbCgpLCB0aGlzLmZvb3Rlck1vZGVsLmdldE1vZGVsKCldKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Ly8gQ3Jvd2RmdW5kaW5nIHBhZ2UgZGV0YWlscyB2aWV3XG5cdFx0XHRcdF90aGlzLmRldGFpbHNWaWV3ID0gbmV3IF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrVmlldzJbJ2RlZmF1bHQnXSh7XG5cdFx0XHRcdFx0d2lkZ2V0OiBfdGhpcyxcblx0XHRcdFx0XHRlbDogJ1tkYXRhLXZpZXctY3Jvd2RmdW5kaW5nLWRldGFpbHNdJyxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogJ1tkYXRhLXRtcGwtY3Jvd2RmdW5kaW5nLWRldGFpbHNdJyxcblx0XHRcdFx0XHRtb2RlbDogX3RoaXMuZGV0YWlsc01vZGVsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRfdGhpcy5kZXRhaWxzVmlldy5yZW5kZXIoe1xuXHRcdFx0XHRcdGxheW91dDogX3RoaXMuY29uZmlnLmxheW91dCxcblx0XHRcdFx0XHRzaG93U3Rvcnk6IF90aGlzLmNvbmZpZy5zaG93U3RvcnksXG5cdFx0XHRcdFx0cHJldHR5VGFyZ2V0OiBfdGhpcy5kZXRhaWxzVmlldy5tb2RlbC4kbW9kZWwucHJldHR5VGFyZ2V0LFxuXHRcdFx0XHRcdHBpdGNoRm9yOiBfdGhpcy5kZXRhaWxzVmlldy5tb2RlbC4kbW9kZWwucGl0Y2hbJ2ZvciddLFxuXHRcdFx0XHRcdHBpdGNoQmVjYXVzZTogX3RoaXMuZGV0YWlsc1ZpZXcubW9kZWwuJG1vZGVsLnBpdGNoLmJlY2F1c2UsXG5cdFx0XHRcdFx0cGVyY2VudFBsZWRnZWQ6IF90aGlzLmRldGFpbHNWaWV3Lm1vZGVsLiRtb2RlbC5wZXJjZW50UGxlZGdlZCxcblx0XHRcdFx0XHRwcm9ncmVzc1BlcmNlbnQ6IF90aGlzLmRldGFpbHNWaWV3Lm1vZGVsLiRtb2RlbC5wcm9ncmVzc1BlcmNlbnQsXG5cdFx0XHRcdFx0YW1vdW50UGxlZGdlZDogX3RoaXMuZGV0YWlsc1ZpZXcubW9kZWwuJG1vZGVsLmZvcm1hdHRlZEFtb3VudFBsZWRnZWQsXG5cdFx0XHRcdFx0cGFnZVVybDogX3RoaXMuZGV0YWlsc1ZpZXcubW9kZWwuJG1vZGVsLnBhZ2VVcmwsXG5cdFx0XHRcdFx0YXZhdGFyOiBfdGhpcy5kZXRhaWxzVmlldy5tb2RlbC4kbW9kZWwuYXZhdGFyLFxuXHRcdFx0XHRcdG93bmVyTmFtZTogX3RoaXMuZGV0YWlsc1ZpZXcubW9kZWwuJG1vZGVsLm93bmVyLm5hbWUsXG5cdFx0XHRcdFx0b3duZXJMb2NhdGlvbjogX3RoaXMuZGV0YWlsc1ZpZXcubW9kZWwuJG1vZGVsLmxvY2F0aW9uLmRlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdHByb2plY3RQcm9ibGVtOiBfdGhpcy5kZXRhaWxzVmlldy5tb2RlbC4kbW9kZWwuc3RvcnkucHJvYmxlbVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0X3RoaXMuZGV0YWlsc1ZpZXcubG9hZEltYWdlKF90aGlzLmRldGFpbHNNb2RlbC4kbW9kZWwuaW1hZ2VzWzBdLlVybCwgJy5qcy1wcm9qZWN0LWltYWdlJyk7XG5cblx0XHRcdFx0Ly8gRm9vdGVyIHZpZXdcblx0XHRcdFx0X3RoaXMuZm9vdGVyVmlldyA9IG5ldyBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya1ZpZXcyWydkZWZhdWx0J10oe1xuXHRcdFx0XHRcdHdpZGdldDogX3RoaXMsXG5cdFx0XHRcdFx0ZWw6ICdbZGF0YS12aWV3LWZvb3Rlcl0nLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiAnW2RhdGEtdG1wbC1mb290ZXJdJyxcblx0XHRcdFx0XHRtb2RlbDogX3RoaXMuZm9vdGVyTW9kZWxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdF90aGlzLmZvb3RlclZpZXcucmVuZGVyKHtcblx0XHRcdFx0XHRsYXlvdXQ6IF90aGlzLmNvbmZpZy5sYXlvdXQsXG5cdFx0XHRcdFx0Y3Jvd2RmdW5kaW5nR2VuZXJpY1VybDogX3RoaXMuZm9vdGVyVmlldy5tb2RlbC4kbW9kZWwuY3Jvd2RmdW5kaW5nR2VuZXJpY1VybFxuXHRcdFx0XHR9KTtcblx0XHRcdH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRfdGhpcy5yZXNldEhlaWdodCgpO1xuXHRcdFx0XHRfdGhpcy5hbmFseXRpY3MgPSBfdGhpcy5pbml0QW5hbHl0aWNzKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gQ3Jvd2RmdW5kaW5nUGxlZGdlQm94O1xufSkoX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtXaWRnZXQyWydkZWZhdWx0J10pO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBDcm93ZGZ1bmRpbmdQbGVkZ2VCb3g7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTnliM2RrWm5WdVpHbHVaeTF3YkdWa1oyVXRZbTk0TDNOeVl5OXpZM0pwY0hSekwyRndjQzlEY205M1pHWjFibVJwYm1kUWJHVmtaMlZDYjNndWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzV1VGQldTeERRVUZET3pzN096czdPenM3T3pzN096czdPM1ZGUVVkTkxHZEZRVUZuUlRzN096dHhSVUZEYkVVc09FUkJRVGhFT3pzN096UkRRVU4wUXl4blEwRkJaME03T3pzN2RVTkJRM0pETERKQ1FVRXlRanM3T3pzN096dEJRVW92UkN4SlFVRkpMRTlCUVU4c1IwRkJSeXhQUVVGUExFTkJRVU1zWVVGQllTeERRVUZETEVOQlFVTXNUMEZCVHl4RFFVRkRPenRKUVZOMlF5eHhRa0ZCY1VJN1YwRkJja0lzY1VKQlFYRkNPenRCUVVOa0xGVkJSRkFzY1VKQlFYRkNMRU5CUTFvc1QwRkJUeXhGUVVGSE8zZENRVVJ1UWl4eFFrRkJjVUk3TzBGQlJYcENMRFpDUVVaSkxIRkNRVUZ4UWl3MlEwRkZiRUlzVDBGQlR5eEZRVUZITzBGQlEycENMRTFCUVVrc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF6dEZRVU5hT3pzN096czdPMk5CU2trc2NVSkJRWEZDT3p0VFFWTnlRaXhuUWtGQlJ6dEJRVU5RTERoQ1FWWkpMSEZDUVVGeFFpeHpRMEZWV2p0QlFVTmlMRTlCUVVrc1EwRkJReXhaUVVGWkxFZEJRVWNzT0VOQlFXbERPMEZCUTNCRUxGVkJRVTBzUlVGQlJTeEpRVUZKTzBGQlExb3NUMEZCUnl4clEwRkJiVU1zU1VGQlNTeERRVUZETEV0QlFVc3NLMEpCUVRoQ0xFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4QlFVRkZPMGxCUXpsR0xFTkJRVU1zUTBGQlF6czdRVUZGU0N4UFFVRkpMRU5CUVVNc1YwRkJWeXhIUVVGSExIbERRVUUwUWp0QlFVTTVReXhWUVVGTkxFVkJRVVVzU1VGQlNUdEJRVU5hTEU5QlFVY3NhME5CUVcxRExFbEJRVWtzUTBGQlF5eExRVUZMTEN0Q1FVRTRRaXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVWQlFVVXNRVUZCUlR0SlFVTTVSaXhEUVVGRExFTkJRVU03TzBGQlJVZ3NUMEZCU1N4RFFVRkRMRk5CUVZNc1JVRkJSU3hEUVVGRE8wZEJRMnBDT3pzN096czdPenM3TzFOQlQxTXNjVUpCUVVjN096dEJRVU5hTEZWQlFVOHNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkRXQ3hKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEZGQlFWRXNSVUZCUlN4RlFVTTFRaXhKUVVGSkxFTkJRVU1zVjBGQlZ5eERRVUZETEZGQlFWRXNSVUZCUlN4RFFVTXpRaXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZGTEZsQlFVMDdPMEZCUldRc1ZVRkJTeXhYUVVGWExFZEJRVWNzZFVWQlFWTTdRVUZETTBJc1YwRkJUU3hQUVVGTk8wRkJRMW9zVDBGQlJTeEZRVUZGTEd0RFFVRnJRenRCUVVOMFF5eGhRVUZSTEVWQlFVVXNhME5CUVd0RE8wRkJRelZETEZWQlFVc3NSVUZCUlN4TlFVRkxMRmxCUVZrN1MwRkRlRUlzUTBGQlF5eERRVUZETzBGQlEwZ3NWVUZCU3l4WFFVRlhMRU5CUVVNc1RVRkJUU3hEUVVGRE8wRkJRM1pDTEZkQlFVMHNSVUZCUlN4TlFVRkxMRTFCUVUwc1EwRkJReXhOUVVGTk8wRkJRekZDTEdOQlFWTXNSVUZCUlN4TlFVRkxMRTFCUVUwc1EwRkJReXhUUVVGVE8wRkJRMmhETEdsQ1FVRlpMRVZCUVVVc1RVRkJTeXhYUVVGWExFTkJRVU1zUzBGQlN5eERRVUZETEUxQlFVMHNRMEZCUXl4WlFVRlpPMEZCUTNoRUxHRkJRVkVzUlVGQlJTeE5RVUZMTEZkQlFWY3NRMEZCUXl4TFFVRkxMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzVDBGQlNUdEJRVU5xUkN4cFFrRkJXU3hGUVVGRkxFMUJRVXNzVjBGQlZ5eERRVUZETEV0QlFVc3NRMEZCUXl4TlFVRk5MRU5CUVVNc1MwRkJTeXhEUVVGRExFOUJRVTg3UVVGRGVrUXNiVUpCUVdNc1JVRkJSU3hOUVVGTExGZEJRVmNzUTBGQlF5eExRVUZMTEVOQlFVTXNUVUZCVFN4RFFVRkRMR05CUVdNN1FVRkROVVFzYjBKQlFXVXNSVUZCUlN4TlFVRkxMRmRCUVZjc1EwRkJReXhMUVVGTExFTkJRVU1zVFVGQlRTeERRVUZETEdWQlFXVTdRVUZET1VRc2EwSkJRV0VzUlVGQlJTeE5RVUZMTEZkQlFWY3NRMEZCUXl4TFFVRkxMRU5CUVVNc1RVRkJUU3hEUVVGRExITkNRVUZ6UWp0QlFVTnVSU3haUVVGUExFVkJRVVVzVFVGQlN5eFhRVUZYTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTFCUVUwc1EwRkJReXhQUVVGUE8wRkJRemxETEZkQlFVMHNSVUZCUlN4TlFVRkxMRmRCUVZjc1EwRkJReXhMUVVGTExFTkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMDdRVUZETlVNc1kwRkJVeXhGUVVGRkxFMUJRVXNzVjBGQlZ5eERRVUZETEV0QlFVc3NRMEZCUXl4TlFVRk5MRU5CUVVNc1MwRkJTeXhEUVVGRExFbEJRVWs3UVVGRGJrUXNhMEpCUVdFc1JVRkJSU3hOUVVGTExGZEJRVmNzUTBGQlF5eExRVUZMTEVOQlFVTXNUVUZCVFN4RFFVRkRMRkZCUVZFc1EwRkJReXhYUVVGWE8wRkJRMnBGTEcxQ1FVRmpMRVZCUVVVc1RVRkJTeXhYUVVGWExFTkJRVU1zUzBGQlN5eERRVUZETEUxQlFVMHNRMEZCUXl4TFFVRkxMRU5CUVVNc1QwRkJUenRMUVVNelJDeERRVUZETEVOQlFVTTdRVUZEU0N4VlFVRkxMRmRCUVZjc1EwRkJReXhUUVVGVExFTkJRVU1zVFVGQlN5eFpRVUZaTEVOQlFVTXNUVUZCVFN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVWQlFVVXNiVUpCUVcxQ0xFTkJRVU1zUTBGQlF6czdPMEZCUjNoR0xGVkJRVXNzVlVGQlZTeEhRVUZITEhWRlFVRlRPMEZCUXpGQ0xGZEJRVTBzVDBGQlRUdEJRVU5hTEU5QlFVVXNSVUZCUlN4dlFrRkJiMEk3UVVGRGVFSXNZVUZCVVN4RlFVRkZMRzlDUVVGdlFqdEJRVU01UWl4VlFVRkxMRVZCUVVVc1RVRkJTeXhYUVVGWE8wdEJRM1pDTEVOQlFVTXNRMEZCUXp0QlFVTklMRlZCUVVzc1ZVRkJWU3hEUVVGRExFMUJRVTBzUTBGQlF6dEJRVU4wUWl4WFFVRk5MRVZCUVVVc1RVRkJTeXhOUVVGTkxFTkJRVU1zVFVGQlRUdEJRVU14UWl3eVFrRkJjMElzUlVGQlJTeE5RVUZMTEZWQlFWVXNRMEZCUXl4TFFVRkxMRU5CUVVNc1RVRkJUU3hEUVVGRExITkNRVUZ6UWp0TFFVTXpSU3hEUVVGRExFTkJRVU03U1VGRFNDeERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkZMRmxCUVUwN1FVRkRaQ3hWUVVGTExGZEJRVmNzUlVGQlJTeERRVUZETzBGQlEyNUNMRlZCUVVzc1UwRkJVeXhIUVVGSExFMUJRVXNzWVVGQllTeEZRVUZGTEVOQlFVTTdTVUZEZEVNc1EwRkJReXhEUVVGRE8wZEJRMGc3T3p0UlFYcEZTU3h4UWtGQmNVSTdPenR4UWtFMFJWb3NjVUpCUVhGQ0lpd2labWxzWlNJNklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTnliM2RrWm5WdVpHbHVaeTF3YkdWa1oyVXRZbTk0TDNOeVl5OXpZM0pwY0hSekwyRndjQzlEY205M1pHWjFibVJwYm1kUWJHVmtaMlZDYjNndWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUluZFhObElITjBjbWxqZENjN1hISmNibHh5WEc1c1pYUWdVSEp2YldselpTQTlJSEpsY1hWcGNtVW9KMlZ6Tmkxd2NtOXRhWE5sSnlrdVVISnZiV2x6WlR0Y2NseHVhVzF3YjNKMElGZHBaR2RsZENCbWNtOXRJQ2RxZFhOMFoybDJhVzVuTFhkcFpHZGxkQzFtY21GdFpYZHZjbXN2WTI5dGNHOXVaVzUwY3k5c2FXSXZhbk12Wm5KaGJXVjNiM0pyTDFkcFpHZGxkQ2M3WEhKY2JtbHRjRzl5ZENCV2FXVjNJR1p5YjIwZ0oycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5cWN5OW1jbUZ0WlhkdmNtc3ZWbWxsZHljN1hISmNibWx0Y0c5eWRDQk5iMlJsYkVOeWIzZGtablZ1WkdsdVoxQmhaMlZFWlhSaGFXeHpJR1p5YjIwZ0p5NHZUVzlrWld4RGNtOTNaR1oxYm1ScGJtZFFZV2RsUkdWMFlXbHNjeWM3WEhKY2JtbHRjRzl5ZENCTmIyUmxiRU55YjNka1puVnVaR2x1WjBadmIzUmxjaUJtY205dElDY3VMMDF2WkdWc1EzSnZkMlJtZFc1a2FXNW5SbTl2ZEdWeUp6dGNjbHh1WEhKY2JpOHFLbHh5WEc0Z0tpQkRjbVZoZEdVZ1lTQmpjbTkzWkdaMWJtUnBibWNnY0d4bFpHZGxJR0p2ZUNCM2FXUm5aWFJjY2x4dUlDb3ZYSEpjYm1Oc1lYTnpJRU55YjNka1puVnVaR2x1WjFCc1pXUm5aVUp2ZUNCbGVIUmxibVJ6SUZkcFpHZGxkQ0I3WEhKY2JseDBZMjl1YzNSeWRXTjBiM0lnS0NCdmNIUnBiMjV6SUNrZ2UxeHlYRzVjZEZ4MGMzVndaWElvSUc5d2RHbHZibk1nS1R0Y2NseHVYSFJjZEhSb2FYTXVhVzVwZENncE8xeHlYRzVjZEgxY2NseHVYSFF2S2lwY2NseHVYSFFnS2lCSmJtbDBhV0ZzYVhObElIUm9aU0J3YkdWa1oyVWdZbTk0WEhKY2JseDBJQ29nUUdSbGMyTnlhWEIwYVc5dUlFTnlaV0YwWlNCaGJtUWdZMkZqYUdVZ2JtVjNJR055YjNka1puVnVaR2x1WnlCd1lXZGxJR1JsZEdGcGJITWdiVzlrWld3Z1lXNWtJR055YjNka1puVnVaR2x1WnlCd1lXZGxJRzFoYVc0Z2FXMWhaMlVnYlc5a1pXdzdJR0p2YjNSemRISmhjQ0IwYUdVZ2QybGtaMlYwWEhKY2JseDBJQ292WEhKY2JseDBhVzVwZENBb0tTQjdYSEpjYmx4MFhIUnpkWEJsY2k1cGJtbDBLQ2s3WEhKY2JseDBYSFIwYUdsekxtUmxkR0ZwYkhOTmIyUmxiQ0E5SUc1bGR5Qk5iMlJsYkVOeWIzZGtablZ1WkdsdVoxQmhaMlZFWlhSaGFXeHpLSHNnWEhKY2JseDBYSFJjZEhkcFpHZGxkRG9nZEdocGN5eGNjbHh1WEhSY2RGeDBkWEpzT2lCZ2FIUjBjSE02WEZ3dlhGd3ZZWEJwTG1wMWMzUm5hWFpwYm1jdVkyOXRYRnd2Skh0MGFHbHpMbUZ3Y0Vsa2ZWeGNMM1l4WEZ3dlkzSnZkMlJtZFc1a2FXNW5YRnd2Y0dGblpYTmNYQzhrZTNSb2FYTXVZMjl1Wm1sbkxtbGtmV0FzWEhKY2JseDBYSFI5S1R0Y2NseHVYSEpjYmx4MFhIUjBhR2x6TG1admIzUmxjazF2WkdWc0lEMGdibVYzSUUxdlpHVnNRM0p2ZDJSbWRXNWthVzVuUm05dmRHVnlLSHNnWEhKY2JseDBYSFJjZEhkcFpHZGxkRG9nZEdocGN5eGNjbHh1WEhSY2RGeDBkWEpzT2lCZ2FIUjBjSE02WEZ3dlhGd3ZZWEJwTG1wMWMzUm5hWFpwYm1jdVkyOXRYRnd2Skh0MGFHbHpMbUZ3Y0Vsa2ZWeGNMM1l4WEZ3dlkzSnZkMlJtZFc1a2FXNW5YRnd2Y0dGblpYTmNYQzhrZTNSb2FYTXVZMjl1Wm1sbkxtbGtmV0FzWEhKY2JseDBYSFI5S1R0Y2NseHVYSEpjYmx4MFhIUjBhR2x6TG1KdmIzUnpkSEpoY0NncE8xeHlYRzVjZEgxY2NseHVYSFF2S2lwY2NseHVYSFFnS2lCQ2IyOTBjM1J5WVhBZ2RHaGxJSGRwWkdkbGRGeHlYRzVjZENBcUlFQmtaWE5qY21sd2RHbHZiaUJHWlhSamFDQmhiR3dnYzJWeWRtVnlJR1JoZEdFZ1ptOXlJR055YjNka1puVnVaR2x1WnlCd1lXZGxJR1JsZEdGcGJITWdiVzlrWld3Z1lXNWtJR055YjNka1puVnVaR2x1WnlCd1lXZGxJRzFoYVc0Z2FXMWhaMlVnYlc5a1pXdzdJRnh5WEc1Y2RDQXFJSFJvWlc0Z1kzSmxZWFJsSUdGdVpDQnlaVzVrWlhJZ2JtVjNJR055YjNka1puVnVaR2x1WnlCd1lXZGxJR1JsZEdGcGJITWdZVzVrSUdOeWIzZGtablZ1WkdsdVp5QndZV2RsSUcxaGFXNGdhVzFoWjJVZ2RtbGxkM003WEhKY2JseDBJQ29nY21WelpYUWdkR2hsSUhkcFpHZGxkQ0JvWldsbmFIUTdJR1pwYm1Gc2JIa2dhVzVwZEdsaGJHbHpaU0JoSUc1bGR5QmhibUZzZVhScFkzTWdhVzV6ZEdGdVkyVWdiMjRnZEdobElIZHBaR2RsZEZ4eVhHNWNkQ0FxTDF4eVhHNWNkR0p2YjNSemRISmhjQ0FvS1NCN1hISmNibHgwWEhSUWNtOXRhWE5sTG1Gc2JDaGJYSEpjYmx4MFhIUmNkSFJvYVhNdVpHVjBZV2xzYzAxdlpHVnNMbWRsZEUxdlpHVnNLQ2tzWEhKY2JseDBYSFJjZEhSb2FYTXVabTl2ZEdWeVRXOWtaV3d1WjJWMFRXOWtaV3dvS1Z4eVhHNWNkRngwWFNrdWRHaGxiaWdnS0NrZ1BUNGdlMXh5WEc1Y2RGeDBYSFF2THlCRGNtOTNaR1oxYm1ScGJtY2djR0ZuWlNCa1pYUmhhV3h6SUhacFpYZGNjbHh1WEhSY2RGeDBkR2hwY3k1a1pYUmhhV3h6Vm1sbGR5QTlJRzVsZHlCV2FXVjNLSHNnWEhKY2JseDBYSFJjZEZ4MGQybGtaMlYwT2lCMGFHbHpMQ0JjY2x4dVhIUmNkRngwWEhSbGJEb2dKMXRrWVhSaExYWnBaWGN0WTNKdmQyUm1kVzVrYVc1bkxXUmxkR0ZwYkhOZEp5eGNjbHh1WEhSY2RGeDBYSFIwWlcxd2JHRjBaVG9nSjF0a1lYUmhMWFJ0Y0d3dFkzSnZkMlJtZFc1a2FXNW5MV1JsZEdGcGJITmRKeXhjY2x4dVhIUmNkRngwWEhSdGIyUmxiRG9nZEdocGN5NWtaWFJoYVd4elRXOWtaV3hjY2x4dVhIUmNkRngwZlNrN1hISmNibHgwWEhSY2RIUm9hWE11WkdWMFlXbHNjMVpwWlhjdWNtVnVaR1Z5S0h0Y2NseHVYSFJjZEZ4MFhIUnNZWGx2ZFhRNklIUm9hWE11WTI5dVptbG5MbXhoZVc5MWRDeGNjbHh1WEhSY2RGeDBYSFJ6YUc5M1UzUnZjbms2SUhSb2FYTXVZMjl1Wm1sbkxuTm9iM2RUZEc5eWVTeGNjbHh1WEhSY2RGeDBYSFJ3Y21WMGRIbFVZWEpuWlhRNklIUm9hWE11WkdWMFlXbHNjMVpwWlhjdWJXOWtaV3d1SkcxdlpHVnNMbkJ5WlhSMGVWUmhjbWRsZEN4Y2NseHVYSFJjZEZ4MFhIUndhWFJqYUVadmNqb2dkR2hwY3k1a1pYUmhhV3h6Vm1sbGR5NXRiMlJsYkM0a2JXOWtaV3d1Y0dsMFkyZ3VabTl5TEZ4MFhISmNibHgwWEhSY2RGeDBjR2wwWTJoQ1pXTmhkWE5sT2lCMGFHbHpMbVJsZEdGcGJITldhV1YzTG0xdlpHVnNMaVJ0YjJSbGJDNXdhWFJqYUM1aVpXTmhkWE5sTEZ4eVhHNWNkRngwWEhSY2RIQmxjbU5sYm5SUWJHVmtaMlZrT2lCMGFHbHpMbVJsZEdGcGJITldhV1YzTG0xdlpHVnNMaVJ0YjJSbGJDNXdaWEpqWlc1MFVHeGxaR2RsWkN4Y2NseHVYSFJjZEZ4MFhIUndjbTluY21WemMxQmxjbU5sYm5RNklIUm9hWE11WkdWMFlXbHNjMVpwWlhjdWJXOWtaV3d1SkcxdlpHVnNMbkJ5YjJkeVpYTnpVR1Z5WTJWdWRDeGNjbHh1WEhSY2RGeDBYSFJoYlc5MWJuUlFiR1ZrWjJWa09pQjBhR2x6TG1SbGRHRnBiSE5XYVdWM0xtMXZaR1ZzTGlSdGIyUmxiQzVtYjNKdFlYUjBaV1JCYlc5MWJuUlFiR1ZrWjJWa0xGeHlYRzVjZEZ4MFhIUmNkSEJoWjJWVmNtdzZJSFJvYVhNdVpHVjBZV2xzYzFacFpYY3ViVzlrWld3dUpHMXZaR1ZzTG5CaFoyVlZjbXdzWEhKY2JseDBYSFJjZEZ4MFlYWmhkR0Z5T2lCMGFHbHpMbVJsZEdGcGJITldhV1YzTG0xdlpHVnNMaVJ0YjJSbGJDNWhkbUYwWVhJc1hISmNibHgwWEhSY2RGeDBiM2R1WlhKT1lXMWxPaUIwYUdsekxtUmxkR0ZwYkhOV2FXVjNMbTF2WkdWc0xpUnRiMlJsYkM1dmQyNWxjaTV1WVcxbExGeHlYRzVjZEZ4MFhIUmNkRzkzYm1WeVRHOWpZWFJwYjI0NklIUm9hWE11WkdWMFlXbHNjMVpwWlhjdWJXOWtaV3d1SkcxdlpHVnNMbXh2WTJGMGFXOXVMbVJsYzJOeWFYQjBhVzl1TEZ4eVhHNWNkRngwWEhSY2RIQnliMnBsWTNSUWNtOWliR1Z0T2lCMGFHbHpMbVJsZEdGcGJITldhV1YzTG0xdlpHVnNMaVJ0YjJSbGJDNXpkRzl5ZVM1d2NtOWliR1Z0WEhKY2JseDBYSFJjZEgwcE8xeHlYRzVjZEZ4MFhIUjBhR2x6TG1SbGRHRnBiSE5XYVdWM0xteHZZV1JKYldGblpTaDBhR2x6TG1SbGRHRnBiSE5OYjJSbGJDNGtiVzlrWld3dWFXMWhaMlZ6V3pCZExsVnliQ3dnSnk1cWN5MXdjbTlxWldOMExXbHRZV2RsSnlrN1hISmNibHgwWEhSY2RGeHlYRzVjZEZ4MFhIUXZMeUJHYjI5MFpYSWdkbWxsZDF4eVhHNWNkRngwWEhSMGFHbHpMbVp2YjNSbGNsWnBaWGNnUFNCdVpYY2dWbWxsZHloN0lGeHlYRzVjZEZ4MFhIUmNkSGRwWkdkbGREb2dkR2hwY3l3Z1hISmNibHgwWEhSY2RGeDBaV3c2SUNkYlpHRjBZUzEyYVdWM0xXWnZiM1JsY2wwbkxGeHlYRzVjZEZ4MFhIUmNkSFJsYlhCc1lYUmxPaUFuVzJSaGRHRXRkRzF3YkMxbWIyOTBaWEpkSnl4Y2NseHVYSFJjZEZ4MFhIUnRiMlJsYkRvZ2RHaHBjeTVtYjI5MFpYSk5iMlJsYkZ4eVhHNWNkRngwWEhSOUtUdGNjbHh1WEhSY2RGeDBkR2hwY3k1bWIyOTBaWEpXYVdWM0xuSmxibVJsY2loN1hISmNibHgwWEhSY2RGeDBiR0Y1YjNWME9pQjBhR2x6TG1OdmJtWnBaeTVzWVhsdmRYUXNYSEpjYmx4MFhIUmNkRngwWTNKdmQyUm1kVzVrYVc1blIyVnVaWEpwWTFWeWJEb2dkR2hwY3k1bWIyOTBaWEpXYVdWM0xtMXZaR1ZzTGlSdGIyUmxiQzVqY205M1pHWjFibVJwYm1kSFpXNWxjbWxqVlhKc1hISmNibHgwWEhSY2RIMHBPMXgwWEhKY2JseDBYSFI5S1M1MGFHVnVLQ0FvS1NBOVBpQjdYSEpjYmx4MFhIUmNkSFJvYVhNdWNtVnpaWFJJWldsbmFIUW9LVHRjZEZ4eVhHNWNkRngwWEhSMGFHbHpMbUZ1WVd4NWRHbGpjeUE5SUhSb2FYTXVhVzVwZEVGdVlXeDVkR2xqY3lncE8xeHlYRzVjZEZ4MGZTazdYSEpjYmx4MGZWeHlYRzU5WEhKY2JseHlYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQkRjbTkzWkdaMWJtUnBibWRRYkdWa1oyVkNiM2c3SWwxOSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHR2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKCd2YWx1ZScgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrTW9kZWwgPSByZXF1aXJlKCdqdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvZnJhbWV3b3JrL01vZGVsJyk7XG5cbnZhciBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya01vZGVsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtNb2RlbCk7XG5cbnZhciBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc1dpZGdldEFuYWx5dGljc1dyaXRlVXRtQ29kZSA9IHJlcXVpcmUoJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy93aWRnZXQvYW5hbHl0aWNzL3dyaXRlVXRtQ29kZScpO1xuXG52YXIgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNXaWRnZXRBbmFseXRpY3NXcml0ZVV0bUNvZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc1dpZGdldEFuYWx5dGljc1dyaXRlVXRtQ29kZSk7XG5cbi8qKlxyXG4gKiBDcmVhdGUgYSBjcm93ZGZ1bmRpbmcgZm9vdGVyIG1vZGVsIFxyXG4gKiBAY2xhc3NkZXNjIEF1Z21lbnQgbW9kZWwgdG8gYWRkIHRoZSBDRiBnZW5lcmljIFVSTCB3aXRoIFVUTVxyXG4gKi9cbnZhciBQcm9taXNlID0gcmVxdWlyZSgnZXM2LXByb21pc2UnKS5Qcm9taXNlO1xuXG52YXIgTW9kZWxDcm93ZGZ1bmRpbmdGb290ZXIgPSAoZnVuY3Rpb24gKF9Nb2RlbCkge1xuXHRfaW5oZXJpdHMoTW9kZWxDcm93ZGZ1bmRpbmdGb290ZXIsIF9Nb2RlbCk7XG5cblx0ZnVuY3Rpb24gTW9kZWxDcm93ZGZ1bmRpbmdGb290ZXIob3B0aW9ucykge1xuXHRcdF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNb2RlbENyb3dkZnVuZGluZ0Zvb3Rlcik7XG5cblx0XHRfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihNb2RlbENyb3dkZnVuZGluZ0Zvb3Rlci5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHR9XG5cblx0LyoqXHJcbiAgKiBFeHRlbmQgbW9kZWwncyBnZXQgbW9kZWwgbWV0aG9kXHJcbiAgKiBAZGVzY3JpcHRpb24gRXh0ZW5kIG1vZGVsJ3MgZ2V0IG1vZGVsIG1ldGhvZCB0byBpbmNsdWRlIGRhdGEgYXVnbWVudGF0aW9uIG9mIHJldHVybmVkIGNvbGxlY3Rpb24gZGF0YVxyXG4gICovXG5cblx0X2NyZWF0ZUNsYXNzKE1vZGVsQ3Jvd2RmdW5kaW5nRm9vdGVyLCBbe1xuXHRcdGtleTogJ2dldE1vZGVsJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gZ2V0TW9kZWwoKSB7XG5cdFx0XHR2YXIgX3RoaXMgPSB0aGlzO1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0XHRcdFx0X2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoTW9kZWxDcm93ZGZ1bmRpbmdGb290ZXIucHJvdG90eXBlKSwgJ2dldE1vZGVsJywgX3RoaXMpLmNhbGwoX3RoaXMpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHZhciBiYXNlQ3Jvd2RmdW5kaW5nVXJsID0gJ2h0dHBzOi8vY3Jvd2RmdW5kaW5nLmp1c3RnaXZpbmcuY29tLyc7XG5cdFx0XHRcdFx0X3RoaXMuJG1vZGVsLmNyb3dkZnVuZGluZ0dlbmVyaWNVcmwgPSBiYXNlQ3Jvd2RmdW5kaW5nVXJsICsgKDAsIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzV2lkZ2V0QW5hbHl0aWNzV3JpdGVVdG1Db2RlMlsnZGVmYXVsdCddKShiYXNlQ3Jvd2RmdW5kaW5nVXJsLCB7XG5cdFx0XHRcdFx0XHR1dG1fbmFtZTogJ0Nyb3dkZnVuZGluZ1BsZWRnZUJveCcsIC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRcdFx0dXRtX2NvbnRlbnQ6IF90aGlzLiRtb2RlbC5uYW1lIC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gTW9kZWxDcm93ZGZ1bmRpbmdGb290ZXI7XG59KShfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya01vZGVsMlsnZGVmYXVsdCddKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gTW9kZWxDcm93ZGZ1bmRpbmdGb290ZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTnliM2RrWm5WdVpHbHVaeTF3YkdWa1oyVXRZbTk0TDNOeVl5OXpZM0pwY0hSekwyRndjQzlOYjJSbGJFTnliM2RrWm5WdVpHbHVaMFp2YjNSbGNpNXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4WlFVRlpMRU5CUVVNN096czdPenM3T3pzN096czdPenM3YzBWQlIwc3NLMFJCUVN0RU96czdPMjFHUVVONFJDdzJSVUZCTmtVN096czdPenM3TzBGQlJuUkhMRWxCUVVrc1QwRkJUeXhIUVVGSExFOUJRVThzUTBGQlF5eGhRVUZoTEVOQlFVTXNRMEZCUXl4UFFVRlBMRU5CUVVNN08wbEJVWFpETEhWQ1FVRjFRanRYUVVGMlFpeDFRa0ZCZFVJN08wRkJRMnBDTEZWQlJFNHNkVUpCUVhWQ0xFTkJRMllzVDBGQlR5eEZRVUZITzNkQ1FVUnNRaXgxUWtGQmRVSTdPMEZCUlROQ0xEWkNRVVpKTEhWQ1FVRjFRaXcyUTBGRmNFSXNUMEZCVHl4RlFVRkhPMFZCUTJwQ096czdPenM3TzJOQlNFa3NkVUpCUVhWQ096dFRRVkZ1UWl4dlFrRkJSenM3TzBGQlExZ3NWVUZCVHl4SlFVRkpMRTlCUVU4c1EwRkJSU3hWUVVGRkxFOUJRVThzUlVGQlRUdEJRVU5zUXl3clFrRldSeXgxUWtGQmRVSXNORU5CVlZRc1NVRkJTU3hEUVVGRkxGbEJRVTA3UVVGRE5VSXNVMEZCU1N4dFFrRkJiVUlzUjBGQlJ5eHpRMEZCYzBNc1EwRkJRenRCUVVOcVJTeFhRVUZMTEUxQlFVMHNRMEZCUXl4elFrRkJjMElzUjBGQlJ5eHRRa0ZCYlVJc1IwRkJSeXh6UmtGQllTeHRRa0ZCYlVJc1JVRkJSVHRCUVVNMVJpeGpRVUZSTEVWQlFVVXNkVUpCUVhWQ08wRkJRMnBETEdsQ1FVRlhMRVZCUVVVc1RVRkJTeXhOUVVGTkxFTkJRVU1zU1VGQlNUdE5RVU0zUWl4RFFVRkRMRU5CUVVNN1FVRkRTQ3haUVVGUExFVkJRVVVzUTBGQlF6dExRVU5XTEVOQlFVTXNRMEZCUXp0SlFVTklMRU5CUVVNc1EwRkJRenRIUVVOSU96czdVVUZ1UWtrc2RVSkJRWFZDT3pzN2NVSkJjMEprTEhWQ1FVRjFRaUlzSW1acGJHVWlPaUpET2k5MFpXMXdMMGRITGtaeWIyNTBSVzVrTGxkcFpHZGxkSE12ZDJsa1oyVjBjeTlqY205M1pHWjFibVJwYm1jdGNHeGxaR2RsTFdKdmVDOXpjbU12YzJOeWFYQjBjeTloY0hBdlRXOWtaV3hEY205M1pHWjFibVJwYm1kR2IyOTBaWEl1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SW5kWE5sSUhOMGNtbGpkQ2M3WEhKY2JseHlYRzVzWlhRZ1VISnZiV2x6WlNBOUlISmxjWFZwY21Vb0oyVnpOaTF3Y205dGFYTmxKeWt1VUhKdmJXbHpaVHRjY2x4dWFXMXdiM0owSUUxdlpHVnNJR1p5YjIwZ0oycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5cWN5OW1jbUZ0WlhkdmNtc3ZUVzlrWld3bk8xeHlYRzVwYlhCdmNuUWdkM0pwZEdWVmRHMURiMlJsSUdaeWIyMGdKMnAxYzNSbmFYWnBibWN0ZDJsa1oyVjBMV1p5WVcxbGQyOXlheTlqYjIxd2IyNWxiblJ6TDJ4cFlpOXFjeTkzYVdSblpYUXZZVzVoYkhsMGFXTnpMM2R5YVhSbFZYUnRRMjlrWlNjN1hISmNibHh5WEc0dktpcGNjbHh1SUNvZ1EzSmxZWFJsSUdFZ1kzSnZkMlJtZFc1a2FXNW5JR1p2YjNSbGNpQnRiMlJsYkNCY2NseHVJQ29nUUdOc1lYTnpaR1Z6WXlCQmRXZHRaVzUwSUcxdlpHVnNJSFJ2SUdGa1pDQjBhR1VnUTBZZ1oyVnVaWEpwWXlCVlVrd2dkMmwwYUNCVlZFMWNjbHh1SUNvdlhISmNibU5zWVhOeklFMXZaR1ZzUTNKdmQyUm1kVzVrYVc1blJtOXZkR1Z5SUdWNGRHVnVaSE1nVFc5a1pXd2dlMXh5WEc1Y2RHTnZibk4wY25WamRHOXlLQ0J2Y0hScGIyNXpJQ2tnZTF4eVhHNWNkRngwYzNWd1pYSW9JRzl3ZEdsdmJuTWdLVHRjY2x4dVhIUjlYSEpjYmx4MEx5b3FYSEpjYmx4MElDb2dSWGgwWlc1a0lHMXZaR1ZzSjNNZ1oyVjBJRzF2WkdWc0lHMWxkR2h2WkZ4eVhHNWNkQ0FxSUVCa1pYTmpjbWx3ZEdsdmJpQkZlSFJsYm1RZ2JXOWtaV3duY3lCblpYUWdiVzlrWld3Z2JXVjBhRzlrSUhSdklHbHVZMngxWkdVZ1pHRjBZU0JoZFdkdFpXNTBZWFJwYjI0Z2IyWWdjbVYwZFhKdVpXUWdZMjlzYkdWamRHbHZiaUJrWVhSaFhISmNibHgwSUNvdlhISmNibHgwWjJWMFRXOWtaV3dnS0NrZ2UxeHlYRzVjZEZ4MGNtVjBkWEp1SUc1bGR5QlFjbTl0YVhObEtDQW9JSEpsYzI5c2RtVWdLU0E5UGlCN0lGeHlYRzVjZEZ4MFhIUnpkWEJsY2k1blpYUk5iMlJsYkNncExuUm9aVzRvSUNncElEMCtJSHRjY2x4dVhIUmNkRngwWEhSc1pYUWdZbUZ6WlVOeWIzZGtablZ1WkdsdVoxVnliQ0E5SUNkb2RIUndjem92TDJOeWIzZGtablZ1WkdsdVp5NXFkWE4wWjJsMmFXNW5MbU52YlM4bk8xeHlYRzVjZEZ4MFhIUmNkSFJvYVhNdUpHMXZaR1ZzTG1OeWIzZGtablZ1WkdsdVowZGxibVZ5YVdOVmNtd2dQU0JpWVhObFEzSnZkMlJtZFc1a2FXNW5WWEpzSUNzZ2QzSnBkR1ZWZEcxRGIyUmxLR0poYzJWRGNtOTNaR1oxYm1ScGJtZFZjbXdzSUh0Y2NseHVYSFJjZEZ4MFhIUmNkSFYwYlY5dVlXMWxPaUFuUTNKdmQyUm1kVzVrYVc1blVHeGxaR2RsUW05NEp5d2dMeThnYW5Ob2FXNTBJR2xuYm05eVpUcHNhVzVsWEhKY2JseDBYSFJjZEZ4MFhIUjFkRzFmWTI5dWRHVnVkRG9nZEdocGN5NGtiVzlrWld3dWJtRnRaU0F2THlCcWMyaHBiblFnYVdkdWIzSmxPbXhwYm1WY2NseHVYSFJjZEZ4MFhIUjlLVHRjY2x4dVhIUmNkRngwWEhSeVpYTnZiSFpsS0NrN1hISmNibHgwWEhSY2RIMHBPMXh5WEc1Y2RGeDBmU2s3WEhKY2JseDBmVnh5WEc1OVhISmNibHh5WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0JOYjJSbGJFTnliM2RrWm5WdVpHbHVaMFp2YjNSbGNqc2lYWDA9IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG5cdHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtNb2RlbCA9IHJlcXVpcmUoJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvTW9kZWwnKTtcblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrTW9kZWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya01vZGVsKTtcblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzV2lkZ2V0TW9kZWxOdW1iZXIgPSByZXF1aXJlKCdqdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvd2lkZ2V0L21vZGVsL251bWJlcicpO1xuXG52YXIgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNXaWRnZXRBbmFseXRpY3NXcml0ZVV0bUNvZGUgPSByZXF1aXJlKCdqdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvd2lkZ2V0L2FuYWx5dGljcy93cml0ZVV0bUNvZGUnKTtcblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzV2lkZ2V0QW5hbHl0aWNzV3JpdGVVdG1Db2RlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNXaWRnZXRBbmFseXRpY3NXcml0ZVV0bUNvZGUpO1xuXG4vKipcclxuICogQ3JlYXRlIGEgY3Jvd2RmdW5kaW5nIHBhZ2UgZGV0YWlscyBtb2RlbCBcclxuICogQGNsYXNzZGVzYyBBdWdtZW50IG1vZGVsIHRvIGFkZCB0aGUgJSBvZiB0YXJnZXQgcmVhY2hlZCwgQ0ZQIFVSTCB3aXRoIFVUTSBhbmQgYXZhdGFyIHVybFxyXG4gKi9cbnZhciBQcm9taXNlID0gcmVxdWlyZSgnZXM2LXByb21pc2UnKS5Qcm9taXNlO1xuXG52YXIgTW9kZWxDcm93ZGZ1bmRpbmdQYWdlRGV0YWlscyA9IChmdW5jdGlvbiAoX01vZGVsKSB7XG5cdF9pbmhlcml0cyhNb2RlbENyb3dkZnVuZGluZ1BhZ2VEZXRhaWxzLCBfTW9kZWwpO1xuXG5cdGZ1bmN0aW9uIE1vZGVsQ3Jvd2RmdW5kaW5nUGFnZURldGFpbHMob3B0aW9ucykge1xuXHRcdF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNb2RlbENyb3dkZnVuZGluZ1BhZ2VEZXRhaWxzKTtcblxuXHRcdF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKE1vZGVsQ3Jvd2RmdW5kaW5nUGFnZURldGFpbHMucHJvdG90eXBlKSwgJ2NvbnN0cnVjdG9yJywgdGhpcykuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0fVxuXG5cdC8qKlxyXG4gICogRXh0ZW5kIG1vZGVsJ3MgZ2V0IG1vZGVsIG1ldGhvZFxyXG4gICogQGRlc2NyaXB0aW9uIEV4dGVuZCBtb2RlbCdzIGdldCBtb2RlbCBtZXRob2QgdG8gaW5jbHVkZSBkYXRhIGF1Z21lbnRhdGlvbiBvZiByZXR1cm5lZCBjb2xsZWN0aW9uIGRhdGFcclxuICAqL1xuXG5cdF9jcmVhdGVDbGFzcyhNb2RlbENyb3dkZnVuZGluZ1BhZ2VEZXRhaWxzLCBbe1xuXHRcdGtleTogJ2dldE1vZGVsJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gZ2V0TW9kZWwoKSB7XG5cdFx0XHR2YXIgX3RoaXMgPSB0aGlzO1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0XHRcdFx0X2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoTW9kZWxDcm93ZGZ1bmRpbmdQYWdlRGV0YWlscy5wcm90b3R5cGUpLCAnZ2V0TW9kZWwnLCBfdGhpcykuY2FsbChfdGhpcykudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0dmFyIHBhZ2VVcmwgPSAnaHR0cHM6Ly9jcm93ZGZ1bmRpbmcuanVzdGdpdmluZy5jb20vJyArIF90aGlzLiRtb2RlbC5uYW1lO1xuXHRcdFx0XHRcdHZhciBwZXJjZW50UGxlZGdlZCA9ICgwLCBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc1dpZGdldE1vZGVsTnVtYmVyLmdldFBlcmNlbnQpKF90aGlzLiRtb2RlbC5hbW91bnRQbGVkZ2VkLCBfdGhpcy4kbW9kZWwucGl0Y2gudGFyZ2V0QW1vdW50KTtcblxuXHRcdFx0XHRcdF90aGlzLiRtb2RlbC5wYWdlVXJsID0gcGFnZVVybCArICgwLCBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc1dpZGdldEFuYWx5dGljc1dyaXRlVXRtQ29kZTJbJ2RlZmF1bHQnXSkocGFnZVVybCwge1xuXHRcdFx0XHRcdFx0dXRtX25hbWU6ICdDcm93ZGZ1bmRpbmdQbGVkZ2VCb3gnLCAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0XHRcdHV0bV9jb250ZW50OiBfdGhpcy4kbW9kZWwubmFtZSAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRfdGhpcy4kbW9kZWwucGVyY2VudFBsZWRnZWQgPSBwZXJjZW50UGxlZGdlZDtcblx0XHRcdFx0XHRfdGhpcy4kbW9kZWwucHJvZ3Jlc3NQZXJjZW50ID0gcGVyY2VudFBsZWRnZWQgPiAxMDAgPyAxMDAgOiBwZXJjZW50UGxlZGdlZDtcblx0XHRcdFx0XHRfdGhpcy4kbW9kZWwucHJldHR5VGFyZ2V0ID0gKDAsIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzV2lkZ2V0TW9kZWxOdW1iZXIuY29tbWFGb3JtYXQpKHBhcnNlSW50KF90aGlzLiRtb2RlbC5waXRjaC50YXJnZXRBbW91bnQsIDEwKSk7XG5cdFx0XHRcdFx0X3RoaXMuJG1vZGVsLmZvcm1hdHRlZEFtb3VudFBsZWRnZWQgPSAoMCwgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNXaWRnZXRNb2RlbE51bWJlci5jb21tYUZvcm1hdCkoTWF0aC5yb3VuZChfdGhpcy4kbW9kZWwuYW1vdW50UGxlZGdlZCkpO1xuXHRcdFx0XHRcdF90aGlzLiRtb2RlbC5hdmF0YXIgPSBfdGhpcy4kbW9kZWwub3duZXIucHJvZmlsZUltYWdlVXJscy5TaXplMTUweDE1MEZhY2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fV0pO1xuXG5cdHJldHVybiBNb2RlbENyb3dkZnVuZGluZ1BhZ2VEZXRhaWxzO1xufSkoX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtNb2RlbDJbJ2RlZmF1bHQnXSk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IE1vZGVsQ3Jvd2RmdW5kaW5nUGFnZURldGFpbHM7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTnliM2RrWm5WdVpHbHVaeTF3YkdWa1oyVXRZbTk0TDNOeVl5OXpZM0pwY0hSekwyRndjQzlOYjJSbGJFTnliM2RrWm5WdVpHbHVaMUJoWjJWRVpYUmhhV3h6TG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lKQlFVRkJMRmxCUVZrc1EwRkJRenM3T3pzN096czdPenM3T3pzN096dHpSVUZIU3l3clJFRkJLMFE3T3pzN2VVVkJRM1JFTEcxRlFVRnRSVHM3YlVaQlJYSkZMRFpGUVVFMlJUczdPenM3T3pzN1FVRktkRWNzU1VGQlNTeFBRVUZQTEVkQlFVY3NUMEZCVHl4RFFVRkRMR0ZCUVdFc1EwRkJReXhEUVVGRExFOUJRVThzUTBGQlF6czdTVUZWZGtNc05FSkJRVFJDTzFkQlFUVkNMRFJDUVVFMFFqczdRVUZEZEVJc1ZVRkVUaXcwUWtGQk5FSXNRMEZEY0VJc1QwRkJUeXhGUVVGSE8zZENRVVJzUWl3MFFrRkJORUk3TzBGQlJXaERMRFpDUVVaSkxEUkNRVUUwUWl3MlEwRkZla0lzVDBGQlR5eEZRVUZITzBWQlEycENPenM3T3pzN08yTkJTRWtzTkVKQlFUUkNPenRUUVZGNFFpeHZRa0ZCUnpzN08wRkJRMWdzVlVGQlR5eEpRVUZKTEU5QlFVOHNRMEZCUlN4VlFVRkZMRTlCUVU4c1JVRkJUVHRCUVVOc1F5d3JRa0ZXUnl3MFFrRkJORUlzTkVOQlZXUXNTVUZCU1N4RFFVRkZMRmxCUVUwN1FVRkROVUlzVTBGQlNTeFBRVUZQTERSRFFVRTJReXhOUVVGTExFMUJRVTBzUTBGQlF5eEpRVUZKTEVGQlFVVXNRMEZCUXp0QlFVTXpSU3hUUVVGSkxHTkJRV01zUjBGQlJ5d3lSVUZCV1N4TlFVRkxMRTFCUVUwc1EwRkJReXhoUVVGaExFVkJRVVVzVFVGQlN5eE5RVUZOTEVOQlFVTXNTMEZCU3l4RFFVRkRMRmxCUVZrc1EwRkJSU3hEUVVGRE96dEJRVVUzUml4WFFVRkxMRTFCUVUwc1EwRkJReXhQUVVGUExFZEJRVWNzVDBGQlR5eEhRVUZITEhOR1FVRmhMRTlCUVU4c1JVRkJSVHRCUVVOeVJDeGpRVUZSTEVWQlFVVXNkVUpCUVhWQ08wRkJRMnBETEdsQ1FVRlhMRVZCUVVVc1RVRkJTeXhOUVVGTkxFTkJRVU1zU1VGQlNUdE5RVU0zUWl4RFFVRkRMRU5CUVVNN1FVRkRTQ3hYUVVGTExFMUJRVTBzUTBGQlF5eGpRVUZqTEVkQlFVY3NZMEZCWXl4RFFVRkRPMEZCUXpWRExGZEJRVXNzVFVGQlRTeERRVUZETEdWQlFXVXNSMEZCUnl4alFVRmpMRWRCUVVjc1IwRkJSeXhIUVVGSExFZEJRVWNzUjBGQlJ5eGpRVUZqTEVOQlFVTTdRVUZETVVVc1YwRkJTeXhOUVVGTkxFTkJRVU1zV1VGQldTeEhRVUZITERSRlFVRmhMRkZCUVZFc1EwRkJReXhOUVVGTExFMUJRVTBzUTBGQlF5eExRVUZMTEVOQlFVTXNXVUZCV1N4RlFVRkZMRVZCUVVVc1EwRkJReXhEUVVGRkxFTkJRVU03UVVGRGRrWXNWMEZCU3l4TlFVRk5MRU5CUVVNc2MwSkJRWE5DTEVkQlFVY3NORVZCUVdFc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlJTeE5RVUZMTEUxQlFVMHNRMEZCUXl4aFFVRmhMRU5CUVVVc1EwRkJSU3hEUVVGRE8wRkJRelZHTEZkQlFVc3NUVUZCVFN4RFFVRkRMRTFCUVUwc1IwRkJSeXhOUVVGTExFMUJRVTBzUTBGQlF5eExRVUZMTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zWlVGQlpTeERRVUZETzBGQlEzaEZMRmxCUVU4c1JVRkJSU3hEUVVGRE8wdEJRMVlzUTBGQlF5eERRVUZETzBsQlEwZ3NRMEZCUXl4RFFVRkRPMGRCUTBnN096dFJRVEZDU1N3MFFrRkJORUk3T3p0eFFrRTJRbTVDTERSQ1FVRTBRaUlzSW1acGJHVWlPaUpET2k5MFpXMXdMMGRITGtaeWIyNTBSVzVrTGxkcFpHZGxkSE12ZDJsa1oyVjBjeTlqY205M1pHWjFibVJwYm1jdGNHeGxaR2RsTFdKdmVDOXpjbU12YzJOeWFYQjBjeTloY0hBdlRXOWtaV3hEY205M1pHWjFibVJwYm1kUVlXZGxSR1YwWVdsc2N5NXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWlkMWMyVWdjM1J5YVdOMEp6dGNjbHh1WEhKY2JteGxkQ0JRY205dGFYTmxJRDBnY21WeGRXbHlaU2duWlhNMkxYQnliMjFwYzJVbktTNVFjbTl0YVhObE8xeHlYRzVwYlhCdmNuUWdUVzlrWld3Z1puSnZiU0FuYW5WemRHZHBkbWx1WnkxM2FXUm5aWFF0Wm5KaGJXVjNiM0pyTDJOdmJYQnZibVZ1ZEhNdmJHbGlMMnB6TDJaeVlXMWxkMjl5YXk5TmIyUmxiQ2M3WEhKY2JtbHRjRzl5ZENCN0lHZGxkRkJsY21ObGJuUWdmU0JtY205dElDZHFkWE4wWjJsMmFXNW5MWGRwWkdkbGRDMW1jbUZ0WlhkdmNtc3ZZMjl0Y0c5dVpXNTBjeTlzYVdJdmFuTXZkMmxrWjJWMEwyMXZaR1ZzTDI1MWJXSmxjaWM3WEhKY2JtbHRjRzl5ZENCN0lHTnZiVzFoUm05eWJXRjBJSDBnWm5KdmJTQW5hblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwycHpMM2RwWkdkbGRDOXRiMlJsYkM5dWRXMWlaWEluTzF4eVhHNXBiWEJ2Y25RZ2QzSnBkR1ZWZEcxRGIyUmxJR1p5YjIwZ0oycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5cWN5OTNhV1JuWlhRdllXNWhiSGwwYVdOekwzZHlhWFJsVlhSdFEyOWtaU2M3WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nUTNKbFlYUmxJR0VnWTNKdmQyUm1kVzVrYVc1bklIQmhaMlVnWkdWMFlXbHNjeUJ0YjJSbGJDQmNjbHh1SUNvZ1FHTnNZWE56WkdWell5QkJkV2R0Wlc1MElHMXZaR1ZzSUhSdklHRmtaQ0IwYUdVZ0pTQnZaaUIwWVhKblpYUWdjbVZoWTJobFpDd2dRMFpRSUZWU1RDQjNhWFJvSUZWVVRTQmhibVFnWVhaaGRHRnlJSFZ5YkZ4eVhHNGdLaTljY2x4dVkyeGhjM01nVFc5a1pXeERjbTkzWkdaMWJtUnBibWRRWVdkbFJHVjBZV2xzY3lCbGVIUmxibVJ6SUUxdlpHVnNJSHRjY2x4dVhIUmpiMjV6ZEhKMVkzUnZjaWdnYjNCMGFXOXVjeUFwSUh0Y2NseHVYSFJjZEhOMWNHVnlLQ0J2Y0hScGIyNXpJQ2s3WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc1Y2RDQXFJRVY0ZEdWdVpDQnRiMlJsYkNkeklHZGxkQ0J0YjJSbGJDQnRaWFJvYjJSY2NseHVYSFFnS2lCQVpHVnpZM0pwY0hScGIyNGdSWGgwWlc1a0lHMXZaR1ZzSjNNZ1oyVjBJRzF2WkdWc0lHMWxkR2h2WkNCMGJ5QnBibU5zZFdSbElHUmhkR0VnWVhWbmJXVnVkR0YwYVc5dUlHOW1JSEpsZEhWeWJtVmtJR052Ykd4bFkzUnBiMjRnWkdGMFlWeHlYRzVjZENBcUwxeHlYRzVjZEdkbGRFMXZaR1ZzSUNncElIdGNjbHh1WEhSY2RISmxkSFZ5YmlCdVpYY2dVSEp2YldselpTZ2dLQ0J5WlhOdmJIWmxJQ2tnUFQ0Z2V5QmNjbHh1WEhSY2RGeDBjM1Z3WlhJdVoyVjBUVzlrWld3b0tTNTBhR1Z1S0NBb0tTQTlQaUI3WEhKY2JseDBYSFJjZEZ4MGJHVjBJSEJoWjJWVmNtd2dQU0JnYUhSMGNITTZYRnd2WEZ3dlkzSnZkMlJtZFc1a2FXNW5MbXAxYzNSbmFYWnBibWN1WTI5dFhGd3ZKSHQwYUdsekxpUnRiMlJsYkM1dVlXMWxmV0E3WEhKY2JseDBYSFJjZEZ4MGJHVjBJSEJsY21ObGJuUlFiR1ZrWjJWa0lEMGdaMlYwVUdWeVkyVnVkQ2dnZEdocGN5NGtiVzlrWld3dVlXMXZkVzUwVUd4bFpHZGxaQ3dnZEdocGN5NGtiVzlrWld3dWNHbDBZMmd1ZEdGeVoyVjBRVzF2ZFc1MElDazdYSEpjYmx4eVhHNWNkRngwWEhSY2RIUm9hWE11SkcxdlpHVnNMbkJoWjJWVmNtd2dQU0J3WVdkbFZYSnNJQ3NnZDNKcGRHVlZkRzFEYjJSbEtIQmhaMlZWY213c0lIdGNjbHh1WEhSY2RGeDBYSFJjZEhWMGJWOXVZVzFsT2lBblEzSnZkMlJtZFc1a2FXNW5VR3hsWkdkbFFtOTRKeXdnTHk4Z2FuTm9hVzUwSUdsbmJtOXlaVHBzYVc1bFhISmNibHgwWEhSY2RGeDBYSFIxZEcxZlkyOXVkR1Z1ZERvZ2RHaHBjeTRrYlc5a1pXd3VibUZ0WlNBdkx5QnFjMmhwYm5RZ2FXZHViM0psT214cGJtVmNjbHh1WEhSY2RGeDBYSFI5S1R0Y2NseHVYSFJjZEZ4MFhIUjBhR2x6TGlSdGIyUmxiQzV3WlhKalpXNTBVR3hsWkdkbFpDQTlJSEJsY21ObGJuUlFiR1ZrWjJWa08xeHlYRzVjZEZ4MFhIUmNkSFJvYVhNdUpHMXZaR1ZzTG5CeWIyZHlaWE56VUdWeVkyVnVkQ0E5SUhCbGNtTmxiblJRYkdWa1oyVmtJRDRnTVRBd0lEOGdNVEF3SURvZ2NHVnlZMlZ1ZEZCc1pXUm5aV1E3WEhKY2JseDBYSFJjZEZ4MGRHaHBjeTRrYlc5a1pXd3VjSEpsZEhSNVZHRnlaMlYwSUQwZ1kyOXRiV0ZHYjNKdFlYUW9JSEJoY25ObFNXNTBLSFJvYVhNdUpHMXZaR1ZzTG5CcGRHTm9MblJoY21kbGRFRnRiM1Z1ZEN3Z01UQXBJQ2s3WEhKY2JseDBYSFJjZEZ4MGRHaHBjeTRrYlc5a1pXd3VabTl5YldGMGRHVmtRVzF2ZFc1MFVHeGxaR2RsWkNBOUlHTnZiVzFoUm05eWJXRjBLQ0JOWVhSb0xuSnZkVzVrS0NCMGFHbHpMaVJ0YjJSbGJDNWhiVzkxYm5SUWJHVmtaMlZrSUNrZ0tUdGNjbHh1WEhSY2RGeDBYSFIwYUdsekxpUnRiMlJsYkM1aGRtRjBZWElnUFNCMGFHbHpMaVJ0YjJSbGJDNXZkMjVsY2k1d2NtOW1hV3hsU1cxaFoyVlZjbXh6TGxOcGVtVXhOVEI0TVRVd1JtRmpaVHRjY2x4dVhIUmNkRngwWEhSeVpYTnZiSFpsS0NrN1hISmNibHgwWEhSY2RIMHBPMXh5WEc1Y2RGeDBmU2s3WEhKY2JseDBmVnh5WEc1OVhISmNibHh5WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0JOYjJSbGJFTnliM2RrWm5WdVpHbHVaMUJoWjJWRVpYUmhhV3h6T3lKZGZRPT0iXX0=\n"]}