{"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","_appFundraiserLeaderboard","_appFundraiserLeaderboard2","widgetName","./app/FundraiserLeaderboard","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","exportName","setTimeoutContext","timeout","bindFn","invokeArrayArg","deprecate","deprecationMessage","warn","inherit","properties","childP","baseP","_super","assign","boolOrFn","TYPE_FUNCTION","ifUndefined","val1","val2","addEventListeners","target","handler","splitStr","addEventListener","removeEventListeners","removeEventListener","hasParent","parentNode","inStr","find","trim","inArray","findByKey","toArray","uniqueArray","sort","results","prefixed","property","prop","camelProp","toUpperCase","VENDOR_PREFIXES","uniqueId","_uniqueId","getWindowForElement","element","doc","ownerDocument","defaultView","parentWindow","Input","manager","inputTarget","domHandler","ev","enable","init","createInputInstance","Type","inputClass","SUPPORT_POINTER_EVENTS","PointerEventInput","SUPPORT_ONLY_TOUCH","TouchInput","SUPPORT_TOUCH","TouchMouseInput","MouseInput","inputHandler","eventType","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","INPUT_START","isFinal","INPUT_END","INPUT_CANCEL","session","computeInputData","recognize","prevInput","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","center","getCenter","timeStamp","now","deltaTime","angle","getAngle","distance","getDistance","computeDeltaXY","offsetDirection","getDirection","deltaX","deltaY","overallVelocity","getVelocity","overallVelocityX","overallVelocityY","y","abs","scale","getScale","rotation","getRotation","maxPointers","computeIntervalInputData","srcEvent","offsetDelta","prevDelta","velocity","velocityX","velocityY","direction","lastInterval","COMPUTE_INTERVAL","v","clientX","round","clientY","DIRECTION_NONE","DIRECTION_LEFT","DIRECTION_RIGHT","DIRECTION_UP","DIRECTION_DOWN","p1","p2","props","PROPS_XY","Math","sqrt","atan2","PI","PROPS_CLIENT_XY","evEl","MOUSE_ELEMENT_EVENTS","evWin","MOUSE_WINDOW_EVENTS","pressed","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","store","pointerEvents","SingleTouchInput","evTarget","SINGLE_TOUCH_TARGET_EVENTS","SINGLE_TOUCH_WINDOW_EVENTS","started","normalizeSingleTouches","touches","changed","changedTouches","TOUCH_TARGET_EVENTS","targetIds","getTouches","allTouches","INPUT_MOVE","identifier","targetTouches","changedTargetTouches","filter","touch","mouse","primaryTouch","lastTouches","recordTouches","eventData","setLastTouch","lastTouch","lts","removeLastTouch","DEDUP_TIMEOUT","isSyntheticEvent","dx","dy","DEDUP_DISTANCE","TouchAction","set","cleanTouchActions","actions","TOUCH_ACTION_NONE","hasPanX","TOUCH_ACTION_PAN_X","hasPanY","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_AUTO","getTouchActionProps","NATIVE_TOUCH_ACTION","touchMap","cssSupports","CSS","supports","Recognizer","defaults","STATE_POSSIBLE","simultaneous","requireFail","stateStr","STATE_CANCELLED","STATE_ENDED","STATE_CHANGED","STATE_BEGAN","directionStr","getRecognizerByNameIfManager","otherRecognizer","recognizer","get","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","count","Hammer","recognizers","preset","Manager","handlers","oldCssProps","touchAction","toggleCssProps","recognizeWith","requireFailure","style","cssProps","triggerDomEvent","event","gestureEvent","createEvent","initEvent","gesture","dispatchEvent","TEST_ELEMENT","createElement","Date","output","nextKey","dest","keys","MOBILE_REGEX","navigator","userAgent","INPUT_TYPE_TOUCH","INPUT_TYPE_PEN","INPUT_TYPE_MOUSE","INPUT_TYPE_KINECT","DIRECTION_HORIZONTAL","DIRECTION_VERTICAL","DIRECTION_ALL","destroy","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","button","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","toLowerCase","isTouch","storeIndex","pointerId","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","TOUCH_INPUT_MAP","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","PREFIXED_TOUCH_ACTION","TOUCH_ACTION_COMPUTE","TOUCH_ACTION_MAP","compute","update","getTouchAction","preventDefaults","prevented","preventDefault","hasNone","isTapPointer","isTapMovement","isTapTouchTime","preventSrc","STATE_RECOGNIZED","STATE_FAILED","dropRecognizeWith","dropRequireFailure","hasRequireFailures","canRecognizeWith","additionalEvent","tryEmit","canEmit","inputDataClone","reset","attrTest","optionPointers","isRecognized","isValid","threshold","directionTest","hasMoved","inOut","time","validPointers","validMovement","validTime","clearTimeout","taps","interval","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","domEvents","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","STOP","FORCED_STOP","stop","force","stopped","curRecognizer","existing","remove","events","Tap","Pan","Swipe","Pinch","Rotate","Press","freeGlobal","alert","confirm","prompt","headers","row","for-each","normalizeArray","allowAboveRoot","up","xs","res","splitPathRe","splitPath","resolvedPath","resolvedAbsolute","isAbsolute","trailingSlash","paths","relative","from","to","arr","fromParts","toParts","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","aStr","isDuplicate","has","toSetString","at","aIdx","./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","aSourceMap","sourceMap","getArg","sources","names","sourceRoot","sourcesContent","mappings","_version","_names","_sources","_mappings","binarySearch","base64VLQ","fromSourceMap","smc","_sourceRoot","_generateSourcesContent","_file","__generatedMappings","__originalMappings","compareByOriginalPositions","defineProperty","_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","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","timeoutTimer","statusCode","failureResponse","aborted","status","useXDR","rawRequest","getAllResponseHeaders","parseHeaders","called","cors","XDomainRequest","XMLHttpRequest","sync","json","onreadystatechange","onload","onerror","onprogress","onabort","ontimeout","username","password","withCredentials","abort","setRequestHeader","responseType","beforeSend","send","responseXML","firefoxBugTakenEffect","documentElement","nodeName","global/window","parse-headers","_helpers","_partials_list","_partials_list2","ifEquals","./partials/_list","v1","v2","_list","_classCallCheck","_createClass","defineProperties","descriptor","enumerable","configurable","writable","protoProps","staticProps","_jsDOMGetVendorProperty","_jsDOMGetVendorProperty2","Carousel","_ref","view","widget","pageSize","isInfinite","nextPageBuffer","el","swipe","querySelector","carousel","aperture","btnNext","btnPrev","currentPage","lastPage","getLastPage","translate3d","_jgwidget","features","csstransforms3d","getMaxPage","setAperture","setControlState","bindListeners","setCardState","isBuffer","loadMoreCards","card","apertureSize","offsetHeight","getComputedStyle","marginBottom","marginTop","height","cardCount","querySelectorAll","maxPage","model","$model","pagination","totalResults","isMaxLoaded","showNextPage","showPrevPage","hammer","setAttribute","classList","removeAttribute","transition","setMaxLoaded","analytics","cardImpressions","firstCard","lastCard","_this2","appendNextPage","cardsInit","../js/DOM/getVendorProperty","hammerjs","getVendorProperty","transform","vendorProps","Analytics","configHash","widgetEl","getAttribute","charityId","frpId","pushConfig","widgetInit","_kmq","analyticsData","page_type","activity_type","charity_id","page_id","widgetClick","clickData","subtype","event_value","cards","activityId","cardRank","cardFrpId","cardUrl","card_id","card_rank","activity_id","card_url","stopPropagation","cardClick","impressionData","card_count","_utilsQueryString","Model","isPaginated","apiPageSize","collectionPath","setParams","lastReturnedPage","collection","currentApiPage","pageNum","fetchData","getModel","qs","queryStringStringify","_this3","getNextPage","../utils/queryString","es6-promise","_HandlebarsHandlebars","_HandlebarsHandlebars2","View","pollInterval","pollTrigger","innerHTML","config","pollAtInterval","registerPollTrigger","img","Image","resetHeight","refresh","render","setInterval","_this4","_this5","frag","docFrag","createDocumentFragment","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","encodeURIComponent","getPercent","numerator","denominator","parseFloat","commaFormat","_inherits","subClass","superClass","setPrototypeOf","__proto__","_get","_x2","_x3","_again","receiver","desc","getOwnPropertyDescriptor","getter","getPrototypeOf","_justgivingWidgetFrameworkComponentsLibJsFrameworkWidget","_justgivingWidgetFrameworkComponentsLibJsFrameworkWidget2","_justgivingWidgetFrameworkComponentsLibCarouselCarousel","_justgivingWidgetFrameworkComponentsLibCarouselCarousel2","_justgivingWidgetFrameworkComponentsLibJsFrameworkModel","_justgivingWidgetFrameworkComponentsLibJsFrameworkModel2","_ModelLeaderboard","_ModelLeaderboard2","_justgivingWidgetFrameworkComponentsLibJsFrameworkView","_justgivingWidgetFrameworkComponentsLibJsFrameworkView2","FundraiserLeaderboard","_Widget","leaderboardModel","charityModel","bootstrap","reference","headerView","charityName","layout","leaderboardView","childView","leaderboardListView","viewName","hasCarousel","fundraisers","pages","footerView","profilePageUrl","charityDescription","description","initAnalytics","./ModelLeaderboard","justgiving-widget-framework/components/lib/carousel/Carousel","justgiving-widget-framework/components/lib/js/framework/Model","justgiving-widget-framework/components/lib/js/framework/View","justgiving-widget-framework/components/lib/js/framework/Widget","_justgivingWidgetFrameworkComponentsLibJsWidgetModelNumber","ModelLeaderboard","_Model","currencySymbol","amount","fundraiser","prettyAmount","targetPc","targetAmount","ranking","avatar","ownerProfileImageUrls","Value","donationUrl","getDonationUrl","pageId","getFullReference","referenceSuffix","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\":31}],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\":30}],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\":28}],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){\n/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n\n},{}],28:[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},{}],29:[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\":41}],30:[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}],31:[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\":37,\"./source-map/source-map-generator\":38,\"./source-map/source-node\":39}],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 */\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\":40,\"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 *\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\":34,\"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 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}],35:[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}],36:[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\":40,\"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 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\":32,\"./base64-vlq\":33,\"./binary-search\":35,\"./util\":40,\"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 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\":32,\"./base64-vlq\":33,\"./mapping-list\":36,\"./util\":40,\"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 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\":38,\"./util\":40,\"amdefine\":21}],40:[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}],41:[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},{}],42:[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\":28,\"parse-headers\":29,\"xtend\":43}],43:[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},{}],44:[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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvSGFuZGxlYmFycy9oYW5kbGViYXJzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozt1QkFLWSxXQUFXOzs7OzZCQUlsQixrQkFBa0I7Ozs7QUFQcEMsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBSXZDLHdCQUFVLENBQUM7QUFJWCxpQ0FBTyxDQUFDOztxQkFFTyxVQUFVIiwiZmlsZSI6IkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvSGFuZGxlYmFycy9oYW5kbGViYXJzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG5cclxubGV0IEhhbmRsZWJhcnMgPSByZXF1aXJlKCdIYW5kbGViYXJzJyk7XHJcblxyXG4vL0ltcG9ydCBoZWxwZXJzXHJcbmltcG9ydCB7IGlmRXF1YWxzIH0gZnJvbSAnLi9oZWxwZXJzJztcclxuaWZFcXVhbHMoKTtcclxuXHJcbi8vSW1wb3J0IHBhcnRpYWxzXHJcbmltcG9ydCBfbGlzdCBmcm9tICcuL3BhcnRpYWxzL19saXN0JztcclxuX2xpc3QoKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEhhbmRsZWJhcnM7Il19\n},{\"./helpers\":45,\"./partials/_list\":46,\"Handlebars\":20}],45:[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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvSGFuZGxlYmFycy9oZWxwZXJzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7O0FBRWIsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDOzs7Ozs7Ozs7QUFRaEMsU0FBUyxRQUFRLEdBQUk7QUFDM0IsV0FBVSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRztBQUNoRSxNQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUc7QUFDZCxVQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUUsSUFBSSxDQUFFLENBQUM7R0FDM0I7QUFDRCxTQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUUsSUFBSSxDQUFFLENBQUM7RUFDaEMsQ0FBQyxDQUFDO0NBQ0giLCJmaWxlIjoiQzovdGVtcC9HRy5Gcm9udEVuZC5XaWRnZXRzL3dpZGdldHMvZnVuZHJhaXNlci1sZWFkZXJib2FyZC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9IYW5kbGViYXJzL2hlbHBlcnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG5sZXQgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ0hhbmRsZWJhcnMnKTtcclxuXHJcbi8qKlxyXG4gKiBTdHJpY3QgY29tcGFyaXNvbiBoZWxwZXIgZm9yIHVzZSBpbiBIYW5kbGViYXJzIHRlbXBsYXRlc1xyXG4gKiBAcGFyYW0ge1N0cmluZ30gRmlyc3QgY29uZGl0aW9uIHRvIGNvbXBhcmVcclxuICogQHBhcmFtIHtTdHJpbmd9IFNlY29uZCBjb25kaXRpb24gdG8gY29tcGFyZVxyXG4gKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIGNvbmRpdGlvbnMgYXJlIGVxdWFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaWZFcXVhbHMgKCkge1xyXG5cdEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2lmRXF1YWxzJywgZnVuY3Rpb24oIHYxLCB2Miwgb3B0aW9ucyApIHtcclxuXHQgIGlmKCB2MSA9PT0gdjIgKSB7XHJcblx0ICAgIHJldHVybiBvcHRpb25zLmZuKCB0aGlzICk7XHJcblx0ICB9XHJcblx0ICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKCB0aGlzICk7XHJcblx0fSk7XHRcclxufSBcclxuIl19\n},{\"Handlebars\":20}],46:[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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvSGFuZGxlYmFycy9wYXJ0aWFscy9fbGlzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7O3FCQUlXLEtBQUs7QUFGN0IsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDOztBQUV4QixTQUFTLEtBQUssR0FBSTtBQUNoQyxXQUFVLENBQUMsZUFBZSxDQUFDLE1BQU0sa21DQXFCaEMsQ0FBQztDQUNGIiwiZmlsZSI6IkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvSGFuZGxlYmFycy9wYXJ0aWFscy9fbGlzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmxldCBIYW5kbGViYXJzID0gcmVxdWlyZSgnSGFuZGxlYmFycycpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2xpc3QgKCkge1xyXG5cdEhhbmRsZWJhcnMucmVnaXN0ZXJQYXJ0aWFsKCdsaXN0JyxcclxuICAgIFx0YHt7I2lmRXF1YWxzIGhhc0Nhcm91c2VsICd0cnVlJ319XHRcclxuICAgIFx0XHQ8ZGl2IGNsYXNzPVwiY2Fyb3VzZWwtc3RhY2tlZFwiIGRhdGEtY2Fyb3VzZWw9XCJ7e3ZpZXdOYW1lfX1cIj5cclxuXHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwiYnRuLWljb24tbCBjb250cm9sLXByZXZcIiBkYXRhLWNvbnRyb2wtcHJldiBkYXRhLWFuYWx5dGljcy1ldmVudD1cIkdldCBwcmV2aW91cyBwYWdlXCIgZGF0YS1hbmFseXRpY3Mtc3VidHlwZT1cImJ1dHRvblwiPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJoaWRlVmlzdWFsbHlcIj5QcmV2aW91cyBwYWdlPC9zcGFuPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJidG4taWNvbi1jb250ZW50XCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwic3ByaXRlLWNoZXZyb24tdXAtbFwiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2Fyb3VzZWwtYXBlcnR1cmVcIiBkYXRhLWNhcm91c2VsLWFwZXJ0dXJlPlxyXG5cdFx0XHRcdFx0PHVsIGNsYXNzPVwibGlzdC1zdGFja2VkLWRpdmlkZXJcIiBkYXRhLWNhcm91c2VsLWxpc3QgZGF0YS12aWV3LXt7dmlld05hbWV9fS1saXN0PjwvdWw+XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cImJ0bi10ZXJ0aWFyeSBidG4tdGV4dC1tIGNvbnRyb2wtbmV4dFwiIGRhdGEtY29udHJvbC1uZXh0IGRhdGEtYW5hbHl0aWNzLWV2ZW50PVwiR2V0IG5leHQgcGFnZVwiIGRhdGEtYW5hbHl0aWNzLXN1YnR5cGU9XCJidXR0b25cIj5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiYnRuLXRleHQtY29udGVudFwiPlNob3cgbW9yZTwvc3Bhbj5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwicHJvZ3Jlc3Mtc3Bpbm5lclwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImhpZGVWaXN1YWxseVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlBsZWFzZSB3YWl0IGEgbW9tZW50LCBkYXRhIGlzIGxvYWRpbmc8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC9idXR0b24+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0e3svaWZFcXVhbHN9fVxyXG5cdFx0PHVsIGNsYXNzPVwibGlzdC1zdGFja2VkLWRpdmlkZXJcIiBkYXRhLXZpZXcte3t2aWV3TmFtZX19LWxpc3Q+PC91bD5gXHJcblx0KTtcclxufSJdfQ==\n},{\"Handlebars\":20}],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 _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 _jsDOMGetVendorProperty = require('../js/DOM/getVendorProperty');\n\nvar _jsDOMGetVendorProperty2 = _interopRequireDefault(_jsDOMGetVendorProperty);\n\n/**\r\n * Add a carousel to a list view\r\n * @classdesc Add a carousel for pagination of card list views\r\n * @param {Object} options\r\n * @param {Object} options.view. The view that the carousel paginates [required]\r\n * @param {Object} options.widget. The widget instance [required]\r\n * @param {Number} options.pageSize. The number of list items to show in each carousel page\r\n * @param {Boolean} options.isInfinite. Whether the collection displayed is paginated on the REST API\r\n * @param {Number} options.nextPageBuffer. Number of carousel pages before the last at which to fetch next API page.\r\n * @param {String} options.el. The carousel parent element\r\n * @class Set carousel instance properties; cache aperture, control and list elements; set current page; \r\n */\nvar Hammer = require('hammerjs');\n\nvar Carousel = (function () {\n\tfunction Carousel() {\n\t\tvar _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n\t\tvar view = _ref.view;\n\t\tvar widget = _ref.widget;\n\t\tvar pageSize = _ref.pageSize;\n\t\tvar isInfinite = _ref.isInfinite;\n\t\tvar nextPageBuffer = _ref.nextPageBuffer;\n\t\tvar el = _ref.el;\n\t\tvar swipe = _ref.swipe;\n\n\t\t_classCallCheck(this, Carousel);\n\n\t\tthis.view = view;\n\t\tthis.widget = widget;\n\t\tthis.pageSize = pageSize || 3;\n\t\tthis.isInfinite = isInfinite;\n\t\tthis.swipe = swipe;\n\t\tthis.nextPageBuffer = nextPageBuffer || 2;\n\t\tthis.el = document.querySelector(el);\n\t\tif (!this.el || !this.widget || !this.view) {\n\t\t\treturn;\n\t\t}\n\t\tthis.view.carousel = this;\n\t\tthis.aperture = this.el.querySelector('[data-carousel-aperture]');\n\t\tthis.btnNext = this.el.querySelector('[data-control-next]');\n\t\tthis.btnPrev = this.el.querySelector('[data-control-prev]');\n\t\tthis.strip = this.el.querySelector('[data-carousel-list]');\n\t\tthis.currentPage = 1;\n\t\tthis.init();\n\t}\n\n\t/**\r\n * Initialise the carousel\r\n */\n\n\t_createClass(Carousel, [{\n\t\tkey: 'init',\n\t\tvalue: function init() {\n\t\t\tthis.lastPage = this.getLastPage();\n\t\t\tthis.translate3d = window._jgwidget.features.csstransforms3d;\n\t\t\tthis.isInfinite && this.getMaxPage();\n\t\t\tthis.setAperture();\n\t\t\tthis.setControlState();\n\t\t\tthis.bindListeners();\n\t\t\tthis.setCardState();\n\t\t\tthis.isBuffer() && this.loadMoreCards();\n\t\t}\n\n\t\t/**\r\n * Set the aperture of the carousel\r\n * @description Set the size of the aperture based on specified page size. Assumes all cards have the same height.\r\n */\n\t}, {\n\t\tkey: 'setAperture',\n\t\tvalue: function setAperture() {\n\t\t\tvar card = this.aperture.querySelector('[data-card]');\n\t\t\tthis.apertureSize = (card.offsetHeight + parseInt(getComputedStyle(card).marginBottom, 10) + parseInt(getComputedStyle(card).marginTop, 10)) * this.pageSize;\n\t\t\tthis.aperture.style.height = this.apertureSize + 'px';\n\t\t}\n\n\t\t/**\r\n * Get the [current] last page of the carousel\r\n * @description Finds the last page number of the carousel. Subject to update if the carousel is infinite\r\n * @returns {Number} Integer representing the index of the current last carousel page.\r\n */\n\t}, {\n\t\tkey: 'getLastPage',\n\t\tvalue: function getLastPage() {\n\t\t\tvar cardCount = this.aperture.querySelectorAll('[data-card]').length;\n\t\t\treturn parseInt(cardCount / this.pageSize, 10) + (cardCount % this.pageSize > 0 ? 1 : 0);\n\t\t}\n\n\t\t/**\r\n * Get the maximum page of the carousel\r\n * @description For infinite carousels, finds the maximum possible page number of the carousel\r\n */\n\t}, {\n\t\tkey: 'getMaxPage',\n\t\tvalue: function getMaxPage() {\n\t\t\tthis.maxPage = parseInt(parseInt(this.view.model.$model.pagination.totalResults, 10) / this.pageSize, 10) + (this.view.model.$model.pagination.totalResults % this.pageSize > 0 ? 1 : 0);\n\t\t}\n\n\t\t/**\r\n * Set a flag when all possible data has been fetched\r\n * @description For infinite carousels, sets a flag when the last API page has been fetched and added to the model's collection\r\n */\n\t}, {\n\t\tkey: 'setMaxLoaded',\n\t\tvalue: function setMaxLoaded() {\n\t\t\tif (this.isMaxLoaded) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.isMaxLoaded = this.currentPage === this.maxPage;\n\t\t}\n\n\t\t/**\r\n * Bind event listeners\r\n * @description Bind event listeners to DOM nodes for carousel user interaction\r\n */\n\t}, {\n\t\tkey: 'bindListeners',\n\t\tvalue: function bindListeners() {\n\t\t\tvar _this = this;\n\n\t\t\tthis.btnNext.addEventListener('click', function () {\n\t\t\t\treturn _this.showNextPage();\n\t\t\t});\n\t\t\tthis.btnPrev.addEventListener('click', function () {\n\t\t\t\treturn _this.showPrevPage();\n\t\t\t});\n\n\t\t\t//Swipe with Hammer\n\t\t\tif (this.swipe) {\n\t\t\t\tvar hammer = new Hammer(this.strip, {\n\t\t\t\t\tvelocity: 0.15\n\t\t\t\t});\n\t\t\t\tif (this.swipe === 'vertical') {\n\t\t\t\t\thammer.get('swipe').set({ direction: Hammer.DIRECTION_VERTICAL });\n\t\t\t\t\thammer.on('swipe', function (e) {\n\t\t\t\t\t\te.direction === 8 && _this.showNextPage();\n\t\t\t\t\t\te.direction === 16 && _this.showPrevPage();\n\t\t\t\t\t});\n\t\t\t\t} else if (this.swipe === 'horizontal') {\n\t\t\t\t\thammer.on('swipeleft', function () {\n\t\t\t\t\t\treturn _this.showNextPage();\n\t\t\t\t\t});\n\t\t\t\t\thammer.on('swiperight', function () {\n\t\t\t\t\t\treturn _this.showPrevPage();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n * Set state of carousel controls\r\n * @description Set the state of carousel controls [enabled, disabled] based on current carousel page\r\n */\n\t}, {\n\t\tkey: 'setControlState',\n\t\tvalue: function setControlState() {\n\t\t\tif (this.currentPage === 1) {\n\t\t\t\tthis.btnPrev.setAttribute('disabled', 'disabled');\n\t\t\t\tthis.btnPrev.setAttribute('aria-disabled', 'true');\n\t\t\t\tthis.btnPrev.classList.add('is-disabled');\n\t\t\t} else {\n\t\t\t\tthis.btnPrev.removeAttribute('disabled');\n\t\t\t\tthis.btnPrev.removeAttribute('aria-disabled');\n\t\t\t\tthis.btnPrev.classList.remove('is-disabled');\n\t\t\t}\n\t\t\tif (this.currentPage === this.lastPage) {\n\t\t\t\tthis.btnNext.setAttribute('disabled', 'disabled');\n\t\t\t\tthis.btnNext.setAttribute('aria-disabled', 'true');\n\t\t\t\tthis.btnNext.classList.add('is-disabled');\n\t\t\t} else {\n\t\t\t\tthis.btnNext.removeAttribute('disabled');\n\t\t\t\tthis.btnNext.removeAttribute('aria-disabled');\n\t\t\t\tthis.btnNext.classList.remove('is-disabled');\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n * Show the next page of the carousel\r\n * @description Transition the list to show the next page; fetch more cards if we are on the buffer page [infinite carousels]; \r\n * set max loaded flag; set controller state; set cards state and fire analytics impressions for newly visible cards\r\n */\n\t}, {\n\t\tkey: 'showNextPage',\n\t\tvalue: function showNextPage() {\n\t\t\tif (this.currentPage + 1 > this.lastPage) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.transition(this.apertureSize * this.currentPage);\n\t\t\tthis.currentPage += 1;\n\n\t\t\tif (this.isBuffer()) {\n\t\t\t\tthis.loadMoreCards();\n\t\t\t} else {\n\t\t\t\tthis.setControlState();\n\t\t\t}\n\t\t\tthis.setMaxLoaded();\n\t\t\tthis.setCardState();\n\t\t\tthis.widget.analytics.cardImpressions();\n\t\t}\n\n\t\t/**\r\n * Show the previous page of the carousel\r\n * @description Transition the list to show the previous page; set controller state;\r\n * set cards state and fire analytics impressions for newly visible cards\r\n */\n\t}, {\n\t\tkey: 'showPrevPage',\n\t\tvalue: function showPrevPage() {\n\t\t\tif (this.currentPage - 1 < 1) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.currentPage -= 1;\n\t\t\tthis.transition(this.apertureSize * this.currentPage - this.apertureSize);\n\t\t\tthis.setControlState();\n\t\t\tthis.setCardState();\n\t\t\tthis.widget.analytics.cardImpressions();\n\t\t}\n\n\t\t/**\r\n * Transition the list\r\n * @description Transition the list to show new cards, using either 'transform translate3d' if supported or 'top' otherwise.\r\n * Assumes the list has a transition CSS property registered against 'all' or 'top' and 'transform'\r\n */\n\t}, {\n\t\tkey: 'transition',\n\t\tvalue: function transition(top) {\n\t\t\tif (this.translate3d) {\n\t\t\t\tthis.strip.style[(0, _jsDOMGetVendorProperty2['default'])('transform')] = 'translate3d(0, -' + top + 'px, 0)';\n\t\t\t} else {\n\t\t\t\tthis.strip.style.top = '-' + top + 'px';\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n * Set the current state flags of the cards\r\n * @description Reset all cards to hidden [aria-, data-]; set visible cards to 'visible' [aria-, data-]\r\n */\n\t}, {\n\t\tkey: 'setCardState',\n\t\tvalue: function setCardState() {\n\t\t\tthis.firstCard = this.currentPage * this.pageSize - this.pageSize;\n\t\t\tthis.lastCard = this.firstCard + (this.pageSize - 1);\n\n\t\t\t[].slice.call(this.el.querySelectorAll('[data-card]')).forEach(function (card) {\n\t\t\t\tcard.setAttribute('aria-hidden', 'true');\n\t\t\t\tcard.setAttribute('data-hidden', 'true');\n\t\t\t});\n\n\t\t\tfor (var i = this.firstCard; i < this.lastCard + 1; i++) {\n\t\t\t\tvar card = this.el.querySelectorAll('[data-card]')[i];\n\t\t\t\tif (!card) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tcard.setAttribute('aria-hidden', 'false');\n\t\t\t\tcard.removeAttribute('data-hidden');\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n * Check if we are on buffer page\r\n * @description Check if we are on the carousel page set as nextPageBuffer\r\n */\n\t}, {\n\t\tkey: 'isBuffer',\n\t\tvalue: function isBuffer() {\n\t\t\treturn this.isInfinite && this.currentPage === this.lastPage - this.nextPageBuffer && !this.isMaxLoaded;\n\t\t}\n\n\t\t/**\r\n * Load more cards fetched from the server [infinite carousels]\r\n * @description Trigger the view to fetch and append the next API page of results [cards]; set controls state whilst data is\r\n * being loaded; once loaded trigger new analytics cards initialise; update carousel and card state variables; revert\r\n * controls states\r\n */\n\t}, {\n\t\tkey: 'loadMoreCards',\n\t\tvalue: function loadMoreCards() {\n\t\t\tvar _this2 = this;\n\n\t\t\tthis.btnNext.classList.add('is-loading', 'is-disabled');\n\t\t\tthis.btnNext.setAttribute('disabled', 'disabled');\n\t\t\tthis.view.appendNextPage().then(function () {\n\t\t\t\t_this2.widget.analytics.cardsInit();\n\t\t\t\t_this2.lastPage = _this2.getLastPage();\n\t\t\t\t_this2.setCardState();\n\t\t\t\t_this2.setControlState();\n\t\t\t\t_this2.btnNext.classList.remove('is-loading', 'is-disabled');\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n * Reset the carousel to first page\r\n * @description Reset the carousel to show the first page; reset all carousel state variables and set controls state;\r\n * check if we are on buffer page and if true load more cards\r\n */\n\t}, {\n\t\tkey: 'reset',\n\t\tvalue: function reset() {\n\t\t\tthis.transition(0);\n\t\t\tthis.currentPage = 1;\n\t\t\tthis.lastPage = this.getLastPage();\n\t\t\tthis.isMaxLoaded = false;\n\t\t\tthis.setControlState();\n\t\t\tthis.setCardState();\n\t\t\tthis.isBuffer() && this.loadMoreCards();\n\t\t}\n\n\t\t/**\r\n * Refresh the carousel\r\n * @description Update carousel state variables last page\r\n */\n\t}, {\n\t\tkey: 'refresh',\n\t\tvalue: function refresh() {\n\t\t\tthis.lastPage = this.getLastPage();\n\t\t}\n\t}]);\n\n\treturn Carousel;\n})();\n\nexports['default'] = Carousel;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvY2Fyb3VzZWwvQ2Fyb3VzZWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7c0NBR2lCLDZCQUE2Qjs7Ozs7Ozs7Ozs7Ozs7OztBQUQzRCxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7O0lBZTNCLFFBQVE7QUFDRCxVQURQLFFBQVEsR0FDMEU7bUVBQUwsRUFBRTs7TUFBcEUsSUFBSSxRQUFKLElBQUk7TUFBRSxNQUFNLFFBQU4sTUFBTTtNQUFFLFFBQVEsUUFBUixRQUFRO01BQUUsVUFBVSxRQUFWLFVBQVU7TUFBRSxjQUFjLFFBQWQsY0FBYztNQUFFLEVBQUUsUUFBRixFQUFFO01BQUUsS0FBSyxRQUFMLEtBQUs7O3dCQUR4RSxRQUFROztBQUVaLE1BQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLE1BQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3JCLE1BQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLENBQUMsQ0FBQztBQUM5QixNQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztBQUM3QixNQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNuQixNQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsSUFBSSxDQUFDLENBQUM7QUFDMUMsTUFBSSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFFLEVBQUUsQ0FBRSxDQUFDO0FBQ3ZDLE1BQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUc7QUFDN0MsVUFBTztHQUNQO0FBQ0QsTUFBSSxD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T0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQztBQUN4RCxPQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDbEQsT0FBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUUsWUFBTTtBQUN0QyxXQUFLLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDbEMsV0FBSyxRQUFRLEdBQUcsT0FBSyxXQUFXLEVBQUUsQ0FBQztBQUNuQyxXQUFLLFlBQVksRUFBRSxDQUFDO0FBQ3BCLFdBQUssZUFBZSxFQUFFLENBQUM7QUFDdkIsV0FBSyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDM0QsQ0FBQyxDQUFDO0dBQ0g7Ozs7Ozs7OztTQU1LLGlCQUFHO0FBQ1IsT0FBSSxDQUFDLFVBQVUsQ0FBRSxDQUFDLENBQUUsQ0FBQztBQUNyQixPQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztBQUNyQixPQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNuQyxPQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztBQUN6QixPQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7QUFDdkIsT0FBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ3BCLE9BQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7R0FDeEM7Ozs7Ozs7O1NBS08sbUJBQUc7QUFDVixPQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztHQUNuQzs7O1FBM09JLFFBQVE7OztxQkE4T0MsUUFBUSIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9mdW5kcmFpc2VyLWxlYWRlcmJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2Nhcm91c2VsL0Nhcm91c2VsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG5cclxubGV0IEhhbW1lciA9IHJlcXVpcmUoJ2hhbW1lcmpzJyk7XHJcbmltcG9ydCBnZXRWZW5kb3JQcm9wZXJ0eSBmcm9tICcuLi9qcy9ET00vZ2V0VmVuZG9yUHJvcGVydHknO1xyXG5cclxuLyoqXHJcbiAqIEFkZCBhIGNhcm91c2VsIHRvIGEgbGlzdCB2aWV3XHJcbiAqIEBjbGFzc2Rlc2MgQWRkIGEgY2Fyb3VzZWwgZm9yIHBhZ2luYXRpb24gb2YgY2FyZCBsaXN0IHZpZXdzXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLnZpZXcuIFRoZSB2aWV3IHRoYXQgdGhlIGNhcm91c2VsIHBhZ2luYXRlcyBbcmVxdWlyZWRdXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLndpZGdldC4gVGhlIHdpZGdldCBpbnN0YW5jZSBbcmVxdWlyZWRdXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLnBhZ2VTaXplLiBUaGUgbnVtYmVyIG9mIGxpc3QgaXRlbXMgdG8gc2hvdyBpbiBlYWNoIGNhcm91c2VsIHBhZ2VcclxuICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLmlzSW5maW5pdGUuIFdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gZGlzcGxheWVkIGlzIHBhZ2luYXRlZCBvbiB0aGUgUkVTVCBBUElcclxuICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMubmV4dFBhZ2VCdWZmZXIuIE51bWJlciBvZiBjYXJvdXNlbCBwYWdlcyBiZWZvcmUgdGhlIGxhc3QgYXQgd2hpY2ggdG8gZmV0Y2ggbmV4dCBBUEkgcGFnZS5cclxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuZWwuIFRoZSBjYXJvdXNlbCBwYXJlbnQgZWxlbWVudFxyXG4gKiBAY2xhc3MgU2V0IGNhcm91c2VsIGluc3RhbmNlIHByb3BlcnRpZXM7IGNhY2hlIGFwZXJ0dXJlLCBjb250cm9sIGFuZCBsaXN0IGVsZW1lbnRzOyBzZXQgY3VycmVudCBwYWdlOyBcclxuICovXHJcbmNsYXNzIENhcm91c2VsIHtcclxuXHRjb25zdHJ1Y3RvciAoIHsgdmlldywgd2lkZ2V0LCBwYWdlU2l6ZSwgaXNJbmZpbml0ZSwgbmV4dFBhZ2VCdWZmZXIsIGVsLCBzd2lwZSB9ID0ge30gKSB7XHJcblx0XHR0aGlzLnZpZXcgPSB2aWV3O1xyXG5cdFx0dGhpcy53aWRnZXQgPSB3aWRnZXQ7XHJcblx0XHR0aGlzLnBhZ2VTaXplID0gcGFnZVNpemUgfHwgMztcclxuXHRcdHRoaXMuaXNJbmZpbml0ZSA9IGlzSW5maW5pdGU7XHJcblx0XHR0aGlzLnN3aXBlID0gc3dpcGU7XHJcblx0XHR0aGlzLm5leHRQYWdlQnVmZmVyID0gbmV4dFBhZ2VCdWZmZXIgfHwgMjtcclxuXHRcdHRoaXMuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBlbCApO1xyXG5cdFx0aWYgKCAhdGhpcy5lbCB8fCAhdGhpcy53aWRnZXQgfHwgIXRoaXMudmlldyApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy52aWV3LmNhcm91c2VsID0gdGhpcztcclxuXHRcdHRoaXMuYXBlcnR1cmUgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhcm91c2VsLWFwZXJ0dXJlXScpO1xyXG5cdFx0dGhpcy5idG5OZXh0ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jb250cm9sLW5leHRdJyk7XHJcblx0XHR0aGlzLmJ0blByZXYgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNvbnRyb2wtcHJldl0nKTtcclxuXHRcdHRoaXMuc3RyaXAgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhcm91c2VsLWxpc3RdJyk7XHJcblx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBJbml0aWFsaXNlIHRoZSBjYXJvdXNlbFxyXG5cdCAqL1xyXG5cdGluaXQgKCkge1xyXG5cdFx0dGhpcy5sYXN0UGFnZSA9IHRoaXMuZ2V0TGFzdFBhZ2UoKTtcclxuXHRcdHRoaXMudHJhbnNsYXRlM2QgPSB3aW5kb3cuX2pnd2lkZ2V0LmZlYXR1cmVzLmNzc3RyYW5zZm9ybXMzZDtcclxuXHRcdHRoaXMuaXNJbmZpbml0ZSAmJiB0aGlzLmdldE1heFBhZ2UoKTtcclxuXHRcdHRoaXMuc2V0QXBlcnR1cmUoKTtcclxuXHRcdHRoaXMuc2V0Q29udHJvbFN0YXRlKCk7XHJcblx0XHR0aGlzLmJpbmRMaXN0ZW5lcnMoKTtcclxuXHRcdHRoaXMuc2V0Q2FyZFN0YXRlKCk7XHJcblx0XHR0aGlzLmlzQnVmZmVyKCkgJiYgdGhpcy5sb2FkTW9yZUNhcmRzKCk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFNldCB0aGUgYXBlcnR1cmUgb2YgdGhlIGNhcm91c2VsXHJcblx0ICogQGRlc2NyaXB0aW9uIFNldCB0aGUgc2l6ZSBvZiB0aGUgYXBlcnR1cmUgYmFzZWQgb24gc3BlY2lmaWVkIHBhZ2Ugc2l6ZS4gQXNzdW1lcyBhbGwgY2FyZHMgaGF2ZSB0aGUgc2FtZSBoZWlnaHQuXHJcblx0ICovXHJcblx0c2V0QXBlcnR1cmUgKCkge1xyXG5cdFx0bGV0IGNhcmQgPSB0aGlzLmFwZXJ0dXJlLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhcmRdJyk7XHJcblx0XHR0aGlzLmFwZXJ0dXJlU2l6ZSA9IChjYXJkLm9mZnNldEhlaWdodCArIFxyXG5cdFx0XHRwYXJzZUludCggZ2V0Q29tcHV0ZWRTdHlsZShjYXJkKS5tYXJnaW5Cb3R0b20sIDEwICkgKyBcclxuXHRcdFx0cGFyc2VJbnQoIGdldENvbXB1dGVkU3R5bGUoY2FyZCkubWFyZ2luVG9wLCAxMCkpICogXHJcblx0XHRcdHRoaXMucGFnZVNpemU7XHJcblx0XHR0aGlzLmFwZXJ0dXJlLnN0eWxlLmhlaWdodCA9IGAke3RoaXMuYXBlcnR1cmVTaXplfXB4YDtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogR2V0IHRoZSBbY3VycmVudF0gbGFzdCBwYWdlIG9mIHRoZSBjYXJvdXNlbFxyXG5cdCAqIEBkZXNjcmlwdGlvbiBGaW5kcyB0aGUgbGFzdCBwYWdlIG51bWJlciBvZiB0aGUgY2Fyb3VzZWwuIFN1YmplY3QgdG8gdXBkYXRlIGlmIHRoZSBjYXJvdXNlbCBpcyBpbmZpbml0ZVxyXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IEludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBsYXN0IGNhcm91c2VsIHBhZ2UuXHJcblx0ICovXHJcblx0Z2V0TGFzdFBhZ2UgKCkge1xyXG5cdFx0bGV0IGNhcmRDb3VudCA9IHRoaXMuYXBlcnR1cmUucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY2FyZF0nKS5sZW5ndGg7XHJcblx0XHRyZXR1cm4gcGFyc2VJbnQoIGNhcmRDb3VudCAvIHRoaXMucGFnZVNpemUsIDEwICkgKyAoIGNhcmRDb3VudCAlIHRoaXMucGFnZVNpemUgPiAwID8gMSA6IDAgKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogR2V0IHRoZSBtYXhpbXVtIHBhZ2Ugb2YgdGhlIGNhcm91c2VsXHJcblx0ICogQGRlc2NyaXB0aW9uIEZvciBpbmZpbml0ZSBjYXJvdXNlbHMsIGZpbmRzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHBhZ2UgbnVtYmVyIG9mIHRoZSBjYXJvdXNlbFxyXG5cdCAqL1xyXG5cdGdldE1heFBhZ2UgKCkge1xyXG5cdFx0dGhpcy5tYXhQYWdlID0gcGFyc2VJbnQoIHBhcnNlSW50KCB0aGlzLnZpZXcubW9kZWwuJG1vZGVsLnBhZ2luYXRpb24udG90YWxSZXN1bHRzLCAxMCApIC8gdGhpcy5wYWdlU2l6ZSwgMTAgKSArIFxyXG5cdFx0XHQodGhpcy52aWV3Lm1vZGVsLiRtb2RlbC5wYWdpbmF0aW9uLnRvdGFsUmVzdWx0cyAlIHRoaXMucGFnZVNpemUgPiAwID8gMSA6IDApO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBTZXQgYSBmbGFnIHdoZW4gYWxsIHBvc3NpYmxlIGRhdGEgaGFzIGJlZW4gZmV0Y2hlZFxyXG5cdCAqIEBkZXNjcmlwdGlvbiBGb3IgaW5maW5pdGUgY2Fyb3VzZWxzLCBzZXRzIGEgZmxhZyB3aGVuIHRoZSBsYXN0IEFQSSBwYWdlIGhhcyBiZWVuIGZldGNoZWQgYW5kIGFkZGVkIHRvIHRoZSBtb2RlbCdzIGNvbGxlY3Rpb25cclxuXHQgKi9cclxuXHRzZXRNYXhMb2FkZWQgKCkge1xyXG5cdFx0aWYgKCB0aGlzLmlzTWF4TG9hZGVkICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHR0aGlzLmlzTWF4TG9hZGVkID0gdGhpcy5jdXJyZW50UGFnZSA9PT0gdGhpcy5tYXhQYWdlO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBCaW5kIGV2ZW50IGxpc3RlbmVyc1xyXG5cdCAqIEBkZXNjcmlwdGlvbiBCaW5kIGV2ZW50IGxpc3RlbmVycyB0byBET00gbm9kZXMgZm9yIGNhcm91c2VsIHVzZXIgaW50ZXJhY3Rpb25cclxuXHQgKi9cclxuXHRiaW5kTGlzdGVuZXJzICgpIHtcclxuXHRcdHRoaXMuYnRuTmV4dC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc2hvd05leHRQYWdlKCkgKTtcclxuXHRcdHRoaXMuYnRuUHJldi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc2hvd1ByZXZQYWdlKCkgKTtcclxuXHRcdFxyXG5cdFx0Ly9Td2lwZSB3aXRoIEhhbW1lclxyXG5cdFx0aWYgKCB0aGlzLnN3aXBlICkge1xyXG5cdFx0XHRsZXQgaGFtbWVyID0gbmV3IEhhbW1lcih0aGlzLnN0cmlwLCB7XHJcblx0XHRcdFx0dmVsb2NpdHk6IDAuMTVcclxuXHRcdFx0fSk7XHJcblx0XHRcdGlmICggdGhpcy5zd2lwZSA9PT0gJ3ZlcnRpY2FsJyApIHtcclxuXHRcdFx0XHRoYW1tZXIuZ2V0KCdzd2lwZScpLnNldCh7IGRpcmVjdGlvbjogSGFtbWVyLkRJUkVDVElPTl9WRVJUSUNBTCB9KTtcclxuXHRcdFx0XHRoYW1tZXIub24oJ3N3aXBlJywgKGUpID0+IHtcclxuXHRcdFx0XHRcdGUuZGlyZWN0aW9uID09PSA4ICYmIHRoaXMuc2hvd05leHRQYWdlKCk7XHJcblx0XHRcdFx0XHRlLmRpcmVjdGlvbiA9PT0gMTYgJiYgdGhpcy5zaG93UHJldlBhZ2UoKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSBlbHNlIGlmICggdGhpcy5zd2lwZSA9PT0gJ2hvcml6b250YWwnICkge1xyXG5cdFx0XHRcdGhhbW1lci5vbignc3dpcGVsZWZ0JywgKCkgPT4gdGhpcy5zaG93TmV4dFBhZ2UoKSApO1xyXG5cdFx0XHRcdGhhbW1lci5vbignc3dpcGVyaWdodCcsICgpID0+IHRoaXMuc2hvd1ByZXZQYWdlKCkgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHQvKipcclxuXHQgKiBTZXQgc3RhdGUgb2YgY2Fyb3VzZWwgY29udHJvbHNcclxuXHQgKiBAZGVzY3JpcHRpb24gU2V0IHRoZSBzdGF0ZSBvZiBjYXJvdXNlbCBjb250cm9scyBbZW5hYmxlZCwgZGlzYWJsZWRdIGJhc2VkIG9uIGN1cnJlbnQgY2Fyb3VzZWwgcGFnZVxyXG5cdCAqL1xyXG5cdHNldENvbnRyb2xTdGF0ZSAoKSB7XHJcblx0XHRpZiAodGhpcy5jdXJyZW50UGFnZSA9PT0gMSkge1xyXG5cdFx0XHR0aGlzLmJ0blByZXYuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG5cdFx0XHR0aGlzLmJ0blByZXYuc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgJ3RydWUnKTtcclxuXHRcdFx0dGhpcy5idG5QcmV2LmNsYXNzTGlzdC5hZGQoJ2lzLWRpc2FibGVkJyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmJ0blByZXYucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG5cdFx0XHR0aGlzLmJ0blByZXYucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJyk7XHJcblx0XHRcdHRoaXMuYnRuUHJldi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1kaXNhYmxlZCcpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuY3VycmVudFBhZ2UgPT09IHRoaXMubGFzdFBhZ2UpIHtcclxuXHRcdFx0dGhpcy5idG5OZXh0LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxuXHRcdFx0dGhpcy5idG5OZXh0LnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsICd0cnVlJyk7XHJcblx0XHRcdHRoaXMuYnRuTmV4dC5jbGFzc0xpc3QuYWRkKCdpcy1kaXNhYmxlZCcpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5idG5OZXh0LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuXHRcdFx0dGhpcy5idG5OZXh0LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcpO1xyXG5cdFx0XHR0aGlzLmJ0bk5leHQuY2xhc3NMaXN0LnJlbW92ZSgnaXMtZGlzYWJsZWQnKTtcclxuXHRcdH1cclxuXHR9XHJcblx0LyoqXHJcblx0ICogU2hvdyB0aGUgbmV4dCBwYWdlIG9mIHRoZSBjYXJvdXNlbFxyXG5cdCAqIEBkZXNjcmlwdGlvbiBUcmFuc2l0aW9uIHRoZSBsaXN0IHRvIHNob3cgdGhlIG5leHQgcGFnZTsgZmV0Y2ggbW9yZSBjYXJkcyBpZiB3ZSBhcmUgb24gdGhlIGJ1ZmZlciBwYWdlIFtpbmZpbml0ZSBjYXJvdXNlbHNdOyBcclxuXHQgKiBzZXQgbWF4IGxvYWRlZCBmbGFnOyBzZXQgY29udHJvbGxlciBzdGF0ZTsgc2V0IGNhcmRzIHN0YXRlIGFuZCBmaXJlIGFuYWx5dGljcyBpbXByZXNzaW9ucyBmb3IgbmV3bHkgdmlzaWJsZSBjYXJkc1xyXG5cdCAqL1xyXG5cdHNob3dOZXh0UGFnZSAoKSB7XHJcblx0XHRpZiAoIHRoaXMuY3VycmVudFBhZ2UgKyAxID4gdGhpcy5sYXN0UGFnZSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9IFxyXG5cdFx0dGhpcy50cmFuc2l0aW9uKCB0aGlzLmFwZXJ0dXJlU2l6ZSAqIHRoaXMuY3VycmVudFBhZ2UgKTtcclxuXHRcdHRoaXMuY3VycmVudFBhZ2UgKz0gMTtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNCdWZmZXIoKSApIHtcclxuXHRcdFx0dGhpcy5sb2FkTW9yZUNhcmRzKCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnNldENvbnRyb2xTdGF0ZSgpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5zZXRNYXhMb2FkZWQoKTtcclxuXHRcdHRoaXMuc2V0Q2FyZFN0YXRlKCk7XHJcblx0XHR0aGlzLndpZGdldC5hbmFseXRpY3MuY2FyZEltcHJlc3Npb25zKCk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFNob3cgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIGNhcm91c2VsXHJcblx0ICogQGRlc2NyaXB0aW9uIFRyYW5zaXRpb24gdGhlIGxpc3QgdG8gc2hvdyB0aGUgcHJldmlvdXMgcGFnZTsgc2V0IGNvbnRyb2xsZXIgc3RhdGU7XHJcblx0ICogc2V0IGNhcmRzIHN0YXRlIGFuZCBmaXJlIGFuYWx5dGljcyBpbXByZXNzaW9ucyBmb3IgbmV3bHkgdmlzaWJsZSBjYXJkc1xyXG5cdCAqL1xyXG5cdHNob3dQcmV2UGFnZSAoKSB7XHJcblx0XHRpZiAoIHRoaXMuY3VycmVudFBhZ2UgLSAxIDwgMSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHR0aGlzLmN1cnJlbnRQYWdlIC09IDE7XHJcblx0XHR0aGlzLnRyYW5zaXRpb24oICh0aGlzLmFwZXJ0dXJlU2l6ZSAqIHRoaXMuY3VycmVudFBhZ2UpIC0gdGhpcy5hcGVydHVyZVNpemUgKTtcclxuXHRcdHRoaXMuc2V0Q29udHJvbFN0YXRlKCk7XHJcblx0XHR0aGlzLnNldENhcmRTdGF0ZSgpO1xyXG5cdFx0dGhpcy53aWRnZXQuYW5hbHl0aWNzLmNhcmRJbXByZXNzaW9ucygpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBUcmFuc2l0aW9uIHRoZSBsaXN0XHJcblx0ICogQGRlc2NyaXB0aW9uIFRyYW5zaXRpb24gdGhlIGxpc3QgdG8gc2hvdyBuZXcgY2FyZHMsIHVzaW5nIGVpdGhlciAndHJhbnNmb3JtIHRyYW5zbGF0ZTNkJyBpZiBzdXBwb3J0ZWQgb3IgJ3RvcCcgb3RoZXJ3aXNlLlxyXG5cdCAqIEFzc3VtZXMgdGhlIGxpc3QgaGFzIGEgdHJhbnNpdGlvbiBDU1MgcHJvcGVydHkgcmVnaXN0ZXJlZCBhZ2FpbnN0ICdhbGwnIG9yICd0b3AnIGFuZCAndHJhbnNmb3JtJ1xyXG5cdCAqL1xyXG5cdHRyYW5zaXRpb24gKCB0b3AgKSB7XHJcblx0XHRpZiAoIHRoaXMudHJhbnNsYXRlM2QgKSB7XHJcblx0XHRcdHRoaXMuc3RyaXAuc3R5bGVbZ2V0VmVuZG9yUHJvcGVydHkoJ3RyYW5zZm9ybScpXSA9IGB0cmFuc2xhdGUzZCgwLCAtJHt0b3B9cHgsIDApYDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuc3RyaXAuc3R5bGUudG9wID0gYC0ke3RvcH1weGA7XHJcblx0XHR9XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFNldCB0aGUgY3VycmVudCBzdGF0ZSBmbGFncyBvZiB0aGUgY2FyZHNcclxuXHQgKiBAZGVzY3JpcHRpb24gUmVzZXQgYWxsIGNhcmRzIHRvIGhpZGRlbiBbYXJpYS0sIGRhdGEtXTsgc2V0IHZpc2libGUgY2FyZHMgdG8gJ3Zpc2libGUnIFthcmlhLSwgZGF0YS1dXHJcblx0ICovXHJcblx0c2V0Q2FyZFN0YXRlICgpIHtcclxuXHRcdHRoaXMuZmlyc3RDYXJkID0gKCB0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSApIC0gdGhpcy5wYWdlU2l6ZTtcclxuXHRcdHRoaXMubGFzdENhcmQgPSB0aGlzLmZpcnN0Q2FyZCArICggdGhpcy5wYWdlU2l6ZSAtIDEgKTtcclxuXHRcdFxyXG5cdFx0W10uc2xpY2UuY2FsbCggdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jYXJkXScpICkuZm9yRWFjaCgoIGNhcmQgKSA9PiB7XHJcblx0XHRcdGNhcmQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XHJcblx0XHRcdGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLWhpZGRlbicsICd0cnVlJyk7XHJcblx0XHR9KTtcclxuXHRcdFxyXG5cdFx0Zm9yICggbGV0IGkgPSB0aGlzLmZpcnN0Q2FyZDsgaSA8IHRoaXMubGFzdENhcmQgKyAxOyBpKysgKSB7XHJcblx0XHRcdGxldCBjYXJkID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jYXJkXScpW2ldO1xyXG5cdFx0XHRpZiAoIWNhcmQpIHtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fSBcclxuXHRcdFx0Y2FyZC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XHJcblx0XHRcdGNhcmQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWhpZGRlbicpO1xyXG5cdFx0fVx0XHRcdFxyXG5cdH1cclxuXHQvKipcclxuXHQgKiBDaGVjayBpZiB3ZSBhcmUgb24gYnVmZmVyIHBhZ2VcclxuXHQgKiBAZGVzY3JpcHRpb24gQ2hlY2sgaWYgd2UgYXJlIG9uIHRoZSBjYXJvdXNlbCBwYWdlIHNldCBhcyBuZXh0UGFnZUJ1ZmZlclxyXG5cdCAqL1xyXG5cdGlzQnVmZmVyICgpIHtcclxuXHRcdHJldHVybiB0aGlzLmlzSW5maW5pdGUgJiYgdGhpcy5jdXJyZW50UGFnZSA9PT0gKHRoaXMubGFzdFBhZ2UgLSB0aGlzLm5leHRQYWdlQnVmZmVyKSAmJiAhdGhpcy5pc01heExvYWRlZDtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogTG9hZCBtb3JlIGNhcmRzIGZldGNoZWQgZnJvbSB0aGUgc2VydmVyIFtpbmZpbml0ZSBjYXJvdXNlbHNdXHJcblx0ICogQGRlc2NyaXB0aW9uIFRyaWdnZXIgdGhlIHZpZXcgdG8gZmV0Y2ggYW5kIGFwcGVuZCB0aGUgbmV4dCBBUEkgcGFnZSBvZiByZXN1bHRzIFtjYXJkc107IHNldCBjb250cm9scyBzdGF0ZSB3aGlsc3QgZGF0YSBpc1xyXG5cdCAqIGJlaW5nIGxvYWRlZDsgb25jZSBsb2FkZWQgdHJpZ2dlciBuZXcgYW5hbHl0aWNzIGNhcmRzIGluaXRpYWxpc2U7IHVwZGF0ZSBjYXJvdXNlbCBhbmQgY2FyZCBzdGF0ZSB2YXJpYWJsZXM7IHJldmVydFxyXG5cdCAqIGNvbnRyb2xzIHN0YXRlc1xyXG5cdCAqL1xyXG5cdGxvYWRNb3JlQ2FyZHMgKCkge1xyXG5cdFx0dGhpcy5idG5OZXh0LmNsYXNzTGlzdC5hZGQoJ2lzLWxvYWRpbmcnLCAnaXMtZGlzYWJsZWQnKTtcclxuXHRcdHRoaXMuYnRuTmV4dC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcblx0XHR0aGlzLnZpZXcuYXBwZW5kTmV4dFBhZ2UoKS50aGVuKCAoKSA9PiB7XHJcblx0XHRcdHRoaXMud2lkZ2V0LmFuYWx5dGljcy5jYXJkc0luaXQoKTtcclxuXHRcdFx0dGhpcy5sYXN0UGFnZSA9IHRoaXMuZ2V0TGFzdFBhZ2UoKTtcdFxyXG5cdFx0XHR0aGlzLnNldENhcmRTdGF0ZSgpO1xyXG5cdFx0XHR0aGlzLnNldENvbnRyb2xTdGF0ZSgpO1xyXG5cdFx0XHR0aGlzLmJ0bk5leHQuY2xhc3NMaXN0LnJlbW92ZSgnaXMtbG9hZGluZycsICdpcy1kaXNhYmxlZCcpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFJlc2V0IHRoZSBjYXJvdXNlbCB0byBmaXJzdCBwYWdlXHJcblx0ICogQGRlc2NyaXB0aW9uIFJlc2V0IHRoZSBjYXJvdXNlbCB0byBzaG93IHRoZSBmaXJzdCBwYWdlOyByZXNldCBhbGwgY2Fyb3VzZWwgc3RhdGUgdmFyaWFibGVzIGFuZCBzZXQgY29udHJvbHMgc3RhdGU7XHJcblx0ICogY2hlY2sgaWYgd2UgYXJlIG9uIGJ1ZmZlciBwYWdlIGFuZCBpZiB0cnVlIGxvYWQgbW9yZSBjYXJkc1xyXG5cdCAqL1xyXG5cdHJlc2V0ICgpIHtcclxuXHRcdHRoaXMudHJhbnNpdGlvbiggMCApO1xyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLmxhc3RQYWdlID0gdGhpcy5nZXRMYXN0UGFnZSgpO1xyXG5cdFx0dGhpcy5pc01heExvYWRlZCA9IGZhbHNlO1xyXG5cdFx0dGhpcy5zZXRDb250cm9sU3RhdGUoKTtcclxuXHRcdHRoaXMuc2V0Q2FyZFN0YXRlKCk7XHJcblx0XHR0aGlzLmlzQnVmZmVyKCkgJiYgdGhpcy5sb2FkTW9yZUNhcmRzKCk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFJlZnJlc2ggdGhlIGNhcm91c2VsXHJcblx0ICogQGRlc2NyaXB0aW9uIFVwZGF0ZSBjYXJvdXNlbCBzdGF0ZSB2YXJpYWJsZXMgbGFzdCBwYWdlXHJcblx0ICovXHJcblx0cmVmcmVzaCAoKSB7XHJcblx0XHR0aGlzLmxhc3RQYWdlID0gdGhpcy5nZXRMYXN0UGFnZSgpO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ2Fyb3VzZWw7Il19\n},{\"../js/DOM/getVendorProperty\":48,\"hammerjs\":27}],48:[function(require,module,exports){\n'use strict';\n\n/**\r\n * Return the correct vendor-prefixed property name for a given style property\r\n * @param {String} The required property name\r\n * @returns {String} The vendor-prefixed property name\r\n */\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nfunction getVendorProperty(property) {\n var props = {\n transform: ['transform', 'msTransform', 'webkitTransform', 'mozTransform', 'oTransform']\n };\n var vendorProps = props[property].filter(function (prop) {\n if (typeof document.body.style[prop] !== 'undefined') {\n return prop;\n }\n });\n return vendorProps.length ? vendorProps[0] : undefined;\n}\n\nexports['default'] = getVendorProperty;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvRE9NL2dldFZlbmRvclByb3BlcnR5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7OztBQU9iLFNBQVMsaUJBQWlCLENBQUUsUUFBUSxFQUFHO0FBQ3RDLE1BQUksS0FBSyxHQUFHO0FBQ1gsYUFBUyxFQUFFLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDO0dBQ3hGLENBQUM7QUFDQyxNQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQUMsSUFBSSxFQUFLO0FBQ2xELFFBQUksT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxXQUFXLEVBQUU7QUFDL0MsYUFBTyxJQUFJLENBQUM7S0FDZjtHQUNKLENBQUMsQ0FBQztBQUNILFNBQU8sV0FBVyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0NBQzFEOztxQkFFYyxpQkFBaUIiLCJmaWxlIjoiQzovdGVtcC9HRy5Gcm9udEVuZC5XaWRnZXRzL3dpZGdldHMvZnVuZHJhaXNlci1sZWFkZXJib2FyZC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9ET00vZ2V0VmVuZG9yUHJvcGVydHkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG4vKipcclxuICogUmV0dXJuIHRoZSBjb3JyZWN0IHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSBuYW1lIGZvciBhIGdpdmVuIHN0eWxlIHByb3BlcnR5XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBUaGUgcmVxdWlyZWQgcHJvcGVydHkgbmFtZVxyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5IG5hbWVcclxuICovXHJcbmZ1bmN0aW9uIGdldFZlbmRvclByb3BlcnR5KCBwcm9wZXJ0eSApIHtcclxuXHRsZXQgcHJvcHMgPSB7XHJcblx0XHR0cmFuc2Zvcm06IFsndHJhbnNmb3JtJywgJ21zVHJhbnNmb3JtJywgJ3dlYmtpdFRyYW5zZm9ybScsICdtb3pUcmFuc2Zvcm0nLCAnb1RyYW5zZm9ybSddXHJcblx0fTtcclxuICAgIGxldCB2ZW5kb3JQcm9wcyA9IHByb3BzW3Byb3BlcnR5XS5maWx0ZXIoKHByb3ApID0+IHtcclxuICAgIFx0aWYgKHR5cGVvZiBkb2N1bWVudC5ib2R5LnN0eWxlW3Byb3BdICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvcDtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB2ZW5kb3JQcm9wcy5sZW5ndGggPyB2ZW5kb3JQcm9wc1swXSA6IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ2V0VmVuZG9yUHJvcGVydHk7XHJcbiJdfQ==\n},{}],49:[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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvZnJhbWV3b3JrL0FuYWx5dGljcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQVVQLFNBQVM7QUFDRixVQURQLFNBQVMsR0FDOEI7bUVBQUwsRUFBRTs7TUFBekIsTUFBTSxRQUFOLE1BQU07TUFBRSxVQUFVLFFBQVYsVUFBVTs7d0JBRDdCLFNBQVM7O0FBRWIsTUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDckIsTUFBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUc7QUFDbkIsVUFBTztHQUNQO0FBQ0QsTUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLElBQUksRUFBRSxDQUFDO0FBQ25DLE1BQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztFQUNaOzs7Ozs7O2NBUkksU0FBUzs7U0FhVCxnQkFBRztBQUNQLE9BQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBQ2xFLE9BQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtBQUNsQixRQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDdEUsUUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLEdBQzNELFFBQVEsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEYsUUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLEdBQzFELFFBQVEsQ0FBQyxh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LENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3hELE9BQUksR0FBRyxFQUFFO0FBQ1IsUUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2xELGFBQVMsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO0FBQy9CLGFBQVMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUNwRSxhQUFTLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztBQUM1QixhQUFTLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNwRyxRQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQy9DO0dBQ0Q7OztRQXBJSSxTQUFTOzs7cUJBdUlBLFNBQVMiLCJmaWxlIjoiQzovdGVtcC9HRy5Gcm9udEVuZC5XaWRnZXRzL3dpZGdldHMvZnVuZHJhaXNlci1sZWFkZXJib2FyZC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvQW5hbHl0aWNzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG5cclxuLyoqXHJcbiAqIEFkZCBhbmFseXRpY3MgdHJhY2tpbmcgdG8gYSB3aWRnZXRcclxuICogQGNsYXNzZGVzYyBBZGQgYW5hbHl0aWNzIGxpc3RlbmVycyBhbmQgZXZlbnRzIGZvciBba2lzc21ldHJpY3NdIGFuYWx5dGljcyBmcmFtZXdvcmtcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuY29uZmlnLiBIYXNoIG9mIHdpZGdldCBjb25maWcgb3B0aW9uc1xyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy53aWRnZXQuIFRoZSB3aWRnZXQgaW5zdGFuY2UgW3JlcXVpcmVkXVxyXG4gKiBAY2xhc3MgU2V0IGFuYWx5dGljcyBpbnN0YW5jZSBwcm9wZXJ0aWVzOyBpbml0aWFsaXNlIGFuYWx5dGljc1xyXG4gKi9cclxuY2xhc3MgQW5hbHl0aWNzIHtcclxuXHRjb25zdHJ1Y3RvciAoIHsgd2lkZ2V0LCBjb25maWdIYXNoIH0gPSB7fSApIHtcclxuXHRcdHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xyXG5cdFx0aWYgKCAhdGhpcy53aWRnZXQgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHRoaXMuY29uZmlnSGFzaCA9IGNvbmZpZ0hhc2ggfHwge307XHJcblx0XHR0aGlzLmluaXQoKTtcclxuXHR9XHJcblx0LyoqXHJcbiBcdCogSW5pdGlhbGlzZSBhbmFseXRpY3NcclxuIFx0KiBAZGVzY3JpcHRpb24gQ2FjaGUgdGhlIHdpZGdldCBlbGVtZW50OyBmZXRjaCBhbmFseXRpY3MgdmFsdWVzIG9uIHRoZSB3aWRnZXQgZWxlbWVudDsgdHJpZ2dlciBhbmFseXRpY3MgbWV0aG9kc1xyXG4gXHQqL1xyXG5cdGluaXQgKCkge1xyXG5cdFx0dGhpcy53aWRnZXRFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFuYWx5dGljcy13aWRnZXRdJyk7XHJcblx0XHRpZiAodGhpcy53aWRnZXRFbCkge1xyXG5cdFx0XHR0aGlzLndpZGdldE5hbWUgPSB0aGlzLndpZGdldEVsLmdldEF0dHJpYnV0ZSgnZGF0YS1hbmFseXRpY3Mtd2lkZ2V0Jyk7XHJcblx0XHRcdHRoaXMuY2hhcml0eUlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2hhcml0eS1pZF0nKSA/IFxyXG5cdFx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNoYXJpdHktaWRdJykuZ2V0QXR0cmlidXRlKCdkYXRhLWNoYXJpdHktaWQnKSA6ICcnO1xyXG5cdFx0XHR0aGlzLmZycElkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2hhcml0eS1mcnBJZF0nKSA/IFxyXG5cdFx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNoYXJpdHktZnJwSWRdJykuZ2V0QXR0cmlidXRlKCdkYXRhLWNoYXJpdHktZnJwSWQnKSA6ICcnO1xyXG5cdFx0XHRcclxuXHRcdFx0dGhpcy5wdXNoQ29uZmlnKCk7XHJcblx0XHRcdHRoaXMud2lkZ2V0SW5pdCgpO1xyXG5cdFx0XHR0aGlzLmNhcmRzSW5pdCgpO1xyXG5cdFx0XHR0aGlzLmNhcmRJbXByZXNzaW9ucygpO1xyXG5cdFx0fVxyXG5cdH1cdFxyXG5cdC8qKlxyXG4gXHQqIFB1c2ggdXNlciBjb25maWcgaGFzaCBbaW5jbHVkaW5nIHBhcmVudCBwYWdlJ3MgcmVmZXJyZXJdIHRvIGtpc3NtZXRyaWNzIGFzIHByb3BlcnR5XHJcbiBcdCovXHJcblx0cHVzaENvbmZpZyAoKSB7XHJcblx0XHRfa21xLnB1c2goWydzZXQnLCB0aGlzLmNvbmZpZ0hhc2hdKTtcclxuXHR9XHJcblx0LyoqXHJcbiBcdCogSW5pdGlhbGlzZSB3aWRnZXQgYW5hbHl0aWNzIGRhdGEgaGFzaFxyXG4gXHQqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYSBoYXNoIG9mIHdpZGdldC1sZXZlbCBhbmFseXRpY3MgdmFsdWVzOyBzdG9yZSBpdCBvbiB0aGUgd2lkZ2V0IGVsZW1lbnQ7IFxyXG4gXHQqIHJlZ2lzdGVyIGNsaWNrIGxpc3RlbmVyIG9uIHdpZGdldCBlbGVtZW50XHJcbiBcdCovXHJcblx0d2lkZ2V0SW5pdCAoKSB7IFxyXG5cdFx0bGV0IGFuYWx5dGljc0RhdGEgPSB7XHJcblx0XHRcdHBhZ2VfdHlwZTogJ3dpZGdldCcsIC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHQnZXZlbnQnOiAncGFnZSBjbGljaycsXHJcblx0XHRcdGFjdGl2aXR5X3R5cGU6IHRoaXMud2lkZ2V0TmFtZSwgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdGNoYXJpdHlfaWQ6IHRoaXMuY2hhcml0eUlkLCAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0cGFnZV9pZDogdGhpcy5mcnBJZCAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdH07XHJcblx0XHR0aGlzLndpZGdldEVsLmFuYWx5dGljcyA9IGFuYWx5dGljc0RhdGE7XHJcblx0XHRcclxuXHRcdHRoaXMud2lkZ2V0RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoIGUgKSA9PiB7XHJcblx0XHRcdHRoaXMud2lkZ2V0Q2xpY2soIGUgKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBQdXNoIGtpc3NtZXRyaWNzIE5PTi1jYXJkIGNsaWNrIGV2ZW50c1xyXG4gXHQqIEBkZXNjcmlwdGlvbiBIYW5kbGUgbm9uLWNhcmQgY2xpY2sgZXZlbnRzIG9uIHRoZSB3aWRnZXQgdXNpbmcgZXZlbnQgZGVsZWdhdGlvbi4gQ3JlYXRlIGNsaWNrIHZhbHVlcyBoYXNoIGZvciB0YXJnZXQgZWxlbWVudHMgXHJcbiBcdCogYW5kIGZpcmUga2lzc21ldHJpY3MgcGFnZSBjbGljayBldmVudFxyXG4gXHQqL1xyXG4gXHR3aWRnZXRDbGljayAoIGUgKSB7XHJcblx0XHRsZXQgZXZ0ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWFuYWx5dGljcy1ldmVudCcpO1xyXG5cdFx0aWYgKGV2dCkge1xyXG5cdFx0XHRsZXQgY2xpY2tEYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy53aWRnZXRFbC5hbmFseXRpY3MgKTtcclxuXHRcdFx0Y2xpY2tEYXRhLnN1YnR5cGUgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzLXN1YnR5cGUnKTtcclxuXHRcdFx0Y2xpY2tEYXRhLmV2ZW50X3ZhbHVlID0gZXZ0OyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0X2ttcS5wdXNoKFsncmVjb3JkJywgJ3BhZ2UgY2xpY2snLCBjbGlja0RhdGFdKTtcdFx0XHJcblx0XHR9XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIEluaXRpYWxpc2UgY2FyZCBhbmFseXRpY3MgZGF0YSBoYXNoXHJcbiBcdCogQGRlc2NyaXB0aW9uIEZvciBlYWNoIGNhcmQgaW4gdGhlIERPTSBjcmVhdGUgYSBjYXJkIGFuYWx5dGljcyBoYXNoIGFuZCBzdG9yZSBpdCBvbiB0aGUgY2FyZCBbaWYgbm9uZSBhbHJlYWR5IHByZXNlbnRdO1xyXG4gXHQqIGFuZCBhZGQgY2xpY2sgbGlzdG5lclxyXG4gXHQqL1xyXG4gXHRjYXJkc0luaXQgKCkge1xyXG5cdFx0bGV0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYW5hbHl0aWNzLWNhcmRdJyk7XHJcblx0XHRsZXQgc2VsZiA9IHRoaXM7XHJcblx0XHRcclxuXHRcdFtdLnNsaWNlLmNhbGwoIGNhcmRzICkuZm9yRWFjaCgoIGNhcmQsIGluZGV4ICkgPT4ge1xyXG5cdFx0XHRjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1jYXJkLXJhbmsnLCBpbmRleCk7XHJcblx0XHRcdGlmICggIWNhcmQuYW5hbHl0aWNzICkge1xyXG5cdFx0XHRcdGxldCBhbmFseXRpY3NEYXRhID0ge307XHJcblx0XHRcdFx0bGV0IGNoYXJpdHlJZCA9IGNhcmQuZ2V0QXR0cmlidXRlKCdkYXRhLWNoYXJpdHktaWQnKSB8fCAnJztcclxuXHRcdFx0XHRsZXQgYWN0aXZpdHlJZCA9IGNhcmQuZ2V0QXR0cmlidXRlKCdkYXRhLWFjdGl2aXR5LWlkJykgfHwgJyc7XHJcblx0XHRcdFx0bGV0IGNhcmRSYW5rID0gY2FyZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2FyZC1yYW5rJyk7XHJcblx0XHRcdFx0bGV0IGNhcmRGcnBJZCA9IGNhcmQuZ2V0QXR0cmlidXRlKCdkYXRhLWZycC1pZCcpIHx8ICcnO1xyXG5cdFx0XHRcdGxldCBjYXJkVXJsID0gY2FyZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2FyZC11cmwnKSB8fCAnJztcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRhbmFseXRpY3NEYXRhLnBhZ2VfdHlwZSA9ICd3aWRnZXQnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0XHRhbmFseXRpY3NEYXRhLmNhcmRfaWQgPSBgJHt0aGlzLndpZGdldE5hbWV9LSR7Y2hhcml0eUlkfS0ke2FjdGl2aXR5SWR9YDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdFx0YW5hbHl0aWNzRGF0YS5jYXJkX3JhbmsgPSBjYXJkUmFuazsgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdFx0YW5hbHl0aWNzRGF0YS5hY3Rpdml0eV9pZCA9IGFjdGl2aXR5SWQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHRcdGFuYWx5dGljc0RhdGEuYWN0aXZpdHlfdHlwZSA9IHRoaXMud2lkZ2V0TmFtZTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdFx0YW5hbHl0aWNzRGF0YS5jaGFyaXR5X2lkID0gY2hhcml0eUlkOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0XHRhbmFseXRpY3NEYXRhLnBhZ2VfaWQgPSBjYXJkRnJwSWQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHRcdGFuYWx5dGljc0RhdGEuY2FyZF91cmwgPSBjYXJkVXJsOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRjYXJkLmFuYWx5dGljcyA9IGFuYWx5dGljc0RhdGE7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0Y2FyZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICggZSApIHtcclxuXHRcdFx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0XHRzZWxmLmNhcmRDbGljayggZSwgdGhpcyApO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblx0LyoqXHJcbiBcdCogUHVzaCBraXNzbWV0cmljcyBjYXJkIGltcHJlc3Npb25zXHJcbiBcdCogQGRlc2NyaXB0aW9uIEZvciBhbGwgdmlzaWJsZSBjYXJkcywgY3JlYXRlIGEgY2FyZCBpbXByZXNzaW9uIGFuYWx5dGljcyBoYXNoIGFuZCBmaXJlIGEga2lzc21ldHJpY3MgY2FyZCBpbXByZXNzaW9uIGV2ZW50XHJcbiBcdCovXHJcblx0Y2FyZEltcHJlc3Npb25zICgpIHtcclxuXHRcdGxldCBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFuYWx5dGljcy1jYXJkXTpub3QoW2RhdGEtaGlkZGVuXSknKTtcclxuXHRcdFtdLnNsaWNlLmNhbGwoIGNhcmRzICkuZm9yRWFjaCgoIGNhcmQgKSA9PiB7XHJcblx0XHRcdGxldCBpbXByZXNzaW9uRGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGNhcmQuYW5hbHl0aWNzICk7XHJcblx0XHRcdGltcHJlc3Npb25EYXRhLmV2ZW50ID0gJ2ltcHJlc3Npb24nO1xyXG5cdFx0XHRpbXByZXNzaW9uRGF0YS5jYXJkX2NvdW50ID0gY2FyZHMubGVuZ3RoOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0X2ttcS5wdXNoKFsncmVjb3JkJywgJ2ltcHJlc3Npb24nLCBpbXByZXNzaW9uRGF0YV0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIFB1c2gga2lzc21ldHJpY3MgY2FyZCBjbGljayBldmVudHNcclxuIFx0KiBAZGVzY3JpcHRpb24gSGFuZGxlIGNhcmQgY2xpY2sgZXZlbnRzIG9uIHRoZSB3aWRnZXQgdXNpbmcgZXZlbnQgZGVsZWdhdGlvbi4gQ3JlYXRlIGEgY2FyZCBjbGljayB2YWx1ZXMgaGFzaCBmb3IgdGFyZWd0IGNhcmRcclxuIFx0KiBhbmQgZmlyZSBhIGtpc3NtZXRyaWNzIGNhcmQgY2xpY2sgZXZlbnQgXHJcbiBcdCovXHJcblx0Y2FyZENsaWNrICggZSwgY2FyZCApIHtcclxuXHRcdGxldCBldnQgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzLWV2ZW50Jyk7XHJcblx0XHRpZiAoZXZ0KSB7XHJcblx0XHRcdGxldCBjbGlja0RhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBjYXJkLmFuYWx5dGljcyk7XHJcblx0XHRcdGNsaWNrRGF0YS5ldmVudCA9ICdjYXJkIGNsaWNrJztcclxuXHRcdFx0Y2xpY2tEYXRhLnN1YnR5cGUgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzLXN1YnR5cGUnKTtcclxuXHRcdFx0Y2xpY2tEYXRhLmV2ZW50X3ZhbHVlID0gZXZ0OyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0Y2xpY2tEYXRhLmNhcmRfY291bnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hbmFseXRpY3MtY2FyZF06bm90KFtkYXRhLWhpZGRlbl0pJykubGVuZ3RoOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0X2ttcS5wdXNoKFsncmVjb3JkJywgJ2NhcmQgY2xpY2snLCBjbGlja0RhdGFdKTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFuYWx5dGljczsiXX0=\n},{}],50:[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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvZnJhbWV3b3JrL01vZGVsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7OztnQ0FJd0Isc0JBQXNCOzs7Ozs7Ozs7OztBQUYzRCxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDO0FBQzdDLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzs7SUFZbkIsS0FBSztBQUNFLFVBRFAsS0FBSyxHQUM2RTttRUFBTCxFQUFFOztNQUFwRSxNQUFNLFFBQU4sTUFBTTtNQUFFLEdBQUcsUUFBSCxHQUFHO01BQUUsTUFBTSxRQUFOLE1BQU07TUFBRSxXQUFXLFFBQVgsV0FBVztNQUFFLFdBQVcsUUFBWCxXQUFXO01BQUUsY0FBYyxRQUFkLGNBQWM7O3dCQUR4RSxLQUFLOztBQUVULE1BQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3JCLE1BQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2YsTUFBSyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFHO0FBQ2hDLFVBQU87R0FDUDtBQUNELE1BQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2pCLE1BQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFDaEMsTUFBSSxDQUFDLFNBQVMsQ0FBRSxNQUFNLENBQUUsQ0FBQzs7QUFFekIsTUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRyxXQUFXLENBQUM7QUFDbkUsTUFBSyxJQUFJLENBQUMsV0FBVyxFQUFHO0FB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YyxHQUFHLENBQUMsQ0FBQztBQUN4QixZQUFLLFdBQVcsQ0FBRSxJQUFJLENBQUUsQ0FBQyxJQUFJLENBQUUsWUFBTTtBQUNwQyxhQUFPLEVBQUUsQ0FBQztNQUNWLENBQUMsQ0FBQztLQUNILE1BQU07QUFDTixZQUFLLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBRSxZQUFNO0FBQzNCLGFBQU8sRUFBRSxDQUFDO01BQ1YsQ0FBQyxDQUFDO0tBQ0g7SUFDRCxDQUFDLENBQUM7R0FDSDs7O1FBNUdJLEtBQUs7OztxQkErR0ksS0FBSyIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9mdW5kcmFpc2VyLWxlYWRlcmJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9Nb2RlbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmxldCBQcm9taXNlID0gcmVxdWlyZSgnZXM2LXByb21pc2UnKS5Qcm9taXNlO1xyXG5sZXQgeGhyID0gcmVxdWlyZSgneGhyJyk7XHJcbmltcG9ydCB7IHF1ZXJ5U3RyaW5nU3RyaW5naWZ5IH0gZnJvbSAnLi4vdXRpbHMvcXVlcnlTdHJpbmcnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIHdpZGdldCBtb2RlbFxyXG4gKiBAY2xhc3NkZXNjIENyZWF0ZSBhIG1vZGVsIG9iamVjdCBcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMud2lkZ2V0LiBUaGUgd2lkZ2V0IGluc3RhbmNlIFtyZXF1aXJlZF1cclxuICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLmlzUGFnaW5hdGVkLiBXaGV0aGVyIHRoZSBtb2RlbCBjb25zdW1lcyBhIHBhZ2luYXRlZCBSRVNUIEFQSVxyXG4gKiBAY2xhc3MgU3RvcmVzIHRoZSByZXR1cm5lZCBtb2RlbCBkYXRhIGFzIHRoaXMuJG1vZGVsLiBTdG9yZXMgbW9kZWwgVVJMIHBhcmFtZXRlcnMgYXMgdGhpcy5wYXJhbXMuIEZvciBwYWdpbmF0ZWQgbW9kZWxzXHJcbiAqIHN0b3JlcyB0aGUgY29sbGVjdGlvbiBhcyB0aGlzLmNvbGxlY3Rpb24sIHN0b3JlcyB0aGUgbGFzdCBmZXRjaGVkIEFQSSBwYWdlIGFzIHRoaXMubGFzdFJldHVybmVkUGFnZTsgc2V0cyBhcGlQYWdlIHNpemUgdG8gZGVmYXVsdCAxMlxyXG4gKiBzZXRzIHBhZ2VOdW0gYW5kIHBhZ2VTaXplIHBhcmFtcyBvbiB0aGUgbW9kZWwgQVBJIFtpbml0aWFsaXNlcyB0byBwYWdlIDFdXHJcbiAqL1xyXG5jbGFzcyBNb2RlbCB7XHJcblx0Y29uc3RydWN0b3IgKCB7IHdpZGdldCwgdXJsLCBwYXJhbXMsIGlzUGFnaW5hdGVkLCBhcGlQYWdlU2l6ZSwgY29sbGVjdGlvblBhdGggfSA9IHt9ICkge1xyXG5cdFx0dGhpcy53aWRnZXQgPSB3aWRnZXQ7XHJcblx0XHR0aGlzLnVybCA9IHVybDtcclxuXHRcdGlmICggIXRoaXMud2lkZ2V0IHx8ICF0aGlzLnVybCApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy4kbW9kZWwgPSB7fTtcclxuXHRcdHRoaXMucGFyYW1zID0gdGhpcy5wYXJhbXMgfHwge307XHJcblx0XHR0aGlzLnNldFBhcmFtcyggcGFyYW1zICk7XHJcblxyXG5cdFx0dGhpcy5pc1BhZ2luYXRlZCA9IGlzUGFnaW5hdGVkID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IGlzUGFnaW5hdGVkO1xyXG5cdFx0aWYgKCB0aGlzLmlzUGFnaW5hdGVkICkge1xyXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25QYXRoID0gY29sbGVjdGlvblBhdGg7XHJcblx0XHRcdHRoaXMubGFzdFJldHVybmVkUGFnZSA9IFtdO1xyXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24gPSBbXTtcclxuXHRcdFx0dGhpcy5hcGlQYWdlU2l6ZSA9IGFwaVBhZ2VTaXplIHx8IDEyO1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRBcGlQYWdlID0gMTtcclxuXHRcdFx0dGhpcy5sYXN0UGFnZSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0dGhpcy5zZXRQYXJhbXMoe1xyXG5cdFx0XHRcdHBhZ2VOdW06IHRoaXMuY3VycmVudEFwaVBhZ2UsXHJcblx0XHRcdFx0cGFnZVNpemU6IHRoaXMuYXBpUGFnZVNpemUgXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHQvKipcclxuXHQgKiBHZXQgdGhlIG1vZGVsIGRhdGEgZnJvbSB0aGUgUkVTVCBBUEkgW05PTi1wYWdpbmF0ZWQgUkVTVCBBUEkgb25seV1cclxuXHQgKiBAZGVzY3JpcHRpb24gRmV0Y2ggdGhlIGRhdGEgZnJvbSB0aGUgUkVTVCBBUEkgYW5kIHN0b3JlIGFzIHRoaXMuJG1vZGVsXHJcblx0ICovXHJcblx0Z2V0TW9kZWwgKCkge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKCAoIHJlc29sdmUgKSA9PiB7XHJcblx0XHRcdHRoaXMuZmV0Y2hEYXRhKCB0aGlzLnVybCApLnRoZW4oICggZGF0YSApID0+IHtcclxuXHRcdFx0XHR0aGlzLiRtb2RlbCA9IGRhdGE7XHJcblx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBHZXQgdGhlIG5leHQgQVBJIHBhZ2UgZnJvbSB0aGUgUkVTVCBBUEkgW3BhZ2luYXRlZCBSRVNUIEFQSSBvbmx5XVxyXG5cdCAqIEBkZXNjcmlwdGlvbiBGZXRjaCB0aGUgbmV4dCBBUEkgcGFnZSBmcm9tIHRoZSBzZXJ2ZXIsIGJhc2VkIG9uIHRoZSBsYXN0IHBhZ2UgZmV0Y2hlZC4gU3RvcmUgdGhlIHJldHVybmVkIGRhdGFcclxuXHQgKiBhcyB0aGlzLiRtb2RlbDsgYWRkIHRoZSByZXR1cm5lZCBwYWdpbmF0ZWQgZGF0YSBhcyB0byB0aGUgZW5kIG9mIHRoaXMuY29sbGVjdGlvblxyXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IFByb21pc2Ugb2JqZWN0XHJcblx0ICovXHJcblx0Z2V0TmV4dFBhZ2UgKCByZXNldCApIHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSggKCByZXNvbHZlICkgPT4ge1xyXG5cdFx0XHR0aGlzLnBhcmFtcy5wYWdlTnVtID0gdGhpcy5jdXJyZW50QXBpUGFnZSsrO1xyXG5cdFx0XHR0aGlzLmdldE1vZGVsKCkudGhlbiggKCkgPT4ge1xyXG5cdFx0XHRcdGlmICggdGhpcy4kbW9kZWxbdGhpcy5jb2xsZWN0aW9uUGF0aF0ubGVuZ3RoID09PSAwICkge1xyXG5cdFx0XHRcdFx0dGhpcy5sYXN0UGFnZSA9IHRoaXMuY3VycmVudEFwaVBhZ2U7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmICggcmVzZXQgKSB7XHJcblx0XHRcdFx0XHR0aGlzLmNvbGxlY3Rpb24gPSBbXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy5sYXN0UmV0dXJuZWRQYWdlID0gdGhpcy4kbW9kZWxbdGhpcy5jb2xsZWN0aW9uUGF0aF07XHJcblx0XHRcdFx0dGhpcy5jb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9uLmNvbmNhdCggdGhpcy5sYXN0UmV0dXJuZWRQYWdlICk7XHJcblx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1x0XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEFkZCBzdXBwbGllZCBwYXJhbWV0ZXJzIHRvIHRoZSBtb2RlbCBVUkxcclxuXHQgKiBAZGVzY3JpcHRpb24gQ29udmVydCBoYXNoIG9mIHBhcmFtZXRlcnMgdG8gcXVlcnkgc3RyaW5nIGFuZCBhcHBlbmQgdG8gbW9kZWwgdXJsXHJcblx0ICovXHJcblx0c2V0UGFyYW1zICggb2JqICkge1xyXG5cdFx0dGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKCB0aGlzLnBhcmFtcywgb2JqICk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEZldGNoIGRhdGEgZnJvbSB0aGUgc2VydmVyXHJcblx0ICogQGRlc2NyaXB0aW9uIE1ha2UgYSBnZXQgcmVxdWVzdCBmb3IgdGhlIFJFU1QgQVBJIGRhdGFcclxuXHQgKiBAcmV0dXJucyB7T2JqZWN0fSBQcm9taXNlIG9iamVjdFxyXG5cdCAqL1xyXG5cdGZldGNoRGF0YSAoIHVybCApIHtcclxuXHRcdGxldCBxcyA9IHF1ZXJ5U3RyaW5nU3RyaW5naWZ5KCB0aGlzLnBhcmFtcyApO1xyXG5cdFx0Ly9UT0RPOiByZW1vdmUgJiBpZiBubyBxc1xyXG5cdFx0dXJsICs9IGA/Zm9ybWF0PWpzb24mJHtxc31gO1x0XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oIHJlc29sdmUsIHJlamVjdCApIHtcclxuXHRcdFx0eGhyKHtcclxuXHRcdFx0ICAgIHVyaTogdXJsLFxyXG5cdFx0XHQgICAgdXNlWERSOiB0cnVlLFxyXG5cdFx0XHR9LCBmdW5jdGlvbiAoIGVycm9yLCByZXNwb25zZSwgYm9keSApIHtcclxuXHRcdFx0ICAgIGlmICggYm9keSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHQgICAgXHRyZXNvbHZlKCBKU09OLnBhcnNlKGJvZHkpICk7XHJcblx0XHRcdCAgICB9IGVsc2UgaWYgKCBlcnJvciAhPT0gbnVsbCApIHtcclxuXHRcdFx0ICAgIFx0Ly8gYWxlcnQoJ2h0dHAgZXJyb3I6IHN0YXR1cyBjb2RlOiAnICsgcmVzcG9uc2Uuc3RhdHVzQ29kZSArICc7IGVycm9yOiAnICsgZXJyb3IpO1xyXG5cdFx0XHQgICAgXHRyZWplY3QoIEVycm9yKCBlcnJvciApICk7XHJcblx0XHRcdCAgICB9XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFJlZnJlc2ggdGhlIGxvY2FsIG1vZGVsIGFuZCBjb2xsZWN0aW9uXHJcblx0ICogQGRlc2NyaXB0aW9uIFJlLWZldGNoIGFuZCBvdmVyd3JpdGUgdGhlIGxvY2FsIG1vZGVsIGFuZCBjb2xsZWN0aW9uIHdpdGggW2xhdGVzdF0gc2VydmVyIGRhdGFcclxuXHQgKiBAcmV0dXJucyB7T2JqZWN0fSBQcm9taXNlIG9iamVjdFxyXG5cdCAqL1xyXG5cdHJlZnJlc2ggKCkge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKCAoIHJlc29sdmUgKSA9PiB7IFxyXG5cdFx0XHRpZiAoIHRoaXMuaXNQYWdpbmF0ZWQgKSB7XHJcblx0XHRcdFx0dGhpcy5jb2xsZWN0aW9uID0gW107XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50QXBpUGFnZSA9IDE7XHJcblx0XHRcdFx0dGhpcy5nZXROZXh0UGFnZSggdHJ1ZSApLnRoZW4oICgpID0+IHtcclxuXHRcdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmdldE1vZGVsKCkudGhlbiggKCkgPT4ge1xyXG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1vZGVsOyJdfQ==\n},{\"../utils/queryString\":54,\"es6-promise\":24,\"xhr\":42}],51:[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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvZnJhbWV3b3JrL1ZpZXcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7b0NBRVUsNkJBQTZCOzs7Ozs7Ozs7Ozs7O0lBVTlDLElBQUk7QUFDRyxVQURQLElBQUksR0FDdUU7bUVBQUwsRUFBRTs7TUFBN0QsTUFBTSxRQUFOLE1BQU07TUFBRSxFQUFFLFFBQUYsRUFBRTtNQUFFLFFBQVEsUUFBUixRQUFRO01BQUUsS0FBSyxRQUFMLEtBQUs7TUFBRSxZQUFZLFFBQVosWUFBWTtNQUFFLFdBQVcsUUFBWCxXQUFXOzt3QkFEakUsSUFBSTs7QUFFUixNQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNyQixNQUFJLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUUsRUFBRSxDQUFFLENBQUM7QUFDdkMsTUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFFLFFBQVEsQ0FBRSxDQUFDLFNBQVMsQ0FBQztBQUM3RCxNQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNuQixNQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFHO0FBQ2pELFVBQU87R0FDUDtBQUNELE1BQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDakMsTUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7QUFDakMsTUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBRSxXQUFXLENBQUUsR0FBRyxTQUFTLENBQUM7O0FBRW5GLE1BQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztFQUNaOzs7Ozs7O2NBZEksSUFBSTs7U0FtQkgsZ0JBQUc7QUFDUixPQUFLLElBQUksQ0FBQyxZQUFZLEVBQUc7QUFDeEIsUUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3RCO0FBQ0QsT0FBSyxJQUFJLENBQUMsV0FBVyxFQUFHO0FBQ3ZCLFFBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzNCO0dBQ0Q7Ozs7Ozs7O1NBS00sa0JBQW1CO09BQWpCLElBQUkseURBQUMsSUFBSSxDQUFDLElBQUk7O0FBQ3RCLE9BQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLE9BQUksUUFBUSxHQUFHLGtDQUFXLE9BQU8sQ0FBRSxJQUFJLENBQUMsUUFBUSxDQUFFLENBQUM7QUFDbkQsT0FBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFFLElBQUksQ0FBRSxDQUFDO0dBQ3JDOzs7Ozs7Ozs7Ozs7U0FTUyxtQkFBRSxJQUFJLEVBQUUsRUFBRSxFQUFHOzs7QUFDdEIsT0FBSSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUN0QixNQUFHLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFlBQU87QUFDbkMsWUFBUSxDQUFDLGFBQWEsQ0FBRSxFQUFFLENBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ3hDLFVBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFCLENBQUMsQ0FBQztBQUNILE1BQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO0dBQ2Y7Ozs7Ozs7Ozs7U0FPTyxtQkFBRzs7O0FBQ1YsT0FBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ2hGLE9BQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFFLFlBQU07QUFDaEMsV0FBSyxNQUFNLEVBQUUsQ0FBQztBQUNkLFdBQUssV0FBVyxJQUFJLE9BQUssV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ25GLFdBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzFCLFdBQUssUUFBUSxJQUFJLE9BQUssUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3ZDLFdBQUssTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNsQyxXQUFLLE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDeEMsQ0FBQyxDQUFDO0dBQ0g7Ozs7Ozs7U0FJYywwQkFBRzs7O0FBQ2pCLFNBQU0sQ0FBQyxXQUFXLENBQUUsWUFBTTtBQUN6QixXQUFLLE9BQU8sRUFBRSxDQUFDO0lBQ2YsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFFLENBQUM7R0FDdkI7Ozs7Ozs7U0FJbUIsK0JBQUc7OztBQUN0QixPQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxZQUFNO0FBQ2hELFdBQUssT0FBTyxFQUFFLENBQUM7SUFDZixDQUFDLENBQUM7R0FDSDs7Ozs7Ozs7U0FLYywwQkFBRzs7O0FBQ2pCLE9BQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRztBQUM5QixXQUFPO0lBQ1A7QUFDRCxVQUFPLElBQUksT0FBTyxDQUFDLFVBQUUsT0FBTyxFQUFNO0FBQ2pDLFdBQUssS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBRSxZQUFNO0FBQ3BDLFNBQUksUUFBUSxHQUFHLGtDQUFXLE9BQU8sQ0FBRSxPQUFLLFFBQVEsQ0FBRSxDQUFDO0FBQ25ELFNBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUUsS0FBSyxDQUFFLENBQUM7QUFDM0MsU0FBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUM7QUFDaEQsU0FBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7QUFDekIsWUFBTSxFQUFFLE9BQUssS0FBSyxDQUFDLGdCQUFnQjtNQUNuQyxDQUFDLENBQUM7QUFDSCxPQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsUUFBUSxDQUFFLENBQUMsT0FBTyxDQUFDLFVBQUUsRUFBRSxFQUFNO0FBQ2hELGFBQU8sQ0FBQyxXQUFXLENBQUUsRUFBRSxDQUFFLENBQUM7TUFDMUIsQ0FBQyxDQUFDO0FBQ0gsWUFBSyxFQUFFLENBQUMsV0FBVyxDQUFFLE9BQU8sQ0FBRSxDQUFDO0FBQy9CLFlBQU8sRUFBRSxDQUFDO0tBQ1YsQ0FBQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0dBQ0g7OztRQTVHSSxJQUFJOzs7cUJBK0dLLElBQUkiLCJmaWxlIjoiQzovdGVtcC9HRy5Gcm9udEVuZC5XaWRnZXRzL3dpZGdldHMvZnVuZHJhaXNlci1sZWFkZXJib2FyZC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvVmlldy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCBIYW5kbGViYXJzIGZyb20gJy4uLy4uL0hhbmRsZWJhcnMvaGFuZGxlYmFycyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgd2lkZ2V0IHZpZXdcclxuICogQGNsYXNzZGVzYyBDcmVhdGUgYSB2aWV3IG9iamVjdCBcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMud2lkZ2V0LiBUaGUgd2lkZ2V0IGluc3RhbmNlIFtyZXF1aXJlZF1cclxuICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMucG9sbEludGVydmFsLiBJbnRlcnZhbCBpbiBtaWxsc2Vjb25kcyB0byBhdXRvLXJlZnJlc2ggdGhlIHZpZXcncyBkYXRhXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnBvbGxUcmlnZ2VyLiBDU1Mgc2VsZWN0b3IgZm9yIGVsZW1lbnQgdG8gY2xpY2stdHJpZ2dlciBhIHJlZnJlc2ggb2YgdGhlIHZpZXcncyBkYXRhXHJcbiAqIEBjbGFzcyBTZXQgdmlldyBpbnN0YW5jZSBwcm9wZXJ0aWVzIGFuZCBpbml0aWFsaXNlIHZpZXdcclxuICovXHJcbmNsYXNzIFZpZXcge1xyXG5cdGNvbnN0cnVjdG9yICggeyB3aWRnZXQsIGVsLCB0ZW1wbGF0ZSwgbW9kZWwsIHBvbGxJbnRlcnZhbCwgcG9sbFRyaWdnZXIgfSA9IHt9ICkge1xyXG5cdFx0dGhpcy53aWRnZXQgPSB3aWRnZXQ7XHJcblx0XHR0aGlzLmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggZWwgKTtcclxuXHRcdHRoaXMudGVtcGxhdGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCB0ZW1wbGF0ZSApLmlubmVySFRNTDtcclxuXHRcdHRoaXMubW9kZWwgPSBtb2RlbDtcclxuXHRcdGlmICggIXRoaXMud2lkZ2V0IHx8ICF0aGlzLmVsIHx8ICF0aGlzLnRlbXBsYXRlICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHR0aGlzLmNvbmZpZyA9IHRoaXMud2lkZ2V0LmNvbmZpZztcclxuXHRcdHRoaXMucG9sbEludGVydmFsID0gcG9sbEludGVydmFsO1xyXG5cdFx0dGhpcy5wb2xsVHJpZ2dlciA9IHBvbGxUcmlnZ2VyID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggcG9sbFRyaWdnZXIgKSA6IHVuZGVmaW5lZDtcclxuXHRcdFxyXG5cdFx0dGhpcy5pbml0KCk7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIEluaXRpYWxpc2Ugdmlld1xyXG4gXHQqIEBkZXNjcmlwdGlvbiBTdGFydCB2aWV3IG1vZGVsIHVwZGF0ZSBwb2xsZXI7IHJlZ2lzdGVyIHZpZXcgbW9kZWwgdXBkYXRlIHRyaWdnZXJcclxuIFx0Ki9cclxuIFx0aW5pdCAoKSB7XHJcblx0XHRpZiAoIHRoaXMucG9sbEludGVydmFsICkge1xyXG5cdFx0XHR0aGlzLnBvbGxBdEludGVydmFsKCk7XHJcblx0XHR9XHJcblx0XHRpZiAoIHRoaXMucG9sbFRyaWdnZXIgKSB7XHJcblx0XHRcdHRoaXMucmVnaXN0ZXJQb2xsVHJpZ2dlcigpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHQvKipcclxuIFx0KiBSZW5kZXIgdGhlIHZpZXdcclxuIFx0KiBAZGVzY3JpcHRpb24gUmVuZGVyIHRoZSB0ZW1wbGF0ZSB3aXRoIHN1cHBsaWVkIGRhdGEgYW5kIGFwcGVuZCB0byB2aWV3J3MgZWxlbWVudFxyXG4gXHQqL1xyXG5cdHJlbmRlciAoIGRhdGE9dGhpcy5kYXRhICkge1xyXG5cdFx0dGhpcy5kYXRhID0gZGF0YTtcclxuXHRcdGxldCB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMuY29tcGlsZSggdGhpcy50ZW1wbGF0ZSApO1xyXG5cdFx0dGhpcy5lbC5pbm5lckhUTUwgPSB0ZW1wbGF0ZSggZGF0YSApO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBQcmUtbG9hZCBpbWFnZXMgYW5kIHJlc2V0IHRoZSB3aWRnZXQgaGVpZ2h0XHJcbiBcdCogQGRlc2NyaXB0aW9uIFdoZW4gc29tZSBpbWFnZXMgbG9hZCwgdGhlIGhlaWdodCBvZiB0aGUgd2lkZ2V0IG1heSBjaGFuZ2UgYW5kIGEgd2lkZ2V0LnJlc2V0SGVpZ2h0KCkgXHJcbiBcdCogbWF5IG5lZWQgdG8gYmUgZmlyZWQuIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIG1hbmFnZSB0aGUgbG9hZGluZyBvZiB0aGVzZSBpbWFnZXMgdGhhdCBnZW5lcmF0ZSBhIHdpZGdldCBcclxuIFx0KiBkaW1lbnNpb24gY2hhbmdlIHRvIGVuc3VyZSB0aGUgd2lkZ2V0IGhlaWdodCBpcyBhZGFwdGVkIG9uY2UgdGhlIGltYWdlIGhhcyBsb2FkZWRcclxuIFx0KiBAcGFyYW0ge1N0cmluZ30gUGF0aCB0byB0aGUgaW1hZ2UgdG8gbG9hZFxyXG4gXHQqIEBwYXJhbSB7U3RyaW5nfSBVbmlxdWUgY3NzMyBzZWxlY3RvciB0YXJnZXR0aW5nIHRoZSA8aW1nIC8+IGVsZW1lbnQgdG8gbG9hZCB0aGUgcGF0aCBpbnRvXHJcbiBcdCovXHJcblx0bG9hZEltYWdlICggcGF0aCwgZWwgKSB7XHJcblx0XHRsZXQgaW1nID0gbmV3IEltYWdlKCk7XHJcblx0XHRpbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+ICB7IFxyXG5cdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBlbCApLnNyYyA9IHBhdGg7XHJcblx0XHRcdHRoaXMud2lkZ2V0LnJlc2V0SGVpZ2h0KCk7XHJcblx0XHR9KTtcclxuXHRcdGltZy5zcmMgPSBwYXRoO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBSZWZyZXNoIHZpZXcgd2l0aCBsYXRlc3Qgc2VydmVyIGRhdGFcclxuIFx0KiBAZGVzY3JpcHRpb24gU2V0IGNvbnRyb2wgJ2xvYWRpbmcnIENTUyBzdGF0ZSBvbiBwb2xsIHRyaWdnZXI7IHRyaWdnZXIgYSBtb2RlbCByZWZyZXNoOyB0aGVuIHJlLXJlbmRlciB0aHIgdmlldywgXHJcbiBcdCogcmVzZXQgcG9sbCB0cmlnZ2VyIENTUyBzdGF0ZSwgcmVzZXQgd2lkZ2V0IGhlaWdodCwgcmVzZXQgdGhlIHZpZXcncyBjYXJvdXNlbCwgaW5pdGlhbGlzZSBhbmFseXRpY3Mgb24gbmV3IGNhcmRzLFxyXG4gXHQqIGZpcmUgbmV3IGFuYWx5dGljcyBjYXJkIGltcHJlc3Npb25zXHJcbiBcdCovXHJcblx0cmVmcmVzaCAoKSB7XHJcblx0XHR0aGlzLnBvbGxUcmlnZ2VyICYmIHRoaXMucG9sbFRyaWdnZXIuY2xhc3NMaXN0LmFkZCgnaXMtbG9hZGluZycsICdpcy1kaXNhYmxlZCcpOyBcclxuXHRcdHRoaXMubW9kZWwucmVmcmVzaCgpLnRoZW4oICgpID0+IHtcclxuXHRcdFx0dGhpcy5yZW5kZXIoKTtcclxuXHRcdFx0dGhpcy5wb2xsVHJpZ2dlciAmJiB0aGlzLnBvbGxUcmlnZ2VyLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWxvYWRpbmcnLCAnaXMtZGlzYWJsZWQnKTtcclxuXHRcdFx0dGhpcy53aWRnZXQucmVzZXRIZWlnaHQoKTtcclxuXHRcdFx0dGhpcy5jYXJvdXNlbCAmJiB0aGlzLmNhcm91c2VsLnJlc2V0KCk7XHJcblx0XHRcdHRoaXMud2lkZ2V0LmFuYWx5dGljcy5jYXJkc0luaXQoKTtcclxuXHRcdFx0dGhpcy53aWRnZXQuYW5hbHl0aWNzLmNhcmRJbXByZXNzaW9ucygpO1x0XHJcblx0XHR9KTtcdFxyXG5cdH1cclxuXHQvKipcclxuIFx0KiBSZWZyZXNoIHZpZXcgd2l0aCBsYXRlc3Qgc2VydmVyIGRhdGEgYXQgc3BlY2lmaWVkIGludGVydmFsXHJcbiBcdCovXHJcblx0cG9sbEF0SW50ZXJ2YWwgKCkge1xyXG5cdFx0d2luZG93LnNldEludGVydmFsKCAoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVmcmVzaCgpO1xyXG5cdFx0fSwgdGhpcy5wb2xsSW50ZXJ2YWwgKTtcclxuXHR9XHJcblx0LyoqXHJcbiBcdCogUmVnaXN0ZXIgYSBjbGljayBsaXN0ZW5lciBvbiBzcGVjaWZpZWQgRE9NIGVsZW1lbnQgdG8gcmVmcmVzaCB2aWV3IHdpdGggbGF0ZXN0IHNlcnZlciBkYXRhXHJcbiBcdCovXHJcblx0cmVnaXN0ZXJQb2xsVHJpZ2dlciAoKSB7XHJcblx0XHR0aGlzLnBvbGxUcmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnJlZnJlc2goKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBBcHBlbmQgdGhlIG5leHQgc2V0IG9mIGNhcmRzIHRvIHRoZSB2aWV3IFtmb3IgcGFnaW5hdGVkIG1vZGVscyBvbmx5XVxyXG4gXHQqIEBkZXNjcmlwdGlvbiBHZXQgdGhlIHZpZXcncyBtb2RlbCdzIG5leHQgQVBJIHBhZ2UsIHJlbmRlciB0aGUgdmlldyB0ZW1wbGF0ZSB3aXRoIG5ldyBkYXRhIGFuZCBhcHBlbmQgbm9kZXMgdG8gdmlldyBlbGVtZW50XHJcbiBcdCovXHJcblx0YXBwZW5kTmV4dFBhZ2UgKCkge1xyXG5cdFx0aWYgKCAhdGhpcy5tb2RlbC5pc1BhZ2luYXRlZCApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKCggcmVzb2x2ZSApID0+IHtcclxuXHRcdFx0dGhpcy5tb2RlbC5nZXROZXh0UGFnZSgpLnRoZW4oICgpID0+IHtcclxuXHRcdFx0XHRsZXQgdGVtcGxhdGUgPSBIYW5kbGViYXJzLmNvbXBpbGUoIHRoaXMudGVtcGxhdGUgKTtcclxuXHRcdFx0XHRsZXQgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7XHJcblx0XHRcdFx0bGV0IGRvY0ZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XHJcblx0XHRcdFx0ZnJhZy5pbm5lckhUTUwgPSB0ZW1wbGF0ZSh7XHJcblx0XHRcdFx0XHRldmVudHM6IHRoaXMubW9kZWwubGFzdFJldHVybmVkUGFnZVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFtdLnNsaWNlLmNhbGwoIGZyYWcuY2hpbGRyZW4gKS5mb3JFYWNoKCggZWwgKSA9PiB7XHJcblx0XHRcdFx0XHRkb2NGcmFnLmFwcGVuZENoaWxkKCBlbCApO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdHRoaXMuZWwuYXBwZW5kQ2hpbGQoIGRvY0ZyYWcgKTtcclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBWaWV3OyJdfQ==\n},{\"../../Handlebars/handlebars\":44}],52:[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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvZnJhbWV3b3JrL1dpZGdldC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7OztnQ0FFb0Isc0JBQXNCOzs2QkFDbEMsbUJBQW1COzs7O3lCQUNsQixhQUFhOzs7Ozs7Ozs7Ozs7O0lBVTdCLE1BQU07QUFDQSxVQUROLE1BQU0sR0FDaUU7bUVBQUwsRUFBRTs7TUFBMUQsZUFBZSxRQUFmLGVBQWU7TUFBRSxVQUFVLFFBQVYsVUFBVTtNQUFFLFVBQVUsUUFBVixVQUFVO01BQUUsVUFBVSxRQUFWLFVBQVU7O3dCQUQ3RCxNQUFNOztBQUVWLE1BQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUM1RixNQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsS0FBSyxTQUFTLEdBQUcsSUFBSSxHQUFHLFVBQVUsQ0FBQztBQUMvRCxNQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsS0FBSyxTQUFTLEdBQUcsSUFBSSxHQUFHLFVBQVUsQ0FBQztBQUMvRCxNQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7QUFDbkMsTUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7QUFDeEIsTUFBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUc7QUFDdkIsVUFBTztHQUNQO0VBQ0Q7Ozs7Ozs7Y0FWSSxNQUFNOztTQWVOLGdCQUFHO0FBQ1AsT0FBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFFLElBQUksQ0FBQyxlQUFlLENBQUUsQ0FBQztBQUMvRCxPQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLFNBQVMsQ0FBQztHQUNqRTs7Ozs7Ozs7O1NBTWEseUJBQUc7QUFDaEIsVUFBTywyQkFBYztBQUNwQixjQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU07QUFDdkIsVUFBTSxFQUFFLElBQUk7SUFDWixDQUFDLENBQUM7R0FDSDs7Ozs7Ozs7U0FLYSx5QkFBRztBQUNoQixVQUFPLHdDQUFrQixRQUFRLENBQUMsTUFBTSxDQUFFLENBQUM7R0FDM0M7Ozs7Ozs7O1NBS2Msd0JBQUUsZUFBZSxFQUFHOzs7QUFDbEMsU0FBTSxDQUFDLGdCQUFnQixDQUFFLFFBQVEsRUFBRSxnQ0FBVTtXQUFNLE1BQUssaUJBQWlCLENBQUMsZUFBZSxDQUFDO0lBQUEsRUFBRSxHQUFHLENBQUMsQ0FBRSxDQUFDO0dBQ25HOzs7Ozs7Ozs7U0FNaUIsMkJBQUUsRUFBRSxFQUEwQjtPQUF4QixHQUFHLHlEQUFDLFFBQVEsQ0FBQyxRQUFROzs7QUFFNUMsT0FBSyxNQUFNLEtBQUssTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFHO0FBQ3ZFLFdBQU87SUFDUDtBQUNELFNBQU0sQ0FBQyxXQUFXLGlCQUFnQixJQUFJLENBQUMsVUFBVSx1QkFBa0IsRUFBRSxDQUFDLFlBQVksRUFBSSxHQUFHLENBQUUsQ0FBQztHQUM1Rjs7Ozs7OztTQUlXLHVCQUFHO0FBQ2QsT0FBSSxDQUFDLGlCQUFpQixDQUFFLElBQUksQ0FBQyxlQUFlLENBQUUsQ0FBQztHQUMvQzs7O1FBN0RJLE1BQU07OztxQkFnRUcsTUFBTSIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9mdW5kcmFpc2VyLWxlYWRlcmJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9XaWRnZXQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgeyBxdWVyeVN0cmluZ1BhcnNlIH0gZnJvbSAnLi4vdXRpbHMvcXVlcnlTdHJpbmcnO1xyXG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnLi4vdXRpbHMvZGVib3VuY2UnO1xyXG5pbXBvcnQgQW5hbHl0aWNzIGZyb20gJy4vQW5hbHl0aWNzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSB3aWRnZXRcclxuICogQGNsYXNzZGVzYyBDcmVhdGUgYSB3aWRnZXQgb2JqZWN0IFxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMud2lkZ2V0Q29udGFpbmVyLiBUaGUgd2lkZ2V0IGNvbnRhaW5lciBlbGVtZW50XHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy5yZXNwb25zaXZlLiBXaGV0aGVyIHRoZSB3aWRnZXQgaXMgcmVzcG9uc2l2ZVxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMudXNlckNvbmZpZy4gV2hldGhlciB0aGUgd2lkZ2V0IGhhcyB1c2VyIGNvbmZpZ3VyYWJsZSBzZXR0aW5nc1xyXG4gKiBAY2xhc3MgU2V0IHdpZGdldCBpbnN0YW5jZSBwcm9wZXJ0aWVzIGFuZCBpbml0aWFsaXNlIHdpZGdldFxyXG4gKi9cclxuY2xhc3MgV2lkZ2V0IHtcclxuXHRjb25zdHJ1Y3RvciggeyB3aWRnZXRDb250YWluZXIsIHJlc3BvbnNpdmUsIHVzZXJDb25maWcsIHdpZGdldE5hbWUgfSA9IHt9ICkge1xyXG5cdFx0dGhpcy53aWRnZXRDb250YWluZXIgPSB3aWRnZXRDb250YWluZXIgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtd2lkZ2V0LWNvbnRhaW5lcl0nKTtcclxuXHRcdHRoaXMucmVzcG9uc2l2ZSA9IHJlc3BvbnNpdmUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiByZXNwb25zaXZlO1xyXG5cdFx0dGhpcy51c2VyQ29uZmlnID0gdXNlckNvbmZpZyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHVzZXJDb25maWc7XHJcblx0XHR0aGlzLndpZGdldE5hbWUgPSB3aWRnZXROYW1lIHx8ICcnO1xyXG5cdFx0dGhpcy5hcHBJZCA9ICc0MzdiY2E0Mic7XHJcblx0XHRpZiAoICF0aGlzLndpZGdldE5hbWUgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHR9XHJcblx0LyoqXHJcbiBcdCogSW5pdGlhbGlzZSB0aGUgd2lkZ2V0XHJcbiBcdCogQGRlc2NyaXB0aW9uIE1ha2UgdGhlIHdpZGdldCByZXNwb25zaXZlOyBmZXRjaCBhbmQgY2FjaGUgb24gdGhlIHdpZGdldCBpbnN0YW5jZSB0aGUgdXNlciBjb25maWcgaGFzaFxyXG4gXHQqL1xyXG5cdGluaXQgKCkge1xyXG5cdFx0dGhpcy5yZXNwb25zaXZlICYmIHRoaXMubWFrZVJlc3BvbnNpdmUoIHRoaXMud2lkZ2V0Q29udGFpbmVyICk7XHJcblx0XHR0aGlzLmNvbmZpZyA9IHRoaXMudXNlckNvbmZpZyA/IHRoaXMuZ2V0VXNlckNvbmZpZygpIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBJbml0aWFsaXNlIHdpZGdldCBhbmFseXRpY3NcclxuIFx0KiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEFuYWx5dGljcyBjbGFzcyBmb3IgY2FjaGluZyBvbiB0aGUgd2lkZ2V0IGluc3RhbmNlXHJcbiBcdCogQHJldHVybnMge09iamVjdH0gQW5hbHl0aWNzIGluc3RhbmNlXHJcbiBcdCovXHJcblx0aW5pdEFuYWx5dGljcyAoKSB7XHJcblx0XHRyZXR1cm4gbmV3IEFuYWx5dGljcyh7XHJcblx0XHRcdGNvbmZpZ0hhc2g6IHRoaXMuY29uZmlnLFxyXG5cdFx0XHR3aWRnZXQ6IHRoaXNcclxuXHRcdH0pO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBDcmVhdGUgYSBoYXNoIG1hcCBvZiB1c2VyIGNvbmZpZyBmcm9tIHdpZGdldCBxdWVyeSBzdHJpbmdcclxuIFx0KiBAcmV0dXJucyB7T2JqZWN0fSBoYXNoIG1hcCBvZiB1c2VyIGNvbmZpZ1xyXG4gXHQqL1xyXG5cdGdldFVzZXJDb25maWcgKCkge1xyXG5cdFx0cmV0dXJuIHF1ZXJ5U3RyaW5nUGFyc2UoIGxvY2F0aW9uLnNlYXJjaCApO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBNYWtlIHdpZGdldCByZXNwb25zaXZlIHRvIGl0cyBjdXJyZW50IGNvbnRlbnQgb24gd2luIHJlc2l6ZVxyXG4gXHQqIEBwYXJhbSB7RWxlbWVudH0gVGhlIHdpZGdldCBjb250YWluZXJcclxuIFx0Ki9cclxuXHRtYWtlUmVzcG9uc2l2ZSAoIHdpZGdldENvbnRhaW5lciApIHtcclxuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAncmVzaXplJywgZGVib3VuY2UoICgpID0+IHRoaXMucG9zdENvbnRlbnRIZWlnaHQod2lkZ2V0Q29udGFpbmVyKSwgMjUwKSApO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBQb3N0IHRoZSBjdXJyZW50IHNjcm9sbCBoZWlnaHQgdmFsdWUgb2YgYW4gZWxlbWVudCB0byB0aGUgcGFyZW50IHdpbmRvd1xyXG4gXHQqIEBwYXJhbSB7RWxlbWVudH0gVGhlIGVsZW1udCB3aG9zZSBoZWlnaHQgdG8gc2VuZFxyXG4gXHQqIEBwYXJhbSB7U3RyaW5nfSBVUkwgb2YgcGFyZW50IHRvIHBvc3QgbWVzc2FnZSB0bzsgZGVmYXVsdHMgdG8gZG9jdW1lbnQucmVmZXJyZXJcclxuIFx0Ki9cclxuXHRwb3N0Q29udGVudEhlaWdodCAoIGVsLCB1cmw9ZG9jdW1lbnQucmVmZXJyZXIgKSB7XHJcblx0XHQvL0Rvbid0IHBvc3QgdG8gc2VsZlxyXG5cdFx0aWYgKCB3aW5kb3cgPT09IHdpbmRvdy50b3AgfHwgd2luZG93LmxvY2F0aW9uID09PSB3aW5kb3cudG9wLmxvY2F0aW9uICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9IFxyXG5cdFx0cGFyZW50LnBvc3RNZXNzYWdlKCBgd2lkZ2V0TmFtZT0ke3RoaXMud2lkZ2V0TmFtZX0mY29udGVudEhlaWdodD0ke2VsLnNjcm9sbEhlaWdodH1gLCB1cmwgKTtcclxuXHR9XHJcblx0LyoqXHJcbiBcdCogUmVzZXQgdGhlIGhlaWdodCBvZiB0aGUgd2lkZ2V0XHJcbiBcdCovXHJcblx0cmVzZXRIZWlnaHQgKCkge1xyXG5cdFx0dGhpcy5wb3N0Q29udGVudEhlaWdodCggdGhpcy53aWRnZXRDb250YWluZXIgKTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdpZGdldDtcclxuXHJcbiJdfQ==\n},{\"../utils/debounce\":53,\"../utils/queryString\":54,\"./Analytics\":49}],53:[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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvdXRpbHMvZGVib3VuY2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7OztBQVFiLFNBQVMsUUFBUSxDQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFHO0FBQzFDLEtBQUksT0FBTyxZQUFBLENBQUM7QUFDWixRQUFPLFlBQVc7QUFDakIsTUFBSSxPQUFPLEdBQUcsSUFBSTtNQUFFLElBQUksR0FBRyxTQUFTLENBQUM7QUFDckMsTUFBSSxLQUFLLEdBQUcsU0FBUixLQUFLLEdBQWM7QUFDdEIsVUFBTyxHQUFHLElBQUksQ0FBQztBQUNmLE9BQUssQ0FBQyxTQUFTLEVBQUc7QUFDakIsUUFBSSxDQUFDLEtBQUssQ0FBRSxPQUFPLEVBQUUsSUFBSSxDQUFFLENBQUM7SUFDNUI7R0FDRCxDQUFDO0FBQ0YsTUFBSSxPQUFPLEdBQUcsU0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3BDLGNBQVksQ0FBRSxPQUFPLENBQUUsQ0FBQztBQUN4QixTQUFPLEdBQUcsVUFBVSxDQUFFLEtBQUssRUFBRSxJQUFJLENBQUUsQ0FBQztBQUNwQyxNQUFLLE9BQU8sRUFBRztBQUNkLE9BQUksQ0FBQyxLQUFLLENBQUUsT0FBTyxFQUFFLElBQUksQ0FBRSxDQUFDO0dBQzVCO0VBQ0QsQ0FBQztDQUNGOztxQkFFYyxRQUFRIiwiZmlsZSI6IkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvdXRpbHMvZGVib3VuY2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcbi8qKlxyXG4gKiBEZWJvdW5jZXMgYSBmdW5jdGlvbiBjYWxsXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gRHVyYXRpb24gb2YgZGVib3VuY2VcclxuICogQHBhcmFtIHtib29sZWFufSBJZiB0cnVlLCB0cmlnZ2VyIGZ1bmN0aW9uIG9uIGxlYWRpbmcgZWRnZVxyXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gVGhlIGRlYm91bmNlciBmdW5jdGlvblxyXG4gKi9cclxuZnVuY3Rpb24gZGVib3VuY2UoIGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSApIHtcclxuXHRsZXQgdGltZW91dDtcclxuXHRyZXR1cm4gZnVuY3Rpb24oKSB7XHJcblx0XHRsZXQgY29udGV4dCA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7XHJcblx0XHRsZXQgbGF0ZXIgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0dGltZW91dCA9IG51bGw7XHJcblx0XHRcdGlmICggIWltbWVkaWF0ZSApIHsgXHJcblx0XHRcdFx0ZnVuYy5hcHBseSggY29udGV4dCwgYXJncyApO1xyXG5cdFx0XHR9XHRcclxuXHRcdH07XHJcblx0XHRsZXQgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcclxuXHRcdGNsZWFyVGltZW91dCggdGltZW91dCApO1xyXG5cdFx0dGltZW91dCA9IHNldFRpbWVvdXQoIGxhdGVyLCB3YWl0ICk7XHJcblx0XHRpZiAoIGNhbGxOb3cgKSB7IFxyXG5cdFx0XHRmdW5jLmFwcGx5KCBjb250ZXh0LCBhcmdzICk7XHJcblx0XHR9XHJcblx0fTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZGVib3VuY2U7Il19\n},{}],54:[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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvdXRpbHMvcXVlcnlTdHJpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFTTixTQUFTLGdCQUFnQixDQUFHLEdBQUcsRUFBRztBQUN4QyxLQUFLLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRztBQUM5QixTQUFPLEVBQUUsQ0FBQztFQUNWOztBQUVELElBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQzs7QUFFeEMsS0FBSyxDQUFDLEdBQUcsRUFBRztBQUNYLFNBQU8sRUFBRSxDQUFDO0VBQ1Y7O0FBRUQsUUFBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFFLEdBQUcsQ0FBRSxDQUFDLE1BQU0sQ0FBRSxVQUFXLEdBQUcsRUFBRSxLQUFLLEVBQUc7QUFDOUQsTUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFFLEdBQUcsQ0FBRSxDQUFDO0FBQ25ELE1BQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixNQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRW5CLEtBQUcsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7O0FBRzlCLEtBQUcsR0FBRyxHQUFHLEtBQUssU0FBUyxHQUFHLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7QUFFekQsTUFBSyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUc7QUFDL0IsTUFBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztHQUNmLE1BQU0sSUFBSyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFHO0FBQ3JDLE1BQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUUsR0FBRyxDQUFFLENBQUM7R0FDckIsTUFBTTtBQUNOLE1BQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztHQUMzQjs7QUFFRCxTQUFPLEdBQUcsQ0FBQztFQUNYLEVBQUUsRUFBRSxDQUFFLENBQUM7Q0FDUjs7Ozs7Ozs7Ozs7QUFVTSxTQUFTLG9CQUFvQixDQUFHLEdBQUcsRUFBRztBQUM1QyxRQUFPLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFFLEdBQUcsQ0FBRSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBRSxVQUFVLEdBQUcsRUFBRztBQUMzRCxNQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0FBRW5CLE1BQUssS0FBSyxDQUFDLE9BQU8sQ0FBRSxHQUFHLENBQUUsRUFBRztBQUMzQixVQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUUsVUFBVyxJQUFJLEVBQUc7QUFDeEMsV0FBTyxrQkFBa0IsQ0FBRSxHQUFHLENBQUUsR0FBRyxHQUFHLEdBQUcsa0JBQWtCLENBQUUsSUFBSSxDQUFFLENBQUM7SUFDcEUsQ0FBQyxDQUFDLElBQUksQ0FBRSxHQUFHLENBQUUsQ0FBQztHQUNmOztBQUVELFNBQU8sa0JBQWtCLENBQUUsR0FBRyxDQUFFLEdBQUcsR0FBRyxHQUFHLGtCQUFrQixDQUFFLEdBQUcsQ0FBRSxDQUFDO0VBQ25FLENBQUMsQ0FBQyxJQUFJLENBQUUsR0FBRyxDQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3BCIiwiZmlsZSI6IkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvdXRpbHMvcXVlcnlTdHJpbmcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBoYXNoIG1hcCBvZiBxdWVyeSBzdHJpbmcga2V5LXZhbHVlIHBhaXJzLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24uc2VhcmNoIHN0cmluZyB0byBoYXNoXHJcbiAqIEByZXR1cm5zIHtvYmplY3R9IGhhc2ggbWFwIG9mIHF1ZXJ5IHN0cmluZyBrZXktdmFsdWUgcGFpcnNcclxuICogQGF1dGhvciBieSBTaW5kcmUgU29yaHVzXHJcbiAqIEBsaWNlbnNlIE1JVCBMaWNlbnNlXHJcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9xdWVyeS1zdHJpbmdcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBxdWVyeVN0cmluZ1BhcnNlICggc3RyICkge1xyXG5cdGlmICggdHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgKSB7XHJcblx0XHRyZXR1cm4ge307XHJcblx0fVxyXG5cclxuXHRzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoL14oXFw/fCMpLywgJycpO1xyXG5cclxuXHRpZiAoICFzdHIgKSB7XHJcblx0XHRyZXR1cm4ge307XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gc3RyLnRyaW0oKS5zcGxpdCggJyYnICkucmVkdWNlKCBmdW5jdGlvbiAoIHJldCwgcGFyYW0gKSB7XHJcblx0XHRsZXQgcGFydHMgPSBwYXJhbS5yZXBsYWNlKC9cXCsvZywgJyAnKS5zcGxpdCggJz0nICk7XHJcblx0XHRsZXQga2V5ID0gcGFydHNbMF07XHJcblx0XHRsZXQgdmFsID0gcGFydHNbMV07XHJcblxyXG5cdFx0a2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KGtleSk7XHJcblx0XHQvLyBtaXNzaW5nIGA9YCBzaG91bGQgYmUgYG51bGxgOlxyXG5cdFx0Ly8gaHR0cDovL3czLm9yZy9UUi8yMDEyL1dELXVybC0yMDEyMDUyNC8jY29sbGVjdC11cmwtcGFyYW1ldGVyc1xyXG5cdFx0dmFsID0gdmFsID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KHZhbCk7XHJcblxyXG5cdFx0aWYgKCAhcmV0Lmhhc093blByb3BlcnR5KGtleSkgKSB7XHJcblx0XHRcdHJldFtrZXldID0gdmFsO1xyXG5cdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheShyZXRba2V5XSkgKSB7XHJcblx0XHRcdHJldFtrZXldLnB1c2goIHZhbCApO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cmV0W2tleV0gPSBbcmV0W2tleV0sIHZhbF07XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJldDtcclxuXHR9LCB7fSApO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIHF1ZXJ5IHN0cmluZyBvZiBrZXktdmFsdWUgcGFpcnMgZnJvbSBhIGhhc2ggbWFwLlxyXG4gKiBAcGFyYW0ge29ian0gaGFzaG1hcCBzb3VyY2VcclxuICogQHJldHVybnMge3N0cmluZ30gcXVlcnlTdHJpbmdcclxuICogQGF1dGhvciBieSBTaW5kcmUgU29yaHVzXHJcbiAqIEBsaWNlbnNlIE1JVCBMaWNlbnNlXHJcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9xdWVyeS1zdHJpbmdcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBxdWVyeVN0cmluZ1N0cmluZ2lmeSAoIG9iaiApIHtcclxuXHRyZXR1cm4gb2JqID8gT2JqZWN0LmtleXMoIG9iaiApLnNvcnQoKS5tYXAoIGZ1bmN0aW9uKCBrZXkgKSB7XHJcblx0XHRsZXQgdmFsID0gb2JqW2tleV07XHJcblxyXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWwgKSApIHtcclxuXHRcdFx0cmV0dXJuIHZhbC5zb3J0KCkubWFwIChmdW5jdGlvbiAoIHZhbDIgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQoIHZhbDIgKTtcclxuXHRcdFx0fSkuam9pbiggJyYnICk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQoIHZhbCApO1xyXG5cdH0pLmpvaW4oICcmJyApIDogJyc7XHJcbn0iXX0=\n},{}],55:[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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvd2lkZ2V0L21vZGVsL251bWJlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7O0FBS04sU0FBUyxVQUFVLENBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRztBQUNwRCxNQUFLLENBQUMsV0FBVyxFQUFHO0FBQ25CLFdBQU8sRUFBRSxDQUFDO0dBQ1YsTUFBTTtBQUNOLFdBQU8sUUFBUSxDQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxFQUFHLEVBQUUsQ0FBRSxDQUFDO0dBQy9FO0NBQ0Q7Ozs7Ozs7QUFLTSxTQUFTLFdBQVcsQ0FBRSxNQUFNLEVBQUc7QUFDckMsU0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO0NBQ3BFIiwiZmlsZSI6IkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvd2lkZ2V0L21vZGVsL251bWJlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuLyoqXHJcbiAqIEZpbmQgYSBwZXJjZW50YWdlIHZhbHVlIGZyb20gc3VwcGxpZWQgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciB2YWx1ZXNcclxuICogQHJldHVybiB7U3RyaW5nfSBSb3VuZGVkIHBlcmNldGFuZ2UgdmFsdWUgaW5jbHVkaW5nICUgc2lnbiBvciBlbXB0eSBzdHJpbmcgaWYgZGVub21pbmF0b3IgaXMgZmFsc3lcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQZXJjZW50KCBudW1lcmF0b3IsIGRlbm9taW5hdG9yICkge1xyXG5cdGlmICggIWRlbm9taW5hdG9yICkge1xyXG5cdFx0cmV0dXJuICcnO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRyZXR1cm4gcGFyc2VJbnQoIChwYXJzZUZsb2F0KG51bWVyYXRvcikgLyBwYXJzZUZsb2F0KGRlbm9taW5hdG9yKSAqIDEwMCksIDEwICk7XHRcclxuXHR9XHJcbn1cclxuLyoqXHJcbiAqIEZvcm1hdCBhIGxhcmdlIG51bWJlciAoPjk5OSkgd2l0aCBjb21tYXNcclxuICogQHJldHVybiB7U3RyaW5nfSBDb21tYS1mb3JtYXR0ZWQgbnVtYmVyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY29tbWFGb3JtYXQoIG51bWJlciApIHtcclxuXHRyZXR1cm4gbnVtYmVyLnRvU3RyaW5nKCkucmVwbGFjZSgvKFxcZCkoPz0oXFxkXFxkXFxkKSsoPyFcXGQpKS9nLCAnJDEsJyk7XHJcbn0iXX0=\n},{}],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 _justgivingWidgetFrameworkComponentsLibJsFrameworkWidget = require('justgiving-widget-framework/components/lib/js/framework/Widget');\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkWidget2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibJsFrameworkWidget);\n\nvar _justgivingWidgetFrameworkComponentsLibCarouselCarousel = require('justgiving-widget-framework/components/lib/carousel/Carousel');\n\nvar _justgivingWidgetFrameworkComponentsLibCarouselCarousel2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibCarouselCarousel);\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkModel = require('justgiving-widget-framework/components/lib/js/framework/Model');\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkModel2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibJsFrameworkModel);\n\nvar _ModelLeaderboard = require('./ModelLeaderboard');\n\nvar _ModelLeaderboard2 = _interopRequireDefault(_ModelLeaderboard);\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkView = require('justgiving-widget-framework/components/lib/js/framework/View');\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkView2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibJsFrameworkView);\n\n/**\r\n * Create a fundraiser leaderboard widget\r\n */\nvar Promise = require('es6-promise').Promise;\n\nvar FundraiserLeaderboard = (function (_Widget) {\n\t_inherits(FundraiserLeaderboard, _Widget);\n\n\tfunction FundraiserLeaderboard(options) {\n\t\t_classCallCheck(this, FundraiserLeaderboard);\n\n\t\t_get(Object.getPrototypeOf(FundraiserLeaderboard.prototype), 'constructor', this).call(this, options);\n\t\tthis.init();\n\t}\n\n\t/**\r\n * Initialise the leaderboard\r\n * @description Create and cache new leaderboard model; bootstrap the widget\r\n */\n\n\t_createClass(FundraiserLeaderboard, [{\n\t\tkey: 'init',\n\t\tvalue: function init() {\n\t\t\t_get(Object.getPrototypeOf(FundraiserLeaderboard.prototype), 'init', this).call(this);\n\t\t\tthis.leaderboardModel = new _ModelLeaderboard2['default']({\n\t\t\t\twidget: this,\n\t\t\t\turl: 'https://api.justgiving.com/' + this.appId + '/v1/charity/' + this.config.id + '/leaderboard'\n\t\t\t});\n\t\t\tthis.charityModel = new _justgivingWidgetFrameworkComponentsLibJsFrameworkModel2['default']({\n\t\t\t\twidget: this,\n\t\t\t\turl: 'https://api.justgiving.com/' + this.appId + '/v1/charity/' + this.config.id\n\t\t\t});\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 the leaderboard model; create and render new leaderboard view;\r\n * reset the widget height and create new carousel on the events view [if widget layout === large]; \r\n * 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.leaderboardModel.getModel(this.config.reference), this.charityModel.getModel()]).then(function () {\n\t\t\t\t// Header view\n\t\t\t\t_this.headerView = new _justgivingWidgetFrameworkComponentsLibJsFrameworkView2['default']({\n\t\t\t\t\twidget: _this,\n\t\t\t\t\tel: '[data-view-header]',\n\t\t\t\t\ttemplate: '[data-tmpl-header]',\n\t\t\t\t\tmodel: _this.charityModel\n\t\t\t\t});\n\t\t\t\t_this.headerView.render({\n\t\t\t\t\tcharityId: _this.headerView.model.$model.id,\n\t\t\t\t\tcharityName: _this.headerView.model.$model.name,\n\t\t\t\t\tlayout: _this.config.layout\n\t\t\t\t});\n\t\t\t\t// Leaderboard view\n\t\t\t\t_this.leaderboardView = new _justgivingWidgetFrameworkComponentsLibJsFrameworkView2['default']({\n\t\t\t\t\twidget: _this,\n\t\t\t\t\tel: '[data-view-leaderboard]',\n\t\t\t\t\ttemplate: '[data-tmpl-leaderboard]',\n\t\t\t\t\tchildView: _this.leaderboardListView\n\t\t\t\t});\n\t\t\t\t_this.leaderboardView.render({\n\t\t\t\t\tviewName: 'leaderboard',\n\t\t\t\t\thasCarousel: _this.config.layout === 'small' ? 'true' : 'false'\n\t\t\t\t});\n\t\t\t\t// Leaderboard list view\n\t\t\t\t_this.leaderboardListView = new _justgivingWidgetFrameworkComponentsLibJsFrameworkView2['default']({\n\t\t\t\t\twidget: _this,\n\t\t\t\t\tel: '[data-view-leaderboard-list]',\n\t\t\t\t\ttemplate: '[data-tmpl-leaderboard-list]',\n\t\t\t\t\tmodel: _this.leaderboardModel,\n\t\t\t\t\tpollInterval: 300000\n\t\t\t\t});\n\t\t\t\t_this.leaderboardListView.render({\n\t\t\t\t\tfundraisers: _this.leaderboardListView.model.$model.pages,\n\t\t\t\t\tlayout: _this.config.layout\n\t\t\t\t});\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.charityModel\n\t\t\t\t});\n\t\t\t\t_this.footerView.render({\n\t\t\t\t\tcharityName: _this.footerView.model.$model.name,\n\t\t\t\t\tprofilePageUrl: _this.footerView.model.$model.profilePageUrl,\n\t\t\t\t\tcharityDescription: _this.footerView.model.$model.description,\n\t\t\t\t\tlayout: _this.config.layout\n\t\t\t\t});\n\t\t\t}).then(function () {\n\t\t\t\t_this.resetHeight();\n\t\t\t\tif (_this.config.layout === 'small') {\n\t\t\t\t\t_this.carousel = new _justgivingWidgetFrameworkComponentsLibCarouselCarousel2['default']({\n\t\t\t\t\t\tel: '[data-carousel=\"leaderboard\"]',\n\t\t\t\t\t\twidget: _this,\n\t\t\t\t\t\tview: _this.leaderboardListView,\n\t\t\t\t\t\tpageSize: 5\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t_this.analytics = _this.initAnalytics();\n\t\t\t});\n\t\t}\n\t}]);\n\n\treturn FundraiserLeaderboard;\n})(_justgivingWidgetFrameworkComponentsLibJsFrameworkWidget2['default']);\n\nexports['default'] = FundraiserLeaderboard;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvc3JjL3NjcmlwdHMvYXBwL0Z1bmRyYWlzZXJMZWFkZXJib2FyZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7dUVBR00sZ0VBQWdFOzs7O3NFQUM5RCw4REFBOEQ7Ozs7c0VBQ2pFLCtEQUErRDs7OztnQ0FDcEQsb0JBQW9COzs7O3FFQUNoQyw4REFBOEQ7Ozs7Ozs7QUFML0UsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQzs7SUFVdkMscUJBQXFCO1dBQXJCLHFCQUFxQjs7QUFDZCxVQURQLHFCQUFxQixDQUNaLE9BQU8sRUFBRzt3QkFEbkIscUJBQXFCOztBQUV6Qiw2QkFGSSxxQkFBcUIsNkNBRWxCLE9BQU8sRUFBRztBQUNqQixNQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7RUFDWjs7Ozs7OztjQUpJLHFCQUFxQjs7U0FTckIsZ0JBQUc7QUFDUCw4QkFWSSxxQkFBcUIsc0NBVVo7QUFDYixPQUFJLENBQUMsZ0JBQWdCLEdBQUcsa0NBQXFCO0FBQzVDLFVBQU0sRUFBRSxJQUFJO0FBQ1osT0FBRyxrQ0FBbUMsSUFBSSxDQUFDLEtBQUssb0JBQWtCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxpQkFBZTtJQUMvRixDQUFDLENBQUM7QUFDSCxPQUFJLENBQUMsWUFBWSxHQUFHLHdFQUFVO0FBQzdCLFVBQU0sRUFBRSxJQUFJO0FBQ1osT0FBRyxrQ0FBbUMsSUFBSSxDQUFDLEtBQUssb0JBQWtCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxBQUFFO0lBQ2xGLENBQUMsQ0FBQztBQUNILE9BQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztHQUNqQjs7Ozs7Ozs7OztTQU9TLHFCQUFHOzs7QUFDWixVQUFPLENBQUMsR0FBRyxDQUFDLENBQ1gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUNyRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUM1QixDQUFDLENBQUMsSUFBSSxDQUFFLFlBQU07O0FBRWQsVUFBSyxVQUFVLEdBQUcsdUVBQVM7QUFDMUIsV0FBTSxPQUFNO0FBQ1osT0FBRSxFQUFFLG9CQUFvQjtBQUN4QixhQUFRLEVBQUUsb0JBQW9CO0FBQzlCLFVBQUssRUFBRSxNQUFLLFlBQVk7S0FDeEIsQ0FBQyxDQUFDO0FBQ0gsVUFBSyxVQUFVLENBQUMsTUFBTSxDQUFDO0FBQ3RCLGNBQVMsRUFBRSxNQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDMUMsZ0JBQVcsRUFBRSxNQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUk7QUFDOUMsV0FBTSxFQUFFLE1BQUssTUFBTSxDQUFDLE1BQU07S0FDMUIsQ0FBQyxDQUFDOztBQUVILFVBQUssZUFBZSxHQUFHLHVFQUFTO0FBQy9CLFdBQU0sT0FBTTtBQUNaLE9BQUUsRUFBRSx5QkFBeUI7QUFDN0IsYUFBUSxFQUFFLHlCQUF5QjtBQUNuQyxjQUFTLEVBQUUsTUFBSyxtQkFBbUI7S0FDbkMsQ0FBQyxDQUFDO0FBQ0gsVUFBSyxlQUFlLENBQUMsTUFBTSxDQUFDO0FBQzNCLGFBQVEsRUFBRSxhQUFhO0FBQ3ZCLGdCQUFXLEVBQUUsTUFBSyxNQUFNLENBQUMsTUFBTSxLQUFLLE9BQU8sR0FBRyxNQUFNLEdBQUcsT0FBTztLQUM5RCxDQUFDLENBQUM7O0FBRUgsVUFBSyxtQkFBbUIsR0FBRyx1RUFBUztBQUNuQyxXQUFNLE9BQU07QUFDWixPQUFFLEVBQUUsOEJBQThCO0FBQ2xDLGFBQVEsRUFBRSw4QkFBOEI7QUFDeEMsVUFBSyxFQUFFLE1BQUssZ0JBQWdCO0FBQzVCLGlCQUFZLEVBQUUsTUFBTTtLQUNwQixDQUFDLENBQUM7QUFDSCxVQUFLLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztBQUMvQixnQkFBVyxFQUFFLE1BQUssbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLO0FBQ3hELFdBQU0sRUFBRSxNQUFLLE1BQU0sQ0FBQyxNQUFNO0tBQzFCLENBQUMsQ0FBQzs7QUFFSCxVQUFLLFVBQVUsR0FBRyx1RUFBUztBQUMxQixXQUFNLE9BQU07QUFDWixPQUFFLEVBQUUsb0JBQW9CO0FBQ3hCLGFBQVEsRUFBRSxvQkFBb0I7QUFDOUIsVUFBSyxFQUFFLE1BQUssWUFBWTtLQUN4QixDQUFDLENBQUM7QUFDSCxVQUFLLFVBQVUsQ0FBQyxNQUFNLENBQUM7QUFDdEIsZ0JBQVcsRUFBRSxNQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUk7QUFDOUMsbUJBQWMsRUFBRSxNQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWM7QUFDM0QsdUJBQWtCLEVBQUUsTUFBSyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXO0FBQzVELFdBQU0sRUFBRSxNQUFLLE1BQU0sQ0FBQyxNQUFNO0tBQzFCLENBQUMsQ0FBQztJQUNILENBQUMsQ0FBQyxJQUFJLENBQUUsWUFBTTtBQUNkLFVBQUssV0FBVyxFQUFFLENBQUM7QUFDbkIsUUFBSyxNQUFLLE1BQU0sQ0FBQyxNQUFNLEtBQUssT0FBTyxFQUFHO0FBQ3JDLFdBQUssUUFBUSxHQUFHLHdFQUFhO0FBQzVCLFFBQUUsRUFBRSwrQkFBK0I7QUFDbkMsWUFBTSxPQUFNO0FBQ1osVUFBSSxFQUFFLE1BQUssbUJBQW1CO0FBQzlCLGNBQVEsRUFBRSxDQUFDO01BQ1gsQ0FBQyxDQUFDO0tBQ0g7QUFDRCxVQUFLLFNBQVMsR0FBRyxNQUFLLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLENBQUMsQ0FBQztHQUNIOzs7UUE1RkkscUJBQXFCOzs7cUJBK0ZaLHFCQUFxQiIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9mdW5kcmFpc2VyLWxlYWRlcmJvYXJkL3NyYy9zY3JpcHRzL2FwcC9GdW5kcmFpc2VyTGVhZGVyYm9hcmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG5sZXQgUHJvbWlzZSA9IHJlcXVpcmUoJ2VzNi1wcm9taXNlJykuUHJvbWlzZTtcclxuaW1wb3J0IFdpZGdldCBmcm9tICdqdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvZnJhbWV3b3JrL1dpZGdldCc7XHJcbmltcG9ydCBDYXJvdXNlbCBmcm9tICdqdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvY2Fyb3VzZWwvQ2Fyb3VzZWwnO1xyXG5pbXBvcnQgTW9kZWwgZnJvbSAnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9Nb2RlbCc7XHJcbmltcG9ydCBNb2RlbExlYWRlcmJvYXJkIGZyb20gJy4vTW9kZWxMZWFkZXJib2FyZCc7XHJcbmltcG9ydCBWaWV3IGZyb20gJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvVmlldyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgZnVuZHJhaXNlciBsZWFkZXJib2FyZCB3aWRnZXRcclxuICovXHJcbmNsYXNzIEZ1bmRyYWlzZXJMZWFkZXJib2FyZCBleHRlbmRzIFdpZGdldCB7XHJcblx0Y29uc3RydWN0b3IgKCBvcHRpb25zICkge1xyXG5cdFx0c3VwZXIoIG9wdGlvbnMgKTtcclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBJbml0aWFsaXNlIHRoZSBsZWFkZXJib2FyZFxyXG5cdCAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYW5kIGNhY2hlIG5ldyBsZWFkZXJib2FyZCBtb2RlbDsgYm9vdHN0cmFwIHRoZSB3aWRnZXRcclxuXHQgKi9cclxuXHRpbml0ICgpIHtcclxuXHRcdHN1cGVyLmluaXQoKTtcclxuXHRcdHRoaXMubGVhZGVyYm9hcmRNb2RlbCA9IG5ldyBNb2RlbExlYWRlcmJvYXJkKHsgXHJcblx0XHRcdHdpZGdldDogdGhpcyxcclxuXHRcdFx0dXJsOiBgaHR0cHM6XFwvXFwvYXBpLmp1c3RnaXZpbmcuY29tXFwvJHt0aGlzLmFwcElkfVxcL3YxXFwvY2hhcml0eVxcLyR7dGhpcy5jb25maWcuaWR9XFwvbGVhZGVyYm9hcmRgXHJcblx0XHR9KTtcclxuXHRcdHRoaXMuY2hhcml0eU1vZGVsID0gbmV3IE1vZGVsKHsgXHJcblx0XHRcdHdpZGdldDogdGhpcyxcclxuXHRcdFx0dXJsOiBgaHR0cHM6XFwvXFwvYXBpLmp1c3RnaXZpbmcuY29tXFwvJHt0aGlzLmFwcElkfVxcL3YxXFwvY2hhcml0eVxcLyR7dGhpcy5jb25maWcuaWR9YCxcclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5ib290c3RyYXAoKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogQm9vdHN0cmFwIHRoZSB3aWRnZXRcclxuXHQgKiBAZGVzY3JpcHRpb24gRmV0Y2ggYWxsIHNlcnZlciBkYXRhIGZvciB0aGUgbGVhZGVyYm9hcmQgbW9kZWw7IGNyZWF0ZSBhbmQgcmVuZGVyIG5ldyBsZWFkZXJib2FyZCB2aWV3O1xyXG5cdCAqIHJlc2V0IHRoZSB3aWRnZXQgaGVpZ2h0IGFuZCBjcmVhdGUgbmV3IGNhcm91c2VsIG9uIHRoZSBldmVudHMgdmlldyBbaWYgd2lkZ2V0IGxheW91dCA9PT0gbGFyZ2VdOyBcclxuXHQgKiBpbml0aWFsaXNlIGEgbmV3IGFuYWx5dGljcyBpbnN0YW5jZSBvbiB0aGUgd2lkZ2V0XHJcblx0ICovXHJcblx0Ym9vdHN0cmFwICgpIHtcclxuXHRcdFByb21pc2UuYWxsKFtcclxuXHRcdFx0dGhpcy5sZWFkZXJib2FyZE1vZGVsLmdldE1vZGVsKHRoaXMuY29uZmlnLnJlZmVyZW5jZSksXHJcblx0XHRcdHRoaXMuY2hhcml0eU1vZGVsLmdldE1vZGVsKClcclxuXHRcdF0pLnRoZW4oICgpID0+IHtcclxuXHRcdFx0Ly8gSGVhZGVyIHZpZXdcclxuXHRcdFx0dGhpcy5oZWFkZXJWaWV3ID0gbmV3IFZpZXcoeyBcclxuXHRcdFx0XHR3aWRnZXQ6IHRoaXMsIFxyXG5cdFx0XHRcdGVsOiAnW2RhdGEtdmlldy1oZWFkZXJdJyxcclxuXHRcdFx0XHR0ZW1wbGF0ZTogJ1tkYXRhLXRtcGwtaGVhZGVyXScsXHJcblx0XHRcdFx0bW9kZWw6IHRoaXMuY2hhcml0eU1vZGVsXHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmhlYWRlclZpZXcucmVuZGVyKHtcclxuXHRcdFx0XHRjaGFyaXR5SWQ6IHRoaXMuaGVhZGVyVmlldy5tb2RlbC4kbW9kZWwuaWQsXHJcblx0XHRcdFx0Y2hhcml0eU5hbWU6IHRoaXMuaGVhZGVyVmlldy5tb2RlbC4kbW9kZWwubmFtZSxcclxuXHRcdFx0XHRsYXlvdXQ6IHRoaXMuY29uZmlnLmxheW91dFxyXG5cdFx0XHR9KTtcdFxyXG5cdFx0XHQvLyBMZWFkZXJib2FyZCB2aWV3XHJcblx0XHRcdHRoaXMubGVhZGVyYm9hcmRWaWV3ID0gbmV3IFZpZXcoeyBcclxuXHRcdFx0XHR3aWRnZXQ6IHRoaXMsIFxyXG5cdFx0XHRcdGVsOiAnW2RhdGEtdmlldy1sZWFkZXJib2FyZF0nLFxyXG5cdFx0XHRcdHRlbXBsYXRlOiAnW2RhdGEtdG1wbC1sZWFkZXJib2FyZF0nLFxyXG5cdFx0XHRcdGNoaWxkVmlldzogdGhpcy5sZWFkZXJib2FyZExpc3RWaWV3XHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmxlYWRlcmJvYXJkVmlldy5yZW5kZXIoe1xyXG5cdFx0XHRcdHZpZXdOYW1lOiAnbGVhZGVyYm9hcmQnLFxyXG5cdFx0XHRcdGhhc0Nhcm91c2VsOiB0aGlzLmNvbmZpZy5sYXlvdXQgPT09ICdzbWFsbCcgPyAndHJ1ZScgOiAnZmFsc2UnXHJcblx0XHRcdH0pO1x0XHJcblx0XHRcdC8vIExlYWRlcmJvYXJkIGxpc3Qgdmlld1xyXG5cdFx0XHR0aGlzLmxlYWRlcmJvYXJkTGlzdFZpZXcgPSBuZXcgVmlldyh7IFxyXG5cdFx0XHRcdHdpZGdldDogdGhpcywgXHJcblx0XHRcdFx0ZWw6ICdbZGF0YS12aWV3LWxlYWRlcmJvYXJkLWxpc3RdJyxcclxuXHRcdFx0XHR0ZW1wbGF0ZTogJ1tkYXRhLXRtcGwtbGVhZGVyYm9hcmQtbGlzdF0nLFxyXG5cdFx0XHRcdG1vZGVsOiB0aGlzLmxlYWRlcmJvYXJkTW9kZWwsXHJcblx0XHRcdFx0cG9sbEludGVydmFsOiAzMDAwMDBcclxuXHRcdFx0fSk7XHJcblx0XHRcdHRoaXMubGVhZGVyYm9hcmRMaXN0Vmlldy5yZW5kZXIoe1xyXG5cdFx0XHRcdGZ1bmRyYWlzZXJzOiB0aGlzLmxlYWRlcmJvYXJkTGlzdFZpZXcubW9kZWwuJG1vZGVsLnBhZ2VzLFxyXG5cdFx0XHRcdGxheW91dDogdGhpcy5jb25maWcubGF5b3V0XHJcblx0XHRcdH0pO1xyXG5cdFx0XHQvLyBGb290ZXIgdmlld1xyXG5cdFx0XHR0aGlzLmZvb3RlclZpZXcgPSBuZXcgVmlldyh7IFxyXG5cdFx0XHRcdHdpZGdldDogdGhpcywgXHJcblx0XHRcdFx0ZWw6ICdbZGF0YS12aWV3LWZvb3Rlcl0nLFxyXG5cdFx0XHRcdHRlbXBsYXRlOiAnW2RhdGEtdG1wbC1mb290ZXJdJyxcclxuXHRcdFx0XHRtb2RlbDogdGhpcy5jaGFyaXR5TW9kZWxcclxuXHRcdFx0fSk7XHJcblx0XHRcdHRoaXMuZm9vdGVyVmlldy5yZW5kZXIoe1xyXG5cdFx0XHRcdGNoYXJpdHlOYW1lOiB0aGlzLmZvb3RlclZpZXcubW9kZWwuJG1vZGVsLm5hbWUsXHJcblx0XHRcdFx0cHJvZmlsZVBhZ2VVcmw6IHRoaXMuZm9vdGVyVmlldy5tb2RlbC4kbW9kZWwucHJvZmlsZVBhZ2VVcmwsXHJcblx0XHRcdFx0Y2hhcml0eURlc2NyaXB0aW9uOiB0aGlzLmZvb3RlclZpZXcubW9kZWwuJG1vZGVsLmRlc2NyaXB0aW9uLFxyXG5cdFx0XHRcdGxheW91dDogdGhpcy5jb25maWcubGF5b3V0XHJcblx0XHRcdH0pO1x0XHJcblx0XHR9KS50aGVuKCAoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVzZXRIZWlnaHQoKTtcdFxyXG5cdFx0XHRpZiAoIHRoaXMuY29uZmlnLmxheW91dCA9PT0gJ3NtYWxsJyApIHtcclxuXHRcdFx0XHR0aGlzLmNhcm91c2VsID0gbmV3IENhcm91c2VsKHtcclxuXHRcdFx0XHRcdGVsOiAnW2RhdGEtY2Fyb3VzZWw9XCJsZWFkZXJib2FyZFwiXScsXHJcblx0XHRcdFx0XHR3aWRnZXQ6IHRoaXMsXHJcblx0XHRcdFx0XHR2aWV3OiB0aGlzLmxlYWRlcmJvYXJkTGlzdFZpZXcsXHJcblx0XHRcdFx0XHRwYWdlU2l6ZTogNVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuYW5hbHl0aWNzID0gdGhpcy5pbml0QW5hbHl0aWNzKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZ1bmRyYWlzZXJMZWFkZXJib2FyZDtcclxuIl19\n},{\"./ModelLeaderboard\":57,\"es6-promise\":24,\"justgiving-widget-framework/components/lib/carousel/Carousel\":47,\"justgiving-widget-framework/components/lib/js/framework/Model\":50,\"justgiving-widget-framework/components/lib/js/framework/View\":51,\"justgiving-widget-framework/components/lib/js/framework/Widget\":52}],57:[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 Promise = require('es6-promise').Promise;\n\n/**\r\n * Create a fundraiser model \r\n * @classdesc Augent model to add the % of target reached, the ranking of the fundraiser and UTM-augmented URL of FRP\r\n */\n\nvar ModelLeaderboard = (function (_Model) {\n\t_inherits(ModelLeaderboard, _Model);\n\n\tfunction ModelLeaderboard(options) {\n\t\t_classCallCheck(this, ModelLeaderboard);\n\n\t\t_get(Object.getPrototypeOf(ModelLeaderboard.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(ModelLeaderboard, [{\n\t\tkey: 'getModel',\n\t\tvalue: function getModel(reference) {\n\t\t\tvar _this = this;\n\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\t_get(Object.getPrototypeOf(ModelLeaderboard.prototype), 'getModel', _this).call(_this).then(function () {\n\t\t\t\t\tvar currencySymbol = _this.$model.currencySymbol;\n\t\t\t\t\t_this.$model.pages.sort(function (a, b) {\n\t\t\t\t\t\treturn b.amount - a.amount;\n\t\t\t\t\t}).forEach(function (fundraiser, i) {\n\t\t\t\t\t\tfundraiser.prettyAmount = (0, _justgivingWidgetFrameworkComponentsLibJsWidgetModelNumber.commaFormat)(Math.round(fundraiser.amount));\n\t\t\t\t\t\tfundraiser.targetPc = (0, _justgivingWidgetFrameworkComponentsLibJsWidgetModelNumber.commaFormat)('' + (0, _justgivingWidgetFrameworkComponentsLibJsWidgetModelNumber.getPercent)(fundraiser.amount, fundraiser.targetAmount));\n\t\t\t\t\t\tfundraiser.ranking = i + 1;\n\t\t\t\t\t\tfundraiser.currencySymbol = currencySymbol;\n\t\t\t\t\t\tfundraiser.avatar = fundraiser.ownerProfileImageUrls[1].Value;\n\t\t\t\t\t\tfundraiser.donationUrl = _this.getDonationUrl(fundraiser.pageId, _this.getFullReference(reference));\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\n\t\t/**\r\n * Gets widgets full reference\r\n */\n\t}, {\n\t\tkey: 'getFullReference',\n\t\tvalue: function getFullReference(reference) {\n\t\t\tvar referenceSuffix = 'fundraiserlb_buttonv1';\n\t\t\treturn reference ? reference + '_' + referenceSuffix : referenceSuffix;\n\t\t}\n\n\t\t/**\r\n * Gets the donation url\r\n */\n\t}, {\n\t\tkey: 'getDonationUrl',\n\t\tvalue: function getDonationUrl(pageId, reference) {\n\t\t\tvar donationUrl = 'https://link.justgiving.com/v1/fundraisingpage/donate/pageid/{pageId}?reference={reference}';\n\t\t\tdonationUrl = donationUrl.replace('{pageId}', pageId).replace('{reference}', reference);\n\t\t\treturn donationUrl;\n\t\t}\n\t}]);\n\n\treturn ModelLeaderboard;\n})(_justgivingWidgetFrameworkComponentsLibJsFrameworkModel2['default']);\n\nexports['default'] = ModelLeaderboard;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvc3JjL3NjcmlwdHMvYXBwL01vZGVsTGVhZGVyYm9hcmQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O3NFQUdLLCtEQUErRDs7Ozt5RUFDdEQsbUVBQW1FOztBQUY5RixJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDOzs7Ozs7O0lBU3ZDLGdCQUFnQjtXQUFoQixnQkFBZ0I7O0FBQ1YsVUFETixnQkFBZ0IsQ0FDUixPQUFPLEVBQUc7d0JBRGxCLGdCQUFnQjs7QUFFcEIsNkJBRkksZ0JBQWdCLDZDQUViLE9BQU8sRUFBRztFQUNqQjs7Ozs7OztjQUhJLGdCQUFnQjs7U0FRWixrQkFBRSxTQUFTLEVBQUc7OztBQUN0QixVQUFPLElBQUksT0FBTyxDQUFFLFVBQUUsT0FBTyxFQUFNO0FBQ2xDLCtCQVZHLGdCQUFnQiw0Q0FVRixJQUFJLENBQUUsWUFBTTtBQUM1QixTQUFJLGNBQWMsR0FBRyxNQUFLLE1BQU0sQ0FBQyxjQUFjLENBQUM7QUFDaEQsV0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBRSxVQUFDLENBQUMsRUFBRSxDQUFDLEVBQUs7QUFDakMsYUFBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7TUFDM0IsQ0FBQyxDQUFDLE9BQU8sQ0FBRSxVQUFFLFVBQVUsRUFBRSxDQUFDLEVBQU07QUFDaEMsZ0JBQVUsQ0FBQyxZQUFZLEdBQUcsNEVBQWEsSUFBSSxDQUFDLEtBQUssQ0FBRSxVQUFVLENBQUMsTUFBTSxDQUFFLENBQUUsQ0FBQztBQUN6RSxnQkFBVSxDQUFDLFFBQVEsR0FBRyxpRkFBZ0IsMkVBQVcsVUFBVSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUksQ0FBQztBQUNqRyxnQkFBVSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLGdCQUFVLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztBQUMzQyxnQkFBVSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQzlELGdCQUFVLENBQUMsV0FBVyxHQUFHLE1BQUssY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBSyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO01BQ2xHLENBQUMsQ0FBQztBQUNILFlBQU8sRUFBRSxDQUFDO0tBQ1YsQ0FBQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0dBQ0g7Ozs7Ozs7U0FJZ0IsMEJBQUUsU0FBUyxFQUFHO0FBQzlCLE9BQU0sZUFBZSxHQUFHLHVCQUF1QixDQUFDO0FBQ2hELFVBQU8sU0FBUyxHQUFNLFNBQVMsU0FBSSxlQUFlLEdBQUssZUFBZSxDQUFDO0dBQ3ZFOzs7Ozs7O1NBSWEsd0JBQUMsTUFBTSxFQUFFLFNBQVMsRUFBQztBQUNoQyxPQUFJLFdBQVcsZ0dBQWdHLENBQUM7QUFDaEgsY0FBVyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDeEYsVUFBTyxXQUFXLENBQUM7R0FDbkI7OztRQXhDSSxnQkFBZ0I7OztxQkEyQ1AsZ0JBQWdCIiwiZmlsZSI6IkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2Z1bmRyYWlzZXItbGVhZGVyYm9hcmQvc3JjL3NjcmlwdHMvYXBwL01vZGVsTGVhZGVyYm9hcmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG5sZXQgUHJvbWlzZSA9IHJlcXVpcmUoJ2VzNi1wcm9taXNlJykuUHJvbWlzZTtcclxuaW1wb3J0IE1vZGVsIGZyb20gJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvTW9kZWwnO1xyXG5pbXBvcnQgeyBnZXRQZXJjZW50IH0gZnJvbSAnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3dpZGdldC9tb2RlbC9udW1iZXInO1xyXG5pbXBvcnQgeyBjb21tYUZvcm1hdCB9IGZyb20gJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy93aWRnZXQvbW9kZWwvbnVtYmVyJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBmdW5kcmFpc2VyIG1vZGVsIFxyXG4gKiBAY2xhc3NkZXNjIEF1Z2VudCBtb2RlbCB0byBhZGQgdGhlICUgb2YgdGFyZ2V0IHJlYWNoZWQsIHRoZSByYW5raW5nIG9mIHRoZSBmdW5kcmFpc2VyIGFuZCBVVE0tYXVnbWVudGVkIFVSTCBvZiBGUlBcclxuICovXHJcbmNsYXNzIE1vZGVsTGVhZGVyYm9hcmQgZXh0ZW5kcyBNb2RlbCB7XHJcblx0Y29uc3RydWN0b3IoIG9wdGlvbnMgKSB7XHJcblx0XHRzdXBlciggb3B0aW9ucyApO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBFeHRlbmQgbW9kZWwncyBnZXQgbW9kZWwgbWV0aG9kXHJcblx0ICogQGRlc2NyaXB0aW9uIEV4dGVuZCBtb2RlbCdzIGdldCBtb2RlbCBtZXRob2QgdG8gaW5jbHVkZSBkYXRhIGF1Z21lbnRhdGlvbiBvZiByZXR1cm5lZCBjb2xsZWN0aW9uIGRhdGFcclxuXHQgKi9cclxuXHRnZXRNb2RlbCAoIHJlZmVyZW5jZSApIHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSggKCByZXNvbHZlICkgPT4geyBcclxuXHRcdFx0c3VwZXIuZ2V0TW9kZWwoKS50aGVuKCAoKSA9PiB7XHJcblx0XHRcdFx0dmFyIGN1cnJlbmN5U3ltYm9sID0gdGhpcy4kbW9kZWwuY3VycmVuY3lTeW1ib2w7XHJcblx0XHRcdFx0dGhpcy4kbW9kZWwucGFnZXMuc29ydCggKGEsIGIpID0+IHtcclxuXHRcdFx0XHRcdHJldHVybiBiLmFtb3VudCAtIGEuYW1vdW50O1xyXG5cdFx0XHRcdH0pLmZvckVhY2goICggZnVuZHJhaXNlciwgaSApID0+IHtcclxuXHRcdFx0XHRcdGZ1bmRyYWlzZXIucHJldHR5QW1vdW50ID0gY29tbWFGb3JtYXQoIE1hdGgucm91bmQoIGZ1bmRyYWlzZXIuYW1vdW50ICkgKTtcclxuXHRcdFx0XHRcdGZ1bmRyYWlzZXIudGFyZ2V0UGMgPSBjb21tYUZvcm1hdCggYCR7Z2V0UGVyY2VudChmdW5kcmFpc2VyLmFtb3VudCwgZnVuZHJhaXNlci50YXJnZXRBbW91bnQpfWAgKTtcclxuXHRcdFx0XHRcdGZ1bmRyYWlzZXIucmFua2luZyA9IGkgKyAxO1x0XHJcblx0XHRcdFx0XHRmdW5kcmFpc2VyLmN1cnJlbmN5U3ltYm9sID0gY3VycmVuY3lTeW1ib2w7XHJcblx0XHRcdFx0XHRmdW5kcmFpc2VyLmF2YXRhciA9IGZ1bmRyYWlzZXIub3duZXJQcm9maWxlSW1hZ2VVcmxzWzFdLlZhbHVlOyBcclxuXHRcdFx0XHRcdGZ1bmRyYWlzZXIuZG9uYXRpb25VcmwgPSB0aGlzLmdldERvbmF0aW9uVXJsKGZ1bmRyYWlzZXIucGFnZUlkLCB0aGlzLmdldEZ1bGxSZWZlcmVuY2UocmVmZXJlbmNlKSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiAgR2V0cyB3aWRnZXRzIGZ1bGwgcmVmZXJlbmNlXHJcblx0ICovXHJcblx0Z2V0RnVsbFJlZmVyZW5jZSAoIHJlZmVyZW5jZSApIHtcclxuXHRcdGNvbnN0IHJlZmVyZW5jZVN1ZmZpeCA9ICdmdW5kcmFpc2VybGJfYnV0dG9udjEnO1xyXG5cdFx0cmV0dXJuIHJlZmVyZW5jZSA/IGAke3JlZmVyZW5jZX1fJHtyZWZlcmVuY2VTdWZmaXh9YCA6IHJlZmVyZW5jZVN1ZmZpeDtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogIEdldHMgdGhlIGRvbmF0aW9uIHVybFxyXG5cdCAqL1xyXG5cdGdldERvbmF0aW9uVXJsKHBhZ2VJZCwgcmVmZXJlbmNlKXtcclxuXHRcdHZhciBkb25hdGlvblVybCA9IGBodHRwczovL2xpbmsuanVzdGdpdmluZy5jb20vdjEvZnVuZHJhaXNpbmdwYWdlL2RvbmF0ZS9wYWdlaWQve3BhZ2VJZH0/cmVmZXJlbmNlPXtyZWZlcmVuY2V9YDtcclxuXHRcdGRvbmF0aW9uVXJsID0gZG9uYXRpb25VcmwucmVwbGFjZSgne3BhZ2VJZH0nLCBwYWdlSWQpLnJlcGxhY2UoJ3tyZWZlcmVuY2V9JywgcmVmZXJlbmNlKTtcclxuXHRcdHJldHVybiBkb25hdGlvblVybDtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1vZGVsTGVhZGVyYm9hcmQ7XHJcbiJdfQ==\n},{\"es6-promise\":24,\"justgiving-widget-framework/components/lib/js/framework/Model\":50,\"justgiving-widget-framework/components/lib/js/widget/model/number\":55}]},{},[1])\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvc2NyaXB0cy9tYWluLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMucnVudGltZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvYmFzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvYXN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9jb21waWxlci9iYXNlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9jb21waWxlci9jb2RlLWdlbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvY29tcGlsZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2NvbXBpbGVyL2hlbHBlcnMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2NvbXBpbGVyL2phdmFzY3JpcHQtY29tcGlsZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2NvbXBpbGVyL3BhcnNlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvcHJpbnRlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvdmlzaXRvci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvd2hpdGVzcGFjZS1jb250cm9sLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9leGNlcHRpb24uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL25vLWNvbmZsaWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9ydW50aW1lLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9zYWZlLXN0cmluZy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvdXRpbHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9saWIvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvYW1kZWZpbmUvYW1kZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9saWIvX2VtcHR5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Zvci1lYWNoL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2dsb2JhbC93aW5kb3cuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvaGFtbWVyanMvaGFtbWVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2lzLWZ1bmN0aW9uL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3BhcnNlLWhlYWRlcnMvcGFyc2UtaGVhZGVycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9wYXRoLWJyb3dzZXJpZnkvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwL2FycmF5LXNldC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwL2Jhc2U2NC12bHEuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC9iYXNlNjQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC9iaW5hcnktc2VhcmNoLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAvbWFwcGluZy1saXN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwL3NvdXJjZS1tYXAtZ2VuZXJhdG9yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAvc291cmNlLW5vZGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC91dGlsLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3RyaW0vaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMveGhyL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3h0ZW5kL2ltbXV0YWJsZS5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL0hhbmRsZWJhcnMvaGFuZGxlYmFycy5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL0hhbmRsZWJhcnMvaGVscGVycy5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL0hhbmRsZWJhcnMvcGFydGlhbHMvX2xpc3QuanMiLCJib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9jYXJvdXNlbC9DYXJvdXNlbC5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL0RPTS9nZXRWZW5kb3JQcm9wZXJ0eS5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9BbmFseXRpY3MuanMiLCJib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvTW9kZWwuanMiLCJib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvVmlldy5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9XaWRnZXQuanMiLCJib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy91dGlscy9kZWJvdW5jZS5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3V0aWxzL3F1ZXJ5U3RyaW5nLmpzIiwiYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvd2lkZ2V0L21vZGVsL251bWJlci5qcyIsInNyYy9zY3JpcHRzL2FwcC9GdW5kcmFpc2VyTGVhZGVyYm9hcmQuanMiLCJzcmMvc2NyaXB0cy9hcHAvTW9kZWxMZWFkZXJib2FyZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25LQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JpQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdk9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hUQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvOEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25sRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9qQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDclBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDblZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX2FwcEZ1bmRyYWlzZXJMZWFkZXJib2FyZCA9IHJlcXVpcmUoJy4vYXBwL0Z1bmRyYWlzZXJMZWFkZXJib2FyZCcpO1xuXG52YXIgX2FwcEZ1bmRyYWlzZXJMZWFkZXJib2FyZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hcHBGdW5kcmFpc2VyTGVhZGVyYm9hcmQpO1xuXG5uZXcgX2FwcEZ1bmRyYWlzZXJMZWFkZXJib2FyZDJbJ2RlZmF1bHQnXSh7IHdpZGdldE5hbWU6ICdmdW5kcmFpc2VyLWxlYWRlcmJvYXJkJyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyWjFibVJ5WVdselpYSXRiR1ZoWkdWeVltOWhjbVF2YzNKakwzTmpjbWx3ZEhNdmJXRnBiaTVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeFpRVUZaTEVOQlFVTTdPenM3ZDBOQlJYRkNMRFpDUVVFMlFqczdPenRCUVVVdlJDd3dRMEZCTUVJc1JVRkJSU3hWUVVGVkxFVkJRVVVzZDBKQlFYZENMRVZCUVVVc1EwRkJReXhEUVVGRElpd2labWxzWlNJNklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyWjFibVJ5WVdselpYSXRiR1ZoWkdWeVltOWhjbVF2YzNKakwzTmpjbWx3ZEhNdmJXRnBiaTVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpZDFjMlVnYzNSeWFXTjBKenRjY2x4dVhISmNibWx0Y0c5eWRDQkdkVzVrY21GcGMyVnlUR1ZoWkdWeVltOWhjbVFnWm5KdmJTQW5MaTloY0hBdlJuVnVaSEpoYVhObGNreGxZV1JsY21KdllYSmtKenRjY2x4dVhISmNibTVsZHlCR2RXNWtjbUZwYzJWeVRHVmhaR1Z5WW05aGNtUW9leUIzYVdSblpYUk9ZVzFsT2lBblpuVnVaSEpoYVhObGNpMXNaV0ZrWlhKaWIyRnlaQ2NnZlNrN1hISmNiaUpkZlE9PSIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9O1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3J1bnRpbWUgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMucnVudGltZScpO1xuXG52YXIgX3J1bnRpbWUyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3J1bnRpbWUpO1xuXG4vLyBDb21waWxlciBpbXBvcnRzXG5cbnZhciBfQVNUID0gcmVxdWlyZSgnLi9oYW5kbGViYXJzL2NvbXBpbGVyL2FzdCcpO1xuXG52YXIgX0FTVDIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfQVNUKTtcblxudmFyIF9QYXJzZXIkcGFyc2UgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvY29tcGlsZXIvYmFzZScpO1xuXG52YXIgX0NvbXBpbGVyJGNvbXBpbGUkcHJlY29tcGlsZSA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9jb21waWxlci9jb21waWxlcicpO1xuXG52YXIgX0phdmFTY3JpcHRDb21waWxlciA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9jb21waWxlci9qYXZhc2NyaXB0LWNvbXBpbGVyJyk7XG5cbnZhciBfSmF2YVNjcmlwdENvbXBpbGVyMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9KYXZhU2NyaXB0Q29tcGlsZXIpO1xuXG52YXIgX1Zpc2l0b3IgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvY29tcGlsZXIvdmlzaXRvcicpO1xuXG52YXIgX1Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX1Zpc2l0b3IpO1xuXG52YXIgX25vQ29uZmxpY3QgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvbm8tY29uZmxpY3QnKTtcblxudmFyIF9ub0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9ub0NvbmZsaWN0KTtcblxudmFyIF9jcmVhdGUgPSBfcnVudGltZTJbJ2RlZmF1bHQnXS5jcmVhdGU7XG5mdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBoYiA9IF9jcmVhdGUoKTtcblxuICBoYi5jb21waWxlID0gZnVuY3Rpb24gKGlucHV0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIF9Db21waWxlciRjb21waWxlJHByZWNvbXBpbGUuY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpO1xuICB9O1xuICBoYi5wcmVjb21waWxlID0gZnVuY3Rpb24gKGlucHV0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIF9Db21waWxlciRjb21waWxlJHByZWNvbXBpbGUucHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpO1xuICB9O1xuXG4gIGhiLkFTVCA9IF9BU1QyWydkZWZhdWx0J107XG4gIGhiLkNvbXBpbGVyID0gX0NvbXBpbGVyJGNvbXBpbGUkcHJlY29tcGlsZS5Db21waWxlcjtcbiAgaGIuSmF2YVNjcmlwdENvbXBpbGVyID0gX0phdmFTY3JpcHRDb21waWxlcjJbJ2RlZmF1bHQnXTtcbiAgaGIuUGFyc2VyID0gX1BhcnNlciRwYXJzZS5wYXJzZXI7XG4gIGhiLnBhcnNlID0gX1BhcnNlciRwYXJzZS5wYXJzZTtcblxuICByZXR1cm4gaGI7XG59XG5cbnZhciBpbnN0ID0gY3JlYXRlKCk7XG5pbnN0LmNyZWF0ZSA9IGNyZWF0ZTtcblxuX25vQ29uZmxpY3QyWydkZWZhdWx0J10oaW5zdCk7XG5cbmluc3QuVmlzaXRvciA9IF9WaXNpdG9yMlsnZGVmYXVsdCddO1xuXG5pbnN0WydkZWZhdWx0J10gPSBpbnN0O1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBpbnN0O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH07XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfaW1wb3J0ID0gcmVxdWlyZSgnLi9oYW5kbGViYXJzL2Jhc2UnKTtcblxudmFyIGJhc2UgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaW1wb3J0KTtcblxuLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLlxuLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cylcblxudmFyIF9TYWZlU3RyaW5nID0gcmVxdWlyZSgnLi9oYW5kbGViYXJzL3NhZmUtc3RyaW5nJyk7XG5cbnZhciBfU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfU2FmZVN0cmluZyk7XG5cbnZhciBfRXhjZXB0aW9uID0gcmVxdWlyZSgnLi9oYW5kbGViYXJzL2V4Y2VwdGlvbicpO1xuXG52YXIgX0V4Y2VwdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfRXhjZXB0aW9uKTtcblxudmFyIF9pbXBvcnQyID0gcmVxdWlyZSgnLi9oYW5kbGViYXJzL3V0aWxzJyk7XG5cbnZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9pbXBvcnQyKTtcblxudmFyIF9pbXBvcnQzID0gcmVxdWlyZSgnLi9oYW5kbGViYXJzL3J1bnRpbWUnKTtcblxudmFyIHJ1bnRpbWUgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaW1wb3J0Myk7XG5cbnZhciBfbm9Db25mbGljdCA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9uby1jb25mbGljdCcpO1xuXG52YXIgX25vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX25vQ29uZmxpY3QpO1xuXG4vLyBGb3IgY29tcGF0aWJpbGl0eSBhbmQgdXNhZ2Ugb3V0c2lkZSBvZiBtb2R1bGUgc3lzdGVtcywgbWFrZSB0aGUgSGFuZGxlYmFycyBvYmplY3QgYSBuYW1lc3BhY2VcbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIGhiID0gbmV3IGJhc2UuSGFuZGxlYmFyc0Vudmlyb25tZW50KCk7XG5cbiAgVXRpbHMuZXh0ZW5kKGhiLCBiYXNlKTtcbiAgaGIuU2FmZVN0cmluZyA9IF9TYWZlU3RyaW5nMlsnZGVmYXVsdCddO1xuICBoYi5FeGNlcHRpb24gPSBfRXhjZXB0aW9uMlsnZGVmYXVsdCddO1xuICBoYi5VdGlscyA9IFV0aWxzO1xuICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjtcblxuICBoYi5WTSA9IHJ1bnRpbWU7XG4gIGhiLnRlbXBsYXRlID0gZnVuY3Rpb24gKHNwZWMpIHtcbiAgICByZXR1cm4gcnVudGltZS50ZW1wbGF0ZShzcGVjLCBoYik7XG4gIH07XG5cbiAgcmV0dXJuIGhiO1xufVxuXG52YXIgaW5zdCA9IGNyZWF0ZSgpO1xuaW5zdC5jcmVhdGUgPSBjcmVhdGU7XG5cbl9ub0NvbmZsaWN0MlsnZGVmYXVsdCddKGluc3QpO1xuXG5pbnN0WydkZWZhdWx0J10gPSBpbnN0O1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBpbnN0O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH07XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLkhhbmRsZWJhcnNFbnZpcm9ubWVudCA9IEhhbmRsZWJhcnNFbnZpcm9ubWVudDtcbmV4cG9ydHMuY3JlYXRlRnJhbWUgPSBjcmVhdGVGcmFtZTtcblxudmFyIF9pbXBvcnQgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9pbXBvcnQpO1xuXG52YXIgX0V4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG5cbnZhciBfRXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9FeGNlcHRpb24pO1xuXG52YXIgVkVSU0lPTiA9ICczLjAuMSc7XG5leHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OO1xudmFyIENPTVBJTEVSX1JFVklTSU9OID0gNjtcblxuZXhwb3J0cy5DT01QSUxFUl9SRVZJU0lPTiA9IENPTVBJTEVSX1JFVklTSU9OO1xudmFyIFJFVklTSU9OX0NIQU5HRVMgPSB7XG4gIDE6ICc8PSAxLjAucmMuMicsIC8vIDEuMC5yYy4yIGlzIGFjdHVhbGx5IHJldjIgYnV0IGRvZXNuJ3QgcmVwb3J0IGl0XG4gIDI6ICc9PSAxLjAuMC1yYy4zJyxcbiAgMzogJz09IDEuMC4wLXJjLjQnLFxuICA0OiAnPT0gMS54LngnLFxuICA1OiAnPT0gMi4wLjAtYWxwaGEueCcsXG4gIDY6ICc+PSAyLjAuMC1iZXRhLjEnXG59O1xuXG5leHBvcnRzLlJFVklTSU9OX0NIQU5HRVMgPSBSRVZJU0lPTl9DSEFOR0VTO1xudmFyIGlzQXJyYXkgPSBVdGlscy5pc0FycmF5LFxuICAgIGlzRnVuY3Rpb24gPSBVdGlscy5pc0Z1bmN0aW9uLFxuICAgIHRvU3RyaW5nID0gVXRpbHMudG9TdHJpbmcsXG4gICAgb2JqZWN0VHlwZSA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG5mdW5jdGlvbiBIYW5kbGViYXJzRW52aXJvbm1lbnQoaGVscGVycywgcGFydGlhbHMpIHtcbiAgdGhpcy5oZWxwZXJzID0gaGVscGVycyB8fCB7fTtcbiAgdGhpcy5wYXJ0aWFscyA9IHBhcnRpYWxzIHx8IHt9O1xuXG4gIHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7XG59XG5cbkhhbmRsZWJhcnNFbnZpcm9ubWVudC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBIYW5kbGViYXJzRW52aXJvbm1lbnQsXG5cbiAgbG9nZ2VyOiBsb2dnZXIsXG4gIGxvZzogbG9nLFxuXG4gIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikge1xuICAgIGlmICh0b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7XG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgaGVscGVycycpO1xuICAgICAgfVxuICAgICAgVXRpbHMuZXh0ZW5kKHRoaXMuaGVscGVycywgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVscGVyc1tuYW1lXSA9IGZuO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlckhlbHBlcjogZnVuY3Rpb24gdW5yZWdpc3RlckhlbHBlcihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuaGVscGVyc1tuYW1lXTtcbiAgfSxcblxuICByZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uIHJlZ2lzdGVyUGFydGlhbChuYW1lLCBwYXJ0aWFsKSB7XG4gICAgaWYgKHRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5cGUpIHtcbiAgICAgIFV0aWxzLmV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgYXMgdW5kZWZpbmVkJyk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhcnRpYWxzW25hbWVdID0gcGFydGlhbDtcbiAgICB9XG4gIH0sXG4gIHVucmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbiB1bnJlZ2lzdGVyUGFydGlhbChuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMucGFydGlhbHNbbmFtZV07XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMoaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIEEgbWlzc2luZyBmaWVsZCBpbiBhIHt7Zm9vfX0gY29uc3R1Y3QuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTb21lb25lIGlzIGFjdHVhbGx5IHRyeWluZyB0byBjYWxsIHNvbWV0aGluZywgYmxvdyB1cC5cbiAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdNaXNzaW5nIGhlbHBlcjogXCInICsgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5uYW1lICsgJ1wiJyk7XG4gICAgfVxuICB9KTtcblxuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignYmxvY2tIZWxwZXJNaXNzaW5nJywgZnVuY3Rpb24gKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICB2YXIgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSxcbiAgICAgICAgZm4gPSBvcHRpb25zLmZuO1xuXG4gICAgaWYgKGNvbnRleHQgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBmbih0aGlzKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRleHQgPT09IGZhbHNlIHx8IGNvbnRleHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGludmVyc2UodGhpcyk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KGNvbnRleHQpKSB7XG4gICAgICBpZiAoY29udGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmlkcykge1xuICAgICAgICAgIG9wdGlvbnMuaWRzID0gW29wdGlvbnMubmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5zdGFuY2UuaGVscGVycy5lYWNoKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGludmVyc2UodGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5pZHMpIHtcbiAgICAgICAgdmFyIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gVXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpO1xuICAgICAgICBvcHRpb25zID0geyBkYXRhOiBkYXRhIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbihjb250ZXh0LCBvcHRpb25zKTtcbiAgICB9XG4gIH0pO1xuXG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdlYWNoJywgZnVuY3Rpb24gKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdNdXN0IHBhc3MgaXRlcmF0b3IgdG8gI2VhY2gnKTtcbiAgICB9XG5cbiAgICB2YXIgZm4gPSBvcHRpb25zLmZuLFxuICAgICAgICBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLFxuICAgICAgICBpID0gMCxcbiAgICAgICAgcmV0ID0gJycsXG4gICAgICAgIGRhdGEgPSB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRleHRQYXRoID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykge1xuICAgICAgY29udGV4dFBhdGggPSBVdGlscy5hcHBlbmRDb250ZXh0UGF0aChvcHRpb25zLmRhdGEuY29udGV4dFBhdGgsIG9wdGlvbnMuaWRzWzBdKSArICcuJztcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihjb250ZXh0KSkge1xuICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5kYXRhKSB7XG4gICAgICBkYXRhID0gY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleGVjSXRlcmF0aW9uKGZpZWxkLCBpbmRleCwgbGFzdCkge1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZGF0YS5rZXkgPSBmaWVsZDtcbiAgICAgICAgZGF0YS5pbmRleCA9IGluZGV4O1xuICAgICAgICBkYXRhLmZpcnN0ID0gaW5kZXggPT09IDA7XG4gICAgICAgIGRhdGEubGFzdCA9ICEhbGFzdDtcblxuICAgICAgICBpZiAoY29udGV4dFBhdGgpIHtcbiAgICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gY29udGV4dFBhdGggKyBmaWVsZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXQgPSByZXQgKyBmbihjb250ZXh0W2ZpZWxkXSwge1xuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBibG9ja1BhcmFtczogVXRpbHMuYmxvY2tQYXJhbXMoW2NvbnRleHRbZmllbGRdLCBmaWVsZF0sIFtjb250ZXh0UGF0aCArIGZpZWxkLCBudWxsXSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjb250ZXh0ICYmIHR5cGVvZiBjb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKGlzQXJyYXkoY29udGV4dCkpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IGNvbnRleHQubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgZXhlY0l0ZXJhdGlvbihpLCBpLCBpID09PSBjb250ZXh0Lmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIHRoZSBpdGVyYXRpb25zIG9uZSBzdGVwIG91dCBvZiBzeW5jIHNvIHdlIGNhbiBkZXRlY3RcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGl0ZXJhdGlvbiB3aXRob3V0IGhhdmUgdG8gc2NhbiB0aGUgb2JqZWN0IHR3aWNlIGFuZCBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFuIGl0ZXJtZWRpYXRlIGtleXMgYXJyYXkuXG4gICAgICAgICAgICBpZiAocHJpb3JLZXkpIHtcbiAgICAgICAgICAgICAgZXhlY0l0ZXJhdGlvbihwcmlvcktleSwgaSAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJpb3JLZXkgPSBrZXk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcmlvcktleSkge1xuICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpID09PSAwKSB7XG4gICAgICByZXQgPSBpbnZlcnNlKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH0pO1xuXG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdpZicsIGZ1bmN0aW9uIChjb25kaXRpb25hbCwgb3B0aW9ucykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNvbmRpdGlvbmFsKSkge1xuICAgICAgY29uZGl0aW9uYWwgPSBjb25kaXRpb25hbC5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVuZGVyIHRoZSBwb3NpdGl2ZSBwYXRoIGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHkgYW5kIG5vdCBlbXB0eS5cbiAgICAvLyBUaGUgYGluY2x1ZGVaZXJvYCBvcHRpb24gbWF5IGJlIHNldCB0byB0cmVhdCB0aGUgY29uZHRpb25hbCBhcyBwdXJlbHkgbm90IGVtcHR5IGJhc2VkIG9uIHRoZVxuICAgIC8vIGJlaGF2aW9yIG9mIGlzRW1wdHkuIEVmZmVjdGl2ZWx5IHRoaXMgZGV0ZXJtaW5lcyBpZiAwIGlzIGhhbmRsZWQgYnkgdGhlIHBvc2l0aXZlIHBhdGggb3IgbmVnYXRpdmUuXG4gICAgaWYgKCFvcHRpb25zLmhhc2guaW5jbHVkZVplcm8gJiYgIWNvbmRpdGlvbmFsIHx8IFV0aWxzLmlzRW1wdHkoY29uZGl0aW9uYWwpKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTtcbiAgICB9XG4gIH0pO1xuXG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCd1bmxlc3MnLCBmdW5jdGlvbiAoY29uZGl0aW9uYWwsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuaGVscGVyc1snaWYnXS5jYWxsKHRoaXMsIGNvbmRpdGlvbmFsLCB7IGZuOiBvcHRpb25zLmludmVyc2UsIGludmVyc2U6IG9wdGlvbnMuZm4sIGhhc2g6IG9wdGlvbnMuaGFzaCB9KTtcbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQpKSB7XG4gICAgICBjb250ZXh0ID0gY29udGV4dC5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIHZhciBmbiA9IG9wdGlvbnMuZm47XG5cbiAgICBpZiAoIVV0aWxzLmlzRW1wdHkoY29udGV4dCkpIHtcbiAgICAgIGlmIChvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5pZHMpIHtcbiAgICAgICAgdmFyIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gVXRpbHMuYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7XG4gICAgICAgIG9wdGlvbnMgPSB7IGRhdGE6IGRhdGEgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvZycsIGZ1bmN0aW9uIChtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgdmFyIGxldmVsID0gb3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsID8gcGFyc2VJbnQob3B0aW9ucy5kYXRhLmxldmVsLCAxMCkgOiAxO1xuICAgIGluc3RhbmNlLmxvZyhsZXZlbCwgbWVzc2FnZSk7XG4gIH0pO1xuXG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdsb29rdXAnLCBmdW5jdGlvbiAob2JqLCBmaWVsZCkge1xuICAgIHJldHVybiBvYmogJiYgb2JqW2ZpZWxkXTtcbiAgfSk7XG59XG5cbnZhciBsb2dnZXIgPSB7XG4gIG1ldGhvZE1hcDogeyAwOiAnZGVidWcnLCAxOiAnaW5mbycsIDI6ICd3YXJuJywgMzogJ2Vycm9yJyB9LFxuXG4gIC8vIFN0YXRlIGVudW1cbiAgREVCVUc6IDAsXG4gIElORk86IDEsXG4gIFdBUk46IDIsXG4gIEVSUk9SOiAzLFxuICBsZXZlbDogMSxcblxuICAvLyBDYW4gYmUgb3ZlcnJpZGRlbiBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudFxuICBsb2c6IGZ1bmN0aW9uIGxvZyhsZXZlbCwgbWVzc2FnZSkge1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbG9nZ2VyLmxldmVsIDw9IGxldmVsKSB7XG4gICAgICB2YXIgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07XG4gICAgICAoY29uc29sZVttZXRob2RdIHx8IGNvbnNvbGUubG9nKS5jYWxsKGNvbnNvbGUsIG1lc3NhZ2UpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydHMubG9nZ2VyID0gbG9nZ2VyO1xudmFyIGxvZyA9IGxvZ2dlci5sb2c7XG5cbmV4cG9ydHMubG9nID0gbG9nO1xuXG5mdW5jdGlvbiBjcmVhdGVGcmFtZShvYmplY3QpIHtcbiAgdmFyIGZyYW1lID0gVXRpbHMuZXh0ZW5kKHt9LCBvYmplY3QpO1xuICBmcmFtZS5fcGFyZW50ID0gb2JqZWN0O1xuICByZXR1cm4gZnJhbWU7XG59XG5cbi8qIFthcmdzLCBdb3B0aW9ucyAqLyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBBU1QgPSB7XG4gIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0oc3RhdGVtZW50cywgYmxvY2tQYXJhbXMsIHN0cmlwLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdQcm9ncmFtJztcbiAgICB0aGlzLmJvZHkgPSBzdGF0ZW1lbnRzO1xuXG4gICAgdGhpcy5ibG9ja1BhcmFtcyA9IGJsb2NrUGFyYW1zO1xuICAgIHRoaXMuc3RyaXAgPSBzdHJpcDtcbiAgfSxcblxuICBNdXN0YWNoZVN0YXRlbWVudDogZnVuY3Rpb24gTXVzdGFjaGVTdGF0ZW1lbnQocGF0aCwgcGFyYW1zLCBoYXNoLCBlc2NhcGVkLCBzdHJpcCwgbG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcbiAgICB0aGlzLnR5cGUgPSAnTXVzdGFjaGVTdGF0ZW1lbnQnO1xuXG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcyB8fCBbXTtcbiAgICB0aGlzLmhhc2ggPSBoYXNoO1xuICAgIHRoaXMuZXNjYXBlZCA9IGVzY2FwZWQ7XG5cbiAgICB0aGlzLnN0cmlwID0gc3RyaXA7XG4gIH0sXG5cbiAgQmxvY2tTdGF0ZW1lbnQ6IGZ1bmN0aW9uIEJsb2NrU3RhdGVtZW50KHBhdGgsIHBhcmFtcywgaGFzaCwgcHJvZ3JhbSwgaW52ZXJzZSwgb3BlblN0cmlwLCBpbnZlcnNlU3RyaXAsIGNsb3NlU3RyaXAsIGxvY0luZm8pIHtcbiAgICB0aGlzLmxvYyA9IGxvY0luZm87XG4gICAgdGhpcy50eXBlID0gJ0Jsb2NrU3RhdGVtZW50JztcblxuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXMgfHwgW107XG4gICAgdGhpcy5oYXNoID0gaGFzaDtcbiAgICB0aGlzLnByb2dyYW0gPSBwcm9ncmFtO1xuICAgIHRoaXMuaW52ZXJzZSA9IGludmVyc2U7XG5cbiAgICB0aGlzLm9wZW5TdHJpcCA9IG9wZW5TdHJpcDtcbiAgICB0aGlzLmludmVyc2VTdHJpcCA9IGludmVyc2VTdHJpcDtcbiAgICB0aGlzLmNsb3NlU3RyaXAgPSBjbG9zZVN0cmlwO1xuICB9LFxuXG4gIFBhcnRpYWxTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFBhcnRpYWxTdGF0ZW1lbnQobmFtZSwgcGFyYW1zLCBoYXNoLCBzdHJpcCwgbG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcbiAgICB0aGlzLnR5cGUgPSAnUGFydGlhbFN0YXRlbWVudCc7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zIHx8IFtdO1xuICAgIHRoaXMuaGFzaCA9IGhhc2g7XG5cbiAgICB0aGlzLmluZGVudCA9ICcnO1xuICAgIHRoaXMuc3RyaXAgPSBzdHJpcDtcbiAgfSxcblxuICBDb250ZW50U3RhdGVtZW50OiBmdW5jdGlvbiBDb250ZW50U3RhdGVtZW50KHN0cmluZywgbG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcbiAgICB0aGlzLnR5cGUgPSAnQ29udGVudFN0YXRlbWVudCc7XG4gICAgdGhpcy5vcmlnaW5hbCA9IHRoaXMudmFsdWUgPSBzdHJpbmc7XG4gIH0sXG5cbiAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudChjb21tZW50LCBzdHJpcCwgbG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcbiAgICB0aGlzLnR5cGUgPSAnQ29tbWVudFN0YXRlbWVudCc7XG4gICAgdGhpcy52YWx1ZSA9IGNvbW1lbnQ7XG5cbiAgICB0aGlzLnN0cmlwID0gc3RyaXA7XG4gIH0sXG5cbiAgU3ViRXhwcmVzc2lvbjogZnVuY3Rpb24gU3ViRXhwcmVzc2lvbihwYXRoLCBwYXJhbXMsIGhhc2gsIGxvY0luZm8pIHtcbiAgICB0aGlzLmxvYyA9IGxvY0luZm87XG5cbiAgICB0aGlzLnR5cGUgPSAnU3ViRXhwcmVzc2lvbic7XG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcyB8fCBbXTtcbiAgICB0aGlzLmhhc2ggPSBoYXNoO1xuICB9LFxuXG4gIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbihkYXRhLCBkZXB0aCwgcGFydHMsIG9yaWdpbmFsLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdQYXRoRXhwcmVzc2lvbic7XG5cbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMub3JpZ2luYWwgPSBvcmlnaW5hbDtcbiAgICB0aGlzLnBhcnRzID0gcGFydHM7XG4gICAgdGhpcy5kZXB0aCA9IGRlcHRoO1xuICB9LFxuXG4gIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoc3RyaW5nLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdTdHJpbmdMaXRlcmFsJztcbiAgICB0aGlzLm9yaWdpbmFsID0gdGhpcy52YWx1ZSA9IHN0cmluZztcbiAgfSxcblxuICBOdW1iZXJMaXRlcmFsOiBmdW5jdGlvbiBOdW1iZXJMaXRlcmFsKG51bWJlciwgbG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcbiAgICB0aGlzLnR5cGUgPSAnTnVtYmVyTGl0ZXJhbCc7XG4gICAgdGhpcy5vcmlnaW5hbCA9IHRoaXMudmFsdWUgPSBOdW1iZXIobnVtYmVyKTtcbiAgfSxcblxuICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoYm9vbCwgbG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcbiAgICB0aGlzLnR5cGUgPSAnQm9vbGVhbkxpdGVyYWwnO1xuICAgIHRoaXMub3JpZ2luYWwgPSB0aGlzLnZhbHVlID0gYm9vbCA9PT0gJ3RydWUnO1xuICB9LFxuXG4gIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwobG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcbiAgICB0aGlzLnR5cGUgPSAnVW5kZWZpbmVkTGl0ZXJhbCc7XG4gICAgdGhpcy5vcmlnaW5hbCA9IHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gIH0sXG5cbiAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKGxvY0luZm8pIHtcbiAgICB0aGlzLmxvYyA9IGxvY0luZm87XG4gICAgdGhpcy50eXBlID0gJ051bGxMaXRlcmFsJztcbiAgICB0aGlzLm9yaWdpbmFsID0gdGhpcy52YWx1ZSA9IG51bGw7XG4gIH0sXG5cbiAgSGFzaDogZnVuY3Rpb24gSGFzaChwYWlycywgbG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcbiAgICB0aGlzLnR5cGUgPSAnSGFzaCc7XG4gICAgdGhpcy5wYWlycyA9IHBhaXJzO1xuICB9LFxuICBIYXNoUGFpcjogZnVuY3Rpb24gSGFzaFBhaXIoa2V5LCB2YWx1ZSwgbG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcbiAgICB0aGlzLnR5cGUgPSAnSGFzaFBhaXInO1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfSxcblxuICAvLyBQdWJsaWMgQVBJIHVzZWQgdG8gZXZhbHVhdGUgZGVyaXZlZCBhdHRyaWJ1dGVzIHJlZ2FyZGluZyBBU1Qgbm9kZXNcbiAgaGVscGVyczoge1xuICAgIC8vIGEgbXVzdGFjaGUgaXMgZGVmaW5pdGVseSBhIGhlbHBlciBpZjpcbiAgICAvLyAqIGl0IGlzIGFuIGVsaWdpYmxlIGhlbHBlciwgYW5kXG4gICAgLy8gKiBpdCBoYXMgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBvciBoYXNoIHNlZ21lbnRcbiAgICBoZWxwZXJFeHByZXNzaW9uOiBmdW5jdGlvbiBoZWxwZXJFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgIHJldHVybiAhIShub2RlLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJyB8fCBub2RlLnBhcmFtcy5sZW5ndGggfHwgbm9kZS5oYXNoKTtcbiAgICB9LFxuXG4gICAgc2NvcGVkSWQ6IGZ1bmN0aW9uIHNjb3BlZElkKHBhdGgpIHtcbiAgICAgIHJldHVybiAvXlxcLnx0aGlzXFxiLy50ZXN0KHBhdGgub3JpZ2luYWwpO1xuICAgIH0sXG5cbiAgICAvLyBhbiBJRCBpcyBzaW1wbGUgaWYgaXQgb25seSBoYXMgb25lIHBhcnQsIGFuZCB0aGF0IHBhcnQgaXMgbm90XG4gICAgLy8gYC4uYCBvciBgdGhpc2AuXG4gICAgc2ltcGxlSWQ6IGZ1bmN0aW9uIHNpbXBsZUlkKHBhdGgpIHtcbiAgICAgIHJldHVybiBwYXRoLnBhcnRzLmxlbmd0aCA9PT0gMSAmJiAhQVNULmhlbHBlcnMuc2NvcGVkSWQocGF0aCkgJiYgIXBhdGguZGVwdGg7XG4gICAgfVxuICB9XG59O1xuXG4vLyBNdXN0IGJlIGV4cG9ydGVkIGFzIGFuIG9iamVjdCByYXRoZXIgdGhhbiB0aGUgcm9vdCBvZiB0aGUgbW9kdWxlIGFzIHRoZSBqaXNvbiBsZXhlclxuLy8gbXVzdCBtb2RpZnkgdGhlIG9iamVjdCB0byBvcGVyYXRlIHByb3Blcmx5LlxuZXhwb3J0c1snZGVmYXVsdCddID0gQVNUO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH07XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5cbnZhciBfcGFyc2VyID0gcmVxdWlyZSgnLi9wYXJzZXInKTtcblxudmFyIF9wYXJzZXIyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3BhcnNlcik7XG5cbnZhciBfQVNUID0gcmVxdWlyZSgnLi9hc3QnKTtcblxudmFyIF9BU1QyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0FTVCk7XG5cbnZhciBfV2hpdGVzcGFjZUNvbnRyb2wgPSByZXF1aXJlKCcuL3doaXRlc3BhY2UtY29udHJvbCcpO1xuXG52YXIgX1doaXRlc3BhY2VDb250cm9sMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9XaGl0ZXNwYWNlQ29udHJvbCk7XG5cbnZhciBfaW1wb3J0ID0gcmVxdWlyZSgnLi9oZWxwZXJzJyk7XG5cbnZhciBIZWxwZXJzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2ltcG9ydCk7XG5cbnZhciBfZXh0ZW5kID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZXhwb3J0cy5wYXJzZXIgPSBfcGFyc2VyMlsnZGVmYXVsdCddO1xuXG52YXIgeXkgPSB7fTtcbl9leHRlbmQuZXh0ZW5kKHl5LCBIZWxwZXJzLCBfQVNUMlsnZGVmYXVsdCddKTtcblxuZnVuY3Rpb24gcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHtcbiAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlZCBBU1Qgd2FzIHBhc3NlZCBpbi5cbiAgaWYgKGlucHV0LnR5cGUgPT09ICdQcm9ncmFtJykge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIF9wYXJzZXIyWydkZWZhdWx0J10ueXkgPSB5eTtcblxuICAvLyBBbHRlcmluZyB0aGUgc2hhcmVkIG9iamVjdCBoZXJlLCBidXQgdGhpcyBpcyBvayBhcyBwYXJzZXIgaXMgYSBzeW5jIG9wZXJhdGlvblxuICB5eS5sb2NJbmZvID0gZnVuY3Rpb24gKGxvY0luZm8pIHtcbiAgICByZXR1cm4gbmV3IHl5LlNvdXJjZUxvY2F0aW9uKG9wdGlvbnMgJiYgb3B0aW9ucy5zcmNOYW1lLCBsb2NJbmZvKTtcbiAgfTtcblxuICB2YXIgc3RyaXAgPSBuZXcgX1doaXRlc3BhY2VDb250cm9sMlsnZGVmYXVsdCddKCk7XG4gIHJldHVybiBzdHJpcC5hY2NlcHQoX3BhcnNlcjJbJ2RlZmF1bHQnXS5wYXJzZShpbnB1dCkpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8qZ2xvYmFsIGRlZmluZSAqL1xuXG52YXIgX2lzQXJyYXkgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG52YXIgU291cmNlTm9kZSA9IHVuZGVmaW5lZDtcblxudHJ5IHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicgfHwgIWRlZmluZS5hbWQpIHtcbiAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHRoaXMgaW4gQU1EIGVudmlyb25tZW50cy4gRm9yIHRoZXNlIGVudmlyb25tZW50cywgd2UgYXN1c21lIHRoYXRcbiAgICAvLyB0aGV5IGFyZSBydW5uaW5nIG9uIHRoZSBicm93c2VyIGFuZCB0aHVzIGhhdmUgbm8gbmVlZCBmb3IgdGhlIHNvdXJjZS1tYXAgbGlicmFyeS5cbiAgICB2YXIgU291cmNlTWFwID0gcmVxdWlyZSgnc291cmNlLW1hcCcpO1xuICAgIFNvdXJjZU5vZGUgPSBTb3VyY2VNYXAuU291cmNlTm9kZTtcbiAgfVxufSBjYXRjaCAoZXJyKSB7fVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWY6IHRlc3RlZCBidXQgbm90IGNvdmVyZWQgaW4gaXN0YW5idWwgZHVlIHRvIGRpc3QgYnVpbGQgICovXG5pZiAoIVNvdXJjZU5vZGUpIHtcbiAgU291cmNlTm9kZSA9IGZ1bmN0aW9uIChsaW5lLCBjb2x1bW4sIHNyY0ZpbGUsIGNodW5rcykge1xuICAgIHRoaXMuc3JjID0gJyc7XG4gICAgaWYgKGNodW5rcykge1xuICAgICAgdGhpcy5hZGQoY2h1bmtzKTtcbiAgICB9XG4gIH07XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlID0ge1xuICAgIGFkZDogZnVuY3Rpb24gYWRkKGNodW5rcykge1xuICAgICAgaWYgKF9pc0FycmF5LmlzQXJyYXkoY2h1bmtzKSkge1xuICAgICAgICBjaHVua3MgPSBjaHVua3Muam9pbignJyk7XG4gICAgICB9XG4gICAgICB0aGlzLnNyYyArPSBjaHVua3M7XG4gICAgfSxcbiAgICBwcmVwZW5kOiBmdW5jdGlvbiBwcmVwZW5kKGNodW5rcykge1xuICAgICAgaWYgKF9pc0FycmF5LmlzQXJyYXkoY2h1bmtzKSkge1xuICAgICAgICBjaHVua3MgPSBjaHVua3Muam9pbignJyk7XG4gICAgICB9XG4gICAgICB0aGlzLnNyYyA9IGNodW5rcyArIHRoaXMuc3JjO1xuICAgIH0sXG4gICAgdG9TdHJpbmdXaXRoU291cmNlTWFwOiBmdW5jdGlvbiB0b1N0cmluZ1dpdGhTb3VyY2VNYXAoKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiB0aGlzLnRvU3RyaW5nKCkgfTtcbiAgICB9LFxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNyYztcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhc3RDaHVuayhjaHVuaywgY29kZUdlbiwgbG9jKSB7XG4gIGlmIChfaXNBcnJheS5pc0FycmF5KGNodW5rKSkge1xuICAgIHZhciByZXQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaHVuay5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgcmV0LnB1c2goY29kZUdlbi53cmFwKGNodW5rW2ldLCBsb2MpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgY2h1bmsgPT09ICdudW1iZXInKSB7XG4gICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgdGhhdCB0aGUgU291cmNlTm9kZSB3aWxsIHRocm93IHVwIG9uXG4gICAgcmV0dXJuIGNodW5rICsgJyc7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG5mdW5jdGlvbiBDb2RlR2VuKHNyY0ZpbGUpIHtcbiAgdGhpcy5zcmNGaWxlID0gc3JjRmlsZTtcbiAgdGhpcy5zb3VyY2UgPSBbXTtcbn1cblxuQ29kZUdlbi5wcm90b3R5cGUgPSB7XG4gIHByZXBlbmQ6IGZ1bmN0aW9uIHByZXBlbmQoc291cmNlLCBsb2MpIHtcbiAgICB0aGlzLnNvdXJjZS51bnNoaWZ0KHRoaXMud3JhcChzb3VyY2UsIGxvYykpO1xuICB9LFxuICBwdXNoOiBmdW5jdGlvbiBwdXNoKHNvdXJjZSwgbG9jKSB7XG4gICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLndyYXAoc291cmNlLCBsb2MpKTtcbiAgfSxcblxuICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXMuZW1wdHkoKTtcbiAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIHNvdXJjZS5hZGQoWycgICcsIGxpbmUsICdcXG4nXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfSxcblxuICBlYWNoOiBmdW5jdGlvbiBlYWNoKGl0ZXIpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5zb3VyY2UubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGl0ZXIodGhpcy5zb3VyY2VbaV0pO1xuICAgIH1cbiAgfSxcblxuICBlbXB0eTogZnVuY3Rpb24gZW1wdHkoKSB7XG4gICAgdmFyIGxvYyA9IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5jdXJyZW50TG9jYXRpb24gfHwgeyBzdGFydDoge30gfSA6IGFyZ3VtZW50c1swXTtcblxuICAgIHJldHVybiBuZXcgU291cmNlTm9kZShsb2Muc3RhcnQubGluZSwgbG9jLnN0YXJ0LmNvbHVtbiwgdGhpcy5zcmNGaWxlKTtcbiAgfSxcbiAgd3JhcDogZnVuY3Rpb24gd3JhcChjaHVuaykge1xuICAgIHZhciBsb2MgPSBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuY3VycmVudExvY2F0aW9uIHx8IHsgc3RhcnQ6IHt9IH0gOiBhcmd1bWVudHNbMV07XG5cbiAgICBpZiAoY2h1bmsgaW5zdGFuY2VvZiBTb3VyY2VOb2RlKSB7XG4gICAgICByZXR1cm4gY2h1bms7XG4gICAgfVxuXG4gICAgY2h1bmsgPSBjYXN0Q2h1bmsoY2h1bmssIHRoaXMsIGxvYyk7XG5cbiAgICByZXR1cm4gbmV3IFNvdXJjZU5vZGUobG9jLnN0YXJ0LmxpbmUsIGxvYy5zdGFydC5jb2x1bW4sIHRoaXMuc3JjRmlsZSwgY2h1bmspO1xuICB9LFxuXG4gIGZ1bmN0aW9uQ2FsbDogZnVuY3Rpb24gZnVuY3Rpb25DYWxsKGZuLCB0eXBlLCBwYXJhbXMpIHtcbiAgICBwYXJhbXMgPSB0aGlzLmdlbmVyYXRlTGlzdChwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzLndyYXAoW2ZuLCB0eXBlID8gJy4nICsgdHlwZSArICcoJyA6ICcoJywgcGFyYW1zLCAnKSddKTtcbiAgfSxcblxuICBxdW90ZWRTdHJpbmc6IGZ1bmN0aW9uIHF1b3RlZFN0cmluZyhzdHIpIHtcbiAgICByZXR1cm4gJ1wiJyArIChzdHIgKyAnJykucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykucmVwbGFjZSgvXFxuL2csICdcXFxcbicpLnJlcGxhY2UoL1xcci9nLCAnXFxcXHInKS5yZXBsYWNlKC9cXHUyMDI4L2csICdcXFxcdTIwMjgnKSAvLyBQZXIgRWNtYS0yNjIgNy4zICsgNy44LjRcbiAgICAucmVwbGFjZSgvXFx1MjAyOS9nLCAnXFxcXHUyMDI5JykgKyAnXCInO1xuICB9LFxuXG4gIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7XG4gICAgdmFyIHBhaXJzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gY2FzdENodW5rKG9ialtrZXldLCB0aGlzKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHBhaXJzLnB1c2goW3RoaXMucXVvdGVkU3RyaW5nKGtleSksICc6JywgdmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZXQgPSB0aGlzLmdlbmVyYXRlTGlzdChwYWlycyk7XG4gICAgcmV0LnByZXBlbmQoJ3snKTtcbiAgICByZXQuYWRkKCd9Jyk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBnZW5lcmF0ZUxpc3Q6IGZ1bmN0aW9uIGdlbmVyYXRlTGlzdChlbnRyaWVzLCBsb2MpIHtcbiAgICB2YXIgcmV0ID0gdGhpcy5lbXB0eShsb2MpO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChpKSB7XG4gICAgICAgIHJldC5hZGQoJywnKTtcbiAgICAgIH1cblxuICAgICAgcmV0LmFkZChjYXN0Q2h1bmsoZW50cmllc1tpXSwgdGhpcywgbG9jKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBnZW5lcmF0ZUFycmF5OiBmdW5jdGlvbiBnZW5lcmF0ZUFycmF5KGVudHJpZXMsIGxvYykge1xuICAgIHZhciByZXQgPSB0aGlzLmdlbmVyYXRlTGlzdChlbnRyaWVzLCBsb2MpO1xuICAgIHJldC5wcmVwZW5kKCdbJyk7XG4gICAgcmV0LmFkZCgnXScpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxufTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gQ29kZUdlbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKiBOT1AgKi8iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuQ29tcGlsZXIgPSBDb21waWxlcjtcbmV4cG9ydHMucHJlY29tcGlsZSA9IHByZWNvbXBpbGU7XG5leHBvcnRzLmNvbXBpbGUgPSBjb21waWxlO1xuXG52YXIgX0V4Y2VwdGlvbiA9IHJlcXVpcmUoJy4uL2V4Y2VwdGlvbicpO1xuXG52YXIgX0V4Y2VwdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfRXhjZXB0aW9uKTtcblxudmFyIF9pc0FycmF5JGluZGV4T2YgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG52YXIgX0FTVCA9IHJlcXVpcmUoJy4vYXN0Jyk7XG5cbnZhciBfQVNUMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9BU1QpO1xuXG52YXIgc2xpY2UgPSBbXS5zbGljZTtcblxuZnVuY3Rpb24gQ29tcGlsZXIoKSB7fVxuXG4vLyB0aGUgZm91bmRIZWxwZXIgcmVnaXN0ZXIgd2lsbCBkaXNhbWJpZ3VhdGUgaGVscGVyIGxvb2t1cCBmcm9tIGZpbmRpbmcgYVxuLy8gZnVuY3Rpb24gaW4gYSBjb250ZXh0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbXVzdGFjaGUgY29tcGF0aWJpbGl0eSwgd2hpY2hcbi8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLFxuLy8gYW5kIHRoZW4gcHJvY2VlZCBhcyBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdhcyBwcm92aWRlZCB0byBibG9ja0hlbHBlck1pc3NpbmcuXG5cbkNvbXBpbGVyLnByb3RvdHlwZSA9IHtcbiAgY29tcGlsZXI6IENvbXBpbGVyLFxuXG4gIGVxdWFsczogZnVuY3Rpb24gZXF1YWxzKG90aGVyKSB7XG4gICAgdmFyIGxlbiA9IHRoaXMub3Bjb2Rlcy5sZW5ndGg7XG4gICAgaWYgKG90aGVyLm9wY29kZXMubGVuZ3RoICE9PSBsZW4pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLFxuICAgICAgICAgIG90aGVyT3Bjb2RlID0gb3RoZXIub3Bjb2Rlc1tpXTtcbiAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNvZGUgfHwgIWFyZ0VxdWFscyhvcGNvZGUuYXJncywgb3RoZXJPcGNvZGUuYXJncykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIGtub3cgdGhhdCBsZW5ndGggaXMgdGhlIHNhbWUgYmV0d2VlbiB0aGUgdHdvIGFycmF5cyBiZWNhdXNlIHRoZXkgYXJlIGRpcmVjdGx5IHRpZWRcbiAgICAvLyB0byB0aGUgb3Bjb2RlIGJlaGF2aW9yIGFib3ZlLlxuICAgIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5jaGlsZHJlbltpXS5lcXVhbHMob3RoZXIuY2hpbGRyZW5baV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcblxuICBndWlkOiAwLFxuXG4gIGNvbXBpbGU6IGZ1bmN0aW9uIGNvbXBpbGUocHJvZ3JhbSwgb3B0aW9ucykge1xuICAgIHRoaXMuc291cmNlTm9kZSA9IFtdO1xuICAgIHRoaXMub3Bjb2RlcyA9IFtdO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuc3RyaW5nUGFyYW1zID0gb3B0aW9ucy5zdHJpbmdQYXJhbXM7XG4gICAgdGhpcy50cmFja0lkcyA9IG9wdGlvbnMudHJhY2tJZHM7XG5cbiAgICBvcHRpb25zLmJsb2NrUGFyYW1zID0gb3B0aW9ucy5ibG9ja1BhcmFtcyB8fCBbXTtcblxuICAgIC8vIFRoZXNlIGNoYW5nZXMgd2lsbCBwcm9wYWdhdGUgdG8gdGhlIG90aGVyIGNvbXBpbGVyIGNvbXBvbmVudHNcbiAgICB2YXIga25vd25IZWxwZXJzID0gb3B0aW9ucy5rbm93bkhlbHBlcnM7XG4gICAgb3B0aW9ucy5rbm93bkhlbHBlcnMgPSB7XG4gICAgICBoZWxwZXJNaXNzaW5nOiB0cnVlLFxuICAgICAgYmxvY2tIZWxwZXJNaXNzaW5nOiB0cnVlLFxuICAgICAgZWFjaDogdHJ1ZSxcbiAgICAgICdpZic6IHRydWUsXG4gICAgICB1bmxlc3M6IHRydWUsXG4gICAgICAnd2l0aCc6IHRydWUsXG4gICAgICBsb2c6IHRydWUsXG4gICAgICBsb29rdXA6IHRydWVcbiAgICB9O1xuICAgIGlmIChrbm93bkhlbHBlcnMpIHtcbiAgICAgIGZvciAodmFyIF9uYW1lIGluIGtub3duSGVscGVycykge1xuICAgICAgICBpZiAoX25hbWUgaW4ga25vd25IZWxwZXJzKSB7XG4gICAgICAgICAgb3B0aW9ucy5rbm93bkhlbHBlcnNbX25hbWVdID0ga25vd25IZWxwZXJzW19uYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFjY2VwdChwcm9ncmFtKTtcbiAgfSxcblxuICBjb21waWxlUHJvZ3JhbTogZnVuY3Rpb24gY29tcGlsZVByb2dyYW0ocHJvZ3JhbSkge1xuICAgIHZhciBjaGlsZENvbXBpbGVyID0gbmV3IHRoaXMuY29tcGlsZXIoKSxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG4gICAgcmVzdWx0ID0gY2hpbGRDb21waWxlci5jb21waWxlKHByb2dyYW0sIHRoaXMub3B0aW9ucyksXG4gICAgICAgIGd1aWQgPSB0aGlzLmd1aWQrKztcblxuICAgIHRoaXMudXNlUGFydGlhbCA9IHRoaXMudXNlUGFydGlhbCB8fCByZXN1bHQudXNlUGFydGlhbDtcblxuICAgIHRoaXMuY2hpbGRyZW5bZ3VpZF0gPSByZXN1bHQ7XG4gICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCByZXN1bHQudXNlRGVwdGhzO1xuXG4gICAgcmV0dXJuIGd1aWQ7XG4gIH0sXG5cbiAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQobm9kZSkge1xuICAgIHRoaXMuc291cmNlTm9kZS51bnNoaWZ0KG5vZGUpO1xuICAgIHZhciByZXQgPSB0aGlzW25vZGUudHlwZV0obm9kZSk7XG4gICAgdGhpcy5zb3VyY2VOb2RlLnNoaWZ0KCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBQcm9ncmFtOiBmdW5jdGlvbiBQcm9ncmFtKHByb2dyYW0pIHtcbiAgICB0aGlzLm9wdGlvbnMuYmxvY2tQYXJhbXMudW5zaGlmdChwcm9ncmFtLmJsb2NrUGFyYW1zKTtcblxuICAgIHZhciBib2R5ID0gcHJvZ3JhbS5ib2R5LFxuICAgICAgICBib2R5TGVuZ3RoID0gYm9keS5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2R5TGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYWNjZXB0KGJvZHlbaV0pO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5zaGlmdCgpO1xuXG4gICAgdGhpcy5pc1NpbXBsZSA9IGJvZHlMZW5ndGggPT09IDE7XG4gICAgdGhpcy5ibG9ja1BhcmFtcyA9IHByb2dyYW0uYmxvY2tQYXJhbXMgPyBwcm9ncmFtLmJsb2NrUGFyYW1zLmxlbmd0aCA6IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYmxvY2spIHtcbiAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKGJsb2NrKTtcblxuICAgIHZhciBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSxcbiAgICAgICAgaW52ZXJzZSA9IGJsb2NrLmludmVyc2U7XG5cbiAgICBwcm9ncmFtID0gcHJvZ3JhbSAmJiB0aGlzLmNvbXBpbGVQcm9ncmFtKHByb2dyYW0pO1xuICAgIGludmVyc2UgPSBpbnZlcnNlICYmIHRoaXMuY29tcGlsZVByb2dyYW0oaW52ZXJzZSk7XG5cbiAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihibG9jayk7XG5cbiAgICBpZiAodHlwZSA9PT0gJ2hlbHBlcicpIHtcbiAgICAgIHRoaXMuaGVscGVyU2V4cHIoYmxvY2ssIHByb2dyYW0sIGludmVyc2UpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgIHRoaXMuc2ltcGxlU2V4cHIoYmxvY2spO1xuXG4gICAgICAvLyBub3cgdGhhdCB0aGUgc2ltcGxlIG11c3RhY2hlIGlzIHJlc29sdmVkLCB3ZSBuZWVkIHRvXG4gICAgICAvLyBldmFsdWF0ZSBpdCBieSBleGVjdXRpbmcgYGJsb2NrSGVscGVyTWlzc2luZ2BcbiAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pO1xuICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7XG4gICAgICB0aGlzLm9wY29kZSgnZW1wdHlIYXNoJyk7XG4gICAgICB0aGlzLm9wY29kZSgnYmxvY2tWYWx1ZScsIGJsb2NrLnBhdGgub3JpZ2luYWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFtYmlndW91c1NleHByKGJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlKTtcblxuICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0b1xuICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgXG4gICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTtcbiAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpO1xuICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpO1xuICAgICAgdGhpcy5vcGNvZGUoJ2FtYmlndW91c0Jsb2NrVmFsdWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLm9wY29kZSgnYXBwZW5kJyk7XG4gIH0sXG5cbiAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7XG4gICAgdGhpcy51c2VQYXJ0aWFsID0gdHJ1ZTtcblxuICAgIHZhciBwYXJhbXMgPSBwYXJ0aWFsLnBhcmFtcztcbiAgICBpZiAocGFyYW1zLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdVbnN1cHBvcnRlZCBudW1iZXIgb2YgcGFydGlhbCBhcmd1bWVudHM6ICcgKyBwYXJhbXMubGVuZ3RoLCBwYXJ0aWFsKTtcbiAgICB9IGVsc2UgaWYgKCFwYXJhbXMubGVuZ3RoKSB7XG4gICAgICBwYXJhbXMucHVzaCh7IHR5cGU6ICdQYXRoRXhwcmVzc2lvbicsIHBhcnRzOiBbXSwgZGVwdGg6IDAgfSk7XG4gICAgfVxuXG4gICAgdmFyIHBhcnRpYWxOYW1lID0gcGFydGlhbC5uYW1lLm9yaWdpbmFsLFxuICAgICAgICBpc0R5bmFtaWMgPSBwYXJ0aWFsLm5hbWUudHlwZSA9PT0gJ1N1YkV4cHJlc3Npb24nO1xuICAgIGlmIChpc0R5bmFtaWMpIHtcbiAgICAgIHRoaXMuYWNjZXB0KHBhcnRpYWwubmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhwYXJ0aWFsLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICB2YXIgaW5kZW50ID0gcGFydGlhbC5pbmRlbnQgfHwgJyc7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcmV2ZW50SW5kZW50ICYmIGluZGVudCkge1xuICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBpbmRlbnQpO1xuICAgICAgaW5kZW50ID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5vcGNvZGUoJ2ludm9rZVBhcnRpYWwnLCBpc0R5bmFtaWMsIHBhcnRpYWxOYW1lLCBpbmRlbnQpO1xuICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTtcbiAgfSxcblxuICBNdXN0YWNoZVN0YXRlbWVudDogZnVuY3Rpb24gTXVzdGFjaGVTdGF0ZW1lbnQobXVzdGFjaGUpIHtcbiAgICB0aGlzLlN1YkV4cHJlc3Npb24obXVzdGFjaGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcblxuICAgIGlmIChtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHtcbiAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRFc2NhcGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTtcbiAgICB9XG4gIH0sXG5cbiAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudChjb250ZW50KSB7XG4gICAgaWYgKGNvbnRlbnQudmFsdWUpIHtcbiAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRDb250ZW50JywgY29udGVudC52YWx1ZSk7XG4gICAgfVxuICB9LFxuXG4gIENvbW1lbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbW1lbnRTdGF0ZW1lbnQoKSB7fSxcblxuICBTdWJFeHByZXNzaW9uOiBmdW5jdGlvbiBTdWJFeHByZXNzaW9uKHNleHByKSB7XG4gICAgdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcik7XG4gICAgdmFyIHR5cGUgPSB0aGlzLmNsYXNzaWZ5U2V4cHIoc2V4cHIpO1xuXG4gICAgaWYgKHR5cGUgPT09ICdzaW1wbGUnKSB7XG4gICAgICB0aGlzLnNpbXBsZVNleHByKHNleHByKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdoZWxwZXInKSB7XG4gICAgICB0aGlzLmhlbHBlclNleHByKHNleHByKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihzZXhwcik7XG4gICAgfVxuICB9LFxuICBhbWJpZ3VvdXNTZXhwcjogZnVuY3Rpb24gYW1iaWd1b3VzU2V4cHIoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpIHtcbiAgICB2YXIgcGF0aCA9IHNleHByLnBhdGgsXG4gICAgICAgIG5hbWUgPSBwYXRoLnBhcnRzWzBdLFxuICAgICAgICBpc0Jsb2NrID0gcHJvZ3JhbSAhPSBudWxsIHx8IGludmVyc2UgIT0gbnVsbDtcblxuICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7XG5cbiAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTtcbiAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBpbnZlcnNlKTtcblxuICAgIHRoaXMuYWNjZXB0KHBhdGgpO1xuXG4gICAgdGhpcy5vcGNvZGUoJ2ludm9rZUFtYmlndW91cycsIG5hbWUsIGlzQmxvY2spO1xuICB9LFxuXG4gIHNpbXBsZVNleHByOiBmdW5jdGlvbiBzaW1wbGVTZXhwcihzZXhwcikge1xuICAgIHRoaXMuYWNjZXB0KHNleHByLnBhdGgpO1xuICAgIHRoaXMub3Bjb2RlKCdyZXNvbHZlUG9zc2libGVMYW1iZGEnKTtcbiAgfSxcblxuICBoZWxwZXJTZXhwcjogZnVuY3Rpb24gaGVscGVyU2V4cHIoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpIHtcbiAgICB2YXIgcGFyYW1zID0gdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSksXG4gICAgICAgIHBhdGggPSBzZXhwci5wYXRoLFxuICAgICAgICBuYW1lID0gcGF0aC5wYXJ0c1swXTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW25hbWVdKSB7XG4gICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7XG4gICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgJyArIG5hbWUsIHNleHByKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aC5mYWxzeSA9IHRydWU7XG5cbiAgICAgIHRoaXMuYWNjZXB0KHBhdGgpO1xuICAgICAgdGhpcy5vcGNvZGUoJ2ludm9rZUhlbHBlcicsIHBhcmFtcy5sZW5ndGgsIHBhdGgub3JpZ2luYWwsIF9BU1QyWydkZWZhdWx0J10uaGVscGVycy5zaW1wbGVJZChwYXRoKSk7XG4gICAgfVxuICB9LFxuXG4gIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbihwYXRoKSB7XG4gICAgdGhpcy5hZGREZXB0aChwYXRoLmRlcHRoKTtcbiAgICB0aGlzLm9wY29kZSgnZ2V0Q29udGV4dCcsIHBhdGguZGVwdGgpO1xuXG4gICAgdmFyIG5hbWUgPSBwYXRoLnBhcnRzWzBdLFxuICAgICAgICBzY29wZWQgPSBfQVNUMlsnZGVmYXVsdCddLmhlbHBlcnMuc2NvcGVkSWQocGF0aCksXG4gICAgICAgIGJsb2NrUGFyYW1JZCA9ICFwYXRoLmRlcHRoICYmICFzY29wZWQgJiYgdGhpcy5ibG9ja1BhcmFtSW5kZXgobmFtZSk7XG5cbiAgICBpZiAoYmxvY2tQYXJhbUlkKSB7XG4gICAgICB0aGlzLm9wY29kZSgnbG9va3VwQmxvY2tQYXJhbScsIGJsb2NrUGFyYW1JZCwgcGF0aC5wYXJ0cyk7XG4gICAgfSBlbHNlIGlmICghbmFtZSkge1xuICAgICAgLy8gQ29udGV4dCByZWZlcmVuY2UsIGkuZS4gYHt7Zm9vIC59fWAgb3IgYHt7Zm9vIC4ufX1gXG4gICAgICB0aGlzLm9wY29kZSgncHVzaENvbnRleHQnKTtcbiAgICB9IGVsc2UgaWYgKHBhdGguZGF0YSkge1xuICAgICAgdGhpcy5vcHRpb25zLmRhdGEgPSB0cnVlO1xuICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cERhdGEnLCBwYXRoLmRlcHRoLCBwYXRoLnBhcnRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cE9uQ29udGV4dCcsIHBhdGgucGFydHMsIHBhdGguZmFsc3ksIHNjb3BlZCk7XG4gICAgfVxuICB9LFxuXG4gIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoc3RyaW5nKSB7XG4gICAgdGhpcy5vcGNvZGUoJ3B1c2hTdHJpbmcnLCBzdHJpbmcudmFsdWUpO1xuICB9LFxuXG4gIE51bWJlckxpdGVyYWw6IGZ1bmN0aW9uIE51bWJlckxpdGVyYWwobnVtYmVyKSB7XG4gICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgbnVtYmVyLnZhbHVlKTtcbiAgfSxcblxuICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoYm9vbCkge1xuICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsIGJvb2wudmFsdWUpO1xuICB9LFxuXG4gIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSB7XG4gICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgJ3VuZGVmaW5lZCcpO1xuICB9LFxuXG4gIE51bGxMaXRlcmFsOiBmdW5jdGlvbiBOdWxsTGl0ZXJhbCgpIHtcbiAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCAnbnVsbCcpO1xuICB9LFxuXG4gIEhhc2g6IGZ1bmN0aW9uIEhhc2goaGFzaCkge1xuICAgIHZhciBwYWlycyA9IGhhc2gucGFpcnMsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBsID0gcGFpcnMubGVuZ3RoO1xuXG4gICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7XG5cbiAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgdGhpcy5wdXNoUGFyYW0ocGFpcnNbaV0udmFsdWUpO1xuICAgIH1cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB0aGlzLm9wY29kZSgnYXNzaWduVG9IYXNoJywgcGFpcnNbaV0ua2V5KTtcbiAgICB9XG4gICAgdGhpcy5vcGNvZGUoJ3BvcEhhc2gnKTtcbiAgfSxcblxuICAvLyBIRUxQRVJTXG4gIG9wY29kZTogZnVuY3Rpb24gb3Bjb2RlKG5hbWUpIHtcbiAgICB0aGlzLm9wY29kZXMucHVzaCh7IG9wY29kZTogbmFtZSwgYXJnczogc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCBsb2M6IHRoaXMuc291cmNlTm9kZVswXS5sb2MgfSk7XG4gIH0sXG5cbiAgYWRkRGVwdGg6IGZ1bmN0aW9uIGFkZERlcHRoKGRlcHRoKSB7XG4gICAgaWYgKCFkZXB0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXNlRGVwdGhzID0gdHJ1ZTtcbiAgfSxcblxuICBjbGFzc2lmeVNleHByOiBmdW5jdGlvbiBjbGFzc2lmeVNleHByKHNleHByKSB7XG4gICAgdmFyIGlzU2ltcGxlID0gX0FTVDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHNleHByLnBhdGgpO1xuXG4gICAgdmFyIGlzQmxvY2tQYXJhbSA9IGlzU2ltcGxlICYmICEhdGhpcy5ibG9ja1BhcmFtSW5kZXgoc2V4cHIucGF0aC5wYXJ0c1swXSk7XG5cbiAgICAvLyBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBpZjpcbiAgICAvLyAqIGl0cyBpZCBpcyBzaW1wbGUgKGEgc2luZ2xlIHBhcnQsIG5vdCBgdGhpc2Agb3IgYC4uYClcbiAgICB2YXIgaXNIZWxwZXIgPSAhaXNCbG9ja1BhcmFtICYmIF9BU1QyWydkZWZhdWx0J10uaGVscGVycy5oZWxwZXJFeHByZXNzaW9uKHNleHByKTtcblxuICAgIC8vIGlmIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGJ1dCBub3QgYSBkZWZpbml0ZVxuICAgIC8vIGhlbHBlciwgaXQgaXMgYW1iaWd1b3VzLCBhbmQgd2lsbCBiZSByZXNvbHZlZCBpbiBhIGxhdGVyXG4gICAgLy8gcGFzcyBvciBhdCBydW50aW1lLlxuICAgIHZhciBpc0VsaWdpYmxlID0gIWlzQmxvY2tQYXJhbSAmJiAoaXNIZWxwZXIgfHwgaXNTaW1wbGUpO1xuXG4gICAgLy8gaWYgYW1iaWd1b3VzLCB3ZSBjYW4gcG9zc2libHkgcmVzb2x2ZSB0aGUgYW1iaWd1aXR5IG5vd1xuICAgIC8vIEFuIGVsaWdpYmxlIGhlbHBlciBpcyBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tcGxleCBwYXRoLCBpLmUuIGB0aGlzLmZvb2AsIGAuLi9mb29gIGV0Yy5cbiAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHtcbiAgICAgIHZhciBfbmFtZTIgPSBzZXhwci5wYXRoLnBhcnRzWzBdLFxuICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIGlmIChvcHRpb25zLmtub3duSGVscGVyc1tfbmFtZTJdKSB7XG4gICAgICAgIGlzSGVscGVyID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7XG4gICAgICAgIGlzRWxpZ2libGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNIZWxwZXIpIHtcbiAgICAgIHJldHVybiAnaGVscGVyJztcbiAgICB9IGVsc2UgaWYgKGlzRWxpZ2libGUpIHtcbiAgICAgIHJldHVybiAnYW1iaWd1b3VzJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdzaW1wbGUnO1xuICAgIH1cbiAgfSxcblxuICBwdXNoUGFyYW1zOiBmdW5jdGlvbiBwdXNoUGFyYW1zKHBhcmFtcykge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdGhpcy5wdXNoUGFyYW0ocGFyYW1zW2ldKTtcbiAgICB9XG4gIH0sXG5cbiAgcHVzaFBhcmFtOiBmdW5jdGlvbiBwdXNoUGFyYW0odmFsKSB7XG4gICAgdmFyIHZhbHVlID0gdmFsLnZhbHVlICE9IG51bGwgPyB2YWwudmFsdWUgOiB2YWwub3JpZ2luYWwgfHwgJyc7XG5cbiAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHtcbiAgICAgIGlmICh2YWx1ZS5yZXBsYWNlKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXihcXC4/XFwuXFwvKSovZywgJycpLnJlcGxhY2UoL1xcLy9nLCAnLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsLmRlcHRoKSB7XG4gICAgICAgIHRoaXMuYWRkRGVwdGgodmFsLmRlcHRoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgdmFsLmRlcHRoIHx8IDApO1xuICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hTdHJpbmdQYXJhbScsIHZhbHVlLCB2YWwudHlwZSk7XG5cbiAgICAgIGlmICh2YWwudHlwZSA9PT0gJ1N1YkV4cHJlc3Npb24nKSB7XG4gICAgICAgIC8vIFN1YkV4cHJlc3Npb25zIGdldCBldmFsdWF0ZWQgYW5kIHBhc3NlZCBpblxuICAgICAgICAvLyBpbiBzdHJpbmcgcGFyYW1zIG1vZGUuXG4gICAgICAgIHRoaXMuYWNjZXB0KHZhbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7XG4gICAgICAgIHZhciBibG9ja1BhcmFtSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh2YWwucGFydHMgJiYgIV9BU1QyWydkZWZhdWx0J10uaGVscGVycy5zY29wZWRJZCh2YWwpICYmICF2YWwuZGVwdGgpIHtcbiAgICAgICAgICBibG9ja1BhcmFtSW5kZXggPSB0aGlzLmJsb2NrUGFyYW1JbmRleCh2YWwucGFydHNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChibG9ja1BhcmFtSW5kZXgpIHtcbiAgICAgICAgICB2YXIgYmxvY2tQYXJhbUNoaWxkID0gdmFsLnBhcnRzLnNsaWNlKDEpLmpvaW4oJy4nKTtcbiAgICAgICAgICB0aGlzLm9wY29kZSgncHVzaElkJywgJ0Jsb2NrUGFyYW0nLCBibG9ja1BhcmFtSW5kZXgsIGJsb2NrUGFyYW1DaGlsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWwub3JpZ2luYWwgfHwgdmFsdWU7XG4gICAgICAgICAgaWYgKHZhbHVlLnJlcGxhY2UpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXlxcLlxcLy9nLCAnJykucmVwbGFjZSgvXlxcLiQvZywgJycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCB2YWwudHlwZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmFjY2VwdCh2YWwpO1xuICAgIH1cbiAgfSxcblxuICBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtczogZnVuY3Rpb24gc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoc2V4cHIsIHByb2dyYW0sIGludmVyc2UsIG9taXRFbXB0eSkge1xuICAgIHZhciBwYXJhbXMgPSBzZXhwci5wYXJhbXM7XG4gICAgdGhpcy5wdXNoUGFyYW1zKHBhcmFtcyk7XG5cbiAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTtcbiAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBpbnZlcnNlKTtcblxuICAgIGlmIChzZXhwci5oYXNoKSB7XG4gICAgICB0aGlzLmFjY2VwdChzZXhwci5oYXNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcsIG9taXRFbXB0eSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfSxcblxuICBibG9ja1BhcmFtSW5kZXg6IGZ1bmN0aW9uIGJsb2NrUGFyYW1JbmRleChuYW1lKSB7XG4gICAgZm9yICh2YXIgZGVwdGggPSAwLCBsZW4gPSB0aGlzLm9wdGlvbnMuYmxvY2tQYXJhbXMubGVuZ3RoOyBkZXB0aCA8IGxlbjsgZGVwdGgrKykge1xuICAgICAgdmFyIGJsb2NrUGFyYW1zID0gdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zW2RlcHRoXSxcbiAgICAgICAgICBwYXJhbSA9IGJsb2NrUGFyYW1zICYmIF9pc0FycmF5JGluZGV4T2YuaW5kZXhPZihibG9ja1BhcmFtcywgbmFtZSk7XG4gICAgICBpZiAoYmxvY2tQYXJhbXMgJiYgcGFyYW0gPj0gMCkge1xuICAgICAgICByZXR1cm4gW2RlcHRoLCBwYXJhbV07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBwcmVjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHtcbiAgaWYgKGlucHV0ID09IG51bGwgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpIHtcbiAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLnByZWNvbXBpbGUuIFlvdSBwYXNzZWQgJyArIGlucHV0KTtcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAoISgnZGF0YScgaW4gb3B0aW9ucykpIHtcbiAgICBvcHRpb25zLmRhdGEgPSB0cnVlO1xuICB9XG4gIGlmIChvcHRpb25zLmNvbXBhdCkge1xuICAgIG9wdGlvbnMudXNlRGVwdGhzID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLFxuICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IGVudi5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gY29tcGlsZShpbnB1dCwgX3gsIGVudikge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07XG5cbiAgaWYgKGlucHV0ID09IG51bGwgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpIHtcbiAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgJyArIGlucHV0KTtcbiAgfVxuXG4gIGlmICghKCdkYXRhJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuZGF0YSA9IHRydWU7XG4gIH1cbiAgaWYgKG9wdGlvbnMuY29tcGF0KSB7XG4gICAgb3B0aW9ucy51c2VEZXB0aHMgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGNvbXBpbGVkID0gdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIGNvbXBpbGVJbnB1dCgpIHtcbiAgICB2YXIgYXN0ID0gZW52LnBhcnNlKGlucHV0LCBvcHRpb25zKSxcbiAgICAgICAgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpLFxuICAgICAgICB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgcmV0dXJuIGVudi50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpO1xuICB9XG5cbiAgLy8gVGVtcGxhdGUgaXMgb25seSBjb21waWxlZCBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlZCBhZnRlciB0aGF0IHBvaW50LlxuICBmdW5jdGlvbiByZXQoY29udGV4dCwgZXhlY09wdGlvbnMpIHtcbiAgICBpZiAoIWNvbXBpbGVkKSB7XG4gICAgICBjb21waWxlZCA9IGNvbXBpbGVJbnB1dCgpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGlsZWQuY2FsbCh0aGlzLCBjb250ZXh0LCBleGVjT3B0aW9ucyk7XG4gIH1cbiAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uIChzZXR1cE9wdGlvbnMpIHtcbiAgICBpZiAoIWNvbXBpbGVkKSB7XG4gICAgICBjb21waWxlZCA9IGNvbXBpbGVJbnB1dCgpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGlsZWQuX3NldHVwKHNldHVwT3B0aW9ucyk7XG4gIH07XG4gIHJldC5fY2hpbGQgPSBmdW5jdGlvbiAoaSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocykge1xuICAgIGlmICghY29tcGlsZWQpIHtcbiAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7XG4gICAgfVxuICAgIHJldHVybiBjb21waWxlZC5fY2hpbGQoaSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gIH07XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGFyZ0VxdWFscyhhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoX2lzQXJyYXkkaW5kZXhPZi5pc0FycmF5KGEpICYmIF9pc0FycmF5JGluZGV4T2YuaXNBcnJheShiKSAmJiBhLmxlbmd0aCA9PT0gYi5sZW5ndGgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghYXJnRXF1YWxzKGFbaV0sIGJbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcikge1xuICBpZiAoIXNleHByLnBhdGgucGFydHMpIHtcbiAgICB2YXIgbGl0ZXJhbCA9IHNleHByLnBhdGg7XG4gICAgLy8gQ2FzdGluZyB0byBzdHJpbmcgaGVyZSB0byBtYWtlIGZhbHNlIGFuZCAwIGxpdGVyYWwgdmFsdWVzIHBsYXkgbmljZWx5IHdpdGggdGhlIHJlc3RcbiAgICAvLyBvZiB0aGUgc3lzdGVtLlxuICAgIHNleHByLnBhdGggPSBuZXcgX0FTVDJbJ2RlZmF1bHQnXS5QYXRoRXhwcmVzc2lvbihmYWxzZSwgMCwgW2xpdGVyYWwub3JpZ2luYWwgKyAnJ10sIGxpdGVyYWwub3JpZ2luYWwgKyAnJywgbGl0ZXJhbC5sb2MpO1xuICB9XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH07XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLlNvdXJjZUxvY2F0aW9uID0gU291cmNlTG9jYXRpb247XG5leHBvcnRzLmlkID0gaWQ7XG5leHBvcnRzLnN0cmlwRmxhZ3MgPSBzdHJpcEZsYWdzO1xuZXhwb3J0cy5zdHJpcENvbW1lbnQgPSBzdHJpcENvbW1lbnQ7XG5leHBvcnRzLnByZXBhcmVQYXRoID0gcHJlcGFyZVBhdGg7XG5leHBvcnRzLnByZXBhcmVNdXN0YWNoZSA9IHByZXBhcmVNdXN0YWNoZTtcbmV4cG9ydHMucHJlcGFyZVJhd0Jsb2NrID0gcHJlcGFyZVJhd0Jsb2NrO1xuZXhwb3J0cy5wcmVwYXJlQmxvY2sgPSBwcmVwYXJlQmxvY2s7XG5cbnZhciBfRXhjZXB0aW9uID0gcmVxdWlyZSgnLi4vZXhjZXB0aW9uJyk7XG5cbnZhciBfRXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9FeGNlcHRpb24pO1xuXG5mdW5jdGlvbiBTb3VyY2VMb2NhdGlvbihzb3VyY2UsIGxvY0luZm8pIHtcbiAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gIHRoaXMuc3RhcnQgPSB7XG4gICAgbGluZTogbG9jSW5mby5maXJzdF9saW5lLFxuICAgIGNvbHVtbjogbG9jSW5mby5maXJzdF9jb2x1bW5cbiAgfTtcbiAgdGhpcy5lbmQgPSB7XG4gICAgbGluZTogbG9jSW5mby5sYXN0X2xpbmUsXG4gICAgY29sdW1uOiBsb2NJbmZvLmxhc3RfY29sdW1uXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlkKHRva2VuKSB7XG4gIGlmICgvXlxcWy4qXFxdJC8udGVzdCh0b2tlbikpIHtcbiAgICByZXR1cm4gdG9rZW4uc3Vic3RyKDEsIHRva2VuLmxlbmd0aCAtIDIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJpcEZsYWdzKG9wZW4sIGNsb3NlKSB7XG4gIHJldHVybiB7XG4gICAgb3Blbjogb3Blbi5jaGFyQXQoMikgPT09ICd+JyxcbiAgICBjbG9zZTogY2xvc2UuY2hhckF0KGNsb3NlLmxlbmd0aCAtIDMpID09PSAnfidcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3RyaXBDb21tZW50KGNvbW1lbnQpIHtcbiAgcmV0dXJuIGNvbW1lbnQucmVwbGFjZSgvXlxce1xce34/XFwhLT8tPy8sICcnKS5yZXBsYWNlKC8tPy0/fj9cXH1cXH0kLywgJycpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlUGF0aChkYXRhLCBwYXJ0cywgbG9jSW5mbykge1xuICBsb2NJbmZvID0gdGhpcy5sb2NJbmZvKGxvY0luZm8pO1xuXG4gIHZhciBvcmlnaW5hbCA9IGRhdGEgPyAnQCcgOiAnJyxcbiAgICAgIGRpZyA9IFtdLFxuICAgICAgZGVwdGggPSAwLFxuICAgICAgZGVwdGhTdHJpbmcgPSAnJztcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBwYXJ0ID0gcGFydHNbaV0ucGFydCxcblxuICAgIC8vIElmIHdlIGhhdmUgW10gc3ludGF4IHRoZW4gd2UgZG8gbm90IHRyZWF0IHBhdGggcmVmZXJlbmNlcyBhcyBvcGVyYXRvcnMsXG4gICAgLy8gaS5lLiBmb28uW3RoaXNdIHJlc29sdmVzIHRvIGFwcHJveGltYXRlbHkgY29udGV4dC5mb29bJ3RoaXMnXVxuICAgIGlzTGl0ZXJhbCA9IHBhcnRzW2ldLm9yaWdpbmFsICE9PSBwYXJ0O1xuICAgIG9yaWdpbmFsICs9IChwYXJ0c1tpXS5zZXBhcmF0b3IgfHwgJycpICsgcGFydDtcblxuICAgIGlmICghaXNMaXRlcmFsICYmIChwYXJ0ID09PSAnLi4nIHx8IHBhcnQgPT09ICcuJyB8fCBwYXJ0ID09PSAndGhpcycpKSB7XG4gICAgICBpZiAoZGlnLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ0ludmFsaWQgcGF0aDogJyArIG9yaWdpbmFsLCB7IGxvYzogbG9jSW5mbyB9KTtcbiAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgICBkZXB0aFN0cmluZyArPSAnLi4vJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZGlnLnB1c2gocGFydCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyB0aGlzLlBhdGhFeHByZXNzaW9uKGRhdGEsIGRlcHRoLCBkaWcsIG9yaWdpbmFsLCBsb2NJbmZvKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZU11c3RhY2hlKHBhdGgsIHBhcmFtcywgaGFzaCwgb3Blbiwgc3RyaXAsIGxvY0luZm8pIHtcbiAgLy8gTXVzdCB1c2UgY2hhckF0IHRvIHN1cHBvcnQgSUUgcHJlLTEwXG4gIHZhciBlc2NhcGVGbGFnID0gb3Blbi5jaGFyQXQoMykgfHwgb3Blbi5jaGFyQXQoMiksXG4gICAgICBlc2NhcGVkID0gZXNjYXBlRmxhZyAhPT0gJ3snICYmIGVzY2FwZUZsYWcgIT09ICcmJztcblxuICByZXR1cm4gbmV3IHRoaXMuTXVzdGFjaGVTdGF0ZW1lbnQocGF0aCwgcGFyYW1zLCBoYXNoLCBlc2NhcGVkLCBzdHJpcCwgdGhpcy5sb2NJbmZvKGxvY0luZm8pKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVJhd0Jsb2NrKG9wZW5SYXdCbG9jaywgY29udGVudCwgY2xvc2UsIGxvY0luZm8pIHtcbiAgaWYgKG9wZW5SYXdCbG9jay5wYXRoLm9yaWdpbmFsICE9PSBjbG9zZSkge1xuICAgIHZhciBlcnJvck5vZGUgPSB7IGxvYzogb3BlblJhd0Jsb2NrLnBhdGgubG9jIH07XG5cbiAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXShvcGVuUmF3QmxvY2sucGF0aC5vcmlnaW5hbCArICcgZG9lc25cXCd0IG1hdGNoICcgKyBjbG9zZSwgZXJyb3JOb2RlKTtcbiAgfVxuXG4gIGxvY0luZm8gPSB0aGlzLmxvY0luZm8obG9jSW5mbyk7XG4gIHZhciBwcm9ncmFtID0gbmV3IHRoaXMuUHJvZ3JhbShbY29udGVudF0sIG51bGwsIHt9LCBsb2NJbmZvKTtcblxuICByZXR1cm4gbmV3IHRoaXMuQmxvY2tTdGF0ZW1lbnQob3BlblJhd0Jsb2NrLnBhdGgsIG9wZW5SYXdCbG9jay5wYXJhbXMsIG9wZW5SYXdCbG9jay5oYXNoLCBwcm9ncmFtLCB1bmRlZmluZWQsIHt9LCB7fSwge30sIGxvY0luZm8pO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlQmxvY2sob3BlbkJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlQW5kUHJvZ3JhbSwgY2xvc2UsIGludmVydGVkLCBsb2NJbmZvKSB7XG4gIC8vIFdoZW4gd2UgYXJlIGNoYWluaW5nIGludmVyc2UgY2FsbHMsIHdlIHdpbGwgbm90IGhhdmUgYSBjbG9zZSBwYXRoXG4gIGlmIChjbG9zZSAmJiBjbG9zZS5wYXRoICYmIG9wZW5CbG9jay5wYXRoLm9yaWdpbmFsICE9PSBjbG9zZS5wYXRoLm9yaWdpbmFsKSB7XG4gICAgdmFyIGVycm9yTm9kZSA9IHsgbG9jOiBvcGVuQmxvY2sucGF0aC5sb2MgfTtcblxuICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKG9wZW5CbG9jay5wYXRoLm9yaWdpbmFsICsgJyBkb2VzblxcJ3QgbWF0Y2ggJyArIGNsb3NlLnBhdGgub3JpZ2luYWwsIGVycm9yTm9kZSk7XG4gIH1cblxuICBwcm9ncmFtLmJsb2NrUGFyYW1zID0gb3BlbkJsb2NrLmJsb2NrUGFyYW1zO1xuXG4gIHZhciBpbnZlcnNlID0gdW5kZWZpbmVkLFxuICAgICAgaW52ZXJzZVN0cmlwID0gdW5kZWZpbmVkO1xuXG4gIGlmIChpbnZlcnNlQW5kUHJvZ3JhbSkge1xuICAgIGlmIChpbnZlcnNlQW5kUHJvZ3JhbS5jaGFpbikge1xuICAgICAgaW52ZXJzZUFuZFByb2dyYW0ucHJvZ3JhbS5ib2R5WzBdLmNsb3NlU3RyaXAgPSBjbG9zZS5zdHJpcDtcbiAgICB9XG5cbiAgICBpbnZlcnNlU3RyaXAgPSBpbnZlcnNlQW5kUHJvZ3JhbS5zdHJpcDtcbiAgICBpbnZlcnNlID0gaW52ZXJzZUFuZFByb2dyYW0ucHJvZ3JhbTtcbiAgfVxuXG4gIGlmIChpbnZlcnRlZCkge1xuICAgIGludmVydGVkID0gaW52ZXJzZTtcbiAgICBpbnZlcnNlID0gcHJvZ3JhbTtcbiAgICBwcm9ncmFtID0gaW52ZXJ0ZWQ7XG4gIH1cblxuICByZXR1cm4gbmV3IHRoaXMuQmxvY2tTdGF0ZW1lbnQob3BlbkJsb2NrLnBhdGgsIG9wZW5CbG9jay5wYXJhbXMsIG9wZW5CbG9jay5oYXNoLCBwcm9ncmFtLCBpbnZlcnNlLCBvcGVuQmxvY2suc3RyaXAsIGludmVyc2VTdHJpcCwgY2xvc2UgJiYgY2xvc2Uuc3RyaXAsIHRoaXMubG9jSW5mbyhsb2NJbmZvKSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH07XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfQ09NUElMRVJfUkVWSVNJT04kUkVWSVNJT05fQ0hBTkdFUyA9IHJlcXVpcmUoJy4uL2Jhc2UnKTtcblxudmFyIF9FeGNlcHRpb24gPSByZXF1aXJlKCcuLi9leGNlcHRpb24nKTtcblxudmFyIF9FeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0V4Y2VwdGlvbik7XG5cbnZhciBfaXNBcnJheSA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBfQ29kZUdlbiA9IHJlcXVpcmUoJy4vY29kZS1nZW4nKTtcblxudmFyIF9Db2RlR2VuMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9Db2RlR2VuKTtcblxuZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkge1xuICB0aGlzLnZhbHVlID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIEphdmFTY3JpcHRDb21waWxlcigpIHt9XG5cbkphdmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUgPSB7XG4gIC8vIFBVQkxJQyBBUEk6IFlvdSBjYW4gb3ZlcnJpZGUgdGhlc2UgbWV0aG9kcyBpbiBhIHN1YmNsYXNzIHRvIHByb3ZpZGVcbiAgLy8gYWx0ZXJuYXRpdmUgY29tcGlsZWQgZm9ybXMgZm9yIG5hbWUgbG9va3VwIGFuZCBidWZmZXJpbmcgc2VtYW50aWNzXG4gIG5hbWVMb29rdXA6IGZ1bmN0aW9uIG5hbWVMb29rdXAocGFyZW50LCBuYW1lIC8qICwgdHlwZSovKSB7XG4gICAgaWYgKEphdmFTY3JpcHRDb21waWxlci5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZShuYW1lKSkge1xuICAgICAgcmV0dXJuIFtwYXJlbnQsICcuJywgbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbcGFyZW50LCAnW1xcJycsIG5hbWUsICdcXCddJ107XG4gICAgfVxuICB9LFxuICBkZXB0aGVkTG9va3VwOiBmdW5jdGlvbiBkZXB0aGVkTG9va3VwKG5hbWUpIHtcbiAgICByZXR1cm4gW3RoaXMuYWxpYXNhYmxlKCd0aGlzLmxvb2t1cCcpLCAnKGRlcHRocywgXCInLCBuYW1lLCAnXCIpJ107XG4gIH0sXG5cbiAgY29tcGlsZXJJbmZvOiBmdW5jdGlvbiBjb21waWxlckluZm8oKSB7XG4gICAgdmFyIHJldmlzaW9uID0gX0NPTVBJTEVSX1JFVklTSU9OJFJFVklTSU9OX0NIQU5HRVMuQ09NUElMRVJfUkVWSVNJT04sXG4gICAgICAgIHZlcnNpb25zID0gX0NPTVBJTEVSX1JFVklTSU9OJFJFVklTSU9OX0NIQU5HRVMuUkVWSVNJT05fQ0hBTkdFU1tyZXZpc2lvbl07XG4gICAgcmV0dXJuIFtyZXZpc2lvbiwgdmVyc2lvbnNdO1xuICB9LFxuXG4gIGFwcGVuZFRvQnVmZmVyOiBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihzb3VyY2UsIGxvY2F0aW9uLCBleHBsaWNpdCkge1xuICAgIC8vIEZvcmNlIGEgc291cmNlIGFzIHRoaXMgc2ltcGxpZmllcyB0aGUgbWVyZ2UgbG9naWMuXG4gICAgaWYgKCFfaXNBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHNvdXJjZSA9IFtzb3VyY2VdO1xuICAgIH1cbiAgICBzb3VyY2UgPSB0aGlzLnNvdXJjZS53cmFwKHNvdXJjZSwgbG9jYXRpb24pO1xuXG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHtcbiAgICAgIHJldHVybiBbJ3JldHVybiAnLCBzb3VyY2UsICc7J107XG4gICAgfSBlbHNlIGlmIChleHBsaWNpdCkge1xuICAgICAgLy8gVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBvcGVyYXRpb24gb2NjdXJzIGFzIGEgY2hpbGQgb2YgYW5vdGhlclxuICAgICAgLy8gY29uc3RydWN0LCBnZW5lcmFsbHkgYnJhY2VzLiBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgb3V0cHV0IHRoZXNlIGJ1ZmZlclxuICAgICAgLy8gb3BlcmF0aW9ucyB0byBlbnN1cmUgdGhhdCB0aGUgZW1pdHRlZCBjb2RlIGdvZXMgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uXG4gICAgICByZXR1cm4gWydidWZmZXIgKz0gJywgc291cmNlLCAnOyddO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2UuYXBwZW5kVG9CdWZmZXIgPSB0cnVlO1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZUJ1ZmZlcjogZnVuY3Rpb24gaW5pdGlhbGl6ZUJ1ZmZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5xdW90ZWRTdHJpbmcoJycpO1xuICB9LFxuICAvLyBFTkQgUFVCTElDIEFQSVxuXG4gIGNvbXBpbGU6IGZ1bmN0aW9uIGNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIGNvbnRleHQsIGFzT2JqZWN0KSB7XG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5zdHJpbmdQYXJhbXMgPSB0aGlzLm9wdGlvbnMuc3RyaW5nUGFyYW1zO1xuICAgIHRoaXMudHJhY2tJZHMgPSB0aGlzLm9wdGlvbnMudHJhY2tJZHM7XG4gICAgdGhpcy5wcmVjb21waWxlID0gIWFzT2JqZWN0O1xuXG4gICAgdGhpcy5uYW1lID0gdGhpcy5lbnZpcm9ubWVudC5uYW1lO1xuICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHtcbiAgICAgIHByb2dyYW1zOiBbXSxcbiAgICAgIGVudmlyb25tZW50czogW11cbiAgICB9O1xuXG4gICAgdGhpcy5wcmVhbWJsZSgpO1xuXG4gICAgdGhpcy5zdGFja1Nsb3QgPSAwO1xuICAgIHRoaXMuc3RhY2tWYXJzID0gW107XG4gICAgdGhpcy5hbGlhc2VzID0ge307XG4gICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07XG4gICAgdGhpcy5oYXNoZXMgPSBbXTtcbiAgICB0aGlzLmNvbXBpbGVTdGFjayA9IFtdO1xuICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTtcbiAgICB0aGlzLmJsb2NrUGFyYW1zID0gW107XG5cbiAgICB0aGlzLmNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGVudmlyb25tZW50LnVzZURlcHRocyB8fCB0aGlzLm9wdGlvbnMuY29tcGF0O1xuICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGVudmlyb25tZW50LnVzZUJsb2NrUGFyYW1zO1xuXG4gICAgdmFyIG9wY29kZXMgPSBlbnZpcm9ubWVudC5vcGNvZGVzLFxuICAgICAgICBvcGNvZGUgPSB1bmRlZmluZWQsXG4gICAgICAgIGZpcnN0TG9jID0gdW5kZWZpbmVkLFxuICAgICAgICBpID0gdW5kZWZpbmVkLFxuICAgICAgICBsID0gdW5kZWZpbmVkO1xuXG4gICAgZm9yIChpID0gMCwgbCA9IG9wY29kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBvcGNvZGUgPSBvcGNvZGVzW2ldO1xuXG4gICAgICB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb24gPSBvcGNvZGUubG9jO1xuICAgICAgZmlyc3RMb2MgPSBmaXJzdExvYyB8fCBvcGNvZGUubG9jO1xuICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNvZGUuYXJncyk7XG4gICAgfVxuXG4gICAgLy8gRmx1c2ggYW55IHRyYWlsaW5nIGNvbnRlbnQgdGhhdCBtaWdodCBiZSBwZW5kaW5nLlxuICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IGZpcnN0TG9jO1xuICAgIHRoaXMucHVzaFNvdXJjZSgnJyk7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICh0aGlzLnN0YWNrU2xvdCB8fCB0aGlzLmlubGluZVN0YWNrLmxlbmd0aCB8fCB0aGlzLmNvbXBpbGVTdGFjay5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdDb21waWxlIGNvbXBsZXRlZCB3aXRoIGNvbnRlbnQgbGVmdCBvbiBzdGFjaycpO1xuICAgIH1cblxuICAgIHZhciBmbiA9IHRoaXMuY3JlYXRlRnVuY3Rpb25Db250ZXh0KGFzT2JqZWN0KTtcbiAgICBpZiAoIXRoaXMuaXNDaGlsZCkge1xuICAgICAgdmFyIHJldCA9IHtcbiAgICAgICAgY29tcGlsZXI6IHRoaXMuY29tcGlsZXJJbmZvKCksXG4gICAgICAgIG1haW46IGZuXG4gICAgICB9O1xuICAgICAgdmFyIHByb2dyYW1zID0gdGhpcy5jb250ZXh0LnByb2dyYW1zO1xuICAgICAgZm9yIChpID0gMCwgbCA9IHByb2dyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAocHJvZ3JhbXNbaV0pIHtcbiAgICAgICAgICByZXRbaV0gPSBwcm9ncmFtc1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5lbnZpcm9ubWVudC51c2VQYXJ0aWFsKSB7XG4gICAgICAgIHJldC51c2VQYXJ0aWFsID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGF0YSkge1xuICAgICAgICByZXQudXNlRGF0YSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy51c2VEZXB0aHMpIHtcbiAgICAgICAgcmV0LnVzZURlcHRocyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcykge1xuICAgICAgICByZXQudXNlQmxvY2tQYXJhbXMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXQpIHtcbiAgICAgICAgcmV0LmNvbXBhdCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghYXNPYmplY3QpIHtcbiAgICAgICAgcmV0LmNvbXBpbGVyID0gSlNPTi5zdHJpbmdpZnkocmV0LmNvbXBpbGVyKTtcblxuICAgICAgICB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb24gPSB7IHN0YXJ0OiB7IGxpbmU6IDEsIGNvbHVtbjogMCB9IH07XG4gICAgICAgIHJldCA9IHRoaXMub2JqZWN0TGl0ZXJhbChyZXQpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnNyY05hbWUpIHtcbiAgICAgICAgICByZXQgPSByZXQudG9TdHJpbmdXaXRoU291cmNlTWFwKHsgZmlsZTogb3B0aW9ucy5kZXN0TmFtZSB9KTtcbiAgICAgICAgICByZXQubWFwID0gcmV0Lm1hcCAmJiByZXQubWFwLnRvU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0ID0gcmV0LnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldC5jb21waWxlck9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmbjtcbiAgICB9XG4gIH0sXG5cbiAgcHJlYW1ibGU6IGZ1bmN0aW9uIHByZWFtYmxlKCkge1xuICAgIC8vIHRyYWNrIHRoZSBsYXN0IGNvbnRleHQgcHVzaGVkIGludG8gcGxhY2UgdG8gYWxsb3cgc2tpcHBpbmcgdGhlXG4gICAgLy8gZ2V0Q29udGV4dCBvcGNvZGUgd2hlbiBpdCB3b3VsZCBiZSBhIG5vb3BcbiAgICB0aGlzLmxhc3RDb250ZXh0ID0gMDtcbiAgICB0aGlzLnNvdXJjZSA9IG5ldyBfQ29kZUdlbjJbJ2RlZmF1bHQnXSh0aGlzLm9wdGlvbnMuc3JjTmFtZSk7XG4gIH0sXG5cbiAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpIHtcbiAgICB2YXIgdmFyRGVjbGFyYXRpb25zID0gJyc7XG5cbiAgICB2YXIgbG9jYWxzID0gdGhpcy5zdGFja1ZhcnMuY29uY2F0KHRoaXMucmVnaXN0ZXJzLmxpc3QpO1xuICAgIGlmIChsb2NhbHMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsICcgKyBsb2NhbHMuam9pbignLCAnKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBtaW5pbWl6ZXIgYWxpYXMgbWFwcGluZ3NcbiAgICAvL1xuICAgIC8vIFdoZW4gdXNpbmcgdHJ1ZSBTb3VyY2VOb2RlcywgdGhpcyB3aWxsIHVwZGF0ZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgZ2l2ZW4gYWxpYXNcbiAgICAvLyBhcyB0aGUgc291cmNlIG5vZGVzIGFyZSByZXVzZWQgaW4gc2l0dS4gRm9yIHRoZSBub24tc291cmNlIG5vZGUgY29tcGlsYXRpb24gbW9kZSxcbiAgICAvLyBhbGlhc2VzIHdpbGwgbm90IGJlIHVzZWQsIGJ1dCB0aGlzIGNhc2UgaXMgYWxyZWFkeSBiZWluZyBydW4gb24gdGhlIGNsaWVudCBhbmRcbiAgICAvLyB3ZSBhcmVuJ3QgY29uY2VybiBhYm91dCBtaW5pbWl6aW5nIHRoZSB0ZW1wbGF0ZSBzaXplLlxuICAgIHZhciBhbGlhc0NvdW50ID0gMDtcbiAgICBmb3IgKHZhciBhbGlhcyBpbiB0aGlzLmFsaWFzZXMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ3VhcmQtZm9yLWluXG4gICAgICB2YXIgbm9kZSA9IHRoaXMuYWxpYXNlc1thbGlhc107XG5cbiAgICAgIGlmICh0aGlzLmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpICYmIG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5yZWZlcmVuY2VDb3VudCA+IDEpIHtcbiAgICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGFsaWFzJyArICsrYWxpYXNDb3VudCArICc9JyArIGFsaWFzO1xuICAgICAgICBub2RlLmNoaWxkcmVuWzBdID0gJ2FsaWFzJyArIGFsaWFzQ291bnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHBhcmFtcyA9IFsnZGVwdGgwJywgJ2hlbHBlcnMnLCAncGFydGlhbHMnLCAnZGF0YSddO1xuXG4gICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgdGhpcy51c2VEZXB0aHMpIHtcbiAgICAgIHBhcmFtcy5wdXNoKCdibG9ja1BhcmFtcycpO1xuICAgIH1cbiAgICBpZiAodGhpcy51c2VEZXB0aHMpIHtcbiAgICAgIHBhcmFtcy5wdXNoKCdkZXB0aHMnKTtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtIGEgc2Vjb25kIHBhc3Mgb3ZlciB0aGUgb3V0cHV0IHRvIG1lcmdlIGNvbnRlbnQgd2hlbiBwb3NzaWJsZVxuICAgIHZhciBzb3VyY2UgPSB0aGlzLm1lcmdlU291cmNlKHZhckRlY2xhcmF0aW9ucyk7XG5cbiAgICBpZiAoYXNPYmplY3QpIHtcbiAgICAgIHBhcmFtcy5wdXNoKHNvdXJjZSk7XG5cbiAgICAgIHJldHVybiBGdW5jdGlvbi5hcHBseSh0aGlzLCBwYXJhbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2Uud3JhcChbJ2Z1bmN0aW9uKCcsIHBhcmFtcy5qb2luKCcsJyksICcpIHtcXG4gICcsIHNvdXJjZSwgJ30nXSk7XG4gICAgfVxuICB9LFxuICBtZXJnZVNvdXJjZTogZnVuY3Rpb24gbWVyZ2VTb3VyY2UodmFyRGVjbGFyYXRpb25zKSB7XG4gICAgdmFyIGlzU2ltcGxlID0gdGhpcy5lbnZpcm9ubWVudC5pc1NpbXBsZSxcbiAgICAgICAgYXBwZW5kT25seSA9ICF0aGlzLmZvcmNlQnVmZmVyLFxuICAgICAgICBhcHBlbmRGaXJzdCA9IHVuZGVmaW5lZCxcbiAgICAgICAgc291cmNlU2VlbiA9IHVuZGVmaW5lZCxcbiAgICAgICAgYnVmZmVyU3RhcnQgPSB1bmRlZmluZWQsXG4gICAgICAgIGJ1ZmZlckVuZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNvdXJjZS5lYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICBpZiAobGluZS5hcHBlbmRUb0J1ZmZlcikge1xuICAgICAgICBpZiAoYnVmZmVyU3RhcnQpIHtcbiAgICAgICAgICBsaW5lLnByZXBlbmQoJyAgKyAnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWZmZXJTdGFydCA9IGxpbmU7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyRW5kID0gbGluZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChidWZmZXJTdGFydCkge1xuICAgICAgICAgIGlmICghc291cmNlU2Vlbikge1xuICAgICAgICAgICAgYXBwZW5kRmlyc3QgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBidWZmZXJTdGFydC5wcmVwZW5kKCdidWZmZXIgKz0gJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJ1ZmZlckVuZC5hZGQoJzsnKTtcbiAgICAgICAgICBidWZmZXJTdGFydCA9IGJ1ZmZlckVuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvdXJjZVNlZW4gPSB0cnVlO1xuICAgICAgICBpZiAoIWlzU2ltcGxlKSB7XG4gICAgICAgICAgYXBwZW5kT25seSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoYXBwZW5kT25seSkge1xuICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7XG4gICAgICAgIGJ1ZmZlclN0YXJ0LnByZXBlbmQoJ3JldHVybiAnKTtcbiAgICAgICAgYnVmZmVyRW5kLmFkZCgnOycpO1xuICAgICAgfSBlbHNlIGlmICghc291cmNlU2Vlbikge1xuICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gXCJcIjsnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyRGVjbGFyYXRpb25zICs9ICcsIGJ1ZmZlciA9ICcgKyAoYXBwZW5kRmlyc3QgPyAnJyA6IHRoaXMuaW5pdGlhbGl6ZUJ1ZmZlcigpKTtcblxuICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7XG4gICAgICAgIGJ1ZmZlclN0YXJ0LnByZXBlbmQoJ3JldHVybiBidWZmZXIgKyAnKTtcbiAgICAgICAgYnVmZmVyRW5kLmFkZCgnOycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb3VyY2UucHVzaCgncmV0dXJuIGJ1ZmZlcjsnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFyRGVjbGFyYXRpb25zKSB7XG4gICAgICB0aGlzLnNvdXJjZS5wcmVwZW5kKCd2YXIgJyArIHZhckRlY2xhcmF0aW9ucy5zdWJzdHJpbmcoMikgKyAoYXBwZW5kRmlyc3QgPyAnJyA6ICc7XFxuJykpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNvdXJjZS5tZXJnZSgpO1xuICB9LFxuXG4gIC8vIFtibG9ja1ZhbHVlXVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCB2YWx1ZVxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHJldHVybiB2YWx1ZSBvZiBibG9ja0hlbHBlck1pc3NpbmdcbiAgLy9cbiAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBvcGNvZGUgaXMgdG8gdGFrZSBhIGJsb2NrIG9mIHRoZSBmb3JtXG4gIC8vIGB7eyN0aGlzLmZvb319Li4ue3svdGhpcy5mb299fWAsIHJlc29sdmUgdGhlIHZhbHVlIG9mIGBmb29gLCBhbmRcbiAgLy8gcmVwbGFjZSBpdCBvbiB0aGUgc3RhY2sgd2l0aCB0aGUgcmVzdWx0IG9mIHByb3Blcmx5XG4gIC8vIGludm9raW5nIGJsb2NrSGVscGVyTWlzc2luZy5cbiAgYmxvY2tWYWx1ZTogZnVuY3Rpb24gYmxvY2tWYWx1ZShuYW1lKSB7XG4gICAgdmFyIGJsb2NrSGVscGVyTWlzc2luZyA9IHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZycpLFxuICAgICAgICBwYXJhbXMgPSBbdGhpcy5jb250ZXh0TmFtZSgwKV07XG4gICAgdGhpcy5zZXR1cEhlbHBlckFyZ3MobmFtZSwgMCwgcGFyYW1zKTtcblxuICAgIHZhciBibG9ja05hbWUgPSB0aGlzLnBvcFN0YWNrKCk7XG4gICAgcGFyYW1zLnNwbGljZSgxLCAwLCBibG9ja05hbWUpO1xuXG4gICAgdGhpcy5wdXNoKHRoaXMuc291cmNlLmZ1bmN0aW9uQ2FsbChibG9ja0hlbHBlck1pc3NpbmcsICdjYWxsJywgcGFyYW1zKSk7XG4gIH0sXG5cbiAgLy8gW2FtYmlndW91c0Jsb2NrVmFsdWVdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHZhbHVlXG4gIC8vIENvbXBpbGVyIHZhbHVlLCBiZWZvcmU6IGxhc3RIZWxwZXI9dmFsdWUgb2YgbGFzdCBmb3VuZCBoZWxwZXIsIGlmIGFueVxuICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIG5vIGxhc3RIZWxwZXI6IHNhbWUgYXMgW2Jsb2NrVmFsdWVdXG4gIC8vIE9uIHN0YWNrLCBhZnRlciwgaWYgbGFzdEhlbHBlcjogdmFsdWVcbiAgYW1iaWd1b3VzQmxvY2tWYWx1ZTogZnVuY3Rpb24gYW1iaWd1b3VzQmxvY2tWYWx1ZSgpIHtcbiAgICAvLyBXZSdyZSBiZWluZyBhIGJpdCBjaGVla3kgYW5kIHJldXNpbmcgdGhlIG9wdGlvbnMgdmFsdWUgZnJvbSB0aGUgcHJpb3IgZXhlY1xuICAgIHZhciBibG9ja0hlbHBlck1pc3NpbmcgPSB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcnKSxcbiAgICAgICAgcGFyYW1zID0gW3RoaXMuY29udGV4dE5hbWUoMCldO1xuICAgIHRoaXMuc2V0dXBIZWxwZXJBcmdzKCcnLCAwLCBwYXJhbXMsIHRydWUpO1xuXG4gICAgdGhpcy5mbHVzaElubGluZSgpO1xuXG4gICAgdmFyIGN1cnJlbnQgPSB0aGlzLnRvcFN0YWNrKCk7XG4gICAgcGFyYW1zLnNwbGljZSgxLCAwLCBjdXJyZW50KTtcblxuICAgIHRoaXMucHVzaFNvdXJjZShbJ2lmICghJywgdGhpcy5sYXN0SGVscGVyLCAnKSB7ICcsIGN1cnJlbnQsICcgPSAnLCB0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoYmxvY2tIZWxwZXJNaXNzaW5nLCAnY2FsbCcsIHBhcmFtcyksICd9J10pO1xuICB9LFxuXG4gIC8vIFthcHBlbmRDb250ZW50XVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi5cbiAgLy9cbiAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGBjb250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXJcbiAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24gYXBwZW5kQ29udGVudChjb250ZW50KSB7XG4gICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLnBlbmRpbmdDb250ZW50ICsgY29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wZW5kaW5nTG9jYXRpb24gPSB0aGlzLnNvdXJjZS5jdXJyZW50TG9jYXRpb247XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nQ29udGVudCA9IGNvbnRlbnQ7XG4gIH0sXG5cbiAgLy8gW2FwcGVuZF1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogdmFsdWUsIC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLlxuICAvL1xuICAvLyBDb2VyY2VzIGB2YWx1ZWAgdG8gYSBTdHJpbmcgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGN1cnJlbnQgYnVmZmVyLlxuICAvL1xuICAvLyBJZiBgdmFsdWVgIGlzIHRydXRoeSwgb3IgMCwgaXQgaXMgY29lcmNlZCBpbnRvIGEgc3RyaW5nIGFuZCBhcHBlbmRlZFxuICAvLyBPdGhlcndpc2UsIHRoZSBlbXB0eSBzdHJpbmcgaXMgYXBwZW5kZWRcbiAgYXBwZW5kOiBmdW5jdGlvbiBhcHBlbmQoKSB7XG4gICAgaWYgKHRoaXMuaXNJbmxpbmUoKSkge1xuICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24gKGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIFsnICE9IG51bGwgPyAnLCBjdXJyZW50LCAnIDogXCJcIiddO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMucG9wU3RhY2soKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbG9jYWwgPSB0aGlzLnBvcFN0YWNrKCk7XG4gICAgICB0aGlzLnB1c2hTb3VyY2UoWydpZiAoJywgbG9jYWwsICcgIT0gbnVsbCkgeyAnLCB0aGlzLmFwcGVuZFRvQnVmZmVyKGxvY2FsLCB1bmRlZmluZWQsIHRydWUpLCAnIH0nXSk7XG4gICAgICBpZiAodGhpcy5lbnZpcm9ubWVudC5pc1NpbXBsZSkge1xuICAgICAgICB0aGlzLnB1c2hTb3VyY2UoWydlbHNlIHsgJywgdGhpcy5hcHBlbmRUb0J1ZmZlcignXFwnXFwnJywgdW5kZWZpbmVkLCB0cnVlKSwgJyB9J10pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvLyBbYXBwZW5kRXNjYXBlZF1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogdmFsdWUsIC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLlxuICAvL1xuICAvLyBFc2NhcGUgYHZhbHVlYCBhbmQgYXBwZW5kIGl0IHRvIHRoZSBidWZmZXJcbiAgYXBwZW5kRXNjYXBlZDogZnVuY3Rpb24gYXBwZW5kRXNjYXBlZCgpIHtcbiAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1ZmZlcihbdGhpcy5hbGlhc2FibGUoJ3RoaXMuZXNjYXBlRXhwcmVzc2lvbicpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJyknXSkpO1xuICB9LFxuXG4gIC8vIFtnZXRDb250ZXh0XVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi5cbiAgLy8gQ29tcGlsZXIgdmFsdWUsIGFmdGVyOiBsYXN0Q29udGV4dD1kZXB0aFxuICAvL1xuICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aFxuICBnZXRDb250ZXh0OiBmdW5jdGlvbiBnZXRDb250ZXh0KGRlcHRoKSB7XG4gICAgdGhpcy5sYXN0Q29udGV4dCA9IGRlcHRoO1xuICB9LFxuXG4gIC8vIFtwdXNoQ29udGV4dF1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogY3VycmVudENvbnRleHQsIC4uLlxuICAvL1xuICAvLyBQdXNoZXMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGNvbnRleHQgb250byB0aGUgc3RhY2suXG4gIHB1c2hDb250ZXh0OiBmdW5jdGlvbiBwdXNoQ29udGV4dCgpIHtcbiAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodGhpcy5jb250ZXh0TmFtZSh0aGlzLmxhc3RDb250ZXh0KSk7XG4gIH0sXG5cbiAgLy8gW2xvb2t1cE9uQ29udGV4dF1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogY3VycmVudENvbnRleHRbbmFtZV0sIC4uLlxuICAvL1xuICAvLyBMb29rcyB1cCB0aGUgdmFsdWUgb2YgYG5hbWVgIG9uIHRoZSBjdXJyZW50IGNvbnRleHQgYW5kIHB1c2hlc1xuICAvLyBpdCBvbnRvIHRoZSBzdGFjay5cbiAgbG9va3VwT25Db250ZXh0OiBmdW5jdGlvbiBsb29rdXBPbkNvbnRleHQocGFydHMsIGZhbHN5LCBzY29wZWQpIHtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICBpZiAoIXNjb3BlZCAmJiB0aGlzLm9wdGlvbnMuY29tcGF0ICYmICF0aGlzLmxhc3RDb250ZXh0KSB7XG4gICAgICAvLyBUaGUgZGVwdGhlZCBxdWVyeSBpcyBleHBlY3RlZCB0byBoYW5kbGUgdGhlIHVuZGVmaW5lZCBsb2dpYyBmb3IgdGhlIHJvb3QgbGV2ZWwgdGhhdFxuICAgICAgLy8gaXMgaW1wbGVtZW50ZWQgYmVsb3csIHNvIHdlIGV2YWx1YXRlIHRoYXQgZGlyZWN0bHkgaW4gY29tcGF0IG1vZGVcbiAgICAgIHRoaXMucHVzaCh0aGlzLmRlcHRoZWRMb29rdXAocGFydHNbaSsrXSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnB1c2hDb250ZXh0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNvbHZlUGF0aCgnY29udGV4dCcsIHBhcnRzLCBpLCBmYWxzeSk7XG4gIH0sXG5cbiAgLy8gW2xvb2t1cEJsb2NrUGFyYW1dXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGJsb2NrUGFyYW1bbmFtZV0sIC4uLlxuICAvL1xuICAvLyBMb29rcyB1cCB0aGUgdmFsdWUgb2YgYHBhcnRzYCBvbiB0aGUgZ2l2ZW4gYmxvY2sgcGFyYW0gYW5kIHB1c2hlc1xuICAvLyBpdCBvbnRvIHRoZSBzdGFjay5cbiAgbG9va3VwQmxvY2tQYXJhbTogZnVuY3Rpb24gbG9va3VwQmxvY2tQYXJhbShibG9ja1BhcmFtSWQsIHBhcnRzKSB7XG4gICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRydWU7XG5cbiAgICB0aGlzLnB1c2goWydibG9ja1BhcmFtc1snLCBibG9ja1BhcmFtSWRbMF0sICddWycsIGJsb2NrUGFyYW1JZFsxXSwgJ10nXSk7XG4gICAgdGhpcy5yZXNvbHZlUGF0aCgnY29udGV4dCcsIHBhcnRzLCAxKTtcbiAgfSxcblxuICAvLyBbbG9va3VwRGF0YV1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogZGF0YSwgLi4uXG4gIC8vXG4gIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9yXG4gIGxvb2t1cERhdGE6IGZ1bmN0aW9uIGxvb2t1cERhdGEoZGVwdGgsIHBhcnRzKSB7XG4gICAgaWYgKCFkZXB0aCkge1xuICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdkYXRhJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgndGhpcy5kYXRhKGRhdGEsICcgKyBkZXB0aCArICcpJyk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNvbHZlUGF0aCgnZGF0YScsIHBhcnRzLCAwLCB0cnVlKTtcbiAgfSxcblxuICByZXNvbHZlUGF0aDogZnVuY3Rpb24gcmVzb2x2ZVBhdGgodHlwZSwgcGFydHMsIGksIGZhbHN5KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaWN0IHx8IHRoaXMub3B0aW9ucy5hc3N1bWVPYmplY3RzKSB7XG4gICAgICB0aGlzLnB1c2goc3RyaWN0TG9va3VwKHRoaXMub3B0aW9ucy5zdHJpY3QsIHRoaXMsIHBhcnRzLCB0eXBlKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGxlbiA9IHBhcnRzLmxlbmd0aDtcbiAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAvKmVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqL1xuICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24gKGN1cnJlbnQpIHtcbiAgICAgICAgdmFyIGxvb2t1cCA9IF90aGlzLm5hbWVMb29rdXAoY3VycmVudCwgcGFydHNbaV0sIHR5cGUpO1xuICAgICAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHplcm8gYW5kIGZhbHNlIGFyZSBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBjb250ZXh0IChmYWxzeSBmbGFnKVxuICAgICAgICAvLyBuZWVkcyB0byBoYXZlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGVzZSB2YWx1ZXMuXG4gICAgICAgIGlmICghZmFsc3kpIHtcbiAgICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGxvb2t1cCwgJyA6ICcsIGN1cnJlbnRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW4gdXNlIGdlbmVyaWMgZmFsc3kgaGFuZGxpbmdcbiAgICAgICAgICByZXR1cm4gWycgJiYgJywgbG9va3VwXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvKmVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG4gICAgfVxuICB9LFxuXG4gIC8vIFtyZXNvbHZlUG9zc2libGVMYW1iZGFdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXNvbHZlZCB2YWx1ZSwgLi4uXG4gIC8vXG4gIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieVxuICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsYW1iZGFcbiAgcmVzb2x2ZVBvc3NpYmxlTGFtYmRhOiBmdW5jdGlvbiByZXNvbHZlUG9zc2libGVMYW1iZGEoKSB7XG4gICAgdGhpcy5wdXNoKFt0aGlzLmFsaWFzYWJsZSgndGhpcy5sYW1iZGEnKSwgJygnLCB0aGlzLnBvcFN0YWNrKCksICcsICcsIHRoaXMuY29udGV4dE5hbWUoMCksICcpJ10pO1xuICB9LFxuXG4gIC8vIFtwdXNoU3RyaW5nUGFyYW1dXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHN0cmluZywgY3VycmVudENvbnRleHQsIC4uLlxuICAvL1xuICAvLyBUaGlzIG9wY29kZSBpcyBkZXNpZ25lZCBmb3IgdXNlIGluIHN0cmluZyBtb2RlLCB3aGljaFxuICAvLyBwcm92aWRlcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGEgcGFyYW1ldGVyIGFsb25nIHdpdGggaXRzXG4gIC8vIGRlcHRoIHJhdGhlciB0aGFuIHJlc29sdmluZyBpdCBpbW1lZGlhdGVseS5cbiAgcHVzaFN0cmluZ1BhcmFtOiBmdW5jdGlvbiBwdXNoU3RyaW5nUGFyYW0oc3RyaW5nLCB0eXBlKSB7XG4gICAgdGhpcy5wdXNoQ29udGV4dCgpO1xuICAgIHRoaXMucHVzaFN0cmluZyh0eXBlKTtcblxuICAgIC8vIElmIGl0J3MgYSBzdWJleHByZXNzaW9uLCB0aGUgc3RyaW5nIHJlc3VsdFxuICAgIC8vIHdpbGwgYmUgcHVzaGVkIGFmdGVyIHRoaXMgb3Bjb2RlLlxuICAgIGlmICh0eXBlICE9PSAnU3ViRXhwcmVzc2lvbicpIHtcbiAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLnB1c2hTdHJpbmcoc3RyaW5nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBlbXB0eUhhc2g6IGZ1bmN0aW9uIGVtcHR5SGFzaChvbWl0RW1wdHkpIHtcbiAgICBpZiAodGhpcy50cmFja0lkcykge1xuICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoSWRzXG4gICAgfVxuICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykge1xuICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoQ29udGV4dHNcbiAgICAgIHRoaXMucHVzaCgne30nKTsgLy8gaGFzaFR5cGVzXG4gICAgfVxuICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChvbWl0RW1wdHkgPyAndW5kZWZpbmVkJyA6ICd7fScpO1xuICB9LFxuICBwdXNoSGFzaDogZnVuY3Rpb24gcHVzaEhhc2goKSB7XG4gICAgaWYgKHRoaXMuaGFzaCkge1xuICAgICAgdGhpcy5oYXNoZXMucHVzaCh0aGlzLmhhc2gpO1xuICAgIH1cbiAgICB0aGlzLmhhc2ggPSB7IHZhbHVlczogW10sIHR5cGVzOiBbXSwgY29udGV4dHM6IFtdLCBpZHM6IFtdIH07XG4gIH0sXG4gIHBvcEhhc2g6IGZ1bmN0aW9uIHBvcEhhc2goKSB7XG4gICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7XG4gICAgdGhpcy5oYXNoID0gdGhpcy5oYXNoZXMucG9wKCk7XG5cbiAgICBpZiAodGhpcy50cmFja0lkcykge1xuICAgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLmlkcykpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHtcbiAgICAgIHRoaXMucHVzaCh0aGlzLm9iamVjdExpdGVyYWwoaGFzaC5jb250ZXh0cykpO1xuICAgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLnR5cGVzKSk7XG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLnZhbHVlcykpO1xuICB9LFxuXG4gIC8vIFtwdXNoU3RyaW5nXVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiBxdW90ZWRTdHJpbmcoc3RyaW5nKSwgLi4uXG4gIC8vXG4gIC8vIFB1c2ggYSBxdW90ZWQgdmVyc2lvbiBvZiBgc3RyaW5nYCBvbnRvIHRoZSBzdGFja1xuICBwdXNoU3RyaW5nOiBmdW5jdGlvbiBwdXNoU3RyaW5nKHN0cmluZykge1xuICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLnF1b3RlZFN0cmluZyhzdHJpbmcpKTtcbiAgfSxcblxuICAvLyBbcHVzaExpdGVyYWxdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHZhbHVlLCAuLi5cbiAgLy9cbiAgLy8gUHVzaGVzIGEgdmFsdWUgb250byB0aGUgc3RhY2suIFRoaXMgb3BlcmF0aW9uIHByZXZlbnRzXG4gIC8vIHRoZSBjb21waWxlciBmcm9tIGNyZWF0aW5nIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHRvIGhvbGRcbiAgLy8gaXQuXG4gIHB1c2hMaXRlcmFsOiBmdW5jdGlvbiBwdXNoTGl0ZXJhbCh2YWx1ZSkge1xuICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh2YWx1ZSk7XG4gIH0sXG5cbiAgLy8gW3B1c2hQcm9ncmFtXVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi5cbiAgLy9cbiAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlc1xuICAvLyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1hY2Nlc3NpYmxlXG4gIC8vIGV4cHJlc3Npb24uXG4gIHB1c2hQcm9ncmFtOiBmdW5jdGlvbiBwdXNoUHJvZ3JhbShndWlkKSB7XG4gICAgaWYgKGd1aWQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucHJvZ3JhbUV4cHJlc3Npb24oZ3VpZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFtpbnZva2VIZWxwZXJdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uXG4gIC8vXG4gIC8vIFBvcHMgb2ZmIHRoZSBoZWxwZXIncyBwYXJhbWV0ZXJzLCBpbnZva2VzIHRoZSBoZWxwZXIsXG4gIC8vIGFuZCBwdXNoZXMgdGhlIGhlbHBlcidzIHJldHVybiB2YWx1ZSBvbnRvIHRoZSBzdGFjay5cbiAgLy9cbiAgLy8gSWYgdGhlIGhlbHBlciBpcyBub3QgZm91bmQsIGBoZWxwZXJNaXNzaW5nYCBpcyBjYWxsZWQuXG4gIGludm9rZUhlbHBlcjogZnVuY3Rpb24gaW52b2tlSGVscGVyKHBhcmFtU2l6ZSwgbmFtZSwgaXNTaW1wbGUpIHtcbiAgICB2YXIgbm9uSGVscGVyID0gdGhpcy5wb3BTdGFjaygpLFxuICAgICAgICBoZWxwZXIgPSB0aGlzLnNldHVwSGVscGVyKHBhcmFtU2l6ZSwgbmFtZSksXG4gICAgICAgIHNpbXBsZSA9IGlzU2ltcGxlID8gW2hlbHBlci5uYW1lLCAnIHx8ICddIDogJyc7XG5cbiAgICB2YXIgbG9va3VwID0gWycoJ10uY29uY2F0KHNpbXBsZSwgbm9uSGVscGVyKTtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5zdHJpY3QpIHtcbiAgICAgIGxvb2t1cC5wdXNoKCcgfHwgJywgdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuaGVscGVyTWlzc2luZycpKTtcbiAgICB9XG4gICAgbG9va3VwLnB1c2goJyknKTtcblxuICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwobG9va3VwLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSk7XG4gIH0sXG5cbiAgLy8gW2ludm9rZUtub3duSGVscGVyXVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHJlc3VsdCBvZiBoZWxwZXIgaW52b2NhdGlvblxuICAvL1xuICAvLyBUaGlzIG9wZXJhdGlvbiBpcyB1c2VkIHdoZW4gdGhlIGhlbHBlciBpcyBrbm93biB0byBleGlzdCxcbiAgLy8gc28gYSBgaGVscGVyTWlzc2luZ2AgZmFsbGJhY2sgaXMgbm90IHJlcXVpcmVkLlxuICBpbnZva2VLbm93bkhlbHBlcjogZnVuY3Rpb24gaW52b2tlS25vd25IZWxwZXIocGFyYW1TaXplLCBuYW1lKSB7XG4gICAgdmFyIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKTtcbiAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGhlbHBlci5uYW1lLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSk7XG4gIH0sXG5cbiAgLy8gW2ludm9rZUFtYmlndW91c11cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgZGlzYW1iaWd1YXRpb25cbiAgLy9cbiAgLy8gVGhpcyBvcGVyYXRpb24gaXMgdXNlZCB3aGVuIGFuIGV4cHJlc3Npb24gbGlrZSBge3tmb299fWBcbiAgLy8gaXMgcHJvdmlkZWQsIGJ1dCB3ZSBkb24ndCBrbm93IGF0IGNvbXBpbGUtdGltZSB3aGV0aGVyIGl0XG4gIC8vIGlzIGEgaGVscGVyIG9yIGEgcGF0aC5cbiAgLy9cbiAgLy8gVGhpcyBvcGVyYXRpb24gZW1pdHMgbW9yZSBjb2RlIHRoYW4gdGhlIG90aGVyIG9wdGlvbnMsXG4gIC8vIGFuZCBjYW4gYmUgYXZvaWRlZCBieSBwYXNzaW5nIHRoZSBga25vd25IZWxwZXJzYCBhbmRcbiAgLy8gYGtub3duSGVscGVyc09ubHlgIGZsYWdzIGF0IGNvbXBpbGUtdGltZS5cbiAgaW52b2tlQW1iaWd1b3VzOiBmdW5jdGlvbiBpbnZva2VBbWJpZ3VvdXMobmFtZSwgaGVscGVyQ2FsbCkge1xuICAgIHRoaXMudXNlUmVnaXN0ZXIoJ2hlbHBlcicpO1xuXG4gICAgdmFyIG5vbkhlbHBlciA9IHRoaXMucG9wU3RhY2soKTtcblxuICAgIHRoaXMuZW1wdHlIYXNoKCk7XG4gICAgdmFyIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIoMCwgbmFtZSwgaGVscGVyQ2FsbCk7XG5cbiAgICB2YXIgaGVscGVyTmFtZSA9IHRoaXMubGFzdEhlbHBlciA9IHRoaXMubmFtZUxvb2t1cCgnaGVscGVycycsIG5hbWUsICdoZWxwZXInKTtcblxuICAgIHZhciBsb29rdXAgPSBbJygnLCAnKGhlbHBlciA9ICcsIGhlbHBlck5hbWUsICcgfHwgJywgbm9uSGVscGVyLCAnKSddO1xuICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkge1xuICAgICAgbG9va3VwWzBdID0gJyhoZWxwZXIgPSAnO1xuICAgICAgbG9va3VwLnB1c2goJyAhPSBudWxsID8gaGVscGVyIDogJywgdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuaGVscGVyTWlzc2luZycpKTtcbiAgICB9XG5cbiAgICB0aGlzLnB1c2goWycoJywgbG9va3VwLCBoZWxwZXIucGFyYW1zSW5pdCA/IFsnKSwoJywgaGVscGVyLnBhcmFtc0luaXRdIDogW10sICcpLCcsICcodHlwZW9mIGhlbHBlciA9PT0gJywgdGhpcy5hbGlhc2FibGUoJ1wiZnVuY3Rpb25cIicpLCAnID8gJywgdGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKCdoZWxwZXInLCAnY2FsbCcsIGhlbHBlci5jYWxsUGFyYW1zKSwgJyA6IGhlbHBlcikpJ10pO1xuICB9LFxuXG4gIC8vIFtpbnZva2VQYXJ0aWFsXVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiBjb250ZXh0LCAuLi5cbiAgLy8gT24gc3RhY2sgYWZ0ZXI6IHJlc3VsdCBvZiBwYXJ0aWFsIGludm9jYXRpb25cbiAgLy9cbiAgLy8gVGhpcyBvcGVyYXRpb24gcG9wcyBvZmYgYSBjb250ZXh0LCBpbnZva2VzIGEgcGFydGlhbCB3aXRoIHRoYXQgY29udGV4dCxcbiAgLy8gYW5kIHB1c2hlcyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZvY2F0aW9uIGJhY2suXG4gIGludm9rZVBhcnRpYWw6IGZ1bmN0aW9uIGludm9rZVBhcnRpYWwoaXNEeW5hbWljLCBuYW1lLCBpbmRlbnQpIHtcbiAgICB2YXIgcGFyYW1zID0gW10sXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLnNldHVwUGFyYW1zKG5hbWUsIDEsIHBhcmFtcywgZmFsc2UpO1xuXG4gICAgaWYgKGlzRHluYW1pYykge1xuICAgICAgbmFtZSA9IHRoaXMucG9wU3RhY2soKTtcbiAgICAgIGRlbGV0ZSBvcHRpb25zLm5hbWU7XG4gICAgfVxuXG4gICAgaWYgKGluZGVudCkge1xuICAgICAgb3B0aW9ucy5pbmRlbnQgPSBKU09OLnN0cmluZ2lmeShpbmRlbnQpO1xuICAgIH1cbiAgICBvcHRpb25zLmhlbHBlcnMgPSAnaGVscGVycyc7XG4gICAgb3B0aW9ucy5wYXJ0aWFscyA9ICdwYXJ0aWFscyc7XG5cbiAgICBpZiAoIWlzRHluYW1pYykge1xuICAgICAgcGFyYW1zLnVuc2hpZnQodGhpcy5uYW1lTG9va3VwKCdwYXJ0aWFscycsIG5hbWUsICdwYXJ0aWFsJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXMudW5zaGlmdChuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhdCkge1xuICAgICAgb3B0aW9ucy5kZXB0aHMgPSAnZGVwdGhzJztcbiAgICB9XG4gICAgb3B0aW9ucyA9IHRoaXMub2JqZWN0TGl0ZXJhbChvcHRpb25zKTtcbiAgICBwYXJhbXMucHVzaChvcHRpb25zKTtcblxuICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoJ3RoaXMuaW52b2tlUGFydGlhbCcsICcnLCBwYXJhbXMpKTtcbiAgfSxcblxuICAvLyBbYXNzaWduVG9IYXNoXVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uLCBoYXNoLCAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4sIGhhc2gsIC4uLlxuICAvL1xuICAvLyBQb3BzIGEgdmFsdWUgb2ZmIHRoZSBzdGFjayBhbmQgYXNzaWducyBpdCB0byB0aGUgY3VycmVudCBoYXNoXG4gIGFzc2lnblRvSGFzaDogZnVuY3Rpb24gYXNzaWduVG9IYXNoKGtleSkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMucG9wU3RhY2soKSxcbiAgICAgICAgY29udGV4dCA9IHVuZGVmaW5lZCxcbiAgICAgICAgdHlwZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgaWQgPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAodGhpcy50cmFja0lkcykge1xuICAgICAgaWQgPSB0aGlzLnBvcFN0YWNrKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykge1xuICAgICAgdHlwZSA9IHRoaXMucG9wU3RhY2soKTtcbiAgICAgIGNvbnRleHQgPSB0aGlzLnBvcFN0YWNrKCk7XG4gICAgfVxuXG4gICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7XG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGhhc2guY29udGV4dHNba2V5XSA9IGNvbnRleHQ7XG4gICAgfVxuICAgIGlmICh0eXBlKSB7XG4gICAgICBoYXNoLnR5cGVzW2tleV0gPSB0eXBlO1xuICAgIH1cbiAgICBpZiAoaWQpIHtcbiAgICAgIGhhc2guaWRzW2tleV0gPSBpZDtcbiAgICB9XG4gICAgaGFzaC52YWx1ZXNba2V5XSA9IHZhbHVlO1xuICB9LFxuXG4gIHB1c2hJZDogZnVuY3Rpb24gcHVzaElkKHR5cGUsIG5hbWUsIGNoaWxkKSB7XG4gICAgaWYgKHR5cGUgPT09ICdCbG9ja1BhcmFtJykge1xuICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdibG9ja1BhcmFtc1snICsgbmFtZVswXSArICddLnBhdGhbJyArIG5hbWVbMV0gKyAnXScgKyAoY2hpbGQgPyAnICsgJyArIEpTT04uc3RyaW5naWZ5KCcuJyArIGNoaWxkKSA6ICcnKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnUGF0aEV4cHJlc3Npb24nKSB7XG4gICAgICB0aGlzLnB1c2hTdHJpbmcobmFtZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnU3ViRXhwcmVzc2lvbicpIHtcbiAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgndHJ1ZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ251bGwnKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSEVMUEVSU1xuXG4gIGNvbXBpbGVyOiBKYXZhU2NyaXB0Q29tcGlsZXIsXG5cbiAgY29tcGlsZUNoaWxkcmVuOiBmdW5jdGlvbiBjb21waWxlQ2hpbGRyZW4oZW52aXJvbm1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBlbnZpcm9ubWVudC5jaGlsZHJlbixcbiAgICAgICAgY2hpbGQgPSB1bmRlZmluZWQsXG4gICAgICAgIGNvbXBpbGVyID0gdW5kZWZpbmVkO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBjb21waWxlciA9IG5ldyB0aGlzLmNvbXBpbGVyKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTtcblxuICAgICAgaWYgKGluZGV4ID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zLnB1c2goJycpOyAvLyBQbGFjZWhvbGRlciB0byBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIGZvciBuZXN0ZWQgY2hpbGRyZW5cbiAgICAgICAgaW5kZXggPSB0aGlzLmNvbnRleHQucHJvZ3JhbXMubGVuZ3RoO1xuICAgICAgICBjaGlsZC5pbmRleCA9IGluZGV4O1xuICAgICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7XG4gICAgICAgIHRoaXMuY29udGV4dC5wcm9ncmFtc1tpbmRleF0gPSBjb21waWxlci5jb21waWxlKGNoaWxkLCBvcHRpb25zLCB0aGlzLmNvbnRleHQsICF0aGlzLnByZWNvbXBpbGUpO1xuICAgICAgICB0aGlzLmNvbnRleHQuZW52aXJvbm1lbnRzW2luZGV4XSA9IGNoaWxkO1xuXG4gICAgICAgIHRoaXMudXNlRGVwdGhzID0gdGhpcy51c2VEZXB0aHMgfHwgY29tcGlsZXIudXNlRGVwdGhzO1xuICAgICAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdGhpcy51c2VCbG9ja1BhcmFtcyB8fCBjb21waWxlci51c2VCbG9ja1BhcmFtcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDtcblxuICAgICAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IGNoaWxkLnVzZURlcHRocztcbiAgICAgICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgY2hpbGQudXNlQmxvY2tQYXJhbXM7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBtYXRjaEV4aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24gbWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tpXTtcbiAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBwcm9ncmFtRXhwcmVzc2lvbjogZnVuY3Rpb24gcHJvZ3JhbUV4cHJlc3Npb24oZ3VpZCkge1xuICAgIHZhciBjaGlsZCA9IHRoaXMuZW52aXJvbm1lbnQuY2hpbGRyZW5bZ3VpZF0sXG4gICAgICAgIHByb2dyYW1QYXJhbXMgPSBbY2hpbGQuaW5kZXgsICdkYXRhJywgY2hpbGQuYmxvY2tQYXJhbXNdO1xuXG4gICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgdGhpcy51c2VEZXB0aHMpIHtcbiAgICAgIHByb2dyYW1QYXJhbXMucHVzaCgnYmxvY2tQYXJhbXMnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudXNlRGVwdGhzKSB7XG4gICAgICBwcm9ncmFtUGFyYW1zLnB1c2goJ2RlcHRocycpO1xuICAgIH1cblxuICAgIHJldHVybiAndGhpcy5wcm9ncmFtKCcgKyBwcm9ncmFtUGFyYW1zLmpvaW4oJywgJykgKyAnKSc7XG4gIH0sXG5cbiAgdXNlUmVnaXN0ZXI6IGZ1bmN0aW9uIHVzZVJlZ2lzdGVyKG5hbWUpIHtcbiAgICBpZiAoIXRoaXMucmVnaXN0ZXJzW25hbWVdKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyc1tuYW1lXSA9IHRydWU7XG4gICAgICB0aGlzLnJlZ2lzdGVycy5saXN0LnB1c2gobmFtZSk7XG4gICAgfVxuICB9LFxuXG4gIHB1c2g6IGZ1bmN0aW9uIHB1c2goZXhwcikge1xuICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBMaXRlcmFsKSkge1xuICAgICAgZXhwciA9IHRoaXMuc291cmNlLndyYXAoZXhwcik7XG4gICAgfVxuXG4gICAgdGhpcy5pbmxpbmVTdGFjay5wdXNoKGV4cHIpO1xuICAgIHJldHVybiBleHByO1xuICB9LFxuXG4gIHB1c2hTdGFja0xpdGVyYWw6IGZ1bmN0aW9uIHB1c2hTdGFja0xpdGVyYWwoaXRlbSkge1xuICAgIHRoaXMucHVzaChuZXcgTGl0ZXJhbChpdGVtKSk7XG4gIH0sXG5cbiAgcHVzaFNvdXJjZTogZnVuY3Rpb24gcHVzaFNvdXJjZShzb3VyY2UpIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkge1xuICAgICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSwgdGhpcy5wZW5kaW5nTG9jYXRpb24pKTtcbiAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZSkge1xuICAgICAgdGhpcy5zb3VyY2UucHVzaChzb3VyY2UpO1xuICAgIH1cbiAgfSxcblxuICByZXBsYWNlU3RhY2s6IGZ1bmN0aW9uIHJlcGxhY2VTdGFjayhjYWxsYmFjaykge1xuICAgIHZhciBwcmVmaXggPSBbJygnXSxcbiAgICAgICAgc3RhY2sgPSB1bmRlZmluZWQsXG4gICAgICAgIGNyZWF0ZWRTdGFjayA9IHVuZGVmaW5lZCxcbiAgICAgICAgdXNlZExpdGVyYWwgPSB1bmRlZmluZWQ7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICghdGhpcy5pc0lubGluZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgncmVwbGFjZVN0YWNrIG9uIG5vbi1pbmxpbmUnKTtcbiAgICB9XG5cbiAgICAvLyBXZSB3YW50IHRvIG1lcmdlIHRoZSBpbmxpbmUgc3RhdGVtZW50IGludG8gdGhlIHJlcGxhY2VtZW50IHN0YXRlbWVudCB2aWEgJywnXG4gICAgdmFyIHRvcCA9IHRoaXMucG9wU3RhY2sodHJ1ZSk7XG5cbiAgICBpZiAodG9wIGluc3RhbmNlb2YgTGl0ZXJhbCkge1xuICAgICAgLy8gTGl0ZXJhbHMgZG8gbm90IG5lZWQgdG8gYmUgaW5saW5lZFxuICAgICAgc3RhY2sgPSBbdG9wLnZhbHVlXTtcbiAgICAgIHByZWZpeCA9IFsnKCcsIHN0YWNrXTtcbiAgICAgIHVzZWRMaXRlcmFsID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gR2V0IG9yIGNyZWF0ZSB0aGUgY3VycmVudCBzdGFjayBuYW1lIGZvciB1c2UgYnkgdGhlIGlubGluZVxuICAgICAgY3JlYXRlZFN0YWNrID0gdHJ1ZTtcbiAgICAgIHZhciBfbmFtZSA9IHRoaXMuaW5jclN0YWNrKCk7XG5cbiAgICAgIHByZWZpeCA9IFsnKCgnLCB0aGlzLnB1c2goX25hbWUpLCAnID0gJywgdG9wLCAnKSddO1xuICAgICAgc3RhY2sgPSB0aGlzLnRvcFN0YWNrKCk7XG4gICAgfVxuXG4gICAgdmFyIGl0ZW0gPSBjYWxsYmFjay5jYWxsKHRoaXMsIHN0YWNrKTtcblxuICAgIGlmICghdXNlZExpdGVyYWwpIHtcbiAgICAgIHRoaXMucG9wU3RhY2soKTtcbiAgICB9XG4gICAgaWYgKGNyZWF0ZWRTdGFjaykge1xuICAgICAgdGhpcy5zdGFja1Nsb3QtLTtcbiAgICB9XG4gICAgdGhpcy5wdXNoKHByZWZpeC5jb25jYXQoaXRlbSwgJyknKSk7XG4gIH0sXG5cbiAgaW5jclN0YWNrOiBmdW5jdGlvbiBpbmNyU3RhY2soKSB7XG4gICAgdGhpcy5zdGFja1Nsb3QrKztcbiAgICBpZiAodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc3RhY2tWYXJzLnB1c2goJ3N0YWNrJyArIHRoaXMuc3RhY2tTbG90KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudG9wU3RhY2tOYW1lKCk7XG4gIH0sXG4gIHRvcFN0YWNrTmFtZTogZnVuY3Rpb24gdG9wU3RhY2tOYW1lKCkge1xuICAgIHJldHVybiAnc3RhY2snICsgdGhpcy5zdGFja1Nsb3Q7XG4gIH0sXG4gIGZsdXNoSW5saW5lOiBmdW5jdGlvbiBmbHVzaElubGluZSgpIHtcbiAgICB2YXIgaW5saW5lU3RhY2sgPSB0aGlzLmlubGluZVN0YWNrO1xuICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciBlbnRyeSA9IGlubGluZVN0YWNrW2ldO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFsKSB7XG4gICAgICAgIHRoaXMuY29tcGlsZVN0YWNrLnB1c2goZW50cnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5pbmNyU3RhY2soKTtcbiAgICAgICAgdGhpcy5wdXNoU291cmNlKFtzdGFjaywgJyA9ICcsIGVudHJ5LCAnOyddKTtcbiAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBpc0lubGluZTogZnVuY3Rpb24gaXNJbmxpbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoO1xuICB9LFxuXG4gIHBvcFN0YWNrOiBmdW5jdGlvbiBwb3BTdGFjayh3cmFwcGVkKSB7XG4gICAgdmFyIGlubGluZSA9IHRoaXMuaXNJbmxpbmUoKSxcbiAgICAgICAgaXRlbSA9IChpbmxpbmUgPyB0aGlzLmlubGluZVN0YWNrIDogdGhpcy5jb21waWxlU3RhY2spLnBvcCgpO1xuXG4gICAgaWYgKCF3cmFwcGVkICYmIGl0ZW0gaW5zdGFuY2VvZiBMaXRlcmFsKSB7XG4gICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFpbmxpbmUpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgaWYgKCF0aGlzLnN0YWNrU2xvdCkge1xuICAgICAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdJbnZhbGlkIHN0YWNrIHBvcCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhY2tTbG90LS07XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gIH0sXG5cbiAgdG9wU3RhY2s6IGZ1bmN0aW9uIHRvcFN0YWNrKCkge1xuICAgIHZhciBzdGFjayA9IHRoaXMuaXNJbmxpbmUoKSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjayxcbiAgICAgICAgaXRlbSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBMaXRlcmFsKSB7XG4gICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuICB9LFxuXG4gIGNvbnRleHROYW1lOiBmdW5jdGlvbiBjb250ZXh0TmFtZShjb250ZXh0KSB7XG4gICAgaWYgKHRoaXMudXNlRGVwdGhzICYmIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiAnZGVwdGhzWycgKyBjb250ZXh0ICsgJ10nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2RlcHRoJyArIGNvbnRleHQ7XG4gICAgfVxuICB9LFxuXG4gIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZS5xdW90ZWRTdHJpbmcoc3RyKTtcbiAgfSxcblxuICBvYmplY3RMaXRlcmFsOiBmdW5jdGlvbiBvYmplY3RMaXRlcmFsKG9iaikge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZS5vYmplY3RMaXRlcmFsKG9iaik7XG4gIH0sXG5cbiAgYWxpYXNhYmxlOiBmdW5jdGlvbiBhbGlhc2FibGUobmFtZSkge1xuICAgIHZhciByZXQgPSB0aGlzLmFsaWFzZXNbbmFtZV07XG4gICAgaWYgKHJldCkge1xuICAgICAgcmV0LnJlZmVyZW5jZUNvdW50Kys7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXSA9IHRoaXMuc291cmNlLndyYXAobmFtZSk7XG4gICAgcmV0LmFsaWFzYWJsZSA9IHRydWU7XG4gICAgcmV0LnJlZmVyZW5jZUNvdW50ID0gMTtcblxuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgc2V0dXBIZWxwZXI6IGZ1bmN0aW9uIHNldHVwSGVscGVyKHBhcmFtU2l6ZSwgbmFtZSwgYmxvY2tIZWxwZXIpIHtcbiAgICB2YXIgcGFyYW1zID0gW10sXG4gICAgICAgIHBhcmFtc0luaXQgPSB0aGlzLnNldHVwSGVscGVyQXJncyhuYW1lLCBwYXJhbVNpemUsIHBhcmFtcywgYmxvY2tIZWxwZXIpO1xuICAgIHZhciBmb3VuZEhlbHBlciA9IHRoaXMubmFtZUxvb2t1cCgnaGVscGVycycsIG5hbWUsICdoZWxwZXInKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgIHBhcmFtc0luaXQ6IHBhcmFtc0luaXQsXG4gICAgICBuYW1lOiBmb3VuZEhlbHBlcixcbiAgICAgIGNhbGxQYXJhbXM6IFt0aGlzLmNvbnRleHROYW1lKDApXS5jb25jYXQocGFyYW1zKVxuICAgIH07XG4gIH0sXG5cbiAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uIHNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHt9LFxuICAgICAgICBjb250ZXh0cyA9IFtdLFxuICAgICAgICB0eXBlcyA9IFtdLFxuICAgICAgICBpZHMgPSBbXSxcbiAgICAgICAgcGFyYW0gPSB1bmRlZmluZWQ7XG5cbiAgICBvcHRpb25zLm5hbWUgPSB0aGlzLnF1b3RlZFN0cmluZyhoZWxwZXIpO1xuICAgIG9wdGlvbnMuaGFzaCA9IHRoaXMucG9wU3RhY2soKTtcblxuICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7XG4gICAgICBvcHRpb25zLmhhc2hJZHMgPSB0aGlzLnBvcFN0YWNrKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykge1xuICAgICAgb3B0aW9ucy5oYXNoVHlwZXMgPSB0aGlzLnBvcFN0YWNrKCk7XG4gICAgICBvcHRpb25zLmhhc2hDb250ZXh0cyA9IHRoaXMucG9wU3RhY2soKTtcbiAgICB9XG5cbiAgICB2YXIgaW52ZXJzZSA9IHRoaXMucG9wU3RhY2soKSxcbiAgICAgICAgcHJvZ3JhbSA9IHRoaXMucG9wU3RhY2soKTtcblxuICAgIC8vIEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFsbG93c1xuICAgIC8vIGhlbHBlcnMgdG8gZG8gYSBjaGVjayBmb3IgYGlmIChvcHRpb25zLmZuKWBcbiAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7XG4gICAgICBvcHRpb25zLmZuID0gcHJvZ3JhbSB8fCAndGhpcy5ub29wJztcbiAgICAgIG9wdGlvbnMuaW52ZXJzZSA9IGludmVyc2UgfHwgJ3RoaXMubm9vcCc7XG4gICAgfVxuXG4gICAgLy8gVGhlIHBhcmFtZXRlcnMgZ28gb24gdG8gdGhlIHN0YWNrIGluIG9yZGVyIChtYWtpbmcgc3VyZSB0aGF0IHRoZXkgYXJlIGV2YWx1YXRlZCBpbiBvcmRlcilcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIHBvcCB0aGVtIG9mZiB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlclxuICAgIHZhciBpID0gcGFyYW1TaXplO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpO1xuICAgICAgcGFyYW1zW2ldID0gcGFyYW07XG5cbiAgICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7XG4gICAgICAgIGlkc1tpXSA9IHRoaXMucG9wU3RhY2soKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykge1xuICAgICAgICB0eXBlc1tpXSA9IHRoaXMucG9wU3RhY2soKTtcbiAgICAgICAgY29udGV4dHNbaV0gPSB0aGlzLnBvcFN0YWNrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJhY2tJZHMpIHtcbiAgICAgIG9wdGlvbnMuaWRzID0gdGhpcy5zb3VyY2UuZ2VuZXJhdGVBcnJheShpZHMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdHJpbmdQYXJhbXMpIHtcbiAgICAgIG9wdGlvbnMudHlwZXMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KHR5cGVzKTtcbiAgICAgIG9wdGlvbnMuY29udGV4dHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGNvbnRleHRzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHtcbiAgICAgIG9wdGlvbnMuZGF0YSA9ICdkYXRhJztcbiAgICB9XG4gICAgaWYgKHRoaXMudXNlQmxvY2tQYXJhbXMpIHtcbiAgICAgIG9wdGlvbnMuYmxvY2tQYXJhbXMgPSAnYmxvY2tQYXJhbXMnO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfSxcblxuICBzZXR1cEhlbHBlckFyZ3M6IGZ1bmN0aW9uIHNldHVwSGVscGVyQXJncyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3Rlcikge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5zZXR1cFBhcmFtcyhoZWxwZXIsIHBhcmFtU2l6ZSwgcGFyYW1zLCB0cnVlKTtcbiAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpO1xuICAgIGlmICh1c2VSZWdpc3Rlcikge1xuICAgICAgdGhpcy51c2VSZWdpc3Rlcignb3B0aW9ucycpO1xuICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTtcbiAgICAgIHJldHVybiBbJ29wdGlvbnM9Jywgb3B0aW9uc107XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlc2VydmVkV29yZHMgPSAoJ2JyZWFrIGVsc2UgbmV3IHZhcicgKyAnIGNhc2UgZmluYWxseSByZXR1cm4gdm9pZCcgKyAnIGNhdGNoIGZvciBzd2l0Y2ggd2hpbGUnICsgJyBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgnICsgJyBkZWZhdWx0IGlmIHRocm93JyArICcgZGVsZXRlIGluIHRyeScgKyAnIGRvIGluc3RhbmNlb2YgdHlwZW9mJyArICcgYWJzdHJhY3QgZW51bSBpbnQgc2hvcnQnICsgJyBib29sZWFuIGV4cG9ydCBpbnRlcmZhY2Ugc3RhdGljJyArICcgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXInICsgJyBjaGFyIGZpbmFsIG5hdGl2ZSBzeW5jaHJvbml6ZWQnICsgJyBjbGFzcyBmbG9hdCBwYWNrYWdlIHRocm93cycgKyAnIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQnICsgJyBkZWJ1Z2dlciBpbXBsZW1lbnRzIHByb3RlY3RlZCB2b2xhdGlsZScgKyAnIGRvdWJsZSBpbXBvcnQgcHVibGljIGxldCB5aWVsZCBhd2FpdCcgKyAnIG51bGwgdHJ1ZSBmYWxzZScpLnNwbGl0KCcgJyk7XG5cbiAgdmFyIGNvbXBpbGVyV29yZHMgPSBKYXZhU2NyaXB0Q29tcGlsZXIuUkVTRVJWRURfV09SRFMgPSB7fTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IHJlc2VydmVkV29yZHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29tcGlsZXJXb3Jkc1tyZXNlcnZlZFdvcmRzW2ldXSA9IHRydWU7XG4gIH1cbn0pKCk7XG5cbkphdmFTY3JpcHRDb21waWxlci5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiAhSmF2YVNjcmlwdENvbXBpbGVyLlJFU0VSVkVEX1dPUkRTW25hbWVdICYmIC9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChuYW1lKTtcbn07XG5cbmZ1bmN0aW9uIHN0cmljdExvb2t1cChyZXF1aXJlVGVybWluYWwsIGNvbXBpbGVyLCBwYXJ0cywgdHlwZSkge1xuICB2YXIgc3RhY2sgPSBjb21waWxlci5wb3BTdGFjaygpLFxuICAgICAgaSA9IDAsXG4gICAgICBsZW4gPSBwYXJ0cy5sZW5ndGg7XG4gIGlmIChyZXF1aXJlVGVybWluYWwpIHtcbiAgICBsZW4tLTtcbiAgfVxuXG4gIGZvciAoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzdGFjayA9IGNvbXBpbGVyLm5hbWVMb29rdXAoc3RhY2ssIHBhcnRzW2ldLCB0eXBlKTtcbiAgfVxuXG4gIGlmIChyZXF1aXJlVGVybWluYWwpIHtcbiAgICByZXR1cm4gW2NvbXBpbGVyLmFsaWFzYWJsZSgndGhpcy5zdHJpY3QnKSwgJygnLCBzdGFjaywgJywgJywgY29tcGlsZXIucXVvdGVkU3RyaW5nKHBhcnRzW2ldKSwgJyknXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RhY2s7XG4gIH1cbn1cblxuZXhwb3J0c1snZGVmYXVsdCddID0gSmF2YVNjcmlwdENvbXBpbGVyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuLyogSmlzb24gZ2VuZXJhdGVkIHBhcnNlciAqL1xudmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJzZXIgPSB7IHRyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHt9LFxuICAgICAgICB5eToge30sXG4gICAgICAgIHN5bWJvbHNfOiB7IGVycm9yOiAyLCByb290OiAzLCBwcm9ncmFtOiA0LCBFT0Y6IDUsIHByb2dyYW1fcmVwZXRpdGlvbjA6IDYsIHN0YXRlbWVudDogNywgbXVzdGFjaGU6IDgsIGJsb2NrOiA5LCByYXdCbG9jazogMTAsIHBhcnRpYWw6IDExLCBjb250ZW50OiAxMiwgQ09NTUVOVDogMTMsIENPTlRFTlQ6IDE0LCBvcGVuUmF3QmxvY2s6IDE1LCBFTkRfUkFXX0JMT0NLOiAxNiwgT1BFTl9SQVdfQkxPQ0s6IDE3LCBoZWxwZXJOYW1lOiAxOCwgb3BlblJhd0Jsb2NrX3JlcGV0aXRpb24wOiAxOSwgb3BlblJhd0Jsb2NrX29wdGlvbjA6IDIwLCBDTE9TRV9SQVdfQkxPQ0s6IDIxLCBvcGVuQmxvY2s6IDIyLCBibG9ja19vcHRpb24wOiAyMywgY2xvc2VCbG9jazogMjQsIG9wZW5JbnZlcnNlOiAyNSwgYmxvY2tfb3B0aW9uMTogMjYsIE9QRU5fQkxPQ0s6IDI3LCBvcGVuQmxvY2tfcmVwZXRpdGlvbjA6IDI4LCBvcGVuQmxvY2tfb3B0aW9uMDogMjksIG9wZW5CbG9ja19vcHRpb24xOiAzMCwgQ0xPU0U6IDMxLCBPUEVOX0lOVkVSU0U6IDMyLCBvcGVuSW52ZXJzZV9yZXBldGl0aW9uMDogMzMsIG9wZW5JbnZlcnNlX29wdGlvbjA6IDM0LCBvcGVuSW52ZXJzZV9vcHRpb24xOiAzNSwgb3BlbkludmVyc2VDaGFpbjogMzYsIE9QRU5fSU5WRVJTRV9DSEFJTjogMzcsIG9wZW5JbnZlcnNlQ2hhaW5fcmVwZXRpdGlvbjA6IDM4LCBvcGVuSW52ZXJzZUNoYWluX29wdGlvbjA6IDM5LCBvcGVuSW52ZXJzZUNoYWluX29wdGlvbjE6IDQwLCBpbnZlcnNlQW5kUHJvZ3JhbTogNDEsIElOVkVSU0U6IDQyLCBpbnZlcnNlQ2hhaW46IDQzLCBpbnZlcnNlQ2hhaW5fb3B0aW9uMDogNDQsIE9QRU5fRU5EQkxPQ0s6IDQ1LCBPUEVOOiA0NiwgbXVzdGFjaGVfcmVwZXRpdGlvbjA6IDQ3LCBtdXN0YWNoZV9vcHRpb24wOiA0OCwgT1BFTl9VTkVTQ0FQRUQ6IDQ5LCBtdXN0YWNoZV9yZXBldGl0aW9uMTogNTAsIG11c3RhY2hlX29wdGlvbjE6IDUxLCBDTE9TRV9VTkVTQ0FQRUQ6IDUyLCBPUEVOX1BBUlRJQUw6IDUzLCBwYXJ0aWFsTmFtZTogNTQsIHBhcnRpYWxfcmVwZXRpdGlvbjA6IDU1LCBwYXJ0aWFsX29wdGlvbjA6IDU2LCBwYXJhbTogNTcsIHNleHByOiA1OCwgT1BFTl9TRVhQUjogNTksIHNleHByX3JlcGV0aXRpb24wOiA2MCwgc2V4cHJfb3B0aW9uMDogNjEsIENMT1NFX1NFWFBSOiA2MiwgaGFzaDogNjMsIGhhc2hfcmVwZXRpdGlvbl9wbHVzMDogNjQsIGhhc2hTZWdtZW50OiA2NSwgSUQ6IDY2LCBFUVVBTFM6IDY3LCBibG9ja1BhcmFtczogNjgsIE9QRU5fQkxPQ0tfUEFSQU1TOiA2OSwgYmxvY2tQYXJhbXNfcmVwZXRpdGlvbl9wbHVzMDogNzAsIENMT1NFX0JMT0NLX1BBUkFNUzogNzEsIHBhdGg6IDcyLCBkYXRhTmFtZTogNzMsIFNUUklORzogNzQsIE5VTUJFUjogNzUsIEJPT0xFQU46IDc2LCBVTkRFRklORUQ6IDc3LCBOVUxMOiA3OCwgREFUQTogNzksIHBhdGhTZWdtZW50czogODAsIFNFUDogODEsICRhY2NlcHQ6IDAsICRlbmQ6IDEgfSxcbiAgICAgICAgdGVybWluYWxzXzogeyAyOiBcImVycm9yXCIsIDU6IFwiRU9GXCIsIDEzOiBcIkNPTU1FTlRcIiwgMTQ6IFwiQ09OVEVOVFwiLCAxNjogXCJFTkRfUkFXX0JMT0NLXCIsIDE3OiBcIk9QRU5fUkFXX0JMT0NLXCIsIDIxOiBcIkNMT1NFX1JBV19CTE9DS1wiLCAyNzogXCJPUEVOX0JMT0NLXCIsIDMxOiBcIkNMT1NFXCIsIDMyOiBcIk9QRU5fSU5WRVJTRVwiLCAzNzogXCJPUEVOX0lOVkVSU0VfQ0hBSU5cIiwgNDI6IFwiSU5WRVJTRVwiLCA0NTogXCJPUEVOX0VOREJMT0NLXCIsIDQ2OiBcIk9QRU5cIiwgNDk6IFwiT1BFTl9VTkVTQ0FQRURcIiwgNTI6IFwiQ0xPU0VfVU5FU0NBUEVEXCIsIDUzOiBcIk9QRU5fUEFSVElBTFwiLCA1OTogXCJPUEVOX1NFWFBSXCIsIDYyOiBcIkNMT1NFX1NFWFBSXCIsIDY2OiBcIklEXCIsIDY3OiBcIkVRVUFMU1wiLCA2OTogXCJPUEVOX0JMT0NLX1BBUkFNU1wiLCA3MTogXCJDTE9TRV9CTE9DS19QQVJBTVNcIiwgNzQ6IFwiU1RSSU5HXCIsIDc1OiBcIk5VTUJFUlwiLCA3NjogXCJCT09MRUFOXCIsIDc3OiBcIlVOREVGSU5FRFwiLCA3ODogXCJOVUxMXCIsIDc5OiBcIkRBVEFcIiwgODE6IFwiU0VQXCIgfSxcbiAgICAgICAgcHJvZHVjdGlvbnNfOiBbMCwgWzMsIDJdLCBbNCwgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFsxMiwgMV0sIFsxMCwgM10sIFsxNSwgNV0sIFs5LCA0XSwgWzksIDRdLCBbMjIsIDZdLCBbMjUsIDZdLCBbMzYsIDZdLCBbNDEsIDJdLCBbNDMsIDNdLCBbNDMsIDFdLCBbMjQsIDNdLCBbOCwgNV0sIFs4LCA1XSwgWzExLCA1XSwgWzU3LCAxXSwgWzU3LCAxXSwgWzU4LCA1XSwgWzYzLCAxXSwgWzY1LCAzXSwgWzY4LCAzXSwgWzE4LCAxXSwgWzE4LCAxXSwgWzE4LCAxXSwgWzE4LCAxXSwgWzE4LCAxXSwgWzE4LCAxXSwgWzE4LCAxXSwgWzU0LCAxXSwgWzU0LCAxXSwgWzczLCAyXSwgWzcyLCAxXSwgWzgwLCAzXSwgWzgwLCAxXSwgWzYsIDBdLCBbNiwgMl0sIFsxOSwgMF0sIFsxOSwgMl0sIFsyMCwgMF0sIFsyMCwgMV0sIFsyMywgMF0sIFsyMywgMV0sIFsyNiwgMF0sIFsyNiwgMV0sIFsyOCwgMF0sIFsyOCwgMl0sIFsyOSwgMF0sIFsyOSwgMV0sIFszMCwgMF0sIFszMCwgMV0sIFszMywgMF0sIFszMywgMl0sIFszNCwgMF0sIFszNCwgMV0sIFszNSwgMF0sIFszNSwgMV0sIFszOCwgMF0sIFszOCwgMl0sIFszOSwgMF0sIFszOSwgMV0sIFs0MCwgMF0sIFs0MCwgMV0sIFs0NCwgMF0sIFs0NCwgMV0sIFs0NywgMF0sIFs0NywgMl0sIFs0OCwgMF0sIFs0OCwgMV0sIFs1MCwgMF0sIFs1MCwgMl0sIFs1MSwgMF0sIFs1MSwgMV0sIFs1NSwgMF0sIFs1NSwgMl0sIFs1NiwgMF0sIFs1NiwgMV0sIFs2MCwgMF0sIFs2MCwgMl0sIFs2MSwgMF0sIFs2MSwgMV0sIFs2NCwgMV0sIFs2NCwgMl0sIFs3MCwgMV0sIFs3MCwgMl1dLFxuICAgICAgICBwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB5eSwgeXlzdGF0ZSwgJCQsIF8kKSB7XG5cbiAgICAgICAgICAgIHZhciAkMCA9ICQkLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBzd2l0Y2ggKHl5c3RhdGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkJFskMCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFtKCQkWyQwXSwgbnVsbCwge30sIHl5LmxvY0luZm8odGhpcy5fJCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gbmV3IHl5LkNvbW1lbnRTdGF0ZW1lbnQoeXkuc3RyaXBDb21tZW50KCQkWyQwXSksIHl5LnN0cmlwRmxhZ3MoJCRbJDBdLCAkJFskMF0pLCB5eS5sb2NJbmZvKHRoaXMuXyQpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBuZXcgeXkuQ29udGVudFN0YXRlbWVudCgkJFskMF0sIHl5LmxvY0luZm8odGhpcy5fJCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUmF3QmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCB0aGlzLl8kKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDNdLCBwYXJhbXM6ICQkWyQwIC0gMl0sIGhhc2g6ICQkWyQwIC0gMV0gfTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZUJsb2NrKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwXSwgZmFsc2UsIHRoaXMuXyQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCB0cnVlLCB0aGlzLl8kKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDFdLCAkJFskMCAtIDFdKSwgcHJvZ3JhbTogJCRbJDBdIH07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnZlcnNlID0geXkucHJlcGFyZUJsb2NrKCQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtID0gbmV3IHl5LlByb2dyYW0oW2ludmVyc2VdLCBudWxsLCB7fSwgeXkubG9jSW5mbyh0aGlzLl8kKSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2dyYW0uY2hhaW5lZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBzdHJpcDogJCRbJDAgLSAyXS5zdHJpcCwgcHJvZ3JhbTogcHJvZ3JhbSwgY2hhaW46IHRydWUgfTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSAyXSwgJCRbJDBdKSB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZU11c3RhY2hlKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sICQkWyQwIC0gNF0sIHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA0XSwgJCRbJDBdKSwgdGhpcy5fJCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IG5ldyB5eS5QYXJ0aWFsU3RhdGVtZW50KCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sIHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA0XSwgJCRbJDBdKSwgeXkubG9jSW5mbyh0aGlzLl8kKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBuZXcgeXkuU3ViRXhwcmVzc2lvbigkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCB5eS5sb2NJbmZvKHRoaXMuXyQpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gbmV3IHl5Lkhhc2goJCRbJDBdLCB5eS5sb2NJbmZvKHRoaXMuXyQpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyODpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gbmV3IHl5Lkhhc2hQYWlyKHl5LmlkKCQkWyQwIC0gMl0pLCAkJFskMF0sIHl5LmxvY0luZm8odGhpcy5fJCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI5OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5pZCgkJFskMCAtIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IG5ldyB5eS5TdHJpbmdMaXRlcmFsKCQkWyQwXSwgeXkubG9jSW5mbyh0aGlzLl8kKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzM6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IG5ldyB5eS5OdW1iZXJMaXRlcmFsKCQkWyQwXSwgeXkubG9jSW5mbyh0aGlzLl8kKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IG5ldyB5eS5Cb29sZWFuTGl0ZXJhbCgkJFskMF0sIHl5LmxvY0luZm8odGhpcy5fJCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBuZXcgeXkuVW5kZWZpbmVkTGl0ZXJhbCh5eS5sb2NJbmZvKHRoaXMuXyQpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gbmV3IHl5Lk51bGxMaXRlcmFsKHl5LmxvY0luZm8odGhpcy5fJCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzg6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZVBhdGgodHJ1ZSwgJCRbJDBdLCB0aGlzLl8kKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geXkucHJlcGFyZVBhdGgoZmFsc2UsICQkWyQwXSwgdGhpcy5fJCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDE6XG4gICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMl0ucHVzaCh7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0sIHNlcGFyYXRvcjogJCRbJDAgLSAxXSB9KTt0aGlzLiQgPSAkJFskMCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQyOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbeyBwYXJ0OiB5eS5pZCgkJFskMF0pLCBvcmlnaW5hbDogJCRbJDBdIH1dO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQzOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0NDpcbiAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ2OlxuICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1MzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTQ6XG4gICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU5OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2MDpcbiAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY2OlxuICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3MzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzQ6XG4gICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc3OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3ODpcbiAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODE6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDgyOlxuICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4NTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODY6XG4gICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg5OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbJCRbJDBdXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTE6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFskJFskMF1dO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDkyOlxuICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHRhYmxlOiBbeyAzOiAxLCA0OiAyLCA1OiBbMiwgNDNdLCA2OiAzLCAxMzogWzIsIDQzXSwgMTQ6IFsyLCA0M10sIDE3OiBbMiwgNDNdLCAyNzogWzIsIDQzXSwgMzI6IFsyLCA0M10sIDQ2OiBbMiwgNDNdLCA0OTogWzIsIDQzXSwgNTM6IFsyLCA0M10gfSwgeyAxOiBbM10gfSwgeyA1OiBbMSwgNF0gfSwgeyA1OiBbMiwgMl0sIDc6IDUsIDg6IDYsIDk6IDcsIDEwOiA4LCAxMTogOSwgMTI6IDEwLCAxMzogWzEsIDExXSwgMTQ6IFsxLCAxOF0sIDE1OiAxNiwgMTc6IFsxLCAyMV0sIDIyOiAxNCwgMjU6IDE1LCAyNzogWzEsIDE5XSwgMzI6IFsxLCAyMF0sIDM3OiBbMiwgMl0sIDQyOiBbMiwgMl0sIDQ1OiBbMiwgMl0sIDQ2OiBbMSwgMTJdLCA0OTogWzEsIDEzXSwgNTM6IFsxLCAxN10gfSwgeyAxOiBbMiwgMV0gfSwgeyA1OiBbMiwgNDRdLCAxMzogWzIsIDQ0XSwgMTQ6IFsyLCA0NF0sIDE3OiBbMiwgNDRdLCAyNzogWzIsIDQ0XSwgMzI6IFsyLCA0NF0sIDM3OiBbMiwgNDRdLCA0MjogWzIsIDQ0XSwgNDU6IFsyLCA0NF0sIDQ2OiBbMiwgNDRdLCA0OTogWzIsIDQ0XSwgNTM6IFsyLCA0NF0gfSwgeyA1OiBbMiwgM10sIDEzOiBbMiwgM10sIDE0OiBbMiwgM10sIDE3OiBbMiwgM10sIDI3OiBbMiwgM10sIDMyOiBbMiwgM10sIDM3OiBbMiwgM10sIDQyOiBbMiwgM10sIDQ1OiBbMiwgM10sIDQ2OiBbMiwgM10sIDQ5OiBbMiwgM10sIDUzOiBbMiwgM10gfSwgeyA1OiBbMiwgNF0sIDEzOiBbMiwgNF0sIDE0OiBbMiwgNF0sIDE3OiBbMiwgNF0sIDI3OiBbMiwgNF0sIDMyOiBbMiwgNF0sIDM3OiBbMiwgNF0sIDQyOiBbMiwgNF0sIDQ1OiBbMiwgNF0sIDQ2OiBbMiwgNF0sIDQ5OiBbMiwgNF0sIDUzOiBbMiwgNF0gfSwgeyA1OiBbMiwgNV0sIDEzOiBbMiwgNV0sIDE0OiBbMiwgNV0sIDE3OiBbMiwgNV0sIDI3OiBbMiwgNV0sIDMyOiBbMiwgNV0sIDM3OiBbMiwgNV0sIDQyOiBbMiwgNV0sIDQ1OiBbMiwgNV0sIDQ2OiBbMiwgNV0sIDQ5OiBbMiwgNV0sIDUzOiBbMiwgNV0gfSwgeyA1OiBbMiwgNl0sIDEzOiBbMiwgNl0sIDE0OiBbMiwgNl0sIDE3OiBbMiwgNl0sIDI3OiBbMiwgNl0sIDMyOiBbMiwgNl0sIDM3OiBbMiwgNl0sIDQyOiBbMiwgNl0sIDQ1OiBbMiwgNl0sIDQ2OiBbMiwgNl0sIDQ5OiBbMiwgNl0sIDUzOiBbMiwgNl0gfSwgeyA1OiBbMiwgN10sIDEzOiBbMiwgN10sIDE0OiBbMiwgN10sIDE3OiBbMiwgN10sIDI3OiBbMiwgN10sIDMyOiBbMiwgN10sIDM3OiBbMiwgN10sIDQyOiBbMiwgN10sIDQ1OiBbMiwgN10sIDQ2OiBbMiwgN10sIDQ5OiBbMiwgN10sIDUzOiBbMiwgN10gfSwgeyA1OiBbMiwgOF0sIDEzOiBbMiwgOF0sIDE0OiBbMiwgOF0sIDE3OiBbMiwgOF0sIDI3OiBbMiwgOF0sIDMyOiBbMiwgOF0sIDM3OiBbMiwgOF0sIDQyOiBbMiwgOF0sIDQ1OiBbMiwgOF0sIDQ2OiBbMiwgOF0sIDQ5OiBbMiwgOF0sIDUzOiBbMiwgOF0gfSwgeyAxODogMjIsIDY2OiBbMSwgMzJdLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgMTg6IDMzLCA2NjogWzEsIDMyXSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDQ6IDM0LCA2OiAzLCAxMzogWzIsIDQzXSwgMTQ6IFsyLCA0M10sIDE3OiBbMiwgNDNdLCAyNzogWzIsIDQzXSwgMzI6IFsyLCA0M10sIDM3OiBbMiwgNDNdLCA0MjogWzIsIDQzXSwgNDU6IFsyLCA0M10sIDQ2OiBbMiwgNDNdLCA0OTogWzIsIDQzXSwgNTM6IFsyLCA0M10gfSwgeyA0OiAzNSwgNjogMywgMTM6IFsyLCA0M10sIDE0OiBbMiwgNDNdLCAxNzogWzIsIDQzXSwgMjc6IFsyLCA0M10sIDMyOiBbMiwgNDNdLCA0MjogWzIsIDQzXSwgNDU6IFsyLCA0M10sIDQ2OiBbMiwgNDNdLCA0OTogWzIsIDQzXSwgNTM6IFsyLCA0M10gfSwgeyAxMjogMzYsIDE0OiBbMSwgMThdIH0sIHsgMTg6IDM4LCA1NDogMzcsIDU4OiAzOSwgNTk6IFsxLCA0MF0sIDY2OiBbMSwgMzJdLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgNTogWzIsIDldLCAxMzogWzIsIDldLCAxNDogWzIsIDldLCAxNjogWzIsIDldLCAxNzogWzIsIDldLCAyNzogWzIsIDldLCAzMjogWzIsIDldLCAzNzogWzIsIDldLCA0MjogWzIsIDldLCA0NTogWzIsIDldLCA0NjogWzIsIDldLCA0OTogWzIsIDldLCA1MzogWzIsIDldIH0sIHsgMTg6IDQxLCA2NjogWzEsIDMyXSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDE4OiA0MiwgNjY6IFsxLCAzMl0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyAxODogNDMsIDY2OiBbMSwgMzJdLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgMzE6IFsyLCA3M10sIDQ3OiA0NCwgNTk6IFsyLCA3M10sIDY2OiBbMiwgNzNdLCA3NDogWzIsIDczXSwgNzU6IFsyLCA3M10sIDc2OiBbMiwgNzNdLCA3NzogWzIsIDczXSwgNzg6IFsyLCA3M10sIDc5OiBbMiwgNzNdIH0sIHsgMjE6IFsyLCAzMF0sIDMxOiBbMiwgMzBdLCA1MjogWzIsIDMwXSwgNTk6IFsyLCAzMF0sIDYyOiBbMiwgMzBdLCA2NjogWzIsIDMwXSwgNjk6IFsyLCAzMF0sIDc0OiBbMiwgMzBdLCA3NTogWzIsIDMwXSwgNzY6IFsyLCAzMF0sIDc3OiBbMiwgMzBdLCA3ODogWzIsIDMwXSwgNzk6IFsyLCAzMF0gfSwgeyAyMTogWzIsIDMxXSwgMzE6IFsyLCAzMV0sIDUyOiBbMiwgMzFdLCA1OTogWzIsIDMxXSwgNjI6IFsyLCAzMV0sIDY2OiBbMiwgMzFdLCA2OTogWzIsIDMxXSwgNzQ6IFsyLCAzMV0sIDc1OiBbMiwgMzFdLCA3NjogWzIsIDMxXSwgNzc6IFsyLCAzMV0sIDc4OiBbMiwgMzFdLCA3OTogWzIsIDMxXSB9LCB7IDIxOiBbMiwgMzJdLCAzMTogWzIsIDMyXSwgNTI6IFsyLCAzMl0sIDU5OiBbMiwgMzJdLCA2MjogWzIsIDMyXSwgNjY6IFsyLCAzMl0sIDY5OiBbMiwgMzJdLCA3NDogWzIsIDMyXSwgNzU6IFsyLCAzMl0sIDc2OiBbMiwgMzJdLCA3NzogWzIsIDMyXSwgNzg6IFsyLCAzMl0sIDc5OiBbMiwgMzJdIH0sIHsgMjE6IFsyLCAzM10sIDMxOiBbMiwgMzNdLCA1MjogWzIsIDMzXSwgNTk6IFsyLCAzM10sIDYyOiBbMiwgMzNdLCA2NjogWzIsIDMzXSwgNjk6IFsyLCAzM10sIDc0OiBbMiwgMzNdLCA3NTogWzIsIDMzXSwgNzY6IFsyLCAzM10sIDc3OiBbMiwgMzNdLCA3ODogWzIsIDMzXSwgNzk6IFsyLCAzM10gfSwgeyAyMTogWzIsIDM0XSwgMzE6IFsyLCAzNF0sIDUyOiBbMiwgMzRdLCA1OTogWzIsIDM0XSwgNjI6IFsyLCAzNF0sIDY2OiBbMiwgMzRdLCA2OTogWzIsIDM0XSwgNzQ6IFsyLCAzNF0sIDc1OiBbMiwgMzRdLCA3NjogWzIsIDM0XSwgNzc6IFsyLCAzNF0sIDc4OiBbMiwgMzRdLCA3OTogWzIsIDM0XSB9LCB7IDIxOiBbMiwgMzVdLCAzMTogWzIsIDM1XSwgNTI6IFsyLCAzNV0sIDU5OiBbMiwgMzVdLCA2MjogWzIsIDM1XSwgNjY6IFsyLCAzNV0sIDY5OiBbMiwgMzVdLCA3NDogWzIsIDM1XSwgNzU6IFsyLCAzNV0sIDc2OiBbMiwgMzVdLCA3NzogWzIsIDM1XSwgNzg6IFsyLCAzNV0sIDc5OiBbMiwgMzVdIH0sIHsgMjE6IFsyLCAzNl0sIDMxOiBbMiwgMzZdLCA1MjogWzIsIDM2XSwgNTk6IFsyLCAzNl0sIDYyOiBbMiwgMzZdLCA2NjogWzIsIDM2XSwgNjk6IFsyLCAzNl0sIDc0OiBbMiwgMzZdLCA3NTogWzIsIDM2XSwgNzY6IFsyLCAzNl0sIDc3OiBbMiwgMzZdLCA3ODogWzIsIDM2XSwgNzk6IFsyLCAzNl0gfSwgeyAyMTogWzIsIDQwXSwgMzE6IFsyLCA0MF0sIDUyOiBbMiwgNDBdLCA1OTogWzIsIDQwXSwgNjI6IFsyLCA0MF0sIDY2OiBbMiwgNDBdLCA2OTogWzIsIDQwXSwgNzQ6IFsyLCA0MF0sIDc1OiBbMiwgNDBdLCA3NjogWzIsIDQwXSwgNzc6IFsyLCA0MF0sIDc4OiBbMiwgNDBdLCA3OTogWzIsIDQwXSwgODE6IFsxLCA0NV0gfSwgeyA2NjogWzEsIDMyXSwgODA6IDQ2IH0sIHsgMjE6IFsyLCA0Ml0sIDMxOiBbMiwgNDJdLCA1MjogWzIsIDQyXSwgNTk6IFsyLCA0Ml0sIDYyOiBbMiwgNDJdLCA2NjogWzIsIDQyXSwgNjk6IFsyLCA0Ml0sIDc0OiBbMiwgNDJdLCA3NTogWzIsIDQyXSwgNzY6IFsyLCA0Ml0sIDc3OiBbMiwgNDJdLCA3ODogWzIsIDQyXSwgNzk6IFsyLCA0Ml0sIDgxOiBbMiwgNDJdIH0sIHsgNTA6IDQ3LCA1MjogWzIsIDc3XSwgNTk6IFsyLCA3N10sIDY2OiBbMiwgNzddLCA3NDogWzIsIDc3XSwgNzU6IFsyLCA3N10sIDc2OiBbMiwgNzddLCA3NzogWzIsIDc3XSwgNzg6IFsyLCA3N10sIDc5OiBbMiwgNzddIH0sIHsgMjM6IDQ4LCAzNjogNTAsIDM3OiBbMSwgNTJdLCA0MTogNTEsIDQyOiBbMSwgNTNdLCA0MzogNDksIDQ1OiBbMiwgNDldIH0sIHsgMjY6IDU0LCA0MTogNTUsIDQyOiBbMSwgNTNdLCA0NTogWzIsIDUxXSB9LCB7IDE2OiBbMSwgNTZdIH0sIHsgMzE6IFsyLCA4MV0sIDU1OiA1NywgNTk6IFsyLCA4MV0sIDY2OiBbMiwgODFdLCA3NDogWzIsIDgxXSwgNzU6IFsyLCA4MV0sIDc2OiBbMiwgODFdLCA3NzogWzIsIDgxXSwgNzg6IFsyLCA4MV0sIDc5OiBbMiwgODFdIH0sIHsgMzE6IFsyLCAzN10sIDU5OiBbMiwgMzddLCA2NjogWzIsIDM3XSwgNzQ6IFsyLCAzN10sIDc1OiBbMiwgMzddLCA3NjogWzIsIDM3XSwgNzc6IFsyLCAzN10sIDc4OiBbMiwgMzddLCA3OTogWzIsIDM3XSB9LCB7IDMxOiBbMiwgMzhdLCA1OTogWzIsIDM4XSwgNjY6IFsyLCAzOF0sIDc0OiBbMiwgMzhdLCA3NTogWzIsIDM4XSwgNzY6IFsyLCAzOF0sIDc3OiBbMiwgMzhdLCA3ODogWzIsIDM4XSwgNzk6IFsyLCAzOF0gfSwgeyAxODogNTgsIDY2OiBbMSwgMzJdLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgMjg6IDU5LCAzMTogWzIsIDUzXSwgNTk6IFsyLCA1M10sIDY2OiBbMiwgNTNdLCA2OTogWzIsIDUzXSwgNzQ6IFsyLCA1M10sIDc1OiBbMiwgNTNdLCA3NjogWzIsIDUzXSwgNzc6IFsyLCA1M10sIDc4OiBbMiwgNTNdLCA3OTogWzIsIDUzXSB9LCB7IDMxOiBbMiwgNTldLCAzMzogNjAsIDU5OiBbMiwgNTldLCA2NjogWzIsIDU5XSwgNjk6IFsyLCA1OV0sIDc0OiBbMiwgNTldLCA3NTogWzIsIDU5XSwgNzY6IFsyLCA1OV0sIDc3OiBbMiwgNTldLCA3ODogWzIsIDU5XSwgNzk6IFsyLCA1OV0gfSwgeyAxOTogNjEsIDIxOiBbMiwgNDVdLCA1OTogWzIsIDQ1XSwgNjY6IFsyLCA0NV0sIDc0OiBbMiwgNDVdLCA3NTogWzIsIDQ1XSwgNzY6IFsyLCA0NV0sIDc3OiBbMiwgNDVdLCA3ODogWzIsIDQ1XSwgNzk6IFsyLCA0NV0gfSwgeyAxODogNjUsIDMxOiBbMiwgNzVdLCA0ODogNjIsIDU3OiA2MywgNTg6IDY2LCA1OTogWzEsIDQwXSwgNjM6IDY0LCA2NDogNjcsIDY1OiA2OCwgNjY6IFsxLCA2OV0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyA2NjogWzEsIDcwXSB9LCB7IDIxOiBbMiwgMzldLCAzMTogWzIsIDM5XSwgNTI6IFsyLCAzOV0sIDU5OiBbMiwgMzldLCA2MjogWzIsIDM5XSwgNjY6IFsyLCAzOV0sIDY5OiBbMiwgMzldLCA3NDogWzIsIDM5XSwgNzU6IFsyLCAzOV0sIDc2OiBbMiwgMzldLCA3NzogWzIsIDM5XSwgNzg6IFsyLCAzOV0sIDc5OiBbMiwgMzldLCA4MTogWzEsIDQ1XSB9LCB7IDE4OiA2NSwgNTE6IDcxLCA1MjogWzIsIDc5XSwgNTc6IDcyLCA1ODogNjYsIDU5OiBbMSwgNDBdLCA2MzogNzMsIDY0OiA2NywgNjU6IDY4LCA2NjogWzEsIDY5XSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDI0OiA3NCwgNDU6IFsxLCA3NV0gfSwgeyA0NTogWzIsIDUwXSB9LCB7IDQ6IDc2LCA2OiAzLCAxMzogWzIsIDQzXSwgMTQ6IFsyLCA0M10sIDE3OiBbMiwgNDNdLCAyNzogWzIsIDQzXSwgMzI6IFsyLCA0M10sIDM3OiBbMiwgNDNdLCA0MjogWzIsIDQzXSwgNDU6IFsyLCA0M10sIDQ2OiBbMiwgNDNdLCA0OTogWzIsIDQzXSwgNTM6IFsyLCA0M10gfSwgeyA0NTogWzIsIDE5XSB9LCB7IDE4OiA3NywgNjY6IFsxLCAzMl0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyA0OiA3OCwgNjogMywgMTM6IFsyLCA0M10sIDE0OiBbMiwgNDNdLCAxNzogWzIsIDQzXSwgMjc6IFsyLCA0M10sIDMyOiBbMiwgNDNdLCA0NTogWzIsIDQzXSwgNDY6IFsyLCA0M10sIDQ5OiBbMiwgNDNdLCA1MzogWzIsIDQzXSB9LCB7IDI0OiA3OSwgNDU6IFsxLCA3NV0gfSwgeyA0NTogWzIsIDUyXSB9LCB7IDU6IFsyLCAxMF0sIDEzOiBbMiwgMTBdLCAxNDogWzIsIDEwXSwgMTc6IFsyLCAxMF0sIDI3OiBbMiwgMTBdLCAzMjogWzIsIDEwXSwgMzc6IFsyLCAxMF0sIDQyOiBbMiwgMTBdLCA0NTogWzIsIDEwXSwgNDY6IFsyLCAxMF0sIDQ5OiBbMiwgMTBdLCA1MzogWzIsIDEwXSB9LCB7IDE4OiA2NSwgMzE6IFsyLCA4M10sIDU2OiA4MCwgNTc6IDgxLCA1ODogNjYsIDU5OiBbMSwgNDBdLCA2MzogODIsIDY0OiA2NywgNjU6IDY4LCA2NjogWzEsIDY5XSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDU5OiBbMiwgODVdLCA2MDogODMsIDYyOiBbMiwgODVdLCA2NjogWzIsIDg1XSwgNzQ6IFsyLCA4NV0sIDc1OiBbMiwgODVdLCA3NjogWzIsIDg1XSwgNzc6IFsyLCA4NV0sIDc4OiBbMiwgODVdLCA3OTogWzIsIDg1XSB9LCB7IDE4OiA2NSwgMjk6IDg0LCAzMTogWzIsIDU1XSwgNTc6IDg1LCA1ODogNjYsIDU5OiBbMSwgNDBdLCA2MzogODYsIDY0OiA2NywgNjU6IDY4LCA2NjogWzEsIDY5XSwgNjk6IFsyLCA1NV0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyAxODogNjUsIDMxOiBbMiwgNjFdLCAzNDogODcsIDU3OiA4OCwgNTg6IDY2LCA1OTogWzEsIDQwXSwgNjM6IDg5LCA2NDogNjcsIDY1OiA2OCwgNjY6IFsxLCA2OV0sIDY5OiBbMiwgNjFdLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgMTg6IDY1LCAyMDogOTAsIDIxOiBbMiwgNDddLCA1NzogOTEsIDU4OiA2NiwgNTk6IFsxLCA0MF0sIDYzOiA5MiwgNjQ6IDY3LCA2NTogNjgsIDY2OiBbMSwgNjldLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgMzE6IFsxLCA5M10gfSwgeyAzMTogWzIsIDc0XSwgNTk6IFsyLCA3NF0sIDY2OiBbMiwgNzRdLCA3NDogWzIsIDc0XSwgNzU6IFsyLCA3NF0sIDc2OiBbMiwgNzRdLCA3NzogWzIsIDc0XSwgNzg6IFsyLCA3NF0sIDc5OiBbMiwgNzRdIH0sIHsgMzE6IFsyLCA3Nl0gfSwgeyAyMTogWzIsIDI0XSwgMzE6IFsyLCAyNF0sIDUyOiBbMiwgMjRdLCA1OTogWzIsIDI0XSwgNjI6IFsyLCAyNF0sIDY2OiBbMiwgMjRdLCA2OTogWzIsIDI0XSwgNzQ6IFsyLCAyNF0sIDc1OiBbMiwgMjRdLCA3NjogWzIsIDI0XSwgNzc6IFsyLCAyNF0sIDc4OiBbMiwgMjRdLCA3OTogWzIsIDI0XSB9LCB7IDIxOiBbMiwgMjVdLCAzMTogWzIsIDI1XSwgNTI6IFsyLCAyNV0sIDU5OiBbMiwgMjVdLCA2MjogWzIsIDI1XSwgNjY6IFsyLCAyNV0sIDY5OiBbMiwgMjVdLCA3NDogWzIsIDI1XSwgNzU6IFsyLCAyNV0sIDc2OiBbMiwgMjVdLCA3NzogWzIsIDI1XSwgNzg6IFsyLCAyNV0sIDc5OiBbMiwgMjVdIH0sIHsgMjE6IFsyLCAyN10sIDMxOiBbMiwgMjddLCA1MjogWzIsIDI3XSwgNjI6IFsyLCAyN10sIDY1OiA5NCwgNjY6IFsxLCA5NV0sIDY5OiBbMiwgMjddIH0sIHsgMjE6IFsyLCA4OV0sIDMxOiBbMiwgODldLCA1MjogWzIsIDg5XSwgNjI6IFsyLCA4OV0sIDY2OiBbMiwgODldLCA2OTogWzIsIDg5XSB9LCB7IDIxOiBbMiwgNDJdLCAzMTogWzIsIDQyXSwgNTI6IFsyLCA0Ml0sIDU5OiBbMiwgNDJdLCA2MjogWzIsIDQyXSwgNjY6IFsyLCA0Ml0sIDY3OiBbMSwgOTZdLCA2OTogWzIsIDQyXSwgNzQ6IFsyLCA0Ml0sIDc1OiBbMiwgNDJdLCA3NjogWzIsIDQyXSwgNzc6IFsyLCA0Ml0sIDc4OiBbMiwgNDJdLCA3OTogWzIsIDQyXSwgODE6IFsyLCA0Ml0gfSwgeyAyMTogWzIsIDQxXSwgMzE6IFsyLCA0MV0sIDUyOiBbMiwgNDFdLCA1OTogWzIsIDQxXSwgNjI6IFsyLCA0MV0sIDY2OiBbMiwgNDFdLCA2OTogWzIsIDQxXSwgNzQ6IFsyLCA0MV0sIDc1OiBbMiwgNDFdLCA3NjogWzIsIDQxXSwgNzc6IFsyLCA0MV0sIDc4OiBbMiwgNDFdLCA3OTogWzIsIDQxXSwgODE6IFsyLCA0MV0gfSwgeyA1MjogWzEsIDk3XSB9LCB7IDUyOiBbMiwgNzhdLCA1OTogWzIsIDc4XSwgNjY6IFsyLCA3OF0sIDc0OiBbMiwgNzhdLCA3NTogWzIsIDc4XSwgNzY6IFsyLCA3OF0sIDc3OiBbMiwgNzhdLCA3ODogWzIsIDc4XSwgNzk6IFsyLCA3OF0gfSwgeyA1MjogWzIsIDgwXSB9LCB7IDU6IFsyLCAxMl0sIDEzOiBbMiwgMTJdLCAxNDogWzIsIDEyXSwgMTc6IFsyLCAxMl0sIDI3OiBbMiwgMTJdLCAzMjogWzIsIDEyXSwgMzc6IFsyLCAxMl0sIDQyOiBbMiwgMTJdLCA0NTogWzIsIDEyXSwgNDY6IFsyLCAxMl0sIDQ5OiBbMiwgMTJdLCA1MzogWzIsIDEyXSB9LCB7IDE4OiA5OCwgNjY6IFsxLCAzMl0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyAzNjogNTAsIDM3OiBbMSwgNTJdLCA0MTogNTEsIDQyOiBbMSwgNTNdLCA0MzogMTAwLCA0NDogOTksIDQ1OiBbMiwgNzFdIH0sIHsgMzE6IFsyLCA2NV0sIDM4OiAxMDEsIDU5OiBbMiwgNjVdLCA2NjogWzIsIDY1XSwgNjk6IFsyLCA2NV0sIDc0OiBbMiwgNjVdLCA3NTogWzIsIDY1XSwgNzY6IFsyLCA2NV0sIDc3OiBbMiwgNjVdLCA3ODogWzIsIDY1XSwgNzk6IFsyLCA2NV0gfSwgeyA0NTogWzIsIDE3XSB9LCB7IDU6IFsyLCAxM10sIDEzOiBbMiwgMTNdLCAxNDogWzIsIDEzXSwgMTc6IFsyLCAxM10sIDI3OiBbMiwgMTNdLCAzMjogWzIsIDEzXSwgMzc6IFsyLCAxM10sIDQyOiBbMiwgMTNdLCA0NTogWzIsIDEzXSwgNDY6IFsyLCAxM10sIDQ5OiBbMiwgMTNdLCA1MzogWzIsIDEzXSB9LCB7IDMxOiBbMSwgMTAyXSB9LCB7IDMxOiBbMiwgODJdLCA1OTogWzIsIDgyXSwgNjY6IFsyLCA4Ml0sIDc0OiBbMiwgODJdLCA3NTogWzIsIDgyXSwgNzY6IFsyLCA4Ml0sIDc3OiBbMiwgODJdLCA3ODogWzIsIDgyXSwgNzk6IFsyLCA4Ml0gfSwgeyAzMTogWzIsIDg0XSB9LCB7IDE4OiA2NSwgNTc6IDEwNCwgNTg6IDY2LCA1OTogWzEsIDQwXSwgNjE6IDEwMywgNjI6IFsyLCA4N10sIDYzOiAxMDUsIDY0OiA2NywgNjU6IDY4LCA2NjogWzEsIDY5XSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDMwOiAxMDYsIDMxOiBbMiwgNTddLCA2ODogMTA3LCA2OTogWzEsIDEwOF0gfSwgeyAzMTogWzIsIDU0XSwgNTk6IFsyLCA1NF0sIDY2OiBbMiwgNTRdLCA2OTogWzIsIDU0XSwgNzQ6IFsyLCA1NF0sIDc1OiBbMiwgNTRdLCA3NjogWzIsIDU0XSwgNzc6IFsyLCA1NF0sIDc4OiBbMiwgNTRdLCA3OTogWzIsIDU0XSB9LCB7IDMxOiBbMiwgNTZdLCA2OTogWzIsIDU2XSB9LCB7IDMxOiBbMiwgNjNdLCAzNTogMTA5LCA2ODogMTEwLCA2OTogWzEsIDEwOF0gfSwgeyAzMTogWzIsIDYwXSwgNTk6IFsyLCA2MF0sIDY2OiBbMiwgNjBdLCA2OTogWzIsIDYwXSwgNzQ6IFsyLCA2MF0sIDc1OiBbMiwgNjBdLCA3NjogWzIsIDYwXSwgNzc6IFsyLCA2MF0sIDc4OiBbMiwgNjBdLCA3OTogWzIsIDYwXSB9LCB7IDMxOiBbMiwgNjJdLCA2OTogWzIsIDYyXSB9LCB7IDIxOiBbMSwgMTExXSB9LCB7IDIxOiBbMiwgNDZdLCA1OTogWzIsIDQ2XSwgNjY6IFsyLCA0Nl0sIDc0OiBbMiwgNDZdLCA3NTogWzIsIDQ2XSwgNzY6IFsyLCA0Nl0sIDc3OiBbMiwgNDZdLCA3ODogWzIsIDQ2XSwgNzk6IFsyLCA0Nl0gfSwgeyAyMTogWzIsIDQ4XSB9LCB7IDU6IFsyLCAyMV0sIDEzOiBbMiwgMjFdLCAxNDogWzIsIDIxXSwgMTc6IFsyLCAyMV0sIDI3OiBbMiwgMjFdLCAzMjogWzIsIDIxXSwgMzc6IFsyLCAyMV0sIDQyOiBbMiwgMjFdLCA0NTogWzIsIDIxXSwgNDY6IFsyLCAyMV0sIDQ5OiBbMiwgMjFdLCA1MzogWzIsIDIxXSB9LCB7IDIxOiBbMiwgOTBdLCAzMTogWzIsIDkwXSwgNTI6IFsyLCA5MF0sIDYyOiBbMiwgOTBdLCA2NjogWzIsIDkwXSwgNjk6IFsyLCA5MF0gfSwgeyA2NzogWzEsIDk2XSB9LCB7IDE4OiA2NSwgNTc6IDExMiwgNTg6IDY2LCA1OTogWzEsIDQwXSwgNjY6IFsxLCAzMl0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyA1OiBbMiwgMjJdLCAxMzogWzIsIDIyXSwgMTQ6IFsyLCAyMl0sIDE3OiBbMiwgMjJdLCAyNzogWzIsIDIyXSwgMzI6IFsyLCAyMl0sIDM3OiBbMiwgMjJdLCA0MjogWzIsIDIyXSwgNDU6IFsyLCAyMl0sIDQ2OiBbMiwgMjJdLCA0OTogWzIsIDIyXSwgNTM6IFsyLCAyMl0gfSwgeyAzMTogWzEsIDExM10gfSwgeyA0NTogWzIsIDE4XSB9LCB7IDQ1OiBbMiwgNzJdIH0sIHsgMTg6IDY1LCAzMTogWzIsIDY3XSwgMzk6IDExNCwgNTc6IDExNSwgNTg6IDY2LCA1OTogWzEsIDQwXSwgNjM6IDExNiwgNjQ6IDY3LCA2NTogNjgsIDY2OiBbMSwgNjldLCA2OTogWzIsIDY3XSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDU6IFsyLCAyM10sIDEzOiBbMiwgMjNdLCAxNDogWzIsIDIzXSwgMTc6IFsyLCAyM10sIDI3OiBbMiwgMjNdLCAzMjogWzIsIDIzXSwgMzc6IFsyLCAyM10sIDQyOiBbMiwgMjNdLCA0NTogWzIsIDIzXSwgNDY6IFsyLCAyM10sIDQ5OiBbMiwgMjNdLCA1MzogWzIsIDIzXSB9LCB7IDYyOiBbMSwgMTE3XSB9LCB7IDU5OiBbMiwgODZdLCA2MjogWzIsIDg2XSwgNjY6IFsyLCA4Nl0sIDc0OiBbMiwgODZdLCA3NTogWzIsIDg2XSwgNzY6IFsyLCA4Nl0sIDc3OiBbMiwgODZdLCA3ODogWzIsIDg2XSwgNzk6IFsyLCA4Nl0gfSwgeyA2MjogWzIsIDg4XSB9LCB7IDMxOiBbMSwgMTE4XSB9LCB7IDMxOiBbMiwgNThdIH0sIHsgNjY6IFsxLCAxMjBdLCA3MDogMTE5IH0sIHsgMzE6IFsxLCAxMjFdIH0sIHsgMzE6IFsyLCA2NF0gfSwgeyAxNDogWzIsIDExXSB9LCB7IDIxOiBbMiwgMjhdLCAzMTogWzIsIDI4XSwgNTI6IFsyLCAyOF0sIDYyOiBbMiwgMjhdLCA2NjogWzIsIDI4XSwgNjk6IFsyLCAyOF0gfSwgeyA1OiBbMiwgMjBdLCAxMzogWzIsIDIwXSwgMTQ6IFsyLCAyMF0sIDE3OiBbMiwgMjBdLCAyNzogWzIsIDIwXSwgMzI6IFsyLCAyMF0sIDM3OiBbMiwgMjBdLCA0MjogWzIsIDIwXSwgNDU6IFsyLCAyMF0sIDQ2OiBbMiwgMjBdLCA0OTogWzIsIDIwXSwgNTM6IFsyLCAyMF0gfSwgeyAzMTogWzIsIDY5XSwgNDA6IDEyMiwgNjg6IDEyMywgNjk6IFsxLCAxMDhdIH0sIHsgMzE6IFsyLCA2Nl0sIDU5OiBbMiwgNjZdLCA2NjogWzIsIDY2XSwgNjk6IFsyLCA2Nl0sIDc0OiBbMiwgNjZdLCA3NTogWzIsIDY2XSwgNzY6IFsyLCA2Nl0sIDc3OiBbMiwgNjZdLCA3ODogWzIsIDY2XSwgNzk6IFsyLCA2Nl0gfSwgeyAzMTogWzIsIDY4XSwgNjk6IFsyLCA2OF0gfSwgeyAyMTogWzIsIDI2XSwgMzE6IFsyLCAyNl0sIDUyOiBbMiwgMjZdLCA1OTogWzIsIDI2XSwgNjI6IFsyLCAyNl0sIDY2OiBbMiwgMjZdLCA2OTogWzIsIDI2XSwgNzQ6IFsyLCAyNl0sIDc1OiBbMiwgMjZdLCA3NjogWzIsIDI2XSwgNzc6IFsyLCAyNl0sIDc4OiBbMiwgMjZdLCA3OTogWzIsIDI2XSB9LCB7IDEzOiBbMiwgMTRdLCAxNDogWzIsIDE0XSwgMTc6IFsyLCAxNF0sIDI3OiBbMiwgMTRdLCAzMjogWzIsIDE0XSwgMzc6IFsyLCAxNF0sIDQyOiBbMiwgMTRdLCA0NTogWzIsIDE0XSwgNDY6IFsyLCAxNF0sIDQ5OiBbMiwgMTRdLCA1MzogWzIsIDE0XSB9LCB7IDY2OiBbMSwgMTI1XSwgNzE6IFsxLCAxMjRdIH0sIHsgNjY6IFsyLCA5MV0sIDcxOiBbMiwgOTFdIH0sIHsgMTM6IFsyLCAxNV0sIDE0OiBbMiwgMTVdLCAxNzogWzIsIDE1XSwgMjc6IFsyLCAxNV0sIDMyOiBbMiwgMTVdLCA0MjogWzIsIDE1XSwgNDU6IFsyLCAxNV0sIDQ2OiBbMiwgMTVdLCA0OTogWzIsIDE1XSwgNTM6IFsyLCAxNV0gfSwgeyAzMTogWzEsIDEyNl0gfSwgeyAzMTogWzIsIDcwXSB9LCB7IDMxOiBbMiwgMjldIH0sIHsgNjY6IFsyLCA5Ml0sIDcxOiBbMiwgOTJdIH0sIHsgMTM6IFsyLCAxNl0sIDE0OiBbMiwgMTZdLCAxNzogWzIsIDE2XSwgMjc6IFsyLCAxNl0sIDMyOiBbMiwgMTZdLCAzNzogWzIsIDE2XSwgNDI6IFsyLCAxNl0sIDQ1OiBbMiwgMTZdLCA0NjogWzIsIDE2XSwgNDk6IFsyLCAxNl0sIDUzOiBbMiwgMTZdIH1dLFxuICAgICAgICBkZWZhdWx0QWN0aW9uczogeyA0OiBbMiwgMV0sIDQ5OiBbMiwgNTBdLCA1MTogWzIsIDE5XSwgNTU6IFsyLCA1Ml0sIDY0OiBbMiwgNzZdLCA3MzogWzIsIDgwXSwgNzg6IFsyLCAxN10sIDgyOiBbMiwgODRdLCA5MjogWzIsIDQ4XSwgOTk6IFsyLCAxOF0sIDEwMDogWzIsIDcyXSwgMTA1OiBbMiwgODhdLCAxMDc6IFsyLCA1OF0sIDExMDogWzIsIDY0XSwgMTExOiBbMiwgMTFdLCAxMjM6IFsyLCA3MF0sIDEyNDogWzIsIDI5XSB9LFxuICAgICAgICBwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7XG4gICAgICAgIH0sXG4gICAgICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShpbnB1dCkge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAgICAgICAgIHN0YWNrID0gWzBdLFxuICAgICAgICAgICAgICAgIHZzdGFjayA9IFtudWxsXSxcbiAgICAgICAgICAgICAgICBsc3RhY2sgPSBbXSxcbiAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgICAgeXl0ZXh0ID0gXCJcIixcbiAgICAgICAgICAgICAgICB5eWxpbmVubyA9IDAsXG4gICAgICAgICAgICAgICAgeXlsZW5nID0gMCxcbiAgICAgICAgICAgICAgICByZWNvdmVyaW5nID0gMCxcbiAgICAgICAgICAgICAgICBURVJST1IgPSAyLFxuICAgICAgICAgICAgICAgIEVPRiA9IDE7XG4gICAgICAgICAgICB0aGlzLmxleGVyLnNldElucHV0KGlucHV0KTtcbiAgICAgICAgICAgIHRoaXMubGV4ZXIueXkgPSB0aGlzLnl5O1xuICAgICAgICAgICAgdGhpcy55eS5sZXhlciA9IHRoaXMubGV4ZXI7XG4gICAgICAgICAgICB0aGlzLnl5LnBhcnNlciA9IHRoaXM7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMubGV4ZXIueXlsbG9jID09IFwidW5kZWZpbmVkXCIpIHRoaXMubGV4ZXIueXlsbG9jID0ge307XG4gICAgICAgICAgICB2YXIgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYztcbiAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5bG9jKTtcbiAgICAgICAgICAgIHZhciByYW5nZXMgPSB0aGlzLmxleGVyLm9wdGlvbnMgJiYgdGhpcy5sZXhlci5vcHRpb25zLnJhbmdlcztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy55eS5wYXJzZUVycm9yID09PSBcImZ1bmN0aW9uXCIpIHRoaXMucGFyc2VFcnJvciA9IHRoaXMueXkucGFyc2VFcnJvcjtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHBvcFN0YWNrKG4pIHtcbiAgICAgICAgICAgICAgICBzdGFjay5sZW5ndGggPSBzdGFjay5sZW5ndGggLSAyICogbjtcbiAgICAgICAgICAgICAgICB2c3RhY2subGVuZ3RoID0gdnN0YWNrLmxlbmd0aCAtIG47XG4gICAgICAgICAgICAgICAgbHN0YWNrLmxlbmd0aCA9IGxzdGFjay5sZW5ndGggLSBuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gbGV4KCkge1xuICAgICAgICAgICAgICAgIHZhciB0b2tlbjtcbiAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYubGV4ZXIubGV4KCkgfHwgMTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRva2VuICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuID0gc2VsZi5zeW1ib2xzX1t0b2tlbl0gfHwgdG9rZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzeW1ib2wsXG4gICAgICAgICAgICAgICAgcHJlRXJyb3JTeW1ib2wsXG4gICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgIGEsXG4gICAgICAgICAgICAgICAgcixcbiAgICAgICAgICAgICAgICB5eXZhbCA9IHt9LFxuICAgICAgICAgICAgICAgIHAsXG4gICAgICAgICAgICAgICAgbGVuLFxuICAgICAgICAgICAgICAgIG5ld1N0YXRlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRBY3Rpb25zW3N0YXRlXSkge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSB0aGlzLmRlZmF1bHRBY3Rpb25zW3N0YXRlXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3ltYm9sID09PSBudWxsIHx8IHR5cGVvZiBzeW1ib2wgPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbGV4KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhYWN0aW9uLmxlbmd0aCB8fCAhYWN0aW9uWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlcnJTdHIgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlY292ZXJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHAgaW4gdGFibGVbc3RhdGVdKSBpZiAodGhpcy50ZXJtaW5hbHNfW3BdICYmIHAgPiAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaChcIidcIiArIHRoaXMudGVybWluYWxzX1twXSArIFwiJ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxleGVyLnNob3dQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyclN0ciA9IFwiUGFyc2UgZXJyb3Igb24gbGluZSBcIiArICh5eWxpbmVubyArIDEpICsgXCI6XFxuXCIgKyB0aGlzLmxleGVyLnNob3dQb3NpdGlvbigpICsgXCJcXG5FeHBlY3RpbmcgXCIgKyBleHBlY3RlZC5qb2luKFwiLCBcIikgKyBcIiwgZ290ICdcIiArICh0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wpICsgXCInXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyclN0ciA9IFwiUGFyc2UgZXJyb3Igb24gbGluZSBcIiArICh5eWxpbmVubyArIDEpICsgXCI6IFVuZXhwZWN0ZWQgXCIgKyAoc3ltYm9sID09IDEgPyBcImVuZCBvZiBpbnB1dFwiIDogXCInXCIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArIFwiJ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VFcnJvcihlcnJTdHIsIHsgdGV4dDogdGhpcy5sZXhlci5tYXRjaCwgdG9rZW46IHRoaXMudGVybWluYWxzX1tzeW1ib2xdIHx8IHN5bWJvbCwgbGluZTogdGhpcy5sZXhlci55eWxpbmVubywgbG9jOiB5eWxvYywgZXhwZWN0ZWQ6IGV4cGVjdGVkIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb25bMF0gaW5zdGFuY2VvZiBBcnJheSAmJiBhY3Rpb24ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogXCIgKyBzdGF0ZSArIFwiLCB0b2tlbjogXCIgKyBzeW1ib2wpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh0aGlzLmxleGVyLnl5bGxvYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkgcmVjb3ZlcmluZy0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBwcmVFcnJvclN5bWJvbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07XG4gICAgICAgICAgICAgICAgICAgICAgICB5eXZhbC5fJCA9IHsgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbiB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBsc3RhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5zbGljZSgwLCAtMSAqIGxlbiAqIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzdGFjayA9IHZzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHN0YWNrID0gbHN0YWNrLnNsaWNlKDAsIC0xICogbGVuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVswXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2c3RhY2sucHVzaCh5eXZhbC4kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5dmFsLl8kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gdGFibGVbc3RhY2tbc3RhY2subGVuZ3RoIC0gMl1dW3N0YWNrW3N0YWNrLmxlbmd0aCAtIDFdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2gobmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiBKaXNvbiBnZW5lcmF0ZWQgbGV4ZXIgKi9cbiAgICB2YXIgbGV4ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGV4ZXIgPSB7IEVPRjogMSxcbiAgICAgICAgICAgIHBhcnNlRXJyb3I6IGZ1bmN0aW9uIHBhcnNlRXJyb3Ioc3RyLCBoYXNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMueXkucGFyc2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueXkucGFyc2VyLnBhcnNlRXJyb3Ioc3RyLCBoYXNoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3RyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0SW5wdXQ6IGZ1bmN0aW9uIHNldElucHV0KGlucHV0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3JlID0gdGhpcy5fbGVzcyA9IHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMueXlsaW5lbm8gPSB0aGlzLnl5bGVuZyA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoID0gXCJcIjtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvblN0YWNrID0gW1wiSU5JVElBTFwiXTtcbiAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogMSwgZmlyc3RfY29sdW1uOiAwLCBsYXN0X2xpbmU6IDEsIGxhc3RfY29sdW1uOiAwIH07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsIDBdO1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24gaW5wdXQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07XG4gICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7XG4gICAgICAgICAgICAgICAgdGhpcy55eWxlbmcrKztcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrO1xuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoO1xuICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcXHJcXG4/fFxcbikuKi9nKTtcbiAgICAgICAgICAgICAgICBpZiAobGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKztcblxuICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gdGhpcy5faW5wdXQuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVucHV0OiBmdW5jdGlvbiB1bnB1dChjaCkge1xuICAgICAgICAgICAgICAgIHZhciBsZW4gPSBjaC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gY2guc3BsaXQoLyg/Olxcclxcbj98XFxuKS9nKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gY2ggKyB0aGlzLl9pbnB1dDtcbiAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9IHRoaXMueXl0ZXh0LnN1YnN0cigwLCB0aGlzLnl5dGV4dC5sZW5ndGggLSBsZW4gLSAxKTtcbiAgICAgICAgICAgICAgICAvL3RoaXMueXlsZW5nIC09IGxlbjtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCAtPSBsZW47XG4gICAgICAgICAgICAgICAgdmFyIG9sZExpbmVzID0gdGhpcy5tYXRjaC5zcGxpdCgvKD86XFxyXFxuP3xcXG4pL2cpO1xuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggPSB0aGlzLm1hdGNoLnN1YnN0cigwLCB0aGlzLm1hdGNoLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCA9IHRoaXMubWF0Y2hlZC5zdWJzdHIoMCwgdGhpcy5tYXRjaGVkLmxlbmd0aCAtIDEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAtIDEpIHRoaXMueXlsaW5lbm8gLT0gbGluZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMueXlsbG9jLnJhbmdlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy55eWxsb2MgPSB7IGZpcnN0X2xpbmU6IHRoaXMueXlsbG9jLmZpcnN0X2xpbmUsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RfbGluZTogdGhpcy55eWxpbmVubyArIDEsXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyAobGluZXMubGVuZ3RoID09PSBvbGRMaW5lcy5sZW5ndGggPyB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gOiAwKSArIG9sZExpbmVzW29sZExpbmVzLmxlbmd0aCAtIGxpbmVzLmxlbmd0aF0ubGVuZ3RoIC0gbGluZXNbMF0ubGVuZ3RoIDogdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uIC0gbGVuXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3JbMF0sIHJbMF0gKyB0aGlzLnl5bGVuZyAtIGxlbl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vcmU6IGZ1bmN0aW9uIG1vcmUoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVzczogZnVuY3Rpb24gbGVzcyhuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bnB1dCh0aGlzLm1hdGNoLnNsaWNlKG4pKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXN0SW5wdXQ6IGZ1bmN0aW9uIHBhc3RJbnB1dCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFzdCA9IHRoaXMubWF0Y2hlZC5zdWJzdHIoMCwgdGhpcy5tYXRjaGVkLmxlbmd0aCAtIHRoaXMubWF0Y2gubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHBhc3QubGVuZ3RoID4gMjAgPyBcIi4uLlwiIDogXCJcIikgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xcbi9nLCBcIlwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGNvbWluZ0lucHV0OiBmdW5jdGlvbiB1cGNvbWluZ0lucHV0KCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5tYXRjaDtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPCAyMCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0LnN1YnN0cigwLCAyMCAtIG5leHQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLCAyMCkgKyAobmV4dC5sZW5ndGggPiAyMCA/IFwiLi4uXCIgOiBcIlwiKSkucmVwbGFjZSgvXFxuL2csIFwiXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNob3dQb3NpdGlvbjogZnVuY3Rpb24gc2hvd1Bvc2l0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBwcmUgPSB0aGlzLnBhc3RJbnB1dCgpO1xuICAgICAgICAgICAgICAgIHZhciBjID0gbmV3IEFycmF5KHByZS5sZW5ndGggKyAxKS5qb2luKFwiLVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyBcIlxcblwiICsgYyArIFwiXlwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICB2YXIgdG9rZW4sIG1hdGNoLCB0ZW1wTWF0Y2gsIGluZGV4LCBjb2wsIGxpbmVzO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9yZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggPSBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcnVsZXMgPSB0aGlzLl9jdXJyZW50UnVsZXMoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBNYXRjaCA9IHRoaXMuX2lucHV0Lm1hdGNoKHRoaXMucnVsZXNbcnVsZXNbaV1dKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBNYXRjaCAmJiAoIW1hdGNoIHx8IHRlbXBNYXRjaFswXS5sZW5ndGggPiBtYXRjaFswXS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHRlbXBNYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmZsZXgpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IG1hdGNoWzBdLm1hdGNoKC8oPzpcXHJcXG4/fFxcbikuKi9nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVzKSB0aGlzLnl5bGluZW5vICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxsb2MgPSB7IGZpcnN0X2xpbmU6IHRoaXMueXlsbG9jLmxhc3RfbGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfbGluZTogdGhpcy55eWxpbmVubyArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9jb2x1bW46IHRoaXMueXlsbG9jLmxhc3RfY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9jb2x1bW46IGxpbmVzID8gbGluZXNbbGluZXMubGVuZ3RoIC0gMV0ubGVuZ3RoIC0gbGluZXNbbGluZXMubGVuZ3RoIC0gMV0ubWF0Y2goL1xccj9cXG4/LylbMF0ubGVuZ3RoIDogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4gKyBtYXRjaFswXS5sZW5ndGggfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5wdXQgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlRXJyb3IoXCJMZXhpY2FsIGVycm9yIG9uIGxpbmUgXCIgKyAodGhpcy55eWxpbmVubyArIDEpICsgXCIuIFVucmVjb2duaXplZCB0ZXh0LlxcblwiICsgdGhpcy5zaG93UG9zaXRpb24oKSwgeyB0ZXh0OiBcIlwiLCB0b2tlbjogbnVsbCwgbGluZTogdGhpcy55eWxpbmVubyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGV4OiBmdW5jdGlvbiBsZXgoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGV4KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJlZ2luOiBmdW5jdGlvbiBiZWdpbihjb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvblN0YWNrLnB1c2goY29uZGl0aW9uKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb3BTdGF0ZTogZnVuY3Rpb24gcG9wU3RhdGUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2sucG9wKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2N1cnJlbnRSdWxlczogZnVuY3Rpb24gX2N1cnJlbnRSdWxlcygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25zW3RoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAxXV0ucnVsZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdG9wU3RhdGU6IGZ1bmN0aW9uIHRvcFN0YXRlKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvblN0YWNrW3RoaXMuY29uZGl0aW9uU3RhY2subGVuZ3RoIC0gMl07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHVzaFN0YXRlOiBmdW5jdGlvbiBiZWdpbihjb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKGNvbmRpdGlvbik7XG4gICAgICAgICAgICB9IH07XG4gICAgICAgIGxleGVyLm9wdGlvbnMgPSB7fTtcbiAgICAgICAgbGV4ZXIucGVyZm9ybUFjdGlvbiA9IGZ1bmN0aW9uIGFub255bW91cyh5eSwgeXlfLCAkYXZvaWRpbmdfbmFtZV9jb2xsaXNpb25zLCBZWV9TVEFSVCkge1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBzdHJpcChzdGFydCwgZW5kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cihzdGFydCwgeXlfLnl5bGVuZyAtIGVuZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBZWVNUQVRFID0gWVlfU1RBUlQ7XG4gICAgICAgICAgICBzd2l0Y2ggKCRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmICh5eV8ueXl0ZXh0LnNsaWNlKC0yKSA9PT0gXCJcXFxcXFxcXFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJpcCgwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oXCJtdVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gXCJcXFxcXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbihcImVtdVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oXCJtdVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoeXlfLnl5dGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0O1xuICAgICAgICAgICAgICAgICAgICB9YnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTQ7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5zdWJzdHIoNSwgeXlfLnl5bGVuZyAtIDkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxNjtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxMztcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA1OTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE3O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbihcInJhd1wiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIxO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA1MztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI3O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTtyZXR1cm4gNDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTtyZXR1cm4gNDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM3O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA0NjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bnB1dCh5eV8ueXl0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKFwiY29tXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEzO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA0NjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY3O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA2NjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDgxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgd2hpdGVzcGFjZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDUyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI4OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7cmV0dXJuIDMxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI5OlxuICAgICAgICAgICAgICAgICAgICB5eV8ueXl0ZXh0ID0gc3RyaXAoMSwgMikucmVwbGFjZSgvXFxcXFwiL2csIFwiXFxcIlwiKTtyZXR1cm4gNzQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgICAgICAgICAgIHl5Xy55eXRleHQgPSBzdHJpcCgxLCAyKS5yZXBsYWNlKC9cXFxcJy9nLCBcIidcIik7cmV0dXJuIDc0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA3NjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzMzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDc2O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA3ODtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDc1O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzg6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA3MTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY2O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIklOVkFMSURcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBsZXhlci5ydWxlcyA9IFsvXig/OlteXFx4MDBdKj8oPz0oXFx7XFx7KSkpLywgL14oPzpbXlxceDAwXSspLywgL14oPzpbXlxceDAwXXsyLH0/KD89KFxce1xce3xcXFxcXFx7XFx7fFxcXFxcXFxcXFx7XFx7fCQpKSkvLCAvXig/Olxce1xce1xce1xce1xcL1teXFxzIVwiIyUtLFxcLlxcLzstPkBcXFstXFxeYFxcey1+XSsoPz1bPX1cXHNcXC8uXSlcXH1cXH1cXH1cXH0pLywgL14oPzpbXlxceDAwXSo/KD89KFxce1xce1xce1xce1xcLykpKS8sIC9eKD86W1xcc1xcU10qPy0tKH4pP1xcfVxcfSkvLCAvXig/OlxcKCkvLCAvXig/OlxcKSkvLCAvXig/Olxce1xce1xce1xceykvLCAvXig/OlxcfVxcfVxcfVxcfSkvLCAvXig/Olxce1xceyh+KT8+KS8sIC9eKD86XFx7XFx7KH4pPyMpLywgL14oPzpcXHtcXHsofik/XFwvKS8sIC9eKD86XFx7XFx7KH4pP1xcXlxccyoofik/XFx9XFx9KS8sIC9eKD86XFx7XFx7KH4pP1xccyplbHNlXFxzKih+KT9cXH1cXH0pLywgL14oPzpcXHtcXHsofik/XFxeKS8sIC9eKD86XFx7XFx7KH4pP1xccyplbHNlXFxiKS8sIC9eKD86XFx7XFx7KH4pP1xceykvLCAvXig/Olxce1xceyh+KT8mKS8sIC9eKD86XFx7XFx7KH4pPyEtLSkvLCAvXig/Olxce1xceyh+KT8hW1xcc1xcU10qP1xcfVxcfSkvLCAvXig/Olxce1xceyh+KT8pLywgL14oPzo9KS8sIC9eKD86XFwuXFwuKS8sIC9eKD86XFwuKD89KFs9fn1cXHNcXC8uKXxdKSkpLywgL14oPzpbXFwvLl0pLywgL14oPzpcXHMrKS8sIC9eKD86XFx9KH4pP1xcfVxcfSkvLCAvXig/Oih+KT9cXH1cXH0pLywgL14oPzpcIihcXFxcW1wiXXxbXlwiXSkqXCIpLywgL14oPzonKFxcXFxbJ118W14nXSkqJykvLCAvXig/OkApLywgL14oPzp0cnVlKD89KFt+fVxccyldKSkpLywgL14oPzpmYWxzZSg/PShbfn1cXHMpXSkpKS8sIC9eKD86dW5kZWZpbmVkKD89KFt+fVxccyldKSkpLywgL14oPzpudWxsKD89KFt+fVxccyldKSkpLywgL14oPzotP1swLTldKyg/OlxcLlswLTldKyk/KD89KFt+fVxccyldKSkpLywgL14oPzphc1xccytcXHwpLywgL14oPzpcXHwpLywgL14oPzooW15cXHMhXCIjJS0sXFwuXFwvOy0+QFxcWy1cXF5gXFx7LX5dKyg/PShbPX59XFxzXFwvLil8XSkpKSkvLCAvXig/OlxcW1teXFxdXSpcXF0pLywgL14oPzouKS8sIC9eKD86JCkvXTtcbiAgICAgICAgbGV4ZXIuY29uZGl0aW9ucyA9IHsgbXU6IHsgcnVsZXM6IFs2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyXSwgaW5jbHVzaXZlOiBmYWxzZSB9LCBlbXU6IHsgcnVsZXM6IFsyXSwgaW5jbHVzaXZlOiBmYWxzZSB9LCBjb206IHsgcnVsZXM6IFs1XSwgaW5jbHVzaXZlOiBmYWxzZSB9LCByYXc6IHsgcnVsZXM6IFszLCA0XSwgaW5jbHVzaXZlOiBmYWxzZSB9LCBJTklUSUFMOiB7IHJ1bGVzOiBbMCwgMSwgNDJdLCBpbmNsdXNpdmU6IHRydWUgfSB9O1xuICAgICAgICByZXR1cm4gbGV4ZXI7XG4gICAgfSkoKTtcbiAgICBwYXJzZXIubGV4ZXIgPSBsZXhlcjtcbiAgICBmdW5jdGlvbiBQYXJzZXIoKSB7XG4gICAgICAgIHRoaXMueXkgPSB7fTtcbiAgICB9UGFyc2VyLnByb3RvdHlwZSA9IHBhcnNlcjtwYXJzZXIuUGFyc2VyID0gUGFyc2VyO1xuICAgIHJldHVybiBuZXcgUGFyc2VyKCk7XG59KSgpO2V4cG9ydHNbXCJkZWZhdWx0XCJdID0gaGFuZGxlYmFycztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH07XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLnByaW50ID0gcHJpbnQ7XG5leHBvcnRzLlByaW50VmlzaXRvciA9IFByaW50VmlzaXRvcjtcbi8qZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuXG52YXIgX1Zpc2l0b3IgPSByZXF1aXJlKCcuL3Zpc2l0b3InKTtcblxudmFyIF9WaXNpdG9yMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9WaXNpdG9yKTtcblxuZnVuY3Rpb24gcHJpbnQoYXN0KSB7XG4gIHJldHVybiBuZXcgUHJpbnRWaXNpdG9yKCkuYWNjZXB0KGFzdCk7XG59XG5cbmZ1bmN0aW9uIFByaW50VmlzaXRvcigpIHtcbiAgdGhpcy5wYWRkaW5nID0gMDtcbn1cblxuUHJpbnRWaXNpdG9yLnByb3RvdHlwZSA9IG5ldyBfVmlzaXRvcjJbJ2RlZmF1bHQnXSgpO1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLnBhZCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgdmFyIG91dCA9ICcnO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5wYWRkaW5nOyBpIDwgbDsgaSsrKSB7XG4gICAgb3V0ID0gb3V0ICsgJyAgJztcbiAgfVxuXG4gIG91dCA9IG91dCArIHN0cmluZyArICdcXG4nO1xuICByZXR1cm4gb3V0O1xufTtcblxuUHJpbnRWaXNpdG9yLnByb3RvdHlwZS5Qcm9ncmFtID0gZnVuY3Rpb24gKHByb2dyYW0pIHtcbiAgdmFyIG91dCA9ICcnLFxuICAgICAgYm9keSA9IHByb2dyYW0uYm9keSxcbiAgICAgIGkgPSB1bmRlZmluZWQsXG4gICAgICBsID0gdW5kZWZpbmVkO1xuXG4gIGlmIChwcm9ncmFtLmJsb2NrUGFyYW1zKSB7XG4gICAgdmFyIGJsb2NrUGFyYW1zID0gJ0JMT0NLIFBBUkFNUzogWyc7XG4gICAgZm9yIChpID0gMCwgbCA9IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBibG9ja1BhcmFtcyArPSAnICcgKyBwcm9ncmFtLmJsb2NrUGFyYW1zW2ldO1xuICAgIH1cbiAgICBibG9ja1BhcmFtcyArPSAnIF0nO1xuICAgIG91dCArPSB0aGlzLnBhZChibG9ja1BhcmFtcyk7XG4gIH1cblxuICBmb3IgKGkgPSAwLCBsID0gYm9keS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBvdXQgPSBvdXQgKyB0aGlzLmFjY2VwdChib2R5W2ldKTtcbiAgfVxuXG4gIHRoaXMucGFkZGluZy0tO1xuXG4gIHJldHVybiBvdXQ7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLk11c3RhY2hlU3RhdGVtZW50ID0gZnVuY3Rpb24gKG11c3RhY2hlKSB7XG4gIHJldHVybiB0aGlzLnBhZCgne3sgJyArIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSkgKyAnIH19Jyk7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLkJsb2NrU3RhdGVtZW50ID0gZnVuY3Rpb24gKGJsb2NrKSB7XG4gIHZhciBvdXQgPSAnJztcblxuICBvdXQgPSBvdXQgKyB0aGlzLnBhZCgnQkxPQ0s6Jyk7XG4gIHRoaXMucGFkZGluZysrO1xuICBvdXQgPSBvdXQgKyB0aGlzLnBhZCh0aGlzLlN1YkV4cHJlc3Npb24oYmxvY2spKTtcbiAgaWYgKGJsb2NrLnByb2dyYW0pIHtcbiAgICBvdXQgPSBvdXQgKyB0aGlzLnBhZCgnUFJPR1JBTTonKTtcbiAgICB0aGlzLnBhZGRpbmcrKztcbiAgICBvdXQgPSBvdXQgKyB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTtcbiAgICB0aGlzLnBhZGRpbmctLTtcbiAgfVxuICBpZiAoYmxvY2suaW52ZXJzZSkge1xuICAgIGlmIChibG9jay5wcm9ncmFtKSB7XG4gICAgICB0aGlzLnBhZGRpbmcrKztcbiAgICB9XG4gICAgb3V0ID0gb3V0ICsgdGhpcy5wYWQoJ3t7Xn19Jyk7XG4gICAgdGhpcy5wYWRkaW5nKys7XG4gICAgb3V0ID0gb3V0ICsgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7XG4gICAgdGhpcy5wYWRkaW5nLS07XG4gICAgaWYgKGJsb2NrLnByb2dyYW0pIHtcbiAgICAgIHRoaXMucGFkZGluZy0tO1xuICAgIH1cbiAgfVxuICB0aGlzLnBhZGRpbmctLTtcblxuICByZXR1cm4gb3V0O1xufTtcblxuUHJpbnRWaXNpdG9yLnByb3RvdHlwZS5QYXJ0aWFsU3RhdGVtZW50ID0gZnVuY3Rpb24gKHBhcnRpYWwpIHtcbiAgdmFyIGNvbnRlbnQgPSAnUEFSVElBTDonICsgcGFydGlhbC5uYW1lLm9yaWdpbmFsO1xuICBpZiAocGFydGlhbC5wYXJhbXNbMF0pIHtcbiAgICBjb250ZW50ICs9ICcgJyArIHRoaXMuYWNjZXB0KHBhcnRpYWwucGFyYW1zWzBdKTtcbiAgfVxuICBpZiAocGFydGlhbC5oYXNoKSB7XG4gICAgY29udGVudCArPSAnICcgKyB0aGlzLmFjY2VwdChwYXJ0aWFsLmhhc2gpO1xuICB9XG4gIHJldHVybiB0aGlzLnBhZCgne3s+ICcgKyBjb250ZW50ICsgJyB9fScpO1xufTtcblxuUHJpbnRWaXNpdG9yLnByb3RvdHlwZS5Db250ZW50U3RhdGVtZW50ID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIHRoaXMucGFkKCdDT05URU5UWyBcXCcnICsgY29udGVudC52YWx1ZSArICdcXCcgXScpO1xufTtcblxuUHJpbnRWaXNpdG9yLnByb3RvdHlwZS5Db21tZW50U3RhdGVtZW50ID0gZnVuY3Rpb24gKGNvbW1lbnQpIHtcbiAgcmV0dXJuIHRoaXMucGFkKCd7eyEgXFwnJyArIGNvbW1lbnQudmFsdWUgKyAnXFwnIH19Jyk7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLlN1YkV4cHJlc3Npb24gPSBmdW5jdGlvbiAoc2V4cHIpIHtcbiAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtcyxcbiAgICAgIHBhcmFtU3RyaW5ncyA9IFtdLFxuICAgICAgaGFzaCA9IHVuZGVmaW5lZDtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcmFtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBwYXJhbVN0cmluZ3MucHVzaCh0aGlzLmFjY2VwdChwYXJhbXNbaV0pKTtcbiAgfVxuXG4gIHBhcmFtcyA9ICdbJyArIHBhcmFtU3RyaW5ncy5qb2luKCcsICcpICsgJ10nO1xuXG4gIGhhc2ggPSBzZXhwci5oYXNoID8gJyAnICsgdGhpcy5hY2NlcHQoc2V4cHIuaGFzaCkgOiAnJztcblxuICByZXR1cm4gdGhpcy5hY2NlcHQoc2V4cHIucGF0aCkgKyAnICcgKyBwYXJhbXMgKyBoYXNoO1xufTtcblxuUHJpbnRWaXNpdG9yLnByb3RvdHlwZS5QYXRoRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChpZCkge1xuICB2YXIgcGF0aCA9IGlkLnBhcnRzLmpvaW4oJy8nKTtcbiAgcmV0dXJuIChpZC5kYXRhID8gJ0AnIDogJycpICsgJ1BBVEg6JyArIHBhdGg7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLlN0cmluZ0xpdGVyYWwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHJldHVybiAnXCInICsgc3RyaW5nLnZhbHVlICsgJ1wiJztcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuTnVtYmVyTGl0ZXJhbCA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgcmV0dXJuICdOVU1CRVJ7JyArIG51bWJlci52YWx1ZSArICd9Jztcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuQm9vbGVhbkxpdGVyYWwgPSBmdW5jdGlvbiAoYm9vbCkge1xuICByZXR1cm4gJ0JPT0xFQU57JyArIGJvb2wudmFsdWUgKyAnfSc7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLlVuZGVmaW5lZExpdGVyYWwgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAnVU5ERUZJTkVEJztcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuTnVsbExpdGVyYWwgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAnTlVMTCc7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLkhhc2ggPSBmdW5jdGlvbiAoaGFzaCkge1xuICB2YXIgcGFpcnMgPSBoYXNoLnBhaXJzLFxuICAgICAgam9pbmVkUGFpcnMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IHBhaXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGpvaW5lZFBhaXJzLnB1c2godGhpcy5hY2NlcHQocGFpcnNbaV0pKTtcbiAgfVxuXG4gIHJldHVybiAnSEFTSHsnICsgam9pbmVkUGFpcnMuam9pbignLCAnKSArICd9Jztcbn07XG5QcmludFZpc2l0b3IucHJvdG90eXBlLkhhc2hQYWlyID0gZnVuY3Rpb24gKHBhaXIpIHtcbiAgcmV0dXJuIHBhaXIua2V5ICsgJz0nICsgdGhpcy5hY2NlcHQocGFpci52YWx1ZSk7XG59O1xuLyplc2xpbnQtZW5hYmxlIG5ldy1jYXAgKi8iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9FeGNlcHRpb24gPSByZXF1aXJlKCcuLi9leGNlcHRpb24nKTtcblxudmFyIF9FeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0V4Y2VwdGlvbik7XG5cbnZhciBfQVNUID0gcmVxdWlyZSgnLi9hc3QnKTtcblxudmFyIF9BU1QyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0FTVCk7XG5cbmZ1bmN0aW9uIFZpc2l0b3IoKSB7XG4gIHRoaXMucGFyZW50cyA9IFtdO1xufVxuXG5WaXNpdG9yLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFZpc2l0b3IsXG4gIG11dGF0aW5nOiBmYWxzZSxcblxuICAvLyBWaXNpdHMgYSBnaXZlbiB2YWx1ZS4gSWYgbXV0YXRpbmcsIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LlxuICBhY2NlcHRLZXk6IGZ1bmN0aW9uIGFjY2VwdEtleShub2RlLCBuYW1lKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5hY2NlcHQobm9kZVtuYW1lXSk7XG4gICAgaWYgKHRoaXMubXV0YXRpbmcpIHtcbiAgICAgIC8vIEhhY2t5IHNhbml0eSBjaGVjazpcbiAgICAgIGlmICh2YWx1ZSAmJiAoIXZhbHVlLnR5cGUgfHwgIV9BU1QyWydkZWZhdWx0J11bdmFsdWUudHlwZV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdVbmV4cGVjdGVkIG5vZGUgdHlwZSBcIicgKyB2YWx1ZS50eXBlICsgJ1wiIGZvdW5kIHdoZW4gYWNjZXB0aW5nICcgKyBuYW1lICsgJyBvbiAnICsgbm9kZS50eXBlKTtcbiAgICAgIH1cbiAgICAgIG5vZGVbbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gUGVyZm9ybXMgYW4gYWNjZXB0IG9wZXJhdGlvbiB3aXRoIGFkZGVkIHNhbml0eSBjaGVjayB0byBlbnN1cmVcbiAgLy8gcmVxdWlyZWQga2V5cyBhcmUgbm90IHJlbW92ZWQuXG4gIGFjY2VwdFJlcXVpcmVkOiBmdW5jdGlvbiBhY2NlcHRSZXF1aXJlZChub2RlLCBuYW1lKSB7XG4gICAgdGhpcy5hY2NlcHRLZXkobm9kZSwgbmFtZSk7XG5cbiAgICBpZiAoIW5vZGVbbmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKG5vZGUudHlwZSArICcgcmVxdWlyZXMgJyArIG5hbWUpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUcmF2ZXJzZXMgYSBnaXZlbiBhcnJheS4gSWYgbXV0YXRpbmcsIGVtcHR5IHJlc3Buc2VzIHdpbGwgYmUgcmVtb3ZlZFxuICAvLyBmb3IgY2hpbGQgZWxlbWVudHMuXG4gIGFjY2VwdEFycmF5OiBmdW5jdGlvbiBhY2NlcHRBcnJheShhcnJheSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB0aGlzLmFjY2VwdEtleShhcnJheSwgaSk7XG5cbiAgICAgIGlmICghYXJyYXlbaV0pIHtcbiAgICAgICAgYXJyYXkuc3BsaWNlKGksIDEpO1xuICAgICAgICBpLS07XG4gICAgICAgIGwtLTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgYWNjZXB0OiBmdW5jdGlvbiBhY2NlcHQob2JqZWN0KSB7XG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jdXJyZW50KSB7XG4gICAgICB0aGlzLnBhcmVudHMudW5zaGlmdCh0aGlzLmN1cnJlbnQpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQgPSBvYmplY3Q7XG5cbiAgICB2YXIgcmV0ID0gdGhpc1tvYmplY3QudHlwZV0ob2JqZWN0KTtcblxuICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFyZW50cy5zaGlmdCgpO1xuXG4gICAgaWYgKCF0aGlzLm11dGF0aW5nIHx8IHJldCkge1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IGVsc2UgaWYgKHJldCAhPT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuICB9LFxuXG4gIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkge1xuICAgIHRoaXMuYWNjZXB0QXJyYXkocHJvZ3JhbS5ib2R5KTtcbiAgfSxcblxuICBNdXN0YWNoZVN0YXRlbWVudDogZnVuY3Rpb24gTXVzdGFjaGVTdGF0ZW1lbnQobXVzdGFjaGUpIHtcbiAgICB0aGlzLmFjY2VwdFJlcXVpcmVkKG11c3RhY2hlLCAncGF0aCcpO1xuICAgIHRoaXMuYWNjZXB0QXJyYXkobXVzdGFjaGUucGFyYW1zKTtcbiAgICB0aGlzLmFjY2VwdEtleShtdXN0YWNoZSwgJ2hhc2gnKTtcbiAgfSxcblxuICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYmxvY2spIHtcbiAgICB0aGlzLmFjY2VwdFJlcXVpcmVkKGJsb2NrLCAncGF0aCcpO1xuICAgIHRoaXMuYWNjZXB0QXJyYXkoYmxvY2sucGFyYW1zKTtcbiAgICB0aGlzLmFjY2VwdEtleShibG9jaywgJ2hhc2gnKTtcblxuICAgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAncHJvZ3JhbScpO1xuICAgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaW52ZXJzZScpO1xuICB9LFxuXG4gIFBhcnRpYWxTdGF0ZW1lbnQ6IGZ1bmN0aW9uIFBhcnRpYWxTdGF0ZW1lbnQocGFydGlhbCkge1xuICAgIHRoaXMuYWNjZXB0UmVxdWlyZWQocGFydGlhbCwgJ25hbWUnKTtcbiAgICB0aGlzLmFjY2VwdEFycmF5KHBhcnRpYWwucGFyYW1zKTtcbiAgICB0aGlzLmFjY2VwdEtleShwYXJ0aWFsLCAnaGFzaCcpO1xuICB9LFxuXG4gIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoKSB7fSxcbiAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIHt9LFxuXG4gIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHtcbiAgICB0aGlzLmFjY2VwdFJlcXVpcmVkKHNleHByLCAncGF0aCcpO1xuICAgIHRoaXMuYWNjZXB0QXJyYXkoc2V4cHIucGFyYW1zKTtcbiAgICB0aGlzLmFjY2VwdEtleShzZXhwciwgJ2hhc2gnKTtcbiAgfSxcblxuICBQYXRoRXhwcmVzc2lvbjogZnVuY3Rpb24gUGF0aEV4cHJlc3Npb24oKSB7fSxcblxuICBTdHJpbmdMaXRlcmFsOiBmdW5jdGlvbiBTdHJpbmdMaXRlcmFsKCkge30sXG4gIE51bWJlckxpdGVyYWw6IGZ1bmN0aW9uIE51bWJlckxpdGVyYWwoKSB7fSxcbiAgQm9vbGVhbkxpdGVyYWw6IGZ1bmN0aW9uIEJvb2xlYW5MaXRlcmFsKCkge30sXG4gIFVuZGVmaW5lZExpdGVyYWw6IGZ1bmN0aW9uIFVuZGVmaW5lZExpdGVyYWwoKSB7fSxcbiAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkge30sXG5cbiAgSGFzaDogZnVuY3Rpb24gSGFzaChoYXNoKSB7XG4gICAgdGhpcy5hY2NlcHRBcnJheShoYXNoLnBhaXJzKTtcbiAgfSxcbiAgSGFzaFBhaXI6IGZ1bmN0aW9uIEhhc2hQYWlyKHBhaXIpIHtcbiAgICB0aGlzLmFjY2VwdFJlcXVpcmVkKHBhaXIsICd2YWx1ZScpO1xuICB9XG59O1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBWaXNpdG9yO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vKiBjb250ZW50ICovIC8qIGNvbW1lbnQgKi8gLyogcGF0aCAqLyAvKiBzdHJpbmcgKi8gLyogbnVtYmVyICovIC8qIGJvb2wgKi8gLyogbGl0ZXJhbCAqLyAvKiBsaXRlcmFsICovIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH07XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfVmlzaXRvciA9IHJlcXVpcmUoJy4vdmlzaXRvcicpO1xuXG52YXIgX1Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX1Zpc2l0b3IpO1xuXG5mdW5jdGlvbiBXaGl0ZXNwYWNlQ29udHJvbCgpIHt9XG5XaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUgPSBuZXcgX1Zpc2l0b3IyWydkZWZhdWx0J10oKTtcblxuV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkge1xuICB2YXIgaXNSb290ID0gIXRoaXMuaXNSb290U2VlbjtcbiAgdGhpcy5pc1Jvb3RTZWVuID0gdHJ1ZTtcblxuICB2YXIgYm9keSA9IHByb2dyYW0uYm9keTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBjdXJyZW50ID0gYm9keVtpXSxcbiAgICAgICAgc3RyaXAgPSB0aGlzLmFjY2VwdChjdXJyZW50KTtcblxuICAgIGlmICghc3RyaXApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBfaXNQcmV2V2hpdGVzcGFjZSA9IGlzUHJldldoaXRlc3BhY2UoYm9keSwgaSwgaXNSb290KSxcbiAgICAgICAgX2lzTmV4dFdoaXRlc3BhY2UgPSBpc05leHRXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCksXG4gICAgICAgIG9wZW5TdGFuZGFsb25lID0gc3RyaXAub3BlblN0YW5kYWxvbmUgJiYgX2lzUHJldldoaXRlc3BhY2UsXG4gICAgICAgIGNsb3NlU3RhbmRhbG9uZSA9IHN0cmlwLmNsb3NlU3RhbmRhbG9uZSAmJiBfaXNOZXh0V2hpdGVzcGFjZSxcbiAgICAgICAgaW5saW5lU3RhbmRhbG9uZSA9IHN0cmlwLmlubGluZVN0YW5kYWxvbmUgJiYgX2lzUHJldldoaXRlc3BhY2UgJiYgX2lzTmV4dFdoaXRlc3BhY2U7XG5cbiAgICBpZiAoc3RyaXAuY2xvc2UpIHtcbiAgICAgIG9taXRSaWdodChib2R5LCBpLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKHN0cmlwLm9wZW4pIHtcbiAgICAgIG9taXRMZWZ0KGJvZHksIGksIHRydWUpO1xuICAgIH1cblxuICAgIGlmIChpbmxpbmVTdGFuZGFsb25lKSB7XG4gICAgICBvbWl0UmlnaHQoYm9keSwgaSk7XG5cbiAgICAgIGlmIChvbWl0TGVmdChib2R5LCBpKSkge1xuICAgICAgICAvLyBJZiB3ZSBhcmUgb24gYSBzdGFuZGFsb25lIG5vZGUsIHNhdmUgdGhlIGluZGVudCBpbmZvIGZvciBwYXJ0aWFsc1xuICAgICAgICBpZiAoY3VycmVudC50eXBlID09PSAnUGFydGlhbFN0YXRlbWVudCcpIHtcbiAgICAgICAgICAvLyBQdWxsIG91dCB0aGUgd2hpdGVzcGFjZSBmcm9tIHRoZSBmaW5hbCBsaW5lXG4gICAgICAgICAgY3VycmVudC5pbmRlbnQgPSAvKFsgXFx0XSskKS8uZXhlYyhib2R5W2kgLSAxXS5vcmlnaW5hbClbMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wZW5TdGFuZGFsb25lKSB7XG4gICAgICBvbWl0UmlnaHQoKGN1cnJlbnQucHJvZ3JhbSB8fCBjdXJyZW50LmludmVyc2UpLmJvZHkpO1xuXG4gICAgICAvLyBTdHJpcCBvdXQgdGhlIHByZXZpb3VzIGNvbnRlbnQgbm9kZSBpZiBpdCdzIHdoaXRlc3BhY2Ugb25seVxuICAgICAgb21pdExlZnQoYm9keSwgaSk7XG4gICAgfVxuICAgIGlmIChjbG9zZVN0YW5kYWxvbmUpIHtcbiAgICAgIC8vIEFsd2F5cyBzdHJpcCB0aGUgbmV4dCBub2RlXG4gICAgICBvbWl0UmlnaHQoYm9keSwgaSk7XG5cbiAgICAgIG9taXRMZWZ0KChjdXJyZW50LmludmVyc2UgfHwgY3VycmVudC5wcm9ncmFtKS5ib2R5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcHJvZ3JhbTtcbn07XG5XaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuQmxvY2tTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoYmxvY2spIHtcbiAgdGhpcy5hY2NlcHQoYmxvY2sucHJvZ3JhbSk7XG4gIHRoaXMuYWNjZXB0KGJsb2NrLmludmVyc2UpO1xuXG4gIC8vIEZpbmQgdGhlIGludmVyc2UgcHJvZ3JhbSB0aGF0IGlzIGludm9sZWQgd2l0aCB3aGl0ZXNwYWNlIHN0cmlwcGluZy5cbiAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtIHx8IGJsb2NrLmludmVyc2UsXG4gICAgICBpbnZlcnNlID0gYmxvY2sucHJvZ3JhbSAmJiBibG9jay5pbnZlcnNlLFxuICAgICAgZmlyc3RJbnZlcnNlID0gaW52ZXJzZSxcbiAgICAgIGxhc3RJbnZlcnNlID0gaW52ZXJzZTtcblxuICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlLmNoYWluZWQpIHtcbiAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLmJvZHlbMF0ucHJvZ3JhbTtcblxuICAgIC8vIFdhbGsgdGhlIGludmVyc2UgY2hhaW4gdG8gZmluZCB0aGUgbGFzdCBpbnZlcnNlIHRoYXQgaXMgYWN0dWFsbHkgaW4gdGhlIGNoYWluLlxuICAgIHdoaWxlIChsYXN0SW52ZXJzZS5jaGFpbmVkKSB7XG4gICAgICBsYXN0SW52ZXJzZSA9IGxhc3RJbnZlcnNlLmJvZHlbbGFzdEludmVyc2UuYm9keS5sZW5ndGggLSAxXS5wcm9ncmFtO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdHJpcCA9IHtcbiAgICBvcGVuOiBibG9jay5vcGVuU3RyaXAub3BlbixcbiAgICBjbG9zZTogYmxvY2suY2xvc2VTdHJpcC5jbG9zZSxcblxuICAgIC8vIERldGVybWluZSB0aGUgc3RhbmRhbG9uZSBjYW5kaWFjeS4gQmFzaWNhbGx5IGZsYWcgb3VyIGNvbnRlbnQgYXMgYmVpbmcgcG9zc2libHkgc3RhbmRhbG9uZVxuICAgIC8vIHNvIG91ciBwYXJlbnQgY2FuIGRldGVybWluZSBpZiB3ZSBhY3R1YWxseSBhcmUgc3RhbmRhbG9uZVxuICAgIG9wZW5TdGFuZGFsb25lOiBpc05leHRXaGl0ZXNwYWNlKHByb2dyYW0uYm9keSksXG4gICAgY2xvc2VTdGFuZGFsb25lOiBpc1ByZXZXaGl0ZXNwYWNlKChmaXJzdEludmVyc2UgfHwgcHJvZ3JhbSkuYm9keSlcbiAgfTtcblxuICBpZiAoYmxvY2sub3BlblN0cmlwLmNsb3NlKSB7XG4gICAgb21pdFJpZ2h0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7XG4gIH1cblxuICBpZiAoaW52ZXJzZSkge1xuICAgIHZhciBpbnZlcnNlU3RyaXAgPSBibG9jay5pbnZlcnNlU3RyaXA7XG5cbiAgICBpZiAoaW52ZXJzZVN0cmlwLm9wZW4pIHtcbiAgICAgIG9taXRMZWZ0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGludmVyc2VTdHJpcC5jbG9zZSkge1xuICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKGJsb2NrLmNsb3NlU3RyaXAub3Blbikge1xuICAgICAgb21pdExlZnQobGFzdEludmVyc2UuYm9keSwgbnVsbCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gRmluZCBzdGFuZGFsb25lIGVsc2Ugc3RhdG1lbnRzXG4gICAgaWYgKGlzUHJldldoaXRlc3BhY2UocHJvZ3JhbS5ib2R5KSAmJiBpc05leHRXaGl0ZXNwYWNlKGZpcnN0SW52ZXJzZS5ib2R5KSkge1xuICAgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5KTtcbiAgICAgIG9taXRSaWdodChmaXJzdEludmVyc2UuYm9keSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGJsb2NrLmNsb3NlU3RyaXAub3Blbikge1xuICAgIG9taXRMZWZ0KHByb2dyYW0uYm9keSwgbnVsbCwgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gc3RyaXA7XG59O1xuXG5XaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuTXVzdGFjaGVTdGF0ZW1lbnQgPSBmdW5jdGlvbiAobXVzdGFjaGUpIHtcbiAgcmV0dXJuIG11c3RhY2hlLnN0cmlwO1xufTtcblxuV2hpdGVzcGFjZUNvbnRyb2wucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBXaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuQ29tbWVudFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge307XG4gIHJldHVybiB7XG4gICAgaW5saW5lU3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBvcGVuOiBzdHJpcC5vcGVuLFxuICAgIGNsb3NlOiBzdHJpcC5jbG9zZVxuICB9O1xufTtcblxuZnVuY3Rpb24gaXNQcmV2V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpIHtcbiAgaWYgKGkgPT09IHVuZGVmaW5lZCkge1xuICAgIGkgPSBib2R5Lmxlbmd0aDtcbiAgfVxuXG4gIC8vIE5vZGVzIHRoYXQgZW5kIHdpdGggbmV3bGluZXMgYXJlIGNvbnNpZGVyZWQgd2hpdGVzcGFjZSAoYnV0IGFyZSBzcGVjaWFsXG4gIC8vIGNhc2VkIGZvciBzdHJpcCBvcGVyYXRpb25zKVxuICB2YXIgcHJldiA9IGJvZHlbaSAtIDFdLFxuICAgICAgc2libGluZyA9IGJvZHlbaSAtIDJdO1xuICBpZiAoIXByZXYpIHtcbiAgICByZXR1cm4gaXNSb290O1xuICB9XG5cbiAgaWYgKHByZXYudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7XG4gICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXFxyP1xcblxccyo/JC8gOiAvKF58XFxyP1xcbilcXHMqPyQvKS50ZXN0KHByZXYub3JpZ2luYWwpO1xuICB9XG59XG5mdW5jdGlvbiBpc05leHRXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkge1xuICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaSA9IC0xO1xuICB9XG5cbiAgdmFyIG5leHQgPSBib2R5W2kgKyAxXSxcbiAgICAgIHNpYmxpbmcgPSBib2R5W2kgKyAyXTtcbiAgaWYgKCFuZXh0KSB7XG4gICAgcmV0dXJuIGlzUm9vdDtcbiAgfVxuXG4gIGlmIChuZXh0LnR5cGUgPT09ICdDb250ZW50U3RhdGVtZW50Jykge1xuICAgIHJldHVybiAoc2libGluZyB8fCAhaXNSb290ID8gL15cXHMqP1xccj9cXG4vIDogL15cXHMqPyhcXHI/XFxufCQpLykudGVzdChuZXh0Lm9yaWdpbmFsKTtcbiAgfVxufVxuXG4vLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgcmlnaHQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuXG4vLyBJLmUuIHt7Zm9vfX0nICcgd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLlxuLy9cbi8vIElmIGkgaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLlxuLy9cbi8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlXG4vLyBjb250ZW50IGlzIG1ldC5cbmZ1bmN0aW9uIG9taXRSaWdodChib2R5LCBpLCBtdWx0aXBsZSkge1xuICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gMCA6IGkgKyAxXTtcbiAgaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQudHlwZSAhPT0gJ0NvbnRlbnRTdGF0ZW1lbnQnIHx8ICFtdWx0aXBsZSAmJiBjdXJyZW50LnJpZ2h0U3RyaXBwZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlO1xuICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL15cXHMrLyA6IC9eWyBcXHRdKlxccj9cXG4/LywgJycpO1xuICBjdXJyZW50LnJpZ2h0U3RyaXBwZWQgPSBjdXJyZW50LnZhbHVlICE9PSBvcmlnaW5hbDtcbn1cblxuLy8gTWFya3MgdGhlIG5vZGUgdG8gdGhlIGxlZnQgb2YgdGhlIHBvc2l0aW9uIGFzIG9taXR0ZWQuXG4vLyBJLmUuICcgJ3t7Zm9vfX0gd2lsbCBtYXJrIHRoZSAnICcgbm9kZSBhcyBvbWl0dGVkLlxuLy9cbi8vIElmIGkgaXMgdW5kZWZpbmVkIHRoZW4gdGhlIGxhc3QgY2hpbGQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaC5cbi8vXG4vLyBJZiBtdWxpdHBsZSBpcyB0cnV0aHkgdGhlbiBhbGwgd2hpdGVzcGFjZSB3aWxsIGJlIHN0cmlwcGVkIG91dCB1bnRpbCBub24td2hpdGVzcGFjZVxuLy8gY29udGVudCBpcyBtZXQuXG5mdW5jdGlvbiBvbWl0TGVmdChib2R5LCBpLCBtdWx0aXBsZSkge1xuICB2YXIgY3VycmVudCA9IGJvZHlbaSA9PSBudWxsID8gYm9keS5sZW5ndGggLSAxIDogaSAtIDFdO1xuICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQubGVmdFN0cmlwcGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gV2Ugb21pdCB0aGUgbGFzdCBub2RlIGlmIGl0J3Mgd2hpdGVzcGFjZSBvbmx5IGFuZCBub3QgcHJlY2VlZGVkIGJ5IGEgbm9uLWNvbnRlbnQgbm9kZS5cbiAgdmFyIG9yaWdpbmFsID0gY3VycmVudC52YWx1ZTtcbiAgY3VycmVudC52YWx1ZSA9IGN1cnJlbnQudmFsdWUucmVwbGFjZShtdWx0aXBsZSA/IC9cXHMrJC8gOiAvWyBcXHRdKyQvLCAnJyk7XG4gIGN1cnJlbnQubGVmdFN0cmlwcGVkID0gY3VycmVudC52YWx1ZSAhPT0gb3JpZ2luYWw7XG4gIHJldHVybiBjdXJyZW50LmxlZnRTdHJpcHBlZDtcbn1cblxuZXhwb3J0c1snZGVmYXVsdCddID0gV2hpdGVzcGFjZUNvbnRyb2w7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBlcnJvclByb3BzID0gWydkZXNjcmlwdGlvbicsICdmaWxlTmFtZScsICdsaW5lTnVtYmVyJywgJ21lc3NhZ2UnLCAnbmFtZScsICdudW1iZXInLCAnc3RhY2snXTtcblxuZnVuY3Rpb24gRXhjZXB0aW9uKG1lc3NhZ2UsIG5vZGUpIHtcbiAgdmFyIGxvYyA9IG5vZGUgJiYgbm9kZS5sb2MsXG4gICAgICBsaW5lID0gdW5kZWZpbmVkLFxuICAgICAgY29sdW1uID0gdW5kZWZpbmVkO1xuICBpZiAobG9jKSB7XG4gICAgbGluZSA9IGxvYy5zdGFydC5saW5lO1xuICAgIGNvbHVtbiA9IGxvYy5zdGFydC5jb2x1bW47XG5cbiAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjtcbiAgfVxuXG4gIHZhciB0bXAgPSBFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcblxuICAvLyBVbmZvcnR1bmF0ZWx5IGVycm9ycyBhcmUgbm90IGVudW1lcmFibGUgaW4gQ2hyb21lIChhdCBsZWFzdCksIHNvIGBmb3IgcHJvcCBpbiB0bXBgIGRvZXNuJ3Qgd29yay5cbiAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgZXJyb3JQcm9wcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdGhpc1tlcnJvclByb3BzW2lkeF1dID0gdG1wW2Vycm9yUHJvcHNbaWR4XV07XG4gIH1cblxuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pO1xuICB9XG5cbiAgaWYgKGxvYykge1xuICAgIHRoaXMubGluZU51bWJlciA9IGxpbmU7XG4gICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gIH1cbn1cblxuRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG4vKmdsb2JhbCB3aW5kb3cgKi9cblxuZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKEhhbmRsZWJhcnMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdyxcbiAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykge1xuICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7XG4gICAgfVxuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDI1dlpHVmZiVzlrZFd4bGN5OUlZVzVrYkdWaVlYSnpMMlJwYzNRdlkycHpMMmhoYm1Sc1pXSmhjbk12Ym04dFkyOXVabXhwWTNRdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqdEJRVUZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTSXNJbVpwYkdVaU9pSm5aVzVsY21GMFpXUXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpSjNWelpTQnpkSEpwWTNRbk8xeHVYRzVsZUhCdmNuUnpMbDlmWlhOTmIyUjFiR1VnUFNCMGNuVmxPMXh1THlwbmJHOWlZV3dnZDJsdVpHOTNJQ292WEc1Y2JtVjRjRzl5ZEhOYkoyUmxabUYxYkhRblhTQTlJR1oxYm1OMGFXOXVJQ2hJWVc1a2JHVmlZWEp6S1NCN1hHNGdJQzhxSUdsemRHRnVZblZzSUdsbmJtOXlaU0J1WlhoMElDb3ZYRzRnSUhaaGNpQnliMjkwSUQwZ2RIbHdaVzltSUdkc2IySmhiQ0FoUFQwZ0ozVnVaR1ZtYVc1bFpDY2dQeUJuYkc5aVlXd2dPaUIzYVc1a2IzY3NYRzRnSUNBZ0lDQWtTR0Z1Wkd4bFltRnljeUE5SUhKdmIzUXVTR0Z1Wkd4bFltRnljenRjYmlBZ0x5b2dhWE4wWVc1aWRXd2dhV2R1YjNKbElHNWxlSFFnS2k5Y2JpQWdTR0Z1Wkd4bFltRnljeTV1YjBOdmJtWnNhV04wSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lHbG1JQ2h5YjI5MExraGhibVJzWldKaGNuTWdQVDA5SUVoaGJtUnNaV0poY25NcElIdGNiaUFnSUNBZ0lISnZiM1F1U0dGdVpHeGxZbUZ5Y3lBOUlDUklZVzVrYkdWaVlYSnpPMXh1SUNBZ0lIMWNiaUFnZlR0Y2JuMDdYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnWlhod2IzSjBjMXNuWkdWbVlYVnNkQ2RkT3lKZGZRPT0iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuY2hlY2tSZXZpc2lvbiA9IGNoZWNrUmV2aXNpb247XG5cbi8vIFRPRE86IFJlbW92ZSB0aGlzIGxpbmUgYW5kIGJyZWFrIHVwIGNvbXBpbGVQYXJ0aWFsXG5cbmV4cG9ydHMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbmV4cG9ydHMud3JhcFByb2dyYW0gPSB3cmFwUHJvZ3JhbTtcbmV4cG9ydHMucmVzb2x2ZVBhcnRpYWwgPSByZXNvbHZlUGFydGlhbDtcbmV4cG9ydHMuaW52b2tlUGFydGlhbCA9IGludm9rZVBhcnRpYWw7XG5leHBvcnRzLm5vb3AgPSBub29wO1xuXG52YXIgX2ltcG9ydCA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2ltcG9ydCk7XG5cbnZhciBfRXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcblxudmFyIF9FeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0V4Y2VwdGlvbik7XG5cbnZhciBfQ09NUElMRVJfUkVWSVNJT04kUkVWSVNJT05fQ0hBTkdFUyRjcmVhdGVGcmFtZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuXG5mdW5jdGlvbiBjaGVja1JldmlzaW9uKGNvbXBpbGVySW5mbykge1xuICB2YXIgY29tcGlsZXJSZXZpc2lvbiA9IGNvbXBpbGVySW5mbyAmJiBjb21waWxlckluZm9bMF0gfHwgMSxcbiAgICAgIGN1cnJlbnRSZXZpc2lvbiA9IF9DT01QSUxFUl9SRVZJU0lPTiRSRVZJU0lPTl9DSEFOR0VTJGNyZWF0ZUZyYW1lLkNPTVBJTEVSX1JFVklTSU9OO1xuXG4gIGlmIChjb21waWxlclJldmlzaW9uICE9PSBjdXJyZW50UmV2aXNpb24pIHtcbiAgICBpZiAoY29tcGlsZXJSZXZpc2lvbiA8IGN1cnJlbnRSZXZpc2lvbikge1xuICAgICAgdmFyIHJ1bnRpbWVWZXJzaW9ucyA9IF9DT01QSUxFUl9SRVZJU0lPTiRSRVZJU0lPTl9DSEFOR0VTJGNyZWF0ZUZyYW1lLlJFVklTSU9OX0NIQU5HRVNbY3VycmVudFJldmlzaW9uXSxcbiAgICAgICAgICBjb21waWxlclZlcnNpb25zID0gX0NPTVBJTEVSX1JFVklTSU9OJFJFVklTSU9OX0NIQU5HRVMkY3JlYXRlRnJhbWUuUkVWSVNJT05fQ0hBTkdFU1tjb21waWxlclJldmlzaW9uXTtcbiAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhbiBvbGRlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUgY3VycmVudCBydW50aW1lLiAnICsgJ1BsZWFzZSB1cGRhdGUgeW91ciBwcmVjb21waWxlciB0byBhIG5ld2VyIHZlcnNpb24gKCcgKyBydW50aW1lVmVyc2lvbnMgKyAnKSBvciBkb3duZ3JhZGUgeW91ciBydW50aW1lIHRvIGFuIG9sZGVyIHZlcnNpb24gKCcgKyBjb21waWxlclZlcnNpb25zICsgJykuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVzZSB0aGUgZW1iZWRkZWQgdmVyc2lvbiBpbmZvIHNpbmNlIHRoZSBydW50aW1lIGRvZXNuJ3Qga25vdyBhYm91dCB0aGlzIHJldmlzaW9uIHlldFxuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ1RlbXBsYXRlIHdhcyBwcmVjb21waWxlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcnVudGltZSB0byBhIG5ld2VyIHZlcnNpb24gKCcgKyBjb21waWxlckluZm9bMV0gKyAnKS4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKCFlbnYpIHtcbiAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7XG4gIH1cbiAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7XG4gICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7XG4gIH1cblxuICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvd1xuICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLlxuICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpO1xuXG4gIGZ1bmN0aW9uIGludm9rZVBhcnRpYWxXcmFwcGVyKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgICBjb250ZXh0ID0gVXRpbHMuZXh0ZW5kKHt9LCBjb250ZXh0LCBvcHRpb25zLmhhc2gpO1xuICAgIH1cblxuICAgIHBhcnRpYWwgPSBlbnYuVk0ucmVzb2x2ZVBhcnRpYWwuY2FsbCh0aGlzLCBwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKTtcbiAgICB2YXIgcmVzdWx0ID0gZW52LlZNLmludm9rZVBhcnRpYWwuY2FsbCh0aGlzLCBwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKTtcblxuICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiBlbnYuY29tcGlsZSkge1xuICAgICAgb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdID0gZW52LmNvbXBpbGUocGFydGlhbCwgdGVtcGxhdGVTcGVjLmNvbXBpbGVyT3B0aW9ucywgZW52KTtcbiAgICAgIHJlc3VsdCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXShjb250ZXh0LCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICBpZiAob3B0aW9ucy5pbmRlbnQpIHtcbiAgICAgICAgdmFyIGxpbmVzID0gcmVzdWx0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsaW5lc1tpXSA9IG9wdGlvbnMuaW5kZW50ICsgbGluZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gbGluZXMuam9pbignXFxuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGNvbXBpbGVkIHdoZW4gcnVubmluZyBpbiBydW50aW1lLW9ubHkgbW9kZScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEp1c3QgYWRkIHdhdGVyXG4gIHZhciBjb250YWluZXIgPSB7XG4gICAgc3RyaWN0OiBmdW5jdGlvbiBzdHJpY3Qob2JqLCBuYW1lKSB7XG4gICAgICBpZiAoIShuYW1lIGluIG9iaikpIHtcbiAgICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ1wiJyArIG5hbWUgKyAnXCIgbm90IGRlZmluZWQgaW4gJyArIG9iaik7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqW25hbWVdO1xuICAgIH0sXG4gICAgbG9va3VwOiBmdW5jdGlvbiBsb29rdXAoZGVwdGhzLCBuYW1lKSB7XG4gICAgICB2YXIgbGVuID0gZGVwdGhzLmxlbmd0aDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGRlcHRoc1tpXSAmJiBkZXB0aHNbaV1bbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBkZXB0aHNbaV1bbmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGxhbWJkYTogZnVuY3Rpb24gbGFtYmRhKGN1cnJlbnQsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgY3VycmVudCA9PT0gJ2Z1bmN0aW9uJyA/IGN1cnJlbnQuY2FsbChjb250ZXh0KSA6IGN1cnJlbnQ7XG4gICAgfSxcblxuICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sXG4gICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsXG5cbiAgICBmbjogZnVuY3Rpb24gZm4oaSkge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlU3BlY1tpXTtcbiAgICB9LFxuXG4gICAgcHJvZ3JhbXM6IFtdLFxuICAgIHByb2dyYW06IGZ1bmN0aW9uIHByb2dyYW0oaSwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocykge1xuICAgICAgdmFyIHByb2dyYW1XcmFwcGVyID0gdGhpcy5wcm9ncmFtc1tpXSxcbiAgICAgICAgICBmbiA9IHRoaXMuZm4oaSk7XG4gICAgICBpZiAoZGF0YSB8fCBkZXB0aHMgfHwgYmxvY2tQYXJhbXMgfHwgZGVjbGFyZWRCbG9ja1BhcmFtcykge1xuICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHdyYXBQcm9ncmFtKHRoaXMsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgICAgIH0gZWxzZSBpZiAoIXByb2dyYW1XcmFwcGVyKSB7XG4gICAgICAgIHByb2dyYW1XcmFwcGVyID0gdGhpcy5wcm9ncmFtc1tpXSA9IHdyYXBQcm9ncmFtKHRoaXMsIGksIGZuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9ncmFtV3JhcHBlcjtcbiAgICB9LFxuXG4gICAgZGF0YTogZnVuY3Rpb24gZGF0YSh2YWx1ZSwgZGVwdGgpIHtcbiAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShwYXJhbSwgY29tbW9uKSB7XG4gICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uO1xuXG4gICAgICBpZiAocGFyYW0gJiYgY29tbW9uICYmIHBhcmFtICE9PSBjb21tb24pIHtcbiAgICAgICAgb2JqID0gVXRpbHMuZXh0ZW5kKHt9LCBjb21tb24sIHBhcmFtKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuXG4gICAgbm9vcDogZW52LlZNLm5vb3AsXG4gICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXJcbiAgfTtcblxuICBmdW5jdGlvbiByZXQoY29udGV4dCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTtcblxuICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhO1xuXG4gICAgcmV0Ll9zZXR1cChvcHRpb25zKTtcbiAgICBpZiAoIW9wdGlvbnMucGFydGlhbCAmJiB0ZW1wbGF0ZVNwZWMudXNlRGF0YSkge1xuICAgICAgZGF0YSA9IGluaXREYXRhKGNvbnRleHQsIGRhdGEpO1xuICAgIH1cbiAgICB2YXIgZGVwdGhzID0gdW5kZWZpbmVkLFxuICAgICAgICBibG9ja1BhcmFtcyA9IHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyA/IFtdIDogdW5kZWZpbmVkO1xuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzKSB7XG4gICAgICBkZXB0aHMgPSBvcHRpb25zLmRlcHRocyA/IFtjb250ZXh0XS5jb25jYXQob3B0aW9ucy5kZXB0aHMpIDogW2NvbnRleHRdO1xuICAgIH1cblxuICAgIHJldHVybiB0ZW1wbGF0ZVNwZWMubWFpbi5jYWxsKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gIH1cbiAgcmV0LmlzVG9wID0gdHJ1ZTtcblxuICByZXQuX3NldHVwID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMucGFydGlhbCkge1xuICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5oZWxwZXJzLCBlbnYuaGVscGVycyk7XG5cbiAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkge1xuICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7XG4gICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzO1xuICAgIH1cbiAgfTtcblxuICByZXQuX2NoaWxkID0gZnVuY3Rpb24gKGksIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZUJsb2NrUGFyYW1zICYmICFibG9ja1BhcmFtcykge1xuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ211c3QgcGFzcyBibG9jayBwYXJhbXMnKTtcbiAgICB9XG4gICAgaWYgKHRlbXBsYXRlU3BlYy51c2VEZXB0aHMgJiYgIWRlcHRocykge1xuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ211c3QgcGFzcyBwYXJlbnQgZGVwdGhzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gd3JhcFByb2dyYW0oY29udGFpbmVyLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocykge1xuICBmdW5jdGlvbiBwcm9nKGNvbnRleHQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07XG5cbiAgICByZXR1cm4gZm4uY2FsbChjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIG9wdGlvbnMuZGF0YSB8fCBkYXRhLCBibG9ja1BhcmFtcyAmJiBbb3B0aW9ucy5ibG9ja1BhcmFtc10uY29uY2F0KGJsb2NrUGFyYW1zKSwgZGVwdGhzICYmIFtjb250ZXh0XS5jb25jYXQoZGVwdGhzKSk7XG4gIH1cbiAgcHJvZy5wcm9ncmFtID0gaTtcbiAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwO1xuICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwO1xuICByZXR1cm4gcHJvZztcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhcnRpYWwocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICBpZiAoIXBhcnRpYWwpIHtcbiAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdO1xuICB9IGVsc2UgaWYgKCFwYXJ0aWFsLmNhbGwgJiYgIW9wdGlvbnMubmFtZSkge1xuICAgIC8vIFRoaXMgaXMgYSBkeW5hbWljIHBhcnRpYWwgdGhhdCByZXR1cm5lZCBhIHN0cmluZ1xuICAgIG9wdGlvbnMubmFtZSA9IHBhcnRpYWw7XG4gICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbcGFydGlhbF07XG4gIH1cbiAgcmV0dXJuIHBhcnRpYWw7XG59XG5cbmZ1bmN0aW9uIGludm9rZVBhcnRpYWwocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICBvcHRpb25zLnBhcnRpYWwgPSB0cnVlO1xuXG4gIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7XG4gIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcCgpIHtcbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBpbml0RGF0YShjb250ZXh0LCBkYXRhKSB7XG4gIGlmICghZGF0YSB8fCAhKCdyb290JyBpbiBkYXRhKSkge1xuICAgIGRhdGEgPSBkYXRhID8gX0NPTVBJTEVSX1JFVklTSU9OJFJFVklTSU9OX0NIQU5HRVMkY3JlYXRlRnJhbWUuY3JlYXRlRnJhbWUoZGF0YSkgOiB7fTtcbiAgICBkYXRhLnJvb3QgPSBjb250ZXh0O1xuICB9XG4gIHJldHVybiBkYXRhO1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8vIEJ1aWxkIG91dCBvdXIgYmFzaWMgU2FmZVN0cmluZyB0eXBlXG5mdW5jdGlvbiBTYWZlU3RyaW5nKHN0cmluZykge1xuICB0aGlzLnN0cmluZyA9IHN0cmluZztcbn1cblxuU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAnJyArIHRoaXMuc3RyaW5nO1xufTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gU2FmZVN0cmluZztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZXh0ZW5kID0gZXh0ZW5kO1xuXG4vLyBPbGRlciBJRSB2ZXJzaW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBpbmRleE9mIHNvIHdlIG11c3QgaW1wbGVtZW50IG91ciBvd24sIHNhZGx5LlxuZXhwb3J0cy5pbmRleE9mID0gaW5kZXhPZjtcbmV4cG9ydHMuZXNjYXBlRXhwcmVzc2lvbiA9IGVzY2FwZUV4cHJlc3Npb247XG5leHBvcnRzLmlzRW1wdHkgPSBpc0VtcHR5O1xuZXhwb3J0cy5ibG9ja1BhcmFtcyA9IGJsb2NrUGFyYW1zO1xuZXhwb3J0cy5hcHBlbmRDb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoO1xudmFyIGVzY2FwZSA9IHtcbiAgJyYnOiAnJmFtcDsnLFxuICAnPCc6ICcmbHQ7JyxcbiAgJz4nOiAnJmd0OycsXG4gICdcIic6ICcmcXVvdDsnLFxuICAnXFwnJzogJyYjeDI3OycsXG4gICdgJzogJyYjeDYwOydcbn07XG5cbnZhciBiYWRDaGFycyA9IC9bJjw+XCInYF0vZyxcbiAgICBwb3NzaWJsZSA9IC9bJjw+XCInYF0vO1xuXG5mdW5jdGlvbiBlc2NhcGVDaGFyKGNocikge1xuICByZXR1cm4gZXNjYXBlW2Nocl07XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChvYmogLyogLCAuLi5zb3VyY2UgKi8pIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gYXJndW1lbnRzW2ldKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFyZ3VtZW50c1tpXSwga2V5KSkge1xuICAgICAgICBvYmpba2V5XSA9IGFyZ3VtZW50c1tpXVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmV4cG9ydHMudG9TdHJpbmcgPSB0b1N0cmluZztcbi8vIFNvdXJjZWQgZnJvbSBsb2Rhc2hcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZXN0aWVqcy9sb2Rhc2gvYmxvYi9tYXN0ZXIvTElDRU5TRS50eHRcbi8qZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSwgbm8tdmFyICovXG52YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn07XG4vLyBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmlcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5pZiAoaXNGdW5jdGlvbigveC8pKSB7XG4gIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICB9O1xufVxudmFyIGlzRnVuY3Rpb247XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuLyplc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUsIG5vLXZhciAqL1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7XG59O2V4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUV4cHJlc3Npb24oc3RyaW5nKSB7XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIC8vIGRvbid0IGVzY2FwZSBTYWZlU3RyaW5ncywgc2luY2UgdGhleSdyZSBhbHJlYWR5IHNhZmVcbiAgICBpZiAoc3RyaW5nICYmIHN0cmluZy50b0hUTUwpIHtcbiAgICAgIHJldHVybiBzdHJpbmcudG9IVE1MKCk7XG4gICAgfSBlbHNlIGlmIChzdHJpbmcgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gZWxzZSBpZiAoIXN0cmluZykge1xuICAgICAgcmV0dXJuIHN0cmluZyArICcnO1xuICAgIH1cblxuICAgIC8vIEZvcmNlIGEgc3RyaW5nIGNvbnZlcnNpb24gYXMgdGhpcyB3aWxsIGJlIGRvbmUgYnkgdGhlIGFwcGVuZCByZWdhcmRsZXNzIGFuZFxuICAgIC8vIHRoZSByZWdleCB0ZXN0IHdpbGwgZG8gdGhpcyB0cmFuc3BhcmVudGx5IGJlaGluZCB0aGUgc2NlbmVzLCBjYXVzaW5nIGlzc3VlcyBpZlxuICAgIC8vIGFuIG9iamVjdCdzIHRvIHN0cmluZyBoYXMgZXNjYXBlZCBjaGFyYWN0ZXJzIGluIGl0LlxuICAgIHN0cmluZyA9ICcnICsgc3RyaW5nO1xuICB9XG5cbiAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nO1xuICB9XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSAmJiB2YWx1ZSAhPT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBibG9ja1BhcmFtcyhwYXJhbXMsIGlkcykge1xuICBwYXJhbXMucGF0aCA9IGlkcztcbiAgcmV0dXJuIHBhcmFtcztcbn1cblxuZnVuY3Rpb24gYXBwZW5kQ29udGV4dFBhdGgoY29udGV4dFBhdGgsIGlkKSB7XG4gIHJldHVybiAoY29udGV4dFBhdGggPyBjb250ZXh0UGF0aCArICcuJyA6ICcnKSArIGlkO1xufSIsIi8vIFVTQUdFOlxuLy8gdmFyIGhhbmRsZWJhcnMgPSByZXF1aXJlKCdoYW5kbGViYXJzJyk7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cblxuLy8gdmFyIGxvY2FsID0gaGFuZGxlYmFycy5jcmVhdGUoKTtcblxudmFyIGhhbmRsZWJhcnMgPSByZXF1aXJlKCcuLi9kaXN0L2Nqcy9oYW5kbGViYXJzJylbJ2RlZmF1bHQnXTtcblxudmFyIHByaW50ZXIgPSByZXF1aXJlKCcuLi9kaXN0L2Nqcy9oYW5kbGViYXJzL2NvbXBpbGVyL3ByaW50ZXInKTtcbmhhbmRsZWJhcnMuUHJpbnRWaXNpdG9yID0gcHJpbnRlci5QcmludFZpc2l0b3I7XG5oYW5kbGViYXJzLnByaW50ID0gcHJpbnRlci5wcmludDtcblxubW9kdWxlLmV4cG9ydHMgPSBoYW5kbGViYXJzO1xuXG4vLyBQdWJsaXNoIGEgTm9kZS5qcyByZXF1aXJlKCkgaGFuZGxlciBmb3IgLmhhbmRsZWJhcnMgYW5kIC5oYnMgZmlsZXNcbmZ1bmN0aW9uIGV4dGVuc2lvbihtb2R1bGUsIGZpbGVuYW1lKSB7XG4gIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gIHZhciB0ZW1wbGF0ZVN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwgJ3V0ZjgnKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSBoYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGVTdHJpbmcpO1xufVxuLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbmlmICh0eXBlb2YgcmVxdWlyZSAhPT0gJ3VuZGVmaW5lZCcgJiYgcmVxdWlyZS5leHRlbnNpb25zKSB7XG4gIHJlcXVpcmUuZXh0ZW5zaW9uc1snLmhhbmRsZWJhcnMnXSA9IGV4dGVuc2lvbjtcbiAgcmVxdWlyZS5leHRlbnNpb25zWycuaGJzJ10gPSBleHRlbnNpb247XG59XG4iLCIoZnVuY3Rpb24gKHByb2Nlc3MsX19maWxlbmFtZSl7XG4vKiogdmltOiBldDp0cz00OnN3PTQ6c3RzPTRcbiAqIEBsaWNlbnNlIGFtZGVmaW5lIDEuMC4xIENvcHlyaWdodCAoYykgMjAxMS0yMDE2LCBUaGUgRG9qbyBGb3VuZGF0aW9uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBBdmFpbGFibGUgdmlhIHRoZSBNSVQgb3IgbmV3IEJTRCBsaWNlbnNlLlxuICogc2VlOiBodHRwOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL2FtZGVmaW5lIGZvciBkZXRhaWxzXG4gKi9cblxuLypqc2xpbnQgbm9kZTogdHJ1ZSAqL1xuLypnbG9iYWwgbW9kdWxlLCBwcm9jZXNzICovXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlZmluZSBmb3Igbm9kZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBtb2R1bGUgdGhlIFwibW9kdWxlXCIgb2JqZWN0IHRoYXQgaXMgZGVmaW5lZCBieSBOb2RlIGZvciB0aGVcbiAqIGN1cnJlbnQgbW9kdWxlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3JlcXVpcmVGbl0uIE5vZGUncyByZXF1aXJlIGZ1bmN0aW9uIGZvciB0aGUgY3VycmVudCBtb2R1bGUuXG4gKiBJdCBvbmx5IG5lZWRzIHRvIGJlIHBhc3NlZCBpbiBOb2RlIHZlcnNpb25zIGJlZm9yZSAwLjUsIHdoZW4gbW9kdWxlLnJlcXVpcmVcbiAqIGRpZCBub3QgZXhpc3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGEgZGVmaW5lIGZ1bmN0aW9uIHRoYXQgaXMgdXNhYmxlIGZvciB0aGUgY3VycmVudCBub2RlXG4gKiBtb2R1bGUuXG4gKi9cbmZ1bmN0aW9uIGFtZGVmaW5lKG1vZHVsZSwgcmVxdWlyZUZuKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHZhciBkZWZpbmVDYWNoZSA9IHt9LFxuICAgICAgICBsb2FkZXJDYWNoZSA9IHt9LFxuICAgICAgICBhbHJlYWR5Q2FsbGVkID0gZmFsc2UsXG4gICAgICAgIHBhdGggPSByZXF1aXJlKCdwYXRoJyksXG4gICAgICAgIG1ha2VSZXF1aXJlLCBzdHJpbmdSZXF1aXJlO1xuXG4gICAgLyoqXG4gICAgICogVHJpbXMgdGhlIC4gYW5kIC4uIGZyb20gYW4gYXJyYXkgb2YgcGF0aCBzZWdtZW50cy5cbiAgICAgKiBJdCB3aWxsIGtlZXAgYSBsZWFkaW5nIHBhdGggc2VnbWVudCBpZiBhIC4uIHdpbGwgYmVjb21lXG4gICAgICogdGhlIGZpcnN0IHBhdGggc2VnbWVudCwgdG8gaGVscCB3aXRoIG1vZHVsZSBuYW1lIGxvb2t1cHMsXG4gICAgICogd2hpY2ggYWN0IGxpa2UgcGF0aHMsIGJ1dCBjYW4gYmUgcmVtYXBwZWQuIEJ1dCB0aGUgZW5kIHJlc3VsdCxcbiAgICAgKiBhbGwgcGF0aHMgdGhhdCB1c2UgdGhpcyBmdW5jdGlvbiBzaG91bGQgbG9vayBub3JtYWxpemVkLlxuICAgICAqIE5PVEU6IHRoaXMgbWV0aG9kIE1PRElGSUVTIHRoZSBpbnB1dCBhcnJheS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnkgdGhlIGFycmF5IG9mIHBhdGggc2VnbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbURvdHMoYXJ5KSB7XG4gICAgICAgIHZhciBpLCBwYXJ0O1xuICAgICAgICBmb3IgKGkgPSAwOyBhcnlbaV07IGkrPSAxKSB7XG4gICAgICAgICAgICBwYXJ0ID0gYXJ5W2ldO1xuICAgICAgICAgICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgICAgICAgICAgIGFyeS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDEgJiYgKGFyeVsyXSA9PT0gJy4uJyB8fCBhcnlbMF0gPT09ICcuLicpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vRW5kIG9mIHRoZSBsaW5lLiBLZWVwIGF0IGxlYXN0IG9uZSBub24tZG90XG4gICAgICAgICAgICAgICAgICAgIC8vcGF0aCBzZWdtZW50IGF0IHRoZSBmcm9udCBzbyBpdCBjYW4gYmUgbWFwcGVkXG4gICAgICAgICAgICAgICAgICAgIC8vY29ycmVjdGx5IHRvIGRpc2suIE90aGVyd2lzZSwgdGhlcmUgaXMgbGlrZWx5XG4gICAgICAgICAgICAgICAgICAgIC8vbm8gcGF0aCBtYXBwaW5nIGZvciBhIHBhdGggc3RhcnRpbmcgd2l0aCAnLi4nLlxuICAgICAgICAgICAgICAgICAgICAvL1RoaXMgY2FuIHN0aWxsIGZhaWwsIGJ1dCBjYXRjaGVzIHRoZSBtb3N0IHJlYXNvbmFibGVcbiAgICAgICAgICAgICAgICAgICAgLy91c2VzIG9mIC4uXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYXJ5LnNwbGljZShpIC0gMSwgMik7XG4gICAgICAgICAgICAgICAgICAgIGkgLT0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemUobmFtZSwgYmFzZU5hbWUpIHtcbiAgICAgICAgdmFyIGJhc2VQYXJ0cztcblxuICAgICAgICAvL0FkanVzdCBhbnkgcmVsYXRpdmUgcGF0aHMuXG4gICAgICAgIGlmIChuYW1lICYmIG5hbWUuY2hhckF0KDApID09PSAnLicpIHtcbiAgICAgICAgICAgIC8vSWYgaGF2ZSBhIGJhc2UgbmFtZSwgdHJ5IHRvIG5vcm1hbGl6ZSBhZ2FpbnN0IGl0LFxuICAgICAgICAgICAgLy9vdGhlcndpc2UsIGFzc3VtZSBpdCBpcyBhIHRvcC1sZXZlbCByZXF1aXJlIHRoYXQgd2lsbFxuICAgICAgICAgICAgLy9iZSByZWxhdGl2ZSB0byBiYXNlVXJsIGluIHRoZSBlbmQuXG4gICAgICAgICAgICBpZiAoYmFzZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBiYXNlUGFydHMgPSBiYXNlTmFtZS5zcGxpdCgnLycpO1xuICAgICAgICAgICAgICAgIGJhc2VQYXJ0cyA9IGJhc2VQYXJ0cy5zbGljZSgwLCBiYXNlUGFydHMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgYmFzZVBhcnRzID0gYmFzZVBhcnRzLmNvbmNhdChuYW1lLnNwbGl0KCcvJykpO1xuICAgICAgICAgICAgICAgIHRyaW1Eb3RzKGJhc2VQYXJ0cyk7XG4gICAgICAgICAgICAgICAgbmFtZSA9IGJhc2VQYXJ0cy5qb2luKCcvJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgdGhlIG5vcm1hbGl6ZSgpIGZ1bmN0aW9uIHBhc3NlZCB0byBhIGxvYWRlciBwbHVnaW4nc1xuICAgICAqIG5vcm1hbGl6ZSBtZXRob2QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFrZU5vcm1hbGl6ZShyZWxOYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShuYW1lLCByZWxOYW1lKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlTG9hZChpZCkge1xuICAgICAgICBmdW5jdGlvbiBsb2FkKHZhbHVlKSB7XG4gICAgICAgICAgICBsb2FkZXJDYWNoZVtpZF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvYWQuZnJvbVRleHQgPSBmdW5jdGlvbiAoaWQsIHRleHQpIHtcbiAgICAgICAgICAgIC8vVGhpcyBvbmUgaXMgZGlmZmljdWx0IGJlY2F1c2UgdGhlIHRleHQgY2FuL3Byb2JhYmx5IHVzZXNcbiAgICAgICAgICAgIC8vZGVmaW5lLCBhbmQgYW55IHJlbGF0aXZlIHBhdGhzIGFuZCByZXF1aXJlcyBzaG91bGQgYmUgcmVsYXRpdmVcbiAgICAgICAgICAgIC8vdG8gdGhhdCBpZCB3YXMgaXQgd291bGQgYmUgZm91bmQgb24gZGlzay4gQnV0IHRoaXMgd291bGQgcmVxdWlyZVxuICAgICAgICAgICAgLy9ib290c3RyYXBwaW5nIGEgbW9kdWxlL3JlcXVpcmUgZmFpcmx5IGRlZXBseSBmcm9tIG5vZGUgY29yZS5cbiAgICAgICAgICAgIC8vTm90IHN1cmUgaG93IGJlc3QgdG8gZ28gYWJvdXQgdGhhdCB5ZXQuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FtZGVmaW5lIGRvZXMgbm90IGltcGxlbWVudCBsb2FkLmZyb21UZXh0Jyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGxvYWQ7XG4gICAgfVxuXG4gICAgbWFrZVJlcXVpcmUgPSBmdW5jdGlvbiAoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCByZWxJZCkge1xuICAgICAgICBmdW5jdGlvbiBhbWRSZXF1aXJlKGRlcHMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGRlcHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgLy9TeW5jaHJvbm91cywgc2luZ2xlIG1vZHVsZSByZXF1aXJlKCcnKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdSZXF1aXJlKHN5c3RlbVJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSwgZGVwcywgcmVsSWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL0FycmF5IG9mIGRlcGVuZGVuY2llcyB3aXRoIGEgY2FsbGJhY2suXG5cbiAgICAgICAgICAgICAgICAvL0NvbnZlcnQgdGhlIGRlcGVuZGVuY2llcyB0byBtb2R1bGVzLlxuICAgICAgICAgICAgICAgIGRlcHMgPSBkZXBzLm1hcChmdW5jdGlvbiAoZGVwTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nUmVxdWlyZShzeXN0ZW1SZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUsIGRlcE5hbWUsIHJlbElkKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vV2FpdCBmb3IgbmV4dCB0aWNrIHRvIGNhbGwgYmFjayB0aGUgcmVxdWlyZSBjYWxsLlxuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhbWRSZXF1aXJlLnRvVXJsID0gZnVuY3Rpb24gKGZpbGVQYXRoKSB7XG4gICAgICAgICAgICBpZiAoZmlsZVBhdGguaW5kZXhPZignLicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShmaWxlUGF0aCwgcGF0aC5kaXJuYW1lKG1vZHVsZS5maWxlbmFtZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGFtZFJlcXVpcmU7XG4gICAgfTtcblxuICAgIC8vRmF2b3IgZXhwbGljaXQgdmFsdWUsIHBhc3NlZCBpbiBpZiB0aGUgbW9kdWxlIHdhbnRzIHRvIHN1cHBvcnQgTm9kZSAwLjQuXG4gICAgcmVxdWlyZUZuID0gcmVxdWlyZUZuIHx8IGZ1bmN0aW9uIHJlcSgpIHtcbiAgICAgICAgcmV0dXJuIG1vZHVsZS5yZXF1aXJlLmFwcGx5KG1vZHVsZSwgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcnVuRmFjdG9yeShpZCwgZGVwcywgZmFjdG9yeSkge1xuICAgICAgICB2YXIgciwgZSwgbSwgcmVzdWx0O1xuXG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgZSA9IGxvYWRlckNhY2hlW2lkXSA9IHt9O1xuICAgICAgICAgICAgbSA9IHtcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgdXJpOiBfX2ZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIGV4cG9ydHM6IGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByID0gbWFrZVJlcXVpcmUocmVxdWlyZUZuLCBlLCBtLCBpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL09ubHkgc3VwcG9ydCBvbmUgZGVmaW5lIGNhbGwgcGVyIGZpbGVcbiAgICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbWRlZmluZSB3aXRoIG5vIG1vZHVsZSBJRCBjYW5ub3QgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIHBlciBmaWxlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vVXNlIHRoZSByZWFsIHZhcmlhYmxlcyBmcm9tIG5vZGVcbiAgICAgICAgICAgIC8vVXNlIG1vZHVsZS5leHBvcnRzIGZvciBleHBvcnRzLCBzaW5jZVxuICAgICAgICAgICAgLy90aGUgZXhwb3J0cyBpbiBoZXJlIGlzIGFtZGVmaW5lIGV4cG9ydHMuXG4gICAgICAgICAgICBlID0gbW9kdWxlLmV4cG9ydHM7XG4gICAgICAgICAgICBtID0gbW9kdWxlO1xuICAgICAgICAgICAgciA9IG1ha2VSZXF1aXJlKHJlcXVpcmVGbiwgZSwgbSwgbW9kdWxlLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vSWYgdGhlcmUgYXJlIGRlcGVuZGVuY2llcywgdGhleSBhcmUgc3RyaW5ncywgc28gbmVlZFxuICAgICAgICAvL3RvIGNvbnZlcnQgdGhlbSB0byBkZXBlbmRlbmN5IHZhbHVlcy5cbiAgICAgICAgaWYgKGRlcHMpIHtcbiAgICAgICAgICAgIGRlcHMgPSBkZXBzLm1hcChmdW5jdGlvbiAoZGVwTmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByKGRlcE5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL0NhbGwgdGhlIGZhY3Rvcnkgd2l0aCB0aGUgcmlnaHQgZGVwZW5kZW5jaWVzLlxuICAgICAgICBpZiAodHlwZW9mIGZhY3RvcnkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZhY3RvcnkuYXBwbHkobS5leHBvcnRzLCBkZXBzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZhY3Rvcnk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG0uZXhwb3J0cyA9IHJlc3VsdDtcbiAgICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgICAgIGxvYWRlckNhY2hlW2lkXSA9IG0uZXhwb3J0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0cmluZ1JlcXVpcmUgPSBmdW5jdGlvbiAoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCBpZCwgcmVsSWQpIHtcbiAgICAgICAgLy9TcGxpdCB0aGUgSUQgYnkgYSAhIHNvIHRoYXRcbiAgICAgICAgdmFyIGluZGV4ID0gaWQuaW5kZXhPZignIScpLFxuICAgICAgICAgICAgb3JpZ2luYWxJZCA9IGlkLFxuICAgICAgICAgICAgcHJlZml4LCBwbHVnaW47XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgaWQgPSBub3JtYWxpemUoaWQsIHJlbElkKTtcblxuICAgICAgICAgICAgLy9TdHJhaWdodCBtb2R1bGUgbG9va3VwLiBJZiBpdCBpcyBvbmUgb2YgdGhlIHNwZWNpYWwgZGVwZW5kZW5jaWVzLFxuICAgICAgICAgICAgLy9kZWFsIHdpdGggaXQsIG90aGVyd2lzZSwgZGVsZWdhdGUgdG8gbm9kZS5cbiAgICAgICAgICAgIGlmIChpZCA9PT0gJ3JlcXVpcmUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VSZXF1aXJlKHN5c3RlbVJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSwgcmVsSWQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PT0gJ2V4cG9ydHMnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHM7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlkID09PSAnbW9kdWxlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxvYWRlckNhY2hlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2FkZXJDYWNoZVtpZF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRlZmluZUNhY2hlW2lkXSkge1xuICAgICAgICAgICAgICAgIHJ1bkZhY3RvcnkuYXBwbHkobnVsbCwgZGVmaW5lQ2FjaGVbaWRdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyQ2FjaGVbaWRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZihzeXN0ZW1SZXF1aXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzeXN0ZW1SZXF1aXJlKG9yaWdpbmFsSWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gbW9kdWxlIHdpdGggSUQ6ICcgKyBpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UaGVyZSBpcyBhIHBsdWdpbiBpbiBwbGF5LlxuICAgICAgICAgICAgcHJlZml4ID0gaWQuc3Vic3RyaW5nKDAsIGluZGV4KTtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKGluZGV4ICsgMSwgaWQubGVuZ3RoKTtcblxuICAgICAgICAgICAgcGx1Z2luID0gc3RyaW5nUmVxdWlyZShzeXN0ZW1SZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUsIHByZWZpeCwgcmVsSWQpO1xuXG4gICAgICAgICAgICBpZiAocGx1Z2luLm5vcm1hbGl6ZSkge1xuICAgICAgICAgICAgICAgIGlkID0gcGx1Z2luLm5vcm1hbGl6ZShpZCwgbWFrZU5vcm1hbGl6ZShyZWxJZCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL05vcm1hbGl6ZSB0aGUgSUQgbm9ybWFsbHkuXG4gICAgICAgICAgICAgICAgaWQgPSBub3JtYWxpemUoaWQsIHJlbElkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxvYWRlckNhY2hlW2lkXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2FkZXJDYWNoZVtpZF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBsdWdpbi5sb2FkKGlkLCBtYWtlUmVxdWlyZShzeXN0ZW1SZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUsIHJlbElkKSwgbWFrZUxvYWQoaWQpLCB7fSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyQ2FjaGVbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vQ3JlYXRlIGEgZGVmaW5lIGZ1bmN0aW9uIHNwZWNpZmljIHRvIHRoZSBtb2R1bGUgYXNraW5nIGZvciBhbWRlZmluZS5cbiAgICBmdW5jdGlvbiBkZWZpbmUoaWQsIGRlcHMsIGZhY3RvcnkpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgICAgICAgICBmYWN0b3J5ID0gZGVwcztcbiAgICAgICAgICAgIGRlcHMgPSBpZDtcbiAgICAgICAgICAgIGlkID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZhY3RvcnkgPSBpZDtcbiAgICAgICAgICAgIGlkID0gZGVwcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZXBzICYmICFBcnJheS5pc0FycmF5KGRlcHMpKSB7XG4gICAgICAgICAgICBmYWN0b3J5ID0gZGVwcztcbiAgICAgICAgICAgIGRlcHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRlcHMpIHtcbiAgICAgICAgICAgIGRlcHMgPSBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vU2V0IHVwIHByb3BlcnRpZXMgZm9yIHRoaXMgbW9kdWxlLiBJZiBhbiBJRCwgdGhlbiB1c2VcbiAgICAgICAgLy9pbnRlcm5hbCBjYWNoZS4gSWYgbm8gSUQsIHRoZW4gdXNlIHRoZSBleHRlcm5hbCB2YXJpYWJsZXNcbiAgICAgICAgLy9mb3IgdGhpcyBub2RlIG1vZHVsZS5cbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAvL1B1dCB0aGUgbW9kdWxlIGluIGRlZXAgZnJlZXplIHVudGlsIHRoZXJlIGlzIGFcbiAgICAgICAgICAgIC8vcmVxdWlyZSBjYWxsIGZvciBpdC5cbiAgICAgICAgICAgIGRlZmluZUNhY2hlW2lkXSA9IFtpZCwgZGVwcywgZmFjdG9yeV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW5GYWN0b3J5KGlkLCBkZXBzLCBmYWN0b3J5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vZGVmaW5lLnJlcXVpcmUsIHdoaWNoIGhhcyBhY2Nlc3MgdG8gYWxsIHRoZSB2YWx1ZXMgaW4gdGhlXG4gICAgLy9jYWNoZS4gVXNlZnVsIGZvciBBTUQgbW9kdWxlcyB0aGF0IGFsbCBoYXZlIElEcyBpbiB0aGUgZmlsZSxcbiAgICAvL2J1dCBuZWVkIHRvIGZpbmFsbHkgZXhwb3J0IGEgdmFsdWUgdG8gbm9kZSBiYXNlZCBvbiBvbmUgb2YgdGhvc2VcbiAgICAvL0lEcy5cbiAgICBkZWZpbmUucmVxdWlyZSA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICBpZiAobG9hZGVyQ2FjaGVbaWRdKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9hZGVyQ2FjaGVbaWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlZmluZUNhY2hlW2lkXSkge1xuICAgICAgICAgICAgcnVuRmFjdG9yeS5hcHBseShudWxsLCBkZWZpbmVDYWNoZVtpZF0pO1xuICAgICAgICAgICAgcmV0dXJuIGxvYWRlckNhY2hlW2lkXTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBkZWZpbmUuYW1kID0ge307XG5cbiAgICByZXR1cm4gZGVmaW5lO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFtZGVmaW5lO1xuXG59KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSxcIi8uLlxcXFwuLlxcXFxub2RlX21vZHVsZXNcXFxcYW1kZWZpbmVcXFxcYW1kZWZpbmUuanNcIilcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDI1dlpHVmZiVzlrZFd4bGN5OWhiV1JsWm1sdVpTOWhiV1JsWm1sdVpTNXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lPMEZCUVVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTSXNJbVpwYkdVaU9pSm5aVzVsY21GMFpXUXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHlvcUlIWnBiVG9nWlhRNmRITTlORHB6ZHowME9uTjBjejAwWEc0Z0tpQkFiR2xqWlc1elpTQmhiV1JsWm1sdVpTQXhMakF1TVNCRGIzQjVjbWxuYUhRZ0tHTXBJREl3TVRFdE1qQXhOaXdnVkdobElFUnZhbThnUm05MWJtUmhkR2x2YmlCQmJHd2dVbWxuYUhSeklGSmxjMlZ5ZG1Wa0xseHVJQ29nUVhaaGFXeGhZbXhsSUhacFlTQjBhR1VnVFVsVUlHOXlJRzVsZHlCQ1UwUWdiR2xqWlc1elpTNWNiaUFxSUhObFpUb2dhSFIwY0RvdkwyZHBkR2gxWWk1amIyMHZhbkppZFhKclpTOWhiV1JsWm1sdVpTQm1iM0lnWkdWMFlXbHNjMXh1SUNvdlhHNWNiaThxYW5Oc2FXNTBJRzV2WkdVNklIUnlkV1VnS2k5Y2JpOHFaMnh2WW1Gc0lHMXZaSFZzWlN3Z2NISnZZMlZ6Y3lBcUwxeHVKM1Z6WlNCemRISnBZM1FuTzF4dVhHNHZLaXBjYmlBcUlFTnlaV0YwWlhNZ1lTQmtaV1pwYm1VZ1ptOXlJRzV2WkdVdVhHNGdLaUJBY0dGeVlXMGdlMDlpYW1WamRIMGdiVzlrZFd4bElIUm9aU0JjSW0xdlpIVnNaVndpSUc5aWFtVmpkQ0IwYUdGMElHbHpJR1JsWm1sdVpXUWdZbmtnVG05a1pTQm1iM0lnZEdobFhHNGdLaUJqZFhKeVpXNTBJRzF2WkhWc1pTNWNiaUFxSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUZ0eVpYRjFhWEpsUm01ZExpQk9iMlJsSjNNZ2NtVnhkV2x5WlNCbWRXNWpkR2x2YmlCbWIzSWdkR2hsSUdOMWNuSmxiblFnYlc5a2RXeGxMbHh1SUNvZ1NYUWdiMjVzZVNCdVpXVmtjeUIwYnlCaVpTQndZWE56WldRZ2FXNGdUbTlrWlNCMlpYSnphVzl1Y3lCaVpXWnZjbVVnTUM0MUxDQjNhR1Z1SUcxdlpIVnNaUzV5WlhGMWFYSmxYRzRnS2lCa2FXUWdibTkwSUdWNGFYTjBMbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UwWjFibU4wYVc5dWZTQmhJR1JsWm1sdVpTQm1kVzVqZEdsdmJpQjBhR0YwSUdseklIVnpZV0pzWlNCbWIzSWdkR2hsSUdOMWNuSmxiblFnYm05a1pWeHVJQ29nYlc5a2RXeGxMbHh1SUNvdlhHNW1kVzVqZEdsdmJpQmhiV1JsWm1sdVpTaHRiMlIxYkdVc0lISmxjWFZwY21WR2Jpa2dlMXh1SUNBZ0lDZDFjMlVnYzNSeWFXTjBKenRjYmlBZ0lDQjJZWElnWkdWbWFXNWxRMkZqYUdVZ1BTQjdmU3hjYmlBZ0lDQWdJQ0FnYkc5aFpHVnlRMkZqYUdVZ1BTQjdmU3hjYmlBZ0lDQWdJQ0FnWVd4eVpXRmtlVU5oYkd4bFpDQTlJR1poYkhObExGeHVJQ0FnSUNBZ0lDQndZWFJvSUQwZ2NtVnhkV2x5WlNnbmNHRjBhQ2NwTEZ4dUlDQWdJQ0FnSUNCdFlXdGxVbVZ4ZFdseVpTd2djM1J5YVc1blVtVnhkV2x5WlR0Y2JseHVJQ0FnSUM4cUtseHVJQ0FnSUNBcUlGUnlhVzF6SUhSb1pTQXVJR0Z1WkNBdUxpQm1jbTl0SUdGdUlHRnljbUY1SUc5bUlIQmhkR2dnYzJWbmJXVnVkSE11WEc0Z0lDQWdJQ29nU1hRZ2QybHNiQ0JyWldWd0lHRWdiR1ZoWkdsdVp5QndZWFJvSUhObFoyMWxiblFnYVdZZ1lTQXVMaUIzYVd4c0lHSmxZMjl0WlZ4dUlDQWdJQ0FxSUhSb1pTQm1hWEp6ZENCd1lYUm9JSE5sWjIxbGJuUXNJSFJ2SUdobGJIQWdkMmwwYUNCdGIyUjFiR1VnYm1GdFpTQnNiMjlyZFhCekxGeHVJQ0FnSUNBcUlIZG9hV05vSUdGamRDQnNhV3RsSUhCaGRHaHpMQ0JpZFhRZ1kyRnVJR0psSUhKbGJXRndjR1ZrTGlCQ2RYUWdkR2hsSUdWdVpDQnlaWE4xYkhRc1hHNGdJQ0FnSUNvZ1lXeHNJSEJoZEdoeklIUm9ZWFFnZFhObElIUm9hWE1nWm5WdVkzUnBiMjRnYzJodmRXeGtJR3h2YjJzZ2JtOXliV0ZzYVhwbFpDNWNiaUFnSUNBZ0tpQk9UMVJGT2lCMGFHbHpJRzFsZEdodlpDQk5UMFJKUmtsRlV5QjBhR1VnYVc1d2RYUWdZWEp5WVhrdVhHNGdJQ0FnSUNvZ1FIQmhjbUZ0SUh0QmNuSmhlWDBnWVhKNUlIUm9aU0JoY25KaGVTQnZaaUJ3WVhSb0lITmxaMjFsYm5SekxseHVJQ0FnSUNBcUwxeHVJQ0FnSUdaMWJtTjBhVzl1SUhSeWFXMUViM1J6S0dGeWVTa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2FTd2djR0Z5ZER0Y2JpQWdJQ0FnSUNBZ1ptOXlJQ2hwSUQwZ01Ec2dZWEo1VzJsZE95QnBLejBnTVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY0dGeWRDQTlJR0Z5ZVZ0cFhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHdZWEowSUQwOVBTQW5MaWNwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaGNua3VjM0JzYVdObEtHa3NJREVwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdrZ0xUMGdNVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9jR0Z5ZENBOVBUMGdKeTR1SnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hwSUQwOVBTQXhJQ1ltSUNoaGNubGJNbDBnUFQwOUlDY3VMaWNnZkh3Z1lYSjVXekJkSUQwOVBTQW5MaTRuS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2TDBWdVpDQnZaaUIwYUdVZ2JHbHVaUzRnUzJWbGNDQmhkQ0JzWldGemRDQnZibVVnYm05dUxXUnZkRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkwzQmhkR2dnYzJWbmJXVnVkQ0JoZENCMGFHVWdabkp2Ym5RZ2MyOGdhWFFnWTJGdUlHSmxJRzFoY0hCbFpGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2TDJOdmNuSmxZM1JzZVNCMGJ5QmthWE5yTGlCUGRHaGxjbmRwYzJVc0lIUm9aWEpsSUdseklHeHBhMlZzZVZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMMjV2SUhCaGRHZ2diV0Z3Y0dsdVp5Qm1iM0lnWVNCd1lYUm9JSE4wWVhKMGFXNW5JSGRwZEdnZ0p5NHVKeTVjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OVVhR2x6SUdOaGJpQnpkR2xzYkNCbVlXbHNMQ0JpZFhRZ1kyRjBZMmhsY3lCMGFHVWdiVzl6ZENCeVpXRnpiMjVoWW14bFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2ZFhObGN5QnZaaUF1TGx4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmljbVZoYXp0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHa2dQaUF3S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0Z5ZVM1emNHeHBZMlVvYVNBdElERXNJRElwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBJQzA5SURJN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnYm05eWJXRnNhWHBsS0c1aGJXVXNJR0poYzJWT1lXMWxLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQmlZWE5sVUdGeWRITTdYRzVjYmlBZ0lDQWdJQ0FnTHk5QlpHcDFjM1FnWVc1NUlISmxiR0YwYVhabElIQmhkR2h6TGx4dUlDQWdJQ0FnSUNCcFppQW9ibUZ0WlNBbUppQnVZVzFsTG1Ob1lYSkJkQ2d3S1NBOVBUMGdKeTRuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0F2TDBsbUlHaGhkbVVnWVNCaVlYTmxJRzVoYldVc0lIUnllU0IwYnlCdWIzSnRZV3hwZW1VZ1lXZGhhVzV6ZENCcGRDeGNiaUFnSUNBZ0lDQWdJQ0FnSUM4dmIzUm9aWEozYVhObExDQmhjM04xYldVZ2FYUWdhWE1nWVNCMGIzQXRiR1YyWld3Z2NtVnhkV2x5WlNCMGFHRjBJSGRwYkd4Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2WW1VZ2NtVnNZWFJwZG1VZ2RHOGdZbUZ6WlZWeWJDQnBiaUIwYUdVZ1pXNWtMbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR0poYzJWT1lXMWxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWW1GelpWQmhjblJ6SUQwZ1ltRnpaVTVoYldVdWMzQnNhWFFvSnk4bktUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlZWE5sVUdGeWRITWdQU0JpWVhObFVHRnlkSE11YzJ4cFkyVW9NQ3dnWW1GelpWQmhjblJ6TG14bGJtZDBhQ0F0SURFcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhjMlZRWVhKMGN5QTlJR0poYzJWUVlYSjBjeTVqYjI1allYUW9ibUZ0WlM1emNHeHBkQ2duTHljcEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBjbWx0Ukc5MGN5aGlZWE5sVUdGeWRITXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzVoYldVZ1BTQmlZWE5sVUdGeWRITXVhbTlwYmlnbkx5Y3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRzVoYldVN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnTHlvcVhHNGdJQ0FnSUNvZ1EzSmxZWFJsSUhSb1pTQnViM0p0WVd4cGVtVW9LU0JtZFc1amRHbHZiaUJ3WVhOelpXUWdkRzhnWVNCc2IyRmtaWElnY0d4MVoybHVKM05jYmlBZ0lDQWdLaUJ1YjNKdFlXeHBlbVVnYldWMGFHOWtMbHh1SUNBZ0lDQXFMMXh1SUNBZ0lHWjFibU4wYVc5dUlHMWhhMlZPYjNKdFlXeHBlbVVvY21Wc1RtRnRaU2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWm5WdVkzUnBiMjRnS0c1aGJXVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCdWIzSnRZV3hwZW1Vb2JtRnRaU3dnY21Wc1RtRnRaU2s3WEc0Z0lDQWdJQ0FnSUgwN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnYldGclpVeHZZV1FvYVdRcElIdGNiaUFnSUNBZ0lDQWdablZ1WTNScGIyNGdiRzloWkNoMllXeDFaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdiRzloWkdWeVEyRmphR1ZiYVdSZElEMGdkbUZzZFdVN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0JzYjJGa0xtWnliMjFVWlhoMElEMGdablZ1WTNScGIyNGdLR2xrTENCMFpYaDBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMMVJvYVhNZ2IyNWxJR2x6SUdScFptWnBZM1ZzZENCaVpXTmhkWE5sSUhSb1pTQjBaWGgwSUdOaGJpOXdjbTlpWVdKc2VTQjFjMlZ6WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMMlJsWm1sdVpTd2dZVzVrSUdGdWVTQnlaV3hoZEdsMlpTQndZWFJvY3lCaGJtUWdjbVZ4ZFdseVpYTWdjMmh2ZFd4a0lHSmxJSEpsYkdGMGFYWmxYRzRnSUNBZ0lDQWdJQ0FnSUNBdkwzUnZJSFJvWVhRZ2FXUWdkMkZ6SUdsMElIZHZkV3hrSUdKbElHWnZkVzVrSUc5dUlHUnBjMnN1SUVKMWRDQjBhR2x6SUhkdmRXeGtJSEpsY1hWcGNtVmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dlltOXZkSE4wY21Gd2NHbHVaeUJoSUcxdlpIVnNaUzl5WlhGMWFYSmxJR1poYVhKc2VTQmtaV1Z3YkhrZ1puSnZiU0J1YjJSbElHTnZjbVV1WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMMDV2ZENCemRYSmxJR2h2ZHlCaVpYTjBJSFJ2SUdkdklHRmliM1YwSUhSb1lYUWdlV1YwTGx4dUlDQWdJQ0FnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZGhiV1JsWm1sdVpTQmtiMlZ6SUc1dmRDQnBiWEJzWlcxbGJuUWdiRzloWkM1bWNtOXRWR1Y0ZENjcE8xeHVJQ0FnSUNBZ0lDQjlPMXh1WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJzYjJGa08xeHVJQ0FnSUgxY2JseHVJQ0FnSUcxaGEyVlNaWEYxYVhKbElEMGdablZ1WTNScGIyNGdLSE41YzNSbGJWSmxjWFZwY21Vc0lHVjRjRzl5ZEhNc0lHMXZaSFZzWlN3Z2NtVnNTV1FwSUh0Y2JpQWdJQ0FnSUNBZ1puVnVZM1JwYjI0Z1lXMWtVbVZ4ZFdseVpTaGtaWEJ6TENCallXeHNZbUZqYXlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUjVjR1Z2WmlCa1pYQnpJRDA5UFNBbmMzUnlhVzVuSnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZVM2x1WTJoeWIyNXZkWE1zSUhOcGJtZHNaU0J0YjJSMWJHVWdjbVZ4ZFdseVpTZ25KeWxjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjM1J5YVc1blVtVnhkV2x5WlNoemVYTjBaVzFTWlhGMWFYSmxMQ0JsZUhCdmNuUnpMQ0J0YjJSMWJHVXNJR1JsY0hNc0lISmxiRWxrS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeTlCY25KaGVTQnZaaUJrWlhCbGJtUmxibU5wWlhNZ2QybDBhQ0JoSUdOaGJHeGlZV05yTGx4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OURiMjUyWlhKMElIUm9aU0JrWlhCbGJtUmxibU5wWlhNZ2RHOGdiVzlrZFd4bGN5NWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtaWEJ6SUQwZ1pHVndjeTV0WVhBb1puVnVZM1JwYjI0Z0tHUmxjRTVoYldVcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSE4wY21sdVoxSmxjWFZwY21Vb2MzbHpkR1Z0VW1WeGRXbHlaU3dnWlhod2IzSjBjeXdnYlc5a2RXeGxMQ0JrWlhCT1lXMWxMQ0J5Wld4SlpDazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU2s3WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkwxZGhhWFFnWm05eUlHNWxlSFFnZEdsamF5QjBieUJqWVd4c0lHSmhZMnNnZEdobElISmxjWFZwY21VZ1kyRnNiQzVjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1kyRnNiR0poWTJzcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0hKdlkyVnpjeTV1WlhoMFZHbGpheWhtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCallXeHNZbUZqYXk1aGNIQnNlU2h1ZFd4c0xDQmtaWEJ6S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ1lXMWtVbVZ4ZFdseVpTNTBiMVZ5YkNBOUlHWjFibU4wYVc5dUlDaG1hV3hsVUdGMGFDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1pwYkdWUVlYUm9MbWx1WkdWNFQyWW9KeTRuS1NBOVBUMGdNQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ1YjNKdFlXeHBlbVVvWm1sc1pWQmhkR2dzSUhCaGRHZ3VaR2x5Ym1GdFpTaHRiMlIxYkdVdVptbHNaVzVoYldVcEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR1pwYkdWUVlYUm9PMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlPMXh1WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJoYldSU1pYRjFhWEpsTzF4dUlDQWdJSDA3WEc1Y2JpQWdJQ0F2TDBaaGRtOXlJR1Y0Y0d4cFkybDBJSFpoYkhWbExDQndZWE56WldRZ2FXNGdhV1lnZEdobElHMXZaSFZzWlNCM1lXNTBjeUIwYnlCemRYQndiM0owSUU1dlpHVWdNQzQwTGx4dUlDQWdJSEpsY1hWcGNtVkdiaUE5SUhKbGNYVnBjbVZHYmlCOGZDQm1kVzVqZEdsdmJpQnlaWEVvS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCdGIyUjFiR1V1Y21WeGRXbHlaUzVoY0hCc2VTaHRiMlIxYkdVc0lHRnlaM1Z0Wlc1MGN5azdYRzRnSUNBZ2ZUdGNibHh1SUNBZ0lHWjFibU4wYVc5dUlISjFia1poWTNSdmNua29hV1FzSUdSbGNITXNJR1poWTNSdmNua3BJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlISXNJR1VzSUcwc0lISmxjM1ZzZER0Y2JseHVJQ0FnSUNBZ0lDQnBaaUFvYVdRcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdVZ1BTQnNiMkZrWlhKRFlXTm9aVnRwWkYwZ1BTQjdmVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHMGdQU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdRNklHbGtMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFZ5YVRvZ1gxOW1hV3hsYm1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxlSEJ2Y25Sek9pQmxYRzRnSUNBZ0lDQWdJQ0FnSUNCOU8xeHVJQ0FnSUNBZ0lDQWdJQ0FnY2lBOUlHMWhhMlZTWlhGMWFYSmxLSEpsY1hWcGNtVkdiaXdnWlN3Z2JTd2dhV1FwTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdMeTlQYm14NUlITjFjSEJ2Y25RZ2IyNWxJR1JsWm1sdVpTQmpZV3hzSUhCbGNpQm1hV3hsWEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWVd4eVpXRmtlVU5oYkd4bFpDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpZ25ZVzFrWldacGJtVWdkMmwwYUNCdWJ5QnRiMlIxYkdVZ1NVUWdZMkZ1Ym05MElHSmxJR05oYkd4bFpDQnRiM0psSUhSb1lXNGdiMjVqWlNCd1pYSWdabWxzWlM0bktUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJR0ZzY21WaFpIbERZV3hzWldRZ1BTQjBjblZsTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2TDFWelpTQjBhR1VnY21WaGJDQjJZWEpwWVdKc1pYTWdabkp2YlNCdWIyUmxYRzRnSUNBZ0lDQWdJQ0FnSUNBdkwxVnpaU0J0YjJSMWJHVXVaWGh3YjNKMGN5Qm1iM0lnWlhod2IzSjBjeXdnYzJsdVkyVmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dmRHaGxJR1Y0Y0c5eWRITWdhVzRnYUdWeVpTQnBjeUJoYldSbFptbHVaU0JsZUhCdmNuUnpMbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pTQTlJRzF2WkhWc1pTNWxlSEJ2Y25Sek8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYlNBOUlHMXZaSFZzWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSElnUFNCdFlXdGxVbVZ4ZFdseVpTaHlaWEYxYVhKbFJtNHNJR1VzSUcwc0lHMXZaSFZzWlM1cFpDazdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNBdkwwbG1JSFJvWlhKbElHRnlaU0JrWlhCbGJtUmxibU5wWlhNc0lIUm9aWGtnWVhKbElITjBjbWx1WjNNc0lITnZJRzVsWldSY2JpQWdJQ0FnSUNBZ0x5OTBieUJqYjI1MlpYSjBJSFJvWlcwZ2RHOGdaR1Z3Wlc1a1pXNWplU0IyWVd4MVpYTXVYRzRnSUNBZ0lDQWdJR2xtSUNoa1pYQnpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaWEJ6SUQwZ1pHVndjeTV0WVhBb1puVnVZM1JwYjI0Z0tHUmxjRTVoYldVcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NpaGtaWEJPWVcxbEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnTHk5RFlXeHNJSFJvWlNCbVlXTjBiM0o1SUhkcGRHZ2dkR2hsSUhKcFoyaDBJR1JsY0dWdVpHVnVZMmxsY3k1Y2JpQWdJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQm1ZV04wYjNKNUlEMDlQU0FuWm5WdVkzUnBiMjRuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0JtWVdOMGIzSjVMbUZ3Y0d4NUtHMHVaWGh3YjNKMGN5d2daR1Z3Y3lrN1hHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0JtWVdOMGIzSjVPMXh1SUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ2FXWWdLSEpsYzNWc2RDQWhQVDBnZFc1a1pXWnBibVZrS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J0TG1WNGNHOXlkSE1nUFNCeVpYTjFiSFE3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVdRcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNiMkZrWlhKRFlXTm9aVnRwWkYwZ1BTQnRMbVY0Y0c5eWRITTdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCemRISnBibWRTWlhGMWFYSmxJRDBnWm5WdVkzUnBiMjRnS0hONWMzUmxiVkpsY1hWcGNtVXNJR1Y0Y0c5eWRITXNJRzF2WkhWc1pTd2dhV1FzSUhKbGJFbGtLU0I3WEc0Z0lDQWdJQ0FnSUM4dlUzQnNhWFFnZEdobElFbEVJR0o1SUdFZ0lTQnpieUIwYUdGMFhHNGdJQ0FnSUNBZ0lIWmhjaUJwYm1SbGVDQTlJR2xrTG1sdVpHVjRUMllvSnlFbktTeGNiaUFnSUNBZ0lDQWdJQ0FnSUc5eWFXZHBibUZzU1dRZ1BTQnBaQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lIQnlaV1pwZUN3Z2NHeDFaMmx1TzF4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2hwYm1SbGVDQTlQVDBnTFRFcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsa0lEMGdibTl5YldGc2FYcGxLR2xrTENCeVpXeEpaQ2s3WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2VTNSeVlXbG5hSFFnYlc5a2RXeGxJR3h2YjJ0MWNDNGdTV1lnYVhRZ2FYTWdiMjVsSUc5bUlIUm9aU0J6Y0dWamFXRnNJR1JsY0dWdVpHVnVZMmxsY3l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2WkdWaGJDQjNhWFJvSUdsMExDQnZkR2hsY25kcGMyVXNJR1JsYkdWbllYUmxJSFJ2SUc1dlpHVXVYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hV1FnUFQwOUlDZHlaWEYxYVhKbEp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnRZV3RsVW1WeGRXbHlaU2h6ZVhOMFpXMVNaWEYxYVhKbExDQmxlSEJ2Y25SekxDQnRiMlIxYkdVc0lISmxiRWxrS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvYVdRZ1BUMDlJQ2RsZUhCdmNuUnpKeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJsZUhCdmNuUnpPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaHBaQ0E5UFQwZ0oyMXZaSFZzWlNjcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2JXOWtkV3hsTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2hzYjJGa1pYSkRZV05vWlM1b1lYTlBkMjVRY205d1pYSjBlU2hwWkNrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2JHOWhaR1Z5UTJGamFHVmJhV1JkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2hrWldacGJtVkRZV05vWlZ0cFpGMHBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5ZFc1R1lXTjBiM0o1TG1Gd2NHeDVLRzUxYkd3c0lHUmxabWx1WlVOaFkyaGxXMmxrWFNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUd4dllXUmxja05oWTJobFcybGtYVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWW9jM2x6ZEdWdFVtVnhkV2x5WlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjM2x6ZEdWdFVtVnhkV2x5WlNodmNtbG5hVzVoYkVsa0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9KMDV2SUcxdlpIVnNaU0IzYVhSb0lFbEVPaUFuSUNzZ2FXUXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUM4dlZHaGxjbVVnYVhNZ1lTQndiSFZuYVc0Z2FXNGdjR3hoZVM1Y2JpQWdJQ0FnSUNBZ0lDQWdJSEJ5WldacGVDQTlJR2xrTG5OMVluTjBjbWx1Wnlnd0xDQnBibVJsZUNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlHbGtMbk4xWW5OMGNtbHVaeWhwYm1SbGVDQXJJREVzSUdsa0xteGxibWQwYUNrN1hHNWNiaUFnSUNBZ0lDQWdJQ0FnSUhCc2RXZHBiaUE5SUhOMGNtbHVaMUpsY1hWcGNtVW9jM2x6ZEdWdFVtVnhkV2x5WlN3Z1pYaHdiM0owY3l3Z2JXOWtkV3hsTENCd2NtVm1hWGdzSUhKbGJFbGtLVHRjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hCc2RXZHBiaTV1YjNKdFlXeHBlbVVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFpDQTlJSEJzZFdkcGJpNXViM0p0WVd4cGVtVW9hV1FzSUcxaGEyVk9iM0p0WVd4cGVtVW9jbVZzU1dRcEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk5T2IzSnRZV3hwZW1VZ2RHaGxJRWxFSUc1dmNtMWhiR3g1TGx4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsa0lEMGdibTl5YldGc2FYcGxLR2xrTENCeVpXeEpaQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hzYjJGa1pYSkRZV05vWlZ0cFpGMHBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdiRzloWkdWeVEyRmphR1ZiYVdSZE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J3YkhWbmFXNHViRzloWkNocFpDd2diV0ZyWlZKbGNYVnBjbVVvYzNsemRHVnRVbVZ4ZFdseVpTd2daWGh3YjNKMGN5d2diVzlrZFd4bExDQnlaV3hKWkNrc0lHMWhhMlZNYjJGa0tHbGtLU3dnZTMwcE8xeHVYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHeHZZV1JsY2tOaFkyaGxXMmxrWFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJSDA3WEc1Y2JpQWdJQ0F2TDBOeVpXRjBaU0JoSUdSbFptbHVaU0JtZFc1amRHbHZiaUJ6Y0dWamFXWnBZeUIwYnlCMGFHVWdiVzlrZFd4bElHRnphMmx1WnlCbWIzSWdZVzFrWldacGJtVXVYRzRnSUNBZ1puVnVZM1JwYjI0Z1pHVm1hVzVsS0dsa0xDQmtaWEJ6TENCbVlXTjBiM0o1S1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hCY25KaGVTNXBjMEZ5Y21GNUtHbGtLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdabUZqZEc5eWVTQTlJR1JsY0hNN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JrWlhCeklEMGdhV1E3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaQ0E5SUhWdVpHVm1hVzVsWkR0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaDBlWEJsYjJZZ2FXUWdJVDA5SUNkemRISnBibWNuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JtWVdOMGIzSjVJRDBnYVdRN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlHUmxjSE1nUFNCMWJtUmxabWx1WldRN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0JwWmlBb1pHVndjeUFtSmlBaFFYSnlZWGt1YVhOQmNuSmhlU2hrWlhCektTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1ptRmpkRzl5ZVNBOUlHUmxjSE03WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaWEJ6SUQwZ2RXNWtaV1pwYm1Wa08xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnYVdZZ0tDRmtaWEJ6S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JrWlhCeklEMGdXeWR5WlhGMWFYSmxKeXdnSjJWNGNHOXlkSE1uTENBbmJXOWtkV3hsSjEwN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0F2TDFObGRDQjFjQ0J3Y205d1pYSjBhV1Z6SUdadmNpQjBhR2x6SUcxdlpIVnNaUzRnU1dZZ1lXNGdTVVFzSUhSb1pXNGdkWE5sWEc0Z0lDQWdJQ0FnSUM4dmFXNTBaWEp1WVd3Z1kyRmphR1V1SUVsbUlHNXZJRWxFTENCMGFHVnVJSFZ6WlNCMGFHVWdaWGgwWlhKdVlXd2dkbUZ5YVdGaWJHVnpYRzRnSUNBZ0lDQWdJQzh2Wm05eUlIUm9hWE1nYm05a1pTQnRiMlIxYkdVdVhHNGdJQ0FnSUNBZ0lHbG1JQ2hwWkNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnTHk5UWRYUWdkR2hsSUcxdlpIVnNaU0JwYmlCa1pXVndJR1p5WldWNlpTQjFiblJwYkNCMGFHVnlaU0JwY3lCaFhHNGdJQ0FnSUNBZ0lDQWdJQ0F2TDNKbGNYVnBjbVVnWTJGc2JDQm1iM0lnYVhRdVhHNGdJQ0FnSUNBZ0lDQWdJQ0JrWldacGJtVkRZV05vWlZ0cFpGMGdQU0JiYVdRc0lHUmxjSE1zSUdaaFkzUnZjbmxkTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjblZ1Um1GamRHOXllU2hwWkN3Z1pHVndjeXdnWm1GamRHOXllU2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2TDJSbFptbHVaUzV5WlhGMWFYSmxMQ0IzYUdsamFDQm9ZWE1nWVdOalpYTnpJSFJ2SUdGc2JDQjBhR1VnZG1Gc2RXVnpJR2x1SUhSb1pWeHVJQ0FnSUM4dlkyRmphR1V1SUZWelpXWjFiQ0JtYjNJZ1FVMUVJRzF2WkhWc1pYTWdkR2hoZENCaGJHd2dhR0YyWlNCSlJITWdhVzRnZEdobElHWnBiR1VzWEc0Z0lDQWdMeTlpZFhRZ2JtVmxaQ0IwYnlCbWFXNWhiR3g1SUdWNGNHOXlkQ0JoSUhaaGJIVmxJSFJ2SUc1dlpHVWdZbUZ6WldRZ2IyNGdiMjVsSUc5bUlIUm9iM05sWEc0Z0lDQWdMeTlKUkhNdVhHNGdJQ0FnWkdWbWFXNWxMbkpsY1hWcGNtVWdQU0JtZFc1amRHbHZiaUFvYVdRcElIdGNiaUFnSUNBZ0lDQWdhV1lnS0d4dllXUmxja05oWTJobFcybGtYU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHeHZZV1JsY2tOaFkyaGxXMmxrWFR0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJR2xtSUNoa1pXWnBibVZEWVdOb1pWdHBaRjBwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEoxYmtaaFkzUnZjbmt1WVhCd2JIa29iblZzYkN3Z1pHVm1hVzVsUTJGamFHVmJhV1JkS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnNiMkZrWlhKRFlXTm9aVnRwWkYwN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNCOU8xeHVYRzRnSUNBZ1pHVm1hVzVsTG1GdFpDQTlJSHQ5TzF4dVhHNGdJQ0FnY21WMGRYSnVJR1JsWm1sdVpUdGNibjFjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCaGJXUmxabWx1WlR0Y2JpSmRmUT09IixudWxsLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcblxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IHRydWU7XG4gICAgdmFyIGN1cnJlbnRRdWV1ZTtcbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgdmFyIGkgPSAtMTtcbiAgICAgICAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgICAgICAgICAgY3VycmVudFF1ZXVlW2ldKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xufVxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICBxdWV1ZS5wdXNoKGZ1bik7XG4gICAgaWYgKCFkcmFpbmluZykge1xuICAgICAgICBzZXRUaW1lb3V0KGRyYWluUXVldWUsIDApO1xuICAgIH1cbn07XG5cbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG4vLyBUT0RPKHNodHlsbWFuKVxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiKGZ1bmN0aW9uIChwcm9jZXNzLGdsb2JhbCl7XG4vKiFcbiAqIEBvdmVydmlldyBlczYtcHJvbWlzZSAtIGEgdGlueSBpbXBsZW1lbnRhdGlvbiBvZiBQcm9taXNlcy9BKy5cbiAqIEBjb3B5cmlnaHQgQ29weXJpZ2h0IChjKSAyMDE0IFllaHVkYSBLYXR6LCBUb20gRGFsZSwgU3RlZmFuIFBlbm5lciBhbmQgY29udHJpYnV0b3JzIChDb252ZXJzaW9uIHRvIEVTNiBBUEkgYnkgSmFrZSBBcmNoaWJhbGQpXG4gKiBAbGljZW5zZSAgIExpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlXG4gKiAgICAgICAgICAgIFNlZSBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vamFrZWFyY2hpYmFsZC9lczYtcHJvbWlzZS9tYXN0ZXIvTElDRU5TRVxuICogQHZlcnNpb24gICAyLjMuMFxuICovXG5cbihmdW5jdGlvbigpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkdXRpbHMkJG9iamVjdE9yRnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nIHx8ICh0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzTWF5YmVUaGVuYWJsZSh4KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnICYmIHggIT09IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkX2lzQXJyYXk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkdXRpbHMkJF9pc0FycmF5ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzQXJyYXkgPSBsaWIkZXM2JHByb21pc2UkdXRpbHMkJF9pc0FycmF5O1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuID0gMDtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR2ZXJ0eE5leHQ7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRjdXN0b21TY2hlZHVsZXJGbjtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcCA9IGZ1bmN0aW9uIGFzYXAoY2FsbGJhY2ssIGFyZykge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2xpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW5dID0gY2FsbGJhY2s7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiArIDFdID0gYXJnO1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiArPSAyO1xuICAgICAgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gPT09IDIpIHtcbiAgICAgICAgLy8gSWYgbGVuIGlzIDIsIHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGFzeW5jIGZsdXNoLlxuICAgICAgICAvLyBJZiBhZGRpdGlvbmFsIGNhbGxiYWNrcyBhcmUgcXVldWVkIGJlZm9yZSB0aGUgcXVldWUgaXMgZmx1c2hlZCwgdGhleVxuICAgICAgICAvLyB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGlzIGZsdXNoIHRoYXQgd2UgYXJlIHNjaGVkdWxpbmcuXG4gICAgICAgIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm4pIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm4obGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHNldFNjaGVkdWxlcihzY2hlZHVsZUZuKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm4gPSBzY2hlZHVsZUZuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRBc2FwKGFzYXBGbikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAgPSBhc2FwRm47XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyV2luZG93ID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJHbG9iYWwgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3NlcldpbmRvdyB8fCB7fTtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJHbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3Nlckdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkaXNOb2RlID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHt9LnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJztcblxuICAgIC8vIHRlc3QgZm9yIHdlYiB3b3JrZXIgYnV0IG5vdCBpbiBJRTEwXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRpc1dvcmtlciA9IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiBpbXBvcnRTY3JpcHRzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJztcblxuICAgIC8vIG5vZGVcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTmV4dFRpY2soKSB7XG4gICAgICB2YXIgbmV4dFRpY2sgPSBwcm9jZXNzLm5leHRUaWNrO1xuICAgICAgLy8gbm9kZSB2ZXJzaW9uIDAuMTAueCBkaXNwbGF5cyBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgd2hlbiBuZXh0VGljayBpcyB1c2VkIHJlY3Vyc2l2ZWx5XG4gICAgICAvLyBzZXRJbW1lZGlhdGUgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBpbnN0ZWFkXG4gICAgICB2YXIgdmVyc2lvbiA9IHByb2Nlc3MudmVyc2lvbnMubm9kZS5tYXRjaCgvXig/OihcXGQrKVxcLik/KD86KFxcZCspXFwuKT8oXFwqfFxcZCspJC8pO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmVyc2lvbikgJiYgdmVyc2lvblsxXSA9PT0gJzAnICYmIHZlcnNpb25bMl0gPT09ICcxMCcpIHtcbiAgICAgICAgbmV4dFRpY2sgPSBzZXRJbW1lZGlhdGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIG5leHRUaWNrKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHZlcnR4XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVZlcnR4VGltZXIoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR2ZXJ0eE5leHQobGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU11dGF0aW9uT2JzZXJ2ZXIoKSB7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgbGliJGVzNiRwcm9taXNlJGFzYXAkJEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIG5vZGUuZGF0YSA9IChpdGVyYXRpb25zID0gKytpdGVyYXRpb25zICUgMik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHdlYiB3b3JrZXJcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTWVzc2FnZUNoYW5uZWwoKSB7XG4gICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2g7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKDApO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlU2V0VGltZW91dCgpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgc2V0VGltZW91dChsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gsIDEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlID0gbmV3IEFycmF5KDEwMDApO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbjsgaSs9Mikge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbaV07XG4gICAgICAgIHZhciBhcmcgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbaSsxXTtcblxuICAgICAgICBjYWxsYmFjayhhcmcpO1xuXG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2krMV0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gPSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhdHRlbXB0VmVydGV4KCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHIgPSByZXF1aXJlO1xuICAgICAgICB2YXIgdmVydHggPSByKCd2ZXJ0eCcpO1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkdmVydHhOZXh0ID0gdmVydHgucnVuT25Mb29wIHx8IHZlcnR4LnJ1bk9uQ29udGV4dDtcbiAgICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VWZXJ0eFRpbWVyKCk7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VTZXRUaW1lb3V0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoO1xuICAgIC8vIERlY2lkZSB3aGF0IGFzeW5jIG1ldGhvZCB0byB1c2UgdG8gdHJpZ2dlcmluZyBwcm9jZXNzaW5nIG9mIHF1ZXVlZCBjYWxsYmFja3M6XG4gICAgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRpc05vZGUpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU5leHRUaWNrKCk7XG4gICAgfSBlbHNlIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU11dGF0aW9uT2JzZXJ2ZXIoKTtcbiAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRpc1dvcmtlcikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTWVzc2FnZUNoYW5uZWwoKTtcbiAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyV2luZG93ID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGF0dGVtcHRWZXJ0ZXgoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlU2V0VGltZW91dCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3AoKSB7fVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcgICA9IHZvaWQgMDtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEID0gMTtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQgID0gMjtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUiA9IG5ldyBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRFcnJvck9iamVjdCgpO1xuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc2VsZkZ1bGxmaWxsbWVudCgpIHtcbiAgICAgIHJldHVybiBuZXcgVHlwZUVycm9yKFwiWW91IGNhbm5vdCByZXNvbHZlIGEgcHJvbWlzZSB3aXRoIGl0c2VsZlwiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRjYW5ub3RSZXR1cm5Pd24oKSB7XG4gICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcignQSBwcm9taXNlcyBjYWxsYmFjayBjYW5ub3QgcmV0dXJuIHRoYXQgc2FtZSBwcm9taXNlLicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGdldFRoZW4ocHJvbWlzZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbjtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHRyeVRoZW4odGhlbiwgdmFsdWUsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZUZvcmVpZ25UaGVuYWJsZShwcm9taXNlLCB0aGVuYWJsZSwgdGhlbikge1xuICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwKGZ1bmN0aW9uKHByb21pc2UpIHtcbiAgICAgICAgdmFyIHNlYWxlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgZXJyb3IgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlUaGVuKHRoZW4sIHRoZW5hYmxlLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIGlmIChzZWFsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgc2VhbGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAodGhlbmFibGUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICBpZiAoc2VhbGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIHNlYWxlZCA9IHRydWU7XG5cbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgICAgfSwgJ1NldHRsZTogJyArIChwcm9taXNlLl9sYWJlbCB8fCAnIHVua25vd24gcHJvbWlzZScpKTtcblxuICAgICAgICBpZiAoIXNlYWxlZCAmJiBlcnJvcikge1xuICAgICAgICAgIHNlYWxlZCA9IHRydWU7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSwgcHJvbWlzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlT3duVGhlbmFibGUocHJvbWlzZSwgdGhlbmFibGUpIHtcbiAgICAgIGlmICh0aGVuYWJsZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHRoZW5hYmxlLl9yZXN1bHQpO1xuICAgICAgfSBlbHNlIGlmICh0aGVuYWJsZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZSh0aGVuYWJsZSwgdW5kZWZpbmVkLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlKSB7XG4gICAgICBpZiAobWF5YmVUaGVuYWJsZS5jb25zdHJ1Y3RvciA9PT0gcHJvbWlzZS5jb25zdHJ1Y3Rvcikge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVPd25UaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0aGVuID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZ2V0VGhlbihtYXliZVRoZW5hYmxlKTtcblxuICAgICAgICBpZiAodGhlbiA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IuZXJyb3IpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKHRoZW4pKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlRm9yZWlnblRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUsIHRoZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKSB7XG4gICAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHNlbGZGdWxsZmlsbG1lbnQoKSk7XG4gICAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSR1dGlscyQkb2JqZWN0T3JGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoUmVqZWN0aW9uKHByb21pc2UpIHtcbiAgICAgIGlmIChwcm9taXNlLl9vbmVycm9yKSB7XG4gICAgICAgIHByb21pc2UuX29uZXJyb3IocHJvbWlzZS5fcmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaChwcm9taXNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKSB7XG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHsgcmV0dXJuOyB9XG5cbiAgICAgIHByb21pc2UuX3Jlc3VsdCA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fc3RhdGUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQ7XG5cbiAgICAgIGlmIChwcm9taXNlLl9zdWJzY3JpYmVycy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaCwgcHJvbWlzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbikge1xuICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7IHJldHVybjsgfVxuICAgICAgcHJvbWlzZS5fc3RhdGUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRDtcbiAgICAgIHByb21pc2UuX3Jlc3VsdCA9IHJlYXNvbjtcblxuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaFJlamVjdGlvbiwgcHJvbWlzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHBhcmVudCwgY2hpbGQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKSB7XG4gICAgICB2YXIgc3Vic2NyaWJlcnMgPSBwYXJlbnQuX3N1YnNjcmliZXJzO1xuICAgICAgdmFyIGxlbmd0aCA9IHN1YnNjcmliZXJzLmxlbmd0aDtcblxuICAgICAgcGFyZW50Ll9vbmVycm9yID0gbnVsbDtcblxuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoXSA9IGNoaWxkO1xuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoICsgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEXSA9IG9uRnVsZmlsbG1lbnQ7XG4gICAgICBzdWJzY3JpYmVyc1tsZW5ndGggKyBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRF0gID0gb25SZWplY3Rpb247XG5cbiAgICAgIGlmIChsZW5ndGggPT09IDAgJiYgcGFyZW50Ll9zdGF0ZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoLCBwYXJlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2gocHJvbWlzZSkge1xuICAgICAgdmFyIHN1YnNjcmliZXJzID0gcHJvbWlzZS5fc3Vic2NyaWJlcnM7XG4gICAgICB2YXIgc2V0dGxlZCA9IHByb21pc2UuX3N0YXRlO1xuXG4gICAgICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuXG4gICAgICB2YXIgY2hpbGQsIGNhbGxiYWNrLCBkZXRhaWwgPSBwcm9taXNlLl9yZXN1bHQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgY2hpbGQgPSBzdWJzY3JpYmVyc1tpXTtcbiAgICAgICAgY2FsbGJhY2sgPSBzdWJzY3JpYmVyc1tpICsgc2V0dGxlZF07XG5cbiAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW52b2tlQ2FsbGJhY2soc2V0dGxlZCwgY2hpbGQsIGNhbGxiYWNrLCBkZXRhaWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKGRldGFpbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRFcnJvck9iamVjdCgpIHtcbiAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1IgPSBuZXcgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRXJyb3JPYmplY3QoKTtcblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHRyeUNhdGNoKGNhbGxiYWNrLCBkZXRhaWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhkZXRhaWwpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUi5lcnJvciA9IGU7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW52b2tlQ2FsbGJhY2soc2V0dGxlZCwgcHJvbWlzZSwgY2FsbGJhY2ssIGRldGFpbCkge1xuICAgICAgdmFyIGhhc0NhbGxiYWNrID0gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKGNhbGxiYWNrKSxcbiAgICAgICAgICB2YWx1ZSwgZXJyb3IsIHN1Y2NlZWRlZCwgZmFpbGVkO1xuXG4gICAgICBpZiAoaGFzQ2FsbGJhY2spIHtcbiAgICAgICAgdmFsdWUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlDYXRjaChjYWxsYmFjaywgZGV0YWlsKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUikge1xuICAgICAgICAgIGZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgZXJyb3IgPSB2YWx1ZS5lcnJvcjtcbiAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRjYW5ub3RSZXR1cm5Pd24oKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZGV0YWlsO1xuICAgICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgLy8gbm9vcFxuICAgICAgfSBlbHNlIGlmIChoYXNDYWxsYmFjayAmJiBzdWNjZWVkZWQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGZhaWxlZCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgICAgfSBlbHNlIGlmIChzZXR0bGVkID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNldHRsZWQgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW5pdGlhbGl6ZVByb21pc2UocHJvbWlzZSwgcmVzb2x2ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmVyKGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHZhbHVlKXtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gcmVqZWN0UHJvbWlzZShyZWFzb24pIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yKENvbnN0cnVjdG9yLCBpbnB1dCkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuXG4gICAgICBlbnVtZXJhdG9yLl9pbnN0YW5jZUNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgICBlbnVtZXJhdG9yLnByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG5cbiAgICAgIGlmIChlbnVtZXJhdG9yLl92YWxpZGF0ZUlucHV0KGlucHV0KSkge1xuICAgICAgICBlbnVtZXJhdG9yLl9pbnB1dCAgICAgPSBpbnB1dDtcbiAgICAgICAgZW51bWVyYXRvci5sZW5ndGggICAgID0gaW5wdXQubGVuZ3RoO1xuICAgICAgICBlbnVtZXJhdG9yLl9yZW1haW5pbmcgPSBpbnB1dC5sZW5ndGg7XG5cbiAgICAgICAgZW51bWVyYXRvci5faW5pdCgpO1xuXG4gICAgICAgIGlmIChlbnVtZXJhdG9yLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwoZW51bWVyYXRvci5wcm9taXNlLCBlbnVtZXJhdG9yLl9yZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudW1lcmF0b3IubGVuZ3RoID0gZW51bWVyYXRvci5sZW5ndGggfHwgMDtcbiAgICAgICAgICBlbnVtZXJhdG9yLl9lbnVtZXJhdGUoKTtcbiAgICAgICAgICBpZiAoZW51bWVyYXRvci5fcmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKGVudW1lcmF0b3IucHJvbWlzZSwgZW51bWVyYXRvci5fcmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChlbnVtZXJhdG9yLnByb21pc2UsIGVudW1lcmF0b3IuX3ZhbGlkYXRpb25FcnJvcigpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlSW5wdXQgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNBcnJheShpbnB1dCk7XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGlvbkVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdBcnJheSBNZXRob2RzIG11c3QgYmUgcHJvdmlkZWQgYW4gQXJyYXknKTtcbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLl9yZXN1bHQgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIH07XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvcjtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fZW51bWVyYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG5cbiAgICAgIHZhciBsZW5ndGggID0gZW51bWVyYXRvci5sZW5ndGg7XG4gICAgICB2YXIgcHJvbWlzZSA9IGVudW1lcmF0b3IucHJvbWlzZTtcbiAgICAgIHZhciBpbnB1dCAgID0gZW51bWVyYXRvci5faW5wdXQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBwcm9taXNlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORyAmJiBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZW51bWVyYXRvci5fZWFjaEVudHJ5KGlucHV0W2ldLCBpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9lYWNoRW50cnkgPSBmdW5jdGlvbihlbnRyeSwgaSkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuICAgICAgdmFyIGMgPSBlbnVtZXJhdG9yLl9pbnN0YW5jZUNvbnN0cnVjdG9yO1xuXG4gICAgICBpZiAobGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc01heWJlVGhlbmFibGUoZW50cnkpKSB7XG4gICAgICAgIGlmIChlbnRyeS5jb25zdHJ1Y3RvciA9PT0gYyAmJiBlbnRyeS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgICBlbnRyeS5fb25lcnJvciA9IG51bGw7XG4gICAgICAgICAgZW51bWVyYXRvci5fc2V0dGxlZEF0KGVudHJ5Ll9zdGF0ZSwgaSwgZW50cnkuX3Jlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW51bWVyYXRvci5fd2lsbFNldHRsZUF0KGMucmVzb2x2ZShlbnRyeSksIGkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnVtZXJhdG9yLl9yZW1haW5pbmctLTtcbiAgICAgICAgZW51bWVyYXRvci5fcmVzdWx0W2ldID0gZW50cnk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fc2V0dGxlZEF0ID0gZnVuY3Rpb24oc3RhdGUsIGksIHZhbHVlKSB7XG4gICAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG4gICAgICB2YXIgcHJvbWlzZSA9IGVudW1lcmF0b3IucHJvbWlzZTtcblxuICAgICAgaWYgKHByb21pc2UuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7XG4gICAgICAgIGVudW1lcmF0b3IuX3JlbWFpbmluZy0tO1xuXG4gICAgICAgIGlmIChzdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudW1lcmF0b3IuX3Jlc3VsdFtpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnVtZXJhdG9yLl9yZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCBlbnVtZXJhdG9yLl9yZXN1bHQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3dpbGxTZXR0bGVBdCA9IGZ1bmN0aW9uKHByb21pc2UsIGkpIHtcbiAgICAgIHZhciBlbnVtZXJhdG9yID0gdGhpcztcblxuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHByb21pc2UsIHVuZGVmaW5lZCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgZW51bWVyYXRvci5fc2V0dGxlZEF0KGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRCwgaSwgdmFsdWUpO1xuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIGVudW1lcmF0b3IuX3NldHRsZWRBdChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCwgaSwgcmVhc29uKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRhbGwoZW50cmllcykge1xuICAgICAgcmV0dXJuIG5ldyBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkZGVmYXVsdCh0aGlzLCBlbnRyaWVzKS5wcm9taXNlO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRhbGw7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmFjZSQkcmFjZShlbnRyaWVzKSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICAgICAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG5cbiAgICAgIGlmICghbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0FycmF5KGVudHJpZXMpKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBwYXNzIGFuIGFycmF5IHRvIHJhY2UuJykpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICBmdW5jdGlvbiBvbkZ1bGZpbGxtZW50KHZhbHVlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvblJlamVjdGlvbihyZWFzb24pIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBwcm9taXNlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORyAmJiBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKENvbnN0cnVjdG9yLnJlc29sdmUoZW50cmllc1tpXSksIHVuZGVmaW5lZCwgb25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJhY2UkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyYWNlJCRyYWNlO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJHJlc29sdmUob2JqZWN0KSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICAgICAgaWYgKG9iamVjdCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QuY29uc3RydWN0b3IgPT09IENvbnN0cnVjdG9yKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCBvYmplY3QpO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVzb2x2ZSQkcmVzb2x2ZTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZWplY3QkJHJlamVjdChyZWFzb24pIHtcbiAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG4gICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRyZWplY3Q7XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGNvdW50ZXIgPSAwO1xuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzUmVzb2x2ZXIoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBwYXNzIGEgcmVzb2x2ZXIgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBwcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzTmV3KCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZTtcbiAgICAvKipcbiAgICAgIFByb21pc2Ugb2JqZWN0cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJlc3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGVcbiAgICAgIHByaW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRob2QsIHdoaWNoXG4gICAgICByZWdpc3RlcnMgY2FsbGJhY2tzIHRvIHJlY2VpdmUgZWl0aGVyIGEgcHJvbWlzZSdzIGV2ZW50dWFsIHZhbHVlIG9yIHRoZSByZWFzb25cbiAgICAgIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gICAgICBUZXJtaW5vbG9neVxuICAgICAgLS0tLS0tLS0tLS1cblxuICAgICAgLSBgcHJvbWlzZWAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHdpdGggYSBgdGhlbmAgbWV0aG9kIHdob3NlIGJlaGF2aW9yIGNvbmZvcm1zIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi5cbiAgICAgIC0gYHRoZW5hYmxlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGEgYHRoZW5gIG1ldGhvZC5cbiAgICAgIC0gYHZhbHVlYCBpcyBhbnkgbGVnYWwgSmF2YVNjcmlwdCB2YWx1ZSAoaW5jbHVkaW5nIHVuZGVmaW5lZCwgYSB0aGVuYWJsZSwgb3IgYSBwcm9taXNlKS5cbiAgICAgIC0gYGV4Y2VwdGlvbmAgaXMgYSB2YWx1ZSB0aGF0IGlzIHRocm93biB1c2luZyB0aGUgdGhyb3cgc3RhdGVtZW50LlxuICAgICAgLSBgcmVhc29uYCBpcyBhIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHdoeSBhIHByb21pc2Ugd2FzIHJlamVjdGVkLlxuICAgICAgLSBgc2V0dGxlZGAgdGhlIGZpbmFsIHJlc3Rpbmcgc3RhdGUgb2YgYSBwcm9taXNlLCBmdWxmaWxsZWQgb3IgcmVqZWN0ZWQuXG5cbiAgICAgIEEgcHJvbWlzZSBjYW4gYmUgaW4gb25lIG9mIHRocmVlIHN0YXRlczogcGVuZGluZywgZnVsZmlsbGVkLCBvciByZWplY3RlZC5cblxuICAgICAgUHJvbWlzZXMgdGhhdCBhcmUgZnVsZmlsbGVkIGhhdmUgYSBmdWxmaWxsbWVudCB2YWx1ZSBhbmQgYXJlIGluIHRoZSBmdWxmaWxsZWRcbiAgICAgIHN0YXRlLiAgUHJvbWlzZXMgdGhhdCBhcmUgcmVqZWN0ZWQgaGF2ZSBhIHJlamVjdGlvbiByZWFzb24gYW5kIGFyZSBpbiB0aGVcbiAgICAgIHJlamVjdGVkIHN0YXRlLiAgQSBmdWxmaWxsbWVudCB2YWx1ZSBpcyBuZXZlciBhIHRoZW5hYmxlLlxuXG4gICAgICBQcm9taXNlcyBjYW4gYWxzbyBiZSBzYWlkIHRvICpyZXNvbHZlKiBhIHZhbHVlLiAgSWYgdGhpcyB2YWx1ZSBpcyBhbHNvIGFcbiAgICAgIHByb21pc2UsIHRoZW4gdGhlIG9yaWdpbmFsIHByb21pc2UncyBzZXR0bGVkIHN0YXRlIHdpbGwgbWF0Y2ggdGhlIHZhbHVlJ3NcbiAgICAgIHNldHRsZWQgc3RhdGUuICBTbyBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2lsbFxuICAgICAgaXRzZWxmIHJlamVjdCwgYW5kIGEgcHJvbWlzZSB0aGF0ICpyZXNvbHZlcyogYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgd2lsbFxuICAgICAgaXRzZWxmIGZ1bGZpbGwuXG5cblxuICAgICAgQmFzaWMgVXNhZ2U6XG4gICAgICAtLS0tLS0tLS0tLS1cblxuICAgICAgYGBganNcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIC8vIG9uIHN1Y2Nlc3NcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gb24gZmFpbHVyZVxuICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgIH0pO1xuXG4gICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgLy8gb24gZnVsZmlsbG1lbnRcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAvLyBvbiByZWplY3Rpb25cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEFkdmFuY2VkIFVzYWdlOlxuICAgICAgLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIFByb21pc2VzIHNoaW5lIHdoZW4gYWJzdHJhY3RpbmcgYXdheSBhc3luY2hyb25vdXMgaW50ZXJhY3Rpb25zIHN1Y2ggYXNcbiAgICAgIGBYTUxIdHRwUmVxdWVzdGBzLlxuXG4gICAgICBgYGBqc1xuICAgICAgZnVuY3Rpb24gZ2V0SlNPTih1cmwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCk7XG4gICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGhhbmRsZXI7XG4gICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdqc29uJztcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgICAgICB4aHIuc2VuZCgpO1xuXG4gICAgICAgICAgZnVuY3Rpb24gaGFuZGxlcigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IHRoaXMuRE9ORSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5yZXNwb25zZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignZ2V0SlNPTjogYCcgKyB1cmwgKyAnYCBmYWlsZWQgd2l0aCBzdGF0dXM6IFsnICsgdGhpcy5zdGF0dXMgKyAnXScpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBnZXRKU09OKCcvcG9zdHMuanNvbicpLnRoZW4oZnVuY3Rpb24oanNvbikge1xuICAgICAgICAvLyBvbiBmdWxmaWxsbWVudFxuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIC8vIG9uIHJlamVjdGlvblxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgVW5saWtlIGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdyZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy5cblxuICAgICAgYGBganNcbiAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgZ2V0SlNPTignL3Bvc3RzJyksXG4gICAgICAgIGdldEpTT04oJy9jb21tZW50cycpXG4gICAgICBdKS50aGVuKGZ1bmN0aW9uKHZhbHVlcyl7XG4gICAgICAgIHZhbHVlc1swXSAvLyA9PiBwb3N0c0pTT05cbiAgICAgICAgdmFsdWVzWzFdIC8vID0+IGNvbW1lbnRzSlNPTlxuXG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBAY2xhc3MgUHJvbWlzZVxuICAgICAgQHBhcmFtIHtmdW5jdGlvbn0gcmVzb2x2ZXJcbiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICAgIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UocmVzb2x2ZXIpIHtcbiAgICAgIHRoaXMuX2lkID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGNvdW50ZXIrKztcbiAgICAgIHRoaXMuX3N0YXRlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc3Vic2NyaWJlcnMgPSBbXTtcblxuICAgICAgaWYgKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3AgIT09IHJlc29sdmVyKSB7XG4gICAgICAgIGlmICghbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKHJlc29sdmVyKSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc1Jlc29sdmVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UpKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzTmV3KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpbml0aWFsaXplUHJvbWlzZSh0aGlzLCByZXNvbHZlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UuYWxsID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnJhY2UgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyYWNlJCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnJlc29sdmUgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnJlamVjdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlamVjdCQkZGVmYXVsdDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5fc2V0U2NoZWR1bGVyID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHNldFNjaGVkdWxlcjtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5fc2V0QXNhcCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRBc2FwO1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLl9hc2FwID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXA7XG5cbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5wcm90b3R5cGUgPSB7XG4gICAgICBjb25zdHJ1Y3RvcjogbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UsXG5cbiAgICAvKipcbiAgICAgIFRoZSBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJvbWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLFxuICAgICAgd2hpY2ggcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBvciB0aGVcbiAgICAgIHJlYXNvbiB3aHkgdGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbih1c2VyKXtcbiAgICAgICAgLy8gdXNlciBpcyBhdmFpbGFibGVcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIHVzZXIgaXMgdW5hdmFpbGFibGUsIGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFzb24gd2h5XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBDaGFpbmluZ1xuICAgICAgLS0tLS0tLS1cblxuICAgICAgVGhlIHJldHVybiB2YWx1ZSBvZiBgdGhlbmAgaXMgaXRzZWxmIGEgcHJvbWlzZS4gIFRoaXMgc2Vjb25kLCAnZG93bnN0cmVhbSdcbiAgICAgIHByb21pc2UgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmaXJzdCBwcm9taXNlJ3MgZnVsZmlsbG1lbnRcbiAgICAgIG9yIHJlamVjdGlvbiBoYW5kbGVyLCBvciByZWplY3RlZCBpZiB0aGUgaGFuZGxlciB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHJldHVybiB1c2VyLm5hbWU7XG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdCBuYW1lJztcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHVzZXJOYW1lKSB7XG4gICAgICAgIC8vIElmIGBmaW5kVXNlcmAgZnVsZmlsbGVkLCBgdXNlck5hbWVgIHdpbGwgYmUgdGhlIHVzZXIncyBuYW1lLCBvdGhlcndpc2UgaXRcbiAgICAgICAgLy8gd2lsbCBiZSBgJ2RlZmF1bHQgbmFtZSdgXG4gICAgICB9KTtcblxuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgdXNlciwgYnV0IHN0aWxsIHVuaGFwcHknKTtcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Jyk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIC8vIGlmIGBmaW5kVXNlcmAgZnVsZmlsbGVkLCBgcmVhc29uYCB3aWxsIGJlICdGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweScuXG4gICAgICAgIC8vIElmIGBmaW5kVXNlcmAgcmVqZWN0ZWQsIGByZWFzb25gIHdpbGwgYmUgJ2BmaW5kVXNlcmAgcmVqZWN0ZWQgYW5kIHdlJ3JlIHVuaGFwcHknLlxuICAgICAgfSk7XG4gICAgICBgYGBcbiAgICAgIElmIHRoZSBkb3duc3RyZWFtIHByb21pc2UgZG9lcyBub3Qgc3BlY2lmeSBhIHJlamVjdGlvbiBoYW5kbGVyLCByZWplY3Rpb24gcmVhc29ucyB3aWxsIGJlIHByb3BhZ2F0ZWQgZnVydGhlciBkb3duc3RyZWFtLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHRocm93IG5ldyBQZWRhZ29naWNhbEV4Y2VwdGlvbignVXBzdHJlYW0gZXJyb3InKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgLy8gVGhlIGBQZWRnYWdvY2lhbEV4Y2VwdGlvbmAgaXMgcHJvcGFnYXRlZCBhbGwgdGhlIHdheSBkb3duIHRvIGhlcmVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEFzc2ltaWxhdGlvblxuICAgICAgLS0tLS0tLS0tLS0tXG5cbiAgICAgIFNvbWV0aW1lcyB0aGUgdmFsdWUgeW91IHdhbnQgdG8gcHJvcGFnYXRlIHRvIGEgZG93bnN0cmVhbSBwcm9taXNlIGNhbiBvbmx5IGJlXG4gICAgICByZXRyaWV2ZWQgYXN5bmNocm9ub3VzbHkuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJldHVybmluZyBhIHByb21pc2UgaW4gdGhlXG4gICAgICBmdWxmaWxsbWVudCBvciByZWplY3Rpb24gaGFuZGxlci4gVGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIHRoZW4gYmUgcGVuZGluZ1xuICAgICAgdW50aWwgdGhlIHJldHVybmVkIHByb21pc2UgaXMgc2V0dGxlZC4gVGhpcyBpcyBjYWxsZWQgKmFzc2ltaWxhdGlvbiouXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHtcbiAgICAgICAgLy8gVGhlIHVzZXIncyBjb21tZW50cyBhcmUgbm93IGF2YWlsYWJsZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgSWYgdGhlIGFzc2ltbGlhdGVkIHByb21pc2UgcmVqZWN0cywgdGhlbiB0aGUgZG93bnN0cmVhbSBwcm9taXNlIHdpbGwgYWxzbyByZWplY3QuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHtcbiAgICAgICAgLy8gSWYgYGZpbmRDb21tZW50c0J5QXV0aG9yYCBmdWxmaWxscywgd2UnbGwgaGF2ZSB0aGUgdmFsdWUgaGVyZVxuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBJZiBgZmluZENvbW1lbnRzQnlBdXRob3JgIHJlamVjdHMsIHdlJ2xsIGhhdmUgdGhlIHJlYXNvbiBoZXJlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBTaW1wbGUgRXhhbXBsZVxuICAgICAgLS0tLS0tLS0tLS0tLS1cblxuICAgICAgU3luY2hyb25vdXMgRXhhbXBsZVxuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBmaW5kUmVzdWx0KCk7XG4gICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgIC8vIGZhaWx1cmVcbiAgICAgIH1cbiAgICAgIGBgYFxuXG4gICAgICBFcnJiYWNrIEV4YW1wbGVcblxuICAgICAgYGBganNcbiAgICAgIGZpbmRSZXN1bHQoZnVuY3Rpb24ocmVzdWx0LCBlcnIpe1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgUHJvbWlzZSBFeGFtcGxlO1xuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICBmaW5kUmVzdWx0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBBZHZhbmNlZCBFeGFtcGxlXG4gICAgICAtLS0tLS0tLS0tLS0tLVxuXG4gICAgICBTeW5jaHJvbm91cyBFeGFtcGxlXG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIHZhciBhdXRob3IsIGJvb2tzO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhdXRob3IgPSBmaW5kQXV0aG9yKCk7XG4gICAgICAgIGJvb2tzICA9IGZpbmRCb29rc0J5QXV0aG9yKGF1dGhvcik7XG4gICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgIC8vIGZhaWx1cmVcbiAgICAgIH1cbiAgICAgIGBgYFxuXG4gICAgICBFcnJiYWNrIEV4YW1wbGVcblxuICAgICAgYGBganNcblxuICAgICAgZnVuY3Rpb24gZm91bmRCb29rcyhib29rcykge1xuXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGZhaWx1cmUocmVhc29uKSB7XG5cbiAgICAgIH1cblxuICAgICAgZmluZEF1dGhvcihmdW5jdGlvbihhdXRob3IsIGVycil7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmaW5kQm9vb2tzQnlBdXRob3IoYXV0aG9yLCBmdW5jdGlvbihib29rcywgZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGZvdW5kQm9va3MoYm9va3MpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICBmYWlsdXJlKHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgUHJvbWlzZSBFeGFtcGxlO1xuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICBmaW5kQXV0aG9yKCkuXG4gICAgICAgIHRoZW4oZmluZEJvb2tzQnlBdXRob3IpLlxuICAgICAgICB0aGVuKGZ1bmN0aW9uKGJvb2tzKXtcbiAgICAgICAgICAvLyBmb3VuZCBib29rc1xuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEBtZXRob2QgdGhlblxuICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25GdWxmaWxsZWRcbiAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0ZWRcbiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICAgKi9cbiAgICAgIHRoZW46IGZ1bmN0aW9uKG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzO1xuICAgICAgICB2YXIgc3RhdGUgPSBwYXJlbnQuX3N0YXRlO1xuXG4gICAgICAgIGlmIChzdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEICYmICFvbkZ1bGZpbGxtZW50IHx8IHN0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCAmJiAhb25SZWplY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGlsZCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuICAgICAgICB2YXIgcmVzdWx0ID0gcGFyZW50Ll9yZXN1bHQ7XG5cbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzW3N0YXRlIC0gMV07XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGludm9rZUNhbGxiYWNrKHN0YXRlLCBjaGlsZCwgY2FsbGJhY2ssIHJlc3VsdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHBhcmVudCwgY2hpbGQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH0sXG5cbiAgICAvKipcbiAgICAgIGBjYXRjaGAgaXMgc2ltcGx5IHN1Z2FyIGZvciBgdGhlbih1bmRlZmluZWQsIG9uUmVqZWN0aW9uKWAgd2hpY2ggbWFrZXMgaXQgdGhlIHNhbWVcbiAgICAgIGFzIHRoZSBjYXRjaCBibG9jayBvZiBhIHRyeS9jYXRjaCBzdGF0ZW1lbnQuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmdW5jdGlvbiBmaW5kQXV0aG9yKCl7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGRuJ3QgZmluZCB0aGF0IGF1dGhvcicpO1xuICAgICAgfVxuXG4gICAgICAvLyBzeW5jaHJvbm91c1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmluZEF1dGhvcigpO1xuICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIH1cblxuICAgICAgLy8gYXN5bmMgd2l0aCBwcm9taXNlc1xuICAgICAgZmluZEF1dGhvcigpLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBAbWV0aG9kIGNhdGNoXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBvblJlamVjdGlvblxuICAgICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgICAgQHJldHVybiB7UHJvbWlzZX1cbiAgICAqL1xuICAgICAgJ2NhdGNoJzogZnVuY3Rpb24ob25SZWplY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGlvbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJHBvbHlmaWxsKCkge1xuICAgICAgdmFyIGxvY2FsO1xuXG4gICAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBsb2NhbCA9IGdsb2JhbDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgbG9jYWwgPSBzZWxmO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBsb2NhbCA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BvbHlmaWxsIGZhaWxlZCBiZWNhdXNlIGdsb2JhbCBvYmplY3QgaXMgdW5hdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudCcpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIFAgPSBsb2NhbC5Qcm9taXNlO1xuXG4gICAgICBpZiAoUCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUC5yZXNvbHZlKCkpID09PSAnW29iamVjdCBQcm9taXNlXScgJiYgIVAuY2FzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxvY2FsLlByb21pc2UgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkZGVmYXVsdDtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkcG9seWZpbGw7XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZSA9IHtcbiAgICAgICdQcm9taXNlJzogbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQsXG4gICAgICAncG9seWZpbGwnOiBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJGRlZmF1bHRcbiAgICB9O1xuXG4gICAgLyogZ2xvYmFsIGRlZmluZTp0cnVlIG1vZHVsZTp0cnVlIHdpbmRvdzogdHJ1ZSAqL1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10pIHtcbiAgICAgIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2U7IH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlWydleHBvcnRzJ10pIHtcbiAgICAgIG1vZHVsZVsnZXhwb3J0cyddID0gbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpc1snRVM2UHJvbWlzZSddID0gbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTtcbiAgICB9XG5cbiAgICBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJGRlZmF1bHQoKTtcbn0pLmNhbGwodGhpcyk7XG5cblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJyksdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDI1dlpHVmZiVzlrZFd4bGN5OWxjell0Y0hKdmJXbHpaUzlrYVhOMEwyVnpOaTF3Y205dGFYTmxMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUk3UVVGQlFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTSXNJbVpwYkdVaU9pSm5aVzVsY21GMFpXUXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHlvaFhHNGdLaUJBYjNabGNuWnBaWGNnWlhNMkxYQnliMjFwYzJVZ0xTQmhJSFJwYm5rZ2FXMXdiR1Z0Wlc1MFlYUnBiMjRnYjJZZ1VISnZiV2x6WlhNdlFTc3VYRzRnS2lCQVkyOXdlWEpwWjJoMElFTnZjSGx5YVdkb2RDQW9ZeWtnTWpBeE5DQlpaV2gxWkdFZ1MyRjBlaXdnVkc5dElFUmhiR1VzSUZOMFpXWmhiaUJRWlc1dVpYSWdZVzVrSUdOdmJuUnlhV0oxZEc5eWN5QW9RMjl1ZG1WeWMybHZiaUIwYnlCRlV6WWdRVkJKSUdKNUlFcGhhMlVnUVhKamFHbGlZV3hrS1Z4dUlDb2dRR3hwWTJWdWMyVWdJQ0JNYVdObGJuTmxaQ0IxYm1SbGNpQk5TVlFnYkdsalpXNXpaVnh1SUNvZ0lDQWdJQ0FnSUNBZ0lDQlRaV1VnYUhSMGNITTZMeTl5WVhjdVoybDBhSFZpZFhObGNtTnZiblJsYm5RdVkyOXRMMnBoYTJWaGNtTm9hV0poYkdRdlpYTTJMWEJ5YjIxcGMyVXZiV0Z6ZEdWeUwweEpRMFZPVTBWY2JpQXFJRUIyWlhKemFXOXVJQ0FnTWk0ekxqQmNiaUFxTDF4dVhHNG9ablZ1WTNScGIyNG9LU0I3WEc0Z0lDQWdYQ0oxYzJVZ2MzUnlhV04wWENJN1hHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSFYwYVd4ekpDUnZZbXBsWTNSUGNrWjFibU4wYVc5dUtIZ3BJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQjBlWEJsYjJZZ2VDQTlQVDBnSjJaMWJtTjBhVzl1SnlCOGZDQW9kSGx3Wlc5bUlIZ2dQVDA5SUNkdlltcGxZM1FuSUNZbUlIZ2dJVDA5SUc1MWJHd3BPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSMWRHbHNjeVFrYVhOR2RXNWpkR2x2YmloNEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2RIbHdaVzltSUhnZ1BUMDlJQ2RtZFc1amRHbHZiaWM3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpIVjBhV3h6SkNScGMwMWhlV0psVkdobGJtRmliR1VvZUNrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUhSNWNHVnZaaUI0SUQwOVBTQW5iMkpxWldOMEp5QW1KaUI0SUNFOVBTQnVkV3hzTzF4dUlDQWdJSDFjYmx4dUlDQWdJSFpoY2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrZFhScGJITWtKRjlwYzBGeWNtRjVPMXh1SUNBZ0lHbG1JQ2doUVhKeVlYa3VhWE5CY25KaGVTa2dlMXh1SUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpIVjBhV3h6SkNSZmFYTkJjbkpoZVNBOUlHWjFibU4wYVc5dUlDaDRLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJQWW1wbFkzUXVjSEp2ZEc5MGVYQmxMblJ2VTNSeWFXNW5MbU5oYkd3b2VDa2dQVDA5SUNkYmIySnFaV04wSUVGeWNtRjVYU2M3WEc0Z0lDQWdJQ0I5TzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa2RYUnBiSE1rSkY5cGMwRnljbUY1SUQwZ1FYSnlZWGt1YVhOQmNuSmhlVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSFYwYVd4ekpDUnBjMEZ5Y21GNUlEMGdiR2xpSkdWek5pUndjbTl0YVhObEpIVjBhV3h6SkNSZmFYTkJjbkpoZVR0Y2JpQWdJQ0IyWVhJZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR3hsYmlBOUlEQTdYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSMGIxTjBjbWx1WnlBOUlIdDlMblJ2VTNSeWFXNW5PMXh1SUNBZ0lIWmhjaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2RtVnlkSGhPWlhoME8xeHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrWTNWemRHOXRVMk5vWldSMWJHVnlSbTQ3WEc1Y2JpQWdJQ0IyWVhJZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR0Z6WVhBZ1BTQm1kVzVqZEdsdmJpQmhjMkZ3S0dOaGJHeGlZV05yTENCaGNtY3BJSHRjYmlBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSeGRXVjFaVnRzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2JHVnVYU0E5SUdOaGJHeGlZV05yTzF4dUlDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pIRjFaWFZsVzJ4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnNaVzRnS3lBeFhTQTlJR0Z5Wnp0Y2JpQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnNaVzRnS3owZ01qdGNiaUFnSUNBZ0lHbG1JQ2hzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2JHVnVJRDA5UFNBeUtTQjdYRzRnSUNBZ0lDQWdJQzh2SUVsbUlHeGxiaUJwY3lBeUxDQjBhR0YwSUcxbFlXNXpJSFJvWVhRZ2QyVWdibVZsWkNCMGJ5QnpZMmhsWkhWc1pTQmhiaUJoYzNsdVl5Qm1iSFZ6YUM1Y2JpQWdJQ0FnSUNBZ0x5OGdTV1lnWVdSa2FYUnBiMjVoYkNCallXeHNZbUZqYTNNZ1lYSmxJSEYxWlhWbFpDQmlaV1p2Y21VZ2RHaGxJSEYxWlhWbElHbHpJR1pzZFhOb1pXUXNJSFJvWlhsY2JpQWdJQ0FnSUNBZ0x5OGdkMmxzYkNCaVpTQndjbTlqWlhOelpXUWdZbmtnZEdocGN5Qm1iSFZ6YUNCMGFHRjBJSGRsSUdGeVpTQnpZMmhsWkhWc2FXNW5MbHh1SUNBZ0lDQWdJQ0JwWmlBb2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR04xYzNSdmJWTmphR1ZrZFd4bGNrWnVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR04xYzNSdmJWTmphR1ZrZFd4bGNrWnVLR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSbWJIVnphQ2s3WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKSE5qYUdWa2RXeGxSbXgxYzJnb0tUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1J6WlhSVFkyaGxaSFZzWlhJb2MyTm9aV1IxYkdWR2Jpa2dlMXh1SUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkdOMWMzUnZiVk5qYUdWa2RXeGxja1p1SUQwZ2MyTm9aV1IxYkdWR2JqdGNiaUFnSUNCOVhHNWNiaUFnSUNCbWRXNWpkR2x2YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtjMlYwUVhOaGNDaGhjMkZ3Um00cElIdGNiaUFnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JoYzJGd0lEMGdZWE5oY0VadU8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrWW5KdmQzTmxjbGRwYm1SdmR5QTlJQ2gwZVhCbGIyWWdkMmx1Wkc5M0lDRTlQU0FuZFc1a1pXWnBibVZrSnlrZ1B5QjNhVzVrYjNjZ09pQjFibVJsWm1sdVpXUTdYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSaWNtOTNjMlZ5UjJ4dlltRnNJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHSnliM2R6WlhKWGFXNWtiM2NnZkh3Z2UzMDdYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSQ2NtOTNjMlZ5VFhWMFlYUnBiMjVQWW5ObGNuWmxjaUE5SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUmljbTkzYzJWeVIyeHZZbUZzTGsxMWRHRjBhVzl1VDJKelpYSjJaWElnZkh3Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR0p5YjNkelpYSkhiRzlpWVd3dVYyVmlTMmwwVFhWMFlYUnBiMjVQWW5ObGNuWmxjanRjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHbHpUbTlrWlNBOUlIUjVjR1Z2WmlCd2NtOWpaWE56SUNFOVBTQW5kVzVrWldacGJtVmtKeUFtSmlCN2ZTNTBiMU4wY21sdVp5NWpZV3hzS0hCeWIyTmxjM01wSUQwOVBTQW5XMjlpYW1WamRDQndjbTlqWlhOelhTYzdYRzVjYmlBZ0lDQXZMeUIwWlhOMElHWnZjaUIzWldJZ2QyOXlhMlZ5SUdKMWRDQnViM1FnYVc0Z1NVVXhNRnh1SUNBZ0lIWmhjaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2FYTlhiM0pyWlhJZ1BTQjBlWEJsYjJZZ1ZXbHVkRGhEYkdGdGNHVmtRWEp5WVhrZ0lUMDlJQ2QxYm1SbFptbHVaV1FuSUNZbVhHNGdJQ0FnSUNCMGVYQmxiMllnYVcxd2IzSjBVMk55YVhCMGN5QWhQVDBnSjNWdVpHVm1hVzVsWkNjZ0ppWmNiaUFnSUNBZ0lIUjVjR1Z2WmlCTlpYTnpZV2RsUTJoaGJtNWxiQ0FoUFQwZ0ozVnVaR1ZtYVc1bFpDYzdYRzVjYmlBZ0lDQXZMeUJ1YjJSbFhHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pIVnpaVTVsZUhSVWFXTnJLQ2tnZTF4dUlDQWdJQ0FnZG1GeUlHNWxlSFJVYVdOcklEMGdjSEp2WTJWemN5NXVaWGgwVkdsamF6dGNiaUFnSUNBZ0lDOHZJRzV2WkdVZ2RtVnljMmx2YmlBd0xqRXdMbmdnWkdsemNHeGhlWE1nWVNCa1pYQnlaV05oZEdsdmJpQjNZWEp1YVc1bklIZG9aVzRnYm1WNGRGUnBZMnNnYVhNZ2RYTmxaQ0J5WldOMWNuTnBkbVZzZVZ4dUlDQWdJQ0FnTHk4Z2MyVjBTVzF0WldScFlYUmxJSE5vYjNWc1pDQmlaU0IxYzJWa0lHbHVjM1JsWVdRZ2FXNXpkR1ZoWkZ4dUlDQWdJQ0FnZG1GeUlIWmxjbk5wYjI0Z1BTQndjbTlqWlhOekxuWmxjbk5wYjI1ekxtNXZaR1V1YldGMFkyZ29MMTRvUHpvb1hGeGtLeWxjWEM0cFB5Zy9PaWhjWEdRcktWeGNMaWsvS0Z4Y0tueGNYR1FyS1NRdktUdGNiaUFnSUNBZ0lHbG1JQ2hCY25KaGVTNXBjMEZ5Y21GNUtIWmxjbk5wYjI0cElDWW1JSFpsY25OcGIyNWJNVjBnUFQwOUlDY3dKeUFtSmlCMlpYSnphVzl1V3pKZElEMDlQU0FuTVRBbktTQjdYRzRnSUNBZ0lDQWdJRzVsZUhSVWFXTnJJRDBnYzJWMFNXMXRaV1JwWVhSbE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ0lDQnVaWGgwVkdsamF5aHNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrWm14MWMyZ3BPMXh1SUNBZ0lDQWdmVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUIyWlhKMGVGeHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUjFjMlZXWlhKMGVGUnBiV1Z5S0NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrZG1WeWRIaE9aWGgwS0d4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUm1iSFZ6YUNrN1hHNGdJQ0FnSUNCOU8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUjFjMlZOZFhSaGRHbHZiazlpYzJWeWRtVnlLQ2tnZTF4dUlDQWdJQ0FnZG1GeUlHbDBaWEpoZEdsdmJuTWdQU0F3TzF4dUlDQWdJQ0FnZG1GeUlHOWljMlZ5ZG1WeUlEMGdibVYzSUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUkNjbTkzYzJWeVRYVjBZWFJwYjI1UFluTmxjblpsY2loc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtabXgxYzJncE8xeHVJQ0FnSUNBZ2RtRnlJRzV2WkdVZ1BTQmtiMk4xYldWdWRDNWpjbVZoZEdWVVpYaDBUbTlrWlNnbkp5azdYRzRnSUNBZ0lDQnZZbk5sY25abGNpNXZZbk5sY25abEtHNXZaR1VzSUhzZ1kyaGhjbUZqZEdWeVJHRjBZVG9nZEhKMVpTQjlLVHRjYmx4dUlDQWdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdJQ0FnSUNCdWIyUmxMbVJoZEdFZ1BTQW9hWFJsY21GMGFXOXVjeUE5SUNzcmFYUmxjbUYwYVc5dWN5QWxJRElwTzF4dUlDQWdJQ0FnZlR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCM1pXSWdkMjl5YTJWeVhHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pIVnpaVTFsYzNOaFoyVkRhR0Z1Ym1Wc0tDa2dlMXh1SUNBZ0lDQWdkbUZ5SUdOb1lXNXVaV3dnUFNCdVpYY2dUV1Z6YzJGblpVTm9ZVzV1Wld3b0tUdGNiaUFnSUNBZ0lHTm9ZVzV1Wld3dWNHOXlkREV1YjI1dFpYTnpZV2RsSUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR1pzZFhOb08xeHVJQ0FnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdZMmhoYm01bGJDNXdiM0owTWk1d2IzTjBUV1Z6YzJGblpTZ3dLVHRjYmlBZ0lDQWdJSDA3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhWelpWTmxkRlJwYldWdmRYUW9LU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdablZ1WTNScGIyNG9LU0I3WEc0Z0lDQWdJQ0FnSUhObGRGUnBiV1Z2ZFhRb2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR1pzZFhOb0xDQXhLVHRjYmlBZ0lDQWdJSDA3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdkbUZ5SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnhkV1YxWlNBOUlHNWxkeUJCY25KaGVTZ3hNREF3S1R0Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa1pteDFjMmdvS1NCN1hHNGdJQ0FnSUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JzWlc0N0lHa3JQVElwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJR05oYkd4aVlXTnJJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pIRjFaWFZsVzJsZE8xeHVJQ0FnSUNBZ0lDQjJZWElnWVhKbklEMGdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhGMVpYVmxXMmtyTVYwN1hHNWNiaUFnSUNBZ0lDQWdZMkZzYkdKaFkyc29ZWEpuS1R0Y2JseHVJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrY1hWbGRXVmJhVjBnUFNCMWJtUmxabWx1WldRN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1J4ZFdWMVpWdHBLekZkSUQwZ2RXNWtaV1pwYm1Wa08xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYkdWdUlEMGdNRHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrWVhSMFpXMXdkRlpsY25SbGVDZ3BJSHRjYmlBZ0lDQWdJSFJ5ZVNCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJ5SUQwZ2NtVnhkV2x5WlR0Y2JpQWdJQ0FnSUNBZ2RtRnlJSFpsY25SNElEMGdjaWduZG1WeWRIZ25LVHRjYmlBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pIWmxjblI0VG1WNGRDQTlJSFpsY25SNExuSjFiazl1VEc5dmNDQjhmQ0IyWlhKMGVDNXlkVzVQYmtOdmJuUmxlSFE3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2RYTmxWbVZ5ZEhoVWFXMWxjaWdwTzF4dUlDQWdJQ0FnZlNCallYUmphQ2hsS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtkWE5sVTJWMFZHbHRaVzkxZENncE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JseHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYzJOb1pXUjFiR1ZHYkhWemFEdGNiaUFnSUNBdkx5QkVaV05wWkdVZ2QyaGhkQ0JoYzNsdVl5QnRaWFJvYjJRZ2RHOGdkWE5sSUhSdklIUnlhV2RuWlhKcGJtY2djSEp2WTJWemMybHVaeUJ2WmlCeGRXVjFaV1FnWTJGc2JHSmhZMnR6T2x4dUlDQWdJR2xtSUNoc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWthWE5PYjJSbEtTQjdYRzRnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYzJOb1pXUjFiR1ZHYkhWemFDQTlJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSMWMyVk9aWGgwVkdsamF5Z3BPMXh1SUNBZ0lIMGdaV3h6WlNCcFppQW9iR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkVKeWIzZHpaWEpOZFhSaGRHbHZiazlpYzJWeWRtVnlLU0I3WEc0Z0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2MyTm9aV1IxYkdWR2JIVnphQ0E5SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUjFjMlZOZFhSaGRHbHZiazlpYzJWeWRtVnlLQ2s3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2hzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2FYTlhiM0pyWlhJcElIdGNiaUFnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1J6WTJobFpIVnNaVVpzZFhOb0lEMGdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhWelpVMWxjM05oWjJWRGFHRnVibVZzS0NrN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNoc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtZbkp2ZDNObGNsZHBibVJ2ZHlBOVBUMGdkVzVrWldacGJtVmtJQ1ltSUhSNWNHVnZaaUJ5WlhGMWFYSmxJRDA5UFNBblpuVnVZM1JwYjI0bktTQjdYRzRnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYzJOb1pXUjFiR1ZHYkhWemFDQTlJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSaGRIUmxiWEIwVm1WeWRHVjRLQ2s3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1J6WTJobFpIVnNaVVpzZFhOb0lEMGdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhWelpWTmxkRlJwYldWdmRYUW9LVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnViMjl3S0NrZ2UzMWNibHh1SUNBZ0lIWmhjaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JRUlU1RVNVNUhJQ0FnUFNCMmIybGtJREE3WEc0Z0lDQWdkbUZ5SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkVaVlRFWkpURXhGUkNBOUlERTdYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRkpGU2tWRFZFVkVJQ0E5SURJN1hHNWNiaUFnSUNCMllYSWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtSMFZVWDFSSVJVNWZSVkpTVDFJZ1BTQnVaWGNnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrUlhKeWIzSlBZbXBsWTNRb0tUdGNibHh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pITmxiR1pHZFd4c1ptbHNiRzFsYm5Rb0tTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2JtVjNJRlI1Y0dWRmNuSnZjaWhjSWxsdmRTQmpZVzV1YjNRZ2NtVnpiMngyWlNCaElIQnliMjFwYzJVZ2QybDBhQ0JwZEhObGJHWmNJaWs3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtZMkZ1Ym05MFVtVjBkWEp1VDNkdUtDa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlHNWxkeUJVZVhCbFJYSnliM0lvSjBFZ2NISnZiV2x6WlhNZ1kyRnNiR0poWTJzZ1kyRnVibTkwSUhKbGRIVnliaUIwYUdGMElITmhiV1VnY0hKdmJXbHpaUzRuS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JuWlhSVWFHVnVLSEJ5YjIxcGMyVXBJSHRjYmlBZ0lDQWdJSFJ5ZVNCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCd2NtOXRhWE5sTG5Sb1pXNDdYRzRnSUNBZ0lDQjlJR05oZEdOb0tHVnljbTl5S1NCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pFZEZWRjlVU0VWT1gwVlNVazlTTG1WeWNtOXlJRDBnWlhKeWIzSTdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUkhSVlJmVkVoRlRsOUZVbEpQVWp0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1IwY25sVWFHVnVLSFJvWlc0c0lIWmhiSFZsTENCbWRXeG1hV3hzYldWdWRFaGhibVJzWlhJc0lISmxhbVZqZEdsdmJraGhibVJzWlhJcElIdGNiaUFnSUNBZ0lIUnllU0I3WEc0Z0lDQWdJQ0FnSUhSb1pXNHVZMkZzYkNoMllXeDFaU3dnWm5Wc1ptbHNiRzFsYm5SSVlXNWtiR1Z5TENCeVpXcGxZM1JwYjI1SVlXNWtiR1Z5S1R0Y2JpQWdJQ0FnSUgwZ1kyRjBZMmdvWlNrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1pUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCbWRXNWpkR2x2YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSb1lXNWtiR1ZHYjNKbGFXZHVWR2hsYm1GaWJHVW9jSEp2YldselpTd2dkR2hsYm1GaWJHVXNJSFJvWlc0cElIdGNiaUFnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrWVhOaGNDaG1kVzVqZEdsdmJpaHdjbTl0YVhObEtTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCelpXRnNaV1FnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnZG1GeUlHVnljbTl5SUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2RISjVWR2hsYmloMGFHVnVMQ0IwYUdWdVlXSnNaU3dnWm5WdVkzUnBiMjRvZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnSUNCcFppQW9jMlZoYkdWa0tTQjdJSEpsZEhWeWJqc2dmVnh1SUNBZ0lDQWdJQ0FnSUhObFlXeGxaQ0E5SUhSeWRXVTdYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9aVzVoWW14bElDRTlQU0IyWVd4MVpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NtVnpiMngyWlNod2NtOXRhWE5sTENCMllXeDFaU2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKR1oxYkdacGJHd29jSEp2YldselpTd2dkbUZzZFdVcE8xeHVJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZlN3Z1puVnVZM1JwYjI0b2NtVmhjMjl1S1NCN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0hObFlXeGxaQ2tnZXlCeVpYUjFjbTQ3SUgxY2JpQWdJQ0FnSUNBZ0lDQnpaV0ZzWldRZ1BTQjBjblZsTzF4dVhHNGdJQ0FnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtjbVZxWldOMEtIQnliMjFwYzJVc0lISmxZWE52YmlrN1hHNGdJQ0FnSUNBZ0lIMHNJQ2RUWlhSMGJHVTZJQ2NnS3lBb2NISnZiV2x6WlM1ZmJHRmlaV3dnZkh3Z0p5QjFibXR1YjNkdUlIQnliMjFwYzJVbktTazdYRzVjYmlBZ0lDQWdJQ0FnYVdZZ0tDRnpaV0ZzWldRZ0ppWWdaWEp5YjNJcElIdGNiaUFnSUNBZ0lDQWdJQ0J6WldGc1pXUWdQU0IwY25WbE8xeHVJQ0FnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSEpsYW1WamRDaHdjbTl0YVhObExDQmxjbkp2Y2lrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMHNJSEJ5YjIxcGMyVXBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHaGhibVJzWlU5M2JsUm9aVzVoWW14bEtIQnliMjFwYzJVc0lIUm9aVzVoWW14bEtTQjdYRzRnSUNBZ0lDQnBaaUFvZEdobGJtRmliR1V1WDNOMFlYUmxJRDA5UFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSR1ZVeEdTVXhNUlVRcElIdGNiaUFnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtablZzWm1sc2JDaHdjbTl0YVhObExDQjBhR1Z1WVdKc1pTNWZjbVZ6ZFd4MEtUdGNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9kR2hsYm1GaWJHVXVYM04wWVhSbElEMDlQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JTUlVwRlExUkZSQ2tnZTF4dUlDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSeVpXcGxZM1FvY0hKdmJXbHpaU3dnZEdobGJtRmliR1V1WDNKbGMzVnNkQ2s3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J6ZFdKelkzSnBZbVVvZEdobGJtRmliR1VzSUhWdVpHVm1hVzVsWkN3Z1puVnVZM1JwYjI0b2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnlaWE52YkhabEtIQnliMjFwYzJVc0lIWmhiSFZsS1R0Y2JpQWdJQ0FnSUNBZ2ZTd2dablZ1WTNScGIyNG9jbVZoYzI5dUtTQjdYRzRnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WcVpXTjBLSEJ5YjIxcGMyVXNJSEpsWVhOdmJpazdYRzRnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKR2hoYm1Sc1pVMWhlV0psVkdobGJtRmliR1VvY0hKdmJXbHpaU3dnYldGNVltVlVhR1Z1WVdKc1pTa2dlMXh1SUNBZ0lDQWdhV1lnS0cxaGVXSmxWR2hsYm1GaWJHVXVZMjl1YzNSeWRXTjBiM0lnUFQwOUlIQnliMjFwYzJVdVkyOXVjM1J5ZFdOMGIzSXBJSHRjYmlBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrYUdGdVpHeGxUM2R1VkdobGJtRmliR1VvY0hKdmJXbHpaU3dnYldGNVltVlVhR1Z1WVdKc1pTazdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnZEdobGJpQTlJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKR2RsZEZSb1pXNG9iV0Y1WW1WVWFHVnVZV0pzWlNrN1hHNWNiaUFnSUNBZ0lDQWdhV1lnS0hSb1pXNGdQVDA5SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkVkRlZGOVVTRVZPWDBWU1VrOVNLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NtVnFaV04wS0hCeWIyMXBjMlVzSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkVkRlZGOVVTRVZPWDBWU1VrOVNMbVZ5Y205eUtUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2gwYUdWdUlEMDlQU0IxYm1SbFptbHVaV1FwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUm1kV3htYVd4c0tIQnliMjFwYzJVc0lHMWhlV0psVkdobGJtRmliR1VwTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHeHBZaVJsY3pZa2NISnZiV2x6WlNSMWRHbHNjeVFrYVhOR2RXNWpkR2x2YmloMGFHVnVLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHaGhibVJzWlVadmNtVnBaMjVVYUdWdVlXSnNaU2h3Y205dGFYTmxMQ0J0WVhsaVpWUm9aVzVoWW14bExDQjBhR1Z1S1R0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUm1kV3htYVd4c0tIQnliMjFwYzJVc0lHMWhlV0psVkdobGJtRmliR1VwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WemIyeDJaU2h3Y205dGFYTmxMQ0IyWVd4MVpTa2dlMXh1SUNBZ0lDQWdhV1lnS0hCeWIyMXBjMlVnUFQwOUlIWmhiSFZsS1NCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pISmxhbVZqZENod2NtOXRhWE5sTENCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSelpXeG1SblZzYkdacGJHeHRaVzUwS0NrcE8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaHNhV0lrWlhNMkpIQnliMjFwYzJVa2RYUnBiSE1rSkc5aWFtVmpkRTl5Um5WdVkzUnBiMjRvZG1Gc2RXVXBLU0I3WEc0Z0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkdoaGJtUnNaVTFoZVdKbFZHaGxibUZpYkdVb2NISnZiV2x6WlN3Z2RtRnNkV1VwTzF4dUlDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrWm5Wc1ptbHNiQ2h3Y205dGFYTmxMQ0IyWVd4MVpTazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NIVmliR2x6YUZKbGFtVmpkR2x2Ymlod2NtOXRhWE5sS1NCN1hHNGdJQ0FnSUNCcFppQW9jSEp2YldselpTNWZiMjVsY25KdmNpa2dlMXh1SUNBZ0lDQWdJQ0J3Y205dGFYTmxMbDl2Ym1WeWNtOXlLSEJ5YjIxcGMyVXVYM0psYzNWc2RDazdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSEIxWW14cGMyZ29jSEp2YldselpTazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1puVnNabWxzYkNod2NtOXRhWE5sTENCMllXeDFaU2tnZTF4dUlDQWdJQ0FnYVdZZ0tIQnliMjFwYzJVdVgzTjBZWFJsSUNFOVBTQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlFSVTVFU1U1SEtTQjdJSEpsZEhWeWJqc2dmVnh1WEc0Z0lDQWdJQ0J3Y205dGFYTmxMbDl5WlhOMWJIUWdQU0IyWVd4MVpUdGNiaUFnSUNBZ0lIQnliMjFwYzJVdVgzTjBZWFJsSUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1JsVk1Sa2xNVEVWRU8xeHVYRzRnSUNBZ0lDQnBaaUFvY0hKdmJXbHpaUzVmYzNWaWMyTnlhV0psY25NdWJHVnVaM1JvSUNFOVBTQXdLU0I3WEc0Z0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUmhjMkZ3S0d4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhCMVlteHBjMmdzSUhCeWIyMXBjMlVwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSEpsYW1WamRDaHdjbTl0YVhObExDQnlaV0Z6YjI0cElIdGNiaUFnSUNBZ0lHbG1JQ2h3Y205dGFYTmxMbDl6ZEdGMFpTQWhQVDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrVUVWT1JFbE9SeWtnZXlCeVpYUjFjbTQ3SUgxY2JpQWdJQ0FnSUhCeWIyMXBjMlV1WDNOMFlYUmxJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrVWtWS1JVTlVSVVE3WEc0Z0lDQWdJQ0J3Y205dGFYTmxMbDl5WlhOMWJIUWdQU0J5WldGemIyNDdYRzVjYmlBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSaGMyRndLR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSEIxWW14cGMyaFNaV3BsWTNScGIyNHNJSEJ5YjIxcGMyVXBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pITjFZbk5qY21saVpTaHdZWEpsYm5Rc0lHTm9hV3hrTENCdmJrWjFiR1pwYkd4dFpXNTBMQ0J2YmxKbGFtVmpkR2x2YmlrZ2UxeHVJQ0FnSUNBZ2RtRnlJSE4xWW5OamNtbGlaWEp6SUQwZ2NHRnlaVzUwTGw5emRXSnpZM0pwWW1WeWN6dGNiaUFnSUNBZ0lIWmhjaUJzWlc1bmRHZ2dQU0J6ZFdKelkzSnBZbVZ5Y3k1c1pXNW5kR2c3WEc1Y2JpQWdJQ0FnSUhCaGNtVnVkQzVmYjI1bGNuSnZjaUE5SUc1MWJHdzdYRzVjYmlBZ0lDQWdJSE4xWW5OamNtbGlaWEp6VzJ4bGJtZDBhRjBnUFNCamFHbHNaRHRjYmlBZ0lDQWdJSE4xWW5OamNtbGlaWEp6VzJ4bGJtZDBhQ0FySUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkVaVlRFWkpURXhGUkYwZ1BTQnZia1oxYkdacGJHeHRaVzUwTzF4dUlDQWdJQ0FnYzNWaWMyTnlhV0psY25OYmJHVnVaM1JvSUNzZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1VrVktSVU5VUlVSZElDQTlJRzl1VW1WcVpXTjBhVzl1TzF4dVhHNGdJQ0FnSUNCcFppQW9iR1Z1WjNSb0lEMDlQU0F3SUNZbUlIQmhjbVZ1ZEM1ZmMzUmhkR1VwSUh0Y2JpQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR0Z6WVhBb2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NIVmliR2x6YUN3Z2NHRnlaVzUwS1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J3ZFdKc2FYTm9LSEJ5YjIxcGMyVXBJSHRjYmlBZ0lDQWdJSFpoY2lCemRXSnpZM0pwWW1WeWN5QTlJSEJ5YjIxcGMyVXVYM04xWW5OamNtbGlaWEp6TzF4dUlDQWdJQ0FnZG1GeUlITmxkSFJzWldRZ1BTQndjbTl0YVhObExsOXpkR0YwWlR0Y2JseHVJQ0FnSUNBZ2FXWWdLSE4xWW5OamNtbGlaWEp6TG14bGJtZDBhQ0E5UFQwZ01Da2dleUJ5WlhSMWNtNDdJSDFjYmx4dUlDQWdJQ0FnZG1GeUlHTm9hV3hrTENCallXeHNZbUZqYXl3Z1pHVjBZV2xzSUQwZ2NISnZiV2x6WlM1ZmNtVnpkV3gwTzF4dVhHNGdJQ0FnSUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElITjFZbk5qY21saVpYSnpMbXhsYm1kMGFEc2dhU0FyUFNBektTQjdYRzRnSUNBZ0lDQWdJR05vYVd4a0lEMGdjM1ZpYzJOeWFXSmxjbk5iYVYwN1hHNGdJQ0FnSUNBZ0lHTmhiR3hpWVdOcklEMGdjM1ZpYzJOeWFXSmxjbk5iYVNBcklITmxkSFJzWldSZE8xeHVYRzRnSUNBZ0lDQWdJR2xtSUNoamFHbHNaQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHbHVkbTlyWlVOaGJHeGlZV05yS0hObGRIUnNaV1FzSUdOb2FXeGtMQ0JqWVd4c1ltRmpheXdnWkdWMFlXbHNLVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNCallXeHNZbUZqYXloa1pYUmhhV3dwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lIQnliMjFwYzJVdVgzTjFZbk5qY21saVpYSnpMbXhsYm1kMGFDQTlJREE3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtSWEp5YjNKUFltcGxZM1FvS1NCN1hHNGdJQ0FnSUNCMGFHbHpMbVZ5Y205eUlEMGdiblZzYkR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0IyWVhJZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1ZGSlpYME5CVkVOSVgwVlNVazlTSUQwZ2JtVjNJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRVZ5Y205eVQySnFaV04wS0NrN1hHNWNiaUFnSUNCbWRXNWpkR2x2YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSMGNubERZWFJqYUNoallXeHNZbUZqYXl3Z1pHVjBZV2xzS1NCN1hHNGdJQ0FnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdZMkZzYkdKaFkyc29aR1YwWVdsc0tUdGNiaUFnSUNBZ0lIMGdZMkYwWTJnb1pTa2dlMXh1SUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JVVWxsZlEwRlVRMGhmUlZKU1QxSXVaWEp5YjNJZ1BTQmxPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtWRkpaWDBOQlZFTklYMFZTVWs5U08xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkdsdWRtOXJaVU5oYkd4aVlXTnJLSE5sZEhSc1pXUXNJSEJ5YjIxcGMyVXNJR05oYkd4aVlXTnJMQ0JrWlhSaGFXd3BJSHRjYmlBZ0lDQWdJSFpoY2lCb1lYTkRZV3hzWW1GamF5QTlJR3hwWWlSbGN6WWtjSEp2YldselpTUjFkR2xzY3lRa2FYTkdkVzVqZEdsdmJpaGpZV3hzWW1GamF5a3NYRzRnSUNBZ0lDQWdJQ0FnZG1Gc2RXVXNJR1Z5Y205eUxDQnpkV05qWldWa1pXUXNJR1poYVd4bFpEdGNibHh1SUNBZ0lDQWdhV1lnS0doaGMwTmhiR3hpWVdOcktTQjdYRzRnSUNBZ0lDQWdJSFpoYkhWbElEMGdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtkSEo1UTJGMFkyZ29ZMkZzYkdKaFkyc3NJR1JsZEdGcGJDazdYRzVjYmlBZ0lDQWdJQ0FnYVdZZ0tIWmhiSFZsSUQwOVBTQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlVVbGxmUTBGVVEwaGZSVkpTVDFJcElIdGNiaUFnSUNBZ0lDQWdJQ0JtWVdsc1pXUWdQU0IwY25WbE8xeHVJQ0FnSUNBZ0lDQWdJR1Z5Y205eUlEMGdkbUZzZFdVdVpYSnliM0k3WEc0Z0lDQWdJQ0FnSUNBZ2RtRnNkV1VnUFNCdWRXeHNPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUhOMVkyTmxaV1JsWkNBOUlIUnlkV1U3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnBaaUFvY0hKdmJXbHpaU0E5UFQwZ2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnlaV3BsWTNRb2NISnZiV2x6WlN3Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1kyRnVibTkwVW1WMGRYSnVUM2R1S0NrcE8xeHVJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJqdGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0IyWVd4MVpTQTlJR1JsZEdGcGJEdGNiaUFnSUNBZ0lDQWdjM1ZqWTJWbFpHVmtJRDBnZEhKMVpUdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdhV1lnS0hCeWIyMXBjMlV1WDNOMFlYUmxJQ0U5UFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSUVJVNUVTVTVIS1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRzV2YjNCY2JpQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2FHRnpRMkZzYkdKaFkyc2dKaVlnYzNWalkyVmxaR1ZrS1NCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pISmxjMjlzZG1Vb2NISnZiV2x6WlN3Z2RtRnNkV1VwTzF4dUlDQWdJQ0FnZlNCbGJITmxJR2xtSUNobVlXbHNaV1FwSUh0Y2JpQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NtVnFaV04wS0hCeWIyMXBjMlVzSUdWeWNtOXlLVHRjYmlBZ0lDQWdJSDBnWld4elpTQnBaaUFvYzJWMGRHeGxaQ0E5UFQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1JsVk1Sa2xNVEVWRUtTQjdYRzRnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKR1oxYkdacGJHd29jSEp2YldselpTd2dkbUZzZFdVcE8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaHpaWFIwYkdWa0lEMDlQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JTUlVwRlExUkZSQ2tnZTF4dUlDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSeVpXcGxZM1FvY0hKdmJXbHpaU3dnZG1Gc2RXVXBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHbHVhWFJwWVd4cGVtVlFjbTl0YVhObEtIQnliMjFwYzJVc0lISmxjMjlzZG1WeUtTQjdYRzRnSUNBZ0lDQjBjbmtnZTF4dUlDQWdJQ0FnSUNCeVpYTnZiSFpsY2lobWRXNWpkR2x2YmlCeVpYTnZiSFpsVUhKdmJXbHpaU2gyWVd4MVpTbDdYRzRnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WemIyeDJaU2h3Y205dGFYTmxMQ0IyWVd4MVpTazdYRzRnSUNBZ0lDQWdJSDBzSUdaMWJtTjBhVzl1SUhKbGFtVmpkRkJ5YjIxcGMyVW9jbVZoYzI5dUtTQjdYRzRnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WcVpXTjBLSEJ5YjIxcGMyVXNJSEpsWVhOdmJpazdYRzRnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnZlNCallYUmphQ2hsS1NCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pISmxhbVZqZENod2NtOXRhWE5sTENCbEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCbWRXNWpkR2x2YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWlc1MWJXVnlZWFJ2Y2lRa1JXNTFiV1Z5WVhSdmNpaERiMjV6ZEhKMVkzUnZjaXdnYVc1d2RYUXBJSHRjYmlBZ0lDQWdJSFpoY2lCbGJuVnRaWEpoZEc5eUlEMGdkR2hwY3p0Y2JseHVJQ0FnSUNBZ1pXNTFiV1Z5WVhSdmNpNWZhVzV6ZEdGdVkyVkRiMjV6ZEhKMVkzUnZjaUE5SUVOdmJuTjBjblZqZEc5eU8xeHVJQ0FnSUNBZ1pXNTFiV1Z5WVhSdmNpNXdjbTl0YVhObElEMGdibVYzSUVOdmJuTjBjblZqZEc5eUtHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHNXZiM0FwTzF4dVhHNGdJQ0FnSUNCcFppQW9aVzUxYldWeVlYUnZjaTVmZG1Gc2FXUmhkR1ZKYm5CMWRDaHBibkIxZENrcElIdGNiaUFnSUNBZ0lDQWdaVzUxYldWeVlYUnZjaTVmYVc1d2RYUWdJQ0FnSUQwZ2FXNXdkWFE3WEc0Z0lDQWdJQ0FnSUdWdWRXMWxjbUYwYjNJdWJHVnVaM1JvSUNBZ0lDQTlJR2x1Y0hWMExteGxibWQwYUR0Y2JpQWdJQ0FnSUNBZ1pXNTFiV1Z5WVhSdmNpNWZjbVZ0WVdsdWFXNW5JRDBnYVc1d2RYUXViR1Z1WjNSb08xeHVYRzRnSUNBZ0lDQWdJR1Z1ZFcxbGNtRjBiM0l1WDJsdWFYUW9LVHRjYmx4dUlDQWdJQ0FnSUNCcFppQW9aVzUxYldWeVlYUnZjaTVzWlc1bmRHZ2dQVDA5SURBcElIdGNiaUFnSUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JtZFd4bWFXeHNLR1Z1ZFcxbGNtRjBiM0l1Y0hKdmJXbHpaU3dnWlc1MWJXVnlZWFJ2Y2k1ZmNtVnpkV3gwS1R0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQmxiblZ0WlhKaGRHOXlMbXhsYm1kMGFDQTlJR1Z1ZFcxbGNtRjBiM0l1YkdWdVozUm9JSHg4SURBN1hHNGdJQ0FnSUNBZ0lDQWdaVzUxYldWeVlYUnZjaTVmWlc1MWJXVnlZWFJsS0NrN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0dWdWRXMWxjbUYwYjNJdVgzSmxiV0ZwYm1sdVp5QTlQVDBnTUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrWm5Wc1ptbHNiQ2hsYm5WdFpYSmhkRzl5TG5CeWIyMXBjMlVzSUdWdWRXMWxjbUYwYjNJdVgzSmxjM1ZzZENrN1hHNGdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J5WldwbFkzUW9aVzUxYldWeVlYUnZjaTV3Y205dGFYTmxMQ0JsYm5WdFpYSmhkRzl5TGw5MllXeHBaR0YwYVc5dVJYSnliM0lvS1NrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dVhHNGdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR1Z1ZFcxbGNtRjBiM0lrSkVWdWRXMWxjbUYwYjNJdWNISnZkRzkwZVhCbExsOTJZV3hwWkdGMFpVbHVjSFYwSUQwZ1puVnVZM1JwYjI0b2FXNXdkWFFwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtkWFJwYkhNa0pHbHpRWEp5WVhrb2FXNXdkWFFwTzF4dUlDQWdJSDA3WEc1Y2JpQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtaVzUxYldWeVlYUnZjaVFrUlc1MWJXVnlZWFJ2Y2k1d2NtOTBiM1I1Y0dVdVgzWmhiR2xrWVhScGIyNUZjbkp2Y2lBOUlHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlHNWxkeUJGY25KdmNpZ25RWEp5WVhrZ1RXVjBhRzlrY3lCdGRYTjBJR0psSUhCeWIzWnBaR1ZrSUdGdUlFRnljbUY1SnlrN1hHNGdJQ0FnZlR0Y2JseHVJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1JsYm5WdFpYSmhkRzl5SkNSRmJuVnRaWEpoZEc5eUxuQnliM1J2ZEhsd1pTNWZhVzVwZENBOUlHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lDQWdkR2hwY3k1ZmNtVnpkV3gwSUQwZ2JtVjNJRUZ5Y21GNUtIUm9hWE11YkdWdVozUm9LVHRjYmlBZ0lDQjlPMXh1WEc0Z0lDQWdkbUZ5SUd4cFlpUmxjellrY0hKdmJXbHpaU1JsYm5WdFpYSmhkRzl5SkNSa1pXWmhkV3gwSUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdWdWRXMWxjbUYwYjNJa0pFVnVkVzFsY21GMGIzSTdYRzVjYmlBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1pXNTFiV1Z5WVhSdmNpUWtSVzUxYldWeVlYUnZjaTV3Y205MGIzUjVjR1V1WDJWdWRXMWxjbUYwWlNBOUlHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lDQWdkbUZ5SUdWdWRXMWxjbUYwYjNJZ1BTQjBhR2x6TzF4dVhHNGdJQ0FnSUNCMllYSWdiR1Z1WjNSb0lDQTlJR1Z1ZFcxbGNtRjBiM0l1YkdWdVozUm9PMXh1SUNBZ0lDQWdkbUZ5SUhCeWIyMXBjMlVnUFNCbGJuVnRaWEpoZEc5eUxuQnliMjFwYzJVN1hHNGdJQ0FnSUNCMllYSWdhVzV3ZFhRZ0lDQTlJR1Z1ZFcxbGNtRjBiM0l1WDJsdWNIVjBPMXh1WEc0Z0lDQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2djSEp2YldselpTNWZjM1JoZEdVZ1BUMDlJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRkJGVGtSSlRrY2dKaVlnYVNBOElHeGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0FnSUdWdWRXMWxjbUYwYjNJdVgyVmhZMmhGYm5SeWVTaHBibkIxZEZ0cFhTd2dhU2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVHRjYmx4dUlDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUmxiblZ0WlhKaGRHOXlKQ1JGYm5WdFpYSmhkRzl5TG5CeWIzUnZkSGx3WlM1ZlpXRmphRVZ1ZEhKNUlEMGdablZ1WTNScGIyNG9aVzUwY25rc0lHa3BJSHRjYmlBZ0lDQWdJSFpoY2lCbGJuVnRaWEpoZEc5eUlEMGdkR2hwY3p0Y2JpQWdJQ0FnSUhaaGNpQmpJRDBnWlc1MWJXVnlZWFJ2Y2k1ZmFXNXpkR0Z1WTJWRGIyNXpkSEoxWTNSdmNqdGNibHh1SUNBZ0lDQWdhV1lnS0d4cFlpUmxjellrY0hKdmJXbHpaU1IxZEdsc2N5UWthWE5OWVhsaVpWUm9aVzVoWW14bEtHVnVkSEo1S1NrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvWlc1MGNua3VZMjl1YzNSeWRXTjBiM0lnUFQwOUlHTWdKaVlnWlc1MGNua3VYM04wWVhSbElDRTlQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JRUlU1RVNVNUhLU0I3WEc0Z0lDQWdJQ0FnSUNBZ1pXNTBjbmt1WDI5dVpYSnliM0lnUFNCdWRXeHNPMXh1SUNBZ0lDQWdJQ0FnSUdWdWRXMWxjbUYwYjNJdVgzTmxkSFJzWldSQmRDaGxiblJ5ZVM1ZmMzUmhkR1VzSUdrc0lHVnVkSEo1TGw5eVpYTjFiSFFwTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lHVnVkVzFsY21GMGIzSXVYM2RwYkd4VFpYUjBiR1ZCZENoakxuSmxjMjlzZG1Vb1pXNTBjbmtwTENCcEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdaVzUxYldWeVlYUnZjaTVmY21WdFlXbHVhVzVuTFMwN1hHNGdJQ0FnSUNBZ0lHVnVkVzFsY21GMGIzSXVYM0psYzNWc2RGdHBYU0E5SUdWdWRISjVPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMDdYRzVjYmlBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1pXNTFiV1Z5WVhSdmNpUWtSVzUxYldWeVlYUnZjaTV3Y205MGIzUjVjR1V1WDNObGRIUnNaV1JCZENBOUlHWjFibU4wYVc5dUtITjBZWFJsTENCcExDQjJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ2RtRnlJR1Z1ZFcxbGNtRjBiM0lnUFNCMGFHbHpPMXh1SUNBZ0lDQWdkbUZ5SUhCeWIyMXBjMlVnUFNCbGJuVnRaWEpoZEc5eUxuQnliMjFwYzJVN1hHNWNiaUFnSUNBZ0lHbG1JQ2h3Y205dGFYTmxMbDl6ZEdGMFpTQTlQVDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrVUVWT1JFbE9SeWtnZTF4dUlDQWdJQ0FnSUNCbGJuVnRaWEpoZEc5eUxsOXlaVzFoYVc1cGJtY3RMVHRjYmx4dUlDQWdJQ0FnSUNCcFppQW9jM1JoZEdVZ1BUMDlJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRkpGU2tWRFZFVkVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NtVnFaV04wS0hCeWIyMXBjMlVzSUhaaGJIVmxLVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNCbGJuVnRaWEpoZEc5eUxsOXlaWE4xYkhSYmFWMGdQU0IyWVd4MVpUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JwWmlBb1pXNTFiV1Z5WVhSdmNpNWZjbVZ0WVdsdWFXNW5JRDA5UFNBd0tTQjdYRzRnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKR1oxYkdacGJHd29jSEp2YldselpTd2daVzUxYldWeVlYUnZjaTVmY21WemRXeDBLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlPMXh1WEc0Z0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpHVnVkVzFsY21GMGIzSWtKRVZ1ZFcxbGNtRjBiM0l1Y0hKdmRHOTBlWEJsTGw5M2FXeHNVMlYwZEd4bFFYUWdQU0JtZFc1amRHbHZiaWh3Y205dGFYTmxMQ0JwS1NCN1hHNGdJQ0FnSUNCMllYSWdaVzUxYldWeVlYUnZjaUE5SUhSb2FYTTdYRzVjYmlBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSE4xWW5OamNtbGlaU2h3Y205dGFYTmxMQ0IxYm1SbFptbHVaV1FzSUdaMWJtTjBhVzl1S0haaGJIVmxLU0I3WEc0Z0lDQWdJQ0FnSUdWdWRXMWxjbUYwYjNJdVgzTmxkSFJzWldSQmRDaHNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUkdWVXhHU1V4TVJVUXNJR2tzSUhaaGJIVmxLVHRjYmlBZ0lDQWdJSDBzSUdaMWJtTjBhVzl1S0hKbFlYTnZiaWtnZTF4dUlDQWdJQ0FnSUNCbGJuVnRaWEpoZEc5eUxsOXpaWFIwYkdWa1FYUW9iR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtVa1ZLUlVOVVJVUXNJR2tzSUhKbFlYTnZiaWs3WEc0Z0lDQWdJQ0I5S1R0Y2JpQWdJQ0I5TzF4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpHRnNiQ1FrWVd4c0tHVnVkSEpwWlhNcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCdVpYY2diR2xpSkdWek5pUndjbTl0YVhObEpHVnVkVzFsY21GMGIzSWtKR1JsWm1GMWJIUW9kR2hwY3l3Z1pXNTBjbWxsY3lrdWNISnZiV2x6WlR0Y2JpQWdJQ0I5WEc0Z0lDQWdkbUZ5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKR0ZzYkNRa1pHVm1ZWFZzZENBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkdGc2JDUWtZV3hzTzF4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpISmhZMlVrSkhKaFkyVW9aVzUwY21sbGN5a2dlMXh1SUNBZ0lDQWdMeXBxYzJocGJuUWdkbUZzYVdSMGFHbHpPblJ5ZFdVZ0tpOWNiaUFnSUNBZ0lIWmhjaUJEYjI1emRISjFZM1J2Y2lBOUlIUm9hWE03WEc1Y2JpQWdJQ0FnSUhaaGNpQndjbTl0YVhObElEMGdibVYzSUVOdmJuTjBjblZqZEc5eUtHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHNXZiM0FwTzF4dVhHNGdJQ0FnSUNCcFppQW9JV3hwWWlSbGN6WWtjSEp2YldselpTUjFkR2xzY3lRa2FYTkJjbkpoZVNobGJuUnlhV1Z6S1NrZ2UxeHVJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnlaV3BsWTNRb2NISnZiV2x6WlN3Z2JtVjNJRlI1Y0dWRmNuSnZjaWduV1c5MUlHMTFjM1FnY0dGemN5QmhiaUJoY25KaGVTQjBieUJ5WVdObExpY3BLVHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSEJ5YjIxcGMyVTdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJSFpoY2lCc1pXNW5kR2dnUFNCbGJuUnlhV1Z6TG14bGJtZDBhRHRjYmx4dUlDQWdJQ0FnWm5WdVkzUnBiMjRnYjI1R2RXeG1hV3hzYldWdWRDaDJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnlaWE52YkhabEtIQnliMjFwYzJVc0lIWmhiSFZsS1R0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ1puVnVZM1JwYjI0Z2IyNVNaV3BsWTNScGIyNG9jbVZoYzI5dUtTQjdYRzRnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSEpsYW1WamRDaHdjbTl0YVhObExDQnlaV0Z6YjI0cE8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2NISnZiV2x6WlM1ZmMzUmhkR1VnUFQwOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pGQkZUa1JKVGtjZ0ppWWdhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSE4xWW5OamNtbGlaU2hEYjI1emRISjFZM1J2Y2k1eVpYTnZiSFpsS0dWdWRISnBaWE5iYVYwcExDQjFibVJsWm1sdVpXUXNJRzl1Um5Wc1ptbHNiRzFsYm5Rc0lHOXVVbVZxWldOMGFXOXVLVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnY21WMGRYSnVJSEJ5YjIxcGMyVTdYRzRnSUNBZ2ZWeHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa2NISnZiV2x6WlNSeVlXTmxKQ1JrWldaaGRXeDBJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtjbUZqWlNRa2NtRmpaVHRjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa2NISnZiV2x6WlNSeVpYTnZiSFpsSkNSeVpYTnZiSFpsS0c5aWFtVmpkQ2tnZTF4dUlDQWdJQ0FnTHlwcWMyaHBiblFnZG1Gc2FXUjBhR2x6T25SeWRXVWdLaTljYmlBZ0lDQWdJSFpoY2lCRGIyNXpkSEoxWTNSdmNpQTlJSFJvYVhNN1hHNWNiaUFnSUNBZ0lHbG1JQ2h2WW1wbFkzUWdKaVlnZEhsd1pXOW1JRzlpYW1WamRDQTlQVDBnSjI5aWFtVmpkQ2NnSmlZZ2IySnFaV04wTG1OdmJuTjBjblZqZEc5eUlEMDlQU0JEYjI1emRISjFZM1J2Y2lrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2IySnFaV04wTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCMllYSWdjSEp2YldselpTQTlJRzVsZHlCRGIyNXpkSEoxWTNSdmNpaHNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnViMjl3S1R0Y2JpQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhKbGMyOXNkbVVvY0hKdmJXbHpaU3dnYjJKcVpXTjBLVHRjYmlBZ0lDQWdJSEpsZEhWeWJpQndjbTl0YVhObE8xeHVJQ0FnSUgxY2JpQWdJQ0IyWVhJZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCeWIyMXBjMlVrY21WemIyeDJaU1FrWkdWbVlYVnNkQ0E5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKSEpsYzI5c2RtVWtKSEpsYzI5c2RtVTdYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCeWIyMXBjMlVrY21WcVpXTjBKQ1J5WldwbFkzUW9jbVZoYzI5dUtTQjdYRzRnSUNBZ0lDQXZLbXB6YUdsdWRDQjJZV3hwWkhSb2FYTTZkSEoxWlNBcUwxeHVJQ0FnSUNBZ2RtRnlJRU52Ym5OMGNuVmpkRzl5SUQwZ2RHaHBjenRjYmlBZ0lDQWdJSFpoY2lCd2NtOXRhWE5sSUQwZ2JtVjNJRU52Ym5OMGNuVmpkRzl5S0d4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkc1dmIzQXBPMXh1SUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtjbVZxWldOMEtIQnliMjFwYzJVc0lISmxZWE52YmlrN1hHNGdJQ0FnSUNCeVpYUjFjbTRnY0hKdmJXbHpaVHRjYmlBZ0lDQjlYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpISmxhbVZqZENRa1pHVm1ZWFZzZENBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkhKbGFtVmpkQ1FrY21WcVpXTjBPMXh1WEc0Z0lDQWdkbUZ5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKQ1JqYjNWdWRHVnlJRDBnTUR0Y2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKQ1J1WldWa2MxSmxjMjlzZG1WeUtDa2dlMXh1SUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRlI1Y0dWRmNuSnZjaWduV1c5MUlHMTFjM1FnY0dGemN5QmhJSEpsYzI5c2RtVnlJR1oxYm1OMGFXOXVJR0Z6SUhSb1pTQm1hWEp6ZENCaGNtZDFiV1Z1ZENCMGJ5QjBhR1VnY0hKdmJXbHpaU0JqYjI1emRISjFZM1J2Y2ljcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKQ1J1WldWa2MwNWxkeWdwSUh0Y2JpQWdJQ0FnSUhSb2NtOTNJRzVsZHlCVWVYQmxSWEp5YjNJb1hDSkdZV2xzWldRZ2RHOGdZMjl1YzNSeWRXTjBJQ2RRY205dGFYTmxKem9nVUd4bFlYTmxJSFZ6WlNCMGFHVWdKMjVsZHljZ2IzQmxjbUYwYjNJc0lIUm9hWE1nYjJKcVpXTjBJR052Ym5OMGNuVmpkRzl5SUdOaGJtNXZkQ0JpWlNCallXeHNaV1FnWVhNZ1lTQm1kVzVqZEdsdmJpNWNJaWs3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdkbUZ5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKQ1JrWldaaGRXeDBJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtKRkJ5YjIxcGMyVTdYRzRnSUNBZ0x5b3FYRzRnSUNBZ0lDQlFjbTl0YVhObElHOWlhbVZqZEhNZ2NtVndjbVZ6Wlc1MElIUm9aU0JsZG1WdWRIVmhiQ0J5WlhOMWJIUWdiMllnWVc0Z1lYTjVibU5vY205dWIzVnpJRzl3WlhKaGRHbHZiaTRnVkdobFhHNGdJQ0FnSUNCd2NtbHRZWEo1SUhkaGVTQnZaaUJwYm5SbGNtRmpkR2x1WnlCM2FYUm9JR0VnY0hKdmJXbHpaU0JwY3lCMGFISnZkV2RvSUdsMGN5QmdkR2hsYm1BZ2JXVjBhRzlrTENCM2FHbGphRnh1SUNBZ0lDQWdjbVZuYVhOMFpYSnpJR05oYkd4aVlXTnJjeUIwYnlCeVpXTmxhWFpsSUdWcGRHaGxjaUJoSUhCeWIyMXBjMlVuY3lCbGRtVnVkSFZoYkNCMllXeDFaU0J2Y2lCMGFHVWdjbVZoYzI5dVhHNGdJQ0FnSUNCM2FIa2dkR2hsSUhCeWIyMXBjMlVnWTJGdWJtOTBJR0psSUdaMWJHWnBiR3hsWkM1Y2JseHVJQ0FnSUNBZ1ZHVnliV2x1YjJ4dlozbGNiaUFnSUNBZ0lDMHRMUzB0TFMwdExTMHRYRzVjYmlBZ0lDQWdJQzBnWUhCeWIyMXBjMlZnSUdseklHRnVJRzlpYW1WamRDQnZjaUJtZFc1amRHbHZiaUIzYVhSb0lHRWdZSFJvWlc1Z0lHMWxkR2h2WkNCM2FHOXpaU0JpWldoaGRtbHZjaUJqYjI1bWIzSnRjeUIwYnlCMGFHbHpJSE53WldOcFptbGpZWFJwYjI0dVhHNGdJQ0FnSUNBdElHQjBhR1Z1WVdKc1pXQWdhWE1nWVc0Z2IySnFaV04wSUc5eUlHWjFibU4wYVc5dUlIUm9ZWFFnWkdWbWFXNWxjeUJoSUdCMGFHVnVZQ0J0WlhSb2IyUXVYRzRnSUNBZ0lDQXRJR0IyWVd4MVpXQWdhWE1nWVc1NUlHeGxaMkZzSUVwaGRtRlRZM0pwY0hRZ2RtRnNkV1VnS0dsdVkyeDFaR2x1WnlCMWJtUmxabWx1WldRc0lHRWdkR2hsYm1GaWJHVXNJRzl5SUdFZ2NISnZiV2x6WlNrdVhHNGdJQ0FnSUNBdElHQmxlR05sY0hScGIyNWdJR2x6SUdFZ2RtRnNkV1VnZEdoaGRDQnBjeUIwYUhKdmQyNGdkWE5wYm1jZ2RHaGxJSFJvY205M0lITjBZWFJsYldWdWRDNWNiaUFnSUNBZ0lDMGdZSEpsWVhOdmJtQWdhWE1nWVNCMllXeDFaU0IwYUdGMElHbHVaR2xqWVhSbGN5QjNhSGtnWVNCd2NtOXRhWE5sSUhkaGN5QnlaV3BsWTNSbFpDNWNiaUFnSUNBZ0lDMGdZSE5sZEhSc1pXUmdJSFJvWlNCbWFXNWhiQ0J5WlhOMGFXNW5JSE4wWVhSbElHOW1JR0VnY0hKdmJXbHpaU3dnWm5Wc1ptbHNiR1ZrSUc5eUlISmxhbVZqZEdWa0xseHVYRzRnSUNBZ0lDQkJJSEJ5YjIxcGMyVWdZMkZ1SUdKbElHbHVJRzl1WlNCdlppQjBhSEpsWlNCemRHRjBaWE02SUhCbGJtUnBibWNzSUdaMWJHWnBiR3hsWkN3Z2IzSWdjbVZxWldOMFpXUXVYRzVjYmlBZ0lDQWdJRkJ5YjIxcGMyVnpJSFJvWVhRZ1lYSmxJR1oxYkdacGJHeGxaQ0JvWVhabElHRWdablZzWm1sc2JHMWxiblFnZG1Gc2RXVWdZVzVrSUdGeVpTQnBiaUIwYUdVZ1puVnNabWxzYkdWa1hHNGdJQ0FnSUNCemRHRjBaUzRnSUZCeWIyMXBjMlZ6SUhSb1lYUWdZWEpsSUhKbGFtVmpkR1ZrSUdoaGRtVWdZU0J5WldwbFkzUnBiMjRnY21WaGMyOXVJR0Z1WkNCaGNtVWdhVzRnZEdobFhHNGdJQ0FnSUNCeVpXcGxZM1JsWkNCemRHRjBaUzRnSUVFZ1puVnNabWxzYkcxbGJuUWdkbUZzZFdVZ2FYTWdibVYyWlhJZ1lTQjBhR1Z1WVdKc1pTNWNibHh1SUNBZ0lDQWdVSEp2YldselpYTWdZMkZ1SUdGc2MyOGdZbVVnYzJGcFpDQjBieUFxY21WemIyeDJaU29nWVNCMllXeDFaUzRnSUVsbUlIUm9hWE1nZG1Gc2RXVWdhWE1nWVd4emJ5QmhYRzRnSUNBZ0lDQndjbTl0YVhObExDQjBhR1Z1SUhSb1pTQnZjbWxuYVc1aGJDQndjbTl0YVhObEozTWdjMlYwZEd4bFpDQnpkR0YwWlNCM2FXeHNJRzFoZEdOb0lIUm9aU0IyWVd4MVpTZHpYRzRnSUNBZ0lDQnpaWFIwYkdWa0lITjBZWFJsTGlBZ1UyOGdZU0J3Y205dGFYTmxJSFJvWVhRZ0tuSmxjMjlzZG1WektpQmhJSEJ5YjIxcGMyVWdkR2hoZENCeVpXcGxZM1J6SUhkcGJHeGNiaUFnSUNBZ0lHbDBjMlZzWmlCeVpXcGxZM1FzSUdGdVpDQmhJSEJ5YjIxcGMyVWdkR2hoZENBcWNtVnpiMngyWlhNcUlHRWdjSEp2YldselpTQjBhR0YwSUdaMWJHWnBiR3h6SUhkcGJHeGNiaUFnSUNBZ0lHbDBjMlZzWmlCbWRXeG1hV3hzTGx4dVhHNWNiaUFnSUNBZ0lFSmhjMmxqSUZWellXZGxPbHh1SUNBZ0lDQWdMUzB0TFMwdExTMHRMUzB0WEc1Y2JpQWdJQ0FnSUdCZ1lHcHpYRzRnSUNBZ0lDQjJZWElnY0hKdmJXbHpaU0E5SUc1bGR5QlFjbTl0YVhObEtHWjFibU4wYVc5dUtISmxjMjlzZG1Vc0lISmxhbVZqZENrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJ2YmlCemRXTmpaWE56WEc0Z0lDQWdJQ0FnSUhKbGMyOXNkbVVvZG1Gc2RXVXBPMXh1WEc0Z0lDQWdJQ0FnSUM4dklHOXVJR1poYVd4MWNtVmNiaUFnSUNBZ0lDQWdjbVZxWldOMEtISmxZWE52YmlrN1hHNGdJQ0FnSUNCOUtUdGNibHh1SUNBZ0lDQWdjSEp2YldselpTNTBhR1Z1S0daMWJtTjBhVzl1S0haaGJIVmxLU0I3WEc0Z0lDQWdJQ0FnSUM4dklHOXVJR1oxYkdacGJHeHRaVzUwWEc0Z0lDQWdJQ0I5TENCbWRXNWpkR2x2YmloeVpXRnpiMjRwSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdiMjRnY21WcVpXTjBhVzl1WEc0Z0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUdCZ1lGeHVYRzRnSUNBZ0lDQkJaSFpoYm1ObFpDQlZjMkZuWlRwY2JpQWdJQ0FnSUMwdExTMHRMUzB0TFMwdExTMHRMVnh1WEc0Z0lDQWdJQ0JRY205dGFYTmxjeUJ6YUdsdVpTQjNhR1Z1SUdGaWMzUnlZV04wYVc1bklHRjNZWGtnWVhONWJtTm9jbTl1YjNWeklHbHVkR1Z5WVdOMGFXOXVjeUJ6ZFdOb0lHRnpYRzRnSUNBZ0lDQmdXRTFNU0hSMGNGSmxjWFZsYzNSZ2N5NWNibHh1SUNBZ0lDQWdZR0JnYW5OY2JpQWdJQ0FnSUdaMWJtTjBhVzl1SUdkbGRFcFRUMDRvZFhKc0tTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnVaWGNnVUhKdmJXbHpaU2htZFc1amRHbHZiaWh5WlhOdmJIWmxMQ0J5WldwbFkzUXBlMXh1SUNBZ0lDQWdJQ0FnSUhaaGNpQjRhSElnUFNCdVpYY2dXRTFNU0hSMGNGSmxjWFZsYzNRb0tUdGNibHh1SUNBZ0lDQWdJQ0FnSUhob2NpNXZjR1Z1S0NkSFJWUW5MQ0IxY213cE8xeHVJQ0FnSUNBZ0lDQWdJSGhvY2k1dmJuSmxZV1I1YzNSaGRHVmphR0Z1WjJVZ1BTQm9ZVzVrYkdWeU8xeHVJQ0FnSUNBZ0lDQWdJSGhvY2k1eVpYTndiMjV6WlZSNWNHVWdQU0FuYW5OdmJpYzdYRzRnSUNBZ0lDQWdJQ0FnZUdoeUxuTmxkRkpsY1hWbGMzUklaV0ZrWlhJb0owRmpZMlZ3ZENjc0lDZGhjSEJzYVdOaGRHbHZiaTlxYzI5dUp5azdYRzRnSUNBZ0lDQWdJQ0FnZUdoeUxuTmxibVFvS1R0Y2JseHVJQ0FnSUNBZ0lDQWdJR1oxYm1OMGFXOXVJR2hoYm1Sc1pYSW9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NXlaV0ZrZVZOMFlYUmxJRDA5UFNCMGFHbHpMa1JQVGtVcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWMzUmhkSFZ6SUQwOVBTQXlNREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTnZiSFpsS0hSb2FYTXVjbVZ6Y0c5dWMyVXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxhbVZqZENodVpYY2dSWEp5YjNJb0oyZGxkRXBUVDA0NklHQW5JQ3NnZFhKc0lDc2dKMkFnWm1GcGJHVmtJSGRwZEdnZ2MzUmhkSFZ6T2lCYkp5QXJJSFJvYVhNdWMzUmhkSFZ6SUNzZ0oxMG5LU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0I5TzF4dUlDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdaMlYwU2xOUFRpZ25MM0J2YzNSekxtcHpiMjRuS1M1MGFHVnVLR1oxYm1OMGFXOXVLR3B6YjI0cElIdGNiaUFnSUNBZ0lDQWdMeThnYjI0Z1puVnNabWxzYkcxbGJuUmNiaUFnSUNBZ0lIMHNJR1oxYm1OMGFXOXVLSEpsWVhOdmJpa2dlMXh1SUNBZ0lDQWdJQ0F2THlCdmJpQnlaV3BsWTNScGIyNWNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdZR0JnWEc1Y2JpQWdJQ0FnSUZWdWJHbHJaU0JqWVd4c1ltRmphM01zSUhCeWIyMXBjMlZ6SUdGeVpTQm5jbVZoZENCamIyMXdiM05oWW14bElIQnlhVzFwZEdsMlpYTXVYRzVjYmlBZ0lDQWdJR0JnWUdwelhHNGdJQ0FnSUNCUWNtOXRhWE5sTG1Gc2JDaGJYRzRnSUNBZ0lDQWdJR2RsZEVwVFQwNG9KeTl3YjNOMGN5Y3BMRnh1SUNBZ0lDQWdJQ0JuWlhSS1UwOU9LQ2N2WTI5dGJXVnVkSE1uS1Z4dUlDQWdJQ0FnWFNrdWRHaGxiaWhtZFc1amRHbHZiaWgyWVd4MVpYTXBlMXh1SUNBZ0lDQWdJQ0IyWVd4MVpYTmJNRjBnTHk4Z1BUNGdjRzl6ZEhOS1UwOU9YRzRnSUNBZ0lDQWdJSFpoYkhWbGMxc3hYU0F2THlBOVBpQmpiMjF0Wlc1MGMwcFRUMDVjYmx4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZG1Gc2RXVnpPMXh1SUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0JnWUdCY2JseHVJQ0FnSUNBZ1FHTnNZWE56SUZCeWIyMXBjMlZjYmlBZ0lDQWdJRUJ3WVhKaGJTQjdablZ1WTNScGIyNTlJSEpsYzI5c2RtVnlYRzRnSUNBZ0lDQlZjMlZtZFd3Z1ptOXlJSFJ2YjJ4cGJtY3VYRzRnSUNBZ0lDQkFZMjl1YzNSeWRXTjBiM0pjYmlBZ0lDQXFMMXh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkNSUWNtOXRhWE5sS0hKbGMyOXNkbVZ5S1NCN1hHNGdJQ0FnSUNCMGFHbHpMbDlwWkNBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkNSamIzVnVkR1Z5S3lzN1hHNGdJQ0FnSUNCMGFHbHpMbDl6ZEdGMFpTQTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQWdJSFJvYVhNdVgzSmxjM1ZzZENBOUlIVnVaR1ZtYVc1bFpEdGNiaUFnSUNBZ0lIUm9hWE11WDNOMVluTmpjbWxpWlhKeklEMGdXMTA3WEc1Y2JpQWdJQ0FnSUdsbUlDaHNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnViMjl3SUNFOVBTQnlaWE52YkhabGNpa2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb0lXeHBZaVJsY3pZa2NISnZiV2x6WlNSMWRHbHNjeVFrYVhOR2RXNWpkR2x2YmloeVpYTnZiSFpsY2lrcElIdGNiaUFnSUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtjSEp2YldselpTUWtibVZsWkhOU1pYTnZiSFpsY2lncE8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnYVdZZ0tDRW9kR2hwY3lCcGJuTjBZVzVqWlc5bUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkNSUWNtOXRhWE5sS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpDUnVaV1ZrYzA1bGR5Z3BPMXh1SUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2FXNXBkR2xoYkdsNlpWQnliMjFwYzJVb2RHaHBjeXdnY21WemIyeDJaWElwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmx4dUlDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpDUlFjbTl0YVhObExtRnNiQ0E5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKR0ZzYkNRa1pHVm1ZWFZzZER0Y2JpQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtjSEp2YldselpTUWtVSEp2YldselpTNXlZV05sSUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCeWIyMXBjMlVrY21GalpTUWtaR1ZtWVhWc2REdGNiaUFnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrY0hKdmJXbHpaU1FrVUhKdmJXbHpaUzV5WlhOdmJIWmxJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtjbVZ6YjJ4MlpTUWtaR1ZtWVhWc2REdGNiaUFnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrY0hKdmJXbHpaU1FrVUhKdmJXbHpaUzV5WldwbFkzUWdQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtjSEp2YldselpTUnlaV3BsWTNRa0pHUmxabUYxYkhRN1hHNGdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtKRkJ5YjIxcGMyVXVYM05sZEZOamFHVmtkV3hsY2lBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1J6WlhSVFkyaGxaSFZzWlhJN1hHNGdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtKRkJ5YjIxcGMyVXVYM05sZEVGellYQWdQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2MyVjBRWE5oY0R0Y2JpQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtjSEp2YldselpTUWtVSEp2YldselpTNWZZWE5oY0NBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JoYzJGd08xeHVYRzRnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCeWIyMXBjMlVrSkZCeWIyMXBjMlV1Y0hKdmRHOTBlWEJsSUQwZ2UxeHVJQ0FnSUNBZ1kyOXVjM1J5ZFdOMGIzSTZJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpDUlFjbTl0YVhObExGeHVYRzRnSUNBZ0x5b3FYRzRnSUNBZ0lDQlVhR1VnY0hKcGJXRnllU0IzWVhrZ2IyWWdhVzUwWlhKaFkzUnBibWNnZDJsMGFDQmhJSEJ5YjIxcGMyVWdhWE1nZEdoeWIzVm5hQ0JwZEhNZ1lIUm9aVzVnSUcxbGRHaHZaQ3hjYmlBZ0lDQWdJSGRvYVdOb0lISmxaMmx6ZEdWeWN5QmpZV3hzWW1GamEzTWdkRzhnY21WalpXbDJaU0JsYVhSb1pYSWdZU0J3Y205dGFYTmxKM01nWlhabGJuUjFZV3dnZG1Gc2RXVWdiM0lnZEdobFhHNGdJQ0FnSUNCeVpXRnpiMjRnZDJoNUlIUm9aU0J3Y205dGFYTmxJR05oYm01dmRDQmlaU0JtZFd4bWFXeHNaV1F1WEc1Y2JpQWdJQ0FnSUdCZ1lHcHpYRzRnSUNBZ0lDQm1hVzVrVlhObGNpZ3BMblJvWlc0b1puVnVZM1JwYjI0b2RYTmxjaWw3WEc0Z0lDQWdJQ0FnSUM4dklIVnpaWElnYVhNZ1lYWmhhV3hoWW14bFhHNGdJQ0FnSUNCOUxDQm1kVzVqZEdsdmJpaHlaV0Z6YjI0cGUxeHVJQ0FnSUNBZ0lDQXZMeUIxYzJWeUlHbHpJSFZ1WVhaaGFXeGhZbXhsTENCaGJtUWdlVzkxSUdGeVpTQm5hWFpsYmlCMGFHVWdjbVZoYzI5dUlIZG9lVnh1SUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0JnWUdCY2JseHVJQ0FnSUNBZ1EyaGhhVzVwYm1kY2JpQWdJQ0FnSUMwdExTMHRMUzB0WEc1Y2JpQWdJQ0FnSUZSb1pTQnlaWFIxY200Z2RtRnNkV1VnYjJZZ1lIUm9aVzVnSUdseklHbDBjMlZzWmlCaElIQnliMjFwYzJVdUlDQlVhR2x6SUhObFkyOXVaQ3dnSjJSdmQyNXpkSEpsWVcwblhHNGdJQ0FnSUNCd2NtOXRhWE5sSUdseklISmxjMjlzZG1Wa0lIZHBkR2dnZEdobElISmxkSFZ5YmlCMllXeDFaU0J2WmlCMGFHVWdabWx5YzNRZ2NISnZiV2x6WlNkeklHWjFiR1pwYkd4dFpXNTBYRzRnSUNBZ0lDQnZjaUJ5WldwbFkzUnBiMjRnYUdGdVpHeGxjaXdnYjNJZ2NtVnFaV04wWldRZ2FXWWdkR2hsSUdoaGJtUnNaWElnZEdoeWIzZHpJR0Z1SUdWNFkyVndkR2x2Ymk1Y2JseHVJQ0FnSUNBZ1lHQmdhbk5jYmlBZ0lDQWdJR1pwYm1SVmMyVnlLQ2t1ZEdobGJpaG1kVzVqZEdsdmJpQW9kWE5sY2lrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RYTmxjaTV1WVcxbE8xeHVJQ0FnSUNBZ2ZTd2dablZ1WTNScGIyNGdLSEpsWVhOdmJpa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdKMlJsWm1GMWJIUWdibUZ0WlNjN1hHNGdJQ0FnSUNCOUtTNTBhR1Z1S0daMWJtTjBhVzl1SUNoMWMyVnlUbUZ0WlNrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJKWmlCZ1ptbHVaRlZ6WlhKZ0lHWjFiR1pwYkd4bFpDd2dZSFZ6WlhKT1lXMWxZQ0IzYVd4c0lHSmxJSFJvWlNCMWMyVnlKM01nYm1GdFpTd2diM1JvWlhKM2FYTmxJR2wwWEc0Z0lDQWdJQ0FnSUM4dklIZHBiR3dnWW1VZ1lDZGtaV1poZFd4MElHNWhiV1VuWUZ4dUlDQWdJQ0FnZlNrN1hHNWNiaUFnSUNBZ0lHWnBibVJWYzJWeUtDa3VkR2hsYmlobWRXNWpkR2x2YmlBb2RYTmxjaWtnZTF4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjBadmRXNWtJSFZ6WlhJc0lHSjFkQ0J6ZEdsc2JDQjFibWhoY0hCNUp5azdYRzRnSUNBZ0lDQjlMQ0JtZFc1amRHbHZiaUFvY21WaGMyOXVLU0I3WEc0Z0lDQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWduWUdacGJtUlZjMlZ5WUNCeVpXcGxZM1JsWkNCaGJtUWdkMlVuY21VZ2RXNW9ZWEJ3ZVNjcE8xeHVJQ0FnSUNBZ2ZTa3VkR2hsYmlobWRXNWpkR2x2YmlBb2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdibVYyWlhJZ2NtVmhZMmhsWkZ4dUlDQWdJQ0FnZlN3Z1puVnVZM1JwYjI0Z0tISmxZWE52YmlrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJwWmlCZ1ptbHVaRlZ6WlhKZ0lHWjFiR1pwYkd4bFpDd2dZSEpsWVhOdmJtQWdkMmxzYkNCaVpTQW5SbTkxYm1RZ2RYTmxjaXdnWW5WMElITjBhV3hzSUhWdWFHRndjSGtuTGx4dUlDQWdJQ0FnSUNBdkx5QkpaaUJnWm1sdVpGVnpaWEpnSUhKbGFtVmpkR1ZrTENCZ2NtVmhjMjl1WUNCM2FXeHNJR0psSUNkZ1ptbHVaRlZ6WlhKZ0lISmxhbVZqZEdWa0lHRnVaQ0IzWlNkeVpTQjFibWhoY0hCNUp5NWNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdZR0JnWEc0Z0lDQWdJQ0JKWmlCMGFHVWdaRzkzYm5OMGNtVmhiU0J3Y205dGFYTmxJR1J2WlhNZ2JtOTBJSE53WldOcFpua2dZU0J5WldwbFkzUnBiMjRnYUdGdVpHeGxjaXdnY21WcVpXTjBhVzl1SUhKbFlYTnZibk1nZDJsc2JDQmlaU0J3Y205d1lXZGhkR1ZrSUdaMWNuUm9aWElnWkc5M2JuTjBjbVZoYlM1Y2JseHVJQ0FnSUNBZ1lHQmdhbk5jYmlBZ0lDQWdJR1pwYm1SVmMyVnlLQ2t1ZEdobGJpaG1kVzVqZEdsdmJpQW9kWE5sY2lrZ2UxeHVJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dVR1ZrWVdkdloybGpZV3hGZUdObGNIUnBiMjRvSjFWd2MzUnlaV0Z0SUdWeWNtOXlKeWs3WEc0Z0lDQWdJQ0I5S1M1MGFHVnVLR1oxYm1OMGFXOXVJQ2gyWVd4MVpTa2dlMXh1SUNBZ0lDQWdJQ0F2THlCdVpYWmxjaUJ5WldGamFHVmtYRzRnSUNBZ0lDQjlLUzUwYUdWdUtHWjFibU4wYVc5dUlDaDJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJ1WlhabGNpQnlaV0ZqYUdWa1hHNGdJQ0FnSUNCOUxDQm1kVzVqZEdsdmJpQW9jbVZoYzI5dUtTQjdYRzRnSUNBZ0lDQWdJQzh2SUZSb1pTQmdVR1ZrWjJGbmIyTnBZV3hGZUdObGNIUnBiMjVnSUdseklIQnliM0JoWjJGMFpXUWdZV3hzSUhSb1pTQjNZWGtnWkc5M2JpQjBieUJvWlhKbFhHNGdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lHQmdZRnh1WEc0Z0lDQWdJQ0JCYzNOcGJXbHNZWFJwYjI1Y2JpQWdJQ0FnSUMwdExTMHRMUzB0TFMwdExWeHVYRzRnSUNBZ0lDQlRiMjFsZEdsdFpYTWdkR2hsSUhaaGJIVmxJSGx2ZFNCM1lXNTBJSFJ2SUhCeWIzQmhaMkYwWlNCMGJ5QmhJR1J2ZDI1emRISmxZVzBnY0hKdmJXbHpaU0JqWVc0Z2IyNXNlU0JpWlZ4dUlDQWdJQ0FnY21WMGNtbGxkbVZrSUdGemVXNWphSEp2Ym05MWMyeDVMaUJVYUdseklHTmhiaUJpWlNCaFkyaHBaWFpsWkNCaWVTQnlaWFIxY201cGJtY2dZU0J3Y205dGFYTmxJR2x1SUhSb1pWeHVJQ0FnSUNBZ1puVnNabWxzYkcxbGJuUWdiM0lnY21WcVpXTjBhVzl1SUdoaGJtUnNaWEl1SUZSb1pTQmtiM2R1YzNSeVpXRnRJSEJ5YjIxcGMyVWdkMmxzYkNCMGFHVnVJR0psSUhCbGJtUnBibWRjYmlBZ0lDQWdJSFZ1ZEdsc0lIUm9aU0J5WlhSMWNtNWxaQ0J3Y205dGFYTmxJR2x6SUhObGRIUnNaV1F1SUZSb2FYTWdhWE1nWTJGc2JHVmtJQ3BoYzNOcGJXbHNZWFJwYjI0cUxseHVYRzRnSUNBZ0lDQmdZR0JxYzF4dUlDQWdJQ0FnWm1sdVpGVnpaWElvS1M1MGFHVnVLR1oxYm1OMGFXOXVJQ2gxYzJWeUtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQm1hVzVrUTI5dGJXVnVkSE5DZVVGMWRHaHZjaWgxYzJWeUtUdGNiaUFnSUNBZ0lIMHBMblJvWlc0b1puVnVZM1JwYjI0Z0tHTnZiVzFsYm5SektTQjdYRzRnSUNBZ0lDQWdJQzh2SUZSb1pTQjFjMlZ5SjNNZ1kyOXRiV1Z1ZEhNZ1lYSmxJRzV2ZHlCaGRtRnBiR0ZpYkdWY2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ1lHQmdYRzVjYmlBZ0lDQWdJRWxtSUhSb1pTQmhjM05wYld4cFlYUmxaQ0J3Y205dGFYTmxJSEpsYW1WamRITXNJSFJvWlc0Z2RHaGxJR1J2ZDI1emRISmxZVzBnY0hKdmJXbHpaU0IzYVd4c0lHRnNjMjhnY21WcVpXTjBMbHh1WEc0Z0lDQWdJQ0JnWUdCcWMxeHVJQ0FnSUNBZ1ptbHVaRlZ6WlhJb0tTNTBhR1Z1S0daMWJtTjBhVzl1SUNoMWMyVnlLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJtYVc1a1EyOXRiV1Z1ZEhOQ2VVRjFkR2h2Y2loMWMyVnlLVHRjYmlBZ0lDQWdJSDBwTG5Sb1pXNG9ablZ1WTNScGIyNGdLR052YlcxbGJuUnpLU0I3WEc0Z0lDQWdJQ0FnSUM4dklFbG1JR0JtYVc1a1EyOXRiV1Z1ZEhOQ2VVRjFkR2h2Y21BZ1puVnNabWxzYkhNc0lIZGxKMnhzSUdoaGRtVWdkR2hsSUhaaGJIVmxJR2hsY21WY2JpQWdJQ0FnSUgwc0lHWjFibU4wYVc5dUlDaHlaV0Z6YjI0cElIdGNiaUFnSUNBZ0lDQWdMeThnU1dZZ1lHWnBibVJEYjIxdFpXNTBjMEo1UVhWMGFHOXlZQ0J5WldwbFkzUnpMQ0IzWlNkc2JDQm9ZWFpsSUhSb1pTQnlaV0Z6YjI0Z2FHVnlaVnh1SUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0JnWUdCY2JseHVJQ0FnSUNBZ1UybHRjR3hsSUVWNFlXMXdiR1ZjYmlBZ0lDQWdJQzB0TFMwdExTMHRMUzB0TFMwdFhHNWNiaUFnSUNBZ0lGTjVibU5vY205dWIzVnpJRVY0WVcxd2JHVmNibHh1SUNBZ0lDQWdZR0JnYW1GMllYTmpjbWx3ZEZ4dUlDQWdJQ0FnZG1GeUlISmxjM1ZzZER0Y2JseHVJQ0FnSUNBZ2RISjVJSHRjYmlBZ0lDQWdJQ0FnY21WemRXeDBJRDBnWm1sdVpGSmxjM1ZzZENncE8xeHVJQ0FnSUNBZ0lDQXZMeUJ6ZFdOalpYTnpYRzRnSUNBZ0lDQjlJR05oZEdOb0tISmxZWE52YmlrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJtWVdsc2RYSmxYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQmdZR0JjYmx4dUlDQWdJQ0FnUlhKeVltRmpheUJGZUdGdGNHeGxYRzVjYmlBZ0lDQWdJR0JnWUdwelhHNGdJQ0FnSUNCbWFXNWtVbVZ6ZFd4MEtHWjFibU4wYVc5dUtISmxjM1ZzZEN3Z1pYSnlLWHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHVnljaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDOHZJR1poYVd4MWNtVmNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0F2THlCemRXTmpaWE56WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ1lHQmdYRzVjYmlBZ0lDQWdJRkJ5YjIxcGMyVWdSWGhoYlhCc1pUdGNibHh1SUNBZ0lDQWdZR0JnYW1GMllYTmpjbWx3ZEZ4dUlDQWdJQ0FnWm1sdVpGSmxjM1ZzZENncExuUm9aVzRvWm5WdVkzUnBiMjRvY21WemRXeDBLWHRjYmlBZ0lDQWdJQ0FnTHk4Z2MzVmpZMlZ6YzF4dUlDQWdJQ0FnZlN3Z1puVnVZM1JwYjI0b2NtVmhjMjl1S1h0Y2JpQWdJQ0FnSUNBZ0x5OGdabUZwYkhWeVpWeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQmdZR0JjYmx4dUlDQWdJQ0FnUVdSMllXNWpaV1FnUlhoaGJYQnNaVnh1SUNBZ0lDQWdMUzB0TFMwdExTMHRMUzB0TFMxY2JseHVJQ0FnSUNBZ1UzbHVZMmh5YjI1dmRYTWdSWGhoYlhCc1pWeHVYRzRnSUNBZ0lDQmdZR0JxWVhaaGMyTnlhWEIwWEc0Z0lDQWdJQ0IyWVhJZ1lYVjBhRzl5TENCaWIyOXJjenRjYmx4dUlDQWdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lDQWdZWFYwYUc5eUlEMGdabWx1WkVGMWRHaHZjaWdwTzF4dUlDQWdJQ0FnSUNCaWIyOXJjeUFnUFNCbWFXNWtRbTl2YTNOQ2VVRjFkR2h2Y2loaGRYUm9iM0lwTzF4dUlDQWdJQ0FnSUNBdkx5QnpkV05qWlhOelhHNGdJQ0FnSUNCOUlHTmhkR05vS0hKbFlYTnZiaWtnZTF4dUlDQWdJQ0FnSUNBdkx5Qm1ZV2xzZFhKbFhHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCZ1lHQmNibHh1SUNBZ0lDQWdSWEp5WW1GamF5QkZlR0Z0Y0d4bFhHNWNiaUFnSUNBZ0lHQmdZR3B6WEc1Y2JpQWdJQ0FnSUdaMWJtTjBhVzl1SUdadmRXNWtRbTl2YTNNb1ltOXZhM01wSUh0Y2JseHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQm1kVzVqZEdsdmJpQm1ZV2xzZFhKbEtISmxZWE52YmlrZ2UxeHVYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJR1pwYm1SQmRYUm9iM0lvWm5WdVkzUnBiMjRvWVhWMGFHOXlMQ0JsY25JcGUxeHVJQ0FnSUNBZ0lDQnBaaUFvWlhKeUtTQjdYRzRnSUNBZ0lDQWdJQ0FnWm1GcGJIVnlaU2hsY25JcE8xeHVJQ0FnSUNBZ0lDQWdJQzh2SUdaaGFXeDFjbVZjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1ptbHVaRUp2YjI5cmMwSjVRWFYwYUc5eUtHRjFkR2h2Y2l3Z1puVnVZM1JwYjI0b1ltOXZhM01zSUdWeWNpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWlhKeUtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabUZwYkhWeVpTaGxjbklwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJ5ZVNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1iM1Z1WkVKdmIydHpLR0p2YjJ0ektUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR05oZEdOb0tISmxZWE52YmlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabUZwYkhWeVpTaHlaV0Z6YjI0cE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNBZ0lDQWdmU0JqWVhSamFDaGxjbkp2Y2lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWm1GcGJIVnlaU2hsY25JcE8xeHVJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBdkx5QnpkV05qWlhOelhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdZR0JnWEc1Y2JpQWdJQ0FnSUZCeWIyMXBjMlVnUlhoaGJYQnNaVHRjYmx4dUlDQWdJQ0FnWUdCZ2FtRjJZWE5qY21sd2RGeHVJQ0FnSUNBZ1ptbHVaRUYxZEdodmNpZ3BMbHh1SUNBZ0lDQWdJQ0IwYUdWdUtHWnBibVJDYjI5cmMwSjVRWFYwYUc5eUtTNWNiaUFnSUNBZ0lDQWdkR2hsYmlobWRXNWpkR2x2YmloaWIyOXJjeWw3WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdabTkxYm1RZ1ltOXZhM05jYmlBZ0lDQWdJSDBwTG1OaGRHTm9LR1oxYm1OMGFXOXVLSEpsWVhOdmJpbDdYRzRnSUNBZ0lDQWdJQzh2SUhOdmJXVjBhR2x1WnlCM1pXNTBJSGR5YjI1blhHNGdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lHQmdZRnh1WEc0Z0lDQWdJQ0JBYldWMGFHOWtJSFJvWlc1Y2JpQWdJQ0FnSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUc5dVJuVnNabWxzYkdWa1hHNGdJQ0FnSUNCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCdmJsSmxhbVZqZEdWa1hHNGdJQ0FnSUNCVmMyVm1kV3dnWm05eUlIUnZiMnhwYm1jdVhHNGdJQ0FnSUNCQWNtVjBkWEp1SUh0UWNtOXRhWE5sZlZ4dUlDQWdJQ292WEc0Z0lDQWdJQ0IwYUdWdU9pQm1kVzVqZEdsdmJpaHZia1oxYkdacGJHeHRaVzUwTENCdmJsSmxhbVZqZEdsdmJpa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2NHRnlaVzUwSUQwZ2RHaHBjenRjYmlBZ0lDQWdJQ0FnZG1GeUlITjBZWFJsSUQwZ2NHRnlaVzUwTGw5emRHRjBaVHRjYmx4dUlDQWdJQ0FnSUNCcFppQW9jM1JoZEdVZ1BUMDlJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRVpWVEVaSlRFeEZSQ0FtSmlBaGIyNUdkV3htYVd4c2JXVnVkQ0I4ZkNCemRHRjBaU0E5UFQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1VrVktSVU5VUlVRZ0ppWWdJVzl1VW1WcVpXTjBhVzl1S1NCN1hHNGdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE03WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQjJZWElnWTJocGJHUWdQU0J1WlhjZ2RHaHBjeTVqYjI1emRISjFZM1J2Y2loc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSdWIyOXdLVHRjYmlBZ0lDQWdJQ0FnZG1GeUlISmxjM1ZzZENBOUlIQmhjbVZ1ZEM1ZmNtVnpkV3gwTzF4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2h6ZEdGMFpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUhaaGNpQmpZV3hzWW1GamF5QTlJR0Z5WjNWdFpXNTBjMXR6ZEdGMFpTQXRJREZkTzF4dUlDQWdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JoYzJGd0tHWjFibU4wYVc5dUtDbDdYRzRnSUNBZ0lDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNScGJuWnZhMlZEWVd4c1ltRmpheWh6ZEdGMFpTd2dZMmhwYkdRc0lHTmhiR3hpWVdOckxDQnlaWE4xYkhRcE8xeHVJQ0FnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pITjFZbk5qY21saVpTaHdZWEpsYm5Rc0lHTm9hV3hrTENCdmJrWjFiR1pwYkd4dFpXNTBMQ0J2YmxKbGFtVmpkR2x2YmlrN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdZMmhwYkdRN1hHNGdJQ0FnSUNCOUxGeHVYRzRnSUNBZ0x5b3FYRzRnSUNBZ0lDQmdZMkYwWTJoZ0lHbHpJSE5wYlhCc2VTQnpkV2RoY2lCbWIzSWdZSFJvWlc0b2RXNWtaV1pwYm1Wa0xDQnZibEpsYW1WamRHbHZiaWxnSUhkb2FXTm9JRzFoYTJWeklHbDBJSFJvWlNCellXMWxYRzRnSUNBZ0lDQmhjeUIwYUdVZ1kyRjBZMmdnWW14dlkyc2diMllnWVNCMGNua3ZZMkYwWTJnZ2MzUmhkR1Z0Wlc1MExseHVYRzRnSUNBZ0lDQmdZR0JxYzF4dUlDQWdJQ0FnWm5WdVkzUnBiMjRnWm1sdVpFRjFkR2h2Y2lncGUxeHVJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0oyTnZkV3hrYmlkMElHWnBibVFnZEdoaGRDQmhkWFJvYjNJbktUdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdMeThnYzNsdVkyaHliMjV2ZFhOY2JpQWdJQ0FnSUhSeWVTQjdYRzRnSUNBZ0lDQWdJR1pwYm1SQmRYUm9iM0lvS1R0Y2JpQWdJQ0FnSUgwZ1kyRjBZMmdvY21WaGMyOXVLU0I3WEc0Z0lDQWdJQ0FnSUM4dklITnZiV1YwYUdsdVp5QjNaVzUwSUhkeWIyNW5YRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQzh2SUdGemVXNWpJSGRwZEdnZ2NISnZiV2x6WlhOY2JpQWdJQ0FnSUdacGJtUkJkWFJvYjNJb0tTNWpZWFJqYUNobWRXNWpkR2x2YmloeVpXRnpiMjRwZTF4dUlDQWdJQ0FnSUNBdkx5QnpiMjFsZEdocGJtY2dkMlZ1ZENCM2NtOXVaMXh1SUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0JnWUdCY2JseHVJQ0FnSUNBZ1FHMWxkR2h2WkNCallYUmphRnh1SUNBZ0lDQWdRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdiMjVTWldwbFkzUnBiMjVjYmlBZ0lDQWdJRlZ6WldaMWJDQm1iM0lnZEc5dmJHbHVaeTVjYmlBZ0lDQWdJRUJ5WlhSMWNtNGdlMUJ5YjIxcGMyVjlYRzRnSUNBZ0tpOWNiaUFnSUNBZ0lDZGpZWFJqYUNjNklHWjFibU4wYVc5dUtHOXVVbVZxWldOMGFXOXVLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxuUm9aVzRvYm5Wc2JDd2diMjVTWldwbFkzUnBiMjRwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDA3WEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpIQnZiSGxtYVd4c0pDUndiMng1Wm1sc2JDZ3BJSHRjYmlBZ0lDQWdJSFpoY2lCc2IyTmhiRHRjYmx4dUlDQWdJQ0FnYVdZZ0tIUjVjR1Z2WmlCbmJHOWlZV3dnSVQwOUlDZDFibVJsWm1sdVpXUW5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ2JHOWpZV3dnUFNCbmJHOWlZV3c3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0hSNWNHVnZaaUJ6Wld4bUlDRTlQU0FuZFc1a1pXWnBibVZrSnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJR3h2WTJGc0lEMGdjMlZzWmp0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ2RISjVJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzlqWVd3Z1BTQkdkVzVqZEdsdmJpZ25jbVYwZFhKdUlIUm9hWE1uS1NncE8xeHVJQ0FnSUNBZ0lDQWdJSDBnWTJGMFkyZ2dLR1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLQ2R3YjJ4NVptbHNiQ0JtWVdsc1pXUWdZbVZqWVhWelpTQm5iRzlpWVd3Z2IySnFaV04wSUdseklIVnVZWFpoYVd4aFlteGxJR2x1SUhSb2FYTWdaVzUyYVhKdmJtMWxiblFuS1R0Y2JpQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJSFpoY2lCUUlEMGdiRzlqWVd3dVVISnZiV2x6WlR0Y2JseHVJQ0FnSUNBZ2FXWWdLRkFnSmlZZ1QySnFaV04wTG5CeWIzUnZkSGx3WlM1MGIxTjBjbWx1Wnk1allXeHNLRkF1Y21WemIyeDJaU2dwS1NBOVBUMGdKMXR2WW1wbFkzUWdVSEp2YldselpWMG5JQ1ltSUNGUUxtTmhjM1FwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCc2IyTmhiQzVRY205dGFYTmxJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtKR1JsWm1GMWJIUTdYRzRnSUNBZ2ZWeHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa2NHOXNlV1pwYkd3a0pHUmxabUYxYkhRZ1BTQnNhV0lrWlhNMkpIQnliMjFwYzJVa2NHOXNlV1pwYkd3a0pIQnZiSGxtYVd4c08xeHVYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUjFiV1FrSkVWVE5sQnliMjFwYzJVZ1BTQjdYRzRnSUNBZ0lDQW5VSEp2YldselpTYzZJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpDUmtaV1poZFd4MExGeHVJQ0FnSUNBZ0ozQnZiSGxtYVd4c0p6b2diR2xpSkdWek5pUndjbTl0YVhObEpIQnZiSGxtYVd4c0pDUmtaV1poZFd4MFhHNGdJQ0FnZlR0Y2JseHVJQ0FnSUM4cUlHZHNiMkpoYkNCa1pXWnBibVU2ZEhKMVpTQnRiMlIxYkdVNmRISjFaU0IzYVc1a2IzYzZJSFJ5ZFdVZ0tpOWNiaUFnSUNCcFppQW9kSGx3Wlc5bUlHUmxabWx1WlNBOVBUMGdKMloxYm1OMGFXOXVKeUFtSmlCa1pXWnBibVZiSjJGdFpDZGRLU0I3WEc0Z0lDQWdJQ0JrWldacGJtVW9ablZ1WTNScGIyNG9LU0I3SUhKbGRIVnliaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtkVzFrSkNSRlV6WlFjbTl0YVhObE95QjlLVHRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFI1Y0dWdlppQnRiMlIxYkdVZ0lUMDlJQ2QxYm1SbFptbHVaV1FuSUNZbUlHMXZaSFZzWlZzblpYaHdiM0owY3lkZEtTQjdYRzRnSUNBZ0lDQnRiMlIxYkdWYkoyVjRjRzl5ZEhNblhTQTlJR3hwWWlSbGN6WWtjSEp2YldselpTUjFiV1FrSkVWVE5sQnliMjFwYzJVN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNoMGVYQmxiMllnZEdocGN5QWhQVDBnSjNWdVpHVm1hVzVsWkNjcElIdGNiaUFnSUNBZ0lIUm9hWE5iSjBWVE5sQnliMjFwYzJVblhTQTlJR3hwWWlSbGN6WWtjSEp2YldselpTUjFiV1FrSkVWVE5sQnliMjFwYzJVN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ2YkhsbWFXeHNKQ1JrWldaaGRXeDBLQ2s3WEc1OUtTNWpZV3hzS0hSb2FYTXBPMXh1WEc0aVhYMD0iLCJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJ2lzLWZ1bmN0aW9uJylcblxubW9kdWxlLmV4cG9ydHMgPSBmb3JFYWNoXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcblxuZnVuY3Rpb24gZm9yRWFjaChsaXN0LCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIGlmICghaXNGdW5jdGlvbihpdGVyYXRvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaXRlcmF0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uJylcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgY29udGV4dCA9IHRoaXNcbiAgICB9XG4gICAgXG4gICAgaWYgKHRvU3RyaW5nLmNhbGwobGlzdCkgPT09ICdbb2JqZWN0IEFycmF5XScpXG4gICAgICAgIGZvckVhY2hBcnJheShsaXN0LCBpdGVyYXRvciwgY29udGV4dClcbiAgICBlbHNlIGlmICh0eXBlb2YgbGlzdCA9PT0gJ3N0cmluZycpXG4gICAgICAgIGZvckVhY2hTdHJpbmcobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpXG4gICAgZWxzZVxuICAgICAgICBmb3JFYWNoT2JqZWN0KGxpc3QsIGl0ZXJhdG9yLCBjb250ZXh0KVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoQXJyYXkoYXJyYXksIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCBpKSkge1xuICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBhcnJheVtpXSwgaSwgYXJyYXkpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hTdHJpbmcoc3RyaW5nLCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzdHJpbmcubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgLy8gbm8gc3VjaCB0aGluZyBhcyBhIHNwYXJzZSBzdHJpbmcuXG4gICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgc3RyaW5nLmNoYXJBdChpKSwgaSwgc3RyaW5nKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaE9iamVjdChvYmplY3QsIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgayBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrKSkge1xuICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmplY3Rba10sIGssIG9iamVjdClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbnZhciB3aW47XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgd2luID0gc2VsZjtcbn0gZWxzZSB7XG4gICAgd2luID0ge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2luO1xuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDI1dlpHVmZiVzlrZFd4bGN5OW5iRzlpWVd3dmQybHVaRzkzTG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN1FVRkJRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CSWl3aVptbHNaU0k2SW1kbGJtVnlZWFJsWkM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SjJZWElnZDJsdU8xeHVYRzVwWmlBb2RIbHdaVzltSUhkcGJtUnZkeUFoUFQwZ1hDSjFibVJsWm1sdVpXUmNJaWtnZTF4dUlDQWdJSGRwYmlBOUlIZHBibVJ2ZHp0Y2JuMGdaV3h6WlNCcFppQW9kSGx3Wlc5bUlHZHNiMkpoYkNBaFBUMGdYQ0oxYm1SbFptbHVaV1JjSWlrZ2UxeHVJQ0FnSUhkcGJpQTlJR2RzYjJKaGJEdGNibjBnWld4elpTQnBaaUFvZEhsd1pXOW1JSE5sYkdZZ0lUMDlJRndpZFc1a1pXWnBibVZrWENJcGUxeHVJQ0FnSUhkcGJpQTlJSE5sYkdZN1hHNTlJR1ZzYzJVZ2UxeHVJQ0FnSUhkcGJpQTlJSHQ5TzF4dWZWeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJSGRwYmp0Y2JpSmRmUT09IiwiLyohIEhhbW1lci5KUyAtIHYyLjAuNyAtIDIwMTYtMDQtMjJcbiAqIGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE2IEpvcmlrIFRhbmdlbGRlcjtcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAqL1xuKGZ1bmN0aW9uKHdpbmRvdywgZG9jdW1lbnQsIGV4cG9ydE5hbWUsIHVuZGVmaW5lZCkge1xuICAndXNlIHN0cmljdCc7XG5cbnZhciBWRU5ET1JfUFJFRklYRVMgPSBbJycsICd3ZWJraXQnLCAnTW96JywgJ01TJywgJ21zJywgJ28nXTtcbnZhciBURVNUX0VMRU1FTlQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxudmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nO1xuXG52YXIgcm91bmQgPSBNYXRoLnJvdW5kO1xudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIG5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIHNldCBhIHRpbWVvdXQgd2l0aCBhIGdpdmVuIHNjb3BlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtOdW1iZXJ9IHRpbWVvdXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBzZXRUaW1lb3V0Q29udGV4dChmbiwgdGltZW91dCwgY29udGV4dCkge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGJpbmRGbihmbiwgY29udGV4dCksIHRpbWVvdXQpO1xufVxuXG4vKipcbiAqIGlmIHRoZSBhcmd1bWVudCBpcyBhbiBhcnJheSwgd2Ugd2FudCB0byBleGVjdXRlIHRoZSBmbiBvbiBlYWNoIGVudHJ5XG4gKiBpZiBpdCBhaW50IGFuIGFycmF5IHdlIGRvbid0IHdhbnQgdG8gZG8gYSB0aGluZy5cbiAqIHRoaXMgaXMgdXNlZCBieSBhbGwgdGhlIG1ldGhvZHMgdGhhdCBhY2NlcHQgYSBzaW5nbGUgYW5kIGFycmF5IGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfEFycmF5fSBhcmdcbiAqIEBwYXJhbSB7U3RyaW5nfSBmblxuICogQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0XVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGludm9rZUFycmF5QXJnKGFyZywgZm4sIGNvbnRleHQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgIGVhY2goYXJnLCBjb250ZXh0W2ZuXSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogd2FsayBvYmplY3RzIGFuZCBhcnJheXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICovXG5mdW5jdGlvbiBlYWNoKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICB2YXIgaTtcblxuICAgIGlmICghb2JqKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2JqLmZvckVhY2gpIHtcbiAgICAgICAgb2JqLmZvckVhY2goaXRlcmF0b3IsIGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IG9iai5sZW5ndGgpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpIGluIG9iaikge1xuICAgICAgICAgICAgb2JqLmhhc093blByb3BlcnR5KGkpICYmIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIHdyYXAgYSBtZXRob2Qgd2l0aCBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgYW5kIHN0YWNrIHRyYWNlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbiB3cmFwcGluZyB0aGUgc3VwcGxpZWQgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBkZXByZWNhdGUobWV0aG9kLCBuYW1lLCBtZXNzYWdlKSB7XG4gICAgdmFyIGRlcHJlY2F0aW9uTWVzc2FnZSA9ICdERVBSRUNBVEVEIE1FVEhPRDogJyArIG5hbWUgKyAnXFxuJyArIG1lc3NhZ2UgKyAnIEFUIFxcbic7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcignZ2V0LXN0YWNrLXRyYWNlJyk7XG4gICAgICAgIHZhciBzdGFjayA9IGUgJiYgZS5zdGFjayA/IGUuc3RhY2sucmVwbGFjZSgvXlteXFwoXSs/W1xcbiRdL2dtLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFxzK2F0XFxzKy9nbSwgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXk9iamVjdC48YW5vbnltb3VzPlxccypcXCgvZ20sICd7YW5vbnltb3VzfSgpQCcpIDogJ1Vua25vd24gU3RhY2sgVHJhY2UnO1xuXG4gICAgICAgIHZhciBsb2cgPSB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUud2FybiB8fCB3aW5kb3cuY29uc29sZS5sb2cpO1xuICAgICAgICBpZiAobG9nKSB7XG4gICAgICAgICAgICBsb2cuY2FsbCh3aW5kb3cuY29uc29sZSwgZGVwcmVjYXRpb25NZXNzYWdlLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG5cbi8qKlxuICogZXh0ZW5kIG9iamVjdC5cbiAqIG1lYW5zIHRoYXQgcHJvcGVydGllcyBpbiBkZXN0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIG9uZXMgaW4gc3JjLlxuICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICogQHBhcmFtIHsuLi5PYmplY3R9IG9iamVjdHNfdG9fYXNzaWduXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB0YXJnZXRcbiAqL1xudmFyIGFzc2lnbjtcbmlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQpIHtcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuZXh0S2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KG5leHRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9O1xufSBlbHNlIHtcbiAgICBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xufVxuXG4vKipcbiAqIGV4dGVuZCBvYmplY3QuXG4gKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgaW4gZGVzdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBvbmVzIGluIHNyYy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0XG4gKiBAcGFyYW0ge09iamVjdH0gc3JjXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFttZXJnZT1mYWxzZV1cbiAqIEByZXR1cm5zIHtPYmplY3R9IGRlc3RcbiAqL1xudmFyIGV4dGVuZCA9IGRlcHJlY2F0ZShmdW5jdGlvbiBleHRlbmQoZGVzdCwgc3JjLCBtZXJnZSkge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc3JjKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBrZXlzLmxlbmd0aCkge1xuICAgICAgICBpZiAoIW1lcmdlIHx8IChtZXJnZSAmJiBkZXN0W2tleXNbaV1dID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBkZXN0W2tleXNbaV1dID0gc3JjW2tleXNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59LCAnZXh0ZW5kJywgJ1VzZSBgYXNzaWduYC4nKTtcblxuLyoqXG4gKiBtZXJnZSB0aGUgdmFsdWVzIGZyb20gc3JjIGluIHRoZSBkZXN0LlxuICogbWVhbnMgdGhhdCBwcm9wZXJ0aWVzIHRoYXQgZXhpc3QgaW4gZGVzdCB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbiBieSBzcmNcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0XG4gKiBAcGFyYW0ge09iamVjdH0gc3JjXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBkZXN0XG4gKi9cbnZhciBtZXJnZSA9IGRlcHJlY2F0ZShmdW5jdGlvbiBtZXJnZShkZXN0LCBzcmMpIHtcbiAgICByZXR1cm4gZXh0ZW5kKGRlc3QsIHNyYywgdHJ1ZSk7XG59LCAnbWVyZ2UnLCAnVXNlIGBhc3NpZ25gLicpO1xuXG4vKipcbiAqIHNpbXBsZSBjbGFzcyBpbmhlcml0YW5jZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2hpbGRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGJhc2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc11cbiAqL1xuZnVuY3Rpb24gaW5oZXJpdChjaGlsZCwgYmFzZSwgcHJvcGVydGllcykge1xuICAgIHZhciBiYXNlUCA9IGJhc2UucHJvdG90eXBlLFxuICAgICAgICBjaGlsZFA7XG5cbiAgICBjaGlsZFAgPSBjaGlsZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGJhc2VQKTtcbiAgICBjaGlsZFAuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICBjaGlsZFAuX3N1cGVyID0gYmFzZVA7XG5cbiAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgICBhc3NpZ24oY2hpbGRQLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG59XG5cbi8qKlxuICogc2ltcGxlIGZ1bmN0aW9uIGJpbmRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBiaW5kRm4oZm4sIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYm91bmRGbigpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBsZXQgYSBib29sZWFuIHZhbHVlIGFsc28gYmUgYSBmdW5jdGlvbiB0aGF0IG11c3QgcmV0dXJuIGEgYm9vbGVhblxuICogdGhpcyBmaXJzdCBpdGVtIGluIGFyZ3Mgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0ge0Jvb2xlYW58RnVuY3Rpb259IHZhbFxuICogQHBhcmFtIHtBcnJheX0gW2FyZ3NdXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gYm9vbE9yRm4odmFsLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT0gVFlQRV9GVU5DVElPTikge1xuICAgICAgICByZXR1cm4gdmFsLmFwcGx5KGFyZ3MgPyBhcmdzWzBdIHx8IHVuZGVmaW5lZCA6IHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59XG5cbi8qKlxuICogdXNlIHRoZSB2YWwyIHdoZW4gdmFsMSBpcyB1bmRlZmluZWRcbiAqIEBwYXJhbSB7Kn0gdmFsMVxuICogQHBhcmFtIHsqfSB2YWwyXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZnVuY3Rpb24gaWZVbmRlZmluZWQodmFsMSwgdmFsMikge1xuICAgIHJldHVybiAodmFsMSA9PT0gdW5kZWZpbmVkKSA/IHZhbDIgOiB2YWwxO1xufVxuXG4vKipcbiAqIGFkZEV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcnModGFyZ2V0LCB0eXBlcywgaGFuZGxlcikge1xuICAgIGVhY2goc3BsaXRTdHIodHlwZXMpLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiByZW1vdmVFdmVudExpc3RlbmVyIHdpdGggbXVsdGlwbGUgZXZlbnRzIGF0IG9uY2VcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRhcmdldCwgdHlwZXMsIGhhbmRsZXIpIHtcbiAgICBlYWNoKHNwbGl0U3RyKHR5cGVzKSwgZnVuY3Rpb24odHlwZSkge1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogZmluZCBpZiBhIG5vZGUgaXMgaW4gdGhlIGdpdmVuIHBhcmVudFxuICogQG1ldGhvZCBoYXNQYXJlbnRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhcmVudFxuICogQHJldHVybiB7Qm9vbGVhbn0gZm91bmRcbiAqL1xuZnVuY3Rpb24gaGFzUGFyZW50KG5vZGUsIHBhcmVudCkge1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IHBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIHNtYWxsIGluZGV4T2Ygd3JhcHBlclxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAqIEByZXR1cm5zIHtCb29sZWFufSBmb3VuZFxuICovXG5mdW5jdGlvbiBpblN0cihzdHIsIGZpbmQpIHtcbiAgICByZXR1cm4gc3RyLmluZGV4T2YoZmluZCkgPiAtMTtcbn1cblxuLyoqXG4gKiBzcGxpdCBzdHJpbmcgb24gd2hpdGVzcGFjZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybnMge0FycmF5fSB3b3Jkc1xuICovXG5mdW5jdGlvbiBzcGxpdFN0cihzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRyaW0oKS5zcGxpdCgvXFxzKy9nKTtcbn1cblxuLyoqXG4gKiBmaW5kIGlmIGEgYXJyYXkgY29udGFpbnMgdGhlIG9iamVjdCB1c2luZyBpbmRleE9mIG9yIGEgc2ltcGxlIHBvbHlGaWxsXG4gKiBAcGFyYW0ge0FycmF5fSBzcmNcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kXG4gKiBAcGFyYW0ge1N0cmluZ30gW2ZpbmRCeUtleV1cbiAqIEByZXR1cm4ge0Jvb2xlYW58TnVtYmVyfSBmYWxzZSB3aGVuIG5vdCBmb3VuZCwgb3IgdGhlIGluZGV4XG4gKi9cbmZ1bmN0aW9uIGluQXJyYXkoc3JjLCBmaW5kLCBmaW5kQnlLZXkpIHtcbiAgICBpZiAoc3JjLmluZGV4T2YgJiYgIWZpbmRCeUtleSkge1xuICAgICAgICByZXR1cm4gc3JjLmluZGV4T2YoZmluZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHNyYy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICgoZmluZEJ5S2V5ICYmIHNyY1tpXVtmaW5kQnlLZXldID09IGZpbmQpIHx8ICghZmluZEJ5S2V5ICYmIHNyY1tpXSA9PT0gZmluZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxufVxuXG4vKipcbiAqIGNvbnZlcnQgYXJyYXktbGlrZSBvYmplY3RzIHRvIHJlYWwgYXJyYXlzXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkob2JqKSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG9iaiwgMCk7XG59XG5cbi8qKlxuICogdW5pcXVlIGFycmF5IHdpdGggb2JqZWN0cyBiYXNlZCBvbiBhIGtleSAobGlrZSAnaWQnKSBvciBqdXN0IGJ5IHRoZSBhcnJheSdzIHZhbHVlXG4gKiBAcGFyYW0ge0FycmF5fSBzcmMgW3tpZDoxfSx7aWQ6Mn0se2lkOjF9XVxuICogQHBhcmFtIHtTdHJpbmd9IFtrZXldXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtzb3J0PUZhbHNlXVxuICogQHJldHVybnMge0FycmF5fSBbe2lkOjF9LHtpZDoyfV1cbiAqL1xuZnVuY3Rpb24gdW5pcXVlQXJyYXkoc3JjLCBrZXksIHNvcnQpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IHNyYy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbCA9IGtleSA/IHNyY1tpXVtrZXldIDogc3JjW2ldO1xuICAgICAgICBpZiAoaW5BcnJheSh2YWx1ZXMsIHZhbCkgPCAwKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goc3JjW2ldKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZXNbaV0gPSB2YWw7XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICBpZiAoc29ydCkge1xuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc29ydCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc29ydChmdW5jdGlvbiBzb3J0VW5pcXVlQXJyYXkoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhW2tleV0gPiBiW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xufVxuXG4vKipcbiAqIGdldCB0aGUgcHJlZml4ZWQgcHJvcGVydHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICogQHJldHVybnMge1N0cmluZ3xVbmRlZmluZWR9IHByZWZpeGVkXG4gKi9cbmZ1bmN0aW9uIHByZWZpeGVkKG9iaiwgcHJvcGVydHkpIHtcbiAgICB2YXIgcHJlZml4LCBwcm9wO1xuICAgIHZhciBjYW1lbFByb3AgPSBwcm9wZXJ0eVswXS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc2xpY2UoMSk7XG5cbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBWRU5ET1JfUFJFRklYRVMubGVuZ3RoKSB7XG4gICAgICAgIHByZWZpeCA9IFZFTkRPUl9QUkVGSVhFU1tpXTtcbiAgICAgICAgcHJvcCA9IChwcmVmaXgpID8gcHJlZml4ICsgY2FtZWxQcm9wIDogcHJvcGVydHk7XG5cbiAgICAgICAgaWYgKHByb3AgaW4gb2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcDtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogZ2V0IGEgdW5pcXVlIGlkXG4gKiBAcmV0dXJucyB7bnVtYmVyfSB1bmlxdWVJZFxuICovXG52YXIgX3VuaXF1ZUlkID0gMTtcbmZ1bmN0aW9uIHVuaXF1ZUlkKCkge1xuICAgIHJldHVybiBfdW5pcXVlSWQrKztcbn1cblxuLyoqXG4gKiBnZXQgdGhlIHdpbmRvdyBvYmplY3Qgb2YgYW4gZWxlbWVudFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0RvY3VtZW50Vmlld3xXaW5kb3d9XG4gKi9cbmZ1bmN0aW9uIGdldFdpbmRvd0ZvckVsZW1lbnQoZWxlbWVudCkge1xuICAgIHZhciBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQgfHwgZWxlbWVudDtcbiAgICByZXR1cm4gKGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93IHx8IHdpbmRvdyk7XG59XG5cbnZhciBNT0JJTEVfUkVHRVggPSAvbW9iaWxlfHRhYmxldHxpcChhZHxob25lfG9kKXxhbmRyb2lkL2k7XG5cbnZhciBTVVBQT1JUX1RPVUNIID0gKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyk7XG52YXIgU1VQUE9SVF9QT0lOVEVSX0VWRU5UUyA9IHByZWZpeGVkKHdpbmRvdywgJ1BvaW50ZXJFdmVudCcpICE9PSB1bmRlZmluZWQ7XG52YXIgU1VQUE9SVF9PTkxZX1RPVUNIID0gU1VQUE9SVF9UT1VDSCAmJiBNT0JJTEVfUkVHRVgudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcblxudmFyIElOUFVUX1RZUEVfVE9VQ0ggPSAndG91Y2gnO1xudmFyIElOUFVUX1RZUEVfUEVOID0gJ3Blbic7XG52YXIgSU5QVVRfVFlQRV9NT1VTRSA9ICdtb3VzZSc7XG52YXIgSU5QVVRfVFlQRV9LSU5FQ1QgPSAna2luZWN0JztcblxudmFyIENPTVBVVEVfSU5URVJWQUwgPSAyNTtcblxudmFyIElOUFVUX1NUQVJUID0gMTtcbnZhciBJTlBVVF9NT1ZFID0gMjtcbnZhciBJTlBVVF9FTkQgPSA0O1xudmFyIElOUFVUX0NBTkNFTCA9IDg7XG5cbnZhciBESVJFQ1RJT05fTk9ORSA9IDE7XG52YXIgRElSRUNUSU9OX0xFRlQgPSAyO1xudmFyIERJUkVDVElPTl9SSUdIVCA9IDQ7XG52YXIgRElSRUNUSU9OX1VQID0gODtcbnZhciBESVJFQ1RJT05fRE9XTiA9IDE2O1xuXG52YXIgRElSRUNUSU9OX0hPUklaT05UQUwgPSBESVJFQ1RJT05fTEVGVCB8IERJUkVDVElPTl9SSUdIVDtcbnZhciBESVJFQ1RJT05fVkVSVElDQUwgPSBESVJFQ1RJT05fVVAgfCBESVJFQ1RJT05fRE9XTjtcbnZhciBESVJFQ1RJT05fQUxMID0gRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUw7XG5cbnZhciBQUk9QU19YWSA9IFsneCcsICd5J107XG52YXIgUFJPUFNfQ0xJRU5UX1hZID0gWydjbGllbnRYJywgJ2NsaWVudFknXTtcblxuLyoqXG4gKiBjcmVhdGUgbmV3IGlucHV0IHR5cGUgbWFuYWdlclxuICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge0lucHV0fVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIElucHV0KG1hbmFnZXIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuZWxlbWVudCA9IG1hbmFnZXIuZWxlbWVudDtcbiAgICB0aGlzLnRhcmdldCA9IG1hbmFnZXIub3B0aW9ucy5pbnB1dFRhcmdldDtcblxuICAgIC8vIHNtYWxsZXIgd3JhcHBlciBhcm91bmQgdGhlIGhhbmRsZXIsIGZvciB0aGUgc2NvcGUgYW5kIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBtYW5hZ2VyLFxuICAgIC8vIHNvIHdoZW4gZGlzYWJsZWQgdGhlIGlucHV0IGV2ZW50cyBhcmUgY29tcGxldGVseSBieXBhc3NlZC5cbiAgICB0aGlzLmRvbUhhbmRsZXIgPSBmdW5jdGlvbihldikge1xuICAgICAgICBpZiAoYm9vbE9yRm4obWFuYWdlci5vcHRpb25zLmVuYWJsZSwgW21hbmFnZXJdKSkge1xuICAgICAgICAgICAgc2VsZi5oYW5kbGVyKGV2KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmluaXQoKTtcblxufVxuXG5JbnB1dC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2hvdWxkIGhhbmRsZSB0aGUgaW5wdXRFdmVudCBkYXRhIGFuZCB0cmlnZ2VyIHRoZSBjYWxsYmFja1xuICAgICAqIEB2aXJ0dWFsXG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24oKSB7IH0sXG5cbiAgICAvKipcbiAgICAgKiBiaW5kIHRoZSBldmVudHNcbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5ldkVsICYmIGFkZEV2ZW50TGlzdGVuZXJzKHRoaXMuZWxlbWVudCwgdGhpcy5ldkVsLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2VGFyZ2V0ICYmIGFkZEV2ZW50TGlzdGVuZXJzKHRoaXMudGFyZ2V0LCB0aGlzLmV2VGFyZ2V0LCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2V2luICYmIGFkZEV2ZW50TGlzdGVuZXJzKGdldFdpbmRvd0ZvckVsZW1lbnQodGhpcy5lbGVtZW50KSwgdGhpcy5ldldpbiwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdW5iaW5kIHRoZSBldmVudHNcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5ldkVsICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMuZWxlbWVudCwgdGhpcy5ldkVsLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2VGFyZ2V0ICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMudGFyZ2V0LCB0aGlzLmV2VGFyZ2V0LCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2V2luICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGdldFdpbmRvd0ZvckVsZW1lbnQodGhpcy5lbGVtZW50KSwgdGhpcy5ldldpbiwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIGNyZWF0ZSBuZXcgaW5wdXQgdHlwZSBtYW5hZ2VyXG4gKiBjYWxsZWQgYnkgdGhlIE1hbmFnZXIgY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7SGFtbWVyfSBtYW5hZ2VyXG4gKiBAcmV0dXJucyB7SW5wdXR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0SW5zdGFuY2UobWFuYWdlcikge1xuICAgIHZhciBUeXBlO1xuICAgIHZhciBpbnB1dENsYXNzID0gbWFuYWdlci5vcHRpb25zLmlucHV0Q2xhc3M7XG5cbiAgICBpZiAoaW5wdXRDbGFzcykge1xuICAgICAgICBUeXBlID0gaW5wdXRDbGFzcztcbiAgICB9IGVsc2UgaWYgKFNVUFBPUlRfUE9JTlRFUl9FVkVOVFMpIHtcbiAgICAgICAgVHlwZSA9IFBvaW50ZXJFdmVudElucHV0O1xuICAgIH0gZWxzZSBpZiAoU1VQUE9SVF9PTkxZX1RPVUNIKSB7XG4gICAgICAgIFR5cGUgPSBUb3VjaElucHV0O1xuICAgIH0gZWxzZSBpZiAoIVNVUFBPUlRfVE9VQ0gpIHtcbiAgICAgICAgVHlwZSA9IE1vdXNlSW5wdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgVHlwZSA9IFRvdWNoTW91c2VJbnB1dDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyAoVHlwZSkobWFuYWdlciwgaW5wdXRIYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBoYW5kbGUgaW5wdXQgZXZlbnRzXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICovXG5mdW5jdGlvbiBpbnB1dEhhbmRsZXIobWFuYWdlciwgZXZlbnRUeXBlLCBpbnB1dCkge1xuICAgIHZhciBwb2ludGVyc0xlbiA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aDtcbiAgICB2YXIgY2hhbmdlZFBvaW50ZXJzTGVuID0gaW5wdXQuY2hhbmdlZFBvaW50ZXJzLmxlbmd0aDtcbiAgICB2YXIgaXNGaXJzdCA9IChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiAocG9pbnRlcnNMZW4gLSBjaGFuZ2VkUG9pbnRlcnNMZW4gPT09IDApKTtcbiAgICB2YXIgaXNGaW5hbCA9IChldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSAmJiAocG9pbnRlcnNMZW4gLSBjaGFuZ2VkUG9pbnRlcnNMZW4gPT09IDApKTtcblxuICAgIGlucHV0LmlzRmlyc3QgPSAhIWlzRmlyc3Q7XG4gICAgaW5wdXQuaXNGaW5hbCA9ICEhaXNGaW5hbDtcblxuICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgIG1hbmFnZXIuc2Vzc2lvbiA9IHt9O1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSBldmVudCBpcyB0aGUgbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgZG9tRXZlbnRzXG4gICAgLy8gbGlrZSAndG91Y2hzdGFydCwgbW91c2V1cCwgcG9pbnRlcmRvd24nXG4gICAgaW5wdXQuZXZlbnRUeXBlID0gZXZlbnRUeXBlO1xuXG4gICAgLy8gY29tcHV0ZSBzY2FsZSwgcm90YXRpb24gZXRjXG4gICAgY29tcHV0ZUlucHV0RGF0YShtYW5hZ2VyLCBpbnB1dCk7XG5cbiAgICAvLyBlbWl0IHNlY3JldCBldmVudFxuICAgIG1hbmFnZXIuZW1pdCgnaGFtbWVyLmlucHV0JywgaW5wdXQpO1xuXG4gICAgbWFuYWdlci5yZWNvZ25pemUoaW5wdXQpO1xuICAgIG1hbmFnZXIuc2Vzc2lvbi5wcmV2SW5wdXQgPSBpbnB1dDtcbn1cblxuLyoqXG4gKiBleHRlbmQgdGhlIGRhdGEgd2l0aCBzb21lIHVzYWJsZSBwcm9wZXJ0aWVzIGxpa2Ugc2NhbGUsIHJvdGF0ZSwgdmVsb2NpdHkgZXRjXG4gKiBAcGFyYW0ge09iamVjdH0gbWFuYWdlclxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVJbnB1dERhdGEobWFuYWdlciwgaW5wdXQpIHtcbiAgICB2YXIgc2Vzc2lvbiA9IG1hbmFnZXIuc2Vzc2lvbjtcbiAgICB2YXIgcG9pbnRlcnMgPSBpbnB1dC5wb2ludGVycztcbiAgICB2YXIgcG9pbnRlcnNMZW5ndGggPSBwb2ludGVycy5sZW5ndGg7XG5cbiAgICAvLyBzdG9yZSB0aGUgZmlyc3QgaW5wdXQgdG8gY2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBhbmQgZGlyZWN0aW9uXG4gICAgaWYgKCFzZXNzaW9uLmZpcnN0SW5wdXQpIHtcbiAgICAgICAgc2Vzc2lvbi5maXJzdElucHV0ID0gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpO1xuICAgIH1cblxuICAgIC8vIHRvIGNvbXB1dGUgc2NhbGUgYW5kIHJvdGF0aW9uIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG11bHRpcGxlIHRvdWNoZXNcbiAgICBpZiAocG9pbnRlcnNMZW5ndGggPiAxICYmICFzZXNzaW9uLmZpcnN0TXVsdGlwbGUpIHtcbiAgICAgICAgc2Vzc2lvbi5maXJzdE11bHRpcGxlID0gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAocG9pbnRlcnNMZW5ndGggPT09IDEpIHtcbiAgICAgICAgc2Vzc2lvbi5maXJzdE11bHRpcGxlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGZpcnN0SW5wdXQgPSBzZXNzaW9uLmZpcnN0SW5wdXQ7XG4gICAgdmFyIGZpcnN0TXVsdGlwbGUgPSBzZXNzaW9uLmZpcnN0TXVsdGlwbGU7XG4gICAgdmFyIG9mZnNldENlbnRlciA9IGZpcnN0TXVsdGlwbGUgPyBmaXJzdE11bHRpcGxlLmNlbnRlciA6IGZpcnN0SW5wdXQuY2VudGVyO1xuXG4gICAgdmFyIGNlbnRlciA9IGlucHV0LmNlbnRlciA9IGdldENlbnRlcihwb2ludGVycyk7XG4gICAgaW5wdXQudGltZVN0YW1wID0gbm93KCk7XG4gICAgaW5wdXQuZGVsdGFUaW1lID0gaW5wdXQudGltZVN0YW1wIC0gZmlyc3RJbnB1dC50aW1lU3RhbXA7XG5cbiAgICBpbnB1dC5hbmdsZSA9IGdldEFuZ2xlKG9mZnNldENlbnRlciwgY2VudGVyKTtcbiAgICBpbnB1dC5kaXN0YW5jZSA9IGdldERpc3RhbmNlKG9mZnNldENlbnRlciwgY2VudGVyKTtcblxuICAgIGNvbXB1dGVEZWx0YVhZKHNlc3Npb24sIGlucHV0KTtcbiAgICBpbnB1dC5vZmZzZXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oaW5wdXQuZGVsdGFYLCBpbnB1dC5kZWx0YVkpO1xuXG4gICAgdmFyIG92ZXJhbGxWZWxvY2l0eSA9IGdldFZlbG9jaXR5KGlucHV0LmRlbHRhVGltZSwgaW5wdXQuZGVsdGFYLCBpbnB1dC5kZWx0YVkpO1xuICAgIGlucHV0Lm92ZXJhbGxWZWxvY2l0eVggPSBvdmVyYWxsVmVsb2NpdHkueDtcbiAgICBpbnB1dC5vdmVyYWxsVmVsb2NpdHlZID0gb3ZlcmFsbFZlbG9jaXR5Lnk7XG4gICAgaW5wdXQub3ZlcmFsbFZlbG9jaXR5ID0gKGFicyhvdmVyYWxsVmVsb2NpdHkueCkgPiBhYnMob3ZlcmFsbFZlbG9jaXR5LnkpKSA/IG92ZXJhbGxWZWxvY2l0eS54IDogb3ZlcmFsbFZlbG9jaXR5Lnk7XG5cbiAgICBpbnB1dC5zY2FsZSA9IGZpcnN0TXVsdGlwbGUgPyBnZXRTY2FsZShmaXJzdE11bHRpcGxlLnBvaW50ZXJzLCBwb2ludGVycykgOiAxO1xuICAgIGlucHV0LnJvdGF0aW9uID0gZmlyc3RNdWx0aXBsZSA/IGdldFJvdGF0aW9uKGZpcnN0TXVsdGlwbGUucG9pbnRlcnMsIHBvaW50ZXJzKSA6IDA7XG5cbiAgICBpbnB1dC5tYXhQb2ludGVycyA9ICFzZXNzaW9uLnByZXZJbnB1dCA/IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA6ICgoaW5wdXQucG9pbnRlcnMubGVuZ3RoID5cbiAgICAgICAgc2Vzc2lvbi5wcmV2SW5wdXQubWF4UG9pbnRlcnMpID8gaW5wdXQucG9pbnRlcnMubGVuZ3RoIDogc2Vzc2lvbi5wcmV2SW5wdXQubWF4UG9pbnRlcnMpO1xuXG4gICAgY29tcHV0ZUludGVydmFsSW5wdXREYXRhKHNlc3Npb24sIGlucHV0KTtcblxuICAgIC8vIGZpbmQgdGhlIGNvcnJlY3QgdGFyZ2V0XG4gICAgdmFyIHRhcmdldCA9IG1hbmFnZXIuZWxlbWVudDtcbiAgICBpZiAoaGFzUGFyZW50KGlucHV0LnNyY0V2ZW50LnRhcmdldCwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSBpbnB1dC5zcmNFdmVudC50YXJnZXQ7XG4gICAgfVxuICAgIGlucHV0LnRhcmdldCA9IHRhcmdldDtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZURlbHRhWFkoc2Vzc2lvbiwgaW5wdXQpIHtcbiAgICB2YXIgY2VudGVyID0gaW5wdXQuY2VudGVyO1xuICAgIHZhciBvZmZzZXQgPSBzZXNzaW9uLm9mZnNldERlbHRhIHx8IHt9O1xuICAgIHZhciBwcmV2RGVsdGEgPSBzZXNzaW9uLnByZXZEZWx0YSB8fCB7fTtcbiAgICB2YXIgcHJldklucHV0ID0gc2Vzc2lvbi5wcmV2SW5wdXQgfHwge307XG5cbiAgICBpZiAoaW5wdXQuZXZlbnRUeXBlID09PSBJTlBVVF9TVEFSVCB8fCBwcmV2SW5wdXQuZXZlbnRUeXBlID09PSBJTlBVVF9FTkQpIHtcbiAgICAgICAgcHJldkRlbHRhID0gc2Vzc2lvbi5wcmV2RGVsdGEgPSB7XG4gICAgICAgICAgICB4OiBwcmV2SW5wdXQuZGVsdGFYIHx8IDAsXG4gICAgICAgICAgICB5OiBwcmV2SW5wdXQuZGVsdGFZIHx8IDBcbiAgICAgICAgfTtcblxuICAgICAgICBvZmZzZXQgPSBzZXNzaW9uLm9mZnNldERlbHRhID0ge1xuICAgICAgICAgICAgeDogY2VudGVyLngsXG4gICAgICAgICAgICB5OiBjZW50ZXIueVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlucHV0LmRlbHRhWCA9IHByZXZEZWx0YS54ICsgKGNlbnRlci54IC0gb2Zmc2V0LngpO1xuICAgIGlucHV0LmRlbHRhWSA9IHByZXZEZWx0YS55ICsgKGNlbnRlci55IC0gb2Zmc2V0LnkpO1xufVxuXG4vKipcbiAqIHZlbG9jaXR5IGlzIGNhbGN1bGF0ZWQgZXZlcnkgeCBtc1xuICogQHBhcmFtIHtPYmplY3R9IHNlc3Npb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICovXG5mdW5jdGlvbiBjb21wdXRlSW50ZXJ2YWxJbnB1dERhdGEoc2Vzc2lvbiwgaW5wdXQpIHtcbiAgICB2YXIgbGFzdCA9IHNlc3Npb24ubGFzdEludGVydmFsIHx8IGlucHV0LFxuICAgICAgICBkZWx0YVRpbWUgPSBpbnB1dC50aW1lU3RhbXAgLSBsYXN0LnRpbWVTdGFtcCxcbiAgICAgICAgdmVsb2NpdHksIHZlbG9jaXR5WCwgdmVsb2NpdHlZLCBkaXJlY3Rpb247XG5cbiAgICBpZiAoaW5wdXQuZXZlbnRUeXBlICE9IElOUFVUX0NBTkNFTCAmJiAoZGVsdGFUaW1lID4gQ09NUFVURV9JTlRFUlZBTCB8fCBsYXN0LnZlbG9jaXR5ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHZhciBkZWx0YVggPSBpbnB1dC5kZWx0YVggLSBsYXN0LmRlbHRhWDtcbiAgICAgICAgdmFyIGRlbHRhWSA9IGlucHV0LmRlbHRhWSAtIGxhc3QuZGVsdGFZO1xuXG4gICAgICAgIHZhciB2ID0gZ2V0VmVsb2NpdHkoZGVsdGFUaW1lLCBkZWx0YVgsIGRlbHRhWSk7XG4gICAgICAgIHZlbG9jaXR5WCA9IHYueDtcbiAgICAgICAgdmVsb2NpdHlZID0gdi55O1xuICAgICAgICB2ZWxvY2l0eSA9IChhYnModi54KSA+IGFicyh2LnkpKSA/IHYueCA6IHYueTtcbiAgICAgICAgZGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKGRlbHRhWCwgZGVsdGFZKTtcblxuICAgICAgICBzZXNzaW9uLmxhc3RJbnRlcnZhbCA9IGlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVzZSBsYXRlc3QgdmVsb2NpdHkgaW5mbyBpZiBpdCBkb2Vzbid0IG92ZXJ0YWtlIGEgbWluaW11bSBwZXJpb2RcbiAgICAgICAgdmVsb2NpdHkgPSBsYXN0LnZlbG9jaXR5O1xuICAgICAgICB2ZWxvY2l0eVggPSBsYXN0LnZlbG9jaXR5WDtcbiAgICAgICAgdmVsb2NpdHlZID0gbGFzdC52ZWxvY2l0eVk7XG4gICAgICAgIGRpcmVjdGlvbiA9IGxhc3QuZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIGlucHV0LnZlbG9jaXR5ID0gdmVsb2NpdHk7XG4gICAgaW5wdXQudmVsb2NpdHlYID0gdmVsb2NpdHlYO1xuICAgIGlucHV0LnZlbG9jaXR5WSA9IHZlbG9jaXR5WTtcbiAgICBpbnB1dC5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG59XG5cbi8qKlxuICogY3JlYXRlIGEgc2ltcGxlIGNsb25lIGZyb20gdGhlIGlucHV0IHVzZWQgZm9yIHN0b3JhZ2Ugb2YgZmlyc3RJbnB1dCBhbmQgZmlyc3RNdWx0aXBsZVxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBjbG9uZWRJbnB1dERhdGFcbiAqL1xuZnVuY3Rpb24gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpIHtcbiAgICAvLyBtYWtlIGEgc2ltcGxlIGNvcHkgb2YgdGhlIHBvaW50ZXJzIGJlY2F1c2Ugd2Ugd2lsbCBnZXQgYSByZWZlcmVuY2UgaWYgd2UgZG9uJ3RcbiAgICAvLyB3ZSBvbmx5IG5lZWQgY2xpZW50WFkgZm9yIHRoZSBjYWxjdWxhdGlvbnNcbiAgICB2YXIgcG9pbnRlcnMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBpbnB1dC5wb2ludGVycy5sZW5ndGgpIHtcbiAgICAgICAgcG9pbnRlcnNbaV0gPSB7XG4gICAgICAgICAgICBjbGllbnRYOiByb3VuZChpbnB1dC5wb2ludGVyc1tpXS5jbGllbnRYKSxcbiAgICAgICAgICAgIGNsaWVudFk6IHJvdW5kKGlucHV0LnBvaW50ZXJzW2ldLmNsaWVudFkpXG4gICAgICAgIH07XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0aW1lU3RhbXA6IG5vdygpLFxuICAgICAgICBwb2ludGVyczogcG9pbnRlcnMsXG4gICAgICAgIGNlbnRlcjogZ2V0Q2VudGVyKHBvaW50ZXJzKSxcbiAgICAgICAgZGVsdGFYOiBpbnB1dC5kZWx0YVgsXG4gICAgICAgIGRlbHRhWTogaW5wdXQuZGVsdGFZXG4gICAgfTtcbn1cblxuLyoqXG4gKiBnZXQgdGhlIGNlbnRlciBvZiBhbGwgdGhlIHBvaW50ZXJzXG4gKiBAcGFyYW0ge0FycmF5fSBwb2ludGVyc1xuICogQHJldHVybiB7T2JqZWN0fSBjZW50ZXIgY29udGFpbnMgYHhgIGFuZCBgeWAgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBnZXRDZW50ZXIocG9pbnRlcnMpIHtcbiAgICB2YXIgcG9pbnRlcnNMZW5ndGggPSBwb2ludGVycy5sZW5ndGg7XG5cbiAgICAvLyBubyBuZWVkIHRvIGxvb3Agd2hlbiBvbmx5IG9uZSB0b3VjaFxuICAgIGlmIChwb2ludGVyc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogcm91bmQocG9pbnRlcnNbMF0uY2xpZW50WCksXG4gICAgICAgICAgICB5OiByb3VuZChwb2ludGVyc1swXS5jbGllbnRZKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciB4ID0gMCwgeSA9IDAsIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgcG9pbnRlcnNMZW5ndGgpIHtcbiAgICAgICAgeCArPSBwb2ludGVyc1tpXS5jbGllbnRYO1xuICAgICAgICB5ICs9IHBvaW50ZXJzW2ldLmNsaWVudFk7XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB4OiByb3VuZCh4IC8gcG9pbnRlcnNMZW5ndGgpLFxuICAgICAgICB5OiByb3VuZCh5IC8gcG9pbnRlcnNMZW5ndGgpXG4gICAgfTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIHZlbG9jaXR5IGJldHdlZW4gdHdvIHBvaW50cy4gdW5pdCBpcyBpbiBweCBwZXIgbXMuXG4gKiBAcGFyYW0ge051bWJlcn0gZGVsdGFUaW1lXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqIEByZXR1cm4ge09iamVjdH0gdmVsb2NpdHkgYHhgIGFuZCBgeWBcbiAqL1xuZnVuY3Rpb24gZ2V0VmVsb2NpdHkoZGVsdGFUaW1lLCB4LCB5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCAvIGRlbHRhVGltZSB8fCAwLFxuICAgICAgICB5OiB5IC8gZGVsdGFUaW1lIHx8IDBcbiAgICB9O1xufVxuXG4vKipcbiAqIGdldCB0aGUgZGlyZWN0aW9uIGJldHdlZW4gdHdvIHBvaW50c1xuICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gKiBAcmV0dXJuIHtOdW1iZXJ9IGRpcmVjdGlvblxuICovXG5mdW5jdGlvbiBnZXREaXJlY3Rpb24oeCwgeSkge1xuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICAgIHJldHVybiBESVJFQ1RJT05fTk9ORTtcbiAgICB9XG5cbiAgICBpZiAoYWJzKHgpID49IGFicyh5KSkge1xuICAgICAgICByZXR1cm4geCA8IDAgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVDtcbiAgICB9XG4gICAgcmV0dXJuIHkgPCAwID8gRElSRUNUSU9OX1VQIDogRElSRUNUSU9OX0RPV047XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIHRoZSBhYnNvbHV0ZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwMSB7eCwgeX1cbiAqIEBwYXJhbSB7T2JqZWN0fSBwMiB7eCwgeX1cbiAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wc10gY29udGFpbmluZyB4IGFuZCB5IGtleXNcbiAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAqL1xuZnVuY3Rpb24gZ2V0RGlzdGFuY2UocDEsIHAyLCBwcm9wcykge1xuICAgIGlmICghcHJvcHMpIHtcbiAgICAgICAgcHJvcHMgPSBQUk9QU19YWTtcbiAgICB9XG4gICAgdmFyIHggPSBwMltwcm9wc1swXV0gLSBwMVtwcm9wc1swXV0sXG4gICAgICAgIHkgPSBwMltwcm9wc1sxXV0gLSBwMVtwcm9wc1sxXV07XG5cbiAgICByZXR1cm4gTWF0aC5zcXJ0KCh4ICogeCkgKyAoeSAqIHkpKTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIGNvb3JkaW5hdGVzXG4gKiBAcGFyYW0ge09iamVjdH0gcDFcbiAqIEBwYXJhbSB7T2JqZWN0fSBwMlxuICogQHBhcmFtIHtBcnJheX0gW3Byb3BzXSBjb250YWluaW5nIHggYW5kIHkga2V5c1xuICogQHJldHVybiB7TnVtYmVyfSBhbmdsZVxuICovXG5mdW5jdGlvbiBnZXRBbmdsZShwMSwgcDIsIHByb3BzKSB7XG4gICAgaWYgKCFwcm9wcykge1xuICAgICAgICBwcm9wcyA9IFBST1BTX1hZO1xuICAgIH1cbiAgICB2YXIgeCA9IHAyW3Byb3BzWzBdXSAtIHAxW3Byb3BzWzBdXSxcbiAgICAgICAgeSA9IHAyW3Byb3BzWzFdXSAtIHAxW3Byb3BzWzFdXTtcbiAgICByZXR1cm4gTWF0aC5hdGFuMih5LCB4KSAqIDE4MCAvIE1hdGguUEk7XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIHRoZSByb3RhdGlvbiBkZWdyZWVzIGJldHdlZW4gdHdvIHBvaW50ZXJzZXRzXG4gKiBAcGFyYW0ge0FycmF5fSBzdGFydCBhcnJheSBvZiBwb2ludGVyc1xuICogQHBhcmFtIHtBcnJheX0gZW5kIGFycmF5IG9mIHBvaW50ZXJzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHJvdGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldFJvdGF0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gZ2V0QW5nbGUoZW5kWzFdLCBlbmRbMF0sIFBST1BTX0NMSUVOVF9YWSkgKyBnZXRBbmdsZShzdGFydFsxXSwgc3RhcnRbMF0sIFBST1BTX0NMSUVOVF9YWSk7XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIHRoZSBzY2FsZSBmYWN0b3IgYmV0d2VlbiB0d28gcG9pbnRlcnNldHNcbiAqIG5vIHNjYWxlIGlzIDEsIGFuZCBnb2VzIGRvd24gdG8gMCB3aGVuIHBpbmNoZWQgdG9nZXRoZXIsIGFuZCBiaWdnZXIgd2hlbiBwaW5jaGVkIG91dFxuICogQHBhcmFtIHtBcnJheX0gc3RhcnQgYXJyYXkgb2YgcG9pbnRlcnNcbiAqIEBwYXJhbSB7QXJyYXl9IGVuZCBhcnJheSBvZiBwb2ludGVyc1xuICogQHJldHVybiB7TnVtYmVyfSBzY2FsZVxuICovXG5mdW5jdGlvbiBnZXRTY2FsZShzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIGdldERpc3RhbmNlKGVuZFswXSwgZW5kWzFdLCBQUk9QU19DTElFTlRfWFkpIC8gZ2V0RGlzdGFuY2Uoc3RhcnRbMF0sIHN0YXJ0WzFdLCBQUk9QU19DTElFTlRfWFkpO1xufVxuXG52YXIgTU9VU0VfSU5QVVRfTUFQID0ge1xuICAgIG1vdXNlZG93bjogSU5QVVRfU1RBUlQsXG4gICAgbW91c2Vtb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIG1vdXNldXA6IElOUFVUX0VORFxufTtcblxudmFyIE1PVVNFX0VMRU1FTlRfRVZFTlRTID0gJ21vdXNlZG93bic7XG52YXIgTU9VU0VfV0lORE9XX0VWRU5UUyA9ICdtb3VzZW1vdmUgbW91c2V1cCc7XG5cbi8qKlxuICogTW91c2UgZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIE1vdXNlSW5wdXQoKSB7XG4gICAgdGhpcy5ldkVsID0gTU9VU0VfRUxFTUVOVF9FVkVOVFM7XG4gICAgdGhpcy5ldldpbiA9IE1PVVNFX1dJTkRPV19FVkVOVFM7XG5cbiAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTsgLy8gbW91c2Vkb3duIHN0YXRlXG5cbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KE1vdXNlSW5wdXQsIElucHV0LCB7XG4gICAgLyoqXG4gICAgICogaGFuZGxlIG1vdXNlIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIE1FaGFuZGxlcihldikge1xuICAgICAgICB2YXIgZXZlbnRUeXBlID0gTU9VU0VfSU5QVVRfTUFQW2V2LnR5cGVdO1xuXG4gICAgICAgIC8vIG9uIHN0YXJ0IHdlIHdhbnQgdG8gaGF2ZSB0aGUgbGVmdCBtb3VzZSBidXR0b24gZG93blxuICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQgJiYgZXYuYnV0dG9uID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnByZXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX01PVkUgJiYgZXYud2hpY2ggIT09IDEpIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IElOUFVUX0VORDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1vdXNlIG11c3QgYmUgZG93blxuICAgICAgICBpZiAoIXRoaXMucHJlc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgZXZlbnRUeXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogW2V2XSxcbiAgICAgICAgICAgIGNoYW5nZWRQb2ludGVyczogW2V2XSxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX01PVVNFLFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuXG52YXIgUE9JTlRFUl9JTlBVVF9NQVAgPSB7XG4gICAgcG9pbnRlcmRvd246IElOUFVUX1NUQVJULFxuICAgIHBvaW50ZXJtb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHBvaW50ZXJ1cDogSU5QVVRfRU5ELFxuICAgIHBvaW50ZXJjYW5jZWw6IElOUFVUX0NBTkNFTCxcbiAgICBwb2ludGVyb3V0OiBJTlBVVF9DQU5DRUxcbn07XG5cbi8vIGluIElFMTAgdGhlIHBvaW50ZXIgdHlwZXMgaXMgZGVmaW5lZCBhcyBhbiBlbnVtXG52YXIgSUUxMF9QT0lOVEVSX1RZUEVfRU5VTSA9IHtcbiAgICAyOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgIDM6IElOUFVUX1RZUEVfUEVOLFxuICAgIDQ6IElOUFVUX1RZUEVfTU9VU0UsXG4gICAgNTogSU5QVVRfVFlQRV9LSU5FQ1QgLy8gc2VlIGh0dHBzOi8vdHdpdHRlci5jb20vamFjb2Jyb3NzaS9zdGF0dXMvNDgwNTk2NDM4NDg5ODkwODE2XG59O1xuXG52YXIgUE9JTlRFUl9FTEVNRU5UX0VWRU5UUyA9ICdwb2ludGVyZG93bic7XG52YXIgUE9JTlRFUl9XSU5ET1dfRVZFTlRTID0gJ3BvaW50ZXJtb3ZlIHBvaW50ZXJ1cCBwb2ludGVyY2FuY2VsJztcblxuLy8gSUUxMCBoYXMgcHJlZml4ZWQgc3VwcG9ydCwgYW5kIGNhc2Utc2Vuc2l0aXZlXG5pZiAod2luZG93Lk1TUG9pbnRlckV2ZW50ICYmICF3aW5kb3cuUG9pbnRlckV2ZW50KSB7XG4gICAgUE9JTlRFUl9FTEVNRU5UX0VWRU5UUyA9ICdNU1BvaW50ZXJEb3duJztcbiAgICBQT0lOVEVSX1dJTkRPV19FVkVOVFMgPSAnTVNQb2ludGVyTW92ZSBNU1BvaW50ZXJVcCBNU1BvaW50ZXJDYW5jZWwnO1xufVxuXG4vKipcbiAqIFBvaW50ZXIgZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIFBvaW50ZXJFdmVudElucHV0KCkge1xuICAgIHRoaXMuZXZFbCA9IFBPSU5URVJfRUxFTUVOVF9FVkVOVFM7XG4gICAgdGhpcy5ldldpbiA9IFBPSU5URVJfV0lORE9XX0VWRU5UUztcblxuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLnN0b3JlID0gKHRoaXMubWFuYWdlci5zZXNzaW9uLnBvaW50ZXJFdmVudHMgPSBbXSk7XG59XG5cbmluaGVyaXQoUG9pbnRlckV2ZW50SW5wdXQsIElucHV0LCB7XG4gICAgLyoqXG4gICAgICogaGFuZGxlIG1vdXNlIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFBFaGFuZGxlcihldikge1xuICAgICAgICB2YXIgc3RvcmUgPSB0aGlzLnN0b3JlO1xuICAgICAgICB2YXIgcmVtb3ZlUG9pbnRlciA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBldmVudFR5cGVOb3JtYWxpemVkID0gZXYudHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ21zJywgJycpO1xuICAgICAgICB2YXIgZXZlbnRUeXBlID0gUE9JTlRFUl9JTlBVVF9NQVBbZXZlbnRUeXBlTm9ybWFsaXplZF07XG4gICAgICAgIHZhciBwb2ludGVyVHlwZSA9IElFMTBfUE9JTlRFUl9UWVBFX0VOVU1bZXYucG9pbnRlclR5cGVdIHx8IGV2LnBvaW50ZXJUeXBlO1xuXG4gICAgICAgIHZhciBpc1RvdWNoID0gKHBvaW50ZXJUeXBlID09IElOUFVUX1RZUEVfVE9VQ0gpO1xuXG4gICAgICAgIC8vIGdldCBpbmRleCBvZiB0aGUgZXZlbnQgaW4gdGhlIHN0b3JlXG4gICAgICAgIHZhciBzdG9yZUluZGV4ID0gaW5BcnJheShzdG9yZSwgZXYucG9pbnRlcklkLCAncG9pbnRlcklkJyk7XG5cbiAgICAgICAgLy8gc3RhcnQgYW5kIG1vdXNlIG11c3QgYmUgZG93blxuICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQgJiYgKGV2LmJ1dHRvbiA9PT0gMCB8fCBpc1RvdWNoKSkge1xuICAgICAgICAgICAgaWYgKHN0b3JlSW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUucHVzaChldik7XG4gICAgICAgICAgICAgICAgc3RvcmVJbmRleCA9IHN0b3JlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkpIHtcbiAgICAgICAgICAgIHJlbW92ZVBvaW50ZXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaXQgbm90IGZvdW5kLCBzbyB0aGUgcG9pbnRlciBoYXNuJ3QgYmVlbiBkb3duIChzbyBpdCdzIHByb2JhYmx5IGEgaG92ZXIpXG4gICAgICAgIGlmIChzdG9yZUluZGV4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBldmVudCBpbiB0aGUgc3RvcmVcbiAgICAgICAgc3RvcmVbc3RvcmVJbmRleF0gPSBldjtcblxuICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgZXZlbnRUeXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogc3RvcmUsXG4gICAgICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IFtldl0sXG4gICAgICAgICAgICBwb2ludGVyVHlwZTogcG9pbnRlclR5cGUsXG4gICAgICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlbW92ZVBvaW50ZXIpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIHRoZSBzdG9yZVxuICAgICAgICAgICAgc3RvcmUuc3BsaWNlKHN0b3JlSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbnZhciBTSU5HTEVfVE9VQ0hfSU5QVVRfTUFQID0ge1xuICAgIHRvdWNoc3RhcnQ6IElOUFVUX1NUQVJULFxuICAgIHRvdWNobW92ZTogSU5QVVRfTU9WRSxcbiAgICB0b3VjaGVuZDogSU5QVVRfRU5ELFxuICAgIHRvdWNoY2FuY2VsOiBJTlBVVF9DQU5DRUxcbn07XG5cbnZhciBTSU5HTEVfVE9VQ0hfVEFSR0VUX0VWRU5UUyA9ICd0b3VjaHN0YXJ0JztcbnZhciBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUyA9ICd0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCc7XG5cbi8qKlxuICogVG91Y2ggZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIFNpbmdsZVRvdWNoSW5wdXQoKSB7XG4gICAgdGhpcy5ldlRhcmdldCA9IFNJTkdMRV9UT1VDSF9UQVJHRVRfRVZFTlRTO1xuICAgIHRoaXMuZXZXaW4gPSBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUztcbiAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoU2luZ2xlVG91Y2hJbnB1dCwgSW5wdXQsIHtcbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBURWhhbmRsZXIoZXYpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBTSU5HTEVfVE9VQ0hfSU5QVVRfTUFQW2V2LnR5cGVdO1xuXG4gICAgICAgIC8vIHNob3VsZCB3ZSBoYW5kbGUgdGhlIHRvdWNoIGV2ZW50cz9cbiAgICAgICAgaWYgKHR5cGUgPT09IElOUFVUX1NUQVJUKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0b3VjaGVzID0gbm9ybWFsaXplU2luZ2xlVG91Y2hlcy5jYWxsKHRoaXMsIGV2LCB0eXBlKTtcblxuICAgICAgICAvLyB3aGVuIGRvbmUsIHJlc2V0IHRoZSBzdGFydGVkIHN0YXRlXG4gICAgICAgIGlmICh0eXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkgJiYgdG91Y2hlc1swXS5sZW5ndGggLSB0b3VjaGVzWzFdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgdHlwZSwge1xuICAgICAgICAgICAgcG9pbnRlcnM6IHRvdWNoZXNbMF0sXG4gICAgICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IHRvdWNoZXNbMV0sXG4gICAgICAgICAgICBwb2ludGVyVHlwZTogSU5QVVRfVFlQRV9UT1VDSCxcbiAgICAgICAgICAgIHNyY0V2ZW50OiBldlxuICAgICAgICB9KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBAdGhpcyB7VG91Y2hJbnB1dH1cbiAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICogQHBhcmFtIHtOdW1iZXJ9IHR5cGUgZmxhZ1xuICogQHJldHVybnMge3VuZGVmaW5lZHxBcnJheX0gW2FsbCwgY2hhbmdlZF1cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2luZ2xlVG91Y2hlcyhldiwgdHlwZSkge1xuICAgIHZhciBhbGwgPSB0b0FycmF5KGV2LnRvdWNoZXMpO1xuICAgIHZhciBjaGFuZ2VkID0gdG9BcnJheShldi5jaGFuZ2VkVG91Y2hlcyk7XG5cbiAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgIGFsbCA9IHVuaXF1ZUFycmF5KGFsbC5jb25jYXQoY2hhbmdlZCksICdpZGVudGlmaWVyJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFthbGwsIGNoYW5nZWRdO1xufVxuXG52YXIgVE9VQ0hfSU5QVVRfTUFQID0ge1xuICAgIHRvdWNoc3RhcnQ6IElOUFVUX1NUQVJULFxuICAgIHRvdWNobW92ZTogSU5QVVRfTU9WRSxcbiAgICB0b3VjaGVuZDogSU5QVVRfRU5ELFxuICAgIHRvdWNoY2FuY2VsOiBJTlBVVF9DQU5DRUxcbn07XG5cbnZhciBUT1VDSF9UQVJHRVRfRVZFTlRTID0gJ3RvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsJztcblxuLyoqXG4gKiBNdWx0aS11c2VyIHRvdWNoIGV2ZW50cyBpbnB1dFxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBJbnB1dFxuICovXG5mdW5jdGlvbiBUb3VjaElucHV0KCkge1xuICAgIHRoaXMuZXZUYXJnZXQgPSBUT1VDSF9UQVJHRVRfRVZFTlRTO1xuICAgIHRoaXMudGFyZ2V0SWRzID0ge307XG5cbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KFRvdWNoSW5wdXQsIElucHV0LCB7XG4gICAgaGFuZGxlcjogZnVuY3Rpb24gTVRFaGFuZGxlcihldikge1xuICAgICAgICB2YXIgdHlwZSA9IFRPVUNIX0lOUFVUX01BUFtldi50eXBlXTtcbiAgICAgICAgdmFyIHRvdWNoZXMgPSBnZXRUb3VjaGVzLmNhbGwodGhpcywgZXYsIHR5cGUpO1xuICAgICAgICBpZiAoIXRvdWNoZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCB0eXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogdG91Y2hlc1swXSxcbiAgICAgICAgICAgIGNoYW5nZWRQb2ludGVyczogdG91Y2hlc1sxXSxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIEB0aGlzIHtUb3VjaElucHV0fVxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKiBAcGFyYW0ge051bWJlcn0gdHlwZSBmbGFnXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfEFycmF5fSBbYWxsLCBjaGFuZ2VkXVxuICovXG5mdW5jdGlvbiBnZXRUb3VjaGVzKGV2LCB0eXBlKSB7XG4gICAgdmFyIGFsbFRvdWNoZXMgPSB0b0FycmF5KGV2LnRvdWNoZXMpO1xuICAgIHZhciB0YXJnZXRJZHMgPSB0aGlzLnRhcmdldElkcztcblxuICAgIC8vIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgdG91Y2gsIHRoZSBwcm9jZXNzIGNhbiBiZSBzaW1wbGlmaWVkXG4gICAgaWYgKHR5cGUgJiAoSU5QVVRfU1RBUlQgfCBJTlBVVF9NT1ZFKSAmJiBhbGxUb3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0YXJnZXRJZHNbYWxsVG91Y2hlc1swXS5pZGVudGlmaWVyXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBbYWxsVG91Y2hlcywgYWxsVG91Y2hlc107XG4gICAgfVxuXG4gICAgdmFyIGksXG4gICAgICAgIHRhcmdldFRvdWNoZXMsXG4gICAgICAgIGNoYW5nZWRUb3VjaGVzID0gdG9BcnJheShldi5jaGFuZ2VkVG91Y2hlcyksXG4gICAgICAgIGNoYW5nZWRUYXJnZXRUb3VjaGVzID0gW10sXG4gICAgICAgIHRhcmdldCA9IHRoaXMudGFyZ2V0O1xuXG4gICAgLy8gZ2V0IHRhcmdldCB0b3VjaGVzIGZyb20gdG91Y2hlc1xuICAgIHRhcmdldFRvdWNoZXMgPSBhbGxUb3VjaGVzLmZpbHRlcihmdW5jdGlvbih0b3VjaCkge1xuICAgICAgICByZXR1cm4gaGFzUGFyZW50KHRvdWNoLnRhcmdldCwgdGFyZ2V0KTtcbiAgICB9KTtcblxuICAgIC8vIGNvbGxlY3QgdG91Y2hlc1xuICAgIGlmICh0eXBlID09PSBJTlBVVF9TVEFSVCkge1xuICAgICAgICBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPCB0YXJnZXRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGFyZ2V0SWRzW3RhcmdldFRvdWNoZXNbaV0uaWRlbnRpZmllcl0gPSB0cnVlO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZmlsdGVyIGNoYW5nZWQgdG91Y2hlcyB0byBvbmx5IGNvbnRhaW4gdG91Y2hlcyB0aGF0IGV4aXN0IGluIHRoZSBjb2xsZWN0ZWQgdGFyZ2V0IGlkc1xuICAgIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgY2hhbmdlZFRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0YXJnZXRJZHNbY2hhbmdlZFRvdWNoZXNbaV0uaWRlbnRpZmllcl0pIHtcbiAgICAgICAgICAgIGNoYW5nZWRUYXJnZXRUb3VjaGVzLnB1c2goY2hhbmdlZFRvdWNoZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYW51cCByZW1vdmVkIHRvdWNoZXNcbiAgICAgICAgaWYgKHR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSkge1xuICAgICAgICAgICAgZGVsZXRlIHRhcmdldElkc1tjaGFuZ2VkVG91Y2hlc1tpXS5pZGVudGlmaWVyXTtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgfVxuXG4gICAgaWYgKCFjaGFuZ2VkVGFyZ2V0VG91Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBbXG4gICAgICAgIC8vIG1lcmdlIHRhcmdldFRvdWNoZXMgd2l0aCBjaGFuZ2VkVGFyZ2V0VG91Y2hlcyBzbyBpdCBjb250YWlucyBBTEwgdG91Y2hlcywgaW5jbHVkaW5nICdlbmQnIGFuZCAnY2FuY2VsJ1xuICAgICAgICB1bmlxdWVBcnJheSh0YXJnZXRUb3VjaGVzLmNvbmNhdChjaGFuZ2VkVGFyZ2V0VG91Y2hlcyksICdpZGVudGlmaWVyJywgdHJ1ZSksXG4gICAgICAgIGNoYW5nZWRUYXJnZXRUb3VjaGVzXG4gICAgXTtcbn1cblxuLyoqXG4gKiBDb21iaW5lZCB0b3VjaCBhbmQgbW91c2UgaW5wdXRcbiAqXG4gKiBUb3VjaCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhlbiBtb3VzZSwgYW5kIHdoaWxlIHRvdWNoaW5nIG5vIG1vdXNlIGV2ZW50cyBhcmUgYWxsb3dlZC5cbiAqIFRoaXMgYmVjYXVzZSB0b3VjaCBkZXZpY2VzIGFsc28gZW1pdCBtb3VzZSBldmVudHMgd2hpbGUgZG9pbmcgYSB0b3VjaC5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cblxudmFyIERFRFVQX1RJTUVPVVQgPSAyNTAwO1xudmFyIERFRFVQX0RJU1RBTkNFID0gMjU7XG5cbmZ1bmN0aW9uIFRvdWNoTW91c2VJbnB1dCgpIHtcbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdmFyIGhhbmRsZXIgPSBiaW5kRm4odGhpcy5oYW5kbGVyLCB0aGlzKTtcbiAgICB0aGlzLnRvdWNoID0gbmV3IFRvdWNoSW5wdXQodGhpcy5tYW5hZ2VyLCBoYW5kbGVyKTtcbiAgICB0aGlzLm1vdXNlID0gbmV3IE1vdXNlSW5wdXQodGhpcy5tYW5hZ2VyLCBoYW5kbGVyKTtcblxuICAgIHRoaXMucHJpbWFyeVRvdWNoID0gbnVsbDtcbiAgICB0aGlzLmxhc3RUb3VjaGVzID0gW107XG59XG5cbmluaGVyaXQoVG91Y2hNb3VzZUlucHV0LCBJbnB1dCwge1xuICAgIC8qKlxuICAgICAqIGhhbmRsZSBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzXG4gICAgICogQHBhcmFtIHtIYW1tZXJ9IG1hbmFnZXJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXRFdmVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBUTUVoYW5kbGVyKG1hbmFnZXIsIGlucHV0RXZlbnQsIGlucHV0RGF0YSkge1xuICAgICAgICB2YXIgaXNUb3VjaCA9IChpbnB1dERhdGEucG9pbnRlclR5cGUgPT0gSU5QVVRfVFlQRV9UT1VDSCksXG4gICAgICAgICAgICBpc01vdXNlID0gKGlucHV0RGF0YS5wb2ludGVyVHlwZSA9PSBJTlBVVF9UWVBFX01PVVNFKTtcblxuICAgICAgICBpZiAoaXNNb3VzZSAmJiBpbnB1dERhdGEuc291cmNlQ2FwYWJpbGl0aWVzICYmIGlucHV0RGF0YS5zb3VyY2VDYXBhYmlsaXRpZXMuZmlyZXNUb3VjaEV2ZW50cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2hlbiB3ZSdyZSBpbiBhIHRvdWNoIGV2ZW50LCByZWNvcmQgdG91Y2hlcyB0byAgZGUtZHVwZSBzeW50aGV0aWMgbW91c2UgZXZlbnRcbiAgICAgICAgaWYgKGlzVG91Y2gpIHtcbiAgICAgICAgICAgIHJlY29yZFRvdWNoZXMuY2FsbCh0aGlzLCBpbnB1dEV2ZW50LCBpbnB1dERhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTW91c2UgJiYgaXNTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGlucHV0RGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sobWFuYWdlciwgaW5wdXRFdmVudCwgaW5wdXREYXRhKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnRvdWNoLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5tb3VzZS5kZXN0cm95KCk7XG4gICAgfVxufSk7XG5cbmZ1bmN0aW9uIHJlY29yZFRvdWNoZXMoZXZlbnRUeXBlLCBldmVudERhdGEpIHtcbiAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgdGhpcy5wcmltYXJ5VG91Y2ggPSBldmVudERhdGEuY2hhbmdlZFBvaW50ZXJzWzBdLmlkZW50aWZpZXI7XG4gICAgICAgIHNldExhc3RUb3VjaC5jYWxsKHRoaXMsIGV2ZW50RGF0YSk7XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSkge1xuICAgICAgICBzZXRMYXN0VG91Y2guY2FsbCh0aGlzLCBldmVudERhdGEpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2V0TGFzdFRvdWNoKGV2ZW50RGF0YSkge1xuICAgIHZhciB0b3VjaCA9IGV2ZW50RGF0YS5jaGFuZ2VkUG9pbnRlcnNbMF07XG5cbiAgICBpZiAodG91Y2guaWRlbnRpZmllciA9PT0gdGhpcy5wcmltYXJ5VG91Y2gpIHtcbiAgICAgICAgdmFyIGxhc3RUb3VjaCA9IHt4OiB0b3VjaC5jbGllbnRYLCB5OiB0b3VjaC5jbGllbnRZfTtcbiAgICAgICAgdGhpcy5sYXN0VG91Y2hlcy5wdXNoKGxhc3RUb3VjaCk7XG4gICAgICAgIHZhciBsdHMgPSB0aGlzLmxhc3RUb3VjaGVzO1xuICAgICAgICB2YXIgcmVtb3ZlTGFzdFRvdWNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgaSA9IGx0cy5pbmRleE9mKGxhc3RUb3VjaCk7XG4gICAgICAgICAgICBpZiAoaSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgbHRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc2V0VGltZW91dChyZW1vdmVMYXN0VG91Y2gsIERFRFVQX1RJTUVPVVQpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNTeW50aGV0aWNFdmVudChldmVudERhdGEpIHtcbiAgICB2YXIgeCA9IGV2ZW50RGF0YS5zcmNFdmVudC5jbGllbnRYLCB5ID0gZXZlbnREYXRhLnNyY0V2ZW50LmNsaWVudFk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxhc3RUb3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy5sYXN0VG91Y2hlc1tpXTtcbiAgICAgICAgdmFyIGR4ID0gTWF0aC5hYnMoeCAtIHQueCksIGR5ID0gTWF0aC5hYnMoeSAtIHQueSk7XG4gICAgICAgIGlmIChkeCA8PSBERURVUF9ESVNUQU5DRSAmJiBkeSA8PSBERURVUF9ESVNUQU5DRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgUFJFRklYRURfVE9VQ0hfQUNUSU9OID0gcHJlZml4ZWQoVEVTVF9FTEVNRU5ULnN0eWxlLCAndG91Y2hBY3Rpb24nKTtcbnZhciBOQVRJVkVfVE9VQ0hfQUNUSU9OID0gUFJFRklYRURfVE9VQ0hfQUNUSU9OICE9PSB1bmRlZmluZWQ7XG5cbi8vIG1hZ2ljYWwgdG91Y2hBY3Rpb24gdmFsdWVcbnZhciBUT1VDSF9BQ1RJT05fQ09NUFVURSA9ICdjb21wdXRlJztcbnZhciBUT1VDSF9BQ1RJT05fQVVUTyA9ICdhdXRvJztcbnZhciBUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OID0gJ21hbmlwdWxhdGlvbic7IC8vIG5vdCBpbXBsZW1lbnRlZFxudmFyIFRPVUNIX0FDVElPTl9OT05FID0gJ25vbmUnO1xudmFyIFRPVUNIX0FDVElPTl9QQU5fWCA9ICdwYW4teCc7XG52YXIgVE9VQ0hfQUNUSU9OX1BBTl9ZID0gJ3Bhbi15JztcbnZhciBUT1VDSF9BQ1RJT05fTUFQID0gZ2V0VG91Y2hBY3Rpb25Qcm9wcygpO1xuXG4vKipcbiAqIFRvdWNoIEFjdGlvblxuICogc2V0cyB0aGUgdG91Y2hBY3Rpb24gcHJvcGVydHkgb3IgdXNlcyB0aGUganMgYWx0ZXJuYXRpdmVcbiAqIEBwYXJhbSB7TWFuYWdlcn0gbWFuYWdlclxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gVG91Y2hBY3Rpb24obWFuYWdlciwgdmFsdWUpIHtcbiAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIHRoaXMuc2V0KHZhbHVlKTtcbn1cblxuVG91Y2hBY3Rpb24ucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIHNldCB0aGUgdG91Y2hBY3Rpb24gdmFsdWUgb24gdGhlIGVsZW1lbnQgb3IgZW5hYmxlIHRoZSBwb2x5ZmlsbFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgLy8gZmluZCBvdXQgdGhlIHRvdWNoLWFjdGlvbiBieSB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgaWYgKHZhbHVlID09IFRPVUNIX0FDVElPTl9DT01QVVRFKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuY29tcHV0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE5BVElWRV9UT1VDSF9BQ1RJT04gJiYgdGhpcy5tYW5hZ2VyLmVsZW1lbnQuc3R5bGUgJiYgVE9VQ0hfQUNUSU9OX01BUFt2YWx1ZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlW1BSRUZJWEVEX1RPVUNIX0FDVElPTl0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGlvbnMgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICoganVzdCByZS1zZXQgdGhlIHRvdWNoQWN0aW9uIHZhbHVlXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5zZXQodGhpcy5tYW5hZ2VyLm9wdGlvbnMudG91Y2hBY3Rpb24pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjb21wdXRlIHRoZSB2YWx1ZSBmb3IgdGhlIHRvdWNoQWN0aW9uIHByb3BlcnR5IGJhc2VkIG9uIHRoZSByZWNvZ25pemVyJ3Mgc2V0dGluZ3NcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB2YWx1ZVxuICAgICAqL1xuICAgIGNvbXB1dGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYWN0aW9ucyA9IFtdO1xuICAgICAgICBlYWNoKHRoaXMubWFuYWdlci5yZWNvZ25pemVycywgZnVuY3Rpb24ocmVjb2duaXplcikge1xuICAgICAgICAgICAgaWYgKGJvb2xPckZuKHJlY29nbml6ZXIub3B0aW9ucy5lbmFibGUsIFtyZWNvZ25pemVyXSkpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zID0gYWN0aW9ucy5jb25jYXQocmVjb2duaXplci5nZXRUb3VjaEFjdGlvbigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjbGVhblRvdWNoQWN0aW9ucyhhY3Rpb25zLmpvaW4oJyAnKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBlYWNoIGlucHV0IGN5Y2xlIGFuZCBwcm92aWRlcyB0aGUgcHJldmVudGluZyBvZiB0aGUgYnJvd3NlciBiZWhhdmlvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0czogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIHNyY0V2ZW50ID0gaW5wdXQuc3JjRXZlbnQ7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBpbnB1dC5vZmZzZXREaXJlY3Rpb247XG5cbiAgICAgICAgLy8gaWYgdGhlIHRvdWNoIGFjdGlvbiBkaWQgcHJldmVudGVkIG9uY2UgdGhpcyBzZXNzaW9uXG4gICAgICAgIGlmICh0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgIHNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuYWN0aW9ucztcbiAgICAgICAgdmFyIGhhc05vbmUgPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fTk9ORSkgJiYgIVRPVUNIX0FDVElPTl9NQVBbVE9VQ0hfQUNUSU9OX05PTkVdO1xuICAgICAgICB2YXIgaGFzUGFuWSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWSkgJiYgIVRPVUNIX0FDVElPTl9NQVBbVE9VQ0hfQUNUSU9OX1BBTl9ZXTtcbiAgICAgICAgdmFyIGhhc1BhblggPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fUEFOX1gpICYmICFUT1VDSF9BQ1RJT05fTUFQW1RPVUNIX0FDVElPTl9QQU5fWF07XG5cbiAgICAgICAgaWYgKGhhc05vbmUpIHtcbiAgICAgICAgICAgIC8vZG8gbm90IHByZXZlbnQgZGVmYXVsdHMgaWYgdGhpcyBpcyBhIHRhcCBnZXN0dXJlXG5cbiAgICAgICAgICAgIHZhciBpc1RhcFBvaW50ZXIgPSBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICB2YXIgaXNUYXBNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgMjtcbiAgICAgICAgICAgIHZhciBpc1RhcFRvdWNoVGltZSA9IGlucHV0LmRlbHRhVGltZSA8IDI1MDtcblxuICAgICAgICAgICAgaWYgKGlzVGFwUG9pbnRlciAmJiBpc1RhcE1vdmVtZW50ICYmIGlzVGFwVG91Y2hUaW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc1BhblggJiYgaGFzUGFuWSkge1xuICAgICAgICAgICAgLy8gYHBhbi14IHBhbi15YCBtZWFucyBicm93c2VyIGhhbmRsZXMgYWxsIHNjcm9sbGluZy9wYW5uaW5nLCBkbyBub3QgcHJldmVudFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc05vbmUgfHxcbiAgICAgICAgICAgIChoYXNQYW5ZICYmIGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB8fFxuICAgICAgICAgICAgKGhhc1BhblggJiYgZGlyZWN0aW9uICYgRElSRUNUSU9OX1ZFUlRJQ0FMKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJldmVudFNyYyhzcmNFdmVudCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY2FsbCBwcmV2ZW50RGVmYXVsdCB0byBwcmV2ZW50IHRoZSBicm93c2VyJ3MgZGVmYXVsdCBiZWhhdmlvciAoc2Nyb2xsaW5nIGluIG1vc3QgY2FzZXMpXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNyY0V2ZW50XG4gICAgICovXG4gICAgcHJldmVudFNyYzogZnVuY3Rpb24oc3JjRXZlbnQpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIHdoZW4gdGhlIHRvdWNoQWN0aW9ucyBhcmUgY29sbGVjdGVkIHRoZXkgYXJlIG5vdCBhIHZhbGlkIHZhbHVlLCBzbyB3ZSBuZWVkIHRvIGNsZWFuIHRoaW5ncyB1cC4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvbnNcbiAqIEByZXR1cm5zIHsqfVxuICovXG5mdW5jdGlvbiBjbGVhblRvdWNoQWN0aW9ucyhhY3Rpb25zKSB7XG4gICAgLy8gbm9uZVxuICAgIGlmIChpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fTk9ORSkpIHtcbiAgICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9OT05FO1xuICAgIH1cblxuICAgIHZhciBoYXNQYW5YID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgICB2YXIgaGFzUGFuWSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWSk7XG5cbiAgICAvLyBpZiBib3RoIHBhbi14IGFuZCBwYW4teSBhcmUgc2V0IChkaWZmZXJlbnQgcmVjb2duaXplcnNcbiAgICAvLyBmb3IgZGlmZmVyZW50IGRpcmVjdGlvbnMsIGUuZy4gaG9yaXpvbnRhbCBwYW4gYnV0IHZlcnRpY2FsIHN3aXBlPylcbiAgICAvLyB3ZSBuZWVkIG5vbmUgKGFzIG90aGVyd2lzZSB3aXRoIHBhbi14IHBhbi15IGNvbWJpbmVkIG5vbmUgb2YgdGhlc2VcbiAgICAvLyByZWNvZ25pemVycyB3aWxsIHdvcmssIHNpbmNlIHRoZSBicm93c2VyIHdvdWxkIGhhbmRsZSBhbGwgcGFubmluZ1xuICAgIGlmIChoYXNQYW5YICYmIGhhc1BhblkpIHtcbiAgICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9OT05FO1xuICAgIH1cblxuICAgIC8vIHBhbi14IE9SIHBhbi15XG4gICAgaWYgKGhhc1BhblggfHwgaGFzUGFuWSkge1xuICAgICAgICByZXR1cm4gaGFzUGFuWCA/IFRPVUNIX0FDVElPTl9QQU5fWCA6IFRPVUNIX0FDVElPTl9QQU5fWTtcbiAgICB9XG5cbiAgICAvLyBtYW5pcHVsYXRpb25cbiAgICBpZiAoaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTikpIHtcbiAgICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9NQU5JUFVMQVRJT047XG4gICAgfVxuXG4gICAgcmV0dXJuIFRPVUNIX0FDVElPTl9BVVRPO1xufVxuXG5mdW5jdGlvbiBnZXRUb3VjaEFjdGlvblByb3BzKCkge1xuICAgIGlmICghTkFUSVZFX1RPVUNIX0FDVElPTikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciB0b3VjaE1hcCA9IHt9O1xuICAgIHZhciBjc3NTdXBwb3J0cyA9IHdpbmRvdy5DU1MgJiYgd2luZG93LkNTUy5zdXBwb3J0cztcbiAgICBbJ2F1dG8nLCAnbWFuaXB1bGF0aW9uJywgJ3Bhbi15JywgJ3Bhbi14JywgJ3Bhbi14IHBhbi15JywgJ25vbmUnXS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCkge1xuXG4gICAgICAgIC8vIElmIGNzcy5zdXBwb3J0cyBpcyBub3Qgc3VwcG9ydGVkIGJ1dCB0aGVyZSBpcyBuYXRpdmUgdG91Y2gtYWN0aW9uIGFzc3VtZSBpdCBzdXBwb3J0c1xuICAgICAgICAvLyBhbGwgdmFsdWVzLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBJRSAxMCBhbmQgMTEuXG4gICAgICAgIHRvdWNoTWFwW3ZhbF0gPSBjc3NTdXBwb3J0cyA/IHdpbmRvdy5DU1Muc3VwcG9ydHMoJ3RvdWNoLWFjdGlvbicsIHZhbCkgOiB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiB0b3VjaE1hcDtcbn1cblxuLyoqXG4gKiBSZWNvZ25pemVyIGZsb3cgZXhwbGFpbmVkOyAqXG4gKiBBbGwgcmVjb2duaXplcnMgaGF2ZSB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBQT1NTSUJMRSB3aGVuIGEgaW5wdXQgc2Vzc2lvbiBzdGFydHMuXG4gKiBUaGUgZGVmaW5pdGlvbiBvZiBhIGlucHV0IHNlc3Npb24gaXMgZnJvbSB0aGUgZmlyc3QgaW5wdXQgdW50aWwgdGhlIGxhc3QgaW5wdXQsIHdpdGggYWxsIGl0J3MgbW92ZW1lbnQgaW4gaXQuICpcbiAqIEV4YW1wbGUgc2Vzc2lvbiBmb3IgbW91c2UtaW5wdXQ6IG1vdXNlZG93biAtPiBtb3VzZW1vdmUgLT4gbW91c2V1cFxuICpcbiAqIE9uIGVhY2ggcmVjb2duaXppbmcgY3ljbGUgKHNlZSBNYW5hZ2VyLnJlY29nbml6ZSkgdGhlIC5yZWNvZ25pemUoKSBtZXRob2QgaXMgZXhlY3V0ZWRcbiAqIHdoaWNoIGRldGVybWluZXMgd2l0aCBzdGF0ZSBpdCBzaG91bGQgYmUuXG4gKlxuICogSWYgdGhlIHJlY29nbml6ZXIgaGFzIHRoZSBzdGF0ZSBGQUlMRUQsIENBTkNFTExFRCBvciBSRUNPR05JWkVEIChlcXVhbHMgRU5ERUQpLCBpdCBpcyByZXNldCB0b1xuICogUE9TU0lCTEUgdG8gZ2l2ZSBpdCBhbm90aGVyIGNoYW5nZSBvbiB0aGUgbmV4dCBjeWNsZS5cbiAqXG4gKiAgICAgICAgICAgICAgIFBvc3NpYmxlXG4gKiAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLStcbiAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgKy0tLS0tKy0tLS0tKyAgICAgICAgICAgICAgIHxcbiAqICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgIHxcbiAqICAgRmFpbGVkICAgICAgQ2FuY2VsbGVkICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSstLS0tLS0rXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXplZCAgICAgICBCZWdhblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kZWQvUmVjb2duaXplZFxuICovXG52YXIgU1RBVEVfUE9TU0lCTEUgPSAxO1xudmFyIFNUQVRFX0JFR0FOID0gMjtcbnZhciBTVEFURV9DSEFOR0VEID0gNDtcbnZhciBTVEFURV9FTkRFRCA9IDg7XG52YXIgU1RBVEVfUkVDT0dOSVpFRCA9IFNUQVRFX0VOREVEO1xudmFyIFNUQVRFX0NBTkNFTExFRCA9IDE2O1xudmFyIFNUQVRFX0ZBSUxFRCA9IDMyO1xuXG4vKipcbiAqIFJlY29nbml6ZXJcbiAqIEV2ZXJ5IHJlY29nbml6ZXIgbmVlZHMgdG8gZXh0ZW5kIGZyb20gdGhpcyBjbGFzcy5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gUmVjb2duaXplcihvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zIHx8IHt9KTtcblxuICAgIHRoaXMuaWQgPSB1bmlxdWVJZCgpO1xuXG4gICAgdGhpcy5tYW5hZ2VyID0gbnVsbDtcblxuICAgIC8vIGRlZmF1bHQgaXMgZW5hYmxlIHRydWVcbiAgICB0aGlzLm9wdGlvbnMuZW5hYmxlID0gaWZVbmRlZmluZWQodGhpcy5vcHRpb25zLmVuYWJsZSwgdHJ1ZSk7XG5cbiAgICB0aGlzLnN0YXRlID0gU1RBVEVfUE9TU0lCTEU7XG5cbiAgICB0aGlzLnNpbXVsdGFuZW91cyA9IHt9O1xuICAgIHRoaXMucmVxdWlyZUZhaWwgPSBbXTtcbn1cblxuUmVjb2duaXplci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQHZpcnR1YWxcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7fSxcblxuICAgIC8qKlxuICAgICAqIHNldCBvcHRpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtSZWNvZ25pemVyfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICBhc3NpZ24odGhpcy5vcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBhbHNvIHVwZGF0ZSB0aGUgdG91Y2hBY3Rpb24sIGluIGNhc2Ugc29tZXRoaW5nIGNoYW5nZWQgYWJvdXQgdGhlIGRpcmVjdGlvbnMvZW5hYmxlZCBzdGF0ZVxuICAgICAgICB0aGlzLm1hbmFnZXIgJiYgdGhpcy5tYW5hZ2VyLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVjb2duaXplIHNpbXVsdGFuZW91cyB3aXRoIGFuIG90aGVyIHJlY29nbml6ZXIuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIHJlY29nbml6ZVdpdGg6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAncmVjb2duaXplV2l0aCcsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaW11bHRhbmVvdXMgPSB0aGlzLnNpbXVsdGFuZW91cztcbiAgICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgICBpZiAoIXNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdKSB7XG4gICAgICAgICAgICBzaW11bHRhbmVvdXNbb3RoZXJSZWNvZ25pemVyLmlkXSA9IG90aGVyUmVjb2duaXplcjtcbiAgICAgICAgICAgIG90aGVyUmVjb2duaXplci5yZWNvZ25pemVXaXRoKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkcm9wIHRoZSBzaW11bHRhbmVvdXMgbGluay4gaXQgZG9lc250IHJlbW92ZSB0aGUgbGluayBvbiB0aGUgb3RoZXIgcmVjb2duaXplci5cbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfSB0aGlzXG4gICAgICovXG4gICAgZHJvcFJlY29nbml6ZVdpdGg6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAnZHJvcFJlY29nbml6ZVdpdGgnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVjb2duaXplciBjYW4gb25seSBydW4gd2hlbiBhbiBvdGhlciBpcyBmYWlsaW5nXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIHJlcXVpcmVGYWlsdXJlOiBmdW5jdGlvbihvdGhlclJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ3JlcXVpcmVGYWlsdXJlJywgdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlcXVpcmVGYWlsID0gdGhpcy5yZXF1aXJlRmFpbDtcbiAgICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgICBpZiAoaW5BcnJheShyZXF1aXJlRmFpbCwgb3RoZXJSZWNvZ25pemVyKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJlcXVpcmVGYWlsLnB1c2gob3RoZXJSZWNvZ25pemVyKTtcbiAgICAgICAgICAgIG90aGVyUmVjb2duaXplci5yZXF1aXJlRmFpbHVyZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZHJvcCB0aGUgcmVxdWlyZUZhaWx1cmUgbGluay4gaXQgZG9lcyBub3QgcmVtb3ZlIHRoZSBsaW5rIG9uIHRoZSBvdGhlciByZWNvZ25pemVyLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBkcm9wUmVxdWlyZUZhaWx1cmU6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAnZHJvcFJlcXVpcmVGYWlsdXJlJywgdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgICB2YXIgaW5kZXggPSBpbkFycmF5KHRoaXMucmVxdWlyZUZhaWwsIG90aGVyUmVjb2duaXplcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVpcmVGYWlsLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGhhcyByZXF1aXJlIGZhaWx1cmVzIGJvb2xlYW5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNSZXF1aXJlRmFpbHVyZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1aXJlRmFpbC5sZW5ndGggPiAwO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBpZiB0aGUgcmVjb2duaXplciBjYW4gcmVjb2duaXplIHNpbXVsdGFuZW91cyB3aXRoIGFuIG90aGVyIHJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgIGNhblJlY29nbml6ZVdpdGg6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICByZXR1cm4gISF0aGlzLnNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBZb3Ugc2hvdWxkIHVzZSBgdHJ5RW1pdGAgaW5zdGVhZCBvZiBgZW1pdGAgZGlyZWN0bHkgdG8gY2hlY2tcbiAgICAgKiB0aGF0IGFsbCB0aGUgbmVlZGVkIHJlY29nbml6ZXJzIGhhcyBmYWlsZWQgYmVmb3JlIGVtaXR0aW5nLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgICAqL1xuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICBmdW5jdGlvbiBlbWl0KGV2ZW50KSB7XG4gICAgICAgICAgICBzZWxmLm1hbmFnZXIuZW1pdChldmVudCwgaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gJ3BhbnN0YXJ0JyBhbmQgJ3Bhbm1vdmUnXG4gICAgICAgIGlmIChzdGF0ZSA8IFNUQVRFX0VOREVEKSB7XG4gICAgICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCArIHN0YXRlU3RyKHN0YXRlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCk7IC8vIHNpbXBsZSAnZXZlbnROYW1lJyBldmVudHNcblxuICAgICAgICBpZiAoaW5wdXQuYWRkaXRpb25hbEV2ZW50KSB7IC8vIGFkZGl0aW9uYWwgZXZlbnQocGFubGVmdCwgcGFucmlnaHQsIHBpbmNoaW4sIHBpbmNob3V0Li4uKVxuICAgICAgICAgICAgZW1pdChpbnB1dC5hZGRpdGlvbmFsRXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFuZW5kIGFuZCBwYW5jYW5jZWxcbiAgICAgICAgaWYgKHN0YXRlID49IFNUQVRFX0VOREVEKSB7XG4gICAgICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCArIHN0YXRlU3RyKHN0YXRlKSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCBhbGwgdGhlIHJlcXVpcmUgZmFpbHVyZSByZWNvZ25pemVycyBoYXMgZmFpbGVkLFxuICAgICAqIGlmIHRydWUsIGl0IGVtaXRzIGEgZ2VzdHVyZSBldmVudCxcbiAgICAgKiBvdGhlcndpc2UsIHNldHVwIHRoZSBzdGF0ZSB0byBGQUlMRUQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgdHJ5RW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuRW1pdCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpdCdzIGZhaWxpbmcgYW55d2F5XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9GQUlMRUQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGNhbiB3ZSBlbWl0P1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNhbkVtaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgdGhpcy5yZXF1aXJlRmFpbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMucmVxdWlyZUZhaWxbaV0uc3RhdGUgJiAoU1RBVEVfRkFJTEVEIHwgU1RBVEVfUE9TU0lCTEUpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdXBkYXRlIHRoZSByZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqL1xuICAgIHJlY29nbml6ZTogZnVuY3Rpb24oaW5wdXREYXRhKSB7XG4gICAgICAgIC8vIG1ha2UgYSBuZXcgY29weSBvZiB0aGUgaW5wdXREYXRhXG4gICAgICAgIC8vIHNvIHdlIGNhbiBjaGFuZ2UgdGhlIGlucHV0RGF0YSB3aXRob3V0IG1lc3NpbmcgdXAgdGhlIG90aGVyIHJlY29nbml6ZXJzXG4gICAgICAgIHZhciBpbnB1dERhdGFDbG9uZSA9IGFzc2lnbih7fSwgaW5wdXREYXRhKTtcblxuICAgICAgICAvLyBpcyBpcyBlbmFibGVkIGFuZCBhbGxvdyByZWNvZ25pemluZz9cbiAgICAgICAgaWYgKCFib29sT3JGbih0aGlzLm9wdGlvbnMuZW5hYmxlLCBbdGhpcywgaW5wdXREYXRhQ2xvbmVdKSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlc2V0IHdoZW4gd2UndmUgcmVhY2hlZCB0aGUgZW5kXG4gICAgICAgIGlmICh0aGlzLnN0YXRlICYgKFNUQVRFX1JFQ09HTklaRUQgfCBTVEFURV9DQU5DRUxMRUQgfCBTVEFURV9GQUlMRUQpKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUE9TU0lCTEU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5wcm9jZXNzKGlucHV0RGF0YUNsb25lKTtcblxuICAgICAgICAvLyB0aGUgcmVjb2duaXplciBoYXMgcmVjb2duaXplZCBhIGdlc3R1cmVcbiAgICAgICAgLy8gc28gdHJpZ2dlciBhbiBldmVudFxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAmIChTVEFURV9CRUdBTiB8IFNUQVRFX0NIQU5HRUQgfCBTVEFURV9FTkRFRCB8IFNUQVRFX0NBTkNFTExFRCkpIHtcbiAgICAgICAgICAgIHRoaXMudHJ5RW1pdChpbnB1dERhdGFDbG9uZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgcmVjb2duaXplclxuICAgICAqIHRoZSBhY3R1YWwgcmVjb2duaXppbmcgaGFwcGVucyBpbiB0aGlzIG1ldGhvZFxuICAgICAqIEB2aXJ0dWFsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqIEByZXR1cm5zIHtDb25zdH0gU1RBVEVcbiAgICAgKi9cbiAgICBwcm9jZXNzOiBmdW5jdGlvbihpbnB1dERhdGEpIHsgfSwgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIHByZWZlcnJlZCB0b3VjaC1hY3Rpb25cbiAgICAgKiBAdmlydHVhbFxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7IH0sXG5cbiAgICAvKipcbiAgICAgKiBjYWxsZWQgd2hlbiB0aGUgZ2VzdHVyZSBpc24ndCBhbGxvd2VkIHRvIHJlY29nbml6ZVxuICAgICAqIGxpa2Ugd2hlbiBhbm90aGVyIGlzIGJlaW5nIHJlY29nbml6ZWQgb3IgaXQgaXMgZGlzYWJsZWRcbiAgICAgKiBAdmlydHVhbFxuICAgICAqL1xuICAgIHJlc2V0OiBmdW5jdGlvbigpIHsgfVxufTtcblxuLyoqXG4gKiBnZXQgYSB1c2FibGUgc3RyaW5nLCB1c2VkIGFzIGV2ZW50IHBvc3RmaXhcbiAqIEBwYXJhbSB7Q29uc3R9IHN0YXRlXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdGF0ZVxuICovXG5mdW5jdGlvbiBzdGF0ZVN0cihzdGF0ZSkge1xuICAgIGlmIChzdGF0ZSAmIFNUQVRFX0NBTkNFTExFRCkge1xuICAgICAgICByZXR1cm4gJ2NhbmNlbCc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0VOREVEKSB7XG4gICAgICAgIHJldHVybiAnZW5kJztcbiAgICB9IGVsc2UgaWYgKHN0YXRlICYgU1RBVEVfQ0hBTkdFRCkge1xuICAgICAgICByZXR1cm4gJ21vdmUnO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUgJiBTVEFURV9CRUdBTikge1xuICAgICAgICByZXR1cm4gJ3N0YXJ0JztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIGRpcmVjdGlvbiBjb25zIHRvIHN0cmluZ1xuICogQHBhcmFtIHtDb25zdH0gZGlyZWN0aW9uXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBkaXJlY3Rpb25TdHIoZGlyZWN0aW9uKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fRE9XTikge1xuICAgICAgICByZXR1cm4gJ2Rvd24nO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9VUCkge1xuICAgICAgICByZXR1cm4gJ3VwJztcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fTEVGVCkge1xuICAgICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9SSUdIVCkge1xuICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIGdldCBhIHJlY29nbml6ZXIgYnkgbmFtZSBpZiBpdCBpcyBib3VuZCB0byBhIG1hbmFnZXJcbiAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IG90aGVyUmVjb2duaXplclxuICogQHBhcmFtIHtSZWNvZ25pemVyfSByZWNvZ25pemVyXG4gKiBAcmV0dXJucyB7UmVjb2duaXplcn1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHJlY29nbml6ZXIpIHtcbiAgICB2YXIgbWFuYWdlciA9IHJlY29nbml6ZXIubWFuYWdlcjtcbiAgICBpZiAobWFuYWdlcikge1xuICAgICAgICByZXR1cm4gbWFuYWdlci5nZXQob3RoZXJSZWNvZ25pemVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG90aGVyUmVjb2duaXplcjtcbn1cblxuLyoqXG4gKiBUaGlzIHJlY29nbml6ZXIgaXMganVzdCB1c2VkIGFzIGEgYmFzZSBmb3IgdGhlIHNpbXBsZSBhdHRyaWJ1dGUgcmVjb2duaXplcnMuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIFJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gQXR0clJlY29nbml6ZXIoKSB7XG4gICAgUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KEF0dHJSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBBdHRyUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAxXG4gICAgICAgICAqL1xuICAgICAgICBwb2ludGVyczogMVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNoZWNrIGlmIGl0IHRoZSByZWNvZ25pemVyIHJlY2VpdmVzIHZhbGlkIGlucHV0LCBsaWtlIGlucHV0LmRpc3RhbmNlID4gMTAuXG4gICAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IHJlY29nbml6ZWRcbiAgICAgKi9cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIG9wdGlvblBvaW50ZXJzID0gdGhpcy5vcHRpb25zLnBvaW50ZXJzO1xuICAgICAgICByZXR1cm4gb3B0aW9uUG9pbnRlcnMgPT09IDAgfHwgaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSBvcHRpb25Qb2ludGVycztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgaW5wdXQgYW5kIHJldHVybiB0aGUgc3RhdGUgZm9yIHRoZSByZWNvZ25pemVyXG4gICAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICogQHJldHVybnMgeyp9IFN0YXRlXG4gICAgICovXG4gICAgcHJvY2VzczogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgdmFyIGV2ZW50VHlwZSA9IGlucHV0LmV2ZW50VHlwZTtcblxuICAgICAgICB2YXIgaXNSZWNvZ25pemVkID0gc3RhdGUgJiAoU1RBVEVfQkVHQU4gfCBTVEFURV9DSEFOR0VEKTtcbiAgICAgICAgdmFyIGlzVmFsaWQgPSB0aGlzLmF0dHJUZXN0KGlucHV0KTtcblxuICAgICAgICAvLyBvbiBjYW5jZWwgaW5wdXQgYW5kIHdlJ3ZlIHJlY29nbml6ZWQgYmVmb3JlLCByZXR1cm4gU1RBVEVfQ0FOQ0VMTEVEXG4gICAgICAgIGlmIChpc1JlY29nbml6ZWQgJiYgKGV2ZW50VHlwZSAmIElOUFVUX0NBTkNFTCB8fCAhaXNWYWxpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0NBTkNFTExFRDtcbiAgICAgICAgfSBlbHNlIGlmIChpc1JlY29nbml6ZWQgfHwgaXNWYWxpZCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0VOREVEO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghKHN0YXRlICYgU1RBVEVfQkVHQU4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0JFR0FOO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlIHwgU1RBVEVfQ0hBTkdFRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIFBhblxuICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvd24gYW5kIG1vdmVkIGluIHRoZSBhbGxvd2VkIGRpcmVjdGlvbi5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gUGFuUmVjb2duaXplcigpIHtcbiAgICBBdHRyUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5wWCA9IG51bGw7XG4gICAgdGhpcy5wWSA9IG51bGw7XG59XG5cbmluaGVyaXQoUGFuUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFBhblJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3BhbicsXG4gICAgICAgIHRocmVzaG9sZDogMTAsXG4gICAgICAgIHBvaW50ZXJzOiAxLFxuICAgICAgICBkaXJlY3Rpb246IERJUkVDVElPTl9BTExcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcbiAgICAgICAgdmFyIGFjdGlvbnMgPSBbXTtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goVE9VQ0hfQUNUSU9OX1BBTl9ZKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlyZWN0aW9uICYgRElSRUNUSU9OX1ZFUlRJQ0FMKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWN0aW9ucztcbiAgICB9LFxuXG4gICAgZGlyZWN0aW9uVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIHZhciBoYXNNb3ZlZCA9IHRydWU7XG4gICAgICAgIHZhciBkaXN0YW5jZSA9IGlucHV0LmRpc3RhbmNlO1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gaW5wdXQuZGlyZWN0aW9uO1xuICAgICAgICB2YXIgeCA9IGlucHV0LmRlbHRhWDtcbiAgICAgICAgdmFyIHkgPSBpbnB1dC5kZWx0YVk7XG5cbiAgICAgICAgLy8gbG9jayB0byBheGlzP1xuICAgICAgICBpZiAoIShkaXJlY3Rpb24gJiBvcHRpb25zLmRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gKHggPT09IDApID8gRElSRUNUSU9OX05PTkUgOiAoeCA8IDApID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFQ7XG4gICAgICAgICAgICAgICAgaGFzTW92ZWQgPSB4ICE9IHRoaXMucFg7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyhpbnB1dC5kZWx0YVgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAoeSA9PT0gMCkgPyBESVJFQ1RJT05fTk9ORSA6ICh5IDwgMCkgPyBESVJFQ1RJT05fVVAgOiBESVJFQ1RJT05fRE9XTjtcbiAgICAgICAgICAgICAgICBoYXNNb3ZlZCA9IHkgIT0gdGhpcy5wWTtcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IE1hdGguYWJzKGlucHV0LmRlbHRhWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgICByZXR1cm4gaGFzTW92ZWQgJiYgZGlzdGFuY2UgPiBvcHRpb25zLnRocmVzaG9sZCAmJiBkaXJlY3Rpb24gJiBvcHRpb25zLmRpcmVjdGlvbjtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBBdHRyUmVjb2duaXplci5wcm90b3R5cGUuYXR0clRlc3QuY2FsbCh0aGlzLCBpbnB1dCkgJiZcbiAgICAgICAgICAgICh0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4gfHwgKCEodGhpcy5zdGF0ZSAmIFNUQVRFX0JFR0FOKSAmJiB0aGlzLmRpcmVjdGlvblRlc3QoaW5wdXQpKSk7XG4gICAgfSxcblxuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG5cbiAgICAgICAgdGhpcy5wWCA9IGlucHV0LmRlbHRhWDtcbiAgICAgICAgdGhpcy5wWSA9IGlucHV0LmRlbHRhWTtcblxuICAgICAgICB2YXIgZGlyZWN0aW9uID0gZGlyZWN0aW9uU3RyKGlucHV0LmRpcmVjdGlvbik7XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgaW5wdXQuYWRkaXRpb25hbEV2ZW50ID0gdGhpcy5vcHRpb25zLmV2ZW50ICsgZGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLCBpbnB1dCk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogUGluY2hcbiAqIFJlY29nbml6ZWQgd2hlbiB0d28gb3IgbW9yZSBwb2ludGVycyBhcmUgbW92aW5nIHRvd2FyZCAoem9vbS1pbikgb3IgYXdheSBmcm9tIGVhY2ggb3RoZXIgKHpvb20tb3V0KS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gUGluY2hSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoUGluY2hSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUGluY2hSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICdwaW5jaCcsXG4gICAgICAgIHRocmVzaG9sZDogMCxcbiAgICAgICAgcG9pbnRlcnM6IDJcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9OT05FXTtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJlxuICAgICAgICAgICAgKE1hdGguYWJzKGlucHV0LnNjYWxlIC0gMSkgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkIHx8IHRoaXMuc3RhdGUgJiBTVEFURV9CRUdBTik7XG4gICAgfSxcblxuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5zY2FsZSAhPT0gMSkge1xuICAgICAgICAgICAgdmFyIGluT3V0ID0gaW5wdXQuc2NhbGUgPCAxID8gJ2luJyA6ICdvdXQnO1xuICAgICAgICAgICAgaW5wdXQuYWRkaXRpb25hbEV2ZW50ID0gdGhpcy5vcHRpb25zLmV2ZW50ICsgaW5PdXQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3VwZXIuZW1pdC5jYWxsKHRoaXMsIGlucHV0KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBQcmVzc1xuICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvd24gZm9yIHggbXMgd2l0aG91dCBhbnkgbW92ZW1lbnQuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIFJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gUHJlc3NSZWNvZ25pemVyKCkge1xuICAgIFJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHRoaXMuX3RpbWVyID0gbnVsbDtcbiAgICB0aGlzLl9pbnB1dCA9IG51bGw7XG59XG5cbmluaGVyaXQoUHJlc3NSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQcmVzc1JlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3ByZXNzJyxcbiAgICAgICAgcG9pbnRlcnM6IDEsXG4gICAgICAgIHRpbWU6IDI1MSwgLy8gbWluaW1hbCB0aW1lIG9mIHRoZSBwb2ludGVyIHRvIGJlIHByZXNzZWRcbiAgICAgICAgdGhyZXNob2xkOiA5IC8vIGEgbWluaW1hbCBtb3ZlbWVudCBpcyBvaywgYnV0IGtlZXAgaXQgbG93XG4gICAgfSxcblxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fQVVUT107XG4gICAgfSxcblxuICAgIHByb2Nlc3M6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB2YXIgdmFsaWRQb2ludGVycyA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA9PT0gb3B0aW9ucy5wb2ludGVycztcbiAgICAgICAgdmFyIHZhbGlkTW92ZW1lbnQgPSBpbnB1dC5kaXN0YW5jZSA8IG9wdGlvbnMudGhyZXNob2xkO1xuICAgICAgICB2YXIgdmFsaWRUaW1lID0gaW5wdXQuZGVsdGFUaW1lID4gb3B0aW9ucy50aW1lO1xuXG4gICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7XG5cbiAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBsaXR0bGUgbW92ZW1lbnRcbiAgICAgICAgLy8gYW5kIHdlJ3ZlIHJlYWNoZWQgYW4gZW5kIGV2ZW50LCBzbyBhIHRhcCBpcyBwb3NzaWJsZVxuICAgICAgICBpZiAoIXZhbGlkTW92ZW1lbnQgfHwgIXZhbGlkUG9pbnRlcnMgfHwgKGlucHV0LmV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpICYmICF2YWxpZFRpbWUpKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dENvbnRleHQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgICAgICAgICAgdGhpcy50cnlFbWl0KCk7XG4gICAgICAgICAgICB9LCBvcHRpb25zLnRpbWUsIHRoaXMpO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgIH0sXG5cbiAgICBlbWl0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gU1RBVEVfUkVDT0dOSVpFRCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlucHV0ICYmIChpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9FTkQpKSB7XG4gICAgICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQgKyAndXAnLCBpbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbnB1dC50aW1lU3RhbXAgPSBub3coKTtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCwgdGhpcy5faW5wdXQpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbi8qKlxuICogUm90YXRlXG4gKiBSZWNvZ25pemVkIHdoZW4gdHdvIG9yIG1vcmUgcG9pbnRlciBhcmUgbW92aW5nIGluIGEgY2lyY3VsYXIgbW90aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBSb3RhdGVSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoUm90YXRlUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFJvdGF0ZVJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3JvdGF0ZScsXG4gICAgICAgIHRocmVzaG9sZDogMCxcbiAgICAgICAgcG9pbnRlcnM6IDJcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9OT05FXTtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJlxuICAgICAgICAgICAgKE1hdGguYWJzKGlucHV0LnJvdGF0aW9uKSA+IHRoaXMub3B0aW9ucy50aHJlc2hvbGQgfHwgdGhpcy5zdGF0ZSAmIFNUQVRFX0JFR0FOKTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBTd2lwZVxuICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIG1vdmluZyBmYXN0ICh2ZWxvY2l0eSksIHdpdGggZW5vdWdoIGRpc3RhbmNlIGluIHRoZSBhbGxvd2VkIGRpcmVjdGlvbi5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gU3dpcGVSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoU3dpcGVSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgU3dpcGVSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICdzd2lwZScsXG4gICAgICAgIHRocmVzaG9sZDogMTAsXG4gICAgICAgIHZlbG9jaXR5OiAwLjMsXG4gICAgICAgIGRpcmVjdGlvbjogRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUwsXG4gICAgICAgIHBvaW50ZXJzOiAxXG4gICAgfSxcblxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFBhblJlY29nbml6ZXIucHJvdG90eXBlLmdldFRvdWNoQWN0aW9uLmNhbGwodGhpcyk7XG4gICAgfSxcblxuICAgIGF0dHJUZXN0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcbiAgICAgICAgdmFyIHZlbG9jaXR5O1xuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gJiAoRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUwpKSB7XG4gICAgICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eTtcbiAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICAgICAgdmVsb2NpdHkgPSBpbnB1dC5vdmVyYWxsVmVsb2NpdHlYO1xuICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9WRVJUSUNBTCkge1xuICAgICAgICAgICAgdmVsb2NpdHkgPSBpbnB1dC5vdmVyYWxsVmVsb2NpdHlZO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmXG4gICAgICAgICAgICBkaXJlY3Rpb24gJiBpbnB1dC5vZmZzZXREaXJlY3Rpb24gJiZcbiAgICAgICAgICAgIGlucHV0LmRpc3RhbmNlID4gdGhpcy5vcHRpb25zLnRocmVzaG9sZCAmJlxuICAgICAgICAgICAgaW5wdXQubWF4UG9pbnRlcnMgPT0gdGhpcy5vcHRpb25zLnBvaW50ZXJzICYmXG4gICAgICAgICAgICBhYnModmVsb2NpdHkpID4gdGhpcy5vcHRpb25zLnZlbG9jaXR5ICYmIGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORDtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IGRpcmVjdGlvblN0cihpbnB1dC5vZmZzZXREaXJlY3Rpb24pO1xuICAgICAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQgKyBkaXJlY3Rpb24sIGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCwgaW5wdXQpO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIEEgdGFwIGlzIGVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvaW5nIGEgc21hbGwgdGFwL2NsaWNrLiBNdWx0aXBsZSB0YXBzIGFyZSByZWNvZ25pemVkIGlmIHRoZXkgb2NjdXJcbiAqIGJldHdlZW4gdGhlIGdpdmVuIGludGVydmFsIGFuZCBwb3NpdGlvbi4gVGhlIGRlbGF5IG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZWNvZ25pemUgbXVsdGktdGFwcyB3aXRob3V0IGZpcmluZ1xuICogYSBzaW5nbGUgdGFwLlxuICpcbiAqIFRoZSBldmVudERhdGEgZnJvbSB0aGUgZW1pdHRlZCBldmVudCBjb250YWlucyB0aGUgcHJvcGVydHkgYHRhcENvdW50YCwgd2hpY2ggY29udGFpbnMgdGhlIGFtb3VudCBvZlxuICogbXVsdGktdGFwcyBiZWluZyByZWNvZ25pemVkLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBSZWNvZ25pemVyXG4gKi9cbmZ1bmN0aW9uIFRhcFJlY29nbml6ZXIoKSB7XG4gICAgUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgLy8gcHJldmlvdXMgdGltZSBhbmQgY2VudGVyLFxuICAgIC8vIHVzZWQgZm9yIHRhcCBjb3VudGluZ1xuICAgIHRoaXMucFRpbWUgPSBmYWxzZTtcbiAgICB0aGlzLnBDZW50ZXIgPSBmYWxzZTtcblxuICAgIHRoaXMuX3RpbWVyID0gbnVsbDtcbiAgICB0aGlzLl9pbnB1dCA9IG51bGw7XG4gICAgdGhpcy5jb3VudCA9IDA7XG59XG5cbmluaGVyaXQoVGFwUmVjb2duaXplciwgUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUGluY2hSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICd0YXAnLFxuICAgICAgICBwb2ludGVyczogMSxcbiAgICAgICAgdGFwczogMSxcbiAgICAgICAgaW50ZXJ2YWw6IDMwMCwgLy8gbWF4IHRpbWUgYmV0d2VlbiB0aGUgbXVsdGktdGFwIHRhcHNcbiAgICAgICAgdGltZTogMjUwLCAvLyBtYXggdGltZSBvZiB0aGUgcG9pbnRlciB0byBiZSBkb3duIChsaWtlIGZpbmdlciBvbiB0aGUgc2NyZWVuKVxuICAgICAgICB0aHJlc2hvbGQ6IDksIC8vIGEgbWluaW1hbCBtb3ZlbWVudCBpcyBvaywgYnV0IGtlZXAgaXQgbG93XG4gICAgICAgIHBvc1RocmVzaG9sZDogMTAgLy8gYSBtdWx0aS10YXAgY2FuIGJlIGEgYml0IG9mZiB0aGUgaW5pdGlhbCBwb3NpdGlvblxuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTl07XG4gICAgfSxcblxuICAgIHByb2Nlc3M6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICAgIHZhciB2YWxpZFBvaW50ZXJzID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSBvcHRpb25zLnBvaW50ZXJzO1xuICAgICAgICB2YXIgdmFsaWRNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgb3B0aW9ucy50aHJlc2hvbGQ7XG4gICAgICAgIHZhciB2YWxpZFRvdWNoVGltZSA9IGlucHV0LmRlbHRhVGltZSA8IG9wdGlvbnMudGltZTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG5cbiAgICAgICAgaWYgKChpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9TVEFSVCkgJiYgKHRoaXMuY291bnQgPT09IDApKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWlsVGltZW91dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBsaXR0bGUgbW92ZW1lbnRcbiAgICAgICAgLy8gYW5kIHdlJ3ZlIHJlYWNoZWQgYW4gZW5kIGV2ZW50LCBzbyBhIHRhcCBpcyBwb3NzaWJsZVxuICAgICAgICBpZiAodmFsaWRNb3ZlbWVudCAmJiB2YWxpZFRvdWNoVGltZSAmJiB2YWxpZFBvaW50ZXJzKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuZXZlbnRUeXBlICE9IElOUFVUX0VORCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB2YWxpZEludGVydmFsID0gdGhpcy5wVGltZSA/IChpbnB1dC50aW1lU3RhbXAgLSB0aGlzLnBUaW1lIDwgb3B0aW9ucy5pbnRlcnZhbCkgOiB0cnVlO1xuICAgICAgICAgICAgdmFyIHZhbGlkTXVsdGlUYXAgPSAhdGhpcy5wQ2VudGVyIHx8IGdldERpc3RhbmNlKHRoaXMucENlbnRlciwgaW5wdXQuY2VudGVyKSA8IG9wdGlvbnMucG9zVGhyZXNob2xkO1xuXG4gICAgICAgICAgICB0aGlzLnBUaW1lID0gaW5wdXQudGltZVN0YW1wO1xuICAgICAgICAgICAgdGhpcy5wQ2VudGVyID0gaW5wdXQuY2VudGVyO1xuXG4gICAgICAgICAgICBpZiAoIXZhbGlkTXVsdGlUYXAgfHwgIXZhbGlkSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCArPSAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgICAgICAvLyBpZiB0YXAgY291bnQgbWF0Y2hlcyB3ZSBoYXZlIHJlY29nbml6ZWQgaXQsXG4gICAgICAgICAgICAvLyBlbHNlIGl0IGhhcyBiZWdhbiByZWNvZ25pemluZy4uLlxuICAgICAgICAgICAgdmFyIHRhcENvdW50ID0gdGhpcy5jb3VudCAlIG9wdGlvbnMudGFwcztcbiAgICAgICAgICAgIGlmICh0YXBDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIG5vIGZhaWxpbmcgcmVxdWlyZW1lbnRzLCBpbW1lZGlhdGVseSB0cmlnZ2VyIHRoZSB0YXAgZXZlbnRcbiAgICAgICAgICAgICAgICAvLyBvciB3YWl0IGFzIGxvbmcgYXMgdGhlIG11bHRpdGFwIGludGVydmFsIHRvIHRyaWdnZXJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzUmVxdWlyZUZhaWx1cmVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0Q29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9SRUNPR05JWkVEO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlFbWl0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIG9wdGlvbnMuaW50ZXJ2YWwsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfQkVHQU47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfSxcblxuICAgIGZhaWxUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0Q29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9GQUlMRUQ7XG4gICAgICAgIH0sIHRoaXMub3B0aW9ucy5pbnRlcnZhbCwgdGhpcyk7XG4gICAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfSxcblxuICAgIHJlc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09IFNUQVRFX1JFQ09HTklaRUQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lucHV0LnRhcENvdW50ID0gdGhpcy5jb3VudDtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCwgdGhpcy5faW5wdXQpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbi8qKlxuICogU2ltcGxlIHdheSB0byBjcmVhdGUgYSBtYW5hZ2VyIHdpdGggYSBkZWZhdWx0IHNldCBvZiByZWNvZ25pemVycy5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBIYW1tZXIoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMucmVjb2duaXplcnMgPSBpZlVuZGVmaW5lZChvcHRpb25zLnJlY29nbml6ZXJzLCBIYW1tZXIuZGVmYXVsdHMucHJlc2V0KTtcbiAgICByZXR1cm4gbmV3IE1hbmFnZXIoZWxlbWVudCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogQGNvbnN0IHtzdHJpbmd9XG4gKi9cbkhhbW1lci5WRVJTSU9OID0gJzIuMC43JztcblxuLyoqXG4gKiBkZWZhdWx0IHNldHRpbmdzXG4gKiBAbmFtZXNwYWNlXG4gKi9cbkhhbW1lci5kZWZhdWx0cyA9IHtcbiAgICAvKipcbiAgICAgKiBzZXQgaWYgRE9NIGV2ZW50cyBhcmUgYmVpbmcgdHJpZ2dlcmVkLlxuICAgICAqIEJ1dCB0aGlzIGlzIHNsb3dlciBhbmQgdW51c2VkIGJ5IHNpbXBsZSBpbXBsZW1lbnRhdGlvbnMsIHNvIGRpc2FibGVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBkb21FdmVudHM6IGZhbHNlLFxuXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIGZvciB0aGUgdG91Y2hBY3Rpb24gcHJvcGVydHkvZmFsbGJhY2suXG4gICAgICogV2hlbiBzZXQgdG8gYGNvbXB1dGVgIGl0IHdpbGwgbWFnaWNhbGx5IHNldCB0aGUgY29ycmVjdCB2YWx1ZSBiYXNlZCBvbiB0aGUgYWRkZWQgcmVjb2duaXplcnMuXG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKiBAZGVmYXVsdCBjb21wdXRlXG4gICAgICovXG4gICAgdG91Y2hBY3Rpb246IFRPVUNIX0FDVElPTl9DT01QVVRFLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIGVuYWJsZTogdHJ1ZSxcblxuICAgIC8qKlxuICAgICAqIEVYUEVSSU1FTlRBTCBGRUFUVVJFIC0tIGNhbiBiZSByZW1vdmVkL2NoYW5nZWRcbiAgICAgKiBDaGFuZ2UgdGhlIHBhcmVudCBpbnB1dCB0YXJnZXQgZWxlbWVudC5cbiAgICAgKiBJZiBOdWxsLCB0aGVuIGl0IGlzIGJlaW5nIHNldCB0aGUgdG8gbWFpbiBlbGVtZW50LlxuICAgICAqIEB0eXBlIHtOdWxsfEV2ZW50VGFyZ2V0fVxuICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgKi9cbiAgICBpbnB1dFRhcmdldDogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIGZvcmNlIGFuIGlucHV0IGNsYXNzXG4gICAgICogQHR5cGUge051bGx8RnVuY3Rpb259XG4gICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAqL1xuICAgIGlucHV0Q2xhc3M6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHJlY29nbml6ZXIgc2V0dXAgd2hlbiBjYWxsaW5nIGBIYW1tZXIoKWBcbiAgICAgKiBXaGVuIGNyZWF0aW5nIGEgbmV3IE1hbmFnZXIgdGhlc2Ugd2lsbCBiZSBza2lwcGVkLlxuICAgICAqIEB0eXBlIHtBcnJheX1cbiAgICAgKi9cbiAgICBwcmVzZXQ6IFtcbiAgICAgICAgLy8gUmVjb2duaXplckNsYXNzLCBvcHRpb25zLCBbcmVjb2duaXplV2l0aCwgLi4uXSwgW3JlcXVpcmVGYWlsdXJlLCAuLi5dXG4gICAgICAgIFtSb3RhdGVSZWNvZ25pemVyLCB7ZW5hYmxlOiBmYWxzZX1dLFxuICAgICAgICBbUGluY2hSZWNvZ25pemVyLCB7ZW5hYmxlOiBmYWxzZX0sIFsncm90YXRlJ11dLFxuICAgICAgICBbU3dpcGVSZWNvZ25pemVyLCB7ZGlyZWN0aW9uOiBESVJFQ1RJT05fSE9SSVpPTlRBTH1dLFxuICAgICAgICBbUGFuUmVjb2duaXplciwge2RpcmVjdGlvbjogRElSRUNUSU9OX0hPUklaT05UQUx9LCBbJ3N3aXBlJ11dLFxuICAgICAgICBbVGFwUmVjb2duaXplcl0sXG4gICAgICAgIFtUYXBSZWNvZ25pemVyLCB7ZXZlbnQ6ICdkb3VibGV0YXAnLCB0YXBzOiAyfSwgWyd0YXAnXV0sXG4gICAgICAgIFtQcmVzc1JlY29nbml6ZXJdXG4gICAgXSxcblxuICAgIC8qKlxuICAgICAqIFNvbWUgQ1NTIHByb3BlcnRpZXMgY2FuIGJlIHVzZWQgdG8gaW1wcm92ZSB0aGUgd29ya2luZyBvZiBIYW1tZXIuXG4gICAgICogQWRkIHRoZW0gdG8gdGhpcyBtZXRob2QgYW5kIHRoZXkgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIG5ldyBNYW5hZ2VyLlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKi9cbiAgICBjc3NQcm9wczoge1xuICAgICAgICAvKipcbiAgICAgICAgICogRGlzYWJsZXMgdGV4dCBzZWxlY3Rpb24gdG8gaW1wcm92ZSB0aGUgZHJhZ2dpbmcgZ2VzdHVyZS4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAgICovXG4gICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzYWJsZSB0aGUgV2luZG93cyBQaG9uZSBncmlwcGVycyB3aGVuIHByZXNzaW5nIGFuIGVsZW1lbnQuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgdG91Y2hTZWxlY3Q6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzYWJsZXMgdGhlIGRlZmF1bHQgY2FsbG91dCBzaG93biB3aGVuIHlvdSB0b3VjaCBhbmQgaG9sZCBhIHRvdWNoIHRhcmdldC5cbiAgICAgICAgICogT24gaU9TLCB3aGVuIHlvdSB0b3VjaCBhbmQgaG9sZCBhIHRvdWNoIHRhcmdldCBzdWNoIGFzIGEgbGluaywgU2FmYXJpIGRpc3BsYXlzXG4gICAgICAgICAqIGEgY2FsbG91dCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsaW5rLiBUaGlzIHByb3BlcnR5IGFsbG93cyB5b3UgdG8gZGlzYWJsZSB0aGF0IGNhbGxvdXQuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgdG91Y2hDYWxsb3V0OiAnbm9uZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHpvb21pbmcgaXMgZW5hYmxlZC4gVXNlZCBieSBJRTEwPlxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAgICovXG4gICAgICAgIGNvbnRlbnRab29taW5nOiAnbm9uZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGF0IGFuIGVudGlyZSBlbGVtZW50IHNob3VsZCBiZSBkcmFnZ2FibGUgaW5zdGVhZCBvZiBpdHMgY29udGVudHMuIE1haW5seSBmb3IgZGVza3RvcCBicm93c2Vycy5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgICAqL1xuICAgICAgICB1c2VyRHJhZzogJ25vbmUnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPdmVycmlkZXMgdGhlIGhpZ2hsaWdodCBjb2xvciBzaG93biB3aGVuIHRoZSB1c2VyIHRhcHMgYSBsaW5rIG9yIGEgSmF2YVNjcmlwdFxuICAgICAgICAgKiBjbGlja2FibGUgZWxlbWVudCBpbiBpT1MuIFRoaXMgcHJvcGVydHkgb2JleXMgdGhlIGFscGhhIHZhbHVlLCBpZiBzcGVjaWZpZWQuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdyZ2JhKDAsMCwwLDApJ1xuICAgICAgICAgKi9cbiAgICAgICAgdGFwSGlnaGxpZ2h0Q29sb3I6ICdyZ2JhKDAsMCwwLDApJ1xuICAgIH1cbn07XG5cbnZhciBTVE9QID0gMTtcbnZhciBGT1JDRURfU1RPUCA9IDI7XG5cbi8qKlxuICogTWFuYWdlclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIE1hbmFnZXIoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IGFzc2lnbih7fSwgSGFtbWVyLmRlZmF1bHRzLCBvcHRpb25zIHx8IHt9KTtcblxuICAgIHRoaXMub3B0aW9ucy5pbnB1dFRhcmdldCA9IHRoaXMub3B0aW9ucy5pbnB1dFRhcmdldCB8fCBlbGVtZW50O1xuXG4gICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHt9O1xuICAgIHRoaXMucmVjb2duaXplcnMgPSBbXTtcbiAgICB0aGlzLm9sZENzc1Byb3BzID0ge307XG5cbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuaW5wdXQgPSBjcmVhdGVJbnB1dEluc3RhbmNlKHRoaXMpO1xuICAgIHRoaXMudG91Y2hBY3Rpb24gPSBuZXcgVG91Y2hBY3Rpb24odGhpcywgdGhpcy5vcHRpb25zLnRvdWNoQWN0aW9uKTtcblxuICAgIHRvZ2dsZUNzc1Byb3BzKHRoaXMsIHRydWUpO1xuXG4gICAgZWFjaCh0aGlzLm9wdGlvbnMucmVjb2duaXplcnMsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgdmFyIHJlY29nbml6ZXIgPSB0aGlzLmFkZChuZXcgKGl0ZW1bMF0pKGl0ZW1bMV0pKTtcbiAgICAgICAgaXRlbVsyXSAmJiByZWNvZ25pemVyLnJlY29nbml6ZVdpdGgoaXRlbVsyXSk7XG4gICAgICAgIGl0ZW1bM10gJiYgcmVjb2duaXplci5yZXF1aXJlRmFpbHVyZShpdGVtWzNdKTtcbiAgICB9LCB0aGlzKTtcbn1cblxuTWFuYWdlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2V0IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtNYW5hZ2VyfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICBhc3NpZ24odGhpcy5vcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBPcHRpb25zIHRoYXQgbmVlZCBhIGxpdHRsZSBtb3JlIHNldHVwXG4gICAgICAgIGlmIChvcHRpb25zLnRvdWNoQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmlucHV0VGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCBleGlzdGluZyBldmVudCBsaXN0ZW5lcnMgYW5kIHJlaW5pdGlhbGl6ZVxuICAgICAgICAgICAgdGhpcy5pbnB1dC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmlucHV0LnRhcmdldCA9IG9wdGlvbnMuaW5wdXRUYXJnZXQ7XG4gICAgICAgICAgICB0aGlzLmlucHV0LmluaXQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogc3RvcCByZWNvZ25pemluZyBmb3IgdGhpcyBzZXNzaW9uLlxuICAgICAqIFRoaXMgc2Vzc2lvbiB3aWxsIGJlIGRpc2NhcmRlZCwgd2hlbiBhIG5ldyBbaW5wdXRdc3RhcnQgZXZlbnQgaXMgZmlyZWQuXG4gICAgICogV2hlbiBmb3JjZWQsIHRoZSByZWNvZ25pemVyIGN5Y2xlIGlzIHN0b3BwZWQgaW1tZWRpYXRlbHkuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbZm9yY2VdXG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24oZm9yY2UpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uLnN0b3BwZWQgPSBmb3JjZSA/IEZPUkNFRF9TVE9QIDogU1RPUDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcnVuIHRoZSByZWNvZ25pemVycyFcbiAgICAgKiBjYWxsZWQgYnkgdGhlIGlucHV0SGFuZGxlciBmdW5jdGlvbiBvbiBldmVyeSBtb3ZlbWVudCBvZiB0aGUgcG9pbnRlcnMgKHRvdWNoZXMpXG4gICAgICogaXQgd2Fsa3MgdGhyb3VnaCBhbGwgdGhlIHJlY29nbml6ZXJzIGFuZCB0cmllcyB0byBkZXRlY3QgdGhlIGdlc3R1cmUgdGhhdCBpcyBiZWluZyBtYWRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqL1xuICAgIHJlY29nbml6ZTogZnVuY3Rpb24oaW5wdXREYXRhKSB7XG4gICAgICAgIHZhciBzZXNzaW9uID0gdGhpcy5zZXNzaW9uO1xuICAgICAgICBpZiAoc2Vzc2lvbi5zdG9wcGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBydW4gdGhlIHRvdWNoLWFjdGlvbiBwb2x5ZmlsbFxuICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnByZXZlbnREZWZhdWx0cyhpbnB1dERhdGEpO1xuXG4gICAgICAgIHZhciByZWNvZ25pemVyO1xuICAgICAgICB2YXIgcmVjb2duaXplcnMgPSB0aGlzLnJlY29nbml6ZXJzO1xuXG4gICAgICAgIC8vIHRoaXMgaG9sZHMgdGhlIHJlY29nbml6ZXIgdGhhdCBpcyBiZWluZyByZWNvZ25pemVkLlxuICAgICAgICAvLyBzbyB0aGUgcmVjb2duaXplcidzIHN0YXRlIG5lZWRzIHRvIGJlIEJFR0FOLCBDSEFOR0VELCBFTkRFRCBvciBSRUNPR05JWkVEXG4gICAgICAgIC8vIGlmIG5vIHJlY29nbml6ZXIgaXMgZGV0ZWN0aW5nIGEgdGhpbmcsIGl0IGlzIHNldCB0byBgbnVsbGBcbiAgICAgICAgdmFyIGN1clJlY29nbml6ZXIgPSBzZXNzaW9uLmN1clJlY29nbml6ZXI7XG5cbiAgICAgICAgLy8gcmVzZXQgd2hlbiB0aGUgbGFzdCByZWNvZ25pemVyIGlzIHJlY29nbml6ZWRcbiAgICAgICAgLy8gb3Igd2hlbiB3ZSdyZSBpbiBhIG5ldyBzZXNzaW9uXG4gICAgICAgIGlmICghY3VyUmVjb2duaXplciB8fCAoY3VyUmVjb2duaXplciAmJiBjdXJSZWNvZ25pemVyLnN0YXRlICYgU1RBVEVfUkVDT0dOSVpFRCkpIHtcbiAgICAgICAgICAgIGN1clJlY29nbml6ZXIgPSBzZXNzaW9uLmN1clJlY29nbml6ZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHJlY29nbml6ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVjb2duaXplciA9IHJlY29nbml6ZXJzW2ldO1xuXG4gICAgICAgICAgICAvLyBmaW5kIG91dCBpZiB3ZSBhcmUgYWxsb3dlZCB0cnkgdG8gcmVjb2duaXplIHRoZSBpbnB1dCBmb3IgdGhpcyBvbmUuXG4gICAgICAgICAgICAvLyAxLiAgIGFsbG93IGlmIHRoZSBzZXNzaW9uIGlzIE5PVCBmb3JjZWQgc3RvcHBlZCAoc2VlIHRoZSAuc3RvcCgpIG1ldGhvZClcbiAgICAgICAgICAgIC8vIDIuICAgYWxsb3cgaWYgd2Ugc3RpbGwgaGF2ZW4ndCByZWNvZ25pemVkIGEgZ2VzdHVyZSBpbiB0aGlzIHNlc3Npb24sIG9yIHRoZSB0aGlzIHJlY29nbml6ZXIgaXMgdGhlIG9uZVxuICAgICAgICAgICAgLy8gICAgICB0aGF0IGlzIGJlaW5nIHJlY29nbml6ZWQuXG4gICAgICAgICAgICAvLyAzLiAgIGFsbG93IGlmIHRoZSByZWNvZ25pemVyIGlzIGFsbG93ZWQgdG8gcnVuIHNpbXVsdGFuZW91cyB3aXRoIHRoZSBjdXJyZW50IHJlY29nbml6ZWQgcmVjb2duaXplci5cbiAgICAgICAgICAgIC8vICAgICAgdGhpcyBjYW4gYmUgc2V0dXAgd2l0aCB0aGUgYHJlY29nbml6ZVdpdGgoKWAgbWV0aG9kIG9uIHRoZSByZWNvZ25pemVyLlxuICAgICAgICAgICAgaWYgKHNlc3Npb24uc3RvcHBlZCAhPT0gRk9SQ0VEX1NUT1AgJiYgKCAvLyAxXG4gICAgICAgICAgICAgICAgICAgICFjdXJSZWNvZ25pemVyIHx8IHJlY29nbml6ZXIgPT0gY3VyUmVjb2duaXplciB8fCAvLyAyXG4gICAgICAgICAgICAgICAgICAgIHJlY29nbml6ZXIuY2FuUmVjb2duaXplV2l0aChjdXJSZWNvZ25pemVyKSkpIHsgLy8gM1xuICAgICAgICAgICAgICAgIHJlY29nbml6ZXIucmVjb2duaXplKGlucHV0RGF0YSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlY29nbml6ZXIucmVzZXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlIHJlY29nbml6ZXIgaGFzIGJlZW4gcmVjb2duaXppbmcgdGhlIGlucHV0IGFzIGEgdmFsaWQgZ2VzdHVyZSwgd2Ugd2FudCB0byBzdG9yZSB0aGlzIG9uZSBhcyB0aGVcbiAgICAgICAgICAgIC8vIGN1cnJlbnQgYWN0aXZlIHJlY29nbml6ZXIuIGJ1dCBvbmx5IGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhbiBhY3RpdmUgcmVjb2duaXplclxuICAgICAgICAgICAgaWYgKCFjdXJSZWNvZ25pemVyICYmIHJlY29nbml6ZXIuc3RhdGUgJiAoU1RBVEVfQkVHQU4gfCBTVEFURV9DSEFOR0VEIHwgU1RBVEVfRU5ERUQpKSB7XG4gICAgICAgICAgICAgICAgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplciA9IHJlY29nbml6ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZ2V0IGEgcmVjb2duaXplciBieSBpdHMgZXZlbnQgbmFtZS5cbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ8U3RyaW5nfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ8TnVsbH1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uKHJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKHJlY29nbml6ZXIgaW5zdGFuY2VvZiBSZWNvZ25pemVyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjb2duaXplcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjb2duaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChyZWNvZ25pemVyc1tpXS5vcHRpb25zLmV2ZW50ID09IHJlY29nbml6ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb2duaXplcnNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGFkZCBhIHJlY29nbml6ZXIgdG8gdGhlIG1hbmFnZXJcbiAgICAgKiBleGlzdGluZyByZWNvZ25pemVycyB3aXRoIHRoZSBzYW1lIGV2ZW50IG5hbWUgd2lsbCBiZSByZW1vdmVkXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ8TWFuYWdlcn1cbiAgICAgKi9cbiAgICBhZGQ6IGZ1bmN0aW9uKHJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKHJlY29nbml6ZXIsICdhZGQnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmUgZXhpc3RpbmdcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gdGhpcy5nZXQocmVjb2duaXplci5vcHRpb25zLmV2ZW50KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZShleGlzdGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2duaXplcik7XG4gICAgICAgIHJlY29nbml6ZXIubWFuYWdlciA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHJlY29nbml6ZXI7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJlbW92ZSBhIHJlY29nbml6ZXIgYnkgbmFtZSBvciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IHJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7TWFuYWdlcn1cbiAgICAgKi9cbiAgICByZW1vdmU6IGZ1bmN0aW9uKHJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKHJlY29nbml6ZXIsICdyZW1vdmUnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICByZWNvZ25pemVyID0gdGhpcy5nZXQocmVjb2duaXplcik7XG5cbiAgICAgICAgLy8gbGV0J3MgbWFrZSBzdXJlIHRoaXMgcmVjb2duaXplciBleGlzdHNcbiAgICAgICAgaWYgKHJlY29nbml6ZXIpIHtcbiAgICAgICAgICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBpbkFycmF5KHJlY29nbml6ZXJzLCByZWNvZ25pemVyKTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlY29nbml6ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBiaW5kIGV2ZW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50c1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICAgKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSB0aGlzXG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzO1xuICAgICAgICBlYWNoKHNwbGl0U3RyKGV2ZW50cyksIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBoYW5kbGVyc1tldmVudF0gPSBoYW5kbGVyc1tldmVudF0gfHwgW107XG4gICAgICAgICAgICBoYW5kbGVyc1tldmVudF0ucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1bmJpbmQgZXZlbnQsIGxlYXZlIGVtaXQgYmxhbmsgdG8gcmVtb3ZlIGFsbCBoYW5kbGVyc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudHNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaGFuZGxlcl1cbiAgICAgKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSB0aGlzXG4gICAgICovXG4gICAgb2ZmOiBmdW5jdGlvbihldmVudHMsIGhhbmRsZXIpIHtcbiAgICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzO1xuICAgICAgICBlYWNoKHNwbGl0U3RyKGV2ZW50cyksIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgaGFuZGxlcnNbZXZlbnRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1tldmVudF0gJiYgaGFuZGxlcnNbZXZlbnRdLnNwbGljZShpbkFycmF5KGhhbmRsZXJzW2V2ZW50XSwgaGFuZGxlciksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGVtaXQgZXZlbnQgdG8gdGhlIGxpc3RlbmVyc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAgICovXG4gICAgZW1pdDogZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgLy8gd2UgYWxzbyB3YW50IHRvIHRyaWdnZXIgZG9tIGV2ZW50c1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRvbUV2ZW50cykge1xuICAgICAgICAgICAgdHJpZ2dlckRvbUV2ZW50KGV2ZW50LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIGhhbmRsZXJzLCBzbyBza2lwIGl0IGFsbFxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzW2V2ZW50XSAmJiB0aGlzLmhhbmRsZXJzW2V2ZW50XS5zbGljZSgpO1xuICAgICAgICBpZiAoIWhhbmRsZXJzIHx8ICFoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEudHlwZSA9IGV2ZW50O1xuICAgICAgICBkYXRhLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBkYXRhLnNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgaGFuZGxlcnNbaV0oZGF0YSk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZGVzdHJveSB0aGUgbWFuYWdlciBhbmQgdW5iaW5kcyBhbGwgZXZlbnRzXG4gICAgICogaXQgZG9lc24ndCB1bmJpbmQgZG9tIGV2ZW50cywgdGhhdCBpcyB0aGUgdXNlciBvd24gcmVzcG9uc2liaWxpdHlcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ICYmIHRvZ2dsZUNzc1Byb3BzKHRoaXMsIGZhbHNlKTtcblxuICAgICAgICB0aGlzLmhhbmRsZXJzID0ge307XG4gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHt9O1xuICAgICAgICB0aGlzLmlucHV0LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICB9XG59O1xuXG4vKipcbiAqIGFkZC9yZW1vdmUgdGhlIGNzcyBwcm9wZXJ0aWVzIGFzIGRlZmluZWQgaW4gbWFuYWdlci5vcHRpb25zLmNzc1Byb3BzXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYWRkXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUNzc1Byb3BzKG1hbmFnZXIsIGFkZCkge1xuICAgIHZhciBlbGVtZW50ID0gbWFuYWdlci5lbGVtZW50O1xuICAgIGlmICghZWxlbWVudC5zdHlsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBwcm9wO1xuICAgIGVhY2gobWFuYWdlci5vcHRpb25zLmNzc1Byb3BzLCBmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBwcm9wID0gcHJlZml4ZWQoZWxlbWVudC5zdHlsZSwgbmFtZSk7XG4gICAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgICAgIG1hbmFnZXIub2xkQ3NzUHJvcHNbcHJvcF0gPSBlbGVtZW50LnN0eWxlW3Byb3BdO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IG1hbmFnZXIub2xkQ3NzUHJvcHNbcHJvcF0gfHwgJyc7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWFkZCkge1xuICAgICAgICBtYW5hZ2VyLm9sZENzc1Byb3BzID0ge307XG4gICAgfVxufVxuXG4vKipcbiAqIHRyaWdnZXIgZG9tIGV2ZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gKi9cbmZ1bmN0aW9uIHRyaWdnZXJEb21FdmVudChldmVudCwgZGF0YSkge1xuICAgIHZhciBnZXN0dXJlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBnZXN0dXJlRXZlbnQuaW5pdEV2ZW50KGV2ZW50LCB0cnVlLCB0cnVlKTtcbiAgICBnZXN0dXJlRXZlbnQuZ2VzdHVyZSA9IGRhdGE7XG4gICAgZGF0YS50YXJnZXQuZGlzcGF0Y2hFdmVudChnZXN0dXJlRXZlbnQpO1xufVxuXG5hc3NpZ24oSGFtbWVyLCB7XG4gICAgSU5QVVRfU1RBUlQ6IElOUFVUX1NUQVJULFxuICAgIElOUFVUX01PVkU6IElOUFVUX01PVkUsXG4gICAgSU5QVVRfRU5EOiBJTlBVVF9FTkQsXG4gICAgSU5QVVRfQ0FOQ0VMOiBJTlBVVF9DQU5DRUwsXG5cbiAgICBTVEFURV9QT1NTSUJMRTogU1RBVEVfUE9TU0lCTEUsXG4gICAgU1RBVEVfQkVHQU46IFNUQVRFX0JFR0FOLFxuICAgIFNUQVRFX0NIQU5HRUQ6IFNUQVRFX0NIQU5HRUQsXG4gICAgU1RBVEVfRU5ERUQ6IFNUQVRFX0VOREVELFxuICAgIFNUQVRFX1JFQ09HTklaRUQ6IFNUQVRFX1JFQ09HTklaRUQsXG4gICAgU1RBVEVfQ0FOQ0VMTEVEOiBTVEFURV9DQU5DRUxMRUQsXG4gICAgU1RBVEVfRkFJTEVEOiBTVEFURV9GQUlMRUQsXG5cbiAgICBESVJFQ1RJT05fTk9ORTogRElSRUNUSU9OX05PTkUsXG4gICAgRElSRUNUSU9OX0xFRlQ6IERJUkVDVElPTl9MRUZULFxuICAgIERJUkVDVElPTl9SSUdIVDogRElSRUNUSU9OX1JJR0hULFxuICAgIERJUkVDVElPTl9VUDogRElSRUNUSU9OX1VQLFxuICAgIERJUkVDVElPTl9ET1dOOiBESVJFQ1RJT05fRE9XTixcbiAgICBESVJFQ1RJT05fSE9SSVpPTlRBTDogRElSRUNUSU9OX0hPUklaT05UQUwsXG4gICAgRElSRUNUSU9OX1ZFUlRJQ0FMOiBESVJFQ1RJT05fVkVSVElDQUwsXG4gICAgRElSRUNUSU9OX0FMTDogRElSRUNUSU9OX0FMTCxcblxuICAgIE1hbmFnZXI6IE1hbmFnZXIsXG4gICAgSW5wdXQ6IElucHV0LFxuICAgIFRvdWNoQWN0aW9uOiBUb3VjaEFjdGlvbixcblxuICAgIFRvdWNoSW5wdXQ6IFRvdWNoSW5wdXQsXG4gICAgTW91c2VJbnB1dDogTW91c2VJbnB1dCxcbiAgICBQb2ludGVyRXZlbnRJbnB1dDogUG9pbnRlckV2ZW50SW5wdXQsXG4gICAgVG91Y2hNb3VzZUlucHV0OiBUb3VjaE1vdXNlSW5wdXQsXG4gICAgU2luZ2xlVG91Y2hJbnB1dDogU2luZ2xlVG91Y2hJbnB1dCxcblxuICAgIFJlY29nbml6ZXI6IFJlY29nbml6ZXIsXG4gICAgQXR0clJlY29nbml6ZXI6IEF0dHJSZWNvZ25pemVyLFxuICAgIFRhcDogVGFwUmVjb2duaXplcixcbiAgICBQYW46IFBhblJlY29nbml6ZXIsXG4gICAgU3dpcGU6IFN3aXBlUmVjb2duaXplcixcbiAgICBQaW5jaDogUGluY2hSZWNvZ25pemVyLFxuICAgIFJvdGF0ZTogUm90YXRlUmVjb2duaXplcixcbiAgICBQcmVzczogUHJlc3NSZWNvZ25pemVyLFxuXG4gICAgb246IGFkZEV2ZW50TGlzdGVuZXJzLFxuICAgIG9mZjogcmVtb3ZlRXZlbnRMaXN0ZW5lcnMsXG4gICAgZWFjaDogZWFjaCxcbiAgICBtZXJnZTogbWVyZ2UsXG4gICAgZXh0ZW5kOiBleHRlbmQsXG4gICAgYXNzaWduOiBhc3NpZ24sXG4gICAgaW5oZXJpdDogaW5oZXJpdCxcbiAgICBiaW5kRm46IGJpbmRGbixcbiAgICBwcmVmaXhlZDogcHJlZml4ZWRcbn0pO1xuXG4vLyB0aGlzIHByZXZlbnRzIGVycm9ycyB3aGVuIEhhbW1lciBpcyBsb2FkZWQgaW4gdGhlIHByZXNlbmNlIG9mIGFuIEFNRFxuLy8gIHN0eWxlIGxvYWRlciBidXQgYnkgc2NyaXB0IHRhZywgbm90IGJ5IHRoZSBsb2FkZXIuXG52YXIgZnJlZUdsb2JhbCA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6ICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge30pKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5mcmVlR2xvYmFsLkhhbW1lciA9IEhhbW1lcjtcblxuaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEhhbW1lcjtcbiAgICB9KTtcbn0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gSGFtbWVyO1xufSBlbHNlIHtcbiAgICB3aW5kb3dbZXhwb3J0TmFtZV0gPSBIYW1tZXI7XG59XG5cbn0pKHdpbmRvdywgZG9jdW1lbnQsICdIYW1tZXInKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gaXNGdW5jdGlvblxuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24gKGZuKSB7XG4gIHZhciBzdHJpbmcgPSB0b1N0cmluZy5jYWxsKGZuKVxuICByZXR1cm4gc3RyaW5nID09PSAnW29iamVjdCBGdW5jdGlvbl0nIHx8XG4gICAgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyAmJiBzdHJpbmcgIT09ICdbb2JqZWN0IFJlZ0V4cF0nKSB8fFxuICAgICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAvLyBJRTggYW5kIGJlbG93XG4gICAgIChmbiA9PT0gd2luZG93LnNldFRpbWVvdXQgfHxcbiAgICAgIGZuID09PSB3aW5kb3cuYWxlcnQgfHxcbiAgICAgIGZuID09PSB3aW5kb3cuY29uZmlybSB8fFxuICAgICAgZm4gPT09IHdpbmRvdy5wcm9tcHQpKVxufTtcbiIsInZhciB0cmltID0gcmVxdWlyZSgndHJpbScpXG4gICwgZm9yRWFjaCA9IHJlcXVpcmUoJ2Zvci1lYWNoJylcbiAgLCBpc0FycmF5ID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChoZWFkZXJzKSB7XG4gIGlmICghaGVhZGVycylcbiAgICByZXR1cm4ge31cblxuICB2YXIgcmVzdWx0ID0ge31cblxuICBmb3JFYWNoKFxuICAgICAgdHJpbShoZWFkZXJzKS5zcGxpdCgnXFxuJylcbiAgICAsIGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gcm93LmluZGV4T2YoJzonKVxuICAgICAgICAgICwga2V5ID0gdHJpbShyb3cuc2xpY2UoMCwgaW5kZXgpKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgLCB2YWx1ZSA9IHRyaW0ocm93LnNsaWNlKGluZGV4ICsgMSkpXG5cbiAgICAgICAgaWYgKHR5cGVvZihyZXN1bHRba2V5XSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmVzdWx0W2tleV0pKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IFsgcmVzdWx0W2tleV0sIHZhbHVlIF1cbiAgICAgICAgfVxuICAgICAgfVxuICApXG5cbiAgcmV0dXJuIHJlc3VsdFxufSIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gcmVzb2x2ZXMgLiBhbmQgLi4gZWxlbWVudHMgaW4gYSBwYXRoIGFycmF5IHdpdGggZGlyZWN0b3J5IG5hbWVzIHRoZXJlXG4vLyBtdXN0IGJlIG5vIHNsYXNoZXMsIGVtcHR5IGVsZW1lbnRzLCBvciBkZXZpY2UgbmFtZXMgKGM6XFwpIGluIHRoZSBhcnJheVxuLy8gKHNvIGFsc28gbm8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcyAtIGl0IGRvZXMgbm90IGRpc3Rpbmd1aXNoXG4vLyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcGF0aHMpXG5mdW5jdGlvbiBub3JtYWxpemVBcnJheShwYXJ0cywgYWxsb3dBYm92ZVJvb3QpIHtcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGxhc3QgPSBwYXJ0c1tpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHBhcnRzLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG4vLyBTcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF0sIHVuaXggdmVyc2lvblxuLy8gJ3Jvb3QnIGlzIGp1c3QgYSBzbGFzaCwgb3Igbm90aGluZy5cbnZhciBzcGxpdFBhdGhSZSA9XG4gICAgL14oXFwvP3wpKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFwvXSs/fCkoXFwuW14uXFwvXSp8KSkoPzpbXFwvXSopJC87XG52YXIgc3BsaXRQYXRoID0gZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpO1xufTtcblxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5yZXNvbHZlID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNvbHZlZFBhdGggPSAnJyxcbiAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgIHZhciBwYXRoID0gKGkgPj0gMCkgPyBhcmd1bWVudHNbaV0gOiBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgLy8gU2tpcCBlbXB0eSBhbmQgaW52YWxpZCBlbnRyaWVzXG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9IGVsc2UgaWYgKCFwYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXNvbHZlZFBhdGggPSBwYXRoICsgJy8nICsgcmVzb2x2ZWRQYXRoO1xuICAgIHJlc29sdmVkQWJzb2x1dGUgPSBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xuICB9XG5cbiAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsIGJ1dFxuICAvLyBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKSBmYWlscylcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHJlc29sdmVkUGF0aC5zcGxpdCgnLycpLCBmdW5jdGlvbihwKSB7XG4gICAgcmV0dXJuICEhcDtcbiAgfSksICFyZXNvbHZlZEFic29sdXRlKS5qb2luKCcvJyk7XG5cbiAgcmV0dXJuICgocmVzb2x2ZWRBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHJlc29sdmVkUGF0aCkgfHwgJy4nO1xufTtcblxuLy8gcGF0aC5ub3JtYWxpemUocGF0aClcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMubm9ybWFsaXplID0gZnVuY3Rpb24ocGF0aCkge1xuICB2YXIgaXNBYnNvbHV0ZSA9IGV4cG9ydHMuaXNBYnNvbHV0ZShwYXRoKSxcbiAgICAgIHRyYWlsaW5nU2xhc2ggPSBzdWJzdHIocGF0aCwgLTEpID09PSAnLyc7XG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocGF0aC5zcGxpdCgnLycpLCBmdW5jdGlvbihwKSB7XG4gICAgcmV0dXJuICEhcDtcbiAgfSksICFpc0Fic29sdXRlKS5qb2luKCcvJyk7XG5cbiAgaWYgKCFwYXRoICYmICFpc0Fic29sdXRlKSB7XG4gICAgcGF0aCA9ICcuJztcbiAgfVxuICBpZiAocGF0aCAmJiB0cmFpbGluZ1NsYXNoKSB7XG4gICAgcGF0aCArPSAnLyc7XG4gIH1cblxuICByZXR1cm4gKGlzQWJzb2x1dGUgPyAnLycgOiAnJykgKyBwYXRoO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5pc0Fic29sdXRlID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuam9pbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcGF0aHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gZXhwb3J0cy5ub3JtYWxpemUoZmlsdGVyKHBhdGhzLCBmdW5jdGlvbihwLCBpbmRleCkge1xuICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLmpvaW4gbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9KS5qb2luKCcvJykpO1xufTtcblxuXG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5yZWxhdGl2ZSA9IGZ1bmN0aW9uKGZyb20sIHRvKSB7XG4gIGZyb20gPSBleHBvcnRzLnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO1xuICB0byA9IGV4cG9ydHMucmVzb2x2ZSh0bykuc3Vic3RyKDEpO1xuXG4gIGZ1bmN0aW9uIHRyaW0oYXJyKSB7XG4gICAgdmFyIHN0YXJ0ID0gMDtcbiAgICBmb3IgKDsgc3RhcnQgPCBhcnIubGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgICBpZiAoYXJyW3N0YXJ0XSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBlbmQgPSBhcnIubGVuZ3RoIC0gMTtcbiAgICBmb3IgKDsgZW5kID49IDA7IGVuZC0tKSB7XG4gICAgICBpZiAoYXJyW2VuZF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpO1xuICB9XG5cbiAgdmFyIGZyb21QYXJ0cyA9IHRyaW0oZnJvbS5zcGxpdCgnLycpKTtcbiAgdmFyIHRvUGFydHMgPSB0cmltKHRvLnNwbGl0KCcvJykpO1xuXG4gIHZhciBsZW5ndGggPSBNYXRoLm1pbihmcm9tUGFydHMubGVuZ3RoLCB0b1BhcnRzLmxlbmd0aCk7XG4gIHZhciBzYW1lUGFydHNMZW5ndGggPSBsZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZnJvbVBhcnRzW2ldICE9PSB0b1BhcnRzW2ldKSB7XG4gICAgICBzYW1lUGFydHNMZW5ndGggPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG91dHB1dFBhcnRzID0gW107XG4gIGZvciAodmFyIGkgPSBzYW1lUGFydHNMZW5ndGg7IGkgPCBmcm9tUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICBvdXRwdXRQYXJ0cy5wdXNoKCcuLicpO1xuICB9XG5cbiAgb3V0cHV0UGFydHMgPSBvdXRwdXRQYXJ0cy5jb25jYXQodG9QYXJ0cy5zbGljZShzYW1lUGFydHNMZW5ndGgpKTtcblxuICByZXR1cm4gb3V0cHV0UGFydHMuam9pbignLycpO1xufTtcblxuZXhwb3J0cy5zZXAgPSAnLyc7XG5leHBvcnRzLmRlbGltaXRlciA9ICc6JztcblxuZXhwb3J0cy5kaXJuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xuICB2YXIgcmVzdWx0ID0gc3BsaXRQYXRoKHBhdGgpLFxuICAgICAgcm9vdCA9IHJlc3VsdFswXSxcbiAgICAgIGRpciA9IHJlc3VsdFsxXTtcblxuICBpZiAoIXJvb3QgJiYgIWRpcikge1xuICAgIC8vIE5vIGRpcm5hbWUgd2hhdHNvZXZlclxuICAgIHJldHVybiAnLic7XG4gIH1cblxuICBpZiAoZGlyKSB7XG4gICAgLy8gSXQgaGFzIGEgZGlybmFtZSwgc3RyaXAgdHJhaWxpbmcgc2xhc2hcbiAgICBkaXIgPSBkaXIuc3Vic3RyKDAsIGRpci5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHJldHVybiByb290ICsgZGlyO1xufTtcblxuXG5leHBvcnRzLmJhc2VuYW1lID0gZnVuY3Rpb24ocGF0aCwgZXh0KSB7XG4gIHZhciBmID0gc3BsaXRQYXRoKHBhdGgpWzJdO1xuICAvLyBUT0RPOiBtYWtlIHRoaXMgY29tcGFyaXNvbiBjYXNlLWluc2Vuc2l0aXZlIG9uIHdpbmRvd3M/XG4gIGlmIChleHQgJiYgZi5zdWJzdHIoLTEgKiBleHQubGVuZ3RoKSA9PT0gZXh0KSB7XG4gICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIGY7XG59O1xuXG5cbmV4cG9ydHMuZXh0bmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aChwYXRoKVszXTtcbn07XG5cbmZ1bmN0aW9uIGZpbHRlciAoeHMsIGYpIHtcbiAgICBpZiAoeHMuZmlsdGVyKSByZXR1cm4geHMuZmlsdGVyKGYpO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChmKHhzW2ldLCBpLCB4cykpIHJlcy5wdXNoKHhzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuLy8gU3RyaW5nLnByb3RvdHlwZS5zdWJzdHIgLSBuZWdhdGl2ZSBpbmRleCBkb24ndCB3b3JrIGluIElFOFxudmFyIHN1YnN0ciA9ICdhYicuc3Vic3RyKC0xKSA9PT0gJ2InXG4gICAgPyBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7IHJldHVybiBzdHIuc3Vic3RyKHN0YXJ0LCBsZW4pIH1cbiAgICA6IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSBzdHIubGVuZ3RoICsgc3RhcnQ7XG4gICAgICAgIHJldHVybiBzdHIuc3Vic3RyKHN0YXJ0LCBsZW4pO1xuICAgIH1cbjtcblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwyNXZaR1ZmYlc5a2RXeGxjeTl3WVhSb0xXSnliM2R6WlhKcFpua3ZhVzVrWlhndWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqdEJRVUZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTSXNJbVpwYkdVaU9pSm5aVzVsY21GMFpXUXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHk4Z1EyOXdlWEpwWjJoMElFcHZlV1Z1ZEN3Z1NXNWpMaUJoYm1RZ2IzUm9aWElnVG05a1pTQmpiMjUwY21saWRYUnZjbk11WEc0dkwxeHVMeThnVUdWeWJXbHpjMmx2YmlCcGN5Qm9aWEpsWW5rZ1ozSmhiblJsWkN3Z1puSmxaU0J2WmlCamFHRnlaMlVzSUhSdklHRnVlU0J3WlhKemIyNGdiMkowWVdsdWFXNW5JR0ZjYmk4dklHTnZjSGtnYjJZZ2RHaHBjeUJ6YjJaMGQyRnlaU0JoYm1RZ1lYTnpiMk5wWVhSbFpDQmtiMk4xYldWdWRHRjBhVzl1SUdacGJHVnpJQ2gwYUdWY2JpOHZJRndpVTI5bWRIZGhjbVZjSWlrc0lIUnZJR1JsWVd3Z2FXNGdkR2hsSUZOdlpuUjNZWEpsSUhkcGRHaHZkWFFnY21WemRISnBZM1JwYjI0c0lHbHVZMngxWkdsdVoxeHVMeThnZDJsMGFHOTFkQ0JzYVcxcGRHRjBhVzl1SUhSb1pTQnlhV2RvZEhNZ2RHOGdkWE5sTENCamIzQjVMQ0J0YjJScFpua3NJRzFsY21kbExDQndkV0pzYVhOb0xGeHVMeThnWkdsemRISnBZblYwWlN3Z2MzVmliR2xqWlc1elpTd2dZVzVrTDI5eUlITmxiR3dnWTI5d2FXVnpJRzltSUhSb1pTQlRiMlowZDJGeVpTd2dZVzVrSUhSdklIQmxjbTFwZEZ4dUx5OGdjR1Z5YzI5dWN5QjBieUIzYUc5dElIUm9aU0JUYjJaMGQyRnlaU0JwY3lCbWRYSnVhWE5vWldRZ2RHOGdaRzhnYzI4c0lITjFZbXBsWTNRZ2RHOGdkR2hsWEc0dkx5Qm1iMnhzYjNkcGJtY2dZMjl1WkdsMGFXOXVjenBjYmk4dlhHNHZMeUJVYUdVZ1lXSnZkbVVnWTI5d2VYSnBaMmgwSUc1dmRHbGpaU0JoYm1RZ2RHaHBjeUJ3WlhKdGFYTnphVzl1SUc1dmRHbGpaU0J6YUdGc2JDQmlaU0JwYm1Oc2RXUmxaRnh1THk4Z2FXNGdZV3hzSUdOdmNHbGxjeUJ2Y2lCemRXSnpkR0Z1ZEdsaGJDQndiM0owYVc5dWN5QnZaaUIwYUdVZ1UyOW1kSGRoY21VdVhHNHZMMXh1THk4Z1ZFaEZJRk5QUmxSWFFWSkZJRWxUSUZCU1QxWkpSRVZFSUZ3aVFWTWdTVk5jSWl3Z1YwbFVTRTlWVkNCWFFWSlNRVTVVV1NCUFJpQkJUbGtnUzBsT1JDd2dSVmhRVWtWVFUxeHVMeThnVDFJZ1NVMVFURWxGUkN3Z1NVNURURlZFU1U1SElFSlZWQ0JPVDFRZ1RFbE5TVlJGUkNCVVR5QlVTRVVnVjBGU1VrRk9WRWxGVXlCUFJseHVMeThnVFVWU1EwaEJUbFJCUWtsTVNWUlpMQ0JHU1ZST1JWTlRJRVpQVWlCQklGQkJVbFJKUTFWTVFWSWdVRlZTVUU5VFJTQkJUa1FnVGs5T1NVNUdVa2xPUjBWTlJVNVVMaUJKVGx4dUx5OGdUazhnUlZaRlRsUWdVMGhCVEV3Z1ZFaEZJRUZWVkVoUFVsTWdUMUlnUTA5UVdWSkpSMGhVSUVoUFRFUkZVbE1nUWtVZ1RFbEJRa3hGSUVaUFVpQkJUbGtnUTB4QlNVMHNYRzR2THlCRVFVMUJSMFZUSUU5U0lFOVVTRVZTSUV4SlFVSkpURWxVV1N3Z1YwaEZWRWhGVWlCSlRpQkJUaUJCUTFSSlQwNGdUMFlnUTA5T1ZGSkJRMVFzSUZSUFVsUWdUMUpjYmk4dklFOVVTRVZTVjBsVFJTd2dRVkpKVTBsT1J5QkdVazlOTENCUFZWUWdUMFlnVDFJZ1NVNGdRMDlPVGtWRFZFbFBUaUJYU1ZSSUlGUklSU0JUVDBaVVYwRlNSU0JQVWlCVVNFVmNiaTh2SUZWVFJTQlBVaUJQVkVoRlVpQkVSVUZNU1U1SFV5QkpUaUJVU0VVZ1UwOUdWRmRCVWtVdVhHNWNiaTh2SUhKbGMyOXNkbVZ6SUM0Z1lXNWtJQzR1SUdWc1pXMWxiblJ6SUdsdUlHRWdjR0YwYUNCaGNuSmhlU0IzYVhSb0lHUnBjbVZqZEc5eWVTQnVZVzFsY3lCMGFHVnlaVnh1THk4Z2JYVnpkQ0JpWlNCdWJ5QnpiR0Z6YUdWekxDQmxiWEIwZVNCbGJHVnRaVzUwY3l3Z2IzSWdaR1YyYVdObElHNWhiV1Z6SUNoak9seGNLU0JwYmlCMGFHVWdZWEp5WVhsY2JpOHZJQ2h6YnlCaGJITnZJRzV2SUd4bFlXUnBibWNnWVc1a0lIUnlZV2xzYVc1bklITnNZWE5vWlhNZ0xTQnBkQ0JrYjJWeklHNXZkQ0JrYVhOMGFXNW5kV2x6YUZ4dUx5OGdjbVZzWVhScGRtVWdZVzVrSUdGaWMyOXNkWFJsSUhCaGRHaHpLVnh1Wm5WdVkzUnBiMjRnYm05eWJXRnNhWHBsUVhKeVlYa29jR0Z5ZEhNc0lHRnNiRzkzUVdKdmRtVlNiMjkwS1NCN1hHNGdJQzh2SUdsbUlIUm9aU0J3WVhSb0lIUnlhV1Z6SUhSdklHZHZJR0ZpYjNabElIUm9aU0J5YjI5MExDQmdkWEJnSUdWdVpITWdkWEFnUGlBd1hHNGdJSFpoY2lCMWNDQTlJREE3WEc0Z0lHWnZjaUFvZG1GeUlHa2dQU0J3WVhKMGN5NXNaVzVuZEdnZ0xTQXhPeUJwSUQ0OUlEQTdJR2t0TFNrZ2UxeHVJQ0FnSUhaaGNpQnNZWE4wSUQwZ2NHRnlkSE5iYVYwN1hHNGdJQ0FnYVdZZ0tHeGhjM1FnUFQwOUlDY3VKeWtnZTF4dUlDQWdJQ0FnY0dGeWRITXVjM0JzYVdObEtHa3NJREVwTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvYkdGemRDQTlQVDBnSnk0dUp5a2dlMXh1SUNBZ0lDQWdjR0Z5ZEhNdWMzQnNhV05sS0drc0lERXBPMXh1SUNBZ0lDQWdkWEFyS3p0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0hWd0tTQjdYRzRnSUNBZ0lDQndZWEowY3k1emNHeHBZMlVvYVN3Z01TazdYRzRnSUNBZ0lDQjFjQzB0TzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUM4dklHbG1JSFJvWlNCd1lYUm9JR2x6SUdGc2JHOTNaV1FnZEc4Z1oyOGdZV0p2ZG1VZ2RHaGxJSEp2YjNRc0lISmxjM1J2Y21VZ2JHVmhaR2x1WnlBdUxuTmNiaUFnYVdZZ0tHRnNiRzkzUVdKdmRtVlNiMjkwS1NCN1hHNGdJQ0FnWm05eUlDZzdJSFZ3TFMwN0lIVndLU0I3WEc0Z0lDQWdJQ0J3WVhKMGN5NTFibk5vYVdaMEtDY3VMaWNwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJ3WVhKMGN6dGNibjFjYmx4dUx5OGdVM0JzYVhRZ1lTQm1hV3hsYm1GdFpTQnBiblJ2SUZ0eWIyOTBMQ0JrYVhJc0lHSmhjMlZ1WVcxbExDQmxlSFJkTENCMWJtbDRJSFpsY25OcGIyNWNiaTh2SUNkeWIyOTBKeUJwY3lCcWRYTjBJR0VnYzJ4aGMyZ3NJRzl5SUc1dmRHaHBibWN1WEc1MllYSWdjM0JzYVhSUVlYUm9VbVVnUFZ4dUlDQWdJQzllS0Z4Y0x6OThLU2hiWEZ4elhGeFRYU28vS1Nnb1B6cGNYQzU3TVN3eWZYeGJYbHhjTDEwclAzd3BLRnhjTGx0ZUxseGNMMTBxZkNrcEtEODZXMXhjTDEwcUtTUXZPMXh1ZG1GeUlITndiR2wwVUdGMGFDQTlJR1oxYm1OMGFXOXVLR1pwYkdWdVlXMWxLU0I3WEc0Z0lISmxkSFZ5YmlCemNHeHBkRkJoZEdoU1pTNWxlR1ZqS0dacGJHVnVZVzFsS1M1emJHbGpaU2d4S1R0Y2JuMDdYRzVjYmk4dklIQmhkR2d1Y21WemIyeDJaU2hiWm5KdmJTQXVMaTVkTENCMGJ5bGNiaTh2SUhCdmMybDRJSFpsY25OcGIyNWNibVY0Y0c5eWRITXVjbVZ6YjJ4MlpTQTlJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQjJZWElnY21WemIyeDJaV1JRWVhSb0lEMGdKeWNzWEc0Z0lDQWdJQ0J5WlhOdmJIWmxaRUZpYzI5c2RYUmxJRDBnWm1Gc2MyVTdYRzVjYmlBZ1ptOXlJQ2gyWVhJZ2FTQTlJR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ2dMU0F4T3lCcElENDlJQzB4SUNZbUlDRnlaWE52YkhabFpFRmljMjlzZFhSbE95QnBMUzBwSUh0Y2JpQWdJQ0IyWVhJZ2NHRjBhQ0E5SUNocElENDlJREFwSUQ4Z1lYSm5kVzFsYm5SelcybGRJRG9nY0hKdlkyVnpjeTVqZDJRb0tUdGNibHh1SUNBZ0lDOHZJRk5yYVhBZ1pXMXdkSGtnWVc1a0lHbHVkbUZzYVdRZ1pXNTBjbWxsYzF4dUlDQWdJR2xtSUNoMGVYQmxiMllnY0dGMGFDQWhQVDBnSjNOMGNtbHVaeWNwSUh0Y2JpQWdJQ0FnSUhSb2NtOTNJRzVsZHlCVWVYQmxSWEp5YjNJb0owRnlaM1Z0Wlc1MGN5QjBieUJ3WVhSb0xuSmxjMjlzZG1VZ2JYVnpkQ0JpWlNCemRISnBibWR6SnlrN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNnaGNHRjBhQ2tnZTF4dUlDQWdJQ0FnWTI5dWRHbHVkV1U3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdjbVZ6YjJ4MlpXUlFZWFJvSUQwZ2NHRjBhQ0FySUNjdkp5QXJJSEpsYzI5c2RtVmtVR0YwYUR0Y2JpQWdJQ0J5WlhOdmJIWmxaRUZpYzI5c2RYUmxJRDBnY0dGMGFDNWphR0Z5UVhRb01Da2dQVDA5SUNjdkp6dGNiaUFnZlZ4dVhHNGdJQzh2SUVGMElIUm9hWE1nY0c5cGJuUWdkR2hsSUhCaGRHZ2djMmh2ZFd4a0lHSmxJSEpsYzI5c2RtVmtJSFJ2SUdFZ1puVnNiQ0JoWW5OdmJIVjBaU0J3WVhSb0xDQmlkWFJjYmlBZ0x5OGdhR0Z1Wkd4bElISmxiR0YwYVhabElIQmhkR2h6SUhSdklHSmxJSE5oWm1VZ0tHMXBaMmgwSUdoaGNIQmxiaUIzYUdWdUlIQnliMk5sYzNNdVkzZGtLQ2tnWm1GcGJITXBYRzVjYmlBZ0x5OGdUbTl5YldGc2FYcGxJSFJvWlNCd1lYUm9YRzRnSUhKbGMyOXNkbVZrVUdGMGFDQTlJRzV2Y20xaGJHbDZaVUZ5Y21GNUtHWnBiSFJsY2loeVpYTnZiSFpsWkZCaGRHZ3VjM0JzYVhRb0p5OG5LU3dnWm5WdVkzUnBiMjRvY0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUFoSVhBN1hHNGdJSDBwTENBaGNtVnpiMngyWldSQlluTnZiSFYwWlNrdWFtOXBiaWduTHljcE8xeHVYRzRnSUhKbGRIVnliaUFvS0hKbGMyOXNkbVZrUVdKemIyeDFkR1VnUHlBbkx5Y2dPaUFuSnlrZ0t5QnlaWE52YkhabFpGQmhkR2dwSUh4OElDY3VKenRjYm4wN1hHNWNiaTh2SUhCaGRHZ3VibTl5YldGc2FYcGxLSEJoZEdncFhHNHZMeUJ3YjNOcGVDQjJaWEp6YVc5dVhHNWxlSEJ2Y25SekxtNXZjbTFoYkdsNlpTQTlJR1oxYm1OMGFXOXVLSEJoZEdncElIdGNiaUFnZG1GeUlHbHpRV0p6YjJ4MWRHVWdQU0JsZUhCdmNuUnpMbWx6UVdKemIyeDFkR1VvY0dGMGFDa3NYRzRnSUNBZ0lDQjBjbUZwYkdsdVoxTnNZWE5vSUQwZ2MzVmljM1J5S0hCaGRHZ3NJQzB4S1NBOVBUMGdKeThuTzF4dVhHNGdJQzh2SUU1dmNtMWhiR2w2WlNCMGFHVWdjR0YwYUZ4dUlDQndZWFJvSUQwZ2JtOXliV0ZzYVhwbFFYSnlZWGtvWm1sc2RHVnlLSEJoZEdndWMzQnNhWFFvSnk4bktTd2dablZ1WTNScGIyNG9jQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQWhJWEE3WEc0Z0lIMHBMQ0FoYVhOQlluTnZiSFYwWlNrdWFtOXBiaWduTHljcE8xeHVYRzRnSUdsbUlDZ2hjR0YwYUNBbUppQWhhWE5CWW5OdmJIVjBaU2tnZTF4dUlDQWdJSEJoZEdnZ1BTQW5MaWM3WEc0Z0lIMWNiaUFnYVdZZ0tIQmhkR2dnSmlZZ2RISmhhV3hwYm1kVGJHRnphQ2tnZTF4dUlDQWdJSEJoZEdnZ0t6MGdKeThuTzF4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUNocGMwRmljMjlzZFhSbElEOGdKeThuSURvZ0p5Y3BJQ3NnY0dGMGFEdGNibjA3WEc1Y2JpOHZJSEJ2YzJsNElIWmxjbk5wYjI1Y2JtVjRjRzl5ZEhNdWFYTkJZbk52YkhWMFpTQTlJR1oxYm1OMGFXOXVLSEJoZEdncElIdGNiaUFnY21WMGRYSnVJSEJoZEdndVkyaGhja0YwS0RBcElEMDlQU0FuTHljN1hHNTlPMXh1WEc0dkx5QndiM05wZUNCMlpYSnphVzl1WEc1bGVIQnZjblJ6TG1wdmFXNGdQU0JtZFc1amRHbHZiaWdwSUh0Y2JpQWdkbUZ5SUhCaGRHaHpJRDBnUVhKeVlYa3VjSEp2ZEc5MGVYQmxMbk5zYVdObExtTmhiR3dvWVhKbmRXMWxiblJ6TENBd0tUdGNiaUFnY21WMGRYSnVJR1Y0Y0c5eWRITXVibTl5YldGc2FYcGxLR1pwYkhSbGNpaHdZWFJvY3l3Z1puVnVZM1JwYjI0b2NDd2dhVzVrWlhncElIdGNiaUFnSUNCcFppQW9kSGx3Wlc5bUlIQWdJVDA5SUNkemRISnBibWNuS1NCN1hHNGdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1ZIbHdaVVZ5Y205eUtDZEJjbWQxYldWdWRITWdkRzhnY0dGMGFDNXFiMmx1SUcxMWMzUWdZbVVnYzNSeWFXNW5jeWNwTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2NEdGNiaUFnZlNrdWFtOXBiaWduTHljcEtUdGNibjA3WEc1Y2JseHVMeThnY0dGMGFDNXlaV3hoZEdsMlpTaG1jbTl0TENCMGJ5bGNiaTh2SUhCdmMybDRJSFpsY25OcGIyNWNibVY0Y0c5eWRITXVjbVZzWVhScGRtVWdQU0JtZFc1amRHbHZiaWhtY205dExDQjBieWtnZTF4dUlDQm1jbTl0SUQwZ1pYaHdiM0owY3k1eVpYTnZiSFpsS0daeWIyMHBMbk4xWW5OMGNpZ3hLVHRjYmlBZ2RHOGdQU0JsZUhCdmNuUnpMbkpsYzI5c2RtVW9kRzhwTG5OMVluTjBjaWd4S1R0Y2JseHVJQ0JtZFc1amRHbHZiaUIwY21sdEtHRnljaWtnZTF4dUlDQWdJSFpoY2lCemRHRnlkQ0E5SURBN1hHNGdJQ0FnWm05eUlDZzdJSE4wWVhKMElEd2dZWEp5TG14bGJtZDBhRHNnYzNSaGNuUXJLeWtnZTF4dUlDQWdJQ0FnYVdZZ0tHRnljbHR6ZEdGeWRGMGdJVDA5SUNjbktTQmljbVZoYXp0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0IyWVhJZ1pXNWtJRDBnWVhKeUxteGxibWQwYUNBdElERTdYRzRnSUNBZ1ptOXlJQ2c3SUdWdVpDQStQU0F3T3lCbGJtUXRMU2tnZTF4dUlDQWdJQ0FnYVdZZ0tHRnljbHRsYm1SZElDRTlQU0FuSnlrZ1luSmxZV3M3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0hOMFlYSjBJRDRnWlc1a0tTQnlaWFIxY200Z1cxMDdYRzRnSUNBZ2NtVjBkWEp1SUdGeWNpNXpiR2xqWlNoemRHRnlkQ3dnWlc1a0lDMGdjM1JoY25RZ0t5QXhLVHRjYmlBZ2ZWeHVYRzRnSUhaaGNpQm1jbTl0VUdGeWRITWdQU0IwY21sdEtHWnliMjB1YzNCc2FYUW9KeThuS1NrN1hHNGdJSFpoY2lCMGIxQmhjblJ6SUQwZ2RISnBiU2gwYnk1emNHeHBkQ2duTHljcEtUdGNibHh1SUNCMllYSWdiR1Z1WjNSb0lEMGdUV0YwYUM1dGFXNG9abkp2YlZCaGNuUnpMbXhsYm1kMGFDd2dkRzlRWVhKMGN5NXNaVzVuZEdncE8xeHVJQ0IyWVhJZ2MyRnRaVkJoY25SelRHVnVaM1JvSUQwZ2JHVnVaM1JvTzF4dUlDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJR3hsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnYVdZZ0tHWnliMjFRWVhKMGMxdHBYU0FoUFQwZ2RHOVFZWEowYzF0cFhTa2dlMXh1SUNBZ0lDQWdjMkZ0WlZCaGNuUnpUR1Z1WjNSb0lEMGdhVHRjYmlBZ0lDQWdJR0p5WldGck8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lIWmhjaUJ2ZFhSd2RYUlFZWEowY3lBOUlGdGRPMXh1SUNCbWIzSWdLSFpoY2lCcElEMGdjMkZ0WlZCaGNuUnpUR1Z1WjNSb095QnBJRHdnWm5KdmJWQmhjblJ6TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ2IzVjBjSFYwVUdGeWRITXVjSFZ6YUNnbkxpNG5LVHRjYmlBZ2ZWeHVYRzRnSUc5MWRIQjFkRkJoY25SeklEMGdiM1YwY0hWMFVHRnlkSE11WTI5dVkyRjBLSFJ2VUdGeWRITXVjMnhwWTJVb2MyRnRaVkJoY25SelRHVnVaM1JvS1NrN1hHNWNiaUFnY21WMGRYSnVJRzkxZEhCMWRGQmhjblJ6TG1wdmFXNG9KeThuS1R0Y2JuMDdYRzVjYm1WNGNHOXlkSE11YzJWd0lEMGdKeThuTzF4dVpYaHdiM0owY3k1a1pXeHBiV2wwWlhJZ1BTQW5PaWM3WEc1Y2JtVjRjRzl5ZEhNdVpHbHlibUZ0WlNBOUlHWjFibU4wYVc5dUtIQmhkR2dwSUh0Y2JpQWdkbUZ5SUhKbGMzVnNkQ0E5SUhOd2JHbDBVR0YwYUNod1lYUm9LU3hjYmlBZ0lDQWdJSEp2YjNRZ1BTQnlaWE4xYkhSYk1GMHNYRzRnSUNBZ0lDQmthWElnUFNCeVpYTjFiSFJiTVYwN1hHNWNiaUFnYVdZZ0tDRnliMjkwSUNZbUlDRmthWElwSUh0Y2JpQWdJQ0F2THlCT2J5QmthWEp1WVcxbElIZG9ZWFJ6YjJWMlpYSmNiaUFnSUNCeVpYUjFjbTRnSnk0bk8xeHVJQ0I5WEc1Y2JpQWdhV1lnS0dScGNpa2dlMXh1SUNBZ0lDOHZJRWwwSUdoaGN5QmhJR1JwY201aGJXVXNJSE4wY21sd0lIUnlZV2xzYVc1bklITnNZWE5vWEc0Z0lDQWdaR2x5SUQwZ1pHbHlMbk4xWW5OMGNpZ3dMQ0JrYVhJdWJHVnVaM1JvSUMwZ01TazdYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdjbTl2ZENBcklHUnBjanRjYm4wN1hHNWNibHh1Wlhod2IzSjBjeTVpWVhObGJtRnRaU0E5SUdaMWJtTjBhVzl1S0hCaGRHZ3NJR1Y0ZENrZ2UxeHVJQ0IyWVhJZ1ppQTlJSE53YkdsMFVHRjBhQ2h3WVhSb0tWc3lYVHRjYmlBZ0x5OGdWRTlFVHpvZ2JXRnJaU0IwYUdseklHTnZiWEJoY21semIyNGdZMkZ6WlMxcGJuTmxibk5wZEdsMlpTQnZiaUIzYVc1a2IzZHpQMXh1SUNCcFppQW9aWGgwSUNZbUlHWXVjM1ZpYzNSeUtDMHhJQ29nWlhoMExteGxibWQwYUNrZ1BUMDlJR1Y0ZENrZ2UxeHVJQ0FnSUdZZ1BTQm1Mbk4xWW5OMGNpZ3dMQ0JtTG14bGJtZDBhQ0F0SUdWNGRDNXNaVzVuZEdncE8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCbU8xeHVmVHRjYmx4dVhHNWxlSEJ2Y25SekxtVjRkRzVoYldVZ1BTQm1kVzVqZEdsdmJpaHdZWFJvS1NCN1hHNGdJSEpsZEhWeWJpQnpjR3hwZEZCaGRHZ29jR0YwYUNsYk0xMDdYRzU5TzF4dVhHNW1kVzVqZEdsdmJpQm1hV3gwWlhJZ0tIaHpMQ0JtS1NCN1hHNGdJQ0FnYVdZZ0tIaHpMbVpwYkhSbGNpa2djbVYwZFhKdUlIaHpMbVpwYkhSbGNpaG1LVHRjYmlBZ0lDQjJZWElnY21WeklEMGdXMTA3WEc0Z0lDQWdabTl5SUNoMllYSWdhU0E5SURBN0lHa2dQQ0I0Y3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb1ppaDRjMXRwWFN3Z2FTd2dlSE1wS1NCeVpYTXVjSFZ6YUNoNGMxdHBYU2s3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCeVpYTTdYRzU5WEc1Y2JpOHZJRk4wY21sdVp5NXdjbTkwYjNSNWNHVXVjM1ZpYzNSeUlDMGdibVZuWVhScGRtVWdhVzVrWlhnZ1pHOXVKM1FnZDI5eWF5QnBiaUJKUlRoY2JuWmhjaUJ6ZFdKemRISWdQU0FuWVdJbkxuTjFZbk4wY2lndE1Ta2dQVDA5SUNkaUoxeHVJQ0FnSUQ4Z1puVnVZM1JwYjI0Z0tITjBjaXdnYzNSaGNuUXNJR3hsYmlrZ2V5QnlaWFIxY200Z2MzUnlMbk4xWW5OMGNpaHpkR0Z5ZEN3Z2JHVnVLU0I5WEc0Z0lDQWdPaUJtZFc1amRHbHZiaUFvYzNSeUxDQnpkR0Z5ZEN3Z2JHVnVLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaHpkR0Z5ZENBOElEQXBJSE4wWVhKMElEMGdjM1J5TG14bGJtZDBhQ0FySUhOMFlYSjBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdjM1J5TG5OMVluTjBjaWh6ZEdGeWRDd2diR1Z1S1R0Y2JpQWdJQ0I5WEc0N1hHNGlYWDA9IiwiLypcbiAqIENvcHlyaWdodCAyMDA5LTIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFLnR4dCBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAvc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9zb3VyY2UtbWFwL3NvdXJjZS1tYXAtY29uc3VtZXInKS5Tb3VyY2VNYXBDb25zdW1lcjtcbmV4cG9ydHMuU291cmNlTm9kZSA9IHJlcXVpcmUoJy4vc291cmNlLW1hcC9zb3VyY2Utbm9kZScpLlNvdXJjZU5vZGU7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5pZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSwgcmVxdWlyZSk7XG59XG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuXG4gIHZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbiAgLyoqXG4gICAqIEEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggaXMgYSBjb21iaW5hdGlvbiBvZiBhbiBhcnJheSBhbmQgYSBzZXQuIEFkZGluZyBhIG5ld1xuICAgKiBtZW1iZXIgaXMgTygxKSwgdGVzdGluZyBmb3IgbWVtYmVyc2hpcCBpcyBPKDEpLCBhbmQgZmluZGluZyB0aGUgaW5kZXggb2YgYW5cbiAgICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICAgKiBzdHJpbmdzIGFyZSBzdXBwb3J0ZWQgZm9yIG1lbWJlcnNoaXAuXG4gICAqL1xuICBmdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgICB0aGlzLl9hcnJheSA9IFtdO1xuICAgIHRoaXMuX3NldCA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2QgZm9yIGNyZWF0aW5nIEFycmF5U2V0IGluc3RhbmNlcyBmcm9tIGFuIGV4aXN0aW5nIGFycmF5LlxuICAgKi9cbiAgQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICAgIHZhciBzZXQgPSBuZXcgQXJyYXlTZXQoKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYUFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gICAgfVxuICAgIHJldHVybiBzZXQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHRoaXMgc2V0LlxuICAgKlxuICAgKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAgICovXG4gIEFycmF5U2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBBcnJheVNldF9hZGQoYVN0ciwgYUFsbG93RHVwbGljYXRlcykge1xuICAgIHZhciBpc0R1cGxpY2F0ZSA9IHRoaXMuaGFzKGFTdHIpO1xuICAgIHZhciBpZHggPSB0aGlzLl9hcnJheS5sZW5ndGg7XG4gICAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgICB0aGlzLl9hcnJheS5wdXNoKGFTdHIpO1xuICAgIH1cbiAgICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgICB0aGlzLl9zZXRbdXRpbC50b1NldFN0cmluZyhhU3RyKV0gPSBpZHg7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgZ2l2ZW4gc3RyaW5nIGEgbWVtYmVyIG9mIHRoaXMgc2V0P1xuICAgKlxuICAgKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAgICovXG4gIEFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC50b1NldFN0cmluZyhhU3RyKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICAgKlxuICAgKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAgICovXG4gIEFycmF5U2V0LnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gQXJyYXlTZXRfaW5kZXhPZihhU3RyKSB7XG4gICAgaWYgKHRoaXMuaGFzKGFTdHIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2V0W3V0aWwudG9TZXRTdHJpbmcoYVN0cildO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICAgKlxuICAgKiBAcGFyYW0gTnVtYmVyIGFJZHhcbiAgICovXG4gIEFycmF5U2V0LnByb3RvdHlwZS5hdCA9IGZ1bmN0aW9uIEFycmF5U2V0X2F0KGFJZHgpIHtcbiAgICBpZiAoYUlkeCA+PSAwICYmIGFJZHggPCB0aGlzLl9hcnJheS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBlbGVtZW50IGluZGV4ZWQgYnkgJyArIGFJZHgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNldCAod2hpY2ggaGFzIHRoZSBwcm9wZXIgaW5kaWNlc1xuICAgKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICAgKiBmb3Igc3RvcmluZyB0aGUgbWVtYmVycyBzbyB0aGF0IG5vIG9uZSBjYW4gbWVzcyB3aXRoIGludGVybmFsIHN0YXRlLlxuICAgKi9cbiAgQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheS5zbGljZSgpO1xuICB9O1xuXG4gIGV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcblxufSk7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICpcbiAqIEJhc2VkIG9uIHRoZSBCYXNlIDY0IFZMUSBpbXBsZW1lbnRhdGlvbiBpbiBDbG9zdXJlIENvbXBpbGVyOlxuICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jbG9zdXJlLWNvbXBpbGVyL3NvdXJjZS9icm93c2UvdHJ1bmsvc3JjL2NvbS9nb29nbGUvZGVidWdnaW5nL3NvdXJjZW1hcC9CYXNlNjRWTFEuamF2YVxuICpcbiAqIENvcHlyaWdodCAyMDExIFRoZSBDbG9zdXJlIENvbXBpbGVyIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZFxuICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5pZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSwgcmVxdWlyZSk7XG59XG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuXG4gIHZhciBiYXNlNjQgPSByZXF1aXJlKCcuL2Jhc2U2NCcpO1xuXG4gIC8vIEEgc2luZ2xlIGJhc2UgNjQgZGlnaXQgY2FuIGNvbnRhaW4gNiBiaXRzIG9mIGRhdGEuIEZvciB0aGUgYmFzZSA2NCB2YXJpYWJsZVxuICAvLyBsZW5ndGggcXVhbnRpdGllcyB3ZSB1c2UgaW4gdGhlIHNvdXJjZSBtYXAgc3BlYywgdGhlIGZpcnN0IGJpdCBpcyB0aGUgc2lnbixcbiAgLy8gdGhlIG5leHQgZm91ciBiaXRzIGFyZSB0aGUgYWN0dWFsIHZhbHVlLCBhbmQgdGhlIDZ0aCBiaXQgaXMgdGhlXG4gIC8vIGNvbnRpbnVhdGlvbiBiaXQuIFRoZSBjb250aW51YXRpb24gYml0IHRlbGxzIHVzIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmVcbiAgLy8gZGlnaXRzIGluIHRoaXMgdmFsdWUgZm9sbG93aW5nIHRoaXMgZGlnaXQuXG4gIC8vXG4gIC8vICAgQ29udGludWF0aW9uXG4gIC8vICAgfCAgICBTaWduXG4gIC8vICAgfCAgICB8XG4gIC8vICAgViAgICBWXG4gIC8vICAgMTAxMDExXG5cbiAgdmFyIFZMUV9CQVNFX1NISUZUID0gNTtcblxuICAvLyBiaW5hcnk6IDEwMDAwMFxuICB2YXIgVkxRX0JBU0UgPSAxIDw8IFZMUV9CQVNFX1NISUZUO1xuXG4gIC8vIGJpbmFyeTogMDExMTExXG4gIHZhciBWTFFfQkFTRV9NQVNLID0gVkxRX0JBU0UgLSAxO1xuXG4gIC8vIGJpbmFyeTogMTAwMDAwXG4gIHZhciBWTFFfQ09OVElOVUFUSU9OX0JJVCA9IFZMUV9CQVNFO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBmcm9tIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgdG8gYSB2YWx1ZSB3aGVyZSB0aGUgc2lnbiBiaXQgaXNcbiAgICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gICAqICAgMSBiZWNvbWVzIDIgKDEwIGJpbmFyeSksIC0xIGJlY29tZXMgMyAoMTEgYmluYXJ5KVxuICAgKiAgIDIgYmVjb21lcyA0ICgxMDAgYmluYXJ5KSwgLTIgYmVjb21lcyA1ICgxMDEgYmluYXJ5KVxuICAgKi9cbiAgZnVuY3Rpb24gdG9WTFFTaWduZWQoYVZhbHVlKSB7XG4gICAgcmV0dXJuIGFWYWx1ZSA8IDBcbiAgICAgID8gKCgtYVZhbHVlKSA8PCAxKSArIDFcbiAgICAgIDogKGFWYWx1ZSA8PCAxKSArIDA7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdG8gYSB0d28tY29tcGxlbWVudCB2YWx1ZSBmcm9tIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gICAqIHBsYWNlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LiAgRm9yIGV4YW1wbGUsIGFzIGRlY2ltYWxzOlxuICAgKiAgIDIgKDEwIGJpbmFyeSkgYmVjb21lcyAxLCAzICgxMSBiaW5hcnkpIGJlY29tZXMgLTFcbiAgICogICA0ICgxMDAgYmluYXJ5KSBiZWNvbWVzIDIsIDUgKDEwMSBiaW5hcnkpIGJlY29tZXMgLTJcbiAgICovXG4gIGZ1bmN0aW9uIGZyb21WTFFTaWduZWQoYVZhbHVlKSB7XG4gICAgdmFyIGlzTmVnYXRpdmUgPSAoYVZhbHVlICYgMSkgPT09IDE7XG4gICAgdmFyIHNoaWZ0ZWQgPSBhVmFsdWUgPj4gMTtcbiAgICByZXR1cm4gaXNOZWdhdGl2ZVxuICAgICAgPyAtc2hpZnRlZFxuICAgICAgOiBzaGlmdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGJhc2UgNjQgVkxRIGVuY29kZWQgdmFsdWUuXG4gICAqL1xuICBleHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIGJhc2U2NFZMUV9lbmNvZGUoYVZhbHVlKSB7XG4gICAgdmFyIGVuY29kZWQgPSBcIlwiO1xuICAgIHZhciBkaWdpdDtcblxuICAgIHZhciB2bHEgPSB0b1ZMUVNpZ25lZChhVmFsdWUpO1xuXG4gICAgZG8ge1xuICAgICAgZGlnaXQgPSB2bHEgJiBWTFFfQkFTRV9NQVNLO1xuICAgICAgdmxxID4+Pj0gVkxRX0JBU0VfU0hJRlQ7XG4gICAgICBpZiAodmxxID4gMCkge1xuICAgICAgICAvLyBUaGVyZSBhcmUgc3RpbGwgbW9yZSBkaWdpdHMgaW4gdGhpcyB2YWx1ZSwgc28gd2UgbXVzdCBtYWtlIHN1cmUgdGhlXG4gICAgICAgIC8vIGNvbnRpbnVhdGlvbiBiaXQgaXMgbWFya2VkLlxuICAgICAgICBkaWdpdCB8PSBWTFFfQ09OVElOVUFUSU9OX0JJVDtcbiAgICAgIH1cbiAgICAgIGVuY29kZWQgKz0gYmFzZTY0LmVuY29kZShkaWdpdCk7XG4gICAgfSB3aGlsZSAodmxxID4gMCk7XG5cbiAgICByZXR1cm4gZW5jb2RlZDtcbiAgfTtcblxuICAvKipcbiAgICogRGVjb2RlcyB0aGUgbmV4dCBiYXNlIDY0IFZMUSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgdGhlXG4gICAqIHZhbHVlIGFuZCB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIHZpYSB0aGUgb3V0IHBhcmFtZXRlci5cbiAgICovXG4gIGV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2RlY29kZShhU3RyLCBhT3V0UGFyYW0pIHtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHN0ckxlbiA9IGFTdHIubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSAwO1xuICAgIHZhciBzaGlmdCA9IDA7XG4gICAgdmFyIGNvbnRpbnVhdGlvbiwgZGlnaXQ7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoaSA+PSBzdHJMZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbW9yZSBkaWdpdHMgaW4gYmFzZSA2NCBWTFEgdmFsdWUuXCIpO1xuICAgICAgfVxuICAgICAgZGlnaXQgPSBiYXNlNjQuZGVjb2RlKGFTdHIuY2hhckF0KGkrKykpO1xuICAgICAgY29udGludWF0aW9uID0gISEoZGlnaXQgJiBWTFFfQ09OVElOVUFUSU9OX0JJVCk7XG4gICAgICBkaWdpdCAmPSBWTFFfQkFTRV9NQVNLO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgKGRpZ2l0IDw8IHNoaWZ0KTtcbiAgICAgIHNoaWZ0ICs9IFZMUV9CQVNFX1NISUZUO1xuICAgIH0gd2hpbGUgKGNvbnRpbnVhdGlvbik7XG5cbiAgICBhT3V0UGFyYW0udmFsdWUgPSBmcm9tVkxRU2lnbmVkKHJlc3VsdCk7XG4gICAgYU91dFBhcmFtLnJlc3QgPSBhU3RyLnNsaWNlKGkpO1xuICB9O1xuXG59KTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmlmICh0eXBlb2YgZGVmaW5lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGRlZmluZSA9IHJlcXVpcmUoJ2FtZGVmaW5lJykobW9kdWxlLCByZXF1aXJlKTtcbn1cbmRlZmluZShmdW5jdGlvbiAocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7XG5cbiAgdmFyIGNoYXJUb0ludE1hcCA9IHt9O1xuICB2YXIgaW50VG9DaGFyTWFwID0ge307XG5cbiAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG4gICAgLnNwbGl0KCcnKVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChjaCwgaW5kZXgpIHtcbiAgICAgIGNoYXJUb0ludE1hcFtjaF0gPSBpbmRleDtcbiAgICAgIGludFRvQ2hhck1hcFtpbmRleF0gPSBjaDtcbiAgICB9KTtcblxuICAvKipcbiAgICogRW5jb2RlIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIG9mIDAgdG8gNjMgdG8gYSBzaW5nbGUgYmFzZSA2NCBkaWdpdC5cbiAgICovXG4gIGV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gYmFzZTY0X2VuY29kZShhTnVtYmVyKSB7XG4gICAgaWYgKGFOdW1iZXIgaW4gaW50VG9DaGFyTWFwKSB7XG4gICAgICByZXR1cm4gaW50VG9DaGFyTWFwW2FOdW1iZXJdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYzOiBcIiArIGFOdW1iZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZWNvZGUgYSBzaW5nbGUgYmFzZSA2NCBkaWdpdCB0byBhbiBpbnRlZ2VyLlxuICAgKi9cbiAgZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiBiYXNlNjRfZGVjb2RlKGFDaGFyKSB7XG4gICAgaWYgKGFDaGFyIGluIGNoYXJUb0ludE1hcCkge1xuICAgICAgcmV0dXJuIGNoYXJUb0ludE1hcFthQ2hhcl07XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJOb3QgYSB2YWxpZCBiYXNlIDY0IGRpZ2l0OiBcIiArIGFDaGFyKTtcbiAgfTtcblxufSk7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5pZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSwgcmVxdWlyZSk7XG59XG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmUgaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaC5cbiAgICpcbiAgICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICAgKiBAcGFyYW0gYUhpZ2ggSW5kaWNlcyBoZXJlIGFuZCBoaWdoZXIgZG8gbm90IGNvbnRhaW4gdGhlIG5lZWRsZS5cbiAgICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgYmVpbmcgc2VhcmNoZWQgZm9yLlxuICAgKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gICAqIEBwYXJhbSBhQ29tcGFyZSBGdW5jdGlvbiB3aGljaCB0YWtlcyB0d28gZWxlbWVudHMgYW5kIHJldHVybnMgLTEsIDAsIG9yIDEuXG4gICAqL1xuICBmdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUpIHtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgd2hlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOlxuICAgIC8vXG4gICAgLy8gICAxLiBXZSBmaW5kIHRoZSBleGFjdCBlbGVtZW50IHdlIGFyZSBsb29raW5nIGZvci5cbiAgICAvL1xuICAgIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgICAvLyAgICAgIHRoZSBuZXh0IGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIGxlc3MgdGhhbiB0aGF0IGVsZW1lbnQuXG4gICAgLy9cbiAgICAvLyAgIDMuIFdlIGRpZCBub3QgZmluZCB0aGUgZXhhY3QgZWxlbWVudCwgYW5kIHRoZXJlIGlzIG5vIG5leHQtY2xvc2VzdFxuICAgIC8vICAgICAgZWxlbWVudCB3aGljaCBpcyBsZXNzIHRoYW4gdGhlIG9uZSB3ZSBhcmUgc2VhcmNoaW5nIGZvciwgc28gd2VcbiAgICAvLyAgICAgIHJldHVybiAtMS5cbiAgICB2YXIgbWlkID0gTWF0aC5mbG9vcigoYUhpZ2ggLSBhTG93KSAvIDIpICsgYUxvdztcbiAgICB2YXIgY21wID0gYUNvbXBhcmUoYU5lZWRsZSwgYUhheXN0YWNrW21pZF0sIHRydWUpO1xuICAgIGlmIChjbXAgPT09IDApIHtcbiAgICAgIC8vIEZvdW5kIHRoZSBlbGVtZW50IHdlIGFyZSBsb29raW5nIGZvci5cbiAgICAgIHJldHVybiBtaWQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNtcCA+IDApIHtcbiAgICAgIC8vIGFIYXlzdGFja1ttaWRdIGlzIGdyZWF0ZXIgdGhhbiBvdXIgbmVlZGxlLlxuICAgICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgICAgcmV0dXJuIHJlY3Vyc2l2ZVNlYXJjaChtaWQsIGFIaWdoLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIGRpZCBub3QgZmluZCBhbiBleGFjdCBtYXRjaCwgcmV0dXJuIHRoZSBuZXh0IGNsb3Nlc3Qgb25lXG4gICAgICAvLyAodGVybWluYXRpb24gY2FzZSAyKS5cbiAgICAgIHJldHVybiBtaWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gYUhheXN0YWNrW21pZF0gaXMgbGVzcyB0aGFuIG91ciBuZWVkbGUuXG4gICAgICBpZiAobWlkIC0gYUxvdyA+IDEpIHtcbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxvd2VyIGhhbGYuXG4gICAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlKTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBleGFjdCBuZWVkbGUgZWxlbWVudCB3YXMgbm90IGZvdW5kIGluIHRoaXMgaGF5c3RhY2suIERldGVybWluZSBpZlxuICAgICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDIpIG9yICgzKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICAgIHJldHVybiBhTG93IDwgMCA/IC0xIDogYUxvdztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBiaW5hcnkgc2VhcmNoIHdoaWNoIHdpbGwgYWx3YXlzIHRyeSBhbmQgcmV0dXJuXG4gICAqIHRoZSBpbmRleCBvZiBuZXh0IGxvd2VzdCB2YWx1ZSBjaGVja2VkIGlmIHRoZXJlIGlzIG5vIGV4YWN0IGhpdC4gVGhpcyBpc1xuICAgKiBiZWNhdXNlIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlXG4gICAqIHBvaW50cywgYW5kIHRoZXJlIGlzIGFuIGltcGxpY2l0IHJlZ2lvbiBiZXR3ZWVuIGVhY2ggb2YgdGhlbSwgc28gYSBtaXNzXG4gICAqIGp1c3QgbWVhbnMgdGhhdCB5b3UgYXJlbid0IG9uIHRoZSB2ZXJ5IHN0YXJ0IG9mIGEgcmVnaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCB5b3UgYXJlIGxvb2tpbmcgZm9yLlxuICAgKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBhcnJheSB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkLlxuICAgKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICAgKiAgICAgYXJyYXkgYW5kIHJldHVybnMgLTEsIDAsIG9yIDEgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5lZWRsZSBpcyBsZXNzXG4gICAqICAgICB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBlbGVtZW50LCByZXNwZWN0aXZlbHkuXG4gICAqL1xuICBleHBvcnRzLnNlYXJjaCA9IGZ1bmN0aW9uIHNlYXJjaChhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlKSB7XG4gICAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIHJlY3Vyc2l2ZVNlYXJjaCgtMSwgYUhheXN0YWNrLmxlbmd0aCwgYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSlcbiAgfTtcblxufSk7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5pZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSwgcmVxdWlyZSk7XG59XG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuXG4gIHZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbiAgLyoqXG4gICAqIERldGVybWluZSB3aGV0aGVyIG1hcHBpbmdCIGlzIGFmdGVyIG1hcHBpbmdBIHdpdGggcmVzcGVjdCB0byBnZW5lcmF0ZWRcbiAgICogcG9zaXRpb24uXG4gICAqL1xuICBmdW5jdGlvbiBnZW5lcmF0ZWRQb3NpdGlvbkFmdGVyKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICAgIC8vIE9wdGltaXplZCBmb3IgbW9zdCBjb21tb24gY2FzZVxuICAgIHZhciBsaW5lQSA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmU7XG4gICAgdmFyIGxpbmVCID0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgICB2YXIgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjtcbiAgICB2YXIgY29sdW1uQiA9IG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgICByZXR1cm4gbGluZUIgPiBsaW5lQSB8fCBsaW5lQiA9PSBsaW5lQSAmJiBjb2x1bW5CID49IGNvbHVtbkEgfHxcbiAgICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCKSA8PSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZGF0YSBzdHJ1Y3R1cmUgdG8gcHJvdmlkZSBhIHNvcnRlZCB2aWV3IG9mIGFjY3VtdWxhdGVkIG1hcHBpbmdzIGluIGFcbiAgICogcGVyZm9ybWFuY2UgY29uc2Npb3VzIG1hbm5lci4gSXQgdHJhZGVzIGEgbmVnbGliYWJsZSBvdmVyaGVhZCBpbiBnZW5lcmFsXG4gICAqIGNhc2UgZm9yIGEgbGFyZ2Ugc3BlZWR1cCBpbiBjYXNlIG9mIG1hcHBpbmdzIGJlaW5nIGFkZGVkIGluIG9yZGVyLlxuICAgKi9cbiAgZnVuY3Rpb24gTWFwcGluZ0xpc3QoKSB7XG4gICAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgICB0aGlzLl9zb3J0ZWQgPSB0cnVlO1xuICAgIC8vIFNlcnZlcyBhcyBpbmZpbXVtXG4gICAgdGhpcy5fbGFzdCA9IHtnZW5lcmF0ZWRMaW5lOiAtMSwgZ2VuZXJhdGVkQ29sdW1uOiAwfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlIHRocm91Z2ggaW50ZXJuYWwgaXRlbXMuIFRoaXMgbWV0aG9kIHRha2VzIHRoZSBzYW1lIGFyZ3VtZW50cyB0aGF0XG4gICAqIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgdGFrZXMuXG4gICAqXG4gICAqIE5PVEU6IFRoZSBvcmRlciBvZiB0aGUgbWFwcGluZ3MgaXMgTk9UIGd1YXJhbnRlZWQuXG4gICAqL1xuICBNYXBwaW5nTGlzdC5wcm90b3R5cGUudW5zb3J0ZWRGb3JFYWNoID1cbiAgICBmdW5jdGlvbiBNYXBwaW5nTGlzdF9mb3JFYWNoKGFDYWxsYmFjaywgYVRoaXNBcmcpIHtcbiAgICAgIHRoaXMuX2FycmF5LmZvckVhY2goYUNhbGxiYWNrLCBhVGhpc0FyZyk7XG4gICAgfTtcblxuICAvKipcbiAgICogQWRkIHRoZSBnaXZlbiBzb3VyY2UgbWFwcGluZy5cbiAgICpcbiAgICogQHBhcmFtIE9iamVjdCBhTWFwcGluZ1xuICAgKi9cbiAgTWFwcGluZ0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2FkZChhTWFwcGluZykge1xuICAgIHZhciBtYXBwaW5nO1xuICAgIGlmIChnZW5lcmF0ZWRQb3NpdGlvbkFmdGVyKHRoaXMuX2xhc3QsIGFNYXBwaW5nKSkge1xuICAgICAgdGhpcy5fbGFzdCA9IGFNYXBwaW5nO1xuICAgICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NvcnRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmbGF0LCBzb3J0ZWQgYXJyYXkgb2YgbWFwcGluZ3MuIFRoZSBtYXBwaW5ncyBhcmUgc29ydGVkIGJ5XG4gICAqIGdlbmVyYXRlZCBwb3NpdGlvbi5cbiAgICpcbiAgICogV0FSTklORzogVGhpcyBtZXRob2QgcmV0dXJucyBpbnRlcm5hbCBkYXRhIHdpdGhvdXQgY29weWluZywgZm9yXG4gICAqIHBlcmZvcm1hbmNlLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QgTk9UIGJlIG11dGF0ZWQsIGFuZCBzaG91bGQgYmUgdHJlYXRlZCBhc1xuICAgKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93blxuICAgKiBjb3B5LlxuICAgKi9cbiAgTWFwcGluZ0xpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF90b0FycmF5KCkge1xuICAgIGlmICghdGhpcy5fc29ydGVkKSB7XG4gICAgICB0aGlzLl9hcnJheS5zb3J0KHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zKTtcbiAgICAgIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hcnJheTtcbiAgfTtcblxuICBleHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG5cbn0pO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZGVmaW5lID0gcmVxdWlyZSgnYW1kZWZpbmUnKShtb2R1bGUsIHJlcXVpcmUpO1xufVxuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcblxuICB2YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuICB2YXIgYmluYXJ5U2VhcmNoID0gcmVxdWlyZSgnLi9iaW5hcnktc2VhcmNoJyk7XG4gIHZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG4gIHZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcblxuICAvKipcbiAgICogQSBTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2ggd2UgY2FuXG4gICAqIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgZmlsZSBwb3NpdGlvbnMgYnkgZ2l2aW5nIGl0IGEgZmlsZVxuICAgKiBwb3NpdGlvbiBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAgICpcbiAgICogVGhlIG9ubHkgcGFyYW1ldGVyIGlzIHRoZSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yXG4gICAqIGFscmVhZHkgcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYywgc291cmNlIG1hcHMgaGF2ZSB0aGVcbiAgICogZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gICAqXG4gICAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICAgKiAgIC0gc291cmNlczogQW4gYXJyYXkgb2YgVVJMcyB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLlxuICAgKiAgIC0gbmFtZXM6IEFuIGFycmF5IG9mIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSByZWZlcnJlbmNlZCBieSBpbmRpdmlkdWFsIG1hcHBpbmdzLlxuICAgKiAgIC0gc291cmNlUm9vdDogT3B0aW9uYWwuIFRoZSBVUkwgcm9vdCBmcm9tIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSByZWxhdGl2ZS5cbiAgICogICAtIHNvdXJjZXNDb250ZW50OiBPcHRpb25hbC4gQW4gYXJyYXkgb2YgY29udGVudHMgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAgICogICAtIG1hcHBpbmdzOiBBIHN0cmluZyBvZiBiYXNlNjQgVkxRcyB3aGljaCBjb250YWluIHRoZSBhY3R1YWwgbWFwcGluZ3MuXG4gICAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAqXG4gICAqIEhlcmUgaXMgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF06XG4gICAqXG4gICAqICAgICB7XG4gICAqICAgICAgIHZlcnNpb24gOiAzLFxuICAgKiAgICAgICBmaWxlOiBcIm91dC5qc1wiLFxuICAgKiAgICAgICBzb3VyY2VSb290IDogXCJcIixcbiAgICogICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICAgKiAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAgICogICAgICAgbWFwcGluZ3M6IFwiQUEsQUI7O0FCQ0RFO1wiXG4gICAqICAgICB9XG4gICAqXG4gICAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0P3BsaT0xI1xuICAgKi9cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCkge1xuICAgIHZhciBzb3VyY2VNYXAgPSBhU291cmNlTWFwO1xuICAgIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHNvdXJjZU1hcCA9IEpTT04ucGFyc2UoYVNvdXJjZU1hcC5yZXBsYWNlKC9eXFwpXFxdXFx9Jy8sICcnKSk7XG4gICAgfVxuXG4gICAgdmFyIHZlcnNpb24gPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICd2ZXJzaW9uJyk7XG4gICAgdmFyIHNvdXJjZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzJyk7XG4gICAgLy8gU2FzcyAzLjMgbGVhdmVzIG91dCB0aGUgJ25hbWVzJyBhcnJheSwgc28gd2UgZGV2aWF0ZSBmcm9tIHRoZSBzcGVjICh3aGljaFxuICAgIC8vIHJlcXVpcmVzIHRoZSBhcnJheSkgdG8gcGxheSBuaWNlIGhlcmUuXG4gICAgdmFyIG5hbWVzID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnbmFtZXMnLCBbXSk7XG4gICAgdmFyIHNvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VSb290JywgbnVsbCk7XG4gICAgdmFyIHNvdXJjZXNDb250ZW50ID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc291cmNlc0NvbnRlbnQnLCBudWxsKTtcbiAgICB2YXIgbWFwcGluZ3MgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdtYXBwaW5ncycpO1xuICAgIHZhciBmaWxlID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnZmlsZScsIG51bGwpO1xuXG4gICAgLy8gT25jZSBhZ2FpbiwgU2FzcyBkZXZpYXRlcyBmcm9tIHRoZSBzcGVjIGFuZCBzdXBwbGllcyB0aGUgdmVyc2lvbiBhcyBhXG4gICAgLy8gc3RyaW5nIHJhdGhlciB0aGFuIGEgbnVtYmVyLCBzbyB3ZSB1c2UgbG9vc2UgZXF1YWxpdHkgY2hlY2tpbmcgaGVyZS5cbiAgICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHZlcnNpb246ICcgKyB2ZXJzaW9uKTtcbiAgICB9XG5cbiAgICAvLyBTb21lIHNvdXJjZSBtYXBzIHByb2R1Y2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIGxpa2UgXCIuL2Zvby5qc1wiIGluc3RlYWQgb2ZcbiAgICAvLyBcImZvby5qc1wiLiAgTm9ybWFsaXplIHRoZXNlIGZpcnN0IHNvIHRoYXQgZnV0dXJlIGNvbXBhcmlzb25zIHdpbGwgc3VjY2VlZC5cbiAgICAvLyBTZWUgYnVnemlsLmxhLzEwOTA3NjguXG4gICAgc291cmNlcyA9IHNvdXJjZXMubWFwKHV0aWwubm9ybWFsaXplKTtcblxuICAgIC8vIFBhc3MgYHRydWVgIGJlbG93IHRvIGFsbG93IGR1cGxpY2F0ZSBuYW1lcyBhbmQgc291cmNlcy4gV2hpbGUgc291cmNlIG1hcHNcbiAgICAvLyBhcmUgaW50ZW5kZWQgdG8gYmUgY29tcHJlc3NlZCBhbmQgZGVkdXBsaWNhdGVkLCB0aGUgVHlwZVNjcmlwdCBjb21waWxlclxuICAgIC8vIHNvbWV0aW1lcyBnZW5lcmF0ZXMgc291cmNlIG1hcHMgd2l0aCBkdXBsaWNhdGVzIGluIHRoZW0uIFNlZSBHaXRodWIgaXNzdWVcbiAgICAvLyAjNzIgYW5kIGJ1Z3ppbC5sYS84ODk0OTIuXG4gICAgdGhpcy5fbmFtZXMgPSBBcnJheVNldC5mcm9tQXJyYXkobmFtZXMsIHRydWUpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoc291cmNlcywgdHJ1ZSk7XG5cbiAgICB0aGlzLnNvdXJjZVJvb3QgPSBzb3VyY2VSb290O1xuICAgIHRoaXMuc291cmNlc0NvbnRlbnQgPSBzb3VyY2VzQ29udGVudDtcbiAgICB0aGlzLl9tYXBwaW5ncyA9IG1hcHBpbmdzO1xuICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgU291cmNlTWFwQ29uc3VtZXIgZnJvbSBhIFNvdXJjZU1hcEdlbmVyYXRvci5cbiAgICpcbiAgICogQHBhcmFtIFNvdXJjZU1hcEdlbmVyYXRvciBhU291cmNlTWFwXG4gICAqICAgICAgICBUaGUgc291cmNlIG1hcCB0aGF0IHdpbGwgYmUgY29uc3VtZWQuXG4gICAqIEByZXR1cm5zIFNvdXJjZU1hcENvbnN1bWVyXG4gICAqL1xuICBTb3VyY2VNYXBDb25zdW1lci5mcm9tU291cmNlTWFwID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXApIHtcbiAgICAgIHZhciBzbWMgPSBPYmplY3QuY3JlYXRlKFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5cbiAgICAgIHNtYy5fbmFtZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fbmFtZXMudG9BcnJheSgpLCB0cnVlKTtcbiAgICAgIHNtYy5fc291cmNlcyA9IEFycmF5U2V0LmZyb21BcnJheShhU291cmNlTWFwLl9zb3VyY2VzLnRvQXJyYXkoKSwgdHJ1ZSk7XG4gICAgICBzbWMuc291cmNlUm9vdCA9IGFTb3VyY2VNYXAuX3NvdXJjZVJvb3Q7XG4gICAgICBzbWMuc291cmNlc0NvbnRlbnQgPSBhU291cmNlTWFwLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KHNtYy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtYy5zb3VyY2VSb290KTtcbiAgICAgIHNtYy5maWxlID0gYVNvdXJjZU1hcC5fZmlsZTtcblxuICAgICAgc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICAgIHNtYy5fX29yaWdpbmFsTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKVxuICAgICAgICAuc29ydCh1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgICAgcmV0dXJuIHNtYztcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gICAqL1xuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBvcmlnaW5hbCBzb3VyY2VzLlxuICAgKi9cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ3NvdXJjZXMnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc291cmNlcy50b0FycmF5KCkubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCA/IHV0aWwuam9pbih0aGlzLnNvdXJjZVJvb3QsIHMpIDogcztcbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gYF9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZCBgX19vcmlnaW5hbE1hcHBpbmdzYCBhcmUgYXJyYXlzIHRoYXQgaG9sZCB0aGVcbiAgLy8gcGFyc2VkIG1hcHBpbmcgY29vcmRpbmF0ZXMgZnJvbSB0aGUgc291cmNlIG1hcCdzIFwibWFwcGluZ3NcIiBhdHRyaWJ1dGUuIFRoZXlcbiAgLy8gYXJlIGxhemlseSBpbnN0YW50aWF0ZWQsIGFjY2Vzc2VkIHZpYSB0aGUgYF9nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gIC8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgZ2V0dGVycyByZXNwZWN0aXZlbHksIGFuZCB3ZSBvbmx5IHBhcnNlIHRoZSBtYXBwaW5nc1xuICAvLyBhbmQgY3JlYXRlIHRoZXNlIGFycmF5cyBvbmNlIHF1ZXJpZWQgZm9yIGEgc291cmNlIGxvY2F0aW9uLiBXZSBqdW1wIHRocm91Z2hcbiAgLy8gdGhlc2UgaG9vcHMgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSB0aG91c2FuZHMgb2YgbWFwcGluZ3MsIGFuZCBwYXJzaW5nXG4gIC8vIHRoZW0gaXMgZXhwZW5zaXZlLCBzbyB3ZSBvbmx5IHdhbnQgdG8gZG8gaXQgaWYgd2UgbXVzdC5cbiAgLy9cbiAgLy8gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5cyBpcyBvZiB0aGUgZm9ybTpcbiAgLy9cbiAgLy8gICAgIHtcbiAgLy8gICAgICAgZ2VuZXJhdGVkTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbiAgLy8gICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gIC8vICAgICAgIHNvdXJjZTogVGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXNcbiAgLy8gICAgICAgICAgICAgICBjaHVuayBvZiBjb2RlLFxuICAvLyAgICAgICBvcmlnaW5hbExpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlIHRoYXRcbiAgLy8gICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuICAvLyAgICAgICBvcmlnaW5hbENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuICAvLyAgICAgICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sIHdoaWNoIGdlbmVyYXRlZCB0aGlzIGNodW5rIG9mXG4gIC8vICAgICAgICAgICAgIGNvZGUuXG4gIC8vICAgICB9XG4gIC8vXG4gIC8vIEFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBmb3IgYGdlbmVyYXRlZExpbmVgIGFuZCBgZ2VuZXJhdGVkQ29sdW1uYCBjYW4gYmVcbiAgLy8gYG51bGxgLlxuICAvL1xuICAvLyBgX2dlbmVyYXRlZE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zLlxuICAvL1xuICAvLyBgX29yaWdpbmFsTWFwcGluZ3NgIGlzIG9yZGVyZWQgYnkgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucy5cblxuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IG51bGw7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfZ2VuZXJhdGVkTWFwcGluZ3MnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncykge1xuICAgICAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICAgICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBbXTtcbiAgICAgICAgdGhpcy5fcGFyc2VNYXBwaW5ncyh0aGlzLl9tYXBwaW5ncywgdGhpcy5zb3VyY2VSb290KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICB9XG4gIH0pO1xuXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fX29yaWdpbmFsTWFwcGluZ3MgPSBudWxsO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX29yaWdpbmFsTWFwcGluZ3MnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgICAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IFtdO1xuICAgICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgfVxuICB9KTtcblxuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX25leHRDaGFySXNNYXBwaW5nU2VwYXJhdG9yID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9uZXh0Q2hhcklzTWFwcGluZ1NlcGFyYXRvcihhU3RyKSB7XG4gICAgICB2YXIgYyA9IGFTdHIuY2hhckF0KDApO1xuICAgICAgcmV0dXJuIGMgPT09IFwiO1wiIHx8IGMgPT09IFwiLFwiO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAgICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gICAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gICAqL1xuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX3BhcnNlTWFwcGluZ3MoYVN0ciwgYVNvdXJjZVJvb3QpIHtcbiAgICAgIHZhciBnZW5lcmF0ZWRMaW5lID0gMTtcbiAgICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICB2YXIgcHJldmlvdXNPcmlnaW5hbExpbmUgPSAwO1xuICAgICAgdmFyIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSAwO1xuICAgICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICAgIHZhciBwcmV2aW91c05hbWUgPSAwO1xuICAgICAgdmFyIHN0ciA9IGFTdHI7XG4gICAgICB2YXIgdGVtcCA9IHt9O1xuICAgICAgdmFyIG1hcHBpbmc7XG5cbiAgICAgIHdoaWxlIChzdHIubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoc3RyLmNoYXJBdCgwKSA9PT0gJzsnKSB7XG4gICAgICAgICAgZ2VuZXJhdGVkTGluZSsrO1xuICAgICAgICAgIHN0ciA9IHN0ci5zbGljZSgxKTtcbiAgICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RyLmNoYXJBdCgwKSA9PT0gJywnKSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIG1hcHBpbmcgPSB7fTtcbiAgICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBnZW5lcmF0ZWRMaW5lO1xuXG4gICAgICAgICAgLy8gR2VuZXJhdGVkIGNvbHVtbi5cbiAgICAgICAgICBiYXNlNjRWTFEuZGVjb2RlKHN0ciwgdGVtcCk7XG4gICAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiArIHRlbXAudmFsdWU7XG4gICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcbiAgICAgICAgICBzdHIgPSB0ZW1wLnJlc3Q7XG5cbiAgICAgICAgICBpZiAoc3RyLmxlbmd0aCA+IDAgJiYgIXRoaXMuX25leHRDaGFySXNNYXBwaW5nU2VwYXJhdG9yKHN0cikpIHtcbiAgICAgICAgICAgIC8vIE9yaWdpbmFsIHNvdXJjZS5cbiAgICAgICAgICAgIGJhc2U2NFZMUS5kZWNvZGUoc3RyLCB0ZW1wKTtcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdGhpcy5fc291cmNlcy5hdChwcmV2aW91c1NvdXJjZSArIHRlbXAudmFsdWUpO1xuICAgICAgICAgICAgcHJldmlvdXNTb3VyY2UgKz0gdGVtcC52YWx1ZTtcbiAgICAgICAgICAgIHN0ciA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIGlmIChzdHIubGVuZ3RoID09PSAwIHx8IHRoaXMuX25leHRDaGFySXNNYXBwaW5nU2VwYXJhdG9yKHN0cikpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBhIHNvdXJjZSwgYnV0IG5vIGxpbmUgYW5kIGNvbHVtbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShzdHIsIHRlbXApO1xuICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBwcmV2aW91c09yaWdpbmFsTGluZSArIHRlbXAudmFsdWU7XG4gICAgICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSArPSAxO1xuICAgICAgICAgICAgc3RyID0gdGVtcC5yZXN0O1xuICAgICAgICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDAgfHwgdGhpcy5fbmV4dENoYXJJc01hcHBpbmdTZXBhcmF0b3Ioc3RyKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICAgIGJhc2U2NFZMUS5kZWNvZGUoc3RyLCB0ZW1wKTtcbiAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBwcmV2aW91c09yaWdpbmFsQ29sdW1uICsgdGVtcC52YWx1ZTtcbiAgICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuICAgICAgICAgICAgc3RyID0gdGVtcC5yZXN0O1xuXG4gICAgICAgICAgICBpZiAoc3RyLmxlbmd0aCA+IDAgJiYgIXRoaXMuX25leHRDaGFySXNNYXBwaW5nU2VwYXJhdG9yKHN0cikpIHtcbiAgICAgICAgICAgICAgLy8gT3JpZ2luYWwgbmFtZS5cbiAgICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShzdHIsIHRlbXApO1xuICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUgPSB0aGlzLl9uYW1lcy5hdChwcmV2aW91c05hbWUgKyB0ZW1wLnZhbHVlKTtcbiAgICAgICAgICAgICAgcHJldmlvdXNOYW1lICs9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICAgIHN0ciA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MucHVzaChtYXBwaW5nKTtcbiAgICAgICAgICBpZiAodHlwZW9mIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MucHVzaChtYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnMpO1xuICAgICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3Muc29ydCh1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBtYXBwaW5nIHRoYXQgYmVzdCBtYXRjaGVzIHRoZSBoeXBvdGhldGljYWwgXCJuZWVkbGVcIiBtYXBwaW5nIHRoYXRcbiAgICogd2UgYXJlIHNlYXJjaGluZyBmb3IgaW4gdGhlIGdpdmVuIFwiaGF5c3RhY2tcIiBvZiBtYXBwaW5ncy5cbiAgICovXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2ZpbmRNYXBwaW5nKGFOZWVkbGUsIGFNYXBwaW5ncywgYUxpbmVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb2x1bW5OYW1lLCBhQ29tcGFyYXRvcikge1xuICAgICAgLy8gVG8gcmV0dXJuIHRoZSBwb3NpdGlvbiB3ZSBhcmUgc2VhcmNoaW5nIGZvciwgd2UgbXVzdCBmaXJzdCBmaW5kIHRoZVxuICAgICAgLy8gbWFwcGluZyBmb3IgdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCB0aGVuIHJldHVybiB0aGUgb3Bwb3NpdGUgcG9zaXRpb24gaXRcbiAgICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgICAvLyBmaW5kIHRoZSBiZXN0IG1hcHBpbmcuXG5cbiAgICAgIGlmIChhTmVlZGxlW2FMaW5lTmFtZV0gPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhTmVlZGxlW2FMaW5lTmFtZV0pO1xuICAgICAgfVxuICAgICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb2x1bW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCwgZ290ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFOZWVkbGVbYUNvbHVtbk5hbWVdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJpbmFyeVNlYXJjaC5zZWFyY2goYU5lZWRsZSwgYU1hcHBpbmdzLCBhQ29tcGFyYXRvcik7XG4gICAgfTtcblxuICAvKipcbiAgICogQ29tcHV0ZSB0aGUgbGFzdCBjb2x1bW4gZm9yIGVhY2ggZ2VuZXJhdGVkIG1hcHBpbmcuIFRoZSBsYXN0IGNvbHVtbiBpc1xuICAgKiBpbmNsdXNpdmUuXG4gICAqL1xuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuY29tcHV0ZUNvbHVtblNwYW5zID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9jb21wdXRlQ29sdW1uU3BhbnMoKSB7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICAgIC8vIE1hcHBpbmdzIGRvIG5vdCBjb250YWluIGEgZmllbGQgZm9yIHRoZSBsYXN0IGdlbmVyYXRlZCBjb2x1bW50LiBXZVxuICAgICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgICAgLy8gbWFwcGluZ3MgYXJlIGNvbnRpZ3VvdXMgKGkuZS4gZ2l2ZW4gdHdvIGNvbnNlY3V0aXZlIG1hcHBpbmdzLCB0aGVcbiAgICAgICAgLy8gZmlyc3QgbWFwcGluZyBlbmRzIHdoZXJlIHRoZSBzZWNvbmQgb25lIHN0YXJ0cykuXG4gICAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgbmV4dE1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleCArIDFdO1xuXG4gICAgICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBsYXN0IG1hcHBpbmcgZm9yIGVhY2ggbGluZSBzcGFucyB0aGUgZW50aXJlIGxpbmUuXG4gICAgICAgIG1hcHBpbmcubGFzdEdlbmVyYXRlZENvbHVtbiA9IEluZmluaXR5O1xuICAgICAgfVxuICAgIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICAgKiBzb3VyY2UncyBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zIHByb3ZpZGVkLiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3RcbiAgICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqXG4gICAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gICAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICAgKlxuICAgKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIG9yIG51bGwuXG4gICAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC5cbiAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC5cbiAgICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICAgKi9cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX29yaWdpbmFsUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICAgIH07XG5cbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJnZW5lcmF0ZWRMaW5lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImdlbmVyYXRlZENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnMpO1xuXG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZWVkbGUuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnc291cmNlJywgbnVsbCk7XG4gICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmIHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSB1dGlsLmpvaW4odGhpcy5zb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnb3JpZ2luYWxMaW5lJywgbnVsbCksXG4gICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbENvbHVtbicsIG51bGwpLFxuICAgICAgICAgICAgbmFtZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ25hbWUnLCBudWxsKVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIG5hbWU6IG51bGxcbiAgICAgIH07XG4gICAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gICAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAgICogYXZhaWxpYmxlLlxuICAgKi9cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSkge1xuICAgICAgaWYgKCF0aGlzLnNvdXJjZXNDb250ZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgYVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCBhU291cmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3NvdXJjZXMuaGFzKGFTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihhU291cmNlKV07XG4gICAgICB9XG5cbiAgICAgIHZhciB1cmw7XG4gICAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGxcbiAgICAgICAgICAmJiAodXJsID0gdXRpbC51cmxQYXJzZSh0aGlzLnNvdXJjZVJvb3QpKSkge1xuICAgICAgICAvLyBYWFg6IGZpbGU6Ly8gVVJJcyBhbmQgYWJzb2x1dGUgcGF0aHMgbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yIGZvclxuICAgICAgICAvLyBtYW55IHVzZXJzLiBXZSBjYW4gaGVscCB0aGVtIG91dCB3aGVuIHRoZXkgZXhwZWN0IGZpbGU6Ly8gVVJJcyB0b1xuICAgICAgICAvLyBiZWhhdmUgbGlrZSBpdCB3b3VsZCBpZiB0aGV5IHdlcmUgcnVubmluZyBhIGxvY2FsIEhUVFAgc2VydmVyLiBTZWVcbiAgICAgICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODg1NTk3LlxuICAgICAgICB2YXIgZmlsZVVyaUFic1BhdGggPSBhU291cmNlLnJlcGxhY2UoL15maWxlOlxcL1xcLy8sIFwiXCIpO1xuICAgICAgICBpZiAodXJsLnNjaGVtZSA9PSBcImZpbGVcIlxuICAgICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoZmlsZVVyaUFic1BhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbdGhpcy5fc291cmNlcy5pbmRleE9mKGZpbGVVcmlBYnNQYXRoKV1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoIXVybC5wYXRoIHx8IHVybC5wYXRoID09IFwiL1wiKVxuICAgICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoXCIvXCIgKyBhU291cmNlKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIGFTb3VyY2UpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAgICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gICAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gICAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAgICpcbiAgICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gICAqL1xuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuZ2VuZXJhdGVkUG9zaXRpb25Gb3IgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgICBzb3VyY2U6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyksXG4gICAgICAgIG9yaWdpbmFsTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgbmVlZGxlLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCBuZWVkbGUuc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcobmVlZGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICAgIH07XG4gICAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZVxuICAgKiBhbmQgbGluZSBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZ1xuICAgKiBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKlxuICAgKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gICAqL1xuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9hbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IoYUFyZ3MpIHtcbiAgICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gZXhhY3QgbWF0Y2gsIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmdcbiAgICAgIC8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IG1hcHBpbmcgbGVzcyB0aGFuIHRoZSBuZWVkbGUuIEJ5XG4gICAgICAvLyBzZXR0aW5nIG5lZWRsZS5vcmlnaW5hbENvbHVtbiB0byBJbmZpbml0eSwgd2UgdGh1cyBmaW5kIHRoZSBsYXN0XG4gICAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gbGluZSwgcHJvdmlkZWQgc3VjaCBhIG1hcHBpbmcgZXhpc3RzLlxuICAgICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgICAgc291cmNlOiB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpLFxuICAgICAgICBvcmlnaW5hbExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgICBvcmlnaW5hbENvbHVtbjogSW5maW5pdHlcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBuZWVkbGUuc291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIG5lZWRsZS5zb3VyY2UpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbWFwcGluZ3MgPSBbXTtcblxuICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcobmVlZGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09IG5lZWRsZS5vcmlnaW5hbExpbmUpIHtcbiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzWy0taW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXBwaW5ncy5yZXZlcnNlKCk7XG4gICAgfTtcblxuICBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVIgPSAxO1xuICBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUiA9IDI7XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAgICogZ2VuZXJhdGVkIGxpbmUvY29sdW1uIGluIHRoaXMgc291cmNlIG1hcC5cbiAgICpcbiAgICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICAgKiAgICAgICAgVGhlIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdpdGggZWFjaCBtYXBwaW5nLlxuICAgKiBAcGFyYW0gT2JqZWN0IGFDb250ZXh0XG4gICAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAgICogICAgICAgIHRpbWUgdGhhdCBgYUNhbGxiYWNrYCBpcyBjYWxsZWQuXG4gICAqIEBwYXJhbSBhT3JkZXJcbiAgICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICAgKiAgICAgICAgYFNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSYC4gU3BlY2lmaWVzIHdoZXRoZXIgeW91IHdhbnQgdG9cbiAgICogICAgICAgIGl0ZXJhdGUgb3ZlciB0aGUgbWFwcGluZ3Mgc29ydGVkIGJ5IHRoZSBnZW5lcmF0ZWQgZmlsZSdzIGxpbmUvY29sdW1uXG4gICAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAgICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVJgLlxuICAgKi9cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9lYWNoTWFwcGluZyhhQ2FsbGJhY2ssIGFDb250ZXh0LCBhT3JkZXIpIHtcbiAgICAgIHZhciBjb250ZXh0ID0gYUNvbnRleHQgfHwgbnVsbDtcbiAgICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICAgIHZhciBtYXBwaW5ncztcbiAgICAgIHN3aXRjaCAob3JkZXIpIHtcbiAgICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgICBtYXBwaW5ncyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICAgIG1hcHBpbmdzID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5ncztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG9yZGVyIG9mIGl0ZXJhdGlvbi5cIik7XG4gICAgICB9XG5cbiAgICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgICAgbWFwcGluZ3MubWFwKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBtYXBwaW5nLnNvdXJjZTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHV0aWwuam9pbihzb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lLFxuICAgICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWVcbiAgICAgICAgfTtcbiAgICAgIH0pLmZvckVhY2goYUNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICB9O1xuXG4gIGV4cG9ydHMuU291cmNlTWFwQ29uc3VtZXIgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxufSk7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5pZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSwgcmVxdWlyZSk7XG59XG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuXG4gIHZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbiAgdmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbiAgdmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbiAgdmFyIE1hcHBpbmdMaXN0ID0gcmVxdWlyZSgnLi9tYXBwaW5nLWxpc3QnKS5NYXBwaW5nTGlzdDtcblxuICAvKipcbiAgICogQW4gaW5zdGFuY2Ugb2YgdGhlIFNvdXJjZU1hcEdlbmVyYXRvciByZXByZXNlbnRzIGEgc291cmNlIG1hcCB3aGljaCBpc1xuICAgKiBiZWluZyBidWlsdCBpbmNyZW1lbnRhbGx5LiBZb3UgbWF5IHBhc3MgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZ1xuICAgKiBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gZmlsZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICAgKiAgIC0gc291cmNlUm9vdDogQSByb290IGZvciBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gICAqL1xuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3IoYUFyZ3MpIHtcbiAgICBpZiAoIWFBcmdzKSB7XG4gICAgICBhQXJncyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLl9maWxlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdmaWxlJywgbnVsbCk7XG4gICAgdGhpcy5fc291cmNlUm9vdCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICAgIHRoaXMuX3NraXBWYWxpZGF0aW9uID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdza2lwVmFsaWRhdGlvbicsIGZhbHNlKTtcbiAgICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gICAgdGhpcy5fbmFtZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgICB0aGlzLl9tYXBwaW5ncyA9IG5ldyBNYXBwaW5nTGlzdCgpO1xuICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG4gIH1cblxuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl92ZXJzaW9uID0gMztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBTb3VyY2VNYXBHZW5lcmF0b3IgYmFzZWQgb24gYSBTb3VyY2VNYXBDb25zdW1lclxuICAgKlxuICAgKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAuXG4gICAqL1xuICBTb3VyY2VNYXBHZW5lcmF0b3IuZnJvbVNvdXJjZU1hcCA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyKSB7XG4gICAgICB2YXIgc291cmNlUm9vdCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VSb290O1xuICAgICAgdmFyIGdlbmVyYXRvciA9IG5ldyBTb3VyY2VNYXBHZW5lcmF0b3Ioe1xuICAgICAgICBmaWxlOiBhU291cmNlTWFwQ29uc3VtZXIuZmlsZSxcbiAgICAgICAgc291cmNlUm9vdDogc291cmNlUm9vdFxuICAgICAgfSk7XG4gICAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgICAgdmFyIG5ld01hcHBpbmcgPSB7XG4gICAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgICBsaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgICBjb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSBtYXBwaW5nLnNvdXJjZTtcbiAgICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbmV3TWFwcGluZy5zb3VyY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5ld01hcHBpbmcub3JpZ2luYWwgPSB7XG4gICAgICAgICAgICBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgIG5ld01hcHBpbmcubmFtZSA9IG1hcHBpbmcubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBnZW5lcmF0b3IuYWRkTWFwcGluZyhuZXdNYXBwaW5nKTtcbiAgICAgIH0pO1xuICAgICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRmlsZSkge1xuICAgICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgICAgZ2VuZXJhdG9yLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBzaW5nbGUgbWFwcGluZyBmcm9tIG9yaWdpbmFsIHNvdXJjZSBsaW5lIGFuZCBjb2x1bW4gdG8gdGhlIGdlbmVyYXRlZFxuICAgKiBzb3VyY2UncyBsaW5lIGFuZCBjb2x1bW4gZm9yIHRoaXMgc291cmNlIG1hcCBiZWluZyBjcmVhdGVkLiBUaGUgbWFwcGluZ1xuICAgKiBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gZ2VuZXJhdGVkOiBBbiBvYmplY3Qgd2l0aCB0aGUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gICAqICAgLSBvcmlnaW5hbDogQW4gb2JqZWN0IHdpdGggdGhlIG9yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gICAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSAocmVsYXRpdmUgdG8gdGhlIHNvdXJjZVJvb3QpLlxuICAgKiAgIC0gbmFtZTogQW4gb3B0aW9uYWwgb3JpZ2luYWwgdG9rZW4gbmFtZSBmb3IgdGhpcyBtYXBwaW5nLlxuICAgKi9cbiAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hZGRNYXBwaW5nID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYWRkTWFwcGluZyhhQXJncykge1xuICAgICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZ2VuZXJhdGVkJyk7XG4gICAgICB2YXIgb3JpZ2luYWwgPSB1dGlsLmdldEFyZyhhQXJncywgJ29yaWdpbmFsJywgbnVsbCk7XG4gICAgICB2YXIgc291cmNlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnLCBudWxsKTtcbiAgICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICduYW1lJywgbnVsbCk7XG5cbiAgICAgIGlmICghdGhpcy5fc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVNYXBwaW5nKGdlbmVyYXRlZCwgb3JpZ2luYWwsIHNvdXJjZSwgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiAhdGhpcy5fc291cmNlcy5oYXMoc291cmNlKSkge1xuICAgICAgICB0aGlzLl9zb3VyY2VzLmFkZChzb3VyY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmFtZSAhPSBudWxsICYmICF0aGlzLl9uYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgdGhpcy5fbmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9tYXBwaW5ncy5hZGQoe1xuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uLFxuICAgICAgICBvcmlnaW5hbExpbmU6IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwubGluZSxcbiAgICAgICAgb3JpZ2luYWxDb2x1bW46IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwuY29sdW1uLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgbmFtZTogbmFtZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAvKipcbiAgICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3NldFNvdXJjZUNvbnRlbnQoYVNvdXJjZUZpbGUsIGFTb3VyY2VDb250ZW50KSB7XG4gICAgICB2YXIgc291cmNlID0gYVNvdXJjZUZpbGU7XG4gICAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgIHNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5fc291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFTb3VyY2VDb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgLy8gQWRkIHRoZSBzb3VyY2UgY29udGVudCB0byB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBfc291cmNlc0NvbnRlbnRzIG1hcCBpZiB0aGUgcHJvcGVydHkgaXMgbnVsbC5cbiAgICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXSA9IGFTb3VyY2VDb250ZW50O1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBzb3VyY2UgZmlsZSBmcm9tIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcC5cbiAgICAgICAgLy8gSWYgdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwIGlzIGVtcHR5LCBzZXQgdGhlIHByb3BlcnR5IHRvIG51bGwuXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3NvdXJjZXNDb250ZW50cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIG1hcHBpbmdzIG9mIGEgc3ViLXNvdXJjZS1tYXAgZm9yIGEgc3BlY2lmaWMgc291cmNlIGZpbGUgdG8gdGhlXG4gICAqIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkLiBFYWNoIG1hcHBpbmcgdG8gdGhlIHN1cHBsaWVkIHNvdXJjZSBmaWxlIGlzXG4gICAqIHJld3JpdHRlbiB1c2luZyB0aGUgc3VwcGxpZWQgc291cmNlIG1hcC4gTm90ZTogVGhlIHJlc29sdXRpb24gZm9yIHRoZVxuICAgKiByZXN1bHRpbmcgbWFwcGluZ3MgaXMgdGhlIG1pbmltaXVtIG9mIHRoaXMgbWFwIGFuZCB0aGUgc3VwcGxpZWQgbWFwLlxuICAgKlxuICAgKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQuXG4gICAqIEBwYXJhbSBhU291cmNlRmlsZSBPcHRpb25hbC4gVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZS5cbiAgICogICAgICAgIElmIG9taXR0ZWQsIFNvdXJjZU1hcENvbnN1bWVyJ3MgZmlsZSBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQuXG4gICAqIEBwYXJhbSBhU291cmNlTWFwUGF0aCBPcHRpb25hbC4gVGhlIGRpcm5hbWUgb2YgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBtYXBcbiAgICogICAgICAgIHRvIGJlIGFwcGxpZWQuIElmIHJlbGF0aXZlLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgU291cmNlTWFwQ29uc3VtZXIuXG4gICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyBuZWVkZWQgd2hlbiB0aGUgdHdvIHNvdXJjZSBtYXBzIGFyZW4ndCBpbiB0aGUgc2FtZVxuICAgKiAgICAgICAgZGlyZWN0b3J5LCBhbmQgdGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZCBjb250YWlucyByZWxhdGl2ZSBzb3VyY2VcbiAgICogICAgICAgIHBhdGhzLiBJZiBzbywgdGhvc2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIG5lZWQgdG8gYmUgcmV3cml0dGVuXG4gICAqICAgICAgICByZWxhdGl2ZSB0byB0aGUgU291cmNlTWFwR2VuZXJhdG9yLlxuICAgKi9cbiAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hcHBseVNvdXJjZU1hcCA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2FwcGx5U291cmNlTWFwKGFTb3VyY2VNYXBDb25zdW1lciwgYVNvdXJjZUZpbGUsIGFTb3VyY2VNYXBQYXRoKSB7XG4gICAgICB2YXIgc291cmNlRmlsZSA9IGFTb3VyY2VGaWxlO1xuICAgICAgLy8gSWYgYVNvdXJjZUZpbGUgaXMgb21pdHRlZCwgd2Ugd2lsbCB1c2UgdGhlIGZpbGUgcHJvcGVydHkgb2YgdGhlIFNvdXJjZU1hcFxuICAgICAgaWYgKGFTb3VyY2VGaWxlID09IG51bGwpIHtcbiAgICAgICAgaWYgKGFTb3VyY2VNYXBDb25zdW1lci5maWxlID09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hcHBseVNvdXJjZU1hcCByZXF1aXJlcyBlaXRoZXIgYW4gZXhwbGljaXQgc291cmNlIGZpbGUsICcgK1xuICAgICAgICAgICAgJ29yIHRoZSBzb3VyY2UgbWFwXFwncyBcImZpbGVcIiBwcm9wZXJ0eS4gQm90aCB3ZXJlIG9taXR0ZWQuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgc291cmNlRmlsZSA9IGFTb3VyY2VNYXBDb25zdW1lci5maWxlO1xuICAgICAgfVxuICAgICAgdmFyIHNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgICAgLy8gTWFrZSBcInNvdXJjZUZpbGVcIiByZWxhdGl2ZSBpZiBhbiBhYnNvbHV0ZSBVcmwgaXMgcGFzc2VkLlxuICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgIH1cbiAgICAgIC8vIEFwcGx5aW5nIHRoZSBTb3VyY2VNYXAgY2FuIGFkZCBhbmQgcmVtb3ZlIGl0ZW1zIGZyb20gdGhlIHNvdXJjZXMgYW5kXG4gICAgICAvLyB0aGUgbmFtZXMgYXJyYXkuXG4gICAgICB2YXIgbmV3U291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgICAgdmFyIG5ld05hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgICAgIC8vIEZpbmQgbWFwcGluZ3MgZm9yIHRoZSBcInNvdXJjZUZpbGVcIlxuICAgICAgdGhpcy5fbWFwcGluZ3MudW5zb3J0ZWRGb3JFYWNoKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gc291cmNlRmlsZSAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgaXQgY2FuIGJlIG1hcHBlZCBieSB0aGUgc291cmNlIG1hcCwgdGhlbiB1cGRhdGUgdGhlIG1hcHBpbmcuXG4gICAgICAgICAgdmFyIG9yaWdpbmFsID0gYVNvdXJjZU1hcENvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgICBjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAob3JpZ2luYWwuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIENvcHkgbWFwcGluZ1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHV0aWwuam9pbihhU291cmNlTWFwUGF0aCwgbWFwcGluZy5zb3VyY2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBtYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9IG9yaWdpbmFsLmxpbmU7XG4gICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gb3JpZ2luYWwuY29sdW1uO1xuICAgICAgICAgICAgaWYgKG9yaWdpbmFsLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzb3VyY2UgPSBtYXBwaW5nLnNvdXJjZTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICFuZXdTb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgICAgbmV3U291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmICFuZXdOYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICBuZXdOYW1lcy5hZGQobmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgfSwgdGhpcyk7XG4gICAgICB0aGlzLl9zb3VyY2VzID0gbmV3U291cmNlcztcbiAgICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7XG5cbiAgICAgIC8vIENvcHkgc291cmNlc0NvbnRlbnRzIG9mIGFwcGxpZWQgbWFwLlxuICAgICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRmlsZSkge1xuICAgICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzKTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBBIG1hcHBpbmcgY2FuIGhhdmUgb25lIG9mIHRoZSB0aHJlZSBsZXZlbHMgb2YgZGF0YTpcbiAgICpcbiAgICogICAxLiBKdXN0IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gICAqICAgMi4gVGhlIEdlbmVyYXRlZCBwb3NpdGlvbiwgb3JpZ2luYWwgcG9zaXRpb24sIGFuZCBvcmlnaW5hbCBzb3VyY2UuXG4gICAqICAgMy4gR2VuZXJhdGVkIGFuZCBvcmlnaW5hbCBwb3NpdGlvbiwgb3JpZ2luYWwgc291cmNlLCBhcyB3ZWxsIGFzIGEgbmFtZVxuICAgKiAgICAgIHRva2VuLlxuICAgKlxuICAgKiBUbyBtYWludGFpbiBjb25zaXN0ZW5jeSwgd2UgdmFsaWRhdGUgdGhhdCBhbnkgbmV3IG1hcHBpbmcgYmVpbmcgYWRkZWQgZmFsbHNcbiAgICogaW4gdG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXMuXG4gICAqL1xuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl92YWxpZGF0ZU1hcHBpbmcgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl92YWxpZGF0ZU1hcHBpbmcoYUdlbmVyYXRlZCwgYU9yaWdpbmFsLCBhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYU5hbWUpIHtcbiAgICAgIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgICAmJiBhR2VuZXJhdGVkLmxpbmUgPiAwICYmIGFHZW5lcmF0ZWQuY29sdW1uID49IDBcbiAgICAgICAgICAmJiAhYU9yaWdpbmFsICYmICFhU291cmNlICYmICFhTmFtZSkge1xuICAgICAgICAvLyBDYXNlIDEuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICAgICAgJiYgYU9yaWdpbmFsICYmICdsaW5lJyBpbiBhT3JpZ2luYWwgJiYgJ2NvbHVtbicgaW4gYU9yaWdpbmFsXG4gICAgICAgICAgICAgICAmJiBhR2VuZXJhdGVkLmxpbmUgPiAwICYmIGFHZW5lcmF0ZWQuY29sdW1uID49IDBcbiAgICAgICAgICAgICAgICYmIGFPcmlnaW5hbC5saW5lID4gMCAmJiBhT3JpZ2luYWwuY29sdW1uID49IDBcbiAgICAgICAgICAgICAgICYmIGFTb3VyY2UpIHtcbiAgICAgICAgLy8gQ2FzZXMgMiBhbmQgMy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtYXBwaW5nOiAnICsgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGdlbmVyYXRlZDogYUdlbmVyYXRlZCxcbiAgICAgICAgICBzb3VyY2U6IGFTb3VyY2UsXG4gICAgICAgICAgb3JpZ2luYWw6IGFPcmlnaW5hbCxcbiAgICAgICAgICBuYW1lOiBhTmFtZVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfTtcblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoZSBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiB0byB0aGUgc3RyZWFtIG9mIGJhc2UgNjQgVkxRc1xuICAgKiBzcGVjaWZpZWQgYnkgdGhlIHNvdXJjZSBtYXAgZm9ybWF0LlxuICAgKi9cbiAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fc2VyaWFsaXplTWFwcGluZ3MgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXJpYWxpemVNYXBwaW5ncygpIHtcbiAgICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRMaW5lID0gMTtcbiAgICAgIHZhciBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gMDtcbiAgICAgIHZhciBwcmV2aW91c09yaWdpbmFsTGluZSA9IDA7XG4gICAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICAgIHZhciBwcmV2aW91c1NvdXJjZSA9IDA7XG4gICAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgICB2YXIgbWFwcGluZztcblxuICAgICAgdmFyIG1hcHBpbmdzID0gdGhpcy5fbWFwcGluZ3MudG9BcnJheSgpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gbWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgbWFwcGluZyA9IG1hcHBpbmdzW2ldO1xuXG4gICAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgICAgICB3aGlsZSAobWFwcGluZy5nZW5lcmF0ZWRMaW5lICE9PSBwcmV2aW91c0dlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnOyc7XG4gICAgICAgICAgICBwcmV2aW91c0dlbmVyYXRlZExpbmUrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIXV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zKG1hcHBpbmcsIG1hcHBpbmdzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgKz0gJywnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCArPSBiYXNlNjRWTFEuZW5jb2RlKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuXG4gICAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IGJhc2U2NFZMUS5lbmNvZGUodGhpcy5fc291cmNlcy5pbmRleE9mKG1hcHBpbmcuc291cmNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNTb3VyY2UpO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlID0gdGhpcy5fc291cmNlcy5pbmRleE9mKG1hcHBpbmcuc291cmNlKTtcblxuICAgICAgICAgIC8vIGxpbmVzIGFyZSBzdG9yZWQgMC1iYXNlZCBpbiBTb3VyY2VNYXAgc3BlYyB2ZXJzaW9uIDNcbiAgICAgICAgICByZXN1bHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLm9yaWdpbmFsTGluZSAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxMaW5lKTtcbiAgICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMTtcblxuICAgICAgICAgIHJlc3VsdCArPSBiYXNlNjRWTFEuZW5jb2RlKG1hcHBpbmcub3JpZ2luYWxDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4pO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gYmFzZTY0VkxRLmVuY29kZSh0aGlzLl9uYW1lcy5pbmRleE9mKG1hcHBpbmcubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNOYW1lKTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSA9IHRoaXMuX25hbWVzLmluZGV4T2YobWFwcGluZy5uYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KGFTb3VyY2VzLCBhU291cmNlUm9vdCkge1xuICAgICAgcmV0dXJuIGFTb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFTb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKGFTb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBrZXkgPSB1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSk7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fc291cmNlc0NvbnRlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSlcbiAgICAgICAgICA/IHRoaXMuX3NvdXJjZXNDb250ZW50c1trZXldXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfTtcblxuICAvKipcbiAgICogRXh0ZXJuYWxpemUgdGhlIHNvdXJjZSBtYXAuXG4gICAqL1xuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvSlNPTiA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvSlNPTigpIHtcbiAgICAgIHZhciBtYXAgPSB7XG4gICAgICAgIHZlcnNpb246IHRoaXMuX3ZlcnNpb24sXG4gICAgICAgIHNvdXJjZXM6IHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLFxuICAgICAgICBuYW1lczogdGhpcy5fbmFtZXMudG9BcnJheSgpLFxuICAgICAgICBtYXBwaW5nczogdGhpcy5fc2VyaWFsaXplTWFwcGluZ3MoKVxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLl9maWxlICE9IG51bGwpIHtcbiAgICAgICAgbWFwLmZpbGUgPSB0aGlzLl9maWxlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBtYXAuc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIG1hcC5zb3VyY2VzQ29udGVudCA9IHRoaXMuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQobWFwLnNvdXJjZXMsIG1hcC5zb3VyY2VSb290KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkIHRvIGEgc3RyaW5nLlxuICAgKi9cbiAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b1N0cmluZyA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgIH07XG5cbiAgZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSBTb3VyY2VNYXBHZW5lcmF0b3I7XG5cbn0pO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZGVmaW5lID0gcmVxdWlyZSgnYW1kZWZpbmUnKShtb2R1bGUsIHJlcXVpcmUpO1xufVxuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcblxuICB2YXIgU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9zb3VyY2UtbWFwLWdlbmVyYXRvcicpLlNvdXJjZU1hcEdlbmVyYXRvcjtcbiAgdmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuICAvLyBNYXRjaGVzIGEgV2luZG93cy1zdHlsZSBgXFxyXFxuYCBuZXdsaW5lIG9yIGEgYFxcbmAgbmV3bGluZSB1c2VkIGJ5IGFsbCBvdGhlclxuICAvLyBvcGVyYXRpbmcgc3lzdGVtcyB0aGVzZSBkYXlzIChjYXB0dXJpbmcgdGhlIHJlc3VsdCkuXG4gIHZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbiAgLy8gTmV3bGluZSBjaGFyYWN0ZXIgY29kZSBmb3IgY2hhckNvZGVBdCgpIGNvbXBhcmlzb25zXG4gIHZhciBORVdMSU5FX0NPREUgPSAxMDtcblxuICAvLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4gIC8vIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkgYXJlIGxvYWRlZC4gVGhpcyBNVVNUIE5PVCBDSEFOR0UgYWNyb3NzXG4gIC8vIHZlcnNpb25zIVxuICB2YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuICAvKipcbiAgICogU291cmNlTm9kZXMgcHJvdmlkZSBhIHdheSB0byBhYnN0cmFjdCBvdmVyIGludGVycG9sYXRpbmcvY29uY2F0ZW5hdGluZ1xuICAgKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAgICogY29sdW1uIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gICAqIEBwYXJhbSBhQ29sdW1uIFRoZSBvcmlnaW5hbCBjb2x1bW4gbnVtYmVyLlxuICAgKiBAcGFyYW0gYVNvdXJjZSBUaGUgb3JpZ2luYWwgc291cmNlJ3MgZmlsZW5hbWUuXG4gICAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICAgKiAgICAgICAgZ2VuZXJhdGVkIEpTLCBvciBvdGhlciBTb3VyY2VOb2Rlcy5cbiAgICogQHBhcmFtIGFOYW1lIFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLlxuICAgKi9cbiAgZnVuY3Rpb24gU291cmNlTm9kZShhTGluZSwgYUNvbHVtbiwgYVNvdXJjZSwgYUNodW5rcywgYU5hbWUpIHtcbiAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICAgIHRoaXMubGluZSA9IGFMaW5lID09IG51bGwgPyBudWxsIDogYUxpbmU7XG4gICAgdGhpcy5jb2x1bW4gPSBhQ29sdW1uID09IG51bGwgPyBudWxsIDogYUNvbHVtbjtcbiAgICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICAgIHRoaXMubmFtZSA9IGFOYW1lID09IG51bGwgPyBudWxsIDogYU5hbWU7XG4gICAgdGhpc1tpc1NvdXJjZU5vZGVdID0gdHJ1ZTtcbiAgICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICAgKlxuICAgKiBAcGFyYW0gYUdlbmVyYXRlZENvZGUgVGhlIGdlbmVyYXRlZCBjb2RlXG4gICAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gICAqIEBwYXJhbSBhUmVsYXRpdmVQYXRoIE9wdGlvbmFsLiBUaGUgcGF0aCB0aGF0IHJlbGF0aXZlIHNvdXJjZXMgaW4gdGhlXG4gICAqICAgICAgICBTb3VyY2VNYXBDb25zdW1lciBzaG91bGQgYmUgcmVsYXRpdmUgdG8uXG4gICAqL1xuICBTb3VyY2VOb2RlLmZyb21TdHJpbmdXaXRoU291cmNlTWFwID1cbiAgICBmdW5jdGlvbiBTb3VyY2VOb2RlX2Zyb21TdHJpbmdXaXRoU291cmNlTWFwKGFHZW5lcmF0ZWRDb2RlLCBhU291cmNlTWFwQ29uc3VtZXIsIGFSZWxhdGl2ZVBhdGgpIHtcbiAgICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgICAgLy8gYW5kIHRoZSBTb3VyY2VNYXBcbiAgICAgIHZhciBub2RlID0gbmV3IFNvdXJjZU5vZGUoKTtcblxuICAgICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgICAvLyB3aGlsZSBhbGwgb2RkIGluZGljZXMgYXJlIHRoZSBuZXdsaW5lcyBiZXR3ZWVuIHR3byBhZGphY2VudCBsaW5lc1xuICAgICAgLy8gKHNpbmNlIGBSRUdFWF9ORVdMSU5FYCBjYXB0dXJlcyBpdHMgbWF0Y2gpLlxuICAgICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgcmVtb3ZlZCBmcm9tIHRoaXMgYXJyYXksIGJ5IGNhbGxpbmcgYHNoaWZ0TmV4dExpbmVgLlxuICAgICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgICB2YXIgc2hpZnROZXh0TGluZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbGluZUNvbnRlbnRzID0gcmVtYWluaW5nTGluZXMuc2hpZnQoKTtcbiAgICAgICAgLy8gVGhlIGxhc3QgbGluZSBvZiBhIGZpbGUgbWlnaHQgbm90IGhhdmUgYSBuZXdsaW5lLlxuICAgICAgICB2YXIgbmV3TGluZSA9IHJlbWFpbmluZ0xpbmVzLnNoaWZ0KCkgfHwgXCJcIjtcbiAgICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG4gICAgICB9O1xuXG4gICAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICAgIHZhciBsYXN0R2VuZXJhdGVkTGluZSA9IDEsIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuXG4gICAgICAvLyBUaGUgZ2VuZXJhdGUgU291cmNlTm9kZXMgd2UgbmVlZCBhIGNvZGUgcmFuZ2UuXG4gICAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgICAgLy8gSGVyZSB3ZSBzdG9yZSB0aGUgbGFzdCBtYXBwaW5nLlxuICAgICAgdmFyIGxhc3RNYXBwaW5nID0gbnVsbDtcblxuICAgICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICAgIGlmIChsYXN0TWFwcGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGFkZCB0aGUgY29kZSBmcm9tIFwibGFzdE1hcHBpbmdcIiB0byBcIm1hcHBpbmdcIjpcbiAgICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgaWYgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgICB2YXIgY29kZSA9IFwiXCI7XG4gICAgICAgICAgICAvLyBBc3NvY2lhdGUgZmlyc3QgbGluZSB3aXRoIFwibGFzdE1hcHBpbmdcIlxuICAgICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgICAgbGFzdEdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBuZXcgbGluZSBpbiBiZXR3ZWVuLlxuICAgICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgICAvLyBcIm1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uXCIgd2l0aCBcImxhc3RNYXBwaW5nXCJcbiAgICAgICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzWzBdO1xuICAgICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbik7XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1swXSA9IG5leHRMaW5lLnN1YnN0cihtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcbiAgICAgICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgY29kZSk7XG4gICAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgICAgbGFzdE1hcHBpbmcgPSBtYXBwaW5nO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBhZGQgdGhlIGdlbmVyYXRlZCBjb2RlIHVudGlsIHRoZSBmaXJzdCBtYXBwaW5nXG4gICAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAgIC8vIEVhY2ggbGluZSBpcyBhZGRlZCBhcyBzZXBhcmF0ZSBzdHJpbmcuXG4gICAgICAgIHdoaWxlIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbMF07XG4gICAgICAgICAgbm9kZS5hZGQobmV4dExpbmUuc3Vic3RyKDAsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSk7XG4gICAgICAgICAgcmVtYWluaW5nTGluZXNbMF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcbiAgICAgICAgfVxuICAgICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgICB9LCB0aGlzKTtcbiAgICAgIC8vIFdlIGhhdmUgcHJvY2Vzc2VkIGFsbCBtYXBwaW5ncy5cbiAgICAgIGlmIChyZW1haW5pbmdMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChsYXN0TWFwcGluZykge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSB0aGUgcmVtYWluaW5nIGNvZGUgaW4gdGhlIGN1cnJlbnQgbGluZSB3aXRoIFwibGFzdE1hcHBpbmdcIlxuICAgICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhbmQgYWRkIHRoZSByZW1haW5pbmcgbGluZXMgd2l0aG91dCBhbnkgbWFwcGluZ1xuICAgICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5qb2luKFwiXCIpKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChhUmVsYXRpdmVQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVJlbGF0aXZlUGF0aCwgc291cmNlRmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBub2RlO1xuXG4gICAgICBmdW5jdGlvbiBhZGRNYXBwaW5nV2l0aENvZGUobWFwcGluZywgY29kZSkge1xuICAgICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbm9kZS5hZGQoY29kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICAgID8gdXRpbC5qb2luKGFSZWxhdGl2ZVBhdGgsIG1hcHBpbmcuc291cmNlKVxuICAgICAgICAgICAgOiBtYXBwaW5nLnNvdXJjZTtcbiAgICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcubmFtZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAvKipcbiAgICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSBhQ2h1bmsgQSBzdHJpbmcgc25pcHBldCBvZiBnZW5lcmF0ZWQgSlMgY29kZSwgYW5vdGhlciBpbnN0YW5jZSBvZlxuICAgKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfYWRkKGFDaHVuaykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICAgIGFDaHVuay5mb3JFYWNoKGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICB0aGlzLmFkZChjaHVuayk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYUNodW5rW2lzU291cmNlTm9kZV0gfHwgdHlwZW9mIGFDaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKGFDaHVuaykge1xuICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goYUNodW5rKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gICAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICAgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUucHJlcGVuZCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcHJlcGVuZChhQ2h1bmspIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgICBmb3IgKHZhciBpID0gYUNodW5rLmxlbmd0aC0xOyBpID49IDA7IGktLSkge1xuICAgICAgICB0aGlzLnByZXBlbmQoYUNodW5rW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYUNodW5rW2lzU291cmNlTm9kZV0gfHwgdHlwZW9mIGFDaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJFeHBlY3RlZCBhIFNvdXJjZU5vZGUsIHN0cmluZywgb3IgYW4gYXJyYXkgb2YgU291cmNlTm9kZXMgYW5kIHN0cmluZ3MuIEdvdCBcIiArIGFDaHVua1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFdhbGsgb3ZlciB0aGUgdHJlZSBvZiBKUyBzbmlwcGV0cyBpbiB0aGlzIG5vZGUgYW5kIGl0cyBjaGlsZHJlbi4gVGhlXG4gICAqIHdhbGtpbmcgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggc25pcHBldCBvZiBKUyBhbmQgaXMgcGFzc2VkIHRoYXRcbiAgICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gYUZuIFRoZSB0cmF2ZXJzYWwgZnVuY3Rpb24uXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS53YWxrID0gZnVuY3Rpb24gU291cmNlTm9kZV93YWxrKGFGbikge1xuICAgIHZhciBjaHVuaztcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY2h1bmsgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKGNodW5rW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgICBhRm4oY2h1bmssIHsgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIExpa2UgYFN0cmluZy5wcm90b3R5cGUuam9pbmAgZXhjZXB0IGZvciBTb3VyY2VOb2Rlcy4gSW5zZXJ0cyBgYVN0cmAgYmV0d2VlblxuICAgKiBlYWNoIG9mIGB0aGlzLmNoaWxkcmVuYC5cbiAgICpcbiAgICogQHBhcmFtIGFTZXAgVGhlIHNlcGFyYXRvci5cbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICAgIHZhciBuZXdDaGlsZHJlbjtcbiAgICB2YXIgaTtcbiAgICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgaWYgKGxlbiA+IDApIHtcbiAgICAgIG5ld0NoaWxkcmVuID0gW107XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKGFTZXApO1xuICAgICAgfVxuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIHRoaXMuY2hpbGRyZW4gPSBuZXdDaGlsZHJlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGwgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlIG9uIHRoZSB2ZXJ5IHJpZ2h0LW1vc3Qgc291cmNlIHNuaXBwZXQuIFVzZWZ1bFxuICAgKiBmb3IgdHJpbW1pbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBlbmQgb2YgYSBzb3VyY2Ugbm9kZSwgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0gYVBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVwbGFjZS5cbiAgICogQHBhcmFtIGFSZXBsYWNlbWVudCBUaGUgdGhpbmcgdG8gcmVwbGFjZSB0aGUgcGF0dGVybiB3aXRoLlxuICAgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUucmVwbGFjZVJpZ2h0ID0gZnVuY3Rpb24gU291cmNlTm9kZV9yZXBsYWNlUmlnaHQoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCkge1xuICAgIHZhciBsYXN0Q2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gICAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgICBsYXN0Q2hpbGQucmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdID0gbGFzdENoaWxkLnJlcGxhY2UoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKCcnLnJlcGxhY2UoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAgICogaW4gdGhlIHNvdXJjZXNDb250ZW50IGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICAgKiBAcGFyYW0gYVNvdXJjZUNvbnRlbnQgVGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgICBmdW5jdGlvbiBTb3VyY2VOb2RlX3NldFNvdXJjZUNvbnRlbnQoYVNvdXJjZUZpbGUsIGFTb3VyY2VDb250ZW50KSB7XG4gICAgICB0aGlzLnNvdXJjZUNvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoYVNvdXJjZUZpbGUpXSA9IGFTb3VyY2VDb250ZW50O1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFdhbGsgb3ZlciB0aGUgdHJlZSBvZiBTb3VyY2VOb2Rlcy4gVGhlIHdhbGtpbmcgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoXG4gICAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gYUZuIFRoZSB0cmF2ZXJzYWwgZnVuY3Rpb24uXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS53YWxrU291cmNlQ29udGVudHMgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2Fsa1NvdXJjZUNvbnRlbnRzKGFGbikge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV1baXNTb3VyY2VOb2RlXSkge1xuICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ud2Fsa1NvdXJjZUNvbnRlbnRzKGFGbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZXMgPSBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZUNvbnRlbnRzKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGFGbih1dGlsLmZyb21TZXRTdHJpbmcoc291cmNlc1tpXSksIHRoaXMuc291cmNlQ29udGVudHNbc291cmNlc1tpXV0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc291cmNlIG5vZGUuIFdhbGtzIG92ZXIgdGhlIHRyZWVcbiAgICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZygpIHtcbiAgICB2YXIgc3RyID0gXCJcIjtcbiAgICB0aGlzLndhbGsoZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICBzdHIgKz0gY2h1bms7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc291cmNlIG5vZGUgYWxvbmcgd2l0aCBhIHNvdXJjZVxuICAgKiBtYXAuXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS50b1N0cmluZ1dpdGhTb3VyY2VNYXAgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nV2l0aFNvdXJjZU1hcChhQXJncykge1xuICAgIHZhciBnZW5lcmF0ZWQgPSB7XG4gICAgICBjb2RlOiBcIlwiLFxuICAgICAgbGluZTogMSxcbiAgICAgIGNvbHVtbjogMFxuICAgIH07XG4gICAgdmFyIG1hcCA9IG5ldyBTb3VyY2VNYXBHZW5lcmF0b3IoYUFyZ3MpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgdmFyIGxhc3RPcmlnaW5hbExpbmUgPSBudWxsO1xuICAgIHZhciBsYXN0T3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICAgIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgICB0aGlzLndhbGsoZnVuY3Rpb24gKGNodW5rLCBvcmlnaW5hbCkge1xuICAgICAgZ2VuZXJhdGVkLmNvZGUgKz0gY2h1bms7XG4gICAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICAgJiYgb3JpZ2luYWwubGluZSAhPT0gbnVsbFxuICAgICAgICAgICYmIG9yaWdpbmFsLmNvbHVtbiAhPT0gbnVsbCkge1xuICAgICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgICB8fCBsYXN0T3JpZ2luYWxMaW5lICE9PSBvcmlnaW5hbC5saW5lXG4gICAgICAgICAgIHx8IGxhc3RPcmlnaW5hbENvbHVtbiAhPT0gb3JpZ2luYWwuY29sdW1uXG4gICAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgICBzb3VyY2U6IG9yaWdpbmFsLnNvdXJjZSxcbiAgICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICAgIGxpbmU6IG9yaWdpbmFsLmxpbmUsXG4gICAgICAgICAgICAgIGNvbHVtbjogb3JpZ2luYWwuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYW1lOiBvcmlnaW5hbC5uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdE9yaWdpbmFsU291cmNlID0gb3JpZ2luYWwuc291cmNlO1xuICAgICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgICAgbGFzdE9yaWdpbmFsQ29sdW1uID0gb3JpZ2luYWwuY29sdW1uO1xuICAgICAgICBsYXN0T3JpZ2luYWxOYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZU1hcHBpbmdBY3RpdmUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW5ndGggPSBjaHVuay5sZW5ndGg7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgICAgZ2VuZXJhdGVkLmxpbmUrKztcbiAgICAgICAgICBnZW5lcmF0ZWQuY29sdW1uID0gMDtcbiAgICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgICAgaWYgKGlkeCArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgICAgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDtcbiAgICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZU1hcHBpbmdBY3RpdmUpIHtcbiAgICAgICAgICAgIG1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICAgICAgbGluZTogb3JpZ2luYWwubGluZSxcbiAgICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdlbmVyYXRlZC5jb2x1bW4rKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMud2Fsa1NvdXJjZUNvbnRlbnRzKGZ1bmN0aW9uIChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KSB7XG4gICAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNvZGU6IGdlbmVyYXRlZC5jb2RlLCBtYXA6IG1hcCB9O1xuICB9O1xuXG4gIGV4cG9ydHMuU291cmNlTm9kZSA9IFNvdXJjZU5vZGU7XG5cbn0pO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZGVmaW5lID0gcmVxdWlyZSgnYW1kZWZpbmUnKShtb2R1bGUsIHJlcXVpcmUpO1xufVxuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcblxuICAvKipcbiAgICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0dGluZyB2YWx1ZXMgZnJvbSBwYXJhbWV0ZXIvb3B0aW9uc1xuICAgKiBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0gYXJncyBUaGUgb2JqZWN0IHdlIGFyZSBleHRyYWN0aW5nIHZhbHVlcyBmcm9tXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3ZSBhcmUgZ2V0dGluZy5cbiAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBBbiBvcHRpb25hbCB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmdcbiAgICogZnJvbSB0aGUgb2JqZWN0LiBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nLCBhblxuICAgKiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICovXG4gIGZ1bmN0aW9uIGdldEFyZyhhQXJncywgYU5hbWUsIGFEZWZhdWx0VmFsdWUpIHtcbiAgICBpZiAoYU5hbWUgaW4gYUFyZ3MpIHtcbiAgICAgIHJldHVybiBhQXJnc1thTmFtZV07XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICByZXR1cm4gYURlZmF1bHRWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhTmFtZSArICdcIiBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LicpO1xuICAgIH1cbiAgfVxuICBleHBvcnRzLmdldEFyZyA9IGdldEFyZztcblxuICB2YXIgdXJsUmVnZXhwID0gL14oPzooW1xcdytcXC0uXSspOik/XFwvXFwvKD86KFxcdys6XFx3KylAKT8oW1xcdy5dKikoPzo6KFxcZCspKT8oXFxTKikkLztcbiAgdmFyIGRhdGFVcmxSZWdleHAgPSAvXmRhdGE6LitcXCwuKyQvO1xuXG4gIGZ1bmN0aW9uIHVybFBhcnNlKGFVcmwpIHtcbiAgICB2YXIgbWF0Y2ggPSBhVXJsLm1hdGNoKHVybFJlZ2V4cCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWU6IG1hdGNoWzFdLFxuICAgICAgYXV0aDogbWF0Y2hbMl0sXG4gICAgICBob3N0OiBtYXRjaFszXSxcbiAgICAgIHBvcnQ6IG1hdGNoWzRdLFxuICAgICAgcGF0aDogbWF0Y2hbNV1cbiAgICB9O1xuICB9XG4gIGV4cG9ydHMudXJsUGFyc2UgPSB1cmxQYXJzZTtcblxuICBmdW5jdGlvbiB1cmxHZW5lcmF0ZShhUGFyc2VkVXJsKSB7XG4gICAgdmFyIHVybCA9ICcnO1xuICAgIGlmIChhUGFyc2VkVXJsLnNjaGVtZSkge1xuICAgICAgdXJsICs9IGFQYXJzZWRVcmwuc2NoZW1lICsgJzonO1xuICAgIH1cbiAgICB1cmwgKz0gJy8vJztcbiAgICBpZiAoYVBhcnNlZFVybC5hdXRoKSB7XG4gICAgICB1cmwgKz0gYVBhcnNlZFVybC5hdXRoICsgJ0AnO1xuICAgIH1cbiAgICBpZiAoYVBhcnNlZFVybC5ob3N0KSB7XG4gICAgICB1cmwgKz0gYVBhcnNlZFVybC5ob3N0O1xuICAgIH1cbiAgICBpZiAoYVBhcnNlZFVybC5wb3J0KSB7XG4gICAgICB1cmwgKz0gXCI6XCIgKyBhUGFyc2VkVXJsLnBvcnRcbiAgICB9XG4gICAgaWYgKGFQYXJzZWRVcmwucGF0aCkge1xuICAgICAgdXJsICs9IGFQYXJzZWRVcmwucGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBleHBvcnRzLnVybEdlbmVyYXRlID0gdXJsR2VuZXJhdGU7XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgYSBwYXRoLCBvciB0aGUgcGF0aCBwb3J0aW9uIG9mIGEgVVJMOlxuICAgKlxuICAgKiAtIFJlcGxhY2VzIGNvbnNlcXV0aXZlIHNsYXNoZXMgd2l0aCBvbmUgc2xhc2guXG4gICAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnLicgcGFydHMuXG4gICAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnPGRpcj4vLi4nIHBhcnRzLlxuICAgKlxuICAgKiBCYXNlZCBvbiBjb2RlIGluIHRoZSBOb2RlLmpzICdwYXRoJyBjb3JlIG1vZHVsZS5cbiAgICpcbiAgICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIHVybCB0byBub3JtYWxpemUuXG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemUoYVBhdGgpIHtcbiAgICB2YXIgcGF0aCA9IGFQYXRoO1xuICAgIHZhciB1cmwgPSB1cmxQYXJzZShhUGF0aCk7XG4gICAgaWYgKHVybCkge1xuICAgICAgaWYgKCF1cmwucGF0aCkge1xuICAgICAgICByZXR1cm4gYVBhdGg7XG4gICAgICB9XG4gICAgICBwYXRoID0gdXJsLnBhdGg7XG4gICAgfVxuICAgIHZhciBpc0Fic29sdXRlID0gKHBhdGguY2hhckF0KDApID09PSAnLycpO1xuXG4gICAgdmFyIHBhcnRzID0gcGF0aC5zcGxpdCgvXFwvKy8pO1xuICAgIGZvciAodmFyIHBhcnQsIHVwID0gMCwgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBwYXJ0ID0gcGFydHNbaV07XG4gICAgICBpZiAocGFydCA9PT0gJy4nKSB7XG4gICAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgICB1cCsrO1xuICAgICAgfSBlbHNlIGlmICh1cCA+IDApIHtcbiAgICAgICAgaWYgKHBhcnQgPT09ICcnKSB7XG4gICAgICAgICAgLy8gVGhlIGZpcnN0IHBhcnQgaXMgYmxhbmsgaWYgdGhlIHBhdGggaXMgYWJzb2x1dGUuIFRyeWluZyB0byBnb1xuICAgICAgICAgIC8vIGFib3ZlIHRoZSByb290IGlzIGEgbm8tb3AuIFRoZXJlZm9yZSB3ZSBjYW4gcmVtb3ZlIGFsbCAnLi4nIHBhcnRzXG4gICAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgdGhlIHJvb3QuXG4gICAgICAgICAgcGFydHMuc3BsaWNlKGkgKyAxLCB1cCk7XG4gICAgICAgICAgdXAgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnRzLnNwbGljZShpLCAyKTtcbiAgICAgICAgICB1cC0tO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgICBpZiAocGF0aCA9PT0gJycpIHtcbiAgICAgIHBhdGggPSBpc0Fic29sdXRlID8gJy8nIDogJy4nO1xuICAgIH1cblxuICAgIGlmICh1cmwpIHtcbiAgICAgIHVybC5wYXRoID0gcGF0aDtcbiAgICAgIHJldHVybiB1cmxHZW5lcmF0ZSh1cmwpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aDtcbiAgfVxuICBleHBvcnRzLm5vcm1hbGl6ZSA9IG5vcm1hbGl6ZTtcblxuICAvKipcbiAgICogSm9pbnMgdHdvIHBhdGhzL1VSTHMuXG4gICAqXG4gICAqIEBwYXJhbSBhUm9vdCBUaGUgcm9vdCBwYXRoIG9yIFVSTC5cbiAgICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBqb2luZWQgd2l0aCB0aGUgcm9vdC5cbiAgICpcbiAgICogLSBJZiBhUGF0aCBpcyBhIFVSTCBvciBhIGRhdGEgVVJJLCBhUGF0aCBpcyByZXR1cm5lZCwgdW5sZXNzIGFQYXRoIGlzIGFcbiAgICogICBzY2hlbWUtcmVsYXRpdmUgVVJMOiBUaGVuIHRoZSBzY2hlbWUgb2YgYVJvb3QsIGlmIGFueSwgaXMgcHJlcGVuZGVkXG4gICAqICAgZmlyc3QuXG4gICAqIC0gT3RoZXJ3aXNlIGFQYXRoIGlzIGEgcGF0aC4gSWYgYVJvb3QgaXMgYSBVUkwsIHRoZW4gaXRzIHBhdGggcG9ydGlvblxuICAgKiAgIGlzIHVwZGF0ZWQgd2l0aCB0aGUgcmVzdWx0IGFuZCBhUm9vdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSByZXN1bHRcbiAgICogICBpcyByZXR1cm5lZC5cbiAgICogICAtIElmIGFQYXRoIGlzIGFic29sdXRlLCB0aGUgcmVzdWx0IGlzIGFQYXRoLlxuICAgKiAgIC0gT3RoZXJ3aXNlIHRoZSB0d28gcGF0aHMgYXJlIGpvaW5lZCB3aXRoIGEgc2xhc2guXG4gICAqIC0gSm9pbmluZyBmb3IgZXhhbXBsZSAnaHR0cDovLycgYW5kICd3d3cuZXhhbXBsZS5jb20nIGlzIGFsc28gc3VwcG9ydGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gam9pbihhUm9vdCwgYVBhdGgpIHtcbiAgICBpZiAoYVJvb3QgPT09IFwiXCIpIHtcbiAgICAgIGFSb290ID0gXCIuXCI7XG4gICAgfVxuICAgIGlmIChhUGF0aCA9PT0gXCJcIikge1xuICAgICAgYVBhdGggPSBcIi5cIjtcbiAgICB9XG4gICAgdmFyIGFQYXRoVXJsID0gdXJsUGFyc2UoYVBhdGgpO1xuICAgIHZhciBhUm9vdFVybCA9IHVybFBhcnNlKGFSb290KTtcbiAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgIGFSb290ID0gYVJvb3RVcmwucGF0aCB8fCAnLyc7XG4gICAgfVxuXG4gICAgLy8gYGpvaW4oZm9vLCAnLy93d3cuZXhhbXBsZS5vcmcnKWBcbiAgICBpZiAoYVBhdGhVcmwgJiYgIWFQYXRoVXJsLnNjaGVtZSkge1xuICAgICAgaWYgKGFSb290VXJsKSB7XG4gICAgICAgIGFQYXRoVXJsLnNjaGVtZSA9IGFSb290VXJsLnNjaGVtZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUGF0aFVybCk7XG4gICAgfVxuXG4gICAgaWYgKGFQYXRoVXJsIHx8IGFQYXRoLm1hdGNoKGRhdGFVcmxSZWdleHApKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgLy8gYGpvaW4oJ2h0dHA6Ly8nLCAnd3d3LmV4YW1wbGUuY29tJylgXG4gICAgaWYgKGFSb290VXJsICYmICFhUm9vdFVybC5ob3N0ICYmICFhUm9vdFVybC5wYXRoKSB7XG4gICAgICBhUm9vdFVybC5ob3N0ID0gYVBhdGg7XG4gICAgICByZXR1cm4gdXJsR2VuZXJhdGUoYVJvb3RVcmwpO1xuICAgIH1cblxuICAgIHZhciBqb2luZWQgPSBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJ1xuICAgICAgPyBhUGF0aFxuICAgICAgOiBub3JtYWxpemUoYVJvb3QucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnLycgKyBhUGF0aCk7XG5cbiAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgIGFSb290VXJsLnBhdGggPSBqb2luZWQ7XG4gICAgICByZXR1cm4gdXJsR2VuZXJhdGUoYVJvb3RVcmwpO1xuICAgIH1cbiAgICByZXR1cm4gam9pbmVkO1xuICB9XG4gIGV4cG9ydHMuam9pbiA9IGpvaW47XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBwYXRoIHJlbGF0aXZlIHRvIGEgVVJMIG9yIGFub3RoZXIgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICAgKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgVVJMIHRvIGJlIG1hZGUgcmVsYXRpdmUgdG8gYVJvb3QuXG4gICAqL1xuICBmdW5jdGlvbiByZWxhdGl2ZShhUm9vdCwgYVBhdGgpIHtcbiAgICBpZiAoYVJvb3QgPT09IFwiXCIpIHtcbiAgICAgIGFSb290ID0gXCIuXCI7XG4gICAgfVxuXG4gICAgYVJvb3QgPSBhUm9vdC5yZXBsYWNlKC9cXC8kLywgJycpO1xuXG4gICAgLy8gWFhYOiBJdCBpcyBwb3NzaWJsZSB0byByZW1vdmUgdGhpcyBibG9jaywgYW5kIHRoZSB0ZXN0cyBzdGlsbCBwYXNzIVxuICAgIHZhciB1cmwgPSB1cmxQYXJzZShhUm9vdCk7XG4gICAgaWYgKGFQYXRoLmNoYXJBdCgwKSA9PSBcIi9cIiAmJiB1cmwgJiYgdXJsLnBhdGggPT0gXCIvXCIpIHtcbiAgICAgIHJldHVybiBhUGF0aC5zbGljZSgxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYVBhdGguaW5kZXhPZihhUm9vdCArICcvJykgPT09IDBcbiAgICAgID8gYVBhdGguc3Vic3RyKGFSb290Lmxlbmd0aCArIDEpXG4gICAgICA6IGFQYXRoO1xuICB9XG4gIGV4cG9ydHMucmVsYXRpdmUgPSByZWxhdGl2ZTtcblxuICAvKipcbiAgICogQmVjYXVzZSBiZWhhdmlvciBnb2VzIHdhY2t5IHdoZW4geW91IHNldCBgX19wcm90b19fYCBvbiBvYmplY3RzLCB3ZVxuICAgKiBoYXZlIHRvIHByZWZpeCBhbGwgdGhlIHN0cmluZ3MgaW4gb3VyIHNldCB3aXRoIGFuIGFyYml0cmFyeSBjaGFyYWN0ZXIuXG4gICAqXG4gICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL3B1bGwvMzEgYW5kXG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3NvdXJjZS1tYXAvaXNzdWVzLzMwXG4gICAqXG4gICAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICAgKi9cbiAgZnVuY3Rpb24gdG9TZXRTdHJpbmcoYVN0cikge1xuICAgIHJldHVybiAnJCcgKyBhU3RyO1xuICB9XG4gIGV4cG9ydHMudG9TZXRTdHJpbmcgPSB0b1NldFN0cmluZztcblxuICBmdW5jdGlvbiBmcm9tU2V0U3RyaW5nKGFTdHIpIHtcbiAgICByZXR1cm4gYVN0ci5zdWJzdHIoMSk7XG4gIH1cbiAgZXhwb3J0cy5mcm9tU2V0U3RyaW5nID0gZnJvbVNldFN0cmluZztcblxuICBmdW5jdGlvbiBzdHJjbXAoYVN0cjEsIGFTdHIyKSB7XG4gICAgdmFyIHMxID0gYVN0cjEgfHwgXCJcIjtcbiAgICB2YXIgczIgPSBhU3RyMiB8fCBcIlwiO1xuICAgIHJldHVybiAoczEgPiBzMikgLSAoczEgPCBzMik7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aGVyZSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zIGFyZSBjb21wYXJlZC5cbiAgICpcbiAgICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICAgKiBtYXBwaW5ncyB3aXRoIHRoZSBzYW1lIG9yaWdpbmFsIHNvdXJjZS9saW5lL2NvbHVtbiwgYnV0IGRpZmZlcmVudCBnZW5lcmF0ZWRcbiAgICogbGluZSBhbmQgY29sdW1uIHRoZSBzYW1lLiBVc2VmdWwgd2hlbiBzZWFyY2hpbmcgZm9yIGEgbWFwcGluZyB3aXRoIGFcbiAgICogc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVPcmlnaW5hbCkge1xuICAgIHZhciBjbXA7XG5cbiAgICBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICAgIGlmIChjbXApIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICAgIGlmIChjbXApIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjtcbiAgICBpZiAoY21wIHx8IG9ubHlDb21wYXJlT3JpZ2luYWwpIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgY21wID0gc3RyY21wKG1hcHBpbmdBLm5hbWUsIG1hcHBpbmdCLm5hbWUpO1xuICAgIGlmIChjbXApIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gICAgaWYgKGNtcCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICB9O1xuICBleHBvcnRzLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zID0gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnM7XG5cbiAgLyoqXG4gICAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2hlcmUgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMgYXJlXG4gICAqIGNvbXBhcmVkLlxuICAgKlxuICAgKiBPcHRpb25hbGx5IHBhc3MgaW4gYHRydWVgIGFzIGBvbmx5Q29tcGFyZUdlbmVyYXRlZGAgdG8gY29uc2lkZXIgdHdvXG4gICAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiwgYnV0IGRpZmZlcmVudFxuICAgKiBzb3VyY2UvbmFtZS9vcmlnaW5hbCBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYVxuICAgKiBtYXBwaW5nIHdpdGggYSBzdHViYmVkIG91dCBtYXBwaW5nLlxuICAgKi9cbiAgZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVHZW5lcmF0ZWQpIHtcbiAgICB2YXIgY21wO1xuXG4gICAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gICAgaWYgKGNtcCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gICAgaWYgKGNtcCB8fCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICAgIGlmIChjbXApIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICAgIGlmIChjbXApIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjtcbiAgICBpZiAoY21wKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG4gIH07XG4gIGV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zID0gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zO1xuXG59KTtcbiIsIlxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gdHJpbTtcblxuZnVuY3Rpb24gdHJpbShzdHIpe1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqfFxccyokL2csICcnKTtcbn1cblxuZXhwb3J0cy5sZWZ0ID0gZnVuY3Rpb24oc3RyKXtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzKi8sICcnKTtcbn07XG5cbmV4cG9ydHMucmlnaHQgPSBmdW5jdGlvbihzdHIpe1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL1xccyokLywgJycpO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIHdpbmRvdyA9IHJlcXVpcmUoXCJnbG9iYWwvd2luZG93XCIpXG52YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoXCJpcy1mdW5jdGlvblwiKVxudmFyIHBhcnNlSGVhZGVycyA9IHJlcXVpcmUoXCJwYXJzZS1oZWFkZXJzXCIpXG52YXIgeHRlbmQgPSByZXF1aXJlKFwieHRlbmRcIilcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVYSFJcbmNyZWF0ZVhIUi5YTUxIdHRwUmVxdWVzdCA9IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCB8fCBub29wXG5jcmVhdGVYSFIuWERvbWFpblJlcXVlc3QgPSBcIndpdGhDcmVkZW50aWFsc1wiIGluIChuZXcgY3JlYXRlWEhSLlhNTEh0dHBSZXF1ZXN0KCkpID8gY3JlYXRlWEhSLlhNTEh0dHBSZXF1ZXN0IDogd2luZG93LlhEb21haW5SZXF1ZXN0XG5cbmZvckVhY2hBcnJheShbXCJnZXRcIiwgXCJwdXRcIiwgXCJwb3N0XCIsIFwicGF0Y2hcIiwgXCJoZWFkXCIsIFwiZGVsZXRlXCJdLCBmdW5jdGlvbihtZXRob2QpIHtcbiAgICBjcmVhdGVYSFJbbWV0aG9kID09PSBcImRlbGV0ZVwiID8gXCJkZWxcIiA6IG1ldGhvZF0gPSBmdW5jdGlvbih1cmksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAgIG9wdGlvbnMgPSBpbml0UGFyYW1zKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICAgICAgIG9wdGlvbnMubWV0aG9kID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVYSFIob3B0aW9ucylcbiAgICB9XG59KVxuXG5mdW5jdGlvbiBmb3JFYWNoQXJyYXkoYXJyYXksIGl0ZXJhdG9yKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpdGVyYXRvcihhcnJheVtpXSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHkob2JqKXtcbiAgICBmb3IodmFyIGkgaW4gb2JqKXtcbiAgICAgICAgaWYob2JqLmhhc093blByb3BlcnR5KGkpKSByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gaW5pdFBhcmFtcyh1cmksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHBhcmFtcyA9IHVyaVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zXG4gICAgICAgIGlmICh0eXBlb2YgdXJpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSB7dXJpOnVyaX1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtcyA9IHh0ZW5kKG9wdGlvbnMsIHt1cmk6IHVyaX0pXG4gICAgfVxuXG4gICAgcGFyYW1zLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICByZXR1cm4gcGFyYW1zXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVhIUih1cmksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgb3B0aW9ucyA9IGluaXRQYXJhbXModXJpLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgICByZXR1cm4gX2NyZWF0ZVhIUihvcHRpb25zKVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlWEhSKG9wdGlvbnMpIHtcbiAgICBpZih0eXBlb2Ygb3B0aW9ucy5jYWxsYmFjayA9PT0gXCJ1bmRlZmluZWRcIil7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbGxiYWNrIGFyZ3VtZW50IG1pc3NpbmdcIilcbiAgICB9XG5cbiAgICB2YXIgY2FsbGVkID0gZmFsc2VcbiAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiBjYk9uY2UoZXJyLCByZXNwb25zZSwgYm9keSl7XG4gICAgICAgIGlmKCFjYWxsZWQpe1xuICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZVxuICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFjayhlcnIsIHJlc3BvbnNlLCBib2R5KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVhZHlzdGF0ZWNoYW5nZSgpIHtcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGxvYWRGdW5jLCAwKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Qm9keSgpIHtcbiAgICAgICAgLy8gQ2hyb21lIHdpdGggcmVxdWVzdFR5cGU9YmxvYiB0aHJvd3MgZXJyb3JzIGFycm91bmQgd2hlbiBldmVuIHRlc3RpbmcgYWNjZXNzIHRvIHJlc3BvbnNlVGV4dFxuICAgICAgICB2YXIgYm9keSA9IHVuZGVmaW5lZFxuXG4gICAgICAgIGlmICh4aHIucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGJvZHkgPSB4aHIucmVzcG9uc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJvZHkgPSB4aHIucmVzcG9uc2VUZXh0IHx8IGdldFhtbCh4aHIpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNKc29uKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGJvZHkpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJvZHlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcnJvckZ1bmMoZXZ0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0VGltZXIpXG4gICAgICAgIGlmKCEoZXZ0IGluc3RhbmNlb2YgRXJyb3IpKXtcbiAgICAgICAgICAgIGV2dCA9IG5ldyBFcnJvcihcIlwiICsgKGV2dCB8fCBcIlVua25vd24gWE1MSHR0cFJlcXVlc3QgRXJyb3JcIikgKVxuICAgICAgICB9XG4gICAgICAgIGV2dC5zdGF0dXNDb2RlID0gMFxuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXZ0LCBmYWlsdXJlUmVzcG9uc2UpXG4gICAgfVxuXG4gICAgLy8gd2lsbCBsb2FkIHRoZSBkYXRhICYgcHJvY2VzcyB0aGUgcmVzcG9uc2UgaW4gYSBzcGVjaWFsIHJlc3BvbnNlIG9iamVjdFxuICAgIGZ1bmN0aW9uIGxvYWRGdW5jKCkge1xuICAgICAgICBpZiAoYWJvcnRlZCkgcmV0dXJuXG4gICAgICAgIHZhciBzdGF0dXNcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRUaW1lcilcbiAgICAgICAgaWYob3B0aW9ucy51c2VYRFIgJiYgeGhyLnN0YXR1cz09PXVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy9JRTggQ09SUyBHRVQgc3VjY2Vzc2Z1bCByZXNwb25zZSBkb2Vzbid0IGhhdmUgYSBzdGF0dXMgZmllbGQsIGJ1dCBib2R5IGlzIGZpbmVcbiAgICAgICAgICAgIHN0YXR1cyA9IDIwMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdHVzID0gKHhoci5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiB4aHIuc3RhdHVzKVxuICAgICAgICB9XG4gICAgICAgIHZhciByZXNwb25zZSA9IGZhaWx1cmVSZXNwb25zZVxuICAgICAgICB2YXIgZXJyID0gbnVsbFxuXG4gICAgICAgIGlmIChzdGF0dXMgIT09IDApe1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgICAgICAgYm9keTogZ2V0Qm9keSgpLFxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHN0YXR1cyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgICAgICAgICB1cmw6IHVyaSxcbiAgICAgICAgICAgICAgICByYXdSZXF1ZXN0OiB4aHJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMpeyAvL3JlbWVtYmVyIHhociBjYW4gaW4gZmFjdCBiZSBYRFIgZm9yIENPUlMgaW4gSUVcbiAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzID0gcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVyciA9IG5ldyBFcnJvcihcIkludGVybmFsIFhNTEh0dHBSZXF1ZXN0IEVycm9yXCIpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVyciwgcmVzcG9uc2UsIHJlc3BvbnNlLmJvZHkpXG4gICAgfVxuXG4gICAgdmFyIHhociA9IG9wdGlvbnMueGhyIHx8IG51bGxcblxuICAgIGlmICgheGhyKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNvcnMgfHwgb3B0aW9ucy51c2VYRFIpIHtcbiAgICAgICAgICAgIHhociA9IG5ldyBjcmVhdGVYSFIuWERvbWFpblJlcXVlc3QoKVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHhociA9IG5ldyBjcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGtleVxuICAgIHZhciBhYm9ydGVkXG4gICAgdmFyIHVyaSA9IHhoci51cmwgPSBvcHRpb25zLnVyaSB8fCBvcHRpb25zLnVybFxuICAgIHZhciBtZXRob2QgPSB4aHIubWV0aG9kID0gb3B0aW9ucy5tZXRob2QgfHwgXCJHRVRcIlxuICAgIHZhciBib2R5ID0gb3B0aW9ucy5ib2R5IHx8IG9wdGlvbnMuZGF0YVxuICAgIHZhciBoZWFkZXJzID0geGhyLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge31cbiAgICB2YXIgc3luYyA9ICEhb3B0aW9ucy5zeW5jXG4gICAgdmFyIGlzSnNvbiA9IGZhbHNlXG4gICAgdmFyIHRpbWVvdXRUaW1lclxuICAgIHZhciBmYWlsdXJlUmVzcG9uc2UgPSB7XG4gICAgICAgIGJvZHk6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIHN0YXR1c0NvZGU6IDAsXG4gICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICB1cmw6IHVyaSxcbiAgICAgICAgcmF3UmVxdWVzdDogeGhyXG4gICAgfVxuXG4gICAgaWYgKFwianNvblwiIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5qc29uICE9PSBmYWxzZSkge1xuICAgICAgICBpc0pzb24gPSB0cnVlXG4gICAgICAgIGhlYWRlcnNbXCJhY2NlcHRcIl0gfHwgaGVhZGVyc1tcIkFjY2VwdFwiXSB8fCAoaGVhZGVyc1tcIkFjY2VwdFwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiKSAvL0Rvbid0IG92ZXJyaWRlIGV4aXN0aW5nIGFjY2VwdCBoZWFkZXIgZGVjbGFyZWQgYnkgdXNlclxuICAgICAgICBpZiAobWV0aG9kICE9PSBcIkdFVFwiICYmIG1ldGhvZCAhPT0gXCJIRUFEXCIpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gfHwgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSB8fCAoaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiKSAvL0Rvbid0IG92ZXJyaWRlIGV4aXN0aW5nIGFjY2VwdCBoZWFkZXIgZGVjbGFyZWQgYnkgdXNlclxuICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuanNvbiA9PT0gdHJ1ZSA/IGJvZHkgOiBvcHRpb25zLmpzb24pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gcmVhZHlzdGF0ZWNoYW5nZVxuICAgIHhoci5vbmxvYWQgPSBsb2FkRnVuY1xuICAgIHhoci5vbmVycm9yID0gZXJyb3JGdW5jXG4gICAgLy8gSUU5IG11c3QgaGF2ZSBvbnByb2dyZXNzIGJlIHNldCB0byBhIHVuaXF1ZSBmdW5jdGlvbi5cbiAgICB4aHIub25wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gSUUgbXVzdCBkaWVcbiAgICB9XG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpe1xuICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGVycm9yRnVuY1xuICAgIHhoci5vcGVuKG1ldGhvZCwgdXJpLCAhc3luYywgb3B0aW9ucy51c2VybmFtZSwgb3B0aW9ucy5wYXNzd29yZClcbiAgICAvL2hhcyB0byBiZSBhZnRlciBvcGVuXG4gICAgaWYoIXN5bmMpIHtcbiAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9ICEhb3B0aW9ucy53aXRoQ3JlZGVudGlhbHNcbiAgICB9XG4gICAgLy8gQ2Fubm90IHNldCB0aW1lb3V0IHdpdGggc3luYyByZXF1ZXN0XG4gICAgLy8gbm90IHNldHRpbmcgdGltZW91dCBvbiB0aGUgeGhyIG9iamVjdCwgYmVjYXVzZSBvZiBvbGQgd2Via2l0cyBldGMuIG5vdCBoYW5kbGluZyB0aGF0IGNvcnJlY3RseVxuICAgIC8vIGJvdGggbnBtJ3MgcmVxdWVzdCBhbmQganF1ZXJ5IDEueCB1c2UgdGhpcyBraW5kIG9mIHRpbWVvdXQsIHNvIHRoaXMgaXMgYmVpbmcgY29uc2lzdGVudFxuICAgIGlmICghc3luYyAmJiBvcHRpb25zLnRpbWVvdXQgPiAwICkge1xuICAgICAgICB0aW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBpZiAoYWJvcnRlZCkgcmV0dXJuXG4gICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZS8vSUU5IG1heSBzdGlsbCBjYWxsIHJlYWR5c3RhdGVjaGFuZ2VcbiAgICAgICAgICAgIHhoci5hYm9ydChcInRpbWVvdXRcIilcbiAgICAgICAgICAgIHZhciBlID0gbmV3IEVycm9yKFwiWE1MSHR0cFJlcXVlc3QgdGltZW91dFwiKVxuICAgICAgICAgICAgZS5jb2RlID0gXCJFVElNRURPVVRcIlxuICAgICAgICAgICAgZXJyb3JGdW5jKGUpXG4gICAgICAgIH0sIG9wdGlvbnMudGltZW91dCApXG4gICAgfVxuXG4gICAgaWYgKHhoci5zZXRSZXF1ZXN0SGVhZGVyKSB7XG4gICAgICAgIGZvcihrZXkgaW4gaGVhZGVycyl7XG4gICAgICAgICAgICBpZihoZWFkZXJzLmhhc093blByb3BlcnR5KGtleSkpe1xuICAgICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmhlYWRlcnMgJiYgIWlzRW1wdHkob3B0aW9ucy5oZWFkZXJzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJIZWFkZXJzIGNhbm5vdCBiZSBzZXQgb24gYW4gWERvbWFpblJlcXVlc3Qgb2JqZWN0XCIpXG4gICAgfVxuXG4gICAgaWYgKFwicmVzcG9uc2VUeXBlXCIgaW4gb3B0aW9ucykge1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gb3B0aW9ucy5yZXNwb25zZVR5cGVcbiAgICB9XG5cbiAgICBpZiAoXCJiZWZvcmVTZW5kXCIgaW4gb3B0aW9ucyAmJlxuICAgICAgICB0eXBlb2Ygb3B0aW9ucy5iZWZvcmVTZW5kID09PSBcImZ1bmN0aW9uXCJcbiAgICApIHtcbiAgICAgICAgb3B0aW9ucy5iZWZvcmVTZW5kKHhocilcbiAgICB9XG5cbiAgICAvLyBNaWNyb3NvZnQgRWRnZSBicm93c2VyIHNlbmRzIFwidW5kZWZpbmVkXCIgd2hlbiBzZW5kIGlzIGNhbGxlZCB3aXRoIHVuZGVmaW5lZCB2YWx1ZS5cbiAgICAvLyBYTUxIdHRwUmVxdWVzdCBzcGVjIHNheXMgdG8gcGFzcyBudWxsIGFzIGJvZHkgdG8gaW5kaWNhdGUgbm8gYm9keVxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbmF1Z3R1ci94aHIvaXNzdWVzLzEwMC5cbiAgICB4aHIuc2VuZChib2R5IHx8IG51bGwpXG5cbiAgICByZXR1cm4geGhyXG5cblxufVxuXG5mdW5jdGlvbiBnZXRYbWwoeGhyKSB7XG4gICAgLy8geGhyLnJlc3BvbnNlWE1MIHdpbGwgdGhyb3cgRXhjZXB0aW9uIFwiSW52YWxpZFN0YXRlRXJyb3JcIiBvciBcIkRPTUV4Y2VwdGlvblwiXG4gICAgLy8gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9YTUxIdHRwUmVxdWVzdC9yZXNwb25zZVhNTC5cbiAgICB0cnkge1xuICAgICAgICBpZiAoeGhyLnJlc3BvbnNlVHlwZSA9PT0gXCJkb2N1bWVudFwiKSB7XG4gICAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlWE1MXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZpcmVmb3hCdWdUYWtlbkVmZmVjdCA9IHhoci5yZXNwb25zZVhNTCAmJiB4aHIucmVzcG9uc2VYTUwuZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lID09PSBcInBhcnNlcmVycm9yXCJcbiAgICAgICAgaWYgKHhoci5yZXNwb25zZVR5cGUgPT09IFwiXCIgJiYgIWZpcmVmb3hCdWdUYWtlbkVmZmVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVhNTFxuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge31cblxuICAgIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuIiwibW9kdWxlLmV4cG9ydHMgPSBleHRlbmRcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gZXh0ZW5kKCkge1xuICAgIHZhciB0YXJnZXQgPSB7fVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuLy9JbXBvcnQgaGVscGVyc1xuXG52YXIgX2hlbHBlcnMgPSByZXF1aXJlKCcuL2hlbHBlcnMnKTtcblxuLy9JbXBvcnQgcGFydGlhbHNcblxudmFyIF9wYXJ0aWFsc19saXN0ID0gcmVxdWlyZSgnLi9wYXJ0aWFscy9fbGlzdCcpO1xuXG52YXIgX3BhcnRpYWxzX2xpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFydGlhbHNfbGlzdCk7XG5cbnZhciBIYW5kbGViYXJzID0gcmVxdWlyZSgnSGFuZGxlYmFycycpO1xuKDAsIF9oZWxwZXJzLmlmRXF1YWxzKSgpO1xuKDAsIF9wYXJ0aWFsc19saXN0MlsnZGVmYXVsdCddKSgpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBIYW5kbGViYXJzO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMloxYm1SeVlXbHpaWEl0YkdWaFpHVnlZbTloY21RdlltOTNaWEpmWTI5dGNHOXVaVzUwY3k5cWRYTjBaMmwyYVc1bkxYZHBaR2RsZEMxbWNtRnRaWGR2Y21zdlkyOXRjRzl1Wlc1MGN5OXNhV0l2U0dGdVpHeGxZbUZ5Y3k5b1lXNWtiR1ZpWVhKekxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSkJRVUZCTEZsQlFWa3NRMEZCUXpzN096czdPenM3T3p0MVFrRkxXU3hYUVVGWE96czdPelpDUVVsc1FpeHJRa0ZCYTBJN096czdRVUZRY0VNc1NVRkJTU3hWUVVGVkxFZEJRVWNzVDBGQlR5eERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRPMEZCU1haRExIZENRVUZWTEVOQlFVTTdRVUZKV0N4cFEwRkJUeXhEUVVGRE96dHhRa0ZGVHl4VlFVRlZJaXdpWm1sc1pTSTZJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMloxYm1SeVlXbHpaWEl0YkdWaFpHVnlZbTloY21RdlltOTNaWEpmWTI5dGNHOXVaVzUwY3k5cWRYTjBaMmwyYVc1bkxYZHBaR2RsZEMxbWNtRnRaWGR2Y21zdlkyOXRjRzl1Wlc1MGN5OXNhV0l2U0dGdVpHeGxZbUZ5Y3k5b1lXNWtiR1ZpWVhKekxtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpSjNWelpTQnpkSEpwWTNRbk8xeHlYRzVjY2x4dWJHVjBJRWhoYm1Sc1pXSmhjbk1nUFNCeVpYRjFhWEpsS0NkSVlXNWtiR1ZpWVhKekp5azdYSEpjYmx4eVhHNHZMMGx0Y0c5eWRDQm9aV3h3WlhKelhISmNibWx0Y0c5eWRDQjdJR2xtUlhGMVlXeHpJSDBnWm5KdmJTQW5MaTlvWld4d1pYSnpKenRjY2x4dWFXWkZjWFZoYkhNb0tUdGNjbHh1WEhKY2JpOHZTVzF3YjNKMElIQmhjblJwWVd4elhISmNibWx0Y0c5eWRDQmZiR2x6ZENCbWNtOXRJQ2N1TDNCaGNuUnBZV3h6TDE5c2FYTjBKenRjY2x4dVgyeHBjM1FvS1R0Y2NseHVYSEpjYm1WNGNHOXlkQ0JrWldaaGRXeDBJRWhoYm1Sc1pXSmhjbk03SWwxOSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHR2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmlmRXF1YWxzID0gaWZFcXVhbHM7XG52YXIgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ0hhbmRsZWJhcnMnKTtcblxuLyoqXHJcbiAqIFN0cmljdCBjb21wYXJpc29uIGhlbHBlciBmb3IgdXNlIGluIEhhbmRsZWJhcnMgdGVtcGxhdGVzXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBGaXJzdCBjb25kaXRpb24gdG8gY29tcGFyZVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gU2Vjb25kIGNvbmRpdGlvbiB0byBjb21wYXJlXHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgY29uZGl0aW9ucyBhcmUgZXF1YWxcclxuICovXG5cbmZ1bmN0aW9uIGlmRXF1YWxzKCkge1xuXHRIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdpZkVxdWFscycsIGZ1bmN0aW9uICh2MSwgdjIsIG9wdGlvbnMpIHtcblx0XHRpZiAodjEgPT09IHYyKSB7XG5cdFx0XHRyZXR1cm4gb3B0aW9ucy5mbih0aGlzKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcblx0fSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMloxYm1SeVlXbHpaWEl0YkdWaFpHVnlZbTloY21RdlltOTNaWEpmWTI5dGNHOXVaVzUwY3k5cWRYTjBaMmwyYVc1bkxYZHBaR2RsZEMxbWNtRnRaWGR2Y21zdlkyOXRjRzl1Wlc1MGN5OXNhV0l2U0dGdVpHeGxZbUZ5Y3k5b1pXeHdaWEp6TG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lKQlFVRkJMRmxCUVZrc1EwRkJRenM3T3pzN08wRkJSV0lzU1VGQlNTeFZRVUZWTEVkQlFVY3NUMEZCVHl4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRE96czdPenM3T3pzN1FVRlJhRU1zVTBGQlV5eFJRVUZSTEVkQlFVazdRVUZETTBJc1YwRkJWU3hEUVVGRExHTkJRV01zUTBGQlF5eFZRVUZWTEVWQlFVVXNWVUZCVlN4RlFVRkZMRVZCUVVVc1JVRkJSU3hGUVVGRkxFOUJRVThzUlVGQlJ6dEJRVU5vUlN4TlFVRkpMRVZCUVVVc1MwRkJTeXhGUVVGRkxFVkJRVWM3UVVGRFpDeFZRVUZQTEU5QlFVOHNRMEZCUXl4RlFVRkZMRU5CUVVVc1NVRkJTU3hEUVVGRkxFTkJRVU03UjBGRE0wSTdRVUZEUkN4VFFVRlBMRTlCUVU4c1EwRkJReXhQUVVGUExFTkJRVVVzU1VGQlNTeERRVUZGTEVOQlFVTTdSVUZEYUVNc1EwRkJReXhEUVVGRE8wTkJRMGdpTENKbWFXeGxJam9pUXpvdmRHVnRjQzlIUnk1R2NtOXVkRVZ1WkM1WGFXUm5aWFJ6TDNkcFpHZGxkSE12Wm5WdVpISmhhWE5sY2kxc1pXRmtaWEppYjJGeVpDOWliM2RsY2w5amIyMXdiMjVsYm5SekwycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5SVlXNWtiR1ZpWVhKekwyaGxiSEJsY25NdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUluZFhObElITjBjbWxqZENjN1hISmNibHh5WEc1c1pYUWdTR0Z1Wkd4bFltRnljeUE5SUhKbGNYVnBjbVVvSjBoaGJtUnNaV0poY25NbktUdGNjbHh1WEhKY2JpOHFLbHh5WEc0Z0tpQlRkSEpwWTNRZ1kyOXRjR0Z5YVhOdmJpQm9aV3h3WlhJZ1ptOXlJSFZ6WlNCcGJpQklZVzVrYkdWaVlYSnpJSFJsYlhCc1lYUmxjMXh5WEc0Z0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1JtbHljM1FnWTI5dVpHbDBhVzl1SUhSdklHTnZiWEJoY21WY2NseHVJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJRk5sWTI5dVpDQmpiMjVrYVhScGIyNGdkRzhnWTI5dGNHRnlaVnh5WEc0Z0tpQkFjbVYwZFhKdUlIdENiMjlzWldGdWZTQlhhR1YwYUdWeUlHTnZibVJwZEdsdmJuTWdZWEpsSUdWeGRXRnNYSEpjYmlBcUwxeHlYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdhV1pGY1hWaGJITWdLQ2tnZTF4eVhHNWNkRWhoYm1Sc1pXSmhjbk11Y21WbmFYTjBaWEpJWld4d1pYSW9KMmxtUlhGMVlXeHpKeXdnWm5WdVkzUnBiMjRvSUhZeExDQjJNaXdnYjNCMGFXOXVjeUFwSUh0Y2NseHVYSFFnSUdsbUtDQjJNU0E5UFQwZ2RqSWdLU0I3WEhKY2JseDBJQ0FnSUhKbGRIVnliaUJ2Y0hScGIyNXpMbVp1S0NCMGFHbHpJQ2s3WEhKY2JseDBJQ0I5WEhKY2JseDBJQ0J5WlhSMWNtNGdiM0IwYVc5dWN5NXBiblpsY25ObEtDQjBhR2x6SUNrN1hISmNibHgwZlNrN1hIUmNjbHh1ZlNCY2NseHVJbDE5IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG5cdHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IF9saXN0O1xudmFyIEhhbmRsZWJhcnMgPSByZXF1aXJlKCdIYW5kbGViYXJzJyk7XG5cbmZ1bmN0aW9uIF9saXN0KCkge1xuXHRIYW5kbGViYXJzLnJlZ2lzdGVyUGFydGlhbCgnbGlzdCcsICd7eyNpZkVxdWFscyBoYXNDYXJvdXNlbCBcXCd0cnVlXFwnfX1cXHRcXG4gICAgXFx0XFx0PGRpdiBjbGFzcz1cImNhcm91c2VsLXN0YWNrZWRcIiBkYXRhLWNhcm91c2VsPVwie3t2aWV3TmFtZX19XCI+XFxuXFx0XFx0XFx0XFx0PGJ1dHRvbiBjbGFzcz1cImJ0bi1pY29uLWwgY29udHJvbC1wcmV2XCIgZGF0YS1jb250cm9sLXByZXYgZGF0YS1hbmFseXRpY3MtZXZlbnQ9XCJHZXQgcHJldmlvdXMgcGFnZVwiIGRhdGEtYW5hbHl0aWNzLXN1YnR5cGU9XCJidXR0b25cIj5cXG5cXHRcXHRcXHRcXHRcXHQ8c3BhbiBjbGFzcz1cImhpZGVWaXN1YWxseVwiPlByZXZpb3VzIHBhZ2U8L3NwYW4+XFxuXFx0XFx0XFx0XFx0XFx0PHNwYW4gY2xhc3M9XCJidG4taWNvbi1jb250ZW50XCI+XFxuXFx0XFx0XFx0XFx0XFx0XFx0PHNwYW4gY2xhc3M9XCJzcHJpdGUtY2hldnJvbi11cC1sXCI+PC9zcGFuPlxcblxcdFxcdFxcdFxcdFxcdDwvc3Bhbj5cXG5cXHRcXHRcXHRcXHQ8L2J1dHRvbj5cXG5cXHRcXHRcXHRcXHQ8ZGl2IGNsYXNzPVwiY2Fyb3VzZWwtYXBlcnR1cmVcIiBkYXRhLWNhcm91c2VsLWFwZXJ0dXJlPlxcblxcdFxcdFxcdFxcdFxcdDx1bCBjbGFzcz1cImxpc3Qtc3RhY2tlZC1kaXZpZGVyXCIgZGF0YS1jYXJvdXNlbC1saXN0IGRhdGEtdmlldy17e3ZpZXdOYW1lfX0tbGlzdD48L3VsPlxcblxcdFxcdFxcdFxcdDwvZGl2PlxcblxcdFxcdFxcdFxcdDxidXR0b24gY2xhc3M9XCJidG4tdGVydGlhcnkgYnRuLXRleHQtbSBjb250cm9sLW5leHRcIiBkYXRhLWNvbnRyb2wtbmV4dCBkYXRhLWFuYWx5dGljcy1ldmVudD1cIkdldCBuZXh0IHBhZ2VcIiBkYXRhLWFuYWx5dGljcy1zdWJ0eXBlPVwiYnV0dG9uXCI+XFxuXFx0XFx0XFx0XFx0XFx0PHNwYW4gY2xhc3M9XCJidG4tdGV4dC1jb250ZW50XCI+U2hvdyBtb3JlPC9zcGFuPlxcblxcdFxcdFxcdFxcdFxcdDxzcGFuIGNsYXNzPVwicHJvZ3Jlc3Mtc3Bpbm5lclwiPlxcblxcdFxcdFxcdFxcdFxcdFxcdDxzcGFuIGNsYXNzPVwiaGlkZVZpc3VhbGx5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+UGxlYXNlIHdhaXQgYSBtb21lbnQsIGRhdGEgaXMgbG9hZGluZzwvc3Bhbj5cXG5cXHRcXHRcXHRcXHRcXHQ8L3NwYW4+XFxuXFx0XFx0XFx0XFx0PC9idXR0b24+XFxuXFx0XFx0XFx0PC9kaXY+XFxuXFx0XFx0e3svaWZFcXVhbHN9fVxcblxcdFxcdDx1bCBjbGFzcz1cImxpc3Qtc3RhY2tlZC1kaXZpZGVyXCIgZGF0YS12aWV3LXt7dmlld05hbWV9fS1saXN0PjwvdWw+Jyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJaMWJtUnlZV2x6WlhJdGJHVmhaR1Z5WW05aGNtUXZZbTkzWlhKZlkyOXRjRzl1Wlc1MGN5OXFkWE4wWjJsMmFXNW5MWGRwWkdkbGRDMW1jbUZ0WlhkdmNtc3ZZMjl0Y0c5dVpXNTBjeTlzYVdJdlNHRnVaR3hsWW1GeWN5OXdZWEowYVdGc2N5OWZiR2x6ZEM1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRkJRU3haUVVGWkxFTkJRVU03T3pzN08zRkNRVWxYTEV0QlFVczdRVUZHTjBJc1NVRkJTU3hWUVVGVkxFZEJRVWNzVDBGQlR5eERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRPenRCUVVWNFFpeFRRVUZUTEV0QlFVc3NSMEZCU1R0QlFVTm9ReXhYUVVGVkxFTkJRVU1zWlVGQlpTeERRVUZETEUxQlFVMHNhMjFEUVhGQ2FFTXNRMEZCUXp0RFFVTkdJaXdpWm1sc1pTSTZJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMloxYm1SeVlXbHpaWEl0YkdWaFpHVnlZbTloY21RdlltOTNaWEpmWTI5dGNHOXVaVzUwY3k5cWRYTjBaMmwyYVc1bkxYZHBaR2RsZEMxbWNtRnRaWGR2Y21zdlkyOXRjRzl1Wlc1MGN5OXNhV0l2U0dGdVpHeGxZbUZ5Y3k5d1lYSjBhV0ZzY3k5ZmJHbHpkQzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpZDFjMlVnYzNSeWFXTjBKenRjY2x4dVhISmNibXhsZENCSVlXNWtiR1ZpWVhKeklEMGdjbVZ4ZFdseVpTZ25TR0Z1Wkd4bFltRnljeWNwTzF4eVhHNWNjbHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdablZ1WTNScGIyNGdYMnhwYzNRZ0tDa2dlMXh5WEc1Y2RFaGhibVJzWldKaGNuTXVjbVZuYVhOMFpYSlFZWEowYVdGc0tDZHNhWE4wSnl4Y2NseHVJQ0FnSUZ4MFlIdDdJMmxtUlhGMVlXeHpJR2hoYzBOaGNtOTFjMlZzSUNkMGNuVmxKMzE5WEhSY2NseHVJQ0FnSUZ4MFhIUThaR2wySUdOc1lYTnpQVndpWTJGeWIzVnpaV3d0YzNSaFkydGxaRndpSUdSaGRHRXRZMkZ5YjNWelpXdzlYQ0o3ZTNacFpYZE9ZVzFsZlgxY0lqNWNjbHh1WEhSY2RGeDBYSFE4WW5WMGRHOXVJR05zWVhOelBWd2lZblJ1TFdsamIyNHRiQ0JqYjI1MGNtOXNMWEJ5WlhaY0lpQmtZWFJoTFdOdmJuUnliMnd0Y0hKbGRpQmtZWFJoTFdGdVlXeDVkR2xqY3kxbGRtVnVkRDFjSWtkbGRDQndjbVYyYVc5MWN5QndZV2RsWENJZ1pHRjBZUzFoYm1Gc2VYUnBZM010YzNWaWRIbHdaVDFjSW1KMWRIUnZibHdpUGx4eVhHNWNkRngwWEhSY2RGeDBQSE53WVc0Z1kyeGhjM005WENKb2FXUmxWbWx6ZFdGc2JIbGNJajVRY21WMmFXOTFjeUJ3WVdkbFBDOXpjR0Z1UGx4eVhHNWNkRngwWEhSY2RGeDBQSE53WVc0Z1kyeGhjM005WENKaWRHNHRhV052YmkxamIyNTBaVzUwWENJK1hISmNibHgwWEhSY2RGeDBYSFJjZER4emNHRnVJR05zWVhOelBWd2ljM0J5YVhSbExXTm9aWFp5YjI0dGRYQXRiRndpUGp3dmMzQmhiajVjY2x4dVhIUmNkRngwWEhSY2REd3ZjM0JoYmo1Y2NseHVYSFJjZEZ4MFhIUThMMkoxZEhSdmJqNWNjbHh1WEhSY2RGeDBYSFE4WkdsMklHTnNZWE56UFZ3aVkyRnliM1Z6Wld3dFlYQmxjblIxY21WY0lpQmtZWFJoTFdOaGNtOTFjMlZzTFdGd1pYSjBkWEpsUGx4eVhHNWNkRngwWEhSY2RGeDBQSFZzSUdOc1lYTnpQVndpYkdsemRDMXpkR0ZqYTJWa0xXUnBkbWxrWlhKY0lpQmtZWFJoTFdOaGNtOTFjMlZzTFd4cGMzUWdaR0YwWVMxMmFXVjNMWHQ3ZG1sbGQwNWhiV1Y5ZlMxc2FYTjBQand2ZFd3K1hISmNibHgwWEhSY2RGeDBQQzlrYVhZK1hISmNibHgwWEhSY2RGeDBQR0oxZEhSdmJpQmpiR0Z6Y3oxY0ltSjBiaTEwWlhKMGFXRnllU0JpZEc0dGRHVjRkQzF0SUdOdmJuUnliMnd0Ym1WNGRGd2lJR1JoZEdFdFkyOXVkSEp2YkMxdVpYaDBJR1JoZEdFdFlXNWhiSGwwYVdOekxXVjJaVzUwUFZ3aVIyVjBJRzVsZUhRZ2NHRm5aVndpSUdSaGRHRXRZVzVoYkhsMGFXTnpMWE4xWW5SNWNHVTlYQ0ppZFhSMGIyNWNJajVjY2x4dVhIUmNkRngwWEhSY2REeHpjR0Z1SUdOc1lYTnpQVndpWW5SdUxYUmxlSFF0WTI5dWRHVnVkRndpUGxOb2IzY2diVzl5WlR3dmMzQmhiajVjY2x4dVhIUmNkRngwWEhSY2REeHpjR0Z1SUdOc1lYTnpQVndpY0hKdlozSmxjM010YzNCcGJtNWxjbHdpUGx4eVhHNWNkRngwWEhSY2RGeDBYSFE4YzNCaGJpQmpiR0Z6Y3oxY0ltaHBaR1ZXYVhOMVlXeHNlVndpSUdGeWFXRXRhR2xrWkdWdVBWd2lkSEoxWlZ3aVBsQnNaV0Z6WlNCM1lXbDBJR0VnYlc5dFpXNTBMQ0JrWVhSaElHbHpJR3h2WVdScGJtYzhMM053WVc0K1hISmNibHgwWEhSY2RGeDBYSFE4TDNOd1lXNCtYSEpjYmx4MFhIUmNkRngwUEM5aWRYUjBiMjQrWEhKY2JseDBYSFJjZER3dlpHbDJQbHh5WEc1Y2RGeDBlM3N2YVdaRmNYVmhiSE45ZlZ4eVhHNWNkRngwUEhWc0lHTnNZWE56UFZ3aWJHbHpkQzF6ZEdGamEyVmtMV1JwZG1sa1pYSmNJaUJrWVhSaExYWnBaWGN0ZTN0MmFXVjNUbUZ0WlgxOUxXeHBjM1ErUEM5MWJENWdYSEpjYmx4MEtUdGNjbHh1ZlNKZGZRPT0iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0dmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG52YXIgX2pzRE9NR2V0VmVuZG9yUHJvcGVydHkgPSByZXF1aXJlKCcuLi9qcy9ET00vZ2V0VmVuZG9yUHJvcGVydHknKTtcblxudmFyIF9qc0RPTUdldFZlbmRvclByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2pzRE9NR2V0VmVuZG9yUHJvcGVydHkpO1xuXG4vKipcclxuICogQWRkIGEgY2Fyb3VzZWwgdG8gYSBsaXN0IHZpZXdcclxuICogQGNsYXNzZGVzYyBBZGQgYSBjYXJvdXNlbCBmb3IgcGFnaW5hdGlvbiBvZiBjYXJkIGxpc3Qgdmlld3NcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMudmlldy4gVGhlIHZpZXcgdGhhdCB0aGUgY2Fyb3VzZWwgcGFnaW5hdGVzIFtyZXF1aXJlZF1cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMud2lkZ2V0LiBUaGUgd2lkZ2V0IGluc3RhbmNlIFtyZXF1aXJlZF1cclxuICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMucGFnZVNpemUuIFRoZSBudW1iZXIgb2YgbGlzdCBpdGVtcyB0byBzaG93IGluIGVhY2ggY2Fyb3VzZWwgcGFnZVxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMuaXNJbmZpbml0ZS4gV2hldGhlciB0aGUgY29sbGVjdGlvbiBkaXNwbGF5ZWQgaXMgcGFnaW5hdGVkIG9uIHRoZSBSRVNUIEFQSVxyXG4gKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5uZXh0UGFnZUJ1ZmZlci4gTnVtYmVyIG9mIGNhcm91c2VsIHBhZ2VzIGJlZm9yZSB0aGUgbGFzdCBhdCB3aGljaCB0byBmZXRjaCBuZXh0IEFQSSBwYWdlLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5lbC4gVGhlIGNhcm91c2VsIHBhcmVudCBlbGVtZW50XHJcbiAqIEBjbGFzcyBTZXQgY2Fyb3VzZWwgaW5zdGFuY2UgcHJvcGVydGllczsgY2FjaGUgYXBlcnR1cmUsIGNvbnRyb2wgYW5kIGxpc3QgZWxlbWVudHM7IHNldCBjdXJyZW50IHBhZ2U7IFxyXG4gKi9cbnZhciBIYW1tZXIgPSByZXF1aXJlKCdoYW1tZXJqcycpO1xuXG52YXIgQ2Fyb3VzZWwgPSAoZnVuY3Rpb24gKCkge1xuXHRmdW5jdGlvbiBDYXJvdXNlbCgpIHtcblx0XHR2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdO1xuXG5cdFx0dmFyIHZpZXcgPSBfcmVmLnZpZXc7XG5cdFx0dmFyIHdpZGdldCA9IF9yZWYud2lkZ2V0O1xuXHRcdHZhciBwYWdlU2l6ZSA9IF9yZWYucGFnZVNpemU7XG5cdFx0dmFyIGlzSW5maW5pdGUgPSBfcmVmLmlzSW5maW5pdGU7XG5cdFx0dmFyIG5leHRQYWdlQnVmZmVyID0gX3JlZi5uZXh0UGFnZUJ1ZmZlcjtcblx0XHR2YXIgZWwgPSBfcmVmLmVsO1xuXHRcdHZhciBzd2lwZSA9IF9yZWYuc3dpcGU7XG5cblx0XHRfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2Fyb3VzZWwpO1xuXG5cdFx0dGhpcy52aWV3ID0gdmlldztcblx0XHR0aGlzLndpZGdldCA9IHdpZGdldDtcblx0XHR0aGlzLnBhZ2VTaXplID0gcGFnZVNpemUgfHwgMztcblx0XHR0aGlzLmlzSW5maW5pdGUgPSBpc0luZmluaXRlO1xuXHRcdHRoaXMuc3dpcGUgPSBzd2lwZTtcblx0XHR0aGlzLm5leHRQYWdlQnVmZmVyID0gbmV4dFBhZ2VCdWZmZXIgfHwgMjtcblx0XHR0aGlzLmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7XG5cdFx0aWYgKCF0aGlzLmVsIHx8ICF0aGlzLndpZGdldCB8fCAhdGhpcy52aWV3KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMudmlldy5jYXJvdXNlbCA9IHRoaXM7XG5cdFx0dGhpcy5hcGVydHVyZSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtY2Fyb3VzZWwtYXBlcnR1cmVdJyk7XG5cdFx0dGhpcy5idG5OZXh0ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jb250cm9sLW5leHRdJyk7XG5cdFx0dGhpcy5idG5QcmV2ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jb250cm9sLXByZXZdJyk7XG5cdFx0dGhpcy5zdHJpcCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtY2Fyb3VzZWwtbGlzdF0nKTtcblx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcblx0XHR0aGlzLmluaXQoKTtcblx0fVxuXG5cdC8qKlxyXG4gICogSW5pdGlhbGlzZSB0aGUgY2Fyb3VzZWxcclxuICAqL1xuXG5cdF9jcmVhdGVDbGFzcyhDYXJvdXNlbCwgW3tcblx0XHRrZXk6ICdpbml0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gaW5pdCgpIHtcblx0XHRcdHRoaXMubGFzdFBhZ2UgPSB0aGlzLmdldExhc3RQYWdlKCk7XG5cdFx0XHR0aGlzLnRyYW5zbGF0ZTNkID0gd2luZG93Ll9qZ3dpZGdldC5mZWF0dXJlcy5jc3N0cmFuc2Zvcm1zM2Q7XG5cdFx0XHR0aGlzLmlzSW5maW5pdGUgJiYgdGhpcy5nZXRNYXhQYWdlKCk7XG5cdFx0XHR0aGlzLnNldEFwZXJ0dXJlKCk7XG5cdFx0XHR0aGlzLnNldENvbnRyb2xTdGF0ZSgpO1xuXHRcdFx0dGhpcy5iaW5kTGlzdGVuZXJzKCk7XG5cdFx0XHR0aGlzLnNldENhcmRTdGF0ZSgpO1xuXHRcdFx0dGhpcy5pc0J1ZmZlcigpICYmIHRoaXMubG9hZE1vcmVDYXJkcygpO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqIFNldCB0aGUgYXBlcnR1cmUgb2YgdGhlIGNhcm91c2VsXHJcbiAgICogQGRlc2NyaXB0aW9uIFNldCB0aGUgc2l6ZSBvZiB0aGUgYXBlcnR1cmUgYmFzZWQgb24gc3BlY2lmaWVkIHBhZ2Ugc2l6ZS4gQXNzdW1lcyBhbGwgY2FyZHMgaGF2ZSB0aGUgc2FtZSBoZWlnaHQuXHJcbiAgICovXG5cdH0sIHtcblx0XHRrZXk6ICdzZXRBcGVydHVyZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHNldEFwZXJ0dXJlKCkge1xuXHRcdFx0dmFyIGNhcmQgPSB0aGlzLmFwZXJ0dXJlLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhcmRdJyk7XG5cdFx0XHR0aGlzLmFwZXJ0dXJlU2l6ZSA9IChjYXJkLm9mZnNldEhlaWdodCArIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoY2FyZCkubWFyZ2luQm90dG9tLCAxMCkgKyBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGNhcmQpLm1hcmdpblRvcCwgMTApKSAqIHRoaXMucGFnZVNpemU7XG5cdFx0XHR0aGlzLmFwZXJ0dXJlLnN0eWxlLmhlaWdodCA9IHRoaXMuYXBlcnR1cmVTaXplICsgJ3B4Jztcblx0XHR9XG5cblx0XHQvKipcclxuICAgKiBHZXQgdGhlIFtjdXJyZW50XSBsYXN0IHBhZ2Ugb2YgdGhlIGNhcm91c2VsXHJcbiAgICogQGRlc2NyaXB0aW9uIEZpbmRzIHRoZSBsYXN0IHBhZ2UgbnVtYmVyIG9mIHRoZSBjYXJvdXNlbC4gU3ViamVjdCB0byB1cGRhdGUgaWYgdGhlIGNhcm91c2VsIGlzIGluZmluaXRlXHJcbiAgICogQHJldHVybnMge051bWJlcn0gSW50ZWdlciByZXByZXNlbnRpbmcgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGxhc3QgY2Fyb3VzZWwgcGFnZS5cclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ2dldExhc3RQYWdlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gZ2V0TGFzdFBhZ2UoKSB7XG5cdFx0XHR2YXIgY2FyZENvdW50ID0gdGhpcy5hcGVydHVyZS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jYXJkXScpLmxlbmd0aDtcblx0XHRcdHJldHVybiBwYXJzZUludChjYXJkQ291bnQgLyB0aGlzLnBhZ2VTaXplLCAxMCkgKyAoY2FyZENvdW50ICUgdGhpcy5wYWdlU2l6ZSA+IDAgPyAxIDogMCk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogR2V0IHRoZSBtYXhpbXVtIHBhZ2Ugb2YgdGhlIGNhcm91c2VsXHJcbiAgICogQGRlc2NyaXB0aW9uIEZvciBpbmZpbml0ZSBjYXJvdXNlbHMsIGZpbmRzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHBhZ2UgbnVtYmVyIG9mIHRoZSBjYXJvdXNlbFxyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnZ2V0TWF4UGFnZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGdldE1heFBhZ2UoKSB7XG5cdFx0XHR0aGlzLm1heFBhZ2UgPSBwYXJzZUludChwYXJzZUludCh0aGlzLnZpZXcubW9kZWwuJG1vZGVsLnBhZ2luYXRpb24udG90YWxSZXN1bHRzLCAxMCkgLyB0aGlzLnBhZ2VTaXplLCAxMCkgKyAodGhpcy52aWV3Lm1vZGVsLiRtb2RlbC5wYWdpbmF0aW9uLnRvdGFsUmVzdWx0cyAlIHRoaXMucGFnZVNpemUgPiAwID8gMSA6IDApO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqIFNldCBhIGZsYWcgd2hlbiBhbGwgcG9zc2libGUgZGF0YSBoYXMgYmVlbiBmZXRjaGVkXHJcbiAgICogQGRlc2NyaXB0aW9uIEZvciBpbmZpbml0ZSBjYXJvdXNlbHMsIHNldHMgYSBmbGFnIHdoZW4gdGhlIGxhc3QgQVBJIHBhZ2UgaGFzIGJlZW4gZmV0Y2hlZCBhbmQgYWRkZWQgdG8gdGhlIG1vZGVsJ3MgY29sbGVjdGlvblxyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnc2V0TWF4TG9hZGVkJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gc2V0TWF4TG9hZGVkKCkge1xuXHRcdFx0aWYgKHRoaXMuaXNNYXhMb2FkZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5pc01heExvYWRlZCA9IHRoaXMuY3VycmVudFBhZ2UgPT09IHRoaXMubWF4UGFnZTtcblx0XHR9XG5cblx0XHQvKipcclxuICAgKiBCaW5kIGV2ZW50IGxpc3RlbmVyc1xyXG4gICAqIEBkZXNjcmlwdGlvbiBCaW5kIGV2ZW50IGxpc3RlbmVycyB0byBET00gbm9kZXMgZm9yIGNhcm91c2VsIHVzZXIgaW50ZXJhY3Rpb25cclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ2JpbmRMaXN0ZW5lcnMnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBiaW5kTGlzdGVuZXJzKCkge1xuXHRcdFx0dmFyIF90aGlzID0gdGhpcztcblxuXHRcdFx0dGhpcy5idG5OZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gX3RoaXMuc2hvd05leHRQYWdlKCk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuYnRuUHJldi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIF90aGlzLnNob3dQcmV2UGFnZSgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vU3dpcGUgd2l0aCBIYW1tZXJcblx0XHRcdGlmICh0aGlzLnN3aXBlKSB7XG5cdFx0XHRcdHZhciBoYW1tZXIgPSBuZXcgSGFtbWVyKHRoaXMuc3RyaXAsIHtcblx0XHRcdFx0XHR2ZWxvY2l0eTogMC4xNVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKHRoaXMuc3dpcGUgPT09ICd2ZXJ0aWNhbCcpIHtcblx0XHRcdFx0XHRoYW1tZXIuZ2V0KCdzd2lwZScpLnNldCh7IGRpcmVjdGlvbjogSGFtbWVyLkRJUkVDVElPTl9WRVJUSUNBTCB9KTtcblx0XHRcdFx0XHRoYW1tZXIub24oJ3N3aXBlJywgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRcdGUuZGlyZWN0aW9uID09PSA4ICYmIF90aGlzLnNob3dOZXh0UGFnZSgpO1xuXHRcdFx0XHRcdFx0ZS5kaXJlY3Rpb24gPT09IDE2ICYmIF90aGlzLnNob3dQcmV2UGFnZSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuc3dpcGUgPT09ICdob3Jpem9udGFsJykge1xuXHRcdFx0XHRcdGhhbW1lci5vbignc3dpcGVsZWZ0JywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIF90aGlzLnNob3dOZXh0UGFnZSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGhhbW1lci5vbignc3dpcGVyaWdodCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBfdGhpcy5zaG93UHJldlBhZ2UoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqIFNldCBzdGF0ZSBvZiBjYXJvdXNlbCBjb250cm9sc1xyXG4gICAqIEBkZXNjcmlwdGlvbiBTZXQgdGhlIHN0YXRlIG9mIGNhcm91c2VsIGNvbnRyb2xzIFtlbmFibGVkLCBkaXNhYmxlZF0gYmFzZWQgb24gY3VycmVudCBjYXJvdXNlbCBwYWdlXHJcbiAgICovXG5cdH0sIHtcblx0XHRrZXk6ICdzZXRDb250cm9sU3RhdGUnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBzZXRDb250cm9sU3RhdGUoKSB7XG5cdFx0XHRpZiAodGhpcy5jdXJyZW50UGFnZSA9PT0gMSkge1xuXHRcdFx0XHR0aGlzLmJ0blByZXYuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuXHRcdFx0XHR0aGlzLmJ0blByZXYuc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgJ3RydWUnKTtcblx0XHRcdFx0dGhpcy5idG5QcmV2LmNsYXNzTGlzdC5hZGQoJ2lzLWRpc2FibGVkJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmJ0blByZXYucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuXHRcdFx0XHR0aGlzLmJ0blByZXYucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJyk7XG5cdFx0XHRcdHRoaXMuYnRuUHJldi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1kaXNhYmxlZCcpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuY3VycmVudFBhZ2UgPT09IHRoaXMubGFzdFBhZ2UpIHtcblx0XHRcdFx0dGhpcy5idG5OZXh0LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcblx0XHRcdFx0dGhpcy5idG5OZXh0LnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsICd0cnVlJyk7XG5cdFx0XHRcdHRoaXMuYnRuTmV4dC5jbGFzc0xpc3QuYWRkKCdpcy1kaXNhYmxlZCcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5idG5OZXh0LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcblx0XHRcdFx0dGhpcy5idG5OZXh0LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcpO1xuXHRcdFx0XHR0aGlzLmJ0bk5leHQuY2xhc3NMaXN0LnJlbW92ZSgnaXMtZGlzYWJsZWQnKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcclxuICAgKiBTaG93IHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIGNhcm91c2VsXHJcbiAgICogQGRlc2NyaXB0aW9uIFRyYW5zaXRpb24gdGhlIGxpc3QgdG8gc2hvdyB0aGUgbmV4dCBwYWdlOyBmZXRjaCBtb3JlIGNhcmRzIGlmIHdlIGFyZSBvbiB0aGUgYnVmZmVyIHBhZ2UgW2luZmluaXRlIGNhcm91c2Vsc107IFxyXG4gICAqIHNldCBtYXggbG9hZGVkIGZsYWc7IHNldCBjb250cm9sbGVyIHN0YXRlOyBzZXQgY2FyZHMgc3RhdGUgYW5kIGZpcmUgYW5hbHl0aWNzIGltcHJlc3Npb25zIGZvciBuZXdseSB2aXNpYmxlIGNhcmRzXHJcbiAgICovXG5cdH0sIHtcblx0XHRrZXk6ICdzaG93TmV4dFBhZ2UnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBzaG93TmV4dFBhZ2UoKSB7XG5cdFx0XHRpZiAodGhpcy5jdXJyZW50UGFnZSArIDEgPiB0aGlzLmxhc3RQYWdlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMudHJhbnNpdGlvbih0aGlzLmFwZXJ0dXJlU2l6ZSAqIHRoaXMuY3VycmVudFBhZ2UpO1xuXHRcdFx0dGhpcy5jdXJyZW50UGFnZSArPSAxO1xuXG5cdFx0XHRpZiAodGhpcy5pc0J1ZmZlcigpKSB7XG5cdFx0XHRcdHRoaXMubG9hZE1vcmVDYXJkcygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5zZXRDb250cm9sU3RhdGUoKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuc2V0TWF4TG9hZGVkKCk7XG5cdFx0XHR0aGlzLnNldENhcmRTdGF0ZSgpO1xuXHRcdFx0dGhpcy53aWRnZXQuYW5hbHl0aWNzLmNhcmRJbXByZXNzaW9ucygpO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqIFNob3cgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIGNhcm91c2VsXHJcbiAgICogQGRlc2NyaXB0aW9uIFRyYW5zaXRpb24gdGhlIGxpc3QgdG8gc2hvdyB0aGUgcHJldmlvdXMgcGFnZTsgc2V0IGNvbnRyb2xsZXIgc3RhdGU7XHJcbiAgICogc2V0IGNhcmRzIHN0YXRlIGFuZCBmaXJlIGFuYWx5dGljcyBpbXByZXNzaW9ucyBmb3IgbmV3bHkgdmlzaWJsZSBjYXJkc1xyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnc2hvd1ByZXZQYWdlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gc2hvd1ByZXZQYWdlKCkge1xuXHRcdFx0aWYgKHRoaXMuY3VycmVudFBhZ2UgLSAxIDwgMSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmN1cnJlbnRQYWdlIC09IDE7XG5cdFx0XHR0aGlzLnRyYW5zaXRpb24odGhpcy5hcGVydHVyZVNpemUgKiB0aGlzLmN1cnJlbnRQYWdlIC0gdGhpcy5hcGVydHVyZVNpemUpO1xuXHRcdFx0dGhpcy5zZXRDb250cm9sU3RhdGUoKTtcblx0XHRcdHRoaXMuc2V0Q2FyZFN0YXRlKCk7XG5cdFx0XHR0aGlzLndpZGdldC5hbmFseXRpY3MuY2FyZEltcHJlc3Npb25zKCk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogVHJhbnNpdGlvbiB0aGUgbGlzdFxyXG4gICAqIEBkZXNjcmlwdGlvbiBUcmFuc2l0aW9uIHRoZSBsaXN0IHRvIHNob3cgbmV3IGNhcmRzLCB1c2luZyBlaXRoZXIgJ3RyYW5zZm9ybSB0cmFuc2xhdGUzZCcgaWYgc3VwcG9ydGVkIG9yICd0b3AnIG90aGVyd2lzZS5cclxuICAgKiBBc3N1bWVzIHRoZSBsaXN0IGhhcyBhIHRyYW5zaXRpb24gQ1NTIHByb3BlcnR5IHJlZ2lzdGVyZWQgYWdhaW5zdCAnYWxsJyBvciAndG9wJyBhbmQgJ3RyYW5zZm9ybSdcclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ3RyYW5zaXRpb24nLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiB0cmFuc2l0aW9uKHRvcCkge1xuXHRcdFx0aWYgKHRoaXMudHJhbnNsYXRlM2QpIHtcblx0XHRcdFx0dGhpcy5zdHJpcC5zdHlsZVsoMCwgX2pzRE9NR2V0VmVuZG9yUHJvcGVydHkyWydkZWZhdWx0J10pKCd0cmFuc2Zvcm0nKV0gPSAndHJhbnNsYXRlM2QoMCwgLScgKyB0b3AgKyAncHgsIDApJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuc3RyaXAuc3R5bGUudG9wID0gJy0nICsgdG9wICsgJ3B4Jztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcclxuICAgKiBTZXQgdGhlIGN1cnJlbnQgc3RhdGUgZmxhZ3Mgb2YgdGhlIGNhcmRzXHJcbiAgICogQGRlc2NyaXB0aW9uIFJlc2V0IGFsbCBjYXJkcyB0byBoaWRkZW4gW2FyaWEtLCBkYXRhLV07IHNldCB2aXNpYmxlIGNhcmRzIHRvICd2aXNpYmxlJyBbYXJpYS0sIGRhdGEtXVxyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnc2V0Q2FyZFN0YXRlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gc2V0Q2FyZFN0YXRlKCkge1xuXHRcdFx0dGhpcy5maXJzdENhcmQgPSB0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSAtIHRoaXMucGFnZVNpemU7XG5cdFx0XHR0aGlzLmxhc3RDYXJkID0gdGhpcy5maXJzdENhcmQgKyAodGhpcy5wYWdlU2l6ZSAtIDEpO1xuXG5cdFx0XHRbXS5zbGljZS5jYWxsKHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY2FyZF0nKSkuZm9yRWFjaChmdW5jdGlvbiAoY2FyZCkge1xuXHRcdFx0XHRjYXJkLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXHRcdFx0XHRjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1oaWRkZW4nLCAndHJ1ZScpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGZvciAodmFyIGkgPSB0aGlzLmZpcnN0Q2FyZDsgaSA8IHRoaXMubGFzdENhcmQgKyAxOyBpKyspIHtcblx0XHRcdFx0dmFyIGNhcmQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWNhcmRdJylbaV07XG5cdFx0XHRcdGlmICghY2FyZCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhcmQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xuXHRcdFx0XHRjYXJkLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1oaWRkZW4nKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcclxuICAgKiBDaGVjayBpZiB3ZSBhcmUgb24gYnVmZmVyIHBhZ2VcclxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2sgaWYgd2UgYXJlIG9uIHRoZSBjYXJvdXNlbCBwYWdlIHNldCBhcyBuZXh0UGFnZUJ1ZmZlclxyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnaXNCdWZmZXInLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBpc0J1ZmZlcigpIHtcblx0XHRcdHJldHVybiB0aGlzLmlzSW5maW5pdGUgJiYgdGhpcy5jdXJyZW50UGFnZSA9PT0gdGhpcy5sYXN0UGFnZSAtIHRoaXMubmV4dFBhZ2VCdWZmZXIgJiYgIXRoaXMuaXNNYXhMb2FkZWQ7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogTG9hZCBtb3JlIGNhcmRzIGZldGNoZWQgZnJvbSB0aGUgc2VydmVyIFtpbmZpbml0ZSBjYXJvdXNlbHNdXHJcbiAgICogQGRlc2NyaXB0aW9uIFRyaWdnZXIgdGhlIHZpZXcgdG8gZmV0Y2ggYW5kIGFwcGVuZCB0aGUgbmV4dCBBUEkgcGFnZSBvZiByZXN1bHRzIFtjYXJkc107IHNldCBjb250cm9scyBzdGF0ZSB3aGlsc3QgZGF0YSBpc1xyXG4gICAqIGJlaW5nIGxvYWRlZDsgb25jZSBsb2FkZWQgdHJpZ2dlciBuZXcgYW5hbHl0aWNzIGNhcmRzIGluaXRpYWxpc2U7IHVwZGF0ZSBjYXJvdXNlbCBhbmQgY2FyZCBzdGF0ZSB2YXJpYWJsZXM7IHJldmVydFxyXG4gICAqIGNvbnRyb2xzIHN0YXRlc1xyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnbG9hZE1vcmVDYXJkcycsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGxvYWRNb3JlQ2FyZHMoKSB7XG5cdFx0XHR2YXIgX3RoaXMyID0gdGhpcztcblxuXHRcdFx0dGhpcy5idG5OZXh0LmNsYXNzTGlzdC5hZGQoJ2lzLWxvYWRpbmcnLCAnaXMtZGlzYWJsZWQnKTtcblx0XHRcdHRoaXMuYnRuTmV4dC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG5cdFx0XHR0aGlzLnZpZXcuYXBwZW5kTmV4dFBhZ2UoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0X3RoaXMyLndpZGdldC5hbmFseXRpY3MuY2FyZHNJbml0KCk7XG5cdFx0XHRcdF90aGlzMi5sYXN0UGFnZSA9IF90aGlzMi5nZXRMYXN0UGFnZSgpO1xuXHRcdFx0XHRfdGhpczIuc2V0Q2FyZFN0YXRlKCk7XG5cdFx0XHRcdF90aGlzMi5zZXRDb250cm9sU3RhdGUoKTtcblx0XHRcdFx0X3RoaXMyLmJ0bk5leHQuY2xhc3NMaXN0LnJlbW92ZSgnaXMtbG9hZGluZycsICdpcy1kaXNhYmxlZCcpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogUmVzZXQgdGhlIGNhcm91c2VsIHRvIGZpcnN0IHBhZ2VcclxuICAgKiBAZGVzY3JpcHRpb24gUmVzZXQgdGhlIGNhcm91c2VsIHRvIHNob3cgdGhlIGZpcnN0IHBhZ2U7IHJlc2V0IGFsbCBjYXJvdXNlbCBzdGF0ZSB2YXJpYWJsZXMgYW5kIHNldCBjb250cm9scyBzdGF0ZTtcclxuICAgKiBjaGVjayBpZiB3ZSBhcmUgb24gYnVmZmVyIHBhZ2UgYW5kIGlmIHRydWUgbG9hZCBtb3JlIGNhcmRzXHJcbiAgICovXG5cdH0sIHtcblx0XHRrZXk6ICdyZXNldCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuXHRcdFx0dGhpcy50cmFuc2l0aW9uKDApO1xuXHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XG5cdFx0XHR0aGlzLmxhc3RQYWdlID0gdGhpcy5nZXRMYXN0UGFnZSgpO1xuXHRcdFx0dGhpcy5pc01heExvYWRlZCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5zZXRDb250cm9sU3RhdGUoKTtcblx0XHRcdHRoaXMuc2V0Q2FyZFN0YXRlKCk7XG5cdFx0XHR0aGlzLmlzQnVmZmVyKCkgJiYgdGhpcy5sb2FkTW9yZUNhcmRzKCk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogUmVmcmVzaCB0aGUgY2Fyb3VzZWxcclxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlIGNhcm91c2VsIHN0YXRlIHZhcmlhYmxlcyBsYXN0IHBhZ2VcclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ3JlZnJlc2gnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiByZWZyZXNoKCkge1xuXHRcdFx0dGhpcy5sYXN0UGFnZSA9IHRoaXMuZ2V0TGFzdFBhZ2UoKTtcblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gQ2Fyb3VzZWw7XG59KSgpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBDYXJvdXNlbDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJaMWJtUnlZV2x6WlhJdGJHVmhaR1Z5WW05aGNtUXZZbTkzWlhKZlkyOXRjRzl1Wlc1MGN5OXFkWE4wWjJsMmFXNW5MWGRwWkdkbGRDMW1jbUZ0WlhkdmNtc3ZZMjl0Y0c5dVpXNTBjeTlzYVdJdlkyRnliM1Z6Wld3dlEyRnliM1Z6Wld3dWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzV1VGQldTeERRVUZET3pzN096czdPenM3T3pzN2MwTkJSMmxDTERaQ1FVRTJRanM3T3pzN096czdPenM3T3pzN096dEJRVVF6UkN4SlFVRkpMRTFCUVUwc1IwRkJSeXhQUVVGUExFTkJRVU1zVlVGQlZTeERRVUZETEVOQlFVTTdPMGxCWlROQ0xGRkJRVkU3UVVGRFJDeFZRVVJRTEZGQlFWRXNSMEZETUVVN2JVVkJRVXdzUlVGQlJUczdUVUZCY0VVc1NVRkJTU3hSUVVGS0xFbEJRVWs3VFVGQlJTeE5RVUZOTEZGQlFVNHNUVUZCVFR0TlFVRkZMRkZCUVZFc1VVRkJVaXhSUVVGUk8wMUJRVVVzVlVGQlZTeFJRVUZXTEZWQlFWVTdUVUZCUlN4alFVRmpMRkZCUVdRc1kwRkJZenROUVVGRkxFVkJRVVVzVVVGQlJpeEZRVUZGTzAxQlFVVXNTMEZCU3l4UlFVRk1MRXRCUVVzN08zZENRVVI0UlN4UlFVRlJPenRCUVVWYUxFMUJRVWtzUTBGQlF5eEpRVUZKTEVkQlFVY3NTVUZCU1N4RFFVRkRPMEZCUTJwQ0xFMUJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NUVUZCVFN4RFFVRkRPMEZCUTNKQ0xFMUJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVY3NVVUZCVVN4SlFVRkpMRU5CUVVNc1EwRkJRenRCUVVNNVFpeE5RVUZKTEVOQlFVTXNWVUZCVlN4SFFVRkhMRlZCUVZVc1EwRkJRenRCUVVNM1FpeE5RVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRXRCUVVzc1EwRkJRenRCUVVOdVFpeE5RVUZKTEVOQlFVTXNZMEZCWXl4SFFVRkhMR05CUVdNc1NVRkJTU3hEUVVGRExFTkJRVU03UVVGRE1VTXNUVUZCU1N4RFFVRkRMRVZCUVVVc1IwRkJSeXhSUVVGUkxFTkJRVU1zWVVGQllTeERRVUZGTEVWQlFVVXNRMEZCUlN4RFFVRkRPMEZCUTNaRExFMUJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVjN1FVRkROME1zVlVGQlR6dEhRVU5RTzBGQlEwUXNUVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhSUVVGUkxFZEJRVWNzU1VGQlNTeERRVUZETzBGQlF6RkNMRTFCUVVrc1EwRkJReXhSUVVGUkxFZEJRVWNzU1VGQlNTeERRVUZETEVWQlFVVXNRMEZCUXl4aFFVRmhMRU5CUVVNc01FSkJRVEJDTEVOQlFVTXNRMEZCUXp0QlFVTnNSU3hOUVVGSkxFTkJRVU1zVDBGQlR5eEhRVUZITEVsQlFVa3NRMEZCUXl4RlFVRkZMRU5CUVVNc1lVRkJZU3hEUVVGRExIRkNRVUZ4UWl4RFFVRkRMRU5CUVVNN1FVRkROVVFzVFVGQlNTeERRVUZETEU5QlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExHRkJRV0VzUTBGQlF5eHhRa0ZCY1VJc1EwRkJReXhEUVVGRE8wRkJRelZFTEUxQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eGhRVUZoTEVOQlFVTXNjMEpCUVhOQ0xFTkJRVU1zUTBGQlF6dEJRVU16UkN4TlFVRkpMRU5CUVVNc1YwRkJWeXhIUVVGSExFTkJRVU1zUTBGQlF6dEJRVU55UWl4TlFVRkpMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU03UlVGRFdqczdPenM3TzJOQmJrSkpMRkZCUVZFN08xTkJkVUpTTEdkQ1FVRkhPMEZCUTFBc1QwRkJTU3hEUVVGRExGRkJRVkVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNWMEZCVnl4RlFVRkZMRU5CUVVNN1FVRkRia01zVDBGQlNTeERRVUZETEZkQlFWY3NSMEZCUnl4TlFVRk5MRU5CUVVNc1UwRkJVeXhEUVVGRExGRkJRVkVzUTBGQlF5eGxRVUZsTEVOQlFVTTdRVUZETjBRc1QwRkJTU3hEUVVGRExGVkJRVlVzU1VGQlNTeEpRVUZKTEVOQlFVTXNWVUZCVlN4RlFVRkZMRU5CUVVNN1FVRkRja01zVDBGQlNTeERRVUZETEZkQlFWY3NSVUZCUlN4RFFVRkRPMEZCUTI1Q0xFOUJRVWtzUTBGQlF5eGxRVUZsTEVWQlFVVXNRMEZCUXp0QlFVTjJRaXhQUVVGSkxFTkJRVU1zWVVGQllTeEZRVUZGTEVOQlFVTTdRVUZEY2tJc1QwRkJTU3hEUVVGRExGbEJRVmtzUlVGQlJTeERRVUZETzBGQlEzQkNMRTlCUVVrc1EwRkJReXhSUVVGUkxFVkJRVVVzU1VGQlNTeEpRVUZKTEVOQlFVTXNZVUZCWVN4RlFVRkZMRU5CUVVNN1IwRkRlRU03T3pzN096czdPMU5CUzFjc2RVSkJRVWM3UVVGRFpDeFBRVUZKTEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExHRkJRV0VzUTBGQlF5eGhRVUZoTEVOQlFVTXNRMEZCUXp0QlFVTjBSQ3hQUVVGSkxFTkJRVU1zV1VGQldTeEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1IwRkRja01zVVVGQlVTeERRVUZGTEdkQ1FVRm5RaXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEZsQlFWa3NSVUZCUlN4RlFVRkZMRU5CUVVVc1IwRkRia1FzVVVGQlVTeERRVUZGTEdkQ1FVRm5RaXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEZOQlFWTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1EwRkJRU3hIUVVNdlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRPMEZCUTJZc1QwRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eExRVUZMTEVOQlFVTXNUVUZCVFN4SFFVRk5MRWxCUVVrc1EwRkJReXhaUVVGWkxFOUJRVWtzUTBGQlF6dEhRVU4wUkRzN096czdPenM3TzFOQlRWY3NkVUpCUVVjN1FVRkRaQ3hQUVVGSkxGTkJRVk1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMR2RDUVVGblFpeERRVUZETEdGQlFXRXNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJRenRCUVVOeVJTeFZRVUZQTEZGQlFWRXNRMEZCUlN4VFFVRlRMRWRCUVVjc1NVRkJTU3hEUVVGRExGRkJRVkVzUlVGQlJTeEZRVUZGTEVOQlFVVXNTVUZCU3l4VFFVRlRMRWRCUVVjc1NVRkJTU3hEUVVGRExGRkJRVkVzUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRU3hCUVVGRkxFTkJRVU03UjBGRE4wWTdPenM3T3pzN08xTkJTMVVzYzBKQlFVYzdRVUZEWWl4UFFVRkpMRU5CUVVNc1QwRkJUeXhIUVVGSExGRkJRVkVzUTBGQlJTeFJRVUZSTEVOQlFVVXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zVFVGQlRTeERRVUZETEZWQlFWVXNRMEZCUXl4WlFVRlpMRVZCUVVVc1JVRkJSU3hEUVVGRkxFZEJRVWNzU1VGQlNTeERRVUZETEZGQlFWRXNSVUZCUlN4RlFVRkZMRU5CUVVVc1NVRkRNMGNzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1RVRkJUU3hEUVVGRExGVkJRVlVzUTBGQlF5eFpRVUZaTEVkQlFVY3NTVUZCU1N4RFFVRkRMRkZCUVZFc1IwRkJSeXhEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUVN4QlFVRkRMRU5CUVVNN1IwRkRPVVU3T3pzN096czdPMU5CUzFrc2QwSkJRVWM3UVVGRFppeFBRVUZMTEVsQlFVa3NRMEZCUXl4WFFVRlhMRVZCUVVjN1FVRkRka0lzVjBGQlR6dEpRVU5RTzBGQlEwUXNUMEZCU1N4RFFVRkRMRmRCUVZjc1IwRkJSeXhKUVVGSkxFTkJRVU1zVjBGQlZ5eExRVUZMTEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNN1IwRkRja1E3T3pzN096czdPMU5CUzJFc2VVSkJRVWM3T3p0QlFVTm9RaXhQUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEdkQ1FVRm5RaXhEUVVGRExFOUJRVThzUlVGQlJUdFhRVUZOTEUxQlFVc3NXVUZCV1N4RlFVRkZPMGxCUVVFc1EwRkJSU3hEUVVGRE8wRkJRMjVGTEU5QlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNUMEZCVHl4RlFVRkZPMWRCUVUwc1RVRkJTeXhaUVVGWkxFVkJRVVU3U1VGQlFTeERRVUZGTEVOQlFVTTdPenRCUVVkdVJTeFBRVUZMTEVsQlFVa3NRMEZCUXl4TFFVRkxMRVZCUVVjN1FVRkRha0lzVVVGQlNTeE5RVUZOTEVkQlFVY3NTVUZCU1N4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUlVGQlJUdEJRVU51UXl4aFFVRlJMRVZCUVVVc1NVRkJTVHRMUVVOa0xFTkJRVU1zUTBGQlF6dEJRVU5JTEZGQlFVc3NTVUZCU1N4RFFVRkRMRXRCUVVzc1MwRkJTeXhWUVVGVkxFVkJRVWM3UVVGRGFFTXNWMEZCVFN4RFFVRkRMRWRCUVVjc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4VFFVRlRMRVZCUVVVc1RVRkJUU3hEUVVGRExHdENRVUZyUWl4RlFVRkZMRU5CUVVNc1EwRkJRenRCUVVOc1JTeFhRVUZOTEVOQlFVTXNSVUZCUlN4RFFVRkRMRTlCUVU4c1JVRkJSU3hWUVVGRExFTkJRVU1zUlVGQlN6dEJRVU42UWl4UFFVRkRMRU5CUVVNc1UwRkJVeXhMUVVGTExFTkJRVU1zU1VGQlNTeE5RVUZMTEZsQlFWa3NSVUZCUlN4RFFVRkRPMEZCUTNwRExFOUJRVU1zUTBGQlF5eFRRVUZUTEV0QlFVc3NSVUZCUlN4SlFVRkpMRTFCUVVzc1dVRkJXU3hGUVVGRkxFTkJRVU03VFVGRE1VTXNRMEZCUXl4RFFVRkRPMHRCUTBnc1RVRkJUU3hKUVVGTExFbEJRVWtzUTBGQlF5eExRVUZMTEV0QlFVc3NXVUZCV1N4RlFVRkhPMEZCUTNwRExGZEJRVTBzUTBGQlF5eEZRVUZGTEVOQlFVTXNWMEZCVnl4RlFVRkZPMkZCUVUwc1RVRkJTeXhaUVVGWkxFVkJRVVU3VFVGQlFTeERRVUZGTEVOQlFVTTdRVUZEYmtRc1YwRkJUU3hEUVVGRExFVkJRVVVzUTBGQlF5eFpRVUZaTEVWQlFVVTdZVUZCVFN4TlFVRkxMRmxCUVZrc1JVRkJSVHROUVVGQkxFTkJRVVVzUTBGQlF6dExRVU53UkR0SlFVTkVPMGRCUTBRN096czdPenM3TzFOQlMyVXNNa0pCUVVjN1FVRkRiRUlzVDBGQlNTeEpRVUZKTEVOQlFVTXNWMEZCVnl4TFFVRkxMRU5CUVVNc1JVRkJSVHRCUVVNelFpeFJRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmxCUVZrc1EwRkJReXhWUVVGVkxFVkJRVVVzVlVGQlZTeERRVUZETEVOQlFVTTdRVUZEYkVRc1VVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNaVUZCWlN4RlFVRkZMRTFCUVUwc1EwRkJReXhEUVVGRE8wRkJRMjVFTEZGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1UwRkJVeXhEUVVGRExFZEJRVWNzUTBGQlF5eGhRVUZoTEVOQlFVTXNRMEZCUXp0SlFVTXhReXhOUVVGTk8wRkJRMDRzVVVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4bFFVRmxMRU5CUVVNc1ZVRkJWU3hEUVVGRExFTkJRVU03UVVGRGVrTXNVVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhsUVVGbExFTkJRVU1zWlVGQlpTeERRVUZETEVOQlFVTTdRVUZET1VNc1VVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFRRVUZUTEVOQlFVTXNUVUZCVFN4RFFVRkRMR0ZCUVdFc1EwRkJReXhEUVVGRE8wbEJRemRETzBGQlEwUXNUMEZCU1N4SlFVRkpMRU5CUVVNc1YwRkJWeXhMUVVGTExFbEJRVWtzUTBGQlF5eFJRVUZSTEVWQlFVVTdRVUZEZGtNc1VVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNWVUZCVlN4RlFVRkZMRlZCUVZVc1EwRkJReXhEUVVGRE8wRkJRMnhFTEZGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1dVRkJXU3hEUVVGRExHVkJRV1VzUlVGQlJTeE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTnVSQ3hSUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZOQlFWTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1lVRkJZU3hEUVVGRExFTkJRVU03U1VGRE1VTXNUVUZCVFR0QlFVTk9MRkZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zWlVGQlpTeERRVUZETEZWQlFWVXNRMEZCUXl4RFFVRkRPMEZCUTNwRExGRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNaVUZCWlN4RFFVRkRMR1ZCUVdVc1EwRkJReXhEUVVGRE8wRkJRemxETEZGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1UwRkJVeXhEUVVGRExFMUJRVTBzUTBGQlF5eGhRVUZoTEVOQlFVTXNRMEZCUXp0SlFVTTNRenRIUVVORU96czdPenM3T3pzN1UwRk5XU3gzUWtGQlJ6dEJRVU5tTEU5QlFVc3NTVUZCU1N4RFFVRkRMRmRCUVZjc1IwRkJSeXhEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEZGQlFWRXNSVUZCUlR0QlFVTXhReXhYUVVGUE8wbEJRMUE3UVVGRFJDeFBRVUZKTEVOQlFVTXNWVUZCVlN4RFFVRkZMRWxCUVVrc1EwRkJReXhaUVVGWkxFZEJRVWNzU1VGQlNTeERRVUZETEZkQlFWY3NRMEZCUlN4RFFVRkRPMEZCUTNoRUxFOUJRVWtzUTBGQlF5eFhRVUZYTEVsQlFVa3NRMEZCUXl4RFFVRkRPenRCUVVWMFFpeFBRVUZMTEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVVc1JVRkJSenRCUVVOMFFpeFJRVUZKTEVOQlFVTXNZVUZCWVN4RlFVRkZMRU5CUVVNN1NVRkRja0lzVFVGQlRUdEJRVU5PTEZGQlFVa3NRMEZCUXl4bFFVRmxMRVZCUVVVc1EwRkJRenRKUVVOMlFqdEJRVU5FTEU5QlFVa3NRMEZCUXl4WlFVRlpMRVZCUVVVc1EwRkJRenRCUVVOd1FpeFBRVUZKTEVOQlFVTXNXVUZCV1N4RlFVRkZMRU5CUVVNN1FVRkRjRUlzVDBGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4VFFVRlRMRU5CUVVNc1pVRkJaU3hGUVVGRkxFTkJRVU03UjBGRGVFTTdPenM3T3pzN096dFRRVTFaTEhkQ1FVRkhPMEZCUTJZc1QwRkJTeXhKUVVGSkxFTkJRVU1zVjBGQlZ5eEhRVUZITEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVN1FVRkRPVUlzVjBGQlR6dEpRVU5RTzBGQlEwUXNUMEZCU1N4RFFVRkRMRmRCUVZjc1NVRkJTU3hEUVVGRExFTkJRVU03UVVGRGRFSXNUMEZCU1N4RFFVRkRMRlZCUVZVc1EwRkJSU3hCUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVkQlFVY3NTVUZCU1N4RFFVRkRMRmRCUVZjc1IwRkJTU3hKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZGTEVOQlFVTTdRVUZET1VVc1QwRkJTU3hEUVVGRExHVkJRV1VzUlVGQlJTeERRVUZETzBGQlEzWkNMRTlCUVVrc1EwRkJReXhaUVVGWkxFVkJRVVVzUTBGQlF6dEJRVU53UWl4UFFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExGTkJRVk1zUTBGQlF5eGxRVUZsTEVWQlFVVXNRMEZCUXp0SFFVTjRRenM3T3pzN096czdPMU5CVFZVc2IwSkJRVVVzUjBGQlJ5eEZRVUZITzBGQlEyeENMRTlCUVVzc1NVRkJTU3hEUVVGRExGZEJRVmNzUlVGQlJ6dEJRVU4yUWl4UlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFdEJRVXNzUTBGQlF5eDVRMEZCYTBJc1YwRkJWeXhEUVVGRExFTkJRVU1zZDBKQlFYTkNMRWRCUVVjc1YwRkJVU3hEUVVGRE8wbEJRMnhHTEUxQlFVMDdRVUZEVGl4UlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFdEJRVXNzUTBGQlF5eEhRVUZITEZOQlFVOHNSMEZCUnl4UFFVRkpMRU5CUVVNN1NVRkRia003UjBGRFJEczdPenM3T3pzN1UwRkxXU3gzUWtGQlJ6dEJRVU5tTEU5QlFVa3NRMEZCUXl4VFFVRlRMRWRCUVVjc1FVRkJSU3hKUVVGSkxFTkJRVU1zVjBGQlZ5eEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRWRCUVVzc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF6dEJRVU4wUlN4UFFVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSExFbEJRVWtzUTBGQlF5eFRRVUZUTEVsQlFVc3NTVUZCU1N4RFFVRkRMRkZCUVZFc1IwRkJSeXhEUVVGRExFTkJRVUVzUVVGQlJTeERRVUZET3p0QlFVVjJSQ3hMUVVGRkxFTkJRVU1zUzBGQlN5eERRVUZETEVsQlFVa3NRMEZCUlN4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExHZENRVUZuUWl4RFFVRkRMR0ZCUVdFc1EwRkJReXhEUVVGRkxFTkJRVU1zVDBGQlR5eERRVUZETEZWQlFVVXNTVUZCU1N4RlFVRk5PMEZCUXpWRkxGRkJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNZVUZCWVN4RlFVRkZMRTFCUVUwc1EwRkJReXhEUVVGRE8wRkJRM3BETEZGQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1lVRkJZU3hGUVVGRkxFMUJRVTBzUTBGQlF5eERRVUZETzBsQlEzcERMRU5CUVVNc1EwRkJRenM3UVVGRlNDeFJRVUZOTEVsQlFVa3NRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhUUVVGVExFVkJRVVVzUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZITzBGQlF6RkVMRkZCUVVrc1NVRkJTU3hIUVVGSExFbEJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zWVVGQllTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkRkRVFzVVVGQlNTeERRVUZETEVsQlFVa3NSVUZCUlR0QlFVTldMR05CUVZNN1MwRkRWRHRCUVVORUxGRkJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNZVUZCWVN4RlFVRkZMRTlCUVU4c1EwRkJReXhEUVVGRE8wRkJRekZETEZGQlFVa3NRMEZCUXl4bFFVRmxMRU5CUVVNc1lVRkJZU3hEUVVGRExFTkJRVU03U1VGRGNFTTdSMEZEUkRzN096czdPenM3VTBGTFVTeHZRa0ZCUnp0QlFVTllMRlZCUVU4c1NVRkJTU3hEUVVGRExGVkJRVlVzU1VGQlNTeEpRVUZKTEVOQlFVTXNWMEZCVnl4TFFVRk5MRWxCUVVrc1EwRkJReXhSUVVGUkxFZEJRVWNzU1VGQlNTeERRVUZETEdOQlFXTXNRVUZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGZEJRVmNzUTBGQlF6dEhRVU14UnpzN096czdPenM3T3p0VFFVOWhMSGxDUVVGSE96czdRVUZEYUVJc1QwRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFRRVUZUTEVOQlFVTXNSMEZCUnl4RFFVRkRMRmxCUVZrc1JVRkJSU3hoUVVGaExFTkJRVU1zUTBGQlF6dEJRVU40UkN4UFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGbEJRVmtzUTBGQlF5eFZRVUZWTEVWQlFVVXNWVUZCVlN4RFFVRkRMRU5CUVVNN1FVRkRiRVFzVDBGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4alFVRmpMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVVVzV1VGQlRUdEJRVU4wUXl4WFFVRkxMRTFCUVUwc1EwRkJReXhUUVVGVExFTkJRVU1zVTBGQlV5eEZRVUZGTEVOQlFVTTdRVUZEYkVNc1YwRkJTeXhSUVVGUkxFZEJRVWNzVDBGQlN5eFhRVUZYTEVWQlFVVXNRMEZCUXp0QlFVTnVReXhYUVVGTExGbEJRVmtzUlVGQlJTeERRVUZETzBGQlEzQkNMRmRCUVVzc1pVRkJaU3hGUVVGRkxFTkJRVU03UVVGRGRrSXNWMEZCU3l4UFFVRlBMRU5CUVVNc1UwRkJVeXhEUVVGRExFMUJRVTBzUTBGQlF5eFpRVUZaTEVWQlFVVXNZVUZCWVN4RFFVRkRMRU5CUVVNN1NVRkRNMFFzUTBGQlF5eERRVUZETzBkQlEwZzdPenM3T3pzN096dFRRVTFMTEdsQ1FVRkhPMEZCUTFJc1QwRkJTU3hEUVVGRExGVkJRVlVzUTBGQlJTeERRVUZETEVOQlFVVXNRMEZCUXp0QlFVTnlRaXhQUVVGSkxFTkJRVU1zVjBGQlZ5eEhRVUZITEVOQlFVTXNRMEZCUXp0QlFVTnlRaXhQUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJRenRCUVVOdVF5eFBRVUZKTEVOQlFVTXNWMEZCVnl4SFFVRkhMRXRCUVVzc1EwRkJRenRCUVVONlFpeFBRVUZKTEVOQlFVTXNaVUZCWlN4RlFVRkZMRU5CUVVNN1FVRkRka0lzVDBGQlNTeERRVUZETEZsQlFWa3NSVUZCUlN4RFFVRkRPMEZCUTNCQ0xFOUJRVWtzUTBGQlF5eFJRVUZSTEVWQlFVVXNTVUZCU1N4SlFVRkpMRU5CUVVNc1lVRkJZU3hGUVVGRkxFTkJRVU03UjBGRGVFTTdPenM3T3pzN08xTkJTMDhzYlVKQlFVYzdRVUZEVml4UFFVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSExFbEJRVWtzUTBGQlF5eFhRVUZYTEVWQlFVVXNRMEZCUXp0SFFVTnVRenM3TzFGQk0wOUpMRkZCUVZFN096dHhRa0U0VDBNc1VVRkJVU0lzSW1acGJHVWlPaUpET2k5MFpXMXdMMGRITGtaeWIyNTBSVzVrTGxkcFpHZGxkSE12ZDJsa1oyVjBjeTltZFc1a2NtRnBjMlZ5TFd4bFlXUmxjbUp2WVhKa0wySnZkMlZ5WDJOdmJYQnZibVZ1ZEhNdmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDJOaGNtOTFjMlZzTDBOaGNtOTFjMlZzTG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lKM1Z6WlNCemRISnBZM1FuTzF4eVhHNWNjbHh1YkdWMElFaGhiVzFsY2lBOUlISmxjWFZwY21Vb0oyaGhiVzFsY21wekp5azdYSEpjYm1sdGNHOXlkQ0JuWlhSV1pXNWtiM0pRY205d1pYSjBlU0JtY205dElDY3VMaTlxY3k5RVQwMHZaMlYwVm1WdVpHOXlVSEp2Y0dWeWRIa25PMXh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJRUZrWkNCaElHTmhjbTkxYzJWc0lIUnZJR0VnYkdsemRDQjJhV1YzWEhKY2JpQXFJRUJqYkdGemMyUmxjMk1nUVdSa0lHRWdZMkZ5YjNWelpXd2dabTl5SUhCaFoybHVZWFJwYjI0Z2IyWWdZMkZ5WkNCc2FYTjBJSFpwWlhkelhISmNiaUFxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0J2Y0hScGIyNXpYSEpjYmlBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCdmNIUnBiMjV6TG5acFpYY3VJRlJvWlNCMmFXVjNJSFJvWVhRZ2RHaGxJR05oY205MWMyVnNJSEJoWjJsdVlYUmxjeUJiY21WeGRXbHlaV1JkWEhKY2JpQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnZjSFJwYjI1ekxuZHBaR2RsZEM0Z1ZHaGxJSGRwWkdkbGRDQnBibk4wWVc1alpTQmJjbVZ4ZFdseVpXUmRYSEpjYmlBcUlFQndZWEpoYlNCN1RuVnRZbVZ5ZlNCdmNIUnBiMjV6TG5CaFoyVlRhWHBsTGlCVWFHVWdiblZ0WW1WeUlHOW1JR3hwYzNRZ2FYUmxiWE1nZEc4Z2MyaHZkeUJwYmlCbFlXTm9JR05oY205MWMyVnNJSEJoWjJWY2NseHVJQ29nUUhCaGNtRnRJSHRDYjI5c1pXRnVmU0J2Y0hScGIyNXpMbWx6U1c1bWFXNXBkR1V1SUZkb1pYUm9aWElnZEdobElHTnZiR3hsWTNScGIyNGdaR2x6Y0d4aGVXVmtJR2x6SUhCaFoybHVZWFJsWkNCdmJpQjBhR1VnVWtWVFZDQkJVRWxjY2x4dUlDb2dRSEJoY21GdElIdE9kVzFpWlhKOUlHOXdkR2x2Ym5NdWJtVjRkRkJoWjJWQ2RXWm1aWEl1SUU1MWJXSmxjaUJ2WmlCallYSnZkWE5sYkNCd1lXZGxjeUJpWldadmNtVWdkR2hsSUd4aGMzUWdZWFFnZDJocFkyZ2dkRzhnWm1WMFkyZ2dibVY0ZENCQlVFa2djR0ZuWlM1Y2NseHVJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJRzl3ZEdsdmJuTXVaV3d1SUZSb1pTQmpZWEp2ZFhObGJDQndZWEpsYm5RZ1pXeGxiV1Z1ZEZ4eVhHNGdLaUJBWTJ4aGMzTWdVMlYwSUdOaGNtOTFjMlZzSUdsdWMzUmhibU5sSUhCeWIzQmxjblJwWlhNN0lHTmhZMmhsSUdGd1pYSjBkWEpsTENCamIyNTBjbTlzSUdGdVpDQnNhWE4wSUdWc1pXMWxiblJ6T3lCelpYUWdZM1Z5Y21WdWRDQndZV2RsT3lCY2NseHVJQ292WEhKY2JtTnNZWE56SUVOaGNtOTFjMlZzSUh0Y2NseHVYSFJqYjI1emRISjFZM1J2Y2lBb0lIc2dkbWxsZHl3Z2QybGtaMlYwTENCd1lXZGxVMmw2WlN3Z2FYTkpibVpwYm1sMFpTd2dibVY0ZEZCaFoyVkNkV1ptWlhJc0lHVnNMQ0J6ZDJsd1pTQjlJRDBnZTMwZ0tTQjdYSEpjYmx4MFhIUjBhR2x6TG5acFpYY2dQU0IyYVdWM08xeHlYRzVjZEZ4MGRHaHBjeTUzYVdSblpYUWdQU0IzYVdSblpYUTdYSEpjYmx4MFhIUjBhR2x6TG5CaFoyVlRhWHBsSUQwZ2NHRm5aVk5wZW1VZ2ZId2dNenRjY2x4dVhIUmNkSFJvYVhNdWFYTkpibVpwYm1sMFpTQTlJR2x6U1c1bWFXNXBkR1U3WEhKY2JseDBYSFIwYUdsekxuTjNhWEJsSUQwZ2MzZHBjR1U3WEhKY2JseDBYSFIwYUdsekxtNWxlSFJRWVdkbFFuVm1abVZ5SUQwZ2JtVjRkRkJoWjJWQ2RXWm1aWElnZkh3Z01qdGNjbHh1WEhSY2RIUm9hWE11Wld3Z1BTQmtiMk4xYldWdWRDNXhkV1Z5ZVZObGJHVmpkRzl5S0NCbGJDQXBPMXh5WEc1Y2RGeDBhV1lnS0NBaGRHaHBjeTVsYkNCOGZDQWhkR2hwY3k1M2FXUm5aWFFnZkh3Z0lYUm9hWE11ZG1sbGR5QXBJSHRjY2x4dVhIUmNkRngwY21WMGRYSnVPMXh5WEc1Y2RGeDBmVnh5WEc1Y2RGeDBkR2hwY3k1MmFXVjNMbU5oY205MWMyVnNJRDBnZEdocGN6dGNjbHh1WEhSY2RIUm9hWE11WVhCbGNuUjFjbVVnUFNCMGFHbHpMbVZzTG5GMVpYSjVVMlZzWldOMGIzSW9KMXRrWVhSaExXTmhjbTkxYzJWc0xXRndaWEowZFhKbFhTY3BPMXh5WEc1Y2RGeDBkR2hwY3k1aWRHNU9aWGgwSUQwZ2RHaHBjeTVsYkM1eGRXVnllVk5sYkdWamRHOXlLQ2RiWkdGMFlTMWpiMjUwY205c0xXNWxlSFJkSnlrN1hISmNibHgwWEhSMGFHbHpMbUowYmxCeVpYWWdQU0IwYUdsekxtVnNMbkYxWlhKNVUyVnNaV04wYjNJb0oxdGtZWFJoTFdOdmJuUnliMnd0Y0hKbGRsMG5LVHRjY2x4dVhIUmNkSFJvYVhNdWMzUnlhWEFnUFNCMGFHbHpMbVZzTG5GMVpYSjVVMlZzWldOMGIzSW9KMXRrWVhSaExXTmhjbTkxYzJWc0xXeHBjM1JkSnlrN1hISmNibHgwWEhSMGFHbHpMbU4xY25KbGJuUlFZV2RsSUQwZ01UdGNjbHh1WEhSY2RIUm9hWE11YVc1cGRDZ3BPMXh5WEc1Y2RIMWNjbHh1WEhRdktpcGNjbHh1WEhRZ0tpQkpibWwwYVdGc2FYTmxJSFJvWlNCallYSnZkWE5sYkZ4eVhHNWNkQ0FxTDF4eVhHNWNkR2x1YVhRZ0tDa2dlMXh5WEc1Y2RGeDBkR2hwY3k1c1lYTjBVR0ZuWlNBOUlIUm9hWE11WjJWMFRHRnpkRkJoWjJVb0tUdGNjbHh1WEhSY2RIUm9hWE11ZEhKaGJuTnNZWFJsTTJRZ1BTQjNhVzVrYjNjdVgycG5kMmxrWjJWMExtWmxZWFIxY21WekxtTnpjM1J5WVc1elptOXliWE16WkR0Y2NseHVYSFJjZEhSb2FYTXVhWE5KYm1acGJtbDBaU0FtSmlCMGFHbHpMbWRsZEUxaGVGQmhaMlVvS1R0Y2NseHVYSFJjZEhSb2FYTXVjMlYwUVhCbGNuUjFjbVVvS1R0Y2NseHVYSFJjZEhSb2FYTXVjMlYwUTI5dWRISnZiRk4wWVhSbEtDazdYSEpjYmx4MFhIUjBhR2x6TG1KcGJtUk1hWE4wWlc1bGNuTW9LVHRjY2x4dVhIUmNkSFJvYVhNdWMyVjBRMkZ5WkZOMFlYUmxLQ2s3WEhKY2JseDBYSFIwYUdsekxtbHpRblZtWm1WeUtDa2dKaVlnZEdocGN5NXNiMkZrVFc5eVpVTmhjbVJ6S0NrN1hISmNibHgwZlZ4eVhHNWNkQzhxS2x4eVhHNWNkQ0FxSUZObGRDQjBhR1VnWVhCbGNuUjFjbVVnYjJZZ2RHaGxJR05oY205MWMyVnNYSEpjYmx4MElDb2dRR1JsYzJOeWFYQjBhVzl1SUZObGRDQjBhR1VnYzJsNlpTQnZaaUIwYUdVZ1lYQmxjblIxY21VZ1ltRnpaV1FnYjI0Z2MzQmxZMmxtYVdWa0lIQmhaMlVnYzJsNlpTNGdRWE56ZFcxbGN5QmhiR3dnWTJGeVpITWdhR0YyWlNCMGFHVWdjMkZ0WlNCb1pXbG5hSFF1WEhKY2JseDBJQ292WEhKY2JseDBjMlYwUVhCbGNuUjFjbVVnS0NrZ2UxeHlYRzVjZEZ4MGJHVjBJR05oY21RZ1BTQjBhR2x6TG1Gd1pYSjBkWEpsTG5GMVpYSjVVMlZzWldOMGIzSW9KMXRrWVhSaExXTmhjbVJkSnlrN1hISmNibHgwWEhSMGFHbHpMbUZ3WlhKMGRYSmxVMmw2WlNBOUlDaGpZWEprTG05bVpuTmxkRWhsYVdkb2RDQXJJRnh5WEc1Y2RGeDBYSFJ3WVhKelpVbHVkQ2dnWjJWMFEyOXRjSFYwWldSVGRIbHNaU2hqWVhKa0tTNXRZWEpuYVc1Q2IzUjBiMjBzSURFd0lDa2dLeUJjY2x4dVhIUmNkRngwY0dGeWMyVkpiblFvSUdkbGRFTnZiWEIxZEdWa1UzUjViR1VvWTJGeVpDa3ViV0Z5WjJsdVZHOXdMQ0F4TUNrcElDb2dYSEpjYmx4MFhIUmNkSFJvYVhNdWNHRm5aVk5wZW1VN1hISmNibHgwWEhSMGFHbHpMbUZ3WlhKMGRYSmxMbk4wZVd4bExtaGxhV2RvZENBOUlHQWtlM1JvYVhNdVlYQmxjblIxY21WVGFYcGxmWEI0WUR0Y2NseHVYSFI5WEhKY2JseDBMeW9xWEhKY2JseDBJQ29nUjJWMElIUm9aU0JiWTNWeWNtVnVkRjBnYkdGemRDQndZV2RsSUc5bUlIUm9aU0JqWVhKdmRYTmxiRnh5WEc1Y2RDQXFJRUJrWlhOamNtbHdkR2x2YmlCR2FXNWtjeUIwYUdVZ2JHRnpkQ0J3WVdkbElHNTFiV0psY2lCdlppQjBhR1VnWTJGeWIzVnpaV3d1SUZOMVltcGxZM1FnZEc4Z2RYQmtZWFJsSUdsbUlIUm9aU0JqWVhKdmRYTmxiQ0JwY3lCcGJtWnBibWwwWlZ4eVhHNWNkQ0FxSUVCeVpYUjFjbTV6SUh0T2RXMWlaWEo5SUVsdWRHVm5aWElnY21Wd2NtVnpaVzUwYVc1bklIUm9aU0JwYm1SbGVDQnZaaUIwYUdVZ1kzVnljbVZ1ZENCc1lYTjBJR05oY205MWMyVnNJSEJoWjJVdVhISmNibHgwSUNvdlhISmNibHgwWjJWMFRHRnpkRkJoWjJVZ0tDa2dlMXh5WEc1Y2RGeDBiR1YwSUdOaGNtUkRiM1Z1ZENBOUlIUm9hWE11WVhCbGNuUjFjbVV1Y1hWbGNubFRaV3hsWTNSdmNrRnNiQ2duVzJSaGRHRXRZMkZ5WkYwbktTNXNaVzVuZEdnN1hISmNibHgwWEhSeVpYUjFjbTRnY0dGeWMyVkpiblFvSUdOaGNtUkRiM1Z1ZENBdklIUm9hWE11Y0dGblpWTnBlbVVzSURFd0lDa2dLeUFvSUdOaGNtUkRiM1Z1ZENBbElIUm9hWE11Y0dGblpWTnBlbVVnUGlBd0lEOGdNU0E2SURBZ0tUdGNjbHh1WEhSOVhISmNibHgwTHlvcVhISmNibHgwSUNvZ1IyVjBJSFJvWlNCdFlYaHBiWFZ0SUhCaFoyVWdiMllnZEdobElHTmhjbTkxYzJWc1hISmNibHgwSUNvZ1FHUmxjMk55YVhCMGFXOXVJRVp2Y2lCcGJtWnBibWwwWlNCallYSnZkWE5sYkhNc0lHWnBibVJ6SUhSb1pTQnRZWGhwYlhWdElIQnZjM05wWW14bElIQmhaMlVnYm5WdFltVnlJRzltSUhSb1pTQmpZWEp2ZFhObGJGeHlYRzVjZENBcUwxeHlYRzVjZEdkbGRFMWhlRkJoWjJVZ0tDa2dlMXh5WEc1Y2RGeDBkR2hwY3k1dFlYaFFZV2RsSUQwZ2NHRnljMlZKYm5Rb0lIQmhjbk5sU1c1MEtDQjBhR2x6TG5acFpYY3ViVzlrWld3dUpHMXZaR1ZzTG5CaFoybHVZWFJwYjI0dWRHOTBZV3hTWlhOMWJIUnpMQ0F4TUNBcElDOGdkR2hwY3k1d1lXZGxVMmw2WlN3Z01UQWdLU0FySUZ4eVhHNWNkRngwWEhRb2RHaHBjeTUyYVdWM0xtMXZaR1ZzTGlSdGIyUmxiQzV3WVdkcGJtRjBhVzl1TG5SdmRHRnNVbVZ6ZFd4MGN5QWxJSFJvYVhNdWNHRm5aVk5wZW1VZ1BpQXdJRDhnTVNBNklEQXBPMXh5WEc1Y2RIMWNjbHh1WEhRdktpcGNjbHh1WEhRZ0tpQlRaWFFnWVNCbWJHRm5JSGRvWlc0Z1lXeHNJSEJ2YzNOcFlteGxJR1JoZEdFZ2FHRnpJR0psWlc0Z1ptVjBZMmhsWkZ4eVhHNWNkQ0FxSUVCa1pYTmpjbWx3ZEdsdmJpQkdiM0lnYVc1bWFXNXBkR1VnWTJGeWIzVnpaV3h6TENCelpYUnpJR0VnWm14aFp5QjNhR1Z1SUhSb1pTQnNZWE4wSUVGUVNTQndZV2RsSUdoaGN5QmlaV1Z1SUdabGRHTm9aV1FnWVc1a0lHRmtaR1ZrSUhSdklIUm9aU0J0YjJSbGJDZHpJR052Ykd4bFkzUnBiMjVjY2x4dVhIUWdLaTljY2x4dVhIUnpaWFJOWVhoTWIyRmtaV1FnS0NrZ2UxeHlYRzVjZEZ4MGFXWWdLQ0IwYUdsekxtbHpUV0Y0VEc5aFpHVmtJQ2tnZTF4eVhHNWNkRngwWEhSeVpYUjFjbTQ3WEhKY2JseDBYSFI5WEhKY2JseDBYSFIwYUdsekxtbHpUV0Y0VEc5aFpHVmtJRDBnZEdocGN5NWpkWEp5Wlc1MFVHRm5aU0E5UFQwZ2RHaHBjeTV0WVhoUVlXZGxPMXh5WEc1Y2RIMWNjbHh1WEhRdktpcGNjbHh1WEhRZ0tpQkNhVzVrSUdWMlpXNTBJR3hwYzNSbGJtVnljMXh5WEc1Y2RDQXFJRUJrWlhOamNtbHdkR2x2YmlCQ2FXNWtJR1YyWlc1MElHeHBjM1JsYm1WeWN5QjBieUJFVDAwZ2JtOWtaWE1nWm05eUlHTmhjbTkxYzJWc0lIVnpaWElnYVc1MFpYSmhZM1JwYjI1Y2NseHVYSFFnS2k5Y2NseHVYSFJpYVc1a1RHbHpkR1Z1WlhKeklDZ3BJSHRjY2x4dVhIUmNkSFJvYVhNdVluUnVUbVY0ZEM1aFpHUkZkbVZ1ZEV4cGMzUmxibVZ5S0NkamJHbGpheWNzSUNncElEMCtJSFJvYVhNdWMyaHZkMDVsZUhSUVlXZGxLQ2tnS1R0Y2NseHVYSFJjZEhSb2FYTXVZblJ1VUhKbGRpNWhaR1JGZG1WdWRFeHBjM1JsYm1WeUtDZGpiR2xqYXljc0lDZ3BJRDArSUhSb2FYTXVjMmh2ZDFCeVpYWlFZV2RsS0NrZ0tUdGNjbHh1WEhSY2RGeHlYRzVjZEZ4MEx5OVRkMmx3WlNCM2FYUm9JRWhoYlcxbGNseHlYRzVjZEZ4MGFXWWdLQ0IwYUdsekxuTjNhWEJsSUNrZ2UxeHlYRzVjZEZ4MFhIUnNaWFFnYUdGdGJXVnlJRDBnYm1WM0lFaGhiVzFsY2loMGFHbHpMbk4wY21sd0xDQjdYSEpjYmx4MFhIUmNkRngwZG1Wc2IyTnBkSGs2SURBdU1UVmNjbHh1WEhSY2RGeDBmU2s3WEhKY2JseDBYSFJjZEdsbUlDZ2dkR2hwY3k1emQybHdaU0E5UFQwZ0ozWmxjblJwWTJGc0p5QXBJSHRjY2x4dVhIUmNkRngwWEhSb1lXMXRaWEl1WjJWMEtDZHpkMmx3WlNjcExuTmxkQ2g3SUdScGNtVmpkR2x2YmpvZ1NHRnRiV1Z5TGtSSlVrVkRWRWxQVGw5V1JWSlVTVU5CVENCOUtUdGNjbHh1WEhSY2RGeDBYSFJvWVcxdFpYSXViMjRvSjNOM2FYQmxKeXdnS0dVcElEMCtJSHRjY2x4dVhIUmNkRngwWEhSY2RHVXVaR2x5WldOMGFXOXVJRDA5UFNBNElDWW1JSFJvYVhNdWMyaHZkMDVsZUhSUVlXZGxLQ2s3WEhKY2JseDBYSFJjZEZ4MFhIUmxMbVJwY21WamRHbHZiaUE5UFQwZ01UWWdKaVlnZEdocGN5NXphRzkzVUhKbGRsQmhaMlVvS1R0Y2NseHVYSFJjZEZ4MFhIUjlLVHRjY2x4dVhIUmNkRngwZlNCbGJITmxJR2xtSUNnZ2RHaHBjeTV6ZDJsd1pTQTlQVDBnSjJodmNtbDZiMjUwWVd3bklDa2dlMXh5WEc1Y2RGeDBYSFJjZEdoaGJXMWxjaTV2YmlnbmMzZHBjR1ZzWldaMEp5d2dLQ2tnUFQ0Z2RHaHBjeTV6YUc5M1RtVjRkRkJoWjJVb0tTQXBPMXh5WEc1Y2RGeDBYSFJjZEdoaGJXMWxjaTV2YmlnbmMzZHBjR1Z5YVdkb2RDY3NJQ2dwSUQwK0lIUm9hWE11YzJodmQxQnlaWFpRWVdkbEtDa2dLVHRjY2x4dVhIUmNkRngwZlZ4eVhHNWNkRngwZlZ4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dVhIUWdLaUJUWlhRZ2MzUmhkR1VnYjJZZ1kyRnliM1Z6Wld3Z1kyOXVkSEp2YkhOY2NseHVYSFFnS2lCQVpHVnpZM0pwY0hScGIyNGdVMlYwSUhSb1pTQnpkR0YwWlNCdlppQmpZWEp2ZFhObGJDQmpiMjUwY205c2N5QmJaVzVoWW14bFpDd2daR2x6WVdKc1pXUmRJR0poYzJWa0lHOXVJR04xY25KbGJuUWdZMkZ5YjNWelpXd2djR0ZuWlZ4eVhHNWNkQ0FxTDF4eVhHNWNkSE5sZEVOdmJuUnliMnhUZEdGMFpTQW9LU0I3WEhKY2JseDBYSFJwWmlBb2RHaHBjeTVqZFhKeVpXNTBVR0ZuWlNBOVBUMGdNU2tnZTF4eVhHNWNkRngwWEhSMGFHbHpMbUowYmxCeVpYWXVjMlYwUVhSMGNtbGlkWFJsS0Nka2FYTmhZbXhsWkNjc0lDZGthWE5oWW14bFpDY3BPMXh5WEc1Y2RGeDBYSFIwYUdsekxtSjBibEJ5WlhZdWMyVjBRWFIwY21saWRYUmxLQ2RoY21saExXUnBjMkZpYkdWa0p5d2dKM1J5ZFdVbktUdGNjbHh1WEhSY2RGeDBkR2hwY3k1aWRHNVFjbVYyTG1Oc1lYTnpUR2x6ZEM1aFpHUW9KMmx6TFdScGMyRmliR1ZrSnlrN1hISmNibHgwWEhSOUlHVnNjMlVnZTF4eVhHNWNkRngwWEhSMGFHbHpMbUowYmxCeVpYWXVjbVZ0YjNabFFYUjBjbWxpZFhSbEtDZGthWE5oWW14bFpDY3BPMXh5WEc1Y2RGeDBYSFIwYUdsekxtSjBibEJ5WlhZdWNtVnRiM1psUVhSMGNtbGlkWFJsS0NkaGNtbGhMV1JwYzJGaWJHVmtKeWs3WEhKY2JseDBYSFJjZEhSb2FYTXVZblJ1VUhKbGRpNWpiR0Z6YzB4cGMzUXVjbVZ0YjNabEtDZHBjeTFrYVhOaFlteGxaQ2NwTzF4eVhHNWNkRngwZlZ4eVhHNWNkRngwYVdZZ0tIUm9hWE11WTNWeWNtVnVkRkJoWjJVZ1BUMDlJSFJvYVhNdWJHRnpkRkJoWjJVcElIdGNjbHh1WEhSY2RGeDBkR2hwY3k1aWRHNU9aWGgwTG5ObGRFRjBkSEpwWW5WMFpTZ25aR2x6WVdKc1pXUW5MQ0FuWkdsellXSnNaV1FuS1R0Y2NseHVYSFJjZEZ4MGRHaHBjeTVpZEc1T1pYaDBMbk5sZEVGMGRISnBZblYwWlNnbllYSnBZUzFrYVhOaFlteGxaQ2NzSUNkMGNuVmxKeWs3WEhKY2JseDBYSFJjZEhSb2FYTXVZblJ1VG1WNGRDNWpiR0Z6YzB4cGMzUXVZV1JrS0NkcGN5MWthWE5oWW14bFpDY3BPMXh5WEc1Y2RGeDBmU0JsYkhObElIdGNjbHh1WEhSY2RGeDBkR2hwY3k1aWRHNU9aWGgwTG5KbGJXOTJaVUYwZEhKcFluVjBaU2duWkdsellXSnNaV1FuS1R0Y2NseHVYSFJjZEZ4MGRHaHBjeTVpZEc1T1pYaDBMbkpsYlc5MlpVRjBkSEpwWW5WMFpTZ25ZWEpwWVMxa2FYTmhZbXhsWkNjcE8xeHlYRzVjZEZ4MFhIUjBhR2x6TG1KMGJrNWxlSFF1WTJ4aGMzTk1hWE4wTG5KbGJXOTJaU2duYVhNdFpHbHpZV0pzWldRbktUdGNjbHh1WEhSY2RIMWNjbHh1WEhSOVhISmNibHgwTHlvcVhISmNibHgwSUNvZ1UyaHZkeUIwYUdVZ2JtVjRkQ0J3WVdkbElHOW1JSFJvWlNCallYSnZkWE5sYkZ4eVhHNWNkQ0FxSUVCa1pYTmpjbWx3ZEdsdmJpQlVjbUZ1YzJsMGFXOXVJSFJvWlNCc2FYTjBJSFJ2SUhOb2IzY2dkR2hsSUc1bGVIUWdjR0ZuWlRzZ1ptVjBZMmdnYlc5eVpTQmpZWEprY3lCcFppQjNaU0JoY21VZ2IyNGdkR2hsSUdKMVptWmxjaUJ3WVdkbElGdHBibVpwYm1sMFpTQmpZWEp2ZFhObGJITmRPeUJjY2x4dVhIUWdLaUJ6WlhRZ2JXRjRJR3h2WVdSbFpDQm1iR0ZuT3lCelpYUWdZMjl1ZEhKdmJHeGxjaUJ6ZEdGMFpUc2djMlYwSUdOaGNtUnpJSE4wWVhSbElHRnVaQ0JtYVhKbElHRnVZV3g1ZEdsamN5QnBiWEJ5WlhOemFXOXVjeUJtYjNJZ2JtVjNiSGtnZG1semFXSnNaU0JqWVhKa2MxeHlYRzVjZENBcUwxeHlYRzVjZEhOb2IzZE9aWGgwVUdGblpTQW9LU0I3WEhKY2JseDBYSFJwWmlBb0lIUm9hWE11WTNWeWNtVnVkRkJoWjJVZ0t5QXhJRDRnZEdocGN5NXNZWE4wVUdGblpTa2dlMXh5WEc1Y2RGeDBYSFJ5WlhSMWNtNDdYSEpjYmx4MFhIUjlJRnh5WEc1Y2RGeDBkR2hwY3k1MGNtRnVjMmwwYVc5dUtDQjBhR2x6TG1Gd1pYSjBkWEpsVTJsNlpTQXFJSFJvYVhNdVkzVnljbVZ1ZEZCaFoyVWdLVHRjY2x4dVhIUmNkSFJvYVhNdVkzVnljbVZ1ZEZCaFoyVWdLejBnTVR0Y2NseHVYSEpjYmx4MFhIUnBaaUFvSUhSb2FYTXVhWE5DZFdabVpYSW9LU0FwSUh0Y2NseHVYSFJjZEZ4MGRHaHBjeTVzYjJGa1RXOXlaVU5oY21SektDazdYSEpjYmx4MFhIUjlJR1ZzYzJVZ2UxeHlYRzVjZEZ4MFhIUjBhR2x6TG5ObGRFTnZiblJ5YjJ4VGRHRjBaU2dwTzF4eVhHNWNkRngwZlZ4eVhHNWNkRngwZEdocGN5NXpaWFJOWVhoTWIyRmtaV1FvS1R0Y2NseHVYSFJjZEhSb2FYTXVjMlYwUTJGeVpGTjBZWFJsS0NrN1hISmNibHgwWEhSMGFHbHpMbmRwWkdkbGRDNWhibUZzZVhScFkzTXVZMkZ5WkVsdGNISmxjM05wYjI1ektDazdYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzVjZENBcUlGTm9iM2NnZEdobElIQnlaWFpwYjNWeklIQmhaMlVnYjJZZ2RHaGxJR05oY205MWMyVnNYSEpjYmx4MElDb2dRR1JsYzJOeWFYQjBhVzl1SUZSeVlXNXphWFJwYjI0Z2RHaGxJR3hwYzNRZ2RHOGdjMmh2ZHlCMGFHVWdjSEpsZG1sdmRYTWdjR0ZuWlRzZ2MyVjBJR052Ym5SeWIyeHNaWElnYzNSaGRHVTdYSEpjYmx4MElDb2djMlYwSUdOaGNtUnpJSE4wWVhSbElHRnVaQ0JtYVhKbElHRnVZV3g1ZEdsamN5QnBiWEJ5WlhOemFXOXVjeUJtYjNJZ2JtVjNiSGtnZG1semFXSnNaU0JqWVhKa2MxeHlYRzVjZENBcUwxeHlYRzVjZEhOb2IzZFFjbVYyVUdGblpTQW9LU0I3WEhKY2JseDBYSFJwWmlBb0lIUm9hWE11WTNWeWNtVnVkRkJoWjJVZ0xTQXhJRHdnTVNrZ2UxeHlYRzVjZEZ4MFhIUnlaWFIxY200N1hISmNibHgwWEhSOVhISmNibHgwWEhSMGFHbHpMbU4xY25KbGJuUlFZV2RsSUMwOUlERTdYSEpjYmx4MFhIUjBhR2x6TG5SeVlXNXphWFJwYjI0b0lDaDBhR2x6TG1Gd1pYSjBkWEpsVTJsNlpTQXFJSFJvYVhNdVkzVnljbVZ1ZEZCaFoyVXBJQzBnZEdocGN5NWhjR1Z5ZEhWeVpWTnBlbVVnS1R0Y2NseHVYSFJjZEhSb2FYTXVjMlYwUTI5dWRISnZiRk4wWVhSbEtDazdYSEpjYmx4MFhIUjBhR2x6TG5ObGRFTmhjbVJUZEdGMFpTZ3BPMXh5WEc1Y2RGeDBkR2hwY3k1M2FXUm5aWFF1WVc1aGJIbDBhV056TG1OaGNtUkpiWEJ5WlhOemFXOXVjeWdwTzF4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dVhIUWdLaUJVY21GdWMybDBhVzl1SUhSb1pTQnNhWE4wWEhKY2JseDBJQ29nUUdSbGMyTnlhWEIwYVc5dUlGUnlZVzV6YVhScGIyNGdkR2hsSUd4cGMzUWdkRzhnYzJodmR5QnVaWGNnWTJGeVpITXNJSFZ6YVc1bklHVnBkR2hsY2lBbmRISmhibk5tYjNKdElIUnlZVzV6YkdGMFpUTmtKeUJwWmlCemRYQndiM0owWldRZ2IzSWdKM1J2Y0NjZ2IzUm9aWEozYVhObExseHlYRzVjZENBcUlFRnpjM1Z0WlhNZ2RHaGxJR3hwYzNRZ2FHRnpJR0VnZEhKaGJuTnBkR2x2YmlCRFUxTWdjSEp2Y0dWeWRIa2djbVZuYVhOMFpYSmxaQ0JoWjJGcGJuTjBJQ2RoYkd3bklHOXlJQ2QwYjNBbklHRnVaQ0FuZEhKaGJuTm1iM0p0SjF4eVhHNWNkQ0FxTDF4eVhHNWNkSFJ5WVc1emFYUnBiMjRnS0NCMGIzQWdLU0I3WEhKY2JseDBYSFJwWmlBb0lIUm9hWE11ZEhKaGJuTnNZWFJsTTJRZ0tTQjdYSEpjYmx4MFhIUmNkSFJvYVhNdWMzUnlhWEF1YzNSNWJHVmJaMlYwVm1WdVpHOXlVSEp2Y0dWeWRIa29KM1J5WVc1elptOXliU2NwWFNBOUlHQjBjbUZ1YzJ4aGRHVXpaQ2d3TENBdEpIdDBiM0I5Y0hnc0lEQXBZRHRjY2x4dVhIUmNkSDBnWld4elpTQjdYSEpjYmx4MFhIUmNkSFJvYVhNdWMzUnlhWEF1YzNSNWJHVXVkRzl3SUQwZ1lDMGtlM1J2Y0gxd2VHQTdYSEpjYmx4MFhIUjlYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzVjZENBcUlGTmxkQ0IwYUdVZ1kzVnljbVZ1ZENCemRHRjBaU0JtYkdGbmN5QnZaaUIwYUdVZ1kyRnlaSE5jY2x4dVhIUWdLaUJBWkdWelkzSnBjSFJwYjI0Z1VtVnpaWFFnWVd4c0lHTmhjbVJ6SUhSdklHaHBaR1JsYmlCYllYSnBZUzBzSUdSaGRHRXRYVHNnYzJWMElIWnBjMmxpYkdVZ1kyRnlaSE1nZEc4Z0ozWnBjMmxpYkdVbklGdGhjbWxoTFN3Z1pHRjBZUzFkWEhKY2JseDBJQ292WEhKY2JseDBjMlYwUTJGeVpGTjBZWFJsSUNncElIdGNjbHh1WEhSY2RIUm9hWE11Wm1seWMzUkRZWEprSUQwZ0tDQjBhR2x6TG1OMWNuSmxiblJRWVdkbElDb2dkR2hwY3k1d1lXZGxVMmw2WlNBcElDMGdkR2hwY3k1d1lXZGxVMmw2WlR0Y2NseHVYSFJjZEhSb2FYTXViR0Z6ZEVOaGNtUWdQU0IwYUdsekxtWnBjbk4wUTJGeVpDQXJJQ2dnZEdocGN5NXdZV2RsVTJsNlpTQXRJREVnS1R0Y2NseHVYSFJjZEZ4eVhHNWNkRngwVzEwdWMyeHBZMlV1WTJGc2JDZ2dkR2hwY3k1bGJDNXhkV1Z5ZVZObGJHVmpkRzl5UVd4c0tDZGJaR0YwWVMxallYSmtYU2NwSUNrdVptOXlSV0ZqYUNnb0lHTmhjbVFnS1NBOVBpQjdYSEpjYmx4MFhIUmNkR05oY21RdWMyVjBRWFIwY21saWRYUmxLQ2RoY21saExXaHBaR1JsYmljc0lDZDBjblZsSnlrN1hISmNibHgwWEhSY2RHTmhjbVF1YzJWMFFYUjBjbWxpZFhSbEtDZGtZWFJoTFdocFpHUmxiaWNzSUNkMGNuVmxKeWs3WEhKY2JseDBYSFI5S1R0Y2NseHVYSFJjZEZ4eVhHNWNkRngwWm05eUlDZ2diR1YwSUdrZ1BTQjBhR2x6TG1acGNuTjBRMkZ5WkRzZ2FTQThJSFJvYVhNdWJHRnpkRU5oY21RZ0t5QXhPeUJwS3lzZ0tTQjdYSEpjYmx4MFhIUmNkR3hsZENCallYSmtJRDBnZEdocGN5NWxiQzV4ZFdWeWVWTmxiR1ZqZEc5eVFXeHNLQ2RiWkdGMFlTMWpZWEprWFNjcFcybGRPMXh5WEc1Y2RGeDBYSFJwWmlBb0lXTmhjbVFwSUh0Y2NseHVYSFJjZEZ4MFhIUmpiMjUwYVc1MVpUdGNjbHh1WEhSY2RGeDBmU0JjY2x4dVhIUmNkRngwWTJGeVpDNXpaWFJCZEhSeWFXSjFkR1VvSjJGeWFXRXRhR2xrWkdWdUp5d2dKMlpoYkhObEp5azdYSEpjYmx4MFhIUmNkR05oY21RdWNtVnRiM1psUVhSMGNtbGlkWFJsS0Nka1lYUmhMV2hwWkdSbGJpY3BPMXh5WEc1Y2RGeDBmVngwWEhSY2RGeHlYRzVjZEgxY2NseHVYSFF2S2lwY2NseHVYSFFnS2lCRGFHVmpheUJwWmlCM1pTQmhjbVVnYjI0Z1luVm1abVZ5SUhCaFoyVmNjbHh1WEhRZ0tpQkFaR1Z6WTNKcGNIUnBiMjRnUTJobFkyc2dhV1lnZDJVZ1lYSmxJRzl1SUhSb1pTQmpZWEp2ZFhObGJDQndZV2RsSUhObGRDQmhjeUJ1WlhoMFVHRm5aVUoxWm1abGNseHlYRzVjZENBcUwxeHlYRzVjZEdselFuVm1abVZ5SUNncElIdGNjbHh1WEhSY2RISmxkSFZ5YmlCMGFHbHpMbWx6U1c1bWFXNXBkR1VnSmlZZ2RHaHBjeTVqZFhKeVpXNTBVR0ZuWlNBOVBUMGdLSFJvYVhNdWJHRnpkRkJoWjJVZ0xTQjBhR2x6TG01bGVIUlFZV2RsUW5WbVptVnlLU0FtSmlBaGRHaHBjeTVwYzAxaGVFeHZZV1JsWkR0Y2NseHVYSFI5WEhKY2JseDBMeW9xWEhKY2JseDBJQ29nVEc5aFpDQnRiM0psSUdOaGNtUnpJR1psZEdOb1pXUWdabkp2YlNCMGFHVWdjMlZ5ZG1WeUlGdHBibVpwYm1sMFpTQmpZWEp2ZFhObGJITmRYSEpjYmx4MElDb2dRR1JsYzJOeWFYQjBhVzl1SUZSeWFXZG5aWElnZEdobElIWnBaWGNnZEc4Z1ptVjBZMmdnWVc1a0lHRndjR1Z1WkNCMGFHVWdibVY0ZENCQlVFa2djR0ZuWlNCdlppQnlaWE4xYkhSeklGdGpZWEprYzEwN0lITmxkQ0JqYjI1MGNtOXNjeUJ6ZEdGMFpTQjNhR2xzYzNRZ1pHRjBZU0JwYzF4eVhHNWNkQ0FxSUdKbGFXNW5JR3h2WVdSbFpEc2diMjVqWlNCc2IyRmtaV1FnZEhKcFoyZGxjaUJ1WlhjZ1lXNWhiSGwwYVdOeklHTmhjbVJ6SUdsdWFYUnBZV3hwYzJVN0lIVndaR0YwWlNCallYSnZkWE5sYkNCaGJtUWdZMkZ5WkNCemRHRjBaU0IyWVhKcFlXSnNaWE03SUhKbGRtVnlkRnh5WEc1Y2RDQXFJR052Ym5SeWIyeHpJSE4wWVhSbGMxeHlYRzVjZENBcUwxeHlYRzVjZEd4dllXUk5iM0psUTJGeVpITWdLQ2tnZTF4eVhHNWNkRngwZEdocGN5NWlkRzVPWlhoMExtTnNZWE56VEdsemRDNWhaR1FvSjJsekxXeHZZV1JwYm1jbkxDQW5hWE10WkdsellXSnNaV1FuS1R0Y2NseHVYSFJjZEhSb2FYTXVZblJ1VG1WNGRDNXpaWFJCZEhSeWFXSjFkR1VvSjJScGMyRmliR1ZrSnl3Z0oyUnBjMkZpYkdWa0p5azdYSEpjYmx4MFhIUjBhR2x6TG5acFpYY3VZWEJ3Wlc1a1RtVjRkRkJoWjJVb0tTNTBhR1Z1S0NBb0tTQTlQaUI3WEhKY2JseDBYSFJjZEhSb2FYTXVkMmxrWjJWMExtRnVZV3g1ZEdsamN5NWpZWEprYzBsdWFYUW9LVHRjY2x4dVhIUmNkRngwZEdocGN5NXNZWE4wVUdGblpTQTlJSFJvYVhNdVoyVjBUR0Z6ZEZCaFoyVW9LVHRjZEZ4eVhHNWNkRngwWEhSMGFHbHpMbk5sZEVOaGNtUlRkR0YwWlNncE8xeHlYRzVjZEZ4MFhIUjBhR2x6TG5ObGRFTnZiblJ5YjJ4VGRHRjBaU2dwTzF4eVhHNWNkRngwWEhSMGFHbHpMbUowYms1bGVIUXVZMnhoYzNOTWFYTjBMbkpsYlc5MlpTZ25hWE10Ykc5aFpHbHVaeWNzSUNkcGN5MWthWE5oWW14bFpDY3BPMXh5WEc1Y2RGeDBmU2s3WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc1Y2RDQXFJRkpsYzJWMElIUm9aU0JqWVhKdmRYTmxiQ0IwYnlCbWFYSnpkQ0J3WVdkbFhISmNibHgwSUNvZ1FHUmxjMk55YVhCMGFXOXVJRkpsYzJWMElIUm9aU0JqWVhKdmRYTmxiQ0IwYnlCemFHOTNJSFJvWlNCbWFYSnpkQ0J3WVdkbE95QnlaWE5sZENCaGJHd2dZMkZ5YjNWelpXd2djM1JoZEdVZ2RtRnlhV0ZpYkdWeklHRnVaQ0J6WlhRZ1kyOXVkSEp2YkhNZ2MzUmhkR1U3WEhKY2JseDBJQ29nWTJobFkyc2dhV1lnZDJVZ1lYSmxJRzl1SUdKMVptWmxjaUJ3WVdkbElHRnVaQ0JwWmlCMGNuVmxJR3h2WVdRZ2JXOXlaU0JqWVhKa2MxeHlYRzVjZENBcUwxeHlYRzVjZEhKbGMyVjBJQ2dwSUh0Y2NseHVYSFJjZEhSb2FYTXVkSEpoYm5OcGRHbHZiaWdnTUNBcE8xeHlYRzVjZEZ4MGRHaHBjeTVqZFhKeVpXNTBVR0ZuWlNBOUlERTdYSEpjYmx4MFhIUjBhR2x6TG14aGMzUlFZV2RsSUQwZ2RHaHBjeTVuWlhSTVlYTjBVR0ZuWlNncE8xeHlYRzVjZEZ4MGRHaHBjeTVwYzAxaGVFeHZZV1JsWkNBOUlHWmhiSE5sTzF4eVhHNWNkRngwZEdocGN5NXpaWFJEYjI1MGNtOXNVM1JoZEdVb0tUdGNjbHh1WEhSY2RIUm9hWE11YzJWMFEyRnlaRk4wWVhSbEtDazdYSEpjYmx4MFhIUjBhR2x6TG1selFuVm1abVZ5S0NrZ0ppWWdkR2hwY3k1c2IyRmtUVzl5WlVOaGNtUnpLQ2s3WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc1Y2RDQXFJRkpsWm5KbGMyZ2dkR2hsSUdOaGNtOTFjMlZzWEhKY2JseDBJQ29nUUdSbGMyTnlhWEIwYVc5dUlGVndaR0YwWlNCallYSnZkWE5sYkNCemRHRjBaU0IyWVhKcFlXSnNaWE1nYkdGemRDQndZV2RsWEhKY2JseDBJQ292WEhKY2JseDBjbVZtY21WemFDQW9LU0I3WEhKY2JseDBYSFIwYUdsekxteGhjM1JRWVdkbElEMGdkR2hwY3k1blpYUk1ZWE4wVUdGblpTZ3BPMXh5WEc1Y2RIMWNjbHh1ZlZ4eVhHNWNjbHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdRMkZ5YjNWelpXdzdJbDE5IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcclxuICogUmV0dXJuIHRoZSBjb3JyZWN0IHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSBuYW1lIGZvciBhIGdpdmVuIHN0eWxlIHByb3BlcnR5XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBUaGUgcmVxdWlyZWQgcHJvcGVydHkgbmFtZVxyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5IG5hbWVcclxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmZ1bmN0aW9uIGdldFZlbmRvclByb3BlcnR5KHByb3BlcnR5KSB7XG4gIHZhciBwcm9wcyA9IHtcbiAgICB0cmFuc2Zvcm06IFsndHJhbnNmb3JtJywgJ21zVHJhbnNmb3JtJywgJ3dlYmtpdFRyYW5zZm9ybScsICdtb3pUcmFuc2Zvcm0nLCAnb1RyYW5zZm9ybSddXG4gIH07XG4gIHZhciB2ZW5kb3JQcm9wcyA9IHByb3BzW3Byb3BlcnR5XS5maWx0ZXIoZnVuY3Rpb24gKHByb3ApIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50LmJvZHkuc3R5bGVbcHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gcHJvcDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdmVuZG9yUHJvcHMubGVuZ3RoID8gdmVuZG9yUHJvcHNbMF0gOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGdldFZlbmRvclByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMloxYm1SeVlXbHpaWEl0YkdWaFpHVnlZbTloY21RdlltOTNaWEpmWTI5dGNHOXVaVzUwY3k5cWRYTjBaMmwyYVc1bkxYZHBaR2RsZEMxbWNtRnRaWGR2Y21zdlkyOXRjRzl1Wlc1MGN5OXNhV0l2YW5NdlJFOU5MMmRsZEZabGJtUnZjbEJ5YjNCbGNuUjVMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUpCUVVGQkxGbEJRVmtzUTBGQlF6czdPenM3T3pzN096dEJRVTlpTEZOQlFWTXNhVUpCUVdsQ0xFTkJRVVVzVVVGQlVTeEZRVUZITzBGQlEzUkRMRTFCUVVrc1MwRkJTeXhIUVVGSE8wRkJRMWdzWVVGQlV5eEZRVUZGTEVOQlFVTXNWMEZCVnl4RlFVRkZMR0ZCUVdFc1JVRkJSU3hwUWtGQmFVSXNSVUZCUlN4alFVRmpMRVZCUVVVc1dVRkJXU3hEUVVGRE8wZEJRM2hHTEVOQlFVTTdRVUZEUXl4TlFVRkpMRmRCUVZjc1IwRkJSeXhMUVVGTExFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNUVUZCVFN4RFFVRkRMRlZCUVVNc1NVRkJTU3hGUVVGTE8wRkJRMnhFTEZGQlFVa3NUMEZCVHl4UlFVRlJMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4WFFVRlhMRVZCUVVVN1FVRkRMME1zWVVGQlR5eEpRVUZKTEVOQlFVTTdTMEZEWmp0SFFVTktMRU5CUVVNc1EwRkJRenRCUVVOSUxGTkJRVThzVjBGQlZ5eERRVUZETEUxQlFVMHNSMEZCUnl4WFFVRlhMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVTBGQlV5eERRVUZETzBOQlF6RkVPenR4UWtGRll5eHBRa0ZCYVVJaUxDSm1hV3hsSWpvaVF6b3ZkR1Z0Y0M5SFJ5NUdjbTl1ZEVWdVpDNVhhV1JuWlhSekwzZHBaR2RsZEhNdlpuVnVaSEpoYVhObGNpMXNaV0ZrWlhKaWIyRnlaQzlpYjNkbGNsOWpiMjF3YjI1bGJuUnpMMnAxYzNSbmFYWnBibWN0ZDJsa1oyVjBMV1p5WVcxbGQyOXlheTlqYjIxd2IyNWxiblJ6TDJ4cFlpOXFjeTlFVDAwdloyVjBWbVZ1Wkc5eVVISnZjR1Z5ZEhrdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUluZFhObElITjBjbWxqZENjN1hISmNibHh5WEc0dktpcGNjbHh1SUNvZ1VtVjBkWEp1SUhSb1pTQmpiM0p5WldOMElIWmxibVJ2Y2kxd2NtVm1hWGhsWkNCd2NtOXdaWEowZVNCdVlXMWxJR1p2Y2lCaElHZHBkbVZ1SUhOMGVXeGxJSEJ5YjNCbGNuUjVYSEpjYmlBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCVWFHVWdjbVZ4ZFdseVpXUWdjSEp2Y0dWeWRIa2dibUZ0WlZ4eVhHNGdLaUJBY21WMGRYSnVjeUI3VTNSeWFXNW5mU0JVYUdVZ2RtVnVaRzl5TFhCeVpXWnBlR1ZrSUhCeWIzQmxjblI1SUc1aGJXVmNjbHh1SUNvdlhISmNibVoxYm1OMGFXOXVJR2RsZEZabGJtUnZjbEJ5YjNCbGNuUjVLQ0J3Y205d1pYSjBlU0FwSUh0Y2NseHVYSFJzWlhRZ2NISnZjSE1nUFNCN1hISmNibHgwWEhSMGNtRnVjMlp2Y20wNklGc25kSEpoYm5ObWIzSnRKeXdnSjIxelZISmhibk5tYjNKdEp5d2dKM2RsWW10cGRGUnlZVzV6Wm05eWJTY3NJQ2R0YjNwVWNtRnVjMlp2Y20wbkxDQW5iMVJ5WVc1elptOXliU2RkWEhKY2JseDBmVHRjY2x4dUlDQWdJR3hsZENCMlpXNWtiM0pRY205d2N5QTlJSEJ5YjNCelczQnliM0JsY25SNVhTNW1hV3gwWlhJb0tIQnliM0FwSUQwK0lIdGNjbHh1SUNBZ0lGeDBhV1lnS0hSNWNHVnZaaUJrYjJOMWJXVnVkQzVpYjJSNUxuTjBlV3hsVzNCeWIzQmRJQ0U5UFNBbmRXNWtaV1pwYm1Wa0p5a2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NISnZjRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNCOUtUdGNjbHh1SUNBZ0lISmxkSFZ5YmlCMlpXNWtiM0pRY205d2N5NXNaVzVuZEdnZ1B5QjJaVzVrYjNKUWNtOXdjMXN3WFNBNklIVnVaR1ZtYVc1bFpEdGNjbHh1ZlZ4eVhHNWNjbHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdaMlYwVm1WdVpHOXlVSEp2Y0dWeWRIazdYSEpjYmlKZGZRPT0iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxyXG4gKiBBZGQgYW5hbHl0aWNzIHRyYWNraW5nIHRvIGEgd2lkZ2V0XHJcbiAqIEBjbGFzc2Rlc2MgQWRkIGFuYWx5dGljcyBsaXN0ZW5lcnMgYW5kIGV2ZW50cyBmb3IgW2tpc3NtZXRyaWNzXSBhbmFseXRpY3MgZnJhbWV3b3JrXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLmNvbmZpZy4gSGFzaCBvZiB3aWRnZXQgY29uZmlnIG9wdGlvbnNcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMud2lkZ2V0LiBUaGUgd2lkZ2V0IGluc3RhbmNlIFtyZXF1aXJlZF1cclxuICogQGNsYXNzIFNldCBhbmFseXRpY3MgaW5zdGFuY2UgcHJvcGVydGllczsgaW5pdGlhbGlzZSBhbmFseXRpY3NcclxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG5cdHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbnZhciBBbmFseXRpY3MgPSAoZnVuY3Rpb24gKCkge1xuXHRmdW5jdGlvbiBBbmFseXRpY3MoKSB7XG5cdFx0dmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuXHRcdHZhciB3aWRnZXQgPSBfcmVmLndpZGdldDtcblx0XHR2YXIgY29uZmlnSGFzaCA9IF9yZWYuY29uZmlnSGFzaDtcblxuXHRcdF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbmFseXRpY3MpO1xuXG5cdFx0dGhpcy53aWRnZXQgPSB3aWRnZXQ7XG5cdFx0aWYgKCF0aGlzLndpZGdldCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmNvbmZpZ0hhc2ggPSBjb25maWdIYXNoIHx8IHt9O1xuXHRcdHRoaXMuaW5pdCgpO1xuXHR9XG5cblx0LyoqXHJcbiBcdCogSW5pdGlhbGlzZSBhbmFseXRpY3NcclxuIFx0KiBAZGVzY3JpcHRpb24gQ2FjaGUgdGhlIHdpZGdldCBlbGVtZW50OyBmZXRjaCBhbmFseXRpY3MgdmFsdWVzIG9uIHRoZSB3aWRnZXQgZWxlbWVudDsgdHJpZ2dlciBhbmFseXRpY3MgbWV0aG9kc1xyXG4gXHQqL1xuXG5cdF9jcmVhdGVDbGFzcyhBbmFseXRpY3MsIFt7XG5cdFx0a2V5OiAnaW5pdCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG5cdFx0XHR0aGlzLndpZGdldEVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtYW5hbHl0aWNzLXdpZGdldF0nKTtcblx0XHRcdGlmICh0aGlzLndpZGdldEVsKSB7XG5cdFx0XHRcdHRoaXMud2lkZ2V0TmFtZSA9IHRoaXMud2lkZ2V0RWwuZ2V0QXR0cmlidXRlKCdkYXRhLWFuYWx5dGljcy13aWRnZXQnKTtcblx0XHRcdFx0dGhpcy5jaGFyaXR5SWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jaGFyaXR5LWlkXScpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2hhcml0eS1pZF0nKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2hhcml0eS1pZCcpIDogJyc7XG5cdFx0XHRcdHRoaXMuZnJwSWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jaGFyaXR5LWZycElkXScpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2hhcml0eS1mcnBJZF0nKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2hhcml0eS1mcnBJZCcpIDogJyc7XG5cblx0XHRcdFx0dGhpcy5wdXNoQ29uZmlnKCk7XG5cdFx0XHRcdHRoaXMud2lkZ2V0SW5pdCgpO1xuXHRcdFx0XHR0aGlzLmNhcmRzSW5pdCgpO1xuXHRcdFx0XHR0aGlzLmNhcmRJbXByZXNzaW9ucygpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBQdXNoIHVzZXIgY29uZmlnIGhhc2ggW2luY2x1ZGluZyBwYXJlbnQgcGFnZSdzIHJlZmVycmVyXSB0byBraXNzbWV0cmljcyBhcyBwcm9wZXJ0eVxyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ3B1c2hDb25maWcnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBwdXNoQ29uZmlnKCkge1xuXHRcdFx0X2ttcS5wdXNoKFsnc2V0JywgdGhpcy5jb25maWdIYXNoXSk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIEluaXRpYWxpc2Ugd2lkZ2V0IGFuYWx5dGljcyBkYXRhIGhhc2hcclxuICBcdCogQGRlc2NyaXB0aW9uIENyZWF0ZSBhIGhhc2ggb2Ygd2lkZ2V0LWxldmVsIGFuYWx5dGljcyB2YWx1ZXM7IHN0b3JlIGl0IG9uIHRoZSB3aWRnZXQgZWxlbWVudDsgXHJcbiAgXHQqIHJlZ2lzdGVyIGNsaWNrIGxpc3RlbmVyIG9uIHdpZGdldCBlbGVtZW50XHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAnd2lkZ2V0SW5pdCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHdpZGdldEluaXQoKSB7XG5cdFx0XHR2YXIgX3RoaXMgPSB0aGlzO1xuXG5cdFx0XHR2YXIgYW5hbHl0aWNzRGF0YSA9IHtcblx0XHRcdFx0cGFnZV90eXBlOiAnd2lkZ2V0JywgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHRcdCdldmVudCc6ICdwYWdlIGNsaWNrJyxcblx0XHRcdFx0YWN0aXZpdHlfdHlwZTogdGhpcy53aWRnZXROYW1lLCAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0Y2hhcml0eV9pZDogdGhpcy5jaGFyaXR5SWQsIC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRwYWdlX2lkOiB0aGlzLmZycElkIC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0fTtcblx0XHRcdHRoaXMud2lkZ2V0RWwuYW5hbHl0aWNzID0gYW5hbHl0aWNzRGF0YTtcblxuXHRcdFx0dGhpcy53aWRnZXRFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdF90aGlzLndpZGdldENsaWNrKGUpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIFB1c2gga2lzc21ldHJpY3MgTk9OLWNhcmQgY2xpY2sgZXZlbnRzXHJcbiAgXHQqIEBkZXNjcmlwdGlvbiBIYW5kbGUgbm9uLWNhcmQgY2xpY2sgZXZlbnRzIG9uIHRoZSB3aWRnZXQgdXNpbmcgZXZlbnQgZGVsZWdhdGlvbi4gQ3JlYXRlIGNsaWNrIHZhbHVlcyBoYXNoIGZvciB0YXJnZXQgZWxlbWVudHMgXHJcbiAgXHQqIGFuZCBmaXJlIGtpc3NtZXRyaWNzIHBhZ2UgY2xpY2sgZXZlbnRcclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICd3aWRnZXRDbGljaycsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHdpZGdldENsaWNrKGUpIHtcblx0XHRcdHZhciBldnQgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzLWV2ZW50Jyk7XG5cdFx0XHRpZiAoZXZ0KSB7XG5cdFx0XHRcdHZhciBjbGlja0RhdGEgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLndpZGdldEVsLmFuYWx5dGljcyk7XG5cdFx0XHRcdGNsaWNrRGF0YS5zdWJ0eXBlID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWFuYWx5dGljcy1zdWJ0eXBlJyk7XG5cdFx0XHRcdGNsaWNrRGF0YS5ldmVudF92YWx1ZSA9IGV2dDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHRcdF9rbXEucHVzaChbJ3JlY29yZCcsICdwYWdlIGNsaWNrJywgY2xpY2tEYXRhXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIEluaXRpYWxpc2UgY2FyZCBhbmFseXRpY3MgZGF0YSBoYXNoXHJcbiAgXHQqIEBkZXNjcmlwdGlvbiBGb3IgZWFjaCBjYXJkIGluIHRoZSBET00gY3JlYXRlIGEgY2FyZCBhbmFseXRpY3MgaGFzaCBhbmQgc3RvcmUgaXQgb24gdGhlIGNhcmQgW2lmIG5vbmUgYWxyZWFkeSBwcmVzZW50XTtcclxuICBcdCogYW5kIGFkZCBjbGljayBsaXN0bmVyXHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAnY2FyZHNJbml0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gY2FyZHNJbml0KCkge1xuXHRcdFx0dmFyIF90aGlzMiA9IHRoaXM7XG5cblx0XHRcdHZhciBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFuYWx5dGljcy1jYXJkXScpO1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0XHRbXS5zbGljZS5jYWxsKGNhcmRzKS5mb3JFYWNoKGZ1bmN0aW9uIChjYXJkLCBpbmRleCkge1xuXHRcdFx0XHRjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1jYXJkLXJhbmsnLCBpbmRleCk7XG5cdFx0XHRcdGlmICghY2FyZC5hbmFseXRpY3MpIHtcblx0XHRcdFx0XHR2YXIgYW5hbHl0aWNzRGF0YSA9IHt9O1xuXHRcdFx0XHRcdHZhciBjaGFyaXR5SWQgPSBjYXJkLmdldEF0dHJpYnV0ZSgnZGF0YS1jaGFyaXR5LWlkJykgfHwgJyc7XG5cdFx0XHRcdFx0dmFyIGFjdGl2aXR5SWQgPSBjYXJkLmdldEF0dHJpYnV0ZSgnZGF0YS1hY3Rpdml0eS1pZCcpIHx8ICcnO1xuXHRcdFx0XHRcdHZhciBjYXJkUmFuayA9IGNhcmQuZ2V0QXR0cmlidXRlKCdkYXRhLWNhcmQtcmFuaycpO1xuXHRcdFx0XHRcdHZhciBjYXJkRnJwSWQgPSBjYXJkLmdldEF0dHJpYnV0ZSgnZGF0YS1mcnAtaWQnKSB8fCAnJztcblx0XHRcdFx0XHR2YXIgY2FyZFVybCA9IGNhcmQuZ2V0QXR0cmlidXRlKCdkYXRhLWNhcmQtdXJsJykgfHwgJyc7XG5cblx0XHRcdFx0XHRhbmFseXRpY3NEYXRhLnBhZ2VfdHlwZSA9ICd3aWRnZXQnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0XHRhbmFseXRpY3NEYXRhLmNhcmRfaWQgPSBfdGhpczIud2lkZ2V0TmFtZSArICctJyArIGNoYXJpdHlJZCArICctJyArIGFjdGl2aXR5SWQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRcdGFuYWx5dGljc0RhdGEuY2FyZF9yYW5rID0gY2FyZFJhbms7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRcdGFuYWx5dGljc0RhdGEuYWN0aXZpdHlfaWQgPSBhY3Rpdml0eUlkOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0XHRhbmFseXRpY3NEYXRhLmFjdGl2aXR5X3R5cGUgPSBfdGhpczIud2lkZ2V0TmFtZTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHRcdFx0YW5hbHl0aWNzRGF0YS5jaGFyaXR5X2lkID0gY2hhcml0eUlkOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0XHRhbmFseXRpY3NEYXRhLnBhZ2VfaWQgPSBjYXJkRnJwSWQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRcdGFuYWx5dGljc0RhdGEuY2FyZF91cmwgPSBjYXJkVXJsOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuXHRcdFx0XHRcdGNhcmQuYW5hbHl0aWNzID0gYW5hbHl0aWNzRGF0YTtcblxuXHRcdFx0XHRcdGNhcmQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdHNlbGYuY2FyZENsaWNrKGUsIHRoaXMpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogUHVzaCBraXNzbWV0cmljcyBjYXJkIGltcHJlc3Npb25zXHJcbiAgXHQqIEBkZXNjcmlwdGlvbiBGb3IgYWxsIHZpc2libGUgY2FyZHMsIGNyZWF0ZSBhIGNhcmQgaW1wcmVzc2lvbiBhbmFseXRpY3MgaGFzaCBhbmQgZmlyZSBhIGtpc3NtZXRyaWNzIGNhcmQgaW1wcmVzc2lvbiBldmVudFxyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ2NhcmRJbXByZXNzaW9ucycsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGNhcmRJbXByZXNzaW9ucygpIHtcblx0XHRcdHZhciBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFuYWx5dGljcy1jYXJkXTpub3QoW2RhdGEtaGlkZGVuXSknKTtcblx0XHRcdFtdLnNsaWNlLmNhbGwoY2FyZHMpLmZvckVhY2goZnVuY3Rpb24gKGNhcmQpIHtcblx0XHRcdFx0dmFyIGltcHJlc3Npb25EYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgY2FyZC5hbmFseXRpY3MpO1xuXHRcdFx0XHRpbXByZXNzaW9uRGF0YS5ldmVudCA9ICdpbXByZXNzaW9uJztcblx0XHRcdFx0aW1wcmVzc2lvbkRhdGEuY2FyZF9jb3VudCA9IGNhcmRzLmxlbmd0aDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHRcdF9rbXEucHVzaChbJ3JlY29yZCcsICdpbXByZXNzaW9uJywgaW1wcmVzc2lvbkRhdGFdKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBQdXNoIGtpc3NtZXRyaWNzIGNhcmQgY2xpY2sgZXZlbnRzXHJcbiAgXHQqIEBkZXNjcmlwdGlvbiBIYW5kbGUgY2FyZCBjbGljayBldmVudHMgb24gdGhlIHdpZGdldCB1c2luZyBldmVudCBkZWxlZ2F0aW9uLiBDcmVhdGUgYSBjYXJkIGNsaWNrIHZhbHVlcyBoYXNoIGZvciB0YXJlZ3QgY2FyZFxyXG4gIFx0KiBhbmQgZmlyZSBhIGtpc3NtZXRyaWNzIGNhcmQgY2xpY2sgZXZlbnQgXHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAnY2FyZENsaWNrJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gY2FyZENsaWNrKGUsIGNhcmQpIHtcblx0XHRcdHZhciBldnQgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzLWV2ZW50Jyk7XG5cdFx0XHRpZiAoZXZ0KSB7XG5cdFx0XHRcdHZhciBjbGlja0RhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBjYXJkLmFuYWx5dGljcyk7XG5cdFx0XHRcdGNsaWNrRGF0YS5ldmVudCA9ICdjYXJkIGNsaWNrJztcblx0XHRcdFx0Y2xpY2tEYXRhLnN1YnR5cGUgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzLXN1YnR5cGUnKTtcblx0XHRcdFx0Y2xpY2tEYXRhLmV2ZW50X3ZhbHVlID0gZXZ0OyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0Y2xpY2tEYXRhLmNhcmRfY291bnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hbmFseXRpY3MtY2FyZF06bm90KFtkYXRhLWhpZGRlbl0pJykubGVuZ3RoOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0X2ttcS5wdXNoKFsncmVjb3JkJywgJ2NhcmQgY2xpY2snLCBjbGlja0RhdGFdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gQW5hbHl0aWNzO1xufSkoKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gQW5hbHl0aWNzO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMloxYm1SeVlXbHpaWEl0YkdWaFpHVnlZbTloY21RdlltOTNaWEpmWTI5dGNHOXVaVzUwY3k5cWRYTjBaMmwyYVc1bkxYZHBaR2RsZEMxbWNtRnRaWGR2Y21zdlkyOXRjRzl1Wlc1MGN5OXNhV0l2YW5NdlpuSmhiV1YzYjNKckwwRnVZV3g1ZEdsamN5NXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4WlFVRlpMRU5CUVVNN096czdPenM3T3pzN096czdPenM3T3p0SlFWVlFMRk5CUVZNN1FVRkRSaXhWUVVSUUxGTkJRVk1zUjBGRE9FSTdiVVZCUVV3c1JVRkJSVHM3VFVGQmVrSXNUVUZCVFN4UlFVRk9MRTFCUVUwN1RVRkJSU3hWUVVGVkxGRkJRVllzVlVGQlZUczdkMEpCUkRkQ0xGTkJRVk03TzBGQlJXSXNUVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhOUVVGTkxFTkJRVU03UVVGRGNrSXNUVUZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFVkJRVWM3UVVGRGJrSXNWVUZCVHp0SFFVTlFPMEZCUTBRc1RVRkJTU3hEUVVGRExGVkJRVlVzUjBGQlJ5eFZRVUZWTEVsQlFVa3NSVUZCUlN4RFFVRkRPMEZCUTI1RExFMUJRVWtzUTBGQlF5eEpRVUZKTEVWQlFVVXNRMEZCUXp0RlFVTmFPenM3T3pzN08yTkJVa2tzVTBGQlV6czdVMEZoVkN4blFrRkJSenRCUVVOUUxFOUJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVY3NVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJReXg1UWtGQmVVSXNRMEZCUXl4RFFVRkRPMEZCUTJ4RkxFOUJRVWtzU1VGQlNTeERRVUZETEZGQlFWRXNSVUZCUlR0QlFVTnNRaXhSUVVGSkxFTkJRVU1zVlVGQlZTeEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1dVRkJXU3hEUVVGRExIVkNRVUYxUWl4RFFVRkRMRU5CUVVNN1FVRkRkRVVzVVVGQlNTeERRVUZETEZOQlFWTXNSMEZCUnl4UlFVRlJMRU5CUVVNc1lVRkJZU3hEUVVGRExHMUNRVUZ0UWl4RFFVRkRMRWRCUXpORUxGRkJRVkVzUTBGQlF5eGhRVUZoTEVOQlFVTXNiVUpCUVcxQ0xFTkJRVU1zUTBGQlF5eFpRVUZaTEVOQlFVTXNhVUpCUVdsQ0xFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTTdRVUZEYkVZc1VVRkJTU3hEUVVGRExFdEJRVXNzUjBGQlJ5eFJRVUZSTEVOQlFVTXNZVUZCWVN4RFFVRkRMSE5DUVVGelFpeERRVUZETEVkQlF6RkVMRkZCUVZFc1EwRkJReXhoUVVGaExFTkJRVU1zYzBKQlFYTkNMRU5CUVVNc1EwRkJReXhaUVVGWkxFTkJRVU1zYjBKQlFXOUNMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03TzBGQlJYaEdMRkZCUVVrc1EwRkJReXhWUVVGVkxFVkJRVVVzUTBGQlF6dEJRVU5zUWl4UlFVRkpMRU5CUVVNc1ZVRkJWU3hGUVVGRkxFTkJRVU03UVVGRGJFSXNVVUZCU1N4RFFVRkRMRk5CUVZNc1JVRkJSU3hEUVVGRE8wRkJRMnBDTEZGQlFVa3NRMEZCUXl4bFFVRmxMRVZCUVVVc1EwRkJRenRKUVVOMlFqdEhRVU5FT3pzN096czdPMU5CU1ZVc2MwSkJRVWM3UVVGRFlpeFBRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1MwRkJTeXhGUVVGRkxFbEJRVWtzUTBGQlF5eFZRVUZWTEVOQlFVTXNRMEZCUXl4RFFVRkRPMGRCUTNCRE96czdPenM3T3pzN1UwRk5WU3h6UWtGQlJ6czdPMEZCUTJJc1QwRkJTU3hoUVVGaExFZEJRVWM3UVVGRGJrSXNZVUZCVXl4RlFVRkZMRkZCUVZFN1FVRkRia0lzVjBGQlR5eEZRVUZGTEZsQlFWazdRVUZEY2tJc2FVSkJRV0VzUlVGQlJTeEpRVUZKTEVOQlFVTXNWVUZCVlR0QlFVTTVRaXhqUVVGVkxFVkJRVVVzU1VGQlNTeERRVUZETEZOQlFWTTdRVUZETVVJc1YwRkJUeXhGUVVGRkxFbEJRVWtzUTBGQlF5eExRVUZMTzBsQlEyNUNMRU5CUVVNN1FVRkRSaXhQUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEZOQlFWTXNSMEZCUnl4aFFVRmhMRU5CUVVNN08wRkJSWGhETEU5QlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNUMEZCVHl4RlFVRkZMRlZCUVVVc1EwRkJReXhGUVVGTk8wRkJRMmhFTEZWQlFVc3NWMEZCVnl4RFFVRkZMRU5CUVVNc1EwRkJSU3hEUVVGRE8wbEJRM1JDTEVOQlFVTXNRMEZCUXp0SFFVTklPenM3T3pzN096czdVMEZOV1N4eFFrRkJSU3hEUVVGRExFVkJRVWM3UVVGRGJFSXNUMEZCU1N4SFFVRkhMRWRCUVVjc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eFpRVUZaTEVOQlFVTXNjMEpCUVhOQ0xFTkJRVU1zUTBGQlF6dEJRVU40UkN4UFFVRkpMRWRCUVVjc1JVRkJSVHRCUVVOU0xGRkJRVWtzVTBGQlV5eEhRVUZITEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1JVRkJSU3hGUVVGRkxFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNVMEZCVXl4RFFVRkZMRU5CUVVNN1FVRkROVVFzWVVGQlV5eERRVUZETEU5QlFVOHNSMEZCUnl4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExGbEJRVmtzUTBGQlF5eDNRa0ZCZDBJc1EwRkJReXhEUVVGRE8wRkJRM0JGTEdGQlFWTXNRMEZCUXl4WFFVRlhMRWRCUVVjc1IwRkJSeXhEUVVGRE8wRkJRelZDTEZGQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhSUVVGUkxFVkJRVVVzV1VGQldTeEZRVUZGTEZOQlFWTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkRMME03UjBGRFJEczdPenM3T3pzN08xTkJUVlVzY1VKQlFVYzdPenRCUVVOaUxFOUJRVWtzUzBGQlN5eEhRVUZITEZGQlFWRXNRMEZCUXl4blFrRkJaMElzUTBGQlF5eDFRa0ZCZFVJc1EwRkJReXhEUVVGRE8wRkJReTlFTEU5QlFVa3NTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJRenM3UVVGRmFFSXNTMEZCUlN4RFFVRkRMRXRCUVVzc1EwRkJReXhKUVVGSkxFTkJRVVVzUzBGQlN5eERRVUZGTEVOQlFVTXNUMEZCVHl4RFFVRkRMRlZCUVVVc1NVRkJTU3hGUVVGRkxFdEJRVXNzUlVGQlRUdEJRVU5xUkN4UlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExHZENRVUZuUWl4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJRek5ETEZGQlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNc1UwRkJVeXhGUVVGSE8wRkJRM1JDTEZOQlFVa3NZVUZCWVN4SFFVRkhMRVZCUVVVc1EwRkJRenRCUVVOMlFpeFRRVUZKTEZOQlFWTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExHbENRVUZwUWl4RFFVRkRMRWxCUVVrc1JVRkJSU3hEUVVGRE8wRkJRek5FTEZOQlFVa3NWVUZCVlN4SFFVRkhMRWxCUVVrc1EwRkJReXhaUVVGWkxFTkJRVU1zYTBKQlFXdENMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU03UVVGRE4wUXNVMEZCU1N4UlFVRlJMRWRCUVVjc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhEUVVGRE8wRkJRMjVFTEZOQlFVa3NVMEZCVXl4SFFVRkhMRWxCUVVrc1EwRkJReXhaUVVGWkxFTkJRVU1zWVVGQllTeERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRPMEZCUTNaRUxGTkJRVWtzVDBGQlR5eEhRVUZITEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1pVRkJaU3hEUVVGRExFbEJRVWtzUlVGQlJTeERRVUZET3p0QlFVVjJSQ3hyUWtGQllTeERRVUZETEZOQlFWTXNSMEZCUnl4UlFVRlJMRU5CUVVNN1FVRkRia01zYTBKQlFXRXNRMEZCUXl4UFFVRlBMRWRCUVUwc1QwRkJTeXhWUVVGVkxGTkJRVWtzVTBGQlV5eFRRVUZKTEZWQlFWVXNRVUZCUlN4RFFVRkRPMEZCUTNoRkxHdENRVUZoTEVOQlFVTXNVMEZCVXl4SFFVRkhMRkZCUVZFc1EwRkJRenRCUVVOdVF5eHJRa0ZCWVN4RFFVRkRMRmRCUVZjc1IwRkJSeXhWUVVGVkxFTkJRVU03UVVGRGRrTXNhMEpCUVdFc1EwRkJReXhoUVVGaExFZEJRVWNzVDBGQlN5eFZRVUZWTEVOQlFVTTdRVUZET1VNc2EwSkJRV0VzUTBGQlF5eFZRVUZWTEVkQlFVY3NVMEZCVXl4RFFVRkRPMEZCUTNKRExHdENRVUZoTEVOQlFVTXNUMEZCVHl4SFFVRkhMRk5CUVZNc1EwRkJRenRCUVVOc1F5eHJRa0ZCWVN4RFFVRkRMRkZCUVZFc1IwRkJSeXhQUVVGUExFTkJRVU03TzBGQlJXcERMRk5CUVVrc1EwRkJReXhUUVVGVExFZEJRVWNzWVVGQllTeERRVUZET3p0QlFVVXZRaXhUUVVGSkxFTkJRVU1zWjBKQlFXZENMRU5CUVVNc1QwRkJUeXhGUVVGRkxGVkJRVmNzUTBGQlF5eEZRVUZITzBGQlF6ZERMRTlCUVVNc1EwRkJReXhsUVVGbExFVkJRVVVzUTBGQlF6dEJRVU53UWl4VlFVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRkxFTkJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVVXNRMEZCUXp0TlFVTXhRaXhEUVVGRExFTkJRVU03UzBGRFNEdEpRVU5FTEVOQlFVTXNRMEZCUXp0SFFVTklPenM3T3pzN096dFRRVXRsTERKQ1FVRkhPMEZCUTJ4Q0xFOUJRVWtzUzBGQlN5eEhRVUZITEZGQlFWRXNRMEZCUXl4blFrRkJaMElzUTBGQlF5d3dRMEZCTUVNc1EwRkJReXhEUVVGRE8wRkJRMnhHTEV0QlFVVXNRMEZCUXl4TFFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRkxFdEJRVXNzUTBGQlJTeERRVUZETEU5QlFVOHNRMEZCUXl4VlFVRkZMRWxCUVVrc1JVRkJUVHRCUVVNeFF5eFJRVUZKTEdOQlFXTXNSMEZCUnl4TlFVRk5MRU5CUVVNc1RVRkJUU3hEUVVGRExFVkJRVVVzUlVGQlJTeEpRVUZKTEVOQlFVTXNVMEZCVXl4RFFVRkZMRU5CUVVNN1FVRkRlRVFzYTBKQlFXTXNRMEZCUXl4TFFVRkxMRWRCUVVjc1dVRkJXU3hEUVVGRE8wRkJRM0JETEd0Q1FVRmpMRU5CUVVNc1ZVRkJWU3hIUVVGSExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTTdRVUZEZWtNc1VVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEZGQlFWRXNSVUZCUlN4WlFVRlpMRVZCUVVVc1kwRkJZeXhEUVVGRExFTkJRVU1zUTBGQlF6dEpRVU53UkN4RFFVRkRMRU5CUVVNN1IwRkRTRHM3T3pzN096czdPMU5CVFZNc2JVSkJRVVVzUTBGQlF5eEZRVUZGTEVsQlFVa3NSVUZCUnp0QlFVTnlRaXhQUVVGSkxFZEJRVWNzUjBGQlJ5eERRVUZETEVOQlFVTXNUVUZCVFN4RFFVRkRMRmxCUVZrc1EwRkJReXh6UWtGQmMwSXNRMEZCUXl4RFFVRkRPMEZCUTNoRUxFOUJRVWtzUjBGQlJ5eEZRVUZGTzBGQlExSXNVVUZCU1N4VFFVRlRMRWRCUVVjc1RVRkJUU3hEUVVGRExFMUJRVTBzUTBGQlF5eEZRVUZGTEVWQlFVVXNTVUZCU1N4RFFVRkRMRk5CUVZNc1EwRkJReXhEUVVGRE8wRkJRMnhFTEdGQlFWTXNRMEZCUXl4TFFVRkxMRWRCUVVjc1dVRkJXU3hEUVVGRE8wRkJReTlDTEdGQlFWTXNRMEZCUXl4UFFVRlBMRWRCUVVjc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eFpRVUZaTEVOQlFVTXNkMEpCUVhkQ0xFTkJRVU1zUTBGQlF6dEJRVU53UlN4aFFVRlRMRU5CUVVNc1YwRkJWeXhIUVVGSExFZEJRVWNzUTBGQlF6dEJRVU0xUWl4aFFVRlRMRU5CUVVNc1ZVRkJWU3hIUVVGSExGRkJRVkVzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXd3UTBGQk1FTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJRenRCUVVOd1J5eFJRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1VVRkJVU3hGUVVGRkxGbEJRVmtzUlVGQlJTeFRRVUZUTEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUXk5RE8wZEJRMFE3T3p0UlFYQkpTU3hUUVVGVE96czdjVUpCZFVsQkxGTkJRVk1pTENKbWFXeGxJam9pUXpvdmRHVnRjQzlIUnk1R2NtOXVkRVZ1WkM1WGFXUm5aWFJ6TDNkcFpHZGxkSE12Wm5WdVpISmhhWE5sY2kxc1pXRmtaWEppYjJGeVpDOWliM2RsY2w5amIyMXdiMjVsYm5SekwycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5cWN5OW1jbUZ0WlhkdmNtc3ZRVzVoYkhsMGFXTnpMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUozVnpaU0J6ZEhKcFkzUW5PMXh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJRUZrWkNCaGJtRnNlWFJwWTNNZ2RISmhZMnRwYm1jZ2RHOGdZU0IzYVdSblpYUmNjbHh1SUNvZ1FHTnNZWE56WkdWell5QkJaR1FnWVc1aGJIbDBhV056SUd4cGMzUmxibVZ5Y3lCaGJtUWdaWFpsYm5SeklHWnZjaUJiYTJsemMyMWxkSEpwWTNOZElHRnVZV3g1ZEdsamN5Qm1jbUZ0WlhkdmNtdGNjbHh1SUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUc5d2RHbHZibk5jY2x4dUlDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHOXdkR2x2Ym5NdVkyOXVabWxuTGlCSVlYTm9JRzltSUhkcFpHZGxkQ0JqYjI1bWFXY2diM0IwYVc5dWMxeHlYRzRnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnYjNCMGFXOXVjeTUzYVdSblpYUXVJRlJvWlNCM2FXUm5aWFFnYVc1emRHRnVZMlVnVzNKbGNYVnBjbVZrWFZ4eVhHNGdLaUJBWTJ4aGMzTWdVMlYwSUdGdVlXeDVkR2xqY3lCcGJuTjBZVzVqWlNCd2NtOXdaWEowYVdWek95QnBibWwwYVdGc2FYTmxJR0Z1WVd4NWRHbGpjMXh5WEc0Z0tpOWNjbHh1WTJ4aGMzTWdRVzVoYkhsMGFXTnpJSHRjY2x4dVhIUmpiMjV6ZEhKMVkzUnZjaUFvSUhzZ2QybGtaMlYwTENCamIyNW1hV2RJWVhOb0lIMGdQU0I3ZlNBcElIdGNjbHh1WEhSY2RIUm9hWE11ZDJsa1oyVjBJRDBnZDJsa1oyVjBPMXh5WEc1Y2RGeDBhV1lnS0NBaGRHaHBjeTUzYVdSblpYUWdLU0I3WEhKY2JseDBYSFJjZEhKbGRIVnlianRjY2x4dVhIUmNkSDFjY2x4dVhIUmNkSFJvYVhNdVkyOXVabWxuU0dGemFDQTlJR052Ym1acFowaGhjMmdnZkh3Z2UzMDdYSEpjYmx4MFhIUjBhR2x6TG1sdWFYUW9LVHRjY2x4dVhIUjlYSEpjYmx4MEx5b3FYSEpjYmlCY2RDb2dTVzVwZEdsaGJHbHpaU0JoYm1Gc2VYUnBZM05jY2x4dUlGeDBLaUJBWkdWelkzSnBjSFJwYjI0Z1EyRmphR1VnZEdobElIZHBaR2RsZENCbGJHVnRaVzUwT3lCbVpYUmphQ0JoYm1Gc2VYUnBZM01nZG1Gc2RXVnpJRzl1SUhSb1pTQjNhV1JuWlhRZ1pXeGxiV1Z1ZERzZ2RISnBaMmRsY2lCaGJtRnNlWFJwWTNNZ2JXVjBhRzlrYzF4eVhHNGdYSFFxTDF4eVhHNWNkR2x1YVhRZ0tDa2dlMXh5WEc1Y2RGeDBkR2hwY3k1M2FXUm5aWFJGYkNBOUlHUnZZM1Z0Wlc1MExuRjFaWEo1VTJWc1pXTjBiM0lvSjF0a1lYUmhMV0Z1WVd4NWRHbGpjeTEzYVdSblpYUmRKeWs3WEhKY2JseDBYSFJwWmlBb2RHaHBjeTUzYVdSblpYUkZiQ2tnZTF4eVhHNWNkRngwWEhSMGFHbHpMbmRwWkdkbGRFNWhiV1VnUFNCMGFHbHpMbmRwWkdkbGRFVnNMbWRsZEVGMGRISnBZblYwWlNnblpHRjBZUzFoYm1Gc2VYUnBZM010ZDJsa1oyVjBKeWs3WEhKY2JseDBYSFJjZEhSb2FYTXVZMmhoY21sMGVVbGtJRDBnWkc5amRXMWxiblF1Y1hWbGNubFRaV3hsWTNSdmNpZ25XMlJoZEdFdFkyaGhjbWwwZVMxcFpGMG5LU0EvSUZ4eVhHNWNkRngwWEhSY2RHUnZZM1Z0Wlc1MExuRjFaWEo1VTJWc1pXTjBiM0lvSjF0a1lYUmhMV05vWVhKcGRIa3RhV1JkSnlrdVoyVjBRWFIwY21saWRYUmxLQ2RrWVhSaExXTm9ZWEpwZEhrdGFXUW5LU0E2SUNjbk8xeHlYRzVjZEZ4MFhIUjBhR2x6TG1aeWNFbGtJRDBnWkc5amRXMWxiblF1Y1hWbGNubFRaV3hsWTNSdmNpZ25XMlJoZEdFdFkyaGhjbWwwZVMxbWNuQkpaRjBuS1NBL0lGeHlYRzVjZEZ4MFhIUmNkR1J2WTNWdFpXNTBMbkYxWlhKNVUyVnNaV04wYjNJb0oxdGtZWFJoTFdOb1lYSnBkSGt0Wm5Kd1NXUmRKeWt1WjJWMFFYUjBjbWxpZFhSbEtDZGtZWFJoTFdOb1lYSnBkSGt0Wm5Kd1NXUW5LU0E2SUNjbk8xeHlYRzVjZEZ4MFhIUmNjbHh1WEhSY2RGeDBkR2hwY3k1d2RYTm9RMjl1Wm1sbktDazdYSEpjYmx4MFhIUmNkSFJvYVhNdWQybGtaMlYwU1c1cGRDZ3BPMXh5WEc1Y2RGeDBYSFIwYUdsekxtTmhjbVJ6U1c1cGRDZ3BPMXh5WEc1Y2RGeDBYSFIwYUdsekxtTmhjbVJKYlhCeVpYTnphVzl1Y3lncE8xeHlYRzVjZEZ4MGZWeHlYRzVjZEgxY2RGeHlYRzVjZEM4cUtseHlYRzRnWEhRcUlGQjFjMmdnZFhObGNpQmpiMjVtYVdjZ2FHRnphQ0JiYVc1amJIVmthVzVuSUhCaGNtVnVkQ0J3WVdkbEozTWdjbVZtWlhKeVpYSmRJSFJ2SUd0cGMzTnRaWFJ5YVdOeklHRnpJSEJ5YjNCbGNuUjVYSEpjYmlCY2RDb3ZYSEpjYmx4MGNIVnphRU52Ym1acFp5QW9LU0I3WEhKY2JseDBYSFJmYTIxeExuQjFjMmdvV3lkelpYUW5MQ0IwYUdsekxtTnZibVpwWjBoaGMyaGRLVHRjY2x4dVhIUjlYSEpjYmx4MEx5b3FYSEpjYmlCY2RDb2dTVzVwZEdsaGJHbHpaU0IzYVdSblpYUWdZVzVoYkhsMGFXTnpJR1JoZEdFZ2FHRnphRnh5WEc0Z1hIUXFJRUJrWlhOamNtbHdkR2x2YmlCRGNtVmhkR1VnWVNCb1lYTm9JRzltSUhkcFpHZGxkQzFzWlhabGJDQmhibUZzZVhScFkzTWdkbUZzZFdWek95QnpkRzl5WlNCcGRDQnZiaUIwYUdVZ2QybGtaMlYwSUdWc1pXMWxiblE3SUZ4eVhHNGdYSFFxSUhKbFoybHpkR1Z5SUdOc2FXTnJJR3hwYzNSbGJtVnlJRzl1SUhkcFpHZGxkQ0JsYkdWdFpXNTBYSEpjYmlCY2RDb3ZYSEpjYmx4MGQybGtaMlYwU1c1cGRDQW9LU0I3SUZ4eVhHNWNkRngwYkdWMElHRnVZV3g1ZEdsamMwUmhkR0VnUFNCN1hISmNibHgwWEhSY2RIQmhaMlZmZEhsd1pUb2dKM2RwWkdkbGRDY3NJQzh2SUdwemFHbHVkQ0JwWjI1dmNtVTZiR2x1WlZ4eVhHNWNkRngwWEhRblpYWmxiblFuT2lBbmNHRm5aU0JqYkdsamF5Y3NYSEpjYmx4MFhIUmNkR0ZqZEdsMmFYUjVYM1I1Y0dVNklIUm9hWE11ZDJsa1oyVjBUbUZ0WlN3Z0x5OGdhbk5vYVc1MElHbG5ibTl5WlRwc2FXNWxYSEpjYmx4MFhIUmNkR05vWVhKcGRIbGZhV1E2SUhSb2FYTXVZMmhoY21sMGVVbGtMQ0F2THlCcWMyaHBiblFnYVdkdWIzSmxPbXhwYm1WY2NseHVYSFJjZEZ4MGNHRm5aVjlwWkRvZ2RHaHBjeTVtY25CSlpDQXZMeUJxYzJocGJuUWdhV2R1YjNKbE9teHBibVZjY2x4dVhIUmNkSDA3WEhKY2JseDBYSFIwYUdsekxuZHBaR2RsZEVWc0xtRnVZV3g1ZEdsamN5QTlJR0Z1WVd4NWRHbGpjMFJoZEdFN1hISmNibHgwWEhSY2NseHVYSFJjZEhSb2FYTXVkMmxrWjJWMFJXd3VZV1JrUlhabGJuUk1hWE4wWlc1bGNpZ25ZMnhwWTJzbkxDQW9JR1VnS1NBOVBpQjdYSEpjYmx4MFhIUmNkSFJvYVhNdWQybGtaMlYwUTJ4cFkyc29JR1VnS1R0Y2NseHVYSFJjZEgwcE8xeHlYRzVjZEgxY2NseHVYSFF2S2lwY2NseHVJRngwS2lCUWRYTm9JR3RwYzNOdFpYUnlhV056SUU1UFRpMWpZWEprSUdOc2FXTnJJR1YyWlc1MGMxeHlYRzRnWEhRcUlFQmtaWE5qY21sd2RHbHZiaUJJWVc1a2JHVWdibTl1TFdOaGNtUWdZMnhwWTJzZ1pYWmxiblJ6SUc5dUlIUm9aU0IzYVdSblpYUWdkWE5wYm1jZ1pYWmxiblFnWkdWc1pXZGhkR2x2Ymk0Z1EzSmxZWFJsSUdOc2FXTnJJSFpoYkhWbGN5Qm9ZWE5vSUdadmNpQjBZWEpuWlhRZ1pXeGxiV1Z1ZEhNZ1hISmNiaUJjZENvZ1lXNWtJR1pwY21VZ2EybHpjMjFsZEhKcFkzTWdjR0ZuWlNCamJHbGpheUJsZG1WdWRGeHlYRzRnWEhRcUwxeHlYRzRnWEhSM2FXUm5aWFJEYkdsamF5QW9JR1VnS1NCN1hISmNibHgwWEhSc1pYUWdaWFowSUQwZ1pTNTBZWEpuWlhRdVoyVjBRWFIwY21saWRYUmxLQ2RrWVhSaExXRnVZV3g1ZEdsamN5MWxkbVZ1ZENjcE8xeHlYRzVjZEZ4MGFXWWdLR1YyZENrZ2UxeHlYRzVjZEZ4MFhIUnNaWFFnWTJ4cFkydEVZWFJoSUQwZ1QySnFaV04wTG1GemMybG5iaWg3ZlN3Z2RHaHBjeTUzYVdSblpYUkZiQzVoYm1Gc2VYUnBZM01nS1R0Y2NseHVYSFJjZEZ4MFkyeHBZMnRFWVhSaExuTjFZblI1Y0dVZ1BTQmxMblJoY21kbGRDNW5aWFJCZEhSeWFXSjFkR1VvSjJSaGRHRXRZVzVoYkhsMGFXTnpMWE4xWW5SNWNHVW5LVHRjY2x4dVhIUmNkRngwWTJ4cFkydEVZWFJoTG1WMlpXNTBYM1poYkhWbElEMGdaWFowT3lBdkx5QnFjMmhwYm5RZ2FXZHViM0psT214cGJtVmNjbHh1WEhSY2RGeDBYMnR0Y1M1d2RYTm9LRnNuY21WamIzSmtKeXdnSjNCaFoyVWdZMnhwWTJzbkxDQmpiR2xqYTBSaGRHRmRLVHRjZEZ4MFhISmNibHgwWEhSOVhISmNibHgwZlZ4eVhHNWNkQzhxS2x4eVhHNGdYSFFxSUVsdWFYUnBZV3hwYzJVZ1kyRnlaQ0JoYm1Gc2VYUnBZM01nWkdGMFlTQm9ZWE5vWEhKY2JpQmNkQ29nUUdSbGMyTnlhWEIwYVc5dUlFWnZjaUJsWVdOb0lHTmhjbVFnYVc0Z2RHaGxJRVJQVFNCamNtVmhkR1VnWVNCallYSmtJR0Z1WVd4NWRHbGpjeUJvWVhOb0lHRnVaQ0J6ZEc5eVpTQnBkQ0J2YmlCMGFHVWdZMkZ5WkNCYmFXWWdibTl1WlNCaGJISmxZV1I1SUhCeVpYTmxiblJkTzF4eVhHNGdYSFFxSUdGdVpDQmhaR1FnWTJ4cFkyc2diR2x6ZEc1bGNseHlYRzRnWEhRcUwxeHlYRzRnWEhSallYSmtjMGx1YVhRZ0tDa2dlMXh5WEc1Y2RGeDBiR1YwSUdOaGNtUnpJRDBnWkc5amRXMWxiblF1Y1hWbGNubFRaV3hsWTNSdmNrRnNiQ2duVzJSaGRHRXRZVzVoYkhsMGFXTnpMV05oY21SZEp5azdYSEpjYmx4MFhIUnNaWFFnYzJWc1ppQTlJSFJvYVhNN1hISmNibHgwWEhSY2NseHVYSFJjZEZ0ZExuTnNhV05sTG1OaGJHd29JR05oY21SeklDa3VabTl5UldGamFDZ29JR05oY21Rc0lHbHVaR1Y0SUNrZ1BUNGdlMXh5WEc1Y2RGeDBYSFJqWVhKa0xuTmxkRUYwZEhKcFluVjBaU2duWkdGMFlTMWpZWEprTFhKaGJtc25MQ0JwYm1SbGVDazdYSEpjYmx4MFhIUmNkR2xtSUNnZ0lXTmhjbVF1WVc1aGJIbDBhV056SUNrZ2UxeHlYRzVjZEZ4MFhIUmNkR3hsZENCaGJtRnNlWFJwWTNORVlYUmhJRDBnZTMwN1hISmNibHgwWEhSY2RGeDBiR1YwSUdOb1lYSnBkSGxKWkNBOUlHTmhjbVF1WjJWMFFYUjBjbWxpZFhSbEtDZGtZWFJoTFdOb1lYSnBkSGt0YVdRbktTQjhmQ0FuSnp0Y2NseHVYSFJjZEZ4MFhIUnNaWFFnWVdOMGFYWnBkSGxKWkNBOUlHTmhjbVF1WjJWMFFYUjBjbWxpZFhSbEtDZGtZWFJoTFdGamRHbDJhWFI1TFdsa0p5a2dmSHdnSnljN1hISmNibHgwWEhSY2RGeDBiR1YwSUdOaGNtUlNZVzVySUQwZ1kyRnlaQzVuWlhSQmRIUnlhV0oxZEdVb0oyUmhkR0V0WTJGeVpDMXlZVzVySnlrN1hISmNibHgwWEhSY2RGeDBiR1YwSUdOaGNtUkdjbkJKWkNBOUlHTmhjbVF1WjJWMFFYUjBjbWxpZFhSbEtDZGtZWFJoTFdaeWNDMXBaQ2NwSUh4OElDY25PMXh5WEc1Y2RGeDBYSFJjZEd4bGRDQmpZWEprVlhKc0lEMGdZMkZ5WkM1blpYUkJkSFJ5YVdKMWRHVW9KMlJoZEdFdFkyRnlaQzExY213bktTQjhmQ0FuSnp0Y2NseHVYSFJjZEZ4MFhIUmNjbHh1WEhSY2RGeDBYSFJoYm1Gc2VYUnBZM05FWVhSaExuQmhaMlZmZEhsd1pTQTlJQ2QzYVdSblpYUW5PeUF2THlCcWMyaHBiblFnYVdkdWIzSmxPbXhwYm1WY2NseHVYSFJjZEZ4MFhIUmhibUZzZVhScFkzTkVZWFJoTG1OaGNtUmZhV1FnUFNCZ0pIdDBhR2x6TG5kcFpHZGxkRTVoYldWOUxTUjdZMmhoY21sMGVVbGtmUzBrZTJGamRHbDJhWFI1U1dSOVlEc2dMeThnYW5Ob2FXNTBJR2xuYm05eVpUcHNhVzVsWEhKY2JseDBYSFJjZEZ4MFlXNWhiSGwwYVdOelJHRjBZUzVqWVhKa1gzSmhibXNnUFNCallYSmtVbUZ1YXpzZ0x5OGdhbk5vYVc1MElHbG5ibTl5WlRwc2FXNWxYSEpjYmx4MFhIUmNkRngwWVc1aGJIbDBhV056UkdGMFlTNWhZM1JwZG1sMGVWOXBaQ0E5SUdGamRHbDJhWFI1U1dRN0lDOHZJR3B6YUdsdWRDQnBaMjV2Y21VNmJHbHVaVnh5WEc1Y2RGeDBYSFJjZEdGdVlXeDVkR2xqYzBSaGRHRXVZV04wYVhacGRIbGZkSGx3WlNBOUlIUm9hWE11ZDJsa1oyVjBUbUZ0WlRzZ0x5OGdhbk5vYVc1MElHbG5ibTl5WlRwc2FXNWxYSEpjYmx4MFhIUmNkRngwWVc1aGJIbDBhV056UkdGMFlTNWphR0Z5YVhSNVgybGtJRDBnWTJoaGNtbDBlVWxrT3lBdkx5QnFjMmhwYm5RZ2FXZHViM0psT214cGJtVmNjbHh1WEhSY2RGeDBYSFJoYm1Gc2VYUnBZM05FWVhSaExuQmhaMlZmYVdRZ1BTQmpZWEprUm5Kd1NXUTdJQzh2SUdwemFHbHVkQ0JwWjI1dmNtVTZiR2x1WlZ4eVhHNWNkRngwWEhSY2RHRnVZV3g1ZEdsamMwUmhkR0V1WTJGeVpGOTFjbXdnUFNCallYSmtWWEpzT3lBdkx5QnFjMmhwYm5RZ2FXZHViM0psT214cGJtVmNjbHh1WEhSY2RGeDBYSFJjY2x4dVhIUmNkRngwWEhSallYSmtMbUZ1WVd4NWRHbGpjeUE5SUdGdVlXeDVkR2xqYzBSaGRHRTdYSEpjYmx4MFhIUmNkRngwWEhKY2JseDBYSFJjZEZ4MFkyRnlaQzVoWkdSRmRtVnVkRXhwYzNSbGJtVnlLQ2RqYkdsamF5Y3NJR1oxYm1OMGFXOXVJQ2dnWlNBcElIdGNjbHh1WEhSY2RGeDBYSFJjZEdVdWMzUnZjRkJ5YjNCaFoyRjBhVzl1S0NrN1hISmNibHgwWEhSY2RGeDBYSFJ6Wld4bUxtTmhjbVJEYkdsamF5Z2daU3dnZEdocGN5QXBPMXh5WEc1Y2RGeDBYSFJjZEgwcE8xeHlYRzVjZEZ4MFhIUjlYSEpjYmx4MFhIUjlLVHRjY2x4dVhIUjlYSEpjYmx4MEx5b3FYSEpjYmlCY2RDb2dVSFZ6YUNCcmFYTnpiV1YwY21samN5QmpZWEprSUdsdGNISmxjM05wYjI1elhISmNiaUJjZENvZ1FHUmxjMk55YVhCMGFXOXVJRVp2Y2lCaGJHd2dkbWx6YVdKc1pTQmpZWEprY3l3Z1kzSmxZWFJsSUdFZ1kyRnlaQ0JwYlhCeVpYTnphVzl1SUdGdVlXeDVkR2xqY3lCb1lYTm9JR0Z1WkNCbWFYSmxJR0VnYTJsemMyMWxkSEpwWTNNZ1kyRnlaQ0JwYlhCeVpYTnphVzl1SUdWMlpXNTBYSEpjYmlCY2RDb3ZYSEpjYmx4MFkyRnlaRWx0Y0hKbGMzTnBiMjV6SUNncElIdGNjbHh1WEhSY2RHeGxkQ0JqWVhKa2N5QTlJR1J2WTNWdFpXNTBMbkYxWlhKNVUyVnNaV04wYjNKQmJHd29KMXRrWVhSaExXRnVZV3g1ZEdsamN5MWpZWEprWFRwdWIzUW9XMlJoZEdFdGFHbGtaR1Z1WFNrbktUdGNjbHh1WEhSY2RGdGRMbk5zYVdObExtTmhiR3dvSUdOaGNtUnpJQ2t1Wm05eVJXRmphQ2dvSUdOaGNtUWdLU0E5UGlCN1hISmNibHgwWEhSY2RHeGxkQ0JwYlhCeVpYTnphVzl1UkdGMFlTQTlJRTlpYW1WamRDNWhjM05wWjI0b2UzMHNJR05oY21RdVlXNWhiSGwwYVdOeklDazdYSEpjYmx4MFhIUmNkR2x0Y0hKbGMzTnBiMjVFWVhSaExtVjJaVzUwSUQwZ0oybHRjSEpsYzNOcGIyNG5PMXh5WEc1Y2RGeDBYSFJwYlhCeVpYTnphVzl1UkdGMFlTNWpZWEprWDJOdmRXNTBJRDBnWTJGeVpITXViR1Z1WjNSb095QXZMeUJxYzJocGJuUWdhV2R1YjNKbE9teHBibVZjY2x4dVhIUmNkRngwWDJ0dGNTNXdkWE5vS0ZzbmNtVmpiM0prSnl3Z0oybHRjSEpsYzNOcGIyNG5MQ0JwYlhCeVpYTnphVzl1UkdGMFlWMHBPMXh5WEc1Y2RGeDBmU2s3WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc0Z1hIUXFJRkIxYzJnZ2EybHpjMjFsZEhKcFkzTWdZMkZ5WkNCamJHbGpheUJsZG1WdWRITmNjbHh1SUZ4MEtpQkFaR1Z6WTNKcGNIUnBiMjRnU0dGdVpHeGxJR05oY21RZ1kyeHBZMnNnWlhabGJuUnpJRzl1SUhSb1pTQjNhV1JuWlhRZ2RYTnBibWNnWlhabGJuUWdaR1ZzWldkaGRHbHZiaTRnUTNKbFlYUmxJR0VnWTJGeVpDQmpiR2xqYXlCMllXeDFaWE1nYUdGemFDQm1iM0lnZEdGeVpXZDBJR05oY21SY2NseHVJRngwS2lCaGJtUWdabWx5WlNCaElHdHBjM050WlhSeWFXTnpJR05oY21RZ1kyeHBZMnNnWlhabGJuUWdYSEpjYmlCY2RDb3ZYSEpjYmx4MFkyRnlaRU5zYVdOcklDZ2daU3dnWTJGeVpDQXBJSHRjY2x4dVhIUmNkR3hsZENCbGRuUWdQU0JsTG5SaGNtZGxkQzVuWlhSQmRIUnlhV0oxZEdVb0oyUmhkR0V0WVc1aGJIbDBhV056TFdWMlpXNTBKeWs3WEhKY2JseDBYSFJwWmlBb1pYWjBLU0I3WEhKY2JseDBYSFJjZEd4bGRDQmpiR2xqYTBSaGRHRWdQU0JQWW1wbFkzUXVZWE56YVdkdUtIdDlMQ0JqWVhKa0xtRnVZV3g1ZEdsamN5azdYSEpjYmx4MFhIUmNkR05zYVdOclJHRjBZUzVsZG1WdWRDQTlJQ2RqWVhKa0lHTnNhV05ySnp0Y2NseHVYSFJjZEZ4MFkyeHBZMnRFWVhSaExuTjFZblI1Y0dVZ1BTQmxMblJoY21kbGRDNW5aWFJCZEhSeWFXSjFkR1VvSjJSaGRHRXRZVzVoYkhsMGFXTnpMWE4xWW5SNWNHVW5LVHRjY2x4dVhIUmNkRngwWTJ4cFkydEVZWFJoTG1WMlpXNTBYM1poYkhWbElEMGdaWFowT3lBdkx5QnFjMmhwYm5RZ2FXZHViM0psT214cGJtVmNjbHh1WEhSY2RGeDBZMnhwWTJ0RVlYUmhMbU5oY21SZlkyOTFiblFnUFNCa2IyTjFiV1Z1ZEM1eGRXVnllVk5sYkdWamRHOXlRV3hzS0NkYlpHRjBZUzFoYm1Gc2VYUnBZM010WTJGeVpGMDZibTkwS0Z0a1lYUmhMV2hwWkdSbGJsMHBKeWt1YkdWdVozUm9PeUF2THlCcWMyaHBiblFnYVdkdWIzSmxPbXhwYm1WY2NseHVYSFJjZEZ4MFgydHRjUzV3ZFhOb0tGc25jbVZqYjNKa0p5d2dKMk5oY21RZ1kyeHBZMnNuTENCamJHbGphMFJoZEdGZEtUdGNjbHh1WEhSY2RIMWNjbHh1WEhSOVhISmNibjFjY2x4dVhISmNibVY0Y0c5eWRDQmtaV1poZFd4MElFRnVZV3g1ZEdsamN6c2lYWDA9IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG5cdHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbnZhciBfdXRpbHNRdWVyeVN0cmluZyA9IHJlcXVpcmUoJy4uL3V0aWxzL3F1ZXJ5U3RyaW5nJyk7XG5cbi8qKlxyXG4gKiBDcmVhdGUgYSB3aWRnZXQgbW9kZWxcclxuICogQGNsYXNzZGVzYyBDcmVhdGUgYSBtb2RlbCBvYmplY3QgXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLndpZGdldC4gVGhlIHdpZGdldCBpbnN0YW5jZSBbcmVxdWlyZWRdXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy5pc1BhZ2luYXRlZC4gV2hldGhlciB0aGUgbW9kZWwgY29uc3VtZXMgYSBwYWdpbmF0ZWQgUkVTVCBBUElcclxuICogQGNsYXNzIFN0b3JlcyB0aGUgcmV0dXJuZWQgbW9kZWwgZGF0YSBhcyB0aGlzLiRtb2RlbC4gU3RvcmVzIG1vZGVsIFVSTCBwYXJhbWV0ZXJzIGFzIHRoaXMucGFyYW1zLiBGb3IgcGFnaW5hdGVkIG1vZGVsc1xyXG4gKiBzdG9yZXMgdGhlIGNvbGxlY3Rpb24gYXMgdGhpcy5jb2xsZWN0aW9uLCBzdG9yZXMgdGhlIGxhc3QgZmV0Y2hlZCBBUEkgcGFnZSBhcyB0aGlzLmxhc3RSZXR1cm5lZFBhZ2U7IHNldHMgYXBpUGFnZSBzaXplIHRvIGRlZmF1bHQgMTJcclxuICogc2V0cyBwYWdlTnVtIGFuZCBwYWdlU2l6ZSBwYXJhbXMgb24gdGhlIG1vZGVsIEFQSSBbaW5pdGlhbGlzZXMgdG8gcGFnZSAxXVxyXG4gKi9cbnZhciBQcm9taXNlID0gcmVxdWlyZSgnZXM2LXByb21pc2UnKS5Qcm9taXNlO1xudmFyIHhociA9IHJlcXVpcmUoJ3hocicpO1xuXG52YXIgTW9kZWwgPSAoZnVuY3Rpb24gKCkge1xuXHRmdW5jdGlvbiBNb2RlbCgpIHtcblx0XHR2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdO1xuXG5cdFx0dmFyIHdpZGdldCA9IF9yZWYud2lkZ2V0O1xuXHRcdHZhciB1cmwgPSBfcmVmLnVybDtcblx0XHR2YXIgcGFyYW1zID0gX3JlZi5wYXJhbXM7XG5cdFx0dmFyIGlzUGFnaW5hdGVkID0gX3JlZi5pc1BhZ2luYXRlZDtcblx0XHR2YXIgYXBpUGFnZVNpemUgPSBfcmVmLmFwaVBhZ2VTaXplO1xuXHRcdHZhciBjb2xsZWN0aW9uUGF0aCA9IF9yZWYuY29sbGVjdGlvblBhdGg7XG5cblx0XHRfY2xhc3NDYWxsQ2hlY2sodGhpcywgTW9kZWwpO1xuXG5cdFx0dGhpcy53aWRnZXQgPSB3aWRnZXQ7XG5cdFx0dGhpcy51cmwgPSB1cmw7XG5cdFx0aWYgKCF0aGlzLndpZGdldCB8fCAhdGhpcy51cmwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy4kbW9kZWwgPSB7fTtcblx0XHR0aGlzLnBhcmFtcyA9IHRoaXMucGFyYW1zIHx8IHt9O1xuXHRcdHRoaXMuc2V0UGFyYW1zKHBhcmFtcyk7XG5cblx0XHR0aGlzLmlzUGFnaW5hdGVkID0gaXNQYWdpbmF0ZWQgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogaXNQYWdpbmF0ZWQ7XG5cdFx0aWYgKHRoaXMuaXNQYWdpbmF0ZWQpIHtcblx0XHRcdHRoaXMuY29sbGVjdGlvblBhdGggPSBjb2xsZWN0aW9uUGF0aDtcblx0XHRcdHRoaXMubGFzdFJldHVybmVkUGFnZSA9IFtdO1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uID0gW107XG5cdFx0XHR0aGlzLmFwaVBhZ2VTaXplID0gYXBpUGFnZVNpemUgfHwgMTI7XG5cdFx0XHR0aGlzLmN1cnJlbnRBcGlQYWdlID0gMTtcblx0XHRcdHRoaXMubGFzdFBhZ2UgPSB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLnNldFBhcmFtcyh7XG5cdFx0XHRcdHBhZ2VOdW06IHRoaXMuY3VycmVudEFwaVBhZ2UsXG5cdFx0XHRcdHBhZ2VTaXplOiB0aGlzLmFwaVBhZ2VTaXplXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcclxuICAqIEdldCB0aGUgbW9kZWwgZGF0YSBmcm9tIHRoZSBSRVNUIEFQSSBbTk9OLXBhZ2luYXRlZCBSRVNUIEFQSSBvbmx5XVxyXG4gICogQGRlc2NyaXB0aW9uIEZldGNoIHRoZSBkYXRhIGZyb20gdGhlIFJFU1QgQVBJIGFuZCBzdG9yZSBhcyB0aGlzLiRtb2RlbFxyXG4gICovXG5cblx0X2NyZWF0ZUNsYXNzKE1vZGVsLCBbe1xuXHRcdGtleTogJ2dldE1vZGVsJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gZ2V0TW9kZWwoKSB7XG5cdFx0XHR2YXIgX3RoaXMgPSB0aGlzO1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0XHRcdFx0X3RoaXMuZmV0Y2hEYXRhKF90aGlzLnVybCkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuXHRcdFx0XHRcdF90aGlzLiRtb2RlbCA9IGRhdGE7XG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqIEdldCB0aGUgbmV4dCBBUEkgcGFnZSBmcm9tIHRoZSBSRVNUIEFQSSBbcGFnaW5hdGVkIFJFU1QgQVBJIG9ubHldXHJcbiAgICogQGRlc2NyaXB0aW9uIEZldGNoIHRoZSBuZXh0IEFQSSBwYWdlIGZyb20gdGhlIHNlcnZlciwgYmFzZWQgb24gdGhlIGxhc3QgcGFnZSBmZXRjaGVkLiBTdG9yZSB0aGUgcmV0dXJuZWQgZGF0YVxyXG4gICAqIGFzIHRoaXMuJG1vZGVsOyBhZGQgdGhlIHJldHVybmVkIHBhZ2luYXRlZCBkYXRhIGFzIHRvIHRoZSBlbmQgb2YgdGhpcy5jb2xsZWN0aW9uXHJcbiAgICogQHJldHVybnMge09iamVjdH0gUHJvbWlzZSBvYmplY3RcclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ2dldE5leHRQYWdlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gZ2V0TmV4dFBhZ2UocmVzZXQpIHtcblx0XHRcdHZhciBfdGhpczIgPSB0aGlzO1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0XHRcdFx0X3RoaXMyLnBhcmFtcy5wYWdlTnVtID0gX3RoaXMyLmN1cnJlbnRBcGlQYWdlKys7XG5cdFx0XHRcdF90aGlzMi5nZXRNb2RlbCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGlmIChfdGhpczIuJG1vZGVsW190aGlzMi5jb2xsZWN0aW9uUGF0aF0ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0XHRfdGhpczIubGFzdFBhZ2UgPSBfdGhpczIuY3VycmVudEFwaVBhZ2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChyZXNldCkge1xuXHRcdFx0XHRcdFx0X3RoaXMyLmNvbGxlY3Rpb24gPSBbXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0X3RoaXMyLmxhc3RSZXR1cm5lZFBhZ2UgPSBfdGhpczIuJG1vZGVsW190aGlzMi5jb2xsZWN0aW9uUGF0aF07XG5cdFx0XHRcdFx0X3RoaXMyLmNvbGxlY3Rpb24gPSBfdGhpczIuY29sbGVjdGlvbi5jb25jYXQoX3RoaXMyLmxhc3RSZXR1cm5lZFBhZ2UpO1xuXHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcclxuICAgKiBBZGQgc3VwcGxpZWQgcGFyYW1ldGVycyB0byB0aGUgbW9kZWwgVVJMXHJcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnQgaGFzaCBvZiBwYXJhbWV0ZXJzIHRvIHF1ZXJ5IHN0cmluZyBhbmQgYXBwZW5kIHRvIG1vZGVsIHVybFxyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnc2V0UGFyYW1zJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gc2V0UGFyYW1zKG9iaikge1xuXHRcdFx0dGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHRoaXMucGFyYW1zLCBvYmopO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqIEZldGNoIGRhdGEgZnJvbSB0aGUgc2VydmVyXHJcbiAgICogQGRlc2NyaXB0aW9uIE1ha2UgYSBnZXQgcmVxdWVzdCBmb3IgdGhlIFJFU1QgQVBJIGRhdGFcclxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBQcm9taXNlIG9iamVjdFxyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnZmV0Y2hEYXRhJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gZmV0Y2hEYXRhKHVybCkge1xuXHRcdFx0dmFyIHFzID0gKDAsIF91dGlsc1F1ZXJ5U3RyaW5nLnF1ZXJ5U3RyaW5nU3RyaW5naWZ5KSh0aGlzLnBhcmFtcyk7XG5cdFx0XHQvL1RPRE86IHJlbW92ZSAmIGlmIG5vIHFzXG5cdFx0XHR1cmwgKz0gJz9mb3JtYXQ9anNvbiYnICsgcXM7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0XHR4aHIoe1xuXHRcdFx0XHRcdHVyaTogdXJsLFxuXHRcdFx0XHRcdHVzZVhEUjogdHJ1ZVxuXHRcdFx0XHR9LCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlLCBib2R5KSB7XG5cdFx0XHRcdFx0aWYgKGJvZHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShKU09OLnBhcnNlKGJvZHkpKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGVycm9yICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHQvLyBhbGVydCgnaHR0cCBlcnJvcjogc3RhdHVzIGNvZGU6ICcgKyByZXNwb25zZS5zdGF0dXNDb2RlICsgJzsgZXJyb3I6ICcgKyBlcnJvcik7XG5cdFx0XHRcdFx0XHRyZWplY3QoRXJyb3IoZXJyb3IpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogUmVmcmVzaCB0aGUgbG9jYWwgbW9kZWwgYW5kIGNvbGxlY3Rpb25cclxuICAgKiBAZGVzY3JpcHRpb24gUmUtZmV0Y2ggYW5kIG92ZXJ3cml0ZSB0aGUgbG9jYWwgbW9kZWwgYW5kIGNvbGxlY3Rpb24gd2l0aCBbbGF0ZXN0XSBzZXJ2ZXIgZGF0YVxyXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFByb21pc2Ugb2JqZWN0XHJcbiAgICovXG5cdH0sIHtcblx0XHRrZXk6ICdyZWZyZXNoJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gcmVmcmVzaCgpIHtcblx0XHRcdHZhciBfdGhpczMgPSB0aGlzO1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0XHRcdFx0aWYgKF90aGlzMy5pc1BhZ2luYXRlZCkge1xuXHRcdFx0XHRcdF90aGlzMy5jb2xsZWN0aW9uID0gW107XG5cdFx0XHRcdFx0X3RoaXMzLmN1cnJlbnRBcGlQYWdlID0gMTtcblx0XHRcdFx0XHRfdGhpczMuZ2V0TmV4dFBhZ2UodHJ1ZSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0X3RoaXMzLmdldE1vZGVsKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fV0pO1xuXG5cdHJldHVybiBNb2RlbDtcbn0pKCk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IE1vZGVsO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMloxYm1SeVlXbHpaWEl0YkdWaFpHVnlZbTloY21RdlltOTNaWEpmWTI5dGNHOXVaVzUwY3k5cWRYTjBaMmwyYVc1bkxYZHBaR2RsZEMxbWNtRnRaWGR2Y21zdlkyOXRjRzl1Wlc1MGN5OXNhV0l2YW5NdlpuSmhiV1YzYjNKckwwMXZaR1ZzTG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lKQlFVRkJMRmxCUVZrc1EwRkJRenM3T3pzN096czdPenRuUTBGSmQwSXNjMEpCUVhOQ096czdPenM3T3pzN096dEJRVVl6UkN4SlFVRkpMRTlCUVU4c1IwRkJSeXhQUVVGUExFTkJRVU1zWVVGQllTeERRVUZETEVOQlFVTXNUMEZCVHl4RFFVRkRPMEZCUXpkRExFbEJRVWtzUjBGQlJ5eEhRVUZITEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenM3U1VGWmJrSXNTMEZCU3p0QlFVTkZMRlZCUkZBc1MwRkJTeXhIUVVNMlJUdHRSVUZCVEN4RlFVRkZPenROUVVGd1JTeE5RVUZOTEZGQlFVNHNUVUZCVFR0TlFVRkZMRWRCUVVjc1VVRkJTQ3hIUVVGSE8wMUJRVVVzVFVGQlRTeFJRVUZPTEUxQlFVMDdUVUZCUlN4WFFVRlhMRkZCUVZnc1YwRkJWenROUVVGRkxGZEJRVmNzVVVGQldDeFhRVUZYTzAxQlFVVXNZMEZCWXl4UlFVRmtMR05CUVdNN08zZENRVVI0UlN4TFFVRkxPenRCUVVWVUxFMUJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NUVUZCVFN4RFFVRkRPMEZCUTNKQ0xFMUJRVWtzUTBGQlF5eEhRVUZITEVkQlFVY3NSMEZCUnl4RFFVRkRPMEZCUTJZc1RVRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhGUVVGSE8wRkJRMmhETEZWQlFVODdSMEZEVUR0QlFVTkVMRTFCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzUlVGQlJTeERRVUZETzBGQlEycENMRTFCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNTVUZCU1N4RlFVRkZMRU5CUVVNN1FVRkRhRU1zVFVGQlNTeERRVUZETEZOQlFWTXNRMEZCUlN4TlFVRk5MRU5CUVVVc1EwRkJRenM3UVVGRmVrSXNUVUZCU1N4RFFVRkRMRmRCUVZjc1IwRkJSeXhYUVVGWExFdEJRVXNzVTBGQlV5eEhRVUZITEV0QlFVc3NSMEZCUnl4WFFVRlhMRU5CUVVNN1FVRkRia1VzVFVGQlN5eEpRVUZKTEVOQlFVTXNWMEZCVnl4RlFVRkhPMEZCUTNaQ0xFOUJRVWtzUTBGQlF5eGpRVUZqTEVkQlFVY3NZMEZCWXl4RFFVRkRPMEZCUTNKRExFOUJRVWtzUTBGQlF5eG5Ra0ZCWjBJc1IwRkJSeXhGUVVGRkxFTkJRVU03UVVGRE0wSXNUMEZCU1N4RFFVRkRMRlZCUVZVc1IwRkJSeXhGUVVGRkxFTkJRVU03UVVGRGNrSXNUMEZCU1N4RFFVRkRMRmRCUVZjc1IwRkJSeXhYUVVGWExFbEJRVWtzUlVGQlJTeERRVUZETzBGQlEzSkRMRTlCUVVrc1EwRkJReXhqUVVGakxFZEJRVWNzUTBGQlF5eERRVUZETzBGQlEzaENMRTlCUVVrc1EwRkJReXhSUVVGUkxFZEJRVWNzVTBGQlV5eERRVUZETzBGQlF6RkNMRTlCUVVrc1EwRkJReXhUUVVGVExFTkJRVU03UVVGRFpDeFhRVUZQTEVWQlFVVXNTVUZCU1N4RFFVRkRMR05CUVdNN1FVRkROVUlzV1VGQlVTeEZRVUZGTEVsQlFVa3NRMEZCUXl4WFFVRlhPMGxCUXpGQ0xFTkJRVU1zUTBGQlF6dEhRVU5JTzBWQlEwUTdPenM3T3pzN1kwRjRRa2tzUzBGQlN6czdVMEUyUWtRc2IwSkJRVWM3T3p0QlFVTllMRlZCUVU4c1NVRkJTU3hQUVVGUExFTkJRVVVzVlVGQlJTeFBRVUZQTEVWQlFVMDdRVUZEYkVNc1ZVRkJTeXhUUVVGVExFTkJRVVVzVFVGQlN5eEhRVUZITEVOQlFVVXNRMEZCUXl4SlFVRkpMRU5CUVVVc1ZVRkJSU3hKUVVGSkxFVkJRVTA3UVVGRE5VTXNWMEZCU3l4TlFVRk5MRWRCUVVjc1NVRkJTU3hEUVVGRE8wRkJRMjVDTEZsQlFVOHNSVUZCUlN4RFFVRkRPMHRCUTFZc1EwRkJReXhEUVVGRE8wbEJRMGdzUTBGQlF5eERRVUZETzBkQlEwZzdPenM3T3pzN096czdVMEZQVnl4eFFrRkJSU3hMUVVGTExFVkJRVWM3T3p0QlFVTnlRaXhWUVVGUExFbEJRVWtzVDBGQlR5eERRVUZGTEZWQlFVVXNUMEZCVHl4RlFVRk5PMEZCUTJ4RExGZEJRVXNzVFVGQlRTeERRVUZETEU5QlFVOHNSMEZCUnl4UFFVRkxMR05CUVdNc1JVRkJSU3hEUVVGRE8wRkJRelZETEZkQlFVc3NVVUZCVVN4RlFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRkxGbEJRVTA3UVVGRE0wSXNVMEZCU3l4UFFVRkxMRTFCUVUwc1EwRkJReXhQUVVGTExHTkJRV01zUTBGQlF5eERRVUZETEUxQlFVMHNTMEZCU3l4RFFVRkRMRVZCUVVjN1FVRkRjRVFzWVVGQlN5eFJRVUZSTEVkQlFVY3NUMEZCU3l4alFVRmpMRU5CUVVNN1RVRkRjRU03UVVGRFJDeFRRVUZMTEV0QlFVc3NSVUZCUnp0QlFVTmFMR0ZCUVVzc1ZVRkJWU3hIUVVGSExFVkJRVVVzUTBGQlF6dE5RVU55UWp0QlFVTkVMRmxCUVVzc1owSkJRV2RDTEVkQlFVY3NUMEZCU3l4TlFVRk5MRU5CUVVNc1QwRkJTeXhqUVVGakxFTkJRVU1zUTBGQlF6dEJRVU42UkN4WlFVRkxMRlZCUVZVc1IwRkJSeXhQUVVGTExGVkJRVlVzUTBGQlF5eE5RVUZOTEVOQlFVVXNUMEZCU3l4blFrRkJaMElzUTBGQlJTeERRVUZETzBGQlEyeEZMRmxCUVU4c1JVRkJSU3hEUVVGRE8wdEJRMVlzUTBGQlF5eERRVUZETzBsQlEwZ3NRMEZCUXl4RFFVRkRPMGRCUTBnN096czdPenM3TzFOQlMxTXNiVUpCUVVVc1IwRkJSeXhGUVVGSE8wRkJRMnBDTEU5QlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVjc1RVRkJUU3hEUVVGRExFMUJRVTBzUTBGQlJTeEpRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZMRWRCUVVjc1EwRkJSU3hEUVVGRE8wZEJRMmhFT3pzN096czdPenM3VTBGTlV5eHRRa0ZCUlN4SFFVRkhMRVZCUVVjN1FVRkRha0lzVDBGQlNTeEZRVUZGTEVkQlFVY3NORU5CUVhOQ0xFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVVXNRMEZCUXpzN1FVRkZOME1zVFVGQlJ5eHpRa0ZCYjBJc1JVRkJSU3hCUVVGRkxFTkJRVU03UVVGRE5VSXNWVUZCVHl4SlFVRkpMRTlCUVU4c1EwRkJReXhWUVVGVkxFOUJRVThzUlVGQlJTeE5RVUZOTEVWQlFVYzdRVUZET1VNc1QwRkJSeXhEUVVGRE8wRkJRMEVzVVVGQlJ5eEZRVUZGTEVkQlFVYzdRVUZEVWl4WFFVRk5MRVZCUVVVc1NVRkJTVHRMUVVObUxFVkJRVVVzVlVGQlZ5eExRVUZMTEVWQlFVVXNVVUZCVVN4RlFVRkZMRWxCUVVrc1JVRkJSenRCUVVOc1F5eFRRVUZMTEVsQlFVa3NTMEZCU3l4VFFVRlRMRVZCUVVjN1FVRkRla0lzWVVGQlR5eERRVUZGTEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVVVzUTBGQlF6dE5RVU0xUWl4TlFVRk5MRWxCUVVzc1MwRkJTeXhMUVVGTExFbEJRVWtzUlVGQlJ6czdRVUZGTlVJc1dVRkJUU3hEUVVGRkxFdEJRVXNzUTBGQlJTeExRVUZMTEVOQlFVVXNRMEZCUlN4RFFVRkRPMDFCUTNwQ08wdEJRMG9zUTBGQlF5eERRVUZETzBsQlEwZ3NRMEZCUXl4RFFVRkRPMGRCUTBnN096czdPenM3T3p0VFFVMVBMRzFDUVVGSE96czdRVUZEVml4VlFVRlBMRWxCUVVrc1QwRkJUeXhEUVVGRkxGVkJRVVVzVDBGQlR5eEZRVUZOTzBGQlEyeERMRkZCUVVzc1QwRkJTeXhYUVVGWExFVkJRVWM3UVVGRGRrSXNXVUZCU3l4VlFVRlZMRWRCUVVjc1JVRkJSU3hEUVVGRE8wRkJRM0pDTEZsQlFVc3NZMEZCWXl4SFFVRkhMRU5CUVVNc1EwRkJRenRCUVVONFFpeFpRVUZMTEZkQlFWY3NRMEZCUlN4SlFVRkpMRU5CUVVVc1EwRkJReXhKUVVGSkxFTkJRVVVzV1VGQlRUdEJRVU53UXl4aFFVRlBMRVZCUVVVc1EwRkJRenROUVVOV0xFTkJRVU1zUTBGQlF6dExRVU5JTEUxQlFVMDdRVUZEVGl4WlFVRkxMRkZCUVZFc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlJTeFpRVUZOTzBGQlF6TkNMR0ZCUVU4c1JVRkJSU3hEUVVGRE8wMUJRMVlzUTBGQlF5eERRVUZETzB0QlEwZzdTVUZEUkN4RFFVRkRMRU5CUVVNN1IwRkRTRHM3TzFGQk5VZEpMRXRCUVVzN096dHhRa0VyUjBrc1MwRkJTeUlzSW1acGJHVWlPaUpET2k5MFpXMXdMMGRITGtaeWIyNTBSVzVrTGxkcFpHZGxkSE12ZDJsa1oyVjBjeTltZFc1a2NtRnBjMlZ5TFd4bFlXUmxjbUp2WVhKa0wySnZkMlZ5WDJOdmJYQnZibVZ1ZEhNdmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDJwekwyWnlZVzFsZDI5eWF5OU5iMlJsYkM1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaWQxYzJVZ2MzUnlhV04wSnp0Y2NseHVYSEpjYm14bGRDQlFjbTl0YVhObElEMGdjbVZ4ZFdseVpTZ25aWE0yTFhCeWIyMXBjMlVuS1M1UWNtOXRhWE5sTzF4eVhHNXNaWFFnZUdoeUlEMGdjbVZ4ZFdseVpTZ25lR2h5SnlrN1hISmNibWx0Y0c5eWRDQjdJSEYxWlhKNVUzUnlhVzVuVTNSeWFXNW5hV1o1SUgwZ1puSnZiU0FuTGk0dmRYUnBiSE12Y1hWbGNubFRkSEpwYm1jbk8xeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlFTnlaV0YwWlNCaElIZHBaR2RsZENCdGIyUmxiRnh5WEc0Z0tpQkFZMnhoYzNOa1pYTmpJRU55WldGMFpTQmhJRzF2WkdWc0lHOWlhbVZqZENCY2NseHVJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJRzl3ZEdsdmJuTXVkMmxrWjJWMExpQlVhR1VnZDJsa1oyVjBJR2x1YzNSaGJtTmxJRnR5WlhGMWFYSmxaRjFjY2x4dUlDb2dRSEJoY21GdElIdENiMjlzWldGdWZTQnZjSFJwYjI1ekxtbHpVR0ZuYVc1aGRHVmtMaUJYYUdWMGFHVnlJSFJvWlNCdGIyUmxiQ0JqYjI1emRXMWxjeUJoSUhCaFoybHVZWFJsWkNCU1JWTlVJRUZRU1Z4eVhHNGdLaUJBWTJ4aGMzTWdVM1J2Y21WeklIUm9aU0J5WlhSMWNtNWxaQ0J0YjJSbGJDQmtZWFJoSUdGeklIUm9hWE11SkcxdlpHVnNMaUJUZEc5eVpYTWdiVzlrWld3Z1ZWSk1JSEJoY21GdFpYUmxjbk1nWVhNZ2RHaHBjeTV3WVhKaGJYTXVJRVp2Y2lCd1lXZHBibUYwWldRZ2JXOWtaV3h6WEhKY2JpQXFJSE4wYjNKbGN5QjBhR1VnWTI5c2JHVmpkR2x2YmlCaGN5QjBhR2x6TG1OdmJHeGxZM1JwYjI0c0lITjBiM0psY3lCMGFHVWdiR0Z6ZENCbVpYUmphR1ZrSUVGUVNTQndZV2RsSUdGeklIUm9hWE11YkdGemRGSmxkSFZ5Ym1Wa1VHRm5aVHNnYzJWMGN5QmhjR2xRWVdkbElITnBlbVVnZEc4Z1pHVm1ZWFZzZENBeE1seHlYRzRnS2lCelpYUnpJSEJoWjJWT2RXMGdZVzVrSUhCaFoyVlRhWHBsSUhCaGNtRnRjeUJ2YmlCMGFHVWdiVzlrWld3Z1FWQkpJRnRwYm1sMGFXRnNhWE5sY3lCMGJ5QndZV2RsSURGZFhISmNiaUFxTDF4eVhHNWpiR0Z6Y3lCTmIyUmxiQ0I3WEhKY2JseDBZMjl1YzNSeWRXTjBiM0lnS0NCN0lIZHBaR2RsZEN3Z2RYSnNMQ0J3WVhKaGJYTXNJR2x6VUdGbmFXNWhkR1ZrTENCaGNHbFFZV2RsVTJsNlpTd2dZMjlzYkdWamRHbHZibEJoZEdnZ2ZTQTlJSHQ5SUNrZ2UxeHlYRzVjZEZ4MGRHaHBjeTUzYVdSblpYUWdQU0IzYVdSblpYUTdYSEpjYmx4MFhIUjBhR2x6TG5WeWJDQTlJSFZ5YkR0Y2NseHVYSFJjZEdsbUlDZ2dJWFJvYVhNdWQybGtaMlYwSUh4OElDRjBhR2x6TG5WeWJDQXBJSHRjY2x4dVhIUmNkRngwY21WMGRYSnVPMXh5WEc1Y2RGeDBmVnh5WEc1Y2RGeDBkR2hwY3k0a2JXOWtaV3dnUFNCN2ZUdGNjbHh1WEhSY2RIUm9hWE11Y0dGeVlXMXpJRDBnZEdocGN5NXdZWEpoYlhNZ2ZId2dlMzA3WEhKY2JseDBYSFIwYUdsekxuTmxkRkJoY21GdGN5Z2djR0Z5WVcxeklDazdYSEpjYmx4eVhHNWNkRngwZEdocGN5NXBjMUJoWjJsdVlYUmxaQ0E5SUdselVHRm5hVzVoZEdWa0lEMDlQU0IxYm1SbFptbHVaV1FnUHlCbVlXeHpaU0E2SUdselVHRm5hVzVoZEdWa08xeHlYRzVjZEZ4MGFXWWdLQ0IwYUdsekxtbHpVR0ZuYVc1aGRHVmtJQ2tnZTF4eVhHNWNkRngwWEhSMGFHbHpMbU52Ykd4bFkzUnBiMjVRWVhSb0lEMGdZMjlzYkdWamRHbHZibEJoZEdnN1hISmNibHgwWEhSY2RIUm9hWE11YkdGemRGSmxkSFZ5Ym1Wa1VHRm5aU0E5SUZ0ZE8xeHlYRzVjZEZ4MFhIUjBhR2x6TG1OdmJHeGxZM1JwYjI0Z1BTQmJYVHRjY2x4dVhIUmNkRngwZEdocGN5NWhjR2xRWVdkbFUybDZaU0E5SUdGd2FWQmhaMlZUYVhwbElIeDhJREV5TzF4eVhHNWNkRngwWEhSMGFHbHpMbU4xY25KbGJuUkJjR2xRWVdkbElEMGdNVHRjY2x4dVhIUmNkRngwZEdocGN5NXNZWE4wVUdGblpTQTlJSFZ1WkdWbWFXNWxaRHRjY2x4dVhIUmNkRngwZEdocGN5NXpaWFJRWVhKaGJYTW9lMXh5WEc1Y2RGeDBYSFJjZEhCaFoyVk9kVzA2SUhSb2FYTXVZM1Z5Y21WdWRFRndhVkJoWjJVc1hISmNibHgwWEhSY2RGeDBjR0ZuWlZOcGVtVTZJSFJvYVhNdVlYQnBVR0ZuWlZOcGVtVWdYSEpjYmx4MFhIUmNkSDBwTzF4eVhHNWNkRngwZlZ4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dVhIUWdLaUJIWlhRZ2RHaGxJRzF2WkdWc0lHUmhkR0VnWm5KdmJTQjBhR1VnVWtWVFZDQkJVRWtnVzA1UFRpMXdZV2RwYm1GMFpXUWdVa1ZUVkNCQlVFa2diMjVzZVYxY2NseHVYSFFnS2lCQVpHVnpZM0pwY0hScGIyNGdSbVYwWTJnZ2RHaGxJR1JoZEdFZ1puSnZiU0IwYUdVZ1VrVlRWQ0JCVUVrZ1lXNWtJSE4wYjNKbElHRnpJSFJvYVhNdUpHMXZaR1ZzWEhKY2JseDBJQ292WEhKY2JseDBaMlYwVFc5a1pXd2dLQ2tnZTF4eVhHNWNkRngwY21WMGRYSnVJRzVsZHlCUWNtOXRhWE5sS0NBb0lISmxjMjlzZG1VZ0tTQTlQaUI3WEhKY2JseDBYSFJjZEhSb2FYTXVabVYwWTJoRVlYUmhLQ0IwYUdsekxuVnliQ0FwTG5Sb1pXNG9JQ2dnWkdGMFlTQXBJRDArSUh0Y2NseHVYSFJjZEZ4MFhIUjBhR2x6TGlSdGIyUmxiQ0E5SUdSaGRHRTdYSEpjYmx4MFhIUmNkRngwY21WemIyeDJaU2dwTzF4eVhHNWNkRngwWEhSOUtUdGNjbHh1WEhSY2RIMHBPMXh5WEc1Y2RIMWNjbHh1WEhRdktpcGNjbHh1WEhRZ0tpQkhaWFFnZEdobElHNWxlSFFnUVZCSklIQmhaMlVnWm5KdmJTQjBhR1VnVWtWVFZDQkJVRWtnVzNCaFoybHVZWFJsWkNCU1JWTlVJRUZRU1NCdmJteDVYVnh5WEc1Y2RDQXFJRUJrWlhOamNtbHdkR2x2YmlCR1pYUmphQ0IwYUdVZ2JtVjRkQ0JCVUVrZ2NHRm5aU0JtY205dElIUm9aU0J6WlhKMlpYSXNJR0poYzJWa0lHOXVJSFJvWlNCc1lYTjBJSEJoWjJVZ1ptVjBZMmhsWkM0Z1UzUnZjbVVnZEdobElISmxkSFZ5Ym1Wa0lHUmhkR0ZjY2x4dVhIUWdLaUJoY3lCMGFHbHpMaVJ0YjJSbGJEc2dZV1JrSUhSb1pTQnlaWFIxY201bFpDQndZV2RwYm1GMFpXUWdaR0YwWVNCaGN5QjBieUIwYUdVZ1pXNWtJRzltSUhSb2FYTXVZMjlzYkdWamRHbHZibHh5WEc1Y2RDQXFJRUJ5WlhSMWNtNXpJSHRQWW1wbFkzUjlJRkJ5YjIxcGMyVWdiMkpxWldOMFhISmNibHgwSUNvdlhISmNibHgwWjJWMFRtVjRkRkJoWjJVZ0tDQnlaWE5sZENBcElIdGNjbHh1WEhSY2RISmxkSFZ5YmlCdVpYY2dVSEp2YldselpTZ2dLQ0J5WlhOdmJIWmxJQ2tnUFQ0Z2UxeHlYRzVjZEZ4MFhIUjBhR2x6TG5CaGNtRnRjeTV3WVdkbFRuVnRJRDBnZEdocGN5NWpkWEp5Wlc1MFFYQnBVR0ZuWlNzck8xeHlYRzVjZEZ4MFhIUjBhR2x6TG1kbGRFMXZaR1ZzS0NrdWRHaGxiaWdnS0NrZ1BUNGdlMXh5WEc1Y2RGeDBYSFJjZEdsbUlDZ2dkR2hwY3k0a2JXOWtaV3hiZEdocGN5NWpiMnhzWldOMGFXOXVVR0YwYUYwdWJHVnVaM1JvSUQwOVBTQXdJQ2tnZTF4eVhHNWNkRngwWEhSY2RGeDBkR2hwY3k1c1lYTjBVR0ZuWlNBOUlIUm9hWE11WTNWeWNtVnVkRUZ3YVZCaFoyVTdYSEpjYmx4MFhIUmNkRngwZlZ4eVhHNWNkRngwWEhSY2RHbG1JQ2dnY21WelpYUWdLU0I3WEhKY2JseDBYSFJjZEZ4MFhIUjBhR2x6TG1OdmJHeGxZM1JwYjI0Z1BTQmJYVHRjY2x4dVhIUmNkRngwWEhSOVhISmNibHgwWEhSY2RGeDBkR2hwY3k1c1lYTjBVbVYwZFhKdVpXUlFZV2RsSUQwZ2RHaHBjeTRrYlc5a1pXeGJkR2hwY3k1amIyeHNaV04wYVc5dVVHRjBhRjA3WEhKY2JseDBYSFJjZEZ4MGRHaHBjeTVqYjJ4c1pXTjBhVzl1SUQwZ2RHaHBjeTVqYjJ4c1pXTjBhVzl1TG1OdmJtTmhkQ2dnZEdocGN5NXNZWE4wVW1WMGRYSnVaV1JRWVdkbElDazdYSEpjYmx4MFhIUmNkRngwY21WemIyeDJaU2dwTzF4eVhHNWNkRngwWEhSOUtUdGNjbHh1WEhSY2RIMHBPMXgwWEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc1Y2RDQXFJRUZrWkNCemRYQndiR2xsWkNCd1lYSmhiV1YwWlhKeklIUnZJSFJvWlNCdGIyUmxiQ0JWVWt4Y2NseHVYSFFnS2lCQVpHVnpZM0pwY0hScGIyNGdRMjl1ZG1WeWRDQm9ZWE5vSUc5bUlIQmhjbUZ0WlhSbGNuTWdkRzhnY1hWbGNua2djM1J5YVc1bklHRnVaQ0JoY0hCbGJtUWdkRzhnYlc5a1pXd2dkWEpzWEhKY2JseDBJQ292WEhKY2JseDBjMlYwVUdGeVlXMXpJQ2dnYjJKcUlDa2dlMXh5WEc1Y2RGeDBkR2hwY3k1d1lYSmhiWE1nUFNCUFltcGxZM1F1WVhOemFXZHVLQ0IwYUdsekxuQmhjbUZ0Y3l3Z2IySnFJQ2s3WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc1Y2RDQXFJRVpsZEdOb0lHUmhkR0VnWm5KdmJTQjBhR1VnYzJWeWRtVnlYSEpjYmx4MElDb2dRR1JsYzJOeWFYQjBhVzl1SUUxaGEyVWdZU0JuWlhRZ2NtVnhkV1Z6ZENCbWIzSWdkR2hsSUZKRlUxUWdRVkJKSUdSaGRHRmNjbHh1WEhRZ0tpQkFjbVYwZFhKdWN5QjdUMkpxWldOMGZTQlFjbTl0YVhObElHOWlhbVZqZEZ4eVhHNWNkQ0FxTDF4eVhHNWNkR1psZEdOb1JHRjBZU0FvSUhWeWJDQXBJSHRjY2x4dVhIUmNkR3hsZENCeGN5QTlJSEYxWlhKNVUzUnlhVzVuVTNSeWFXNW5hV1o1S0NCMGFHbHpMbkJoY21GdGN5QXBPMXh5WEc1Y2RGeDBMeTlVVDBSUE9pQnlaVzF2ZG1VZ0ppQnBaaUJ1YnlCeGMxeHlYRzVjZEZ4MGRYSnNJQ3M5SUdBL1ptOXliV0YwUFdwemIyNG1KSHR4YzMxZ08xeDBYSEpjYmx4MFhIUnlaWFIxY200Z2JtVjNJRkJ5YjIxcGMyVW9ablZ1WTNScGIyNG9JSEpsYzI5c2RtVXNJSEpsYW1WamRDQXBJSHRjY2x4dVhIUmNkRngwZUdoeUtIdGNjbHh1WEhSY2RGeDBJQ0FnSUhWeWFUb2dkWEpzTEZ4eVhHNWNkRngwWEhRZ0lDQWdkWE5sV0VSU09pQjBjblZsTEZ4eVhHNWNkRngwWEhSOUxDQm1kVzVqZEdsdmJpQW9JR1Z5Y205eUxDQnlaWE53YjI1elpTd2dZbTlrZVNBcElIdGNjbHh1WEhSY2RGeDBJQ0FnSUdsbUlDZ2dZbTlrZVNBaFBUMGdkVzVrWldacGJtVmtJQ2tnZTF4eVhHNWNkRngwWEhRZ0lDQWdYSFJ5WlhOdmJIWmxLQ0JLVTA5T0xuQmhjbk5sS0dKdlpIa3BJQ2s3WEhKY2JseDBYSFJjZENBZ0lDQjlJR1ZzYzJVZ2FXWWdLQ0JsY25KdmNpQWhQVDBnYm5Wc2JDQXBJSHRjY2x4dVhIUmNkRngwSUNBZ0lGeDBMeThnWVd4bGNuUW9KMmgwZEhBZ1pYSnliM0k2SUhOMFlYUjFjeUJqYjJSbE9pQW5JQ3NnY21WemNHOXVjMlV1YzNSaGRIVnpRMjlrWlNBcklDYzdJR1Z5Y205eU9pQW5JQ3NnWlhKeWIzSXBPMXh5WEc1Y2RGeDBYSFFnSUNBZ1hIUnlaV3BsWTNRb0lFVnljbTl5S0NCbGNuSnZjaUFwSUNrN1hISmNibHgwWEhSY2RDQWdJQ0I5WEhKY2JseDBYSFJjZEgwcE8xeHlYRzVjZEZ4MGZTazdYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzVjZENBcUlGSmxabkpsYzJnZ2RHaGxJR3h2WTJGc0lHMXZaR1ZzSUdGdVpDQmpiMnhzWldOMGFXOXVYSEpjYmx4MElDb2dRR1JsYzJOeWFYQjBhVzl1SUZKbExXWmxkR05vSUdGdVpDQnZkbVZ5ZDNKcGRHVWdkR2hsSUd4dlkyRnNJRzF2WkdWc0lHRnVaQ0JqYjJ4c1pXTjBhVzl1SUhkcGRHZ2dXMnhoZEdWemRGMGdjMlZ5ZG1WeUlHUmhkR0ZjY2x4dVhIUWdLaUJBY21WMGRYSnVjeUI3VDJKcVpXTjBmU0JRY205dGFYTmxJRzlpYW1WamRGeHlYRzVjZENBcUwxeHlYRzVjZEhKbFpuSmxjMmdnS0NrZ2UxeHlYRzVjZEZ4MGNtVjBkWEp1SUc1bGR5QlFjbTl0YVhObEtDQW9JSEpsYzI5c2RtVWdLU0E5UGlCN0lGeHlYRzVjZEZ4MFhIUnBaaUFvSUhSb2FYTXVhWE5RWVdkcGJtRjBaV1FnS1NCN1hISmNibHgwWEhSY2RGeDBkR2hwY3k1amIyeHNaV04wYVc5dUlEMGdXMTA3WEhKY2JseDBYSFJjZEZ4MGRHaHBjeTVqZFhKeVpXNTBRWEJwVUdGblpTQTlJREU3WEhKY2JseDBYSFJjZEZ4MGRHaHBjeTVuWlhST1pYaDBVR0ZuWlNnZ2RISjFaU0FwTG5Sb1pXNG9JQ2dwSUQwK0lIdGNjbHh1WEhSY2RGeDBYSFJjZEhKbGMyOXNkbVVvS1R0Y2NseHVYSFJjZEZ4MFhIUjlLVHRjY2x4dVhIUmNkRngwZlNCbGJITmxJSHRjY2x4dVhIUmNkRngwWEhSMGFHbHpMbWRsZEUxdlpHVnNLQ2t1ZEdobGJpZ2dLQ2tnUFQ0Z2UxeHlYRzVjZEZ4MFhIUmNkRngwY21WemIyeDJaU2dwTzF4eVhHNWNkRngwWEhSY2RIMHBPMXh5WEc1Y2RGeDBYSFI5WEhKY2JseDBYSFI5S1R0Y2NseHVYSFI5WEhKY2JuMWNjbHh1WEhKY2JtVjRjRzl5ZENCa1pXWmhkV3gwSUUxdlpHVnNPeUpkZlE9PSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHR2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbnZhciBfSGFuZGxlYmFyc0hhbmRsZWJhcnMgPSByZXF1aXJlKCcuLi8uLi9IYW5kbGViYXJzL2hhbmRsZWJhcnMnKTtcblxudmFyIF9IYW5kbGViYXJzSGFuZGxlYmFyczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9IYW5kbGViYXJzSGFuZGxlYmFycyk7XG5cbi8qKlxyXG4gKiBDcmVhdGUgYSB3aWRnZXQgdmlld1xyXG4gKiBAY2xhc3NkZXNjIENyZWF0ZSBhIHZpZXcgb2JqZWN0IFxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy53aWRnZXQuIFRoZSB3aWRnZXQgaW5zdGFuY2UgW3JlcXVpcmVkXVxyXG4gKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5wb2xsSW50ZXJ2YWwuIEludGVydmFsIGluIG1pbGxzZWNvbmRzIHRvIGF1dG8tcmVmcmVzaCB0aGUgdmlldydzIGRhdGFcclxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMucG9sbFRyaWdnZXIuIENTUyBzZWxlY3RvciBmb3IgZWxlbWVudCB0byBjbGljay10cmlnZ2VyIGEgcmVmcmVzaCBvZiB0aGUgdmlldydzIGRhdGFcclxuICogQGNsYXNzIFNldCB2aWV3IGluc3RhbmNlIHByb3BlcnRpZXMgYW5kIGluaXRpYWxpc2Ugdmlld1xyXG4gKi9cblxudmFyIFZpZXcgPSAoZnVuY3Rpb24gKCkge1xuXHRmdW5jdGlvbiBWaWV3KCkge1xuXHRcdHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG5cblx0XHR2YXIgd2lkZ2V0ID0gX3JlZi53aWRnZXQ7XG5cdFx0dmFyIGVsID0gX3JlZi5lbDtcblx0XHR2YXIgdGVtcGxhdGUgPSBfcmVmLnRlbXBsYXRlO1xuXHRcdHZhciBtb2RlbCA9IF9yZWYubW9kZWw7XG5cdFx0dmFyIHBvbGxJbnRlcnZhbCA9IF9yZWYucG9sbEludGVydmFsO1xuXHRcdHZhciBwb2xsVHJpZ2dlciA9IF9yZWYucG9sbFRyaWdnZXI7XG5cblx0XHRfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmlldyk7XG5cblx0XHR0aGlzLndpZGdldCA9IHdpZGdldDtcblx0XHR0aGlzLmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7XG5cdFx0dGhpcy50ZW1wbGF0ZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGVtcGxhdGUpLmlubmVySFRNTDtcblx0XHR0aGlzLm1vZGVsID0gbW9kZWw7XG5cdFx0aWYgKCF0aGlzLndpZGdldCB8fCAhdGhpcy5lbCB8fCAhdGhpcy50ZW1wbGF0ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmNvbmZpZyA9IHRoaXMud2lkZ2V0LmNvbmZpZztcblx0XHR0aGlzLnBvbGxJbnRlcnZhbCA9IHBvbGxJbnRlcnZhbDtcblx0XHR0aGlzLnBvbGxUcmlnZ2VyID0gcG9sbFRyaWdnZXIgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHBvbGxUcmlnZ2VyKSA6IHVuZGVmaW5lZDtcblxuXHRcdHRoaXMuaW5pdCgpO1xuXHR9XG5cblx0LyoqXHJcbiBcdCogSW5pdGlhbGlzZSB2aWV3XHJcbiBcdCogQGRlc2NyaXB0aW9uIFN0YXJ0IHZpZXcgbW9kZWwgdXBkYXRlIHBvbGxlcjsgcmVnaXN0ZXIgdmlldyBtb2RlbCB1cGRhdGUgdHJpZ2dlclxyXG4gXHQqL1xuXG5cdF9jcmVhdGVDbGFzcyhWaWV3LCBbe1xuXHRcdGtleTogJ2luaXQnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBpbml0KCkge1xuXHRcdFx0aWYgKHRoaXMucG9sbEludGVydmFsKSB7XG5cdFx0XHRcdHRoaXMucG9sbEF0SW50ZXJ2YWwoKTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLnBvbGxUcmlnZ2VyKSB7XG5cdFx0XHRcdHRoaXMucmVnaXN0ZXJQb2xsVHJpZ2dlcigpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBSZW5kZXIgdGhlIHZpZXdcclxuICBcdCogQGRlc2NyaXB0aW9uIFJlbmRlciB0aGUgdGVtcGxhdGUgd2l0aCBzdXBwbGllZCBkYXRhIGFuZCBhcHBlbmQgdG8gdmlldydzIGVsZW1lbnRcclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICdyZW5kZXInLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdFx0XHR2YXIgZGF0YSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHRoaXMuZGF0YSA6IGFyZ3VtZW50c1swXTtcblxuXHRcdFx0dGhpcy5kYXRhID0gZGF0YTtcblx0XHRcdHZhciB0ZW1wbGF0ZSA9IF9IYW5kbGViYXJzSGFuZGxlYmFyczJbJ2RlZmF1bHQnXS5jb21waWxlKHRoaXMudGVtcGxhdGUpO1xuXHRcdFx0dGhpcy5lbC5pbm5lckhUTUwgPSB0ZW1wbGF0ZShkYXRhKTtcblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogUHJlLWxvYWQgaW1hZ2VzIGFuZCByZXNldCB0aGUgd2lkZ2V0IGhlaWdodFxyXG4gIFx0KiBAZGVzY3JpcHRpb24gV2hlbiBzb21lIGltYWdlcyBsb2FkLCB0aGUgaGVpZ2h0IG9mIHRoZSB3aWRnZXQgbWF5IGNoYW5nZSBhbmQgYSB3aWRnZXQucmVzZXRIZWlnaHQoKSBcclxuICBcdCogbWF5IG5lZWQgdG8gYmUgZmlyZWQuIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIG1hbmFnZSB0aGUgbG9hZGluZyBvZiB0aGVzZSBpbWFnZXMgdGhhdCBnZW5lcmF0ZSBhIHdpZGdldCBcclxuICBcdCogZGltZW5zaW9uIGNoYW5nZSB0byBlbnN1cmUgdGhlIHdpZGdldCBoZWlnaHQgaXMgYWRhcHRlZCBvbmNlIHRoZSBpbWFnZSBoYXMgbG9hZGVkXHJcbiAgXHQqIEBwYXJhbSB7U3RyaW5nfSBQYXRoIHRvIHRoZSBpbWFnZSB0byBsb2FkXHJcbiAgXHQqIEBwYXJhbSB7U3RyaW5nfSBVbmlxdWUgY3NzMyBzZWxlY3RvciB0YXJnZXR0aW5nIHRoZSA8aW1nIC8+IGVsZW1lbnQgdG8gbG9hZCB0aGUgcGF0aCBpbnRvXHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAnbG9hZEltYWdlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gbG9hZEltYWdlKHBhdGgsIGVsKSB7XG5cdFx0XHR2YXIgX3RoaXMgPSB0aGlzO1xuXG5cdFx0XHR2YXIgaW1nID0gbmV3IEltYWdlKCk7XG5cdFx0XHRpbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCkuc3JjID0gcGF0aDtcblx0XHRcdFx0X3RoaXMud2lkZ2V0LnJlc2V0SGVpZ2h0KCk7XG5cdFx0XHR9KTtcblx0XHRcdGltZy5zcmMgPSBwYXRoO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBSZWZyZXNoIHZpZXcgd2l0aCBsYXRlc3Qgc2VydmVyIGRhdGFcclxuICBcdCogQGRlc2NyaXB0aW9uIFNldCBjb250cm9sICdsb2FkaW5nJyBDU1Mgc3RhdGUgb24gcG9sbCB0cmlnZ2VyOyB0cmlnZ2VyIGEgbW9kZWwgcmVmcmVzaDsgdGhlbiByZS1yZW5kZXIgdGhyIHZpZXcsIFxyXG4gIFx0KiByZXNldCBwb2xsIHRyaWdnZXIgQ1NTIHN0YXRlLCByZXNldCB3aWRnZXQgaGVpZ2h0LCByZXNldCB0aGUgdmlldydzIGNhcm91c2VsLCBpbml0aWFsaXNlIGFuYWx5dGljcyBvbiBuZXcgY2FyZHMsXHJcbiAgXHQqIGZpcmUgbmV3IGFuYWx5dGljcyBjYXJkIGltcHJlc3Npb25zXHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAncmVmcmVzaCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHJlZnJlc2goKSB7XG5cdFx0XHR2YXIgX3RoaXMyID0gdGhpcztcblxuXHRcdFx0dGhpcy5wb2xsVHJpZ2dlciAmJiB0aGlzLnBvbGxUcmlnZ2VyLmNsYXNzTGlzdC5hZGQoJ2lzLWxvYWRpbmcnLCAnaXMtZGlzYWJsZWQnKTtcblx0XHRcdHRoaXMubW9kZWwucmVmcmVzaCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRfdGhpczIucmVuZGVyKCk7XG5cdFx0XHRcdF90aGlzMi5wb2xsVHJpZ2dlciAmJiBfdGhpczIucG9sbFRyaWdnZXIuY2xhc3NMaXN0LnJlbW92ZSgnaXMtbG9hZGluZycsICdpcy1kaXNhYmxlZCcpO1xuXHRcdFx0XHRfdGhpczIud2lkZ2V0LnJlc2V0SGVpZ2h0KCk7XG5cdFx0XHRcdF90aGlzMi5jYXJvdXNlbCAmJiBfdGhpczIuY2Fyb3VzZWwucmVzZXQoKTtcblx0XHRcdFx0X3RoaXMyLndpZGdldC5hbmFseXRpY3MuY2FyZHNJbml0KCk7XG5cdFx0XHRcdF90aGlzMi53aWRnZXQuYW5hbHl0aWNzLmNhcmRJbXByZXNzaW9ucygpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIFJlZnJlc2ggdmlldyB3aXRoIGxhdGVzdCBzZXJ2ZXIgZGF0YSBhdCBzcGVjaWZpZWQgaW50ZXJ2YWxcclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICdwb2xsQXRJbnRlcnZhbCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHBvbGxBdEludGVydmFsKCkge1xuXHRcdFx0dmFyIF90aGlzMyA9IHRoaXM7XG5cblx0XHRcdHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdF90aGlzMy5yZWZyZXNoKCk7XG5cdFx0XHR9LCB0aGlzLnBvbGxJbnRlcnZhbCk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIFJlZ2lzdGVyIGEgY2xpY2sgbGlzdGVuZXIgb24gc3BlY2lmaWVkIERPTSBlbGVtZW50IHRvIHJlZnJlc2ggdmlldyB3aXRoIGxhdGVzdCBzZXJ2ZXIgZGF0YVxyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ3JlZ2lzdGVyUG9sbFRyaWdnZXInLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiByZWdpc3RlclBvbGxUcmlnZ2VyKCkge1xuXHRcdFx0dmFyIF90aGlzNCA9IHRoaXM7XG5cblx0XHRcdHRoaXMucG9sbFRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdF90aGlzNC5yZWZyZXNoKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogQXBwZW5kIHRoZSBuZXh0IHNldCBvZiBjYXJkcyB0byB0aGUgdmlldyBbZm9yIHBhZ2luYXRlZCBtb2RlbHMgb25seV1cclxuICBcdCogQGRlc2NyaXB0aW9uIEdldCB0aGUgdmlldydzIG1vZGVsJ3MgbmV4dCBBUEkgcGFnZSwgcmVuZGVyIHRoZSB2aWV3IHRlbXBsYXRlIHdpdGggbmV3IGRhdGEgYW5kIGFwcGVuZCBub2RlcyB0byB2aWV3IGVsZW1lbnRcclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICdhcHBlbmROZXh0UGFnZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGFwcGVuZE5leHRQYWdlKCkge1xuXHRcdFx0dmFyIF90aGlzNSA9IHRoaXM7XG5cblx0XHRcdGlmICghdGhpcy5tb2RlbC5pc1BhZ2luYXRlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0XHRcdFx0X3RoaXM1Lm1vZGVsLmdldE5leHRQYWdlKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0dmFyIHRlbXBsYXRlID0gX0hhbmRsZWJhcnNIYW5kbGViYXJzMlsnZGVmYXVsdCddLmNvbXBpbGUoX3RoaXM1LnRlbXBsYXRlKTtcblx0XHRcdFx0XHR2YXIgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0XHRcdHZhciBkb2NGcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXHRcdFx0XHRcdGZyYWcuaW5uZXJIVE1MID0gdGVtcGxhdGUoe1xuXHRcdFx0XHRcdFx0ZXZlbnRzOiBfdGhpczUubW9kZWwubGFzdFJldHVybmVkUGFnZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFtdLnNsaWNlLmNhbGwoZnJhZy5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcblx0XHRcdFx0XHRcdGRvY0ZyYWcuYXBwZW5kQ2hpbGQoZWwpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdF90aGlzNS5lbC5hcHBlbmRDaGlsZChkb2NGcmFnKTtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XSk7XG5cblx0cmV0dXJuIFZpZXc7XG59KSgpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBWaWV3O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMloxYm1SeVlXbHpaWEl0YkdWaFpHVnlZbTloY21RdlltOTNaWEpmWTI5dGNHOXVaVzUwY3k5cWRYTjBaMmwyYVc1bkxYZHBaR2RsZEMxbWNtRnRaWGR2Y21zdlkyOXRjRzl1Wlc1MGN5OXNhV0l2YW5NdlpuSmhiV1YzYjNKckwxWnBaWGN1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlFVRXNXVUZCV1N4RFFVRkRPenM3T3pzN096czdPenM3YjBOQlJWVXNOa0pCUVRaQ096czdPenM3T3pzN096czdPMGxCVlRsRExFbEJRVWs3UVVGRFJ5eFZRVVJRTEVsQlFVa3NSMEZEZFVVN2JVVkJRVXdzUlVGQlJUczdUVUZCTjBRc1RVRkJUU3hSUVVGT0xFMUJRVTA3VFVGQlJTeEZRVUZGTEZGQlFVWXNSVUZCUlR0TlFVRkZMRkZCUVZFc1VVRkJVaXhSUVVGUk8wMUJRVVVzUzBGQlN5eFJRVUZNTEV0QlFVczdUVUZCUlN4WlFVRlpMRkZCUVZvc1dVRkJXVHROUVVGRkxGZEJRVmNzVVVGQldDeFhRVUZYT3p0M1FrRkVha1VzU1VGQlNUczdRVUZGVWl4TlFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFMUJRVTBzUTBGQlF6dEJRVU55UWl4TlFVRkpMRU5CUVVNc1JVRkJSU3hIUVVGSExGRkJRVkVzUTBGQlF5eGhRVUZoTEVOQlFVVXNSVUZCUlN4RFFVRkZMRU5CUVVNN1FVRkRka01zVFVGQlNTeERRVUZETEZGQlFWRXNSMEZCUnl4UlFVRlJMRU5CUVVNc1lVRkJZU3hEUVVGRkxGRkJRVkVzUTBGQlJTeERRVUZETEZOQlFWTXNRMEZCUXp0QlFVTTNSQ3hOUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEV0QlFVc3NRMEZCUXp0QlFVTnVRaXhOUVVGTExFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RlFVRkhPMEZCUTJwRUxGVkJRVTg3UjBGRFVEdEJRVU5FTEUxQlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVjc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTTdRVUZEYWtNc1RVRkJTU3hEUVVGRExGbEJRVmtzUjBGQlJ5eFpRVUZaTEVOQlFVTTdRVUZEYWtNc1RVRkJTU3hEUVVGRExGZEJRVmNzUjBGQlJ5eFhRVUZYTEVkQlFVY3NVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJSU3hYUVVGWExFTkJRVVVzUjBGQlJ5eFRRVUZUTEVOQlFVTTdPMEZCUlc1R0xFMUJRVWtzUTBGQlF5eEpRVUZKTEVWQlFVVXNRMEZCUXp0RlFVTmFPenM3T3pzN08yTkJaRWtzU1VGQlNUczdVMEZ0UWtnc1owSkJRVWM3UVVGRFVpeFBRVUZMTEVsQlFVa3NRMEZCUXl4WlFVRlpMRVZCUVVjN1FVRkRlRUlzVVVGQlNTeERRVUZETEdOQlFXTXNSVUZCUlN4RFFVRkRPMGxCUTNSQ08wRkJRMFFzVDBGQlN5eEpRVUZKTEVOQlFVTXNWMEZCVnl4RlFVRkhPMEZCUTNaQ0xGRkJRVWtzUTBGQlF5eHRRa0ZCYlVJc1JVRkJSU3hEUVVGRE8wbEJRek5DTzBkQlEwUTdPenM3T3pzN08xTkJTMDBzYTBKQlFXMUNPMDlCUVdwQ0xFbEJRVWtzZVVSQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrN08wRkJRM1JDTEU5QlFVa3NRMEZCUXl4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRE8wRkJRMnBDTEU5QlFVa3NVVUZCVVN4SFFVRkhMR3REUVVGWExFOUJRVThzUTBGQlJTeEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkZMRU5CUVVNN1FVRkRia1FzVDBGQlNTeERRVUZETEVWQlFVVXNRMEZCUXl4VFFVRlRMRWRCUVVjc1VVRkJVU3hEUVVGRkxFbEJRVWtzUTBGQlJTeERRVUZETzBkQlEzSkRPenM3T3pzN096czdPenM3VTBGVFV5eHRRa0ZCUlN4SlFVRkpMRVZCUVVVc1JVRkJSU3hGUVVGSE96czdRVUZEZEVJc1QwRkJTU3hIUVVGSExFZEJRVWNzU1VGQlNTeExRVUZMTEVWQlFVVXNRMEZCUXp0QlFVTjBRaXhOUVVGSExFTkJRVU1zWjBKQlFXZENMRU5CUVVNc1RVRkJUU3hGUVVGRkxGbEJRVTg3UVVGRGJrTXNXVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJSU3hGUVVGRkxFTkJRVVVzUTBGQlF5eEhRVUZITEVkQlFVY3NTVUZCU1N4RFFVRkRPMEZCUTNoRExGVkJRVXNzVFVGQlRTeERRVUZETEZkQlFWY3NSVUZCUlN4RFFVRkRPMGxCUXpGQ0xFTkJRVU1zUTBGQlF6dEJRVU5JTEUxQlFVY3NRMEZCUXl4SFFVRkhMRWRCUVVjc1NVRkJTU3hEUVVGRE8wZEJRMlk3T3pzN096czdPenM3VTBGUFR5eHRRa0ZCUnpzN08wRkJRMVlzVDBGQlNTeERRVUZETEZkQlFWY3NTVUZCU1N4SlFVRkpMRU5CUVVNc1YwRkJWeXhEUVVGRExGTkJRVk1zUTBGQlF5eEhRVUZITEVOQlFVTXNXVUZCV1N4RlFVRkZMR0ZCUVdFc1EwRkJReXhEUVVGRE8wRkJRMmhHTEU5QlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1QwRkJUeXhGUVVGRkxFTkJRVU1zU1VGQlNTeERRVUZGTEZsQlFVMDdRVUZEYUVNc1YwRkJTeXhOUVVGTkxFVkJRVVVzUTBGQlF6dEJRVU5rTEZkQlFVc3NWMEZCVnl4SlFVRkpMRTlCUVVzc1YwRkJWeXhEUVVGRExGTkJRVk1zUTBGQlF5eE5RVUZOTEVOQlFVTXNXVUZCV1N4RlFVRkZMR0ZCUVdFc1EwRkJReXhEUVVGRE8wRkJRMjVHTEZkQlFVc3NUVUZCVFN4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRE8wRkJRekZDTEZkQlFVc3NVVUZCVVN4SlFVRkpMRTlCUVVzc1VVRkJVU3hEUVVGRExFdEJRVXNzUlVGQlJTeERRVUZETzBGQlEzWkRMRmRCUVVzc1RVRkJUU3hEUVVGRExGTkJRVk1zUTBGQlF5eFRRVUZUTEVWQlFVVXNRMEZCUXp0QlFVTnNReXhYUVVGTExFMUJRVTBzUTBGQlF5eFRRVUZUTEVOQlFVTXNaVUZCWlN4RlFVRkZMRU5CUVVNN1NVRkRlRU1zUTBGQlF5eERRVUZETzBkQlEwZzdPenM3T3pzN1UwRkpZeXd3UWtGQlJ6czdPMEZCUTJwQ0xGTkJRVTBzUTBGQlF5eFhRVUZYTEVOQlFVVXNXVUZCVFR0QlFVTjZRaXhYUVVGTExFOUJRVThzUlVGQlJTeERRVUZETzBsQlEyWXNSVUZCUlN4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRkxFTkJRVU03UjBGRGRrSTdPenM3T3pzN1UwRkpiVUlzSzBKQlFVYzdPenRCUVVOMFFpeFBRVUZKTEVOQlFVTXNWMEZCVnl4RFFVRkRMR2RDUVVGblFpeERRVUZETEU5QlFVOHNSVUZCUlN4WlFVRk5PMEZCUTJoRUxGZEJRVXNzVDBGQlR5eEZRVUZGTEVOQlFVTTdTVUZEWml4RFFVRkRMRU5CUVVNN1IwRkRTRHM3T3pzN096czdVMEZMWXl3d1FrRkJSenM3TzBGQlEycENMRTlCUVVzc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEZkQlFWY3NSVUZCUnp0QlFVTTVRaXhYUVVGUE8wbEJRMUE3UVVGRFJDeFZRVUZQTEVsQlFVa3NUMEZCVHl4RFFVRkRMRlZCUVVVc1QwRkJUeXhGUVVGTk8wRkJRMnBETEZkQlFVc3NTMEZCU3l4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlJTeFpRVUZOTzBGQlEzQkRMRk5CUVVrc1VVRkJVU3hIUVVGSExHdERRVUZYTEU5QlFVOHNRMEZCUlN4UFFVRkxMRkZCUVZFc1EwRkJSU3hEUVVGRE8wRkJRMjVFTEZOQlFVa3NTVUZCU1N4SFFVRkhMRkZCUVZFc1EwRkJReXhoUVVGaExFTkJRVVVzUzBGQlN5eERRVUZGTEVOQlFVTTdRVUZETTBNc1UwRkJTU3hQUVVGUExFZEJRVWNzVVVGQlVTeERRVUZETEhOQ1FVRnpRaXhGUVVGRkxFTkJRVU03UVVGRGFFUXNVMEZCU1N4RFFVRkRMRk5CUVZNc1IwRkJSeXhSUVVGUkxFTkJRVU03UVVGRGVrSXNXVUZCVFN4RlFVRkZMRTlCUVVzc1MwRkJTeXhEUVVGRExHZENRVUZuUWp0TlFVTnVReXhEUVVGRExFTkJRVU03UVVGRFNDeFBRVUZGTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJSU3hKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZGTEVOQlFVTXNUMEZCVHl4RFFVRkRMRlZCUVVVc1JVRkJSU3hGUVVGTk8wRkJRMmhFTEdGQlFVOHNRMEZCUXl4WFFVRlhMRU5CUVVVc1JVRkJSU3hEUVVGRkxFTkJRVU03VFVGRE1VSXNRMEZCUXl4RFFVRkRPMEZCUTBnc1dVRkJTeXhGUVVGRkxFTkJRVU1zVjBGQlZ5eERRVUZGTEU5QlFVOHNRMEZCUlN4RFFVRkRPMEZCUXk5Q0xGbEJRVThzUlVGQlJTeERRVUZETzB0QlExWXNRMEZCUXl4RFFVRkRPMGxCUTBnc1EwRkJReXhEUVVGRE8wZEJRMGc3T3p0UlFUVkhTU3hKUVVGSk96czdjVUpCSzBkTExFbEJRVWtpTENKbWFXeGxJam9pUXpvdmRHVnRjQzlIUnk1R2NtOXVkRVZ1WkM1WGFXUm5aWFJ6TDNkcFpHZGxkSE12Wm5WdVpISmhhWE5sY2kxc1pXRmtaWEppYjJGeVpDOWliM2RsY2w5amIyMXdiMjVsYm5SekwycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5cWN5OW1jbUZ0WlhkdmNtc3ZWbWxsZHk1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaWQxYzJVZ2MzUnlhV04wSnp0Y2NseHVYSEpjYm1sdGNHOXlkQ0JJWVc1a2JHVmlZWEp6SUdaeWIyMGdKeTR1THk0dUwwaGhibVJzWldKaGNuTXZhR0Z1Wkd4bFltRnljeWM3WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nUTNKbFlYUmxJR0VnZDJsa1oyVjBJSFpwWlhkY2NseHVJQ29nUUdOc1lYTnpaR1Z6WXlCRGNtVmhkR1VnWVNCMmFXVjNJRzlpYW1WamRDQmNjbHh1SUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUc5d2RHbHZibk11ZDJsa1oyVjBMaUJVYUdVZ2QybGtaMlYwSUdsdWMzUmhibU5sSUZ0eVpYRjFhWEpsWkYxY2NseHVJQ29nUUhCaGNtRnRJSHRPZFcxaVpYSjlJRzl3ZEdsdmJuTXVjRzlzYkVsdWRHVnlkbUZzTGlCSmJuUmxjblpoYkNCcGJpQnRhV3hzYzJWamIyNWtjeUIwYnlCaGRYUnZMWEpsWm5KbGMyZ2dkR2hsSUhacFpYY25jeUJrWVhSaFhISmNiaUFxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0J2Y0hScGIyNXpMbkJ2Ykd4VWNtbG5aMlZ5TGlCRFUxTWdjMlZzWldOMGIzSWdabTl5SUdWc1pXMWxiblFnZEc4Z1kyeHBZMnN0ZEhKcFoyZGxjaUJoSUhKbFpuSmxjMmdnYjJZZ2RHaGxJSFpwWlhjbmN5QmtZWFJoWEhKY2JpQXFJRUJqYkdGemN5QlRaWFFnZG1sbGR5QnBibk4wWVc1alpTQndjbTl3WlhKMGFXVnpJR0Z1WkNCcGJtbDBhV0ZzYVhObElIWnBaWGRjY2x4dUlDb3ZYSEpjYm1Oc1lYTnpJRlpwWlhjZ2UxeHlYRzVjZEdOdmJuTjBjblZqZEc5eUlDZ2dleUIzYVdSblpYUXNJR1ZzTENCMFpXMXdiR0YwWlN3Z2JXOWtaV3dzSUhCdmJHeEpiblJsY25aaGJDd2djRzlzYkZSeWFXZG5aWElnZlNBOUlIdDlJQ2tnZTF4eVhHNWNkRngwZEdocGN5NTNhV1JuWlhRZ1BTQjNhV1JuWlhRN1hISmNibHgwWEhSMGFHbHpMbVZzSUQwZ1pHOWpkVzFsYm5RdWNYVmxjbmxUWld4bFkzUnZjaWdnWld3Z0tUdGNjbHh1WEhSY2RIUm9hWE11ZEdWdGNHeGhkR1VnUFNCa2IyTjFiV1Z1ZEM1eGRXVnllVk5sYkdWamRHOXlLQ0IwWlcxd2JHRjBaU0FwTG1sdWJtVnlTRlJOVER0Y2NseHVYSFJjZEhSb2FYTXViVzlrWld3Z1BTQnRiMlJsYkR0Y2NseHVYSFJjZEdsbUlDZ2dJWFJvYVhNdWQybGtaMlYwSUh4OElDRjBhR2x6TG1Wc0lIeDhJQ0YwYUdsekxuUmxiWEJzWVhSbElDa2dlMXh5WEc1Y2RGeDBYSFJ5WlhSMWNtNDdYSEpjYmx4MFhIUjlYSEpjYmx4MFhIUjBhR2x6TG1OdmJtWnBaeUE5SUhSb2FYTXVkMmxrWjJWMExtTnZibVpwWnp0Y2NseHVYSFJjZEhSb2FYTXVjRzlzYkVsdWRHVnlkbUZzSUQwZ2NHOXNiRWx1ZEdWeWRtRnNPMXh5WEc1Y2RGeDBkR2hwY3k1d2IyeHNWSEpwWjJkbGNpQTlJSEJ2Ykd4VWNtbG5aMlZ5SUQ4Z1pHOWpkVzFsYm5RdWNYVmxjbmxUWld4bFkzUnZjaWdnY0c5c2JGUnlhV2RuWlhJZ0tTQTZJSFZ1WkdWbWFXNWxaRHRjY2x4dVhIUmNkRnh5WEc1Y2RGeDBkR2hwY3k1cGJtbDBLQ2s3WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc0Z1hIUXFJRWx1YVhScFlXeHBjMlVnZG1sbGQxeHlYRzRnWEhRcUlFQmtaWE5qY21sd2RHbHZiaUJUZEdGeWRDQjJhV1YzSUcxdlpHVnNJSFZ3WkdGMFpTQndiMnhzWlhJN0lISmxaMmx6ZEdWeUlIWnBaWGNnYlc5a1pXd2dkWEJrWVhSbElIUnlhV2RuWlhKY2NseHVJRngwS2k5Y2NseHVJRngwYVc1cGRDQW9LU0I3WEhKY2JseDBYSFJwWmlBb0lIUm9hWE11Y0c5c2JFbHVkR1Z5ZG1Gc0lDa2dlMXh5WEc1Y2RGeDBYSFIwYUdsekxuQnZiR3hCZEVsdWRHVnlkbUZzS0NrN1hISmNibHgwWEhSOVhISmNibHgwWEhScFppQW9JSFJvYVhNdWNHOXNiRlJ5YVdkblpYSWdLU0I3WEhKY2JseDBYSFJjZEhSb2FYTXVjbVZuYVhOMFpYSlFiMnhzVkhKcFoyZGxjaWdwTzF4eVhHNWNkRngwZlZ4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dUlGeDBLaUJTWlc1a1pYSWdkR2hsSUhacFpYZGNjbHh1SUZ4MEtpQkFaR1Z6WTNKcGNIUnBiMjRnVW1WdVpHVnlJSFJvWlNCMFpXMXdiR0YwWlNCM2FYUm9JSE4xY0hCc2FXVmtJR1JoZEdFZ1lXNWtJR0Z3Y0dWdVpDQjBieUIyYVdWM0ozTWdaV3hsYldWdWRGeHlYRzRnWEhRcUwxeHlYRzVjZEhKbGJtUmxjaUFvSUdSaGRHRTlkR2hwY3k1a1lYUmhJQ2tnZTF4eVhHNWNkRngwZEdocGN5NWtZWFJoSUQwZ1pHRjBZVHRjY2x4dVhIUmNkR3hsZENCMFpXMXdiR0YwWlNBOUlFaGhibVJzWldKaGNuTXVZMjl0Y0dsc1pTZ2dkR2hwY3k1MFpXMXdiR0YwWlNBcE8xeHlYRzVjZEZ4MGRHaHBjeTVsYkM1cGJtNWxja2hVVFV3Z1BTQjBaVzF3YkdGMFpTZ2daR0YwWVNBcE8xeHlYRzVjZEgxY2NseHVYSFF2S2lwY2NseHVJRngwS2lCUWNtVXRiRzloWkNCcGJXRm5aWE1nWVc1a0lISmxjMlYwSUhSb1pTQjNhV1JuWlhRZ2FHVnBaMmgwWEhKY2JpQmNkQ29nUUdSbGMyTnlhWEIwYVc5dUlGZG9aVzRnYzI5dFpTQnBiV0ZuWlhNZ2JHOWhaQ3dnZEdobElHaGxhV2RvZENCdlppQjBhR1VnZDJsa1oyVjBJRzFoZVNCamFHRnVaMlVnWVc1a0lHRWdkMmxrWjJWMExuSmxjMlYwU0dWcFoyaDBLQ2tnWEhKY2JpQmNkQ29nYldGNUlHNWxaV1FnZEc4Z1ltVWdabWx5WldRdUlGVnpaU0IwYUdseklHWjFibU4wYVc5dUlIUnZJRzFoYm1GblpTQjBhR1VnYkc5aFpHbHVaeUJ2WmlCMGFHVnpaU0JwYldGblpYTWdkR2hoZENCblpXNWxjbUYwWlNCaElIZHBaR2RsZENCY2NseHVJRngwS2lCa2FXMWxibk5wYjI0Z1kyaGhibWRsSUhSdklHVnVjM1Z5WlNCMGFHVWdkMmxrWjJWMElHaGxhV2RvZENCcGN5QmhaR0Z3ZEdWa0lHOXVZMlVnZEdobElHbHRZV2RsSUdoaGN5QnNiMkZrWldSY2NseHVJRngwS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnVUdGMGFDQjBieUIwYUdVZ2FXMWhaMlVnZEc4Z2JHOWhaRnh5WEc0Z1hIUXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQlZibWx4ZFdVZ1kzTnpNeUJ6Wld4bFkzUnZjaUIwWVhKblpYUjBhVzVuSUhSb1pTQThhVzFuSUM4K0lHVnNaVzFsYm5RZ2RHOGdiRzloWkNCMGFHVWdjR0YwYUNCcGJuUnZYSEpjYmlCY2RDb3ZYSEpjYmx4MGJHOWhaRWx0WVdkbElDZ2djR0YwYUN3Z1pXd2dLU0I3WEhKY2JseDBYSFJzWlhRZ2FXMW5JRDBnYm1WM0lFbHRZV2RsS0NrN1hISmNibHgwWEhScGJXY3VZV1JrUlhabGJuUk1hWE4wWlc1bGNpZ25iRzloWkNjc0lDZ3BJRDArSUNCN0lGeHlYRzVjZEZ4MFhIUmtiMk4xYldWdWRDNXhkV1Z5ZVZObGJHVmpkRzl5S0NCbGJDQXBMbk55WXlBOUlIQmhkR2c3WEhKY2JseDBYSFJjZEhSb2FYTXVkMmxrWjJWMExuSmxjMlYwU0dWcFoyaDBLQ2s3WEhKY2JseDBYSFI5S1R0Y2NseHVYSFJjZEdsdFp5NXpjbU1nUFNCd1lYUm9PMXh5WEc1Y2RIMWNjbHh1WEhRdktpcGNjbHh1SUZ4MEtpQlNaV1p5WlhOb0lIWnBaWGNnZDJsMGFDQnNZWFJsYzNRZ2MyVnlkbVZ5SUdSaGRHRmNjbHh1SUZ4MEtpQkFaR1Z6WTNKcGNIUnBiMjRnVTJWMElHTnZiblJ5YjJ3Z0oyeHZZV1JwYm1jbklFTlRVeUJ6ZEdGMFpTQnZiaUJ3YjJ4c0lIUnlhV2RuWlhJN0lIUnlhV2RuWlhJZ1lTQnRiMlJsYkNCeVpXWnlaWE5vT3lCMGFHVnVJSEpsTFhKbGJtUmxjaUIwYUhJZ2RtbGxkeXdnWEhKY2JpQmNkQ29nY21WelpYUWdjRzlzYkNCMGNtbG5aMlZ5SUVOVFV5QnpkR0YwWlN3Z2NtVnpaWFFnZDJsa1oyVjBJR2hsYVdkb2RDd2djbVZ6WlhRZ2RHaGxJSFpwWlhjbmN5QmpZWEp2ZFhObGJDd2dhVzVwZEdsaGJHbHpaU0JoYm1Gc2VYUnBZM01nYjI0Z2JtVjNJR05oY21SekxGeHlYRzRnWEhRcUlHWnBjbVVnYm1WM0lHRnVZV3g1ZEdsamN5QmpZWEprSUdsdGNISmxjM05wYjI1elhISmNiaUJjZENvdlhISmNibHgwY21WbWNtVnphQ0FvS1NCN1hISmNibHgwWEhSMGFHbHpMbkJ2Ykd4VWNtbG5aMlZ5SUNZbUlIUm9hWE11Y0c5c2JGUnlhV2RuWlhJdVkyeGhjM05NYVhOMExtRmtaQ2duYVhNdGJHOWhaR2x1Wnljc0lDZHBjeTFrYVhOaFlteGxaQ2NwT3lCY2NseHVYSFJjZEhSb2FYTXViVzlrWld3dWNtVm1jbVZ6YUNncExuUm9aVzRvSUNncElEMCtJSHRjY2x4dVhIUmNkRngwZEdocGN5NXlaVzVrWlhJb0tUdGNjbHh1WEhSY2RGeDBkR2hwY3k1d2IyeHNWSEpwWjJkbGNpQW1KaUIwYUdsekxuQnZiR3hVY21sbloyVnlMbU5zWVhOelRHbHpkQzV5WlcxdmRtVW9KMmx6TFd4dllXUnBibWNuTENBbmFYTXRaR2x6WVdKc1pXUW5LVHRjY2x4dVhIUmNkRngwZEdocGN5NTNhV1JuWlhRdWNtVnpaWFJJWldsbmFIUW9LVHRjY2x4dVhIUmNkRngwZEdocGN5NWpZWEp2ZFhObGJDQW1KaUIwYUdsekxtTmhjbTkxYzJWc0xuSmxjMlYwS0NrN1hISmNibHgwWEhSY2RIUm9hWE11ZDJsa1oyVjBMbUZ1WVd4NWRHbGpjeTVqWVhKa2MwbHVhWFFvS1R0Y2NseHVYSFJjZEZ4MGRHaHBjeTUzYVdSblpYUXVZVzVoYkhsMGFXTnpMbU5oY21SSmJYQnlaWE56YVc5dWN5Z3BPMXgwWEhKY2JseDBYSFI5S1R0Y2RGeHlYRzVjZEgxY2NseHVYSFF2S2lwY2NseHVJRngwS2lCU1pXWnlaWE5vSUhacFpYY2dkMmwwYUNCc1lYUmxjM1FnYzJWeWRtVnlJR1JoZEdFZ1lYUWdjM0JsWTJsbWFXVmtJR2x1ZEdWeWRtRnNYSEpjYmlCY2RDb3ZYSEpjYmx4MGNHOXNiRUYwU1c1MFpYSjJZV3dnS0NrZ2UxeHlYRzVjZEZ4MGQybHVaRzkzTG5ObGRFbHVkR1Z5ZG1Gc0tDQW9LU0E5UGlCN1hISmNibHgwWEhSY2RIUm9hWE11Y21WbWNtVnphQ2dwTzF4eVhHNWNkRngwZlN3Z2RHaHBjeTV3YjJ4c1NXNTBaWEoyWVd3Z0tUdGNjbHh1WEhSOVhISmNibHgwTHlvcVhISmNiaUJjZENvZ1VtVm5hWE4wWlhJZ1lTQmpiR2xqYXlCc2FYTjBaVzVsY2lCdmJpQnpjR1ZqYVdacFpXUWdSRTlOSUdWc1pXMWxiblFnZEc4Z2NtVm1jbVZ6YUNCMmFXVjNJSGRwZEdnZ2JHRjBaWE4wSUhObGNuWmxjaUJrWVhSaFhISmNiaUJjZENvdlhISmNibHgwY21WbmFYTjBaWEpRYjJ4c1ZISnBaMmRsY2lBb0tTQjdYSEpjYmx4MFhIUjBhR2x6TG5CdmJHeFVjbWxuWjJWeUxtRmtaRVYyWlc1MFRHbHpkR1Z1WlhJb0oyTnNhV05ySnl3Z0tDa2dQVDRnZTF4eVhHNWNkRngwWEhSMGFHbHpMbkpsWm5KbGMyZ29LVHRjY2x4dVhIUmNkSDBwTzF4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dUlGeDBLaUJCY0hCbGJtUWdkR2hsSUc1bGVIUWdjMlYwSUc5bUlHTmhjbVJ6SUhSdklIUm9aU0IyYVdWM0lGdG1iM0lnY0dGbmFXNWhkR1ZrSUcxdlpHVnNjeUJ2Ym14NVhWeHlYRzRnWEhRcUlFQmtaWE5qY21sd2RHbHZiaUJIWlhRZ2RHaGxJSFpwWlhjbmN5QnRiMlJsYkNkeklHNWxlSFFnUVZCSklIQmhaMlVzSUhKbGJtUmxjaUIwYUdVZ2RtbGxkeUIwWlcxd2JHRjBaU0IzYVhSb0lHNWxkeUJrWVhSaElHRnVaQ0JoY0hCbGJtUWdibTlrWlhNZ2RHOGdkbWxsZHlCbGJHVnRaVzUwWEhKY2JpQmNkQ292WEhKY2JseDBZWEJ3Wlc1a1RtVjRkRkJoWjJVZ0tDa2dlMXh5WEc1Y2RGeDBhV1lnS0NBaGRHaHBjeTV0YjJSbGJDNXBjMUJoWjJsdVlYUmxaQ0FwSUh0Y2NseHVYSFJjZEZ4MGNtVjBkWEp1TzF4eVhHNWNkRngwZlZ4eVhHNWNkRngwY21WMGRYSnVJRzVsZHlCUWNtOXRhWE5sS0NnZ2NtVnpiMngyWlNBcElEMCtJSHRjY2x4dVhIUmNkRngwZEdocGN5NXRiMlJsYkM1blpYUk9aWGgwVUdGblpTZ3BMblJvWlc0b0lDZ3BJRDArSUh0Y2NseHVYSFJjZEZ4MFhIUnNaWFFnZEdWdGNHeGhkR1VnUFNCSVlXNWtiR1ZpWVhKekxtTnZiWEJwYkdVb0lIUm9hWE11ZEdWdGNHeGhkR1VnS1R0Y2NseHVYSFJjZEZ4MFhIUnNaWFFnWm5KaFp5QTlJR1J2WTNWdFpXNTBMbU55WldGMFpVVnNaVzFsYm5Rb0lDZGthWFluSUNrN1hISmNibHgwWEhSY2RGeDBiR1YwSUdSdlkwWnlZV2NnUFNCa2IyTjFiV1Z1ZEM1amNtVmhkR1ZFYjJOMWJXVnVkRVp5WVdkdFpXNTBLQ2s3WEhKY2JseDBYSFJjZEZ4MFpuSmhaeTVwYm01bGNraFVUVXdnUFNCMFpXMXdiR0YwWlNoN1hISmNibHgwWEhSY2RGeDBYSFJsZG1WdWRITTZJSFJvYVhNdWJXOWtaV3d1YkdGemRGSmxkSFZ5Ym1Wa1VHRm5aVnh5WEc1Y2RGeDBYSFJjZEgwcE8xeHlYRzVjZEZ4MFhIUmNkRnRkTG5Oc2FXTmxMbU5oYkd3b0lHWnlZV2N1WTJocGJHUnlaVzRnS1M1bWIzSkZZV05vS0NnZ1pXd2dLU0E5UGlCN1hISmNibHgwWEhSY2RGeDBYSFJrYjJOR2NtRm5MbUZ3Y0dWdVpFTm9hV3hrS0NCbGJDQXBPMXh5WEc1Y2RGeDBYSFJjZEgwcE8xeHlYRzVjZEZ4MFhIUmNkSFJvYVhNdVpXd3VZWEJ3Wlc1a1EyaHBiR1FvSUdSdlkwWnlZV2NnS1R0Y2NseHVYSFJjZEZ4MFhIUnlaWE52YkhabEtDazdYSEpjYmx4MFhIUmNkSDBwTzF4eVhHNWNkRngwZlNrN1hISmNibHgwZlZ4eVhHNTlYSEpjYmx4eVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCV2FXVjNPeUpkZlE9PSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHR2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbnZhciBfdXRpbHNRdWVyeVN0cmluZyA9IHJlcXVpcmUoJy4uL3V0aWxzL3F1ZXJ5U3RyaW5nJyk7XG5cbnZhciBfdXRpbHNEZWJvdW5jZSA9IHJlcXVpcmUoJy4uL3V0aWxzL2RlYm91bmNlJyk7XG5cbnZhciBfdXRpbHNEZWJvdW5jZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsc0RlYm91bmNlKTtcblxudmFyIF9BbmFseXRpY3MgPSByZXF1aXJlKCcuL0FuYWx5dGljcycpO1xuXG52YXIgX0FuYWx5dGljczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BbmFseXRpY3MpO1xuXG4vKipcclxuICogQ3JlYXRlIGEgd2lkZ2V0XHJcbiAqIEBjbGFzc2Rlc2MgQ3JlYXRlIGEgd2lkZ2V0IG9iamVjdCBcclxuICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLndpZGdldENvbnRhaW5lci4gVGhlIHdpZGdldCBjb250YWluZXIgZWxlbWVudFxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMucmVzcG9uc2l2ZS4gV2hldGhlciB0aGUgd2lkZ2V0IGlzIHJlc3BvbnNpdmVcclxuICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLnVzZXJDb25maWcuIFdoZXRoZXIgdGhlIHdpZGdldCBoYXMgdXNlciBjb25maWd1cmFibGUgc2V0dGluZ3NcclxuICogQGNsYXNzIFNldCB3aWRnZXQgaW5zdGFuY2UgcHJvcGVydGllcyBhbmQgaW5pdGlhbGlzZSB3aWRnZXRcclxuICovXG5cbnZhciBXaWRnZXQgPSAoZnVuY3Rpb24gKCkge1xuXHRmdW5jdGlvbiBXaWRnZXQoKSB7XG5cdFx0dmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuXHRcdHZhciB3aWRnZXRDb250YWluZXIgPSBfcmVmLndpZGdldENvbnRhaW5lcjtcblx0XHR2YXIgcmVzcG9uc2l2ZSA9IF9yZWYucmVzcG9uc2l2ZTtcblx0XHR2YXIgdXNlckNvbmZpZyA9IF9yZWYudXNlckNvbmZpZztcblx0XHR2YXIgd2lkZ2V0TmFtZSA9IF9yZWYud2lkZ2V0TmFtZTtcblxuXHRcdF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXaWRnZXQpO1xuXG5cdFx0dGhpcy53aWRnZXRDb250YWluZXIgPSB3aWRnZXRDb250YWluZXIgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtd2lkZ2V0LWNvbnRhaW5lcl0nKTtcblx0XHR0aGlzLnJlc3BvbnNpdmUgPSByZXNwb25zaXZlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcmVzcG9uc2l2ZTtcblx0XHR0aGlzLnVzZXJDb25maWcgPSB1c2VyQ29uZmlnID09PSB1bmRlZmluZWQgPyB0cnVlIDogdXNlckNvbmZpZztcblx0XHR0aGlzLndpZGdldE5hbWUgPSB3aWRnZXROYW1lIHx8ICcnO1xuXHRcdHRoaXMuYXBwSWQgPSAnNDM3YmNhNDInO1xuXHRcdGlmICghdGhpcy53aWRnZXROYW1lKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0LyoqXHJcbiBcdCogSW5pdGlhbGlzZSB0aGUgd2lkZ2V0XHJcbiBcdCogQGRlc2NyaXB0aW9uIE1ha2UgdGhlIHdpZGdldCByZXNwb25zaXZlOyBmZXRjaCBhbmQgY2FjaGUgb24gdGhlIHdpZGdldCBpbnN0YW5jZSB0aGUgdXNlciBjb25maWcgaGFzaFxyXG4gXHQqL1xuXG5cdF9jcmVhdGVDbGFzcyhXaWRnZXQsIFt7XG5cdFx0a2V5OiAnaW5pdCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG5cdFx0XHR0aGlzLnJlc3BvbnNpdmUgJiYgdGhpcy5tYWtlUmVzcG9uc2l2ZSh0aGlzLndpZGdldENvbnRhaW5lcik7XG5cdFx0XHR0aGlzLmNvbmZpZyA9IHRoaXMudXNlckNvbmZpZyA/IHRoaXMuZ2V0VXNlckNvbmZpZygpIDogdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBJbml0aWFsaXNlIHdpZGdldCBhbmFseXRpY3NcclxuICBcdCogQGRlc2NyaXB0aW9uIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBbmFseXRpY3MgY2xhc3MgZm9yIGNhY2hpbmcgb24gdGhlIHdpZGdldCBpbnN0YW5jZVxyXG4gIFx0KiBAcmV0dXJucyB7T2JqZWN0fSBBbmFseXRpY3MgaW5zdGFuY2VcclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICdpbml0QW5hbHl0aWNzJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gaW5pdEFuYWx5dGljcygpIHtcblx0XHRcdHJldHVybiBuZXcgX0FuYWx5dGljczJbJ2RlZmF1bHQnXSh7XG5cdFx0XHRcdGNvbmZpZ0hhc2g6IHRoaXMuY29uZmlnLFxuXHRcdFx0XHR3aWRnZXQ6IHRoaXNcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBDcmVhdGUgYSBoYXNoIG1hcCBvZiB1c2VyIGNvbmZpZyBmcm9tIHdpZGdldCBxdWVyeSBzdHJpbmdcclxuICBcdCogQHJldHVybnMge09iamVjdH0gaGFzaCBtYXAgb2YgdXNlciBjb25maWdcclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICdnZXRVc2VyQ29uZmlnJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gZ2V0VXNlckNvbmZpZygpIHtcblx0XHRcdHJldHVybiAoMCwgX3V0aWxzUXVlcnlTdHJpbmcucXVlcnlTdHJpbmdQYXJzZSkobG9jYXRpb24uc2VhcmNoKTtcblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogTWFrZSB3aWRnZXQgcmVzcG9uc2l2ZSB0byBpdHMgY3VycmVudCBjb250ZW50IG9uIHdpbiByZXNpemVcclxuICBcdCogQHBhcmFtIHtFbGVtZW50fSBUaGUgd2lkZ2V0IGNvbnRhaW5lclxyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ21ha2VSZXNwb25zaXZlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gbWFrZVJlc3BvbnNpdmUod2lkZ2V0Q29udGFpbmVyKSB7XG5cdFx0XHR2YXIgX3RoaXMgPSB0aGlzO1xuXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKDAsIF91dGlsc0RlYm91bmNlMlsnZGVmYXVsdCddKShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBfdGhpcy5wb3N0Q29udGVudEhlaWdodCh3aWRnZXRDb250YWluZXIpO1xuXHRcdFx0fSwgMjUwKSk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIFBvc3QgdGhlIGN1cnJlbnQgc2Nyb2xsIGhlaWdodCB2YWx1ZSBvZiBhbiBlbGVtZW50IHRvIHRoZSBwYXJlbnQgd2luZG93XHJcbiAgXHQqIEBwYXJhbSB7RWxlbWVudH0gVGhlIGVsZW1udCB3aG9zZSBoZWlnaHQgdG8gc2VuZFxyXG4gIFx0KiBAcGFyYW0ge1N0cmluZ30gVVJMIG9mIHBhcmVudCB0byBwb3N0IG1lc3NhZ2UgdG87IGRlZmF1bHRzIHRvIGRvY3VtZW50LnJlZmVycmVyXHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAncG9zdENvbnRlbnRIZWlnaHQnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBwb3N0Q29udGVudEhlaWdodChlbCkge1xuXHRcdFx0dmFyIHVybCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IGRvY3VtZW50LnJlZmVycmVyIDogYXJndW1lbnRzWzFdO1xuXG5cdFx0XHQvL0Rvbid0IHBvc3QgdG8gc2VsZlxuXHRcdFx0aWYgKHdpbmRvdyA9PT0gd2luZG93LnRvcCB8fCB3aW5kb3cubG9jYXRpb24gPT09IHdpbmRvdy50b3AubG9jYXRpb24pIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0cGFyZW50LnBvc3RNZXNzYWdlKCd3aWRnZXROYW1lPScgKyB0aGlzLndpZGdldE5hbWUgKyAnJmNvbnRlbnRIZWlnaHQ9JyArIGVsLnNjcm9sbEhlaWdodCwgdXJsKTtcblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogUmVzZXQgdGhlIGhlaWdodCBvZiB0aGUgd2lkZ2V0XHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAncmVzZXRIZWlnaHQnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiByZXNldEhlaWdodCgpIHtcblx0XHRcdHRoaXMucG9zdENvbnRlbnRIZWlnaHQodGhpcy53aWRnZXRDb250YWluZXIpO1xuXHRcdH1cblx0fV0pO1xuXG5cdHJldHVybiBXaWRnZXQ7XG59KSgpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBXaWRnZXQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyWjFibVJ5WVdselpYSXRiR1ZoWkdWeVltOWhjbVF2WW05M1pYSmZZMjl0Y0c5dVpXNTBjeTlxZFhOMFoybDJhVzVuTFhkcFpHZGxkQzFtY21GdFpYZHZjbXN2WTI5dGNHOXVaVzUwY3k5c2FXSXZhbk12Wm5KaGJXVjNiM0pyTDFkcFpHZGxkQzVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeFpRVUZaTEVOQlFVTTdPenM3T3pzN096czdPenRuUTBGRmIwSXNjMEpCUVhOQ096czJRa0ZEYkVNc2JVSkJRVzFDT3pzN08zbENRVU5zUWl4aFFVRmhPenM3T3pzN096czdPenM3TzBsQlZUZENMRTFCUVUwN1FVRkRRU3hWUVVST0xFMUJRVTBzUjBGRGFVVTdiVVZCUVV3c1JVRkJSVHM3VFVGQk1VUXNaVUZCWlN4UlFVRm1MR1ZCUVdVN1RVRkJSU3hWUVVGVkxGRkJRVllzVlVGQlZUdE5RVUZGTEZWQlFWVXNVVUZCVml4VlFVRlZPMDFCUVVVc1ZVRkJWU3hSUVVGV0xGVkJRVlU3TzNkQ1FVUTNSQ3hOUVVGTk96dEJRVVZXTEUxQlFVa3NRMEZCUXl4bFFVRmxMRWRCUVVjc1pVRkJaU3hKUVVGSkxGRkJRVkVzUTBGQlF5eGhRVUZoTEVOQlFVTXNlVUpCUVhsQ0xFTkJRVU1zUTBGQlF6dEJRVU0xUml4TlFVRkpMRU5CUVVNc1ZVRkJWU3hIUVVGSExGVkJRVlVzUzBGQlN5eFRRVUZUTEVkQlFVY3NTVUZCU1N4SFFVRkhMRlZCUVZVc1EwRkJRenRCUVVNdlJDeE5RVUZKTEVOQlFVTXNWVUZCVlN4SFFVRkhMRlZCUVZVc1MwRkJTeXhUUVVGVExFZEJRVWNzU1VGQlNTeEhRVUZITEZWQlFWVXNRMEZCUXp0QlFVTXZSQ3hOUVVGSkxFTkJRVU1zVlVGQlZTeEhRVUZITEZWQlFWVXNTVUZCU1N4RlFVRkZMRU5CUVVNN1FVRkRia01zVFVGQlNTeERRVUZETEV0QlFVc3NSMEZCUnl4VlFVRlZMRU5CUVVNN1FVRkRlRUlzVFVGQlN5eERRVUZETEVsQlFVa3NRMEZCUXl4VlFVRlZMRVZCUVVjN1FVRkRka0lzVlVGQlR6dEhRVU5RTzBWQlEwUTdPenM3T3pzN1kwRldTU3hOUVVGTk96dFRRV1ZPTEdkQ1FVRkhPMEZCUTFBc1QwRkJTU3hEUVVGRExGVkJRVlVzU1VGQlNTeEpRVUZKTEVOQlFVTXNZMEZCWXl4RFFVRkZMRWxCUVVrc1EwRkJReXhsUVVGbExFTkJRVVVzUTBGQlF6dEJRVU12UkN4UFFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF5eFZRVUZWTEVkQlFVY3NTVUZCU1N4RFFVRkRMR0ZCUVdFc1JVRkJSU3hIUVVGSExGTkJRVk1zUTBGQlF6dEhRVU5xUlRzN096czdPenM3TzFOQlRXRXNlVUpCUVVjN1FVRkRhRUlzVlVGQlR5d3lRa0ZCWXp0QlFVTndRaXhqUVVGVkxFVkJRVVVzU1VGQlNTeERRVUZETEUxQlFVMDdRVUZEZGtJc1ZVRkJUU3hGUVVGRkxFbEJRVWs3U1VGRFdpeERRVUZETEVOQlFVTTdSMEZEU0RzN096czdPenM3VTBGTFlTeDVRa0ZCUnp0QlFVTm9RaXhWUVVGUExIZERRVUZyUWl4UlFVRlJMRU5CUVVNc1RVRkJUU3hEUVVGRkxFTkJRVU03UjBGRE0wTTdPenM3T3pzN08xTkJTMk1zZDBKQlFVVXNaVUZCWlN4RlFVRkhPenM3UVVGRGJFTXNVMEZCVFN4RFFVRkRMR2RDUVVGblFpeERRVUZGTEZGQlFWRXNSVUZCUlN4blEwRkJWVHRYUVVGTkxFMUJRVXNzYVVKQlFXbENMRU5CUVVNc1pVRkJaU3hEUVVGRE8wbEJRVUVzUlVGQlJTeEhRVUZITEVOQlFVTXNRMEZCUlN4RFFVRkRPMGRCUTI1SE96czdPenM3T3pzN1UwRk5hVUlzTWtKQlFVVXNSVUZCUlN4RlFVRXdRanRQUVVGNFFpeEhRVUZITEhsRVFVRkRMRkZCUVZFc1EwRkJReXhSUVVGUk96czdRVUZGTlVNc1QwRkJTeXhOUVVGTkxFdEJRVXNzVFVGQlRTeERRVUZETEVkQlFVY3NTVUZCU1N4TlFVRk5MRU5CUVVNc1VVRkJVU3hMUVVGTExFMUJRVTBzUTBGQlF5eEhRVUZITEVOQlFVTXNVVUZCVVN4RlFVRkhPMEZCUTNaRkxGZEJRVTg3U1VGRFVEdEJRVU5FTEZOQlFVMHNRMEZCUXl4WFFVRlhMR2xDUVVGblFpeEpRVUZKTEVOQlFVTXNWVUZCVlN4MVFrRkJhMElzUlVGQlJTeERRVUZETEZsQlFWa3NSVUZCU1N4SFFVRkhMRU5CUVVVc1EwRkJRenRIUVVNMVJqczdPenM3T3p0VFFVbFhMSFZDUVVGSE8wRkJRMlFzVDBGQlNTeERRVUZETEdsQ1FVRnBRaXhEUVVGRkxFbEJRVWtzUTBGQlF5eGxRVUZsTEVOQlFVVXNRMEZCUXp0SFFVTXZRenM3TzFGQk4wUkpMRTFCUVUwN096dHhRa0ZuUlVjc1RVRkJUU0lzSW1acGJHVWlPaUpET2k5MFpXMXdMMGRITGtaeWIyNTBSVzVrTGxkcFpHZGxkSE12ZDJsa1oyVjBjeTltZFc1a2NtRnBjMlZ5TFd4bFlXUmxjbUp2WVhKa0wySnZkMlZ5WDJOdmJYQnZibVZ1ZEhNdmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDJwekwyWnlZVzFsZDI5eWF5OVhhV1JuWlhRdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUluZFhObElITjBjbWxqZENjN1hISmNibHh5WEc1cGJYQnZjblFnZXlCeGRXVnllVk4wY21sdVoxQmhjbk5sSUgwZ1puSnZiU0FuTGk0dmRYUnBiSE12Y1hWbGNubFRkSEpwYm1jbk8xeHlYRzVwYlhCdmNuUWdaR1ZpYjNWdVkyVWdabkp2YlNBbkxpNHZkWFJwYkhNdlpHVmliM1Z1WTJVbk8xeHlYRzVwYlhCdmNuUWdRVzVoYkhsMGFXTnpJR1p5YjIwZ0p5NHZRVzVoYkhsMGFXTnpKenRjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJEY21WaGRHVWdZU0IzYVdSblpYUmNjbHh1SUNvZ1FHTnNZWE56WkdWell5QkRjbVZoZEdVZ1lTQjNhV1JuWlhRZ2IySnFaV04wSUZ4eVhHNGdLaUJBY0dGeVlXMGdlMEp2YjJ4bFlXNTlJRzl3ZEdsdmJuTXVkMmxrWjJWMFEyOXVkR0ZwYm1WeUxpQlVhR1VnZDJsa1oyVjBJR052Ym5SaGFXNWxjaUJsYkdWdFpXNTBYSEpjYmlBcUlFQndZWEpoYlNCN1FtOXZiR1ZoYm4wZ2IzQjBhVzl1Y3k1eVpYTndiMjV6YVhabExpQlhhR1YwYUdWeUlIUm9aU0IzYVdSblpYUWdhWE1nY21WemNHOXVjMmwyWlZ4eVhHNGdLaUJBY0dGeVlXMGdlMEp2YjJ4bFlXNTlJRzl3ZEdsdmJuTXVkWE5sY2tOdmJtWnBaeTRnVjJobGRHaGxjaUIwYUdVZ2QybGtaMlYwSUdoaGN5QjFjMlZ5SUdOdmJtWnBaM1Z5WVdKc1pTQnpaWFIwYVc1bmMxeHlYRzRnS2lCQVkyeGhjM01nVTJWMElIZHBaR2RsZENCcGJuTjBZVzVqWlNCd2NtOXdaWEowYVdWeklHRnVaQ0JwYm1sMGFXRnNhWE5sSUhkcFpHZGxkRnh5WEc0Z0tpOWNjbHh1WTJ4aGMzTWdWMmxrWjJWMElIdGNjbHh1WEhSamIyNXpkSEoxWTNSdmNpZ2dleUIzYVdSblpYUkRiMjUwWVdsdVpYSXNJSEpsYzNCdmJuTnBkbVVzSUhWelpYSkRiMjVtYVdjc0lIZHBaR2RsZEU1aGJXVWdmU0E5SUh0OUlDa2dlMXh5WEc1Y2RGeDBkR2hwY3k1M2FXUm5aWFJEYjI1MFlXbHVaWElnUFNCM2FXUm5aWFJEYjI1MFlXbHVaWElnZkh3Z1pHOWpkVzFsYm5RdWNYVmxjbmxUWld4bFkzUnZjaWduVzJSaGRHRXRkMmxrWjJWMExXTnZiblJoYVc1bGNsMG5LVHRjY2x4dVhIUmNkSFJvYVhNdWNtVnpjRzl1YzJsMlpTQTlJSEpsYzNCdmJuTnBkbVVnUFQwOUlIVnVaR1ZtYVc1bFpDQS9JSFJ5ZFdVZ09pQnlaWE53YjI1emFYWmxPMXh5WEc1Y2RGeDBkR2hwY3k1MWMyVnlRMjl1Wm1sbklEMGdkWE5sY2tOdmJtWnBaeUE5UFQwZ2RXNWtaV1pwYm1Wa0lEOGdkSEoxWlNBNklIVnpaWEpEYjI1bWFXYzdYSEpjYmx4MFhIUjBhR2x6TG5kcFpHZGxkRTVoYldVZ1BTQjNhV1JuWlhST1lXMWxJSHg4SUNjbk8xeHlYRzVjZEZ4MGRHaHBjeTVoY0hCSlpDQTlJQ2MwTXpkaVkyRTBNaWM3WEhKY2JseDBYSFJwWmlBb0lDRjBhR2x6TG5kcFpHZGxkRTVoYldVZ0tTQjdYSEpjYmx4MFhIUmNkSEpsZEhWeWJqdGNjbHh1WEhSY2RIMWNjbHh1WEhSOVhISmNibHgwTHlvcVhISmNiaUJjZENvZ1NXNXBkR2xoYkdselpTQjBhR1VnZDJsa1oyVjBYSEpjYmlCY2RDb2dRR1JsYzJOeWFYQjBhVzl1SUUxaGEyVWdkR2hsSUhkcFpHZGxkQ0J5WlhOd2IyNXphWFpsT3lCbVpYUmphQ0JoYm1RZ1kyRmphR1VnYjI0Z2RHaGxJSGRwWkdkbGRDQnBibk4wWVc1alpTQjBhR1VnZFhObGNpQmpiMjVtYVdjZ2FHRnphRnh5WEc0Z1hIUXFMMXh5WEc1Y2RHbHVhWFFnS0NrZ2UxeHlYRzVjZEZ4MGRHaHBjeTV5WlhOd2IyNXphWFpsSUNZbUlIUm9hWE11YldGclpWSmxjM0J2Ym5OcGRtVW9JSFJvYVhNdWQybGtaMlYwUTI5dWRHRnBibVZ5SUNrN1hISmNibHgwWEhSMGFHbHpMbU52Ym1acFp5QTlJSFJvYVhNdWRYTmxja052Ym1acFp5QS9JSFJvYVhNdVoyVjBWWE5sY2tOdmJtWnBaeWdwSURvZ2RXNWtaV1pwYm1Wa08xeHlYRzVjZEgxY2NseHVYSFF2S2lwY2NseHVJRngwS2lCSmJtbDBhV0ZzYVhObElIZHBaR2RsZENCaGJtRnNlWFJwWTNOY2NseHVJRngwS2lCQVpHVnpZM0pwY0hScGIyNGdRM0psWVhSbElHRWdibVYzSUdsdWMzUmhibU5sSUc5bUlFRnVZV3g1ZEdsamN5QmpiR0Z6Y3lCbWIzSWdZMkZqYUdsdVp5QnZiaUIwYUdVZ2QybGtaMlYwSUdsdWMzUmhibU5sWEhKY2JpQmNkQ29nUUhKbGRIVnlibk1nZTA5aWFtVmpkSDBnUVc1aGJIbDBhV056SUdsdWMzUmhibU5sWEhKY2JpQmNkQ292WEhKY2JseDBhVzVwZEVGdVlXeDVkR2xqY3lBb0tTQjdYSEpjYmx4MFhIUnlaWFIxY200Z2JtVjNJRUZ1WVd4NWRHbGpjeWg3WEhKY2JseDBYSFJjZEdOdmJtWnBaMGhoYzJnNklIUm9hWE11WTI5dVptbG5MRnh5WEc1Y2RGeDBYSFIzYVdSblpYUTZJSFJvYVhOY2NseHVYSFJjZEgwcE8xeHlYRzVjZEgxY2NseHVYSFF2S2lwY2NseHVJRngwS2lCRGNtVmhkR1VnWVNCb1lYTm9JRzFoY0NCdlppQjFjMlZ5SUdOdmJtWnBaeUJtY205dElIZHBaR2RsZENCeGRXVnllU0J6ZEhKcGJtZGNjbHh1SUZ4MEtpQkFjbVYwZFhKdWN5QjdUMkpxWldOMGZTQm9ZWE5vSUcxaGNDQnZaaUIxYzJWeUlHTnZibVpwWjF4eVhHNGdYSFFxTDF4eVhHNWNkR2RsZEZWelpYSkRiMjVtYVdjZ0tDa2dlMXh5WEc1Y2RGeDBjbVYwZFhKdUlIRjFaWEo1VTNSeWFXNW5VR0Z5YzJVb0lHeHZZMkYwYVc5dUxuTmxZWEpqYUNBcE8xeHlYRzVjZEgxY2NseHVYSFF2S2lwY2NseHVJRngwS2lCTllXdGxJSGRwWkdkbGRDQnlaWE53YjI1emFYWmxJSFJ2SUdsMGN5QmpkWEp5Wlc1MElHTnZiblJsYm5RZ2IyNGdkMmx1SUhKbGMybDZaVnh5WEc0Z1hIUXFJRUJ3WVhKaGJTQjdSV3hsYldWdWRIMGdWR2hsSUhkcFpHZGxkQ0JqYjI1MFlXbHVaWEpjY2x4dUlGeDBLaTljY2x4dVhIUnRZV3RsVW1WemNHOXVjMmwyWlNBb0lIZHBaR2RsZEVOdmJuUmhhVzVsY2lBcElIdGNjbHh1WEhSY2RIZHBibVJ2ZHk1aFpHUkZkbVZ1ZEV4cGMzUmxibVZ5S0NBbmNtVnphWHBsSnl3Z1pHVmliM1Z1WTJVb0lDZ3BJRDArSUhSb2FYTXVjRzl6ZEVOdmJuUmxiblJJWldsbmFIUW9kMmxrWjJWMFEyOXVkR0ZwYm1WeUtTd2dNalV3S1NBcE8xeHlYRzVjZEgxY2NseHVYSFF2S2lwY2NseHVJRngwS2lCUWIzTjBJSFJvWlNCamRYSnlaVzUwSUhOamNtOXNiQ0JvWldsbmFIUWdkbUZzZFdVZ2IyWWdZVzRnWld4bGJXVnVkQ0IwYnlCMGFHVWdjR0Z5Wlc1MElIZHBibVJ2ZDF4eVhHNGdYSFFxSUVCd1lYSmhiU0I3Uld4bGJXVnVkSDBnVkdobElHVnNaVzF1ZENCM2FHOXpaU0JvWldsbmFIUWdkRzhnYzJWdVpGeHlYRzRnWEhRcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCVlVrd2diMllnY0dGeVpXNTBJSFJ2SUhCdmMzUWdiV1Z6YzJGblpTQjBienNnWkdWbVlYVnNkSE1nZEc4Z1pHOWpkVzFsYm5RdWNtVm1aWEp5WlhKY2NseHVJRngwS2k5Y2NseHVYSFJ3YjNOMFEyOXVkR1Z1ZEVobGFXZG9kQ0FvSUdWc0xDQjFjbXc5Wkc5amRXMWxiblF1Y21WbVpYSnlaWElnS1NCN1hISmNibHgwWEhRdkwwUnZiaWQwSUhCdmMzUWdkRzhnYzJWc1pseHlYRzVjZEZ4MGFXWWdLQ0IzYVc1a2IzY2dQVDA5SUhkcGJtUnZkeTUwYjNBZ2ZId2dkMmx1Wkc5M0xteHZZMkYwYVc5dUlEMDlQU0IzYVc1a2IzY3VkRzl3TG14dlkyRjBhVzl1SUNrZ2UxeHlYRzVjZEZ4MFhIUnlaWFIxY200N1hISmNibHgwWEhSOUlGeHlYRzVjZEZ4MGNHRnlaVzUwTG5CdmMzUk5aWE56WVdkbEtDQmdkMmxrWjJWMFRtRnRaVDBrZTNSb2FYTXVkMmxrWjJWMFRtRnRaWDBtWTI5dWRHVnVkRWhsYVdkb2REMGtlMlZzTG5OamNtOXNiRWhsYVdkb2RIMWdMQ0IxY213Z0tUdGNjbHh1WEhSOVhISmNibHgwTHlvcVhISmNiaUJjZENvZ1VtVnpaWFFnZEdobElHaGxhV2RvZENCdlppQjBhR1VnZDJsa1oyVjBYSEpjYmlCY2RDb3ZYSEpjYmx4MGNtVnpaWFJJWldsbmFIUWdLQ2tnZTF4eVhHNWNkRngwZEdocGN5NXdiM04wUTI5dWRHVnVkRWhsYVdkb2RDZ2dkR2hwY3k1M2FXUm5aWFJEYjI1MFlXbHVaWElnS1R0Y2NseHVYSFI5WEhKY2JuMWNjbHh1WEhKY2JtVjRjRzl5ZENCa1pXWmhkV3gwSUZkcFpHZGxkRHRjY2x4dVhISmNiaUpkZlE9PSIsIid1c2Ugc3RyaWN0Jztcbi8qKlxyXG4gKiBEZWJvdW5jZXMgYSBmdW5jdGlvbiBjYWxsXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gRHVyYXRpb24gb2YgZGVib3VuY2VcclxuICogQHBhcmFtIHtib29sZWFufSBJZiB0cnVlLCB0cmlnZ2VyIGZ1bmN0aW9uIG9uIGxlYWRpbmcgZWRnZVxyXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gVGhlIGRlYm91bmNlciBmdW5jdGlvblxyXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0dmFsdWU6IHRydWVcbn0pO1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgaW1tZWRpYXRlKSB7XG5cdHZhciB0aW1lb3V0ID0gdW5kZWZpbmVkO1xuXHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdHZhciBjb250ZXh0ID0gdGhpcyxcblx0XHQgICAgYXJncyA9IGFyZ3VtZW50cztcblx0XHR2YXIgbGF0ZXIgPSBmdW5jdGlvbiBsYXRlcigpIHtcblx0XHRcdHRpbWVvdXQgPSBudWxsO1xuXHRcdFx0aWYgKCFpbW1lZGlhdGUpIHtcblx0XHRcdFx0ZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHZhciBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0O1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHR0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG5cdFx0aWYgKGNhbGxOb3cpIHtcblx0XHRcdGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSBkZWJvdW5jZTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJaMWJtUnlZV2x6WlhJdGJHVmhaR1Z5WW05aGNtUXZZbTkzWlhKZlkyOXRjRzl1Wlc1MGN5OXFkWE4wWjJsMmFXNW5MWGRwWkdkbGRDMW1jbUZ0WlhkdmNtc3ZZMjl0Y0c5dVpXNTBjeTlzYVdJdmFuTXZkWFJwYkhNdlpHVmliM1Z1WTJVdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzV1VGQldTeERRVUZET3pzN096czdPenM3T3p0QlFWRmlMRk5CUVZNc1VVRkJVU3hEUVVGRkxFbEJRVWtzUlVGQlJTeEpRVUZKTEVWQlFVVXNVMEZCVXl4RlFVRkhPMEZCUXpGRExFdEJRVWtzVDBGQlR5eFpRVUZCTEVOQlFVTTdRVUZEV2l4UlFVRlBMRmxCUVZjN1FVRkRha0lzVFVGQlNTeFBRVUZQTEVkQlFVY3NTVUZCU1R0TlFVRkZMRWxCUVVrc1IwRkJSeXhUUVVGVExFTkJRVU03UVVGRGNrTXNUVUZCU1N4TFFVRkxMRWRCUVVjc1UwRkJVaXhMUVVGTExFZEJRV003UVVGRGRFSXNWVUZCVHl4SFFVRkhMRWxCUVVrc1EwRkJRenRCUVVObUxFOUJRVXNzUTBGQlF5eFRRVUZUTEVWQlFVYzdRVUZEYWtJc1VVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlJTeFBRVUZQTEVWQlFVVXNTVUZCU1N4RFFVRkZMRU5CUVVNN1NVRkROVUk3UjBGRFJDeERRVUZETzBGQlEwWXNUVUZCU1N4UFFVRlBMRWRCUVVjc1UwRkJVeXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETzBGQlEzQkRMR05CUVZrc1EwRkJSU3hQUVVGUExFTkJRVVVzUTBGQlF6dEJRVU40UWl4VFFVRlBMRWRCUVVjc1ZVRkJWU3hEUVVGRkxFdEJRVXNzUlVGQlJTeEpRVUZKTEVOQlFVVXNRMEZCUXp0QlFVTndReXhOUVVGTExFOUJRVThzUlVGQlJ6dEJRVU5rTEU5QlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVVc1QwRkJUeXhGUVVGRkxFbEJRVWtzUTBGQlJTeERRVUZETzBkQlF6VkNPMFZCUTBRc1EwRkJRenREUVVOR096dHhRa0ZGWXl4UlFVRlJJaXdpWm1sc1pTSTZJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMloxYm1SeVlXbHpaWEl0YkdWaFpHVnlZbTloY21RdlltOTNaWEpmWTI5dGNHOXVaVzUwY3k5cWRYTjBaMmwyYVc1bkxYZHBaR2RsZEMxbWNtRnRaWGR2Y21zdlkyOXRjRzl1Wlc1MGN5OXNhV0l2YW5NdmRYUnBiSE12WkdWaWIzVnVZMlV1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SW5kWE5sSUhOMGNtbGpkQ2M3WEhKY2JpOHFLbHh5WEc0Z0tpQkVaV0p2ZFc1alpYTWdZU0JtZFc1amRHbHZiaUJqWVd4c1hISmNiaUFxSUVCd1lYSmhiU0I3Wm5WdVkzUnBiMjU5SUZSb1pTQm1kVzVqZEdsdmJpQjBieUJrWldKdmRXNWpaVnh5WEc0Z0tpQkFjR0Z5WVcwZ2UyNTFiV0psY24wZ1JIVnlZWFJwYjI0Z2IyWWdaR1ZpYjNWdVkyVmNjbHh1SUNvZ1FIQmhjbUZ0SUh0aWIyOXNaV0Z1ZlNCSlppQjBjblZsTENCMGNtbG5aMlZ5SUdaMWJtTjBhVzl1SUc5dUlHeGxZV1JwYm1jZ1pXUm5aVnh5WEc0Z0tpQkFjbVYwZFhKdUlIdG1kVzVqZEdsdmJuMGdWR2hsSUdSbFltOTFibU5sY2lCbWRXNWpkR2x2Ymx4eVhHNGdLaTljY2x4dVpuVnVZM1JwYjI0Z1pHVmliM1Z1WTJVb0lHWjFibU1zSUhkaGFYUXNJR2x0YldWa2FXRjBaU0FwSUh0Y2NseHVYSFJzWlhRZ2RHbHRaVzkxZER0Y2NseHVYSFJ5WlhSMWNtNGdablZ1WTNScGIyNG9LU0I3WEhKY2JseDBYSFJzWlhRZ1kyOXVkR1Y0ZENBOUlIUm9hWE1zSUdGeVozTWdQU0JoY21kMWJXVnVkSE03WEhKY2JseDBYSFJzWlhRZ2JHRjBaWElnUFNCbWRXNWpkR2x2YmlncElIdGNjbHh1WEhSY2RGeDBkR2x0Wlc5MWRDQTlJRzUxYkd3N1hISmNibHgwWEhSY2RHbG1JQ2dnSVdsdGJXVmthV0YwWlNBcElIc2dYSEpjYmx4MFhIUmNkRngwWm5WdVl5NWhjSEJzZVNnZ1kyOXVkR1Y0ZEN3Z1lYSm5jeUFwTzF4eVhHNWNkRngwWEhSOVhIUmNjbHh1WEhSY2RIMDdYSEpjYmx4MFhIUnNaWFFnWTJGc2JFNXZkeUE5SUdsdGJXVmthV0YwWlNBbUppQWhkR2x0Wlc5MWREdGNjbHh1WEhSY2RHTnNaV0Z5VkdsdFpXOTFkQ2dnZEdsdFpXOTFkQ0FwTzF4eVhHNWNkRngwZEdsdFpXOTFkQ0E5SUhObGRGUnBiV1Z2ZFhRb0lHeGhkR1Z5TENCM1lXbDBJQ2s3WEhKY2JseDBYSFJwWmlBb0lHTmhiR3hPYjNjZ0tTQjdJRnh5WEc1Y2RGeDBYSFJtZFc1akxtRndjR3g1S0NCamIyNTBaWGgwTENCaGNtZHpJQ2s3WEhKY2JseDBYSFI5WEhKY2JseDBmVHRjY2x4dWZWeHlYRzVjY2x4dVpYaHdiM0owSUdSbFptRjFiSFFnWkdWaWIzVnVZMlU3SWwxOSIsIid1c2Ugc3RyaWN0Jztcbi8qKlxyXG4gKiBDcmVhdGUgYSBoYXNoIG1hcCBvZiBxdWVyeSBzdHJpbmcga2V5LXZhbHVlIHBhaXJzLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24uc2VhcmNoIHN0cmluZyB0byBoYXNoXHJcbiAqIEByZXR1cm5zIHtvYmplY3R9IGhhc2ggbWFwIG9mIHF1ZXJ5IHN0cmluZyBrZXktdmFsdWUgcGFpcnNcclxuICogQGF1dGhvciBieSBTaW5kcmUgU29yaHVzXHJcbiAqIEBsaWNlbnNlIE1JVCBMaWNlbnNlXHJcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9xdWVyeS1zdHJpbmdcclxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG5cdHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucXVlcnlTdHJpbmdQYXJzZSA9IHF1ZXJ5U3RyaW5nUGFyc2U7XG5leHBvcnRzLnF1ZXJ5U3RyaW5nU3RyaW5naWZ5ID0gcXVlcnlTdHJpbmdTdHJpbmdpZnk7XG5cbmZ1bmN0aW9uIHF1ZXJ5U3RyaW5nUGFyc2Uoc3RyKSB7XG5cdGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXG5cdHN0ciA9IHN0ci50cmltKCkucmVwbGFjZSgvXihcXD98IykvLCAnJyk7XG5cblx0aWYgKCFzdHIpIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblxuXHRyZXR1cm4gc3RyLnRyaW0oKS5zcGxpdCgnJicpLnJlZHVjZShmdW5jdGlvbiAocmV0LCBwYXJhbSkge1xuXHRcdHZhciBwYXJ0cyA9IHBhcmFtLnJlcGxhY2UoL1xcKy9nLCAnICcpLnNwbGl0KCc9Jyk7XG5cdFx0dmFyIGtleSA9IHBhcnRzWzBdO1xuXHRcdHZhciB2YWwgPSBwYXJ0c1sxXTtcblxuXHRcdGtleSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXkpO1xuXHRcdC8vIG1pc3NpbmcgYD1gIHNob3VsZCBiZSBgbnVsbGA6XG5cdFx0Ly8gaHR0cDovL3czLm9yZy9UUi8yMDEyL1dELXVybC0yMDEyMDUyNC8jY29sbGVjdC11cmwtcGFyYW1ldGVyc1xuXHRcdHZhbCA9IHZhbCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudCh2YWwpO1xuXG5cdFx0aWYgKCFyZXQuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0cmV0W2tleV0gPSB2YWw7XG5cdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJldFtrZXldKSkge1xuXHRcdFx0cmV0W2tleV0ucHVzaCh2YWwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXRba2V5XSA9IFtyZXRba2V5XSwgdmFsXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LCB7fSk7XG59XG5cbi8qKlxyXG4gKiBDcmVhdGUgcXVlcnkgc3RyaW5nIG9mIGtleS12YWx1ZSBwYWlycyBmcm9tIGEgaGFzaCBtYXAuXHJcbiAqIEBwYXJhbSB7b2JqfSBoYXNobWFwIHNvdXJjZVxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBxdWVyeVN0cmluZ1xyXG4gKiBAYXV0aG9yIGJ5IFNpbmRyZSBTb3JodXNcclxuICogQGxpY2Vuc2UgTUlUIExpY2Vuc2VcclxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3F1ZXJ5LXN0cmluZ1xyXG4gKi9cblxuZnVuY3Rpb24gcXVlcnlTdHJpbmdTdHJpbmdpZnkob2JqKSB7XG5cdHJldHVybiBvYmogPyBPYmplY3Qua2V5cyhvYmopLnNvcnQoKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuXHRcdHZhciB2YWwgPSBvYmpba2V5XTtcblxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcblx0XHRcdHJldHVybiB2YWwuc29ydCgpLm1hcChmdW5jdGlvbiAodmFsMikge1xuXHRcdFx0XHRyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsMik7XG5cdFx0XHR9KS5qb2luKCcmJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbCk7XG5cdH0pLmpvaW4oJyYnKSA6ICcnO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJaMWJtUnlZV2x6WlhJdGJHVmhaR1Z5WW05aGNtUXZZbTkzWlhKZlkyOXRjRzl1Wlc1MGN5OXFkWE4wWjJsMmFXNW5MWGRwWkdkbGRDMW1jbUZ0WlhkdmNtc3ZZMjl0Y0c5dVpXNTBjeTlzYVdJdmFuTXZkWFJwYkhNdmNYVmxjbmxUZEhKcGJtY3Vhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUVVFc1dVRkJXU3hEUVVGRE96czdPenM3T3pzN096czdPenM3UVVGVFRpeFRRVUZUTEdkQ1FVRm5RaXhEUVVGSExFZEJRVWNzUlVGQlJ6dEJRVU40UXl4TFFVRkxMRTlCUVU4c1IwRkJSeXhMUVVGTExGRkJRVkVzUlVGQlJ6dEJRVU01UWl4VFFVRlBMRVZCUVVVc1EwRkJRenRGUVVOV096dEJRVVZFTEVsQlFVY3NSMEZCUnl4SFFVRkhMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU1zVDBGQlR5eERRVUZETEZOQlFWTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1EwRkJRenM3UVVGRmVFTXNTMEZCU3l4RFFVRkRMRWRCUVVjc1JVRkJSenRCUVVOWUxGTkJRVThzUlVGQlJTeERRVUZETzBWQlExWTdPMEZCUlVRc1VVRkJUeXhIUVVGSExFTkJRVU1zU1VGQlNTeEZRVUZGTEVOQlFVTXNTMEZCU3l4RFFVRkZMRWRCUVVjc1EwRkJSU3hEUVVGRExFMUJRVTBzUTBGQlJTeFZRVUZYTEVkQlFVY3NSVUZCUlN4TFFVRkxMRVZCUVVjN1FVRkRPVVFzVFVGQlNTeExRVUZMTEVkQlFVY3NTMEZCU3l4RFFVRkRMRTlCUVU4c1EwRkJReXhMUVVGTExFVkJRVVVzUjBGQlJ5eERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkZMRWRCUVVjc1EwRkJSU3hEUVVGRE8wRkJRMjVFTEUxQlFVa3NSMEZCUnl4SFFVRkhMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU51UWl4TlFVRkpMRWRCUVVjc1IwRkJSeXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdPMEZCUlc1Q0xFdEJRVWNzUjBGQlJ5eHJRa0ZCYTBJc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6czdPMEZCUnpsQ0xFdEJRVWNzUjBGQlJ5eEhRVUZITEV0QlFVc3NVMEZCVXl4SFFVRkhMRWxCUVVrc1IwRkJSeXhyUWtGQmEwSXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenM3UVVGRmVrUXNUVUZCU3l4RFFVRkRMRWRCUVVjc1EwRkJReXhqUVVGakxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVYzdRVUZETDBJc1RVRkJSeXhEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEVkQlFVY3NRMEZCUXp0SFFVTm1MRTFCUVUwc1NVRkJTeXhMUVVGTExFTkJRVU1zVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhGUVVGSE8wRkJRM0pETEUxQlFVY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVVVzUjBGQlJ5eERRVUZGTEVOQlFVTTdSMEZEY2tJc1RVRkJUVHRCUVVOT0xFMUJRVWNzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeEhRVUZITEVOQlFVTXNRMEZCUXp0SFFVTXpRanM3UVVGRlJDeFRRVUZQTEVkQlFVY3NRMEZCUXp0RlFVTllMRVZCUVVVc1JVRkJSU3hEUVVGRkxFTkJRVU03UTBGRFVqczdPenM3T3pzN096czdRVUZWVFN4VFFVRlRMRzlDUVVGdlFpeERRVUZITEVkQlFVY3NSVUZCUnp0QlFVTTFReXhSUVVGUExFZEJRVWNzUjBGQlJ5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkZMRWRCUVVjc1EwRkJSU3hEUVVGRExFbEJRVWtzUlVGQlJTeERRVUZETEVkQlFVY3NRMEZCUlN4VlFVRlZMRWRCUVVjc1JVRkJSenRCUVVNelJDeE5RVUZKTEVkQlFVY3NSMEZCUnl4SFFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03TzBGQlJXNUNMRTFCUVVzc1MwRkJTeXhEUVVGRExFOUJRVThzUTBGQlJTeEhRVUZITEVOQlFVVXNSVUZCUnp0QlFVTXpRaXhWUVVGUExFZEJRVWNzUTBGQlF5eEpRVUZKTEVWQlFVVXNRMEZCUXl4SFFVRkhMRU5CUVVVc1ZVRkJWeXhKUVVGSkxFVkJRVWM3UVVGRGVFTXNWMEZCVHl4clFrRkJhMElzUTBGQlJTeEhRVUZITEVOQlFVVXNSMEZCUnl4SFFVRkhMRWRCUVVjc2EwSkJRV3RDTEVOQlFVVXNTVUZCU1N4RFFVRkZMRU5CUVVNN1NVRkRjRVVzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUlN4SFFVRkhMRU5CUVVVc1EwRkJRenRIUVVObU96dEJRVVZFTEZOQlFVOHNhMEpCUVd0Q0xFTkJRVVVzUjBGQlJ5eERRVUZGTEVkQlFVY3NSMEZCUnl4SFFVRkhMR3RDUVVGclFpeERRVUZGTEVkQlFVY3NRMEZCUlN4RFFVRkRPMFZCUTI1RkxFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVVXNSMEZCUnl4RFFVRkZMRWRCUVVjc1JVRkJSU3hEUVVGRE8wTkJRM0JDSWl3aVptbHNaU0k2SWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJaMWJtUnlZV2x6WlhJdGJHVmhaR1Z5WW05aGNtUXZZbTkzWlhKZlkyOXRjRzl1Wlc1MGN5OXFkWE4wWjJsMmFXNW5MWGRwWkdkbGRDMW1jbUZ0WlhkdmNtc3ZZMjl0Y0c5dVpXNTBjeTlzYVdJdmFuTXZkWFJwYkhNdmNYVmxjbmxUZEhKcGJtY3Vhbk1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJbmRYTmxJSE4wY21samRDYzdYSEpjYmk4cUtseHlYRzRnS2lCRGNtVmhkR1VnWVNCb1lYTm9JRzFoY0NCdlppQnhkV1Z5ZVNCemRISnBibWNnYTJWNUxYWmhiSFZsSUhCaGFYSnpMbHh5WEc0Z0tpQkFjR0Z5WVcwZ2UzTjBjbWx1WjMwZ2JHOWpZWFJwYjI0dWMyVmhjbU5vSUhOMGNtbHVaeUIwYnlCb1lYTm9YSEpjYmlBcUlFQnlaWFIxY201eklIdHZZbXBsWTNSOUlHaGhjMmdnYldGd0lHOW1JSEYxWlhKNUlITjBjbWx1WnlCclpYa3RkbUZzZFdVZ2NHRnBjbk5jY2x4dUlDb2dRR0YxZEdodmNpQmllU0JUYVc1a2NtVWdVMjl5YUhWelhISmNiaUFxSUVCc2FXTmxibk5sSUUxSlZDQk1hV05sYm5ObFhISmNiaUFxSUVCelpXVWdhSFIwY0hNNkx5OW5hWFJvZFdJdVkyOXRMM05wYm1SeVpYTnZjbWgxY3k5eGRXVnllUzF6ZEhKcGJtZGNjbHh1SUNvdlhISmNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQnhkV1Z5ZVZOMGNtbHVaMUJoY25ObElDZ2djM1J5SUNrZ2UxeHlYRzVjZEdsbUlDZ2dkSGx3Wlc5bUlITjBjaUFoUFQwZ0ozTjBjbWx1WnljZ0tTQjdYSEpjYmx4MFhIUnlaWFIxY200Z2UzMDdYSEpjYmx4MGZWeHlYRzVjY2x4dVhIUnpkSElnUFNCemRISXVkSEpwYlNncExuSmxjR3hoWTJVb0wxNG9YRncvZkNNcEx5d2dKeWNwTzF4eVhHNWNjbHh1WEhScFppQW9JQ0Z6ZEhJZ0tTQjdYSEpjYmx4MFhIUnlaWFIxY200Z2UzMDdYSEpjYmx4MGZWeHlYRzVjY2x4dVhIUnlaWFIxY200Z2MzUnlMblJ5YVcwb0tTNXpjR3hwZENnZ0p5WW5JQ2t1Y21Wa2RXTmxLQ0JtZFc1amRHbHZiaUFvSUhKbGRDd2djR0Z5WVcwZ0tTQjdYSEpjYmx4MFhIUnNaWFFnY0dGeWRITWdQU0J3WVhKaGJTNXlaWEJzWVdObEtDOWNYQ3N2Wnl3Z0p5QW5LUzV6Y0d4cGRDZ2dKejBuSUNrN1hISmNibHgwWEhSc1pYUWdhMlY1SUQwZ2NHRnlkSE5iTUYwN1hISmNibHgwWEhSc1pYUWdkbUZzSUQwZ2NHRnlkSE5iTVYwN1hISmNibHh5WEc1Y2RGeDBhMlY1SUQwZ1pHVmpiMlJsVlZKSlEyOXRjRzl1Wlc1MEtHdGxlU2s3WEhKY2JseDBYSFF2THlCdGFYTnphVzVuSUdBOVlDQnphRzkxYkdRZ1ltVWdZRzUxYkd4Z09seHlYRzVjZEZ4MEx5OGdhSFIwY0RvdkwzY3pMbTl5Wnk5VVVpOHlNREV5TDFkRUxYVnliQzB5TURFeU1EVXlOQzhqWTI5c2JHVmpkQzExY213dGNHRnlZVzFsZEdWeWMxeHlYRzVjZEZ4MGRtRnNJRDBnZG1Gc0lEMDlQU0IxYm1SbFptbHVaV1FnUHlCdWRXeHNJRG9nWkdWamIyUmxWVkpKUTI5dGNHOXVaVzUwS0haaGJDazdYSEpjYmx4eVhHNWNkRngwYVdZZ0tDQWhjbVYwTG1oaGMwOTNibEJ5YjNCbGNuUjVLR3RsZVNrZ0tTQjdYSEpjYmx4MFhIUmNkSEpsZEZ0clpYbGRJRDBnZG1Gc08xeHlYRzVjZEZ4MGZTQmxiSE5sSUdsbUlDZ2dRWEp5WVhrdWFYTkJjbkpoZVNoeVpYUmJhMlY1WFNrZ0tTQjdYSEpjYmx4MFhIUmNkSEpsZEZ0clpYbGRMbkIxYzJnb0lIWmhiQ0FwTzF4eVhHNWNkRngwZlNCbGJITmxJSHRjY2x4dVhIUmNkRngwY21WMFcydGxlVjBnUFNCYmNtVjBXMnRsZVYwc0lIWmhiRjA3WEhKY2JseDBYSFI5WEhKY2JseHlYRzVjZEZ4MGNtVjBkWEp1SUhKbGREdGNjbHh1WEhSOUxDQjdmU0FwTzF4eVhHNTlYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dRM0psWVhSbElIRjFaWEo1SUhOMGNtbHVaeUJ2WmlCclpYa3RkbUZzZFdVZ2NHRnBjbk1nWm5KdmJTQmhJR2hoYzJnZ2JXRndMbHh5WEc0Z0tpQkFjR0Z5WVcwZ2UyOWlhbjBnYUdGemFHMWhjQ0J6YjNWeVkyVmNjbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UzTjBjbWx1WjMwZ2NYVmxjbmxUZEhKcGJtZGNjbHh1SUNvZ1FHRjFkR2h2Y2lCaWVTQlRhVzVrY21VZ1UyOXlhSFZ6WEhKY2JpQXFJRUJzYVdObGJuTmxJRTFKVkNCTWFXTmxibk5sWEhKY2JpQXFJRUJ6WldVZ2FIUjBjSE02THk5bmFYUm9kV0l1WTI5dEwzTnBibVJ5WlhOdmNtaDFjeTl4ZFdWeWVTMXpkSEpwYm1kY2NseHVJQ292WEhKY2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCeGRXVnllVk4wY21sdVoxTjBjbWx1WjJsbWVTQW9JRzlpYWlBcElIdGNjbHh1WEhSeVpYUjFjbTRnYjJKcUlEOGdUMkpxWldOMExtdGxlWE1vSUc5aWFpQXBMbk52Y25Rb0tTNXRZWEFvSUdaMWJtTjBhVzl1S0NCclpYa2dLU0I3WEhKY2JseDBYSFJzWlhRZ2RtRnNJRDBnYjJKcVcydGxlVjA3WEhKY2JseHlYRzVjZEZ4MGFXWWdLQ0JCY25KaGVTNXBjMEZ5Y21GNUtDQjJZV3dnS1NBcElIdGNjbHh1WEhSY2RGeDBjbVYwZFhKdUlIWmhiQzV6YjNKMEtDa3ViV0Z3SUNobWRXNWpkR2x2YmlBb0lIWmhiRElnS1NCN1hISmNibHgwWEhSY2RGeDBjbVYwZFhKdUlHVnVZMjlrWlZWU1NVTnZiWEJ2Ym1WdWRDZ2dhMlY1SUNrZ0t5QW5QU2NnS3lCbGJtTnZaR1ZWVWtsRGIyMXdiMjVsYm5Rb0lIWmhiRElnS1R0Y2NseHVYSFJjZEZ4MGZTa3VhbTlwYmlnZ0p5WW5JQ2s3WEhKY2JseDBYSFI5WEhKY2JseHlYRzVjZEZ4MGNtVjBkWEp1SUdWdVkyOWtaVlZTU1VOdmJYQnZibVZ1ZENnZ2EyVjVJQ2tnS3lBblBTY2dLeUJsYm1OdlpHVlZVa2xEYjIxd2IyNWxiblFvSUhaaGJDQXBPMXh5WEc1Y2RIMHBMbXB2YVc0b0lDY21KeUFwSURvZ0p5YzdYSEpjYm4waVhYMD0iLCIndXNlIHN0cmljdCc7XG4vKipcclxuICogRmluZCBhIHBlcmNlbnRhZ2UgdmFsdWUgZnJvbSBzdXBwbGllZCBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIHZhbHVlc1xyXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFJvdW5kZWQgcGVyY2V0YW5nZSB2YWx1ZSBpbmNsdWRpbmcgJSBzaWduIG9yIGVtcHR5IHN0cmluZyBpZiBkZW5vbWluYXRvciBpcyBmYWxzeVxyXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRQZXJjZW50ID0gZ2V0UGVyY2VudDtcbmV4cG9ydHMuY29tbWFGb3JtYXQgPSBjb21tYUZvcm1hdDtcblxuZnVuY3Rpb24gZ2V0UGVyY2VudChudW1lcmF0b3IsIGRlbm9taW5hdG9yKSB7XG4gIGlmICghZGVub21pbmF0b3IpIHtcbiAgICByZXR1cm4gJyc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHBhcnNlRmxvYXQobnVtZXJhdG9yKSAvIHBhcnNlRmxvYXQoZGVub21pbmF0b3IpICogMTAwLCAxMCk7XG4gIH1cbn1cblxuLyoqXHJcbiAqIEZvcm1hdCBhIGxhcmdlIG51bWJlciAoPjk5OSkgd2l0aCBjb21tYXNcclxuICogQHJldHVybiB7U3RyaW5nfSBDb21tYS1mb3JtYXR0ZWQgbnVtYmVyXHJcbiAqL1xuXG5mdW5jdGlvbiBjb21tYUZvcm1hdChudW1iZXIpIHtcbiAgcmV0dXJuIG51bWJlci50b1N0cmluZygpLnJlcGxhY2UoLyhcXGQpKD89KFxcZFxcZFxcZCkrKD8hXFxkKSkvZywgJyQxLCcpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJaMWJtUnlZV2x6WlhJdGJHVmhaR1Z5WW05aGNtUXZZbTkzWlhKZlkyOXRjRzl1Wlc1MGN5OXFkWE4wWjJsMmFXNW5MWGRwWkdkbGRDMW1jbUZ0WlhkdmNtc3ZZMjl0Y0c5dVpXNTBjeTlzYVdJdmFuTXZkMmxrWjJWMEwyMXZaR1ZzTDI1MWJXSmxjaTVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeFpRVUZaTEVOQlFVTTdPenM3T3pzN096czdPMEZCUzA0c1UwRkJVeXhWUVVGVkxFTkJRVVVzVTBGQlV5eEZRVUZGTEZkQlFWY3NSVUZCUnp0QlFVTndSQ3hOUVVGTExFTkJRVU1zVjBGQlZ5eEZRVUZITzBGQlEyNUNMRmRCUVU4c1JVRkJSU3hEUVVGRE8wZEJRMVlzVFVGQlRUdEJRVU5PTEZkQlFVOHNVVUZCVVN4RFFVRkhMRlZCUVZVc1EwRkJReXhUUVVGVExFTkJRVU1zUjBGQlJ5eFZRVUZWTEVOQlFVTXNWMEZCVnl4RFFVRkRMRWRCUVVjc1IwRkJSeXhGUVVGSExFVkJRVVVzUTBGQlJTeERRVUZETzBkQlF5OUZPME5CUTBRN096czdPenM3UVVGTFRTeFRRVUZUTEZkQlFWY3NRMEZCUlN4TlFVRk5MRVZCUVVjN1FVRkRja01zVTBGQlR5eE5RVUZOTEVOQlFVTXNVVUZCVVN4RlFVRkZMRU5CUVVNc1QwRkJUeXhEUVVGRExEQkNRVUV3UWl4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8wTkJRM0JGSWl3aVptbHNaU0k2SWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJaMWJtUnlZV2x6WlhJdGJHVmhaR1Z5WW05aGNtUXZZbTkzWlhKZlkyOXRjRzl1Wlc1MGN5OXFkWE4wWjJsMmFXNW5MWGRwWkdkbGRDMW1jbUZ0WlhkdmNtc3ZZMjl0Y0c5dVpXNTBjeTlzYVdJdmFuTXZkMmxrWjJWMEwyMXZaR1ZzTDI1MWJXSmxjaTVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpZDFjMlVnYzNSeWFXTjBKenRjY2x4dUx5b3FYSEpjYmlBcUlFWnBibVFnWVNCd1pYSmpaVzUwWVdkbElIWmhiSFZsSUdaeWIyMGdjM1Z3Y0d4cFpXUWdiblZ0WlhKaGRHOXlJR0Z1WkNCa1pXNXZiV2x1WVhSdmNpQjJZV3gxWlhOY2NseHVJQ29nUUhKbGRIVnliaUI3VTNSeWFXNW5mU0JTYjNWdVpHVmtJSEJsY21ObGRHRnVaMlVnZG1Gc2RXVWdhVzVqYkhWa2FXNW5JQ1VnYzJsbmJpQnZjaUJsYlhCMGVTQnpkSEpwYm1jZ2FXWWdaR1Z1YjIxcGJtRjBiM0lnYVhNZ1ptRnNjM2xjY2x4dUlDb3ZYSEpjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJuWlhSUVpYSmpaVzUwS0NCdWRXMWxjbUYwYjNJc0lHUmxibTl0YVc1aGRHOXlJQ2tnZTF4eVhHNWNkR2xtSUNnZ0lXUmxibTl0YVc1aGRHOXlJQ2tnZTF4eVhHNWNkRngwY21WMGRYSnVJQ2NuTzF4eVhHNWNkSDBnWld4elpTQjdYSEpjYmx4MFhIUnlaWFIxY200Z2NHRnljMlZKYm5Rb0lDaHdZWEp6WlVac2IyRjBLRzUxYldWeVlYUnZjaWtnTHlCd1lYSnpaVVpzYjJGMEtHUmxibTl0YVc1aGRHOXlLU0FxSURFd01Da3NJREV3SUNrN1hIUmNjbHh1WEhSOVhISmNibjFjY2x4dUx5b3FYSEpjYmlBcUlFWnZjbTFoZENCaElHeGhjbWRsSUc1MWJXSmxjaUFvUGprNU9Ta2dkMmwwYUNCamIyMXRZWE5jY2x4dUlDb2dRSEpsZEhWeWJpQjdVM1J5YVc1bmZTQkRiMjF0WVMxbWIzSnRZWFIwWldRZ2JuVnRZbVZ5WEhKY2JpQXFMMXh5WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWTI5dGJXRkdiM0p0WVhRb0lHNTFiV0psY2lBcElIdGNjbHh1WEhSeVpYUjFjbTRnYm5WdFltVnlMblJ2VTNSeWFXNW5LQ2t1Y21Wd2JHRmpaU2d2S0Z4Y1pDa29QejBvWEZ4a1hGeGtYRnhrS1Nzb1B5RmNYR1FwS1M5bkxDQW5KREVzSnlrN1hISmNibjBpWFgwPSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHR2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKCd2YWx1ZScgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrV2lkZ2V0ID0gcmVxdWlyZSgnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9XaWRnZXQnKTtcblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrV2lkZ2V0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtXaWRnZXQpO1xuXG52YXIgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliQ2Fyb3VzZWxDYXJvdXNlbCA9IHJlcXVpcmUoJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9jYXJvdXNlbC9DYXJvdXNlbCcpO1xuXG52YXIgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliQ2Fyb3VzZWxDYXJvdXNlbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkNhcm91c2VsQ2Fyb3VzZWwpO1xuXG52YXIgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtNb2RlbCA9IHJlcXVpcmUoJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvTW9kZWwnKTtcblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrTW9kZWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya01vZGVsKTtcblxudmFyIF9Nb2RlbExlYWRlcmJvYXJkID0gcmVxdWlyZSgnLi9Nb2RlbExlYWRlcmJvYXJkJyk7XG5cbnZhciBfTW9kZWxMZWFkZXJib2FyZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Nb2RlbExlYWRlcmJvYXJkKTtcblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrVmlldyA9IHJlcXVpcmUoJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvVmlldycpO1xuXG52YXIgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtWaWV3MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtWaWV3KTtcblxuLyoqXHJcbiAqIENyZWF0ZSBhIGZ1bmRyYWlzZXIgbGVhZGVyYm9hcmQgd2lkZ2V0XHJcbiAqL1xudmFyIFByb21pc2UgPSByZXF1aXJlKCdlczYtcHJvbWlzZScpLlByb21pc2U7XG5cbnZhciBGdW5kcmFpc2VyTGVhZGVyYm9hcmQgPSAoZnVuY3Rpb24gKF9XaWRnZXQpIHtcblx0X2luaGVyaXRzKEZ1bmRyYWlzZXJMZWFkZXJib2FyZCwgX1dpZGdldCk7XG5cblx0ZnVuY3Rpb24gRnVuZHJhaXNlckxlYWRlcmJvYXJkKG9wdGlvbnMpIHtcblx0XHRfY2xhc3NDYWxsQ2hlY2sodGhpcywgRnVuZHJhaXNlckxlYWRlcmJvYXJkKTtcblxuXHRcdF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEZ1bmRyYWlzZXJMZWFkZXJib2FyZC5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHRcdHRoaXMuaW5pdCgpO1xuXHR9XG5cblx0LyoqXHJcbiAgKiBJbml0aWFsaXNlIHRoZSBsZWFkZXJib2FyZFxyXG4gICogQGRlc2NyaXB0aW9uIENyZWF0ZSBhbmQgY2FjaGUgbmV3IGxlYWRlcmJvYXJkIG1vZGVsOyBib290c3RyYXAgdGhlIHdpZGdldFxyXG4gICovXG5cblx0X2NyZWF0ZUNsYXNzKEZ1bmRyYWlzZXJMZWFkZXJib2FyZCwgW3tcblx0XHRrZXk6ICdpbml0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gaW5pdCgpIHtcblx0XHRcdF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEZ1bmRyYWlzZXJMZWFkZXJib2FyZC5wcm90b3R5cGUpLCAnaW5pdCcsIHRoaXMpLmNhbGwodGhpcyk7XG5cdFx0XHR0aGlzLmxlYWRlcmJvYXJkTW9kZWwgPSBuZXcgX01vZGVsTGVhZGVyYm9hcmQyWydkZWZhdWx0J10oe1xuXHRcdFx0XHR3aWRnZXQ6IHRoaXMsXG5cdFx0XHRcdHVybDogJ2h0dHBzOi8vYXBpLmp1c3RnaXZpbmcuY29tLycgKyB0aGlzLmFwcElkICsgJy92MS9jaGFyaXR5LycgKyB0aGlzLmNvbmZpZy5pZCArICcvbGVhZGVyYm9hcmQnXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuY2hhcml0eU1vZGVsID0gbmV3IF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrTW9kZWwyWydkZWZhdWx0J10oe1xuXHRcdFx0XHR3aWRnZXQ6IHRoaXMsXG5cdFx0XHRcdHVybDogJ2h0dHBzOi8vYXBpLmp1c3RnaXZpbmcuY29tLycgKyB0aGlzLmFwcElkICsgJy92MS9jaGFyaXR5LycgKyB0aGlzLmNvbmZpZy5pZFxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmJvb3RzdHJhcCgpO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqIEJvb3RzdHJhcCB0aGUgd2lkZ2V0XHJcbiAgICogQGRlc2NyaXB0aW9uIEZldGNoIGFsbCBzZXJ2ZXIgZGF0YSBmb3IgdGhlIGxlYWRlcmJvYXJkIG1vZGVsOyBjcmVhdGUgYW5kIHJlbmRlciBuZXcgbGVhZGVyYm9hcmQgdmlldztcclxuICAgKiByZXNldCB0aGUgd2lkZ2V0IGhlaWdodCBhbmQgY3JlYXRlIG5ldyBjYXJvdXNlbCBvbiB0aGUgZXZlbnRzIHZpZXcgW2lmIHdpZGdldCBsYXlvdXQgPT09IGxhcmdlXTsgXHJcbiAgICogaW5pdGlhbGlzZSBhIG5ldyBhbmFseXRpY3MgaW5zdGFuY2Ugb24gdGhlIHdpZGdldFxyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnYm9vdHN0cmFwJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuXHRcdFx0dmFyIF90aGlzID0gdGhpcztcblxuXHRcdFx0UHJvbWlzZS5hbGwoW3RoaXMubGVhZGVyYm9hcmRNb2RlbC5nZXRNb2RlbCh0aGlzLmNvbmZpZy5yZWZlcmVuY2UpLCB0aGlzLmNoYXJpdHlNb2RlbC5nZXRNb2RlbCgpXSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdC8vIEhlYWRlciB2aWV3XG5cdFx0XHRcdF90aGlzLmhlYWRlclZpZXcgPSBuZXcgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtWaWV3MlsnZGVmYXVsdCddKHtcblx0XHRcdFx0XHR3aWRnZXQ6IF90aGlzLFxuXHRcdFx0XHRcdGVsOiAnW2RhdGEtdmlldy1oZWFkZXJdJyxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogJ1tkYXRhLXRtcGwtaGVhZGVyXScsXG5cdFx0XHRcdFx0bW9kZWw6IF90aGlzLmNoYXJpdHlNb2RlbFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0X3RoaXMuaGVhZGVyVmlldy5yZW5kZXIoe1xuXHRcdFx0XHRcdGNoYXJpdHlJZDogX3RoaXMuaGVhZGVyVmlldy5tb2RlbC4kbW9kZWwuaWQsXG5cdFx0XHRcdFx0Y2hhcml0eU5hbWU6IF90aGlzLmhlYWRlclZpZXcubW9kZWwuJG1vZGVsLm5hbWUsXG5cdFx0XHRcdFx0bGF5b3V0OiBfdGhpcy5jb25maWcubGF5b3V0XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHQvLyBMZWFkZXJib2FyZCB2aWV3XG5cdFx0XHRcdF90aGlzLmxlYWRlcmJvYXJkVmlldyA9IG5ldyBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya1ZpZXcyWydkZWZhdWx0J10oe1xuXHRcdFx0XHRcdHdpZGdldDogX3RoaXMsXG5cdFx0XHRcdFx0ZWw6ICdbZGF0YS12aWV3LWxlYWRlcmJvYXJkXScsXG5cdFx0XHRcdFx0dGVtcGxhdGU6ICdbZGF0YS10bXBsLWxlYWRlcmJvYXJkXScsXG5cdFx0XHRcdFx0Y2hpbGRWaWV3OiBfdGhpcy5sZWFkZXJib2FyZExpc3RWaWV3XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRfdGhpcy5sZWFkZXJib2FyZFZpZXcucmVuZGVyKHtcblx0XHRcdFx0XHR2aWV3TmFtZTogJ2xlYWRlcmJvYXJkJyxcblx0XHRcdFx0XHRoYXNDYXJvdXNlbDogX3RoaXMuY29uZmlnLmxheW91dCA9PT0gJ3NtYWxsJyA/ICd0cnVlJyA6ICdmYWxzZSdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdC8vIExlYWRlcmJvYXJkIGxpc3Qgdmlld1xuXHRcdFx0XHRfdGhpcy5sZWFkZXJib2FyZExpc3RWaWV3ID0gbmV3IF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrVmlldzJbJ2RlZmF1bHQnXSh7XG5cdFx0XHRcdFx0d2lkZ2V0OiBfdGhpcyxcblx0XHRcdFx0XHRlbDogJ1tkYXRhLXZpZXctbGVhZGVyYm9hcmQtbGlzdF0nLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiAnW2RhdGEtdG1wbC1sZWFkZXJib2FyZC1saXN0XScsXG5cdFx0XHRcdFx0bW9kZWw6IF90aGlzLmxlYWRlcmJvYXJkTW9kZWwsXG5cdFx0XHRcdFx0cG9sbEludGVydmFsOiAzMDAwMDBcblx0XHRcdFx0fSk7XG5cdFx0XHRcdF90aGlzLmxlYWRlcmJvYXJkTGlzdFZpZXcucmVuZGVyKHtcblx0XHRcdFx0XHRmdW5kcmFpc2VyczogX3RoaXMubGVhZGVyYm9hcmRMaXN0Vmlldy5tb2RlbC4kbW9kZWwucGFnZXMsXG5cdFx0XHRcdFx0bGF5b3V0OiBfdGhpcy5jb25maWcubGF5b3V0XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHQvLyBGb290ZXIgdmlld1xuXHRcdFx0XHRfdGhpcy5mb290ZXJWaWV3ID0gbmV3IF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrVmlldzJbJ2RlZmF1bHQnXSh7XG5cdFx0XHRcdFx0d2lkZ2V0OiBfdGhpcyxcblx0XHRcdFx0XHRlbDogJ1tkYXRhLXZpZXctZm9vdGVyXScsXG5cdFx0XHRcdFx0dGVtcGxhdGU6ICdbZGF0YS10bXBsLWZvb3Rlcl0nLFxuXHRcdFx0XHRcdG1vZGVsOiBfdGhpcy5jaGFyaXR5TW9kZWxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdF90aGlzLmZvb3RlclZpZXcucmVuZGVyKHtcblx0XHRcdFx0XHRjaGFyaXR5TmFtZTogX3RoaXMuZm9vdGVyVmlldy5tb2RlbC4kbW9kZWwubmFtZSxcblx0XHRcdFx0XHRwcm9maWxlUGFnZVVybDogX3RoaXMuZm9vdGVyVmlldy5tb2RlbC4kbW9kZWwucHJvZmlsZVBhZ2VVcmwsXG5cdFx0XHRcdFx0Y2hhcml0eURlc2NyaXB0aW9uOiBfdGhpcy5mb290ZXJWaWV3Lm1vZGVsLiRtb2RlbC5kZXNjcmlwdGlvbixcblx0XHRcdFx0XHRsYXlvdXQ6IF90aGlzLmNvbmZpZy5sYXlvdXRcblx0XHRcdFx0fSk7XG5cdFx0XHR9KS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0X3RoaXMucmVzZXRIZWlnaHQoKTtcblx0XHRcdFx0aWYgKF90aGlzLmNvbmZpZy5sYXlvdXQgPT09ICdzbWFsbCcpIHtcblx0XHRcdFx0XHRfdGhpcy5jYXJvdXNlbCA9IG5ldyBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJDYXJvdXNlbENhcm91c2VsMlsnZGVmYXVsdCddKHtcblx0XHRcdFx0XHRcdGVsOiAnW2RhdGEtY2Fyb3VzZWw9XCJsZWFkZXJib2FyZFwiXScsXG5cdFx0XHRcdFx0XHR3aWRnZXQ6IF90aGlzLFxuXHRcdFx0XHRcdFx0dmlldzogX3RoaXMubGVhZGVyYm9hcmRMaXN0Vmlldyxcblx0XHRcdFx0XHRcdHBhZ2VTaXplOiA1XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0X3RoaXMuYW5hbHl0aWNzID0gX3RoaXMuaW5pdEFuYWx5dGljcygpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XSk7XG5cblx0cmV0dXJuIEZ1bmRyYWlzZXJMZWFkZXJib2FyZDtcbn0pKF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrV2lkZ2V0MlsnZGVmYXVsdCddKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gRnVuZHJhaXNlckxlYWRlcmJvYXJkO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMloxYm1SeVlXbHpaWEl0YkdWaFpHVnlZbTloY21RdmMzSmpMM05qY21sd2RITXZZWEJ3TDBaMWJtUnlZV2x6WlhKTVpXRmtaWEppYjJGeVpDNXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4WlFVRlpMRU5CUVVNN096czdPenM3T3pzN096czdPenM3ZFVWQlIwMHNaMFZCUVdkRk96czdPM05GUVVNNVJDdzRSRUZCT0VRN096czdjMFZCUTJwRkxDdEVRVUVyUkRzN096dG5RMEZEY0VRc2IwSkJRVzlDT3pzN08zRkZRVU5vUXl3NFJFRkJPRVE3T3pzN096czdRVUZNTDBVc1NVRkJTU3hQUVVGUExFZEJRVWNzVDBGQlR5eERRVUZETEdGQlFXRXNRMEZCUXl4RFFVRkRMRTlCUVU4c1EwRkJRenM3U1VGVmRrTXNjVUpCUVhGQ08xZEJRWEpDTEhGQ1FVRnhRanM3UVVGRFpDeFZRVVJRTEhGQ1FVRnhRaXhEUVVOYUxFOUJRVThzUlVGQlJ6dDNRa0ZFYmtJc2NVSkJRWEZDT3p0QlFVVjZRaXcyUWtGR1NTeHhRa0ZCY1VJc05rTkJSV3hDTEU5QlFVOHNSVUZCUnp0QlFVTnFRaXhOUVVGSkxFTkJRVU1zU1VGQlNTeEZRVUZGTEVOQlFVTTdSVUZEV2pzN096czdPenRqUVVwSkxIRkNRVUZ4UWpzN1UwRlRja0lzWjBKQlFVYzdRVUZEVUN3NFFrRldTU3h4UWtGQmNVSXNjME5CVlZvN1FVRkRZaXhQUVVGSkxFTkJRVU1zWjBKQlFXZENMRWRCUVVjc2EwTkJRWEZDTzBGQlF6VkRMRlZCUVUwc1JVRkJSU3hKUVVGSk8wRkJRMW9zVDBGQlJ5eHJRMEZCYlVNc1NVRkJTU3hEUVVGRExFdEJRVXNzYjBKQlFXdENMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUlVGQlJTeHBRa0ZCWlR0SlFVTXZSaXhEUVVGRExFTkJRVU03UVVGRFNDeFBRVUZKTEVOQlFVTXNXVUZCV1N4SFFVRkhMSGRGUVVGVk8wRkJRemRDTEZWQlFVMHNSVUZCUlN4SlFVRkpPMEZCUTFvc1QwRkJSeXhyUTBGQmJVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc2IwSkJRV3RDTEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1JVRkJSU3hCUVVGRk8wbEJRMnhHTEVOQlFVTXNRMEZCUXp0QlFVTklMRTlCUVVrc1EwRkJReXhUUVVGVExFVkJRVVVzUTBGQlF6dEhRVU5xUWpzN096czdPenM3T3p0VFFVOVRMSEZDUVVGSE96czdRVUZEV2l4VlFVRlBMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRMWdzU1VGQlNTeERRVUZETEdkQ1FVRm5RaXhEUVVGRExGRkJRVkVzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRk5CUVZNc1EwRkJReXhGUVVOeVJDeEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRkZCUVZFc1JVRkJSU3hEUVVNMVFpeERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkZMRmxCUVUwN08wRkJSV1FzVlVGQlN5eFZRVUZWTEVkQlFVY3NkVVZCUVZNN1FVRkRNVUlzVjBGQlRTeFBRVUZOTzBGQlExb3NUMEZCUlN4RlFVRkZMRzlDUVVGdlFqdEJRVU40UWl4aFFVRlJMRVZCUVVVc2IwSkJRVzlDTzBGQlF6bENMRlZCUVVzc1JVRkJSU3hOUVVGTExGbEJRVms3UzBGRGVFSXNRMEZCUXl4RFFVRkRPMEZCUTBnc1ZVRkJTeXhWUVVGVkxFTkJRVU1zVFVGQlRTeERRVUZETzBGQlEzUkNMR05CUVZNc1JVRkJSU3hOUVVGTExGVkJRVlVzUTBGQlF5eExRVUZMTEVOQlFVTXNUVUZCVFN4RFFVRkRMRVZCUVVVN1FVRkRNVU1zWjBKQlFWY3NSVUZCUlN4TlFVRkxMRlZCUVZVc1EwRkJReXhMUVVGTExFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVazdRVUZET1VNc1YwRkJUU3hGUVVGRkxFMUJRVXNzVFVGQlRTeERRVUZETEUxQlFVMDdTMEZETVVJc1EwRkJReXhEUVVGRE96dEJRVVZJTEZWQlFVc3NaVUZCWlN4SFFVRkhMSFZGUVVGVE8wRkJReTlDTEZkQlFVMHNUMEZCVFR0QlFVTmFMRTlCUVVVc1JVRkJSU3g1UWtGQmVVSTdRVUZETjBJc1lVRkJVU3hGUVVGRkxIbENRVUY1UWp0QlFVTnVReXhqUVVGVExFVkJRVVVzVFVGQlN5eHRRa0ZCYlVJN1MwRkRia01zUTBGQlF5eERRVUZETzBGQlEwZ3NWVUZCU3l4bFFVRmxMRU5CUVVNc1RVRkJUU3hEUVVGRE8wRkJRek5DTEdGQlFWRXNSVUZCUlN4aFFVRmhPMEZCUTNaQ0xHZENRVUZYTEVWQlFVVXNUVUZCU3l4TlFVRk5MRU5CUVVNc1RVRkJUU3hMUVVGTExFOUJRVThzUjBGQlJ5eE5RVUZOTEVkQlFVY3NUMEZCVHp0TFFVTTVSQ3hEUVVGRExFTkJRVU03TzBGQlJVZ3NWVUZCU3l4dFFrRkJiVUlzUjBGQlJ5eDFSVUZCVXp0QlFVTnVReXhYUVVGTkxFOUJRVTA3UVVGRFdpeFBRVUZGTEVWQlFVVXNPRUpCUVRoQ08wRkJRMnhETEdGQlFWRXNSVUZCUlN3NFFrRkJPRUk3UVVGRGVFTXNWVUZCU3l4RlFVRkZMRTFCUVVzc1owSkJRV2RDTzBGQlF6VkNMR2xDUVVGWkxFVkJRVVVzVFVGQlRUdExRVU53UWl4RFFVRkRMRU5CUVVNN1FVRkRTQ3hWUVVGTExHMUNRVUZ0UWl4RFFVRkRMRTFCUVUwc1EwRkJRenRCUVVNdlFpeG5Ra0ZCVnl4RlFVRkZMRTFCUVVzc2JVSkJRVzFDTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTFCUVUwc1EwRkJReXhMUVVGTE8wRkJRM2hFTEZkQlFVMHNSVUZCUlN4TlFVRkxMRTFCUVUwc1EwRkJReXhOUVVGTk8wdEJRekZDTEVOQlFVTXNRMEZCUXpzN1FVRkZTQ3hWUVVGTExGVkJRVlVzUjBGQlJ5eDFSVUZCVXp0QlFVTXhRaXhYUVVGTkxFOUJRVTA3UVVGRFdpeFBRVUZGTEVWQlFVVXNiMEpCUVc5Q08wRkJRM2hDTEdGQlFWRXNSVUZCUlN4dlFrRkJiMEk3UVVGRE9VSXNWVUZCU3l4RlFVRkZMRTFCUVVzc1dVRkJXVHRMUVVONFFpeERRVUZETEVOQlFVTTdRVUZEU0N4VlFVRkxMRlZCUVZVc1EwRkJReXhOUVVGTkxFTkJRVU03UVVGRGRFSXNaMEpCUVZjc1JVRkJSU3hOUVVGTExGVkJRVlVzUTBGQlF5eExRVUZMTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWxCUVVrN1FVRkRPVU1zYlVKQlFXTXNSVUZCUlN4TlFVRkxMRlZCUVZVc1EwRkJReXhMUVVGTExFTkJRVU1zVFVGQlRTeERRVUZETEdOQlFXTTdRVUZETTBRc2RVSkJRV3RDTEVWQlFVVXNUVUZCU3l4VlFVRlZMRU5CUVVNc1MwRkJTeXhEUVVGRExFMUJRVTBzUTBGQlF5eFhRVUZYTzBGQlF6VkVMRmRCUVUwc1JVRkJSU3hOUVVGTExFMUJRVTBzUTBGQlF5eE5RVUZOTzB0QlF6RkNMRU5CUVVNc1EwRkJRenRKUVVOSUxFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVVXNXVUZCVFR0QlFVTmtMRlZCUVVzc1YwRkJWeXhGUVVGRkxFTkJRVU03UVVGRGJrSXNVVUZCU3l4TlFVRkxMRTFCUVUwc1EwRkJReXhOUVVGTkxFdEJRVXNzVDBGQlR5eEZRVUZITzBGQlEzSkRMRmRCUVVzc1VVRkJVU3hIUVVGSExIZEZRVUZoTzBGQlF6VkNMRkZCUVVVc1JVRkJSU3dyUWtGQkswSTdRVUZEYmtNc1dVRkJUU3hQUVVGTk8wRkJRMW9zVlVGQlNTeEZRVUZGTEUxQlFVc3NiVUpCUVcxQ08wRkJRemxDTEdOQlFWRXNSVUZCUlN4RFFVRkRPMDFCUTFnc1EwRkJReXhEUVVGRE8wdEJRMGc3UVVGRFJDeFZRVUZMTEZOQlFWTXNSMEZCUnl4TlFVRkxMR0ZCUVdFc1JVRkJSU3hEUVVGRE8wbEJRM1JETEVOQlFVTXNRMEZCUXp0SFFVTklPenM3VVVFMVJra3NjVUpCUVhGQ096czdjVUpCSzBaYUxIRkNRVUZ4UWlJc0ltWnBiR1VpT2lKRE9pOTBaVzF3TDBkSExrWnliMjUwUlc1a0xsZHBaR2RsZEhNdmQybGtaMlYwY3k5bWRXNWtjbUZwYzJWeUxXeGxZV1JsY21KdllYSmtMM055WXk5elkzSnBjSFJ6TDJGd2NDOUdkVzVrY21GcGMyVnlUR1ZoWkdWeVltOWhjbVF1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SW5kWE5sSUhOMGNtbGpkQ2M3WEhKY2JseHlYRzVzWlhRZ1VISnZiV2x6WlNBOUlISmxjWFZwY21Vb0oyVnpOaTF3Y205dGFYTmxKeWt1VUhKdmJXbHpaVHRjY2x4dWFXMXdiM0owSUZkcFpHZGxkQ0JtY205dElDZHFkWE4wWjJsMmFXNW5MWGRwWkdkbGRDMW1jbUZ0WlhkdmNtc3ZZMjl0Y0c5dVpXNTBjeTlzYVdJdmFuTXZabkpoYldWM2IzSnJMMWRwWkdkbGRDYzdYSEpjYm1sdGNHOXlkQ0JEWVhKdmRYTmxiQ0JtY205dElDZHFkWE4wWjJsMmFXNW5MWGRwWkdkbGRDMW1jbUZ0WlhkdmNtc3ZZMjl0Y0c5dVpXNTBjeTlzYVdJdlkyRnliM1Z6Wld3dlEyRnliM1Z6Wld3bk8xeHlYRzVwYlhCdmNuUWdUVzlrWld3Z1puSnZiU0FuYW5WemRHZHBkbWx1WnkxM2FXUm5aWFF0Wm5KaGJXVjNiM0pyTDJOdmJYQnZibVZ1ZEhNdmJHbGlMMnB6TDJaeVlXMWxkMjl5YXk5TmIyUmxiQ2M3WEhKY2JtbHRjRzl5ZENCTmIyUmxiRXhsWVdSbGNtSnZZWEprSUdaeWIyMGdKeTR2VFc5a1pXeE1aV0ZrWlhKaWIyRnlaQ2M3WEhKY2JtbHRjRzl5ZENCV2FXVjNJR1p5YjIwZ0oycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5cWN5OW1jbUZ0WlhkdmNtc3ZWbWxsZHljN1hISmNibHh5WEc0dktpcGNjbHh1SUNvZ1EzSmxZWFJsSUdFZ1puVnVaSEpoYVhObGNpQnNaV0ZrWlhKaWIyRnlaQ0IzYVdSblpYUmNjbHh1SUNvdlhISmNibU5zWVhOeklFWjFibVJ5WVdselpYSk1aV0ZrWlhKaWIyRnlaQ0JsZUhSbGJtUnpJRmRwWkdkbGRDQjdYSEpjYmx4MFkyOXVjM1J5ZFdOMGIzSWdLQ0J2Y0hScGIyNXpJQ2tnZTF4eVhHNWNkRngwYzNWd1pYSW9JRzl3ZEdsdmJuTWdLVHRjY2x4dVhIUmNkSFJvYVhNdWFXNXBkQ2dwTzF4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dVhIUWdLaUJKYm1sMGFXRnNhWE5sSUhSb1pTQnNaV0ZrWlhKaWIyRnlaRnh5WEc1Y2RDQXFJRUJrWlhOamNtbHdkR2x2YmlCRGNtVmhkR1VnWVc1a0lHTmhZMmhsSUc1bGR5QnNaV0ZrWlhKaWIyRnlaQ0J0YjJSbGJEc2dZbTl2ZEhOMGNtRndJSFJvWlNCM2FXUm5aWFJjY2x4dVhIUWdLaTljY2x4dVhIUnBibWwwSUNncElIdGNjbHh1WEhSY2RITjFjR1Z5TG1sdWFYUW9LVHRjY2x4dVhIUmNkSFJvYVhNdWJHVmhaR1Z5WW05aGNtUk5iMlJsYkNBOUlHNWxkeUJOYjJSbGJFeGxZV1JsY21KdllYSmtLSHNnWEhKY2JseDBYSFJjZEhkcFpHZGxkRG9nZEdocGN5eGNjbHh1WEhSY2RGeDBkWEpzT2lCZ2FIUjBjSE02WEZ3dlhGd3ZZWEJwTG1wMWMzUm5hWFpwYm1jdVkyOXRYRnd2Skh0MGFHbHpMbUZ3Y0Vsa2ZWeGNMM1l4WEZ3dlkyaGhjbWwwZVZ4Y0x5UjdkR2hwY3k1amIyNW1hV2N1YVdSOVhGd3ZiR1ZoWkdWeVltOWhjbVJnWEhKY2JseDBYSFI5S1R0Y2NseHVYSFJjZEhSb2FYTXVZMmhoY21sMGVVMXZaR1ZzSUQwZ2JtVjNJRTF2WkdWc0tIc2dYSEpjYmx4MFhIUmNkSGRwWkdkbGREb2dkR2hwY3l4Y2NseHVYSFJjZEZ4MGRYSnNPaUJnYUhSMGNITTZYRnd2WEZ3dllYQnBMbXAxYzNSbmFYWnBibWN1WTI5dFhGd3ZKSHQwYUdsekxtRndjRWxrZlZ4Y0wzWXhYRnd2WTJoaGNtbDBlVnhjTHlSN2RHaHBjeTVqYjI1bWFXY3VhV1I5WUN4Y2NseHVYSFJjZEgwcE8xeHlYRzVjZEZ4MGRHaHBjeTVpYjI5MGMzUnlZWEFvS1R0Y2NseHVYSFI5WEhKY2JseDBMeW9xWEhKY2JseDBJQ29nUW05dmRITjBjbUZ3SUhSb1pTQjNhV1JuWlhSY2NseHVYSFFnS2lCQVpHVnpZM0pwY0hScGIyNGdSbVYwWTJnZ1lXeHNJSE5sY25abGNpQmtZWFJoSUdadmNpQjBhR1VnYkdWaFpHVnlZbTloY21RZ2JXOWtaV3c3SUdOeVpXRjBaU0JoYm1RZ2NtVnVaR1Z5SUc1bGR5QnNaV0ZrWlhKaWIyRnlaQ0IyYVdWM08xeHlYRzVjZENBcUlISmxjMlYwSUhSb1pTQjNhV1JuWlhRZ2FHVnBaMmgwSUdGdVpDQmpjbVZoZEdVZ2JtVjNJR05oY205MWMyVnNJRzl1SUhSb1pTQmxkbVZ1ZEhNZ2RtbGxkeUJiYVdZZ2QybGtaMlYwSUd4aGVXOTFkQ0E5UFQwZ2JHRnlaMlZkT3lCY2NseHVYSFFnS2lCcGJtbDBhV0ZzYVhObElHRWdibVYzSUdGdVlXeDVkR2xqY3lCcGJuTjBZVzVqWlNCdmJpQjBhR1VnZDJsa1oyVjBYSEpjYmx4MElDb3ZYSEpjYmx4MFltOXZkSE4wY21Gd0lDZ3BJSHRjY2x4dVhIUmNkRkJ5YjIxcGMyVXVZV3hzS0Z0Y2NseHVYSFJjZEZ4MGRHaHBjeTVzWldGa1pYSmliMkZ5WkUxdlpHVnNMbWRsZEUxdlpHVnNLSFJvYVhNdVkyOXVabWxuTG5KbFptVnlaVzVqWlNrc1hISmNibHgwWEhSY2RIUm9hWE11WTJoaGNtbDBlVTF2WkdWc0xtZGxkRTF2WkdWc0tDbGNjbHh1WEhSY2RGMHBMblJvWlc0b0lDZ3BJRDArSUh0Y2NseHVYSFJjZEZ4MEx5OGdTR1ZoWkdWeUlIWnBaWGRjY2x4dVhIUmNkRngwZEdocGN5NW9aV0ZrWlhKV2FXVjNJRDBnYm1WM0lGWnBaWGNvZXlCY2NseHVYSFJjZEZ4MFhIUjNhV1JuWlhRNklIUm9hWE1zSUZ4eVhHNWNkRngwWEhSY2RHVnNPaUFuVzJSaGRHRXRkbWxsZHkxb1pXRmtaWEpkSnl4Y2NseHVYSFJjZEZ4MFhIUjBaVzF3YkdGMFpUb2dKMXRrWVhSaExYUnRjR3d0YUdWaFpHVnlYU2NzWEhKY2JseDBYSFJjZEZ4MGJXOWtaV3c2SUhSb2FYTXVZMmhoY21sMGVVMXZaR1ZzWEhKY2JseDBYSFJjZEgwcE8xeHlYRzVjZEZ4MFhIUjBhR2x6TG1obFlXUmxjbFpwWlhjdWNtVnVaR1Z5S0h0Y2NseHVYSFJjZEZ4MFhIUmphR0Z5YVhSNVNXUTZJSFJvYVhNdWFHVmhaR1Z5Vm1sbGR5NXRiMlJsYkM0a2JXOWtaV3d1YVdRc1hISmNibHgwWEhSY2RGeDBZMmhoY21sMGVVNWhiV1U2SUhSb2FYTXVhR1ZoWkdWeVZtbGxkeTV0YjJSbGJDNGtiVzlrWld3dWJtRnRaU3hjY2x4dVhIUmNkRngwWEhSc1lYbHZkWFE2SUhSb2FYTXVZMjl1Wm1sbkxteGhlVzkxZEZ4eVhHNWNkRngwWEhSOUtUdGNkRnh5WEc1Y2RGeDBYSFF2THlCTVpXRmtaWEppYjJGeVpDQjJhV1YzWEhKY2JseDBYSFJjZEhSb2FYTXViR1ZoWkdWeVltOWhjbVJXYVdWM0lEMGdibVYzSUZacFpYY29leUJjY2x4dVhIUmNkRngwWEhSM2FXUm5aWFE2SUhSb2FYTXNJRnh5WEc1Y2RGeDBYSFJjZEdWc09pQW5XMlJoZEdFdGRtbGxkeTFzWldGa1pYSmliMkZ5WkYwbkxGeHlYRzVjZEZ4MFhIUmNkSFJsYlhCc1lYUmxPaUFuVzJSaGRHRXRkRzF3YkMxc1pXRmtaWEppYjJGeVpGMG5MRnh5WEc1Y2RGeDBYSFJjZEdOb2FXeGtWbWxsZHpvZ2RHaHBjeTVzWldGa1pYSmliMkZ5WkV4cGMzUldhV1YzWEhKY2JseDBYSFJjZEgwcE8xeHlYRzVjZEZ4MFhIUjBhR2x6TG14bFlXUmxjbUp2WVhKa1ZtbGxkeTV5Wlc1a1pYSW9lMXh5WEc1Y2RGeDBYSFJjZEhacFpYZE9ZVzFsT2lBbmJHVmhaR1Z5WW05aGNtUW5MRnh5WEc1Y2RGeDBYSFJjZEdoaGMwTmhjbTkxYzJWc09pQjBhR2x6TG1OdmJtWnBaeTVzWVhsdmRYUWdQVDA5SUNkemJXRnNiQ2NnUHlBbmRISjFaU2NnT2lBblptRnNjMlVuWEhKY2JseDBYSFJjZEgwcE8xeDBYSEpjYmx4MFhIUmNkQzh2SUV4bFlXUmxjbUp2WVhKa0lHeHBjM1FnZG1sbGQxeHlYRzVjZEZ4MFhIUjBhR2x6TG14bFlXUmxjbUp2WVhKa1RHbHpkRlpwWlhjZ1BTQnVaWGNnVm1sbGR5aDdJRnh5WEc1Y2RGeDBYSFJjZEhkcFpHZGxkRG9nZEdocGN5d2dYSEpjYmx4MFhIUmNkRngwWld3NklDZGJaR0YwWVMxMmFXVjNMV3hsWVdSbGNtSnZZWEprTFd4cGMzUmRKeXhjY2x4dVhIUmNkRngwWEhSMFpXMXdiR0YwWlRvZ0oxdGtZWFJoTFhSdGNHd3RiR1ZoWkdWeVltOWhjbVF0YkdsemRGMG5MRnh5WEc1Y2RGeDBYSFJjZEcxdlpHVnNPaUIwYUdsekxteGxZV1JsY21KdllYSmtUVzlrWld3c1hISmNibHgwWEhSY2RGeDBjRzlzYkVsdWRHVnlkbUZzT2lBek1EQXdNREJjY2x4dVhIUmNkRngwZlNrN1hISmNibHgwWEhSY2RIUm9hWE11YkdWaFpHVnlZbTloY21STWFYTjBWbWxsZHk1eVpXNWtaWElvZTF4eVhHNWNkRngwWEhSY2RHWjFibVJ5WVdselpYSnpPaUIwYUdsekxteGxZV1JsY21KdllYSmtUR2x6ZEZacFpYY3ViVzlrWld3dUpHMXZaR1ZzTG5CaFoyVnpMRnh5WEc1Y2RGeDBYSFJjZEd4aGVXOTFkRG9nZEdocGN5NWpiMjVtYVdjdWJHRjViM1YwWEhKY2JseDBYSFJjZEgwcE8xeHlYRzVjZEZ4MFhIUXZMeUJHYjI5MFpYSWdkbWxsZDF4eVhHNWNkRngwWEhSMGFHbHpMbVp2YjNSbGNsWnBaWGNnUFNCdVpYY2dWbWxsZHloN0lGeHlYRzVjZEZ4MFhIUmNkSGRwWkdkbGREb2dkR2hwY3l3Z1hISmNibHgwWEhSY2RGeDBaV3c2SUNkYlpHRjBZUzEyYVdWM0xXWnZiM1JsY2wwbkxGeHlYRzVjZEZ4MFhIUmNkSFJsYlhCc1lYUmxPaUFuVzJSaGRHRXRkRzF3YkMxbWIyOTBaWEpkSnl4Y2NseHVYSFJjZEZ4MFhIUnRiMlJsYkRvZ2RHaHBjeTVqYUdGeWFYUjVUVzlrWld4Y2NseHVYSFJjZEZ4MGZTazdYSEpjYmx4MFhIUmNkSFJvYVhNdVptOXZkR1Z5Vm1sbGR5NXlaVzVrWlhJb2UxeHlYRzVjZEZ4MFhIUmNkR05vWVhKcGRIbE9ZVzFsT2lCMGFHbHpMbVp2YjNSbGNsWnBaWGN1Ylc5a1pXd3VKRzF2WkdWc0xtNWhiV1VzWEhKY2JseDBYSFJjZEZ4MGNISnZabWxzWlZCaFoyVlZjbXc2SUhSb2FYTXVabTl2ZEdWeVZtbGxkeTV0YjJSbGJDNGtiVzlrWld3dWNISnZabWxzWlZCaFoyVlZjbXdzWEhKY2JseDBYSFJjZEZ4MFkyaGhjbWwwZVVSbGMyTnlhWEIwYVc5dU9pQjBhR2x6TG1admIzUmxjbFpwWlhjdWJXOWtaV3d1SkcxdlpHVnNMbVJsYzJOeWFYQjBhVzl1TEZ4eVhHNWNkRngwWEhSY2RHeGhlVzkxZERvZ2RHaHBjeTVqYjI1bWFXY3ViR0Y1YjNWMFhISmNibHgwWEhSY2RIMHBPMXgwWEhKY2JseDBYSFI5S1M1MGFHVnVLQ0FvS1NBOVBpQjdYSEpjYmx4MFhIUmNkSFJvYVhNdWNtVnpaWFJJWldsbmFIUW9LVHRjZEZ4eVhHNWNkRngwWEhScFppQW9JSFJvYVhNdVkyOXVabWxuTG14aGVXOTFkQ0E5UFQwZ0ozTnRZV3hzSnlBcElIdGNjbHh1WEhSY2RGeDBYSFIwYUdsekxtTmhjbTkxYzJWc0lEMGdibVYzSUVOaGNtOTFjMlZzS0h0Y2NseHVYSFJjZEZ4MFhIUmNkR1ZzT2lBblcyUmhkR0V0WTJGeWIzVnpaV3c5WENKc1pXRmtaWEppYjJGeVpGd2lYU2NzWEhKY2JseDBYSFJjZEZ4MFhIUjNhV1JuWlhRNklIUm9hWE1zWEhKY2JseDBYSFJjZEZ4MFhIUjJhV1YzT2lCMGFHbHpMbXhsWVdSbGNtSnZZWEprVEdsemRGWnBaWGNzWEhKY2JseDBYSFJjZEZ4MFhIUndZV2RsVTJsNlpUb2dOVnh5WEc1Y2RGeDBYSFJjZEgwcE8xeHlYRzVjZEZ4MFhIUjlYSEpjYmx4MFhIUmNkSFJvYVhNdVlXNWhiSGwwYVdOeklEMGdkR2hwY3k1cGJtbDBRVzVoYkhsMGFXTnpLQ2s3WEhKY2JseDBYSFI5S1R0Y2NseHVYSFI5WEhKY2JuMWNjbHh1WEhKY2JtVjRjRzl5ZENCa1pXWmhkV3gwSUVaMWJtUnlZV2x6WlhKTVpXRmtaWEppYjJGeVpEdGNjbHh1SWwxOSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHR2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKCd2YWx1ZScgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrTW9kZWwgPSByZXF1aXJlKCdqdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvZnJhbWV3b3JrL01vZGVsJyk7XG5cbnZhciBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya01vZGVsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtNb2RlbCk7XG5cbnZhciBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc1dpZGdldE1vZGVsTnVtYmVyID0gcmVxdWlyZSgnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3dpZGdldC9tb2RlbC9udW1iZXInKTtcblxudmFyIFByb21pc2UgPSByZXF1aXJlKCdlczYtcHJvbWlzZScpLlByb21pc2U7XG5cbi8qKlxyXG4gKiBDcmVhdGUgYSBmdW5kcmFpc2VyIG1vZGVsIFxyXG4gKiBAY2xhc3NkZXNjIEF1Z2VudCBtb2RlbCB0byBhZGQgdGhlICUgb2YgdGFyZ2V0IHJlYWNoZWQsIHRoZSByYW5raW5nIG9mIHRoZSBmdW5kcmFpc2VyIGFuZCBVVE0tYXVnbWVudGVkIFVSTCBvZiBGUlBcclxuICovXG5cbnZhciBNb2RlbExlYWRlcmJvYXJkID0gKGZ1bmN0aW9uIChfTW9kZWwpIHtcblx0X2luaGVyaXRzKE1vZGVsTGVhZGVyYm9hcmQsIF9Nb2RlbCk7XG5cblx0ZnVuY3Rpb24gTW9kZWxMZWFkZXJib2FyZChvcHRpb25zKSB7XG5cdFx0X2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1vZGVsTGVhZGVyYm9hcmQpO1xuXG5cdFx0X2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoTW9kZWxMZWFkZXJib2FyZC5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHR9XG5cblx0LyoqXHJcbiAgKiBFeHRlbmQgbW9kZWwncyBnZXQgbW9kZWwgbWV0aG9kXHJcbiAgKiBAZGVzY3JpcHRpb24gRXh0ZW5kIG1vZGVsJ3MgZ2V0IG1vZGVsIG1ldGhvZCB0byBpbmNsdWRlIGRhdGEgYXVnbWVudGF0aW9uIG9mIHJldHVybmVkIGNvbGxlY3Rpb24gZGF0YVxyXG4gICovXG5cblx0X2NyZWF0ZUNsYXNzKE1vZGVsTGVhZGVyYm9hcmQsIFt7XG5cdFx0a2V5OiAnZ2V0TW9kZWwnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBnZXRNb2RlbChyZWZlcmVuY2UpIHtcblx0XHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHRcdFx0XHRfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihNb2RlbExlYWRlcmJvYXJkLnByb3RvdHlwZSksICdnZXRNb2RlbCcsIF90aGlzKS5jYWxsKF90aGlzKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgY3VycmVuY3lTeW1ib2wgPSBfdGhpcy4kbW9kZWwuY3VycmVuY3lTeW1ib2w7XG5cdFx0XHRcdFx0X3RoaXMuJG1vZGVsLnBhZ2VzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcblx0XHRcdFx0XHRcdHJldHVybiBiLmFtb3VudCAtIGEuYW1vdW50O1xuXHRcdFx0XHRcdH0pLmZvckVhY2goZnVuY3Rpb24gKGZ1bmRyYWlzZXIsIGkpIHtcblx0XHRcdFx0XHRcdGZ1bmRyYWlzZXIucHJldHR5QW1vdW50ID0gKDAsIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzV2lkZ2V0TW9kZWxOdW1iZXIuY29tbWFGb3JtYXQpKE1hdGgucm91bmQoZnVuZHJhaXNlci5hbW91bnQpKTtcblx0XHRcdFx0XHRcdGZ1bmRyYWlzZXIudGFyZ2V0UGMgPSAoMCwgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNXaWRnZXRNb2RlbE51bWJlci5jb21tYUZvcm1hdCkoJycgKyAoMCwgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNXaWRnZXRNb2RlbE51bWJlci5nZXRQZXJjZW50KShmdW5kcmFpc2VyLmFtb3VudCwgZnVuZHJhaXNlci50YXJnZXRBbW91bnQpKTtcblx0XHRcdFx0XHRcdGZ1bmRyYWlzZXIucmFua2luZyA9IGkgKyAxO1xuXHRcdFx0XHRcdFx0ZnVuZHJhaXNlci5jdXJyZW5jeVN5bWJvbCA9IGN1cnJlbmN5U3ltYm9sO1xuXHRcdFx0XHRcdFx0ZnVuZHJhaXNlci5hdmF0YXIgPSBmdW5kcmFpc2VyLm93bmVyUHJvZmlsZUltYWdlVXJsc1sxXS5WYWx1ZTtcblx0XHRcdFx0XHRcdGZ1bmRyYWlzZXIuZG9uYXRpb25VcmwgPSBfdGhpcy5nZXREb25hdGlvblVybChmdW5kcmFpc2VyLnBhZ2VJZCwgX3RoaXMuZ2V0RnVsbFJlZmVyZW5jZShyZWZlcmVuY2UpKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogIEdldHMgd2lkZ2V0cyBmdWxsIHJlZmVyZW5jZVxyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnZ2V0RnVsbFJlZmVyZW5jZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGdldEZ1bGxSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG5cdFx0XHR2YXIgcmVmZXJlbmNlU3VmZml4ID0gJ2Z1bmRyYWlzZXJsYl9idXR0b252MSc7XG5cdFx0XHRyZXR1cm4gcmVmZXJlbmNlID8gcmVmZXJlbmNlICsgJ18nICsgcmVmZXJlbmNlU3VmZml4IDogcmVmZXJlbmNlU3VmZml4O1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqICBHZXRzIHRoZSBkb25hdGlvbiB1cmxcclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ2dldERvbmF0aW9uVXJsJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gZ2V0RG9uYXRpb25VcmwocGFnZUlkLCByZWZlcmVuY2UpIHtcblx0XHRcdHZhciBkb25hdGlvblVybCA9ICdodHRwczovL2xpbmsuanVzdGdpdmluZy5jb20vdjEvZnVuZHJhaXNpbmdwYWdlL2RvbmF0ZS9wYWdlaWQve3BhZ2VJZH0/cmVmZXJlbmNlPXtyZWZlcmVuY2V9Jztcblx0XHRcdGRvbmF0aW9uVXJsID0gZG9uYXRpb25VcmwucmVwbGFjZSgne3BhZ2VJZH0nLCBwYWdlSWQpLnJlcGxhY2UoJ3tyZWZlcmVuY2V9JywgcmVmZXJlbmNlKTtcblx0XHRcdHJldHVybiBkb25hdGlvblVybDtcblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gTW9kZWxMZWFkZXJib2FyZDtcbn0pKF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrTW9kZWwyWydkZWZhdWx0J10pO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBNb2RlbExlYWRlcmJvYXJkO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMloxYm1SeVlXbHpaWEl0YkdWaFpHVnlZbTloY21RdmMzSmpMM05qY21sd2RITXZZWEJ3TDAxdlpHVnNUR1ZoWkdWeVltOWhjbVF1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlFVRXNXVUZCV1N4RFFVRkRPenM3T3pzN096czdPenM3T3pzN08zTkZRVWRMTEN0RVFVRXJSRHM3T3p0NVJVRkRkRVFzYlVWQlFXMUZPenRCUVVZNVJpeEpRVUZKTEU5QlFVOHNSMEZCUnl4UFFVRlBMRU5CUVVNc1lVRkJZU3hEUVVGRExFTkJRVU1zVDBGQlR5eERRVUZET3pzN096czdPMGxCVTNaRExHZENRVUZuUWp0WFFVRm9RaXhuUWtGQlowSTdPMEZCUTFZc1ZVRkVUaXhuUWtGQlowSXNRMEZEVWl4UFFVRlBMRVZCUVVjN2QwSkJSR3hDTEdkQ1FVRm5RanM3UVVGRmNFSXNOa0pCUmtrc1owSkJRV2RDTERaRFFVVmlMRTlCUVU4c1JVRkJSenRGUVVOcVFqczdPenM3T3p0alFVaEpMR2RDUVVGblFqczdVMEZSV2l4clFrRkJSU3hUUVVGVExFVkJRVWM3T3p0QlFVTjBRaXhWUVVGUExFbEJRVWtzVDBGQlR5eERRVUZGTEZWQlFVVXNUMEZCVHl4RlFVRk5PMEZCUTJ4RExDdENRVlpITEdkQ1FVRm5RaXcwUTBGVlJpeEpRVUZKTEVOQlFVVXNXVUZCVFR0QlFVTTFRaXhUUVVGSkxHTkJRV01zUjBGQlJ5eE5RVUZMTEUxQlFVMHNRMEZCUXl4alFVRmpMRU5CUVVNN1FVRkRhRVFzVjBGQlN5eE5RVUZOTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJSU3hWUVVGRExFTkJRVU1zUlVGQlJTeERRVUZETEVWQlFVczdRVUZEYWtNc1lVRkJUeXhEUVVGRExFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNRMEZCUXl4TlFVRk5MRU5CUVVNN1RVRkRNMElzUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUlN4VlFVRkZMRlZCUVZVc1JVRkJSU3hEUVVGRExFVkJRVTA3UVVGRGFFTXNaMEpCUVZVc1EwRkJReXhaUVVGWkxFZEJRVWNzTkVWQlFXRXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJSU3hWUVVGVkxFTkJRVU1zVFVGQlRTeERRVUZGTEVOQlFVVXNRMEZCUXp0QlFVTjZSU3huUWtGQlZTeERRVUZETEZGQlFWRXNSMEZCUnl4cFJrRkJaMElzTWtWQlFWY3NWVUZCVlN4RFFVRkRMRTFCUVUwc1JVRkJSU3hWUVVGVkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVa3NRMEZCUXp0QlFVTnFSeXhuUWtGQlZTeERRVUZETEU5QlFVOHNSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8wRkJRek5DTEdkQ1FVRlZMRU5CUVVNc1kwRkJZeXhIUVVGSExHTkJRV01zUTBGQlF6dEJRVU16UXl4blFrRkJWU3hEUVVGRExFMUJRVTBzUjBGQlJ5eFZRVUZWTEVOQlFVTXNjVUpCUVhGQ0xFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRPMEZCUXpsRUxHZENRVUZWTEVOQlFVTXNWMEZCVnl4SFFVRkhMRTFCUVVzc1kwRkJZeXhEUVVGRExGVkJRVlVzUTBGQlF5eE5RVUZOTEVWQlFVVXNUVUZCU3l4blFrRkJaMElzUTBGQlF5eFRRVUZUTEVOQlFVTXNRMEZCUXl4RFFVRkRPMDFCUTJ4SExFTkJRVU1zUTBGQlF6dEJRVU5JTEZsQlFVOHNSVUZCUlN4RFFVRkRPMHRCUTFZc1EwRkJReXhEUVVGRE8wbEJRMGdzUTBGQlF5eERRVUZETzBkQlEwZzdPenM3T3pzN1UwRkpaMElzTUVKQlFVVXNVMEZCVXl4RlFVRkhPMEZCUXpsQ0xFOUJRVTBzWlVGQlpTeEhRVUZITEhWQ1FVRjFRaXhEUVVGRE8wRkJRMmhFTEZWQlFVOHNVMEZCVXl4SFFVRk5MRk5CUVZNc1UwRkJTU3hsUVVGbExFZEJRVXNzWlVGQlpTeERRVUZETzBkQlEzWkZPenM3T3pzN08xTkJTV0VzZDBKQlFVTXNUVUZCVFN4RlFVRkZMRk5CUVZNc1JVRkJRenRCUVVOb1F5eFBRVUZKTEZkQlFWY3NaMGRCUVdkSExFTkJRVU03UVVGRGFFZ3NZMEZCVnl4SFFVRkhMRmRCUVZjc1EwRkJReXhQUVVGUExFTkJRVU1zVlVGQlZTeEZRVUZGTEUxQlFVMHNRMEZCUXl4RFFVRkRMRTlCUVU4c1EwRkJReXhoUVVGaExFVkJRVVVzVTBGQlV5eERRVUZETEVOQlFVTTdRVUZEZUVZc1ZVRkJUeXhYUVVGWExFTkJRVU03UjBGRGJrSTdPenRSUVhoRFNTeG5Ra0ZCWjBJN096dHhRa0V5UTFBc1owSkJRV2RDSWl3aVptbHNaU0k2SWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJaMWJtUnlZV2x6WlhJdGJHVmhaR1Z5WW05aGNtUXZjM0pqTDNOamNtbHdkSE12WVhCd0wwMXZaR1ZzVEdWaFpHVnlZbTloY21RdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUluZFhObElITjBjbWxqZENjN1hISmNibHh5WEc1c1pYUWdVSEp2YldselpTQTlJSEpsY1hWcGNtVW9KMlZ6Tmkxd2NtOXRhWE5sSnlrdVVISnZiV2x6WlR0Y2NseHVhVzF3YjNKMElFMXZaR1ZzSUdaeWIyMGdKMnAxYzNSbmFYWnBibWN0ZDJsa1oyVjBMV1p5WVcxbGQyOXlheTlqYjIxd2IyNWxiblJ6TDJ4cFlpOXFjeTltY21GdFpYZHZjbXN2VFc5a1pXd25PMXh5WEc1cGJYQnZjblFnZXlCblpYUlFaWEpqWlc1MElIMGdabkp2YlNBbmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDJwekwzZHBaR2RsZEM5dGIyUmxiQzl1ZFcxaVpYSW5PMXh5WEc1cGJYQnZjblFnZXlCamIyMXRZVVp2Y20xaGRDQjlJR1p5YjIwZ0oycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5cWN5OTNhV1JuWlhRdmJXOWtaV3d2Ym5WdFltVnlKenRjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJEY21WaGRHVWdZU0JtZFc1a2NtRnBjMlZ5SUcxdlpHVnNJRnh5WEc0Z0tpQkFZMnhoYzNOa1pYTmpJRUYxWjJWdWRDQnRiMlJsYkNCMGJ5QmhaR1FnZEdobElDVWdiMllnZEdGeVoyVjBJSEpsWVdOb1pXUXNJSFJvWlNCeVlXNXJhVzVuSUc5bUlIUm9aU0JtZFc1a2NtRnBjMlZ5SUdGdVpDQlZWRTB0WVhWbmJXVnVkR1ZrSUZWU1RDQnZaaUJHVWxCY2NseHVJQ292WEhKY2JtTnNZWE56SUUxdlpHVnNUR1ZoWkdWeVltOWhjbVFnWlhoMFpXNWtjeUJOYjJSbGJDQjdYSEpjYmx4MFkyOXVjM1J5ZFdOMGIzSW9JRzl3ZEdsdmJuTWdLU0I3WEhKY2JseDBYSFJ6ZFhCbGNpZ2diM0IwYVc5dWN5QXBPMXh5WEc1Y2RIMWNjbHh1WEhRdktpcGNjbHh1WEhRZ0tpQkZlSFJsYm1RZ2JXOWtaV3duY3lCblpYUWdiVzlrWld3Z2JXVjBhRzlrWEhKY2JseDBJQ29nUUdSbGMyTnlhWEIwYVc5dUlFVjRkR1Z1WkNCdGIyUmxiQ2R6SUdkbGRDQnRiMlJsYkNCdFpYUm9iMlFnZEc4Z2FXNWpiSFZrWlNCa1lYUmhJR0YxWjIxbGJuUmhkR2x2YmlCdlppQnlaWFIxY201bFpDQmpiMnhzWldOMGFXOXVJR1JoZEdGY2NseHVYSFFnS2k5Y2NseHVYSFJuWlhSTmIyUmxiQ0FvSUhKbFptVnlaVzVqWlNBcElIdGNjbHh1WEhSY2RISmxkSFZ5YmlCdVpYY2dVSEp2YldselpTZ2dLQ0J5WlhOdmJIWmxJQ2tnUFQ0Z2V5QmNjbHh1WEhSY2RGeDBjM1Z3WlhJdVoyVjBUVzlrWld3b0tTNTBhR1Z1S0NBb0tTQTlQaUI3WEhKY2JseDBYSFJjZEZ4MGRtRnlJR04xY25KbGJtTjVVM2x0WW05c0lEMGdkR2hwY3k0a2JXOWtaV3d1WTNWeWNtVnVZM2xUZVcxaWIydzdYSEpjYmx4MFhIUmNkRngwZEdocGN5NGtiVzlrWld3dWNHRm5aWE11YzI5eWRDZ2dLR0VzSUdJcElEMCtJSHRjY2x4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlCaUxtRnRiM1Z1ZENBdElHRXVZVzF2ZFc1ME8xeHlYRzVjZEZ4MFhIUmNkSDBwTG1admNrVmhZMmdvSUNnZ1puVnVaSEpoYVhObGNpd2dhU0FwSUQwK0lIdGNjbHh1WEhSY2RGeDBYSFJjZEdaMWJtUnlZV2x6WlhJdWNISmxkSFI1UVcxdmRXNTBJRDBnWTI5dGJXRkdiM0p0WVhRb0lFMWhkR2d1Y205MWJtUW9JR1oxYm1SeVlXbHpaWEl1WVcxdmRXNTBJQ2tnS1R0Y2NseHVYSFJjZEZ4MFhIUmNkR1oxYm1SeVlXbHpaWEl1ZEdGeVoyVjBVR01nUFNCamIyMXRZVVp2Y20xaGRDZ2dZQ1I3WjJWMFVHVnlZMlZ1ZENobWRXNWtjbUZwYzJWeUxtRnRiM1Z1ZEN3Z1puVnVaSEpoYVhObGNpNTBZWEpuWlhSQmJXOTFiblFwZldBZ0tUdGNjbHh1WEhSY2RGeDBYSFJjZEdaMWJtUnlZV2x6WlhJdWNtRnVhMmx1WnlBOUlHa2dLeUF4TzF4MFhISmNibHgwWEhSY2RGeDBYSFJtZFc1a2NtRnBjMlZ5TG1OMWNuSmxibU41VTNsdFltOXNJRDBnWTNWeWNtVnVZM2xUZVcxaWIydzdYSEpjYmx4MFhIUmNkRngwWEhSbWRXNWtjbUZwYzJWeUxtRjJZWFJoY2lBOUlHWjFibVJ5WVdselpYSXViM2R1WlhKUWNtOW1hV3hsU1cxaFoyVlZjbXh6V3pGZExsWmhiSFZsT3lCY2NseHVYSFJjZEZ4MFhIUmNkR1oxYm1SeVlXbHpaWEl1Wkc5dVlYUnBiMjVWY213Z1BTQjBhR2x6TG1kbGRFUnZibUYwYVc5dVZYSnNLR1oxYm1SeVlXbHpaWEl1Y0dGblpVbGtMQ0IwYUdsekxtZGxkRVoxYkd4U1pXWmxjbVZ1WTJVb2NtVm1aWEpsYm1ObEtTazdYSEpjYmx4MFhIUmNkRngwZlNrN1hISmNibHgwWEhSY2RGeDBjbVZ6YjJ4MlpTZ3BPMXh5WEc1Y2RGeDBYSFI5S1R0Y2NseHVYSFJjZEgwcE8xeHlYRzVjZEgxY2NseHVYSFF2S2lwY2NseHVYSFFnS2lBZ1IyVjBjeUIzYVdSblpYUnpJR1oxYkd3Z2NtVm1aWEpsYm1ObFhISmNibHgwSUNvdlhISmNibHgwWjJWMFJuVnNiRkpsWm1WeVpXNWpaU0FvSUhKbFptVnlaVzVqWlNBcElIdGNjbHh1WEhSY2RHTnZibk4wSUhKbFptVnlaVzVqWlZOMVptWnBlQ0E5SUNkbWRXNWtjbUZwYzJWeWJHSmZZblYwZEc5dWRqRW5PMXh5WEc1Y2RGeDBjbVYwZFhKdUlISmxabVZ5Wlc1alpTQS9JR0FrZTNKbFptVnlaVzVqWlgxZkpIdHlaV1psY21WdVkyVlRkV1ptYVhoOVlDQTZJSEpsWm1WeVpXNWpaVk4xWm1acGVEdGNjbHh1WEhSOVhISmNibHgwTHlvcVhISmNibHgwSUNvZ0lFZGxkSE1nZEdobElHUnZibUYwYVc5dUlIVnliRnh5WEc1Y2RDQXFMMXh5WEc1Y2RHZGxkRVJ2Ym1GMGFXOXVWWEpzS0hCaFoyVkpaQ3dnY21WbVpYSmxibU5sS1h0Y2NseHVYSFJjZEhaaGNpQmtiMjVoZEdsdmJsVnliQ0E5SUdCb2RIUndjem92TDJ4cGJtc3VhblZ6ZEdkcGRtbHVaeTVqYjIwdmRqRXZablZ1WkhKaGFYTnBibWR3WVdkbEwyUnZibUYwWlM5d1lXZGxhV1F2ZTNCaFoyVkpaSDAvY21WbVpYSmxibU5sUFh0eVpXWmxjbVZ1WTJWOVlEdGNjbHh1WEhSY2RHUnZibUYwYVc5dVZYSnNJRDBnWkc5dVlYUnBiMjVWY213dWNtVndiR0ZqWlNnbmUzQmhaMlZKWkgwbkxDQndZV2RsU1dRcExuSmxjR3hoWTJVb0ozdHlaV1psY21WdVkyVjlKeXdnY21WbVpYSmxibU5sS1R0Y2NseHVYSFJjZEhKbGRIVnliaUJrYjI1aGRHbHZibFZ5YkR0Y2NseHVYSFI5WEhKY2JuMWNjbHh1WEhKY2JtVjRjRzl5ZENCa1pXWmhkV3gwSUUxdlpHVnNUR1ZoWkdWeVltOWhjbVE3WEhKY2JpSmRmUT09Il19\n"]}