{"version":3,"sources":["public/js/kalamar-0.41.3-en.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","item","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","blur","bounding","getBoundingClientRect","left","treeMenuClass","classes","title","data","cb","b","that","_bind","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","append","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","span","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","actions","prepend","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","foundry","_foundry","layer","_layer","addTree","NEW_QUERY","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","NEW_CONSTRAINT","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","width","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","bottom","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","anchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","right","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","DOWNLOAD","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","SHOWANNO","SHOW_META","ADDTREE","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","_desc","hint","inputField","desc","lengthFieldClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","qs","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","TOGGLE_ALIGN","SHOW_KQ","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","clientWidth","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","pageXOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","exit","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_help","TOUR_glimpse","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","URL","legacySigle","_actionJSON","requestType","jsObj","returnValueCB","errorCB","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","retJSObj","responseText","status","statusText","send","legacy","docFragment","getJSON","getCollections","cq","getPluginList","putJSON","postJSON","deleteJSON","getQueryList","getQuery","qn","putQuery","postQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","gt","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","pe"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined)\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    \r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      \r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array();\r\n\r\n      // TODO:\r\n      // Make this separate from _init\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined;\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    removeItems : function () {\r\n      // Remove all children\r\n      const children = this._el.childNodes;\r\n\r\n      // Leave the prefix and lengthField\r\n      for (let i = children.length - 1; i >= 3; i--) {\r\n        this._el.removeChild(\r\n          children[i]\r\n        );\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        t._el.removeChild(t._el.children[3]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[3]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the panel object\r\n     * and the item parameters.\r\n     *\r\n     * @param panel The panel object\r\n     * @param params The match menu items\r\n     *   as an array of arrays.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\t      this.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * The panel object of the menu.\r\n     */\r\n    panel :function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      this._el.style.left = bounding.left + \"px\";\r\n      this._el.style.top = (\r\n        bounding.top +\r\n          bounding.height -\r\n          this._el.clientHeight\r\n      ) + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n    \r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      \r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t.actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n    \r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions.element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this.actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this.actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions.element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n     const actions = this.actions;\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions.add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions;\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions.element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'menu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = Object.create(menuClass)\r\n\t        .upgradeTo(this)\r\n\t        ._init(params, {\r\n\t          itemClass : itemClass,\r\n\t          prefixClass : prefixClass,\r\n\t          lengthFieldClass : lengthFieldClass\r\n\t        });\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menu   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menu[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menu[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menu[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      let qs = d.querySelectorAll('pre.query.tutorial:not(.unsupported)');\r\n      const that = this;\r\n      for (var i = 0; i < qs.length; i++) {\r\n\t      qs[i].onclick = function (e) {\r\n\t        that.useQuery(this,e);\r\n\t      };\r\n      };\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions.add.apply(this.actions, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions.add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions.add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions;\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          let vchoo = doe.querySelector(\"#vc-choose\");\r\n          let vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions.add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions.add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to an plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions.addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n\r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from from\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        };\r\n      };\r\n\r\n      // data needs to be mirrored\r\n      if (d._id) {\r\n        service.sendMsg(d);\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  // See https://flaviocopes.com/http-request-headers/ for a list of headers\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * @param cq corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve a list of all plugin objects to\r\n   * establish in the frontend.\r\n   */\r\n  KorAP.API.getPluginList = function (url, cb) {\r\n    KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n  };\r\n\r\n  /**\r\n   * General function to communicate JS Objects with the server\r\n   * \r\n   * @param {HTTMLRequestType} requestType Should be \"GET\", \"PUT\", \"POST\" or \"DELETE\"\r\n   * @param {String} url The url that specifies where the JSON file is (\"GET\"), will be (\"PUT\" and \"POST\") or will have been (\"DELETE\")\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {JSObj} jsObj For \"PUT\" and \"POST\". The JS Object that is getting transfered. This function stringifies it.\r\n   * @param {function} returnValueCB For \"GET\". The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  function _actionJSON (requestType, url, title, jsObj, returnValueCB, errorCB) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(requestType, url, true); \r\n    // Dispatch global \"window\" event. See Kalamar::Plugin::Piwik\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        if (requestType === \"GET\") { //GET\r\n          let retJSObj;\r\n          try {\r\n            retJSObj = JSON.parse(this.responseText);\r\n          }\r\n          catch (e) {\r\n            KorAP.log(0, e);\r\n            console.log(e);\r\n            returnValueCB(undefined);\r\n            return;\r\n          };\r\n\r\n          if (retJSObj !== undefined && retJSObj[\"errors\"] !== undefined) {\r\n            retJSObj[\"errors\"].forEach(\r\n              e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n            );\r\n          }\r\n\r\n          else if (this.status !== 200) {\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n\r\n          if (this.status === 200) {\r\n            returnValueCB(retJSObj);\r\n          }\r\n\r\n          else {\r\n            returnValueCB(undefined);\r\n          };\r\n\r\n        } else { // PUT, POST, DELETE\r\n          if (this.status >= 300 || this.status < 200) { //Error\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n        };\r\n        // Call the callback function (no matter requestType) if one is given.\r\n        if (typeof(errorCB) === \"function\"){\r\n          errorCB({\r\n            \"status\" : this.status,\r\n            \"statusText\" : this.statusText\r\n          });\r\n        }; \r\n      };\r\n    };\r\n\r\n    /*Set a value for .timeout to use this functionality */\r\n    //req.ontimeout = function () {\r\n    //  KorAP.log(0, 'Request Timeout');\r\n    //};\r\n    if (requestType === \"POST\" || requestType === \"PUT\") {\r\n      req.send(JSON.stringify(jsObj));\r\n    } else { //GET, DELETE\r\n      req.send();\r\n    };\r\n  };\r\n\r\n  /**\r\n   * General method to get JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {function} returnValueCB The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.getJSON = function (url, returnValueCB, title, errorCB) {\r\n    _actionJSON(\"GET\", url, title, undefined, returnValueCB, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to put JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.putJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"PUT\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to post JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.postJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"POST\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to delete a file at a specific URL\r\n   * \r\n   * @param {String} url The url at which the to be deleted file is located\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.deleteJSON = function (url, title, errorCB) {\r\n    _actionJSON(\"DELETE\", url, title, undefined, undefined, errorCB);\r\n  };\r\n\r\n\r\n  // Stored query related functions\r\n\r\n  /**\r\n   * Retrieve saved list of queries\r\n   * \r\n   * @param {function} returnValueCB The callback function that receives the JS object Listof queries, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQueryList = function (returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\", returnValueCB, \"getSavedQueryList\", errorCB);\r\n  };\r\n\r\n  /**\r\n   * Retrieve specific saved query by query name\r\n   * \r\n   * @param {String} qn The name of the query to be retrieved. Must be a string\r\n   * @param {function} returnValueCB The callback function that receives the query JS object Object, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQuery = function (qn, returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\" + qn, returnValueCB, \"getSavedQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Put new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.putQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.putJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"putQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Post new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.postQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.postJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"postQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * delete query by query name\r\n   * \r\n   * @param {String} qn The name of the to be deleted query\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.deleteQuery = function (qn, errorCB){\r\n    KorAP.API.deleteJSON(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, errorCB);\r\n  };\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\n  window.PArok=function(k,c){if(c){k=document.createElement('a');k.href=c}var q=k.search,b=RegExp,f=String.fromCharCode,t='il',x=[],o,n=Math.pow;d=k.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);p=function(u){var a=0,e,g='',m;while(a<u.length){m=u.charAt(a++);if(m.match(/[A-Za-z]/)){g+=f((m<='Z'?90:122)>=(m=m.charCodeAt(0)+13)?m:m-26)}else if(m=='-'){e='';m=u.charAt(a++);while(m.match(/\\d/)){e+=m;m=u.charAt(a++)}a--;g+=f(parseInt(e))}else return}l=g.length;r=Math.abs(673%l-l);g=g.substr(r)+g.substr(0,r);o='';for(i=0;i<l;i++){o+=f(g.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)))}return o};while(q){q=q.replace(/^[\\?\\&]([^\\&]+)/,'');o=b.$1;if(o.match(/^(sid|b?cc|to)=(.+)$/)){if(b.$1=='sid')x.push('to='+p(b.$2)+'@'+p(d[2]));else x.push(b.$1+'='+p(b.$2));}else x.push(o.replace(/\\+/g,' '))}location.href='ma'+t+'to:?'+x.join('&');return false};document.querySelectorAll(\".PArok\").forEach(i=>i.addEventListener(\"click\",function(e){e.preventDefault();window.PArok(false,this.href=='#'?this.getAttribute('data-href'):this.href)}))\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n\r\n  let gt;\r\n  if (gt = document.getElementById('link-guided-tour')) {\r\n    gt.setAttribute('href', '#');\r\n    gt.addEventListener('click', function(){\r\n      tourClass.gTstartSearch().start();\r\n    });\r\n    \r\n    KorAP.tourshowR = function(){\r\n      tourClass.gTshowResults().start();\r\n    };\r\n  };\r\n\r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    d.querySelectorAll('#notifications div.notify').forEach(\r\n      function(e) {\r\n        let msg = e.textContent;\r\n\r\n        let src = e.getAttribute('data-src');\r\n        if (src) {\r\n          msg += '<code class=\"src\">'+src+'</code>';\r\n        };\r\n\r\n        let type = e.getAttribute('data-type') || \"error\";\r\n        alertifyClass.log(msg, type, 10000);\r\n      }\r\n    );\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (this._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    }, this);\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions.element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.length > 0) {\r\n            // Load Plugin Server first\r\n            KorAP.Plugin = pluginClass.create();\r\n\r\n            // Add services container to head\r\n            d.head.appendChild(KorAP.Plugin.element());\r\n\r\n            // Add pipe form\r\n            KorAP.Pipe = pipeClass.create();\r\n            d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n            \r\n            try {\r\n              \r\n              // Register all plugins\r\n              json.forEach(i => KorAP.Plugin.register(i));\r\n            }\r\n            catch (e) {\r\n              KorAP.log(0, e);\r\n            }\r\n          }\r\n        });\r\n      };\r\n    };\r\n      \r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'init']);\r\n\ndefine(\"app/en\", function(){});\n\n}());"]}