{"version":3,"sources":["kendo.ui.core.js"],"names":["f","define","$","window","undefined","Class","compilePart","part","stringPart","split","join","replace","first","charAt","rest","substring","pad","number","digits","end","length","zeros","getShadows","element","shadow","css","kendo","support","transitions","radius","match","boxShadowRegExp","blur","math","max","left","right","bottom","wrap","autosize","percentage","width","height","percentWidth","percentHeight","forceWidth","browser","outerWidth","_outerWidth","outerHeight","_outerHeight","parent","windowOuterWidth","removeClass","hasClass","wrapResize","style","percentRegExp","test","is","addClass","boxSizing","mozBoxSizing","webkitBoxSizing","msie","floor","version","zoom","children","wrapper","wrapperStyle","display","position","deepExtend","destination","i","arguments","deepExtendOne","source","property","propValue","propType","propInit","destProp","ObservableArray","data","LazyObservableArray","DataSource","HierarchicalDataSource","OBJECT","constructor","Array","RegExp","isFunction","ArrayBuffer","UNDEFINED","Date","getTime","clone","testRx","agent","rxs","dflt","rx","hasOwnProperty","toHyphens","str","g","toLowerCase","toCamelCase","strMatch","g1","toUpperCase","getComputedStyles","properties","computedStyle","styles","document","defaultView","getComputedStyle","each","idx","value","getPropertyValue","currentStyle","size","isScrollable","className","indexOf","overflow","scrollLeft","isRtl","webkit","mozila","mozilla","el","scrollWidth","clientWidth","Math","abs","obj","key","result","getOffset","type","positioned","offset","sign","top","pointers","msPointers","pageYOffset","documentElement","scrollTop","pageXOffset","parseEffects","input","effects","this","fx","Element","prepareAnimationOptions","options","duration","reverse","complete","STRING","BOOLEAN","extend","init","noop","teardown","hide","completeCallback","animate","instance","queue","promise","toggleClass","classes","add","htmlEncode","ampRegExp","ltRegExp","gtRegExp","quoteRegExp","aposRegExp","unescape","template","decodeURIComponent","error","_","m1","m2","String","fromCharCode","parseInt","parseOption","option","dashRegExp","getAttribute","ns","numberRegExp","parseFloat","jsonRegExp","jsonFormatRegExp","Function","parseOptions","role","templateRegExp","html","containmentComparer","a","b","contains","resizableWidget","widget","inArray","attr","focusable","isTabIndexNotNaN","nodeName","disabled","href","visible","expr","pseudos","parents","addBack","filter","kendoJQuery","selector","context","fn","Template","preventDefault","isDefaultPrevented","Observable","argumentNameRegExp","encodeRegExp","escapedCurlyRegExp","curlyRegExp","escapedSharpRegExp","sharpRegExp","directions","eventTarget","wrapExpression","localUrlRe","Widget","DataBoundWidget","ContainerNullObject","MobileWidget","MOUSE_EVENTS","EXCLUDE_BUST_CLICK_SELECTOR","MouseEventNormalizer","eventMap","getEventMap","eventRegEx","on","rootjQuery","animationFrame","animationQueue","cultures","isArray","proxy","JSON","formatRegExp","FUNCTION","NUMBER","NULL","getterCache","setterCache","slice","noDepricateExtend","src","copyIsArray","copy","name","target","deep","jQuery","isPlainObject","proto","member","base","that","subclass","apply","prototype","Object","_initOptions","_defaultPrevented","_events","bind","eventName","handlers","one","original","handler","events","eventNames","handlersIsFunction","unbind","push","unshift","trigger","e","sender","call","splice","paramName","useWithBlock","render","compile","parts","settings","argumentName","functionBody","_slotCount","Error","format","quote","string","escapable","lastIndex","c","meta","charCodeAt","toString","holder","k","v","partial","mind","gap","toJSON","rep","isFinite","indent","\b","\t","\n","\f","\r","\"","\\","valueOf","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","Number","Boolean","stringify","replacer","space","","findCulture","culture","numberFormat","getCulture","current","formatDate","date","calendar","calendars","standard","days","months","patterns","dateFormatRegExp","minutes","getDate","namesAbbr","getDay","names","getMonth","getFullYear","getHours","getMinutes","getSeconds","getMilliseconds","AM","PM","getTimezoneOffset","formatNumber","decimal","precision","pattern","literals","symbol","isCurrency","isPercent","customPrecision","formatAndPrecision","negative","integer","fraction","integerLength","fractionLength","replacement","ch","hasGroup","hasNegativeFormat","decimalIndex","sharpIndex","zeroIndex","hasZero","hasSharp","percentIndex","currencyIndex","startZeroIndex","start","exp","rounded","POINT","decimals","EMPTY","toLocaleString","standardFormatRegExp","exec","currency","percent","toExponential","round","groupInteger","literalRegExp","quoteChar","literal","PLACEHOLDER","SHARP","ZERO","COMMA","commaRegExp","lastIndexOf","EN","objectToString",",",".","groupSize","abbr","namesShort","d","D","F","G","m","M","s","t","T","u","y","Y","/",":","firstDay","twoDigitYearMax","cultureName","newGroupSize","groupSizes","shift","toFixed","min","fmt","values","index","placeholderFormat","_extractFormat","_activeElement","activeElement","_round","includeMargin","outOfRange","designatorPredicate","designator","mapDesignators","designators","map","adjustDST","hours","setHours","lowerArray","array","lowerLocalInfo","localInfo","newLocalInfo","parseExact","strict","count","pmHour","UTC","matches","amDesignators","pmDesignators","hoursOffset","minutesOffset","hasTime","lookAhead","getNumber","rg","substr","valueIdx","getIndexByName","lower","nameLength","subValue","matchLength","matchIdx","checkLiteral","year","month","day","seconds","milliseconds","defaultYear","_lowerDays","_lowerMonths","longTimeZoneRegExp","shortTimeZoneRegExp","isNaN","setFullYear","parseMicrosoftFormatOffset","getDefaultFormats","cultureFormats","formatIdx","FORMATS_SEQUENCE","STANDARD_FORMATS","formats","concat","internalParseDate","tzoffset","dateRegExp","offsetRegExp","timezone","convert","nonBreakingSpaceRegExp","exponentRegExp","2","3","4","parseDate","parseExactDate","percentSymbol","table","docStyle","transforms","elementProto","mobileOS","documentMode","chrome","mobileChrome","safari","_scrollbar","scrollbar","refresh","div","createElement","cssText","innerHTML","body","appendChild","offsetWidth","removeChild","closest","tbodyInnerHtml","touch","HTMLElement","hasHW3D","WebKitCSSMatrix","cssFlexbox","lowPrefix","prefix","hasTransitions","event","devicePixelRatio","screenWidth","screen","availWidth","innerWidth","screenHeight","availHeight","innerHeight","detectOS","ua","minorVersion","os","notAndroidPhone","agentRxs","wp","fire","android","iphone","ipad","meego","webos","blackberry","playbook","windows","tizen","sailfish","ffos","osRxs","ios","flat","formFactorRxs","tablet","browserRxs","omini","omobile","firefox","mobilesafari","ie","navigator","device","majorVersion","flatVersion","cordova","PhoneGap","appMode","standalone","location","protocol","userAgent","wpDevicePixelRatio","hasNativeScrolling","delayedClick","mouseAndTouchPresent","detectBrowser","edge","opera","detectClipboardAccess","commands","queryCommandSupported","cut","paste","clipboard","zoomLevel","ie11WidthCorrection","docEl","scrollHeight","clientHeight","cssBorderSpacing","borderSpacing","cssClass","docElement","eventCapture","addEventListener","placeholder","propertyChangeEvent","types","setAttribute","cssFloat","stableSort","threshold","sorted","field","sort","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","nodeList","querySelectorAll","parentNode","matchMedia","pushState","history","hashChange","customElements","crios","MSPointerEvent","PointerEvent","kineticScrollNeeded","down","up","in","out","enabled","dequeue","disable","promiseShim","enable","animatedPromise","kendoStop","clearQueue","gotoEnd","stop","kendoAnimate","kendoAddClass","kendoRemoveClass","kendoToggleClass","toggle","touches","originalEvent","changedTouches","elementFromPoint","clientX","clientY","callback","mousedown","mouseup","mousemove","mousecancel","click","resize","members","widgets","_widgetRegisteredCallbacks","ui","mobile","dataviz","drawing","spreadsheet","messages","keys","INSERT","DELETE","BACKSPACE","TAB","ENTER","ESC","LEFT","UP","RIGHT","DOWN","END","HOME","SPACEBAR","PAGEUP","PAGEDOWN","F2","F10","F12","NUMPAD_PLUS","NUMPAD_MINUS","NUMPAD_DOT","isLocalUrl","url","expression","safe","getter","setter","accessor","get","set","guid","random","id","roleSelector","directiveSelector","directives","selectors","triggeredByInput","tagName","onWidgetRegistered","len","logToConsole","message","console","suppressLog","log","dataSource","angular","defaults","_hasBindingTarget","kendoBindingTarget","_tabindex","TABINDEX","tabindex","removeAttr","setOptions","_setEvents","force","getSize","currentSize","_size","_resize","dimensions","setSize","destroy","removeData","_destroy","_muteAngularRebind","_muteRebind","dataItems","flatView","_angularItems","cmd","elements","items","dataItem","domElement","offsetHeight","notify","initWidget","roles","fullPath","widgetKeyRegExp","widgetKey","nodeType","isEmptyObject","rolesFromNamespaces","namespaces","find","widgetsArray","makeArray","widgetInstance","progress","container","leftRight","webkitCorrection","containerScrollLeft","mask","opacity","loading","prependTo","remove","plugin","register","widgetEntry","args","method","nullObject","autoApplyNS","kendoDestroy","view","viewElement","viewHasNativeScrolling","useNativeScrolling","eq","appLevelNativeScrolling","application","themes","views","touchScroller","useNative","Scroller","kendoMobileScroller","suites","editorToolbar","elementData","onResize","setTimeout","unbindResize","off","attrValue","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","kendoFocusable","setupMouseMute","mouseTrap","bustClick","captureMouse","stopPropagation","muteMouse","clearTimeout","mouseTrapTimeoutID","unMuteMouse","move","cancel","MSPointerEnter","MSPointerLeave","orig","fix","special","delegateType","bindType","handle","ret","related","relatedTarget","handleObj","origType","applyEventMap","keyDownHandler","kendoKeydown","preventKendoKeydown","keyDownCallBack","pop","search","touchstart","touchend","ruleToDate","rule","targetDay","ourDay","time","cache","getUTCDay","setUTCDate","findRule","utcTime","rules","zone","grep","from","to","findZone","zones","until","zoneRules","zoneAndRule","info","fromOffset","toOffset","diff","fromLocalOffset","toLocalOffset","tempToOffset","toLocalDate","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","Sun","Mon","Tue","Wed","Thu","Fri","Sat","setDayOfWeek","dir","setDate","dayOfWeek","firstDayOfMonth","lastDayOfMonth","last","timeOffset","moveDateToWeekStart","weekStartDay","addDays","calcWeekInYear","firstWeekInYear","newDate","diffInMS","MS_PER_DAY","weekInYear","prevWeekDate","nextWeekDate","weekNumber","toUtcTime","toInvariantTime","isInTimeRange","msValue","msMin","msMax","isInDateRange","setTime","ignoreDST","difference","MS_PER_MINUTE","today","isToday","staticDate","nextDay","previousDay","MS_PER_HOUR","stripWhitespace","iterator","child","createNodeIterator","NodeFilter","SHOW_TEXT","node","FILTER_ACCEPT","FILTER_REJECT","nextNode","referenceNode","textContent","trim","childNodes","nodeValue","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","queueAnimation","runNextAnimation","parseQueryStringParams","queryString","params","paramParts","elementUnderCursor","x","client","wheelDeltaY","jQueryEvent","delta","deltaY","wheelDelta","detail","axis","VERTICAL_AXIS","throttle","delay","timeout","throttled","lastExecTime","elapsed","caret","rangeElement","rangeDuplicated","selectionStart","selectionEnd","isPosition","focus","setSelectionRange","selection","createTextRange","collapse","moveStart","moveEnd","select","duplicate","moveToBookmark","createRange","getBookmark","setEndPoint","text","compileMobileDirective","scope","injector","invoke","$compile","$$phase","$digest","antiForgeryTokens","tokens","csrf_token","csrf_param","cycleForm","form","firstElement","lastElement","keyCode","shiftKey","focusElement","scrollTopPositions","scrollableParents","parentsUntil","setActive","focusNextElement","focussable","nextElement","matchesMedia","mediaQuery","media","_bootstrapToMedia","bootstrapMedia","xs","sm","md","lg","xl","fileGroupMap","audio","video","image","txt","presentation","programming","pdf","config","zip","disc-image","getFileGroup","extension","withPrefix","extensions","fileTypeMap","groups","getFileSizeMessage","sizes","pow","postToProxy","dataURI","fileName","proxyURL","proxyTarget","action","contentType","base64","appendTo","submit","saveAsBlob","blob","atob","Uint8Array","Blob","buffer","msSaveBlob","saveAsDataURI","URL","createObjectURL","fileSaver","download","createEvent","initMouseEvent","dispatchEvent","revokeObjectURL","downloadAttribute","saveAs","save","forceProxy","proxyModelSetters","observable","forEach","defineProperty","dirty","setDefaults","path","curr","amd","a1","a2","a3","absoluteURL","pathPrefix","regEx","host","hashDelimiter","bang","locationHash","stripRoot","root","fixHash","fixBang","CHANGE","BACK","SAME","CHECK_URL_INTERVAL","BROKEN_BACK_NAV","hashStrip","HistoryAdapter","back","forward","replaceLocation","PushStateAdapter","navigate","title","replaceState","normalize","pathname","change","normalizeCurrent","fixedUrl","hash","hashBang","HashAdapter","_id","_interval","setInterval","clearInterval","History","_started","adapter","createAdapter","historyLength","locations","silent","_navigate","backCalled","decode","_checkUrl","newLength","navigatingInExisting","prev","backButtonPressed","namedParamReplace","optional","routeToRegExp","route","ignoreCase","escapeRegExp","optionalParam","namedParam","splatParam","stripUrl","INIT","ROUTE_MISSING","Route","_callback","queryStringParams","_back","worksWith","Router","routes","_urlChangedProxy","_sameProxy","_backProxy","initEventObject","sameProxy","_same","backProxy","urlChangedProxy","_urlChanged","same","touchDelta","touch1","touch2","x1","y1","x2","y2","dx","dy","center","distance","sqrt","getTouches","currentTarget","api","identifier","pointerId","withEachUpEvent","downEvents","now","OS","invalidZeroEvents","DEFAULT_MIN_HOLD","CLICK_DELAY","DEFAULT_THRESHOLD","PRESS","HOLD","SELECT","START","MOVE","CANCEL","TAP","DOUBLETAP","RELEASE","GESTURESTART","GESTURECHANGE","GESTUREEND","GESTURETAP","THRESHOLD","mouse","pointer","ENABLE_GLOBAL_SURFACE","TouchAxis","_updateLocationData","startLocation","velocity","timeStamp","timeDelta","initialDelta","Touch","userEvents","touchInfo","useClickAsTap","initialTouch","pressEvent","_clicks","supportDoubleTap","_moved","_finished","press","_holdTimeout","minHold","_trigger","_tap","_clickTimeout","_hold","preventMove","_shouldNotMove","_withinIgnoreThreshold","UserEvents","dispose","_start","endTime","activeTouches","skip","isMoved","startTime","xDelta","yDelta","defaultAction","surfaceElement","preventIfMovingProxy","_maxTouches","multiTouch","allowSelection","captureUpIfMoved","fastTap","eventNS","surface","global","ownerDocument","pressed","touchAction","preventDragEvent","preventIfMoving","_isMoved","_destroyed","removeEventListener","_disposeAll","capture","_isMultiTouch","_apiCall","_maxTouchesReached","_select","which","_move","_eachTouch","_end","_click","pageX","pageY","methodName","matchingTouch","dict","defaultThreshold","MAX_DOUBLE_TAP_DISTANCE","eventProxy","_triggerTouch","gestureEventProxy","hold","tap","gesturestart","gesturechange","gestureend","enableSwipe","minXDelta","maxYDelta","maxDuration","doubleTapTimeout","lastTap","_dragstart","_swipestart","_swipemove","direction","toOdataFilter","useOdataFour","operator","logic","filters","odataFilters","odataFiltersVersionFour","stripMetadata","hex16","createBoundary","createDelimeter","boundary","close","NEWLINE","createCommand","transport","item","httpVerb","command","transportUrl","commandPrefix","getOperationHeader","changeset","changeId","header","getOperationContent","content","DOUBLELINE","getOperations","collection","skipContent","requestBody","processCollection","colection","getBoundary","createBatchRequest","colections","batchURL","batch","headers","Content-Type","updated","destroyed","created","parseBatchResponse","responseText","changeBody","status","code","marker","jsonModel","responseMarkers","markerIndex","collections","models","passed","parse","neq","gt","gte","lt","lte","doesnotcontain","endswith","startswith","isnull","isnotnull","isnullorempty","isnotnullorempty","isempty","isnotempty","mappers","pageSize","page","useVersionFour","$filter","orderby","order","$orderby","$skip","take","$top","defaultDataType","read","dataType","schemas","odata","results","total","transports","jsonp","update","create","parameterMap","$inlinecount","$format","odata-v4","$count","ajax","success","response","responses","XmlDataReader","idField","xmlParse","model","errors","serialize","modelBase","Model","fields","xpathToMember","modelInstance","evaluate","record","_parse","xml","parseDOM","parsedNode","attribute","attributes","attributeCount","firstChild","nextSibling","intermediateResult","tree","parseXML","raw","readers","eventHandler","_notifyChange","equal","xtype","ytype","getFieldByName","fieldName","Query","normalizeSort","descriptor","descriptors","sortFields","sorts","sortObject","normalizeOperator","operatorMap","normalizeFilter","compareDescriptor","f1","f2","normalizeDescriptor","fieldComparer","compareFilters","expr1","expr2","filters1","filters2","normalizeAggregate","expressions","normalizeGroup","compare","skipItemSorting","aggregates","normalizeGroupWithoutCompare","anyGroupDescriptorHasCompare","groupDescriptors","groupValueComparer","calculateAggregate","accumulator","state","aggr","functionName","aggregate","functions","isNumber","val","isDate","serializeRecords","getters","originalFieldNames","fieldNames","originalName","setters","convertRecords","convertGroup","hasSubgroups","wrapDataAccess","originalFunction","converter","wrapDataAccessBase","fillLastGroup","originalGroup","newGroup","currOriginal","currentNew","mergeGroups","dest","group","flatGroups","indexFunction","groupIndex","itemIndex","groupsLength","indexFn","flattenGroups","at","wrapGroupItems","eachGroupItems","func","replaceInRanges","ranges","replaceInRange","replaceWithObservable","serverGrouping","viewIndex","removeModel","uid","indexOfPristineModel","_defaultId","indexOfModel","comparer","fieldNameFromModel","convertFilterDescriptorsField","convertDescriptorsField","inferSelect","firstField","secondField","optgroup","label","specified","inferTable","fieldIndex","cells","cell","empty","tbody","tBodies","rows","fieldCount","dataMethod","_data","_attachBubbleHandlers","inferList","list","textChild","textField","urlField","spriteCssClassField","imageUrlField","_loaded","prop","hasChildren","ObservableObject","parsers","defaultValues","Comparer","StableComparer","operators","LocalTransport","RemoteTransport","Cache","DataReader","Transport","Node","Buffer","BatchBuffer","ASCENDING","CREATE","READ","UPDATE","DESTROY","SYNC","GET","ERROR","REQUESTSTART","PROGRESS","REQUESTEND","crud","identity","o","wrapAll","serializeFunctions","json","object","howMany","thisArg","reduce","reduceRight","every","some","Symbol","_parent","_handlers","shouldSerialize","_set","paths","composite","isSetPrevented","isObservableArray","isDataSource","boolean","default","_initializers","dirtyFields","editable","accept","isNew","functionFields","nullable","defaultValue","localeCompare","combine","comparers","asc","valueA","valueB","__position","desc","textOp","impl","ignore","accentFoldingFiltering","toLocaleLowerCase","op","getMatchRegexp","esc","doesnotstartwith","n","doesnotendwith","doesnotmatch","filterExpr","and","or","fieldFunctions","operatorFunctions","==","equals","isequalto","equalto","!=","ne","notequals","isnotequalto","notequalto","notequal","<","islessthan","lessthan","less","<=","le","islessthanorequalto","lessthanequal",">","isgreaterthan","greaterthan","greater",">=","isgreaterthanorequalto","greaterthanequal","ge","notsubstringof","toArray","range","inPlace","orderBy","orderByDescending","compiled","predicate","allData","groupBy","groupValue","currentValue","_sortForGrouping","_sortGroups","sum","average","process","customGroupSort","query","groupDescriptorsWithoutCompare","normalizedSort","groupDescriptorsWithoutSort","filterCallback","groupDescriptor","setup","parameters","operation","_store","clear","store","inmemory","schema","dataFunction","groupsFunction","serializeFunction","serializeGetters","_dataAccessFunction","fromName","_wrapDataAccessBase","_map","_prefetch","_pristineData","_ranges","_view","_pristineTotal","_pageSize","_page","_sort","_filter","_group","_aggregate","_total","_shouldDetachObservableParents","pushCreate","_pushCreate","pushUpdate","_pushUpdate","pushDestroy","_pushDestroy","offlineStorage","_storage","getItem","localStorage","setItem","reader","_detachObservableParents","_observe","_online","serverSorting","serverPaging","serverFiltering","serverAggregates","inPlaceSort","online","sync","Deferred","resolve","offlineData","_isServerGrouped","_push","_readData","_flatData","useRanges","getByUid","_getByUid","_storeData","_addRange","_process","_observeView","insert","_createNewModel","_wrapInEmptyGroup","_insertModelInRange","pushInsert","pushed","autoSync","pristine","rangeSpan","_getCurrentRangeSpan","pristineData","_updatePristineForModel","_removeItems","removePristine","shouldRemovePristine","found","_eachItem","_removePristineForModel","hasGroups","_removeModelFromRanges","promises","_sendSubmit","_send","when","then","_accept","_syncEnd","_change","cancelChanges","_cancelModel","_changesCanceled","_markOfflineUpdatesAsDirty","__state__","hasChanges","serverGroup","_handleCustomErrors","_executeOnPristineForModel","_eachPristineItem","_pristineForModel","_modelCanceled","_submit","reject","deferred","_promise","converted","_params","_queueRequest","isPrevented","_dequeueRequest","_readAggregates","replaceSubset","itemIds","j","_aggregateResult","_skip","endless","_changeHandler","updatePristine","timestamp","_timeStamp","_sortRanges","xhr","errorThrown","_requestInProgress","_pending","_shouldWrap","arrayType","_updateTotalForAction","_calculateAggregates","_take","currentRangeStart","_clearEmptyGroups","_queryProcess","dataToAggregate","_setFilterTotal","_mergeState","_currentRangeStart","_sortFields","moreItemsCount","remote","filterTotal","setDefaultValue","fetch","_query","done","next","totalPages","_pageableQueryOptions","_emptyAggregates","ceil","inRange","_findRange","lastRange","firstItemUid","enableRequestsInProgress","_skipRequestsInProgress","_currentRequestTimeStamp","pageSkip","_processRangeData","_rangeExists","prefetch","skipIdx","takeIdx","startIndex","endIndex","rangeData","rangeEnd","processed","flatData","_mergeGroups","prevGroup","temp","paging","sorting","filtering","_prefetchSuccessHandler","_timeout","_multiplePrefetch","_removeModelFromRange","_updateRangesLength","rangesLength","mismatchFound","mismatchLength","lengthDifference","transportOptions","hasChildrenObject","childrenField","childrenOptions","_childrenOptions","_initChildren","_updateChildrenField","append","loaded","level","_childrenLoaded","load","_matchFilter","_hierarchicalFilter","_markHierarchicalQuery","_updateHierarchicalFilter","_find","_dataSource","viewSize","disablePrefetch","_prefetching","_reset","_syncWithDataSource","setViewSize","_recalculate","itemPresent","dataOffset","prefetchThreshold","midPageThreshold","nextMidRange","nextPageThreshold","nextFullRange","pullBackThreshold","previousMidRange","previousFullRange","_goToRange","nextRange","syncDataSource","prefetchOffset","expanding","_expanding","_syncPending","_firstItemUid","batchSize","batchBuffer","endreached","prefetching","prefetched","reset","dataSourceBinding","bindingName","Binder","bindings","_dataBinding","dataBinding","_dataBound","dataBound","_itemChange","itemChange","bindElement","_ns","_parents","removedItems","unbindElementTree","all","addedItems","hds","addedDataItems","multiselect","dropdowntree","Select","MultiSelect","DropDownTree","treeview","retrievePrimitiveValues","dataValueField","bindingTargetForRole","WidgetBindingTarget","parseBindings","token","colonIndex","keyValueRegExp","createBindings","binding","childrenCopy","unbindElement","whiteSpaceRegExp","valueField","valueUpdate","valuePrimitive","autoBind","BindingTarget","Binding","TemplateBinding","EventBinding","dom","destroyWidget","bindingTarget","deleteExpando","removeAttribute","destroyWidgets","unbindElementChildren","namespace","TypedBinder","arraySplice","binders","VALUE","SOURCE","EVENTS","CHECKED","CSS","dependencies","_access","dependency","currentSource","parsedValue","_parseValue","readonly","dataFormat","invisible","_initChange","cloneNode","reference","insertBefore","checked","selectedIndex","selected","valueIndex","sourceValue","optionIndex","optionValue","check","_range","_valueIsObservableObject","_valueIsObservableArray","_source","valueLength","sourceItem","dataTextField","isObservableObject","cascadeFrom","listView","bound","_preselect","old","removeIndex","newValue","oldValues","selectedNode","nonPrimitiveValues","_isMultipleSelection","_getAllChecked","newValues","selectedValue","gantt","_isBound","scheduler","grid","arr","addLength","oldLength","shifted","shiftedLength","toDestroy","hasValue","hasSource","hasEvents","hasChecked","hasCss","widgetBinding","specificBinders","applyBinding","binder","observableHierarchy","recursiveRead","parseInteger","parseCSS","propertyName","acc","strip3DTransforms","transformProps","transform2d","normalizeCSS","lowerKey","isTransformed","transformation","cssValues","TRANSFORM","animationProperty","transform","computed","NONE","matrix3dRegExp","translateXRegExp","atan2","capitalize","word","createEffect","definition","effectClass","Effect","opt1","opt2","opt3","theDirection","createToggleEffect","defaultStart","defaultEnd","IN_OUT","startValue","_startValue","endValue","_endValue","shouldHide","_shouldHide","prepare","_direction","startDataValue","startDataValueIsSet","_reverse","clipInHalf","vertical","HEIGHT","WIDTH","CLIPS","curProxy","EffectSet","FOUR_DIRECTIONS","TRANSFER_START_STATE","ROTATIONS","RESTORE_OVERFLOW","IGNORE_TRANSITION_EVENT_SELECTOR","Animation","Transition","scaleProperties","scale","scalex","scaley","scale3d","translateProperties","translate","translatex","translatey","translate3d","hasZoom","cssParamsRegExp","oldEffectsRegExp","singleEffectRegExp","unitRegExp","transform2units","rotate","skew","cssPrefix","BLANK","PX","AUTO","HIDDEN","ORIGIN","ABORT_ID","OVERFLOW","TRANSLATE","POSITION","COMPLETE_CALLBACK","TRANSITION","BACKFACE","PERSPECTIVE","DEFAULT_PERSPECTIVE","TRANSFORM_PERSPECTIVE","transition","modifier","horizontal","stopQueue","transformValue","step","elem","cur","exclusive","ease","mirror","redirectedEffect","resolved","$1","$2","effect","effectBody","timeoutID","stopTransitionCalled","stopTransition","oldKeys","speeds","merge","uniqueSort","unique","taskKeys","retainPosition","restore","run","jdx","childrenLength","effectName","setReverse","addRestoreProperties","restoreCallback","effectSet","parsedEffects","useTransition","show","multiple","single","isFixed","originalPosition","dX","dY","marginLeft","marginTop","_additionalEffects","play","additional","_duration","compositeRun","_complete","divisor","tmp","previous","previousDivisor","slideIn","margin","origin","setLength","realLength","outerBox","box","innerBox","currentScale","fillScale","transformOrigin","_container","rotation","zIndex","_clipInHalf","clip","face","_face","temporary","reverseDirection","faceClone","backClone","staticPage","turningPage","transformStyle","_before","_after","transitionClass","_previous","_transitionClass","beforeTransition","afterTransition","_both","_element","_containerClass","containerClass","completeProxy","isAbsolute","originalOverflow","both","_tickProxy","_tick","tick","onEnd","onCancel","timePassed","startDate","moveTo","movable","initial","_easeProxy","moveAxis","easeOutExpo","easeOutBack","inner","outer","fitScale","parseTransition","transitionRegExp","SCRIPT","TRANSITION_START","TRANSITION_END","SHOW","HIDE","ATTACH","DETACH","sizzleErrorRegExp","bodyRegExp","LOAD_START","LOAD_COMPLETE","SHOW_START","SAME_VIEW_REQUESTED","VIEW_SHOW","VIEW_TYPE_DETERMINED","AFTER","classNames","stretchedView","footer","View","renderOnInit","_createElement","wrapInSections","_renderSections","_wrap","_evalTemplate","evalTemplate","_fragments","detachOnHide","detachOnDestroy","notInitialized","_eachFragment","ViewClone","triggerBeforeShow","triggerBeforeHide","showStart","showEnd","hideEnd","detach","purge","fragments","getElementById","contents","replaceWith","_wrapper","_createContent","_createHeader","_createFooter","ccontentElements","contentSelector","contentElement","Layout","containers","_createContainer","showIn","ViewContainer","Fragment","attach","running","after","locationID","previousEntry","theTransition","transitionData","ViewEngine","sandbox","_hideViews","rootView","layouts","viewContainer","showView","remoteViewURLPrefix","_findViewElement","reload","_createView","urlPath","wrapInner","_locate","$angular","_findViewElementById","_createSpaView","_createMobileView","defaultTransition","loader","getLayout","getLayoutProxy","modelScope","viewOptions","isJQueryPromise","fail","isNativePromise","hub","signalr","callbacks","_crud","server","resolveRules","resolvers","validator","ruleResolvers","numberOfDecimalDigits","parseHtml","parseHTML","searchForMessageContainer","invalidMsgRegExp","SUMMARYTEMPLATE","Validator","NS","INVALIDMSG","INVALIDINPUT","VALIDINPUT","VALIDATIONSUMMARY","MESSAGEBOX","emailRegExp","urlRegExp","INPUTSELECTOR","CHECKBOXSELECTOR","NUMBERINPUTSELECTOR","BLUR","NAME","FORM","NOVALIDATE","VALIDATE","VALIDATE_INPUT","patternMatcher","matcher","hasAttribute","validateAttributeSelector","_errorTemplate","errorTemplate","_summaryTemplate","validationSummary","_inputSelector","_checkboxSelector","_errors","_attachEvents","_isValidated","required","email","dateCompare","checkbox","raise","validateOnBlur","validate","stopImmediatePropagation","_checkElement","validateInput","inputs","invalid","isValid","showValidationSummary","valid","lbl","messageText","messageLabel","wasValid","lblId","parentElement","inputWrap","_checkValidity","_findMessageContainer","_extractMessage","_decorateMessageContainer","insertAfter","_inputWrapper","hideMessages","locators","messageLocators","getElementsByTagName","locate","decorate","ruleKey","nonDefaultMessage","customMessage","currentOptions","_getInputNames","_errorsByName","inputNames","_renderSummary","prevElement","_summaryClick","nextFocusable","kendoInstance","link","errorsList","summary","hideValidationSummary","numericCssPropery","within","containerBoundaries","minX","minY","maxX","maxY","checkTarget","targets","areas","theTarget","theFilter","targetLen","areaLen","targetElement","destroyDroppable","groupName","droppables","scrollableViewPort","scrollableRoot","$window","findScrollableParent","autoScrollVelocity","mouseX","mouseY","rect","AUTO_SCROLL_AREA","lastDropTarget","Movable","DropTarget","DropTargetArea","Draggable","draggables","dropTargets","dropAreas","KEYUP","DRAGSTART","DRAG","DRAGEND","DRAGCANCEL","HINTDESTROYED","DRAGENTER","DRAGLEAVE","DROP","TapCapture","_press","_release","attachEvent","captureNext","cancelCapture","PaneDimension","forcedEnabled","measure","scrollSize","makeVirtual","virtual","_virtualMin","_virtualMax","virtualSize","outOfBounds","forceEnabled","getTotal","rescale","scaledTotal","minScale","centerOffset","PaneDimensions","forcedMinScale","maxScale","newScale","centerCoordinates","PaneAxis","dimension","dragMove","resistance","translateAxis","Pane","elastic","gesture","coordinates","offsetX","offsetY","previousGesture","previousCenter","scaleDelta","scaleWith","TRANSFORM_STYLE","webkitTransformOrigin","_saveCoordinates","by","scaleTo","newCoordinates","draggable","dropTarget","_over","_out","_drop","dropped","destroyGroup","_cache","_activated","_drag","_cancel","_afterEndHandler","_afterEnd","_captureEscape","cursorOffset","holdToDrag","autoScroll","cancelHold","_updateHint","boundaries","hintOffset","hint","_shouldIgnoreTarget","ignoreSelector","currentTargetOffset","scopeTarget","scopeFrom","cursorElement","_elementUnderCursor","_cursorElement","_scrollableParent","_lastEvent","_processMovement","_scrollCompenstation","_scrollVelocity","_scrollInterval","_withDropTarget","_autoScroll","yIsScrollable","xIsScrollable","isRootNode","yInBounds","xInBounds","compensation","initialTarget","utils","SNAPBACK_DURATION","SCROLLBAR_OPACITY","FRICTION","VELOCITY_MULTIPLIER","MAX_VELOCITY","OUT_OF_BOUNDS_FRICTION","ANIMATED_SCROLLER_PRECISION","RELEASECLASS","REFRESHCLASS","PULL","RESIZE","SCROLL","MOUSE_WHEEL_ID","ZoomSnapBack","tapCapture","DragInertia","freeze","_moveTo","paneAxis","_snapBack","velocityMultiplier","friction","snapBack","AnimatedScroller","_updateCoordinates","setCoordinates","setCallback","ScrollBar","elementSize","scrollMovable","alwaysVisible","paneSize","sizeRatio","visibility","avoidScrolling","pane","zoomSnapBack","animatedScroller","_native","prepend","scrollElement","fixedContainer","velocityX","velocityY","horizontalSwipe","originatedFromFixedContainer","verticalSwipe","scrollTo","mousewheelScrolling","pulled","_initAxis","_wheelEnd","_wheel","_wheelY","pullToRefresh","_initPullToRefresh","_wheelScroll","ctrlKey","_wheelTimeout","pullOffset","visibleScrollHints","pullTemplate","releaseTemplate","refreshTemplate","contentResized","_scale","zoomOut","animatedScrollTo","pullHandled","refreshHint","hintContainer","yinertia","xinertia","_paneChange","_dragEnd","scrollBar","HORIZONTAL","VERTICAL","RESIZEEND","Resizable","orientation","_positionMouse","_position","_sizingDom","draggableElement","drag","dragcancel","dragstart","dragend","_stop","_max","hintSize","_initialElementPosition","_min","_initialMousePosition","_maxPosition","_minPosition","maxPosition","minPosition","currentPosition","invalidClass","resizing","targetPosition","containsOrEqualTo","defaultHint","defaultPlaceholder","BEFORE_MOVE","ACTION_SORT","ACTION_REMOVE","ACTION_RECEIVE","DEFAULT_FILTER","MISSING_INDEX","Sortable","_createDraggable","connectWith","cursor","moveOnDragEnter","_dragcancel","_dragend","draggedElement","_placeholder","draggableEvent","before","_setCursor","_resetCursor","targetCenter","offsetDelta","sibling","getSibling","_findTarget","axisDelta","eventData","_movementByAxis","_getElementCenter","appendToBottom","_movePlaceholder","appendAfterHidden","_isFloating","connectedList","connectedListEventData","draggedIndex","placeholderIndex","oldIndex","newIndex","getKendoSortable","_findElementUnderCursor","has","sortable","_isEmpty","_isLastHidden","_searchConnectedTargets","sortableInstance","connected","_isCursorAfterLast","lastItemOffset","lastItem","cursorPosition","_originalCursorType","_cursorStylesheet","isFloating","isTable","isHorizontalFlex","_items","not","collision","elementPosition","Selectable","ARIASELECTED","SELECTED","ACTIVE","SELECTABLE","UNSELECT","UNSELECTING","supportEventDelegation","_marquee","_lastActive","aria","inputSelectors","_isElement","metaKey","whichCode","buttonCode","button","_allowSelection","selectRange","_firstSelectee","_unselect","_notify","_downTarget","currentElement","useAllItems","_selectElement","_invalidateSelectables","toSelect","selectElement","preventNotify","resetTouchEvents","continuousItems","selectable","asLowerString","PRIMARY","SECONDARY","INFO","SUCCESS","WARNING","OUTLINE","PILL","Badge","classPerType","look","appearance","_setInitialValue","primary","warning","secondary","_value","newOptions","Button","CLICK","MOUSEDOWN","MOUSEUP","MOUSEOUT","KBUTTON","KBUTTONICON","KBUTTONICONTEXT","DISABLED","DISABLEDSTATE","FOCUSEDSTATE","SELECTEDSTATE","OVERLAY","BUTTON_DEFAULTS","icon","iconClass","spriteCssClass","imageUrl","badge","createBadge","iconElement","_focus","_blur","_keydown","_removeActive","_addActive","_isNativeButton","span","img","isEmpty","err","badgeOptions","overlay","numeric","selectOption","wrapClassName","iconTemplate","FIRST","PREV","NEXT","LAST","SIZE","KEYDOWN","MAX_VALUE","Pager","pageSizes","pageItems","sizeClassName","_createDataSource","linkTemplate","selectTemplate","currentPageTemplate","numericSelectItemTemplate","_refreshHandler","downEvent","previousNext","_numericWrap","_numericSelect","of","allPages","itemsPerPage","DropDownList","kendoDropDownList","_refreshClick","_numericSelectChange","_resizeHandler","_getWidthSizeClass","numericItemTemplate","buttonCount","responsive","morePages","setDataSource","reminder","hasAll","selectAll","selectHtml","collapsedTotal","_collapsedTotal","tabKeyTrapNS","focusableNodesSelector","TabKeyTrap","OPEN","CLOSE","DEACTIVATE","ACTIVATE","CENTER","TOP","BOTTOM","ABSOLUTE","BODY","LOCATION","VISIBLE","EFFECTS","ACTIVEBORDER","ACTIVEBORDERREGEXP","ACTIVECHILDREN","DOCUMENT_ELEMENT","WINDOW","Popup","parentPopup","collisions","anchor","_hovered","scrollArea","animation","open","_animationClose","_mousedownProxy","_mousedown","_resizeProxy","toggleTarget","toggleEvent","viewport","copyAnchorStyles","modal","adjustSize","_hideDirClass","_closing","_toggleResize","fixed","flipped","_openAnimation","_showDirClass","_location","dirClass","skipEffects","openEffects","closeEffects","popup","ev","_resizeTimeout","_scrollableParents","_fit","viewPortSize","output","_flip","anchorSize","boxSize","siblingContainer","parentZIndex","viewportOffset","viewportWidth","viewportHeight","pos","anchorParent","offsets","flipPos","elementHeight","wrapperHeight","isWindow","origins","positions","siblings","_align","offsetParent","appendToOffset","verticalOrigin","horizontalOrigin","verticalPosition","horizontalPosition","anchorOffset","anchorWidth","anchorHeight","trap","_keepInTrap","removeTrap","shouldTrap","sortedElements","_focusableElements","_sortFocusableElements","_nextFocusable","tabIndex","attrName","contentWindow","_haveSelectionRange","elementType","KNOTIFICATION","KICLOSE","KHIDING","WRAPPER","TEMPLATE","SAFE_TEMPLATE","Notification","_compileTemplates","templates","_guid","_isRtl","_compileStacking","stacking","pinned","hideOnClick","allowHideAfter","autoHideAfter","kendoTemplate","_compiled","templateId","_defaultCompiled","_safeCompiled","_getCompiled","defaultCompiled","paddings","paddingTop","paddingRight","paddingBottom","paddingLeft","horizontalAlignment","_popupOrigin","_popupPosition","_popupPaddings","_attachPopupEvents","attachClick","_hidePopup","closeIcon","attachDelay","_showPopup","openPopup","_triggerHide","deactivate","_togglePin","pin","win","_attachStaticEvents","_hideStatic","_showStatic","initializedNotifications","insertionMethod","getNotifications","defaultArgs","typeIcon","showText","openedNotifications","guidElements","restoreTitle","restoreTitleAttributeForElement","saveTitleAttributeForElement","saveTitleAttributes","DOCUMENT","ARIAIDSUFFIX","DESCRIBEDBY","CONTENTLOAD","KCONTENTFRAME","IFRAMETEMPLATE","POSITIONS","REVERSE","DIRCLASSES","DIMENSIONS","DEFAULTCONTENT","Tooltip","_documentKeyDownHandler","_documentKeyDown","_isShownOnMouseEnter","_showOn","showOn","_isShownOnClick","_mouseenter","autoHide","_mouseleave","_isShownOnFocus","showAfter","hideAfter","callout","_show","_appendContent","iframe","contentOptions","showIframe","_ajaxRequest","_initPopup","activate","ariaId","_positionCallout","_offset","arrow","_closeButtonClick","_closePopup","elementOffset","offsetAmount","isTopLeft","isFlipped","marginRule","toggleActive","STATE_ACTIVE","actionSheetWrap","preventClick","findFocusableSibling","candidate","OVERFLOW_ANCHOR","components","Item","ToolBarButton","OverflowButton","ButtonGroup","ToolBarButtonGroup","OverflowButtonGroup","ToolBarSplitButton","OverflowSplitButton","ToolBarSeparator","OverflowSeparator","ToolBarSpacer","TemplateItem","OverflowTemplateItem","Group","ToolBar","TOOLBAR","BUTTON","OVERFLOW_BUTTON","TOGGLE_BUTTON","BUTTON_GROUP","SPLIT_BUTTON","SEPARATOR","SPACER_CLASS","SPACER","POPUP","RESIZABLE_TOOLBAR","STATE_DISABLED","STATE_HIDDEN","GROUP_START","GROUP_END","ARIA_DISABLED","ARIA_PRESSED","ICON","ICON_PREFIX","BUTTON_ICON","BUTTON_ICON_TEXT","LIST_CONTAINER","SPLIT_BUTTON_ARROW","OVERFLOW_CONTAINER","FIRST_TOOLBAR_VISIBLE","LAST_TOOLBAR_VISIBLE","TOGGLE","OVERFLOW_OPEN","OVERFLOW_CLOSE","OVERFLOW_NEVER","OVERFLOW_AUTO","OVERFLOW_ALWAYS","OVERFLOW_HIDDEN","OPTION_LIST_SUFFIX","KENDO_UID_ATTR","toolbar","overflowAnchor","overflowContainer","registerComponent","addOverflowAttr","addUidAttr","addIdAttr","addOverflowIdAttr","hidden","overflowHidden","isEnabled","twin","splitContainerId","resizable","useButtonTag","togglable","addToGroup","clickHandler","toggleHandler","propagate","getParentGroup","isChild","_addGraphics","align","hasIcon","showIcon","createButtons","buttonConstructor","buttons","buttonGroup","mainButton","arrowButton","popupElement","createMenuButtons","createPopup","_navigatable","main","splitButton","kendoPopup","li","altKey","menuButtons","rootUid","adjustPopupWidth","computedWidth","fontFamily","min-width","separator","_groups","isMobile","_renderOverflow","overflowUserEvents","_toggleOverflow","_shrink","_buttonClick","release","_toggleOverflowAnchor","tool","overflowTool","component","itemClasses","overflowTemplate","_getItem","toolbarItem","overflowItem","isResizable","buttonGroupInstance","getSelectedFromGroup","horizontalDirection","isComplexTool","hasVisibleChildren","paddingEnd","splitContainer","urlTarget","isSplitButtonArrow","_toggle","lastHasFocus","firstHasFocus","isOnlyOverflowAnchor","lastItemNotOverflowAnchor","isFirstTool","prevFocusable","isOverflowAnchor","_getPrevFocusable","_preventNextFocus","_getNextElement","directionNumber","searchIndex","focusableItem","elementToFocus","prevElements","prevAll","containerWidth","_stretch","_markVisibles","_childrenWidth","childrenWidth","commandElement","visibleCommands","_hideItem","hiddenCommands","_showItem","itemOuterWidth","overflowItems","toolbarItems","visibleOverflowItems","visibleToolbarItems","unifyType","getSelectedOption","mapChangedItems","itemsToMatch","itemsLength","selectedLength","changed","unchanged","isValidFilterExpr","removeFiltersForField","STATIC_LIST_NS","StaticList","percentageUnitsRegex","ID","FOCUSED","HOVER","LOADING","GROUPHEADER","ITEMSELECTOR","LABELIDPART","CASCADE","FOCUS","FOCUSOUT","HIDDENCLASS","isIE","isIE8","quotRegExp","alternativeNames","ComboBox","MultiColumnComboBox","List","_isSelect","ul","aria-hidden","_listMousedown","columns","_columnsHeader","_header","_noData","_footer","_accessors","_initValue","footerTemplate","headerTemplate","noDataTemplate","noData","_renderFooter","_renderNoData","_focused","_editable","_angularElement","colGroup","row","currentColumn","columnsHeaderTemplate","currentWidth","currentWidthInt","widthStyle","columnsHeader","_listOptions","changeEventOption","_listChange","listBoundHandler","_listBound","_activateItem","_deactivateItem","groupTemplate","fixedGroupTemplate","_initList","listOptions","selectedItemChange","VirtualList","_setListValue","_updateSelectionState","filterInput","_isFilterEnabled","_hideClear","_clear","_showClear","_clearValue","_clearText","_accessor","_customOption","enforceMinLength","highlightFirst","_clearFilter","_filterSource","newExpression","dataSourceState","isMultiColumnFiltering","filterFields","resetPageSettings","removed","_clearFilterExpressions","_pushFilterExpression","_cascading","setDSFilter","filtersToRemove","_toggleNoData","_toggleHeader","groupHeader","_allowOpening","_old","_ignoreCase","widgetOptions","fromFilter","_buildExpression","_open","_clearButton","clearTitle","clearButton","_inputValue","_typingTimeout","minLength","_state","_emptySearch","_searchByWord","_unbindDataSource","_form","_resetHandler","selectedDataItems","_text","_aria","suggest","_ariaLabel","labelId","focusedElm","inputElm","inputId","labelElm","ariaLabel","ariaLabelledBy","_generateLabelId","_userTriggered","_oldText","_valueBeforeCascade","_oldIndex","isFiltered","_typing","typing","_enable","_dataValue","_offsetHeight","_height","offsetTop","popups","footerHeight","_openHandler","_adjustListWidth","borderLeftWidth","borderRightWidth","autoWidth","minWidth","whiteSpace","_closeHandler","_focusItem","noFocusedItem","scrollToIndex","_calculateGroupPadding","padding","_calculatePopupHeight","_calculateColumnsHeaderPadding","_refreshScroll","enableYScroll","overflowX","overflowY","_resizePopup","_popup","_makeUnselectable","_toggleHover","preventFocus","touchEnabled","MSPointers","_prevent","_triggerCascade","_cascadeTriggered","_cascadedValue","userTriggered","_triggerChange","_requestStartHandler","_requestEndHandler","_errorHandler","requireValueMapper","valueMapper","_initial","_initialIndex","_current","_parentWidget","_cascadeSelect","_cascadeValue","_accessorInput","_accessorSelect","_custom","_syncValueAndText","custom","_hideBusy","_busy","_arrowIcon","_showBusy","_request","_requestEnd","_firstItem","focusFirst","_lastItem","focusLast","_nextItem","focusNext","_prevItem","focusPrev","_getNormalizedDataItem","isIndex","hasOptionLabel","optionLabel","getElementIndex","dataItemByIndex","_getNormalizedSelectCandidate","normalizedCandidate","moveIndex","selectCandidate","activeFilter","shouldTrigger","isVirtual","_fetch","_get","_focusElement","focusout","scrollWith","_fetchData","hasItems","_options","dataText","dataValue","htmlElement","formId","_cascade","cascade","_cascadeHandlerProxy","_cascadeHandler","_cascadeFilterRequests","_selectedValue","_toggleCascadeOnFocus","valueBeforeCascade","_clearSelection","_cascadeChange","filterValue","cascadeFromParentField","cascadeFromField","currentHandler","_touchHandlers","_optionID","_selectedIndices","_dataItems","_values","_getter","_templates","_onScroll","_scrollId","_renderHeader","_fixedHeader","startY","endY","tapPosition","_touchTriggered","_triggerClick","_render","scroll","itemOffsetTop","itemOffsetHeight","contentScrollTop","contentOffsetHeight","bottomDistance","_getValues","_valueGetter","hasCandidate","focusIndex","skipUpdate","_skipUpdate","indices","filtered","singleSelection","selectedIndices","uiSelectedIndices","added","_deselectFiltered","_deselect","_valueComparer","removeAt","setValue","_valueDeferred","_valueIndices","_valueExpr","normalized","_valueType","_dataItemPosition","valueExpr","removedIndices","_template","templateText","_normalizeIndices","newIndices","_firstVisibleItem","itemHeight","lastChild","previousSibling","isGrouped","visibleItem","_renderItem","notFirstItem","hasColumns","isLastGroupedItem","_renderColumns","dataContext","_selected","_lastDSFilter","skipUpdateOnBind","isItemChange","_bound","modular","minYear","maxYear","build","weekNumberBuild","isWeekColumnVisible","cellsPerRow","perRow","otherMonth","weekNumberTemplate","cellTemplate","emptyCellTemplate","otherMonthTemplate","otherMonthCellTemplate","createDate","disableDates","OTHERMONTH","isInRange","date1","date2","year1","getToday","DATE","restrictValue","shiftArray","multiplier","daysBetweenTwoDates","endDate","fromDateUTC","endDateUTC","addDaysToArray","numberOfDays","fromDate","mousetoggle","MOUSEENTER","prevent","dateObject","getCalendarInfo","depth","extractFormat","MONTH","dates","makeUnselectable","addClassToViewContainer","currentView","isEqualDatePart","value1","value2","isEqualMonth","getDisabledExpr","createDisabledExpr","convertDatesArray","disabledDates","searchExpression","isEqualDate","oldValue","toDateObject","transitionOrigin","KEYDOWN_NS","MIN","SLIDE","CENTURY","NAVIGATE","OTHERMONTHCLASS","OUTOFRANGE","TODAY","CELLSELECTOR","CELLSELECTORVALID","WEEKCOLUMNSELECTOR","FOCUS_WITH_NS","MOUSEENTER_WITH_NS","MOUSELEAVE","PREVARROW","NEXTARROW","ARIA_SELECTED","ARIA_LABEL","decade","century","Calendar","_selectable","_viewWrapper","_focusView","focusOnNav","_cellID","_class","_selectDates","_index","_addClassProxy","_active","_cell","todayString","toDateString","_cellByDate","_removeClassProxy","selectDates","weekColumnHeader","_destroySelectable","_today","_title","_table","_bindTable","_option","navigateToPast","navigateToFuture","navigateUp","navigateDown","future","_oldTable","_changeView","_animate","_visualizeSelectedDatesInView","validSelectedDates","datesUnique","_validateValue","selectedDates","selectableOptions","_onSelect","_onRelatedTarget","eventArgs","_toggleSelection","_cellsBySelector","_addSelectedCellsToArray","_rangeSelection","currentCell","toDateCell","daysDifference","toDate","currentDateIndex","_dateInView","firstDateInView","lastDateInView","_isNavigatable","cellIndex","isDisabled","focusedDate","_keyboardToggleSelection","_nextNavigatable","_keyboardRangeSelection","navigatableDate","active","viewWrapper","_horizontal","viewWidth","float","margin-left","unwrap","_vertical","disabledDate","links","firstDayCurrentMonth","isBigger","isTodayDisabled","_todayClick","firstVisibleDay","calendarInfo","tzOffsetBefore","resultDATE","tzOffsetDiff","navigateUrl","showHeader","hasUrl","currentCalendar","firstDayIdx","shortNames","linkClass","dateString","currentDate","month1","month2","year2","setMonth","viewsEnum","approximateStringMatching","oldText","oldFormat","newText","deletedSymbol","oldTextSeparator","knownSymbols","customDateTime","INPUT_EVENT_NAME","STATEDISABLED","STATEDEFAULT","STATEINVALID","READONLY","DateInput","insidePicker","weekday","hour","minute","second","dayperiod","_unbindInput","_bindInput","_updateElementValue","_formElement","_dateTime","getDateObject","_oldValue","stringAndFromat","toPair","_format","_paste","_input","_mouseUp","_scroll","navigationOnly","difSym","newEvent","stateInvalid","blinkInvalid","parsePart","_selectSegment","_blinkInvalidTimeout","_selectNearestSegment","returnValue","initialValue","interval","keycode","modifyPart","begin","initDate","initFormat","initCulture","initMessages","generateMatcher","retFormat","returnsFormat","setExisting","typedMonthPart","typedDayPeriodPart","sampleFormat","placeholders","mins","formatResult","getValue","newMonth","setMinutes","setSeconds","currentChar","newHours","monthNames","newYear","newMinutes","newSeconds","parseFormats","DatePicker","DIV","SPAN","DEFAULT","HOVEREVENTS","MAX","ARIA_EXPANDED","ARIA_HIDDEN","DateView","_dateViewID","_calendar","_setOptions","popupHovered","selectIsClicked","handled","_initialOptions","dateView","_updateARIA","_icon","aria-expanded","aria-owns","autocomplete","_createDateInput","_update","ARIATemplate","dateInput","_dateInput","_dateIcon","eventType","dateChanged","valueUpdated","textFormatted","aria-controls","formattedValue","isSameType","optionsValue","_ariaTemplate","lastFrom","isPrimitive","getItemCount","listScreens","getDefaultItemHeight","lineHeight","mockList","bufferSizes","opposite","listValidator","downThreshold","upThreshold","lastScrollTop","scrollCallback","syncList","reorder","webkitTransform","map2","arr1","arr2","ITEMCHANGE","reshift","itemTemplate","placeholderTemplate","renderColumns","GROUPITEM","isActivePromise","VIRTUALLIST","CONTENT","LIST","HEADER","VIRTUALITEM","ITEM","HEIGHTCONTAINER","LISTBOUND","VIRTUAL_LIST_NS","_fetching","_selectedDataItems","_selectedIndexes","_rangesList","_promisesList","_renderItems","_triggerListBound","oppositeBuffer","mapValueTo","_selectProxy","_clean","_deferValueSet","mute","_selectingValue","_highlightSelectedItems","_getElementByDataItem","_mute","_createList","_forcePrefetch","shouldClear","_prefetchByValue","_checkValuesOrder","_removedAddedIndexes","dataView","_dataView","valueGetter","forSelection","mapValueToIndex","mapValueToDataItem","indexes","_getIndecies","deferredRange","itemCount","defs","low","high","pages","existingRange","isEmptyList","_activeDeferred","_getSkip","_findDataItem","_getRange","triggerEvent","_getElementByIndex","_focusedIndex","_getElementLocation","_screenHeight","heightContainer","initialIndices","isAlreadySelected","prefetchStarted","_selectDeferred","_deselectCurrentValues","_listCreated","_lastScrollTop","hasData","setScreenHeight","yPosition","yDownPostion","screenEnd","_generateItems","minHeight","_saveInitialRanges","_buildValueGetter","_setHeight","getList","_listItems","_whenChanged","_reorderList","currentHeight","padHeight","lastRequestedRange","lastRangeStart","rangeStart","flatGroup","groupLength","_getterDeferred","firstItemIndex","_indexConstraint","firstVisibleGroup","fixedGroupText","currentVisibleGroup","firstVisibleDataItemIndex","firstVisibleDataItem","_itemMapper","listType","currentIndex","_currentGroup","_getDataItemsCollection","_listIndex","theValidator","theNew","currentOffset","Infinity","list2","range2","_bufferSizes","buffers","elementIndex","selectedIndexes","removedindexesCounter","_deselectSingleItem","oldSkip","_clickHandler","firstItem","indexOfWordAtCaret","caretIdx","wordAtCaret","replaceWordAtCaret","defaultSeparator","words","placeholderSupported","ARIA_READONLY","AUTOCOMPLETEVALUE","AutoComplete","_loader","_keypress","_search","_prev","aria-haspopup","_resetFocusItemHandler","_resetFocusItem","_toggleCloseVisibility","_progressHandler","_separator","_unifySeparators","_last","wordIndex","isActive","_touchScroller","_muted","_selectValue","_defaultSeparator","itemSelected","_loading","DOMelement","assign","normalizeIndex","sameCharsOnly","character","nsFocusEvent","CLICKEVENTS","STATE_FILTER","STATE_ACCEPT","MSG_INVALID_OPTION_LABEL","_focusHandler","_focusInputHandler","_focusInput","_optionLabel","_inputTemplate","_word","_span","_mobile","_filterHeader","_attachFocusHandlers","_textAccessor","_optionLabelText","valueTemplate","optionLabelTemplate","_arrow","_focusFilter","_resizeFilterInput","isInputActive","originalPrevent","_optionLabelDataItem","loweredText","_valueSetter","_assignInstance","_buildOptions","optionLabelValue","initialIndex","_presetValue","_filterPaste","_focusinHandler","_focusoutHandler","isIFrame","self","_wrapperMousedown","_wrapperClick","dropDownWrapper","isPopupVisible","_getElementDataItem","_matchText","_shuffleData","splitIndex","optionDataItem","_selectNext","oldFocusedItem","dataLength","isInLoop","charCode","_popupOpen","compareElement","jQueryCandidate","_resetOptionLabel","focusedItem","additionalClass","keepState","SELECTOR","accesskey","unselectable","getElements","optionLabelText","STATE_REBIND","newLineRegEx","_attachFocusEvents","_setText","syncValueAndText","_pasteTimeout","hasText","isCustom","_inputFocus","_inputFocusout","_arrowClick","_inputPaste","reinitialized","_openPopup","_scrollToFocusedItem","_updateSelection","hasInitialIndex","_updateItemFocus","isFirstPage","_setDomInputValue","caretStart","currentCaret","preventShow","maxLength","accessKey","A","LI","ACCEPT","FILTER","REBIND","DESELECT","FOCUSEDCLASS","SELECTEDCLASS","HOVERCLASS","NOCLICKCLASS","_optionsMap","_customOptions","_tagList","_textContainer","_tagID","tagList","_initialOpen","_ariaSetLive","_tagTemplate","_ariaSetSize","tagMode","autoClose","singleTag","deleteTag","maxSelectedItems","tagTemplate","persistTagList","currentTag","_currentTag","_selectedItemChange","_initialValues","optionsMap","tagTextTemplate","notInput","closeButton","cancelable","_removeTag","tag","listViewChild","customIndex","listViewChildren","_close","classList","_updateTagListHTML","_tagListClick","_clearSingleTagValue","tags","_retrieveData","_activeItem","inputValue","clearFilters","_normalizeValues","_setOption","isEmptyArray","_getActiveItem","_getSelectedIndices","activeItemIdx","activeIndex","_multipleSelection","_selectRange","_showBusyHandler","skipCaret","caretPos","textWidth","wrapperWidth","selectedItems","_buildSelectedItems","_selectedItemIndex","_angularTagItems","updatePersistTagList","removedItem","addedItem","_maxTotal","maxTotal","currentTotal","isSelected","indicesToSelect","selectIndices","aria-autocomplete","defaultTemplate","hasDataSource","isMultiple","computedStyles","hex","hue2rgb","p","q","parseColor","color","BaseColor","matchNamedColor","RGB","namedColors","Bytes","HSV","HSL","Color","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","regexp","colorNames","toHSV","toRGB","toHex","toBytes","toCss","toCssRgba","rgb","r","toDisplay","other","c1","c2","NaN","h","ref","toHSL","l","resolvedColor","formatRegex","processor","channels","this$1","resolveColor","re","normalizeByte","padDigit","brightness","percBrightness","fromBytes","fromRGB","fromHSV","fromHSL","createWrapper","isHorizontal","orientationCssClass","cssClasses","tickPlacementCssClass","tickPlacement","showButtons","createButton","buttonCssClass","createSliderItems","smallStep","createTrack","dragHandleCount","firstDragHandleTitle","leftDragHandleTitle","dragHandleTitle","rightDragHandleTitle","stepValue","formatValue","calculatePrecision","power","parseAttr","defined","removeFraction","RangeSlider","MOUSE_DOWN","TRACK_MOUSE_DOWN","MOUSE_UP","TRACK_MOUSE_UP","MOVE_SELECTION","KEY_DOWN","MOUSE_OVER","DRAG_HANDLE","TRACK_SELECTOR","TICK_SELECTOR","STATE_SELECTED","STATE_FOCUSED","STATE_DEFAULT","SliderBase","rtlDirectionSign","_isHorizontal","_sizeFn","_outerSize","tooltip","_createHtml","_trackDiv","_setTrackDivWidth","_maxSelection","_sliderItemsInit","_keyMap","37","40","39","38","35","36","33","largeStep","34","_distance","_refresh","sizeBetweenTicks","pixelWidths","_calculateItemsWidth","_setItemsWidth","_setItemsTitle","_calculateSteps","_setItemsLargeTick","trackDivPosition","bordersWidth","titleNumber","limit","increment","valueWithoutFraction","itemsCount","itemWidth","trackDivSize","preciseItemsCount","pixelStep","_roundWidths","pixelWidthsArray","balance","_addAdditionalSize","additionalSize","_pixelSteps","_getValueFromPosition","mousePosition","dragableArea","halfStep","startPoint","_getFormattedValue","tooltipTemplate","_getDraggableArea","endPoint","_firstHandleDrag","_activeHandle","_lastHandleDrag","_activeHandleDrag","_updateTooltip","_focusWithMouse","_setTooltipTimeout","_removeTooltip","_tooltipTimeout","_clearTooltipTimeout","tooltipDiv","_formResetHandler","Slider","dragHandle","_selection","Selection","Drag","increaseButtonTitle","decreaseButtonTitle","mouseDownHandler","newVal","_nextValueByIndex","_valueIndex","_setValueInRange","timer","_clearTimer","_refreshAriaAttr","_tooltipDiv","moveSelection","selectionValue","selectionDiv","halfDragHanndle","rtlCorrection","owner","_activeDragHandle","_setZIndex","oldVal","_createTooltip","colloutCssClass","wnd","tooltipInnerDiv","_scrollOffset","moveTooltip","slideParams","constrainValue","noAnimation","fadeOut","dragHandles","sdhOffset","viewPortEnd","maxOverflow","firstInput","secondInput","warn","dragSelectionStart","dragSelectionEnd","activeHandleDrag","selectionStartValue","selectionEndValue","selectionStartIndex","selectionEndIndex","halfHandle","makeSelection","selectionPosition","relative","KEYS","BACKGROUNDCOLOR","ITEMSELECTEDCLASS","SIMPLEPALETTE","WEBPALETTE","WHITE","MESSAGES","noColor","clearColor","previewInput","CLICK_NS","ColorSelector","_tabIndex","_ariaId","_standalone","_triggerSelect","_updateUI","_onEnable","nohooks","_selectOnHide","ColorPalette","colors","tileSize","palette","_selectedID","ex","FlatColorPicker","_hueElements","_selectedColor","_colorAsText","_sliders","_hsvArea","autoupdate","_clearedColor","_getHSV","_applyIEFilter","_hsvEvents","_hueSlider","_opacitySlider","_hsvRect","_hsvHandle","preview","track","backgroundImage","hueChange","opacityChange","hueSlider","opacitySlider","kendoSlider","slide","rw","rh","_svChange","hsvRect","hsvHandle","hue","handlePosition","dontChangeInput","ColorPicker","_selector","innerWrapper","toolIcon","_getPopup","selOptions","_noColorIcon","_isInputTypeColor","selectorType","kendoButton","selectorColor","buttonHtml","CLASS_ICON","truncate","INPUT","SPIN","TOUCHEND","STATE_INVALID","INTEGER_REGEXP","NumericTextBox","inputType","isStep","_focusout","_arrows","_validation","_toggleText","factor","restrictDecimals","spinners","upArrowText","downArrowText","_upArrowEventHandler","_downArrowEventHandler","_spin","_upArrow","_downArrow","_keyup","_inputHandler","_arrowsWrap","aria-valuemin","aria-valuemax","adjusted","_adjust","_focusin","arrows","_spinning","_validationIcon","_focusing","groupRegExp","extractRegExp","caretPosition","_culture","_removeInvalidState","CLASSNAME","_step","_cachedCaret","_numericRegex","_blinkInvalidState","_addInvalidState","_invalidStateTimeout","fractionRule","_floatRegExp","originalValue","rounder","isNotNull","DOMElement","fieldType","convertToValueBinding","bindAttr","createAttributes","ruleName","stringRule","validation","DATATYPE","BINDING","specialRules","addIdAttribute","convertItems","addValidationRules","modelField","oldIE","nameSpecialCharRegExp","ERRORTEMPLATE","EQUAL_SET","editors","kendoNumericTextBox","kendoDatePicker","mobileEditors","Editable","_isMobile","_validateProxy","_validate","clearContainer","skipFocus","editor","isObject","isValuesEditor","isCustomEditor","preventChangeTrigger","_validationEventInProgress","bindAttribute","bindingRegex","validatable","modelFields","KENDO_KEYDOWN","DATABOUND","DATABINDING","FOCUSSELECTOR","KEDITITEM","EDIT","REMOVE","SAVE","TOUCHSTART","ListView","_itemId","_pageable","_crudHandlers","_scrollable","navigatable","altTemplate","editTemplate","_item","_progress","_error","endlessAppend","_endlessFetchInProgress","_skipRerenderItemsCount","scrollable","_destroyEditable","_focusNext","pagerId","pageable","pager","multi","originalPageSize","overflow-y","-webkit-overflow-scrolling","_endlessPageSize","_scrollTo","scrollDirectionFunc","UseJQueryoffset","elementDimension","containerScrollAmount","containerDimension","clickCallback","focusAgain","canHandle","isTextBox","editItem","edit","clearSelection","_modelFromElement","_closeEditable","kendoEditable","mousedownNs","touchstartNs","clickNs","getSortedDomIndices","isUndefined","DRAGGEDCLASS","FOCUSED_CLASS","SELECTED_STATE_CLASS","RESET","DRAG_CLUE_CLASS","DROP_HINT_CLASS","isInputElement","CommandFactory","ListBoxCommand","RemoveItemsCommand","MoveItemsCommand","MoveUpItemsCommand","MoveDownItemsCommand","TransferItemsCommand","TransferItemsToCommand","TransferItemsFromCommand","TransferAllItemsToCommand","TransferAllItemsFromCommand","kendoAttr","DASH","DOT","SPACE","HASH","KENDO_LISTBOX","DISABLED_STATE_CLASS","ENABLED_ITEM_SELECTOR","ENABLED_ITEMS_SELECTOR","TOOLBAR_CLASS","TOOL_SELECTOR","LIST_CLASS","LIST_SELECTOR","ADD","REORDER","MOVE_UP","MOVE_DOWN","TRANSFER_TO","TRANSFER_FROM","TRANSFER_ALL_TO","TRANSFER_ALL_FROM","UNIQUE_ID","COMMAND","MOVE_UP_OFFSET","MOVE_DOWN_OFFSET","TOOLBAR_POSITION_CLASS_NAMES","ListBox","_list","_createToolbar","_createNavigatable","_listTabIndex","_getList","_destroyToolbar","_target","_draggable","dropSources","tools","moveUp","moveDown","transferTo","transferFrom","transferAllTo","transferAllFrom","_unbindDataChange","_addItem","_bindDataChange","_bindDataSource","_syncElement","itemContent","_addItemAt","_insertElementAt","_keyDown","_getTabIndex","oldTarget","isInput","_getNavigatableItem","nextAll","_scrollIntoView","shouldPreventDefault","_shiftSelecting","_executeCommand","elementNode","listBox","_searchConnectedListBox","connectedListBox","closestContainer","originalElement","getKendoListBox","draggableOptions","draggedItem","_updateToolbar","_updateAllToolbars","dataItemAtIndex","itemAtIndex","listItem","_removeElement","listItems","_getItems","_removeItem","uniqueIdAttr","enabledItems","_enableItem","_dataChangeHandler","_innerWrapper","_setItemIds","viewLength","toolbarElement","toolbarOptions","toolbarInsertion","commandName","execute","_updateToolStates","listBoxElements","elementsLength","_commands","commandType","getItems","canExecute","moveItems","movedItem","indecesInDom","movedItems","itemComparer","moveAction","item1","item2","indexItem1","indexItem2","domIndices","sourceListBox","getSourceListBox","destinationListBox","getDestinationListBox","updatedSelection","getUpdatedSelection","updateSelection","itemFilter","lastEnabledItem","containsLastItem","itemToSelect","_initTemplates","_createTools","_attachEventHandlers","_detachEventHandlers","toolsLength","toolsMessages","toolList","_createToolList","defaultTools","_onToolClick","_executeToolCommand","_updateToolState","toolName","toolElement","stringDiffStart","str1","str2","PASTE","MaskedTextBox","_rules","_tokenize","_togglePrompt","_emptyMask","_timeoutId","_maskLength","clearPromptChar","unmaskOnPost","promptChar","0","9","#","L","?","&","C","_submitHandler","unmasked","_unmask","emptyMask","_mask","_unmaskedValue","_trackChange","_legacyIEInputHandler","__changing","inputChange","backward","contentStart","endContent","lengthDiff","__dropping","_trimStartPromptChars","_findCaretPosBackwards","__backward","__pasting","chr","chrIdx","tokenIdx","tokensLength","maskChars","getEffectDirection","parseDirection","updateItemClasses","IMG","IMAGE","LINK","DEFAULTSTATE","LINK_SELECTOR","excludedNodesRegExp","updateArrow","updateFirstLast","arrowCssClass","getArrowCssClass","MENU","updateHasAriaPopup","parentLi","getParentLiItems","storeItemSelectEventHandler","selectHandler","getItemSelectEventHandler","setItemData","popupOpenerSelector","popupGroupSelector","getChildPopups","currentPopup","overflowWrapper","childPopupOpener","opener","popupId","POPUP_OPENER_ATTR","popupParentItem","POPUP_ID_ATTR","itemPopup","animationContainerSelector","overflowMenuParents","getParents","mousewheelDelta","parentsScroll","scrollDirection","isPointerTouch","allPointers","pointerType","touchPointerTypes","isTouch","removeSpacesBetweenItems","DELAY","SCROLLSPEED","ICON_SELECTOR","TIMER","ZINDEX","POINTERDOWN","MOUSEWHEEL","SCROLLWIDTH","SCROLLHEIGHT","OFFSETWIDTH","OFFSETHEIGHT","KENDOPOPUP","HOVERSTATE","menuSelector","groupSelector","popupSelector","allItemsSelector","disabledSelector","itemSelector","availableItemsSelector","linkSelector","exclusionSelector","nextSelector","lastSelector","templateSelector","scrollButtonSelector","imageAttr","rendering","wrapperCssClass","firstLevel","itemCssAttributes","imageCssAttributes","imgAttributes","contentCssAttributes","contentAttr","defaultClasses","textClass","arrowClass","groupAttributes","expanded","groupCssClass","Menu","_updateClasses","_animations","nextItemZIndex","_initOverflow","_attachMenuEventsHandlers","openOnClick","clicked","closeOnClick","hoverDelay","popupCollision","_initData","_overflowWrapper","_preventClose","_removeHoverItem","_checkActiveElement","_mouseleavePopup","_mouseenterPopup","_documentClickHandler","_documentClick","_detachMenuEventsHandlers","backwardBtn","forwardBtn","initialWidth","initialCssWidth","_openedPopups","_scrollWrapper","scrollButton","_initScrolling","_setOverflowWrapperWidth","_toggleScrollButtons","_popupsWrapper","menuWidth","borders","wrapperCssWidth","_reinitOverflow","overflowChanged","_destroyOverflow","popupWrapper","popupParentLi","isNumeric","mouseWheelDistance","backwardDouble","forwardDouble","scrolling","touchEvents","scrollValue","finish","mouseenterHandler","mousedownHandler","scrollSpeed","_closeChildPopups","currentScroll","_toggleDisabled","attemptGetItem","referenceItem","inserted","_insert","_childPopupElement","plain","groupData","renderGroup","renderItem","parentItems","_openAfterLoad","visiblePopups","closePopup","overflowPopup","windowHeight","setScrolling","nextZindex","parentHorizontal","_triggerEvent","maxHeight","_configurePopupOverflow","_initPopupScrolling","popupOpener","groupId","_wrapPopupElement","skipMouseEvents","_initPopupScrollButtons","scrollButtons","_closeParentPopups","_keyTriggered","_setPopupHeight","popupOuterHeight","popupOffsetTop","bottomScrollbar","canFit","_initialHeight","dontClearClose","hasChildPopupsHovered","isPopupMouseLeaved","_isRootItem","_forceClose","isEnter","_closurePrevented","hoverItem","_hoverItem","_findRootParent","hasFocus","oldHoverItem","_oldHoverItem","nonContentGroupsSelector","_itemHasChildren","pointerTouch","delegateTarget","rootMenuItems","subMenuItems","toElement","_closePopups","rootPopup","groupParent","innerPopup","_innerPopup","openHandle","childGroup","childGroupVisible","shouldCloseTheRootItem","childPopupId","formNode","itemElement","targetHref","sampleHref","isLink","isLocalLink","isTargetLink","_parentsUntil","enterKey","itemSelectEventData","isSelectItemDefaultPrevented","isSelectDefaultPrevented","_getEventData","_moveHover","belongsToVertical","_itemBelongsToVertival","_itemDown","_itemUp","_itemEsc","menuIsVertical","nextItem","_scrollToItem","_itemRight","parentItem","_itemLeft","scrollDir","currentScrollOffset","itemSize","itemOffset","ulSize","scrollButtonSize","itemPosition","findByUid","wrapperElement","itemsToUpdate","updateProxy","_updateItem","removeProxy","_appendItems","_fieldAccessor","fieldBindings","fieldAccessor","itemWrapper","sprite","menu","renderContent","dataContentField","subGroup","renderItems","ContextMenu","_marker","_wire","_initialWidth","alignToAnchor","_showProxy","_closeProxy","_configurePopupScrolling","_setPopupWidth","windowWidth","popupOuterWidth","popupOffsetLeft","maxWidth","_closeTimeoutProxy","_showHandler","_eventOrigin","_targetChild","normalClick","sameTarget","containment","_preventProxy","_triggerProxy","updateItemHtml","toggleButton","HREF","LINKSELECTOR","GROUP","VISIBLEGROUP","EXPAND","COLLAPSE","ACTIVECLASS","GROUPS","CONTENTS","DISABLEDCLASS","SELECTEDSELECTOR","HIGHLIGHTCLASS","ACTIVEITEMSELECTOR","clickableItems","disabledItems","selectableItems","defaultState","SINGLE","contentUrl","textAttributes","encoded","ariaHidden","contentAttributes","itemIcon","PanelBar","_retryRequest","_first","expand","_angularCompile","requestFailed","retry","loadOnDemand","expandMode","_angularCompileElements","_angularCleanup","useAnimation","animBackup","_animating","_addGroupElement","_collapseAllExpanded","_toggleItem","showProgress","loadingText","_refreshRoot","rootItemsHtml","_refreshChildren","_toggleGroup","uidAttr","tempItem","_updateItems","_hasChildItems","retryHtml","_expanded","itemsHtml","nodeWrapper","currentNode","panelBar","skipChange","_updateSelected","focused","isReferenceItem","_updateItemsClasses","panels","panelsParent","_updateItemClasses","wrapElement","contentUrls","isAnchor","isVisible","notVisible","animationSettings","hasCollapseAnimation","_animationCallback","stopExpand","statusIcon","loadingIconTimeout","DEFAULTMIN","DEFAULTMAX","DEFAULTVALUE","DEFAULTCHUNKCOUNT","KPROGRESSBAR","KPROGRESSBARREVERSE","KPROGRESSBARINDETERMINATE","KPROGRESSBARCOMPLETE","KPROGRESSWRAPPER","KPROGRESSSTATUS","LABEL_POSITION_END","KCOMPLETEDCHUNK","KUPCOMINGCHUNK","PROGRESSTYPE","PERCENT","CHUNK","COMPLETE","HUNDREDPERCENT","DEFAULTANIMATIONDURATION","PRECISION","progressStatus","ProgressBar","_progressProperty","_fields","_validateType","_progressAnimation","_updateProgress","chunkCount","showStatus","_isStarted","progressWrapper","currentType","initialStatusValue","_addChunkProgressWrapper","_calculatePercentage","validated","_roundValue","_updateChunks","_onProgressUpdateAlways","_updateProgressWrapper","completedChunks","percentagesPerChunk","percentageParsed","completedChunksCount","animationDuration","_animation","animationCssOptions","_addRegularProgressWrapper","_onProgressAnimateStart","_onProgressAnimate","_onProgressAnimateComplete","always","progressStatusWrapSize","progressInPercent","progressValue","progressWrapperSize","chunkSize","_normalizeChunkSize","lastChunk","_calculateChunkSize","chunkContainer","_onePercent","ACTIVATE_EVENTS","ResponsivePanel","_toggleHandler","_toggleButtonClick","_registerBreakpoint","_mediaQuery","_registerStyle","breakpoint","head","styleSheet","createTextNode","prevented","updateTabClasses","tabs","ACTIVESTATE","TABONTOP","tabGroup","scrollButtonHtml","buttonClass","CONTENTURL","NAVIGATABLEITEMS","KEYBOARDNAVIGATABLEITEMS","HOVERABLEITEMS","DEFAULTDISTANCE","TabStrip","_contentUrls","_tabPosition","_keyDownProxy","wr","contentHolder","activateTab","_endItem","endItem","rtl","tabPosition","tab","dataEncodedField","dataContentUrlField","dataImageUrlField","dataUrlField","dataSpriteCssClass","collapsible","scrollWrap","_scrollableModeActive","_scrollPrevButton","_scrollNextButton","ajaxRequest","_create","_updateContentElements","_appendUrlItem","_moveUrlItem","_removeUrlItem","referenceTab","referenceContent","fromIndex","newTabsCreated","activeItem","activeTab","contentElements","_elementId","tabStripID","elementId","wrapperId","isInitialUpdate","currentContent","contentAnimators","tabsHeight","_setContentElementsDimensions","contentDivs","activeDiv","marginStyleProperty","_sizeScrollWrap","neighbours","oldFocusedTab","_scrollTabsToItem","deactivateTab","wrapperOffsetWidth","tabGroupScrollWidth","scrollPrevButton","scrollNextButton","mouseDown","mouseUp","isRtlScrollDirection","_scrollableAllowed","_nowScrollingTabs","marginRight","_scrollTabsByDelta","tabGroupWidth","tabGroupPadding","scrLeft","hasCloseAnimation","oldTab","isAnimationEnabled","visibleContents","isAjaxContent","showContentElement","showContent","inRequest","abort","scrollContainer","halfWidth","fakeProgress","endState","oldProgressAnimation","ajaxOptions","ajaxSettings","request","progressUpload","upload","evt","noProgress","XMLHttpRequest","lengthComputable","stopProgress","statusText","tabStrip","dst","midnight","noon","lastTimeOption","mergeDateAndTime","TimeView","TimePicker","ARIA_ACTIVEDESCENDANT","_dates","_timeViewID","_heightHandler","dataBind","_html","msStart","msLastTime","msInterval","useValueToRender","innerText","_distinctSelection","selectionIndex","timeView","timeFormat","ARIA_OWNS","dateViewParams","timeViewParams","DateTimePicker","_views","_icons","_midnight","_calculateMidnight","dateButtonText","timeButtonText","dateIcon","timeIcon","_timeIcon","secondView","minDateEqual","maxDateEqual","timeViewOptions","rebind","isDateViewVisible","adjustedDate","_timeSelected","icons","isPercentageSize","isPixelSize","pxUnitsRegex","isFluid","calculateSize","panePropertyAccessor","triggersResize","splitter","paneConfig","PANE","PaneResizing","horizontalDefaults","verticalDefaults","_resizable","_createHint","resizeend","LAYOUTCHANGE","KPANE","PANECLASS","Splitter","_dimension","_keys","decrease","increase","_resizeStep","_initPanes","triggerHandler","_addOverlays","_panes","_removeOverlays","_togglePane","_detachEvents","panes","navigationKeys","isResizing","_triggerAction","panesConfig","_initPane","arrowType","_updateSplitBar","splitbar","previousPane","nextPane","catIconIf","iconType","condition","prevCollapsible","prevCollapsed","collapsed","nextCollapsible","nextCollapsed","_updateSplitBars","_removeSplitBars","sizedPanesWidth","sizedPanesCount","freeSizedPanes","freeSizePanesCount","freeSizePaneWidth","alternateSizingProperty","positioningProperty","sizingDomProperty","lastNonCollapsedPane","splitBars","splitBarsCount","sizingProperty","totalSize","collapsedSize","_addPane","paneElement","referencePane","mousePositioningProperty","previousPaneConfig","nextPaneConfig","prevBoundary","nextBoundary","toPx","prevMinSize","prevMaxSize","nextMinSize","nextMaxSize","ghostPosition","previousPaneNewSize","nextPaneNewSize","fluidPanesCount","constrain","buttonKeyTrigger","PopupBox","Alert","kendoAlert","Confirm","kendoConfirm","Prompt","kendoPrompt","KDIALOG","KWINDOW","KICONCLOSE","KCONTENTCLASS","KCONTENTSELECTOR","KCONTENT","KSCROLL","KTITLELESS","KDIALOGTITLE","KDIALOGTITLEBAR","KBUTTONGROUP","KALERT","KCONFIRM","KPROMPT","KTEXTBOX","KOVERLAY","INITOPEN","TOUCHMOVE","small","medium","large","DATADOCOVERFLOWRULE","DATAHTMLTAPYRULE","CSSFLEXBOX","okText","promptInput","overlaySelector","DialogBase","_init","_centerCallback","_center","wrapperTemplate","_createDialog","_defaultFocus","_dimensions","_tabKeyTrap","_triggerOpen","sizeClass","actions","_createActionbar","_closable","_enableDocumentScrolling","_overlay","_setElementMaxHeight","_setElementHeight","paddingBox","elementMaxHeight","_paddingBox","_uiHeight","_applyScrollClassName","hasScroll","actionbar","actionbarHeight","titlebar","titlebarHeight","_waiAriaOverlay","_removeWaiAriaOverlay","preventScroll","_stopDocumentScrolling","_overlayedNodes","jthis","hiddenValue","_closeClick","_closeKeyHandler","closable","titleId","titlebarActions","closeAction","isStretchedLayout","buttonLayout","_addButtons","_normalizeButtonSize","btn","actionClick","_actionClick","actionKeyHandler","_actionKeyHandler","buttonSize","_mergeTextWithOptions","lastButton","closeBtn","actionButtons","_runActionBtn","preventClose","toFront","_triggerInitOpen","_focusDialog","otherModalsVisible","overlayFx","showOptions","_animationOptions","_modals","Fade","fadeIn","_openAnimationEnd","basicAnimation","_initOpenTriggered","originalZIndex","windowObject","zIndexNew","systemTriggered","_stopCenterOnResize","hideOptions","_removeOverlay","_closeAnimationEnd","_centerOnResize","documentWindow","newLeft","newTop","_trackResize","modals","hideOverlay","_object","$html","$body","_storeOverflowRule","_touchStart","passive","_touchMove","$target","upScroll","preventYScroll","_restoreOverflowRule","$element","_isOverflowStored","overflowRule","lastModal","zStack","encodedHtml","Dialog","alertWrapper","_ensureContentId","_ariaDescribedBy","_initFocus","_chooseEntryFocus","alert","confirmDialog","confirm","_createPrompt","promptContainer","promptInputContainer","promptDialog","prompt","toInt","normalizedValue","executableScript","getPosition","parentOverflowX","parentOverflowY","offsetLeft","WindowResizing","_preventDragging","KWINDOWRESIZEHANDLES","addOverlay","removeOverlay","WindowDragging","MODAL_NS","KWINDOWTITLE","KWINDOWTITLEBAR","KWINDOWCONTENT","KDIALOGCONTENT","KHOVERSTATE","KFOCUSEDSTATE","MAXIMIZEDSTATE","CURSOR","REFRESH","MINIMIZE","MAXIMIZE","RESIZESTART","MINIMIZE_MAXIMIZE","KPIN","KUNPIN","PIN_UNPIN","TITLEBAR_BUTTONS","REFRESHICON","WINDOWEVENTSHANDLED","zero","Window","windowContent","windowFrame","globalWindow","suppressActions","_createWindow","minTop","minLeft","maxTop","maxLeft","_buttonEnter","_buttonLeave","_windowActionHandler","windowInstance","aria-labelledby","_onDocumentResize","contentBoxSizing","lrBorderWidth","tbBorderWidth","_isPinned","_updateBoundaries","toggleMaximization","resizeHandle","dragging","_actions","windowSpecificCommands","cachedOptions","fade","autoFocus","isMaximized","isMinimized","newWidth","newHeight","w","unpin","maximize","minimize","_actionForIcon","k-i-close","k-i-window-maximize","k-i-window-minimize","k-i-window-restore","k-i-refresh","k-i-pin","k-i-unpin","_scrollIsAppended","titleBarHeight","titleBar","titleElement","containmentContext","doc","_activate","_containerScrollTop","_containerScrollLeft","suppressAnimation","defaultPrevented","_deactivate","_actionable","_shouldFocus","windowTop","currentWindow","shouldRestrictTop","restoreOptions","_sizingAction","actionId","initOptions","contentFrame","_triggerRefresh","_ajaxComplete","_loadingIconTimeout","_ajaxError","_ajaxSuccess","contentTemplate","_showLoading","iframeSrcAttributes","contentHtml","hasMargin","wrapperPosition","relativeElMarginLeft","relativeElMarginTop","elementPadding","initialPosition","resizeDirection","initialSize","containerOffset","_relativeElMarginLeft","_relativeElMarginTop","leftRtlOffset","scrollOffset","windowBottom","windowRight","newWindowTop","initialWindowPosition","initialPointerPosition","startPosition","_finishDrag","initPopOvers","popovers","preventScrollIfNotInput","initWidgets","UI_OVERLAY","BEFORE_SHOW","AFTER_SHOW","BEFORE_HIDE","_layout","_scroller","_model","layout","stretch","scroller","$destroy","inited","_invokeNgController","_padIfNativeScrolling","isAndroid","skin","isAndroidForced","hasPlatformIndependentSkin","topContainer","bottomContainer","scrollerContent","idAttrValue","controller","$apply","_callController","$scope","platform","previousView","errorMessage","rootNeeded","_setupLayouts","showClosure","serverNavigation","_loadView","modalViews","_getLayout","_xhr","_xhrComplete","CAPTURE_EVENTS","Loader","captureEvents","_attachCapture","changeMessage","transitionDone","EXTERNAL","DUMMY_HREF","SKIP_TRANSITION_ON_BACK_BUTTON","WIDGET_RELS","historyCallback","viewEngine","_historyNavigate","_historyReplace","closeActiveDialogs","viewShow","loadStart","loadComplete","sameViewRequested","viewTypeDetermined","_setPortraitWidth","_setupAppLinks","dialogs","navigateToInitial","portraitWidth","bindToRouter","router","attrUrl","hideLoading","showLoading","changeLoadingMessage","linkRoles","pressedButtonSelector","buttonSelectors","_mouseup","_appLinkClick","rel","delayedTouchEnd","openFor","paneContainer","ARROW","DIRECTION_CLASSES","DIRECTIONS","ANIMATION","popupOptions","containerPopup","PopOver","initialOpen","SHIM","Shim","app","osname","ioswp","bb","shim","_hide","BEFORE_OPEN","WRAP","ModalView","_shim","AXIS","SWIPE_TO_OPEN","AFTER_HIDE","NULL_VIEW","Drawer","drawer","_viewShow","_attachTransition","swipeToOpen","leftPositioned","swipeToOpenViews","_moveViewTo","visibleOnCurrentView","_currentViewIncludedIn","_setAsCurrent","canMoveLeft","canMoveRight","leftSwipe","limitedPosition","newPosition","shouldShow","pastHalf","velocityThreshold","EXPANED_PANE_SHIM","SplitView","_style","_paramsHistory","expandedPaneShim","_shimUserEvents","collapsePanes","expandPanes","osCssClass","variant","setDefaultPlatform","statusBarStyle","wp8Background","noVariantSet","isOrientationHorizontal","getOrientationClass","setMinimumHeight","applyViewportHeight","HEAD","viewportTemplate","DEFAULT_OS","BERRYPHONEGAP","FONT_SIZE_COEF","CHROME","BROKEN_WEBVIEW_RESIZE","INITIALLY_HORIZONTAL","MOBILE_PLATFORMS","ios7","usedWithBlock","systemMeta","clipTemplate","ENABLE_CLIP","iconMeta","HIDEBAR","SUPPORT_SWIPE_TO_GO_BACK","HISTORY_TRANSITION","BARCOMPENSATION","STATUS_BAR_HEIGHT","SCREEN","Application","bootstrap","paneOptions","startHistory","_setupPlatform","_attachMeta","_setupElementClass","_attachHideBarHandlers","updateDocumentTitle","_setupDocumentTitle","_startHistory","hideAddressBar","browserHistory","historyTransition","retina","refreshBackgroundColorProxy","_resizeToScreenHeight","includeStatusBar","_clearExistingMeta","hideBar","defaultTitle","_hideBar","BUTTONS","CONTEXT_DATA","cancelTemplate","ActionSheet","ShimClass","_shimHideProxy","actionData","_shimHide","highlightButton","highlight","ANDROID3UP","deactivateTimeoutID","useTap","clickOn","_userEvents","_timeoutDeactivate","badgeElement","iconSpan","BackButton","DetailButton","DISABLE","_button","selectOn","buttongroup","COLLAPSIBLE","INSET","HEADER_WRAPPER","CONTENT_WRAPPER","COLLAPSED","EXPANDED","ANIMATED","EXAPND","Collapsible","_buildHeader","inset","collapseIcon","expandIcon","iconPosition","instant","_getContentHeight","isCollapsed","whitespace","TEXT_NODE","whitespaceRegExp","addIcon","querySelector","enhanceItem","enhanceLinkItem","itemAndDetailButtons","otherNodes","enhanceCheckBoxItem","putAt","VirtualListViewItem","LOAD_ICON","VirtualListViewLoadingIndicator","VirtualListViewPressToLoadMore","VirtualListViewItemBinder","ListViewItemBinder","ListViewFilter","ITEM_SELECTOR","HIGHLIGHT_SELECTOR","GROUP_CLASS","ACTIVE_CLASS","GROUP_WRAPPER","GROUP_TEMPLATE","SEARCH_TEMPLATE","STYLED","ITEM_CHANGE","buttonRegExp","HeaderFixer","headerFixer","cacheHeaders","_shouldFixHeaders","_cacheHeaders","_scrollHandler","_fixHeader","fixedHeaders","headerPair","currentHeader","DEFAULT_PULL_PARAMETERS","RefreshHandler","pullParameters","pull","_pulled","itemConstructor","prevItem","endReached","below","totalHeight","averageItemHeight","remainingItemsCount","batchUpdate","nextIndex","initialOffset","lastDirection","above","lastTop","topBorder","bottomBorder","setDataItem","_loadIcon","_loadButton","loadMoreText","loadMore","kendoMobileButton","_hideShowButton","_showLoadButton","chromeHeight","_scrollEnd","pressToLoadMore","virtualViewSize","updateScrollerSize","updateSize","itemBinder","adding","removing","prependOnRefresh","appendOnRefresh","groupedMode","findByDataItem","_shouldShowLoading","replaceGrouped","insertAt","endlessScroll","filterable","autoFilter","searchInput","_oldFilter","_filterChange","_dataSourceChange","_refreshInput","appliedFilters","_applyFilter","scrollTreshold","scrollThreshold","_headerFixer","_itemsCache","_itemBinder","_pullToRefreshHandler","_enhanceItems","emptyDataSource","_scrollerInstance","triggerChange","replaceItem","newItem","_dim","_highlight","plainItem","dataIDAttribute","templateProxy","groupTemplateProxy","_headerTemplate","buttonElement","_styleGroups","rootItems","grouped","enhanced","createContainer","toggleTitle","centerElement","noTitle","showTitle","NavBar","leftElement","rightElement","DRAG_START","DRAG_END","ElasticPane","ScrollViewContent","VirtualScrollViewContent","Page","ScrollView","CHANGING","CURRENT_PAGE_CLASS","VIRTUAL_PAGE_CLASS","CLEANUP","VIRTUAL_PAGE_COUNT","LEFT_PAGE","CETER_PAGE","RIGHT_PAGE","LEFT_SWIPE","NUDGE","RIGHT_SWIPE","scrollView","_changeProxy","_refreshProxy","pageHTML","pageCount","ScrollViewPager","updateDimension","transitionTo","ScrollViewElasticPane","_getPages","contentHeight","enablePager","pagerOverlay","paneMoved","swipeType","bounce","snap","nextPage","approx","minSnap","maxSnap","currentPage","updatePage","forcePageUpdate","resizeTo","containerHeight","pageElements","_paged","_initPages","_buffer","_pendingPageRefresh","_pendingWidgetRefresh","_resetPages","_resetProxy","_endReachedProxy","emptyTemplate","emptyTemplateProxy","setWidth","_repositionPages","_updatePagesContent","thresholdPassed","isEndReached","_cancelMove","_moveBackward","_moveForward","setPageContent","_resetMovable","_onResize","_onReset","_onEndReached","theContent","VirtualPage","mobileContainer","transitionEnd","dragStart","dragEnd","_syncWithContent","_content","viewInit","bounceVelocityThreshold","prevPage","_dragStart","_transitionEnd","limitValue","minLimit","maxLimit","SWITCHON","SWITCHOFF","MARGINLEFT","ACTIVE_STATE","DISABLED_STATE","RESOLVEDPREFIX","TRANSFORMSTYLE","SWITCH_MARKUP","Switch","onLabel","offLabel","background","snapPoint","_animateBackground","handleWidth","ACTIVE_STATE_CLASS","_buildButton","switchTo","_setActiveItem","switchByFullUrl","currentItem","tabstrip","withoutTimeout","$timeout","createWidget","attrs","origAttr","controllers","createIt","destroyRegister","kNgDisabled","kNgReadonly","isReadonly","kRebind","ctor","OPTIONS_NOW","exposeWidget","$emit","destroyWidgetOnScopeDestroy","setupRebind","$eval","bindToKNgDisabled","bindToKNgReadonly","kNgModel","bindToKNgModel","ngModel","bindToNgModel","ngForm","propagateClassToWidgetWrapper","kNgDelay","delayValue","parsed","unresolved","unwatch","$watch","$root","unregister","$attr","addOption","scopeValue","widgetEvents","optionsPath","kOptions","defaultOptions","dataName","eventKey","optionName","ignoredOwnProperties","ignoredAttributes","kDataSource","createDataSource","$log","kendoWidget","$parse","formValue","isForm","formRegExp","haveChangeOnElement","viewRender","onChange","currentVal","$viewValue","$modelValue","$render","formPristine","$pristine","$setViewValue","$setPristine","digest","$isEmpty","rangePickerModels","rangePickerStartModel","rangePickerEndModel","updating","valueIsCollection","currentValueLength","watchHandler","changeHandler","DateRangePicker","_startDateInput","_endDateInput","$angular_setLogicValue","$watchCollection","$setDirty","$angular_getLogicValue","deregister","$on","suspend","mo","disconnect","resume","observe","prevClassList","MutationObserver","changes","chg","currClassList","attributeName","cls","rebindAttr","templateOptions","isUpload","_cleanUp","WIDGET_TEMPLATE_OPTIONS","templateContents","replaceChild","setTemplate","createDirectives","klass","make","directiveName","widgetName","module","directive","directiveFactory","shortcut","dashed","SKIP_SHORTCUTS","restrict","TAGNAMES","scopeField","kScopeField","MANUAL_DIRECTIVES","kendoWidgetInstance","isDigesting","destroyScope","defadvice","origMethod","pendingPatches","$injector","$defaultCompile","encode","encOpen","encClose","TreeList","TreeView","Scheduler","PivotGrid","PivotConfigurator","toDataSource","ds","mew","factory","kendoRenderedTimeout","RENDERED","require","$attrs","roleattr","Editor","Upload","MobileButton","MobileBackButton","MobileDetailButton","MobileListView","entry","arg","$angular_scope","$angular_init","itemScope","$$kendoScope","vars","$new","$angular_makeEventHandler","kendoEvent","elems","colIdx","locals","isString","_checkBoxSelection","angularDataItem","templateSettings","col","terminal","pre","_instance","post","kAttr","priority","TreeMap","MobileScrollView","Grid","templateDirectives","templateName","outerHTML"],"mappings":";;;;;;;;;;;;;;;CAeC,SAAUA,EAAGC,QACVA,OAAO,cAAe,UAAWD,IACnC,WAqpHE,MA9oHC,UAAUE,EAAGC,EAAQC,GA2ClB,QAASC,MA+GT,QAASC,GAAYC,EAAMC,GACvB,GAAIA,EACA,MAAO,IAAOD,EAAKE,MAAM,KAAMC,KAAK,OAAQD,MAAM,OAAOC,KAAK,WAAWC,QAAQ,MAAO,OAAOA,QAAQ,MAAO,OAAOA,QAAQ,MAAO,OAAS,GAE7I,IAAIC,GAAQL,EAAKM,OAAO,GAAIC,EAAOP,EAAKQ,UAAU,EAClD,OAAc,MAAVH,EACO,KAAOE,EAAO,KACJ,MAAVF,EACA,qBAAuBE,EAAO,KAE9B,IAAMP,EAAO,kBA4ChC,QAASS,GAAIC,EAAQC,EAAQC,GAIzB,MAHAF,IAAkB,GAClBC,EAASA,GAAU,EACnBC,EAAMD,EAASD,EAAOG,OAClBD,EACOE,EAAMH,GAAQH,UAAU,EAAGI,GAAOF,EAEtCA,EA2iCX,QAASK,GAAWC,GAChB,GAAIC,GAASD,EAAQE,IAAIC,GAAMC,QAAQC,YAAYH,IAAM,eAAiBF,EAAQE,IAAI,cAAeI,EAASL,EAASA,EAAOM,MAAMC,MAC5H,EACA,EACA,EACA,EACA,IAEA,EACA,EACA,EACA,EACA,GACDC,EAAOC,GAAKC,KAAKL,EAAO,KAAMA,EAAO,IAAM,GAClD,QACIM,MAAON,EAAO,GAAKG,EACnBI,OAAQP,EAAO,GAAKG,EACpBK,QAASR,EAAO,GAAKG,GAG7B,QAASM,GAAKf,EAASgB,GAAvB,GACmCC,GAGvBC,EAAgCC,EAAkCC,EAA0CC,EAA4CC,EAH5JC,EAAUnB,GAAQmB,QAAqBC,EAAarB,GAAMsB,YAAaC,EAAcvB,GAAMwB,aAAcC,EAAS5B,EAAQ4B,SAAUC,EAAmBL,EAAW5C,EAoCtK,OAnCAgD,GAAOE,YAAY,4BACdF,EAAOG,SAAS,yBAwBjBC,EAAWhC,EAASgB,IAvBhBE,EAAQlB,EAAQ,GAAGiC,MAAMf,MAAOC,EAASnB,EAAQ,GAAGiC,MAAMd,OAAQC,EAAec,GAAcC,KAAKjB,GAAQG,EAAgBa,GAAcC,KAAKhB,GAASG,EAAatB,EAAQ+B,SAAS,cAAgB/B,EAAQoC,GAAG,qCACrNnB,EAAaG,GAAgBC,GACxBD,KAAkBJ,GAAYA,GAAYE,GAASI,KACpDJ,EAAQF,EAAWQ,EAAWxB,GAAW,EAAIwB,EAAWxB,MAEvDqB,KAAmBL,GAAYA,GAAYG,IAAWnB,EAAQoC,GAAG,wCAClEjB,EAASO,EAAY1B,IAEzBA,EAAQe,KAAKpC,EAAE,UAAU0D,SAAS,yBAAyBnC,KACvDgB,MAAOA,EACPC,OAAQA,KAEZS,EAAS5B,EAAQ4B,SACbX,GACAjB,EAAQE,KACJgB,MAAO,OACPC,OAAQ,OACRmB,UAAW,aACXC,aAAc,aACdC,gBAAiB,gBAMzBX,EAAmBL,EAAWI,KAC9BA,EAAOS,SAAS,4BAChBL,EAAWhC,EAASgB,IAEpBO,EAAQkB,MAAQ/B,GAAKgC,MAAMnB,EAAQoB,UAAY,IAC/C3C,EAAQE,KAAM0C,KAAM,IACpB5C,EAAQ6C,SAAS,WAAW3B,MAAMlB,EAAQkB,UAEvCU,EAEX,QAASI,GAAWhC,EAASgB,GACzB,GAAIC,GAAYO,EAAarB,GAAMsB,YAAaC,EAAcvB,GAAMwB,aAAcmB,EAAU9C,EAAQ4B,OAAO,0BAA2BmB,EAAeD,EAAQ,GAAGb,KAC5Ja,GAAQV,GAAG,YACXU,EAAQ5C,KACJ8C,QAAS,GACTC,SAAU,KAGlBhC,EAAaiB,GAAcC,KAAKY,EAAa7B,QAAUgB,GAAcC,KAAKY,EAAa5B,QAClFF,GACD6B,EAAQ5C,KACJgB,MAAOF,EAAWQ,EAAWxB,GAAW,EAAIwB,EAAWxB,GACvDmB,OAAQO,EAAY1B,GACpBsC,UAAW,cACXC,aAAc,cACdC,gBAAiB,gBAI7B,QAASU,GAAWC,GAChB,GAAIC,GAAI,EAAGvD,EAASwD,UAAUxD,MAC9B,KAAKuD,EAAI,EAAGA,EAAIvD,EAAQuD,IACpBE,EAAcH,EAAaE,UAAUD,GAEzC,OAAOD,GAEX,QAASG,GAAcH,EAAaI,GAChC,GAAwMC,GAAUC,EAAWC,EAAUC,EAAUC,EAA7OC,EAAkB1D,GAAM2D,KAAKD,gBAAiBE,EAAsB5D,GAAM2D,KAAKC,oBAAqBC,EAAa7D,GAAM2D,KAAKE,WAAYC,EAAyB9D,GAAM2D,KAAKG,sBAChL,KAAKT,IAAYD,GACbE,EAAYF,EAAOC,GACnBE,QAAkBD,GAEdE,EADAD,IAAaQ,IAAwB,OAAdT,EACZA,EAAUU,YAEV,MAEXR,GAAYA,IAAaS,OAAST,IAAaE,GAAmBF,IAAaI,GAAuBJ,IAAaK,GAAcL,IAAaM,GAA0BN,IAAaU,QAAYlE,GAAMmE,WAAW1F,EAAO2F,cAAgBZ,IAAaY,YAc/Ob,IAAac,KACpBrB,EAAYK,GAAYC,GAdpBA,YAAqBgB,MACrBtB,EAAYK,GAAY,GAAIiB,MAAKhB,EAAUiB,WACpCJ,EAAWb,EAAUkB,OAC5BxB,EAAYK,GAAYC,EAAUkB,SAElCf,EAAWT,EAAYK,GAEnBL,EAAYK,SADLI,KAAaM,GACIN,SAI5BN,EAAcH,EAAYK,GAAWC,GAMjD,OAAON,GAEX,QAASyB,GAAOC,EAAOC,EAAKC,GACxB,IAAK,GAAIC,KAAMF,GACX,GAAIA,EAAIG,eAAeD,IAAOF,EAAIE,GAAI7C,KAAK0C,GACvC,MAAOG,EAGf,OAAOD,KAASlG,EAAYkG,EAAOF,EAEvC,QAASK,GAAUC,GACf,MAAOA,GAAI/F,QAAQ,gBAAiB,SAAUgG,GAC1C,MAAOA,GAAE9F,OAAO,GAAK,IAAM8F,EAAE9F,OAAO,GAAG+F,gBAG/C,QAASC,GAAYH,GACjB,MAAOA,GAAI/F,QAAQ,UAAW,SAAUmG,EAAUC,GAC9C,MAAOA,GAAGC,gBAGlB,QAASC,GAAkB1F,EAAS2F,GAChC,GAAiBC,GAAbC,IAmBJ,OAlBIC,UAASC,aAAeD,SAASC,YAAYC,kBAC7CJ,EAAgBE,SAASC,YAAYC,iBAAiBhG,EAAS,IAC3D2F,GACAhH,EAAEsH,KAAKN,EAAY,SAAUO,EAAKC,GAC9BN,EAAOM,GAASP,EAAcQ,iBAAiBD,OAIvDP,EAAgB5F,EAAQqG,aACpBV,GACAhH,EAAEsH,KAAKN,EAAY,SAAUO,EAAKC,GAC9BN,EAAOM,GAASP,EAAcN,EAAYa,OAIjDhG,GAAMmG,KAAKT,KACZA,EAASD,GAENC,EAEX,QAASU,GAAavG,GAClB,GAAIA,GAAWA,EAAQwG,WAA0C,gBAAtBxG,GAAQwG,WAA0BxG,EAAQwG,UAAUC,QAAQ,wBACnG,OAAO,CAEX,IAAIC,GAAWhB,EAAkB1F,GAAU,aAAa0G,QACxD,OAAmB,QAAZA,GAAkC,UAAZA,EAEjC,QAASC,GAAW3G,EAASmG,GAA7B,GAIQS,GAHAC,EAASzG,GAAQmB,QAAQsF,OACzBC,EAAS1G,GAAQmB,QAAQwF,QACzBC,EAAKhH,YAAmBrB,GAAIqB,EAAQ,GAAKA,CAE7C,IAAKA,EAIL,MADA4G,GAAQxG,GAAQwG,MAAM5G,GAClBmG,IAAUtH,EASN+H,GAASC,EACFG,EAAGC,YAAcD,EAAGE,YAAcF,EAAGL,WAErCQ,KAAKC,IAAIJ,EAAGL,aAVnBK,EAAGL,WADHC,GAASC,EACOG,EAAGC,YAAcD,EAAGE,YAAcf,EAC3CS,GAASE,GACCX,EAEDA,EALpB,GAmTR,QAASG,GAAKe,GACV,GAAgBC,GAAZC,EAAS,CACb,KAAKD,IAAOD,GACJA,EAAIpC,eAAeqC,IAAe,UAAPA,GAC3BC,GAGR,OAAOA,GAEX,QAASC,GAAUxH,EAASyH,EAAMC,GAAlC,GAIQC,GACAJ,EAOIK,CAIR,OAfKH,KACDA,EAAO,UAEPE,EAAS3H,EAAQyH,KACjBF,GACAM,IAAKF,EAAOE,IACZhH,MAAO8G,EAAO9G,MACdC,OAAQ6G,EAAO7G,OACfF,KAAM+G,EAAO/G,MAEbR,GAAQmB,QAAQkB,OAASrC,GAAQ0H,UAAY1H,GAAQ2H,cAAgBL,IACjEE,EAAOxH,GAAQwG,MAAM5G,GAAW,KACpCuH,EAAOM,KAAOjJ,EAAOoJ,YAAclC,SAASmC,gBAAgBC,UAC5DX,EAAO3G,MAAQhC,EAAOuJ,YAAcP,EAAO9B,SAASmC,gBAAgBtB,YAEjEY,EAYX,QAASa,GAAaC,GAClB,GAAIC,KAIJ,OAHArC,IAAsB,gBAAVoC,GAAqBA,EAAMnJ,MAAM,KAAOmJ,EAAO,SAAUnC,GACjEoC,EAAQpC,GAAOqC,OAEZD,EAEX,QAASE,GAAGxI,GACR,MAAO,IAAIG,IAAMmI,QAAQG,QAAQzI,GAiCrC,QAAS0I,GAAwBC,EAASC,EAAUC,EAASC,GAsBzD,aArBWH,KAAYI,KACfzE,EAAWsE,KACXE,EAAWF,EACXA,EAAW,IACXC,GAAU,GAEVvE,EAAWuE,KACXC,EAAWD,EACXA,GAAU,SAEHD,KAAaI,KACpBH,EAAUD,EACVA,EAAW,KAEfD,GACIL,QAASK,EACTC,SAAUA,EACVC,QAASA,EACTC,SAAUA,IAGXG,IACHX,WACAM,SAAU,IACVC,SAAS,EACTK,KAAMC,GACNC,SAAUD,GACVE,MAAM,GACPV,GACCW,iBAAkBX,EAAQG,SAC1BA,SAAUK,KAGlB,QAASI,GAAQvJ,EAAS2I,EAASC,EAAUC,EAASC,GAElD,IADA,GAAsCU,GAAlCtD,EAAM,EAAGrG,EAASG,EAAQH,OACvBqG,EAAMrG,EAAQqG,IACjBsD,EAAW7K,EAAEqB,EAAQkG,IACrBsD,EAASC,MAAM,WACXnB,EAAQoB,QAAQF,EAAUd,EAAwBC,EAASC,EAAUC,EAASC,KAGtF,OAAO9I,GAEX,QAAS2J,GAAY3J,EAAS4J,EAASjB,EAASkB,GAO5C,MANID,KACAA,EAAUA,EAAQ1K,MAAM,KACxB+G,GAAK2D,EAAS,SAAU1D,EAAKC,GACzBnG,EAAQ2J,YAAYxD,EAAO0D,MAG5B7J,EAsBX,QAAS8J,GAAW3D,GAChB,OAAQ,GAAKA,GAAO/G,QAAQ2K,EAAW,SAAS3K,QAAQ4K,EAAU,QAAQ5K,QAAQ6K,EAAU,QAAQ7K,QAAQ8K,EAAa,UAAU9K,QAAQ+K,EAAY,SAE3J,QAASC,GAASjE,GACd,GAAIkE,EACJ,KACIA,EAAWzL,EAAO0L,mBAAmBnE,GACvC,MAAOoE,GACLF,EAAWlE,EAAM/G,QAAQ,iCAAkC,SAAUoL,EAAGC,EAAIC,GACxE,MAAOC,QAAOC,aAAaC,SAAS,MAAQJ,GAAMC,GAAK,OAG/D,MAAOL,GA8UX,QAASS,GAAY9K,EAAS+K,GAC1B,GAAI5E,EAoBJ,OAnB+B,KAA3B4E,EAAOtE,QAAQ,UACfsE,EAASA,EAAOvL,UAAU,GAC1BuL,EAASA,EAAOzL,OAAO,GAAG+F,cAAgB0F,EAAOvL,UAAU,IAE/DuL,EAASA,EAAO3L,QAAQ4L,GAAY,OACpC7E,EAAQnG,EAAQiL,aAAa,QAAU9K,GAAM+K,GAAKH,GACpC,OAAV5E,EACAA,EAAQtH,EACS,SAAVsH,EACPA,EAAQ,KACS,SAAVA,EACPA,GAAQ,EACS,UAAVA,EACPA,GAAQ,EACDgF,GAAahJ,KAAKgE,IAAoB,QAAV4E,EACnC5E,EAAQiF,WAAWjF,GACZkF,GAAWlJ,KAAKgE,KAAWmF,GAAiBnJ,KAAKgE,KACxDA,EAAYoF,SAAS,WAAapF,EAAQ,QAEvCA,EAEX,QAASqF,GAAaxL,EAAS2I,EAASpF,GACpC,GAAiBwH,GAAQ5E,EAArBoB,KAA4BkE,EAAOzL,EAAQiL,aAAa,QAAU9K,GAAM+K,GAAK,OACjF,KAAKH,IAAUpC,GACXxC,EAAQ2E,EAAY9K,EAAS+K,GACzB5E,IAAUtH,IACN6M,GAAevJ,KAAK4I,IAAmB,UAARU,IACV,gBAAVtF,GACHxH,EAAE,IAAMwH,GAAOtG,OACfsG,EAAQhG,GAAMkK,SAAS1L,EAAE,IAAMwH,GAAOwF,QAC/BpI,IACP4C,EAAQhG,GAAMkK,SAAS9G,EAAO4C,KAGlCA,EAAQnG,EAAQiL,aAAaF,IAGrCxD,EAAOwD,GAAU5E,EAGzB,OAAOoB,GA0FX,QAASqE,GAAoBC,EAAGC,GAC5B,MAAOnN,GAAEoN,SAASF,EAAGC,MAAU,EAEnC,QAASE,KACL,GAAIC,GAAStN,EAAE4J,KACf,OAAO5J,GAAEuN,QAAQD,EAAOE,KAAK,QAAUhM,GAAM+K,GAAK,SAC9C,SACA,cACA,mBACOe,EAAO7J,GAAG,YAmPzB,QAASgK,GAAUpM,EAASqM,GACxB,GAAIC,GAAWtM,EAAQsM,SAASjH,aAChC,QAAQ,sCAAsClD,KAAKmK,IAAatM,EAAQuM,SAAW,MAAQD,EAAWtM,EAAQwM,MAAQH,EAAmBA,IAAqBI,EAAQzM,GAE1K,QAASyM,GAAQzM,GACb,MAAOrB,GAAE+N,KAAKC,QAAQF,QAAQzM,KAAarB,EAAEqB,GAAS4M,UAAUC,UAAUC,OAAO,WAC7E,MAAqC,WAA9BnO,EAAEuB,IAAIqI,KAAM,gBACpB1I,OAmIP,QAASkN,GAAYC,EAAUC,GAC3B,MAAO,IAAIF,GAAYG,GAAGhE,KAAK8D,EAAUC,GA7tFhD,GACoKE,GAiE7J7I,EAGA8I,EAGAC,EAGAC,EA6FAC,EAA6BC,EAAiCC,EAA8BC,EAA4BC,EAA6BC,EAA4B9N,EAolDjL+N,EAoBAvF,EAuGAyB,EAAkBC,EAAiBE,EAAoBC,EAAmBF,EAe1E6D,EA4DAC,EAmBGC,GA4IHC,GAqFAC,GA2BAxC,GAA+BL,GAAkEC,GAA4DN,GA0O7JmD,GAOAC,GA+JAC,GAUAC,GACAC,GAwCAC,GAgDAC,GAEGC,GAqBHC,GAcAC,GA+aAC,GAMAC,GA7pGA3O,GAAQvB,EAAOuB,MAAQvB,EAAOuB,QAAW4O,aAAgB9F,GAAStK,EAAEsK,OAAQhD,GAAOtH,EAAEsH,KAAM+I,GAAUrQ,EAAEqQ,QAASC,GAAQtQ,EAAEsQ,MAAO9F,GAAOxK,EAAEwK,KAAMzI,GAAOyG,KAAgB+H,GAAOtQ,EAAOsQ,SAAY9O,MAAc8B,GAAgB,IAAKiN,GAAe,uBAAwB3O,GAAkB,sEAAuE2K,GAAe,uBAAwBiE,GAAW,WAAYrG,GAAS,SAAUsG,GAAS,SAAUnL,GAAS,SAAUoL,GAAO,OAAQtG,GAAU,UAAWxE,GAAY,YAAa+K,MAAkBC,MAAkBC,MAAWA,MAAOC,GAAoB,WAC9lB,GAAIC,GAAKC,EAAaC,EAAMC,EAAMnH,EAAShE,EAAOoL,EAAS1M,UAAU,OAAUD,EAAI,EAAGvD,EAASwD,UAAUxD,OAAQmQ,GAAO,CAaxH,KAZsB,iBAAXD,KACPC,EAAOD,EACPA,EAAS1M,UAAUD,OACnBA,KAEkB,gBAAX2M,IAAwBE,OAAO3L,WAAWyL,KACjDA,MAEA3M,IAAMvD,IACNkQ,EAASxH,KACTnF,KAEGA,EAAIvD,EAAQuD,IACf,GAAgC,OAA3BuF,EAAUtF,UAAUD,IACrB,IAAK0M,IAAQnH,GACG,WAARmH,GAA6B,UAARA,GAA4B,KAARA,IAG7CH,EAAMI,EAAOD,GACbD,EAAOlH,EAAQmH,GACXC,IAAWF,IAGXG,GAAQH,IAASI,OAAOC,cAAcL,KAAUD,EAAcK,OAAOjB,QAAQa,MACzED,GACAA,GAAc,EACdjL,EAAQgL,GAAOM,OAAOjB,QAAQW,GAAOA,MAErChL,EAAQgL,GAAOM,OAAOC,cAAcP,GAAOA,KAE/CI,EAAOD,GAAQJ,GAAkBM,EAAMrL,EAAOkL,IACvCA,IAAShR,IAChBkR,EAAOD,GAAQD,IAK/B,OAAOE,GAEf5P,IAAMwC,QAAU,aAAavD,QAAQ,aAAc,IAGnDN,EAAMmK,OAAS,SAAUkH,GACrB,GACOC,GAEAlD,EAHHmD,EAAO,aACIC,EAAO/H,KAAMgI,EAAWJ,GAASA,EAAMjH,KAAOiH,EAAMjH,KAAO,WAClEoH,EAAKE,MAAMjI,KAAMlF,WAEzBgN,GAAKI,UAAYH,EAAKG,UACtBvD,EAAKqD,EAASrD,GAAKqD,EAASE,UAAY,GAAIJ,EAC5C,KAAKD,IAAUD,GAEPjD,EAAGkD,GADc,MAAjBD,EAAMC,IAAmBD,EAAMC,GAAQjM,cAAgBuM,OAC1CzH,IAAO,KAAUoH,EAAKI,UAAUL,GAASD,EAAMC,IAE/CD,EAAMC,EAK3B,OAFAlD,GAAG/I,YAAcoM,EACjBA,EAAStH,OAASqH,EAAKrH,OAChBsH,GAEXzR,EAAM2R,UAAUE,aAAe,SAAUhI,GACrCJ,KAAKI,QAAUzF,KAAeqF,KAAKI,QAASA,IAE5CrE,EAAanE,GAAMmE,WAAa,SAAU4I,GAC1C,MAAqB,kBAAPA,IAEdE,EAAiB,WACjB7E,KAAKqI,mBAAoB,GAEzBvD,EAAqB,WACrB,MAAO9E,MAAKqI,qBAAsB,GAElCtD,EAAaxO,EAAMmK,QACnBC,KAAM,WACFX,KAAKsI,YAETC,KAAM,SAAUC,EAAWC,EAAUC,GACjC,GAAiB/K,GAAyErG,EAAQqR,EAAUC,EAA4DC,EAApKd,EAAO/H,KAAW8I,QAAoBN,KAAchI,IAAUgI,GAAaA,EAAsCO,QAA4BN,KAAa5B,EAC9J,IAAI4B,IAAanS,EAAW,CACxB,IAAKqH,IAAO6K,GACRT,EAAKQ,KAAK5K,EAAK6K,EAAU7K,GAE7B,OAAOoK,GAEX,IAAKpK,EAAM,EAAGrG,EAASwR,EAAWxR,OAAQqG,EAAMrG,EAAQqG,IACpD6K,EAAYM,EAAWnL,GACvBiL,EAAUG,EAAqBN,EAAWA,EAASD,GAC/CI,IACIF,IACAC,EAAWC,EACXA,EAAU,WACNb,EAAKiB,OAAOR,EAAWI,GACvBD,EAASV,MAAMF,EAAMjN,YAEzB8N,EAAQD,SAAWA,GAEvBE,EAASd,EAAKO,QAAQE,GAAaT,EAAKO,QAAQE,OAChDK,EAAOI,KAAKL,GAGpB,OAAOb,IAEXW,IAAK,SAAUI,EAAYL,GACvB,MAAOzI,MAAKuI,KAAKO,EAAYL,GAAU,IAE3C3R,MAAO,SAAU0R,EAAWC,GACxB,GAAiB9K,GAAyErG,EAAQsR,EAA4DC,EAA1Jd,EAAO/H,KAAW8I,QAAoBN,KAAchI,IAAUgI,GAAaA,EAA4BO,QAA4BN,KAAa5B,EACpJ,KAAKlJ,EAAM,EAAGrG,EAASwR,EAAWxR,OAAQqG,EAAMrG,EAAQqG,IACpD6K,EAAYM,EAAWnL,GACvBiL,EAAUG,EAAqBN,EAAWA,EAASD,GAC/CI,IACAC,EAASd,EAAKO,QAAQE,GAAaT,EAAKO,QAAQE,OAChDK,EAAOK,QAAQN,GAGvB,OAAOb,IAEXoB,QAAS,SAAUX,EAAWY,GAC1B,GAAmDzL,GAAKrG,EAApDyQ,EAAO/H,KAAM6I,EAASd,EAAKO,QAAQE,EACvC,IAAIK,EAAQ,CAOR,IANAO,EAAIA,MACJA,EAAEC,OAAStB,EACXqB,EAAEf,mBAAoB,EACtBe,EAAEvE,eAAiBA,EACnBuE,EAAEtE,mBAAqBA,EACvB+D,EAASA,EAAO3B,QACXvJ,EAAM,EAAGrG,EAASuR,EAAOvR,OAAQqG,EAAMrG,EAAQqG,IAChDkL,EAAOlL,GAAK2L,KAAKvB,EAAMqB,EAE3B,OAAOA,GAAEf,qBAAsB,EAEnC,OAAO,GAEXW,OAAQ,SAAUR,EAAWI,GACzB,GAAmDjL,GAA/CoK,EAAO/H,KAAM6I,EAASd,EAAKO,QAAQE,EACvC,IAAIA,IAAclS,EACdyR,EAAKO,eACF,IAAIO,EACP,GAAID,EACA,IAAKjL,EAAMkL,EAAOvR,OAAS,EAAGqG,GAAO,EAAGA,IAChCkL,EAAOlL,KAASiL,GAAWC,EAAOlL,GAAKgL,WAAaC,GACpDC,EAAOU,OAAO5L,EAAK,OAI3BoK,GAAKO,QAAQE,KAGrB,OAAOT,MAiBX/C,EAAqB,OAAQC,EAAe,iBAAkBC,EAAqB,QAASC,EAAc,aAAcC,EAAqB,OAAQC,EAAc,aAAc9N,GAC7K,GACA,IACA,KACA,MACA,QAERqN,GACI4E,UAAW,OACXC,cAAc,EACdC,OAAQ,SAAU5H,EAAUvG,GACxB,GAAIoC,GAAKrG,EAAQ8L,EAAO,EACxB,KAAKzF,EAAM,EAAGrG,EAASiE,EAAKjE,OAAQqG,EAAMrG,EAAQqG,IAC9CyF,GAAQtB,EAASvG,EAAKoC,GAE1B,OAAOyF,IAEXuG,QAAS,SAAU7H,EAAU1B,GACzB,GAAgPuE,GAAIiF,EAAOjM,EAAvPkM,EAAWnJ,MAAWV,KAAMI,GAAUoJ,EAAYK,EAASL,UAAWM,EAAeN,EAAUxR,MAAMgN,GAAoB,GAAIyE,EAAeI,EAASJ,aAAcM,EAAe,wDACtL,IAAIhO,EAAW+F,GACX,MAAOA,EAKX,KAHAiI,GAAgBN,EAAe,QAAUD,EAAY,KAAO,GAC5DO,GAAgB,gBAChBH,EAAQ9H,EAASjL,QAAQqO,EAAoB,aAAarO,QAAQoO,EAAc,2BAA2BpO,QAAQsO,EAAa,KAAKtO,QAAQuO,EAAoB,aAAazO,MAAM,KAC/KgH,EAAM,EAAGA,EAAMiM,EAAMtS,OAAQqG,IAC9BoM,GAAgBvT,EAAYoT,EAAMjM,GAAMA,EAAM,IAAM,EAExDoM,IAAgBN,EAAe,KAAO,IACtCM,GAAgB,uBAChBA,EAAeA,EAAalT,QAAQwO,EAAa,IACjD,KAGI,MAFAV,GAAS3B,SAAS8G,EAAcC,GAChCpF,EAAGqF,WAAapL,KAAKzE,MAAMyP,EAAMtS,OAAS,GACnCqN,EACT,MAAOyE,GACL,KAAUa,OAAMrS,GAAMsS,OAAO,8CAAmDpI,EAAUiI,OAarG,WAmBG,QAASI,GAAMC,GAEX,MADAC,GAAUC,UAAY,EACfD,EAAUzQ,KAAKwQ,GAAU,IAAMA,EAAOvT,QAAQwT,EAAW,SAAU/G,GACtE,GAAIiH,GAAIC,EAAKlH,EACb,cAAciH,KAAM/J,GAAS+J,EAAI,OAAS,OAASjH,EAAEmH,WAAW,GAAGC,SAAS,KAAKxD,YAChF,IAAM,IAAMkD,EAAS,IAE9B,QAASxN,GAAImC,EAAK4L,GACd,GAAI9P,GAAG+P,EAAGC,EAAGvT,EAAoBwT,EAA8B5L,EAA1C6L,EAAOC,EAAcpN,EAAQ+M,EAAO5L,EAQzD,IAPInB,SAAgBA,KAAUjC,UAAiBiC,GAAMqN,SAAWpE,KAC5DjJ,EAAQA,EAAMqN,OAAOlM,UAEdmM,KAAQrE,KACfjJ,EAAQsN,EAAI5B,KAAKqB,EAAQ5L,EAAKnB,IAElCsB,QAActB,GACVsB,IAASsB,GACT,MAAO2J,GAAMvM,EACV,IAAIsB,IAAS4H,GAChB,MAAOqE,UAASvN,GAAgBA,EAAPwE,GAAgB2E,EACtC,IAAI7H,IAASuB,IAAWvB,IAAS6H,GACpC,MAAcnJ,GAAPwE,EACJ,IAAIlD,IAASvD,GAAQ,CACxB,IAAKiC,EACD,MAAOmJ,GAIX,IAFAiE,GAAOI,EACPN,KAC8B,mBAA1BJ,EAASzC,MAAMrK,GAA6B,CAE5C,IADAtG,EAASsG,EAAMtG,OACVuD,EAAI,EAAGA,EAAIvD,EAAQuD,IACpBiQ,EAAQjQ,GAAK+B,EAAI/B,EAAG+C,IAAUmJ,EAIlC,OAFA8D,GAAuB,IAAnBC,EAAQxT,OAAe,KAAO0T,EAAM,MAAQA,EAAMF,EAAQlU,KAAK,MAAQoU,GAAO,KAAOD,EAAO,IAAM,IAAMD,EAAQlU,KAAK,KAAO,IAChIoU,EAAMD,EACCF,EAEX,GAAIK,SAAcA,KAAQvP,GAEtB,IADArE,EAAS4T,EAAI5T,OACRuD,EAAI,EAAGA,EAAIvD,EAAQuD,UACTqQ,GAAIrQ,KAAO2F,KAClBoK,EAAIM,EAAIrQ,GACRgQ,EAAIjO,EAAIgO,EAAGhN,GACPiN,GACAC,EAAQ7B,KAAKkB,EAAMS,IAAMI,EAAM,KAAO,KAAOH,QAKzD,KAAKD,IAAKhN,GACFuK,OAAOzL,eAAe4M,KAAK1L,EAAOgN,KAClCC,EAAIjO,EAAIgO,EAAGhN,GACPiN,GACAC,EAAQ7B,KAAKkB,EAAMS,IAAMI,EAAM,KAAO,KAAOH,GAO7D,OAFAA,GAAuB,IAAnBC,EAAQxT,OAAe,KAAO0T,EAAM,MAAQA,EAAMF,EAAQlU,KAAK,MAAQoU,GAAO,KAAOD,EAAO,IAAM,IAAMD,EAAQlU,KAAK,KAAO,IAChIoU,EAAMD,EACCF,GA9Ef,GAA4IG,GAAKI,EAQ1IF,EARHb,EAAY,2HAAyIG,GACjJa,KAAM,MACNC,KAAM,MACNC,KAAM,MACNC,KAAM,MACNC,KAAM,MACNC,IAAK,MACLC,KAAM,QACFjB,KAAcA,eACfxO,MAAKgM,UAAU+C,SAAWpE,KACjC3K,KAAKgM,UAAU+C,OAAS,WACpB,GAAIlD,GAAO/H,IACX,OAAOmL,UAASpD,EAAK6D,WAAa1U,EAAI6Q,EAAK8D,iBAAkB,GAAK,IAAM3U,EAAI6Q,EAAK+D,cAAgB,GAAK,IAAM5U,EAAI6Q,EAAKgE,cAAgB,IAAM7U,EAAI6Q,EAAKiE,eAAiB,IAAM9U,EAAI6Q,EAAKkE,iBAAmB,IAAM/U,EAAI6Q,EAAKmE,iBAAmB,IAAM,MAEnP9J,OAAO8F,UAAU+C,OAASkB,OAAOjE,UAAU+C,OAASmB,QAAQlE,UAAU+C,OAAS,WAC3E,MAAOjL,MAAK4L,kBAkETjF,IAAK0F,YAAcxF,KAC1BF,GAAK0F,UAAY,SAAUzO,EAAO0O,EAAUC,GACxC,GAAI1R,EAGJ,IAFAmQ,EAAM,GACNI,EAAS,SACEmB,KAAUzF,GACjB,IAAKjM,EAAI,EAAGA,EAAI0R,EAAO1R,GAAK,EACxBuQ,GAAU,eAEAmB,KAAU/L,KACxB4K,EAASmB,EAGb,IADArB,EAAMoB,EACFA,SAAmBA,KAAazF,WAAoByF,KAAa3Q,UAAiB2Q,GAAShV,SAAWwP,IACtG,KAAUmD,OAAM,iBAEpB,OAAOrN,GAAI,IAAM4P,GAAI5O,SAIhC,WAgIG,QAAS6O,GAAYC,GACjB,GAAIA,EAAS,CACT,GAAIA,EAAQC,aACR,MAAOD,EAEX,UAAWA,KAAYlM,GAAQ,CAC3B,GAAIgG,GAAW5O,GAAM4O,QACrB,OAAOA,GAASkG,IAAYlG,EAASkG,EAAQ/V,MAAM,KAAK,KAAO,KAEnE,MAAO,MAEX,MAAO,MAEX,QAASiW,GAAWF,GAIhB,MAHIA,KACAA,EAAUD,EAAYC,IAEnBA,GAAW9U,GAAM4O,SAASqG,QAerC,QAASC,GAAWC,EAAM7C,EAAQwC,GAC9BA,EAAUE,EAAWF,EACrB,IAAIM,GAAWN,EAAQO,UAAUC,SAAUC,EAAOH,EAASG,KAAMC,EAASJ,EAASI,MAEnF,OADAlD,GAAS8C,EAASK,SAASnD,IAAWA,EAC/BA,EAAOrT,QAAQyW,EAAkB,SAAUtV,GAAV,GAChCuV,GACAvO,EACAK,CA8DJ,OA7Dc,MAAVrH,EACAgH,EAAS+N,EAAKS,UACG,OAAVxV,EACPgH,EAAS9H,EAAI6V,EAAKS,WACD,QAAVxV,EACPgH,EAASmO,EAAKM,UAAUV,EAAKW,UACZ,SAAV1V,EACPgH,EAASmO,EAAKQ,MAAMZ,EAAKW,UACR,MAAV1V,EACPgH,EAAS+N,EAAKa,WAAa,EACV,OAAV5V,EACPgH,EAAS9H,EAAI6V,EAAKa,WAAa,GACd,QAAV5V,EACPgH,EAASoO,EAAOK,UAAUV,EAAKa,YACd,SAAV5V,EACPgH,EAASoO,EAAOO,MAAMZ,EAAKa,YACV,OAAV5V,EACPgH,EAAS9H,EAAI6V,EAAKc,cAAgB,KACjB,SAAV7V,EACPgH,EAAS9H,EAAI6V,EAAKc,cAAe,GAChB,MAAV7V,EACPgH,EAAS+N,EAAKe,WAAa,IAAM,GAChB,OAAV9V,EACPgH,EAAS9H,EAAI6V,EAAKe,WAAa,IAAM,IACpB,MAAV9V,EACPgH,EAAS+N,EAAKe,WACG,OAAV9V,EACPgH,EAAS9H,EAAI6V,EAAKe,YACD,MAAV9V,EACPgH,EAAS+N,EAAKgB,aACG,OAAV/V,EACPgH,EAAS9H,EAAI6V,EAAKgB,cACD,MAAV/V,EACPgH,EAAS+N,EAAKiB,aACG,OAAVhW,EACPgH,EAAS9H,EAAI6V,EAAKiB,cACD,MAAVhW,EACPgH,EAAS7G,GAAKgC,MAAM4S,EAAKkB,kBAAoB,KAC5B,OAAVjW,GACPgH,EAAS+N,EAAKkB,kBACVjP,EAAS,KACTA,EAAS7G,GAAKgC,MAAM6E,EAAS,KAEjCA,EAAS9H,EAAI8H,IACI,QAAVhH,EACPgH,EAAS9H,EAAI6V,EAAKkB,kBAAmB,GACpB,OAAVjW,EACPgH,EAAS+N,EAAKe,WAAa,GAAKd,EAASkB,GAAG,GAAKlB,EAASmB,GAAG,GAC5C,QAAVnW,GACPuV,EAAUR,EAAKqB,oBACf/O,EAAOkO,EAAU,EACjBvO,GAAS7G,GAAAA,GAAK0G,IAAI0O,EAAU,KAAe5W,MAAM,KAAK,GACtD4W,EAAUpV,GAAK0G,IAAI0O,GAAoB,GAATvO,EAC9BA,GAAUK,EAAO,IAAM,KAAOnI,EAAI8H,GAClCA,GAAU,IAAM9H,EAAIqW,IACH,OAAVvV,GAA4B,MAAVA,IACzBgH,EAAS+N,EAAKqB,oBAAsB,GACpC/O,EAAOL,EAAS,EAChBA,GAAS7G,GAAAA,GAAK0G,IAAIG,IAAmBrI,MAAM,KAAK,GAChDqI,GAAUK,EAAO,IAAM,MAAkB,OAAVrH,EAAiBd,EAAI8H,GAAUA,IAE3DA,IAAW1I,EAAY0I,EAAShH,EAAMkP,MAAM,EAAGlP,EAAMV,OAAS,KAG7E,QAAS+W,GAAalX,EAAQ+S,EAAQwC,GAAtC,GAEQC,GAAqC2B,EAA+BC,EAAmCC,EAAmCC,EAAeC,EAAQC,EAAYC,EAAWC,EAAiBC,EAAoBC,EAAuBC,EAASC,EAAUC,EAAeC,EAAgBC,EAAqBxR,EAAeD,EAAKrG,EAAQ+X,EAAIC,EAAUC,EAAmBC,EAAcC,EAAYC,EAAWC,EAASC,EAAUC,EAAcC,EAAeC,EAAgBC,EAAY3Y,EA2Bje4Y,EAmGIC,CA7HhB,IAFAxD,EAAUE,EAAWF,GACjBC,EAAeD,EAAQC,aAAc2B,EAAU3B,EAAawD,GAAQ5B,EAAY5B,EAAayD,SAAU5B,EAAU7B,EAAa6B,QAAQ,GAAIC,KAAmFM,EAAW5X,EAAS,EAAqDiY,EAAciB,EAAOzS,EAAQyS,EAA0JL,KAC7d7Y,IAAWb,EACX,MAAO+Z,EAEX,KAAKlF,SAAShU,GACV,MAAOA,EAEX,KAAK+S,EACD,MAAOwC,GAAQnF,KAAKjQ,OAASH,EAAOmZ,iBAAmBnZ,GAAAA,CAG3D,IADA2X,EAAqByB,EAAqBC,KAAKtG,GACvB,CAepB,GAdAA,EAAS4E,EAAmB,GAAGhS,cAC/B6R,EAAwB,MAAXzE,EACb0E,EAAuB,MAAX1E,GACRyE,GAAcC,KACdjC,EAAegC,EAAahC,EAAa8D,SAAW9D,EAAa+D,QACjEpC,EAAU3B,EAAawD,GACvB5B,EAAY5B,EAAayD,SACzB1B,EAAS/B,EAAa+B,OACtBF,EAAU7B,EAAa6B,QAAQO,EAAW,EAAI,IAElDF,EAAkBC,EAAmB,GACjCD,IACAN,GAAaM,GAEF,MAAX3E,EAEA,MADI+F,GAAMpB,EAAkB1X,EAAOwZ,cAAcpC,GAAapX,EAAOwZ,gBAC9DV,EAAIpZ,QAAQsZ,EAAOxD,EAAawD,GAiB3C,IAfIvB,IACAzX,GAAU,KAEdA,EAASyZ,EAAMzZ,EAAQoX,GACvBQ,EAAW5X,EAAS,EACpBA,EAASA,EAAOR,MAAMwZ,GACtBnB,EAAU7X,EAAO,GACjB8X,EAAW9X,EAAO,GACd4X,IACAC,EAAUA,EAAQ/X,UAAU,IAEhC2G,EAAQiT,EAAa7B,EAAS,EAAGA,EAAQ1X,OAAQqV,GAC7CsC,IACArR,GAAS0Q,EAAUW,GAER,MAAX/E,IAAmB6E,EACnB,MAAOnR,EAGX,KADAzG,EAASkZ,EACJ1S,EAAM,EAAGrG,EAASkX,EAAQlX,OAAQqG,EAAMrG,EAAQqG,IACjD0R,EAAKb,EAAQzX,OAAO4G,GAEhBxG,GADO,MAAPkY,EACUzR,EACI,MAAPyR,GAAqB,MAAPA,EACXX,EAEAW,CAGlB,OAAOlY,GAUX,IARI+S,EAAOhM,QAAQ,SAAcgM,EAAOhM,QAAQ,SAAagM,EAAOhM,QAAQ,YACxEgM,EAASA,EAAOrT,QAAQia,EAAe,SAAU9Y,GAC7C,GAAI+Y,GAAY/Y,EAAMjB,OAAO,GAAGF,QAAQ,KAAM,IAAKma,EAAUhZ,EAAMkP,MAAM,GAAGrQ,QAAQka,EAAW,GAE/F,OADAtC,GAASxF,KAAK+H,GACPC,KAGf/G,EAASA,EAAOvT,MAAM,KAClBoY,GAAY7E,EAAO,GACnBA,EAASA,EAAO,GAChBqF,GAAoB,MACjB,IAAe,IAAXpY,GAAgB+S,EAAO,IAE9B,GADAA,EAASA,EAAO,GACZA,EAAOhM,QAAQgT,QAAgBhH,EAAOhM,QAAQiT,OAC9C,MAAOjH,OAGXA,GAASA,EAAO,EAyBpB,IAvBA2F,EAAe3F,EAAOhM,QAAQ,KAC9B4R,EAAgB5F,EAAOhM,QAAQ,KAC/B0Q,EAAYiB,MACZlB,EAAamB,MACTlB,IACAzX,GAAU,KAEVwX,GAA4C,OAA9BzE,EAAO4F,EAAgB,KACrC5F,EAASA,EAAOvT,MAAM,MAAMC,KAAK,IACjC+X,GAAa,IAEbA,GAAcC,KACdjC,EAAegC,EAAahC,EAAa8D,SAAW9D,EAAa+D,QACjEpC,EAAU3B,EAAawD,GACvB5B,EAAY5B,EAAayD,SACzB1B,EAAS/B,EAAa+B,QAE1BY,EAAWpF,EAAOhM,QAAQkT,MACtB9B,IACApF,EAASA,EAAOrT,QAAQwa,EAAahB,IAEzCb,EAAetF,EAAOhM,QAAQiS,GAC9B7Y,EAAS4S,EAAO5S,OACZkY,MAmBA,GAlBAP,GAAW9X,GAAAA,GAAkBR,MAAM,KAE/BsY,EADAA,EAAS,GACE2B,EAAMzZ,EAAQyH,KAAKC,IAAIoQ,EAAS,KAEhCA,EAAS,GAExBA,EAAWA,EAAStY,MAAMwZ,GAAO,IAAME,EACvCX,EAAYxF,EAAOoH,YAAYH,GAAQ3B,EACvCC,EAAavF,EAAOoH,YAAYJ,GAAS1B,EACzCG,EAAUD,KACVE,EAAWH,KACX9R,EAAMsR,EAAS3X,OACVqY,GAAYC,IACb1F,EAASA,EAAOjT,UAAU,EAAGuY,GAAgBtF,EAAOjT,UAAUuY,EAAe,GAC7ElY,EAAS4S,EAAO5S,OAChBkY,KACA7R,EAAM,GAENgS,GAAWD,EAAYD,EACvB9R,EAAM+R,MACH,IAAID,EAAaC,EACpB,GAAIE,GAAYjS,EAAM8R,EAAY,CAE9B,IADIS,EAAUU,EAAMzZ,EAAQsY,EAAYV,GACjCmB,EAAQnZ,OAAOmZ,EAAQ5Y,OAAS,KAAO6Z,GAAQ1B,EAAa,GAAKA,EAAaC,GACjFD,IACAS,EAAUU,EAAMzZ,EAAQsY,EAAYV,EAExCpR,GAAM8R,MACCE,IAAWhS,EAAM+R,IACxB/R,EAAM+R,EA0BlB,IAtBAvY,EAASyZ,EAAMzZ,EAAQwG,EAAKoR,GAC5BU,EAAavF,EAAOhM,QAAQgT,GAC5BnB,EAAiBL,EAAYxF,EAAOhM,QAAQiT,GAExCnB,EADAP,OAAoBC,MACZA,EACDD,OAAoBC,MACnBD,EAEAA,EAAaC,EAAYA,EAAYD,EAEjDA,EAAavF,EAAOoH,YAAYJ,GAChCxB,EAAYxF,EAAOoH,YAAYH,GAE3B9Z,EADAoY,OAAoBC,MACdA,EACCD,OAAoBC,MACrBD,EAEAA,EAAaC,EAAYD,EAAaC,EAE5CM,GAAS1Y,IACTD,EAAM2Y,GAENA,MAAa,CAab,IAZApS,GAAQzG,GAAAA,GAAkBR,MAAMwZ,GAChCnB,EAAUpR,EAAM,GAChBqR,EAAWrR,EAAM,IAAMyS,EACvBnB,EAAgBF,EAAQ1X,OACxB6X,EAAiBF,EAAS3X,OACtByX,GAAY5X,MAAe,IAC3B4X,GAAW,GAEf5X,EAAS+S,EAAOjT,UAAU,EAAG+Y,GACzBjB,IAAaQ,IACbpY,GAAU,KAETwG,EAAMqS,EAAOrS,EAAMrG,EAAQqG,IAAO,CAEnC,GADA0R,EAAKnF,EAAOnT,OAAO4G,GACf6R,OACA,GAAInY,EAAMsG,EAAMuR,EAAe,CAC3B/X,GAAU6X,CACV,YAUJ,IAPIU,OAAmBA,EAAY/R,IAC/ByR,EAAciB,GAEdb,EAAe7R,GAAOuR,GAAiBM,EAAe7R,OACtDxG,GAAU6X,EACVrR,EAAM6R,GAENA,IAAiB7R,EAAK,CACtBxG,IAAW8X,EAAWX,EAAU+B,GAASpB,EACzCtR,GAAOtG,EAAMmY,EAAe,CAC5B,UAGJH,IAAO8B,GACPha,GAAUkY,EACVD,EAAcC,GACPA,IAAO6B,IACd/Z,GAAUiY,GASlB,GANIE,IACAnY,EAAS0Z,EAAa1Z,EAAQ6Y,GAASjB,IAAaQ,EAAoB,EAAI,GAAI3Q,KAAKxG,IAAIf,EAAK6X,EAAgBc,GAAQrD,IAEtHtV,GAAO2Y,IACP7Y,GAAU+S,EAAOjT,UAAUI,EAAM,IAEjCsX,GAAcC,EAAW,CAEzB,IADAhR,EAAQyS,EACH1S,EAAM,EAAGrG,EAASH,EAAOG,OAAQqG,EAAMrG,EAAQqG,IAChD0R,EAAKlY,EAAOJ,OAAO4G,GACnBC,GAAgB,MAAPyR,GAAqB,MAAPA,EAAaX,EAASW,CAEjDlY,GAASyG,EAGb,GADAtG,EAASmX,EAASnX,OAEd,IAAKqG,EAAM,EAAGA,EAAMrG,EAAQqG,IACxBxG,EAASA,EAAON,QAAQoa,EAAaxC,EAAS9Q,IAI1D,MAAOxG,GAvcd,GAycO0Z,GAiCAD,EAWAlG,EApfA4C,EAAmB,gGAAiGiD,EAAuB,oBAAqBO,EAAgB,uCAAwCO,EAAc,MAAOhB,EAAQ,GAAIF,EAAQ,IAAKiB,EAAQ,IAAKF,EAAQ,IAAKC,EAAO,IAAKF,EAAc,KAAMM,EAAK,QAASC,KAAoB9G,QACtW9S,IAAM4O,SAAS,UACXe,KAAMgK,EACN5E,cACI6B,SAAU,MACV4B,SAAU,EACVqB,IAAK,IACLC,IAAK,IACLC,WAAY,GACZjB,SACIlC,SACI,OACA,OAEJ4B,SAAU,EACVqB,IAAK,IACLC,IAAK,IACLC,WAAY,GACZjD,OAAQ,KAEZ+B,UACIlJ,KAAM,YACNqK,KAAM,MACNpD,SACI,OACA,MAEJ4B,SAAU,EACVqB,IAAK,IACLC,IAAK,IACLC,WAAY,GACZjD,OAAQ,MAGhBzB,WACIC,UACIC,MACIQ,OACI,SACA,SACA,UACA,YACA,WACA,SACA,YAEJF,WACI,MACA,MACA,MACA,MACA,MACA,MACA,OAEJoE,YACI,KACA,KACA,KACA,KACA,KACA,KACA,OAGRzE,QACIO,OACI,UACA,WACA,QACA,QACA,MACA,OACA,OACA,SACA,YACA,UACA,WACA,YAEJF,WACI,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,QAGRS,IACI,KACA,KACA,MAEJC,IACI,KACA,KACA,MAEJd,UACIyE,EAAG,WACHC,EAAG,sBACHC,EAAG,iCACHnV,EAAG,mBACHoV,EAAG,sBACHC,EAAG,UACHC,EAAG,UACHC,EAAG,8BACHC,EAAG,UACHC,EAAG,aACHC,EAAG,iCACHC,EAAG,aACHC,EAAG,cAEPC,IAAK,IACLC,IAAK,IACLC,SAAU,EACVC,gBAAiB,QAuB7Bjb,GAAM8U,QAAU,SAAUoG,GACtB,GAA+BpG,GAA3BlG,EAAW5O,GAAM4O,QACrB,OAAIsM,KAAgBxc,EAKTkQ,EAASqG,SAJhBH,EAAUD,EAAYqG,IAAgBtM,EAAS+K,GAC/C7E,EAAQM,SAAWN,EAAQO,UAAUC,SACrC1G,EAASqG,QAAUH,EAFnBA,IAOR9U,GAAM6U,YAAcA,EACpB7U,GAAMgV,WAAaA,EACnBhV,GAAM8U,QAAQ6E,GA0SVV,EAAe,SAAU1Z,EAAQ6Y,EAAO3Y,EAAKsV,GAA9B,GAIXqC,GAASE,EACTvR,EAAKiM,EAAOhM,EACZmV,EALAvD,EAAerY,EAAO+G,QAAQyO,EAAawD,IAC3C6C,EAAarG,EAAagF,UAAUzK,QACpCyK,EAAYqB,EAAWC,OAO3B,IAHA5b,EAAMmY,OAAsBA,EAAenY,EAAM,EACjD2X,EAAU7X,EAAOF,UAAU+Y,EAAO3Y,GAClC6X,EAAgBF,EAAQ1X,OACpB4X,GAAiByC,EAAW,CAG5B,IAFAhU,EAAMuR,EACNtF,KACOjM,MAQH,GAPAC,EAAQoR,EAAQ/X,UAAU0G,EAAMgU,EAAWhU,GACvCC,GACAgM,EAAMX,KAAKrL,GAEfD,GAAOgU,EACPoB,EAAeC,EAAWC,QAC1BtB,EAAYoB,IAAiBzc,EAAYyc,EAAepB,EACtC,IAAdA,EAAiB,CACbhU,EAAM,GACNiM,EAAMX,KAAK+F,EAAQ/X,UAAU,EAAG0G,GAEpC,OAGRqR,EAAUpF,EAAMtJ,UAAU1J,KAAK+V,EAAayE,IAC5Cja,EAASA,EAAOF,UAAU,EAAG+Y,GAAShB,EAAU7X,EAAOF,UAAUI,GAErE,MAAOF,IAEPyZ,EAAQ,SAAUhT,EAAO2Q,EAAWQ,GASpC,MARAR,GAAYA,GAAa,EACzB3Q,GAAQA,GAAAA,GAAiBjH,MAAM,KAC/BiH,EAAQgB,KAAKgS,QAAQhT,EAAM,GAAK,KAAOA,EAAM,IAAMA,EAAM,GAAK2Q,EAAYA,KACtEQ,IACAnR,GAASA,GAEbA,GAAQA,GAAAA,GAAiBjH,MAAM,KAC/BiH,IAAUA,EAAM,GAAK,KAAOA,EAAM,IAAMA,EAAM,GAAK2Q,GAAaA,IACzD3Q,EAAMsV,QAAQtU,KAAKuU,IAAI5E,EAAW,MAEzC7D,EAAW,SAAU9M,EAAOwV,EAAK1G,GACjC,GAAI0G,EAAK,CACL,GAAmC,kBAA/B5B,EAAelI,KAAK1L,GACpB,MAAOkP,GAAWlP,EAAOwV,EAAK1G,EAC3B,UAAW9O,KAAUkJ,GACxB,MAAOuH,GAAazQ,EAAOwV,EAAK1G,GAGxC,MAAO9O,KAAUtH,EAAYsH,EAAQ,IAEzChG,GAAMsS,OAAS,SAAUkJ,GACrB,GAAIC,GAASvY,SACb,OAAOsY,GAAIvc,QAAQ+P,GAAc,SAAU5O,EAAOsb,EAAOC,GACrD,GAAI3V,GAAQyV,EAAO/Q,SAASgR,EAAO,IAAM,EACzC,OAAO5I,GAAS9M,EAAO2V,EAAoBA,EAAkBtc,UAAU,GAAK,OAGpFW,GAAM4b,eAAiB,SAAUtJ,GAI7B,MAH2B,QAAvBA,EAAOhD,MAAM,EAAG,KAChBgD,EAASA,EAAOhD,MAAM,EAAGgD,EAAO5S,OAAS,IAEtC4S,GAEXtS,GAAM6b,eAAiB,WACnB,IACI,MAAOlW,UAASmW,cAClB,MAAOtK,GACL,MAAO7L,UAASmC,gBAAgBgU,gBAGxC9b,GAAM+b,OAAS/C,EACfhZ,GAAMsB,YAAc,SAAUzB,EAASmc,GACnC,MAAOxd,GAAEqB,GAASwB,WAAW2a,IAAiB,IAAU,GAE5Dhc,GAAMwB,aAAe,SAAU3B,EAASmc,GACpC,MAAOxd,GAAEqB,GAAS0B,YAAYya,IAAiB,IAAU,GAE7Dhc,GAAM8S,SAAWA,KAEpB,WA8CG,QAASmJ,GAAWjW,EAAOoS,EAAO3Y,GAC9B,QAASuG,GAASoS,GAASpS,GAASvG,GAExC,QAASyc,GAAoBC,GACzB,MAAOA,GAAWhd,OAAO,GAE7B,QAASid,GAAeC,GACpB,MAAO7d,GAAE8d,IAAID,EAAaH,GAE9B,QAASK,GAAUpH,EAAMqH,GAChBA,GAA6B,KAApBrH,EAAKe,YACff,EAAKsH,SAAStH,EAAKe,WAAa,GAGxC,QAASwG,GAAW/Y,GAEhB,IADA,GAAIoC,GAAM,EAAGrG,EAASiE,EAAKjE,OAAQid,KAC5B5W,EAAMrG,EAAQqG,IACjB4W,EAAM5W,IAAQpC,EAAKoC,GAAO,IAAIb,aAElC,OAAOyX,GAEX,QAASC,GAAeC,GACpB,GAAuBxZ,GAAnByZ,IACJ,KAAKzZ,IAAYwZ,GACbC,EAAazZ,GAAYqZ,EAAWG,EAAUxZ,GAElD,OAAOyZ,GAEX,QAASC,GAAW/W,EAAOsM,EAAQwC,EAASkI,GACxC,IAAKhX,EACD,MAAO,KAEX,IA4CySyR,GAAIwF,EAAOvd,EAAQkX,EAASsG,EAAQC,EAAKC,EAASC,EAAeC,EAAeC,EAAaC,EAAeC,EAASrd,EA5C1Zsd,EAAY,SAAUtd,GAElB,IADA,GAAI6C,GAAI,EACDqP,EAAOvM,KAAS3F,GACnB6C,IACA8C,GAKJ,OAHI9C,GAAI,IACJ8C,GAAO,GAEJ9C,GACR0a,EAAY,SAAUxX,GACrB,GAAIyX,GAAK5S,EAAa7E,IAAajC,OAAO,UAAYiC,EAAO,KAAM/F,EAAQ4F,EAAM6X,OAAOC,EAAU3X,GAAM/F,MAAMwd,EAC9G,OAAIxd,IACAA,EAAQA,EAAM,GACd0d,GAAY1d,EAAMV,OACXgL,SAAStK,EAAO,KAEpB,MACR2d,EAAiB,SAAUhI,EAAOiI,GAEjC,IADA,GAAkCrO,GAAMsO,EAA2CC,EAA/Ejb,EAAI,EAAGvD,EAASqW,EAAMrW,OAA0Bye,EAAc,EAAGC,EAAW,EACzEnb,EAAIvD,EAAQuD,IACf0M,EAAOoG,EAAM9S,GACbgb,EAAatO,EAAKjQ,OAClBwe,EAAWlY,EAAM6X,OAAOC,EAAUG,GAC9BD,IACAE,EAAWA,EAAShZ,eAEpBgZ,GAAYvO,GAAQsO,EAAaE,IACjCA,EAAcF,EACdG,EAAWnb,EAGnB,OAAIkb,IACAL,GAAYK,EACLC,EAAW,GAEf,MACRC,EAAe,WACd,GAAIjX,IAAS,CAKb,OAJIpB,GAAM7G,OAAO2e,KAAcxL,EAAOvM,KAClC+X,IACA1W,GAAS,GAENA,GACRgO,EAAWN,EAAQO,UAAUC,SAAUgJ,EAAO,KAAMC,EAAQ,KAAMC,EAAM,KAAMhC,EAAQ,KAAM7G,EAAU,KAAM8I,EAAU,KAAMC,EAAe,KAAM3Y,EAAM,EAAG+X,EAAW,EAAG1E,GAAU,EAAOjE,EAAO,GAAI7Q,MAAQ2W,EAAkB7F,EAAS6F,iBAAmB,KAAM0D,EAAcxJ,EAAKc,aAU1R,KATK3D,IACDA,EAAS,KAEbsE,EAAUxB,EAASK,SAASnD,GACxBsE,IACAtE,EAASsE,GAEbtE,EAASA,EAAOvT,MAAM,IACtBW,EAAS4S,EAAO5S,OACTqG,EAAMrG,EAAQqG,IAEjB,GADA0R,EAAKnF,EAAOvM,GACRqT,EACW,MAAP3B,EACA2B,GAAU,EAEViF,QAGJ,IAAW,MAAP5G,EAAY,CAKZ,GAJAwF,EAAQS,EAAU,KACbtI,EAASwJ,aACVxJ,EAASwJ,WAAahC,EAAexH,EAASG,OAEtC,OAARiJ,GAAgBvB,EAAQ,EACxB,QAGJ,IADAuB,EAAMvB,EAAQ,EAAIU,EAAU,GAAKI,EAAe3I,EAASwJ,WAAoB,GAAT3B,EAAa,YAAc,UAAU,GAC7F,OAARuB,GAAgBvC,EAAWuC,EAAK,EAAG,IACnC,MAAO,UAER,IAAW,MAAP/G,EAAY,CAMnB,GALAwF,EAAQS,EAAU,KACbtI,EAASyJ,eACVzJ,EAASyJ,aAAejC,EAAexH,EAASI,SAEpD+I,EAAQtB,EAAQ,EAAIU,EAAU,GAAKI,EAAe3I,EAASyJ,aAAsB,GAAT5B,EAAa,YAAc,UAAU,GAC/F,OAAVsB,GAAkBtC,EAAWsC,EAAO,EAAG,IACvC,MAAO,KAEXA,IAAS,MACN,IAAW,MAAP9G,EAAY,CAGnB,GAFAwF,EAAQS,EAAU,KAClBY,EAAOX,EAAUV,GACJ,OAATqB,EACA,MAAO,KAEE,IAATrB,IAC+B,gBAApBhC,KACPA,EAAkB0D,EAAcjU,SAASuQ,EAAiB,KAE9DqD,EAAOK,EAAcA,EAAc,IAAML,EACrCA,EAAOrD,IACPqD,GAAQ,UAGb,IAAW,MAAP7G,GAMP,GALAiG,EAAU,KACVlB,EAAQmB,EAAU,GACL,IAATnB,IACAA,EAAQ,GAEE,OAAVA,GAAkBP,EAAWO,EAAO,EAAG,IACvC,MAAO,UAER,IAAW,MAAP/E,GAGP,GAFAiG,EAAU,KACVlB,EAAQmB,EAAU,GACJ,OAAVnB,GAAkBP,EAAWO,EAAO,EAAG,IACvC,MAAO,UAER,IAAW,MAAP/E,GAGP,GAFAiG,EAAU,KACV/H,EAAUgI,EAAU,GACJ,OAAZhI,GAAoBsG,EAAWtG,EAAS,EAAG,IAC3C,MAAO,UAER,IAAW,MAAP8B,GAGP,GAFAiG,EAAU,KACVe,EAAUd,EAAU,GACJ,OAAZc,GAAoBxC,EAAWwC,EAAS,EAAG,IAC3C,MAAO,UAER,IAAW,MAAPhH,GASP,GARAwF,EAAQS,EAAU,KAClBtd,EAAQ4F,EAAM6X,OAAOC,EAAUb,GAAO7c,MAAM4K,EAAa,IACzD0T,EAAef,EAAUV,GACJ,OAAjByB,IACAA,EAAezT,WAAW,KAAO7K,EAAM,GAAI,IAC3Cse,EAAe1e,GAAM+b,OAAO2C,EAAc,GAC1CA,GAAgB,KAEC,OAAjBA,GAAyBzC,EAAWyC,EAAc,EAAG,KACrD,MAAO,UAER,IAAW,MAAPjH,GASP,GARAwF,EAAQS,EAAU,KAClBL,EAAgBjI,EAASkB,GACzBgH,EAAgBlI,EAASmB,GACX,IAAV0G,IACAI,EAAgBjB,EAAeiB,GAC/BC,EAAgBlB,EAAekB,IAEnCJ,EAASa,EAAeT,IACnBJ,IAAWa,EAAeV,GAC3B,MAAO,UAER,IAAW,MAAP5F,EAAY,CAGnB,GAFA0F,GAAM,EACNF,EAAQS,EAAU,KACgB,MAA9B1X,EAAM6X,OAAOC,EAAU,GAAY,CACnCO,GACA,UAGJ,GADAjB,EAAUpX,EAAM6X,OAAOC,EAAU,GAAG1d,MAAM6c,EAAQ,EAAI6B,EAAqBC,IACtE3B,EACD,MAAO,KAWX,IATAA,EAAUA,EAAQ,GAAGre,MAAM,KAC3Bwe,EAAcH,EAAQ,GACtBI,EAAgBJ,EAAQ,IACnBI,GAAiBD,EAAY7d,OAAS,IACvCoe,EAAWP,EAAY7d,OAAS,EAChC8d,EAAgBD,EAAYle,UAAUye,GACtCP,EAAcA,EAAYle,UAAU,EAAGye,IAE3CP,EAAc7S,SAAS6S,EAAa,IAChCtB,EAAWsB,MAAkB,IAC7B,MAAO,KAEX,IAAIN,EAAQ,IACRO,EAAgBJ,EAAQ,GAAG,GAAKI,EAChCA,EAAgB9S,SAAS8S,EAAe,IACpCwB,MAAMxB,IAAkBvB,EAAWuB,MAAoB,KACvD,MAAO,UAGZ,IAAW,MAAP/F,EACP2B,GAAU,EACViF,QACG,KAAKA,IACR,MAAO,KAInB,OAAIrB,KAAW,QAAQhb,KAAKgE,EAAM6X,OAAOC,IAC9B,MAEXL,EAAoB,OAAVjB,GAA8B,OAAZ7G,GAAoB8I,GAAW,KAC9C,OAATH,GAA2B,OAAVC,GAA0B,OAARC,GAAgBf,GACnDa,EAAOK,EACPJ,EAAQpJ,EAAKa,WACbwI,EAAMrJ,EAAKS,YAEE,OAAT0I,IACAA,EAAOK,GAEC,OAARH,IACAA,EAAM,IAGVtB,GAAUV,EAAQ,KAClBA,GAAS,IAETW,GACII,IACAf,IAAUe,GAEVC,IACA7H,IAAY6H,GAEhBxX,EAAQ,GAAI1B,MAAKA,KAAK6Y,IAAImB,EAAMC,EAAOC,EAAKhC,EAAO7G,EAAS8I,EAASC,MAErE1Y,EAAQ,GAAI1B,MAAKga,EAAMC,EAAOC,EAAKhC,EAAO7G,EAAS8I,EAASC,GAC5DnC,EAAUvW,EAAOwW,IAEjB8B,EAAO,KACPtY,EAAMiZ,YAAYX,GAElBtY,EAAM4P,YAAc4I,GAAOrB,IAAQze,EAC5B,KAEJsH,GAEX,QAASkZ,GAA2B1X,GAChC,GAAIC,GAA+B,MAAxBD,EAAOqW,OAAO,EAAG,MAAkB,CAG9C,OAFArW,GAASA,EAAOnI,UAAU,GAC1BmI,EAA6C,GAApCkD,SAASlD,EAAOqW,OAAO,EAAG,GAAI,IAAWnT,SAASlD,EAAOnI,UAAU,GAAI,IACzEoI,EAAOD,EAElB,QAAS2X,GAAkBrK,GAA3B,GAIQsK,GAAgBC,EAAWtZ,EAH3BrG,EAASa,GAAKC,IAAI8e,EAAiB5f,OAAQ6f,EAAiB7f,QAC5D0V,EAAWN,EAAQM,UAAYN,EAAQO,UAAUC,SACjDG,EAAWL,EAASK,SAEpB+J,IACJ,KAAKzZ,EAAM,EAAGA,EAAMrG,EAAQqG,IAAO,CAE/B,IADAqZ,EAAiBE,EAAiBvZ,GAC7BsZ,EAAY,EAAGA,EAAYD,EAAe1f,OAAQ2f,IACnDG,EAAQnO,KAAKoE,EAAS2J,EAAeC,IAEzCG,GAAUA,EAAQC,OAAOF,EAAiBxZ,IAE9C,MAAOyZ,GAEX,QAASE,GAAkB1Z,EAAOwZ,EAAS1K,EAASkI,GAApD,GAIQjX,GACAoP,EACAzV,EACAigB,CANJ,IAAmC,kBAA/B/F,EAAelI,KAAK1L,GACpB,MAAOA,EAMX,IAJID,EAAM,EACNoP,EAAO,KAGPnP,GAAiC,IAAxBA,EAAMM,QAAQ,QACvB6O,EAAOyK,EAAWhH,KAAK5S,IAUnB,MARAmP,GAAOA,EAAK,GACZwK,EAAWE,EAAajH,KAAKzD,EAAK9V,UAAU,IAC5C8V,EAAO,GAAI7Q,MAAKoG,SAASyK,EAAM,KAC3BwK,IACAA,EAAWT,EAA2BS,EAAS,IAC/CxK,EAAOnV,GAAM8f,SAASzP,MAAM8E,EAAM,GAClCA,EAAOnV,GAAM8f,SAASC,QAAQ5K,EAAM,KAAQwK,IAEzCxK,CASf,KANAL,EAAU9U,GAAMgV,WAAWF,GACtB0K,IACDA,EAAUL,EAAkBrK,IAEhC0K,EAAU3Q,GAAQ2Q,GAAWA,GAAWA,GACxC9f,EAAS8f,EAAQ9f,OACVqG,EAAMrG,EAAQqG,IAEjB,GADAoP,EAAO4H,EAAW/W,EAAOwZ,EAAQzZ,GAAM+O,EAASkI,GAE5C,MAAO7H,EAGf,OAAOA,GAxWX,GAAI6K,GAAyB,UAAWC,EAAiB,mBAAoBlB,EAAsB,gBAAiBD,EAAqB,uBAAwBc,EAAa,sBAAuBC,EAAe,UAAWP,OAGnN,IACA,IACA,MAGA,IACA,IACA,IACA,IACA,IACA,MAELC,IAEK,iCACA,8BACA,6BACA,0BACA,2BACA,yBACA,sBACA,qBACA,sBACA,sBACA,wBAGA,mBACA,mBACA,qBAGA,aACA,aACA,WACA,UAELvU,GACCkV,EAAG,WACHC,EAAG,WACHC,EAAG,UACJxG,KAAoB9G,QA8T3B9S,IAAMqgB,UAAY,SAAUra,EAAOwZ,EAAS1K,GACxC,MAAO4K,GAAkB1Z,EAAOwZ,EAAS1K,GAAS,IAEtD9U,GAAMsgB,eAAiB,SAAUta,EAAOwZ,EAAS1K,GAC7C,MAAO4K,GAAkB1Z,EAAOwZ,EAAS1K,GAAS,IAEtD9U,GAAM0K,SAAW,SAAU1E,EAAO8O,GAC9B,GAAI1N,GAASpH,GAAMiL,WAAWjF,EAAO8O,EAIrC,OAHI1N,KACAA,EAAkB,EAATA,GAENA,GAEXpH,GAAMiL,WAAa,SAAUjF,EAAO8O,EAASxC,GACzC,IAAKtM,GAAmB,IAAVA,EACV,MAAO,KAEX,UAAWA,KAAUkJ,GACjB,MAAOlJ,EAEXA,GAAQA,GAAAA,EACR8O,EAAU9U,GAAMgV,WAAWF,EAC3B,IAAkL9C,GAAOgF,EAArLzX,EAASuV,EAAQC,aAAc+D,EAAUvZ,EAAOuZ,QAASD,EAAWtZ,EAAOsZ,SAAU/B,EAAS+B,EAAS/B,OAAQyJ,EAAgBzH,EAAQhC,OAAQK,EAAWnR,EAAMM,QAAQ,IAC5K,OAAI2Z,GAAeje,KAAKgE,IACpBA,EAAQiF,WAAWjF,EAAM/G,QAAQM,EAAO,KAAM,MAC1Cyf,MAAMhZ,KACNA,EAAQ,MAELA,GAEPmR,EAAW,EACJ,MAEPA,EAAWA,KAEXnR,EAAMM,QAAQwQ,OAAgBxE,GAAUA,EAAOpN,cAAcoB,QAAQ,SACrE/G,EAASsZ,EACT7G,EAAQzS,EAAOqX,QAAQ,GAAG3X,QAAQ,IAAK6X,GAAQ/X,MAAM,KACjDiH,EAAMM,QAAQ0L,EAAM,QAAYhM,EAAMM,QAAQ0L,EAAM,SACpDhM,EAAQA,EAAM/G,QAAQ+S,EAAM,GAAI,IAAI/S,QAAQ+S,EAAM,GAAI,IACtDmF,GAAW,IAERnR,EAAMM,QAAQia,QACrBvJ,GAAY,EACZzX,EAASuZ,EACThC,EAASyJ,GAEbva,EAAQA,EAAM/G,QAAQ,IAAK,IAAIA,QAAQ6X,EAAQ,IAAI7X,QAAQ+gB,EAAwB,KAAKjhB,MAAMQ,EAAO,KAAKN,QAAQ+gB,EAAwB,MAAMhhB,KAAK,IAAIC,QAAQM,EAAO,KAAM,KAC9KyG,EAAQiF,WAAWjF,GACfgZ,MAAMhZ,GACNA,EAAQ,KACDmR,IACPnR,OAEAA,GAASgR,IACThR,GAAS,KAENA,OA8Ld,WAAA,GAkBOwa,GAQAC,EACAvgB,EAA2CwgB,EAAyCC,EA+FpFC,EAyGA1Y,EAyDA2Y,EAGAC,EAAiCC,EAAsCna,EAAmCoa,CA9R9G/gB,IAAQghB,WAAaviB,EACrBuB,GAAQihB,UAAY,SAAUC,GAC1B,GAAKnC,MAAM/e,GAAQghB,aAAgBE,EAE5B,CACH,GAAyC/Z,GAArCga,EAAMzb,SAAS0b,cAAc,MAMjC,OALAD,GAAItf,MAAMwf,QAAU,oEACpBF,EAAIG,UAAY,SAChB5b,SAAS6b,KAAKC,YAAYL,GAC1BnhB,GAAQghB,WAAa7Z,EAASga,EAAIM,YAAcN,EAAIta,YACpDnB,SAAS6b,KAAKG,YAAYP,GACnBha,EARP,MAAOnH,IAAQghB,YAWvBhhB,GAAQwG,MAAQ,SAAU5G,GACtB,MAAOrB,GAAEqB,GAAS+hB,QAAQ,UAAUliB,OAAS,GAE7C8gB,EAAQ7a,SAAS0b,cAAc,QACnC,KACIb,EAAMe,UAAY,qBAClBthB,GAAQ4hB,gBAAiB,EAC3B,MAAOrQ,GACLvR,GAAQ4hB,gBAAiB,EAE7B5hB,GAAQ6hB,MAAQ,gBAAkBrjB,GAC9BgiB,EAAW9a,SAASmC,gBAAgBhG,MACpC5B,EAAcD,GAAQC,aAAc,EAAOwgB,EAAazgB,GAAQygB,YAAa,EAAOC,EAAe,eAAiBliB,GAASsjB,YAAYzR,aAC7IrQ,GAAQ+hB,QAAU,mBAAqBvjB,IAAU,OAAS,IAAIA,GAAOwjB,iBAAqB,kBAAoBxB,IAAY,iBAAmBA,GAC7IxgB,GAAQiiB,WAAa,YAAczB,IAAY,kBAAoBA,IAAY,cAAgBA,GAC/F3a,IACI,MACA,SACA,IACA,MACD,WAAA,GAGSqc,GAFJC,EAASha,GAAAA,KAAiBia,QAAwB7B,GAAM1e,MAAMsgB,EAAS,gBAAkBxZ,EAC7F,IAAIyZ,SAAyB7B,GAAM1e,MAAMsgB,EAAS,eAAiBxZ,GAW/D,MAVIuZ,GAAYC,EAAOld,cACvBwb,GACI3gB,IAAkB,MAAboiB,EAAoB,IAAMA,EAAY,IAAM,GACjDC,OAAQA,EACRE,MAAqB,MAAdH,GAAmC,WAAdA,EAAyBA,EAAY,IAEjEE,IACAniB,EAAcwgB,EACdxgB,EAAYoiB,MAAQpiB,EAAYoiB,MAAQpiB,EAAYoiB,MAAQ,gBAAkB,kBAE3E,IAGf9B,EAAQ,KACRvgB,GAAQygB,WAAaA,EACrBzgB,GAAQC,YAAcA,EACtBD,GAAQsiB,iBAAmB9jB,EAAO8jB,mBAAqB7jB,EAAY,EAAID,EAAO8jB,gBAC9E,KACItiB,GAAQuiB,YAAc/jB,EAAO4C,YAAc5C,EAAOgkB,OAAShkB,EAAOgkB,OAAOC,WAAajkB,EAAOkkB,WAC7F1iB,GAAQ2iB,aAAenkB,EAAO8C,aAAe9C,EAAOgkB,OAAShkB,EAAOgkB,OAAOI,YAAcpkB,EAAOqkB,YAClG,MAAOtR,GACLvR,GAAQuiB,YAAc/jB,EAAOgkB,OAAOC,WACpCziB,GAAQ2iB,aAAenkB,EAAOgkB,OAAOI,YAEzC5iB,GAAQ8iB,SAAW,SAAUC,GAAV,GACCC,GA+BPve,EA/BLwe,GAAK,EAAqB9iB,KAAY+iB,GAAmB,iBAAiBnhB,KAAKghB,GAAKI,GAChFC,GAAI,gDACJC,KAAM,+BACNC,QAAS,qEACTC,OAAQ,2CACRC,KAAM,kCACNC,MAAO,2CACPC,MAAO,gCACPC,WAAY,oDACZC,SAAU,kDACVC,QAAS,gCACTC,MAAO,2CACPC,SAAU,gDACVC,KAAM,8CACPC,GACCC,IAAK,sBACLZ,QAAS,kBACTK,WAAY,wBACZE,QAAS,UACTT,GAAI,KACJe,KAAM,uBACNV,MAAO,SACRW,GAAkBC,OAAQ,uBAAyBC,GAClDC,MAAO,eACPC,QAAS,eACTC,QAAS,kBACTC,aAAc,qBACdC,GAAI,uBACJ9D,OAAQ,gBACRpa,OAAQ,UAEhB,KAAShC,IAAS0e,GACd,GAAIA,EAASte,eAAeJ,KACxBtE,EAAQ4iB,EAAG5iB,MAAMgjB,EAAS1e,KACf,CACP,GAAa,WAATA,GAAsB,WAAamgB,WACnC,OAAO,CAEX3B,MACAA,EAAG4B,OAASpgB,EACZwe,EAAGoB,OAAS7f,EAAOC,EAAO2f,GAAe,GACzCnB,EAAG9hB,QAAUqD,EAAOue,EAAIuB,EAAY,WACpCrB,EAAGvT,KAAOlL,EAAOC,EAAOwf,GACxBhB,EAAGA,EAAGvT,OAAQ,EACduT,EAAG6B,aAAe3kB,EAAM,GACxB8iB,EAAGD,cAAgB7iB,EAAM,IAAM,KAAKnB,QAAQ,IAAK,KACjDgkB,EAAeC,EAAGD,aAAahkB,QAAQ,IAAK,IAAI4e,OAAO,EAAG,GAC1DqF,EAAG8B,YAAc9B,EAAG6B,aAAe9B,EAAmBhf,MAAM,GAAKgf,EAAavjB,OAAS,EAAIujB,EAAavjB,OAAS,IAAIV,KAAK,KAC1HkkB,EAAG+B,cAAiBxmB,GAAOymB,WAAa7gB,UAAoB5F,GAAOwmB,UAAY5gB,GAC/E6e,EAAGiC,QAAU1mB,EAAOomB,UAAUO,YAAc,mBAAmBpjB,KAAKvD,EAAO4mB,SAASC,WAAapC,EAAG+B,QAChG/B,EAAGK,UAAYtjB,GAAQsiB,iBAAmB,KAAOW,EAAG8B,YAAc,KAAO7B,KAAqBljB,GAAQuiB,YAAc,KAAOviB,GAAQ2iB,aAAe,OAClJM,EAAGoB,OAAS5f,EAEhB,OAIZ,MAAOwe,IAEPtC,EAAW3gB,GAAQ2gB,SAAW3gB,GAAQ8iB,SAAS8B,UAAUU,WAC7DtlB,GAAQulB,mBAAqB5E,EAASyC,GAAKZ,OAAO1hB,MAAQ,IAAM,EAChEd,GAAQwlB,oBAAqB,GACzB7E,EAASuD,KAAOvD,EAAS2C,SAAW3C,EAASmE,aAAe,GAAKnE,EAASyC,MAC1EpjB,GAAQwlB,mBAAqB7E,GAEjC3gB,GAAQylB,aAAe,WACnB,GAAIzlB,GAAQ6hB,MAAO,CACf,GAAIlB,EAASuD,IACT,OAAO,CAEX,IAAIvD,EAAS2C,QACT,OAAKtjB,GAAQmB,QAAQ0f,UAGjB7gB,GAAQmB,QAAQoB,QAAU,OAGrBhE,EAAE,uBAAuBwN,KAAK,YAAc,IAAI5L,MAAM,qBAGvE,OAAO,GAEXH,GAAQ0lB,qBAAuB1lB,GAAQ6hB,SAAW7hB,GAAQ2gB,SAASuD,KAAOlkB,GAAQ2gB,SAAS2C,SAC3FtjB,GAAQ2lB,cAAgB,SAAU5C,GAAV,GASXte,GARLtD,GAAU,EAAOhB,KAAYmkB,GACzBsB,KAAM,uBACNnf,OAAQ,+BACRsa,OAAQ,yBACR8E,MAAO,sCACPxjB,KAAM,mCACNsE,QAAS,iCAEjB,KAASlC,IAAS6f,GACd,GAAIA,EAAWzf,eAAeJ,KAC1BtE,EAAQ4iB,EAAG5iB,MAAMmkB,EAAW7f,KACjB,CACPtD,KACAA,EAAQsD,IAAS,EACjBtD,EAAQhB,EAAM,GAAG8E,cAAcnG,MAAM,KAAK,GAAGA,MAAM,KAAK,KAAM,EAC9DqC,EAAQoB,QAAUkI,SAAS/E,SAASkb,cAAgBzgB,EAAM,GAAI,GAC9D,OAIZ,MAAOgB,IAEXnB,GAAQmB,QAAUnB,GAAQ2lB,cAAcf,UAAUU,WAClDtlB,GAAQ8lB,sBAAwB,WAC5B,GAAIC,IACAtW,OAAM/J,SAASsgB,uBAAwBtgB,SAASsgB,sBAAsB,QACtEC,MAAKvgB,SAASsgB,uBAAwBtgB,SAASsgB,sBAAsB,OACrEE,QAAOxgB,SAASsgB,uBAAwBtgB,SAASsgB,sBAAsB,SAS3E,OAPIhmB,IAAQmB,QAAQ0f,SAChBkF,EAASG,OAAQ,EACblmB,GAAQmB,QAAQoB,SAAW,KAC3BwjB,EAAStW,MAAO,EAChBsW,EAASE,KAAM,IAGhBF,GAEX/lB,GAAQmmB,UAAYnmB,GAAQ8lB,wBAC5B9lB,GAAQomB,UAAY,WAAA,GAERjlB,GACAklB,EACAC,CAHR,KAOI,MANInlB,GAAUnB,GAAQmB,QAClBklB,EAAsB,EACtBC,EAAQ5gB,SAASmC,gBACjB1G,EAAQkB,MAA2B,IAAnBlB,EAAQoB,SAAiB+jB,EAAMC,aAAeD,EAAME,eAAiBxmB,GAAQ6hB,QAC7FwE,EAAsBrmB,GAAQihB,aAE3BjhB,GAAQ6hB,MAAQyE,EAAMxf,YAActI,EAAOkkB,WAAavhB,EAAQkB,MAAQlB,EAAQoB,SAAW,KAAOkF,KAAOjJ,GAAQkH,SAASmC,gBAAgB4Z,YAAc4E,IAAwB5e,KAAOjJ,GAAQkkB,WAAa,EACrN,MAAOnR,GACL,MAAO,KAGfvR,GAAQymB,iBAAoD,IAA1BjG,EAASkG,iBAAkC1mB,GAAQmB,QAAQkB,MAAQrC,GAAQmB,QAAQoB,QAAU,GAC9H,SAAUpB,GACP,GAAIwlB,GAAW,GAAIC,EAAaroB,EAAEmH,SAASmC,iBAAkBid,EAAera,SAAStJ,EAAQoB,QAAS,GAClGpB,GAAQkB,KACRskB,EAAW,KACJxlB,EAAQwF,QACfggB,EAAW,KACJxlB,EAAQ4f,OACf4F,EAAW,SACJxlB,EAAQsF,OACfkgB,EAAW,SACJxlB,EAAQ0kB,MACfc,EAAW,QACJxlB,EAAQykB,OACfe,EAAW,QAEXA,IACAA,EAAW,KAAOA,EAAW,MAAQA,EAAW7B,GAEhD9kB,GAAQ2gB,WACRgG,GAAY,aAEX3mB,GAAQiiB,aACT0E,GAAY,iBAEhBC,EAAW3kB,SAAS0kB,IACtB3mB,GAAQmB,SACVnB,GAAQ6mB,aAAenhB,SAASmC,gBAAgBif,iBAC5C7e,EAAQvC,SAAS0b,cAAc,SACnCphB,GAAQ+mB,YAAc,eAAiB9e,GACvCjI,GAAQgnB,oBAAsB,oBAAsB/e,GACpDjI,GAAQiI,MAAQ,WAeZ,IAfY,GAcRZ,GAbA4f,GACA,SACA,OACA,OACA,QACA,OACA,WACA,kBAEAxnB,EAASwnB,EAAMxnB,OACfsG,EAAQ,OACRoB,KACArB,EAAM,EAEHA,EAAMrG,EAAQqG,IACjBuB,EAAO4f,EAAMnhB,GACbmC,EAAMif,aAAa,OAAQ7f,GAC3BY,EAAMlC,MAAQA,EACdoB,EAAOE,EAAKrI,QAAQ,IAAK,KAAsB,SAAfiJ,EAAMZ,MAAmBY,EAAMlC,QAAUA,CAE7E,OAAOoB,MAEXc,EAAMpG,MAAMwf,QAAU,cACtBrhB,GAAQmnB,WAAalf,EAAMpG,MAAMslB,SACjClf,EAAQ,KACRjI,GAAQonB,WAAa,WAAA,GAMRpkB,GALLqkB,EAAY,IACZC,IACI7L,MAAO,EACP8L,MAAO,KAEf,KAASvkB,EAAI,EAAGA,EAAIqkB,EAAWrkB,IAC3BskB,EAAOlW,MACHqK,MAAOzY,EACPukB,MAAO,KAMf,OAHAD,GAAOE,KAAK,SAAU/b,EAAGC,GACrB,MAAOD,GAAE8b,MAAQ7b,EAAE6b,MAAQ,EAAI9b,EAAE8b,MAAQ7b,EAAE6b,SAAa,IAEjC,IAApBD,EAAO,GAAG7L,SAErBzb,GAAQynB,gBAAkB/G,EAAagH,uBAAyBhH,EAAaiH,oBAAsBjH,EAAakH,mBAAqBlH,EAAamH,kBAAoBnH,EAAa+G,iBAAmB/G,EAAavD,SAAW,SAAUvQ,GAEpO,IADA,GAAIkb,GAAWpiB,SAASqiB,kBAAoB5f,KAAK6f,YAActiB,UAAUqiB,iBAAiBnb,OAAkBrO,EAAEqO,GAAW5J,EAAI8kB,EAASroB,OAC/HuD,KACH,GAAI8kB,EAAS9kB,IAAMmF,KACf,OAAO,CAGf,QAAO,GAEXnI,GAAQioB,WAAa,cAAgBzpB,GACrCwB,GAAQkoB,UAAY1pB,EAAO2pB,SAAW3pB,EAAO2pB,QAAQD,UACjDtH,EAAelb,SAASkb,aAC5B5gB,GAAQooB,WAAa,gBAAkB5pB,MAAYwB,GAAQmB,QAAQkB,QAAUue,GAAgBA,GAAgB,IAC7G5gB,GAAQqoB,eAAiB,mBAAqB7pB,GAAOkH,SACjDmb,EAAS7gB,GAAQmB,QAAQ0f,OAAQC,EAAe9gB,GAAQmB,QAAQmnB,MAAO3hB,EAAU3G,GAAQmB,QAAQwF,QAASoa,EAAS/gB,GAAQmB,QAAQ4f,OACvI/gB,GAAQ2H,YAAckZ,GAAUriB,EAAO+pB,eACvCvoB,GAAQ0H,UAAYmZ,IAAWC,IAAiBna,IAAYoa,GAAUviB,EAAOgqB,aAC7ExoB,GAAQyoB,oBAAsB9H,IAAa3gB,GAAQ6hB,OAAS7hB,GAAQ2H,YAAc3H,GAAQ0H,aA6B1F+F,GACAjN,MAAQiI,QAAS,SACjBhI,OAASgI,QAAS,QAClBigB,MAAQjgB,QAAS,MACjBkgB,IAAMlgB,QAAS,QACfhB,KAAOgB,QAAS,UAChB/H,QAAU+H,QAAS,OACnBmgB,MAAQngB,QAAS,OACjBogB,KAAOpgB,QAAS,OAYhBP,KACJ3J,EAAEsK,OAAOX,GACL4gB,SAAS,EACTzgB,QAAS,SAAUzI,GACfuI,KAAKvI,QAAUrB,EAAEqB,IAErB0J,QAAS,SAAU1J,EAAS2I,GACnB3I,EAAQoC,GAAG,aACZpC,EAAQE,KAAM8C,QAAShD,EAAQ8D,KAAK,eAAiB,UAAW5D,IAAI,WAEpEyI,EAAQU,MACRrJ,EAAQ8D,KAAK,aAAc9D,EAAQE,IAAI,YAAYmJ,OAEnDV,EAAQO,MACRP,EAAQO,OAERP,EAAQW,kBACRX,EAAQW,iBAAiBtJ,GAE7BA,EAAQmpB,WAEZC,QAAS,WACL7gB,KAAK2gB,SAAU,EACf3gB,KAAKmB,QAAUnB,KAAK8gB,aAExBC,OAAQ,WACJ/gB,KAAK2gB,SAAU,EACf3gB,KAAKmB,QAAUnB,KAAKghB,mBAG5BjhB,EAAQ+gB,YAAc/gB,EAAQoB,QAsDxB,gBAAkB/K,GAAEuO,IACtBjE,GAAOtK,EAAEuO,IACLsc,UAAW,SAAUC,EAAYC,GAC7B,MAAOnhB,MAAKohB,KAAKF,EAAYC,IAEjCE,aAAc,SAAUjhB,EAASC,EAAUC,EAASC,GAChD,MAAOS,GAAQhB,KAAMI,EAASC,EAAUC,EAASC,IAErD+gB,cAAe,SAAUjgB,EAASjB,GAC9B,MAAOxI,IAAMwJ,YAAYpB,KAAMqB,EAASjB,GAAS,IAErDmhB,iBAAkB,SAAUlgB,EAASjB,GACjC,MAAOxI,IAAMwJ,YAAYpB,KAAMqB,EAASjB,GAAS,IAErDohB,iBAAkB,SAAUngB,EAASjB,EAASqhB,GAC1C,MAAO7pB,IAAMwJ,YAAYpB,KAAMqB,EAASjB,EAASqhB,MAIzDjgB,EAAY,KAAMC,EAAW,KAAME,EAAc,KAAMC,EAAa,KAAMF,EAAW,KAerF6D,EAAc,SAAU6D,GACxB,MAAOA,GAAE5B,QAET3P,GAAQ6hB,QACRnU,EAAc,SAAU6D,GACpB,GAAIsY,GAAU,iBAAmBtY,GAAIA,EAAEuY,cAAcC,eAAiB,kBAAoBxY,GAAIA,EAAEwY,eAAiB,IACjH,OAAOF,GAAUnkB,SAASskB,iBAAiBH,EAAQ,GAAGI,QAASJ,EAAQ,GAAGK,SAAW3Y,EAAE5B,QAE3F9J,IACI,QACA,YACA,aACA,UACA,YACA,YACA,OACD,SAAUwU,EAAGtU,GACZxH,EAAEuO,GAAG/G,GAAS,SAAUokB,GACpB,MAAOhiB,MAAKuI,KAAK3K,EAAOokB,OAIhCnqB,GAAQ6hB,MACH7hB,GAAQ2gB,UAQT3gB,GAAQoqB,UAAY,aACpBpqB,GAAQqqB,QAAU,WAClBrqB,GAAQsqB,UAAY,YACpBtqB,GAAQuqB,YAAc,cACtBvqB,GAAQwqB,MAAQ,WAChBxqB,GAAQyqB,OAAS,sBAZjBzqB,GAAQoqB,UAAY,uBACpBpqB,GAAQqqB,QAAU,mBAClBrqB,GAAQsqB,UAAY,sBACpBtqB,GAAQuqB,YAAc,yBACtBvqB,GAAQwqB,MAAQ,QAChBxqB,GAAQyqB,OAAS,UASdzqB,GAAQ0H,UACf1H,GAAQsqB,UAAY,cACpBtqB,GAAQoqB,UAAY,cACpBpqB,GAAQqqB,QAAU,YAClBrqB,GAAQuqB,YAAc,gBACtBvqB,GAAQwqB,MAAQ,YAChBxqB,GAAQyqB,OAAS,4BACVzqB,GAAQ2H,YACf3H,GAAQsqB,UAAY,gBACpBtqB,GAAQoqB,UAAY,gBACpBpqB,GAAQqqB,QAAU,cAClBrqB,GAAQuqB,YAAc,kBACtBvqB,GAAQwqB,MAAQ,cAChBxqB,GAAQyqB,OAAS,6BAEjBzqB,GAAQsqB,UAAY,YACpBtqB,GAAQoqB,UAAY,YACpBpqB,GAAQqqB,QAAU,UAClBrqB,GAAQuqB,YAAc,aACtBvqB,GAAQwqB,MAAQ,QAChBxqB,GAAQyqB,OAAS,UAEjB9c,EAAiB,SAAU+c,EAAS/Y,GAChC,GAA+B8J,GAAO3V,EAAKrG,EAAQuQ,EAA/C7I,EAASwK,GAAa,IAAiCqL,EAAQ,CACnE,KAAKlX,EAAM,EAAGrG,EAASirB,EAAQjrB,OAAQqG,EAAMrG,EAAQqG,IACjDkK,EAAS0a,EAAQ5kB,GACF,KAAXkK,IACAyL,EAAQzL,EAAO3J,QAAQ,KACT,IAAVoV,IACIA,MACAzL,EAAS,IAAMA,GAEfgN,IACAhN,EAAS,IAAMA,EAAO5Q,UAAU,EAAGqc,GAAS,UAAYzL,EAAO5Q,UAAUqc,KAGjFuB,IACA7V,GAAU6I,GAAUlK,EAAMrG,EAAS,EAAI,UAAY,KAG3D,OAAWuE,OAAMgZ,GAAOje,KAAK,KAAOoI,GACrCyG,GAAa,mBACpB/E,GAAO9I,IACH4qB,WACAC,8BACAC,GAAI9qB,GAAM8qB,OACVziB,GAAIrI,GAAMqI,IAAMA,EAChBF,QAASnI,GAAMmI,SAAWA,EAC1B4iB,OAAQ/qB,GAAM+qB,WACdpnB,KAAM3D,GAAM2D,SACZqnB,QAAShrB,GAAMgrB,YACfC,QAASjrB,GAAMirB,YACfC,aAAeC,aACfC,MACIC,OAAQ,GACRC,OAAQ,GACRC,UAAW,EACXC,IAAK,EACLC,MAAO,GACPC,IAAK,GACLC,KAAM,GACNC,GAAI,GACJC,MAAO,GACPC,KAAM,GACNC,IAAK,GACLC,KAAM,GACNC,SAAU,GACVC,OAAQ,GACRC,SAAU,GACVC,GAAI,IACJC,IAAK,IACLC,IAAK,IACLC,YAAa,IACbC,aAAc,IACdC,WAAY,KAEhBxsB,QAASD,GAAMC,SAAWA,GAC1BmJ,QAASpJ,GAAMoJ,SAAWA,EAC1B2B,GAAI,GACJiB,KAAM,SAAUhG,GACZ,MAAO,QAAUhG,GAAM+K,GAAK/E,GAEhCpG,WAAYA,EACZgB,KAAMA,EACNmC,WAAYA,EACZwC,kBAAmBA,EACnBa,aAAcA,EACdI,WAAYA,EACZL,KAAMA,EACNhB,YAAaA,EACbJ,UAAWA,EACXsC,UAAWrH,GAAMqH,WAAaA,EAC9BY,aAAcjI,GAAMiI,cAAgBA,EACpCuB,YAAaxJ,GAAMwJ,aAAeA,EAClCkE,WAAY1N,GAAM0N,YAAcA;AAChCP,WAAYA,EACZxO,MAAOA,EACPqO,SAAUA,EACV9C,SAAU4E,GAAM9B,EAAS+E,QAAS/E,GAClC8E,OAAQhD,GAAM9B,EAAS8E,OAAQ9E,GAC/ByH,UAAW3F,GAAMC,GAAK0F,UAAW1F,IACjCpB,YAAaA,EACbhE,WAAYA,EACZM,SAAUA,EACVyiB,WAAY,SAAUC,GAClB,MAAOA,KAAQ9e,GAAW7L,KAAK2qB,IAEnCpgB,KAAM,SAAUqgB,EAAYC,EAAMjb,GAkB9B,MAjBAgb,GAAaA,GAAc,SAChBC,IAAQjkB,KACfgJ,EAAYib,EACZA,GAAO,GAEXjb,EAAYA,GAAa,IACrBgb,GAAuC,MAAzBA,EAAWztB,OAAO,KAChCytB,EAAa,IAAMA,GAEnBC,GACAD,EAAaA,EAAW3tB,QAAQ,sBAAuB,iBACvD2tB,EAAaA,EAAW3tB,QAAQ,sBAAuB,iBACvD2tB,EAAahf,EAAegf,EAAW7tB,MAAM,KAAM6S,GACnDgb,EAAaA,EAAW3tB,QAAQ,aAAc,MAE9C2tB,EAAahb,EAAYgb,EAEtBA,GAEXE,OAAQ,SAAUF,EAAYC,GAC1B,GAAI1lB,GAAMylB,EAAaC,CACvB,OAAOzd,IAAYjI,GAAOiI,GAAYjI,IAAYiE,SAAS,IAAK,UAAYpL,GAAMuM,KAAKqgB,EAAYC,KAEvGE,OAAQ,SAAUH,GACd,MAAOvd,IAAYud,GAAcvd,GAAYud,IAAmBxhB,SAAS,UAAWpL,GAAMuM,KAAKqgB,GAAc,WAEjHI,SAAU,SAAUJ,GAChB,OACIK,IAAKjtB,GAAM8sB,OAAOF,GAClBM,IAAKltB,GAAM+sB,OAAOH,KAG1BO,KAAM,WACF,GAAalqB,GAAGmqB,EAAZC,EAAK,EACT,KAAKpqB,EAAI,EAAGA,EAAI,GAAIA,IAChBmqB,EAAyB,GAAhB7sB,GAAK6sB,SAAgB,EACrB,GAALnqB,GAAe,IAALA,GAAgB,IAALA,GAAgB,IAALA,IAChCoqB,GAAM,KAEVA,IAAY,IAALpqB,EAAU,EAAS,IAALA,EAAmB,EAATmqB,EAAa,EAAIA,GAAQta,SAAS,GAErE,OAAOua,IAEXC,aAAc,SAAUhiB,GACpB,MAAOA,GAAKrM,QAAQ,SAAU,IAAMe,GAAMgM,KAAK,QAAU,SAASsD,MAAM,OAE5Eie,kBAAmB,SAAUC,GAAV,GAGFvqB,GAFTwqB,EAAYD,EAAWzuB,MAAM,IACjC,IAAI0uB,EACA,IAASxqB,EAAI,EAAGA,EAAIwqB,EAAU/tB,OAAQuD,IACd,QAAhBwqB,EAAUxqB,KACVwqB,EAAUxqB,GAAKwqB,EAAUxqB,GAAGhE,QAAQ,8BAA+B,SAI/E,OAAOwuB,GAAUzuB,KAAK,KAAKC,QAAQ,SAAU,oBAAoBqQ,MAAM,OAE3Eoe,iBAAkB,SAAUlc,GACxB,MAAO,mCAAmCxP,KAAKwP,EAAE5B,OAAO+d,UAE5DC,mBAAoB,SAAUxD,GAC1B,IAAK,GAAInnB,GAAI,EAAG4qB,EAAM7tB,GAAM4qB,QAAQlrB,OAAQuD,EAAI4qB,EAAK5qB,IACjDmnB,EAASpqB,GAAM4qB,QAAQ3nB,GAE3BjD,IAAM6qB,2BAA2BxZ,KAAK+Y,IAE1C0D,aAAc,SAAUC,EAASzmB,GAC7B,GAAI0mB,GAAUvvB,EAAOuvB,SAChBhuB,GAAMiuB,aAAiC,IAAXD,GAA0BA,EAAQE,KAC/DF,EAAQ1mB,GAAQ,OAAOymB,MAI/BjgB,GAASX,EAAWrE,QACpBC,KAAM,SAAUlJ,EAAS2I,GAAnB,GAKE2lB,GAJAhe,EAAO/H,IACX+H,GAAKtQ,QAAUG,GAAM8P,OAAOjQ,GAASmR,QAAQb,GAC7CA,EAAKie,QAAQ,OAAQ5lB,GACrB2E,EAAWJ,GAAGhE,KAAK2I,KAAKvB,GACpBge,EAAa3lB,EAAUA,EAAQ2lB,WAAa,KAC5CA,IACA3lB,EAAUM,MAAWN,GAAW2lB,iBAEpC3lB,EAAU2H,EAAK3H,QAAUM,IAAO,KAAUqH,EAAK3H,QAAS2H,EAAKke,SAAU7lB,GACnE2lB,IACA3lB,EAAQ2lB,WAAaA,GAEpBhe,EAAKtQ,QAAQmM,KAAKhM,GAAMgM,KAAK,UAC9BmE,EAAKtQ,QAAQmM,KAAKhM,GAAMgM,KAAK,SAAUxD,EAAQmH,MAAQ,IAAIzK,eAE/DiL,EAAKtQ,QAAQ8D,KAAK,QAAU6E,EAAQ4Z,OAAS5Z,EAAQmH,KAAMQ,GAC3DA,EAAKQ,KAAKR,EAAKc,OAAQzI,IAE3ByI,UACAzI,SAAW4Z,OAAQ,IACnBkM,kBAAmB,WACf,QAASlmB,KAAKvI,QAAQ,GAAG0uB,oBAE7BC,UAAW,SAAU5e,GACjBA,EAASA,GAAUxH,KAAKzF,OACxB,IAAI9C,GAAUuI,KAAKvI,QAAS4uB,EAAW,WAAYC,EAAW9e,EAAO5D,KAAKyiB,IAAa5uB,EAAQmM,KAAKyiB,EACpG5uB,GAAQ8uB,WAAWF,GACnB7e,EAAO5D,KAAKyiB,EAAWzP,MAAM0P,GAAuB,EAAXA,IAE7CE,WAAY,SAAUpmB,GAClBJ,KAAKymB,WAAWrmB,GAChBhK,EAAEsK,OAAOV,KAAKI,QAASA,IAE3BqmB,WAAY,SAAUrmB,GAElB,IADA,GAAuDgJ,GAAnDrB,EAAO/H,KAAMrC,EAAM,EAAGrG,EAASyQ,EAAKc,OAAOvR,OACxCqG,EAAMrG,EAAQqG,IACjByL,EAAIrB,EAAKc,OAAOlL,GACZoK,EAAK3H,QAAQgJ,IAAMhJ,EAAQgJ,KAC3BrB,EAAKiB,OAAOI,EAAGrB,EAAK3H,QAAQgJ,IACxBrB,EAAKO,SAAWP,EAAKO,QAAQc,UACtBrB,GAAKO,QAAQc,GAIhCrB,GAAKQ,KAAKR,EAAKc,OAAQzI,IAE3BkiB,OAAQ,SAAUoE,GACd,GAAI3oB,GAAOiC,KAAK2mB,UAAWC,EAAc5mB,KAAK6mB,OAC1CH,IAAU3oB,EAAKpF,MAAQ,GAAKoF,EAAKnF,OAAS,MAAQguB,GAAe7oB,EAAKpF,QAAUiuB,EAAYjuB,OAASoF,EAAKnF,SAAWguB,EAAYhuB,WACjIoH,KAAK6mB,MAAQ9oB,EACbiC,KAAK8mB,QAAQ/oB,EAAM2oB,GACnB1mB,KAAKmJ,QAAQ,SAAUpL,KAG/B4oB,QAAS,WACL,MAAO/uB,IAAMmvB,WAAW/mB,KAAKvI,UAEjCsG,KAAM,SAAUA,GACZ,MAAKA,IAGDiC,KAAKgnB,QAAQjpB,GAAbiC,GAFOA,KAAK2mB,WAKpBK,QAAS5wB,EAAEwK,KACXkmB,QAAS1wB,EAAEwK,KACXqmB,QAAS,WACL,GAAIlf,GAAO/H,IACX+H,GAAKtQ,QAAQyvB,WAAW,QAAUnf,EAAK3H,QAAQ4Z,OAASjS,EAAK3H,QAAQmH,MACrEQ,EAAKtQ,QAAQyvB,WAAW,WACxBnf,EAAKiB,UAETme,SAAU,WACNnnB,KAAKinB,WAETjB,QAAS,aAEToB,mBAAoB,SAAUpF,GAC1BhiB,KAAKqnB,aAAc,EACnBrF,EAAS1Y,KAAKtJ,MACdA,KAAKqnB,aAAc,KAGvB1hB,GAAkBD,GAAOhF,QACzB4mB,UAAW,WACP,MAAOtnB,MAAK+lB,WAAWwB,YAE3BC,cAAe,SAAUC,GACrB,GAAI1f,GAAO/H,IACX+H,GAAKie,QAAQyB,EAAK,WACd,OACIC,SAAU3f,EAAK4f,QACfpsB,KAAMnF,EAAE8d,IAAInM,EAAKuf,YAAa,SAAUM,GACpC,OAASA,SAAUA,WAMvChwB,GAAMmvB,WAAa,SAAUtvB,EAASsvB,GAClC,GAAIc,GAAapwB,EAAQ,EAIzB,OAHIsvB,IACAtvB,EAAQE,IAAIovB,IAGZpuB,MAAOkvB,EAAWvO,YAClB1gB,OAAQivB,EAAWC,eAG3BlwB,GAAMmwB,OAASnnB,GACXuC,GAAiB,aAAcL,GAAa,oDAAqDC,GAAmB,wCAAyCN,GAAa,WA6C9K7K,GAAMowB,WAAa,SAAUvwB,EAAS2I,EAAS6nB,GAA5B,GACXjpB,GAAQwD,EAAQkB,EAAQ/F,EAAKrG,EAAQ4L,EAAMtF,EAAOmoB,EAAYmC,EAAUC,EAiBxE5sB,EAA0B6sB,EAMrBrpB,CAfT,IAPKkpB,EAEMA,EAAMA,QACbA,EAAQA,EAAMA,OAFdA,EAAQrwB,GAAM8qB,GAAGuF,MAIrBxwB,EAAUA,EAAQ4wB,SAAW5wB,EAAUA,EAAQ,GAC/CyL,EAAOzL,EAAQiL,aAAa,QAAU9K,GAAM+K,GAAK,QACjD,CAGAulB,EAAWhlB,EAAKhF,QAAQ,UAEpBwF,EADAwkB,EACSD,EAAM/kB,GAENtL,GAAM8sB,OAAOxhB,GAAM7M,GAE5BkF,EAAOnF,EAAEqB,GAAS8D,OAAQ6sB,EAAY1kB,EAAS,QAAUA,EAAOiB,GAAGvE,QAAQ4Z,OAAStW,EAAOiB,GAAGvE,QAAQmH,KAAO,GAE7G4gB,EADAD,EACsBpsB,OAAO,WAAaoH,EAAO,IAAK,KAEhCpH,OAAO,IAAMssB,EAAY,IAAK,IAExD,KAASrpB,IAAOxD,GACZ,GAAIwD,EAAI/G,MAAMmwB,GAAkB,CAC5B,GAAIppB,IAAQqpB,EAGR,MAAO7sB,GAAKwD,EAFZC,GAASzD,EAAKwD,GAM1B,GAAK2E,EAAL,CAYA,IATAqiB,EAAaxjB,EAAY9K,EAAS,cAClC2I,EAAUhK,EAAEsK,UAAWuC,EAAaxL,EAASiM,EAAOiB,GAAGvE,SAAUA,GAC7D2lB,IAEI3lB,EAAQ2lB,iBADDA,KAAevlB,GACD5I,GAAM8sB,OAAOqB,GAAY1vB,GAEzB0vB,GAGxBpoB,EAAM,EAAGrG,EAASoM,EAAOiB,GAAGkE,OAAOvR,OAAQqG,EAAMrG,EAAQqG,IAC1D6E,EAASkB,EAAOiB,GAAGkE,OAAOlL,GAC1BC,EAAQ2E,EAAY9K,EAAS+K,GACzB5E,IAAUtH,IACV8J,EAAQoC,GAAU5K,GAAM8sB,OAAO9mB,GAAOvH,GAQ9C,OALK2I,GAEO5I,EAAEkyB,cAAcloB,IACxBpB,EAAOwnB,WAAWpmB,GAFlBpB,EAAS,GAAI0E,GAAOjM,EAAS2I,GAI1BpB,KAEXpH,GAAM2wB,oBAAsB,SAAUC,GAClC,GAAgB7qB,GAAKrG,EAAjB2wB,IAOJ,KANKO,EAAW,KACZA,GACI5wB,GAAM8qB,GACN9qB,GAAMgrB,QAAQF,KAGjB/kB,EAAM,EAAGrG,EAASkxB,EAAWlxB,OAAQqG,EAAMrG,EAAQqG,IACpDsqB,EAAMtqB,GAAO6qB,EAAW7qB,GAAKsqB,KAEjC,OAAOvnB,IAAOuH,MAAM,UAAWoP,OAAO4Q,EAAM3nB,aAEhD1I,GAAM+I,KAAO,SAAUlJ,GACnB,GAAIwwB,GAAQrwB,GAAM2wB,oBAAoBrhB,GAAMoC,KAAKxO,UAAW,GAC5D1E,GAAEqB,GAASgxB,KAAK,SAAW7wB,GAAM+K,GAAK,SAAS2B,UAAU5G,KAAK,WAC1D9F,GAAMowB,WAAWhoB,QAAUioB,MAGnCrwB,GAAMqvB,QAAU,SAAUxvB,GACtBrB,EAAEqB,GAASgxB,KAAK,SAAW7wB,GAAM+K,GAAK,SAAS2B,UAAU5G,KAAK,WAAA,GAEjDqB,GADLxD,EAAOnF,EAAE4J,MAAMzE,MACnB,KAASwD,IAAOxD,GACiB,IAAzBwD,EAAIb,QAAQ,gBAAyB3C,GAAKwD,GAAKkoB,UAAYpgB,IAC3DtL,EAAKwD,GAAKkoB,aAgB1BrvB,GAAM0qB,OAAS,SAAU7qB,EAASivB,GAAnB,GAKPgC,GAJAlG,EAAUpsB,EAAEqB,GAASgxB,KAAK,SAAW7wB,GAAM+K,GAAK,SAAS2B,UAAUC,OAAOd,EACzE+e,GAAQlrB,SAGToxB,EAAetyB,EAAEuyB,UAAUnG,GAC/BkG,EAAarJ,KAAKhc,GAClBjN,EAAEsH,KAAKgrB,EAAc,WACjB,GAAIhlB,GAAS9L,GAAMgxB,eAAexyB,EAAE4J,MAChC0D,IACAA,EAAO4e,OAAOoE,OAI1B9uB,GAAMqL,aAAeA,EACrBvC,GAAO9I,GAAM8qB,IACThd,OAAQA,GACRC,gBAAiBA,GACjBsiB,SACAY,SAAU,SAAUC,EAAWrH,EAAQrhB,GACnC,GAAkG/B,GAAO0qB,EAAWC,EAAkBC,EAAqBzK,EAAvJ0K,EAAOJ,EAAUL,KAAK,mBAAoB5wB,EAAUD,GAAMC,QAASmB,EAAUnB,EAAQmB,OACzFoH,GAAUhK,EAAEsK,WACR/H,MAAO,OACPC,OAAQ,OACR0G,IAAKwpB,EAAUnpB,YACfwpB,SAAS,GACV/oB,GACHoe,EAAWpe,EAAQ+oB,QAAU,0BAA4B,iBACrD1H,EACKyH,EAAK5xB,SACN+G,EAAQxG,EAAQwG,MAAMyqB,GACtBC,EAAY1qB,EAAQ,QAAU,OAC9B4qB,EAAsBH,EAAU1qB,aAChC4qB,EAAmBhwB,EAAQsF,QAAUD,EAAYyqB,EAAU,GAAGpqB,YAAcoqB,EAAUnwB,QAAU,EAAIswB,EAAsB,EAC1HC,EAAO9yB,EAAEwB,GAAMsS,OAAO,6HAAsIsU,EAAU5mB,GAAM8qB,GAAGmG,SAAS9F,SAASqG,UAAUzwB,MAAMyH,EAAQzH,OAAOC,OAAOwH,EAAQxH,QAAQjB,IAAI,MAAOyI,EAAQd,KAAK3H,IAAIoxB,EAAWnqB,KAAKC,IAAIoqB,GAAuBD,GAAkBK,UAAUP,IAEvVI,GACPA,EAAKI,UAGbC,OAAQ,SAAU7lB,EAAQ8lB,EAAUxP,GAA5B,GAC+B0K,GAO/B+E,EAMK5uB,EAAO4qB,EAbZle,EAAO7D,EAAOiB,GAAGvE,QAAQmH,IAa7B,KAZAiiB,EAAWA,GAAY5xB,GAAM8qB,GAC7B1I,EAASA,GAAU,GACnBwP,EAASjiB,GAAQ7D,EACjB8lB,EAASvB,MAAM1gB,EAAKzK,eAAiB4G,EACrCghB,EAAS,WAAa1K,EAASzS,EAC/BA,EAAO,QAAUyS,EAASzS,EACtBkiB,GACAliB,KAAMA,EACN7D,OAAQA,EACRsW,OAAQA,GAAU,IAEtBpiB,GAAM4qB,QAAQvZ,KAAKwgB,GACV5uB,EAAI,EAAG4qB,EAAM7tB,GAAM6qB,2BAA2BnrB,OAAQuD,EAAI4qB,EAAK5qB,IACpEjD,GAAM6qB,2BAA2B5nB,GAAG4uB,EAExCrzB,GAAEuO,GAAG4C,GAAQ,SAAUnH,GACnB,GAAkBspB,GAAd9rB,EAAQoC,IAuBZ,cAtBWI,KAAYI,IACnBkpB,EAAOxiB,GAAMoC,KAAKxO,UAAW,GAC7BkF,KAAKtC,KAAK,WACN,GAAiCisB,GAAQ3qB,EAArC0E,EAAStN,EAAEmF,KAAKyE,KAAMuH,EAC1B,KAAK7D,EACD,KAAUuG,OAAMrS,GAAMsS,OAAO,2DAA8D9J,EAASmH,GAGxG,IADAoiB,EAASjmB,EAAOtD,SACLupB,KAAW9iB,GAClB,KAAUoD,OAAMrS,GAAMsS,OAAO,kCAAqC9J,EAASmH,GAG/E,IADAvI,EAAS2qB,EAAO1hB,MAAMvE,EAAQgmB,GAC1B1qB,IAAW1I,EAEX,MADAsH,GAAQoB,GACD,KAIfgB,KAAKtC,KAAK,WACN,MAAO,IAAIgG,GAAO1D,KAAMI,KAGzBxC,GAEXxH,EAAEuO,GAAG4C,GAAM7D,OAASA,EACpBtN,EAAEuO,GAAG+f,GAAU,WACX,MAAO1kB,MAAKzE,KAAKgM,OAI7B3P,GAAM8qB,GAAGmG,SAAS9F,UAAaqG,QAAS,cACpCxjB,IACA2C,KAAM,WACF,MAAOvI,OAEX4pB,YAAY,EACZxpB,YAEAyF,GAAeH,GAAOhF,QACtBC,KAAM,SAAUlJ,EAAS2I,GACrBsF,GAAOf,GAAGhE,KAAK2I,KAAKtJ,KAAMvI,EAAS2I,GACnCJ,KAAKvI,QAAQoyB,cACb7pB,KAAKzF,QAAUyF,KAAKvI,QACpBuI,KAAKvI,QAAQqC,SAAS,cAE1BmtB,QAAS,WACLvhB,GAAOf,GAAGsiB,QAAQ3d,KAAKtJ,MACvBA,KAAKvI,QAAQqyB,gBAEjB1pB,SAAW4Z,OAAQ,UACnBnR,UACAkhB,KAAM,WACF,GAAIC,GAAchqB,KAAKvI,QAAQ+hB,QAAQ5hB,GAAMstB,aAAa,mCAC1D,OAAOttB,IAAMgxB,eAAeoB,EAAapyB,GAAM+qB,OAAOD,KAAO9c,IAEjEqkB,uBAAwB,WACpB,GAAIF,GAAO/pB,KAAK+pB,MAChB,OAAOA,IAAQA,EAAK3pB,QAAQ8pB,oBAEhCpB,UAAW,WACP,GAAIrxB,GAAUuI,KAAKvI,QAAQ+hB,QAAQ5hB,GAAMstB,aAAa,0CACtD,OAAOttB,IAAMgxB,eAAenxB,EAAQ0yB,GAAG,GAAIvyB,GAAM+qB,OAAOD,KAAO9c,MAGvElF,GAAO9I,GAAM+qB,QACThiB,KAAM,SAAUlJ,GACZG,GAAM+I,KAAKlJ,EAASG,GAAM+qB,OAAOD,GAAI9qB,GAAM8qB,GAAI9qB,GAAMgrB,QAAQF,KAEjE0H,wBAAyB,WACrB,MAAOxyB,IAAM+qB,OAAO0H,aAAezyB,GAAM+qB,OAAO0H,YAAYjqB,SAAWxI,GAAM+qB,OAAO0H,YAAYjqB,QAAQ8pB,oBAE5GjC,SACAvF,IACIhd,OAAQG,GACRF,gBAAiBA,GAAgBjF,OAAOmF,GAAaqC,WACrD+f,SACAsB,OAAQ,SAAU7lB,GACd9L,GAAM8qB,GAAG6G,OAAO7lB,EAAQ9L,GAAM+qB,OAAOD,GAAI,cAIrD/nB,EAAW/C,GAAMgrB,SACbjiB,KAAM,SAAUlJ,GACZG,GAAM+I,KAAKlJ,EAASG,GAAMgrB,QAAQF,KAEtCA,IACIuF,SACAqC,UACAC,SACAhB,OAAQ,SAAU7lB,GACd9L,GAAM8qB,GAAG6G,OAAO7lB,EAAQ9L,GAAMgrB,QAAQF,MAG9CuF,WAEJrwB,GAAM4yB,cAAgB,SAAU9C,EAAUtnB,GAKtC,MAJKA,KACDA,MAEJA,EAAQqqB,WAAY,EACbr0B,EAAEsxB,GAAUxT,IAAI,SAAUvW,EAAKlG,GAElC,MADAA,GAAUrB,EAAEqB,MACRI,GAAQyoB,sBAAuB1oB,GAAM+qB,OAAOD,GAAGgI,UAAajzB,EAAQ8D,KAAK,0BACzE9D,EAAQkzB,oBAAoBvqB,GACrB3I,EAAQ8D,KAAK,0BAIzB,IAEP3D,GAAMiN,eAAiB,SAAUuE,GAC7BA,EAAEvE,kBAENjN,GAAMgxB,eAAiB,SAAUnxB,EAASmzB,GAAnB,GACuC/vB,GAAGvD,EAMjDuzB,EA2BAnnB,EAEIzC,EAnCZiC,EAAOzL,EAAQ8D,KAAK3D,GAAM+K,GAAK,QAAS6f,KAAyBsI,EAAcrzB,EAAQ8D,KAAK,YAChG,IAAI2H,EAAM,CAIN,GAHa,YAATA,IACAA,EAAO,YAEE,kBAATA,IACI2nB,EAAgBpzB,EAAQ8D,KAAK,uBAE7B,MAAOsvB,EAGf,IAAa,SAAT3nB,GAAmB4nB,EACnB,MAAOA,EAEX,IAAIF,EACA,GAAIA,EAAO,GACP,IAAK/vB,EAAI,EAAGvD,EAASszB,EAAOtzB,OAAQuD,EAAIvD,EAAQuD,IAC5C2nB,EAAQvZ,KAAK2hB,EAAO/vB,GAAGotB,MAAM/kB,QAGjCsf,GAAQvZ,KAAK2hB,EAAO3C,MAAM/kB,QAG9Bsf,IACI5qB,GAAM8qB,GAAGuF,MAAM/kB,GACftL,GAAMgrB,QAAQF,GAAGuF,MAAM/kB,GACvBtL,GAAM+qB,OAAOD,GAAGuF,MAAM/kB,GAM9B,KAHIA,EAAKhF,QAAQ,MAAQ,IACrBskB,GAAW5qB,GAAM8sB,OAAOxhB,GAAM7M,KAE7BwE,EAAI,EAAGvD,EAASkrB,EAAQlrB,OAAQuD,EAAIvD,EAAQuD,IAE7C,GADI6I,EAAS8e,EAAQ3nB,GACjB6I,IACIzC,EAAWxJ,EAAQ8D,KAAK,QAAUmI,EAAOiB,GAAGvE,QAAQ4Z,OAAStW,EAAOiB,GAAGvE,QAAQmH,OAE/E,MAAOtG,KAM3BrJ,GAAMmzB,SAAW,SAAU/I,GACvB,GAAIpZ,GAAUoZ,CAOd,OANInqB,IAAQ2gB,SAAS2C,UACjBvS,EAAU,WACNoiB,WAAWhJ,EAAU,OAG7B5rB,EAAEC,GAAQ+P,GAAGvO,GAAQyqB,OAAQ1Z,GACtBA,GAEXhR,GAAMqzB,aAAe,SAAUjJ,GAC3B5rB,EAAEC,GAAQ60B,IAAIrzB,GAAQyqB,OAAQN,IAElCpqB,GAAMuzB,UAAY,SAAU1zB,EAASsH,GACjC,MAAOtH,GAAQ8D,KAAK3D,GAAM+K,GAAK5D,IAEnCnH,GAAMuV,MACFie,OAAQ,EACRC,OAAQ,EACRC,QAAS,EACTC,UAAW,EACXC,SAAU,EACVC,OAAQ,EACRC,SAAU,GAWdt1B,EAAEsK,OAAOtK,EAAE+N,KAAKC,SACZunB,eAAgB,SAAUl0B,GACtB,GAAIkG,GAAMvH,EAAEwN,KAAKnM,EAAS,WAC1B,OAAOoM,GAAUpM,GAAUmf,MAAMjZ,IAAQA,SAG7CmI,IACA,YACA,YACA,aACA,aACA,YACA,WACA,UACA,SAEAC,GAA8B,oCAC9BC,IACA4lB,eAAgB,WAAA,GAQRhjB,GAPAjL,EAAM,EAAGrG,EAASwO,GAAaxO,OAAQG,EAAU8F,SAASmC,eAC9D,KAAIsG,GAAqB6lB,WAAch0B,GAAQ6mB,aAkB/C,IAfA1Y,GAAqB6lB,WAAY,EACjC7lB,GAAqB8lB,WAAY,EACjC9lB,GAAqB+lB,cAAe,EAChCnjB,EAAU,SAAUQ,GAChBpD,GAAqB+lB,eACN,UAAX3iB,EAAElK,KACE8G,GAAqB8lB,YAAc11B,EAAEgT,EAAE5B,QAAQ3N,GAAGkM,MAClDqD,EAAEvE,iBACFuE,EAAE4iB,mBAGN5iB,EAAE4iB,oBAIPruB,EAAMrG,EAAQqG,IACjBlG,EAAQknB,iBAAiB7Y,GAAanI,GAAMiL,GAAS,IAG7DqjB,UAAW,SAAU7iB,GACjBpD,GAAqB+lB,cAAe,EAChC3iB,EAAE7N,KAAKuwB,YACP9lB,GAAqB8lB,WAAY,GAErCI,aAAalmB,GAAqBmmB,qBAEtCC,YAAa,WACTF,aAAalmB,GAAqBmmB,oBAClCnmB,GAAqBmmB,mBAAqBnB,WAAW,WACjDhlB,GAAqB+lB,cAAe,EACpC/lB,GAAqB8lB,WAAY,GAClC,OAGP7lB,IACAsa,KAAM,uBACN8L,KAAM,sBACN7L,GAAI,+BACJ8L,OAAQ,0BAERz0B,GAAQ6hB,QAAU7hB,GAAQ2gB,SAASuD,KAAOlkB,GAAQ2gB,SAAS2C,SAC3DlV,IACIsa,KAAM,aACN8L,KAAM,YACN7L,GAAI,uBACJ8L,OAAQ,eAELz0B,GAAQ0H,SACf0G,IACIsa,KAAM,cACN8L,KAAM,cACN7L,GAAI,YACJ8L,OAAQ,8BAELz0B,GAAQ2H,aACfyG,IACIsa,KAAM,gBACN8L,KAAM,gBACN7L,GAAI,cACJ8L,OAAQ,oCAGZz0B,GAAQ2H,YAAgB,oBAAsBnJ,IAC9CD,EAAEsH,MACE6uB,eAAgB,gBAChBC,eAAgB,gBACjB,SAAUC,EAAMC,GACft2B,EAAE8jB,MAAMyS,QAAQF,IACZG,aAAcF,EACdG,SAAUH,EACVI,OAAQ,SAAU5S,GACd,GAAI6S,GAAKvlB,EAASxH,KAAMgtB,EAAU9S,EAAM+S,cAAeC,EAAYhT,EAAMgT,SAMzE,OALKF,KAAWA,IAAYxlB,GAAWpR,EAAEoN,SAASgE,EAAQwlB,MACtD9S,EAAMhb,KAAOguB,EAAUC,SACvBJ,EAAMG,EAAUtkB,QAAQX,MAAMjI,KAAMlF,WACpCof,EAAMhb,KAAOwtB,GAEVK,MAKnB7mB,GAAc,SAAUkD,GACpB,MAAOnD,IAASmD,IAAMA,GACvBjD,GAAa,WACpBvO,GAAMw1B,cAAgB,SAAUvkB,EAAQlG,GAKpC,MAJAkG,GAASA,EAAOhS,QAAQsP,GAAYD,IAChCvD,IACAkG,EAASA,EAAOhS,QAAQsP,GAAY,MAAQxD,IAEzCkG,GAEXjR,GAAMy1B,eAAiB,SAAUjkB,EAAG1F,GAAb,GAQV/F,GAASrG,EAPduR,EAASnF,EAAO4E,QAAQglB,YAC5B,KAAKzkB,EACD,OAAO,CAKX,KAHAA,EAASA,EAAO3B,QAChBkC,EAAEC,OAAS3F,EACX0F,EAAEmkB,qBAAsB,EACf5vB,EAAM,EAAGrG,EAASuR,EAAOvR,OAAQqG,EAAMrG,EAAQqG,IACpDkL,EAAOlL,GAAK2L,KAAK5F,EAAQ0F,EAE7B,QAAQA,EAAEmkB,qBAEVnnB,GAAKhQ,EAAEuO,GAAGyB,GAIde,IAAkB,EAAM3C,EAAapO,GACrCoO,EAAYG,GAAKH,EAAY0D,UAAY,GAAI9R,GAC7CoO,EAAYG,GAAG/I,YAAc4I,EAC7BA,EAAYG,GAAGhE,KAAO,SAAU8D,EAAUC,GAItC,MAHIA,IAAWA,YAAmBtO,MAAOsO,YAAmBF,MACxDE,EAAUF,EAAYE,IAEnBtO,EAAEuO,GAAGhE,KAAK2I,KAAKtJ,KAAMyE,EAAUC,EAAS2B,KAEnD7B,EAAYG,GAAGhE,KAAKuH,UAAY1D,EAAYG,GACxC0B,GAAa7B,EAAYjH,UAC7BmD,GAAO8D,EAAYG,IACfiE,QAAS,SAAUA,GAEf,MADA5I,MAAKzE,KAAK,UAAWqN,GACd5I,MAEX6pB,YAAa,SAAUlnB,GAEnB,MADA3C,MAAKzE,KAAK,UAAWoH,GAAM/K,GAAMmtB,QAC1B/kB,MAEXoG,GAAI,WAAA,GAKI1B,GAAgBglB,EAIhB1H,EAAkCnZ,EAG9BpE,EAA+CqnB,EAQ/CpoB,EACA8pB,EApBJzlB,EAAO/H,KAAM2C,EAAKoF,EAAKxM,KAAK,UAChC,OAAyB,KAArBT,UAAUxD,OACH8O,GAAGkD,KAAKvB,EAAMjN,UAAU,KAE/B4J,EAAUqD,EAAM2hB,EAAOxiB,GAAMoC,KAAKxO,iBAC3B4uB,GAAKA,EAAKpyB,OAAS,KAAO2E,IACjCytB,EAAK+D,MAELzL,EAAW0H,EAAKA,EAAKpyB,OAAS,GAAIuR,EAASjR,GAAMw1B,cAAc1D,EAAK,GAAI/mB,GACxE9K,GAAQ0lB,sBAAwB1U,EAAO6kB,OAAO,mBAAuB1tB,KAAK,KAAOzC,SAASmC,kBAC1FsG,GAAqB4lB,iBACjBnnB,EAA2B,IAAhBilB,EAAKpyB,OAAe,KAAOoyB,EAAK,GAAIoC,EAAYjjB,EAAO3K,QAAQ,aAAiB2K,EAAO3K,QAAQ,eAC9GkI,GAAGkD,KAAKtJ,MACJ2tB,WAAY3nB,GAAqBimB,UACjC2B,SAAU5nB,GAAqBomB,aAChC3nB,GAAYqnB,UAAWA,KAE1BhxB,UAAU,GAAGoD,QAAQ,iBAAqBwrB,EAAK,IAAMA,EAAK,GAAGtpB,SAC7DspB,EAAK,GAAK7gB,EACNnF,EAASgmB,EAAK,GACd8D,EAAkB9D,EAAKA,EAAKpyB,OAAS,GACzCoyB,EAAKA,EAAKpyB,OAAS,GAAK,SAAU8R,GAC9B,GAAIxR,GAAMy1B,eAAejkB,EAAG1F,GACxB,MAAO8pB,GAAgBvlB,MAAMjI,MAAOoJ,KAG5ChD,GAAG6B,MAAMF,EAAM2hB,GACR3hB,UAEAia,KAAaxhB,KACpBkE,EAAUqD,EAAKxM,KAAK,WACpBymB,EAAWtd,EAAQsd,GACnB0H,EAAKA,EAAKpyB,OAAS,GAAK,SAAU8R,GAC9B4Y,EAAS1Y,KAAK5E,EAAS0E,KAG/BsgB,EAAK,GAAK7gB,EACVzC,GAAG6B,MAAMF,EAAM2hB,GACR3hB,KAEX+hB,aAAc,SAAUnnB,GAKpB,MAJAA,GAAKA,GAAM3C,KAAKzE,KAAK,WACjBoH,GACA3C,KAAKkrB,IAAI,IAAMvoB,GAEZ3C,QAGfpI,GAAM8P,OAASlD,EACf5M,GAAMqO,SAAWA,GACjBrO,GAAM8f,SAAW,WAwBb,QAASmW,GAAW3X,EAAM4X,GAA1B,GACQ/gB,GACAghB,EACAC,EACA7X,EAAQ2X,EAAK,GACb1nB,EAAK0nB,EAAK,GACVG,EAAOH,EAAK,GACZI,EAAQJ,EAAK,EAIjB,OAHKI,KACDJ,EAAK,GAAKI,MAEVA,EAAMhY,GACCgY,EAAMhY,IAEZU,MAAMxQ,GAEuB,IAAvBA,EAAGlI,QAAQ,SAClB6O,EAAO,GAAI7Q,MAAKA,KAAK6Y,IAAImB,EAAM9I,EAAO+I,GAAS,EAAG,EAAG8X,EAAK,GAAK,GAAIA,EAAK,GAAIA,EAAK,GAAI,IACrFF,EAAY5gB,EAAK/G,EAAGqP,OAAO,EAAG,IAC9BuY,EAASjhB,EAAKohB,YACdphB,EAAKqhB,WAAWrhB,EAAKhB,aAAegiB,EAAYC,GAAUD,EAAYC,EAAS,EAAI,KAC5E5nB,EAAGlI,QAAQ,OAAS,GAC3B6O,EAAO,GAAI7Q,MAAKA,KAAK6Y,IAAImB,EAAM9I,EAAO+I,GAAQ/P,EAAGqP,OAAO,GAAIwY,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAI,IACvFF,EAAY5gB,EAAK/G,EAAGqP,OAAO,EAAG,IAC9BuY,EAASjhB,EAAKohB,YACdphB,EAAKqhB,WAAWrhB,EAAKhB,aAAegiB,EAAYC,GAAUD,EAAYC,EAAS,EAAI,KAC5E5nB,EAAGlI,QAAQ,OAAS,IAC3B6O,EAAO,GAAI7Q,MAAKA,KAAK6Y,IAAImB,EAAM9I,EAAO+I,GAAQ/P,EAAGqP,OAAO,GAAIwY,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAI,IACvFF,EAAY5gB,EAAK/G,EAAGqP,OAAO,EAAG,IAC9BuY,EAASjhB,EAAKohB,YACdphB,EAAKqhB,WAAWrhB,EAAKhB,aAAegiB,EAAYC,GAAUD,EAAYC,EAAS,EAAI,KAfnFjhB,EAAO,GAAI7Q,MAAKA,KAAK6Y,IAAImB,EAAM9I,EAAO+I,GAAQ/P,EAAI6nB,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAI,IAiB1EC,EAAMhY,GAAQnJ,GAEzB,QAASshB,GAASC,EAASC,EAAOC,GAAlC,GAGYP,GACA7uB,EAmBJ8W,EAgBA4X,CArCJ,QADAS,EAAQA,EAAMC,KAsBVtY,EAAO,GAAIha,MAAKoyB,GAASziB,iBAC7B0iB,EAAQ7mB,OAAO+mB,KAAKF,EAAO,SAAUT,GAAV,GACnBY,GAAOZ,EAAK,GACZa,EAAKb,EAAK,EACd,OAAOY,IAAQxY,IAASyY,GAAMzY,GAAQwY,GAAQxY,GAAc,QAANyY,GAAsB,OAANA,KAE1EJ,EAAMtlB,KAAKqlB,GACXC,EAAMlP,KAAK,SAAU/b,EAAGC,GAOpB,MANgB,gBAALD,KACPA,GAAWuqB,EAAW3X,EAAM5S,IAEhB,gBAALC,KACPA,GAAWsqB,EAAW3X,EAAM3S,IAEzBD,EAAIC,IAEXuqB,EAAOS,EAAM7mB,OAAO/D,QAAQ2qB,EAASC,GAAS,IAAMA,EAAMA,EAAMj3B,OAAS,GACtEsf,MAAMkX,GAAQA,EAAO,OArCpBG,EAAOO,EAAK73B,MAAM,KAClByI,EAAS,EACT6uB,EAAK32B,OAAS,IACd8H,EAAmB,GAAV6uB,EAAK,KAAiBA,EAAK,UAIpC,MACA,IACA,MACA,GAEI,EACA,EACA,GAEJ7uB,EACA,MAsBZ,QAASwvB,GAASN,EAASO,EAAOnX,GAAlC,GAQa/Z,GACDmxB,EAKJN,EAbAO,EAAYF,EAAMnX,EAItB,IAHyB,gBAAdqX,KACPA,EAAYF,EAAME,KAEjBA,EACD,KAAU9kB,OAAM,aAAeyN,EAAW,oEAE9C,KAAS/Z,EAAMoxB,EAAUz3B,OAAS,EAAGqG,GAAO,IACpCmxB,EAAQC,EAAUpxB,GAAK,KACvBmxB,GAASR,EAAUQ,IAFoBnxB,KAO/C,GADI6wB,EAAOO,EAAUpxB,EAAM,IACtB6wB,EACD,KAAUvkB,OAAM,aAAeyN,EAAW,kBAAoB4W,EAAU,IAE5E,OAAOE,GAEX,QAASQ,GAAYV,EAASO,EAAON,EAAO7W,SAC7B4W,IAAWxnB,KAClBwnB,EAAUpyB,KAAK6Y,IAAIuZ,EAAQzgB,cAAeygB,EAAQ1gB,WAAY0gB,EAAQ9gB,UAAW8gB,EAAQxgB,WAAYwgB,EAAQvgB,aAAcugB,EAAQtgB,aAAcsgB,EAAQrgB,mBAE7J,IAAIugB,GAAOI,EAASN,EAASO,EAAOnX,EACpC,QACI8W,KAAMA,EACNV,KAAMO,EAASC,EAASC,EAAOC,EAAK,KAG5C,QAASpvB,GAAOkvB,EAAS5W,GAAzB,GAIQuX,GACAT,EACAV,CALJ,OAAgB,WAAZpW,GAAqC,WAAZA,EAClB,GAEPuX,EAAOD,EAAYV,EAAStuB,KAAK6uB,MAAO7uB,KAAKuuB,MAAO7W,GACpD8W,EAAOS,EAAKT,KACZV,EAAOmB,EAAKnB,KACTl2B,GAAMiL,WAAWirB,EAAOU,EAAK,GAAKV,EAAK,GAAKU,EAAK,KAE5D,QAAS5c,GAAK0c,EAAS5W,GAAvB,GACQuX,GAAOD,EAAYV,EAAStuB,KAAK6uB,MAAO7uB,KAAKuuB,MAAO7W,GACpD8W,EAAOS,EAAKT,KACZV,EAAOmB,EAAKnB,KACZhmB,EAAO0mB,EAAK,EAChB,OAAI1mB,GAAK5J,QAAQ,MAAQ,EACd4J,EAAKnR,MAAM,KAAKm3B,IAASA,EAAK,GAAK,EAAI,GACvChmB,EAAK5J,QAAQ,OAAS,EACtB4J,EAAKjR,QAAQ,KAAOi3B,GAAmB,KAAXA,EAAK,GAAiBA,EAAK,GAAV,IAEjDhmB,EAEX,QAAS6P,GAAQ5K,EAAMmiB,EAAYC,GAAnC,GAEQC,GAOAC,EAEAC,EAVAC,EAAeJ,CAenB,cAbWD,IAAc1uB,KACrB0uB,EAAalvB,KAAKZ,OAAO2N,EAAMmiB,UAExBC,IAAY3uB,KACnB2uB,EAAWnvB,KAAKZ,OAAO2N,EAAMoiB,IAE7BE,EAAkBtiB,EAAKqB,oBAC3BrB,EAAO,GAAI7Q,MAAK6Q,EAAK5Q,UAAsC,KAAzB+yB,EAAaC,IAC3CG,EAAgBviB,EAAKqB,0BACdmhB,IAAgB/uB,KACvB+uB,EAAevvB,KAAKZ,OAAO2N,EAAMwiB,IAErCH,EAAOE,EAAgBD,GAAmBF,EAAWI,GAC9C,GAAIrzB,MAAK6Q,EAAK5Q,UAAmB,IAAPizB,GAErC,QAASnnB,GAAM8E,EAAM2K,GACjB,MAAO1X,MAAK2X,QAAQ5K,EAAMA,EAAKqB,oBAAqBsJ,GAExD,QAAS4R,GAAOvc,EAAM2K,GAClB,MAAO1X,MAAK2X,QAAQ5K,EAAM2K,EAAU3K,EAAKqB,qBAE7C,QAASohB,GAAYvB,GACjB,MAAOjuB,MAAKiI,MAAM,GAAI/L,MAAK+xB,GAAO,WAhLzB,GACT7gB,IACAqiB,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,GACLC,IAAK,IAELjjB,GACAkjB,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EA4JT,QACI9B,SACAN,SACAnvB,OAAQA,EACRuY,QAASA,EACT1P,MAAOA,EACPqhB,OAAQA,EACR1X,KAAMA,EACN4d,YAAaA,MAGrB53B,GAAMmV,KAAO,WAET,QAASoH,GAAUpH,EAAMqH,GACrB,MAAc,KAAVA,GAAmC,KAApBrH,EAAKe,aACpBf,EAAKsH,SAAStH,EAAKe,WAAa,IACzB,GAIf,QAAS8iB,GAAa7jB,EAAMqJ,EAAKya,GAC7B,GAAIzc,GAAQrH,EAAKe,UACjB+iB,GAAMA,GAAO,EACbza,GAAOA,EAAMrJ,EAAKW,SAAW,EAAImjB,GAAO,EACxC9jB,EAAK+jB,QAAQ/jB,EAAKS,UAAY4I,GAC9BjC,EAAUpH,EAAMqH,GAEpB,QAAS2c,GAAUhkB,EAAMqJ,EAAKya,GAG1B,MAFA9jB,GAAO,GAAI7Q,MAAK6Q,GAChB6jB,EAAa7jB,EAAMqJ,EAAKya,GACjB9jB,EAEX,QAASikB,GAAgBjkB,GACrB,MAAO,IAAI7Q,MAAK6Q,EAAKc,cAAed,EAAKa,WAAY,GAEzD,QAASqjB,GAAelkB,GACpB,GAAImkB,GAAO,GAAIh1B,MAAK6Q,EAAKc,cAAed,EAAKa,WAAa,EAAG,GAAI9W,EAAQk6B,EAAgBjkB,GAAOokB,EAAavyB,KAAKC,IAAIqyB,EAAK9iB,oBAAsBtX,EAAMsX,oBAIvJ,OAHI+iB,IACAD,EAAK7c,SAASvd,EAAMgX,WAAaqjB,EAAa,IAE3CD,EAEX,QAASE,GAAoBrkB,EAAMskB,GAC/B,MAAqB,KAAjBA,EACOC,EAAQP,EAAUhkB,EAAMskB,MAAmB,GAE/CC,EAAQvkB,EAAM,GAAKA,EAAKW,UAAY,IAE/C,QAAS6jB,GAAexkB,EAAMskB,GAA9B,GACQG,GAAkB,GAAIt1B,MAAK6Q,EAAKc,cAAe,EAAG,QAClD4jB,EAAUL,EAAoBrkB,EAAMskB,GACpCK,EAAWD,EAAQt1B,UAAYq1B,EAAgBr1B,UAC/CgR,EAAOvO,KAAKzE,MAAMu3B,EAAWC,EACjC,OAAO,GAAI/yB,KAAKzE,MAAMgT,EAAO,GAEjC,QAASykB,GAAW7kB,EAAMskB,GAA1B,GAIQQ,GACAC,EACAC,CACJ,OANIV,KAAiB/6B,IACjB+6B,EAAez5B,GAAM8U,UAAUM,SAAS4F,UAExCif,EAAeP,EAAQvkB,MACvB+kB,EAAeR,EAAQvkB,EAAM,GAC7BglB,EAAaR,EAAexkB,EAAMskB,GACnB,IAAfU,EACOR,EAAeM,EAAcR,GAAgB,EAErC,KAAfU,GAAqBR,EAAeO,EAAcT,GAAgB,EAC3D,EAEJU,EAEX,QAASvkB,GAAQT,GAGb,MAFAA,GAAO,GAAI7Q,MAAK6Q,EAAKc,cAAed,EAAKa,WAAYb,EAAKS,UAAW,EAAG,EAAG,GAC3E2G,EAAUpH,EAAM,GACTA,EAEX,QAASilB,GAAUjlB,GACf,MAAO7Q,MAAK6Y,IAAIhI,EAAKc,cAAed,EAAKa,WAAYb,EAAKS,UAAWT,EAAKe,WAAYf,EAAKgB,aAAchB,EAAKiB,aAAcjB,EAAKkB,mBAErI,QAASA,GAAgBlB,GACrB,MAAOklB,GAAgBllB,GAAM5Q,UAAYqR,EAAQykB,EAAgBllB,IAErE,QAASmlB,GAAct0B,EAAOuV,EAAK/a,GAC/B,GAAgE+5B,GAA5DC,EAAQnkB,EAAgBkF,GAAMkf,EAAQpkB,EAAgB7V,EAC1D,QAAKwF,GAASw0B,GAASC,IAGnBlf,GAAO/a,IACPA,GAAOu5B,GAEXQ,EAAUlkB,EAAgBrQ,GACtBw0B,EAAQD,IACRA,GAAWR,GAEXU,EAAQD,IACRC,GAASV,GAENQ,GAAWC,GAASD,GAAWE,GAE1C,QAASC,GAAc10B,EAAOuV,EAAK/a,GAC/B,GAAkD+5B,GAA9CC,EAAQjf,EAAIhX,UAAWk2B,EAAQj6B,EAAI+D,SAKvC,OAJIi2B,IAASC,IACTA,GAASV,GAEbQ,EAAUv0B,EAAMzB,UACTg2B,GAAWC,GAASD,GAAWE,EAE1C,QAASf,GAAQvkB,EAAM3N,GACnB,GAAIgV,GAAQrH,EAAKe,UAIjB,OAHAf,GAAO,GAAI7Q,MAAK6Q,GAChBwlB,EAAQxlB,EAAM3N,EAASuyB,GACvBxd,EAAUpH,EAAMqH,GACTrH,EAEX,QAASwlB,GAAQxlB,EAAMuJ,EAAckc,GAArC,GAEQC,GADArzB,EAAS2N,EAAKqB,mBAElBrB,GAAKwlB,QAAQxlB,EAAK5Q,UAAYma,GACzBkc,IACDC,EAAa1lB,EAAKqB,oBAAsBhP,EACxC2N,EAAKwlB,QAAQxlB,EAAK5Q,UAAYs2B,EAAaC,IAGnD,QAASre,GAAStH,EAAMkhB,GAGpB,MAFAlhB,GAAO,GAAI7Q,MAAK6Q,EAAKc,cAAed,EAAKa,WAAYb,EAAKS,UAAWygB,EAAKngB,WAAYmgB,EAAKlgB,aAAckgB,EAAKjgB,aAAcigB,EAAKhgB,mBACjIkG,EAAUpH,EAAMkhB,EAAKngB,YACdf,EAEX,QAAS4lB,KACL,MAAOnlB,GAAQ,GAAItR,OAEvB,QAAS02B,GAAQ7lB,GACb,MAAOS,GAAQT,GAAM5Q,WAAaw2B,IAAQx2B,UAE9C,QAAS81B,GAAgBllB,GACrB,GAAI8lB,GAAa,GAAI32B,MAAK,KAAM,EAAG,EAAG,EAAG,EAAG,EAI5C,OAHI6Q,IACA8lB,EAAWxe,SAAStH,EAAKe,WAAYf,EAAKgB,aAAchB,EAAKiB,aAAcjB,EAAKkB,mBAE7E4kB,EA9HX,GAAIH,GAAgB,IAAOf,EAAa,KAgIxC,QACIxd,UAAWA,EACX4c,UAAWA,EACXH,aAAcA,EACdpjB,QAASA,EACT8kB,cAAeA,EACfJ,cAAeA,EACfU,QAASA,EACTE,QAAS,SAAU/lB,GACf,MAAOukB,GAAQvkB,EAAM,IAEzBgmB,YAAa,SAAUhmB,GACnB,MAAOukB,GAAQvkB,OAEnBilB,UAAWA,EACXL,WAAYA,EACZqB,YAAa,GAAKN,EAClBA,cAAeA,EACfH,QAASA,EACTle,SAAUA,EACVid,QAASA,EACTqB,MAAOA,EACPV,gBAAiBA,EACjBjB,gBAAiBA,EACjBC,eAAgBA,EAChBW,WAAYA,EACZ3jB,gBAAiBA,MAGzBrW,GAAMq7B,gBAAkB,SAAUx7B,GAAV,GAEZy7B,GASKr4B,EACDs4B,CAXZ,IAAI51B,SAAS61B,mBAIT,IAHIF,EAAW31B,SAAS61B,mBAAmB37B,EAAS47B,WAAWC,UAAW,SAAUC,GAChF,MAAOA,GAAK1T,YAAcpoB,EAAU47B,WAAWG,cAAgBH,WAAWI,gBAC3E,GACIP,EAASQ,YACRR,EAASS,gBAAkBT,EAASS,cAAcC,YAAYC,QAC9DX,EAASS,cAAc9T,WAAWtG,YAAY2Z,EAASS,mBAI/D,KAAS94B,EAAI,EAAGA,EAAIpD,EAAQq8B,WAAWx8B,OAAQuD,IACvCs4B,EAAQ17B,EAAQq8B,WAAWj5B,GACT,GAAlBs4B,EAAM9K,UAAkB,KAAKzuB,KAAKu5B,EAAMY,aACxCt8B,EAAQ8hB,YAAY4Z,GACpBt4B,KAEkB,GAAlBs4B,EAAM9K,UACNzwB,GAAMq7B,gBAAgBE,IAKlC7sB,GAAiBjQ,EAAO29B,uBAAyB39B,EAAO49B,6BAA+B59B,EAAO69B,0BAA4B79B,EAAO89B,wBAA0B99B,EAAO+9B,yBAA2B,SAAUpS,GACvMgJ,WAAWhJ,EAAU,IAAO,KAEhCpqB,GAAM0O,eAAiB,SAAU0b,GAC7B1b,GAAegD,KAAKjT,EAAQ2rB,IAE5Bzb,MACJ3O,GAAMy8B,eAAiB,SAAUrS,GAC7Bzb,GAAeA,GAAejP,QAAU0qB,EACV,IAA1Bzb,GAAejP,QACfM,GAAM08B,oBAGd18B,GAAM08B,iBAAmB,WACrB18B,GAAM0O,eAAe,WACbC,GAAe,KACfA,GAAe0M,UACX1M,GAAe,IACf3O,GAAM08B,uBAKtB18B,GAAM28B,uBAAyB,SAAUhQ,GAErC,IADA,GAAIiQ,GAAcjQ,EAAI5tB,MAAM,KAAK,IAAM,GAAI89B,KAAaC,EAAaF,EAAY79B,MAAM,OAAQW,EAASo9B,EAAWp9B,OAAQqG,EAAM,EAC1HA,EAAMrG,EAAQqG,GAAO,EACA,KAApB+2B,EAAW/2B,KACX82B,EAAO1yB,mBAAmB2yB,EAAW/2B,KAASoE,mBAAmB2yB,EAAW/2B,EAAM,IAG1F,OAAO82B,IAEX78B,GAAM+8B,mBAAqB,SAAUvrB,GACjC,GAAyB,IAAdA,EAAEwrB,EAAEC,OACX,MAAOt3B,UAASskB,iBAAiBzY,EAAEwrB,EAAEC,OAAQzrB,EAAEoJ,EAAEqiB,SAGzDj9B,GAAMk9B,YAAc,SAAUC,GAC1B,GAA2DC,GAAvD5rB,EAAI2rB,EAAYpT,cAAesT,EAAS7rB,EAAE0rB,WAQ9C,OAPI1rB,GAAE8rB,YACED,IAAW3+B,GAAa2+B,KACxBD,EAAQ5rB,EAAE8rB,YAEP9rB,EAAE+rB,QAAU/rB,EAAEgsB,OAAShsB,EAAEisB,gBAChCL,EAAoB,IAAX5rB,EAAE+rB,QAERH,GAEXp9B,GAAM09B,SAAW,SAAU3wB,EAAI4wB,GAAd,GACTC,GAKAC,EAJAC,EAAe,CACnB,QAAKH,GAASA,GAAS,EACZ5wB,GAEP8wB,EAAY,WAIZ,QAASjlB,KACL7L,EAAGsD,MAAMF,EAAM2hB,GACfgM,GAAgB,GAAIx5B,MANZ,GACR6L,GAAO/H,KACP21B,GAAW,GAAIz5B,MAASw5B,EACxBhM,EAAO5uB,SAKX,OAAK46B,IAGDF,GACAtJ,aAAasJ,GAEbG,EAAUJ,EACV/kB,IAEAglB,EAAUxK,WAAWxa,EAAM+kB,EAAQI,GANvC,GAFWnlB,KAWfilB,EAAUnJ,OAAS,WACfJ,aAAasJ,IAEVC,IAEX79B,GAAMg+B,MAAQ,SAAUn+B,EAASuY,EAAO3Y,GAA1B,GACNw+B,GAeYlT,EAyBAmT,EAA4CC,EAAgBC,EAvCxEC,EAAajmB,IAAU1Z,CAO3B,IANIe,IAAQf,IACRe,EAAM2Y,GAENvY,EAAQ,KACRA,EAAUA,EAAQ,KAElBw+B,IAAcx+B,EAAQuM,SAA1B,CAGA,IACQvM,EAAQs+B,iBAAmBz/B,EACvB2/B,GACAx+B,EAAQy+B,QACJvT,EAAS9qB,GAAQ2gB,SACjBmK,EAAO1H,IAAM0H,EAAOxH,QACpB6P,WAAW,WACPvzB,EAAQ0+B,kBAAkBnmB,EAAO3Y,IAClC,GAEHI,EAAQ0+B,kBAAkBnmB,EAAO3Y,IAGrC2Y,GACIvY,EAAQs+B,eACRt+B,EAAQu+B,cAGTz4B,SAAS64B,YACZhgC,EAAEqB,GAASoC,GAAG,aACdpC,EAAQy+B,QAEZL,EAAep+B,EAAQ4+B,kBACnBJ,GACAJ,EAAaS,UAAS,GACtBT,EAAaU,UAAU,YAAavmB,GACpC6lB,EAAaW,QAAQ,YAAan/B,EAAM2Y,GACxC6lB,EAAaY,WAETX,EAAkBD,EAAaa,YACnCb,EAAac,eAAep5B,SAAS64B,UAAUQ,cAAcC,eAC7Df,EAAgBgB,YAAY,aAAcjB,GAC1CE,EAAiBD,EAAgBiB,KAAKz/B,OACtC0+B,EAAeD,EAAiBF,EAAakB,KAAKz/B,OAClD0Y,GACI+lB,EACAC,KAId,MAAO5sB,GACL4G,KAEJ,MAAOA,KAEXpY,GAAMo/B,uBAAyB,SAAUv/B,EAASw/B,GAC9C,GAAIjR,GAAU3vB,EAAO2vB,OAWrB,OAVAvuB,GAAQmM,KAAK,QAAUhM,GAAM+K,GAAK,OAAQlL,EAAQ,GAAG8tB,QAAQzoB,cAAcjG,QAAQ,gBAAiB,IAAIA,QAAQ,IAAK,KACrHmvB,EAAQvuB,QAAQA,GAASy/B,WAAWC,QAChC,WACA,SAAUC,GACNA,EAAS3/B,GAASw/B,GACb,qBAAqBr9B,KAAKq9B,EAAMI,UACjCJ,EAAMK,aAIX1/B,GAAMgxB,eAAenxB,EAASG,GAAM+qB,OAAOD,KAEtD9qB,GAAM2/B,kBAAoB,WACtB,GAAIC,MAAaC,EAAarhC,EAAE,0CAA0CwN,KAAK,WAAY8zB,EAAathC,EAAE,iDAAiDwN,KAAK,UAOhK,OANAxN,GAAE,6CAA+CsH,KAAK,WAClD85B,EAAOx3B,KAAKuH,MAAQvH,KAAKpC,QAEzB85B,IAAephC,GAAamhC,IAAenhC,IAC3CkhC,EAAOE,GAAcD,GAElBD,GAEX5/B,GAAM+/B,UAAY,SAAUC,GAGxB,QAAS1B,GAAMz3B,GACX,GAAIiF,GAAS9L,GAAMgxB,eAAenqB,EAC9BiF,IAAUA,EAAOwyB,MACjBxyB,EAAOwyB,QAEPz3B,EAAGy3B,QARG,GACV2B,GAAeD,EAAKnP,KAAK,oBAAoB3xB,QAC7CghC,EAAcF,EAAKnP,KAAK,qBAAqByI,MASjD4G,GAAY1xB,GAAG,UAAW,SAAUgD,GAC5BA,EAAE2uB,SAAWngC,GAAMorB,KAAKI,KAAQha,EAAE4uB,WAClC5uB,EAAEvE,iBACFqxB,EAAM2B,MAGdA,EAAazxB,GAAG,UAAW,SAAUgD,GAC7BA,EAAE2uB,SAAWngC,GAAMorB,KAAKI,KAAOha,EAAE4uB,WACjC5uB,EAAEvE,iBACFqxB,EAAM4B,OAIlBlgC,GAAMqgC,aAAe,SAAUxgC,GAAV,GACbygC,MACAC,EAAoB1gC,EAAQ2gC,aAAa,QAAQ7zB,OAAO,SAAU+O,EAAO7b,GACzE,GAAI4F,GAAgBzF,GAAMuF,kBAAkB1F,GAAU,YACtD,OAAkC,YAA3B4F,EAAcc,WACtBmD,IAAIjL,EACP8hC,GAAkBz6B,KAAK,SAAU4V,EAAOja,GACpC6+B,EAAmB5kB,GAASld,EAAEiD,GAAQsG,aAE1C,KACIlI,EAAQ,GAAG4gC,YACb,MAAOjvB,GACL3R,EAAQ,GAAGy+B,QAEfiC,EAAkBz6B,KAAK,SAAU4V,EAAOja,GACpCjD,EAAEiD,GAAQsG,UAAUu4B,EAAmB5kB,OAG/C1b,GAAM0gC,iBAAmB,WAAA,GAEbC,GACAjlB,EAEIklB,CAJRj7B,UAASmW,gBACL6kB,EAAaniC,EAAE,mBACfkd,EAAQilB,EAAWjlB,MAAM/V,SAASmW,eAClCJ,OACIklB,EAAcD,EAAWjlB,EAAQ,IAAMilB,EAAW,GACtDC,EAAYtC,WAIxBt+B,GAAM6gC,aAAe,SAAUC,GAC3B,GAAIC,GAAQ/gC,GAAMghC,kBAAkBF,IAAeA,CACnD,OAAO7gC,IAAQioB,YAAczpB,EAAOypB,WAAW6Y,GAAO3jB,SAE1Dpd,GAAMghC,kBAAoB,SAAUC,GAChC,OACIC,GAAM,qBACNC,GAAM,qBACNC,GAAM,qBACNC,GAAM,qBACNC,GAAM,uBACRL,IAENjhC,GAAMuhC,cACFC,OACI,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,OACI,OACA,OACA,OACA,OACA,OACA,OACA,MACA,QACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,QAEJC,OACI,MACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,OACA,MACA,OACA,OACA,QACA,OACA,SAEJC,KACI,OACA,QACA,OACA,SACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,QAEJC,cACI,OACA,OACA,OACA,OACA,SAEJj+B,MACI,OACA,OACA,SAEJk+B,aACI,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,QACA,OACA,OACA,OACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,QACA,MACA,OACA,OACA,UAEJC,KAAM,QACNC,QACI,OACA,OACA,OACA,OACA,OACA,OACA,UACA,OACA,QAEJC,KACI,MACA,OACA,MACA,QACA,OACA,OACA,OACA,OACA,OACA,UACA,KACA,OACA,SAEJC,cACI,OACA,OACA,SACA,OACA,OACA,OACA,SAGRjiC,GAAMkiC,aAAe,SAAUC,EAAWC,GAArB,GAORn/B,GACDo/B,EAPJC,EAActiC,GAAMuhC,aACpBgB,EAAShyB,OAAO6a,KAAKkX,GACrBh7B,EAAO,MACX,IAAI66B,IAAczjC,IAAcyjC,EAAUziC,OACtC,MAAO4H,EAEX,KAASrE,EAAI,EAAGA,EAAIs/B,EAAO7iC,OAAQuD,GAAK,EAEpC,GADIo/B,EAAaC,EAAYC,EAAOt/B,IACh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hD,EAAW,4EAA8E1uF,EAAQzN,KAAK,oBAW9IP,OAAOuB,MAAM8P,OAAQrR,OAAO2vB,SACvB3vB,OAAOuB,OACE,kBAAVzB,SAAwBA,OAAO0mC,IAAM1mC,OAAS,SAAU2mC,EAAIC,EAAIC,IACrEA,GAAMD,OAEV,SAAU7mC,EAAGC,QACVA,OAAO,iBACH,aACA,eACA,cACA,aACA,WACA,mBACA,iBACA,aACA,qBACA,eACA,kBACA,mBACA,oBACA,wBACA,kBACA,iBACA,mBACA,eACA,cACA,cACA,qBACA,gBACA,gBACA,aACA,iBACA,kBACA,mBACA,qBACA,qBACA,iBACA,oBACA,oBACA,iBACA,gBACA,uBACA,sBACA,aACA,iBACA,iBACA,oBACA,wBACA,iBACA,mBACA,uBACA,eACA,iBACA,eACA,eACA,oBACA,uBACA,sBACA,wBACA,oBACA,oBACA,yBACA,sBACA,yBACA,oBACA,2BACA,2BACA,sBACA,2BACA,2BACA,wBACA,sBACA,0BACA,sBACA,wBACA,iBACDD,IACL,WACE,YACA,OAAOG,QAAOuB,OACE,kBAAVzB,SAAwBA,OAAO0mC,IAAM1mC,OAAS,SAAU2mC,EAAIC,EAAIC,IACrEA,GAAMD","file":"kendo.ui.core.min.js","sourcesContent":["/*!\n * Copyright 2020 Progress Software Corporation and/or one of its subsidiaries or affiliates. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n(function (f, define) {\n    define('kendo.core', ['jquery'], f);\n}(function () {\n    var __meta__ = {\n        id: 'core',\n        name: 'Core',\n        category: 'framework',\n        description: 'The core of the Kendo framework.'\n    };\n    (function ($, window, undefined) {\n        var kendo = window.kendo = window.kendo || { cultures: {} }, extend = $.extend, each = $.each, isArray = $.isArray, proxy = $.proxy, noop = $.noop, math = Math, Template, JSON = window.JSON || {}, support = {}, percentRegExp = /%/, formatRegExp = /\\{(\\d+)(:[^\\}]+)?\\}/g, boxShadowRegExp = /(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+)?/i, numberRegExp = /^(\\+|-?)\\d+(\\.?)\\d*$/, FUNCTION = 'function', STRING = 'string', NUMBER = 'number', OBJECT = 'object', NULL = 'null', BOOLEAN = 'boolean', UNDEFINED = 'undefined', getterCache = {}, setterCache = {}, slice = [].slice, noDepricateExtend = function () {\n                var src, copyIsArray, copy, name, options, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false;\n                if (typeof target === 'boolean') {\n                    deep = target;\n                    target = arguments[i] || {};\n                    i++;\n                }\n                if (typeof target !== 'object' && !jQuery.isFunction(target)) {\n                    target = {};\n                }\n                if (i === length) {\n                    target = this;\n                    i--;\n                }\n                for (; i < length; i++) {\n                    if ((options = arguments[i]) != null) {\n                        for (name in options) {\n                            if (name == 'filters' || name == 'concat' || name == ':') {\n                                continue;\n                            }\n                            src = target[name];\n                            copy = options[name];\n                            if (target === copy) {\n                                continue;\n                            }\n                            if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {\n                                if (copyIsArray) {\n                                    copyIsArray = false;\n                                    clone = src && jQuery.isArray(src) ? src : [];\n                                } else {\n                                    clone = src && jQuery.isPlainObject(src) ? src : {};\n                                }\n                                target[name] = noDepricateExtend(deep, clone, copy);\n                            } else if (copy !== undefined) {\n                                target[name] = copy;\n                            }\n                        }\n                    }\n                }\n                return target;\n            };\n        kendo.version = '2020.2.414'.replace(/^\\s+|\\s+$/g, '');\n        function Class() {\n        }\n        Class.extend = function (proto) {\n            var base = function () {\n                }, member, that = this, subclass = proto && proto.init ? proto.init : function () {\n                    that.apply(this, arguments);\n                }, fn;\n            base.prototype = that.prototype;\n            fn = subclass.fn = subclass.prototype = new base();\n            for (member in proto) {\n                if (proto[member] != null && proto[member].constructor === Object) {\n                    fn[member] = extend(true, {}, base.prototype[member], proto[member]);\n                } else {\n                    fn[member] = proto[member];\n                }\n            }\n            fn.constructor = subclass;\n            subclass.extend = that.extend;\n            return subclass;\n        };\n        Class.prototype._initOptions = function (options) {\n            this.options = deepExtend({}, this.options, options);\n        };\n        var isFunction = kendo.isFunction = function (fn) {\n            return typeof fn === 'function';\n        };\n        var preventDefault = function () {\n            this._defaultPrevented = true;\n        };\n        var isDefaultPrevented = function () {\n            return this._defaultPrevented === true;\n        };\n        var Observable = Class.extend({\n            init: function () {\n                this._events = {};\n            },\n            bind: function (eventName, handlers, one) {\n                var that = this, idx, eventNames = typeof eventName === STRING ? [eventName] : eventName, length, original, handler, handlersIsFunction = typeof handlers === FUNCTION, events;\n                if (handlers === undefined) {\n                    for (idx in eventName) {\n                        that.bind(idx, eventName[idx]);\n                    }\n                    return that;\n                }\n                for (idx = 0, length = eventNames.length; idx < length; idx++) {\n                    eventName = eventNames[idx];\n                    handler = handlersIsFunction ? handlers : handlers[eventName];\n                    if (handler) {\n                        if (one) {\n                            original = handler;\n                            handler = function () {\n                                that.unbind(eventName, handler);\n                                original.apply(that, arguments);\n                            };\n                            handler.original = original;\n                        }\n                        events = that._events[eventName] = that._events[eventName] || [];\n                        events.push(handler);\n                    }\n                }\n                return that;\n            },\n            one: function (eventNames, handlers) {\n                return this.bind(eventNames, handlers, true);\n            },\n            first: function (eventName, handlers) {\n                var that = this, idx, eventNames = typeof eventName === STRING ? [eventName] : eventName, length, handler, handlersIsFunction = typeof handlers === FUNCTION, events;\n                for (idx = 0, length = eventNames.length; idx < length; idx++) {\n                    eventName = eventNames[idx];\n                    handler = handlersIsFunction ? handlers : handlers[eventName];\n                    if (handler) {\n                        events = that._events[eventName] = that._events[eventName] || [];\n                        events.unshift(handler);\n                    }\n                }\n                return that;\n            },\n            trigger: function (eventName, e) {\n                var that = this, events = that._events[eventName], idx, length;\n                if (events) {\n                    e = e || {};\n                    e.sender = that;\n                    e._defaultPrevented = false;\n                    e.preventDefault = preventDefault;\n                    e.isDefaultPrevented = isDefaultPrevented;\n                    events = events.slice();\n                    for (idx = 0, length = events.length; idx < length; idx++) {\n                        events[idx].call(that, e);\n                    }\n                    return e._defaultPrevented === true;\n                }\n                return false;\n            },\n            unbind: function (eventName, handler) {\n                var that = this, events = that._events[eventName], idx;\n                if (eventName === undefined) {\n                    that._events = {};\n                } else if (events) {\n                    if (handler) {\n                        for (idx = events.length - 1; idx >= 0; idx--) {\n                            if (events[idx] === handler || events[idx].original === handler) {\n                                events.splice(idx, 1);\n                            }\n                        }\n                    } else {\n                        that._events[eventName] = [];\n                    }\n                }\n                return that;\n            }\n        });\n        function compilePart(part, stringPart) {\n            if (stringPart) {\n                return '\\'' + part.split('\\'').join('\\\\\\'').split('\\\\\"').join('\\\\\\\\\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r').replace(/\\t/g, '\\\\t') + '\\'';\n            } else {\n                var first = part.charAt(0), rest = part.substring(1);\n                if (first === '=') {\n                    return '+(' + rest + ')+';\n                } else if (first === ':') {\n                    return '+$kendoHtmlEncode(' + rest + ')+';\n                } else {\n                    return ';' + part + ';$kendoOutput+=';\n                }\n            }\n        }\n        var argumentNameRegExp = /^\\w+/, encodeRegExp = /\\$\\{([^}]*)\\}/g, escapedCurlyRegExp = /\\\\\\}/g, curlyRegExp = /__CURLY__/g, escapedSharpRegExp = /\\\\#/g, sharpRegExp = /__SHARP__/g, zeros = [\n                '',\n                '0',\n                '00',\n                '000',\n                '0000'\n            ];\n        Template = {\n            paramName: 'data',\n            useWithBlock: true,\n            render: function (template, data) {\n                var idx, length, html = '';\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    html += template(data[idx]);\n                }\n                return html;\n            },\n            compile: function (template, options) {\n                var settings = extend({}, this, options), paramName = settings.paramName, argumentName = paramName.match(argumentNameRegExp)[0], useWithBlock = settings.useWithBlock, functionBody = 'var $kendoOutput, $kendoHtmlEncode = kendo.htmlEncode;', fn, parts, idx;\n                if (isFunction(template)) {\n                    return template;\n                }\n                functionBody += useWithBlock ? 'with(' + paramName + '){' : '';\n                functionBody += '$kendoOutput=';\n                parts = template.replace(escapedCurlyRegExp, '__CURLY__').replace(encodeRegExp, '#=$kendoHtmlEncode($1)#').replace(curlyRegExp, '}').replace(escapedSharpRegExp, '__SHARP__').split('#');\n                for (idx = 0; idx < parts.length; idx++) {\n                    functionBody += compilePart(parts[idx], idx % 2 === 0);\n                }\n                functionBody += useWithBlock ? ';}' : ';';\n                functionBody += 'return $kendoOutput;';\n                functionBody = functionBody.replace(sharpRegExp, '#');\n                try {\n                    fn = new Function(argumentName, functionBody);\n                    fn._slotCount = Math.floor(parts.length / 2);\n                    return fn;\n                } catch (e) {\n                    throw new Error(kendo.format('Invalid template:\\'{0}\\' Generated code:\\'{1}\\'', template, functionBody));\n                }\n            }\n        };\n        function pad(number, digits, end) {\n            number = number + '';\n            digits = digits || 2;\n            end = digits - number.length;\n            if (end) {\n                return zeros[digits].substring(0, end) + number;\n            }\n            return number;\n        }\n        (function () {\n            var escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g, gap, indent, meta = {\n                    '\\b': '\\\\b',\n                    '\\t': '\\\\t',\n                    '\\n': '\\\\n',\n                    '\\f': '\\\\f',\n                    '\\r': '\\\\r',\n                    '\"': '\\\\\"',\n                    '\\\\': '\\\\\\\\'\n                }, rep, toString = {}.toString;\n            if (typeof Date.prototype.toJSON !== FUNCTION) {\n                Date.prototype.toJSON = function () {\n                    var that = this;\n                    return isFinite(that.valueOf()) ? pad(that.getUTCFullYear(), 4) + '-' + pad(that.getUTCMonth() + 1) + '-' + pad(that.getUTCDate()) + 'T' + pad(that.getUTCHours()) + ':' + pad(that.getUTCMinutes()) + ':' + pad(that.getUTCSeconds()) + 'Z' : null;\n                };\n                String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function () {\n                    return this.valueOf();\n                };\n            }\n            function quote(string) {\n                escapable.lastIndex = 0;\n                return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n                    var c = meta[a];\n                    return typeof c === STRING ? c : '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n                }) + '\"' : '\"' + string + '\"';\n            }\n            function str(key, holder) {\n                var i, k, v, length, mind = gap, partial, value = holder[key], type;\n                if (value && typeof value === OBJECT && typeof value.toJSON === FUNCTION) {\n                    value = value.toJSON(key);\n                }\n                if (typeof rep === FUNCTION) {\n                    value = rep.call(holder, key, value);\n                }\n                type = typeof value;\n                if (type === STRING) {\n                    return quote(value);\n                } else if (type === NUMBER) {\n                    return isFinite(value) ? String(value) : NULL;\n                } else if (type === BOOLEAN || type === NULL) {\n                    return String(value);\n                } else if (type === OBJECT) {\n                    if (!value) {\n                        return NULL;\n                    }\n                    gap += indent;\n                    partial = [];\n                    if (toString.apply(value) === '[object Array]') {\n                        length = value.length;\n                        for (i = 0; i < length; i++) {\n                            partial[i] = str(i, value) || NULL;\n                        }\n                        v = partial.length === 0 ? '[]' : gap ? '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' : '[' + partial.join(',') + ']';\n                        gap = mind;\n                        return v;\n                    }\n                    if (rep && typeof rep === OBJECT) {\n                        length = rep.length;\n                        for (i = 0; i < length; i++) {\n                            if (typeof rep[i] === STRING) {\n                                k = rep[i];\n                                v = str(k, value);\n                                if (v) {\n                                    partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                                }\n                            }\n                        }\n                    } else {\n                        for (k in value) {\n                            if (Object.hasOwnProperty.call(value, k)) {\n                                v = str(k, value);\n                                if (v) {\n                                    partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                                }\n                            }\n                        }\n                    }\n                    v = partial.length === 0 ? '{}' : gap ? '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' : '{' + partial.join(',') + '}';\n                    gap = mind;\n                    return v;\n                }\n            }\n            if (typeof JSON.stringify !== FUNCTION) {\n                JSON.stringify = function (value, replacer, space) {\n                    var i;\n                    gap = '';\n                    indent = '';\n                    if (typeof space === NUMBER) {\n                        for (i = 0; i < space; i += 1) {\n                            indent += ' ';\n                        }\n                    } else if (typeof space === STRING) {\n                        indent = space;\n                    }\n                    rep = replacer;\n                    if (replacer && typeof replacer !== FUNCTION && (typeof replacer !== OBJECT || typeof replacer.length !== NUMBER)) {\n                        throw new Error('JSON.stringify');\n                    }\n                    return str('', { '': value });\n                };\n            }\n        }());\n        (function () {\n            var dateFormatRegExp = /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|\"[^\"]*\"|'[^']*'/g, standardFormatRegExp = /^(n|c|p|e)(\\d*)$/i, literalRegExp = /(\\\\.)|(['][^']*[']?)|([\"][^\"]*[\"]?)/g, commaRegExp = /\\,/g, EMPTY = '', POINT = '.', COMMA = ',', SHARP = '#', ZERO = '0', PLACEHOLDER = '??', EN = 'en-US', objectToString = {}.toString;\n            kendo.cultures['en-US'] = {\n                name: EN,\n                numberFormat: {\n                    pattern: ['-n'],\n                    decimals: 2,\n                    ',': ',',\n                    '.': '.',\n                    groupSize: [3],\n                    percent: {\n                        pattern: [\n                            '-n %',\n                            'n %'\n                        ],\n                        decimals: 2,\n                        ',': ',',\n                        '.': '.',\n                        groupSize: [3],\n                        symbol: '%'\n                    },\n                    currency: {\n                        name: 'US Dollar',\n                        abbr: 'USD',\n                        pattern: [\n                            '($n)',\n                            '$n'\n                        ],\n                        decimals: 2,\n                        ',': ',',\n                        '.': '.',\n                        groupSize: [3],\n                        symbol: '$'\n                    }\n                },\n                calendars: {\n                    standard: {\n                        days: {\n                            names: [\n                                'Sunday',\n                                'Monday',\n                                'Tuesday',\n                                'Wednesday',\n                                'Thursday',\n                                'Friday',\n                                'Saturday'\n                            ],\n                            namesAbbr: [\n                                'Sun',\n                                'Mon',\n                                'Tue',\n                                'Wed',\n                                'Thu',\n                                'Fri',\n                                'Sat'\n                            ],\n                            namesShort: [\n                                'Su',\n                                'Mo',\n                                'Tu',\n                                'We',\n                                'Th',\n                                'Fr',\n                                'Sa'\n                            ]\n                        },\n                        months: {\n                            names: [\n                                'January',\n                                'February',\n                                'March',\n                                'April',\n                                'May',\n                                'June',\n                                'July',\n                                'August',\n                                'September',\n                                'October',\n                                'November',\n                                'December'\n                            ],\n                            namesAbbr: [\n                                'Jan',\n                                'Feb',\n                                'Mar',\n                                'Apr',\n                                'May',\n                                'Jun',\n                                'Jul',\n                                'Aug',\n                                'Sep',\n                                'Oct',\n                                'Nov',\n                                'Dec'\n                            ]\n                        },\n                        AM: [\n                            'AM',\n                            'am',\n                            'AM'\n                        ],\n                        PM: [\n                            'PM',\n                            'pm',\n                            'PM'\n                        ],\n                        patterns: {\n                            d: 'M/d/yyyy',\n                            D: 'dddd, MMMM dd, yyyy',\n                            F: 'dddd, MMMM dd, yyyy h:mm:ss tt',\n                            g: 'M/d/yyyy h:mm tt',\n                            G: 'M/d/yyyy h:mm:ss tt',\n                            m: 'MMMM dd',\n                            M: 'MMMM dd',\n                            s: 'yyyy\\'-\\'MM\\'-\\'ddTHH\\':\\'mm\\':\\'ss',\n                            t: 'h:mm tt',\n                            T: 'h:mm:ss tt',\n                            u: 'yyyy\\'-\\'MM\\'-\\'dd HH\\':\\'mm\\':\\'ss\\'Z\\'',\n                            y: 'MMMM, yyyy',\n                            Y: 'MMMM, yyyy'\n                        },\n                        '/': '/',\n                        ':': ':',\n                        firstDay: 0,\n                        twoDigitYearMax: 2029\n                    }\n                }\n            };\n            function findCulture(culture) {\n                if (culture) {\n                    if (culture.numberFormat) {\n                        return culture;\n                    }\n                    if (typeof culture === STRING) {\n                        var cultures = kendo.cultures;\n                        return cultures[culture] || cultures[culture.split('-')[0]] || null;\n                    }\n                    return null;\n                }\n                return null;\n            }\n            function getCulture(culture) {\n                if (culture) {\n                    culture = findCulture(culture);\n                }\n                return culture || kendo.cultures.current;\n            }\n            kendo.culture = function (cultureName) {\n                var cultures = kendo.cultures, culture;\n                if (cultureName !== undefined) {\n                    culture = findCulture(cultureName) || cultures[EN];\n                    culture.calendar = culture.calendars.standard;\n                    cultures.current = culture;\n                } else {\n                    return cultures.current;\n                }\n            };\n            kendo.findCulture = findCulture;\n            kendo.getCulture = getCulture;\n            kendo.culture(EN);\n            function formatDate(date, format, culture) {\n                culture = getCulture(culture);\n                var calendar = culture.calendars.standard, days = calendar.days, months = calendar.months;\n                format = calendar.patterns[format] || format;\n                return format.replace(dateFormatRegExp, function (match) {\n                    var minutes;\n                    var result;\n                    var sign;\n                    if (match === 'd') {\n                        result = date.getDate();\n                    } else if (match === 'dd') {\n                        result = pad(date.getDate());\n                    } else if (match === 'ddd') {\n                        result = days.namesAbbr[date.getDay()];\n                    } else if (match === 'dddd') {\n                        result = days.names[date.getDay()];\n                    } else if (match === 'M') {\n                        result = date.getMonth() + 1;\n                    } else if (match === 'MM') {\n                        result = pad(date.getMonth() + 1);\n                    } else if (match === 'MMM') {\n                        result = months.namesAbbr[date.getMonth()];\n                    } else if (match === 'MMMM') {\n                        result = months.names[date.getMonth()];\n                    } else if (match === 'yy') {\n                        result = pad(date.getFullYear() % 100);\n                    } else if (match === 'yyyy') {\n                        result = pad(date.getFullYear(), 4);\n                    } else if (match === 'h') {\n                        result = date.getHours() % 12 || 12;\n                    } else if (match === 'hh') {\n                        result = pad(date.getHours() % 12 || 12);\n                    } else if (match === 'H') {\n                        result = date.getHours();\n                    } else if (match === 'HH') {\n                        result = pad(date.getHours());\n                    } else if (match === 'm') {\n                        result = date.getMinutes();\n                    } else if (match === 'mm') {\n                        result = pad(date.getMinutes());\n                    } else if (match === 's') {\n                        result = date.getSeconds();\n                    } else if (match === 'ss') {\n                        result = pad(date.getSeconds());\n                    } else if (match === 'f') {\n                        result = math.floor(date.getMilliseconds() / 100);\n                    } else if (match === 'ff') {\n                        result = date.getMilliseconds();\n                        if (result > 99) {\n                            result = math.floor(result / 10);\n                        }\n                        result = pad(result);\n                    } else if (match === 'fff') {\n                        result = pad(date.getMilliseconds(), 3);\n                    } else if (match === 'tt') {\n                        result = date.getHours() < 12 ? calendar.AM[0] : calendar.PM[0];\n                    } else if (match === 'zzz') {\n                        minutes = date.getTimezoneOffset();\n                        sign = minutes < 0;\n                        result = math.abs(minutes / 60).toString().split('.')[0];\n                        minutes = math.abs(minutes) - result * 60;\n                        result = (sign ? '+' : '-') + pad(result);\n                        result += ':' + pad(minutes);\n                    } else if (match === 'zz' || match === 'z') {\n                        result = date.getTimezoneOffset() / 60;\n                        sign = result < 0;\n                        result = math.abs(result).toString().split('.')[0];\n                        result = (sign ? '+' : '-') + (match === 'zz' ? pad(result) : result);\n                    }\n                    return result !== undefined ? result : match.slice(1, match.length - 1);\n                });\n            }\n            function formatNumber(number, format, culture) {\n                culture = getCulture(culture);\n                var numberFormat = culture.numberFormat, decimal = numberFormat[POINT], precision = numberFormat.decimals, pattern = numberFormat.pattern[0], literals = [], symbol, isCurrency, isPercent, customPrecision, formatAndPrecision, negative = number < 0, integer, fraction, integerLength, fractionLength, replacement = EMPTY, value = EMPTY, idx, length, ch, hasGroup, hasNegativeFormat, decimalIndex, sharpIndex, zeroIndex, hasZero, hasSharp, percentIndex, currencyIndex, startZeroIndex, start = -1, end;\n                if (number === undefined) {\n                    return EMPTY;\n                }\n                if (!isFinite(number)) {\n                    return number;\n                }\n                if (!format) {\n                    return culture.name.length ? number.toLocaleString() : number.toString();\n                }\n                formatAndPrecision = standardFormatRegExp.exec(format);\n                if (formatAndPrecision) {\n                    format = formatAndPrecision[1].toLowerCase();\n                    isCurrency = format === 'c';\n                    isPercent = format === 'p';\n                    if (isCurrency || isPercent) {\n                        numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n                        decimal = numberFormat[POINT];\n                        precision = numberFormat.decimals;\n                        symbol = numberFormat.symbol;\n                        pattern = numberFormat.pattern[negative ? 0 : 1];\n                    }\n                    customPrecision = formatAndPrecision[2];\n                    if (customPrecision) {\n                        precision = +customPrecision;\n                    }\n                    if (format === 'e') {\n                        var exp = customPrecision ? number.toExponential(precision) : number.toExponential();\n                        return exp.replace(POINT, numberFormat[POINT]);\n                    }\n                    if (isPercent) {\n                        number *= 100;\n                    }\n                    number = round(number, precision);\n                    negative = number < 0;\n                    number = number.split(POINT);\n                    integer = number[0];\n                    fraction = number[1];\n                    if (negative) {\n                        integer = integer.substring(1);\n                    }\n                    value = groupInteger(integer, 0, integer.length, numberFormat);\n                    if (fraction) {\n                        value += decimal + fraction;\n                    }\n                    if (format === 'n' && !negative) {\n                        return value;\n                    }\n                    number = EMPTY;\n                    for (idx = 0, length = pattern.length; idx < length; idx++) {\n                        ch = pattern.charAt(idx);\n                        if (ch === 'n') {\n                            number += value;\n                        } else if (ch === '$' || ch === '%') {\n                            number += symbol;\n                        } else {\n                            number += ch;\n                        }\n                    }\n                    return number;\n                }\n                if (format.indexOf('\\'') > -1 || format.indexOf('\"') > -1 || format.indexOf('\\\\') > -1) {\n                    format = format.replace(literalRegExp, function (match) {\n                        var quoteChar = match.charAt(0).replace('\\\\', ''), literal = match.slice(1).replace(quoteChar, '');\n                        literals.push(literal);\n                        return PLACEHOLDER;\n                    });\n                }\n                format = format.split(';');\n                if (negative && format[1]) {\n                    format = format[1];\n                    hasNegativeFormat = true;\n                } else if (number === 0 && format[2]) {\n                    format = format[2];\n                    if (format.indexOf(SHARP) == -1 && format.indexOf(ZERO) == -1) {\n                        return format;\n                    }\n                } else {\n                    format = format[0];\n                }\n                percentIndex = format.indexOf('%');\n                currencyIndex = format.indexOf('$');\n                isPercent = percentIndex != -1;\n                isCurrency = currencyIndex != -1;\n                if (isPercent) {\n                    number *= 100;\n                }\n                if (isCurrency && format[currencyIndex - 1] === '\\\\') {\n                    format = format.split('\\\\').join('');\n                    isCurrency = false;\n                }\n                if (isCurrency || isPercent) {\n                    numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n                    decimal = numberFormat[POINT];\n                    precision = numberFormat.decimals;\n                    symbol = numberFormat.symbol;\n                }\n                hasGroup = format.indexOf(COMMA) > -1;\n                if (hasGroup) {\n                    format = format.replace(commaRegExp, EMPTY);\n                }\n                decimalIndex = format.indexOf(POINT);\n                length = format.length;\n                if (decimalIndex != -1) {\n                    fraction = number.toString().split('e');\n                    if (fraction[1]) {\n                        fraction = round(number, Math.abs(fraction[1]));\n                    } else {\n                        fraction = fraction[0];\n                    }\n                    fraction = fraction.split(POINT)[1] || EMPTY;\n                    zeroIndex = format.lastIndexOf(ZERO) - decimalIndex;\n                    sharpIndex = format.lastIndexOf(SHARP) - decimalIndex;\n                    hasZero = zeroIndex > -1;\n                    hasSharp = sharpIndex > -1;\n                    idx = fraction.length;\n                    if (!hasZero && !hasSharp) {\n                        format = format.substring(0, decimalIndex) + format.substring(decimalIndex + 1);\n                        length = format.length;\n                        decimalIndex = -1;\n                        idx = 0;\n                    }\n                    if (hasZero && zeroIndex > sharpIndex) {\n                        idx = zeroIndex;\n                    } else if (sharpIndex > zeroIndex) {\n                        if (hasSharp && idx > sharpIndex) {\n                            var rounded = round(number, sharpIndex, negative);\n                            while (rounded.charAt(rounded.length - 1) === ZERO && sharpIndex > 0 && sharpIndex > zeroIndex) {\n                                sharpIndex--;\n                                rounded = round(number, sharpIndex, negative);\n                            }\n                            idx = sharpIndex;\n                        } else if (hasZero && idx < zeroIndex) {\n                            idx = zeroIndex;\n                        }\n                    }\n                }\n                number = round(number, idx, negative);\n                sharpIndex = format.indexOf(SHARP);\n                startZeroIndex = zeroIndex = format.indexOf(ZERO);\n                if (sharpIndex == -1 && zeroIndex != -1) {\n                    start = zeroIndex;\n                } else if (sharpIndex != -1 && zeroIndex == -1) {\n                    start = sharpIndex;\n                } else {\n                    start = sharpIndex > zeroIndex ? zeroIndex : sharpIndex;\n                }\n                sharpIndex = format.lastIndexOf(SHARP);\n                zeroIndex = format.lastIndexOf(ZERO);\n                if (sharpIndex == -1 && zeroIndex != -1) {\n                    end = zeroIndex;\n                } else if (sharpIndex != -1 && zeroIndex == -1) {\n                    end = sharpIndex;\n                } else {\n                    end = sharpIndex > zeroIndex ? sharpIndex : zeroIndex;\n                }\n                if (start == length) {\n                    end = start;\n                }\n                if (start != -1) {\n                    value = number.toString().split(POINT);\n                    integer = value[0];\n                    fraction = value[1] || EMPTY;\n                    integerLength = integer.length;\n                    fractionLength = fraction.length;\n                    if (negative && number * -1 >= 0) {\n                        negative = false;\n                    }\n                    number = format.substring(0, start);\n                    if (negative && !hasNegativeFormat) {\n                        number += '-';\n                    }\n                    for (idx = start; idx < length; idx++) {\n                        ch = format.charAt(idx);\n                        if (decimalIndex == -1) {\n                            if (end - idx < integerLength) {\n                                number += integer;\n                                break;\n                            }\n                        } else {\n                            if (zeroIndex != -1 && zeroIndex < idx) {\n                                replacement = EMPTY;\n                            }\n                            if (decimalIndex - idx <= integerLength && decimalIndex - idx > -1) {\n                                number += integer;\n                                idx = decimalIndex;\n                            }\n                            if (decimalIndex === idx) {\n                                number += (fraction ? decimal : EMPTY) + fraction;\n                                idx += end - decimalIndex + 1;\n                                continue;\n                            }\n                        }\n                        if (ch === ZERO) {\n                            number += ch;\n                            replacement = ch;\n                        } else if (ch === SHARP) {\n                            number += replacement;\n                        }\n                    }\n                    if (hasGroup) {\n                        number = groupInteger(number, start + (negative && !hasNegativeFormat ? 1 : 0), Math.max(end, integerLength + start), numberFormat);\n                    }\n                    if (end >= start) {\n                        number += format.substring(end + 1);\n                    }\n                    if (isCurrency || isPercent) {\n                        value = EMPTY;\n                        for (idx = 0, length = number.length; idx < length; idx++) {\n                            ch = number.charAt(idx);\n                            value += ch === '$' || ch === '%' ? symbol : ch;\n                        }\n                        number = value;\n                    }\n                    length = literals.length;\n                    if (length) {\n                        for (idx = 0; idx < length; idx++) {\n                            number = number.replace(PLACEHOLDER, literals[idx]);\n                        }\n                    }\n                }\n                return number;\n            }\n            var groupInteger = function (number, start, end, numberFormat) {\n                var decimalIndex = number.indexOf(numberFormat[POINT]);\n                var groupSizes = numberFormat.groupSize.slice();\n                var groupSize = groupSizes.shift();\n                var integer, integerLength;\n                var idx, parts, value;\n                var newGroupSize;\n                end = decimalIndex !== -1 ? decimalIndex : end + 1;\n                integer = number.substring(start, end);\n                integerLength = integer.length;\n                if (integerLength >= groupSize) {\n                    idx = integerLength;\n                    parts = [];\n                    while (idx > -1) {\n                        value = integer.substring(idx - groupSize, idx);\n                        if (value) {\n                            parts.push(value);\n                        }\n                        idx -= groupSize;\n                        newGroupSize = groupSizes.shift();\n                        groupSize = newGroupSize !== undefined ? newGroupSize : groupSize;\n                        if (groupSize === 0) {\n                            if (idx > 0) {\n                                parts.push(integer.substring(0, idx));\n                            }\n                            break;\n                        }\n                    }\n                    integer = parts.reverse().join(numberFormat[COMMA]);\n                    number = number.substring(0, start) + integer + number.substring(end);\n                }\n                return number;\n            };\n            var round = function (value, precision, negative) {\n                precision = precision || 0;\n                value = value.toString().split('e');\n                value = Math.round(+(value[0] + 'e' + (value[1] ? +value[1] + precision : precision)));\n                if (negative) {\n                    value = -value;\n                }\n                value = value.toString().split('e');\n                value = +(value[0] + 'e' + (value[1] ? +value[1] - precision : -precision));\n                return value.toFixed(Math.min(precision, 20));\n            };\n            var toString = function (value, fmt, culture) {\n                if (fmt) {\n                    if (objectToString.call(value) === '[object Date]') {\n                        return formatDate(value, fmt, culture);\n                    } else if (typeof value === NUMBER) {\n                        return formatNumber(value, fmt, culture);\n                    }\n                }\n                return value !== undefined ? value : '';\n            };\n            kendo.format = function (fmt) {\n                var values = arguments;\n                return fmt.replace(formatRegExp, function (match, index, placeholderFormat) {\n                    var value = values[parseInt(index, 10) + 1];\n                    return toString(value, placeholderFormat ? placeholderFormat.substring(1) : '');\n                });\n            };\n            kendo._extractFormat = function (format) {\n                if (format.slice(0, 3) === '{0:') {\n                    format = format.slice(3, format.length - 1);\n                }\n                return format;\n            };\n            kendo._activeElement = function () {\n                try {\n                    return document.activeElement;\n                } catch (e) {\n                    return document.documentElement.activeElement;\n                }\n            };\n            kendo._round = round;\n            kendo._outerWidth = function (element, includeMargin) {\n                return $(element).outerWidth(includeMargin || false) || 0;\n            };\n            kendo._outerHeight = function (element, includeMargin) {\n                return $(element).outerHeight(includeMargin || false) || 0;\n            };\n            kendo.toString = toString;\n        }());\n        (function () {\n            var nonBreakingSpaceRegExp = /\\u00A0/g, exponentRegExp = /[eE][\\-+]?[0-9]+/, shortTimeZoneRegExp = /[+|\\-]\\d{1,2}/, longTimeZoneRegExp = /[+|\\-]\\d{1,2}:?\\d{2}/, dateRegExp = /^\\/Date\\((.*?)\\)\\/$/, offsetRegExp = /[+-]\\d*/, FORMATS_SEQUENCE = [\n                    [],\n                    [\n                        'G',\n                        'g',\n                        'F'\n                    ],\n                    [\n                        'D',\n                        'd',\n                        'y',\n                        'm',\n                        'T',\n                        't'\n                    ]\n                ], STANDARD_FORMATS = [\n                    [\n                        'yyyy-MM-ddTHH:mm:ss.fffffffzzz',\n                        'yyyy-MM-ddTHH:mm:ss.fffffff',\n                        'yyyy-MM-ddTHH:mm:ss.fffzzz',\n                        'yyyy-MM-ddTHH:mm:ss.fff',\n                        'ddd MMM dd yyyy HH:mm:ss',\n                        'yyyy-MM-ddTHH:mm:sszzz',\n                        'yyyy-MM-ddTHH:mmzzz',\n                        'yyyy-MM-ddTHH:mmzz',\n                        'yyyy-MM-ddTHH:mm:ss',\n                        'yyyy-MM-dd HH:mm:ss',\n                        'yyyy/MM/dd HH:mm:ss'\n                    ],\n                    [\n                        'yyyy-MM-ddTHH:mm',\n                        'yyyy-MM-dd HH:mm',\n                        'yyyy/MM/dd HH:mm'\n                    ],\n                    [\n                        'yyyy/MM/dd',\n                        'yyyy-MM-dd',\n                        'HH:mm:ss',\n                        'HH:mm'\n                    ]\n                ], numberRegExp = {\n                    2: /^\\d{1,2}/,\n                    3: /^\\d{1,3}/,\n                    4: /^\\d{4}/\n                }, objectToString = {}.toString;\n            function outOfRange(value, start, end) {\n                return !(value >= start && value <= end);\n            }\n            function designatorPredicate(designator) {\n                return designator.charAt(0);\n            }\n            function mapDesignators(designators) {\n                return $.map(designators, designatorPredicate);\n            }\n            function adjustDST(date, hours) {\n                if (!hours && date.getHours() === 23) {\n                    date.setHours(date.getHours() + 2);\n                }\n            }\n            function lowerArray(data) {\n                var idx = 0, length = data.length, array = [];\n                for (; idx < length; idx++) {\n                    array[idx] = (data[idx] + '').toLowerCase();\n                }\n                return array;\n            }\n            function lowerLocalInfo(localInfo) {\n                var newLocalInfo = {}, property;\n                for (property in localInfo) {\n                    newLocalInfo[property] = lowerArray(localInfo[property]);\n                }\n                return newLocalInfo;\n            }\n            function parseExact(value, format, culture, strict) {\n                if (!value) {\n                    return null;\n                }\n                var lookAhead = function (match) {\n                        var i = 0;\n                        while (format[idx] === match) {\n                            i++;\n                            idx++;\n                        }\n                        if (i > 0) {\n                            idx -= 1;\n                        }\n                        return i;\n                    }, getNumber = function (size) {\n                        var rg = numberRegExp[size] || new RegExp('^\\\\d{1,' + size + '}'), match = value.substr(valueIdx, size).match(rg);\n                        if (match) {\n                            match = match[0];\n                            valueIdx += match.length;\n                            return parseInt(match, 10);\n                        }\n                        return null;\n                    }, getIndexByName = function (names, lower) {\n                        var i = 0, length = names.length, name, nameLength, matchLength = 0, matchIdx = 0, subValue;\n                        for (; i < length; i++) {\n                            name = names[i];\n                            nameLength = name.length;\n                            subValue = value.substr(valueIdx, nameLength);\n                            if (lower) {\n                                subValue = subValue.toLowerCase();\n                            }\n                            if (subValue == name && nameLength > matchLength) {\n                                matchLength = nameLength;\n                                matchIdx = i;\n                            }\n                        }\n                        if (matchLength) {\n                            valueIdx += matchLength;\n                            return matchIdx + 1;\n                        }\n                        return null;\n                    }, checkLiteral = function () {\n                        var result = false;\n                        if (value.charAt(valueIdx) === format[idx]) {\n                            valueIdx++;\n                            result = true;\n                        }\n                        return result;\n                    }, calendar = culture.calendars.standard, year = null, month = null, day = null, hours = null, minutes = null, seconds = null, milliseconds = null, idx = 0, valueIdx = 0, literal = false, date = new Date(), twoDigitYearMax = calendar.twoDigitYearMax || 2029, defaultYear = date.getFullYear(), ch, count, length, pattern, pmHour, UTC, matches, amDesignators, pmDesignators, hoursOffset, minutesOffset, hasTime, match;\n                if (!format) {\n                    format = 'd';\n                }\n                pattern = calendar.patterns[format];\n                if (pattern) {\n                    format = pattern;\n                }\n                format = format.split('');\n                length = format.length;\n                for (; idx < length; idx++) {\n                    ch = format[idx];\n                    if (literal) {\n                        if (ch === '\\'') {\n                            literal = false;\n                        } else {\n                            checkLiteral();\n                        }\n                    } else {\n                        if (ch === 'd') {\n                            count = lookAhead('d');\n                            if (!calendar._lowerDays) {\n                                calendar._lowerDays = lowerLocalInfo(calendar.days);\n                            }\n                            if (day !== null && count > 2) {\n                                continue;\n                            }\n                            day = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerDays[count == 3 ? 'namesAbbr' : 'names'], true);\n                            if (day === null || outOfRange(day, 1, 31)) {\n                                return null;\n                            }\n                        } else if (ch === 'M') {\n                            count = lookAhead('M');\n                            if (!calendar._lowerMonths) {\n                                calendar._lowerMonths = lowerLocalInfo(calendar.months);\n                            }\n                            month = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerMonths[count == 3 ? 'namesAbbr' : 'names'], true);\n                            if (month === null || outOfRange(month, 1, 12)) {\n                                return null;\n                            }\n                            month -= 1;\n                        } else if (ch === 'y') {\n                            count = lookAhead('y');\n                            year = getNumber(count);\n                            if (year === null) {\n                                return null;\n                            }\n                            if (count == 2) {\n                                if (typeof twoDigitYearMax === 'string') {\n                                    twoDigitYearMax = defaultYear + parseInt(twoDigitYearMax, 10);\n                                }\n                                year = defaultYear - defaultYear % 100 + year;\n                                if (year > twoDigitYearMax) {\n                                    year -= 100;\n                                }\n                            }\n                        } else if (ch === 'h') {\n                            lookAhead('h');\n                            hours = getNumber(2);\n                            if (hours == 12) {\n                                hours = 0;\n                            }\n                            if (hours === null || outOfRange(hours, 0, 11)) {\n                                return null;\n                            }\n                        } else if (ch === 'H') {\n                            lookAhead('H');\n                            hours = getNumber(2);\n                            if (hours === null || outOfRange(hours, 0, 23)) {\n                                return null;\n                            }\n                        } else if (ch === 'm') {\n                            lookAhead('m');\n                            minutes = getNumber(2);\n                            if (minutes === null || outOfRange(minutes, 0, 59)) {\n                                return null;\n                            }\n                        } else if (ch === 's') {\n                            lookAhead('s');\n                            seconds = getNumber(2);\n                            if (seconds === null || outOfRange(seconds, 0, 59)) {\n                                return null;\n                            }\n                        } else if (ch === 'f') {\n                            count = lookAhead('f');\n                            match = value.substr(valueIdx, count).match(numberRegExp[3]);\n                            milliseconds = getNumber(count);\n                            if (milliseconds !== null) {\n                                milliseconds = parseFloat('0.' + match[0], 10);\n                                milliseconds = kendo._round(milliseconds, 3);\n                                milliseconds *= 1000;\n                            }\n                            if (milliseconds === null || outOfRange(milliseconds, 0, 999)) {\n                                return null;\n                            }\n                        } else if (ch === 't') {\n                            count = lookAhead('t');\n                            amDesignators = calendar.AM;\n                            pmDesignators = calendar.PM;\n                            if (count === 1) {\n                                amDesignators = mapDesignators(amDesignators);\n                                pmDesignators = mapDesignators(pmDesignators);\n                            }\n                            pmHour = getIndexByName(pmDesignators);\n                            if (!pmHour && !getIndexByName(amDesignators)) {\n                                return null;\n                            }\n                        } else if (ch === 'z') {\n                            UTC = true;\n                            count = lookAhead('z');\n                            if (value.substr(valueIdx, 1) === 'Z') {\n                                checkLiteral();\n                                continue;\n                            }\n                            matches = value.substr(valueIdx, 6).match(count > 2 ? longTimeZoneRegExp : shortTimeZoneRegExp);\n                            if (!matches) {\n                                return null;\n                            }\n                            matches = matches[0].split(':');\n                            hoursOffset = matches[0];\n                            minutesOffset = matches[1];\n                            if (!minutesOffset && hoursOffset.length > 3) {\n                                valueIdx = hoursOffset.length - 2;\n                                minutesOffset = hoursOffset.substring(valueIdx);\n                                hoursOffset = hoursOffset.substring(0, valueIdx);\n                            }\n                            hoursOffset = parseInt(hoursOffset, 10);\n                            if (outOfRange(hoursOffset, -12, 13)) {\n                                return null;\n                            }\n                            if (count > 2) {\n                                minutesOffset = matches[0][0] + minutesOffset;\n                                minutesOffset = parseInt(minutesOffset, 10);\n                                if (isNaN(minutesOffset) || outOfRange(minutesOffset, -59, 59)) {\n                                    return null;\n                                }\n                            }\n                        } else if (ch === '\\'') {\n                            literal = true;\n                            checkLiteral();\n                        } else if (!checkLiteral()) {\n                            return null;\n                        }\n                    }\n                }\n                if (strict && !/^\\s*$/.test(value.substr(valueIdx))) {\n                    return null;\n                }\n                hasTime = hours !== null || minutes !== null || seconds || null;\n                if (year === null && month === null && day === null && hasTime) {\n                    year = defaultYear;\n                    month = date.getMonth();\n                    day = date.getDate();\n                } else {\n                    if (year === null) {\n                        year = defaultYear;\n                    }\n                    if (day === null) {\n                        day = 1;\n                    }\n                }\n                if (pmHour && hours < 12) {\n                    hours += 12;\n                }\n                if (UTC) {\n                    if (hoursOffset) {\n                        hours += -hoursOffset;\n                    }\n                    if (minutesOffset) {\n                        minutes += -minutesOffset;\n                    }\n                    value = new Date(Date.UTC(year, month, day, hours, minutes, seconds, milliseconds));\n                } else {\n                    value = new Date(year, month, day, hours, minutes, seconds, milliseconds);\n                    adjustDST(value, hours);\n                }\n                if (year < 100) {\n                    value.setFullYear(year);\n                }\n                if (value.getDate() !== day && UTC === undefined) {\n                    return null;\n                }\n                return value;\n            }\n            function parseMicrosoftFormatOffset(offset) {\n                var sign = offset.substr(0, 1) === '-' ? -1 : 1;\n                offset = offset.substring(1);\n                offset = parseInt(offset.substr(0, 2), 10) * 60 + parseInt(offset.substring(2), 10);\n                return sign * offset;\n            }\n            function getDefaultFormats(culture) {\n                var length = math.max(FORMATS_SEQUENCE.length, STANDARD_FORMATS.length);\n                var calendar = culture.calendar || culture.calendars.standard;\n                var patterns = calendar.patterns;\n                var cultureFormats, formatIdx, idx;\n                var formats = [];\n                for (idx = 0; idx < length; idx++) {\n                    cultureFormats = FORMATS_SEQUENCE[idx];\n                    for (formatIdx = 0; formatIdx < cultureFormats.length; formatIdx++) {\n                        formats.push(patterns[cultureFormats[formatIdx]]);\n                    }\n                    formats = formats.concat(STANDARD_FORMATS[idx]);\n                }\n                return formats;\n            }\n            function internalParseDate(value, formats, culture, strict) {\n                if (objectToString.call(value) === '[object Date]') {\n                    return value;\n                }\n                var idx = 0;\n                var date = null;\n                var length;\n                var tzoffset;\n                if (value && value.indexOf('/D') === 0) {\n                    date = dateRegExp.exec(value);\n                    if (date) {\n                        date = date[1];\n                        tzoffset = offsetRegExp.exec(date.substring(1));\n                        date = new Date(parseInt(date, 10));\n                        if (tzoffset) {\n                            tzoffset = parseMicrosoftFormatOffset(tzoffset[0]);\n                            date = kendo.timezone.apply(date, 0);\n                            date = kendo.timezone.convert(date, 0, -1 * tzoffset);\n                        }\n                        return date;\n                    }\n                }\n                culture = kendo.getCulture(culture);\n                if (!formats) {\n                    formats = getDefaultFormats(culture);\n                }\n                formats = isArray(formats) ? formats : [formats];\n                length = formats.length;\n                for (; idx < length; idx++) {\n                    date = parseExact(value, formats[idx], culture, strict);\n                    if (date) {\n                        return date;\n                    }\n                }\n                return date;\n            }\n            kendo.parseDate = function (value, formats, culture) {\n                return internalParseDate(value, formats, culture, false);\n            };\n            kendo.parseExactDate = function (value, formats, culture) {\n                return internalParseDate(value, formats, culture, true);\n            };\n            kendo.parseInt = function (value, culture) {\n                var result = kendo.parseFloat(value, culture);\n                if (result) {\n                    result = result | 0;\n                }\n                return result;\n            };\n            kendo.parseFloat = function (value, culture, format) {\n                if (!value && value !== 0) {\n                    return null;\n                }\n                if (typeof value === NUMBER) {\n                    return value;\n                }\n                value = value.toString();\n                culture = kendo.getCulture(culture);\n                var number = culture.numberFormat, percent = number.percent, currency = number.currency, symbol = currency.symbol, percentSymbol = percent.symbol, negative = value.indexOf('-'), parts, isPercent;\n                if (exponentRegExp.test(value)) {\n                    value = parseFloat(value.replace(number['.'], '.'));\n                    if (isNaN(value)) {\n                        value = null;\n                    }\n                    return value;\n                }\n                if (negative > 0) {\n                    return null;\n                } else {\n                    negative = negative > -1;\n                }\n                if (value.indexOf(symbol) > -1 || format && format.toLowerCase().indexOf('c') > -1) {\n                    number = currency;\n                    parts = number.pattern[0].replace('$', symbol).split('n');\n                    if (value.indexOf(parts[0]) > -1 && value.indexOf(parts[1]) > -1) {\n                        value = value.replace(parts[0], '').replace(parts[1], '');\n                        negative = true;\n                    }\n                } else if (value.indexOf(percentSymbol) > -1) {\n                    isPercent = true;\n                    number = percent;\n                    symbol = percentSymbol;\n                }\n                value = value.replace('-', '').replace(symbol, '').replace(nonBreakingSpaceRegExp, ' ').split(number[','].replace(nonBreakingSpaceRegExp, ' ')).join('').replace(number['.'], '.');\n                value = parseFloat(value);\n                if (isNaN(value)) {\n                    value = null;\n                } else if (negative) {\n                    value *= -1;\n                }\n                if (value && isPercent) {\n                    value /= 100;\n                }\n                return value;\n            };\n        }());\n        function getShadows(element) {\n            var shadow = element.css(kendo.support.transitions.css + 'box-shadow') || element.css('box-shadow'), radius = shadow ? shadow.match(boxShadowRegExp) || [\n                    0,\n                    0,\n                    0,\n                    0,\n                    0\n                ] : [\n                    0,\n                    0,\n                    0,\n                    0,\n                    0\n                ], blur = math.max(+radius[3], +(radius[4] || 0));\n            return {\n                left: -radius[1] + blur,\n                right: +radius[1] + blur,\n                bottom: +radius[2] + blur\n            };\n        }\n        function wrap(element, autosize) {\n            var browser = support.browser, percentage, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, parent = element.parent(), windowOuterWidth = outerWidth(window);\n            parent.removeClass('k-animation-container-sm');\n            if (!parent.hasClass('k-animation-container')) {\n                var width = element[0].style.width, height = element[0].style.height, percentWidth = percentRegExp.test(width), percentHeight = percentRegExp.test(height), forceWidth = element.hasClass('k-tooltip') || element.is('.k-menu-horizontal.k-context-menu');\n                percentage = percentWidth || percentHeight;\n                if (!percentWidth && (!autosize || autosize && width || forceWidth)) {\n                    width = autosize ? outerWidth(element) + 1 : outerWidth(element);\n                }\n                if (!percentHeight && (!autosize || autosize && height) || element.is('.k-menu-horizontal.k-context-menu')) {\n                    height = outerHeight(element);\n                }\n                element.wrap($('<div/>').addClass('k-animation-container').css({\n                    width: width,\n                    height: height\n                }));\n                parent = element.parent();\n                if (percentage) {\n                    element.css({\n                        width: '100%',\n                        height: '100%',\n                        boxSizing: 'border-box',\n                        mozBoxSizing: 'border-box',\n                        webkitBoxSizing: 'border-box'\n                    });\n                }\n            } else {\n                wrapResize(element, autosize);\n            }\n            if (windowOuterWidth < outerWidth(parent)) {\n                parent.addClass('k-animation-container-sm');\n                wrapResize(element, autosize);\n            }\n            if (browser.msie && math.floor(browser.version) <= 7) {\n                element.css({ zoom: 1 });\n                element.children('.k-menu').width(element.width());\n            }\n            return parent;\n        }\n        function wrapResize(element, autosize) {\n            var percentage, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, wrapper = element.parent('.k-animation-container'), wrapperStyle = wrapper[0].style;\n            if (wrapper.is(':hidden')) {\n                wrapper.css({\n                    display: '',\n                    position: ''\n                });\n            }\n            percentage = percentRegExp.test(wrapperStyle.width) || percentRegExp.test(wrapperStyle.height);\n            if (!percentage) {\n                wrapper.css({\n                    width: autosize ? outerWidth(element) + 1 : outerWidth(element),\n                    height: outerHeight(element),\n                    boxSizing: 'content-box',\n                    mozBoxSizing: 'content-box',\n                    webkitBoxSizing: 'content-box'\n                });\n            }\n        }\n        function deepExtend(destination) {\n            var i = 1, length = arguments.length;\n            for (i = 1; i < length; i++) {\n                deepExtendOne(destination, arguments[i]);\n            }\n            return destination;\n        }\n        function deepExtendOne(destination, source) {\n            var ObservableArray = kendo.data.ObservableArray, LazyObservableArray = kendo.data.LazyObservableArray, DataSource = kendo.data.DataSource, HierarchicalDataSource = kendo.data.HierarchicalDataSource, property, propValue, propType, propInit, destProp;\n            for (property in source) {\n                propValue = source[property];\n                propType = typeof propValue;\n                if (propType === OBJECT && propValue !== null) {\n                    propInit = propValue.constructor;\n                } else {\n                    propInit = null;\n                }\n                if (propInit && propInit !== Array && propInit !== ObservableArray && propInit !== LazyObservableArray && propInit !== DataSource && propInit !== HierarchicalDataSource && propInit !== RegExp && (!kendo.isFunction(window.ArrayBuffer) || propInit !== ArrayBuffer)) {\n                    if (propValue instanceof Date) {\n                        destination[property] = new Date(propValue.getTime());\n                    } else if (isFunction(propValue.clone)) {\n                        destination[property] = propValue.clone();\n                    } else {\n                        destProp = destination[property];\n                        if (typeof destProp === OBJECT) {\n                            destination[property] = destProp || {};\n                        } else {\n                            destination[property] = {};\n                        }\n                        deepExtendOne(destination[property], propValue);\n                    }\n                } else if (propType !== UNDEFINED) {\n                    destination[property] = propValue;\n                }\n            }\n            return destination;\n        }\n        function testRx(agent, rxs, dflt) {\n            for (var rx in rxs) {\n                if (rxs.hasOwnProperty(rx) && rxs[rx].test(agent)) {\n                    return rx;\n                }\n            }\n            return dflt !== undefined ? dflt : agent;\n        }\n        function toHyphens(str) {\n            return str.replace(/([a-z][A-Z])/g, function (g) {\n                return g.charAt(0) + '-' + g.charAt(1).toLowerCase();\n            });\n        }\n        function toCamelCase(str) {\n            return str.replace(/\\-(\\w)/g, function (strMatch, g1) {\n                return g1.toUpperCase();\n            });\n        }\n        function getComputedStyles(element, properties) {\n            var styles = {}, computedStyle;\n            if (document.defaultView && document.defaultView.getComputedStyle) {\n                computedStyle = document.defaultView.getComputedStyle(element, '');\n                if (properties) {\n                    $.each(properties, function (idx, value) {\n                        styles[value] = computedStyle.getPropertyValue(value);\n                    });\n                }\n            } else {\n                computedStyle = element.currentStyle;\n                if (properties) {\n                    $.each(properties, function (idx, value) {\n                        styles[value] = computedStyle[toCamelCase(value)];\n                    });\n                }\n            }\n            if (!kendo.size(styles)) {\n                styles = computedStyle;\n            }\n            return styles;\n        }\n        function isScrollable(element) {\n            if (element && element.className && typeof element.className === 'string' && element.className.indexOf('k-auto-scrollable') > -1) {\n                return true;\n            }\n            var overflow = getComputedStyles(element, ['overflow']).overflow;\n            return overflow == 'auto' || overflow == 'scroll';\n        }\n        function scrollLeft(element, value) {\n            var webkit = support.browser.webkit;\n            var mozila = support.browser.mozilla;\n            var el = element instanceof $ ? element[0] : element;\n            var isRtl;\n            if (!element) {\n                return;\n            }\n            isRtl = support.isRtl(element);\n            if (value !== undefined) {\n                if (isRtl && webkit) {\n                    el.scrollLeft = el.scrollWidth - el.clientWidth - value;\n                } else if (isRtl && mozila) {\n                    el.scrollLeft = -value;\n                } else {\n                    el.scrollLeft = value;\n                }\n            } else {\n                if (isRtl && webkit) {\n                    return el.scrollWidth - el.clientWidth - el.scrollLeft;\n                } else {\n                    return Math.abs(el.scrollLeft);\n                }\n            }\n        }\n        (function () {\n            support._scrollbar = undefined;\n            support.scrollbar = function (refresh) {\n                if (!isNaN(support._scrollbar) && !refresh) {\n                    return support._scrollbar;\n                } else {\n                    var div = document.createElement('div'), result;\n                    div.style.cssText = 'overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block';\n                    div.innerHTML = '&nbsp;';\n                    document.body.appendChild(div);\n                    support._scrollbar = result = div.offsetWidth - div.scrollWidth;\n                    document.body.removeChild(div);\n                    return result;\n                }\n            };\n            support.isRtl = function (element) {\n                return $(element).closest('.k-rtl').length > 0;\n            };\n            var table = document.createElement('table');\n            try {\n                table.innerHTML = '<tr><td></td></tr>';\n                support.tbodyInnerHtml = true;\n            } catch (e) {\n                support.tbodyInnerHtml = false;\n            }\n            support.touch = 'ontouchstart' in window;\n            var docStyle = document.documentElement.style;\n            var transitions = support.transitions = false, transforms = support.transforms = false, elementProto = 'HTMLElement' in window ? HTMLElement.prototype : [];\n            support.hasHW3D = 'WebKitCSSMatrix' in window && 'm11' in new window.WebKitCSSMatrix() || 'MozPerspective' in docStyle || 'msPerspective' in docStyle;\n            support.cssFlexbox = 'flexWrap' in docStyle || 'WebkitFlexWrap' in docStyle || 'msFlexWrap' in docStyle;\n            each([\n                'Moz',\n                'webkit',\n                'O',\n                'ms'\n            ], function () {\n                var prefix = this.toString(), hasTransitions = typeof table.style[prefix + 'Transition'] === STRING;\n                if (hasTransitions || typeof table.style[prefix + 'Transform'] === STRING) {\n                    var lowPrefix = prefix.toLowerCase();\n                    transforms = {\n                        css: lowPrefix != 'ms' ? '-' + lowPrefix + '-' : '',\n                        prefix: prefix,\n                        event: lowPrefix === 'o' || lowPrefix === 'webkit' ? lowPrefix : ''\n                    };\n                    if (hasTransitions) {\n                        transitions = transforms;\n                        transitions.event = transitions.event ? transitions.event + 'TransitionEnd' : 'transitionend';\n                    }\n                    return false;\n                }\n            });\n            table = null;\n            support.transforms = transforms;\n            support.transitions = transitions;\n            support.devicePixelRatio = window.devicePixelRatio === undefined ? 1 : window.devicePixelRatio;\n            try {\n                support.screenWidth = window.outerWidth || window.screen ? window.screen.availWidth : window.innerWidth;\n                support.screenHeight = window.outerHeight || window.screen ? window.screen.availHeight : window.innerHeight;\n            } catch (e) {\n                support.screenWidth = window.screen.availWidth;\n                support.screenHeight = window.screen.availHeight;\n            }\n            support.detectOS = function (ua) {\n                var os = false, minorVersion, match = [], notAndroidPhone = !/mobile safari/i.test(ua), agentRxs = {\n                        wp: /(Windows Phone(?: OS)?)\\s(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        fire: /(Silk)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        android: /(Android|Android.*(?:Opera|Firefox).*?\\/)\\s*(\\d+)\\.?(\\d+(\\.\\d+)?)?/,\n                        iphone: /(iPhone|iPod).*OS\\s+(\\d+)[\\._]([\\d\\._]+)/,\n                        ipad: /(iPad).*OS\\s+(\\d+)[\\._]([\\d_]+)/,\n                        meego: /(MeeGo).+NokiaBrowser\\/(\\d+)\\.([\\d\\._]+)/,\n                        webos: /(webOS)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        blackberry: /(BlackBerry|BB10).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        playbook: /(PlayBook).*?Tablet\\s*OS\\s*(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        windows: /(MSIE)\\s+(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        tizen: /(tizen).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/i,\n                        sailfish: /(sailfish).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*firefox/i,\n                        ffos: /(Mobile).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*Firefox/\n                    }, osRxs = {\n                        ios: /^i(phone|pad|pod)$/i,\n                        android: /^android|fire$/i,\n                        blackberry: /^blackberry|playbook/i,\n                        windows: /windows/,\n                        wp: /wp/,\n                        flat: /sailfish|ffos|tizen/i,\n                        meego: /meego/\n                    }, formFactorRxs = { tablet: /playbook|ipad|fire/i }, browserRxs = {\n                        omini: /Opera\\sMini/i,\n                        omobile: /Opera\\sMobi/i,\n                        firefox: /Firefox|Fennec/i,\n                        mobilesafari: /version\\/.*safari/i,\n                        ie: /MSIE|Windows\\sPhone/i,\n                        chrome: /chrome|crios/i,\n                        webkit: /webkit/i\n                    };\n                for (var agent in agentRxs) {\n                    if (agentRxs.hasOwnProperty(agent)) {\n                        match = ua.match(agentRxs[agent]);\n                        if (match) {\n                            if (agent == 'windows' && 'plugins' in navigator) {\n                                return false;\n                            }\n                            os = {};\n                            os.device = agent;\n                            os.tablet = testRx(agent, formFactorRxs, false);\n                            os.browser = testRx(ua, browserRxs, 'default');\n                            os.name = testRx(agent, osRxs);\n                            os[os.name] = true;\n                            os.majorVersion = match[2];\n                            os.minorVersion = (match[3] || '0').replace('_', '.');\n                            minorVersion = os.minorVersion.replace('.', '').substr(0, 2);\n                            os.flatVersion = os.majorVersion + minorVersion + new Array(3 - (minorVersion.length < 3 ? minorVersion.length : 2)).join('0');\n                            os.cordova = typeof window.PhoneGap !== UNDEFINED || typeof window.cordova !== UNDEFINED;\n                            os.appMode = window.navigator.standalone || /file|local|wmapp/.test(window.location.protocol) || os.cordova;\n                            if (os.android && (support.devicePixelRatio < 1.5 && os.flatVersion < 400 || notAndroidPhone) && (support.screenWidth > 800 || support.screenHeight > 800)) {\n                                os.tablet = agent;\n                            }\n                            break;\n                        }\n                    }\n                }\n                return os;\n            };\n            var mobileOS = support.mobileOS = support.detectOS(navigator.userAgent);\n            support.wpDevicePixelRatio = mobileOS.wp ? screen.width / 320 : 0;\n            support.hasNativeScrolling = false;\n            if (mobileOS.ios || mobileOS.android && mobileOS.majorVersion > 2 || mobileOS.wp) {\n                support.hasNativeScrolling = mobileOS;\n            }\n            support.delayedClick = function () {\n                if (support.touch) {\n                    if (mobileOS.ios) {\n                        return true;\n                    }\n                    if (mobileOS.android) {\n                        if (!support.browser.chrome) {\n                            return true;\n                        }\n                        if (support.browser.version < 32) {\n                            return false;\n                        }\n                        return !($('meta[name=viewport]').attr('content') || '').match(/user-scalable=no/i);\n                    }\n                }\n                return false;\n            };\n            support.mouseAndTouchPresent = support.touch && !(support.mobileOS.ios || support.mobileOS.android);\n            support.detectBrowser = function (ua) {\n                var browser = false, match = [], browserRxs = {\n                        edge: /(edge)[ \\/]([\\w.]+)/i,\n                        webkit: /(chrome|crios)[ \\/]([\\w.]+)/i,\n                        safari: /(webkit)[ \\/]([\\w.]+)/i,\n                        opera: /(opera)(?:.*version|)[ \\/]([\\w.]+)/i,\n                        msie: /(msie\\s|trident.*? rv:)([\\w.]+)/i,\n                        mozilla: /(mozilla)(?:.*? rv:([\\w.]+)|)/i\n                    };\n                for (var agent in browserRxs) {\n                    if (browserRxs.hasOwnProperty(agent)) {\n                        match = ua.match(browserRxs[agent]);\n                        if (match) {\n                            browser = {};\n                            browser[agent] = true;\n                            browser[match[1].toLowerCase().split(' ')[0].split('/')[0]] = true;\n                            browser.version = parseInt(document.documentMode || match[2], 10);\n                            break;\n                        }\n                    }\n                }\n                return browser;\n            };\n            support.browser = support.detectBrowser(navigator.userAgent);\n            support.detectClipboardAccess = function () {\n                var commands = {\n                    copy: document.queryCommandSupported ? document.queryCommandSupported('copy') : false,\n                    cut: document.queryCommandSupported ? document.queryCommandSupported('cut') : false,\n                    paste: document.queryCommandSupported ? document.queryCommandSupported('paste') : false\n                };\n                if (support.browser.chrome) {\n                    commands.paste = false;\n                    if (support.browser.version >= 43) {\n                        commands.copy = true;\n                        commands.cut = true;\n                    }\n                }\n                return commands;\n            };\n            support.clipboard = support.detectClipboardAccess();\n            support.zoomLevel = function () {\n                try {\n                    var browser = support.browser;\n                    var ie11WidthCorrection = 0;\n                    var docEl = document.documentElement;\n                    if (browser.msie && browser.version == 11 && docEl.scrollHeight > docEl.clientHeight && !support.touch) {\n                        ie11WidthCorrection = support.scrollbar();\n                    }\n                    return support.touch ? docEl.clientWidth / window.innerWidth : browser.msie && browser.version >= 10 ? ((top || window).document.documentElement.offsetWidth + ie11WidthCorrection) / (top || window).innerWidth : 1;\n                } catch (e) {\n                    return 1;\n                }\n            };\n            support.cssBorderSpacing = typeof docStyle.borderSpacing != 'undefined' && !(support.browser.msie && support.browser.version < 8);\n            (function (browser) {\n                var cssClass = '', docElement = $(document.documentElement), majorVersion = parseInt(browser.version, 10);\n                if (browser.msie) {\n                    cssClass = 'ie';\n                } else if (browser.mozilla) {\n                    cssClass = 'ff';\n                } else if (browser.safari) {\n                    cssClass = 'safari';\n                } else if (browser.webkit) {\n                    cssClass = 'webkit';\n                } else if (browser.opera) {\n                    cssClass = 'opera';\n                } else if (browser.edge) {\n                    cssClass = 'edge';\n                }\n                if (cssClass) {\n                    cssClass = 'k-' + cssClass + ' k-' + cssClass + majorVersion;\n                }\n                if (support.mobileOS) {\n                    cssClass += ' k-mobile';\n                }\n                if (!support.cssFlexbox) {\n                    cssClass += ' k-no-flexbox';\n                }\n                docElement.addClass(cssClass);\n            }(support.browser));\n            support.eventCapture = document.documentElement.addEventListener;\n            var input = document.createElement('input');\n            support.placeholder = 'placeholder' in input;\n            support.propertyChangeEvent = 'onpropertychange' in input;\n            support.input = function () {\n                var types = [\n                    'number',\n                    'date',\n                    'time',\n                    'month',\n                    'week',\n                    'datetime',\n                    'datetime-local'\n                ];\n                var length = types.length;\n                var value = 'test';\n                var result = {};\n                var idx = 0;\n                var type;\n                for (; idx < length; idx++) {\n                    type = types[idx];\n                    input.setAttribute('type', type);\n                    input.value = value;\n                    result[type.replace('-', '')] = input.type !== 'text' && input.value !== value;\n                }\n                return result;\n            }();\n            input.style.cssText = 'float:left;';\n            support.cssFloat = !!input.style.cssFloat;\n            input = null;\n            support.stableSort = function () {\n                var threshold = 513;\n                var sorted = [{\n                        index: 0,\n                        field: 'b'\n                    }];\n                for (var i = 1; i < threshold; i++) {\n                    sorted.push({\n                        index: i,\n                        field: 'a'\n                    });\n                }\n                sorted.sort(function (a, b) {\n                    return a.field > b.field ? 1 : a.field < b.field ? -1 : 0;\n                });\n                return sorted[0].index === 1;\n            }();\n            support.matchesSelector = elementProto.webkitMatchesSelector || elementProto.mozMatchesSelector || elementProto.msMatchesSelector || elementProto.oMatchesSelector || elementProto.matchesSelector || elementProto.matches || function (selector) {\n                var nodeList = document.querySelectorAll ? (this.parentNode || document).querySelectorAll(selector) || [] : $(selector), i = nodeList.length;\n                while (i--) {\n                    if (nodeList[i] == this) {\n                        return true;\n                    }\n                }\n                return false;\n            };\n            support.matchMedia = 'matchMedia' in window;\n            support.pushState = window.history && window.history.pushState;\n            var documentMode = document.documentMode;\n            support.hashChange = 'onhashchange' in window && !(support.browser.msie && (!documentMode || documentMode <= 8));\n            support.customElements = 'registerElement' in window.document;\n            var chrome = support.browser.chrome, mobileChrome = support.browser.crios, mozilla = support.browser.mozilla, safari = support.browser.safari;\n            support.msPointers = !chrome && window.MSPointerEvent;\n            support.pointers = !chrome && !mobileChrome && !mozilla && !safari && window.PointerEvent;\n            support.kineticScrollNeeded = mobileOS && (support.touch || support.msPointers || support.pointers);\n        }());\n        function size(obj) {\n            var result = 0, key;\n            for (key in obj) {\n                if (obj.hasOwnProperty(key) && key != 'toJSON') {\n                    result++;\n                }\n            }\n            return result;\n        }\n        function getOffset(element, type, positioned) {\n            if (!type) {\n                type = 'offset';\n            }\n            var offset = element[type]();\n            var result = {\n                top: offset.top,\n                right: offset.right,\n                bottom: offset.bottom,\n                left: offset.left\n            };\n            if (support.browser.msie && (support.pointers || support.msPointers) && !positioned) {\n                var sign = support.isRtl(element) ? 1 : -1;\n                result.top -= window.pageYOffset - document.documentElement.scrollTop;\n                result.left -= window.pageXOffset + sign * document.documentElement.scrollLeft;\n            }\n            return result;\n        }\n        var directions = {\n            left: { reverse: 'right' },\n            right: { reverse: 'left' },\n            down: { reverse: 'up' },\n            up: { reverse: 'down' },\n            top: { reverse: 'bottom' },\n            bottom: { reverse: 'top' },\n            'in': { reverse: 'out' },\n            out: { reverse: 'in' }\n        };\n        function parseEffects(input) {\n            var effects = {};\n            each(typeof input === 'string' ? input.split(' ') : input, function (idx) {\n                effects[idx] = this;\n            });\n            return effects;\n        }\n        function fx(element) {\n            return new kendo.effects.Element(element);\n        }\n        var effects = {};\n        $.extend(effects, {\n            enabled: true,\n            Element: function (element) {\n                this.element = $(element);\n            },\n            promise: function (element, options) {\n                if (!element.is(':visible')) {\n                    element.css({ display: element.data('olddisplay') || 'block' }).css('display');\n                }\n                if (options.hide) {\n                    element.data('olddisplay', element.css('display')).hide();\n                }\n                if (options.init) {\n                    options.init();\n                }\n                if (options.completeCallback) {\n                    options.completeCallback(element);\n                }\n                element.dequeue();\n            },\n            disable: function () {\n                this.enabled = false;\n                this.promise = this.promiseShim;\n            },\n            enable: function () {\n                this.enabled = true;\n                this.promise = this.animatedPromise;\n            }\n        });\n        effects.promiseShim = effects.promise;\n        function prepareAnimationOptions(options, duration, reverse, complete) {\n            if (typeof options === STRING) {\n                if (isFunction(duration)) {\n                    complete = duration;\n                    duration = 400;\n                    reverse = false;\n                }\n                if (isFunction(reverse)) {\n                    complete = reverse;\n                    reverse = false;\n                }\n                if (typeof duration === BOOLEAN) {\n                    reverse = duration;\n                    duration = 400;\n                }\n                options = {\n                    effects: options,\n                    duration: duration,\n                    reverse: reverse,\n                    complete: complete\n                };\n            }\n            return extend({\n                effects: {},\n                duration: 400,\n                reverse: false,\n                init: noop,\n                teardown: noop,\n                hide: false\n            }, options, {\n                completeCallback: options.complete,\n                complete: noop\n            });\n        }\n        function animate(element, options, duration, reverse, complete) {\n            var idx = 0, length = element.length, instance;\n            for (; idx < length; idx++) {\n                instance = $(element[idx]);\n                instance.queue(function () {\n                    effects.promise(instance, prepareAnimationOptions(options, duration, reverse, complete));\n                });\n            }\n            return element;\n        }\n        function toggleClass(element, classes, options, add) {\n            if (classes) {\n                classes = classes.split(' ');\n                each(classes, function (idx, value) {\n                    element.toggleClass(value, add);\n                });\n            }\n            return element;\n        }\n        if (!('kendoAnimate' in $.fn)) {\n            extend($.fn, {\n                kendoStop: function (clearQueue, gotoEnd) {\n                    return this.stop(clearQueue, gotoEnd);\n                },\n                kendoAnimate: function (options, duration, reverse, complete) {\n                    return animate(this, options, duration, reverse, complete);\n                },\n                kendoAddClass: function (classes, options) {\n                    return kendo.toggleClass(this, classes, options, true);\n                },\n                kendoRemoveClass: function (classes, options) {\n                    return kendo.toggleClass(this, classes, options, false);\n                },\n                kendoToggleClass: function (classes, options, toggle) {\n                    return kendo.toggleClass(this, classes, options, toggle);\n                }\n            });\n        }\n        var ampRegExp = /&/g, ltRegExp = /</g, quoteRegExp = /\"/g, aposRegExp = /'/g, gtRegExp = />/g;\n        function htmlEncode(value) {\n            return ('' + value).replace(ampRegExp, '&amp;').replace(ltRegExp, '&lt;').replace(gtRegExp, '&gt;').replace(quoteRegExp, '&quot;').replace(aposRegExp, '&#39;');\n        }\n        function unescape(value) {\n            var template;\n            try {\n                template = window.decodeURIComponent(value);\n            } catch (error) {\n                template = value.replace(/%u([\\dA-F]{4})|%([\\dA-F]{2})/gi, function (_, m1, m2) {\n                    return String.fromCharCode(parseInt('0x' + (m1 || m2), 16));\n                });\n            }\n            return template;\n        }\n        var eventTarget = function (e) {\n            return e.target;\n        };\n        if (support.touch) {\n            eventTarget = function (e) {\n                var touches = 'originalEvent' in e ? e.originalEvent.changedTouches : 'changedTouches' in e ? e.changedTouches : null;\n                return touches ? document.elementFromPoint(touches[0].clientX, touches[0].clientY) : e.target;\n            };\n            each([\n                'swipe',\n                'swipeLeft',\n                'swipeRight',\n                'swipeUp',\n                'swipeDown',\n                'doubleTap',\n                'tap'\n            ], function (m, value) {\n                $.fn[value] = function (callback) {\n                    return this.bind(value, callback);\n                };\n            });\n        }\n        if (support.touch) {\n            if (!support.mobileOS) {\n                support.mousedown = 'mousedown touchstart';\n                support.mouseup = 'mouseup touchend';\n                support.mousemove = 'mousemove touchmove';\n                support.mousecancel = 'mouseleave touchcancel';\n                support.click = 'click';\n                support.resize = 'resize';\n            } else {\n                support.mousedown = 'touchstart';\n                support.mouseup = 'touchend';\n                support.mousemove = 'touchmove';\n                support.mousecancel = 'touchcancel';\n                support.click = 'touchend';\n                support.resize = 'orientationchange';\n            }\n        } else if (support.pointers) {\n            support.mousemove = 'pointermove';\n            support.mousedown = 'pointerdown';\n            support.mouseup = 'pointerup';\n            support.mousecancel = 'pointercancel';\n            support.click = 'pointerup';\n            support.resize = 'orientationchange resize';\n        } else if (support.msPointers) {\n            support.mousemove = 'MSPointerMove';\n            support.mousedown = 'MSPointerDown';\n            support.mouseup = 'MSPointerUp';\n            support.mousecancel = 'MSPointerCancel';\n            support.click = 'MSPointerUp';\n            support.resize = 'orientationchange resize';\n        } else {\n            support.mousemove = 'mousemove';\n            support.mousedown = 'mousedown';\n            support.mouseup = 'mouseup';\n            support.mousecancel = 'mouseleave';\n            support.click = 'click';\n            support.resize = 'resize';\n        }\n        var wrapExpression = function (members, paramName) {\n                var result = paramName || 'd', index, idx, length, member, count = 1;\n                for (idx = 0, length = members.length; idx < length; idx++) {\n                    member = members[idx];\n                    if (member !== '') {\n                        index = member.indexOf('[');\n                        if (index !== 0) {\n                            if (index == -1) {\n                                member = '.' + member;\n                            } else {\n                                count++;\n                                member = '.' + member.substring(0, index) + ' || {})' + member.substring(index);\n                            }\n                        }\n                        count++;\n                        result += member + (idx < length - 1 ? ' || {})' : ')');\n                    }\n                }\n                return new Array(count).join('(') + result;\n            }, localUrlRe = /^([a-z]+:)?\\/\\//i;\n        extend(kendo, {\n            widgets: [],\n            _widgetRegisteredCallbacks: [],\n            ui: kendo.ui || {},\n            fx: kendo.fx || fx,\n            effects: kendo.effects || effects,\n            mobile: kendo.mobile || {},\n            data: kendo.data || {},\n            dataviz: kendo.dataviz || {},\n            drawing: kendo.drawing || {},\n            spreadsheet: { messages: {} },\n            keys: {\n                INSERT: 45,\n                DELETE: 46,\n                BACKSPACE: 8,\n                TAB: 9,\n                ENTER: 13,\n                ESC: 27,\n                LEFT: 37,\n                UP: 38,\n                RIGHT: 39,\n                DOWN: 40,\n                END: 35,\n                HOME: 36,\n                SPACEBAR: 32,\n                PAGEUP: 33,\n                PAGEDOWN: 34,\n                F2: 113,\n                F10: 121,\n                F12: 123,\n                NUMPAD_PLUS: 107,\n                NUMPAD_MINUS: 109,\n                NUMPAD_DOT: 110\n            },\n            support: kendo.support || support,\n            animate: kendo.animate || animate,\n            ns: '',\n            attr: function (value) {\n                return 'data-' + kendo.ns + value;\n            },\n            getShadows: getShadows,\n            wrap: wrap,\n            deepExtend: deepExtend,\n            getComputedStyles: getComputedStyles,\n            isScrollable: isScrollable,\n            scrollLeft: scrollLeft,\n            size: size,\n            toCamelCase: toCamelCase,\n            toHyphens: toHyphens,\n            getOffset: kendo.getOffset || getOffset,\n            parseEffects: kendo.parseEffects || parseEffects,\n            toggleClass: kendo.toggleClass || toggleClass,\n            directions: kendo.directions || directions,\n            Observable: Observable,\n            Class: Class,\n            Template: Template,\n            template: proxy(Template.compile, Template),\n            render: proxy(Template.render, Template),\n            stringify: proxy(JSON.stringify, JSON),\n            eventTarget: eventTarget,\n            htmlEncode: htmlEncode,\n            unescape: unescape,\n            isLocalUrl: function (url) {\n                return url && !localUrlRe.test(url);\n            },\n            expr: function (expression, safe, paramName) {\n                expression = expression || '';\n                if (typeof safe == STRING) {\n                    paramName = safe;\n                    safe = false;\n                }\n                paramName = paramName || 'd';\n                if (expression && expression.charAt(0) !== '[') {\n                    expression = '.' + expression;\n                }\n                if (safe) {\n                    expression = expression.replace(/\"([^.]*)\\.([^\"]*)\"/g, '\"$1_$DOT$_$2\"');\n                    expression = expression.replace(/'([^.]*)\\.([^']*)'/g, '\\'$1_$DOT$_$2\\'');\n                    expression = wrapExpression(expression.split('.'), paramName);\n                    expression = expression.replace(/_\\$DOT\\$_/g, '.');\n                } else {\n                    expression = paramName + expression;\n                }\n                return expression;\n            },\n            getter: function (expression, safe) {\n                var key = expression + safe;\n                return getterCache[key] = getterCache[key] || new Function('d', 'return ' + kendo.expr(expression, safe));\n            },\n            setter: function (expression) {\n                return setterCache[expression] = setterCache[expression] || new Function('d,value', kendo.expr(expression) + '=value');\n            },\n            accessor: function (expression) {\n                return {\n                    get: kendo.getter(expression),\n                    set: kendo.setter(expression)\n                };\n            },\n            guid: function () {\n                var id = '', i, random;\n                for (i = 0; i < 32; i++) {\n                    random = math.random() * 16 | 0;\n                    if (i == 8 || i == 12 || i == 16 || i == 20) {\n                        id += '-';\n                    }\n                    id += (i == 12 ? 4 : i == 16 ? random & 3 | 8 : random).toString(16);\n                }\n                return id;\n            },\n            roleSelector: function (role) {\n                return role.replace(/(\\S+)/g, '[' + kendo.attr('role') + '=$1],').slice(0, -1);\n            },\n            directiveSelector: function (directives) {\n                var selectors = directives.split(' ');\n                if (selectors) {\n                    for (var i = 0; i < selectors.length; i++) {\n                        if (selectors[i] != 'view') {\n                            selectors[i] = selectors[i].replace(/(\\w*)(view|bar|strip|over)$/, '$1-$2');\n                        }\n                    }\n                }\n                return selectors.join(' ').replace(/(\\S+)/g, 'kendo-mobile-$1,').slice(0, -1);\n            },\n            triggeredByInput: function (e) {\n                return /^(label|input|textarea|select)$/i.test(e.target.tagName);\n            },\n            onWidgetRegistered: function (callback) {\n                for (var i = 0, len = kendo.widgets.length; i < len; i++) {\n                    callback(kendo.widgets[i]);\n                }\n                kendo._widgetRegisteredCallbacks.push(callback);\n            },\n            logToConsole: function (message, type) {\n                var console = window.console;\n                if (!kendo.suppressLog && typeof console != 'undefined' && console.log) {\n                    console[type || 'log'](message);\n                }\n            }\n        });\n        var Widget = Observable.extend({\n            init: function (element, options) {\n                var that = this;\n                that.element = kendo.jQuery(element).handler(that);\n                that.angular('init', options);\n                Observable.fn.init.call(that);\n                var dataSource = options ? options.dataSource : null;\n                if (dataSource) {\n                    options = extend({}, options, { dataSource: {} });\n                }\n                options = that.options = extend(true, {}, that.options, that.defaults, options);\n                if (dataSource) {\n                    options.dataSource = dataSource;\n                }\n                if (!that.element.attr(kendo.attr('role'))) {\n                    that.element.attr(kendo.attr('role'), (options.name || '').toLowerCase());\n                }\n                that.element.data('kendo' + options.prefix + options.name, that);\n                that.bind(that.events, options);\n            },\n            events: [],\n            options: { prefix: '' },\n            _hasBindingTarget: function () {\n                return !!this.element[0].kendoBindingTarget;\n            },\n            _tabindex: function (target) {\n                target = target || this.wrapper;\n                var element = this.element, TABINDEX = 'tabindex', tabindex = target.attr(TABINDEX) || element.attr(TABINDEX);\n                element.removeAttr(TABINDEX);\n                target.attr(TABINDEX, !isNaN(tabindex) ? tabindex : 0);\n            },\n            setOptions: function (options) {\n                this._setEvents(options);\n                $.extend(this.options, options);\n            },\n            _setEvents: function (options) {\n                var that = this, idx = 0, length = that.events.length, e;\n                for (; idx < length; idx++) {\n                    e = that.events[idx];\n                    if (that.options[e] && options[e]) {\n                        that.unbind(e, that.options[e]);\n                        if (that._events && that._events[e]) {\n                            delete that._events[e];\n                        }\n                    }\n                }\n                that.bind(that.events, options);\n            },\n            resize: function (force) {\n                var size = this.getSize(), currentSize = this._size;\n                if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\n                    this._size = size;\n                    this._resize(size, force);\n                    this.trigger('resize', size);\n                }\n            },\n            getSize: function () {\n                return kendo.dimensions(this.element);\n            },\n            size: function (size) {\n                if (!size) {\n                    return this.getSize();\n                } else {\n                    this.setSize(size);\n                }\n            },\n            setSize: $.noop,\n            _resize: $.noop,\n            destroy: function () {\n                var that = this;\n                that.element.removeData('kendo' + that.options.prefix + that.options.name);\n                that.element.removeData('handler');\n                that.unbind();\n            },\n            _destroy: function () {\n                this.destroy();\n            },\n            angular: function () {\n            },\n            _muteAngularRebind: function (callback) {\n                this._muteRebind = true;\n                callback.call(this);\n                this._muteRebind = false;\n            }\n        });\n        var DataBoundWidget = Widget.extend({\n            dataItems: function () {\n                return this.dataSource.flatView();\n            },\n            _angularItems: function (cmd) {\n                var that = this;\n                that.angular(cmd, function () {\n                    return {\n                        elements: that.items(),\n                        data: $.map(that.dataItems(), function (dataItem) {\n                            return { dataItem: dataItem };\n                        })\n                    };\n                });\n            }\n        });\n        kendo.dimensions = function (element, dimensions) {\n            var domElement = element[0];\n            if (dimensions) {\n                element.css(dimensions);\n            }\n            return {\n                width: domElement.offsetWidth,\n                height: domElement.offsetHeight\n            };\n        };\n        kendo.notify = noop;\n        var templateRegExp = /template$/i, jsonRegExp = /^\\s*(?:\\{(?:.|\\r\\n|\\n)*\\}|\\[(?:.|\\r\\n|\\n)*\\])\\s*$/, jsonFormatRegExp = /^\\{(\\d+)(:[^\\}]+)?\\}|^\\[[A-Za-z_]+\\]$/, dashRegExp = /([A-Z])/g;\n        function parseOption(element, option) {\n            var value;\n            if (option.indexOf('data') === 0) {\n                option = option.substring(4);\n                option = option.charAt(0).toLowerCase() + option.substring(1);\n            }\n            option = option.replace(dashRegExp, '-$1');\n            value = element.getAttribute('data-' + kendo.ns + option);\n            if (value === null) {\n                value = undefined;\n            } else if (value === 'null') {\n                value = null;\n            } else if (value === 'true') {\n                value = true;\n            } else if (value === 'false') {\n                value = false;\n            } else if (numberRegExp.test(value) && option != 'mask') {\n                value = parseFloat(value);\n            } else if (jsonRegExp.test(value) && !jsonFormatRegExp.test(value)) {\n                value = new Function('return (' + value + ')')();\n            }\n            return value;\n        }\n        function parseOptions(element, options, source) {\n            var result = {}, option, value, role = element.getAttribute('data-' + kendo.ns + 'role');\n            for (option in options) {\n                value = parseOption(element, option);\n                if (value !== undefined) {\n                    if (templateRegExp.test(option) && role != 'drawer') {\n                        if (typeof value === 'string') {\n                            if ($('#' + value).length) {\n                                value = kendo.template($('#' + value).html());\n                            } else if (source) {\n                                value = kendo.template(source[value]);\n                            }\n                        } else {\n                            value = element.getAttribute(option);\n                        }\n                    }\n                    result[option] = value;\n                }\n            }\n            return result;\n        }\n        kendo.initWidget = function (element, options, roles) {\n            var result, option, widget, idx, length, role, value, dataSource, fullPath, widgetKeyRegExp;\n            if (!roles) {\n                roles = kendo.ui.roles;\n            } else if (roles.roles) {\n                roles = roles.roles;\n            }\n            element = element.nodeType ? element : element[0];\n            role = element.getAttribute('data-' + kendo.ns + 'role');\n            if (!role) {\n                return;\n            }\n            fullPath = role.indexOf('.') === -1;\n            if (fullPath) {\n                widget = roles[role];\n            } else {\n                widget = kendo.getter(role)(window);\n            }\n            var data = $(element).data(), widgetKey = widget ? 'kendo' + widget.fn.options.prefix + widget.fn.options.name : '';\n            if (fullPath) {\n                widgetKeyRegExp = new RegExp('^kendo.*' + role + '$', 'i');\n            } else {\n                widgetKeyRegExp = new RegExp('^' + widgetKey + '$', 'i');\n            }\n            for (var key in data) {\n                if (key.match(widgetKeyRegExp)) {\n                    if (key === widgetKey) {\n                        result = data[key];\n                    } else {\n                        return data[key];\n                    }\n                }\n            }\n            if (!widget) {\n                return;\n            }\n            dataSource = parseOption(element, 'dataSource');\n            options = $.extend({}, parseOptions(element, widget.fn.options), options);\n            if (dataSource) {\n                if (typeof dataSource === STRING) {\n                    options.dataSource = kendo.getter(dataSource)(window);\n                } else {\n                    options.dataSource = dataSource;\n                }\n            }\n            for (idx = 0, length = widget.fn.events.length; idx < length; idx++) {\n                option = widget.fn.events[idx];\n                value = parseOption(element, option);\n                if (value !== undefined) {\n                    options[option] = kendo.getter(value)(window);\n                }\n            }\n            if (!result) {\n                result = new widget(element, options);\n            } else if (!$.isEmptyObject(options)) {\n                result.setOptions(options);\n            }\n            return result;\n        };\n        kendo.rolesFromNamespaces = function (namespaces) {\n            var roles = [], idx, length;\n            if (!namespaces[0]) {\n                namespaces = [\n                    kendo.ui,\n                    kendo.dataviz.ui\n                ];\n            }\n            for (idx = 0, length = namespaces.length; idx < length; idx++) {\n                roles[idx] = namespaces[idx].roles;\n            }\n            return extend.apply(null, [{}].concat(roles.reverse()));\n        };\n        kendo.init = function (element) {\n            var roles = kendo.rolesFromNamespaces(slice.call(arguments, 1));\n            $(element).find('[data-' + kendo.ns + 'role]').addBack().each(function () {\n                kendo.initWidget(this, {}, roles);\n            });\n        };\n        kendo.destroy = function (element) {\n            $(element).find('[data-' + kendo.ns + 'role]').addBack().each(function () {\n                var data = $(this).data();\n                for (var key in data) {\n                    if (key.indexOf('kendo') === 0 && typeof data[key].destroy === FUNCTION) {\n                        data[key].destroy();\n                    }\n                }\n            });\n        };\n        function containmentComparer(a, b) {\n            return $.contains(a, b) ? -1 : 1;\n        }\n        function resizableWidget() {\n            var widget = $(this);\n            return $.inArray(widget.attr('data-' + kendo.ns + 'role'), [\n                'slider',\n                'rangeslider',\n                'breadcrumb'\n            ]) > -1 || widget.is(':visible');\n        }\n        kendo.resize = function (element, force) {\n            var widgets = $(element).find('[data-' + kendo.ns + 'role]').addBack().filter(resizableWidget);\n            if (!widgets.length) {\n                return;\n            }\n            var widgetsArray = $.makeArray(widgets);\n            widgetsArray.sort(containmentComparer);\n            $.each(widgetsArray, function () {\n                var widget = kendo.widgetInstance($(this));\n                if (widget) {\n                    widget.resize(force);\n                }\n            });\n        };\n        kendo.parseOptions = parseOptions;\n        extend(kendo.ui, {\n            Widget: Widget,\n            DataBoundWidget: DataBoundWidget,\n            roles: {},\n            progress: function (container, toggle, options) {\n                var mask = container.find('.k-loading-mask'), support = kendo.support, browser = support.browser, isRtl, leftRight, webkitCorrection, containerScrollLeft, cssClass;\n                options = $.extend({}, {\n                    width: '100%',\n                    height: '100%',\n                    top: container.scrollTop(),\n                    opacity: false\n                }, options);\n                cssClass = options.opacity ? 'k-loading-mask k-opaque' : 'k-loading-mask';\n                if (toggle) {\n                    if (!mask.length) {\n                        isRtl = support.isRtl(container);\n                        leftRight = isRtl ? 'right' : 'left';\n                        containerScrollLeft = container.scrollLeft();\n                        webkitCorrection = browser.webkit ? !isRtl ? 0 : container[0].scrollWidth - container.width() - 2 * containerScrollLeft : 0;\n                        mask = $(kendo.format('<div class=\\'{0}\\'><span class=\\'k-loading-text\\'>{1}</span><div class=\\'k-loading-image\\'/><div class=\\'k-loading-color\\'/></div>', cssClass, kendo.ui.progress.messages.loading)).width(options.width).height(options.height).css('top', options.top).css(leftRight, Math.abs(containerScrollLeft) + webkitCorrection).prependTo(container);\n                    }\n                } else if (mask) {\n                    mask.remove();\n                }\n            },\n            plugin: function (widget, register, prefix) {\n                var name = widget.fn.options.name, getter;\n                register = register || kendo.ui;\n                prefix = prefix || '';\n                register[name] = widget;\n                register.roles[name.toLowerCase()] = widget;\n                getter = 'getKendo' + prefix + name;\n                name = 'kendo' + prefix + name;\n                var widgetEntry = {\n                    name: name,\n                    widget: widget,\n                    prefix: prefix || ''\n                };\n                kendo.widgets.push(widgetEntry);\n                for (var i = 0, len = kendo._widgetRegisteredCallbacks.length; i < len; i++) {\n                    kendo._widgetRegisteredCallbacks[i](widgetEntry);\n                }\n                $.fn[name] = function (options) {\n                    var value = this, args;\n                    if (typeof options === STRING) {\n                        args = slice.call(arguments, 1);\n                        this.each(function () {\n                            var widget = $.data(this, name), method, result;\n                            if (!widget) {\n                                throw new Error(kendo.format('Cannot call method \\'{0}\\' of {1} before it is initialized', options, name));\n                            }\n                            method = widget[options];\n                            if (typeof method !== FUNCTION) {\n                                throw new Error(kendo.format('Cannot find method \\'{0}\\' of {1}', options, name));\n                            }\n                            result = method.apply(widget, args);\n                            if (result !== undefined) {\n                                value = result;\n                                return false;\n                            }\n                        });\n                    } else {\n                        this.each(function () {\n                            return new widget(this, options);\n                        });\n                    }\n                    return value;\n                };\n                $.fn[name].widget = widget;\n                $.fn[getter] = function () {\n                    return this.data(name);\n                };\n            }\n        });\n        kendo.ui.progress.messages = { loading: 'Loading...' };\n        var ContainerNullObject = {\n            bind: function () {\n                return this;\n            },\n            nullObject: true,\n            options: {}\n        };\n        var MobileWidget = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.element.autoApplyNS();\n                this.wrapper = this.element;\n                this.element.addClass('km-widget');\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.element.kendoDestroy();\n            },\n            options: { prefix: 'Mobile' },\n            events: [],\n            view: function () {\n                var viewElement = this.element.closest(kendo.roleSelector('view splitview modalview drawer'));\n                return kendo.widgetInstance(viewElement, kendo.mobile.ui) || ContainerNullObject;\n            },\n            viewHasNativeScrolling: function () {\n                var view = this.view();\n                return view && view.options.useNativeScrolling;\n            },\n            container: function () {\n                var element = this.element.closest(kendo.roleSelector('view layout modalview drawer splitview'));\n                return kendo.widgetInstance(element.eq(0), kendo.mobile.ui) || ContainerNullObject;\n            }\n        });\n        extend(kendo.mobile, {\n            init: function (element) {\n                kendo.init(element, kendo.mobile.ui, kendo.ui, kendo.dataviz.ui);\n            },\n            appLevelNativeScrolling: function () {\n                return kendo.mobile.application && kendo.mobile.application.options && kendo.mobile.application.options.useNativeScrolling;\n            },\n            roles: {},\n            ui: {\n                Widget: MobileWidget,\n                DataBoundWidget: DataBoundWidget.extend(MobileWidget.prototype),\n                roles: {},\n                plugin: function (widget) {\n                    kendo.ui.plugin(widget, kendo.mobile.ui, 'Mobile');\n                }\n            }\n        });\n        deepExtend(kendo.dataviz, {\n            init: function (element) {\n                kendo.init(element, kendo.dataviz.ui);\n            },\n            ui: {\n                roles: {},\n                themes: {},\n                views: [],\n                plugin: function (widget) {\n                    kendo.ui.plugin(widget, kendo.dataviz.ui);\n                }\n            },\n            roles: {}\n        });\n        kendo.touchScroller = function (elements, options) {\n            if (!options) {\n                options = {};\n            }\n            options.useNative = true;\n            return $(elements).map(function (idx, element) {\n                element = $(element);\n                if (support.kineticScrollNeeded && kendo.mobile.ui.Scroller && !element.data('kendoMobileScroller')) {\n                    element.kendoMobileScroller(options);\n                    return element.data('kendoMobileScroller');\n                } else {\n                    return false;\n                }\n            })[0];\n        };\n        kendo.preventDefault = function (e) {\n            e.preventDefault();\n        };\n        kendo.widgetInstance = function (element, suites) {\n            var role = element.data(kendo.ns + 'role'), widgets = [], i, length, elementData = element.data('kendoView');\n            if (role) {\n                if (role === 'content') {\n                    role = 'scroller';\n                }\n                if (role === 'editortoolbar') {\n                    var editorToolbar = element.data('kendoEditorToolbar');\n                    if (editorToolbar) {\n                        return editorToolbar;\n                    }\n                }\n                if (role === 'view' && elementData) {\n                    return elementData;\n                }\n                if (suites) {\n                    if (suites[0]) {\n                        for (i = 0, length = suites.length; i < length; i++) {\n                            widgets.push(suites[i].roles[role]);\n                        }\n                    } else {\n                        widgets.push(suites.roles[role]);\n                    }\n                } else {\n                    widgets = [\n                        kendo.ui.roles[role],\n                        kendo.dataviz.ui.roles[role],\n                        kendo.mobile.ui.roles[role]\n                    ];\n                }\n                if (role.indexOf('.') >= 0) {\n                    widgets = [kendo.getter(role)(window)];\n                }\n                for (i = 0, length = widgets.length; i < length; i++) {\n                    var widget = widgets[i];\n                    if (widget) {\n                        var instance = element.data('kendo' + widget.fn.options.prefix + widget.fn.options.name);\n                        if (instance) {\n                            return instance;\n                        }\n                    }\n                }\n            }\n        };\n        kendo.onResize = function (callback) {\n            var handler = callback;\n            if (support.mobileOS.android) {\n                handler = function () {\n                    setTimeout(callback, 600);\n                };\n            }\n            $(window).on(support.resize, handler);\n            return handler;\n        };\n        kendo.unbindResize = function (callback) {\n            $(window).off(support.resize, callback);\n        };\n        kendo.attrValue = function (element, key) {\n            return element.data(kendo.ns + key);\n        };\n        kendo.days = {\n            Sunday: 0,\n            Monday: 1,\n            Tuesday: 2,\n            Wednesday: 3,\n            Thursday: 4,\n            Friday: 5,\n            Saturday: 6\n        };\n        function focusable(element, isTabIndexNotNaN) {\n            var nodeName = element.nodeName.toLowerCase();\n            return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : 'a' === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && visible(element);\n        }\n        function visible(element) {\n            return $.expr.pseudos.visible(element) && !$(element).parents().addBack().filter(function () {\n                return $.css(this, 'visibility') === 'hidden';\n            }).length;\n        }\n        $.extend($.expr.pseudos, {\n            kendoFocusable: function (element) {\n                var idx = $.attr(element, 'tabindex');\n                return focusable(element, !isNaN(idx) && idx > -1);\n            }\n        });\n        var MOUSE_EVENTS = [\n            'mousedown',\n            'mousemove',\n            'mouseenter',\n            'mouseleave',\n            'mouseover',\n            'mouseout',\n            'mouseup',\n            'click'\n        ];\n        var EXCLUDE_BUST_CLICK_SELECTOR = 'label, input, [data-rel=external]';\n        var MouseEventNormalizer = {\n            setupMouseMute: function () {\n                var idx = 0, length = MOUSE_EVENTS.length, element = document.documentElement;\n                if (MouseEventNormalizer.mouseTrap || !support.eventCapture) {\n                    return;\n                }\n                MouseEventNormalizer.mouseTrap = true;\n                MouseEventNormalizer.bustClick = false;\n                MouseEventNormalizer.captureMouse = false;\n                var handler = function (e) {\n                    if (MouseEventNormalizer.captureMouse) {\n                        if (e.type === 'click') {\n                            if (MouseEventNormalizer.bustClick && !$(e.target).is(EXCLUDE_BUST_CLICK_SELECTOR)) {\n                                e.preventDefault();\n                                e.stopPropagation();\n                            }\n                        } else {\n                            e.stopPropagation();\n                        }\n                    }\n                };\n                for (; idx < length; idx++) {\n                    element.addEventListener(MOUSE_EVENTS[idx], handler, true);\n                }\n            },\n            muteMouse: function (e) {\n                MouseEventNormalizer.captureMouse = true;\n                if (e.data.bustClick) {\n                    MouseEventNormalizer.bustClick = true;\n                }\n                clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n            },\n            unMuteMouse: function () {\n                clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n                MouseEventNormalizer.mouseTrapTimeoutID = setTimeout(function () {\n                    MouseEventNormalizer.captureMouse = false;\n                    MouseEventNormalizer.bustClick = false;\n                }, 400);\n            }\n        };\n        var eventMap = {\n            down: 'touchstart mousedown',\n            move: 'mousemove touchmove',\n            up: 'mouseup touchend touchcancel',\n            cancel: 'mouseleave touchcancel'\n        };\n        if (support.touch && (support.mobileOS.ios || support.mobileOS.android)) {\n            eventMap = {\n                down: 'touchstart',\n                move: 'touchmove',\n                up: 'touchend touchcancel',\n                cancel: 'touchcancel'\n            };\n        } else if (support.pointers) {\n            eventMap = {\n                down: 'pointerdown',\n                move: 'pointermove',\n                up: 'pointerup',\n                cancel: 'pointercancel pointerleave'\n            };\n        } else if (support.msPointers) {\n            eventMap = {\n                down: 'MSPointerDown',\n                move: 'MSPointerMove',\n                up: 'MSPointerUp',\n                cancel: 'MSPointerCancel MSPointerLeave'\n            };\n        }\n        if (support.msPointers && !('onmspointerenter' in window)) {\n            $.each({\n                MSPointerEnter: 'MSPointerOver',\n                MSPointerLeave: 'MSPointerOut'\n            }, function (orig, fix) {\n                $.event.special[orig] = {\n                    delegateType: fix,\n                    bindType: fix,\n                    handle: function (event) {\n                        var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj;\n                        if (!related || related !== target && !$.contains(target, related)) {\n                            event.type = handleObj.origType;\n                            ret = handleObj.handler.apply(this, arguments);\n                            event.type = fix;\n                        }\n                        return ret;\n                    }\n                };\n            });\n        }\n        var getEventMap = function (e) {\n                return eventMap[e] || e;\n            }, eventRegEx = /([^ ]+)/g;\n        kendo.applyEventMap = function (events, ns) {\n            events = events.replace(eventRegEx, getEventMap);\n            if (ns) {\n                events = events.replace(eventRegEx, '$1.' + ns);\n            }\n            return events;\n        };\n        kendo.keyDownHandler = function (e, widget) {\n            var events = widget._events.kendoKeydown;\n            if (!events) {\n                return true;\n            }\n            events = events.slice();\n            e.sender = widget;\n            e.preventKendoKeydown = false;\n            for (var idx = 0, length = events.length; idx < length; idx++) {\n                events[idx].call(widget, e);\n            }\n            return !e.preventKendoKeydown;\n        };\n        var on = $.fn.on;\n        function kendoJQuery(selector, context) {\n            return new kendoJQuery.fn.init(selector, context);\n        }\n        noDepricateExtend(true, kendoJQuery, $);\n        kendoJQuery.fn = kendoJQuery.prototype = new $();\n        kendoJQuery.fn.constructor = kendoJQuery;\n        kendoJQuery.fn.init = function (selector, context) {\n            if (context && context instanceof $ && !(context instanceof kendoJQuery)) {\n                context = kendoJQuery(context);\n            }\n            return $.fn.init.call(this, selector, context, rootjQuery);\n        };\n        kendoJQuery.fn.init.prototype = kendoJQuery.fn;\n        var rootjQuery = kendoJQuery(document);\n        extend(kendoJQuery.fn, {\n            handler: function (handler) {\n                this.data('handler', handler);\n                return this;\n            },\n            autoApplyNS: function (ns) {\n                this.data('kendoNS', ns || kendo.guid());\n                return this;\n            },\n            on: function () {\n                var that = this, ns = that.data('kendoNS');\n                if (arguments.length === 1) {\n                    return on.call(that, arguments[0]);\n                }\n                var context = that, args = slice.call(arguments);\n                if (typeof args[args.length - 1] === UNDEFINED) {\n                    args.pop();\n                }\n                var callback = args[args.length - 1], events = kendo.applyEventMap(args[0], ns);\n                if (support.mouseAndTouchPresent && events.search(/mouse|click/) > -1 && this[0] !== document.documentElement) {\n                    MouseEventNormalizer.setupMouseMute();\n                    var selector = args.length === 2 ? null : args[1], bustClick = events.indexOf('click') > -1 && events.indexOf('touchend') > -1;\n                    on.call(this, {\n                        touchstart: MouseEventNormalizer.muteMouse,\n                        touchend: MouseEventNormalizer.unMuteMouse\n                    }, selector, { bustClick: bustClick });\n                }\n                if (arguments[0].indexOf('keydown') !== -1 && args[1] && args[1].options) {\n                    args[0] = events;\n                    var widget = args[1];\n                    var keyDownCallBack = args[args.length - 1];\n                    args[args.length - 1] = function (e) {\n                        if (kendo.keyDownHandler(e, widget)) {\n                            return keyDownCallBack.apply(this, [e]);\n                        }\n                    };\n                    on.apply(that, args);\n                    return that;\n                }\n                if (typeof callback === STRING) {\n                    context = that.data('handler');\n                    callback = context[callback];\n                    args[args.length - 1] = function (e) {\n                        callback.call(context, e);\n                    };\n                }\n                args[0] = events;\n                on.apply(that, args);\n                return that;\n            },\n            kendoDestroy: function (ns) {\n                ns = ns || this.data('kendoNS');\n                if (ns) {\n                    this.off('.' + ns);\n                }\n                return this;\n            }\n        });\n        kendo.jQuery = kendoJQuery;\n        kendo.eventMap = eventMap;\n        kendo.timezone = function () {\n            var months = {\n                Jan: 0,\n                Feb: 1,\n                Mar: 2,\n                Apr: 3,\n                May: 4,\n                Jun: 5,\n                Jul: 6,\n                Aug: 7,\n                Sep: 8,\n                Oct: 9,\n                Nov: 10,\n                Dec: 11\n            };\n            var days = {\n                Sun: 0,\n                Mon: 1,\n                Tue: 2,\n                Wed: 3,\n                Thu: 4,\n                Fri: 5,\n                Sat: 6\n            };\n            function ruleToDate(year, rule) {\n                var date;\n                var targetDay;\n                var ourDay;\n                var month = rule[3];\n                var on = rule[4];\n                var time = rule[5];\n                var cache = rule[8];\n                if (!cache) {\n                    rule[8] = cache = {};\n                }\n                if (cache[year]) {\n                    return cache[year];\n                }\n                if (!isNaN(on)) {\n                    date = new Date(Date.UTC(year, months[month], on, time[0], time[1], time[2], 0));\n                } else if (on.indexOf('last') === 0) {\n                    date = new Date(Date.UTC(year, months[month] + 1, 1, time[0] - 24, time[1], time[2], 0));\n                    targetDay = days[on.substr(4, 3)];\n                    ourDay = date.getUTCDay();\n                    date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n                } else if (on.indexOf('>=') >= 0) {\n                    date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\n                    targetDay = days[on.substr(0, 3)];\n                    ourDay = date.getUTCDay();\n                    date.setUTCDate(date.getUTCDate() + targetDay - ourDay + (targetDay < ourDay ? 7 : 0));\n                } else if (on.indexOf('<=') >= 0) {\n                    date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\n                    targetDay = days[on.substr(0, 3)];\n                    ourDay = date.getUTCDay();\n                    date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n                }\n                return cache[year] = date;\n            }\n            function findRule(utcTime, rules, zone) {\n                rules = rules[zone];\n                if (!rules) {\n                    var time = zone.split(':');\n                    var offset = 0;\n                    if (time.length > 1) {\n                        offset = time[0] * 60 + Number(time[1]);\n                    }\n                    return [\n                        -1000000,\n                        'max',\n                        '-',\n                        'Jan',\n                        1,\n                        [\n                            0,\n                            0,\n                            0\n                        ],\n                        offset,\n                        '-'\n                    ];\n                }\n                var year = new Date(utcTime).getUTCFullYear();\n                rules = jQuery.grep(rules, function (rule) {\n                    var from = rule[0];\n                    var to = rule[1];\n                    return from <= year && (to >= year || from == year && to == 'only' || to == 'max');\n                });\n                rules.push(utcTime);\n                rules.sort(function (a, b) {\n                    if (typeof a != 'number') {\n                        a = Number(ruleToDate(year, a));\n                    }\n                    if (typeof b != 'number') {\n                        b = Number(ruleToDate(year, b));\n                    }\n                    return a - b;\n                });\n                var rule = rules[jQuery.inArray(utcTime, rules) - 1] || rules[rules.length - 1];\n                return isNaN(rule) ? rule : null;\n            }\n            function findZone(utcTime, zones, timezone) {\n                var zoneRules = zones[timezone];\n                if (typeof zoneRules === 'string') {\n                    zoneRules = zones[zoneRules];\n                }\n                if (!zoneRules) {\n                    throw new Error('Timezone \"' + timezone + '\" is either incorrect, or kendo.timezones.min.js is not included.');\n                }\n                for (var idx = zoneRules.length - 1; idx >= 0; idx--) {\n                    var until = zoneRules[idx][3];\n                    if (until && utcTime > until) {\n                        break;\n                    }\n                }\n                var zone = zoneRules[idx + 1];\n                if (!zone) {\n                    throw new Error('Timezone \"' + timezone + '\" not found on ' + utcTime + '.');\n                }\n                return zone;\n            }\n            function zoneAndRule(utcTime, zones, rules, timezone) {\n                if (typeof utcTime != NUMBER) {\n                    utcTime = Date.UTC(utcTime.getFullYear(), utcTime.getMonth(), utcTime.getDate(), utcTime.getHours(), utcTime.getMinutes(), utcTime.getSeconds(), utcTime.getMilliseconds());\n                }\n                var zone = findZone(utcTime, zones, timezone);\n                return {\n                    zone: zone,\n                    rule: findRule(utcTime, rules, zone[1])\n                };\n            }\n            function offset(utcTime, timezone) {\n                if (timezone == 'Etc/UTC' || timezone == 'Etc/GMT') {\n                    return 0;\n                }\n                var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n                var zone = info.zone;\n                var rule = info.rule;\n                return kendo.parseFloat(rule ? zone[0] - rule[6] : zone[0]);\n            }\n            function abbr(utcTime, timezone) {\n                var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n                var zone = info.zone;\n                var rule = info.rule;\n                var base = zone[2];\n                if (base.indexOf('/') >= 0) {\n                    return base.split('/')[rule && +rule[6] ? 1 : 0];\n                } else if (base.indexOf('%s') >= 0) {\n                    return base.replace('%s', !rule || rule[7] == '-' ? '' : rule[7]);\n                }\n                return base;\n            }\n            function convert(date, fromOffset, toOffset) {\n                var tempToOffset = toOffset;\n                var diff;\n                if (typeof fromOffset == STRING) {\n                    fromOffset = this.offset(date, fromOffset);\n                }\n                if (typeof toOffset == STRING) {\n                    toOffset = this.offset(date, toOffset);\n                }\n                var fromLocalOffset = date.getTimezoneOffset();\n                date = new Date(date.getTime() + (fromOffset - toOffset) * 60000);\n                var toLocalOffset = date.getTimezoneOffset();\n                if (typeof tempToOffset == STRING) {\n                    tempToOffset = this.offset(date, tempToOffset);\n                }\n                diff = toLocalOffset - fromLocalOffset + (toOffset - tempToOffset);\n                return new Date(date.getTime() + diff * 60000);\n            }\n            function apply(date, timezone) {\n                return this.convert(date, date.getTimezoneOffset(), timezone);\n            }\n            function remove(date, timezone) {\n                return this.convert(date, timezone, date.getTimezoneOffset());\n            }\n            function toLocalDate(time) {\n                return this.apply(new Date(time), 'Etc/UTC');\n            }\n            return {\n                zones: {},\n                rules: {},\n                offset: offset,\n                convert: convert,\n                apply: apply,\n                remove: remove,\n                abbr: abbr,\n                toLocalDate: toLocalDate\n            };\n        }();\n        kendo.date = function () {\n            var MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000;\n            function adjustDST(date, hours) {\n                if (hours === 0 && date.getHours() === 23) {\n                    date.setHours(date.getHours() + 2);\n                    return true;\n                }\n                return false;\n            }\n            function setDayOfWeek(date, day, dir) {\n                var hours = date.getHours();\n                dir = dir || 1;\n                day = (day - date.getDay() + 7 * dir) % 7;\n                date.setDate(date.getDate() + day);\n                adjustDST(date, hours);\n            }\n            function dayOfWeek(date, day, dir) {\n                date = new Date(date);\n                setDayOfWeek(date, day, dir);\n                return date;\n            }\n            function firstDayOfMonth(date) {\n                return new Date(date.getFullYear(), date.getMonth(), 1);\n            }\n            function lastDayOfMonth(date) {\n                var last = new Date(date.getFullYear(), date.getMonth() + 1, 0), first = firstDayOfMonth(date), timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\n                if (timeOffset) {\n                    last.setHours(first.getHours() + timeOffset / 60);\n                }\n                return last;\n            }\n            function moveDateToWeekStart(date, weekStartDay) {\n                if (weekStartDay !== 1) {\n                    return addDays(dayOfWeek(date, weekStartDay, -1), 4);\n                }\n                return addDays(date, 4 - (date.getDay() || 7));\n            }\n            function calcWeekInYear(date, weekStartDay) {\n                var firstWeekInYear = new Date(date.getFullYear(), 0, 1, -6);\n                var newDate = moveDateToWeekStart(date, weekStartDay);\n                var diffInMS = newDate.getTime() - firstWeekInYear.getTime();\n                var days = Math.floor(diffInMS / MS_PER_DAY);\n                return 1 + Math.floor(days / 7);\n            }\n            function weekInYear(date, weekStartDay) {\n                if (weekStartDay === undefined) {\n                    weekStartDay = kendo.culture().calendar.firstDay;\n                }\n                var prevWeekDate = addDays(date, -7);\n                var nextWeekDate = addDays(date, 7);\n                var weekNumber = calcWeekInYear(date, weekStartDay);\n                if (weekNumber === 0) {\n                    return calcWeekInYear(prevWeekDate, weekStartDay) + 1;\n                }\n                if (weekNumber === 53 && calcWeekInYear(nextWeekDate, weekStartDay) > 1) {\n                    return 1;\n                }\n                return weekNumber;\n            }\n            function getDate(date) {\n                date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n                adjustDST(date, 0);\n                return date;\n            }\n            function toUtcTime(date) {\n                return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n            }\n            function getMilliseconds(date) {\n                return toInvariantTime(date).getTime() - getDate(toInvariantTime(date));\n            }\n            function isInTimeRange(value, min, max) {\n                var msMin = getMilliseconds(min), msMax = getMilliseconds(max), msValue;\n                if (!value || msMin == msMax) {\n                    return true;\n                }\n                if (min >= max) {\n                    max += MS_PER_DAY;\n                }\n                msValue = getMilliseconds(value);\n                if (msMin > msValue) {\n                    msValue += MS_PER_DAY;\n                }\n                if (msMax < msMin) {\n                    msMax += MS_PER_DAY;\n                }\n                return msValue >= msMin && msValue <= msMax;\n            }\n            function isInDateRange(value, min, max) {\n                var msMin = min.getTime(), msMax = max.getTime(), msValue;\n                if (msMin >= msMax) {\n                    msMax += MS_PER_DAY;\n                }\n                msValue = value.getTime();\n                return msValue >= msMin && msValue <= msMax;\n            }\n            function addDays(date, offset) {\n                var hours = date.getHours();\n                date = new Date(date);\n                setTime(date, offset * MS_PER_DAY);\n                adjustDST(date, hours);\n                return date;\n            }\n            function setTime(date, milliseconds, ignoreDST) {\n                var offset = date.getTimezoneOffset();\n                var difference;\n                date.setTime(date.getTime() + milliseconds);\n                if (!ignoreDST) {\n                    difference = date.getTimezoneOffset() - offset;\n                    date.setTime(date.getTime() + difference * MS_PER_MINUTE);\n                }\n            }\n            function setHours(date, time) {\n                date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());\n                adjustDST(date, time.getHours());\n                return date;\n            }\n            function today() {\n                return getDate(new Date());\n            }\n            function isToday(date) {\n                return getDate(date).getTime() == today().getTime();\n            }\n            function toInvariantTime(date) {\n                var staticDate = new Date(1980, 1, 1, 0, 0, 0);\n                if (date) {\n                    staticDate.setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n                }\n                return staticDate;\n            }\n            return {\n                adjustDST: adjustDST,\n                dayOfWeek: dayOfWeek,\n                setDayOfWeek: setDayOfWeek,\n                getDate: getDate,\n                isInDateRange: isInDateRange,\n                isInTimeRange: isInTimeRange,\n                isToday: isToday,\n                nextDay: function (date) {\n                    return addDays(date, 1);\n                },\n                previousDay: function (date) {\n                    return addDays(date, -1);\n                },\n                toUtcTime: toUtcTime,\n                MS_PER_DAY: MS_PER_DAY,\n                MS_PER_HOUR: 60 * MS_PER_MINUTE,\n                MS_PER_MINUTE: MS_PER_MINUTE,\n                setTime: setTime,\n                setHours: setHours,\n                addDays: addDays,\n                today: today,\n                toInvariantTime: toInvariantTime,\n                firstDayOfMonth: firstDayOfMonth,\n                lastDayOfMonth: lastDayOfMonth,\n                weekInYear: weekInYear,\n                getMilliseconds: getMilliseconds\n            };\n        }();\n        kendo.stripWhitespace = function (element) {\n            if (document.createNodeIterator) {\n                var iterator = document.createNodeIterator(element, NodeFilter.SHOW_TEXT, function (node) {\n                    return node.parentNode == element ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n                }, false);\n                while (iterator.nextNode()) {\n                    if (iterator.referenceNode && !iterator.referenceNode.textContent.trim()) {\n                        iterator.referenceNode.parentNode.removeChild(iterator.referenceNode);\n                    }\n                }\n            } else {\n                for (var i = 0; i < element.childNodes.length; i++) {\n                    var child = element.childNodes[i];\n                    if (child.nodeType == 3 && !/\\S/.test(child.nodeValue)) {\n                        element.removeChild(child);\n                        i--;\n                    }\n                    if (child.nodeType == 1) {\n                        kendo.stripWhitespace(child);\n                    }\n                }\n            }\n        };\n        var animationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {\n            setTimeout(callback, 1000 / 60);\n        };\n        kendo.animationFrame = function (callback) {\n            animationFrame.call(window, callback);\n        };\n        var animationQueue = [];\n        kendo.queueAnimation = function (callback) {\n            animationQueue[animationQueue.length] = callback;\n            if (animationQueue.length === 1) {\n                kendo.runNextAnimation();\n            }\n        };\n        kendo.runNextAnimation = function () {\n            kendo.animationFrame(function () {\n                if (animationQueue[0]) {\n                    animationQueue.shift()();\n                    if (animationQueue[0]) {\n                        kendo.runNextAnimation();\n                    }\n                }\n            });\n        };\n        kendo.parseQueryStringParams = function (url) {\n            var queryString = url.split('?')[1] || '', params = {}, paramParts = queryString.split(/&|=/), length = paramParts.length, idx = 0;\n            for (; idx < length; idx += 2) {\n                if (paramParts[idx] !== '') {\n                    params[decodeURIComponent(paramParts[idx])] = decodeURIComponent(paramParts[idx + 1]);\n                }\n            }\n            return params;\n        };\n        kendo.elementUnderCursor = function (e) {\n            if (typeof e.x.client != 'undefined') {\n                return document.elementFromPoint(e.x.client, e.y.client);\n            }\n        };\n        kendo.wheelDeltaY = function (jQueryEvent) {\n            var e = jQueryEvent.originalEvent, deltaY = e.wheelDeltaY, delta;\n            if (e.wheelDelta) {\n                if (deltaY === undefined || deltaY) {\n                    delta = e.wheelDelta;\n                }\n            } else if (e.detail && e.axis === e.VERTICAL_AXIS) {\n                delta = -e.detail * 10;\n            }\n            return delta;\n        };\n        kendo.throttle = function (fn, delay) {\n            var timeout;\n            var lastExecTime = 0;\n            if (!delay || delay <= 0) {\n                return fn;\n            }\n            var throttled = function () {\n                var that = this;\n                var elapsed = +new Date() - lastExecTime;\n                var args = arguments;\n                function exec() {\n                    fn.apply(that, args);\n                    lastExecTime = +new Date();\n                }\n                if (!lastExecTime) {\n                    return exec();\n                }\n                if (timeout) {\n                    clearTimeout(timeout);\n                }\n                if (elapsed > delay) {\n                    exec();\n                } else {\n                    timeout = setTimeout(exec, delay - elapsed);\n                }\n            };\n            throttled.cancel = function () {\n                clearTimeout(timeout);\n            };\n            return throttled;\n        };\n        kendo.caret = function (element, start, end) {\n            var rangeElement;\n            var isPosition = start !== undefined;\n            if (end === undefined) {\n                end = start;\n            }\n            if (element[0]) {\n                element = element[0];\n            }\n            if (isPosition && element.disabled) {\n                return;\n            }\n            try {\n                if (element.selectionStart !== undefined) {\n                    if (isPosition) {\n                        element.focus();\n                        var mobile = support.mobileOS;\n                        if (mobile.wp || mobile.android) {\n                            setTimeout(function () {\n                                element.setSelectionRange(start, end);\n                            }, 0);\n                        } else {\n                            element.setSelectionRange(start, end);\n                        }\n                    } else {\n                        start = [\n                            element.selectionStart,\n                            element.selectionEnd\n                        ];\n                    }\n                } else if (document.selection) {\n                    if ($(element).is(':visible')) {\n                        element.focus();\n                    }\n                    rangeElement = element.createTextRange();\n                    if (isPosition) {\n                        rangeElement.collapse(true);\n                        rangeElement.moveStart('character', start);\n                        rangeElement.moveEnd('character', end - start);\n                        rangeElement.select();\n                    } else {\n                        var rangeDuplicated = rangeElement.duplicate(), selectionStart, selectionEnd;\n                        rangeElement.moveToBookmark(document.selection.createRange().getBookmark());\n                        rangeDuplicated.setEndPoint('EndToStart', rangeElement);\n                        selectionStart = rangeDuplicated.text.length;\n                        selectionEnd = selectionStart + rangeElement.text.length;\n                        start = [\n                            selectionStart,\n                            selectionEnd\n                        ];\n                    }\n                }\n            } catch (e) {\n                start = [];\n            }\n            return start;\n        };\n        kendo.compileMobileDirective = function (element, scope) {\n            var angular = window.angular;\n            element.attr('data-' + kendo.ns + 'role', element[0].tagName.toLowerCase().replace('kendo-mobile-', '').replace('-', ''));\n            angular.element(element).injector().invoke([\n                '$compile',\n                function ($compile) {\n                    $compile(element)(scope);\n                    if (!/^\\$(digest|apply)$/.test(scope.$$phase)) {\n                        scope.$digest();\n                    }\n                }\n            ]);\n            return kendo.widgetInstance(element, kendo.mobile.ui);\n        };\n        kendo.antiForgeryTokens = function () {\n            var tokens = {}, csrf_token = $('meta[name=csrf-token],meta[name=_csrf]').attr('content'), csrf_param = $('meta[name=csrf-param],meta[name=_csrf_header]').attr('content');\n            $('input[name^=\\'__RequestVerificationToken\\']').each(function () {\n                tokens[this.name] = this.value;\n            });\n            if (csrf_param !== undefined && csrf_token !== undefined) {\n                tokens[csrf_param] = csrf_token;\n            }\n            return tokens;\n        };\n        kendo.cycleForm = function (form) {\n            var firstElement = form.find('input, .k-widget').first();\n            var lastElement = form.find('button, .k-button').last();\n            function focus(el) {\n                var widget = kendo.widgetInstance(el);\n                if (widget && widget.focus) {\n                    widget.focus();\n                } else {\n                    el.focus();\n                }\n            }\n            lastElement.on('keydown', function (e) {\n                if (e.keyCode == kendo.keys.TAB && !e.shiftKey) {\n                    e.preventDefault();\n                    focus(firstElement);\n                }\n            });\n            firstElement.on('keydown', function (e) {\n                if (e.keyCode == kendo.keys.TAB && e.shiftKey) {\n                    e.preventDefault();\n                    focus(lastElement);\n                }\n            });\n        };\n        kendo.focusElement = function (element) {\n            var scrollTopPositions = [];\n            var scrollableParents = element.parentsUntil('body').filter(function (index, element) {\n                var computedStyle = kendo.getComputedStyles(element, ['overflow']);\n                return computedStyle.overflow !== 'visible';\n            }).add(window);\n            scrollableParents.each(function (index, parent) {\n                scrollTopPositions[index] = $(parent).scrollTop();\n            });\n            try {\n                element[0].setActive();\n            } catch (e) {\n                element[0].focus();\n            }\n            scrollableParents.each(function (index, parent) {\n                $(parent).scrollTop(scrollTopPositions[index]);\n            });\n        };\n        kendo.focusNextElement = function () {\n            if (document.activeElement) {\n                var focussable = $(':kendoFocusable');\n                var index = focussable.index(document.activeElement);\n                if (index > -1) {\n                    var nextElement = focussable[index + 1] || focussable[0];\n                    nextElement.focus();\n                }\n            }\n        };\n        kendo.matchesMedia = function (mediaQuery) {\n            var media = kendo._bootstrapToMedia(mediaQuery) || mediaQuery;\n            return support.matchMedia && window.matchMedia(media).matches;\n        };\n        kendo._bootstrapToMedia = function (bootstrapMedia) {\n            return {\n                'xs': '(max-width: 576px)',\n                'sm': '(min-width: 576px)',\n                'md': '(min-width: 768px)',\n                'lg': '(min-width: 992px)',\n                'xl': '(min-width: 1200px)'\n            }[bootstrapMedia];\n        };\n        kendo.fileGroupMap = {\n            audio: [\n                '.aif',\n                '.iff',\n                '.m3u',\n                '.m4a',\n                '.mid',\n                '.mp3',\n                '.mpa',\n                '.wav',\n                '.wma',\n                '.ogg',\n                '.wav',\n                '.wma',\n                '.wpl'\n            ],\n            video: [\n                '.3g2',\n                '.3gp',\n                '.avi',\n                '.asf',\n                '.flv',\n                '.m4u',\n                '.rm',\n                '.h264',\n                '.m4v',\n                '.mkv',\n                '.mov',\n                '.mp4',\n                '.mpg',\n                '.rm',\n                '.swf',\n                '.vob',\n                '.wmv'\n            ],\n            image: [\n                '.ai',\n                '.dds',\n                '.heic',\n                '.jpe',\n                'jfif',\n                '.jif',\n                '.jp2',\n                '.jps',\n                '.eps',\n                '.bmp',\n                '.gif',\n                '.jpeg',\n                '.jpg',\n                '.png',\n                '.ps',\n                '.psd',\n                '.svg',\n                '.svgz',\n                '.tif',\n                '.tiff'\n            ],\n            txt: [\n                '.doc',\n                '.docx',\n                '.log',\n                '.pages',\n                '.tex',\n                '.wpd',\n                '.wps',\n                '.odt',\n                '.rtf',\n                '.text',\n                '.txt',\n                '.wks'\n            ],\n            presentation: [\n                '.key',\n                '.odp',\n                '.pps',\n                '.ppt',\n                '.pptx'\n            ],\n            data: [\n                '.xlr',\n                '.xls',\n                '.xlsx'\n            ],\n            programming: [\n                '.tmp',\n                '.bak',\n                '.msi',\n                '.cab',\n                '.cpl',\n                '.cur',\n                '.dll',\n                '.dmp',\n                '.drv',\n                '.icns',\n                '.ico',\n                '.link',\n                '.sys',\n                '.cfg',\n                '.ini',\n                '.asp',\n                '.aspx',\n                '.cer',\n                '.csr',\n                '.css',\n                '.dcr',\n                '.htm',\n                '.html',\n                '.js',\n                '.php',\n                '.rss',\n                '.xhtml'\n            ],\n            pdf: ['.pdf'],\n            config: [\n                '.apk',\n                '.app',\n                '.bat',\n                '.cgi',\n                '.com',\n                '.exe',\n                '.gadget',\n                '.jar',\n                '.wsf'\n            ],\n            zip: [\n                '.7z',\n                '.cbr',\n                '.gz',\n                '.sitx',\n                '.arj',\n                '.deb',\n                '.pkg',\n                '.rar',\n                '.rpm',\n                '.tar.gz',\n                '.z',\n                '.zip',\n                '.zipx'\n            ],\n            'disc-image': [\n                '.dmg',\n                '.iso',\n                '.toast',\n                '.vcd',\n                '.bin',\n                '.cue',\n                '.mdf'\n            ]\n        };\n        kendo.getFileGroup = function (extension, withPrefix) {\n            var fileTypeMap = kendo.fileGroupMap;\n            var groups = Object.keys(fileTypeMap);\n            var type = 'file';\n            if (extension === undefined || !extension.length) {\n                return type;\n            }\n            for (var i = 0; i < groups.length; i += 1) {\n                var extensions = fileTypeMap[groups[i]];\n                if (extensions.indexOf(extension.toLowerCase()) > -1) {\n                    return withPrefix ? 'file-' + groups[i] : groups[i];\n                }\n            }\n            return type;\n        };\n        kendo.getFileSizeMessage = function (size) {\n            var sizes = [\n                'Bytes',\n                'KB',\n                'MB',\n                'GB',\n                'TB'\n            ];\n            if (size === 0) {\n                return '0 Byte';\n            }\n            var i = parseInt(Math.floor(Math.log(size) / Math.log(1024)), 10);\n            return Math.round(size / Math.pow(1024, i), 2) + ' ' + sizes[i];\n        };\n        (function () {\n            function postToProxy(dataURI, fileName, proxyURL, proxyTarget) {\n                var form = $('<form>').attr({\n                    action: proxyURL,\n                    method: 'POST',\n                    target: proxyTarget\n                });\n                var data = kendo.antiForgeryTokens();\n                data.fileName = fileName;\n                var parts = dataURI.split(';base64,');\n                data.contentType = parts[0].replace('data:', '');\n                data.base64 = parts[1];\n                for (var name in data) {\n                    if (data.hasOwnProperty(name)) {\n                        $('<input>').attr({\n                            value: data[name],\n                            name: name,\n                            type: 'hidden'\n                        }).appendTo(form);\n                    }\n                }\n                form.appendTo('body').submit().remove();\n            }\n            var fileSaver = document.createElement('a');\n            var downloadAttribute = 'download' in fileSaver && !kendo.support.browser.edge;\n            function saveAsBlob(dataURI, fileName) {\n                var blob = dataURI;\n                if (typeof dataURI == 'string') {\n                    var parts = dataURI.split(';base64,');\n                    var contentType = parts[0];\n                    var base64 = atob(parts[1]);\n                    var array = new Uint8Array(base64.length);\n                    for (var idx = 0; idx < base64.length; idx++) {\n                        array[idx] = base64.charCodeAt(idx);\n                    }\n                    blob = new Blob([array.buffer], { type: contentType });\n                }\n                navigator.msSaveBlob(blob, fileName);\n            }\n            function saveAsDataURI(dataURI, fileName) {\n                if (window.Blob && dataURI instanceof Blob) {\n                    dataURI = URL.createObjectURL(dataURI);\n                }\n                fileSaver.download = fileName;\n                fileSaver.href = dataURI;\n                var e = document.createEvent('MouseEvents');\n                e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n                fileSaver.dispatchEvent(e);\n                setTimeout(function () {\n                    URL.revokeObjectURL(dataURI);\n                });\n            }\n            kendo.saveAs = function (options) {\n                var save = postToProxy;\n                if (!options.forceProxy) {\n                    if (downloadAttribute) {\n                        save = saveAsDataURI;\n                    } else if (navigator.msSaveBlob) {\n                        save = saveAsBlob;\n                    }\n                }\n                save(options.dataURI, options.fileName, options.proxyURL, options.proxyTarget);\n            };\n        }());\n        kendo.proxyModelSetters = function proxyModelSetters(data) {\n            var observable = {};\n            Object.keys(data || {}).forEach(function (property) {\n                Object.defineProperty(observable, property, {\n                    get: function () {\n                        return data[property];\n                    },\n                    set: function (value) {\n                        data[property] = value;\n                        data.dirty = true;\n                    }\n                });\n            });\n            return observable;\n        };\n        (function () {\n            kendo.defaults = kendo.defaults || {};\n            kendo.setDefaults = function (key, value) {\n                var path = key.split('.');\n                var curr = kendo.defaults;\n                key = path.pop();\n                path.forEach(function (part) {\n                    if (curr[part] === undefined) {\n                        curr[part] = {};\n                    }\n                    curr = curr[part];\n                });\n                if (value.constructor === Object) {\n                    curr[key] = deepExtend({}, curr[key], value);\n                } else {\n                    curr[key] = value;\n                }\n            };\n        }());\n    }(jQuery, window));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.router', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'router',\n        name: 'Router',\n        category: 'framework',\n        description: 'The Router class is responsible for tracking the application state and navigating between the application states.',\n        depends: ['core'],\n        hidden: false\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, CHANGE = 'change', BACK = 'back', SAME = 'same', support = kendo.support, location = window.location, history = window.history, CHECK_URL_INTERVAL = 50, BROKEN_BACK_NAV = kendo.support.browser.msie, hashStrip = /^#*/, document = window.document;\n        function absoluteURL(path, pathPrefix) {\n            if (!pathPrefix) {\n                return path;\n            }\n            if (path + '/' === pathPrefix) {\n                path = pathPrefix;\n            }\n            var regEx = new RegExp('^' + pathPrefix, 'i');\n            if (!regEx.test(path)) {\n                path = pathPrefix + '/' + path;\n            }\n            return location.protocol + '//' + (location.host + '/' + path).replace(/\\/\\/+/g, '/');\n        }\n        function hashDelimiter(bang) {\n            return bang ? '#!' : '#';\n        }\n        function locationHash(hashDelimiter) {\n            var href = location.href;\n            if (hashDelimiter === '#!' && href.indexOf('#') > -1 && href.indexOf('#!') < 0) {\n                return null;\n            }\n            return href.split(hashDelimiter)[1] || '';\n        }\n        function stripRoot(root, url) {\n            if (url.indexOf(root) === 0) {\n                return url.substr(root.length).replace(/\\/\\//g, '/');\n            } else {\n                return url;\n            }\n        }\n        var HistoryAdapter = kendo.Class.extend({\n            back: function () {\n                if (BROKEN_BACK_NAV) {\n                    setTimeout(function () {\n                        history.back();\n                    });\n                } else {\n                    history.back();\n                }\n            },\n            forward: function () {\n                if (BROKEN_BACK_NAV) {\n                    setTimeout(function () {\n                        history.forward();\n                    });\n                } else {\n                    history.forward();\n                }\n            },\n            length: function () {\n                return history.length;\n            },\n            replaceLocation: function (url) {\n                location.replace(url);\n            }\n        });\n        var PushStateAdapter = HistoryAdapter.extend({\n            init: function (root) {\n                this.root = root;\n            },\n            navigate: function (to) {\n                history.pushState({}, document.title, absoluteURL(to, this.root));\n            },\n            replace: function (to) {\n                history.replaceState({}, document.title, absoluteURL(to, this.root));\n            },\n            normalize: function (url) {\n                return stripRoot(this.root, url);\n            },\n            current: function () {\n                var current = location.pathname;\n                if (location.search) {\n                    current += location.search;\n                }\n                return stripRoot(this.root, current);\n            },\n            change: function (callback) {\n                $(window).bind('popstate.kendo', callback);\n            },\n            stop: function () {\n                $(window).unbind('popstate.kendo');\n            },\n            normalizeCurrent: function (options) {\n                var fixedUrl, root = options.root, pathname = location.pathname, hash = locationHash(hashDelimiter(options.hashBang));\n                if (root === pathname + '/') {\n                    fixedUrl = root;\n                }\n                if (root === pathname && hash) {\n                    fixedUrl = absoluteURL(hash.replace(hashStrip, ''), root);\n                }\n                if (fixedUrl) {\n                    history.pushState({}, document.title, fixedUrl);\n                }\n            }\n        });\n        function fixHash(url) {\n            return url.replace(/^(#)?/, '#');\n        }\n        function fixBang(url) {\n            return url.replace(/^(#(!)?)?/, '#!');\n        }\n        var HashAdapter = HistoryAdapter.extend({\n            init: function (bang) {\n                this._id = kendo.guid();\n                this.prefix = hashDelimiter(bang);\n                this.fix = bang ? fixBang : fixHash;\n            },\n            navigate: function (to) {\n                location.hash = this.fix(to);\n            },\n            replace: function (to) {\n                this.replaceLocation(this.fix(to));\n            },\n            normalize: function (url) {\n                if (url.indexOf(this.prefix) < 0) {\n                    return url;\n                } else {\n                    return url.split(this.prefix)[1];\n                }\n            },\n            change: function (callback) {\n                if (support.hashChange) {\n                    $(window).on('hashchange.' + this._id, callback);\n                } else {\n                    this._interval = setInterval(callback, CHECK_URL_INTERVAL);\n                }\n            },\n            stop: function () {\n                $(window).off('hashchange.' + this._id);\n                clearInterval(this._interval);\n            },\n            current: function () {\n                return locationHash(this.prefix);\n            },\n            normalizeCurrent: function (options) {\n                var pathname = location.pathname, root = options.root;\n                if (options.pushState && root !== pathname) {\n                    this.replaceLocation(root + this.prefix + stripRoot(root, pathname));\n                    return true;\n                }\n                return false;\n            }\n        });\n        var History = kendo.Observable.extend({\n            start: function (options) {\n                options = options || {};\n                this.bind([\n                    CHANGE,\n                    BACK,\n                    SAME\n                ], options);\n                if (this._started) {\n                    return;\n                }\n                this._started = true;\n                options.root = options.root || '/';\n                var adapter = this.createAdapter(options), current;\n                if (adapter.normalizeCurrent(options)) {\n                    return;\n                }\n                current = adapter.current();\n                $.extend(this, {\n                    adapter: adapter,\n                    root: options.root,\n                    historyLength: adapter.length(),\n                    current: current,\n                    locations: [current]\n                });\n                adapter.change($.proxy(this, '_checkUrl'));\n            },\n            createAdapter: function (options) {\n                return support.pushState && options.pushState ? new PushStateAdapter(options.root) : new HashAdapter(options.hashBang);\n            },\n            stop: function () {\n                if (!this._started) {\n                    return;\n                }\n                this.adapter.stop();\n                this.unbind(CHANGE);\n                this._started = false;\n            },\n            change: function (callback) {\n                this.bind(CHANGE, callback);\n            },\n            replace: function (to, silent) {\n                this._navigate(to, silent, function (adapter) {\n                    adapter.replace(to);\n                    this.locations[this.locations.length - 1] = this.current;\n                });\n            },\n            navigate: function (to, silent) {\n                if (to === '#:back') {\n                    this.backCalled = true;\n                    this.adapter.back();\n                    return;\n                }\n                this._navigate(to, silent, function (adapter) {\n                    adapter.navigate(to);\n                    this.locations.push(this.current);\n                });\n            },\n            _navigate: function (to, silent, callback) {\n                var adapter = this.adapter;\n                to = adapter.normalize(to);\n                if (this.current === to || this.current === decodeURIComponent(to)) {\n                    this.trigger(SAME);\n                    return;\n                }\n                if (!silent) {\n                    if (this.trigger(CHANGE, {\n                            url: to,\n                            decode: false\n                        })) {\n                        return;\n                    }\n                }\n                this.current = to;\n                callback.call(this, adapter);\n                this.historyLength = adapter.length();\n            },\n            _checkUrl: function () {\n                var adapter = this.adapter, current = adapter.current(), newLength = adapter.length(), navigatingInExisting = this.historyLength === newLength, back = current === this.locations[this.locations.length - 2] && navigatingInExisting, backCalled = this.backCalled, prev = this.current;\n                if (current === null || this.current === current || this.current === decodeURIComponent(current)) {\n                    return true;\n                }\n                this.historyLength = newLength;\n                this.backCalled = false;\n                this.current = current;\n                if (back && this.trigger('back', {\n                        url: prev,\n                        to: current\n                    })) {\n                    adapter.forward();\n                    this.current = prev;\n                    return;\n                }\n                if (this.trigger(CHANGE, {\n                        url: current,\n                        backButtonPressed: !backCalled\n                    })) {\n                    if (back) {\n                        adapter.forward();\n                    } else {\n                        adapter.back();\n                        this.historyLength--;\n                    }\n                    this.current = prev;\n                    return;\n                }\n                if (back) {\n                    this.locations.pop();\n                } else {\n                    this.locations.push(current);\n                }\n            }\n        });\n        kendo.History = History;\n        kendo.History.HistoryAdapter = HistoryAdapter;\n        kendo.History.HashAdapter = HashAdapter;\n        kendo.History.PushStateAdapter = PushStateAdapter;\n        kendo.absoluteURL = absoluteURL;\n        kendo.history = new History();\n    }(window.kendo.jQuery));\n    (function () {\n        var kendo = window.kendo, history = kendo.history, Observable = kendo.Observable, INIT = 'init', ROUTE_MISSING = 'routeMissing', CHANGE = 'change', BACK = 'back', SAME = 'same', optionalParam = /\\((.*?)\\)/g, namedParam = /(\\(\\?)?:\\w+/g, splatParam = /\\*\\w+/g, escapeRegExp = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n        function namedParamReplace(match, optional) {\n            return optional ? match : '([^/]+)';\n        }\n        function routeToRegExp(route, ignoreCase) {\n            return new RegExp('^' + route.replace(escapeRegExp, '\\\\$&').replace(optionalParam, '(?:$1)?').replace(namedParam, namedParamReplace).replace(splatParam, '(.*?)') + '$', ignoreCase ? 'i' : '');\n        }\n        function stripUrl(url) {\n            return url.replace(/(\\?.*)|(#.*)/g, '');\n        }\n        var Route = kendo.Class.extend({\n            init: function (route, callback, ignoreCase) {\n                if (!(route instanceof RegExp)) {\n                    route = routeToRegExp(route, ignoreCase);\n                }\n                this.route = route;\n                this._callback = callback;\n            },\n            callback: function (url, back, decode) {\n                var params, idx = 0, length, queryStringParams = kendo.parseQueryStringParams(url);\n                queryStringParams._back = back;\n                url = stripUrl(url);\n                params = this.route.exec(url).slice(1);\n                length = params.length;\n                if (decode) {\n                    for (; idx < length; idx++) {\n                        if (typeof params[idx] !== 'undefined') {\n                            params[idx] = decodeURIComponent(params[idx]);\n                        }\n                    }\n                }\n                params.push(queryStringParams);\n                this._callback.apply(null, params);\n            },\n            worksWith: function (url, back, decode) {\n                if (this.route.test(stripUrl(url))) {\n                    this.callback(url, back, decode);\n                    return true;\n                } else {\n                    return false;\n                }\n            }\n        });\n        var Router = Observable.extend({\n            init: function (options) {\n                if (!options) {\n                    options = {};\n                }\n                Observable.fn.init.call(this);\n                this.routes = [];\n                this.pushState = options.pushState;\n                this.hashBang = options.hashBang;\n                this.root = options.root;\n                this.ignoreCase = options.ignoreCase !== false;\n                this.bind([\n                    INIT,\n                    ROUTE_MISSING,\n                    CHANGE,\n                    SAME,\n                    BACK\n                ], options);\n            },\n            destroy: function () {\n                history.unbind(CHANGE, this._urlChangedProxy);\n                history.unbind(SAME, this._sameProxy);\n                history.unbind(BACK, this._backProxy);\n                this.unbind();\n            },\n            start: function () {\n                var that = this, sameProxy = function () {\n                        that._same();\n                    }, backProxy = function (e) {\n                        that._back(e);\n                    }, urlChangedProxy = function (e) {\n                        that._urlChanged(e);\n                    };\n                history.start({\n                    same: sameProxy,\n                    change: urlChangedProxy,\n                    back: backProxy,\n                    pushState: that.pushState,\n                    hashBang: that.hashBang,\n                    root: that.root\n                });\n                var initEventObject = {\n                    url: history.current || '/',\n                    preventDefault: $.noop\n                };\n                if (!that.trigger(INIT, initEventObject)) {\n                    that._urlChanged(initEventObject);\n                }\n                this._urlChangedProxy = urlChangedProxy;\n                this._backProxy = backProxy;\n            },\n            route: function (route, callback) {\n                this.routes.push(new Route(route, callback, this.ignoreCase));\n            },\n            navigate: function (url, silent) {\n                kendo.history.navigate(url, silent);\n            },\n            replace: function (url, silent) {\n                kendo.history.replace(url, silent);\n            },\n            _back: function (e) {\n                if (this.trigger(BACK, {\n                        url: e.url,\n                        to: e.to\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _same: function () {\n                this.trigger(SAME);\n            },\n            _urlChanged: function (e) {\n                var url = e.url;\n                var decode = !!e.decode;\n                var back = e.backButtonPressed;\n                if (!url) {\n                    url = '/';\n                }\n                if (this.trigger(CHANGE, {\n                        url: e.url,\n                        params: kendo.parseQueryStringParams(e.url),\n                        backButtonPressed: back\n                    })) {\n                    e.preventDefault();\n                    return;\n                }\n                var idx = 0, routes = this.routes, route, length = routes.length;\n                for (; idx < length; idx++) {\n                    route = routes[idx];\n                    if (route.worksWith(url, back, decode)) {\n                        return;\n                    }\n                }\n                if (this.trigger(ROUTE_MISSING, {\n                        url: url,\n                        params: kendo.parseQueryStringParams(url),\n                        backButtonPressed: back\n                    })) {\n                    e.preventDefault();\n                }\n            }\n        });\n        kendo.Router = Router;\n    }());\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.userevents', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'userevents',\n        name: 'User Events',\n        category: 'framework',\n        depends: ['core'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, support = kendo.support, Class = kendo.Class, Observable = kendo.Observable, now = $.now, extend = $.extend, OS = support.mobileOS, invalidZeroEvents = OS && OS.android, DEFAULT_MIN_HOLD = 800, CLICK_DELAY = 300, DEFAULT_THRESHOLD = support.browser.msie ? 5 : 0, PRESS = 'press', HOLD = 'hold', SELECT = 'select', START = 'start', MOVE = 'move', END = 'end', CANCEL = 'cancel', TAP = 'tap', DOUBLETAP = 'doubleTap', RELEASE = 'release', GESTURESTART = 'gesturestart', GESTURECHANGE = 'gesturechange', GESTUREEND = 'gestureend', GESTURETAP = 'gesturetap';\n        var THRESHOLD = {\n            'api': 0,\n            'touch': 0,\n            'mouse': 9,\n            'pointer': 9\n        };\n        var ENABLE_GLOBAL_SURFACE = !support.touch || support.mouseAndTouchPresent;\n        function touchDelta(touch1, touch2) {\n            var x1 = touch1.x.location, y1 = touch1.y.location, x2 = touch2.x.location, y2 = touch2.y.location, dx = x1 - x2, dy = y1 - y2;\n            return {\n                center: {\n                    x: (x1 + x2) / 2,\n                    y: (y1 + y2) / 2\n                },\n                distance: Math.sqrt(dx * dx + dy * dy)\n            };\n        }\n        function getTouches(e) {\n            var touches = [], originalEvent = e.originalEvent, currentTarget = e.currentTarget, idx = 0, length, changedTouches, touch;\n            if (e.api) {\n                touches.push({\n                    id: 2,\n                    event: e,\n                    target: e.target,\n                    currentTarget: e.target,\n                    location: e,\n                    type: 'api'\n                });\n            } else if (e.type.match(/touch/)) {\n                changedTouches = originalEvent ? originalEvent.changedTouches : [];\n                for (length = changedTouches.length; idx < length; idx++) {\n                    touch = changedTouches[idx];\n                    touches.push({\n                        location: touch,\n                        event: e,\n                        target: touch.target,\n                        currentTarget: currentTarget,\n                        id: touch.identifier,\n                        type: 'touch'\n                    });\n                }\n            } else if (support.pointers || support.msPointers) {\n                touches.push({\n                    location: originalEvent,\n                    event: e,\n                    target: e.target,\n                    currentTarget: currentTarget,\n                    id: originalEvent.pointerId,\n                    type: 'pointer'\n                });\n            } else {\n                touches.push({\n                    id: 1,\n                    event: e,\n                    target: e.target,\n                    currentTarget: currentTarget,\n                    location: e,\n                    type: 'mouse'\n                });\n            }\n            return touches;\n        }\n        var TouchAxis = Class.extend({\n            init: function (axis, location) {\n                var that = this;\n                that.axis = axis;\n                that._updateLocationData(location);\n                that.startLocation = that.location;\n                that.velocity = that.delta = 0;\n                that.timeStamp = now();\n            },\n            move: function (location) {\n                var that = this, offset = location['page' + that.axis], timeStamp = now(), timeDelta = timeStamp - that.timeStamp || 1;\n                if (!offset && invalidZeroEvents) {\n                    return;\n                }\n                that.delta = offset - that.location;\n                that._updateLocationData(location);\n                that.initialDelta = offset - that.startLocation;\n                that.velocity = that.delta / timeDelta;\n                that.timeStamp = timeStamp;\n            },\n            _updateLocationData: function (location) {\n                var that = this, axis = that.axis;\n                that.location = location['page' + axis];\n                that.client = location['client' + axis];\n                that.screen = location['screen' + axis];\n            }\n        });\n        var Touch = Class.extend({\n            init: function (userEvents, target, touchInfo) {\n                extend(this, {\n                    x: new TouchAxis('X', touchInfo.location),\n                    y: new TouchAxis('Y', touchInfo.location),\n                    type: touchInfo.type,\n                    useClickAsTap: userEvents.useClickAsTap,\n                    threshold: userEvents.threshold || THRESHOLD[touchInfo.type],\n                    userEvents: userEvents,\n                    target: target,\n                    currentTarget: touchInfo.currentTarget,\n                    initialTouch: touchInfo.target,\n                    id: touchInfo.id,\n                    pressEvent: touchInfo,\n                    _clicks: userEvents._clicks,\n                    supportDoubleTap: userEvents.supportDoubleTap,\n                    _moved: false,\n                    _finished: false\n                });\n            },\n            press: function () {\n                this._holdTimeout = setTimeout($.proxy(this, '_hold'), this.userEvents.minHold);\n                this._trigger(PRESS, this.pressEvent);\n            },\n            _tap: function (touchInfo) {\n                var that = this;\n                that.userEvents._clicks++;\n                if (that.userEvents._clicks == 1) {\n                    that._clickTimeout = setTimeout(function () {\n                        if (that.userEvents._clicks == 1) {\n                            that._trigger(TAP, touchInfo);\n                        } else {\n                            that._trigger(DOUBLETAP, touchInfo);\n                        }\n                        that.userEvents._clicks = 0;\n                    }, CLICK_DELAY);\n                }\n            },\n            _hold: function () {\n                this._trigger(HOLD, this.pressEvent);\n            },\n            move: function (touchInfo) {\n                var that = this;\n                var preventMove = touchInfo.type !== 'api' && that.userEvents._shouldNotMove;\n                if (that._finished || preventMove) {\n                    return;\n                }\n                that.x.move(touchInfo.location);\n                that.y.move(touchInfo.location);\n                if (!that._moved) {\n                    if (that._withinIgnoreThreshold()) {\n                        return;\n                    }\n                    if (!UserEvents.current || UserEvents.current === that.userEvents) {\n                        that._start(touchInfo);\n                    } else {\n                        return that.dispose();\n                    }\n                }\n                if (!that._finished) {\n                    that._trigger(MOVE, touchInfo);\n                }\n            },\n            end: function (touchInfo) {\n                this.endTime = now();\n                if (this._finished) {\n                    return;\n                }\n                this._finished = true;\n                this._trigger(RELEASE, touchInfo);\n                if (this._moved) {\n                    this._trigger(END, touchInfo);\n                } else {\n                    if (!this.useClickAsTap) {\n                        if (this.supportDoubleTap) {\n                            this._tap(touchInfo);\n                        } else {\n                            this._trigger(TAP, touchInfo);\n                        }\n                    }\n                }\n                clearTimeout(this._holdTimeout);\n                this.dispose();\n            },\n            dispose: function () {\n                var userEvents = this.userEvents, activeTouches = userEvents.touches;\n                this._finished = true;\n                this.pressEvent = null;\n                clearTimeout(this._holdTimeout);\n                activeTouches.splice($.inArray(this, activeTouches), 1);\n            },\n            skip: function () {\n                this.dispose();\n            },\n            cancel: function () {\n                this.dispose();\n            },\n            isMoved: function () {\n                return this._moved;\n            },\n            _start: function (touchInfo) {\n                clearTimeout(this._holdTimeout);\n                this.startTime = now();\n                this._moved = true;\n                this._trigger(START, touchInfo);\n            },\n            _trigger: function (name, touchInfo) {\n                var that = this, jQueryEvent = touchInfo.event, data = {\n                        touch: that,\n                        x: that.x,\n                        y: that.y,\n                        target: that.target,\n                        event: jQueryEvent\n                    };\n                if (that.userEvents.notify(name, data)) {\n                    jQueryEvent.preventDefault();\n                }\n            },\n            _withinIgnoreThreshold: function () {\n                var xDelta = this.x.initialDelta, yDelta = this.y.initialDelta;\n                return Math.sqrt(xDelta * xDelta + yDelta * yDelta) <= this.threshold;\n            }\n        });\n        function withEachUpEvent(callback) {\n            var downEvents = kendo.eventMap.up.split(' '), idx = 0, length = downEvents.length;\n            for (; idx < length; idx++) {\n                callback(downEvents[idx]);\n            }\n        }\n        var UserEvents = Observable.extend({\n            init: function (element, options) {\n                var that = this, filter, ns = kendo.guid();\n                options = options || {};\n                filter = that.filter = options.filter;\n                that.threshold = options.threshold || DEFAULT_THRESHOLD;\n                that.minHold = options.minHold || DEFAULT_MIN_HOLD;\n                that.touches = [];\n                that._maxTouches = options.multiTouch ? 2 : 1;\n                that.allowSelection = options.allowSelection;\n                that.captureUpIfMoved = options.captureUpIfMoved;\n                that.useClickAsTap = !options.fastTap && !support.delayedClick();\n                that.eventNS = ns;\n                that._clicks = 0;\n                that.supportDoubleTap = options.supportDoubleTap;\n                element = $(element).handler(that);\n                Observable.fn.init.call(that);\n                extend(that, {\n                    element: element,\n                    surface: options.global && ENABLE_GLOBAL_SURFACE ? $(element[0].ownerDocument.documentElement) : $(options.surface || element),\n                    stopPropagation: options.stopPropagation,\n                    pressed: false\n                });\n                that.surface.handler(that).on(kendo.applyEventMap('move', ns), '_move').on(kendo.applyEventMap('up cancel', ns), '_end');\n                element.on(kendo.applyEventMap('down', ns), filter, '_start');\n                if (that.useClickAsTap) {\n                    element.on(kendo.applyEventMap('click', ns), filter, '_click');\n                }\n                if (support.pointers || support.msPointers) {\n                    if (support.browser.version < 11) {\n                        var defaultAction = 'pinch-zoom double-tap-zoom';\n                        element.css('-ms-touch-action', options.touchAction && options.touchAction != 'none' ? defaultAction + ' ' + options.touchAction : defaultAction);\n                    } else {\n                        element.css('touch-action', options.touchAction || 'none');\n                    }\n                }\n                if (options.preventDragEvent) {\n                    element.on(kendo.applyEventMap('dragstart', ns), kendo.preventDefault);\n                }\n                element.on(kendo.applyEventMap('mousedown', ns), filter, { root: element }, '_select');\n                if (that.captureUpIfMoved && support.eventCapture) {\n                    var surfaceElement = that.surface[0], preventIfMovingProxy = $.proxy(that.preventIfMoving, that);\n                    withEachUpEvent(function (eventName) {\n                        surfaceElement.addEventListener(eventName, preventIfMovingProxy, true);\n                    });\n                }\n                that.bind([\n                    PRESS,\n                    HOLD,\n                    TAP,\n                    DOUBLETAP,\n                    START,\n                    MOVE,\n                    END,\n                    RELEASE,\n                    CANCEL,\n                    GESTURESTART,\n                    GESTURECHANGE,\n                    GESTUREEND,\n                    GESTURETAP,\n                    SELECT\n                ], options);\n            },\n            preventIfMoving: function (e) {\n                if (this._isMoved()) {\n                    e.preventDefault();\n                }\n            },\n            destroy: function () {\n                var that = this;\n                if (that._destroyed) {\n                    return;\n                }\n                that._destroyed = true;\n                if (that.captureUpIfMoved && support.eventCapture) {\n                    var surfaceElement = that.surface[0];\n                    withEachUpEvent(function (eventName) {\n                        surfaceElement.removeEventListener(eventName, that.preventIfMoving);\n                    });\n                }\n                that.element.kendoDestroy(that.eventNS);\n                that.surface.kendoDestroy(that.eventNS);\n                that.element.removeData('handler');\n                that.surface.removeData('handler');\n                that._disposeAll();\n                that.unbind();\n                delete that.surface;\n                delete that.element;\n                delete that.currentTarget;\n            },\n            capture: function () {\n                UserEvents.current = this;\n            },\n            cancel: function () {\n                this._disposeAll();\n                this.trigger(CANCEL);\n            },\n            notify: function (eventName, data) {\n                var that = this, touches = that.touches;\n                if (this._isMultiTouch()) {\n                    switch (eventName) {\n                    case MOVE:\n                        eventName = GESTURECHANGE;\n                        break;\n                    case END:\n                        eventName = GESTUREEND;\n                        break;\n                    case TAP:\n                        eventName = GESTURETAP;\n                        break;\n                    }\n                    extend(data, { touches: touches }, touchDelta(touches[0], touches[1]));\n                }\n                return this.trigger(eventName, extend(data, { type: eventName }));\n            },\n            press: function (x, y, target) {\n                this._apiCall('_start', x, y, target);\n            },\n            move: function (x, y) {\n                this._apiCall('_move', x, y);\n            },\n            end: function (x, y) {\n                this._apiCall('_end', x, y);\n            },\n            _isMultiTouch: function () {\n                return this.touches.length > 1;\n            },\n            _maxTouchesReached: function () {\n                return this.touches.length >= this._maxTouches;\n            },\n            _disposeAll: function () {\n                var touches = this.touches;\n                while (touches.length > 0) {\n                    touches.pop().dispose();\n                }\n            },\n            _isMoved: function () {\n                return $.grep(this.touches, function (touch) {\n                    return touch.isMoved();\n                }).length;\n            },\n            _select: function (e) {\n                if (!this.allowSelection || this.trigger(SELECT, { event: e })) {\n                    e.preventDefault();\n                }\n            },\n            _start: function (e) {\n                var that = this, idx = 0, filter = that.filter, target, touches = getTouches(e), length = touches.length, touch, which = e.which;\n                if (which && which > 1 || that._maxTouchesReached()) {\n                    return;\n                }\n                UserEvents.current = null;\n                that.currentTarget = e.currentTarget;\n                if (that.stopPropagation) {\n                    e.stopPropagation();\n                }\n                for (; idx < length; idx++) {\n                    if (that._maxTouchesReached()) {\n                        break;\n                    }\n                    touch = touches[idx];\n                    if (filter) {\n                        target = $(touch.currentTarget);\n                    } else {\n                        target = that.element;\n                    }\n                    if (!target.length) {\n                        continue;\n                    }\n                    touch = new Touch(that, target, touch);\n                    that.touches.push(touch);\n                    touch.press();\n                    if (that._isMultiTouch()) {\n                        that.notify('gesturestart', {});\n                    }\n                }\n            },\n            _move: function (e) {\n                this._eachTouch('move', e);\n            },\n            _end: function (e) {\n                this._eachTouch('end', e);\n            },\n            _click: function (e) {\n                var data = {\n                    touch: {\n                        initialTouch: e.target,\n                        target: $(e.currentTarget),\n                        endTime: now(),\n                        x: {\n                            location: e.pageX,\n                            client: e.clientX\n                        },\n                        y: {\n                            location: e.pageY,\n                            client: e.clientY\n                        }\n                    },\n                    x: e.pageX,\n                    y: e.pageY,\n                    target: $(e.currentTarget),\n                    event: e,\n                    type: 'tap'\n                };\n                if (this.trigger('tap', data)) {\n                    e.preventDefault();\n                }\n            },\n            _eachTouch: function (methodName, e) {\n                var that = this, dict = {}, touches = getTouches(e), activeTouches = that.touches, idx, touch, touchInfo, matchingTouch;\n                for (idx = 0; idx < activeTouches.length; idx++) {\n                    touch = activeTouches[idx];\n                    dict[touch.id] = touch;\n                }\n                for (idx = 0; idx < touches.length; idx++) {\n                    touchInfo = touches[idx];\n                    matchingTouch = dict[touchInfo.id];\n                    if (matchingTouch) {\n                        matchingTouch[methodName](touchInfo);\n                    }\n                }\n            },\n            _apiCall: function (type, x, y, target) {\n                this[type]({\n                    api: true,\n                    pageX: x,\n                    pageY: y,\n                    clientX: x,\n                    clientY: y,\n                    target: $(target || this.element)[0],\n                    stopPropagation: $.noop,\n                    preventDefault: $.noop\n                });\n            }\n        });\n        UserEvents.defaultThreshold = function (value) {\n            DEFAULT_THRESHOLD = value;\n        };\n        UserEvents.minHold = function (value) {\n            DEFAULT_MIN_HOLD = value;\n        };\n        kendo.getTouches = getTouches;\n        kendo.touchDelta = touchDelta;\n        kendo.UserEvents = UserEvents;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.touch', [\n        'kendo.core',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'touch',\n        name: 'Touch',\n        category: 'mobile',\n        description: 'The kendo Touch widget provides a cross-platform compatible API for handling user-initiated touch events, multi-touch gestures and event sequences (drag, swipe, etc.). ',\n        depends: [\n            'core',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, abs = Math.abs, MAX_DOUBLE_TAP_DISTANCE = 20;\n        var Touch = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element;\n                that.wrapper = element;\n                function eventProxy(name) {\n                    return function (e) {\n                        that._triggerTouch(name, e);\n                    };\n                }\n                function gestureEventProxy(name) {\n                    return function (e) {\n                        that.trigger(name, {\n                            touches: e.touches,\n                            distance: e.distance,\n                            center: e.center,\n                            event: e.event\n                        });\n                    };\n                }\n                that.events = new kendo.UserEvents(element, {\n                    filter: options.filter,\n                    surface: options.surface,\n                    minHold: options.minHold,\n                    multiTouch: options.multiTouch,\n                    allowSelection: true,\n                    fastTap: options.fastTap,\n                    press: eventProxy('touchstart'),\n                    hold: eventProxy('hold'),\n                    tap: proxy(that, '_tap'),\n                    gesturestart: gestureEventProxy('gesturestart'),\n                    gesturechange: gestureEventProxy('gesturechange'),\n                    gestureend: gestureEventProxy('gestureend')\n                });\n                if (options.enableSwipe) {\n                    that.events.bind('start', proxy(that, '_swipestart'));\n                    that.events.bind('move', proxy(that, '_swipemove'));\n                } else {\n                    that.events.bind('start', proxy(that, '_dragstart'));\n                    that.events.bind('move', eventProxy('drag'));\n                    that.events.bind('end', eventProxy('dragend'));\n                }\n                kendo.notify(that);\n            },\n            events: [\n                'touchstart',\n                'dragstart',\n                'drag',\n                'dragend',\n                'tap',\n                'doubletap',\n                'hold',\n                'swipe',\n                'gesturestart',\n                'gesturechange',\n                'gestureend'\n            ],\n            options: {\n                name: 'Touch',\n                surface: null,\n                global: false,\n                fastTap: false,\n                filter: null,\n                multiTouch: false,\n                enableSwipe: false,\n                minXDelta: 30,\n                maxYDelta: 20,\n                maxDuration: 1000,\n                minHold: 800,\n                doubleTapTimeout: 800\n            },\n            cancel: function () {\n                this.events.cancel();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.events.destroy();\n            },\n            _triggerTouch: function (type, e) {\n                if (this.trigger(type, {\n                        touch: e.touch,\n                        event: e.event\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _tap: function (e) {\n                var that = this, lastTap = that.lastTap, touch = e.touch;\n                if (lastTap && touch.endTime - lastTap.endTime < that.options.doubleTapTimeout && kendo.touchDelta(touch, lastTap).distance < MAX_DOUBLE_TAP_DISTANCE) {\n                    that._triggerTouch('doubletap', e);\n                    that.lastTap = null;\n                } else {\n                    that._triggerTouch('tap', e);\n                    that.lastTap = touch;\n                }\n            },\n            _dragstart: function (e) {\n                this._triggerTouch('dragstart', e);\n            },\n            _swipestart: function (e) {\n                if (abs(e.x.velocity) * 2 >= abs(e.y.velocity)) {\n                    e.sender.capture();\n                }\n            },\n            _swipemove: function (e) {\n                var that = this, options = that.options, touch = e.touch, duration = e.event.timeStamp - touch.startTime, direction = touch.x.initialDelta > 0 ? 'right' : 'left';\n                if (abs(touch.x.initialDelta) >= options.minXDelta && abs(touch.y.initialDelta) < options.maxYDelta && duration < options.maxDuration) {\n                    that.trigger('swipe', {\n                        direction: direction,\n                        touch: e.touch\n                    });\n                    touch.cancel();\n                }\n            }\n        });\n        kendo.ui.plugin(Touch);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.data.odata', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'data.odata',\n        name: 'OData',\n        category: 'framework',\n        depends: ['core'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, extend = $.extend, NEWLINE = '\\r\\n', DOUBLELINE = '\\r\\n\\r\\n', isFunction = kendo.isFunction, odataFilters = {\n                eq: 'eq',\n                neq: 'ne',\n                gt: 'gt',\n                gte: 'ge',\n                lt: 'lt',\n                lte: 'le',\n                contains: 'substringof',\n                doesnotcontain: 'substringof',\n                endswith: 'endswith',\n                startswith: 'startswith',\n                isnull: 'eq',\n                isnotnull: 'ne',\n                isnullorempty: 'eq',\n                isnotnullorempty: 'ne',\n                isempty: 'eq',\n                isnotempty: 'ne'\n            }, odataFiltersVersionFour = extend({}, odataFilters, { contains: 'contains' }), mappers = {\n                pageSize: $.noop,\n                page: $.noop,\n                filter: function (params, filter, useVersionFour) {\n                    if (filter) {\n                        filter = toOdataFilter(filter, useVersionFour);\n                        if (filter) {\n                            params.$filter = filter;\n                        }\n                    }\n                },\n                sort: function (params, orderby) {\n                    var expr = $.map(orderby, function (value) {\n                        var order = value.field.replace(/\\./g, '/');\n                        if (value.dir === 'desc') {\n                            order += ' desc';\n                        }\n                        return order;\n                    }).join(',');\n                    if (expr) {\n                        params.$orderby = expr;\n                    }\n                },\n                skip: function (params, skip) {\n                    if (skip) {\n                        params.$skip = skip;\n                    }\n                },\n                take: function (params, take) {\n                    if (take) {\n                        params.$top = take;\n                    }\n                }\n            }, defaultDataType = { read: { dataType: 'jsonp' } };\n        function toOdataFilter(filter, useOdataFour) {\n            var result = [], logic = filter.logic || 'and', idx, length, field, type, format, operator, value, ignoreCase, filters = filter.filters;\n            for (idx = 0, length = filters.length; idx < length; idx++) {\n                filter = filters[idx];\n                field = filter.field;\n                value = filter.value;\n                operator = filter.operator;\n                if (filter.filters) {\n                    filter = toOdataFilter(filter, useOdataFour);\n                } else {\n                    ignoreCase = filter.ignoreCase;\n                    field = field.replace(/\\./g, '/');\n                    filter = odataFilters[operator];\n                    if (useOdataFour) {\n                        filter = odataFiltersVersionFour[operator];\n                    }\n                    if (operator === 'isnullorempty') {\n                        filter = kendo.format('{0} {1} null or {0} {1} \\'\\'', field, filter);\n                    } else if (operator === 'isnotnullorempty') {\n                        filter = kendo.format('{0} {1} null and {0} {1} \\'\\'', field, filter);\n                    } else if (operator === 'isnull' || operator === 'isnotnull') {\n                        filter = kendo.format('{0} {1} null', field, filter);\n                    } else if (operator === 'isempty' || operator === 'isnotempty') {\n                        filter = kendo.format('{0} {1} \\'\\'', field, filter);\n                    } else if (filter && value !== undefined) {\n                        type = $.type(value);\n                        if (type === 'string') {\n                            format = '\\'{1}\\'';\n                            value = value.replace(/'/g, '\\'\\'');\n                            if (ignoreCase === true) {\n                                field = 'tolower(' + field + ')';\n                            }\n                        } else if (type === 'date') {\n                            if (useOdataFour) {\n                                format = '{1:yyyy-MM-ddTHH:mm:ss+00:00}';\n                                value = kendo.timezone.apply(value, 'Etc/UTC');\n                            } else {\n                                format = 'datetime\\'{1:yyyy-MM-ddTHH:mm:ss}\\'';\n                            }\n                        } else {\n                            format = '{1}';\n                        }\n                        if (filter.length > 3) {\n                            if (filter !== 'substringof') {\n                                format = '{0}({2},' + format + ')';\n                            } else {\n                                format = '{0}(' + format + ',{2})';\n                                if (operator === 'doesnotcontain') {\n                                    if (useOdataFour) {\n                                        format = '{0}({2},\\'{1}\\') eq -1';\n                                        filter = 'indexof';\n                                    } else {\n                                        format += ' eq false';\n                                    }\n                                }\n                            }\n                        } else {\n                            format = '{2} {0} ' + format;\n                        }\n                        filter = kendo.format(format, filter, value, field);\n                    }\n                }\n                result.push(filter);\n            }\n            filter = result.join(' ' + logic + ' ');\n            if (result.length > 1) {\n                filter = '(' + filter + ')';\n            }\n            return filter;\n        }\n        function stripMetadata(obj) {\n            for (var name in obj) {\n                if (name.indexOf('@odata') === 0) {\n                    delete obj[name];\n                }\n            }\n        }\n        function hex16() {\n            return Math.floor((1 + Math.random()) * 65536).toString(16).substr(1);\n        }\n        function createBoundary(prefix) {\n            return prefix + hex16() + '-' + hex16() + '-' + hex16();\n        }\n        function createDelimeter(boundary, close) {\n            var result = NEWLINE + '--' + boundary;\n            if (close) {\n                result += '--';\n            }\n            return result;\n        }\n        function createCommand(transport, item, httpVerb, command) {\n            var transportUrl = transport.options[command].url;\n            var commandPrefix = kendo.format('{0} ', httpVerb);\n            if (isFunction(transportUrl)) {\n                return commandPrefix + transportUrl(item);\n            } else {\n                return commandPrefix + transportUrl;\n            }\n        }\n        function getOperationHeader(changeset, changeId) {\n            var header = '';\n            header += createDelimeter(changeset, false);\n            header += NEWLINE + 'Content-Type: application/http';\n            header += NEWLINE + 'Content-Transfer-Encoding: binary';\n            header += NEWLINE + 'Content-ID: ' + changeId;\n            return header;\n        }\n        function getOperationContent(item) {\n            var content = '';\n            content += NEWLINE + 'Content-Type: application/json;odata=minimalmetadata';\n            content += NEWLINE + 'Prefer: return=representation';\n            content += DOUBLELINE + kendo.stringify(item);\n            return content;\n        }\n        function getOperations(collection, changeset, changeId, command, transport, skipContent) {\n            var requestBody = '';\n            for (var i = 0; i < collection.length; i++) {\n                requestBody += getOperationHeader(changeset, changeId);\n                requestBody += DOUBLELINE + createCommand(transport, collection[i], transport.options[command].type, command) + ' HTTP/1.1';\n                if (!skipContent) {\n                    requestBody += getOperationContent(collection[i]);\n                }\n                requestBody += NEWLINE;\n                changeId++;\n            }\n            return requestBody;\n        }\n        function processCollection(colection, boundary, changeset, changeId, transport, command, skipContent) {\n            var requestBody = '';\n            requestBody += getBoundary(boundary, changeset);\n            requestBody += getOperations(colection, changeset, changeId, command, transport, skipContent);\n            requestBody += createDelimeter(changeset, true);\n            requestBody += NEWLINE;\n            return requestBody;\n        }\n        function getBoundary(boundary, changeset) {\n            var requestBody = '';\n            requestBody += '--' + boundary + NEWLINE;\n            requestBody += 'Content-Type: multipart/mixed; boundary=' + changeset + NEWLINE;\n            return requestBody;\n        }\n        function createBatchRequest(transport, colections) {\n            var options = {};\n            var boundary = createBoundary('sf_batch_');\n            var requestBody = '';\n            var changeId = 0;\n            var batchURL = transport.options.batch.url;\n            var changeset = createBoundary('sf_changeset_');\n            options.type = transport.options.batch.type;\n            options.url = isFunction(batchURL) ? batchURL() : batchURL;\n            options.headers = { 'Content-Type': 'multipart/mixed; boundary=' + boundary };\n            if (colections.updated.length) {\n                requestBody += processCollection(colections.updated, boundary, changeset, changeId, transport, 'update', false);\n                changeId += colections.updated.length;\n                changeset = createBoundary('sf_changeset_');\n            }\n            if (colections.destroyed.length) {\n                requestBody += processCollection(colections.destroyed, boundary, changeset, changeId, transport, 'destroy', true);\n                changeId += colections.destroyed.length;\n                changeset = createBoundary('sf_changeset_');\n            }\n            if (colections.created.length) {\n                requestBody += processCollection(colections.created, boundary, changeset, changeId, transport, 'create', false);\n            }\n            requestBody += createDelimeter(boundary, true);\n            options.data = requestBody;\n            return options;\n        }\n        function parseBatchResponse(responseText) {\n            var responseMarkers = responseText.match(/--changesetresponse_[a-z0-9-]+$/gm);\n            var markerIndex = 0;\n            var collections = [];\n            var changeBody;\n            var status;\n            var code;\n            var marker;\n            var jsonModel;\n            collections.push({\n                models: [],\n                passed: true\n            });\n            for (var i = 0; i < responseMarkers.length; i++) {\n                marker = responseMarkers[i];\n                if (marker.lastIndexOf('--', marker.length - 1)) {\n                    if (i < responseMarkers.length - 1) {\n                        collections.push({\n                            models: [],\n                            passed: true\n                        });\n                    }\n                    continue;\n                }\n                if (!markerIndex) {\n                    markerIndex = responseText.indexOf(marker);\n                } else {\n                    markerIndex = responseText.indexOf(marker, markerIndex + marker.length);\n                }\n                changeBody = responseText.substring(markerIndex, responseText.indexOf('--', markerIndex + 1));\n                status = changeBody.match(/^HTTP\\/1\\.\\d (\\d{3}) (.*)$/gm).pop();\n                code = kendo.parseFloat(status.match(/\\d{3}/g).pop());\n                if (code >= 200 && code <= 299) {\n                    jsonModel = changeBody.match(/\\{.*\\}/gm);\n                    if (jsonModel) {\n                        collections[collections.length - 1].models.push(JSON.parse(jsonModel[0]));\n                    }\n                } else {\n                    collections[collections.length - 1].passed = false;\n                }\n            }\n            return collections;\n        }\n        extend(true, kendo.data, {\n            schemas: {\n                odata: {\n                    type: 'json',\n                    data: function (data) {\n                        return data.d.results || [data.d];\n                    },\n                    total: 'd.__count'\n                }\n            },\n            transports: {\n                odata: {\n                    read: {\n                        cache: true,\n                        dataType: 'jsonp',\n                        jsonp: '$callback'\n                    },\n                    update: {\n                        cache: true,\n                        dataType: 'json',\n                        contentType: 'application/json',\n                        type: 'PUT'\n                    },\n                    create: {\n                        cache: true,\n                        dataType: 'json',\n                        contentType: 'application/json',\n                        type: 'POST'\n                    },\n                    destroy: {\n                        cache: true,\n                        dataType: 'json',\n                        type: 'DELETE'\n                    },\n                    parameterMap: function (options, type, useVersionFour) {\n                        var params, value, option, dataType;\n                        options = options || {};\n                        type = type || 'read';\n                        dataType = (this.options || defaultDataType)[type];\n                        dataType = dataType ? dataType.dataType : 'json';\n                        if (type === 'read') {\n                            params = { $inlinecount: 'allpages' };\n                            if (dataType != 'json') {\n                                params.$format = 'json';\n                            }\n                            for (option in options) {\n                                if (mappers[option]) {\n                                    mappers[option](params, options[option], useVersionFour);\n                                } else {\n                                    params[option] = options[option];\n                                }\n                            }\n                        } else {\n                            if (dataType !== 'json') {\n                                throw new Error('Only json dataType can be used for ' + type + ' operation.');\n                            }\n                            if (type !== 'destroy') {\n                                for (option in options) {\n                                    value = options[option];\n                                    if (typeof value === 'number') {\n                                        options[option] = value + '';\n                                    }\n                                }\n                                params = kendo.stringify(options);\n                            }\n                        }\n                        return params;\n                    }\n                }\n            }\n        });\n        extend(true, kendo.data, {\n            schemas: {\n                'odata-v4': {\n                    type: 'json',\n                    data: function (data) {\n                        if ($.isArray(data)) {\n                            for (var i = 0; i < data.length; i++) {\n                                stripMetadata(data[i]);\n                            }\n                            return data;\n                        } else {\n                            data = $.extend({}, data);\n                            stripMetadata(data);\n                            if (data.value) {\n                                return data.value;\n                            }\n                            return [data];\n                        }\n                    },\n                    total: function (data) {\n                        return data['@odata.count'];\n                    }\n                }\n            },\n            transports: {\n                'odata-v4': {\n                    batch: { type: 'POST' },\n                    read: {\n                        cache: true,\n                        dataType: 'json'\n                    },\n                    update: {\n                        cache: true,\n                        dataType: 'json',\n                        contentType: 'application/json;IEEE754Compatible=true',\n                        type: 'PUT'\n                    },\n                    create: {\n                        cache: true,\n                        dataType: 'json',\n                        contentType: 'application/json;IEEE754Compatible=true',\n                        type: 'POST'\n                    },\n                    destroy: {\n                        cache: true,\n                        dataType: 'json',\n                        type: 'DELETE'\n                    },\n                    parameterMap: function (options, type) {\n                        var result = kendo.data.transports.odata.parameterMap(options, type, true);\n                        if (type == 'read') {\n                            result.$count = true;\n                            delete result.$inlinecount;\n                        }\n                        return result;\n                    },\n                    submit: function (e) {\n                        var that = this;\n                        var options = createBatchRequest(that, e.data);\n                        var collections = e.data;\n                        if (!collections.updated.length && !collections.destroyed.length && !collections.created.length) {\n                            return;\n                        }\n                        $.ajax(extend(true, {}, {\n                            success: function (response) {\n                                var responses = parseBatchResponse(response);\n                                var index = 0;\n                                var current;\n                                if (collections.updated.length) {\n                                    current = responses[index];\n                                    if (current.passed) {\n                                        e.success(current.models.length ? current.models : [], 'update');\n                                    }\n                                    index++;\n                                }\n                                if (collections.destroyed.length) {\n                                    current = responses[index];\n                                    if (current.passed) {\n                                        e.success([], 'destroy');\n                                    }\n                                    index++;\n                                }\n                                if (collections.created.length) {\n                                    current = responses[index];\n                                    if (current.passed) {\n                                        e.success(current.models, 'create');\n                                    }\n                                }\n                            },\n                            error: function (response, status, error) {\n                                e.error(response, status, error);\n                            }\n                        }, options));\n                    }\n                }\n            }\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.data.xml', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'data.xml',\n        name: 'XML',\n        category: 'framework',\n        depends: ['core'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, isArray = $.isArray, isPlainObject = $.isPlainObject, map = $.map, each = $.each, extend = $.extend, getter = kendo.getter, Class = kendo.Class;\n        var XmlDataReader = Class.extend({\n            init: function (options) {\n                var that = this, total = options.total, model = options.model, parse = options.parse, errors = options.errors, serialize = options.serialize, data = options.data;\n                if (model) {\n                    if (isPlainObject(model)) {\n                        var base = options.modelBase || kendo.data.Model;\n                        if (model.fields) {\n                            each(model.fields, function (field, value) {\n                                if (isPlainObject(value) && value.field) {\n                                    if (!$.isFunction(value.field)) {\n                                        value = extend(value, { field: that.getter(value.field) });\n                                    }\n                                } else {\n                                    value = { field: that.getter(value) };\n                                }\n                                model.fields[field] = value;\n                            });\n                        }\n                        var id = model.id;\n                        if (id) {\n                            var idField = {};\n                            idField[that.xpathToMember(id, true)] = { field: that.getter(id) };\n                            model.fields = extend(idField, model.fields);\n                            model.id = that.xpathToMember(id);\n                        }\n                        model = base.define(model);\n                    }\n                    that.model = model;\n                }\n                if (total) {\n                    if (typeof total == 'string') {\n                        total = that.getter(total);\n                        that.total = function (data) {\n                            return parseInt(total(data), 10);\n                        };\n                    } else if (typeof total == 'function') {\n                        that.total = total;\n                    }\n                }\n                if (errors) {\n                    if (typeof errors == 'string') {\n                        errors = that.getter(errors);\n                        that.errors = function (data) {\n                            return errors(data) || null;\n                        };\n                    } else if (typeof errors == 'function') {\n                        that.errors = errors;\n                    }\n                }\n                if (data) {\n                    if (typeof data == 'string') {\n                        data = that.xpathToMember(data);\n                        that.data = function (value) {\n                            var result = that.evaluate(value, data), modelInstance;\n                            result = isArray(result) ? result : [result];\n                            if (that.model && model.fields) {\n                                modelInstance = new that.model();\n                                return map(result, function (value) {\n                                    if (value) {\n                                        var record = {}, field;\n                                        for (field in model.fields) {\n                                            record[field] = modelInstance._parse(field, model.fields[field].field(value));\n                                        }\n                                        return record;\n                                    }\n                                });\n                            }\n                            return result;\n                        };\n                    } else if (typeof data == 'function') {\n                        that.data = data;\n                    }\n                }\n                if (typeof parse == 'function') {\n                    var xmlParse = that.parse;\n                    that.parse = function (data) {\n                        var xml = parse.call(that, data);\n                        return xmlParse.call(that, xml);\n                    };\n                }\n                if (typeof serialize == 'function') {\n                    that.serialize = serialize;\n                }\n            },\n            total: function (result) {\n                return this.data(result).length;\n            },\n            errors: function (data) {\n                return data ? data.errors : null;\n            },\n            serialize: function (data) {\n                return data;\n            },\n            parseDOM: function (element) {\n                var result = {}, parsedNode, node, nodeType, nodeName, member, attribute, attributes = element.attributes, attributeCount = attributes.length, idx;\n                for (idx = 0; idx < attributeCount; idx++) {\n                    attribute = attributes[idx];\n                    result['@' + attribute.nodeName] = attribute.nodeValue;\n                }\n                for (node = element.firstChild; node; node = node.nextSibling) {\n                    nodeType = node.nodeType;\n                    if (nodeType === 3 || nodeType === 4) {\n                        result['#text'] = node.nodeValue;\n                    } else if (nodeType === 1) {\n                        parsedNode = this.parseDOM(node);\n                        nodeName = node.nodeName;\n                        member = result[nodeName];\n                        if (isArray(member)) {\n                            member.push(parsedNode);\n                        } else if (member !== undefined) {\n                            member = [\n                                member,\n                                parsedNode\n                            ];\n                        } else {\n                            member = parsedNode;\n                        }\n                        result[nodeName] = member;\n                    }\n                }\n                return result;\n            },\n            evaluate: function (value, expression) {\n                var members = expression.split('.'), member, result, length, intermediateResult, idx;\n                while (member = members.shift()) {\n                    value = value[member];\n                    if (isArray(value)) {\n                        result = [];\n                        expression = members.join('.');\n                        for (idx = 0, length = value.length; idx < length; idx++) {\n                            intermediateResult = this.evaluate(value[idx], expression);\n                            intermediateResult = isArray(intermediateResult) ? intermediateResult : [intermediateResult];\n                            result.push.apply(result, intermediateResult);\n                        }\n                        return result;\n                    }\n                }\n                return value;\n            },\n            parse: function (xml) {\n                var documentElement, tree, result = {};\n                documentElement = xml.documentElement || $.parseXML(xml).documentElement;\n                tree = this.parseDOM(documentElement);\n                result[documentElement.nodeName] = tree;\n                return result;\n            },\n            xpathToMember: function (member, raw) {\n                if (!member) {\n                    return '';\n                }\n                member = member.replace(/^\\//, '').replace(/\\//g, '.');\n                if (member.indexOf('@') >= 0) {\n                    return member.replace(/\\.?(@.*)/, raw ? '$1' : '[\"$1\"]');\n                }\n                if (member.indexOf('text()') >= 0) {\n                    return member.replace(/(\\.?text\\(\\))/, raw ? '#text' : '[\"#text\"]');\n                }\n                return member;\n            },\n            getter: function (member) {\n                return getter(this.xpathToMember(member), true);\n            }\n        });\n        $.extend(true, kendo.data, {\n            XmlDataReader: XmlDataReader,\n            readers: { xml: XmlDataReader }\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.data', [\n        'kendo.core',\n        'kendo.data.odata',\n        'kendo.data.xml'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'data',\n        name: 'Data source',\n        category: 'framework',\n        description: 'Powerful component for using local and remote data.Fully supports CRUD, Sorting, Paging, Filtering, Grouping, and Aggregates.',\n        depends: ['core'],\n        features: [\n            {\n                id: 'data-odata',\n                name: 'OData',\n                description: 'Support for accessing Open Data Protocol (OData) services.',\n                depends: ['data.odata']\n            },\n            {\n                id: 'data-signalr',\n                name: 'SignalR',\n                description: 'Support for binding to SignalR hubs.',\n                depends: ['data.signalr']\n            },\n            {\n                id: 'data-XML',\n                name: 'XML',\n                description: 'Support for binding to XML.',\n                depends: ['data.xml']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var extend = $.extend, proxy = $.proxy, isPlainObject = $.isPlainObject, isEmptyObject = $.isEmptyObject, isArray = $.isArray, grep = $.grep, ajax = $.ajax, map, each = $.each, noop = $.noop, kendo = window.kendo, isFunction = kendo.isFunction, Observable = kendo.Observable, Class = kendo.Class, STRING = 'string', FUNCTION = 'function', ASCENDING = 'asc', CREATE = 'create', READ = 'read', UPDATE = 'update', DESTROY = 'destroy', CHANGE = 'change', SYNC = 'sync', GET = 'get', ERROR = 'error', REQUESTSTART = 'requestStart', PROGRESS = 'progress', REQUESTEND = 'requestEnd', crud = [\n                CREATE,\n                READ,\n                UPDATE,\n                DESTROY\n            ], identity = function (o) {\n                return o;\n            }, getter = kendo.getter, stringify = kendo.stringify, math = Math, push = [].push, join = [].join, pop = [].pop, splice = [].splice, shift = [].shift, slice = [].slice, unshift = [].unshift, toString = {}.toString, stableSort = kendo.support.stableSort, dateRegExp = /^\\/Date\\((.*?)\\)\\/$/;\n        var ObservableArray = Observable.extend({\n            init: function (array, type) {\n                var that = this;\n                that.type = type || ObservableObject;\n                Observable.fn.init.call(that);\n                that.length = array.length;\n                that.wrapAll(array, that);\n            },\n            at: function (index) {\n                return this[index];\n            },\n            toJSON: function (serializeFunctions) {\n                var idx, length = this.length, value, json = new Array(length);\n                for (idx = 0; idx < length; idx++) {\n                    value = this[idx];\n                    if (value instanceof ObservableObject) {\n                        value = value.toJSON(serializeFunctions);\n                    }\n                    json[idx] = value;\n                }\n                return json;\n            },\n            parent: noop,\n            wrapAll: function (source, target) {\n                var that = this, idx, length, parent = function () {\n                        return that;\n                    };\n                target = target || [];\n                for (idx = 0, length = source.length; idx < length; idx++) {\n                    target[idx] = that.wrap(source[idx], parent);\n                }\n                return target;\n            },\n            wrap: function (object, parent) {\n                var that = this, observable;\n                if (object !== null && toString.call(object) === '[object Object]') {\n                    observable = object instanceof that.type || object instanceof Model;\n                    if (!observable) {\n                        object = object instanceof ObservableObject ? object.toJSON() : object;\n                        object = new that.type(object);\n                    }\n                    object.parent = parent;\n                    object.bind(CHANGE, function (e) {\n                        that.trigger(CHANGE, {\n                            field: e.field,\n                            node: e.node,\n                            index: e.index,\n                            items: e.items || [this],\n                            action: e.node ? e.action || 'itemloaded' : 'itemchange'\n                        });\n                    });\n                }\n                return object;\n            },\n            push: function () {\n                var index = this.length, items = this.wrapAll(arguments), result;\n                result = push.apply(this, items);\n                this.trigger(CHANGE, {\n                    action: 'add',\n                    index: index,\n                    items: items\n                });\n                return result;\n            },\n            slice: slice,\n            sort: [].sort,\n            join: join,\n            pop: function () {\n                var length = this.length, result = pop.apply(this);\n                if (length) {\n                    this.trigger(CHANGE, {\n                        action: 'remove',\n                        index: length - 1,\n                        items: [result]\n                    });\n                }\n                return result;\n            },\n            splice: function (index, howMany, item) {\n                var items = this.wrapAll(slice.call(arguments, 2)), result, i, len;\n                result = splice.apply(this, [\n                    index,\n                    howMany\n                ].concat(items));\n                if (result.length) {\n                    this.trigger(CHANGE, {\n                        action: 'remove',\n                        index: index,\n                        items: result\n                    });\n                    for (i = 0, len = result.length; i < len; i++) {\n                        if (result[i] && result[i].children) {\n                            result[i].unbind(CHANGE);\n                        }\n                    }\n                }\n                if (item) {\n                    this.trigger(CHANGE, {\n                        action: 'add',\n                        index: index,\n                        items: items\n                    });\n                }\n                return result;\n            },\n            shift: function () {\n                var length = this.length, result = shift.apply(this);\n                if (length) {\n                    this.trigger(CHANGE, {\n                        action: 'remove',\n                        index: 0,\n                        items: [result]\n                    });\n                }\n                return result;\n            },\n            unshift: function () {\n                var items = this.wrapAll(arguments), result;\n                result = unshift.apply(this, items);\n                this.trigger(CHANGE, {\n                    action: 'add',\n                    index: 0,\n                    items: items\n                });\n                return result;\n            },\n            indexOf: function (item) {\n                var that = this, idx, length;\n                for (idx = 0, length = that.length; idx < length; idx++) {\n                    if (that[idx] === item) {\n                        return idx;\n                    }\n                }\n                return -1;\n            },\n            forEach: function (callback, thisArg) {\n                var idx = 0;\n                var length = this.length;\n                var context = thisArg || window;\n                for (; idx < length; idx++) {\n                    callback.call(context, this[idx], idx, this);\n                }\n            },\n            map: function (callback, thisArg) {\n                var idx = 0;\n                var result = [];\n                var length = this.length;\n                var context = thisArg || window;\n                for (; idx < length; idx++) {\n                    result[idx] = callback.call(context, this[idx], idx, this);\n                }\n                return result;\n            },\n            reduce: function (callback) {\n                var idx = 0, result, length = this.length;\n                if (arguments.length == 2) {\n                    result = arguments[1];\n                } else if (idx < length) {\n                    result = this[idx++];\n                }\n                for (; idx < length; idx++) {\n                    result = callback(result, this[idx], idx, this);\n                }\n                return result;\n            },\n            reduceRight: function (callback) {\n                var idx = this.length - 1, result;\n                if (arguments.length == 2) {\n                    result = arguments[1];\n                } else if (idx > 0) {\n                    result = this[idx--];\n                }\n                for (; idx >= 0; idx--) {\n                    result = callback(result, this[idx], idx, this);\n                }\n                return result;\n            },\n            filter: function (callback, thisArg) {\n                var idx = 0;\n                var result = [];\n                var item;\n                var length = this.length;\n                var context = thisArg || window;\n                for (; idx < length; idx++) {\n                    item = this[idx];\n                    if (callback.call(context, item, idx, this)) {\n                        result[result.length] = item;\n                    }\n                }\n                return result;\n            },\n            find: function (callback, thisArg) {\n                var idx = 0;\n                var item;\n                var length = this.length;\n                var context = thisArg || window;\n                for (; idx < length; idx++) {\n                    item = this[idx];\n                    if (callback.call(context, item, idx, this)) {\n                        return item;\n                    }\n                }\n            },\n            every: function (callback, thisArg) {\n                var idx = 0;\n                var item;\n                var length = this.length;\n                var context = thisArg || window;\n                for (; idx < length; idx++) {\n                    item = this[idx];\n                    if (!callback.call(context, item, idx, this)) {\n                        return false;\n                    }\n                }\n                return true;\n            },\n            some: function (callback, thisArg) {\n                var idx = 0;\n                var item;\n                var length = this.length;\n                var context = thisArg || window;\n                for (; idx < length; idx++) {\n                    item = this[idx];\n                    if (callback.call(context, item, idx, this)) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            remove: function (item) {\n                var idx = this.indexOf(item);\n                if (idx !== -1) {\n                    this.splice(idx, 1);\n                }\n            },\n            empty: function () {\n                this.splice(0, this.length);\n            }\n        });\n        if (typeof Symbol !== 'undefined' && Symbol.iterator && !ObservableArray.prototype[Symbol.iterator]) {\n            ObservableArray.prototype[Symbol.iterator] = [][Symbol.iterator];\n        }\n        var LazyObservableArray = ObservableArray.extend({\n            init: function (data, type, events) {\n                Observable.fn.init.call(this);\n                this.type = type || ObservableObject;\n                if (events) {\n                    this._events = events;\n                }\n                for (var idx = 0; idx < data.length; idx++) {\n                    this[idx] = data[idx];\n                }\n                this.length = idx;\n                this._parent = proxy(function () {\n                    return this;\n                }, this);\n            },\n            at: function (index) {\n                var item = this[index];\n                if (!(item instanceof this.type)) {\n                    item = this[index] = this.wrap(item, this._parent);\n                } else {\n                    item.parent = this._parent;\n                }\n                return item;\n            }\n        });\n        function eventHandler(context, type, field, prefix) {\n            return function (e) {\n                var event = {}, key;\n                for (key in e) {\n                    event[key] = e[key];\n                }\n                if (prefix) {\n                    event.field = field + '.' + e.field;\n                } else {\n                    event.field = field;\n                }\n                if (type == CHANGE && context._notifyChange) {\n                    context._notifyChange(event);\n                }\n                context.trigger(type, event);\n            };\n        }\n        var ObservableObject = Observable.extend({\n            init: function (value) {\n                var that = this, member, field, parent = function () {\n                        return that;\n                    };\n                Observable.fn.init.call(this);\n                this._handlers = {};\n                for (field in value) {\n                    member = value[field];\n                    if (typeof member === 'object' && member && !member.getTime && field.charAt(0) != '_') {\n                        member = that.wrap(member, field, parent);\n                    }\n                    that[field] = member;\n                }\n                that.uid = kendo.guid();\n            },\n            shouldSerialize: function (field, serializeFunctions) {\n                return this.hasOwnProperty(field) && field !== '_handlers' && field !== '_events' && (serializeFunctions && serializeFunctions[field] || typeof this[field] !== FUNCTION) && field !== 'uid';\n            },\n            forEach: function (f) {\n                for (var i in this) {\n                    if (this.shouldSerialize(i)) {\n                        f(this[i], i);\n                    }\n                }\n            },\n            toJSON: function (serializeFunctions) {\n                var result = {}, value, field;\n                for (field in this) {\n                    if (this.shouldSerialize(field, serializeFunctions)) {\n                        value = this[field];\n                        if (value instanceof ObservableObject || value instanceof ObservableArray) {\n                            value = value.toJSON(serializeFunctions);\n                        }\n                        result[field] = value;\n                    }\n                }\n                return result;\n            },\n            get: function (field) {\n                var that = this, result;\n                that.trigger(GET, { field: field });\n                if (field === 'this') {\n                    result = that;\n                } else {\n                    result = kendo.getter(field, true)(that);\n                }\n                return result;\n            },\n            _set: function (field, value) {\n                var that = this;\n                var composite = field.indexOf('.') >= 0;\n                if (composite) {\n                    var paths = field.split('.'), path = '';\n                    while (paths.length > 1) {\n                        path += paths.shift();\n                        var obj = kendo.getter(path, true)(that);\n                        if (obj instanceof ObservableObject) {\n                            obj.set(paths.join('.'), value);\n                            return composite;\n                        }\n                        path += '.';\n                    }\n                }\n                kendo.setter(field)(that, value);\n                return composite;\n            },\n            set: function (field, value) {\n                var that = this, isSetPrevented = false, composite = field.indexOf('.') >= 0, current = kendo.getter(field, true)(that);\n                if (current !== value) {\n                    if (current instanceof Observable && this._handlers[field]) {\n                        if (this._handlers[field].get) {\n                            current.unbind(GET, this._handlers[field].get);\n                        }\n                        current.unbind(CHANGE, this._handlers[field].change);\n                    }\n                    isSetPrevented = that.trigger('set', {\n                        field: field,\n                        value: value\n                    });\n                    if (!isSetPrevented) {\n                        if (!composite) {\n                            value = that.wrap(value, field, function () {\n                                return that;\n                            });\n                        }\n                        if (!that._set(field, value) || field.indexOf('(') >= 0 || field.indexOf('[') >= 0) {\n                            that.trigger(CHANGE, { field: field });\n                        }\n                    }\n                }\n                return isSetPrevented;\n            },\n            parent: noop,\n            wrap: function (object, field, parent) {\n                var that = this;\n                var get;\n                var change;\n                var type = toString.call(object);\n                if (object != null && (type === '[object Object]' || type === '[object Array]')) {\n                    var isObservableArray = object instanceof ObservableArray;\n                    var isDataSource = object instanceof DataSource;\n                    if (type === '[object Object]' && !isDataSource && !isObservableArray) {\n                        if (!(object instanceof ObservableObject)) {\n                            object = new ObservableObject(object);\n                        }\n                        get = eventHandler(that, GET, field, true);\n                        object.bind(GET, get);\n                        change = eventHandler(that, CHANGE, field, true);\n                        object.bind(CHANGE, change);\n                        that._handlers[field] = {\n                            get: get,\n                            change: change\n                        };\n                    } else if (type === '[object Array]' || isObservableArray || isDataSource) {\n                        if (!isObservableArray && !isDataSource) {\n                            object = new ObservableArray(object);\n                        }\n                        change = eventHandler(that, CHANGE, field, false);\n                        object.bind(CHANGE, change);\n                        that._handlers[field] = { change: change };\n                    }\n                    object.parent = parent;\n                }\n                return object;\n            }\n        });\n        function equal(x, y) {\n            if (x === y) {\n                return true;\n            }\n            var xtype = $.type(x), ytype = $.type(y), field;\n            if (xtype !== ytype) {\n                return false;\n            }\n            if (xtype === 'date') {\n                return x.getTime() === y.getTime();\n            }\n            if (xtype !== 'object' && xtype !== 'array') {\n                return false;\n            }\n            for (field in x) {\n                if (!equal(x[field], y[field])) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        var parsers = {\n            'number': function (value) {\n                if (typeof value === STRING && value.toLowerCase() === 'null') {\n                    return null;\n                }\n                return kendo.parseFloat(value);\n            },\n            'date': function (value) {\n                if (typeof value === STRING && value.toLowerCase() === 'null') {\n                    return null;\n                }\n                return kendo.parseDate(value);\n            },\n            'boolean': function (value) {\n                if (typeof value === STRING) {\n                    if (value.toLowerCase() === 'null') {\n                        return null;\n                    } else {\n                        return value.toLowerCase() === 'true';\n                    }\n                }\n                return value != null ? !!value : value;\n            },\n            'string': function (value) {\n                if (typeof value === STRING && value.toLowerCase() === 'null') {\n                    return null;\n                }\n                return value != null ? value + '' : value;\n            },\n            'default': function (value) {\n                return value;\n            }\n        };\n        var defaultValues = {\n            'string': '',\n            'number': 0,\n            'date': new Date(),\n            'boolean': false,\n            'default': ''\n        };\n        function getFieldByName(obj, name) {\n            var field, fieldName;\n            for (fieldName in obj) {\n                field = obj[fieldName];\n                if (isPlainObject(field) && field.field && field.field === name) {\n                    return field;\n                } else if (field === name) {\n                    return field;\n                }\n            }\n            return null;\n        }\n        var Model = ObservableObject.extend({\n            init: function (data) {\n                var that = this;\n                if (!data || $.isEmptyObject(data)) {\n                    data = $.extend({}, that.defaults, data);\n                    if (that._initializers) {\n                        for (var idx = 0; idx < that._initializers.length; idx++) {\n                            var name = that._initializers[idx];\n                            data[name] = that.defaults[name]();\n                        }\n                    }\n                }\n                ObservableObject.fn.init.call(that, data);\n                that.dirty = false;\n                that.dirtyFields = {};\n                if (that.idField) {\n                    that.id = that.get(that.idField);\n                    if (that.id === undefined) {\n                        that.id = that._defaultId;\n                    }\n                }\n            },\n            shouldSerialize: function (field) {\n                return ObservableObject.fn.shouldSerialize.call(this, field) && field !== 'uid' && !(this.idField !== 'id' && field === 'id') && field !== 'dirty' && field !== 'dirtyFields' && field !== '_accessors';\n            },\n            _parse: function (field, value) {\n                var that = this, fieldName = field, fields = that.fields || {}, parse;\n                field = fields[field];\n                if (!field) {\n                    field = getFieldByName(fields, fieldName);\n                }\n                if (field) {\n                    parse = field.parse;\n                    if (!parse && field.type) {\n                        parse = parsers[field.type.toLowerCase()];\n                    }\n                }\n                return parse ? parse(value) : value;\n            },\n            _notifyChange: function (e) {\n                var action = e.action;\n                if (action == 'add' || action == 'remove') {\n                    this.dirty = true;\n                    this.dirtyFields[e.field] = true;\n                }\n            },\n            editable: function (field) {\n                field = (this.fields || {})[field];\n                return field ? field.editable !== false : true;\n            },\n            set: function (field, value) {\n                var that = this;\n                var dirty = that.dirty;\n                if (that.editable(field)) {\n                    value = that._parse(field, value);\n                    if (!equal(value, that.get(field))) {\n                        that.dirty = true;\n                        that.dirtyFields[field] = true;\n                        if (ObservableObject.fn.set.call(that, field, value) && !dirty) {\n                            that.dirty = dirty;\n                            if (!that.dirty) {\n                                that.dirtyFields[field] = false;\n                            }\n                        }\n                    } else {\n                        that.trigger('equalSet', {\n                            field: field,\n                            value: value\n                        });\n                    }\n                }\n            },\n            accept: function (data) {\n                var that = this, parent = function () {\n                        return that;\n                    }, field;\n                for (field in data) {\n                    var value = data[field];\n                    if (field.charAt(0) != '_') {\n                        value = that.wrap(data[field], field, parent);\n                    }\n                    that._set(field, value);\n                }\n                if (that.idField) {\n                    that.id = that.get(that.idField);\n                }\n                that.dirty = false;\n                that.dirtyFields = {};\n            },\n            isNew: function () {\n                return this.id === this._defaultId;\n            }\n        });\n        Model.define = function (base, options) {\n            if (options === undefined) {\n                options = base;\n                base = Model;\n            }\n            var model, proto = extend({ defaults: {} }, options), name, field, type, value, idx, length, fields = {}, originalName, id = proto.id, functionFields = [];\n            if (id) {\n                proto.idField = id;\n            }\n            if (proto.id) {\n                delete proto.id;\n            }\n            if (id) {\n                proto.defaults[id] = proto._defaultId = '';\n            }\n            if (toString.call(proto.fields) === '[object Array]') {\n                for (idx = 0, length = proto.fields.length; idx < length; idx++) {\n                    field = proto.fields[idx];\n                    if (typeof field === STRING) {\n                        fields[field] = {};\n                    } else if (field.field) {\n                        fields[field.field] = field;\n                    }\n                }\n                proto.fields = fields;\n            }\n            for (name in proto.fields) {\n                field = proto.fields[name];\n                type = field.type || 'default';\n                value = null;\n                originalName = name;\n                name = typeof field.field === STRING ? field.field : name;\n                if (!field.nullable) {\n                    value = proto.defaults[originalName !== name ? originalName : name] = field.defaultValue !== undefined ? field.defaultValue : defaultValues[type.toLowerCase()];\n                    if (typeof value === 'function') {\n                        functionFields.push(name);\n                    }\n                }\n                if (options.id === name) {\n                    proto._defaultId = value;\n                }\n                proto.defaults[originalName !== name ? originalName : name] = value;\n                field.parse = field.parse || parsers[type];\n            }\n            if (functionFields.length > 0) {\n                proto._initializers = functionFields;\n            }\n            model = base.extend(proto);\n            model.define = function (options) {\n                return Model.define(model, options);\n            };\n            if (proto.fields) {\n                model.fields = proto.fields;\n                model.idField = proto.idField;\n            }\n            return model;\n        };\n        var Comparer = {\n            selector: function (field) {\n                return isFunction(field) ? field : getter(field);\n            },\n            compare: function (field) {\n                var selector = this.selector(field);\n                return function (a, b) {\n                    a = selector(a);\n                    b = selector(b);\n                    if (a == null && b == null) {\n                        return 0;\n                    }\n                    if (a == null) {\n                        return -1;\n                    }\n                    if (b == null) {\n                        return 1;\n                    }\n                    if (a.localeCompare) {\n                        return a.localeCompare(b);\n                    }\n                    return a > b ? 1 : a < b ? -1 : 0;\n                };\n            },\n            create: function (sort) {\n                var compare = sort.compare || this.compare(sort.field);\n                if (sort.dir == 'desc') {\n                    return function (a, b) {\n                        return compare(b, a, true);\n                    };\n                }\n                return compare;\n            },\n            combine: function (comparers) {\n                return function (a, b) {\n                    var result = comparers[0](a, b), idx, length;\n                    for (idx = 1, length = comparers.length; idx < length; idx++) {\n                        result = result || comparers[idx](a, b);\n                    }\n                    return result;\n                };\n            }\n        };\n        var StableComparer = extend({}, Comparer, {\n            asc: function (field) {\n                var selector = this.selector(field);\n                return function (a, b) {\n                    var valueA = selector(a);\n                    var valueB = selector(b);\n                    if (valueA && valueA.getTime && valueB && valueB.getTime) {\n                        valueA = valueA.getTime();\n                        valueB = valueB.getTime();\n                    }\n                    if (valueA === valueB) {\n                        return a.__position - b.__position;\n                    }\n                    if (valueA == null) {\n                        return -1;\n                    }\n                    if (valueB == null) {\n                        return 1;\n                    }\n                    if (valueA.localeCompare) {\n                        return valueA.localeCompare(valueB);\n                    }\n                    return valueA > valueB ? 1 : -1;\n                };\n            },\n            desc: function (field) {\n                var selector = this.selector(field);\n                return function (a, b) {\n                    var valueA = selector(a);\n                    var valueB = selector(b);\n                    if (valueA && valueA.getTime && valueB && valueB.getTime) {\n                        valueA = valueA.getTime();\n                        valueB = valueB.getTime();\n                    }\n                    if (valueA === valueB) {\n                        return a.__position - b.__position;\n                    }\n                    if (valueA == null) {\n                        return 1;\n                    }\n                    if (valueB == null) {\n                        return -1;\n                    }\n                    if (valueB.localeCompare) {\n                        return valueB.localeCompare(valueA);\n                    }\n                    return valueA < valueB ? 1 : -1;\n                };\n            },\n            create: function (sort) {\n                return this[sort.dir](sort.field);\n            }\n        });\n        map = function (array, callback) {\n            var idx, length = array.length, result = new Array(length);\n            for (idx = 0; idx < length; idx++) {\n                result[idx] = callback(array[idx], idx, array);\n            }\n            return result;\n        };\n        var operators = function () {\n            function quote(str) {\n                if (typeof str == 'string') {\n                    str = str.replace(/[\\r\\n]+/g, '');\n                }\n                return JSON.stringify(str);\n            }\n            function textOp(impl) {\n                return function (a, b, ignore, accentFoldingFiltering) {\n                    b += '';\n                    if (ignore) {\n                        a = '(' + a + ' + \\'\\').toString()' + (accentFoldingFiltering ? '.toLocaleLowerCase(\\'' + accentFoldingFiltering + '\\')' : '.toLowerCase()');\n                        b = accentFoldingFiltering ? b.toLocaleLowerCase(accentFoldingFiltering) : b.toLowerCase();\n                    }\n                    return impl(a, quote(b), ignore);\n                };\n            }\n            function operator(op, a, b, ignore, accentFoldingFiltering) {\n                if (b != null) {\n                    if (typeof b === STRING) {\n                        var date = dateRegExp.exec(b);\n                        if (date) {\n                            b = new Date(+date[1]);\n                        } else if (ignore) {\n                            b = quote(accentFoldingFiltering ? b.toLocaleLowerCase(accentFoldingFiltering) : b.toLowerCase());\n                            a = '((' + a + ' || \\'\\')+\\'\\')' + (accentFoldingFiltering ? '.toLocaleLowerCase(\\'' + accentFoldingFiltering + '\\')' : '.toLowerCase()');\n                        } else {\n                            b = quote(b);\n                        }\n                    }\n                    if (b.getTime) {\n                        a = '(' + a + '&&' + a + '.getTime?' + a + '.getTime():' + a + ')';\n                        b = b.getTime();\n                    }\n                }\n                return a + ' ' + op + ' ' + b;\n            }\n            function getMatchRegexp(pattern) {\n                for (var rx = '/^', esc = false, i = 0; i < pattern.length; ++i) {\n                    var ch = pattern.charAt(i);\n                    if (esc) {\n                        rx += '\\\\' + ch;\n                    } else if (ch == '~') {\n                        esc = true;\n                        continue;\n                    } else if (ch == '*') {\n                        rx += '.*';\n                    } else if (ch == '?') {\n                        rx += '.';\n                    } else if ('.+^$()[]{}|\\\\/\\n\\r\\u2028\\u2029\\xA0'.indexOf(ch) >= 0) {\n                        rx += '\\\\' + ch;\n                    } else {\n                        rx += ch;\n                    }\n                    esc = false;\n                }\n                return rx + '$/';\n            }\n            return {\n                quote: function (value) {\n                    if (value && value.getTime) {\n                        return 'new Date(' + value.getTime() + ')';\n                    }\n                    return quote(value);\n                },\n                eq: function (a, b, ignore, accentFoldingFiltering) {\n                    return operator('==', a, b, ignore, accentFoldingFiltering);\n                },\n                neq: function (a, b, ignore, accentFoldingFiltering) {\n                    return operator('!=', a, b, ignore, accentFoldingFiltering);\n                },\n                gt: function (a, b, ignore) {\n                    return operator('>', a, b, ignore);\n                },\n                gte: function (a, b, ignore) {\n                    return operator('>=', a, b, ignore);\n                },\n                lt: function (a, b, ignore) {\n                    return operator('<', a, b, ignore);\n                },\n                lte: function (a, b, ignore) {\n                    return operator('<=', a, b, ignore);\n                },\n                startswith: textOp(function (a, b) {\n                    return a + '.lastIndexOf(' + b + ', 0) == 0';\n                }),\n                doesnotstartwith: textOp(function (a, b) {\n                    return a + '.lastIndexOf(' + b + ', 0) == -1';\n                }),\n                endswith: textOp(function (a, b) {\n                    var n = b ? b.length - 2 : 0;\n                    return a + '.indexOf(' + b + ', ' + a + '.length - ' + n + ') >= 0';\n                }),\n                doesnotendwith: textOp(function (a, b) {\n                    var n = b ? b.length - 2 : 0;\n                    return a + '.indexOf(' + b + ', ' + a + '.length - ' + n + ') < 0';\n                }),\n                contains: textOp(function (a, b) {\n                    return a + '.indexOf(' + b + ') >= 0';\n                }),\n                doesnotcontain: textOp(function (a, b) {\n                    return a + '.indexOf(' + b + ') == -1';\n                }),\n                matches: textOp(function (a, b) {\n                    b = b.substring(1, b.length - 1);\n                    return getMatchRegexp(b) + '.test(' + a + ')';\n                }),\n                doesnotmatch: textOp(function (a, b) {\n                    b = b.substring(1, b.length - 1);\n                    return '!' + getMatchRegexp(b) + '.test(' + a + ')';\n                }),\n                isempty: function (a) {\n                    return a + ' === \\'\\'';\n                },\n                isnotempty: function (a) {\n                    return a + ' !== \\'\\'';\n                },\n                isnull: function (a) {\n                    return '(' + a + ' == null)';\n                },\n                isnotnull: function (a) {\n                    return '(' + a + ' != null)';\n                },\n                isnullorempty: function (a) {\n                    return '(' + a + ' === null) || (' + a + ' === \\'\\')';\n                },\n                isnotnullorempty: function (a) {\n                    return '(' + a + ' !== null) && (' + a + ' !== \\'\\')';\n                }\n            };\n        }();\n        function Query(data) {\n            this.data = data || [];\n        }\n        Query.filterExpr = function (expression) {\n            var expressions = [], logic = {\n                    and: ' && ',\n                    or: ' || '\n                }, idx, length, filter, expr, fieldFunctions = [], operatorFunctions = [], field, operator, filters = expression.filters;\n            for (idx = 0, length = filters.length; idx < length; idx++) {\n                filter = filters[idx];\n                field = filter.field;\n                operator = filter.operator;\n                if (filter.filters) {\n                    expr = Query.filterExpr(filter);\n                    filter = expr.expression.replace(/__o\\[(\\d+)\\]/g, function (match, index) {\n                        index = +index;\n                        return '__o[' + (operatorFunctions.length + index) + ']';\n                    }).replace(/__f\\[(\\d+)\\]/g, function (match, index) {\n                        index = +index;\n                        return '__f[' + (fieldFunctions.length + index) + ']';\n                    });\n                    operatorFunctions.push.apply(operatorFunctions, expr.operators);\n                    fieldFunctions.push.apply(fieldFunctions, expr.fields);\n                } else {\n                    if (typeof field === FUNCTION) {\n                        expr = '__f[' + fieldFunctions.length + '](d)';\n                        fieldFunctions.push(field);\n                    } else {\n                        expr = kendo.expr(field);\n                    }\n                    if (typeof operator === FUNCTION) {\n                        filter = '__o[' + operatorFunctions.length + '](' + expr + ', ' + operators.quote(filter.value) + ')';\n                        operatorFunctions.push(operator);\n                    } else {\n                        filter = operators[(operator || 'eq').toLowerCase()](expr, filter.value, filter.ignoreCase !== undefined ? filter.ignoreCase : true, expression.accentFoldingFiltering);\n                    }\n                }\n                expressions.push(filter);\n            }\n            return {\n                expression: '(' + expressions.join(logic[expression.logic]) + ')',\n                fields: fieldFunctions,\n                operators: operatorFunctions\n            };\n        };\n        function normalizeSort(field, dir) {\n            if (field) {\n                var descriptor = typeof field === STRING ? {\n                        field: field,\n                        dir: dir\n                    } : field, descriptors = isArray(descriptor) ? descriptor : descriptor !== undefined ? [descriptor] : [];\n                return grep(descriptors, function (d) {\n                    return !!d.dir;\n                });\n            }\n        }\n        function sortFields(sorts, dir) {\n            var sortObject = {};\n            if (sorts) {\n                var descriptor = typeof sorts === STRING ? {\n                        field: sorts,\n                        dir: dir\n                    } : sorts, descriptors = isArray(descriptor) ? descriptor : descriptor !== undefined ? [descriptor] : [];\n                for (var i = 0; i < descriptors.length; i++) {\n                    sortObject[descriptors[i].field] = {\n                        dir: descriptors[i].dir,\n                        index: i + 1\n                    };\n                }\n            }\n            return sortObject;\n        }\n        var operatorMap = {\n            '==': 'eq',\n            equals: 'eq',\n            isequalto: 'eq',\n            equalto: 'eq',\n            equal: 'eq',\n            '!=': 'neq',\n            ne: 'neq',\n            notequals: 'neq',\n            isnotequalto: 'neq',\n            notequalto: 'neq',\n            notequal: 'neq',\n            '<': 'lt',\n            islessthan: 'lt',\n            lessthan: 'lt',\n            less: 'lt',\n            '<=': 'lte',\n            le: 'lte',\n            islessthanorequalto: 'lte',\n            lessthanequal: 'lte',\n            '>': 'gt',\n            isgreaterthan: 'gt',\n            greaterthan: 'gt',\n            greater: 'gt',\n            '>=': 'gte',\n            isgreaterthanorequalto: 'gte',\n            greaterthanequal: 'gte',\n            ge: 'gte',\n            notsubstringof: 'doesnotcontain',\n            isnull: 'isnull',\n            isempty: 'isempty',\n            isnotempty: 'isnotempty'\n        };\n        function normalizeOperator(expression) {\n            var idx, length, filter, operator, filters = expression.filters;\n            if (filters) {\n                for (idx = 0, length = filters.length; idx < length; idx++) {\n                    filter = filters[idx];\n                    operator = filter.operator;\n                    if (operator && typeof operator === STRING) {\n                        filter.operator = operatorMap[operator.toLowerCase()] || operator;\n                    }\n                    normalizeOperator(filter);\n                }\n            }\n        }\n        function normalizeFilter(expression) {\n            if (expression && !isEmptyObject(expression)) {\n                if (isArray(expression) || !expression.filters) {\n                    expression = {\n                        logic: 'and',\n                        filters: isArray(expression) ? expression : [expression]\n                    };\n                }\n                normalizeOperator(expression);\n                return expression;\n            }\n        }\n        Query.normalizeFilter = normalizeFilter;\n        function compareDescriptor(f1, f2) {\n            if (f1.logic || f2.logic) {\n                return false;\n            }\n            return f1.field === f2.field && f1.value === f2.value && f1.operator === f2.operator;\n        }\n        function normalizeDescriptor(filter) {\n            filter = filter || {};\n            if (isEmptyObject(filter)) {\n                return {\n                    logic: 'and',\n                    filters: []\n                };\n            }\n            return normalizeFilter(filter);\n        }\n        function fieldComparer(a, b) {\n            if (b.logic || a.field > b.field) {\n                return 1;\n            } else if (a.field < b.field) {\n                return -1;\n            } else {\n                return 0;\n            }\n        }\n        function compareFilters(expr1, expr2) {\n            expr1 = normalizeDescriptor(expr1);\n            expr2 = normalizeDescriptor(expr2);\n            if (expr1.logic !== expr2.logic) {\n                return false;\n            }\n            var f1, f2;\n            var filters1 = (expr1.filters || []).slice();\n            var filters2 = (expr2.filters || []).slice();\n            if (filters1.length !== filters2.length) {\n                return false;\n            }\n            filters1 = filters1.sort(fieldComparer);\n            filters2 = filters2.sort(fieldComparer);\n            for (var idx = 0; idx < filters1.length; idx++) {\n                f1 = filters1[idx];\n                f2 = filters2[idx];\n                if (f1.logic && f2.logic) {\n                    if (!compareFilters(f1, f2)) {\n                        return false;\n                    }\n                } else if (!compareDescriptor(f1, f2)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        Query.compareFilters = compareFilters;\n        function normalizeAggregate(expressions) {\n            return isArray(expressions) ? expressions : [expressions];\n        }\n        function normalizeGroup(field, dir, compare, skipItemSorting) {\n            var descriptor = typeof field === STRING ? {\n                    field: field,\n                    dir: dir,\n                    compare: compare,\n                    skipItemSorting: skipItemSorting\n                } : field, descriptors = isArray(descriptor) ? descriptor : descriptor !== undefined ? [descriptor] : [];\n            return map(descriptors, function (d) {\n                return {\n                    field: d.field,\n                    dir: d.dir || 'asc',\n                    aggregates: d.aggregates,\n                    compare: d.compare,\n                    skipItemSorting: d.skipItemSorting\n                };\n            });\n        }\n        function normalizeGroupWithoutCompare(field, dir, compare) {\n            var descriptors = normalizeGroup(field, dir, compare);\n            for (var i = 0; i < descriptors.length; i++) {\n                delete descriptors[i].compare;\n            }\n            return descriptors;\n        }\n        function anyGroupDescriptorHasCompare(groupDescriptors) {\n            var descriptors = isArray(groupDescriptors) ? groupDescriptors : [groupDescriptors];\n            for (var i = 0; i < descriptors.length; i++) {\n                if (descriptors[i] && isFunction(descriptors[i].compare)) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        Query.prototype = {\n            toArray: function () {\n                return this.data;\n            },\n            range: function (index, count) {\n                return new Query(this.data.slice(index, index + count));\n            },\n            skip: function (count) {\n                return new Query(this.data.slice(count));\n            },\n            take: function (count) {\n                return new Query(this.data.slice(0, count));\n            },\n            select: function (selector) {\n                return new Query(map(this.data, selector));\n            },\n            order: function (selector, dir, inPlace) {\n                var sort = { dir: dir };\n                if (selector) {\n                    if (selector.compare) {\n                        sort.compare = selector.compare;\n                    } else {\n                        sort.field = selector;\n                    }\n                }\n                if (inPlace) {\n                    return new Query(this.data.sort(Comparer.create(sort)));\n                }\n                return new Query(this.data.slice(0).sort(Comparer.create(sort)));\n            },\n            orderBy: function (selector, inPlace) {\n                return this.order(selector, 'asc', inPlace);\n            },\n            orderByDescending: function (selector, inPlace) {\n                return this.order(selector, 'desc', inPlace);\n            },\n            sort: function (field, dir, comparer, inPlace) {\n                var idx, length, descriptors = normalizeSort(field, dir), comparers = [];\n                comparer = comparer || Comparer;\n                if (descriptors.length) {\n                    for (idx = 0, length = descriptors.length; idx < length; idx++) {\n                        comparers.push(comparer.create(descriptors[idx]));\n                    }\n                    return this.orderBy({ compare: comparer.combine(comparers) }, inPlace);\n                }\n                return this;\n            },\n            filter: function (expressions) {\n                var idx, current, length, compiled, predicate, data = this.data, fields, operators, result = [], filter;\n                expressions = normalizeFilter(expressions);\n                if (!expressions || expressions.filters.length === 0) {\n                    return this;\n                }\n                compiled = Query.filterExpr(expressions);\n                fields = compiled.fields;\n                operators = compiled.operators;\n                predicate = filter = new Function('d, __f, __o', 'return ' + compiled.expression);\n                if (fields.length || operators.length) {\n                    filter = function (d) {\n                        return predicate(d, fields, operators);\n                    };\n                }\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    current = data[idx];\n                    if (filter(current)) {\n                        result.push(current);\n                    }\n                }\n                return new Query(result);\n            },\n            group: function (descriptors, allData) {\n                descriptors = normalizeGroup(descriptors || []);\n                allData = allData || this.data;\n                var that = this, result = new Query(that.data), descriptor;\n                if (descriptors.length > 0) {\n                    descriptor = descriptors[0];\n                    result = result.groupBy(descriptor).select(function (group) {\n                        var data = new Query(allData).filter([{\n                                field: group.field,\n                                operator: 'eq',\n                                value: group.value,\n                                ignoreCase: false\n                            }]);\n                        return {\n                            field: group.field,\n                            value: group.value,\n                            items: descriptors.length > 1 ? new Query(group.items).group(descriptors.slice(1), data.toArray()).toArray() : group.items,\n                            hasSubgroups: descriptors.length > 1,\n                            aggregates: data.aggregate(descriptor.aggregates)\n                        };\n                    });\n                }\n                return result;\n            },\n            groupBy: function (descriptor) {\n                var that = this;\n                if (isEmptyObject(descriptor) || !this.data.length) {\n                    return new Query([]);\n                }\n                var field = descriptor.field, sorted = descriptor.skipItemSorting ? this.data : this._sortForGrouping(field, descriptor.dir || 'asc'), accessor = kendo.accessor(field), item, groupValue = accessor.get(sorted[0], field), group = {\n                        field: field,\n                        value: groupValue,\n                        items: []\n                    }, currentValue, idx, len, result = [group];\n                for (idx = 0, len = sorted.length; idx < len; idx++) {\n                    item = sorted[idx];\n                    currentValue = accessor.get(item, field);\n                    if (!groupValueComparer(groupValue, currentValue)) {\n                        groupValue = currentValue;\n                        group = {\n                            field: field,\n                            value: groupValue,\n                            items: []\n                        };\n                        result.push(group);\n                    }\n                    group.items.push(item);\n                }\n                result = that._sortGroups(result, descriptor);\n                return new Query(result);\n            },\n            _sortForGrouping: function (field, dir) {\n                var idx, length, data = this.data;\n                if (!stableSort) {\n                    for (idx = 0, length = data.length; idx < length; idx++) {\n                        data[idx].__position = idx;\n                    }\n                    data = new Query(data).sort(field, dir, StableComparer).toArray();\n                    for (idx = 0, length = data.length; idx < length; idx++) {\n                        delete data[idx].__position;\n                    }\n                    return data;\n                }\n                return this.sort(field, dir).toArray();\n            },\n            _sortGroups: function (groups, descriptor) {\n                var result = groups;\n                if (descriptor && isFunction(descriptor.compare)) {\n                    result = new Query(result).order({ compare: descriptor.compare }, descriptor.dir || ASCENDING).toArray();\n                }\n                return result;\n            },\n            aggregate: function (aggregates) {\n                var idx, len, result = {}, state = {};\n                if (aggregates && aggregates.length) {\n                    for (idx = 0, len = this.data.length; idx < len; idx++) {\n                        calculateAggregate(result, aggregates, this.data[idx], idx, len, state);\n                    }\n                }\n                return result;\n            }\n        };\n        function groupValueComparer(a, b) {\n            if (a && a.getTime && b && b.getTime) {\n                return a.getTime() === b.getTime();\n            }\n            return a === b;\n        }\n        function calculateAggregate(accumulator, aggregates, item, index, length, state) {\n            aggregates = aggregates || [];\n            var idx, aggr, functionName, len = aggregates.length;\n            for (idx = 0; idx < len; idx++) {\n                aggr = aggregates[idx];\n                functionName = aggr.aggregate;\n                var field = aggr.field;\n                accumulator[field] = accumulator[field] || {};\n                state[field] = state[field] || {};\n                state[field][functionName] = state[field][functionName] || {};\n                accumulator[field][functionName] = functions[functionName.toLowerCase()](accumulator[field][functionName], item, kendo.accessor(field), index, length, state[field][functionName]);\n            }\n        }\n        var functions = {\n            sum: function (accumulator, item, accessor) {\n                var value = accessor.get(item);\n                if (!isNumber(accumulator)) {\n                    accumulator = value;\n                } else if (isNumber(value)) {\n                    accumulator += value;\n                }\n                return accumulator;\n            },\n            count: function (accumulator) {\n                return (accumulator || 0) + 1;\n            },\n            average: function (accumulator, item, accessor, index, length, state) {\n                var value = accessor.get(item);\n                if (state.count === undefined) {\n                    state.count = 0;\n                }\n                if (!isNumber(accumulator)) {\n                    accumulator = value;\n                } else if (isNumber(value)) {\n                    accumulator += value;\n                }\n                if (isNumber(value)) {\n                    state.count++;\n                }\n                if (index == length - 1 && isNumber(accumulator)) {\n                    accumulator = accumulator / state.count;\n                }\n                return accumulator;\n            },\n            max: function (accumulator, item, accessor) {\n                var value = accessor.get(item);\n                if (!isNumber(accumulator) && !isDate(accumulator)) {\n                    accumulator = value;\n                }\n                if (accumulator < value && (isNumber(value) || isDate(value))) {\n                    accumulator = value;\n                }\n                return accumulator;\n            },\n            min: function (accumulator, item, accessor) {\n                var value = accessor.get(item);\n                if (!isNumber(accumulator) && !isDate(accumulator)) {\n                    accumulator = value;\n                }\n                if (accumulator > value && (isNumber(value) || isDate(value))) {\n                    accumulator = value;\n                }\n                return accumulator;\n            }\n        };\n        function isNumber(val) {\n            return typeof val === 'number' && !isNaN(val);\n        }\n        function isDate(val) {\n            return val && val.getTime;\n        }\n        function toJSON(array) {\n            var idx, length = array.length, result = new Array(length);\n            for (idx = 0; idx < length; idx++) {\n                result[idx] = array[idx].toJSON();\n            }\n            return result;\n        }\n        Query.normalizeGroup = normalizeGroup;\n        Query.normalizeSort = normalizeSort;\n        Query.process = function (data, options, inPlace) {\n            options = options || {};\n            var group = options.group;\n            var customGroupSort = anyGroupDescriptorHasCompare(normalizeGroup(group || []));\n            var query = new Query(data), groupDescriptorsWithoutCompare = normalizeGroupWithoutCompare(group || []), normalizedSort = normalizeSort(options.sort || []), sort = customGroupSort ? normalizedSort : groupDescriptorsWithoutCompare.concat(normalizedSort), groupDescriptorsWithoutSort, total, filterCallback = options.filterCallback, filter = options.filter, skip = options.skip, take = options.take;\n            if (sort && inPlace) {\n                query = query.sort(sort, undefined, undefined, inPlace);\n            }\n            if (filter) {\n                query = query.filter(filter);\n                if (filterCallback) {\n                    query = filterCallback(query);\n                }\n                total = query.toArray().length;\n            }\n            if (sort) {\n                if (!inPlace) {\n                    query = query.sort(sort);\n                }\n                if (group) {\n                    data = query.toArray();\n                }\n            }\n            if (customGroupSort) {\n                query = query.group(group, data);\n                if (skip !== undefined && take !== undefined) {\n                    query = new Query(flatGroups(query.toArray())).range(skip, take);\n                    groupDescriptorsWithoutSort = map(groupDescriptorsWithoutCompare, function (groupDescriptor) {\n                        return extend({}, groupDescriptor, { skipItemSorting: true });\n                    });\n                    query = query.group(groupDescriptorsWithoutSort, data);\n                }\n            } else {\n                if (skip !== undefined && take !== undefined) {\n                    query = query.range(skip, take);\n                }\n                if (group) {\n                    query = query.group(group, data);\n                }\n            }\n            return {\n                total: total,\n                data: query.toArray()\n            };\n        };\n        var LocalTransport = Class.extend({\n            init: function (options) {\n                this.data = options.data;\n            },\n            read: function (options) {\n                options.success(this.data);\n            },\n            update: function (options) {\n                options.success(options.data);\n            },\n            create: function (options) {\n                options.success(options.data);\n            },\n            destroy: function (options) {\n                options.success(options.data);\n            }\n        });\n        var RemoteTransport = Class.extend({\n            init: function (options) {\n                var that = this, parameterMap;\n                options = that.options = extend({}, that.options, options);\n                each(crud, function (index, type) {\n                    if (typeof options[type] === STRING) {\n                        options[type] = { url: options[type] };\n                    }\n                });\n                that.cache = options.cache ? Cache.create(options.cache) : {\n                    find: noop,\n                    add: noop\n                };\n                parameterMap = options.parameterMap;\n                if (options.submit) {\n                    that.submit = options.submit;\n                }\n                if (isFunction(options.push)) {\n                    that.push = options.push;\n                }\n                if (!that.push) {\n                    that.push = identity;\n                }\n                that.parameterMap = isFunction(parameterMap) ? parameterMap : function (options) {\n                    var result = {};\n                    each(options, function (option, value) {\n                        if (option in parameterMap) {\n                            option = parameterMap[option];\n                            if (isPlainObject(option)) {\n                                value = option.value(value);\n                                option = option.key;\n                            }\n                        }\n                        result[option] = value;\n                    });\n                    return result;\n                };\n            },\n            options: { parameterMap: identity },\n            create: function (options) {\n                return ajax(this.setup(options, CREATE));\n            },\n            read: function (options) {\n                var that = this, success, error, result, cache = that.cache;\n                options = that.setup(options, READ);\n                success = options.success || noop;\n                error = options.error || noop;\n                result = cache.find(options.data);\n                if (result !== undefined) {\n                    success(result);\n                } else {\n                    options.success = function (result) {\n                        cache.add(options.data, result);\n                        success(result);\n                    };\n                    $.ajax(options);\n                }\n            },\n            update: function (options) {\n                return ajax(this.setup(options, UPDATE));\n            },\n            destroy: function (options) {\n                return ajax(this.setup(options, DESTROY));\n            },\n            setup: function (options, type) {\n                options = options || {};\n                var that = this, parameters, operation = that.options[type], data = isFunction(operation.data) ? operation.data(options.data) : operation.data;\n                options = extend(true, {}, operation, options);\n                parameters = extend(true, {}, data, options.data);\n                options.data = that.parameterMap(parameters, type);\n                if (isFunction(options.url)) {\n                    options.url = options.url(parameters);\n                }\n                return options;\n            }\n        });\n        var Cache = Class.extend({\n            init: function () {\n                this._store = {};\n            },\n            add: function (key, data) {\n                if (key !== undefined) {\n                    this._store[stringify(key)] = data;\n                }\n            },\n            find: function (key) {\n                return this._store[stringify(key)];\n            },\n            clear: function () {\n                this._store = {};\n            },\n            remove: function (key) {\n                delete this._store[stringify(key)];\n            }\n        });\n        Cache.create = function (options) {\n            var store = {\n                'inmemory': function () {\n                    return new Cache();\n                }\n            };\n            if (isPlainObject(options) && isFunction(options.find)) {\n                return options;\n            }\n            if (options === true) {\n                return new Cache();\n            }\n            return store[options]();\n        };\n        function serializeRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n            var record, getter, originalName, idx, setters = {}, length;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                record = data[idx];\n                for (getter in getters) {\n                    originalName = fieldNames[getter];\n                    if (originalName && originalName !== getter) {\n                        if (!setters[originalName]) {\n                            setters[originalName] = kendo.setter(originalName);\n                        }\n                        setters[originalName](record, getters[getter](record));\n                        delete record[getter];\n                    }\n                }\n            }\n        }\n        function convertRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n            var record, getter, originalName, idx, length;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                record = data[idx];\n                for (getter in getters) {\n                    record[getter] = modelInstance._parse(getter, getters[getter](record));\n                    originalName = fieldNames[getter];\n                    if (originalName && originalName !== getter) {\n                        delete record[originalName];\n                    }\n                }\n            }\n        }\n        function convertGroup(data, getters, modelInstance, originalFieldNames, fieldNames) {\n            var record, idx, fieldName, length;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                record = data[idx];\n                fieldName = originalFieldNames[record.field];\n                if (fieldName && fieldName != record.field) {\n                    record.field = fieldName;\n                }\n                record.value = modelInstance._parse(record.field, record.value);\n                if (record.hasSubgroups) {\n                    convertGroup(record.items, getters, modelInstance, originalFieldNames, fieldNames);\n                } else {\n                    convertRecords(record.items, getters, modelInstance, originalFieldNames, fieldNames);\n                }\n            }\n        }\n        function wrapDataAccess(originalFunction, model, converter, getters, originalFieldNames, fieldNames) {\n            return function (data) {\n                data = originalFunction(data);\n                return wrapDataAccessBase(model, converter, getters, originalFieldNames, fieldNames)(data);\n            };\n        }\n        function wrapDataAccessBase(model, converter, getters, originalFieldNames, fieldNames) {\n            return function (data) {\n                if (data && !isEmptyObject(getters)) {\n                    if (toString.call(data) !== '[object Array]' && !(data instanceof ObservableArray)) {\n                        data = [data];\n                    }\n                    converter(data, getters, new model(), originalFieldNames, fieldNames);\n                }\n                return data || [];\n            };\n        }\n        var DataReader = Class.extend({\n            init: function (schema) {\n                var that = this, member, get, model, base;\n                schema = schema || {};\n                for (member in schema) {\n                    get = schema[member];\n                    that[member] = typeof get === STRING ? getter(get) : get;\n                }\n                base = schema.modelBase || Model;\n                if (isPlainObject(that.model)) {\n                    that.model = model = base.define(that.model);\n                }\n                var dataFunction = proxy(that.data, that);\n                that._dataAccessFunction = dataFunction;\n                if (that.model) {\n                    var groupsFunction = proxy(that.groups, that), serializeFunction = proxy(that.serialize, that), originalFieldNames = {}, getters = {}, serializeGetters = {}, fieldNames = {}, shouldSerialize = false, fieldName, name;\n                    model = that.model;\n                    if (model.fields) {\n                        each(model.fields, function (field, value) {\n                            var fromName;\n                            fieldName = field;\n                            if (isPlainObject(value) && value.field) {\n                                fieldName = value.field;\n                            } else if (typeof value === STRING) {\n                                fieldName = value;\n                            }\n                            if (isPlainObject(value) && value.from) {\n                                fromName = value.from;\n                            }\n                            shouldSerialize = shouldSerialize || fromName && fromName !== field || fieldName !== field;\n                            name = fromName || fieldName;\n                            getters[field] = name.indexOf('.') !== -1 ? getter(name, true) : getter(name);\n                            serializeGetters[field] = getter(field);\n                            originalFieldNames[fromName || fieldName] = field;\n                            fieldNames[field] = fromName || fieldName;\n                        });\n                        if (!schema.serialize && shouldSerialize) {\n                            that.serialize = wrapDataAccess(serializeFunction, model, serializeRecords, serializeGetters, originalFieldNames, fieldNames);\n                        }\n                    }\n                    that._dataAccessFunction = dataFunction;\n                    that._wrapDataAccessBase = wrapDataAccessBase(model, convertRecords, getters, originalFieldNames, fieldNames);\n                    that.data = wrapDataAccess(dataFunction, model, convertRecords, getters, originalFieldNames, fieldNames);\n                    that.groups = wrapDataAccess(groupsFunction, model, convertGroup, getters, originalFieldNames, fieldNames);\n                }\n            },\n            errors: function (data) {\n                return data ? data.errors : null;\n            },\n            parse: identity,\n            data: identity,\n            total: function (data) {\n                return data.length;\n            },\n            groups: identity,\n            aggregates: function () {\n                return {};\n            },\n            serialize: function (data) {\n                return data;\n            }\n        });\n        function fillLastGroup(originalGroup, newGroup) {\n            var currOriginal;\n            var currentNew;\n            if (newGroup.items && newGroup.items.length) {\n                for (var i = 0; i < newGroup.items.length; i++) {\n                    currOriginal = originalGroup.items[i];\n                    currentNew = newGroup.items[i];\n                    if (currOriginal && currentNew) {\n                        if (currOriginal.hasSubgroups) {\n                            fillLastGroup(currOriginal, currentNew);\n                        } else if (currOriginal.field && currOriginal.value == currentNew.value) {\n                            currOriginal.items.push.apply(currOriginal.items, currentNew.items);\n                        } else {\n                            originalGroup.items.push.apply(originalGroup.items, [currentNew]);\n                        }\n                    } else if (currentNew) {\n                        originalGroup.items.push.apply(originalGroup.items, [currentNew]);\n                    }\n                }\n            }\n        }\n        function mergeGroups(target, dest, skip, take) {\n            var group, idx = 0, items;\n            while (dest.length && take) {\n                group = dest[idx];\n                items = group.items;\n                var length = items.length;\n                if (target && target.field === group.field && target.value === group.value) {\n                    if (target.hasSubgroups && target.items.length) {\n                        mergeGroups(target.items[target.items.length - 1], group.items, skip, take);\n                    } else {\n                        items = items.slice(skip, skip + take);\n                        target.items = target.items.concat(items);\n                    }\n                    dest.splice(idx--, 1);\n                } else if (group.hasSubgroups && items.length) {\n                    mergeGroups(group, items, skip, take);\n                    if (!group.items.length) {\n                        dest.splice(idx--, 1);\n                    }\n                } else {\n                    items = items.slice(skip, skip + take);\n                    group.items = items;\n                    if (!group.items.length) {\n                        dest.splice(idx--, 1);\n                    }\n                }\n                if (items.length === 0) {\n                    skip -= length;\n                } else {\n                    skip = 0;\n                    take -= items.length;\n                }\n                if (++idx >= dest.length) {\n                    break;\n                }\n            }\n            if (idx < dest.length) {\n                dest.splice(idx, dest.length - idx);\n            }\n        }\n        function flatGroups(groups, indexFunction) {\n            var result = [];\n            var groupsLength = (groups || []).length;\n            var group;\n            var items;\n            var indexFn = isFunction(indexFunction) ? indexFunction : function (array, index) {\n                return array[index];\n            };\n            for (var groupIndex = 0; groupIndex < groupsLength; groupIndex++) {\n                group = indexFn(groups, groupIndex);\n                if (group.hasSubgroups) {\n                    result = result.concat(flatGroups(group.items));\n                } else {\n                    items = group.items;\n                    for (var itemIndex = 0; itemIndex < items.length; itemIndex++) {\n                        result.push(indexFn(items, itemIndex));\n                    }\n                }\n            }\n            return result;\n        }\n        function flattenGroups(data) {\n            var idx, result = [], length, items, itemIndex;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                var group = data.at(idx);\n                if (group.hasSubgroups) {\n                    result = result.concat(flattenGroups(group.items));\n                } else {\n                    items = group.items;\n                    for (itemIndex = 0; itemIndex < items.length; itemIndex++) {\n                        result.push(items.at(itemIndex));\n                    }\n                }\n            }\n            return result;\n        }\n        function wrapGroupItems(data, model) {\n            var idx, length, group;\n            if (model) {\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    group = data.at(idx);\n                    if (group.hasSubgroups) {\n                        wrapGroupItems(group.items, model);\n                    } else {\n                        group.items = new LazyObservableArray(group.items, model, group.items._events);\n                    }\n                }\n            }\n        }\n        function eachGroupItems(data, func) {\n            for (var idx = 0; idx < data.length; idx++) {\n                if (data[idx].hasSubgroups) {\n                    if (eachGroupItems(data[idx].items, func)) {\n                        return true;\n                    }\n                } else if (func(data[idx].items, data[idx])) {\n                    return true;\n                }\n            }\n        }\n        function replaceInRanges(ranges, data, item, observable) {\n            for (var idx = 0; idx < ranges.length; idx++) {\n                if (ranges[idx].data === data) {\n                    break;\n                }\n                if (replaceInRange(ranges[idx].data, item, observable)) {\n                    break;\n                }\n            }\n        }\n        function replaceInRange(items, item, observable) {\n            for (var idx = 0, length = items.length; idx < length; idx++) {\n                if (items[idx] && items[idx].hasSubgroups) {\n                    return replaceInRange(items[idx].items, item, observable);\n                } else if (items[idx] === item || items[idx] === observable) {\n                    items[idx] = observable;\n                    return true;\n                }\n            }\n        }\n        function replaceWithObservable(view, data, ranges, type, serverGrouping) {\n            for (var viewIndex = 0, length = view.length; viewIndex < length; viewIndex++) {\n                var item = view[viewIndex];\n                if (!item || item instanceof type) {\n                    continue;\n                }\n                if (item.hasSubgroups !== undefined && !serverGrouping) {\n                    replaceWithObservable(item.items, data, ranges, type, serverGrouping);\n                } else {\n                    for (var idx = 0; idx < data.length; idx++) {\n                        if (data[idx] === item) {\n                            view[viewIndex] = data.at(idx);\n                            replaceInRanges(ranges, data, item, view[viewIndex]);\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n        function removeModel(data, model) {\n            var length = data.length;\n            var dataItem;\n            var idx;\n            for (idx = 0; idx < length; idx++) {\n                dataItem = data[idx];\n                if (dataItem.uid && dataItem.uid == model.uid) {\n                    data.splice(idx, 1);\n                    return dataItem;\n                }\n            }\n        }\n        function indexOfPristineModel(data, model) {\n            if (model) {\n                return indexOf(data, function (item) {\n                    return item.uid && item.uid == model.uid || item[model.idField] === model.id && model.id !== model._defaultId;\n                });\n            }\n            return -1;\n        }\n        function indexOfModel(data, model) {\n            if (model) {\n                return indexOf(data, function (item) {\n                    return item.uid == model.uid;\n                });\n            }\n            return -1;\n        }\n        function indexOf(data, comparer) {\n            var idx, length;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                if (comparer(data[idx])) {\n                    return idx;\n                }\n            }\n            return -1;\n        }\n        function fieldNameFromModel(fields, name) {\n            if (fields && !isEmptyObject(fields)) {\n                var descriptor = fields[name];\n                var fieldName;\n                if (isPlainObject(descriptor)) {\n                    fieldName = descriptor.from || descriptor.field || name;\n                } else {\n                    fieldName = fields[name] || name;\n                }\n                if (isFunction(fieldName)) {\n                    return name;\n                }\n                return fieldName;\n            }\n            return name;\n        }\n        function convertFilterDescriptorsField(descriptor, model) {\n            var idx, length, target = {};\n            for (var field in descriptor) {\n                if (field !== 'filters') {\n                    target[field] = descriptor[field];\n                }\n            }\n            if (descriptor.filters) {\n                target.filters = [];\n                for (idx = 0, length = descriptor.filters.length; idx < length; idx++) {\n                    target.filters[idx] = convertFilterDescriptorsField(descriptor.filters[idx], model);\n                }\n            } else {\n                target.field = fieldNameFromModel(model.fields, target.field);\n            }\n            return target;\n        }\n        function convertDescriptorsField(descriptors, model) {\n            var idx, length, result = [], target, descriptor;\n            for (idx = 0, length = descriptors.length; idx < length; idx++) {\n                target = {};\n                descriptor = descriptors[idx];\n                for (var field in descriptor) {\n                    target[field] = descriptor[field];\n                }\n                target.field = fieldNameFromModel(model.fields, target.field);\n                if (target.aggregates && isArray(target.aggregates)) {\n                    target.aggregates = convertDescriptorsField(target.aggregates, model);\n                }\n                result.push(target);\n            }\n            return result;\n        }\n        var DataSource = Observable.extend({\n            init: function (options) {\n                var that = this, model, data;\n                if (options) {\n                    data = options.data;\n                }\n                options = that.options = extend({}, that.options, options);\n                that._map = {};\n                that._prefetch = {};\n                that._data = [];\n                that._pristineData = [];\n                that._ranges = [];\n                that._view = [];\n                that._pristineTotal = 0;\n                that._destroyed = [];\n                that._pageSize = options.pageSize;\n                that._page = options.page || (options.pageSize ? 1 : undefined);\n                that._sort = normalizeSort(options.sort);\n                that._filter = normalizeFilter(options.filter);\n                that._group = normalizeGroup(options.group);\n                that._aggregate = options.aggregate;\n                that._total = options.total;\n                that._shouldDetachObservableParents = true;\n                Observable.fn.init.call(that);\n                that.transport = Transport.create(options, data, that);\n                if (isFunction(that.transport.push)) {\n                    that.transport.push({\n                        pushCreate: proxy(that._pushCreate, that),\n                        pushUpdate: proxy(that._pushUpdate, that),\n                        pushDestroy: proxy(that._pushDestroy, that)\n                    });\n                }\n                if (options.offlineStorage != null) {\n                    if (typeof options.offlineStorage == 'string') {\n                        var key = options.offlineStorage;\n                        that._storage = {\n                            getItem: function () {\n                                return JSON.parse(localStorage.getItem(key));\n                            },\n                            setItem: function (item) {\n                                localStorage.setItem(key, stringify(that.reader.serialize(item)));\n                            }\n                        };\n                    } else {\n                        that._storage = options.offlineStorage;\n                    }\n                }\n                that.reader = new kendo.data.readers[options.schema.type || 'json'](options.schema);\n                model = that.reader.model || {};\n                that._detachObservableParents();\n                that._data = that._observe(that._data);\n                that._online = true;\n                that.bind([\n                    'push',\n                    ERROR,\n                    CHANGE,\n                    REQUESTSTART,\n                    SYNC,\n                    REQUESTEND,\n                    PROGRESS\n                ], options);\n            },\n            options: {\n                data: null,\n                schema: { modelBase: Model },\n                offlineStorage: null,\n                serverSorting: false,\n                serverPaging: false,\n                serverFiltering: false,\n                serverGrouping: false,\n                serverAggregates: false,\n                batch: false,\n                inPlaceSort: false\n            },\n            clone: function () {\n                return this;\n            },\n            online: function (value) {\n                if (value !== undefined) {\n                    if (this._online != value) {\n                        this._online = value;\n                        if (value) {\n                            return this.sync();\n                        }\n                    }\n                    return $.Deferred().resolve().promise();\n                } else {\n                    return this._online;\n                }\n            },\n            offlineData: function (state) {\n                if (this.options.offlineStorage == null) {\n                    return null;\n                }\n                if (state !== undefined) {\n                    return this._storage.setItem(state);\n                }\n                return this._storage.getItem() || [];\n            },\n            _isServerGrouped: function () {\n                var group = this.group() || [];\n                return this.options.serverGrouping && group.length;\n            },\n            _pushCreate: function (result) {\n                this._push(result, 'pushCreate');\n            },\n            _pushUpdate: function (result) {\n                this._push(result, 'pushUpdate');\n            },\n            _pushDestroy: function (result) {\n                this._push(result, 'pushDestroy');\n            },\n            _push: function (result, operation) {\n                var data = this._readData(result);\n                if (!data) {\n                    data = result;\n                }\n                this[operation](data);\n            },\n            _flatData: function (data, skip) {\n                if (data) {\n                    if (this._isServerGrouped()) {\n                        return flattenGroups(data);\n                    }\n                    if (!skip) {\n                        for (var idx = 0; idx < data.length; idx++) {\n                            data.at(idx);\n                        }\n                    }\n                }\n                return data;\n            },\n            parent: noop,\n            get: function (id) {\n                var idx, length, data = this._flatData(this._data, this.options.useRanges);\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].id == id) {\n                        return data[idx];\n                    }\n                }\n            },\n            getByUid: function (id) {\n                return this._getByUid(id, this._data);\n            },\n            _getByUid: function (id, dataItems) {\n                var idx, length, data = this._flatData(dataItems, this.options.useRanges);\n                if (!data) {\n                    return;\n                }\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].uid == id) {\n                        return data[idx];\n                    }\n                }\n            },\n            indexOf: function (model) {\n                return indexOfModel(this._data, model);\n            },\n            at: function (index) {\n                return this._data.at(index);\n            },\n            data: function (value) {\n                var that = this;\n                if (value !== undefined) {\n                    that._detachObservableParents();\n                    that._data = this._observe(value);\n                    that._pristineData = value.slice(0);\n                    that._storeData();\n                    that._ranges = [];\n                    that.trigger('reset');\n                    that._addRange(that._data);\n                    that._total = that._data.length;\n                    that._pristineTotal = that._total;\n                    that._process(that._data);\n                } else {\n                    if (that._data) {\n                        for (var idx = 0; idx < that._data.length; idx++) {\n                            that._data.at(idx);\n                        }\n                    }\n                    return that._data;\n                }\n            },\n            view: function (value) {\n                if (value === undefined) {\n                    return this._view;\n                } else {\n                    this._view = this._observeView(value);\n                }\n            },\n            _observeView: function (data) {\n                var that = this;\n                replaceWithObservable(data, that._data, that._ranges, that.reader.model || ObservableObject, that._isServerGrouped());\n                var view = new LazyObservableArray(data, that.reader.model);\n                view.parent = function () {\n                    return that.parent();\n                };\n                return view;\n            },\n            flatView: function () {\n                var groups = this.group() || [];\n                if (groups.length) {\n                    return flattenGroups(this._view);\n                } else {\n                    return this._view;\n                }\n            },\n            add: function (model) {\n                return this.insert(this._data.length, model);\n            },\n            _createNewModel: function (model) {\n                if (this.reader.model) {\n                    return new this.reader.model(model);\n                }\n                if (model instanceof ObservableObject) {\n                    return model;\n                }\n                return new ObservableObject(model);\n            },\n            insert: function (index, model) {\n                if (!model) {\n                    model = index;\n                    index = 0;\n                }\n                if (!(model instanceof Model)) {\n                    model = this._createNewModel(model);\n                }\n                if (this._isServerGrouped()) {\n                    this._data.splice(index, 0, this._wrapInEmptyGroup(model));\n                } else {\n                    this._data.splice(index, 0, model);\n                }\n                this._insertModelInRange(index, model);\n                return model;\n            },\n            pushInsert: function (index, items) {\n                var that = this;\n                var rangeSpan = that._getCurrentRangeSpan();\n                if (!items) {\n                    items = index;\n                    index = 0;\n                }\n                if (!isArray(items)) {\n                    items = [items];\n                }\n                var pushed = [];\n                var autoSync = this.options.autoSync;\n                this.options.autoSync = false;\n                try {\n                    for (var idx = 0; idx < items.length; idx++) {\n                        var item = items[idx];\n                        var result = this.insert(index, item);\n                        pushed.push(result);\n                        var pristine = result.toJSON();\n                        if (this._isServerGrouped()) {\n                            pristine = this._wrapInEmptyGroup(pristine);\n                        }\n                        this._pristineData.push(pristine);\n                        if (rangeSpan && rangeSpan.length) {\n                            $(rangeSpan).last()[0].pristineData.push(pristine);\n                        }\n                        index++;\n                    }\n                } finally {\n                    this.options.autoSync = autoSync;\n                }\n                if (pushed.length) {\n                    this.trigger('push', {\n                        type: 'create',\n                        items: pushed\n                    });\n                }\n            },\n            pushCreate: function (items) {\n                this.pushInsert(this._data.length, items);\n            },\n            pushUpdate: function (items) {\n                if (!isArray(items)) {\n                    items = [items];\n                }\n                var pushed = [];\n                for (var idx = 0; idx < items.length; idx++) {\n                    var item = items[idx];\n                    var model = this._createNewModel(item);\n                    var target = this.get(model.id);\n                    if (target) {\n                        pushed.push(target);\n                        target.accept(item);\n                        target.trigger(CHANGE);\n                        this._updatePristineForModel(target, item);\n                    } else {\n                        this.pushCreate(item);\n                    }\n                }\n                if (pushed.length) {\n                    this.trigger('push', {\n                        type: 'update',\n                        items: pushed\n                    });\n                }\n            },\n            pushDestroy: function (items) {\n                var pushed = this._removeItems(items);\n                if (pushed.length) {\n                    this.trigger('push', {\n                        type: 'destroy',\n                        items: pushed\n                    });\n                }\n            },\n            _removeItems: function (items, removePristine) {\n                if (!isArray(items)) {\n                    items = [items];\n                }\n                var shouldRemovePristine = typeof removePristine !== 'undefined' ? removePristine : true;\n                var destroyed = [];\n                var autoSync = this.options.autoSync;\n                this.options.autoSync = false;\n                try {\n                    for (var idx = 0; idx < items.length; idx++) {\n                        var item = items[idx];\n                        var model = this._createNewModel(item);\n                        var found = false;\n                        this._eachItem(this._data, function (items) {\n                            for (var idx = 0; idx < items.length; idx++) {\n                                var item = items.at(idx);\n                                if (item.id === model.id) {\n                                    destroyed.push(item);\n                                    items.splice(idx, 1);\n                                    found = true;\n                                    break;\n                                }\n                            }\n                        });\n                        if (found && shouldRemovePristine) {\n                            this._removePristineForModel(model);\n                            this._destroyed.pop();\n                        }\n                    }\n                } finally {\n                    this.options.autoSync = autoSync;\n                }\n                return destroyed;\n            },\n            remove: function (model) {\n                var result, that = this, hasGroups = that._isServerGrouped();\n                this._eachItem(that._data, function (items) {\n                    result = removeModel(items, model);\n                    if (result && hasGroups) {\n                        if (!result.isNew || !result.isNew()) {\n                            that._destroyed.push(result);\n                        }\n                        return true;\n                    }\n                });\n                this._removeModelFromRanges(model);\n                return model;\n            },\n            destroyed: function () {\n                return this._destroyed;\n            },\n            created: function () {\n                var idx, length, result = [], data = this._flatData(this._data, this.options.useRanges);\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].isNew && data[idx].isNew()) {\n                        result.push(data[idx]);\n                    }\n                }\n                return result;\n            },\n            updated: function () {\n                var idx, length, result = [], data = this._flatData(this._data, this.options.useRanges);\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].isNew && !data[idx].isNew() && data[idx].dirty) {\n                        result.push(data[idx]);\n                    }\n                }\n                return result;\n            },\n            sync: function () {\n                var that = this, created = [], updated = [], destroyed = that._destroyed;\n                var promise = $.Deferred().resolve().promise();\n                if (that.online()) {\n                    if (!that.reader.model) {\n                        return promise;\n                    }\n                    created = that.created();\n                    updated = that.updated();\n                    var promises = [];\n                    if (that.options.batch && that.transport.submit) {\n                        promises = that._sendSubmit(created, updated, destroyed);\n                    } else {\n                        promises.push.apply(promises, that._send('create', created));\n                        promises.push.apply(promises, that._send('update', updated));\n                        promises.push.apply(promises, that._send('destroy', destroyed));\n                    }\n                    promise = $.when.apply(null, promises).then(function () {\n                        var idx, length;\n                        for (idx = 0, length = arguments.length; idx < length; idx++) {\n                            if (arguments[idx]) {\n                                that._accept(arguments[idx]);\n                            }\n                        }\n                        that._storeData(true);\n                        that._syncEnd();\n                        that._change({ action: 'sync' });\n                        that.trigger(SYNC);\n                    });\n                } else {\n                    that._storeData(true);\n                    that._syncEnd();\n                    that._change({ action: 'sync' });\n                }\n                return promise;\n            },\n            _syncEnd: noop,\n            cancelChanges: function (model) {\n                var that = this;\n                if (model instanceof kendo.data.Model) {\n                    that._cancelModel(model);\n                } else {\n                    that._destroyed = [];\n                    that._detachObservableParents();\n                    that._data = that._observe(that._pristineData);\n                    if (that.options.serverPaging) {\n                        that._total = that._pristineTotal;\n                    }\n                    that._ranges = [];\n                    that._addRange(that._data, 0);\n                    that._changesCanceled();\n                    that._change();\n                    that._markOfflineUpdatesAsDirty();\n                }\n            },\n            _changesCanceled: noop,\n            _markOfflineUpdatesAsDirty: function () {\n                var that = this;\n                if (that.options.offlineStorage != null) {\n                    that._eachItem(that._data, function (items) {\n                        for (var idx = 0; idx < items.length; idx++) {\n                            var item = items.at(idx);\n                            if (item.__state__ == 'update' || item.__state__ == 'create') {\n                                item.dirty = true;\n                            }\n                        }\n                    });\n                }\n            },\n            hasChanges: function () {\n                var idx, length, data = this._flatData(this._data, this.options.useRanges);\n                if (this._destroyed.length) {\n                    return true;\n                }\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].isNew && data[idx].isNew() || data[idx].dirty) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _accept: function (result) {\n                var that = this, models = result.models, response = result.response, idx = 0, serverGroup = that._isServerGrouped(), pristine = that._pristineData, type = result.type, length;\n                that.trigger(REQUESTEND, {\n                    response: response,\n                    type: type\n                });\n                if (response && !isEmptyObject(response)) {\n                    response = that.reader.parse(response);\n                    if (that._handleCustomErrors(response)) {\n                        return;\n                    }\n                    response = that.reader.data(response);\n                    if (!isArray(response)) {\n                        response = [response];\n                    }\n                } else {\n                    response = $.map(models, function (model) {\n                        return model.toJSON();\n                    });\n                }\n                if (type === 'destroy') {\n                    that._destroyed = [];\n                }\n                for (idx = 0, length = models.length; idx < length; idx++) {\n                    if (type !== 'destroy') {\n                        models[idx].accept(response[idx]);\n                        if (type === 'create') {\n                            pristine.push(serverGroup ? that._wrapInEmptyGroup(models[idx].toJSON()) : response[idx]);\n                        } else if (type === 'update') {\n                            that._updatePristineForModel(models[idx], response[idx]);\n                        }\n                    } else {\n                        that._removePristineForModel(models[idx]);\n                    }\n                }\n            },\n            _updatePristineForModel: function (model, values) {\n                this._executeOnPristineForModel(model, function (index, items) {\n                    kendo.deepExtend(items[index], values);\n                });\n            },\n            _executeOnPristineForModel: function (model, callback) {\n                this._eachPristineItem(function (items) {\n                    var index = indexOfPristineModel(items, model);\n                    if (index > -1) {\n                        callback(index, items);\n                        return true;\n                    }\n                });\n            },\n            _removePristineForModel: function (model) {\n                this._executeOnPristineForModel(model, function (index, items) {\n                    items.splice(index, 1);\n                });\n            },\n            _readData: function (data) {\n                var read = !this._isServerGrouped() ? this.reader.data : this.reader.groups;\n                return read.call(this.reader, data);\n            },\n            _eachPristineItem: function (callback) {\n                var that = this;\n                var options = that.options;\n                var rangeSpan = that._getCurrentRangeSpan();\n                that._eachItem(that._pristineData, callback);\n                if (options.serverPaging && options.useRanges) {\n                    each(rangeSpan, function (i, range) {\n                        that._eachItem(range.pristineData, callback);\n                    });\n                }\n            },\n            _eachItem: function (data, callback) {\n                if (data && data.length) {\n                    if (this._isServerGrouped()) {\n                        eachGroupItems(data, callback);\n                    } else {\n                        callback(data);\n                    }\n                }\n            },\n            _pristineForModel: function (model) {\n                var pristine, idx, callback = function (items) {\n                        idx = indexOfPristineModel(items, model);\n                        if (idx > -1) {\n                            pristine = items[idx];\n                            return true;\n                        }\n                    };\n                this._eachPristineItem(callback);\n                return pristine;\n            },\n            _cancelModel: function (model) {\n                var that = this;\n                var pristine = this._pristineForModel(model);\n                this._eachItem(this._data, function (items) {\n                    var idx = indexOfModel(items, model);\n                    if (idx >= 0) {\n                        if (pristine && (!model.isNew() || pristine.__state__)) {\n                            items[idx].accept(pristine);\n                            if (pristine.__state__ == 'update') {\n                                items[idx].dirty = true;\n                            }\n                        } else {\n                            that._modelCanceled(model);\n                            items.splice(idx, 1);\n                            that._removeModelFromRanges(model);\n                        }\n                    }\n                });\n            },\n            _modelCanceled: noop,\n            _submit: function (promises, data) {\n                var that = this;\n                that.trigger(REQUESTSTART, { type: 'submit' });\n                that.trigger(PROGRESS);\n                that.transport.submit(extend({\n                    success: function (response, type) {\n                        var promise = $.grep(promises, function (x) {\n                            return x.type == type;\n                        })[0];\n                        if (promise) {\n                            promise.resolve({\n                                response: response,\n                                models: promise.models,\n                                type: type\n                            });\n                        }\n                    },\n                    error: function (response, status, error) {\n                        for (var idx = 0; idx < promises.length; idx++) {\n                            promises[idx].reject(response);\n                        }\n                        that.error(response, status, error);\n                    }\n                }, data));\n            },\n            _sendSubmit: function (created, updated, destroyed) {\n                var that = this, promises = [];\n                if (that.options.batch) {\n                    if (created.length) {\n                        promises.push($.Deferred(function (deferred) {\n                            deferred.type = 'create';\n                            deferred.models = created;\n                        }));\n                    }\n                    if (updated.length) {\n                        promises.push($.Deferred(function (deferred) {\n                            deferred.type = 'update';\n                            deferred.models = updated;\n                        }));\n                    }\n                    if (destroyed.length) {\n                        promises.push($.Deferred(function (deferred) {\n                            deferred.type = 'destroy';\n                            deferred.models = destroyed;\n                        }));\n                    }\n                    that._submit(promises, {\n                        data: {\n                            created: that.reader.serialize(toJSON(created)),\n                            updated: that.reader.serialize(toJSON(updated)),\n                            destroyed: that.reader.serialize(toJSON(destroyed))\n                        }\n                    });\n                }\n                return promises;\n            },\n            _promise: function (data, models, type) {\n                var that = this;\n                return $.Deferred(function (deferred) {\n                    that.trigger(REQUESTSTART, { type: type });\n                    that.trigger(PROGRESS);\n                    that.transport[type].call(that.transport, extend({\n                        success: function (response) {\n                            deferred.resolve({\n                                response: response,\n                                models: models,\n                                type: type\n                            });\n                        },\n                        error: function (response, status, error) {\n                            deferred.reject(response);\n                            that.error(response, status, error);\n                        }\n                    }, data));\n                }).promise();\n            },\n            _send: function (method, data) {\n                var that = this, idx, length, promises = [], converted = that.reader.serialize(toJSON(data));\n                if (that.options.batch) {\n                    if (data.length) {\n                        promises.push(that._promise({ data: { models: converted } }, data, method));\n                    }\n                } else {\n                    for (idx = 0, length = data.length; idx < length; idx++) {\n                        promises.push(that._promise({ data: converted[idx] }, [data[idx]], method));\n                    }\n                }\n                return promises;\n            },\n            read: function (data) {\n                var that = this, params = that._params(data);\n                var deferred = $.Deferred();\n                that._queueRequest(params, function () {\n                    var isPrevented = that.trigger(REQUESTSTART, { type: 'read' });\n                    if (!isPrevented) {\n                        that.trigger(PROGRESS);\n                        that._ranges = [];\n                        that.trigger('reset');\n                        if (that.online()) {\n                            that.transport.read({\n                                data: params,\n                                success: function (data) {\n                                    that._ranges = [];\n                                    that.success(data, params);\n                                    deferred.resolve();\n                                },\n                                error: function () {\n                                    var args = slice.call(arguments);\n                                    that.error.apply(that, args);\n                                    deferred.reject.apply(deferred, args);\n                                }\n                            });\n                        } else if (that.options.offlineStorage != null) {\n                            that.success(that.offlineData(), params);\n                            deferred.resolve();\n                        }\n                    } else {\n                        that._dequeueRequest();\n                        deferred.resolve(isPrevented);\n                    }\n                });\n                return deferred.promise();\n            },\n            _readAggregates: function (data) {\n                return this.reader.aggregates(data);\n            },\n            success: function (data) {\n                var that = this, options = that.options, items, replaceSubset;\n                that.trigger(REQUESTEND, {\n                    response: data,\n                    type: 'read'\n                });\n                if (that.online()) {\n                    data = that.reader.parse(data);\n                    if (that._handleCustomErrors(data)) {\n                        that._dequeueRequest();\n                        return;\n                    }\n                    that._total = that.reader.total(data);\n                    if (that._pageSize > that._total) {\n                        that._pageSize = that._total;\n                        if (that.options.pageSize && that.options.pageSize > that._pageSize) {\n                            that._pageSize = that.options.pageSize;\n                        }\n                    }\n                    if (that._aggregate && options.serverAggregates) {\n                        that._aggregateResult = that._readAggregates(data);\n                    }\n                    data = that._readData(data);\n                    that._destroyed = [];\n                } else {\n                    data = that._readData(data);\n                    items = [];\n                    var itemIds = {};\n                    var model = that.reader.model;\n                    var idField = model ? model.idField : 'id';\n                    var idx;\n                    for (idx = 0; idx < this._destroyed.length; idx++) {\n                        var id = this._destroyed[idx][idField];\n                        itemIds[id] = id;\n                    }\n                    for (idx = 0; idx < data.length; idx++) {\n                        var item = data[idx];\n                        var state = item.__state__;\n                        if (state == 'destroy') {\n                            if (!itemIds[item[idField]]) {\n                                this._destroyed.push(this._createNewModel(item));\n                            }\n                        } else {\n                            items.push(item);\n                        }\n                    }\n                    data = items;\n                    that._total = data.length;\n                }\n                that._pristineTotal = that._total;\n                replaceSubset = that._skip && that._data.length && that._skip < that._data.length;\n                if (that.options.endless) {\n                    if (replaceSubset) {\n                        that._pristineData.splice(that._skip, that._pristineData.length);\n                    }\n                    items = data.slice(0);\n                    for (var j = 0; j < items.length; j++) {\n                        that._pristineData.push(items[j]);\n                    }\n                } else {\n                    that._pristineData = data.slice(0);\n                }\n                that._detachObservableParents();\n                if (that.options.endless) {\n                    that._data.unbind(CHANGE, that._changeHandler);\n                    if (that._isServerGrouped() && that._data[that._data.length - 1].value === data[0].value) {\n                        fillLastGroup(that._data[that._data.length - 1], data[0]);\n                        data.shift();\n                    }\n                    data = that._observe(data);\n                    if (replaceSubset) {\n                        that._data.splice(that._skip, that._data.length);\n                    }\n                    for (var i = 0; i < data.length; i++) {\n                        that._data.push(data[i]);\n                    }\n                    that._data.bind(CHANGE, that._changeHandler);\n                } else {\n                    that._data = that._observe(data);\n                }\n                that._markOfflineUpdatesAsDirty();\n                that._storeData();\n                that._addRange(that._data);\n                that._process(that._data);\n                that._dequeueRequest();\n            },\n            _detachObservableParents: function () {\n                if (this._data && this._shouldDetachObservableParents) {\n                    for (var idx = 0; idx < this._data.length; idx++) {\n                        if (this._data[idx].parent) {\n                            this._data[idx].parent = noop;\n                        }\n                    }\n                }\n            },\n            _storeData: function (updatePristine) {\n                var serverGrouping = this._isServerGrouped();\n                var model = this.reader.model;\n                function items(data) {\n                    var state = [];\n                    for (var idx = 0; idx < data.length; idx++) {\n                        var dataItem = data.at(idx);\n                        var item = dataItem.toJSON();\n                        if (serverGrouping && dataItem.items) {\n                            item.items = items(dataItem.items);\n                        } else {\n                            item.uid = dataItem.uid;\n                            if (model) {\n                                if (dataItem.isNew()) {\n                                    item.__state__ = 'create';\n                                } else if (dataItem.dirty) {\n                                    item.__state__ = 'update';\n                                }\n                            }\n                        }\n                        state.push(item);\n                    }\n                    return state;\n                }\n                if (this.options.offlineStorage != null) {\n                    var state = items(this._data);\n                    var destroyed = [];\n                    for (var idx = 0; idx < this._destroyed.length; idx++) {\n                        var item = this._destroyed[idx].toJSON();\n                        item.__state__ = 'destroy';\n                        destroyed.push(item);\n                    }\n                    this.offlineData(state.concat(destroyed));\n                    if (updatePristine) {\n                        this._pristineData = this.reader.reader ? this.reader.reader._wrapDataAccessBase(state) : this.reader._wrapDataAccessBase(state);\n                    }\n                }\n            },\n            _addRange: function (data, skip) {\n                var that = this, start = typeof skip !== 'undefined' ? skip : that._skip || 0, end = start + that._flatData(data, true).length;\n                that._ranges.push({\n                    start: start,\n                    end: end,\n                    data: data,\n                    pristineData: data.toJSON(),\n                    timestamp: that._timeStamp()\n                });\n                that._sortRanges();\n            },\n            _sortRanges: function () {\n                this._ranges.sort(function (x, y) {\n                    return x.start - y.start;\n                });\n            },\n            error: function (xhr, status, errorThrown) {\n                this._dequeueRequest();\n                this.trigger(REQUESTEND, {});\n                this.trigger(ERROR, {\n                    xhr: xhr,\n                    status: status,\n                    errorThrown: errorThrown\n                });\n            },\n            _params: function (data) {\n                var that = this, options = extend({\n                        take: that.take(),\n                        skip: that.skip(),\n                        page: that.page(),\n                        pageSize: that.pageSize(),\n                        sort: that._sort,\n                        filter: that._filter,\n                        group: that._group,\n                        aggregate: that._aggregate\n                    }, data);\n                if (!that.options.serverPaging) {\n                    delete options.take;\n                    delete options.skip;\n                    delete options.page;\n                    delete options.pageSize;\n                }\n                if (!that.options.serverGrouping) {\n                    delete options.group;\n                } else if (that.reader.model && options.group) {\n                    options.group = convertDescriptorsField(options.group, that.reader.model);\n                }\n                if (!that.options.serverFiltering) {\n                    delete options.filter;\n                } else if (that.reader.model && options.filter) {\n                    options.filter = convertFilterDescriptorsField(options.filter, that.reader.model);\n                }\n                if (!that.options.serverSorting) {\n                    delete options.sort;\n                } else if (that.reader.model && options.sort) {\n                    options.sort = convertDescriptorsField(options.sort, that.reader.model);\n                }\n                if (!that.options.serverAggregates) {\n                    delete options.aggregate;\n                } else if (that.reader.model && options.aggregate) {\n                    options.aggregate = convertDescriptorsField(options.aggregate, that.reader.model);\n                }\n                return options;\n            },\n            _queueRequest: function (options, callback) {\n                var that = this;\n                if (!that._requestInProgress) {\n                    that._requestInProgress = true;\n                    that._pending = undefined;\n                    callback();\n                } else {\n                    that._pending = {\n                        callback: proxy(callback, that),\n                        options: options\n                    };\n                }\n            },\n            _dequeueRequest: function () {\n                var that = this;\n                that._requestInProgress = false;\n                if (that._pending) {\n                    that._queueRequest(that._pending.options, that._pending.callback);\n                }\n            },\n            _handleCustomErrors: function (response) {\n                if (this.reader.errors) {\n                    var errors = this.reader.errors(response);\n                    if (errors) {\n                        this.trigger(ERROR, {\n                            xhr: null,\n                            status: 'customerror',\n                            errorThrown: 'custom error',\n                            errors: errors\n                        });\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _shouldWrap: function (data) {\n                var model = this.reader.model;\n                if (model && data.length) {\n                    return !(data[0] instanceof model);\n                }\n                return false;\n            },\n            _observe: function (data) {\n                var that = this, model = that.reader.model;\n                that._shouldDetachObservableParents = true;\n                if (data instanceof ObservableArray) {\n                    that._shouldDetachObservableParents = false;\n                    if (that._shouldWrap(data)) {\n                        data.type = that.reader.model;\n                        data.wrapAll(data, data);\n                    }\n                } else {\n                    var arrayType = that.pageSize() && !that.options.serverPaging ? LazyObservableArray : ObservableArray;\n                    data = new arrayType(data, that.reader.model);\n                    data.parent = function () {\n                        return that.parent();\n                    };\n                }\n                if (that._isServerGrouped()) {\n                    wrapGroupItems(data, model);\n                }\n                if (that._changeHandler && that._data && that._data instanceof ObservableArray && !(that.options.useRanges && that.options.serverPaging)) {\n                    that._data.unbind(CHANGE, that._changeHandler);\n                } else {\n                    that._changeHandler = proxy(that._change, that);\n                }\n                return data.bind(CHANGE, that._changeHandler);\n            },\n            _updateTotalForAction: function (action, items) {\n                var that = this;\n                var total = parseInt(that._total, 10);\n                if (!isNumber(that._total)) {\n                    total = parseInt(that._pristineTotal, 10);\n                }\n                if (action === 'add') {\n                    total += items.length;\n                } else if (action === 'remove') {\n                    total -= items.length;\n                } else if (action !== 'itemchange' && action !== 'sync' && !that.options.serverPaging) {\n                    total = that._pristineTotal;\n                } else if (action === 'sync') {\n                    total = that._pristineTotal = parseInt(that._total, 10);\n                }\n                that._total = total;\n            },\n            _change: function (e) {\n                var that = this, idx, length, action = e ? e.action : '';\n                if (action === 'remove') {\n                    for (idx = 0, length = e.items.length; idx < length; idx++) {\n                        if (!e.items[idx].isNew || !e.items[idx].isNew()) {\n                            that._destroyed.push(e.items[idx]);\n                        }\n                    }\n                }\n                if (that.options.autoSync && (action === 'add' || action === 'remove' || action === 'itemchange')) {\n                    var handler = function (args) {\n                        if (args.action === 'sync') {\n                            that.unbind('change', handler);\n                            that._updateTotalForAction(action, e.items);\n                        }\n                    };\n                    that.first('change', handler);\n                    that.sync();\n                } else {\n                    that._updateTotalForAction(action, e ? e.items : []);\n                    that._process(that._data, e);\n                }\n            },\n            _calculateAggregates: function (data, options) {\n                options = options || {};\n                var query = new Query(data), aggregates = options.aggregate, filter = options.filter;\n                if (filter) {\n                    query = query.filter(filter);\n                }\n                return query.aggregate(aggregates);\n            },\n            _process: function (data, e) {\n                var that = this, options = {}, result;\n                if (that.options.serverPaging !== true) {\n                    options.skip = that._skip;\n                    options.take = that._take || that._pageSize;\n                    if (options.skip === undefined && that._page !== undefined && that._pageSize !== undefined) {\n                        options.skip = (that._page - 1) * that._pageSize;\n                    }\n                    if (that.options.useRanges) {\n                        options.skip = that.currentRangeStart();\n                    }\n                }\n                if (that.options.serverSorting !== true) {\n                    options.sort = that._sort;\n                }\n                if (that.options.serverFiltering !== true) {\n                    options.filter = that._filter;\n                }\n                if (that.options.serverGrouping !== true) {\n                    options.group = that._group;\n                }\n                if (that.options.serverAggregates !== true) {\n                    options.aggregate = that._aggregate;\n                }\n                if (that.options.serverGrouping) {\n                    that._clearEmptyGroups(data);\n                }\n                result = that._queryProcess(data, options);\n                if (that.options.serverAggregates !== true) {\n                    that._aggregateResult = that._calculateAggregates(result.dataToAggregate || data, options);\n                }\n                that.view(result.data);\n                that._setFilterTotal(result.total, false);\n                e = e || {};\n                e.items = e.items || that._view;\n                that.trigger(CHANGE, e);\n            },\n            _clearEmptyGroups: function (data) {\n                for (var idx = data.length - 1; idx >= 0; idx--) {\n                    var group = data[idx];\n                    if (group.hasSubgroups) {\n                        this._clearEmptyGroups(group.items);\n                    } else {\n                        if (group.items && !group.items.length) {\n                            splice.apply(group.parent(), [\n                                idx,\n                                1\n                            ]);\n                        }\n                    }\n                }\n            },\n            _queryProcess: function (data, options) {\n                if (this.options.inPlaceSort) {\n                    return Query.process(data, options, this.options.inPlaceSort);\n                } else {\n                    return Query.process(data, options);\n                }\n            },\n            _mergeState: function (options) {\n                var that = this;\n                if (options !== undefined) {\n                    that._pageSize = options.pageSize;\n                    that._page = options.page;\n                    that._sort = options.sort;\n                    that._filter = options.filter;\n                    that._group = options.group;\n                    that._aggregate = options.aggregate;\n                    that._skip = that._currentRangeStart = options.skip;\n                    that._take = options.take;\n                    if (that._skip === undefined) {\n                        that._skip = that._currentRangeStart = that.skip();\n                        options.skip = that.skip();\n                    }\n                    if (that._take === undefined && that._pageSize !== undefined) {\n                        that._take = that._pageSize;\n                        options.take = that._take;\n                    }\n                    if (options.sort) {\n                        that._sort = options.sort = normalizeSort(options.sort);\n                        that._sortFields = sortFields(options.sort);\n                    }\n                    if (options.filter) {\n                        that._filter = options.filter = that.options.accentFoldingFiltering && !$.isEmptyObject(options.filter) ? $.extend({}, normalizeFilter(options.filter), { accentFoldingFiltering: that.options.accentFoldingFiltering }) : normalizeFilter(options.filter);\n                    }\n                    if (options.group) {\n                        that._group = options.group = normalizeGroup(options.group);\n                    }\n                    if (options.aggregate) {\n                        that._aggregate = options.aggregate = normalizeAggregate(options.aggregate);\n                    }\n                }\n                return options;\n            },\n            query: function (options) {\n                var result;\n                var remote = this.options.serverSorting || this.options.serverPaging || this.options.serverFiltering || this.options.serverGrouping || this.options.serverAggregates;\n                if (remote || (this._data === undefined || this._data.length === 0) && !this._destroyed.length) {\n                    if (this.options.endless) {\n                        var moreItemsCount = options.pageSize - this.pageSize();\n                        if (moreItemsCount > 0) {\n                            moreItemsCount = this.pageSize();\n                            options.page = options.pageSize / moreItemsCount;\n                            options.pageSize = moreItemsCount;\n                        } else {\n                            options.page = 1;\n                            this.options.endless = false;\n                        }\n                    }\n                    return this.read(this._mergeState(options));\n                }\n                var isPrevented = this.trigger(REQUESTSTART, { type: 'read' });\n                if (!isPrevented) {\n                    this.trigger(PROGRESS);\n                    result = this._queryProcess(this._data, this._mergeState(options));\n                    this._setFilterTotal(result.total, true);\n                    this._aggregateResult = this._calculateAggregates(result.dataToAggregate || this._data, options);\n                    this.view(result.data);\n                    this.trigger(REQUESTEND, { type: 'read' });\n                    this.trigger(CHANGE, { items: result.data });\n                }\n                return $.Deferred().resolve(isPrevented).promise();\n            },\n            _setFilterTotal: function (filterTotal, setDefaultValue) {\n                var that = this;\n                if (!that.options.serverFiltering) {\n                    if (filterTotal !== undefined) {\n                        that._total = filterTotal;\n                    } else if (setDefaultValue) {\n                        that._total = that._data.length;\n                    }\n                }\n            },\n            fetch: function (callback) {\n                var that = this;\n                var fn = function (isPrevented) {\n                    if (isPrevented !== true && isFunction(callback)) {\n                        callback.call(that);\n                    }\n                };\n                return this._query().done(fn);\n            },\n            _query: function (options) {\n                var that = this;\n                return that.query(extend({}, {\n                    page: that.page(),\n                    pageSize: that.pageSize(),\n                    sort: that.sort(),\n                    filter: that.filter(),\n                    group: that.group(),\n                    aggregate: that.aggregate()\n                }, options));\n            },\n            next: function (options) {\n                var that = this, page = that.page(), total = that.total();\n                options = options || {};\n                if (!page || total && page + 1 > that.totalPages()) {\n                    return;\n                }\n                that._skip = that._currentRangeStart = page * that.take();\n                page += 1;\n                options.page = page;\n                that._query(options);\n                return page;\n            },\n            prev: function (options) {\n                var that = this, page = that.page();\n                options = options || {};\n                if (!page || page === 1) {\n                    return;\n                }\n                that._skip = that._currentRangeStart = that._skip - that.take();\n                page -= 1;\n                options.page = page;\n                that._query(options);\n                return page;\n            },\n            page: function (val) {\n                var that = this, skip;\n                if (val !== undefined) {\n                    val = math.max(math.min(math.max(val, 1), that.totalPages()), 1);\n                    that._query(that._pageableQueryOptions({ page: val }));\n                    return;\n                }\n                skip = that.skip();\n                return skip !== undefined ? math.round((skip || 0) / (that.take() || 1)) + 1 : undefined;\n            },\n            pageSize: function (val) {\n                var that = this;\n                if (val !== undefined) {\n                    that._query(that._pageableQueryOptions({\n                        pageSize: val,\n                        page: 1\n                    }));\n                    return;\n                }\n                return that.take();\n            },\n            sort: function (val) {\n                var that = this;\n                if (val !== undefined) {\n                    that.trigger('sort');\n                    that._query({ sort: val });\n                    return;\n                }\n                return that._sort;\n            },\n            filter: function (val) {\n                var that = this;\n                if (val === undefined) {\n                    return that._filter;\n                }\n                that.trigger('reset');\n                that._query({\n                    filter: val,\n                    page: 1\n                });\n            },\n            group: function (val) {\n                var that = this;\n                if (val !== undefined) {\n                    that._query({ group: val });\n                    return;\n                }\n                return that._group;\n            },\n            total: function () {\n                return parseInt(this._total || 0, 10);\n            },\n            aggregate: function (val) {\n                var that = this;\n                if (val !== undefined) {\n                    that._query({ aggregate: val });\n                    return;\n                }\n                return that._aggregate;\n            },\n            aggregates: function () {\n                var result = this._aggregateResult;\n                if (isEmptyObject(result)) {\n                    result = this._emptyAggregates(this.aggregate());\n                }\n                return result;\n            },\n            _emptyAggregates: function (aggregates) {\n                var result = {};\n                if (!isEmptyObject(aggregates)) {\n                    var aggregate = {};\n                    if (!isArray(aggregates)) {\n                        aggregates = [aggregates];\n                    }\n                    for (var idx = 0; idx < aggregates.length; idx++) {\n                        aggregate[aggregates[idx].aggregate] = 0;\n                        result[aggregates[idx].field] = aggregate;\n                    }\n                }\n                return result;\n            },\n            _pageableQueryOptions: function (options) {\n                return options;\n            },\n            _wrapInEmptyGroup: function (model) {\n                var groups = this.group(), parent, group, idx, length;\n                for (idx = groups.length - 1, length = 0; idx >= length; idx--) {\n                    group = groups[idx];\n                    parent = {\n                        value: model.get ? model.get(group.field) : model[group.field],\n                        field: group.field,\n                        items: parent ? [parent] : [model],\n                        hasSubgroups: !!parent,\n                        aggregates: this._emptyAggregates(group.aggregates)\n                    };\n                }\n                return parent;\n            },\n            totalPages: function () {\n                var that = this, pageSize = that.pageSize() || that.total();\n                return math.ceil((that.total() || 0) / pageSize);\n            },\n            inRange: function (skip, take) {\n                var that = this, end = math.min(skip + take, that.total());\n                if (!that.options.serverPaging && that._data.length > 0) {\n                    return true;\n                }\n                return that._findRange(skip, end).length > 0;\n            },\n            lastRange: function () {\n                var ranges = this._ranges;\n                return ranges[ranges.length - 1] || {\n                    start: 0,\n                    end: 0,\n                    data: []\n                };\n            },\n            firstItemUid: function () {\n                var ranges = this._ranges;\n                return ranges.length && ranges[0].data.length && ranges[0].data[0].uid;\n            },\n            enableRequestsInProgress: function () {\n                this._skipRequestsInProgress = false;\n            },\n            _timeStamp: function () {\n                return new Date().getTime();\n            },\n            range: function (skip, take, callback) {\n                this._currentRequestTimeStamp = this._timeStamp();\n                this._skipRequestsInProgress = true;\n                skip = math.min(skip || 0, this.total());\n                callback = isFunction(callback) ? callback : noop;\n                var that = this, pageSkip = math.max(math.floor(skip / take), 0) * take, size = math.min(pageSkip + take, that.total()), data;\n                data = that._findRange(skip, math.min(skip + take, that.total()));\n                if (data.length || that.total() === 0) {\n                    that._processRangeData(data, skip, take, pageSkip, size);\n                    callback();\n                    return;\n                }\n                if (take !== undefined) {\n                    if (!that._rangeExists(pageSkip, size)) {\n                        that.prefetch(pageSkip, take, function () {\n                            if (skip > pageSkip && size < that.total() && !that._rangeExists(size, math.min(size + take, that.total()))) {\n                                that.prefetch(size, take, function () {\n                                    that.range(skip, take, callback);\n                                });\n                            } else {\n                                that.range(skip, take, callback);\n                            }\n                        });\n                    } else if (pageSkip < skip) {\n                        that.prefetch(size, take, function () {\n                            that.range(skip, take, callback);\n                        });\n                    }\n                }\n            },\n            _findRange: function (start, end) {\n                var that = this, ranges = that._ranges, range, data = [], skipIdx, takeIdx, startIndex, endIndex, rangeData, rangeEnd, processed, options = that.options, remote = options.serverSorting || options.serverPaging || options.serverFiltering || options.serverGrouping || options.serverAggregates, flatData, count, length;\n                for (skipIdx = 0, length = ranges.length; skipIdx < length; skipIdx++) {\n                    range = ranges[skipIdx];\n                    if (start >= range.start && start <= range.end) {\n                        count = 0;\n                        for (takeIdx = skipIdx; takeIdx < length; takeIdx++) {\n                            range = ranges[takeIdx];\n                            flatData = that._flatData(range.data, true);\n                            if (flatData.length && start + count >= range.start) {\n                                rangeData = range.data;\n                                rangeEnd = range.end;\n                                if (!remote) {\n                                    if (options.inPlaceSort) {\n                                        processed = that._queryProcess(range.data, { filter: that.filter() });\n                                    } else {\n                                        var sort = normalizeGroupWithoutCompare(that.group() || []).concat(normalizeSort(that.sort() || []));\n                                        processed = that._queryProcess(range.data, {\n                                            sort: sort,\n                                            filter: that.filter()\n                                        });\n                                    }\n                                    flatData = rangeData = processed.data;\n                                    if (processed.total !== undefined) {\n                                        rangeEnd = processed.total;\n                                    }\n                                }\n                                startIndex = 0;\n                                if (start + count > range.start) {\n                                    startIndex = start + count - range.start;\n                                }\n                                endIndex = flatData.length;\n                                if (rangeEnd > end) {\n                                    endIndex = endIndex - (rangeEnd - end);\n                                }\n                                count += endIndex - startIndex;\n                                data = that._mergeGroups(data, rangeData, startIndex, endIndex);\n                                if (end <= range.end && count == end - start) {\n                                    return data;\n                                }\n                            }\n                        }\n                        break;\n                    }\n                }\n                return [];\n            },\n            _mergeGroups: function (data, range, skip, take) {\n                if (this._isServerGrouped()) {\n                    var temp = range.toJSON(), prevGroup;\n                    if (data.length) {\n                        prevGroup = data[data.length - 1];\n                    }\n                    mergeGroups(prevGroup, temp, skip, take);\n                    return data.concat(temp);\n                }\n                return data.concat(range.slice(skip, take));\n            },\n            _processRangeData: function (data, skip, take, pageSkip, size) {\n                var that = this;\n                that._pending = undefined;\n                that._skip = skip > that.skip() ? math.min(size, (that.totalPages() - 1) * that.take()) : pageSkip;\n                that._currentRangeStart = skip;\n                that._take = take;\n                var paging = that.options.serverPaging;\n                var sorting = that.options.serverSorting;\n                var filtering = that.options.serverFiltering;\n                var aggregates = that.options.serverAggregates;\n                try {\n                    that.options.serverPaging = true;\n                    if (!that._isServerGrouped() && !(that.group() && that.group().length)) {\n                        that.options.serverSorting = true;\n                    }\n                    that.options.serverFiltering = true;\n                    that.options.serverPaging = true;\n                    that.options.serverAggregates = true;\n                    if (paging) {\n                        that._detachObservableParents();\n                        that._data = data = that._observe(data);\n                    }\n                    that._process(data);\n                } finally {\n                    that.options.serverPaging = paging;\n                    that.options.serverSorting = sorting;\n                    that.options.serverFiltering = filtering;\n                    that.options.serverAggregates = aggregates;\n                }\n            },\n            skip: function () {\n                var that = this;\n                if (that._skip === undefined) {\n                    return that._page !== undefined ? (that._page - 1) * (that.take() || 1) : undefined;\n                }\n                return that._skip;\n            },\n            currentRangeStart: function () {\n                return this._currentRangeStart || 0;\n            },\n            take: function () {\n                return this._take || this._pageSize;\n            },\n            _prefetchSuccessHandler: function (skip, size, callback, force) {\n                var that = this;\n                var timestamp = that._timeStamp();\n                return function (data) {\n                    var found = false, range = {\n                            start: skip,\n                            end: size,\n                            data: [],\n                            timestamp: that._timeStamp()\n                        }, idx, length, temp;\n                    that._dequeueRequest();\n                    that.trigger(REQUESTEND, {\n                        response: data,\n                        type: 'read'\n                    });\n                    data = that.reader.parse(data);\n                    temp = that._readData(data);\n                    if (temp.length) {\n                        for (idx = 0, length = that._ranges.length; idx < length; idx++) {\n                            if (that._ranges[idx].start === skip) {\n                                found = true;\n                                range = that._ranges[idx];\n                                range.pristineData = temp;\n                                range.data = that._observe(temp);\n                                range.end = range.start + that._flatData(range.data, true).length;\n                                that._sortRanges();\n                                break;\n                            }\n                        }\n                        if (!found) {\n                            that._addRange(that._observe(temp), skip);\n                        }\n                    }\n                    that._total = that.reader.total(data);\n                    if (force || (timestamp >= that._currentRequestTimeStamp || !that._skipRequestsInProgress)) {\n                        if (callback && temp.length) {\n                            callback();\n                        } else {\n                            that.trigger(CHANGE, {});\n                        }\n                    }\n                };\n            },\n            prefetch: function (skip, take, callback) {\n                var that = this, size = math.min(skip + take, that.total()), options = {\n                        take: take,\n                        skip: skip,\n                        page: skip / take + 1,\n                        pageSize: take,\n                        sort: that._sort,\n                        filter: that._filter,\n                        group: that._group,\n                        aggregate: that._aggregate\n                    };\n                if (!that._rangeExists(skip, size)) {\n                    clearTimeout(that._timeout);\n                    that._timeout = setTimeout(function () {\n                        that._queueRequest(options, function () {\n                            if (!that.trigger(REQUESTSTART, { type: 'read' })) {\n                                that.transport.read({\n                                    data: that._params(options),\n                                    success: that._prefetchSuccessHandler(skip, size, callback),\n                                    error: function () {\n                                        var args = slice.call(arguments);\n                                        that.error.apply(that, args);\n                                    }\n                                });\n                            } else {\n                                that._dequeueRequest();\n                            }\n                        });\n                    }, 100);\n                } else if (callback) {\n                    callback();\n                }\n            },\n            _multiplePrefetch: function (skip, take, callback) {\n                var that = this, size = math.min(skip + take, that.total()), options = {\n                        take: take,\n                        skip: skip,\n                        page: skip / take + 1,\n                        pageSize: take,\n                        sort: that._sort,\n                        filter: that._filter,\n                        group: that._group,\n                        aggregate: that._aggregate\n                    };\n                if (!that._rangeExists(skip, size)) {\n                    if (!that.trigger(REQUESTSTART, { type: 'read' })) {\n                        that.transport.read({\n                            data: that._params(options),\n                            success: that._prefetchSuccessHandler(skip, size, callback, true)\n                        });\n                    }\n                } else if (callback) {\n                    callback();\n                }\n            },\n            _rangeExists: function (start, end) {\n                var that = this, ranges = that._ranges, idx, length;\n                for (idx = 0, length = ranges.length; idx < length; idx++) {\n                    if (ranges[idx].start <= start && ranges[idx].end >= end) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _getCurrentRangeSpan: function () {\n                var that = this;\n                var ranges = that._ranges;\n                var start = that.currentRangeStart();\n                var end = start + (that.take() || 0);\n                var rangeSpan = [];\n                var range;\n                var idx;\n                var length = ranges.length;\n                for (idx = 0; idx < length; idx++) {\n                    range = ranges[idx];\n                    if (range.start <= start && range.end >= start || range.start >= start && range.start <= end) {\n                        rangeSpan.push(range);\n                    }\n                }\n                return rangeSpan;\n            },\n            _removeModelFromRanges: function (model) {\n                var that = this;\n                var range;\n                for (var idx = 0, length = this._ranges.length; idx < length; idx++) {\n                    range = this._ranges[idx];\n                    that._removeModelFromRange(range, model);\n                }\n                that._updateRangesLength();\n            },\n            _removeModelFromRange: function (range, model) {\n                this._eachItem(range.data, function (data) {\n                    for (var idx = 0; idx < data.length; idx++) {\n                        var dataItem = data[idx];\n                        if (dataItem.uid && dataItem.uid == model.uid) {\n                            [].splice.call(data, idx, 1);\n                            break;\n                        }\n                    }\n                });\n            },\n            _insertModelInRange: function (index, model) {\n                var that = this;\n                var ranges = that._ranges || [];\n                var rangesLength = ranges.length;\n                var range;\n                var i;\n                for (i = 0; i < rangesLength; i++) {\n                    range = ranges[i];\n                    if (range.start <= index && range.end >= index) {\n                        if (!that._getByUid(model.uid, range.data)) {\n                            if (that._isServerGrouped()) {\n                                range.data.splice(index, 0, that._wrapInEmptyGroup(model));\n                            } else {\n                                range.data.splice(index, 0, model);\n                            }\n                        }\n                        break;\n                    }\n                }\n                that._updateRangesLength();\n            },\n            _updateRangesLength: function () {\n                var that = this;\n                var ranges = that._ranges || [];\n                var rangesLength = ranges.length;\n                var mismatchFound = false;\n                var mismatchLength = 0;\n                var lengthDifference = 0;\n                var range;\n                var i;\n                for (i = 0; i < rangesLength; i++) {\n                    range = ranges[i];\n                    lengthDifference = that._flatData(range.data, true).length - math.abs(range.end - range.start);\n                    if (!mismatchFound && lengthDifference !== 0) {\n                        mismatchFound = true;\n                        mismatchLength = lengthDifference;\n                        range.end += mismatchLength;\n                        continue;\n                    }\n                    if (mismatchFound) {\n                        range.start += mismatchLength;\n                        range.end += mismatchLength;\n                    }\n                }\n            }\n        });\n        var Transport = {};\n        Transport.create = function (options, data, dataSource) {\n            var transport, transportOptions = options.transport ? $.extend({}, options.transport) : null;\n            if (transportOptions) {\n                transportOptions.read = typeof transportOptions.read === STRING ? { url: transportOptions.read } : transportOptions.read;\n                if (options.type === 'jsdo') {\n                    transportOptions.dataSource = dataSource;\n                }\n                if (options.type) {\n                    kendo.data.transports = kendo.data.transports || {};\n                    kendo.data.schemas = kendo.data.schemas || {};\n                    if (!kendo.data.transports[options.type]) {\n                        kendo.logToConsole('Unknown DataSource transport type \\'' + options.type + '\\'.\\nVerify that registration scripts for this type are included after Kendo UI on the page.', 'warn');\n                    } else if (!isPlainObject(kendo.data.transports[options.type])) {\n                        transport = new kendo.data.transports[options.type](extend(transportOptions, { data: data }));\n                    } else {\n                        transportOptions = extend(true, {}, kendo.data.transports[options.type], transportOptions);\n                    }\n                    options.schema = extend(true, {}, kendo.data.schemas[options.type], options.schema);\n                }\n                if (!transport) {\n                    transport = isFunction(transportOptions.read) ? transportOptions : new RemoteTransport(transportOptions);\n                }\n            } else {\n                transport = new LocalTransport({ data: options.data || [] });\n            }\n            return transport;\n        };\n        DataSource.create = function (options) {\n            if (isArray(options) || options instanceof ObservableArray) {\n                options = { data: options };\n            }\n            var dataSource = options || {}, data = dataSource.data, fields = dataSource.fields, table = dataSource.table, select = dataSource.select, idx, length, model = {}, field;\n            if (!data && fields && !dataSource.transport) {\n                if (table) {\n                    data = inferTable(table, fields);\n                } else if (select) {\n                    data = inferSelect(select, fields);\n                    if (dataSource.group === undefined && data[0] && data[0].optgroup !== undefined) {\n                        dataSource.group = 'optgroup';\n                    }\n                }\n            }\n            if (kendo.data.Model && fields && (!dataSource.schema || !dataSource.schema.model)) {\n                for (idx = 0, length = fields.length; idx < length; idx++) {\n                    field = fields[idx];\n                    if (field.type) {\n                        model[field.field] = field;\n                    }\n                }\n                if (!isEmptyObject(model)) {\n                    dataSource.schema = extend(true, dataSource.schema, { model: { fields: model } });\n                }\n            }\n            dataSource.data = data;\n            select = null;\n            dataSource.select = null;\n            table = null;\n            dataSource.table = null;\n            return dataSource instanceof DataSource ? dataSource : new DataSource(dataSource);\n        };\n        function inferSelect(select, fields) {\n            select = $(select)[0];\n            var options = select.options;\n            var firstField = fields[0];\n            var secondField = fields[1];\n            var data = [];\n            var idx, length;\n            var optgroup;\n            var option;\n            var record;\n            var value;\n            for (idx = 0, length = options.length; idx < length; idx++) {\n                record = {};\n                option = options[idx];\n                optgroup = option.parentNode;\n                if (optgroup === select) {\n                    optgroup = null;\n                }\n                if (option.disabled || optgroup && optgroup.disabled) {\n                    continue;\n                }\n                if (optgroup) {\n                    record.optgroup = optgroup.label;\n                }\n                record[firstField.field] = option.text;\n                value = option.attributes.value;\n                if (value && value.specified) {\n                    value = option.value;\n                } else {\n                    value = option.text;\n                }\n                record[secondField.field] = value;\n                data.push(record);\n            }\n            return data;\n        }\n        function inferTable(table, fields) {\n            var tbody = $(table)[0].tBodies[0], rows = tbody ? tbody.rows : [], idx, length, fieldIndex, fieldCount = fields.length, data = [], cells, record, cell, empty;\n            for (idx = 0, length = rows.length; idx < length; idx++) {\n                record = {};\n                empty = true;\n                cells = rows[idx].cells;\n                for (fieldIndex = 0; fieldIndex < fieldCount; fieldIndex++) {\n                    cell = cells[fieldIndex];\n                    if (cell.nodeName.toLowerCase() !== 'th') {\n                        empty = false;\n                        record[fields[fieldIndex].field] = cell.innerHTML;\n                    }\n                }\n                if (!empty) {\n                    data.push(record);\n                }\n            }\n            return data;\n        }\n        var Node = Model.define({\n            idField: 'id',\n            init: function (value) {\n                var that = this, hasChildren = that.hasChildren || value && value.hasChildren, childrenField = 'items', childrenOptions = {};\n                kendo.data.Model.fn.init.call(that, value);\n                if (typeof that.children === STRING) {\n                    childrenField = that.children;\n                }\n                childrenOptions = {\n                    schema: {\n                        data: childrenField,\n                        model: {\n                            hasChildren: hasChildren,\n                            id: that.idField,\n                            fields: that.fields\n                        }\n                    }\n                };\n                if (typeof that.children !== STRING) {\n                    extend(childrenOptions, that.children);\n                }\n                childrenOptions.data = value;\n                if (!hasChildren) {\n                    hasChildren = childrenOptions.schema.data;\n                }\n                if (typeof hasChildren === STRING) {\n                    hasChildren = kendo.getter(hasChildren);\n                }\n                if (isFunction(hasChildren)) {\n                    var hasChildrenObject = hasChildren.call(that, that);\n                    if (hasChildrenObject && hasChildrenObject.length === 0) {\n                        that.hasChildren = false;\n                    } else {\n                        that.hasChildren = !!hasChildrenObject;\n                    }\n                }\n                that._childrenOptions = childrenOptions;\n                if (that.hasChildren) {\n                    that._initChildren();\n                }\n                that._loaded = !!(value && value._loaded);\n            },\n            _initChildren: function () {\n                var that = this;\n                var children, transport, parameterMap;\n                if (!(that.children instanceof HierarchicalDataSource)) {\n                    children = that.children = new HierarchicalDataSource(that._childrenOptions);\n                    transport = children.transport;\n                    parameterMap = transport.parameterMap;\n                    transport.parameterMap = function (data, type) {\n                        data[that.idField || 'id'] = that.id;\n                        if (parameterMap) {\n                            data = parameterMap(data, type);\n                        }\n                        return data;\n                    };\n                    children.parent = function () {\n                        return that;\n                    };\n                    children.bind(CHANGE, function (e) {\n                        e.node = e.node || that;\n                        that.trigger(CHANGE, e);\n                    });\n                    children.bind(ERROR, function (e) {\n                        var collection = that.parent();\n                        if (collection) {\n                            e.node = e.node || that;\n                            collection.trigger(ERROR, e);\n                        }\n                    });\n                    that._updateChildrenField();\n                }\n            },\n            append: function (model) {\n                this._initChildren();\n                this.loaded(true);\n                this.children.add(model);\n            },\n            hasChildren: false,\n            level: function () {\n                var parentNode = this.parentNode(), level = 0;\n                while (parentNode && parentNode.parentNode) {\n                    level++;\n                    parentNode = parentNode.parentNode ? parentNode.parentNode() : null;\n                }\n                return level;\n            },\n            _updateChildrenField: function () {\n                var fieldName = this._childrenOptions.schema.data;\n                this[fieldName || 'items'] = this.children.data();\n            },\n            _childrenLoaded: function () {\n                this._loaded = true;\n                this._updateChildrenField();\n            },\n            load: function () {\n                var options = {};\n                var method = '_query';\n                var children, promise;\n                if (this.hasChildren) {\n                    this._initChildren();\n                    children = this.children;\n                    options[this.idField || 'id'] = this.id;\n                    if (!this._loaded) {\n                        children._data = undefined;\n                        method = 'read';\n                    }\n                    children.one(CHANGE, proxy(this._childrenLoaded, this));\n                    if (this._matchFilter) {\n                        options.filter = {\n                            field: '_matchFilter',\n                            operator: 'eq',\n                            value: true\n                        };\n                    }\n                    promise = children[method](options);\n                } else {\n                    this.loaded(true);\n                }\n                return promise || $.Deferred().resolve().promise();\n            },\n            parentNode: function () {\n                var array = this.parent();\n                return array.parent();\n            },\n            loaded: function (value) {\n                if (value !== undefined) {\n                    this._loaded = value;\n                } else {\n                    return this._loaded;\n                }\n            },\n            shouldSerialize: function (field) {\n                return Model.fn.shouldSerialize.call(this, field) && field !== 'children' && field !== '_loaded' && field !== 'hasChildren' && field !== '_childrenOptions';\n            }\n        });\n        function dataMethod(name) {\n            return function () {\n                var data = this._data, result = DataSource.fn[name].apply(this, slice.call(arguments));\n                if (this._data != data) {\n                    this._attachBubbleHandlers();\n                }\n                return result;\n            };\n        }\n        var HierarchicalDataSource = DataSource.extend({\n            init: function (options) {\n                var node = Node.define({ children: options });\n                if (options.filter && !options.serverFiltering) {\n                    this._hierarchicalFilter = options.filter;\n                    options.filter = null;\n                }\n                DataSource.fn.init.call(this, extend(true, {}, {\n                    schema: {\n                        modelBase: node,\n                        model: node\n                    }\n                }, options));\n                this._attachBubbleHandlers();\n            },\n            _attachBubbleHandlers: function () {\n                var that = this;\n                that._data.bind(ERROR, function (e) {\n                    that.trigger(ERROR, e);\n                });\n            },\n            read: function (data) {\n                var result = DataSource.fn.read.call(this, data);\n                if (this._hierarchicalFilter) {\n                    if (this._data && this._data.length > 0) {\n                        this.filter(this._hierarchicalFilter);\n                    } else {\n                        this.options.filter = this._hierarchicalFilter;\n                        this._filter = normalizeFilter(this.options.filter);\n                        this._hierarchicalFilter = null;\n                    }\n                }\n                return result;\n            },\n            remove: function (node) {\n                var parentNode = node.parentNode(), dataSource = this, result;\n                if (parentNode && parentNode._initChildren) {\n                    dataSource = parentNode.children;\n                }\n                result = DataSource.fn.remove.call(dataSource, node);\n                if (parentNode && !dataSource.data().length) {\n                    parentNode.hasChildren = false;\n                }\n                return result;\n            },\n            success: dataMethod('success'),\n            data: dataMethod('data'),\n            insert: function (index, model) {\n                var parentNode = this.parent();\n                if (parentNode && parentNode._initChildren) {\n                    parentNode.hasChildren = true;\n                    parentNode._initChildren();\n                }\n                return DataSource.fn.insert.call(this, index, model);\n            },\n            filter: function (val) {\n                if (val === undefined) {\n                    return this._filter;\n                }\n                if (!this.options.serverFiltering && this._markHierarchicalQuery(val)) {\n                    val = {\n                        logic: 'or',\n                        filters: [\n                            val,\n                            {\n                                field: '_matchFilter',\n                                operator: 'equals',\n                                value: true\n                            }\n                        ]\n                    };\n                }\n                this.trigger('reset');\n                this._query({\n                    filter: val,\n                    page: 1\n                });\n            },\n            _markHierarchicalQuery: function (expressions) {\n                var compiled;\n                var predicate;\n                var fields;\n                var operators;\n                var filter;\n                var accentFoldingFiltering = this.options.accentFoldingFiltering;\n                expressions = accentFoldingFiltering ? $.extend({}, normalizeFilter(expressions), { accentFoldingFiltering: accentFoldingFiltering }) : normalizeFilter(expressions);\n                if (!expressions || expressions.filters.length === 0) {\n                    this._updateHierarchicalFilter(function () {\n                        return true;\n                    });\n                    return false;\n                }\n                compiled = Query.filterExpr(expressions);\n                fields = compiled.fields;\n                operators = compiled.operators;\n                predicate = filter = new Function('d, __f, __o', 'return ' + compiled.expression);\n                if (fields.length || operators.length) {\n                    filter = function (d) {\n                        return predicate(d, fields, operators);\n                    };\n                }\n                this._updateHierarchicalFilter(filter);\n                return true;\n            },\n            _updateHierarchicalFilter: function (filter) {\n                var current;\n                var data = this._data;\n                var result = false;\n                for (var idx = 0; idx < data.length; idx++) {\n                    current = data[idx];\n                    if (current.hasChildren) {\n                        current._matchFilter = current.children._updateHierarchicalFilter(filter);\n                        if (!current._matchFilter) {\n                            current._matchFilter = filter(current);\n                        }\n                    } else {\n                        current._matchFilter = filter(current);\n                    }\n                    if (current._matchFilter) {\n                        result = true;\n                    }\n                }\n                return result;\n            },\n            _find: function (method, value) {\n                var idx, length, node, children;\n                var data = this._data;\n                if (!data) {\n                    return;\n                }\n                node = DataSource.fn[method].call(this, value);\n                if (node) {\n                    return node;\n                }\n                data = this._flatData(this._data);\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    children = data[idx].children;\n                    if (!(children instanceof HierarchicalDataSource)) {\n                        continue;\n                    }\n                    node = children[method](value);\n                    if (node) {\n                        return node;\n                    }\n                }\n            },\n            get: function (id) {\n                return this._find('get', id);\n            },\n            getByUid: function (uid) {\n                return this._find('getByUid', uid);\n            }\n        });\n        function inferList(list, fields) {\n            var items = $(list).children(), idx, length, data = [], record, textField = fields[0].field, urlField = fields[1] && fields[1].field, spriteCssClassField = fields[2] && fields[2].field, imageUrlField = fields[3] && fields[3].field, item, id, textChild, className, children;\n            function elements(collection, tagName) {\n                return collection.filter(tagName).add(collection.find(tagName));\n            }\n            for (idx = 0, length = items.length; idx < length; idx++) {\n                record = { _loaded: true };\n                item = items.eq(idx);\n                textChild = item[0].firstChild;\n                children = item.children();\n                list = children.filter('ul');\n                children = children.filter(':not(ul)');\n                id = item.attr('data-id');\n                if (id) {\n                    record.id = id;\n                }\n                if (textChild) {\n                    record[textField] = textChild.nodeType == 3 ? textChild.nodeValue : children.text();\n                }\n                if (urlField) {\n                    record[urlField] = elements(children, 'a').attr('href');\n                }\n                if (imageUrlField) {\n                    record[imageUrlField] = elements(children, 'img').attr('src');\n                }\n                if (spriteCssClassField) {\n                    className = elements(children, '.k-sprite').prop('className');\n                    record[spriteCssClassField] = className && $.trim(className.replace('k-sprite', ''));\n                }\n                if (list.length) {\n                    record.items = inferList(list.eq(0), fields);\n                }\n                if (item.attr('data-hasChildren') == 'true') {\n                    record.hasChildren = true;\n                }\n                data.push(record);\n            }\n            return data;\n        }\n        HierarchicalDataSource.create = function (options) {\n            options = options && options.push ? { data: options } : options;\n            var dataSource = options || {}, data = dataSource.data, fields = dataSource.fields, list = dataSource.list;\n            if (data && data._dataSource) {\n                return data._dataSource;\n            }\n            if (!data && fields && !dataSource.transport) {\n                if (list) {\n                    data = inferList(list, fields);\n                }\n            }\n            dataSource.data = data;\n            return dataSource instanceof HierarchicalDataSource ? dataSource : new HierarchicalDataSource(dataSource);\n        };\n        var Buffer = kendo.Observable.extend({\n            init: function (dataSource, viewSize, disablePrefetch) {\n                kendo.Observable.fn.init.call(this);\n                this._prefetching = false;\n                this.dataSource = dataSource;\n                this.prefetch = !disablePrefetch;\n                var buffer = this;\n                dataSource.bind('change', function () {\n                    buffer._change();\n                });\n                dataSource.bind('reset', function () {\n                    buffer._reset();\n                });\n                this._syncWithDataSource();\n                this.setViewSize(viewSize);\n            },\n            setViewSize: function (viewSize) {\n                this.viewSize = viewSize;\n                this._recalculate();\n            },\n            at: function (index) {\n                var pageSize = this.pageSize, itemPresent = true;\n                if (index >= this.total()) {\n                    this.trigger('endreached', { index: index });\n                    return null;\n                }\n                if (!this.useRanges) {\n                    return this.dataSource.view()[index];\n                }\n                if (this.useRanges) {\n                    if (index < this.dataOffset || index >= this.skip + pageSize) {\n                        itemPresent = this.range(Math.floor(index / pageSize) * pageSize);\n                    }\n                    if (index === this.prefetchThreshold) {\n                        this._prefetch();\n                    }\n                    if (index === this.midPageThreshold) {\n                        this.range(this.nextMidRange, true);\n                    } else if (index === this.nextPageThreshold) {\n                        this.range(this.nextFullRange);\n                    } else if (index === this.pullBackThreshold) {\n                        if (this.offset === this.skip) {\n                            this.range(this.previousMidRange);\n                        } else {\n                            this.range(this.previousFullRange);\n                        }\n                    }\n                    if (itemPresent) {\n                        return this.dataSource.at(index - this.dataOffset);\n                    } else {\n                        this.trigger('endreached', { index: index });\n                        return null;\n                    }\n                }\n            },\n            indexOf: function (item) {\n                return this.dataSource.data().indexOf(item) + this.dataOffset;\n            },\n            total: function () {\n                return parseInt(this.dataSource.total(), 10);\n            },\n            next: function () {\n                var buffer = this, pageSize = buffer.pageSize, offset = buffer.skip - buffer.viewSize + pageSize, pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize;\n                this.offset = offset;\n                this.dataSource.prefetch(pageSkip, pageSize, function () {\n                    buffer._goToRange(offset, true);\n                });\n            },\n            range: function (offset, nextRange) {\n                if (this.offset === offset) {\n                    return true;\n                }\n                var buffer = this, pageSize = this.pageSize, pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize, dataSource = this.dataSource;\n                if (nextRange) {\n                    pageSkip += pageSize;\n                }\n                if (dataSource.inRange(offset, pageSize)) {\n                    this.offset = offset;\n                    this._recalculate();\n                    this._goToRange(offset);\n                    return true;\n                } else if (this.prefetch) {\n                    dataSource.prefetch(pageSkip, pageSize, function () {\n                        buffer.offset = offset;\n                        buffer._recalculate();\n                        buffer._goToRange(offset, true);\n                    });\n                    return false;\n                }\n                return true;\n            },\n            syncDataSource: function () {\n                var offset = this.offset;\n                this.offset = null;\n                this.range(offset);\n            },\n            destroy: function () {\n                this.unbind();\n            },\n            _prefetch: function () {\n                var buffer = this, pageSize = this.pageSize, prefetchOffset = this.skip + pageSize, dataSource = this.dataSource;\n                if (!dataSource.inRange(prefetchOffset, pageSize) && !this._prefetching && this.prefetch) {\n                    this._prefetching = true;\n                    this.trigger('prefetching', {\n                        skip: prefetchOffset,\n                        take: pageSize\n                    });\n                    dataSource.prefetch(prefetchOffset, pageSize, function () {\n                        buffer._prefetching = false;\n                        buffer.trigger('prefetched', {\n                            skip: prefetchOffset,\n                            take: pageSize\n                        });\n                    });\n                }\n            },\n            _goToRange: function (offset, expanding) {\n                if (this.offset !== offset) {\n                    return;\n                }\n                this.dataOffset = offset;\n                this._expanding = expanding;\n                this.dataSource.range(offset, this.pageSize);\n                this.dataSource.enableRequestsInProgress();\n            },\n            _reset: function () {\n                this._syncPending = true;\n            },\n            _change: function () {\n                var dataSource = this.dataSource;\n                this.length = this.useRanges ? dataSource.lastRange().end : dataSource.view().length;\n                if (this._syncPending) {\n                    this._syncWithDataSource();\n                    this._recalculate();\n                    this._syncPending = false;\n                    this.trigger('reset', { offset: this.offset });\n                }\n                this.trigger('resize');\n                if (this._expanding) {\n                    this.trigger('expand');\n                }\n                delete this._expanding;\n            },\n            _syncWithDataSource: function () {\n                var dataSource = this.dataSource;\n                this._firstItemUid = dataSource.firstItemUid();\n                this.dataOffset = this.offset = dataSource.skip() || 0;\n                this.pageSize = dataSource.pageSize();\n                this.useRanges = dataSource.options.serverPaging;\n            },\n            _recalculate: function () {\n                var pageSize = this.pageSize, offset = this.offset, viewSize = this.viewSize, skip = Math.ceil(offset / pageSize) * pageSize;\n                this.skip = skip;\n                this.midPageThreshold = skip + pageSize - 1;\n                this.nextPageThreshold = skip + viewSize - 1;\n                this.prefetchThreshold = skip + Math.floor(pageSize / 3 * 2);\n                this.pullBackThreshold = this.offset - 1;\n                this.nextMidRange = skip + pageSize - viewSize;\n                this.nextFullRange = skip;\n                this.previousMidRange = offset - viewSize;\n                this.previousFullRange = skip - pageSize;\n            }\n        });\n        var BatchBuffer = kendo.Observable.extend({\n            init: function (dataSource, batchSize) {\n                var batchBuffer = this;\n                kendo.Observable.fn.init.call(batchBuffer);\n                this.dataSource = dataSource;\n                this.batchSize = batchSize;\n                this._total = 0;\n                this.buffer = new Buffer(dataSource, batchSize * 3);\n                this.buffer.bind({\n                    'endreached': function (e) {\n                        batchBuffer.trigger('endreached', { index: e.index });\n                    },\n                    'prefetching': function (e) {\n                        batchBuffer.trigger('prefetching', {\n                            skip: e.skip,\n                            take: e.take\n                        });\n                    },\n                    'prefetched': function (e) {\n                        batchBuffer.trigger('prefetched', {\n                            skip: e.skip,\n                            take: e.take\n                        });\n                    },\n                    'reset': function () {\n                        batchBuffer._total = 0;\n                        batchBuffer.trigger('reset');\n                    },\n                    'resize': function () {\n                        batchBuffer._total = Math.ceil(this.length / batchBuffer.batchSize);\n                        batchBuffer.trigger('resize', {\n                            total: batchBuffer.total(),\n                            offset: this.offset\n                        });\n                    }\n                });\n            },\n            syncDataSource: function () {\n                this.buffer.syncDataSource();\n            },\n            at: function (index) {\n                var buffer = this.buffer, skip = index * this.batchSize, take = this.batchSize, view = [], item;\n                if (buffer.offset > skip) {\n                    buffer.at(buffer.offset - 1);\n                }\n                for (var i = 0; i < take; i++) {\n                    item = buffer.at(skip + i);\n                    if (item === null) {\n                        break;\n                    }\n                    view.push(item);\n                }\n                return view;\n            },\n            total: function () {\n                return this._total;\n            },\n            destroy: function () {\n                this.buffer.destroy();\n                this.unbind();\n            }\n        });\n        extend(true, kendo.data, {\n            readers: { json: DataReader },\n            Query: Query,\n            DataSource: DataSource,\n            HierarchicalDataSource: HierarchicalDataSource,\n            Node: Node,\n            ObservableObject: ObservableObject,\n            ObservableArray: ObservableArray,\n            LazyObservableArray: LazyObservableArray,\n            LocalTransport: LocalTransport,\n            RemoteTransport: RemoteTransport,\n            Cache: Cache,\n            DataReader: DataReader,\n            Model: Model,\n            Buffer: Buffer,\n            BatchBuffer: BatchBuffer\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.binder', [\n        'kendo.core',\n        'kendo.data'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'binder',\n        name: 'MVVM',\n        category: 'framework',\n        description: 'Model View ViewModel (MVVM) is a design pattern which helps developers separate the Model (the data) from the View (the UI).',\n        depends: [\n            'core',\n            'data'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Observable = kendo.Observable, ObservableObject = kendo.data.ObservableObject, ObservableArray = kendo.data.ObservableArray, toString = {}.toString, binders = {}, Class = kendo.Class, proxy = $.proxy, VALUE = 'value', SOURCE = 'source', EVENTS = 'events', CHECKED = 'checked', CSS = 'css', deleteExpando = true, FUNCTION = 'function', CHANGE = 'change';\n        (function () {\n            var a = document.createElement('a');\n            try {\n                delete a.test;\n            } catch (e) {\n                deleteExpando = false;\n            }\n        }());\n        var Binding = Observable.extend({\n            init: function (parents, path) {\n                var that = this;\n                Observable.fn.init.call(that);\n                that.source = parents[0];\n                that.parents = parents;\n                that.path = path;\n                that.dependencies = {};\n                that.dependencies[path] = true;\n                that.observable = that.source instanceof Observable;\n                that._access = function (e) {\n                    that.dependencies[e.field] = true;\n                };\n                if (that.observable) {\n                    that._change = function (e) {\n                        that.change(e);\n                    };\n                    that.source.bind(CHANGE, that._change);\n                }\n            },\n            _parents: function () {\n                var parents = this.parents;\n                var value = this.get();\n                if (value && typeof value.parent == 'function') {\n                    var parent = value.parent();\n                    if ($.inArray(parent, parents) < 0) {\n                        parents = [parent].concat(parents);\n                    }\n                }\n                return parents;\n            },\n            change: function (e) {\n                var dependency, ch, field = e.field, that = this;\n                if (that.path === 'this') {\n                    that.trigger(CHANGE, e);\n                } else {\n                    for (dependency in that.dependencies) {\n                        if (dependency.indexOf(field) === 0) {\n                            ch = dependency.charAt(field.length);\n                            if (!ch || ch === '.' || ch === '[') {\n                                that.trigger(CHANGE, e);\n                                break;\n                            }\n                        }\n                    }\n                }\n            },\n            start: function (source) {\n                source.bind('get', this._access);\n            },\n            stop: function (source) {\n                source.unbind('get', this._access);\n            },\n            get: function () {\n                var that = this, source = that.source, index = 0, path = that.path, result = source;\n                if (!that.observable) {\n                    return result;\n                }\n                that.start(that.source);\n                result = source.get(path);\n                while (result === undefined && source) {\n                    source = that.parents[++index];\n                    if (source instanceof ObservableObject) {\n                        result = source.get(path);\n                    }\n                }\n                if (result === undefined) {\n                    source = that.source;\n                    while (result === undefined && source) {\n                        source = source.parent();\n                        if (source instanceof ObservableObject) {\n                            result = source.get(path);\n                        }\n                    }\n                }\n                if (typeof result === 'function') {\n                    index = path.lastIndexOf('.');\n                    if (index > 0) {\n                        source = source.get(path.substring(0, index));\n                    }\n                    that.start(source);\n                    if (source !== that.source) {\n                        result = result.call(source, that.source);\n                    } else {\n                        result = result.call(source);\n                    }\n                    that.stop(source);\n                }\n                if (source && source !== that.source) {\n                    that.currentSource = source;\n                    source.unbind(CHANGE, that._change).bind(CHANGE, that._change);\n                }\n                that.stop(that.source);\n                return result;\n            },\n            set: function (value) {\n                var source = this.currentSource || this.source;\n                var field = kendo.getter(this.path)(source);\n                if (typeof field === 'function') {\n                    if (source !== this.source) {\n                        field.call(source, this.source, value);\n                    } else {\n                        field.call(source, value);\n                    }\n                } else {\n                    source.set(this.path, value);\n                }\n            },\n            destroy: function () {\n                if (this.observable) {\n                    this.source.unbind(CHANGE, this._change);\n                    if (this.currentSource) {\n                        this.currentSource.unbind(CHANGE, this._change);\n                    }\n                }\n                this.unbind();\n            }\n        });\n        var EventBinding = Binding.extend({\n            get: function () {\n                var source = this.source, path = this.path, index = 0, handler;\n                handler = source.get(path);\n                while (!handler && source) {\n                    source = this.parents[++index];\n                    if (source instanceof ObservableObject) {\n                        handler = source.get(path);\n                    }\n                }\n                return proxy(handler, source);\n            }\n        });\n        var TemplateBinding = Binding.extend({\n            init: function (source, path, template) {\n                var that = this;\n                Binding.fn.init.call(that, source, path);\n                that.template = template;\n            },\n            render: function (value) {\n                var html;\n                this.start(this.source);\n                html = kendo.render(this.template, value);\n                this.stop(this.source);\n                return html;\n            }\n        });\n        var Binder = Class.extend({\n            init: function (element, bindings, options) {\n                this.element = element;\n                this.bindings = bindings;\n                this.options = options;\n            },\n            bind: function (binding, attribute) {\n                var that = this;\n                binding = attribute ? binding[attribute] : binding;\n                binding.bind(CHANGE, function (e) {\n                    that.refresh(attribute || e);\n                });\n                that.refresh(attribute);\n            },\n            destroy: function () {\n            }\n        });\n        var TypedBinder = Binder.extend({\n            dataType: function () {\n                var dataType = this.element.getAttribute('data-type') || this.element.type || 'text';\n                return dataType.toLowerCase();\n            },\n            parsedValue: function () {\n                return this._parseValue(this.element.value, this.dataType());\n            },\n            _parseValue: function (value, dataType) {\n                if (dataType == 'date') {\n                    value = kendo.parseDate(value, 'yyyy-MM-dd');\n                } else if (dataType == 'datetime-local') {\n                    value = kendo.parseDate(value, [\n                        'yyyy-MM-ddTHH:mm:ss',\n                        'yyyy-MM-ddTHH:mm'\n                    ]);\n                } else if (dataType == 'number') {\n                    value = kendo.parseFloat(value);\n                } else if (dataType == 'boolean') {\n                    value = value.toLowerCase();\n                    if (kendo.parseFloat(value) !== null) {\n                        value = Boolean(kendo.parseFloat(value));\n                    } else {\n                        value = value.toLowerCase() === 'true';\n                    }\n                }\n                return value;\n            }\n        });\n        binders.attr = Binder.extend({\n            refresh: function (key) {\n                this.element.setAttribute(key, this.bindings.attr[key].get());\n            }\n        });\n        binders.css = Binder.extend({\n            init: function (element, bindings, options) {\n                Binder.fn.init.call(this, element, bindings, options);\n                this.classes = {};\n            },\n            refresh: function (className) {\n                var element = $(this.element), binding = this.bindings.css[className], hasClass = this.classes[className] = binding.get();\n                if (hasClass) {\n                    element.addClass(className);\n                } else {\n                    element.removeClass(className);\n                }\n            }\n        });\n        binders.style = Binder.extend({\n            refresh: function (key) {\n                this.element.style[key] = this.bindings.style[key].get() || '';\n            }\n        });\n        binders.enabled = Binder.extend({\n            refresh: function () {\n                if (this.bindings.enabled.get()) {\n                    this.element.removeAttribute('disabled');\n                } else {\n                    this.element.setAttribute('disabled', 'disabled');\n                }\n            }\n        });\n        binders.readonly = Binder.extend({\n            refresh: function () {\n                if (this.bindings.readonly.get()) {\n                    this.element.setAttribute('readonly', 'readonly');\n                } else {\n                    this.element.removeAttribute('readonly');\n                }\n            }\n        });\n        binders.disabled = Binder.extend({\n            refresh: function () {\n                if (this.bindings.disabled.get()) {\n                    this.element.setAttribute('disabled', 'disabled');\n                } else {\n                    this.element.removeAttribute('disabled');\n                }\n            }\n        });\n        binders.events = Binder.extend({\n            init: function (element, bindings, options) {\n                Binder.fn.init.call(this, element, bindings, options);\n                this.handlers = {};\n            },\n            refresh: function (key) {\n                var element = $(this.element), binding = this.bindings.events[key], handler = this.handlers[key];\n                if (handler) {\n                    element.off(key, handler);\n                }\n                handler = this.handlers[key] = binding.get();\n                element.on(key, binding.source, handler);\n            },\n            destroy: function () {\n                var element = $(this.element), handler;\n                for (handler in this.handlers) {\n                    element.off(handler, this.handlers[handler]);\n                }\n            }\n        });\n        binders.text = Binder.extend({\n            refresh: function () {\n                var text = this.bindings.text.get();\n                var dataFormat = this.element.getAttribute('data-format') || '';\n                if (text == null) {\n                    text = '';\n                }\n                $(this.element).text(kendo.toString(text, dataFormat));\n            }\n        });\n        binders.visible = Binder.extend({\n            refresh: function () {\n                if (this.bindings.visible.get()) {\n                    this.element.style.display = '';\n                } else {\n                    this.element.style.display = 'none';\n                }\n            }\n        });\n        binders.invisible = Binder.extend({\n            refresh: function () {\n                if (!this.bindings.invisible.get()) {\n                    this.element.style.display = '';\n                } else {\n                    this.element.style.display = 'none';\n                }\n            }\n        });\n        binders.html = Binder.extend({\n            refresh: function () {\n                this.element.innerHTML = this.bindings.html.get();\n            }\n        });\n        binders.value = TypedBinder.extend({\n            init: function (element, bindings, options) {\n                TypedBinder.fn.init.call(this, element, bindings, options);\n                this._change = proxy(this.change, this);\n                this.eventName = options.valueUpdate || CHANGE;\n                $(this.element).on(this.eventName, this._change);\n                this._initChange = false;\n            },\n            change: function () {\n                this._initChange = this.eventName != CHANGE;\n                this.bindings[VALUE].set(this.parsedValue());\n                this._initChange = false;\n            },\n            refresh: function () {\n                if (!this._initChange) {\n                    var value = this.bindings[VALUE].get();\n                    if (value == null) {\n                        value = '';\n                    }\n                    var type = this.dataType();\n                    if (type == 'date') {\n                        value = kendo.toString(value, 'yyyy-MM-dd');\n                    } else if (type == 'datetime-local') {\n                        value = kendo.toString(value, 'yyyy-MM-ddTHH:mm:ss');\n                    }\n                    this.element.value = value;\n                }\n                this._initChange = false;\n            },\n            destroy: function () {\n                $(this.element).off(this.eventName, this._change);\n            }\n        });\n        binders.source = Binder.extend({\n            init: function (element, bindings, options) {\n                Binder.fn.init.call(this, element, bindings, options);\n                var source = this.bindings.source.get();\n                if (source instanceof kendo.data.DataSource && options.autoBind !== false) {\n                    source.fetch();\n                }\n            },\n            refresh: function (e) {\n                var that = this, source = that.bindings.source.get();\n                if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) {\n                    e = e || {};\n                    if (e.action == 'add') {\n                        that.add(e.index, e.items);\n                    } else if (e.action == 'remove') {\n                        that.remove(e.index, e.items);\n                    } else if (e.action != 'itemchange') {\n                        that.render();\n                    }\n                } else {\n                    that.render();\n                }\n            },\n            container: function () {\n                var element = this.element;\n                if (element.nodeName.toLowerCase() == 'table') {\n                    if (!element.tBodies[0]) {\n                        element.appendChild(document.createElement('tbody'));\n                    }\n                    element = element.tBodies[0];\n                }\n                return element;\n            },\n            template: function () {\n                var options = this.options, template = options.template, nodeName = this.container().nodeName.toLowerCase();\n                if (!template) {\n                    if (nodeName == 'select') {\n                        if (options.valueField || options.textField) {\n                            template = kendo.format('<option value=\"#:{0}#\">#:{1}#</option>', options.valueField || options.textField, options.textField || options.valueField);\n                        } else {\n                            template = '<option>#:data#</option>';\n                        }\n                    } else if (nodeName == 'tbody') {\n                        template = '<tr><td>#:data#</td></tr>';\n                    } else if (nodeName == 'ul' || nodeName == 'ol') {\n                        template = '<li>#:data#</li>';\n                    } else {\n                        template = '#:data#';\n                    }\n                    template = kendo.template(template);\n                }\n                return template;\n            },\n            add: function (index, items) {\n                var element = this.container(), parents, idx, length, child, clone = element.cloneNode(false), reference = element.children[index];\n                $(clone).html(kendo.render(this.template(), items));\n                if (clone.children.length) {\n                    parents = this.bindings.source._parents();\n                    for (idx = 0, length = items.length; idx < length; idx++) {\n                        child = clone.children[0];\n                        element.insertBefore(child, reference || null);\n                        bindElement(child, items[idx], this.options.roles, [items[idx]].concat(parents));\n                    }\n                }\n            },\n            remove: function (index, items) {\n                var idx, element = this.container();\n                for (idx = 0; idx < items.length; idx++) {\n                    var child = element.children[index];\n                    unbindElementTree(child, true);\n                    if (child.parentNode == element) {\n                        element.removeChild(child);\n                    }\n                }\n            },\n            render: function () {\n                var source = this.bindings.source.get(), parents, idx, length, element = this.container(), template = this.template();\n                if (source == null) {\n                    return;\n                }\n                if (source instanceof kendo.data.DataSource) {\n                    source = source.view();\n                }\n                if (!(source instanceof ObservableArray) && toString.call(source) !== '[object Array]') {\n                    source = [source];\n                }\n                if (this.bindings.template) {\n                    unbindElementChildren(element, true);\n                    $(element).html(this.bindings.template.render(source));\n                    if (element.children.length) {\n                        parents = this.bindings.source._parents();\n                        for (idx = 0, length = source.length; idx < length; idx++) {\n                            bindElement(element.children[idx], source[idx], this.options.roles, [source[idx]].concat(parents));\n                        }\n                    }\n                } else {\n                    $(element).html(kendo.render(template, source));\n                }\n            }\n        });\n        binders.input = {\n            checked: TypedBinder.extend({\n                init: function (element, bindings, options) {\n                    TypedBinder.fn.init.call(this, element, bindings, options);\n                    this._change = proxy(this.change, this);\n                    $(this.element).change(this._change);\n                },\n                change: function () {\n                    var element = this.element;\n                    var value = this.value();\n                    if (element.type == 'radio') {\n                        value = this.parsedValue();\n                        this.bindings[CHECKED].set(value);\n                    } else if (element.type == 'checkbox') {\n                        var source = this.bindings[CHECKED].get();\n                        var index;\n                        if (source instanceof ObservableArray) {\n                            value = this.parsedValue();\n                            if (value instanceof Date) {\n                                for (var i = 0; i < source.length; i++) {\n                                    if (source[i] instanceof Date && +source[i] === +value) {\n                                        index = i;\n                                        break;\n                                    }\n                                }\n                            } else {\n                                index = source.indexOf(value);\n                            }\n                            if (index > -1) {\n                                source.splice(index, 1);\n                            } else {\n                                source.push(value);\n                            }\n                        } else {\n                            this.bindings[CHECKED].set(value);\n                        }\n                    }\n                },\n                refresh: function () {\n                    var value = this.bindings[CHECKED].get(), source = value, type = this.dataType(), element = this.element;\n                    if (element.type == 'checkbox') {\n                        if (source instanceof ObservableArray) {\n                            var index = -1;\n                            value = this.parsedValue();\n                            if (value instanceof Date) {\n                                for (var i = 0; i < source.length; i++) {\n                                    if (source[i] instanceof Date && +source[i] === +value) {\n                                        index = i;\n                                        break;\n                                    }\n                                }\n                            } else {\n                                index = source.indexOf(value);\n                            }\n                            element.checked = index >= 0;\n                        } else {\n                            element.checked = source;\n                        }\n                    } else if (element.type == 'radio') {\n                        if (type == 'date') {\n                            value = kendo.toString(value, 'yyyy-MM-dd');\n                        } else if (type == 'datetime-local') {\n                            value = kendo.toString(value, 'yyyy-MM-ddTHH:mm:ss');\n                        }\n                        if (value !== null && typeof value !== 'undefined' && element.value === value.toString()) {\n                            element.checked = true;\n                        } else {\n                            element.checked = false;\n                        }\n                    }\n                },\n                value: function () {\n                    var element = this.element, value = element.value;\n                    if (element.type == 'checkbox') {\n                        value = element.checked;\n                    }\n                    return value;\n                },\n                destroy: function () {\n                    $(this.element).off(CHANGE, this._change);\n                }\n            })\n        };\n        binders.select = {\n            source: binders.source.extend({\n                refresh: function (e) {\n                    var that = this, source = that.bindings.source.get();\n                    if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) {\n                        e = e || {};\n                        if (e.action == 'add') {\n                            that.add(e.index, e.items);\n                        } else if (e.action == 'remove') {\n                            that.remove(e.index, e.items);\n                        } else if (e.action == 'itemchange' || e.action === undefined) {\n                            that.render();\n                            if (that.bindings.value) {\n                                if (that.bindings.value) {\n                                    var val = retrievePrimitiveValues(that.bindings.value.get(), $(that.element).data('valueField'));\n                                    if (val === null) {\n                                        that.element.selectedIndex = -1;\n                                    } else {\n                                        that.element.value = val;\n                                    }\n                                }\n                            }\n                        }\n                    } else {\n                        that.render();\n                    }\n                }\n            }),\n            value: TypedBinder.extend({\n                init: function (target, bindings, options) {\n                    TypedBinder.fn.init.call(this, target, bindings, options);\n                    this._change = proxy(this.change, this);\n                    $(this.element).change(this._change);\n                },\n                parsedValue: function () {\n                    var dataType = this.dataType();\n                    var values = [];\n                    var value, option, idx, length;\n                    for (idx = 0, length = this.element.options.length; idx < length; idx++) {\n                        option = this.element.options[idx];\n                        if (option.selected) {\n                            value = option.attributes.value;\n                            if (value && value.specified) {\n                                value = option.value;\n                            } else {\n                                value = option.text;\n                            }\n                            values.push(this._parseValue(value, dataType));\n                        }\n                    }\n                    return values;\n                },\n                change: function () {\n                    var values = [], element = this.element, source, field = this.options.valueField || this.options.textField, valuePrimitive = this.options.valuePrimitive, option, valueIndex, value, idx, length;\n                    for (idx = 0, length = element.options.length; idx < length; idx++) {\n                        option = element.options[idx];\n                        if (option.selected) {\n                            value = option.attributes.value;\n                            if (value && value.specified) {\n                                value = option.value;\n                            } else {\n                                value = option.text;\n                            }\n                            if (field) {\n                                values.push(value);\n                            } else {\n                                values.push(this._parseValue(value, this.dataType()));\n                            }\n                        }\n                    }\n                    if (field) {\n                        source = this.bindings.source.get();\n                        if (source instanceof kendo.data.DataSource) {\n                            source = source.view();\n                        }\n                        for (valueIndex = 0; valueIndex < values.length; valueIndex++) {\n                            for (idx = 0, length = source.length; idx < length; idx++) {\n                                var sourceValue = source[idx].get(field);\n                                var match = String(sourceValue) === values[valueIndex];\n                                if (match) {\n                                    values[valueIndex] = source[idx];\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                    value = this.bindings[VALUE].get();\n                    if (value instanceof ObservableArray) {\n                        value.splice.apply(value, [\n                            0,\n                            value.length\n                        ].concat(values));\n                    } else if (!valuePrimitive && (value instanceof ObservableObject || value === null || value === undefined || !field)) {\n                        this.bindings[VALUE].set(values[0]);\n                    } else {\n                        this.bindings[VALUE].set(values[0].get(field));\n                    }\n                },\n                refresh: function () {\n                    var optionIndex, element = this.element, options = element.options, value = this.bindings[VALUE].get(), values = value, field = this.options.valueField || this.options.textField, found = false, type = this.dataType(), optionValue;\n                    if (!(values instanceof ObservableArray)) {\n                        values = new ObservableArray([value]);\n                    }\n                    element.selectedIndex = -1;\n                    for (var valueIndex = 0; valueIndex < values.length; valueIndex++) {\n                        value = values[valueIndex];\n                        if (field && value instanceof ObservableObject) {\n                            value = value.get(field);\n                        }\n                        if (type == 'date') {\n                            value = kendo.toString(values[valueIndex], 'yyyy-MM-dd');\n                        } else if (type == 'datetime-local') {\n                            value = kendo.toString(values[valueIndex], 'yyyy-MM-ddTHH:mm:ss');\n                        }\n                        for (optionIndex = 0; optionIndex < options.length; optionIndex++) {\n                            optionValue = options[optionIndex].value;\n                            if (optionValue === '' && value !== '') {\n                                optionValue = options[optionIndex].text;\n                            }\n                            if (value != null && optionValue == value.toString()) {\n                                options[optionIndex].selected = true;\n                                found = true;\n                            }\n                        }\n                    }\n                },\n                destroy: function () {\n                    $(this.element).off(CHANGE, this._change);\n                }\n            })\n        };\n        function dataSourceBinding(bindingName, fieldName, setter) {\n            return Binder.extend({\n                init: function (widget, bindings, options) {\n                    var that = this;\n                    Binder.fn.init.call(that, widget.element[0], bindings, options);\n                    that.widget = widget;\n                    that._dataBinding = proxy(that.dataBinding, that);\n                    that._dataBound = proxy(that.dataBound, that);\n                    that._itemChange = proxy(that.itemChange, that);\n                },\n                itemChange: function (e) {\n                    bindElement(e.item[0], e.data, this._ns(e.ns), [e.data].concat(this.bindings[bindingName]._parents()));\n                },\n                dataBinding: function (e) {\n                    var idx, length, widget = this.widget, items = e.removedItems || widget.items();\n                    for (idx = 0, length = items.length; idx < length; idx++) {\n                        unbindElementTree(items[idx], false);\n                    }\n                },\n                _ns: function (ns) {\n                    ns = ns || kendo.ui;\n                    var all = [\n                        kendo.ui,\n                        kendo.dataviz.ui,\n                        kendo.mobile.ui\n                    ];\n                    all.splice($.inArray(ns, all), 1);\n                    all.unshift(ns);\n                    return kendo.rolesFromNamespaces(all);\n                },\n                dataBound: function (e) {\n                    var idx, length, widget = this.widget, items = e.addedItems || widget.items(), dataSource = widget[fieldName], view, parents, hds = kendo.data.HierarchicalDataSource;\n                    if (hds && dataSource instanceof hds) {\n                        return;\n                    }\n                    if (items.length) {\n                        view = e.addedDataItems || dataSource.flatView();\n                        parents = this.bindings[bindingName]._parents();\n                        for (idx = 0, length = view.length; idx < length; idx++) {\n                            if (items[idx]) {\n                                bindElement(items[idx], view[idx], this._ns(e.ns), [view[idx]].concat(parents));\n                            }\n                        }\n                    }\n                },\n                refresh: function (e) {\n                    var that = this, source, widget = that.widget, select, multiselect, dropdowntree;\n                    e = e || {};\n                    if (!e.action) {\n                        that.destroy();\n                        widget.bind('dataBinding', that._dataBinding);\n                        widget.bind('dataBound', that._dataBound);\n                        widget.bind('itemChange', that._itemChange);\n                        source = that.bindings[bindingName].get();\n                        if (widget[fieldName] instanceof kendo.data.DataSource && widget[fieldName] != source) {\n                            if (source instanceof kendo.data.DataSource) {\n                                widget[setter](source);\n                            } else if (source && source._dataSource) {\n                                widget[setter](source._dataSource);\n                            } else {\n                                select = kendo.ui.Select && widget instanceof kendo.ui.Select;\n                                multiselect = kendo.ui.MultiSelect && widget instanceof kendo.ui.MultiSelect;\n                                dropdowntree = kendo.ui.DropDownTree && widget instanceof kendo.ui.DropDownTree;\n                                if (!dropdowntree) {\n                                    widget[fieldName].data(source);\n                                } else {\n                                    widget.treeview[fieldName].data(source);\n                                }\n                                if (that.bindings.value && (select || multiselect)) {\n                                    widget.value(retrievePrimitiveValues(that.bindings.value.get(), widget.options.dataValueField));\n                                }\n                            }\n                        }\n                    }\n                },\n                destroy: function () {\n                    var widget = this.widget;\n                    widget.unbind('dataBinding', this._dataBinding);\n                    widget.unbind('dataBound', this._dataBound);\n                    widget.unbind('itemChange', this._itemChange);\n                }\n            });\n        }\n        binders.widget = {\n            events: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                    this.handlers = {};\n                },\n                refresh: function (key) {\n                    var binding = this.bindings.events[key], handler = this.handlers[key];\n                    if (handler) {\n                        this.widget.unbind(key, handler);\n                    }\n                    handler = binding.get();\n                    this.handlers[key] = function (e) {\n                        e.data = binding.source;\n                        handler(e);\n                        if (e.data === binding.source) {\n                            delete e.data;\n                        }\n                    };\n                    this.widget.bind(key, this.handlers[key]);\n                },\n                destroy: function () {\n                    var handler;\n                    for (handler in this.handlers) {\n                        this.widget.unbind(handler, this.handlers[handler]);\n                    }\n                }\n            }),\n            checked: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                    this._change = proxy(this.change, this);\n                    this.widget.bind(CHANGE, this._change);\n                },\n                change: function () {\n                    this.bindings[CHECKED].set(this.value());\n                },\n                refresh: function () {\n                    this.widget.check(this.bindings[CHECKED].get() === true);\n                },\n                value: function () {\n                    var element = this.element, value = element.value;\n                    if (value == 'on' || value == 'off' || this.element.type == 'checkbox') {\n                        value = element.checked;\n                    }\n                    return value;\n                },\n                destroy: function () {\n                    this.widget.unbind(CHANGE, this._change);\n                }\n            }),\n            start: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this._change = proxy(this.change, this);\n                    this.widget = widget;\n                    this.widget.bind(CHANGE, this._change);\n                },\n                change: function () {\n                    this.bindings.start.set(this.widget.range().start);\n                },\n                refresh: function () {\n                    var that = this;\n                    var start = this.bindings.start.get();\n                    var end = that.widget._range ? that.widget._range.end : null;\n                    this.widget.range({\n                        start: start,\n                        end: end\n                    });\n                },\n                destroy: function () {\n                    this.widget.unbind(CHANGE, this._change);\n                }\n            }),\n            end: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this._change = proxy(this.change, this);\n                    this.widget = widget;\n                    this.widget.bind(CHANGE, this._change);\n                },\n                change: function () {\n                    this.bindings.end.set(this.widget.range().end);\n                },\n                refresh: function () {\n                    var that = this;\n                    var end = this.bindings.end.get();\n                    var start = that.widget._range ? that.widget._range.start : null;\n                    this.widget.range({\n                        start: start,\n                        end: end\n                    });\n                },\n                destroy: function () {\n                    this.widget.unbind(CHANGE, this._change);\n                }\n            }),\n            visible: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    var visible = this.bindings.visible.get();\n                    this.widget.wrapper[0].style.display = visible ? '' : 'none';\n                }\n            }),\n            invisible: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    var invisible = this.bindings.invisible.get();\n                    this.widget.wrapper[0].style.display = invisible ? 'none' : '';\n                }\n            }),\n            enabled: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    if (this.widget.enable) {\n                        this.widget.enable(this.bindings.enabled.get());\n                    }\n                }\n            }),\n            disabled: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    if (this.widget.enable) {\n                        this.widget.enable(!this.bindings.disabled.get());\n                    }\n                }\n            }),\n            source: dataSourceBinding('source', 'dataSource', 'setDataSource'),\n            value: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                    this._change = $.proxy(this.change, this);\n                    this.widget.first(CHANGE, this._change);\n                    var value = this.bindings.value.get();\n                    this._valueIsObservableObject = !options.valuePrimitive && (value == null || value instanceof ObservableObject);\n                    this._valueIsObservableArray = value instanceof ObservableArray;\n                    this._initChange = false;\n                },\n                _source: function () {\n                    var source;\n                    if (this.widget.dataItem) {\n                        source = this.widget.dataItem();\n                        if (source && source instanceof ObservableObject) {\n                            return [source];\n                        }\n                    }\n                    if (this.bindings.source) {\n                        source = this.bindings.source.get();\n                    }\n                    if (!source || source instanceof kendo.data.DataSource) {\n                        source = this.widget.dataSource.flatView();\n                    }\n                    return source;\n                },\n                change: function () {\n                    var value = this.widget.value(), field = this.options.dataValueField || this.options.dataTextField, isArray = toString.call(value) === '[object Array]', isObservableObject = this._valueIsObservableObject, valueIndex, valueLength, values = [], sourceItem, sourceValue, idx, length, source;\n                    this._initChange = true;\n                    if (field) {\n                        if (value === '' && (isObservableObject || this.options.valuePrimitive)) {\n                            value = null;\n                        } else {\n                            source = this._source();\n                            if (isArray) {\n                                valueLength = value.length;\n                                values = value.slice(0);\n                            }\n                            for (idx = 0, length = source.length; idx < length; idx++) {\n                                sourceItem = source[idx];\n                                sourceValue = sourceItem.get(field);\n                                if (isArray) {\n                                    for (valueIndex = 0; valueIndex < valueLength; valueIndex++) {\n                                        if (sourceValue == values[valueIndex]) {\n                                            values[valueIndex] = sourceItem;\n                                            break;\n                                        }\n                                    }\n                                } else if (sourceValue == value) {\n                                    value = isObservableObject ? sourceItem : sourceValue;\n                                    break;\n                                }\n                            }\n                            if (values[0]) {\n                                if (this._valueIsObservableArray) {\n                                    value = values;\n                                } else if (isObservableObject || !field) {\n                                    value = values[0];\n                                } else {\n                                    value = values[0].get(field);\n                                }\n                            }\n                        }\n                    }\n                    this.bindings.value.set(value);\n                    this._initChange = false;\n                },\n                refresh: function () {\n                    if (!this._initChange) {\n                        var widget = this.widget;\n                        var options = widget.options;\n                        var textField = options.dataTextField;\n                        var valueField = options.dataValueField || textField;\n                        var value = this.bindings.value.get();\n                        var text = options.text || '';\n                        var idx = 0, length;\n                        var values = [];\n                        if (value === undefined) {\n                            value = null;\n                        }\n                        if (valueField) {\n                            if (value instanceof ObservableArray) {\n                                for (length = value.length; idx < length; idx++) {\n                                    values[idx] = value[idx].get(valueField);\n                                }\n                                value = values;\n                            } else if (value instanceof ObservableObject) {\n                                text = value.get(textField);\n                                value = value.get(valueField);\n                            }\n                        }\n                        if (options.autoBind === false && !options.cascadeFrom && widget.listView && !widget.listView.bound()) {\n                            if (textField === valueField && !text) {\n                                text = value;\n                            }\n                            if (!text && (value || value === 0) && options.valuePrimitive) {\n                                widget.value(value);\n                            } else {\n                                widget._preselect(value, text);\n                            }\n                        } else {\n                            widget.value(value);\n                        }\n                    }\n                    this._initChange = false;\n                },\n                destroy: function () {\n                    this.widget.unbind(CHANGE, this._change);\n                }\n            }),\n            dropdowntree: {\n                value: Binder.extend({\n                    init: function (widget, bindings, options) {\n                        Binder.fn.init.call(this, widget.element[0], bindings, options);\n                        this.widget = widget;\n                        this._change = $.proxy(this.change, this);\n                        this.widget.first(CHANGE, this._change);\n                        this._initChange = false;\n                    },\n                    change: function () {\n                        var that = this, oldValues = that.bindings[VALUE].get(), valuePrimitive = that.options.valuePrimitive, selectedNode = that.widget.treeview.select(), nonPrimitiveValues = that.widget._isMultipleSelection() ? that.widget._getAllChecked() : that.widget.treeview.dataItem(selectedNode) || that.widget.value(), newValues = valuePrimitive || that.widget.options.autoBind === false ? that.widget.value() : nonPrimitiveValues;\n                        var field = this.options.dataValueField || this.options.dataTextField;\n                        newValues = newValues.slice ? newValues.slice(0) : newValues;\n                        that._initChange = true;\n                        if (oldValues instanceof ObservableArray) {\n                            var remove = [];\n                            var newLength = newValues.length;\n                            var i = 0, j = 0;\n                            var old = oldValues[i];\n                            var same = false;\n                            var removeIndex;\n                            var newValue;\n                            var found;\n                            while (old !== undefined) {\n                                found = false;\n                                for (j = 0; j < newLength; j++) {\n                                    if (valuePrimitive) {\n                                        same = newValues[j] == old;\n                                    } else {\n                                        newValue = newValues[j];\n                                        newValue = newValue.get ? newValue.get(field) : newValue;\n                                        same = newValue == (old.get ? old.get(field) : old);\n                                    }\n                                    if (same) {\n                                        newValues.splice(j, 1);\n                                        newLength -= 1;\n                                        found = true;\n                                        break;\n                                    }\n                                }\n                                if (!found) {\n                                    remove.push(old);\n                                    arraySplice(oldValues, i, 1);\n                                    removeIndex = i;\n                                } else {\n                                    i += 1;\n                                }\n                                old = oldValues[i];\n                            }\n                            arraySplice(oldValues, oldValues.length, 0, newValues);\n                            if (remove.length) {\n                                oldValues.trigger('change', {\n                                    action: 'remove',\n                                    items: remove,\n                                    index: removeIndex\n                                });\n                            }\n                            if (newValues.length) {\n                                oldValues.trigger('change', {\n                                    action: 'add',\n                                    items: newValues,\n                                    index: oldValues.length - 1\n                                });\n                            }\n                        } else {\n                            that.bindings[VALUE].set(newValues);\n                        }\n                        that._initChange = false;\n                    },\n                    refresh: function () {\n                        if (!this._initChange) {\n                            var options = this.options, widget = this.widget, field = options.dataValueField || options.dataTextField, value = this.bindings.value.get(), data = value, idx = 0, length, values = [], selectedValue;\n                            if (field) {\n                                if (value instanceof ObservableArray) {\n                                    for (length = value.length; idx < length; idx++) {\n                                        selectedValue = value[idx];\n                                        values[idx] = selectedValue.get ? selectedValue.get(field) : selectedValue;\n                                    }\n                                    value = values;\n                                } else if (value instanceof ObservableObject) {\n                                    value = value.get(field);\n                                }\n                            }\n                            if (options.autoBind === false && options.valuePrimitive !== true) {\n                                widget._preselect(data, value);\n                            } else {\n                                widget.value(value);\n                            }\n                        }\n                    },\n                    destroy: function () {\n                        this.widget.unbind(CHANGE, this._change);\n                    }\n                })\n            },\n            gantt: { dependencies: dataSourceBinding('dependencies', 'dependencies', 'setDependenciesDataSource') },\n            multiselect: {\n                value: Binder.extend({\n                    init: function (widget, bindings, options) {\n                        Binder.fn.init.call(this, widget.element[0], bindings, options);\n                        this.widget = widget;\n                        this._change = $.proxy(this.change, this);\n                        this.widget.first(CHANGE, this._change);\n                        this._initChange = false;\n                    },\n                    change: function () {\n                        var that = this, oldValues = that.bindings[VALUE].get(), valuePrimitive = that.options.valuePrimitive, newValues = valuePrimitive ? that.widget.value() : that.widget.dataItems();\n                        var field = this.options.dataValueField || this.options.dataTextField;\n                        newValues = newValues.slice(0);\n                        that._initChange = true;\n                        if (oldValues instanceof ObservableArray) {\n                            var remove = [];\n                            var newLength = newValues.length;\n                            var i = 0, j = 0;\n                            var old = oldValues[i];\n                            var same = false;\n                            var removeIndex;\n                            var newValue;\n                            var found;\n                            while (old !== undefined) {\n                                found = false;\n                                for (j = 0; j < newLength; j++) {\n                                    if (valuePrimitive) {\n                                        same = newValues[j] == old;\n                                    } else {\n                                        newValue = newValues[j];\n                                        newValue = newValue.get ? newValue.get(field) : newValue;\n                                        same = newValue == (old.get ? old.get(field) : old);\n                                    }\n                                    if (same) {\n                                        newValues.splice(j, 1);\n                                        newLength -= 1;\n                                        found = true;\n                                        break;\n                                    }\n                                }\n                                if (!found) {\n                                    remove.push(old);\n                                    arraySplice(oldValues, i, 1);\n                                    removeIndex = i;\n                                } else {\n                                    i += 1;\n                                }\n                                old = oldValues[i];\n                            }\n                            arraySplice(oldValues, oldValues.length, 0, newValues);\n                            if (remove.length) {\n                                oldValues.trigger('change', {\n                                    action: 'remove',\n                                    items: remove,\n                                    index: removeIndex\n                                });\n                            }\n                            if (newValues.length) {\n                                oldValues.trigger('change', {\n                                    action: 'add',\n                                    items: newValues,\n                                    index: oldValues.length - 1\n                                });\n                            }\n                        } else {\n                            that.bindings[VALUE].set(newValues);\n                        }\n                        that._initChange = false;\n                    },\n                    refresh: function () {\n                        if (!this._initChange) {\n                            var options = this.options, widget = this.widget, field = options.dataValueField || options.dataTextField, value = this.bindings.value.get(), data = value, idx = 0, length, values = [], selectedValue;\n                            if (value === undefined) {\n                                value = null;\n                            }\n                            if (field) {\n                                if (value instanceof ObservableArray) {\n                                    for (length = value.length; idx < length; idx++) {\n                                        selectedValue = value[idx];\n                                        values[idx] = selectedValue.get ? selectedValue.get(field) : selectedValue;\n                                    }\n                                    value = values;\n                                } else if (value instanceof ObservableObject) {\n                                    value = value.get(field);\n                                }\n                            }\n                            if (options.autoBind === false && options.valuePrimitive !== true && !widget._isBound()) {\n                                widget._preselect(data, value);\n                            } else {\n                                widget.value(value);\n                            }\n                        }\n                    },\n                    destroy: function () {\n                        this.widget.unbind(CHANGE, this._change);\n                    }\n                })\n            },\n            scheduler: {\n                source: dataSourceBinding('source', 'dataSource', 'setDataSource').extend({\n                    dataBound: function (e) {\n                        var idx;\n                        var length;\n                        var widget = this.widget;\n                        var elements = e.addedItems || widget.items();\n                        var data, parents;\n                        if (elements.length) {\n                            data = e.addedDataItems || widget.dataItems();\n                            parents = this.bindings.source._parents();\n                            for (idx = 0, length = data.length; idx < length; idx++) {\n                                bindElement(elements[idx], data[idx], this._ns(e.ns), [data[idx]].concat(parents));\n                            }\n                        }\n                    }\n                })\n            },\n            grid: {\n                source: dataSourceBinding('source', 'dataSource', 'setDataSource').extend({\n                    dataBound: function (e) {\n                        var idx, length, widget = this.widget, elements = e.addedItems || widget.items(), parents, data;\n                        if (elements.length) {\n                            data = e.addedDataItems || widget.dataItems();\n                            parents = this.bindings.source._parents();\n                            for (idx = 0, length = data.length; idx < length; idx++) {\n                                bindElement(elements[idx], data[idx], this._ns(e.ns), [data[idx]].concat(parents));\n                            }\n                        }\n                    }\n                })\n            }\n        };\n        var arraySplice = function (arr, idx, remove, add) {\n            add = add || [];\n            remove = remove || 0;\n            var addLength = add.length;\n            var oldLength = arr.length;\n            var shifted = [].slice.call(arr, idx + remove);\n            var shiftedLength = shifted.length;\n            var index;\n            if (addLength) {\n                addLength = idx + addLength;\n                index = 0;\n                for (; idx < addLength; idx++) {\n                    arr[idx] = add[index];\n                    index++;\n                }\n                arr.length = addLength;\n            } else if (remove) {\n                arr.length = idx;\n                remove += idx;\n                while (idx < remove) {\n                    delete arr[--remove];\n                }\n            }\n            if (shiftedLength) {\n                shiftedLength = idx + shiftedLength;\n                index = 0;\n                for (; idx < shiftedLength; idx++) {\n                    arr[idx] = shifted[index];\n                    index++;\n                }\n                arr.length = shiftedLength;\n            }\n            idx = arr.length;\n            while (idx < oldLength) {\n                delete arr[idx];\n                idx++;\n            }\n        };\n        var BindingTarget = Class.extend({\n            init: function (target, options) {\n                this.target = target;\n                this.options = options;\n                this.toDestroy = [];\n            },\n            bind: function (bindings) {\n                var key, hasValue, hasSource, hasEvents, hasChecked, hasCss, widgetBinding = this instanceof WidgetBindingTarget, specificBinders = this.binders();\n                for (key in bindings) {\n                    if (key == VALUE) {\n                        hasValue = true;\n                    } else if (key == SOURCE) {\n                        hasSource = true;\n                    } else if (key == EVENTS && !widgetBinding) {\n                        hasEvents = true;\n                    } else if (key == CHECKED) {\n                        hasChecked = true;\n                    } else if (key == CSS) {\n                        hasCss = true;\n                    } else {\n                        this.applyBinding(key, bindings, specificBinders);\n                    }\n                }\n                if (hasSource) {\n                    this.applyBinding(SOURCE, bindings, specificBinders);\n                }\n                if (hasValue) {\n                    this.applyBinding(VALUE, bindings, specificBinders);\n                }\n                if (hasChecked) {\n                    this.applyBinding(CHECKED, bindings, specificBinders);\n                }\n                if (hasEvents && !widgetBinding) {\n                    this.applyBinding(EVENTS, bindings, specificBinders);\n                }\n                if (hasCss && !widgetBinding) {\n                    this.applyBinding(CSS, bindings, specificBinders);\n                }\n            },\n            binders: function () {\n                return binders[this.target.nodeName.toLowerCase()] || {};\n            },\n            applyBinding: function (name, bindings, specificBinders) {\n                var binder = specificBinders[name] || binders[name], toDestroy = this.toDestroy, attribute, binding = bindings[name];\n                if (binder) {\n                    binder = new binder(this.target, bindings, this.options);\n                    toDestroy.push(binder);\n                    if (binding instanceof Binding) {\n                        binder.bind(binding);\n                        toDestroy.push(binding);\n                    } else {\n                        for (attribute in binding) {\n                            binder.bind(binding, attribute);\n                            toDestroy.push(binding[attribute]);\n                        }\n                    }\n                } else if (name !== 'template') {\n                    throw new Error('The ' + name + ' binding is not supported by the ' + this.target.nodeName.toLowerCase() + ' element');\n                }\n            },\n            destroy: function () {\n                var idx, length, toDestroy = this.toDestroy;\n                for (idx = 0, length = toDestroy.length; idx < length; idx++) {\n                    toDestroy[idx].destroy();\n                }\n            }\n        });\n        var WidgetBindingTarget = BindingTarget.extend({\n            binders: function () {\n                return binders.widget[this.target.options.name.toLowerCase()] || {};\n            },\n            applyBinding: function (name, bindings, specificBinders) {\n                var binder = specificBinders[name] || binders.widget[name], toDestroy = this.toDestroy, attribute, binding = bindings[name];\n                if (binder) {\n                    binder = new binder(this.target, bindings, this.target.options);\n                    toDestroy.push(binder);\n                    if (binding instanceof Binding) {\n                        binder.bind(binding);\n                        toDestroy.push(binding);\n                    } else {\n                        for (attribute in binding) {\n                            binder.bind(binding, attribute);\n                            toDestroy.push(binding[attribute]);\n                        }\n                    }\n                } else {\n                    throw new Error('The ' + name + ' binding is not supported by the ' + this.target.options.name + ' widget');\n                }\n            }\n        });\n        function bindingTargetForRole(element, roles) {\n            var widget = kendo.initWidget(element, {}, roles);\n            if (widget) {\n                return new WidgetBindingTarget(widget);\n            }\n        }\n        var keyValueRegExp = /[A-Za-z0-9_\\-]+:(\\{([^}]*)\\}|[^,}]+)/g, whiteSpaceRegExp = /\\s/g;\n        function parseBindings(bind) {\n            var result = {}, idx, length, token, colonIndex, key, value, tokens;\n            tokens = bind.match(keyValueRegExp);\n            for (idx = 0, length = tokens.length; idx < length; idx++) {\n                token = tokens[idx];\n                colonIndex = token.indexOf(':');\n                key = token.substring(0, colonIndex);\n                value = token.substring(colonIndex + 1);\n                if (value.charAt(0) == '{') {\n                    value = parseBindings(value);\n                }\n                result[key] = value;\n            }\n            return result;\n        }\n        function createBindings(bindings, source, type) {\n            var binding, result = {};\n            for (binding in bindings) {\n                result[binding] = new type(source, bindings[binding]);\n            }\n            return result;\n        }\n        function bindElement(element, source, roles, parents) {\n            if (!element || element.getAttribute('data-' + kendo.ns + 'stop')) {\n                return;\n            }\n            var role = element.getAttribute('data-' + kendo.ns + 'role'), idx, bind = element.getAttribute('data-' + kendo.ns + 'bind'), childrenCopy = [], deep = true, bindings, options = {}, target;\n            parents = parents || [source];\n            if (role || bind) {\n                unbindElement(element, false);\n            }\n            if (role) {\n                target = bindingTargetForRole(element, roles);\n            }\n            if (bind) {\n                bind = parseBindings(bind.replace(whiteSpaceRegExp, ''));\n                if (!target) {\n                    options = kendo.parseOptions(element, {\n                        textField: '',\n                        valueField: '',\n                        template: '',\n                        valueUpdate: CHANGE,\n                        valuePrimitive: false,\n                        autoBind: true\n                    }, source);\n                    options.roles = roles;\n                    target = new BindingTarget(element, options);\n                }\n                target.source = source;\n                bindings = createBindings(bind, parents, Binding);\n                if (options.template) {\n                    bindings.template = new TemplateBinding(parents, '', options.template);\n                }\n                if (bindings.click) {\n                    bind.events = bind.events || {};\n                    bind.events.click = bind.click;\n                    bindings.click.destroy();\n                    delete bindings.click;\n                }\n                if (bindings.source) {\n                    deep = false;\n                }\n                if (bind.attr) {\n                    bindings.attr = createBindings(bind.attr, parents, Binding);\n                }\n                if (bind.style) {\n                    bindings.style = createBindings(bind.style, parents, Binding);\n                }\n                if (bind.events) {\n                    bindings.events = createBindings(bind.events, parents, EventBinding);\n                }\n                if (bind.css) {\n                    bindings.css = createBindings(bind.css, parents, Binding);\n                }\n                target.bind(bindings);\n            }\n            if (target) {\n                element.kendoBindingTarget = target;\n            }\n            var children = element.children;\n            if (deep && children) {\n                for (idx = 0; idx < children.length; idx++) {\n                    childrenCopy[idx] = children[idx];\n                }\n                for (idx = 0; idx < childrenCopy.length; idx++) {\n                    bindElement(childrenCopy[idx], source, roles, parents);\n                }\n            }\n        }\n        function bind(dom, object) {\n            var idx, length, node, roles = kendo.rolesFromNamespaces([].slice.call(arguments, 2));\n            object = kendo.observable(object);\n            dom = $(dom);\n            for (idx = 0, length = dom.length; idx < length; idx++) {\n                node = dom[idx];\n                if (node.nodeType === 1) {\n                    bindElement(node, object, roles);\n                }\n            }\n        }\n        function unbindElement(element, destroyWidget) {\n            var bindingTarget = element.kendoBindingTarget;\n            if (bindingTarget) {\n                bindingTarget.destroy();\n                if (deleteExpando) {\n                    delete element.kendoBindingTarget;\n                } else if (element.removeAttribute) {\n                    element.removeAttribute('kendoBindingTarget');\n                } else {\n                    element.kendoBindingTarget = null;\n                }\n            }\n            if (destroyWidget) {\n                var widget = kendo.widgetInstance($(element));\n                if (widget && typeof widget.destroy === FUNCTION) {\n                    widget.destroy();\n                }\n            }\n        }\n        function unbindElementTree(element, destroyWidgets) {\n            unbindElement(element, destroyWidgets);\n            unbindElementChildren(element, destroyWidgets);\n        }\n        function unbindElementChildren(element, destroyWidgets) {\n            var children = element.children;\n            if (children) {\n                for (var idx = 0, length = children.length; idx < length; idx++) {\n                    unbindElementTree(children[idx], destroyWidgets);\n                }\n            }\n        }\n        function unbind(dom) {\n            var idx, length;\n            dom = $(dom);\n            for (idx = 0, length = dom.length; idx < length; idx++) {\n                unbindElementTree(dom[idx], false);\n            }\n        }\n        function notify(widget, namespace) {\n            var element = widget.element, bindingTarget = element[0].kendoBindingTarget;\n            if (bindingTarget) {\n                bind(element, bindingTarget.source, namespace);\n            }\n        }\n        function retrievePrimitiveValues(value, valueField) {\n            var values = [];\n            var idx = 0;\n            var length;\n            var item;\n            if (!valueField) {\n                return value;\n            }\n            if (value instanceof ObservableArray) {\n                for (length = value.length; idx < length; idx++) {\n                    item = value[idx];\n                    values[idx] = item.get ? item.get(valueField) : item[valueField];\n                }\n                value = values;\n            } else if (value instanceof ObservableObject) {\n                value = value.get(valueField);\n            }\n            return value;\n        }\n        kendo.unbind = unbind;\n        kendo.bind = bind;\n        kendo.data.binders = binders;\n        kendo.data.Binder = Binder;\n        kendo.notify = notify;\n        kendo.observable = function (object) {\n            if (!(object instanceof ObservableObject)) {\n                object = new ObservableObject(object);\n            }\n            return object;\n        };\n        kendo.observableHierarchy = function (array) {\n            var dataSource = kendo.data.HierarchicalDataSource.create(array);\n            function recursiveRead(data) {\n                var i, children;\n                for (i = 0; i < data.length; i++) {\n                    data[i]._initChildren();\n                    children = data[i].children;\n                    children.fetch();\n                    data[i].items = children.data();\n                    recursiveRead(data[i].items);\n                }\n            }\n            dataSource.fetch();\n            recursiveRead(dataSource.data());\n            dataSource._data._dataSource = dataSource;\n            return dataSource._data;\n        };\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.fx', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'fx',\n        name: 'Effects',\n        category: 'framework',\n        description: 'Required for animation effects in all Kendo UI widgets.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, fx = kendo.effects, each = $.each, extend = $.extend, proxy = $.proxy, support = kendo.support, browser = support.browser, transforms = support.transforms, transitions = support.transitions, scaleProperties = {\n                scale: 0,\n                scalex: 0,\n                scaley: 0,\n                scale3d: 0\n            }, translateProperties = {\n                translate: 0,\n                translatex: 0,\n                translatey: 0,\n                translate3d: 0\n            }, hasZoom = typeof document.documentElement.style.zoom !== 'undefined' && !transforms, matrix3dRegExp = /matrix3?d?\\s*\\(.*,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?/i, cssParamsRegExp = /^(-?[\\d\\.\\-]+)?[\\w\\s]*,?\\s*(-?[\\d\\.\\-]+)?[\\w\\s]*/i, translateXRegExp = /translatex?$/i, oldEffectsRegExp = /(zoom|fade|expand)(\\w+)/, singleEffectRegExp = /(zoom|fade|expand)/, unitRegExp = /[xy]$/i, transformProps = [\n                'perspective',\n                'rotate',\n                'rotatex',\n                'rotatey',\n                'rotatez',\n                'rotate3d',\n                'scale',\n                'scalex',\n                'scaley',\n                'scalez',\n                'scale3d',\n                'skew',\n                'skewx',\n                'skewy',\n                'translate',\n                'translatex',\n                'translatey',\n                'translatez',\n                'translate3d',\n                'matrix',\n                'matrix3d'\n            ], transform2d = [\n                'rotate',\n                'scale',\n                'scalex',\n                'scaley',\n                'skew',\n                'skewx',\n                'skewy',\n                'translate',\n                'translatex',\n                'translatey',\n                'matrix'\n            ], transform2units = {\n                'rotate': 'deg',\n                scale: '',\n                skew: 'px',\n                translate: 'px'\n            }, cssPrefix = transforms.css, round = Math.round, BLANK = '', PX = 'px', NONE = 'none', AUTO = 'auto', WIDTH = 'width', HEIGHT = 'height', HIDDEN = 'hidden', ORIGIN = 'origin', ABORT_ID = 'abortId', OVERFLOW = 'overflow', TRANSLATE = 'translate', POSITION = 'position', COMPLETE_CALLBACK = 'completeCallback', TRANSITION = cssPrefix + 'transition', TRANSFORM = cssPrefix + 'transform', BACKFACE = cssPrefix + 'backface-visibility', PERSPECTIVE = cssPrefix + 'perspective', DEFAULT_PERSPECTIVE = '1500px', TRANSFORM_PERSPECTIVE = 'perspective(' + DEFAULT_PERSPECTIVE + ')', directions = {\n                left: {\n                    reverse: 'right',\n                    property: 'left',\n                    transition: 'translatex',\n                    vertical: false,\n                    modifier: -1\n                },\n                right: {\n                    reverse: 'left',\n                    property: 'left',\n                    transition: 'translatex',\n                    vertical: false,\n                    modifier: 1\n                },\n                down: {\n                    reverse: 'up',\n                    property: 'top',\n                    transition: 'translatey',\n                    vertical: true,\n                    modifier: 1\n                },\n                up: {\n                    reverse: 'down',\n                    property: 'top',\n                    transition: 'translatey',\n                    vertical: true,\n                    modifier: -1\n                },\n                top: { reverse: 'bottom' },\n                bottom: { reverse: 'top' },\n                'in': {\n                    reverse: 'out',\n                    modifier: -1\n                },\n                out: {\n                    reverse: 'in',\n                    modifier: 1\n                },\n                vertical: { reverse: 'vertical' },\n                horizontal: { reverse: 'horizontal' }\n            };\n        kendo.directions = directions;\n        extend($.fn, {\n            kendoStop: function (clearQueue, gotoEnd) {\n                if (transitions) {\n                    return fx.stopQueue(this, clearQueue || false, gotoEnd || false);\n                } else {\n                    return this.stop(clearQueue, gotoEnd);\n                }\n            }\n        });\n        if (transforms && !transitions) {\n            each(transform2d, function (idx, value) {\n                $.fn[value] = function (val) {\n                    if (typeof val == 'undefined') {\n                        return animationProperty(this, value);\n                    } else {\n                        var that = $(this)[0], transformValue = value + '(' + val + transform2units[value.replace(unitRegExp, '')] + ')';\n                        if (that.style.cssText.indexOf(TRANSFORM) == -1) {\n                            $(this).css(TRANSFORM, transformValue);\n                        } else {\n                            that.style.cssText = that.style.cssText.replace(new RegExp(value + '\\\\(.*?\\\\)', 'i'), transformValue);\n                        }\n                    }\n                    return this;\n                };\n                $.fx.step[value] = function (fx) {\n                    $(fx.elem)[value](fx.now);\n                };\n            });\n            var curProxy = $.fx.prototype.cur;\n            $.fx.prototype.cur = function () {\n                if (transform2d.indexOf(this.prop) != -1) {\n                    return parseFloat($(this.elem)[this.prop]());\n                }\n                return curProxy.apply(this, arguments);\n            };\n        }\n        kendo.toggleClass = function (element, classes, options, add) {\n            if (classes) {\n                classes = classes.split(' ');\n                if (transitions) {\n                    options = extend({\n                        exclusive: 'all',\n                        duration: 400,\n                        ease: 'ease-out'\n                    }, options);\n                    element.css(TRANSITION, options.exclusive + ' ' + options.duration + 'ms ' + options.ease);\n                    setTimeout(function () {\n                        element.css(TRANSITION, '').css(HEIGHT);\n                    }, options.duration);\n                }\n                each(classes, function (idx, value) {\n                    element.toggleClass(value, add);\n                });\n            }\n            return element;\n        };\n        kendo.parseEffects = function (input, mirror) {\n            var effects = {};\n            if (typeof input === 'string') {\n                each(input.split(' '), function (idx, value) {\n                    var redirectedEffect = !singleEffectRegExp.test(value), resolved = value.replace(oldEffectsRegExp, function (match, $1, $2) {\n                            return $1 + ':' + $2.toLowerCase();\n                        }), effect = resolved.split(':'), direction = effect[1], effectBody = {};\n                    if (effect.length > 1) {\n                        effectBody.direction = mirror && redirectedEffect ? directions[direction].reverse : direction;\n                    }\n                    effects[effect[0]] = effectBody;\n                });\n            } else {\n                each(input, function (idx) {\n                    var direction = this.direction;\n                    if (direction && mirror && !singleEffectRegExp.test(idx)) {\n                        this.direction = directions[direction].reverse;\n                    }\n                    effects[idx] = this;\n                });\n            }\n            return effects;\n        };\n        function parseInteger(value) {\n            return parseInt(value, 10);\n        }\n        function parseCSS(element, property) {\n            return parseInteger(element.css(property));\n        }\n        function keys(obj) {\n            var acc = [];\n            for (var propertyName in obj) {\n                acc.push(propertyName);\n            }\n            return acc;\n        }\n        function strip3DTransforms(properties) {\n            for (var key in properties) {\n                if (transformProps.indexOf(key) != -1 && transform2d.indexOf(key) == -1) {\n                    delete properties[key];\n                }\n            }\n            return properties;\n        }\n        function normalizeCSS(element, properties) {\n            var transformation = [], cssValues = {}, lowerKey, key, value, isTransformed;\n            for (key in properties) {\n                lowerKey = key.toLowerCase();\n                isTransformed = transforms && transformProps.indexOf(lowerKey) != -1;\n                if (!support.hasHW3D && isTransformed && transform2d.indexOf(lowerKey) == -1) {\n                    delete properties[key];\n                } else {\n                    value = properties[key];\n                    if (isTransformed) {\n                        transformation.push(key + '(' + value + ')');\n                    } else {\n                        cssValues[key] = value;\n                    }\n                }\n            }\n            if (transformation.length) {\n                cssValues[TRANSFORM] = transformation.join(' ');\n            }\n            return cssValues;\n        }\n        if (transitions) {\n            extend(fx, {\n                transition: function (element, properties, options) {\n                    var css, delay = 0, oldKeys = element.data('keys') || [], timeoutID;\n                    options = extend({\n                        duration: 200,\n                        ease: 'ease-out',\n                        complete: null,\n                        exclusive: 'all'\n                    }, options);\n                    var stopTransitionCalled = false;\n                    var stopTransition = function () {\n                        if (!stopTransitionCalled) {\n                            stopTransitionCalled = true;\n                            if (timeoutID) {\n                                clearTimeout(timeoutID);\n                                timeoutID = null;\n                            }\n                            element.removeData(ABORT_ID).dequeue().css(TRANSITION, '').css(TRANSITION);\n                            options.complete.call(element);\n                        }\n                    };\n                    options.duration = $.fx ? $.fx.speeds[options.duration] || options.duration : options.duration;\n                    css = normalizeCSS(element, properties);\n                    $.merge(oldKeys, keys(css));\n                    if ($.hasOwnProperty('uniqueSort')) {\n                        element.data('keys', $.uniqueSort(oldKeys)).height();\n                    } else {\n                        element.data('keys', $.unique(oldKeys)).height();\n                    }\n                    element.css(TRANSITION, options.exclusive + ' ' + options.duration + 'ms ' + options.ease).css(TRANSITION);\n                    element.css(css).css(TRANSFORM);\n                    if (transitions.event) {\n                        element.one(transitions.event, stopTransition);\n                        if (options.duration !== 0) {\n                            delay = 500;\n                        }\n                    }\n                    timeoutID = setTimeout(stopTransition, options.duration + delay);\n                    element.data(ABORT_ID, timeoutID);\n                    element.data(COMPLETE_CALLBACK, stopTransition);\n                },\n                stopQueue: function (element, clearQueue, gotoEnd) {\n                    var cssValues, taskKeys = element.data('keys'), retainPosition = !gotoEnd && taskKeys, completeCallback = element.data(COMPLETE_CALLBACK);\n                    if (retainPosition) {\n                        cssValues = kendo.getComputedStyles(element[0], taskKeys);\n                    }\n                    if (completeCallback) {\n                        completeCallback();\n                    }\n                    if (retainPosition) {\n                        element.css(cssValues);\n                    }\n                    return element.removeData('keys').stop(clearQueue);\n                }\n            });\n        }\n        function animationProperty(element, property) {\n            if (transforms) {\n                var transform = element.css(TRANSFORM);\n                if (transform == NONE) {\n                    return property == 'scale' ? 1 : 0;\n                }\n                var match = transform.match(new RegExp(property + '\\\\s*\\\\(([\\\\d\\\\w\\\\.]+)')), computed = 0;\n                if (match) {\n                    computed = parseInteger(match[1]);\n                } else {\n                    match = transform.match(matrix3dRegExp) || [\n                        0,\n                        0,\n                        0,\n                        0,\n                        0\n                    ];\n                    property = property.toLowerCase();\n                    if (translateXRegExp.test(property)) {\n                        computed = parseFloat(match[3] / match[2]);\n                    } else if (property == 'translatey') {\n                        computed = parseFloat(match[4] / match[2]);\n                    } else if (property == 'scale') {\n                        computed = parseFloat(match[2]);\n                    } else if (property == 'rotate') {\n                        computed = parseFloat(Math.atan2(match[2], match[1]));\n                    }\n                }\n                return computed;\n            } else {\n                return parseFloat(element.css(property));\n            }\n        }\n        var EffectSet = kendo.Class.extend({\n            init: function (element, options) {\n                var that = this;\n                that.element = element;\n                that.effects = [];\n                that.options = options;\n                that.restore = [];\n            },\n            run: function (effects) {\n                var that = this, effect, idx, jdx, length = effects.length, element = that.element, options = that.options, deferred = $.Deferred(), start = {}, end = {}, target, children, childrenLength;\n                that.effects = effects;\n                deferred.done($.proxy(that, 'complete'));\n                element.data('animating', true);\n                for (idx = 0; idx < length; idx++) {\n                    effect = effects[idx];\n                    effect.setReverse(options.reverse);\n                    effect.setOptions(options);\n                    that.addRestoreProperties(effect.restore);\n                    effect.prepare(start, end);\n                    children = effect.children();\n                    for (jdx = 0, childrenLength = children.length; jdx < childrenLength; jdx++) {\n                        children[jdx].duration(options.duration).run();\n                    }\n                }\n                for (var effectName in options.effects) {\n                    extend(end, options.effects[effectName].properties);\n                }\n                if (!element.is(':visible')) {\n                    extend(start, { display: element.data('olddisplay') || 'block' });\n                }\n                if (transforms && !options.reset) {\n                    target = element.data('targetTransform');\n                    if (target) {\n                        start = extend(target, start);\n                    }\n                }\n                start = normalizeCSS(element, start);\n                if (transforms && !transitions) {\n                    start = strip3DTransforms(start);\n                }\n                element.css(start).css(TRANSFORM);\n                for (idx = 0; idx < length; idx++) {\n                    effects[idx].setup();\n                }\n                if (options.init) {\n                    options.init();\n                }\n                element.data('targetTransform', end);\n                fx.animate(element, end, extend({}, options, { complete: deferred.resolve }));\n                return deferred.promise();\n            },\n            stop: function () {\n                $(this.element).kendoStop(true, true);\n            },\n            addRestoreProperties: function (restore) {\n                var element = this.element, value, i = 0, length = restore.length;\n                for (; i < length; i++) {\n                    value = restore[i];\n                    this.restore.push(value);\n                    if (!element.data(value)) {\n                        element.data(value, element.css(value));\n                    }\n                }\n            },\n            restoreCallback: function () {\n                var element = this.element;\n                for (var i = 0, length = this.restore.length; i < length; i++) {\n                    var value = this.restore[i];\n                    element.css(value, element.data(value));\n                }\n            },\n            complete: function () {\n                var that = this, idx = 0, element = that.element, options = that.options, effects = that.effects, length = effects.length;\n                element.removeData('animating').dequeue();\n                if (options.hide) {\n                    element.data('olddisplay', element.css('display')).hide();\n                }\n                this.restoreCallback();\n                if (hasZoom && !transforms) {\n                    setTimeout($.proxy(this, 'restoreCallback'), 0);\n                }\n                for (; idx < length; idx++) {\n                    effects[idx].teardown();\n                }\n                if (options.completeCallback) {\n                    options.completeCallback(element);\n                }\n            }\n        });\n        fx.promise = function (element, options) {\n            var effects = [], effectClass, effectSet = new EffectSet(element, options), parsedEffects = kendo.parseEffects(options.effects), effect;\n            options.effects = parsedEffects;\n            for (var effectName in parsedEffects) {\n                effectClass = fx[capitalize(effectName)];\n                if (effectClass) {\n                    effect = new effectClass(element, parsedEffects[effectName].direction);\n                    effects.push(effect);\n                }\n            }\n            if (effects[0]) {\n                effectSet.run(effects);\n            } else {\n                if (!element.is(':visible')) {\n                    element.css({ display: element.data('olddisplay') || 'block' }).css('display');\n                }\n                if (options.init) {\n                    options.init();\n                }\n                element.dequeue();\n                effectSet.complete();\n            }\n        };\n        extend(fx, {\n            animate: function (elements, properties, options) {\n                var useTransition = options.transition !== false;\n                delete options.transition;\n                if (transitions && 'transition' in fx && useTransition) {\n                    fx.transition(elements, properties, options);\n                } else {\n                    if (transforms) {\n                        elements.animate(strip3DTransforms(properties), {\n                            queue: false,\n                            show: false,\n                            hide: false,\n                            duration: options.duration,\n                            complete: options.complete\n                        });\n                    } else {\n                        elements.each(function () {\n                            var element = $(this), multiple = {};\n                            each(transformProps, function (idx, value) {\n                                var params, currentValue = properties ? properties[value] + ' ' : null;\n                                if (currentValue) {\n                                    var single = properties;\n                                    if (value in scaleProperties && properties[value] !== undefined) {\n                                        params = currentValue.match(cssParamsRegExp);\n                                        if (transforms) {\n                                            extend(single, { scale: +params[0] });\n                                        }\n                                    } else {\n                                        if (value in translateProperties && properties[value] !== undefined) {\n                                            var position = element.css(POSITION), isFixed = position == 'absolute' || position == 'fixed';\n                                            if (!element.data(TRANSLATE)) {\n                                                if (isFixed) {\n                                                    element.data(TRANSLATE, {\n                                                        top: parseCSS(element, 'top') || 0,\n                                                        left: parseCSS(element, 'left') || 0,\n                                                        bottom: parseCSS(element, 'bottom'),\n                                                        right: parseCSS(element, 'right')\n                                                    });\n                                                } else {\n                                                    element.data(TRANSLATE, {\n                                                        top: parseCSS(element, 'marginTop') || 0,\n                                                        left: parseCSS(element, 'marginLeft') || 0\n                                                    });\n                                                }\n                                            }\n                                            var originalPosition = element.data(TRANSLATE);\n                                            params = currentValue.match(cssParamsRegExp);\n                                            if (params) {\n                                                var dX = value == TRANSLATE + 'y' ? +null : +params[1], dY = value == TRANSLATE + 'y' ? +params[1] : +params[2];\n                                                if (isFixed) {\n                                                    if (!isNaN(originalPosition.right)) {\n                                                        if (!isNaN(dX)) {\n                                                            extend(single, { right: originalPosition.right - dX });\n                                                        }\n                                                    } else {\n                                                        if (!isNaN(dX)) {\n                                                            extend(single, { left: originalPosition.left + dX });\n                                                        }\n                                                    }\n                                                    if (!isNaN(originalPosition.bottom)) {\n                                                        if (!isNaN(dY)) {\n                                                            extend(single, { bottom: originalPosition.bottom - dY });\n                                                        }\n                                                    } else {\n                                                        if (!isNaN(dY)) {\n                                                            extend(single, { top: originalPosition.top + dY });\n                                                        }\n                                                    }\n                                                } else {\n                                                    if (!isNaN(dX)) {\n                                                        extend(single, { marginLeft: originalPosition.left + dX });\n                                                    }\n                                                    if (!isNaN(dY)) {\n                                                        extend(single, { marginTop: originalPosition.top + dY });\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n                                    if (!transforms && value != 'scale' && value in single) {\n                                        delete single[value];\n                                    }\n                                    if (single) {\n                                        extend(multiple, single);\n                                    }\n                                }\n                            });\n                            if (browser.msie) {\n                                delete multiple.scale;\n                            }\n                            element.animate(multiple, {\n                                queue: false,\n                                show: false,\n                                hide: false,\n                                duration: options.duration,\n                                complete: options.complete\n                            });\n                        });\n                    }\n                }\n            }\n        });\n        fx.animatedPromise = fx.promise;\n        var Effect = kendo.Class.extend({\n            init: function (element, direction) {\n                var that = this;\n                that.element = element;\n                that._direction = direction;\n                that.options = {};\n                that._additionalEffects = [];\n                if (!that.restore) {\n                    that.restore = [];\n                }\n            },\n            reverse: function () {\n                this._reverse = true;\n                return this.run();\n            },\n            play: function () {\n                this._reverse = false;\n                return this.run();\n            },\n            add: function (additional) {\n                this._additionalEffects.push(additional);\n                return this;\n            },\n            direction: function (value) {\n                this._direction = value;\n                return this;\n            },\n            duration: function (duration) {\n                this._duration = duration;\n                return this;\n            },\n            compositeRun: function () {\n                var that = this, effectSet = new EffectSet(that.element, {\n                        reverse: that._reverse,\n                        duration: that._duration\n                    }), effects = that._additionalEffects.concat([that]);\n                return effectSet.run(effects);\n            },\n            run: function () {\n                if (this._additionalEffects && this._additionalEffects[0]) {\n                    return this.compositeRun();\n                }\n                var that = this, element = that.element, idx = 0, restore = that.restore, length = restore.length, value, deferred = $.Deferred(), start = {}, end = {}, target, children = that.children(), childrenLength = children.length;\n                deferred.done($.proxy(that, '_complete'));\n                element.data('animating', true);\n                for (idx = 0; idx < length; idx++) {\n                    value = restore[idx];\n                    if (!element.data(value)) {\n                        element.data(value, element.css(value));\n                    }\n                }\n                for (idx = 0; idx < childrenLength; idx++) {\n                    children[idx].duration(that._duration).run();\n                }\n                that.prepare(start, end);\n                if (!element.is(':visible')) {\n                    extend(start, { display: element.data('olddisplay') || 'block' });\n                }\n                if (transforms) {\n                    target = element.data('targetTransform');\n                    if (target) {\n                        start = extend(target, start);\n                    }\n                }\n                start = normalizeCSS(element, start);\n                if (transforms && !transitions) {\n                    start = strip3DTransforms(start);\n                }\n                element.css(start).css(TRANSFORM);\n                that.setup();\n                element.data('targetTransform', end);\n                fx.animate(element, end, {\n                    duration: that._duration,\n                    complete: deferred.resolve\n                });\n                return deferred.promise();\n            },\n            stop: function () {\n                var idx = 0, children = this.children(), childrenLength = children.length;\n                for (idx = 0; idx < childrenLength; idx++) {\n                    children[idx].stop();\n                }\n                $(this.element).kendoStop(true, true);\n                return this;\n            },\n            restoreCallback: function () {\n                var element = this.element;\n                for (var i = 0, length = this.restore.length; i < length; i++) {\n                    var value = this.restore[i];\n                    element.css(value, element.data(value));\n                }\n            },\n            _complete: function () {\n                var that = this, element = that.element;\n                element.removeData('animating').dequeue();\n                that.restoreCallback();\n                if (that.shouldHide()) {\n                    element.data('olddisplay', element.css('display')).hide();\n                }\n                if (hasZoom && !transforms) {\n                    setTimeout($.proxy(that, 'restoreCallback'), 0);\n                }\n                that.teardown();\n            },\n            setOptions: function (options) {\n                extend(true, this.options, options);\n            },\n            children: function () {\n                return [];\n            },\n            shouldHide: $.noop,\n            setup: $.noop,\n            prepare: $.noop,\n            teardown: $.noop,\n            directions: [],\n            setReverse: function (reverse) {\n                this._reverse = reverse;\n                return this;\n            }\n        });\n        function capitalize(word) {\n            return word.charAt(0).toUpperCase() + word.substring(1);\n        }\n        function createEffect(name, definition) {\n            var effectClass = Effect.extend(definition), directions = effectClass.prototype.directions;\n            fx[capitalize(name)] = effectClass;\n            fx.Element.prototype[name] = function (direction, opt1, opt2, opt3) {\n                return new effectClass(this.element, direction, opt1, opt2, opt3);\n            };\n            each(directions, function (idx, theDirection) {\n                fx.Element.prototype[name + capitalize(theDirection)] = function (opt1, opt2, opt3) {\n                    return new effectClass(this.element, theDirection, opt1, opt2, opt3);\n                };\n            });\n        }\n        var FOUR_DIRECTIONS = [\n                'left',\n                'right',\n                'up',\n                'down'\n            ], IN_OUT = [\n                'in',\n                'out'\n            ];\n        createEffect('slideIn', {\n            directions: FOUR_DIRECTIONS,\n            divisor: function (value) {\n                this.options.divisor = value;\n                return this;\n            },\n            prepare: function (start, end) {\n                var that = this, tmp, element = that.element, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, direction = directions[that._direction], offset = -direction.modifier * (direction.vertical ? outerHeight(element) : outerWidth(element)), startValue = offset / (that.options && that.options.divisor || 1) + PX, endValue = '0px';\n                if (that._reverse) {\n                    tmp = start;\n                    start = end;\n                    end = tmp;\n                }\n                if (transforms) {\n                    start[direction.transition] = startValue;\n                    end[direction.transition] = endValue;\n                } else {\n                    start[direction.property] = startValue;\n                    end[direction.property] = endValue;\n                }\n            }\n        });\n        createEffect('tile', {\n            directions: FOUR_DIRECTIONS,\n            init: function (element, direction, previous) {\n                Effect.prototype.init.call(this, element, direction);\n                this.options = { previous: previous };\n            },\n            previousDivisor: function (value) {\n                this.options.previousDivisor = value;\n                return this;\n            },\n            children: function () {\n                var that = this, reverse = that._reverse, previous = that.options.previous, divisor = that.options.previousDivisor || 1, dir = that._direction;\n                var children = [kendo.fx(that.element).slideIn(dir).setReverse(reverse)];\n                if (previous) {\n                    children.push(kendo.fx(previous).slideIn(directions[dir].reverse).divisor(divisor).setReverse(!reverse));\n                }\n                return children;\n            }\n        });\n        function createToggleEffect(name, property, defaultStart, defaultEnd) {\n            createEffect(name, {\n                directions: IN_OUT,\n                startValue: function (value) {\n                    this._startValue = value;\n                    return this;\n                },\n                endValue: function (value) {\n                    this._endValue = value;\n                    return this;\n                },\n                shouldHide: function () {\n                    return this._shouldHide;\n                },\n                prepare: function (start, end) {\n                    var that = this, startValue, endValue, out = this._direction === 'out', startDataValue = that.element.data(property), startDataValueIsSet = !(isNaN(startDataValue) || startDataValue == defaultStart);\n                    if (startDataValueIsSet) {\n                        startValue = startDataValue;\n                    } else if (typeof this._startValue !== 'undefined') {\n                        startValue = this._startValue;\n                    } else {\n                        startValue = out ? defaultStart : defaultEnd;\n                    }\n                    if (typeof this._endValue !== 'undefined') {\n                        endValue = this._endValue;\n                    } else {\n                        endValue = out ? defaultEnd : defaultStart;\n                    }\n                    if (this._reverse) {\n                        start[property] = endValue;\n                        end[property] = startValue;\n                    } else {\n                        start[property] = startValue;\n                        end[property] = endValue;\n                    }\n                    that._shouldHide = end[property] === defaultEnd;\n                }\n            });\n        }\n        createToggleEffect('fade', 'opacity', 1, 0);\n        createToggleEffect('zoom', 'scale', 1, 0.01);\n        createEffect('slideMargin', {\n            prepare: function (start, end) {\n                var that = this, element = that.element, options = that.options, origin = element.data(ORIGIN), offset = options.offset, margin, reverse = that._reverse;\n                if (!reverse && origin === null) {\n                    element.data(ORIGIN, parseFloat(element.css('margin-' + options.axis)));\n                }\n                margin = element.data(ORIGIN) || 0;\n                end['margin-' + options.axis] = !reverse ? margin + offset : margin;\n            }\n        });\n        createEffect('slideTo', {\n            prepare: function (start, end) {\n                var that = this, element = that.element, options = that.options, offset = options.offset.split(','), reverse = that._reverse;\n                if (transforms) {\n                    end.translatex = !reverse ? offset[0] : 0;\n                    end.translatey = !reverse ? offset[1] : 0;\n                } else {\n                    end.left = !reverse ? offset[0] : 0;\n                    end.top = !reverse ? offset[1] : 0;\n                }\n                element.css('left');\n            }\n        });\n        createEffect('expand', {\n            directions: [\n                'horizontal',\n                'vertical'\n            ],\n            restore: [OVERFLOW],\n            prepare: function (start, end) {\n                var that = this, element = that.element, options = that.options, reverse = that._reverse, property = that._direction === 'vertical' ? HEIGHT : WIDTH, setLength = element[0].style[property], oldLength = element.data(property), length = parseFloat(oldLength || setLength), realLength = round(element.css(property, AUTO)[property]());\n                start.overflow = HIDDEN;\n                length = options && options.reset ? realLength || length : length || realLength;\n                end[property] = (reverse ? 0 : length) + PX;\n                start[property] = (reverse ? length : 0) + PX;\n                if (oldLength === undefined) {\n                    element.data(property, setLength);\n                }\n            },\n            shouldHide: function () {\n                return this._reverse;\n            },\n            teardown: function () {\n                var that = this, element = that.element, property = that._direction === 'vertical' ? HEIGHT : WIDTH, length = element.data(property);\n                if (length == AUTO || length === BLANK) {\n                    setTimeout(function () {\n                        element.css(property, AUTO).css(property);\n                    }, 0);\n                }\n            }\n        });\n        var TRANSFER_START_STATE = {\n            position: 'absolute',\n            marginLeft: 0,\n            marginTop: 0,\n            scale: 1\n        };\n        createEffect('transfer', {\n            init: function (element, target) {\n                this.element = element;\n                this.options = { target: target };\n                this.restore = [];\n            },\n            setup: function () {\n                this.element.appendTo(document.body);\n            },\n            prepare: function (start, end) {\n                var that = this, element = that.element, outerBox = fx.box(element), innerBox = fx.box(that.options.target), currentScale = animationProperty(element, 'scale'), scale = fx.fillScale(innerBox, outerBox), transformOrigin = fx.transformOrigin(innerBox, outerBox);\n                extend(start, TRANSFER_START_STATE);\n                end.scale = 1;\n                element.css(TRANSFORM, 'scale(1)').css(TRANSFORM);\n                element.css(TRANSFORM, 'scale(' + currentScale + ')');\n                start.top = outerBox.top;\n                start.left = outerBox.left;\n                start.transformOrigin = transformOrigin.x + PX + ' ' + transformOrigin.y + PX;\n                if (that._reverse) {\n                    start.scale = scale;\n                } else {\n                    end.scale = scale;\n                }\n            }\n        });\n        var CLIPS = {\n            top: 'rect(auto auto $size auto)',\n            bottom: 'rect($size auto auto auto)',\n            left: 'rect(auto $size auto auto)',\n            right: 'rect(auto auto auto $size)'\n        };\n        var ROTATIONS = {\n            top: {\n                start: 'rotatex(0deg)',\n                end: 'rotatex(180deg)'\n            },\n            bottom: {\n                start: 'rotatex(-180deg)',\n                end: 'rotatex(0deg)'\n            },\n            left: {\n                start: 'rotatey(0deg)',\n                end: 'rotatey(-180deg)'\n            },\n            right: {\n                start: 'rotatey(180deg)',\n                end: 'rotatey(0deg)'\n            }\n        };\n        function clipInHalf(container, direction) {\n            var vertical = kendo.directions[direction].vertical, size = container[vertical ? HEIGHT : WIDTH]() / 2 + 'px';\n            return CLIPS[direction].replace('$size', size);\n        }\n        createEffect('turningPage', {\n            directions: FOUR_DIRECTIONS,\n            init: function (element, direction, container) {\n                Effect.prototype.init.call(this, element, direction);\n                this._container = container;\n            },\n            prepare: function (start, end) {\n                var that = this, reverse = that._reverse, direction = reverse ? directions[that._direction].reverse : that._direction, rotation = ROTATIONS[direction];\n                start.zIndex = 1;\n                if (that._clipInHalf) {\n                    start.clip = clipInHalf(that._container, kendo.directions[direction].reverse);\n                }\n                start[BACKFACE] = HIDDEN;\n                end[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.start : rotation.end);\n                start[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.end : rotation.start);\n            },\n            setup: function () {\n                this._container.append(this.element);\n            },\n            face: function (value) {\n                this._face = value;\n                return this;\n            },\n            shouldHide: function () {\n                var that = this, reverse = that._reverse, face = that._face;\n                return reverse && !face || !reverse && face;\n            },\n            clipInHalf: function (value) {\n                this._clipInHalf = value;\n                return this;\n            },\n            temporary: function () {\n                this.element.addClass('temp-page');\n                return this;\n            }\n        });\n        createEffect('staticPage', {\n            directions: FOUR_DIRECTIONS,\n            init: function (element, direction, container) {\n                Effect.prototype.init.call(this, element, direction);\n                this._container = container;\n            },\n            restore: ['clip'],\n            prepare: function (start, end) {\n                var that = this, direction = that._reverse ? directions[that._direction].reverse : that._direction;\n                start.clip = clipInHalf(that._container, direction);\n                start.opacity = 0.999;\n                end.opacity = 1;\n            },\n            shouldHide: function () {\n                var that = this, reverse = that._reverse, face = that._face;\n                return reverse && !face || !reverse && face;\n            },\n            face: function (value) {\n                this._face = value;\n                return this;\n            }\n        });\n        createEffect('pageturn', {\n            directions: [\n                'horizontal',\n                'vertical'\n            ],\n            init: function (element, direction, face, back) {\n                Effect.prototype.init.call(this, element, direction);\n                this.options = {};\n                this.options.face = face;\n                this.options.back = back;\n            },\n            children: function () {\n                var that = this, options = that.options, direction = that._direction === 'horizontal' ? 'left' : 'top', reverseDirection = kendo.directions[direction].reverse, reverse = that._reverse, temp, faceClone = options.face.clone(true).removeAttr('id'), backClone = options.back.clone(true).removeAttr('id'), element = that.element;\n                if (reverse) {\n                    temp = direction;\n                    direction = reverseDirection;\n                    reverseDirection = temp;\n                }\n                return [\n                    kendo.fx(options.face).staticPage(direction, element).face(true).setReverse(reverse),\n                    kendo.fx(options.back).staticPage(reverseDirection, element).setReverse(reverse),\n                    kendo.fx(faceClone).turningPage(direction, element).face(true).clipInHalf(true).temporary().setReverse(reverse),\n                    kendo.fx(backClone).turningPage(reverseDirection, element).clipInHalf(true).temporary().setReverse(reverse)\n                ];\n            },\n            prepare: function (start, end) {\n                start[PERSPECTIVE] = DEFAULT_PERSPECTIVE;\n                start.transformStyle = 'preserve-3d';\n                start.opacity = 0.999;\n                end.opacity = 1;\n            },\n            teardown: function () {\n                this.element.find('.temp-page').remove();\n            }\n        });\n        createEffect('flip', {\n            directions: [\n                'horizontal',\n                'vertical'\n            ],\n            init: function (element, direction, face, back) {\n                Effect.prototype.init.call(this, element, direction);\n                this.options = {};\n                this.options.face = face;\n                this.options.back = back;\n            },\n            children: function () {\n                var that = this, options = that.options, direction = that._direction === 'horizontal' ? 'left' : 'top', reverseDirection = kendo.directions[direction].reverse, reverse = that._reverse, temp, element = that.element;\n                if (reverse) {\n                    temp = direction;\n                    direction = reverseDirection;\n                    reverseDirection = temp;\n                }\n                return [\n                    kendo.fx(options.face).turningPage(direction, element).face(true).setReverse(reverse),\n                    kendo.fx(options.back).turningPage(reverseDirection, element).setReverse(reverse)\n                ];\n            },\n            prepare: function (start) {\n                start[PERSPECTIVE] = DEFAULT_PERSPECTIVE;\n                start.transformStyle = 'preserve-3d';\n            }\n        });\n        var RESTORE_OVERFLOW = !support.mobileOS.android;\n        var IGNORE_TRANSITION_EVENT_SELECTOR = '.km-touch-scrollbar, .km-actionsheet-wrapper';\n        createEffect('replace', {\n            _before: $.noop,\n            _after: $.noop,\n            init: function (element, previous, transitionClass) {\n                Effect.prototype.init.call(this, element);\n                this._previous = $(previous);\n                this._transitionClass = transitionClass;\n            },\n            duration: function () {\n                throw new Error('The replace effect does not support duration setting; the effect duration may be customized through the transition class rule');\n            },\n            beforeTransition: function (callback) {\n                this._before = callback;\n                return this;\n            },\n            afterTransition: function (callback) {\n                this._after = callback;\n                return this;\n            },\n            _both: function () {\n                return $().add(this._element).add(this._previous);\n            },\n            _containerClass: function () {\n                var direction = this._direction, containerClass = 'k-fx k-fx-start k-fx-' + this._transitionClass;\n                if (direction) {\n                    containerClass += ' k-fx-' + direction;\n                }\n                if (this._reverse) {\n                    containerClass += ' k-fx-reverse';\n                }\n                return containerClass;\n            },\n            complete: function (e) {\n                if (!this.deferred || e && $(e.target).is(IGNORE_TRANSITION_EVENT_SELECTOR)) {\n                    return;\n                }\n                var container = this.container;\n                container.removeClass('k-fx-end').removeClass(this._containerClass()).off(transitions.event, this.completeProxy);\n                this._previous.hide().removeClass('k-fx-current');\n                this.element.removeClass('k-fx-next');\n                if (RESTORE_OVERFLOW) {\n                    container.css(OVERFLOW, '');\n                }\n                if (!this.isAbsolute) {\n                    this._both().css(POSITION, '');\n                }\n                this.deferred.resolve();\n                delete this.deferred;\n            },\n            run: function () {\n                if (this._additionalEffects && this._additionalEffects[0]) {\n                    return this.compositeRun();\n                }\n                var that = this, element = that.element, previous = that._previous, container = element.parents().filter(previous.parents()).first(), both = that._both(), deferred = $.Deferred(), originalPosition = element.css(POSITION), originalOverflow;\n                if (!container.length) {\n                    container = element.parent();\n                }\n                this.container = container;\n                this.deferred = deferred;\n                this.isAbsolute = originalPosition == 'absolute';\n                if (!this.isAbsolute) {\n                    both.css(POSITION, 'absolute');\n                }\n                if (RESTORE_OVERFLOW) {\n                    originalOverflow = container.css(OVERFLOW);\n                    container.css(OVERFLOW, 'hidden');\n                }\n                if (!transitions) {\n                    this.complete();\n                } else {\n                    element.addClass('k-fx-hidden');\n                    container.addClass(this._containerClass());\n                    this.completeProxy = $.proxy(this, 'complete');\n                    container.on(transitions.event, this.completeProxy);\n                    kendo.animationFrame(function () {\n                        element.removeClass('k-fx-hidden').addClass('k-fx-next');\n                        previous.css('display', '').addClass('k-fx-current');\n                        that._before(previous, element);\n                        kendo.animationFrame(function () {\n                            container.removeClass('k-fx-start').addClass('k-fx-end');\n                            that._after(previous, element);\n                        });\n                    });\n                }\n                return deferred.promise();\n            },\n            stop: function () {\n                this.complete();\n            }\n        });\n        var Animation = kendo.Class.extend({\n            init: function () {\n                var that = this;\n                that._tickProxy = proxy(that._tick, that);\n                that._started = false;\n            },\n            tick: $.noop,\n            done: $.noop,\n            onEnd: $.noop,\n            onCancel: $.noop,\n            start: function () {\n                if (!this.enabled()) {\n                    return;\n                }\n                if (!this.done()) {\n                    this._started = true;\n                    kendo.animationFrame(this._tickProxy);\n                } else {\n                    this.onEnd();\n                }\n            },\n            enabled: function () {\n                return true;\n            },\n            cancel: function () {\n                this._started = false;\n                this.onCancel();\n            },\n            _tick: function () {\n                var that = this;\n                if (!that._started) {\n                    return;\n                }\n                that.tick();\n                if (!that.done()) {\n                    kendo.animationFrame(that._tickProxy);\n                } else {\n                    that._started = false;\n                    that.onEnd();\n                }\n            }\n        });\n        var Transition = Animation.extend({\n            init: function (options) {\n                var that = this;\n                extend(that, options);\n                Animation.fn.init.call(that);\n            },\n            done: function () {\n                return this.timePassed() >= this.duration;\n            },\n            timePassed: function () {\n                return Math.min(this.duration, new Date() - this.startDate);\n            },\n            moveTo: function (options) {\n                var that = this, movable = that.movable;\n                that.initial = movable[that.axis];\n                that.delta = options.location - that.initial;\n                that.duration = typeof options.duration == 'number' ? options.duration : 300;\n                that.tick = that._easeProxy(options.ease);\n                that.startDate = new Date();\n                that.start();\n            },\n            _easeProxy: function (ease) {\n                var that = this;\n                return function () {\n                    that.movable.moveAxis(that.axis, ease(that.timePassed(), that.initial, that.delta, that.duration));\n                };\n            }\n        });\n        extend(Transition, {\n            easeOutExpo: function (t, b, c, d) {\n                return t == d ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n            },\n            easeOutBack: function (t, b, c, d, s) {\n                s = 1.70158;\n                return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n            }\n        });\n        fx.Animation = Animation;\n        fx.Transition = Transition;\n        fx.createEffect = createEffect;\n        fx.box = function (element) {\n            element = $(element);\n            var result = element.offset();\n            result.width = kendo._outerWidth(element);\n            result.height = kendo._outerHeight(element);\n            return result;\n        };\n        fx.transformOrigin = function (inner, outer) {\n            var x = (inner.left - outer.left) * outer.width / (outer.width - inner.width), y = (inner.top - outer.top) * outer.height / (outer.height - inner.height);\n            return {\n                x: isNaN(x) ? 0 : x,\n                y: isNaN(y) ? 0 : y\n            };\n        };\n        fx.fillScale = function (inner, outer) {\n            return Math.min(inner.width / outer.width, inner.height / outer.height);\n        };\n        fx.fitScale = function (inner, outer) {\n            return Math.max(inner.width / outer.width, inner.height / outer.height);\n        };\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.view', [\n        'kendo.core',\n        'kendo.binder',\n        'kendo.fx'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'view',\n        name: 'View',\n        category: 'framework',\n        description: 'The View class instantiates and handles the events of a certain screen from the application.',\n        depends: [\n            'core',\n            'binder',\n            'fx'\n        ],\n        hidden: false\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, attr = kendo.attr, ui = kendo.ui, attrValue = kendo.attrValue, directiveSelector = kendo.directiveSelector, Observable = kendo.Observable, Widget = kendo.ui.Widget, roleSelector = kendo.roleSelector, SCRIPT = 'SCRIPT', INIT = 'init', TRANSITION_START = 'transitionStart', TRANSITION_END = 'transitionEnd', SHOW = 'show', HIDE = 'hide', ATTACH = 'attach', DETACH = 'detach', sizzleErrorRegExp = /unrecognized expression/;\n        var bodyRegExp = /<body[^>]*>(([\\u000a\\u000d\\u2028\\u2029]|.)*)<\\/body>/i;\n        var LOAD_START = 'loadStart';\n        var LOAD_COMPLETE = 'loadComplete';\n        var SHOW_START = 'showStart';\n        var SAME_VIEW_REQUESTED = 'sameViewRequested';\n        var VIEW_SHOW = 'viewShow';\n        var VIEW_TYPE_DETERMINED = 'viewTypeDetermined';\n        var AFTER = 'after';\n        var classNames = {\n            content: 'k-content',\n            view: 'k-view',\n            stretchedView: 'k-stretched-view',\n            widget: 'k-widget',\n            header: 'k-header',\n            footer: 'k-footer'\n        };\n        var View = kendo.ui.Widget.extend({\n            init: function (content, options) {\n                var that = this;\n                options = options || {};\n                that.id = kendo.guid();\n                Observable.fn.init.call(that);\n                this.options = $.extend({}, this.options, options);\n                that.content = content;\n                if (that.options.renderOnInit) {\n                    Widget.fn.init.call(that, that._createElement(), options);\n                }\n                if (that.options.wrapInSections) {\n                    that._renderSections();\n                }\n                that.tagName = options.tagName || 'div';\n                that.model = options.model;\n                that._wrap = options.wrap !== false;\n                this._evalTemplate = options.evalTemplate || false;\n                that._fragments = {};\n                that.bind([\n                    INIT,\n                    SHOW,\n                    HIDE,\n                    TRANSITION_START,\n                    TRANSITION_END\n                ], options);\n            },\n            options: {\n                name: 'View',\n                renderOnInit: false,\n                wrapInSections: false,\n                detachOnHide: true,\n                detachOnDestroy: true\n            },\n            render: function (container) {\n                var that = this, notInitialized = !that.element;\n                if (notInitialized) {\n                    that.element = that._createElement();\n                }\n                if (container) {\n                    $(container).append(that.element);\n                }\n                if (notInitialized) {\n                    kendo.bind(that.element, that.model);\n                    that.trigger(INIT);\n                }\n                if (container) {\n                    that._eachFragment(ATTACH);\n                    that.trigger(SHOW);\n                }\n                return that.element;\n            },\n            clone: function () {\n                return new ViewClone(this);\n            },\n            triggerBeforeShow: function () {\n                return true;\n            },\n            triggerBeforeHide: function () {\n                return true;\n            },\n            showStart: function () {\n                var that = this;\n                var element = that.render();\n                if (element) {\n                    element.css('display', '');\n                }\n                this.trigger(SHOW_START, { view: this });\n            },\n            showEnd: function () {\n            },\n            hideEnd: function () {\n                this.hide();\n            },\n            beforeTransition: function (type) {\n                this.trigger(TRANSITION_START, { type: type });\n            },\n            afterTransition: function (type) {\n                this.trigger(TRANSITION_END, { type: type });\n            },\n            hide: function () {\n                if (this.options.detachOnHide) {\n                    this._eachFragment(DETACH);\n                    $(this.element).detach();\n                }\n                this.trigger(HIDE);\n            },\n            destroy: function () {\n                var that = this;\n                var element = that.element;\n                if (element) {\n                    Widget.fn.destroy.call(that);\n                    kendo.unbind(element);\n                    kendo.destroy(element);\n                    if (that.options.detachOnDestroy) {\n                        element.remove();\n                    }\n                }\n            },\n            purge: function () {\n                var that = this;\n                that.destroy();\n                $(that.element).add(that.content).add(that.wrapper).off().remove();\n            },\n            fragments: function (fragments) {\n                $.extend(this._fragments, fragments);\n            },\n            _eachFragment: function (methodName) {\n                for (var placeholder in this._fragments) {\n                    this._fragments[placeholder][methodName](this, placeholder);\n                }\n            },\n            _createElement: function () {\n                var that = this, wrapper = '<' + that.tagName + ' />', element, content;\n                try {\n                    content = $(document.getElementById(that.content) || that.content);\n                    if (content[0].tagName === SCRIPT) {\n                        content = content.html();\n                    }\n                } catch (e) {\n                    if (sizzleErrorRegExp.test(e.message)) {\n                        content = that.content;\n                    }\n                }\n                if (typeof content === 'string') {\n                    content = content.replace(/^\\s+|\\s+$/g, '');\n                    if (that._evalTemplate) {\n                        content = kendo.template(content)(that.model || {});\n                    }\n                    element = $(wrapper).append(content);\n                    if (!that._wrap) {\n                        element = element.contents();\n                    }\n                } else {\n                    element = content;\n                    if (that._evalTemplate) {\n                        var result = $(kendo.template($('<div />').append(element.clone(true)).html())(that.model || {}));\n                        if ($.contains(document, element[0])) {\n                            element.replaceWith(result);\n                        }\n                        element = result;\n                    }\n                    if (that._wrap) {\n                        element = element.wrapAll(wrapper).parent();\n                    }\n                }\n                return element;\n            },\n            _renderSections: function () {\n                var that = this;\n                if (that.options.wrapInSections) {\n                    that._wrapper();\n                    that._createContent();\n                    that._createHeader();\n                    that._createFooter();\n                }\n            },\n            _wrapper: function () {\n                var that = this;\n                var content = that.content;\n                if (content.is(roleSelector('view'))) {\n                    that.wrapper = that.content;\n                } else {\n                    that.wrapper = content.wrap('<div data-' + kendo.ns + 'stretch=\"true\" data-' + kendo.ns + 'role=\"view\" data-' + kendo.ns + 'init-widgets=\"false\"></div>').parent();\n                }\n                var wrapper = that.wrapper;\n                wrapper.attr('id', that.id);\n                wrapper.addClass(classNames.view);\n                wrapper.addClass(classNames.widget);\n                wrapper.attr('role', 'view');\n            },\n            _createContent: function () {\n                var that = this;\n                var wrapper = $(that.wrapper);\n                var contentSelector = roleSelector('content');\n                if (!wrapper.children(contentSelector)[0]) {\n                    var ccontentElements = wrapper.children().filter(function () {\n                        var child = $(this);\n                        if (!child.is(roleSelector('header')) && !child.is(roleSelector('footer'))) {\n                            return child;\n                        }\n                    });\n                    ccontentElements.wrap('<div ' + attr('role') + '=\"content\"></div>');\n                }\n                this.contentElement = wrapper.children(roleSelector('content'));\n                this.contentElement.addClass(classNames.stretchedView).addClass(classNames.content);\n            },\n            _createHeader: function () {\n                var that = this;\n                var wrapper = that.wrapper;\n                this.header = wrapper.children(roleSelector('header')).addClass(classNames.header);\n            },\n            _createFooter: function () {\n                var that = this;\n                var wrapper = that.wrapper;\n                this.footer = wrapper.children(roleSelector('footer')).addClass(classNames.footer);\n            }\n        });\n        var ViewClone = kendo.Class.extend({\n            init: function (view) {\n                $.extend(this, {\n                    element: view.element.clone(true),\n                    transition: view.transition,\n                    id: view.id\n                });\n                view.element.parent().append(this.element);\n            },\n            hideEnd: function () {\n                this.element.remove();\n            },\n            beforeTransition: $.noop,\n            afterTransition: $.noop\n        });\n        var Layout = View.extend({\n            init: function (content, options) {\n                View.fn.init.call(this, content, options);\n                this.containers = {};\n            },\n            container: function (selector) {\n                var container = this.containers[selector];\n                if (!container) {\n                    container = this._createContainer(selector);\n                    this.containers[selector] = container;\n                }\n                return container;\n            },\n            showIn: function (selector, view, transition) {\n                this.container(selector).show(view, transition);\n            },\n            _createContainer: function (selector) {\n                var root = this.render(), element = root.find(selector), container;\n                if (!element.length && root.is(selector)) {\n                    if (root.is(selector)) {\n                        element = root;\n                    } else {\n                        throw new Error('can\\'t find a container with the specified ' + selector + ' selector');\n                    }\n                }\n                container = new ViewContainer(element);\n                container.bind('accepted', function (e) {\n                    e.view.render(element);\n                });\n                return container;\n            }\n        });\n        var Fragment = View.extend({\n            attach: function (view, placeholder) {\n                view.element.find(placeholder).replaceWith(this.render());\n            },\n            detach: function () {\n            }\n        });\n        var transitionRegExp = /^(\\w+)(:(\\w+))?( (\\w+))?$/;\n        function parseTransition(transition) {\n            if (!transition) {\n                return {};\n            }\n            var matches = transition.match(transitionRegExp) || [];\n            return {\n                type: matches[1],\n                direction: matches[3],\n                reverse: matches[5] === 'reverse'\n            };\n        }\n        var ViewContainer = Observable.extend({\n            init: function (container) {\n                Observable.fn.init.call(this);\n                this.container = container;\n                this.history = [];\n                this.view = null;\n                this.running = false;\n            },\n            after: function () {\n                this.running = false;\n                this.trigger('complete', { view: this.view });\n                this.trigger('after');\n            },\n            end: function () {\n                this.view.showEnd();\n                this.previous.hideEnd();\n                this.after();\n            },\n            show: function (view, transition, locationID) {\n                if (!view.triggerBeforeShow() || this.view && !this.view.triggerBeforeHide()) {\n                    this.trigger('after');\n                    return false;\n                }\n                locationID = locationID || view.id;\n                var that = this, current = view === that.view ? view.clone() : that.view, history = that.history, previousEntry = history[history.length - 2] || {}, back = previousEntry.id === locationID, theTransition = transition || (back ? history[history.length - 1].transition : view.transition), transitionData = parseTransition(theTransition);\n                if (that.running) {\n                    that.effect.stop();\n                }\n                if (theTransition === 'none') {\n                    theTransition = null;\n                }\n                that.trigger('accepted', { view: view });\n                that.view = view;\n                that.previous = current;\n                that.running = true;\n                if (!back) {\n                    history.push({\n                        id: locationID,\n                        transition: theTransition\n                    });\n                } else {\n                    history.pop();\n                }\n                if (!current) {\n                    view.showStart();\n                    view.showEnd();\n                    that.after();\n                    return true;\n                }\n                if (!theTransition || !kendo.effects.enabled) {\n                    view.showStart();\n                    that.end();\n                } else {\n                    view.element.addClass('k-fx-hidden');\n                    view.showStart();\n                    if (back && !transition) {\n                        transitionData.reverse = !transitionData.reverse;\n                    }\n                    that.effect = kendo.fx(view.element).replace(current.element, transitionData.type).beforeTransition(function () {\n                        view.beforeTransition('show');\n                        current.beforeTransition('hide');\n                    }).afterTransition(function () {\n                        view.afterTransition('show');\n                        current.afterTransition('hide');\n                    }).direction(transitionData.direction).setReverse(transitionData.reverse);\n                    that.effect.run().then(function () {\n                        that.end();\n                    });\n                }\n                return true;\n            },\n            destroy: function () {\n                var that = this;\n                var view = that.view;\n                if (view && view.destroy) {\n                    view.destroy();\n                }\n            }\n        });\n        var ViewEngine = Observable.extend({\n            init: function (options) {\n                var that = this, views, container;\n                Observable.fn.init.call(that);\n                that.options = options;\n                $.extend(that, options);\n                that.sandbox = $('<div />');\n                container = that.container;\n                views = that._hideViews(container);\n                that.rootView = views.first();\n                that.layouts = {};\n                that.viewContainer = new kendo.ViewContainer(that.container);\n                that.viewContainer.bind('accepted', function (e) {\n                    e.view.params = that.params;\n                });\n                that.viewContainer.bind('complete', function (e) {\n                    that.trigger(VIEW_SHOW, { view: e.view });\n                });\n                that.viewContainer.bind(AFTER, function () {\n                    that.trigger(AFTER);\n                });\n                this.bind(this.events, options);\n            },\n            events: [\n                SHOW_START,\n                AFTER,\n                VIEW_SHOW,\n                LOAD_START,\n                LOAD_COMPLETE,\n                SAME_VIEW_REQUESTED,\n                VIEW_TYPE_DETERMINED\n            ],\n            destroy: function () {\n                var that = this;\n                var viewContainer = that.viewContainer;\n                kendo.destroy(that.container);\n                for (var id in that.layouts) {\n                    this.layouts[id].destroy();\n                }\n                if (viewContainer) {\n                    viewContainer.destroy();\n                }\n            },\n            view: function () {\n                return this.viewContainer.view;\n            },\n            showView: function (url, transition, params) {\n                url = url.replace(new RegExp('^' + this.remoteViewURLPrefix), '');\n                if (url === '' && this.remoteViewURLPrefix) {\n                    url = '/';\n                }\n                if (url.replace(/^#/, '') === this.url) {\n                    this.trigger(SAME_VIEW_REQUESTED);\n                    return false;\n                }\n                this.trigger(SHOW_START);\n                var that = this, element = that._findViewElement(url), view = kendo.widgetInstance(element);\n                that.url = url.replace(/^#/, '');\n                that.params = params;\n                if (view && view.reload) {\n                    view.purge();\n                    element = [];\n                }\n                this.trigger(VIEW_TYPE_DETERMINED, {\n                    remote: element.length === 0,\n                    url: url\n                });\n                if (element[0]) {\n                    if (!view) {\n                        view = that._createView(element);\n                    }\n                    return that.viewContainer.show(view, transition, url);\n                } else {\n                    return true;\n                }\n            },\n            append: function (html, url) {\n                var sandbox = this.sandbox, urlPath = (url || '').split('?')[0], container = this.container, views, view;\n                if (bodyRegExp.test(html)) {\n                    html = RegExp.$1;\n                }\n                sandbox[0].innerHTML = html;\n                container.append(sandbox.children('script, style'));\n                views = this._hideViews(sandbox);\n                view = views.first();\n                if (!view.length) {\n                    views = view = sandbox.wrapInner('<div data-role=view />').children();\n                }\n                if (urlPath) {\n                    view.hide().attr(attr('url'), urlPath);\n                }\n                container.append(views);\n                return this._createView(view);\n            },\n            _locate: function (selectors) {\n                return this.$angular ? directiveSelector(selectors) : roleSelector(selectors);\n            },\n            _findViewElement: function (url) {\n                var element, urlPath = url.split('?')[0];\n                if (!urlPath) {\n                    return this.rootView;\n                }\n                element = this.container.children('[' + attr('url') + '=\\'' + urlPath + '\\']');\n                if (!element[0] && urlPath.indexOf('/') === -1) {\n                    element = this.container.children(urlPath.charAt(0) === '#' ? urlPath : '#' + urlPath);\n                }\n                if (!element[0]) {\n                    element = this._findViewElementById(url);\n                }\n                return element;\n            },\n            _findViewElementById: function (id) {\n                var element = this.container.children('[id=\\'' + id + '\\']');\n                return element;\n            },\n            _createView: function (element) {\n                return this._createSpaView(element);\n            },\n            _createMobileView: function (element) {\n                return kendo.initWidget(element, {\n                    defaultTransition: this.transition,\n                    loader: this.loader,\n                    container: this.container,\n                    getLayout: this.getLayoutProxy,\n                    modelScope: this.modelScope,\n                    reload: attrValue(element, 'reload')\n                }, ui.roles);\n            },\n            _createSpaView: function (element) {\n                var viewOptions = (this.options || {}).viewOptions || {};\n                return new kendo.View(element, {\n                    renderOnInit: viewOptions.renderOnInit,\n                    wrap: viewOptions.wrap || false,\n                    wrapInSections: viewOptions.wrapInSections,\n                    detachOnHide: viewOptions.detachOnHide,\n                    detachOnDestroy: viewOptions.detachOnDestroy\n                });\n            },\n            _hideViews: function (container) {\n                return container.children(this._locate('view')).hide();\n            }\n        });\n        kendo.ViewEngine = ViewEngine;\n        kendo.ViewContainer = ViewContainer;\n        kendo.Fragment = Fragment;\n        kendo.Layout = Layout;\n        kendo.View = View;\n        kendo.ViewClone = ViewClone;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.data.signalr', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'data.signalr',\n        name: 'SignalR',\n        category: 'framework',\n        depends: ['data'],\n        hidden: true\n    };\n    (function ($) {\n        var kendo = window.kendo;\n        var isFunction = kendo.isFunction;\n        function isJQueryPromise(promise) {\n            return promise && isFunction(promise.done) && isFunction(promise.fail);\n        }\n        function isNativePromise(promise) {\n            return promise && isFunction(promise.then) && isFunction(promise.catch);\n        }\n        var transport = kendo.data.RemoteTransport.extend({\n            init: function (options) {\n                var signalr = options && options.signalr ? options.signalr : {};\n                var promise = signalr.promise;\n                if (!promise) {\n                    throw new Error('The \"promise\" option must be set.');\n                }\n                if (!isJQueryPromise(promise) && !isNativePromise(promise)) {\n                    throw new Error('The \"promise\" option must be a Promise.');\n                }\n                this.promise = promise;\n                var hub = signalr.hub;\n                if (!hub) {\n                    throw new Error('The \"hub\" option must be set.');\n                }\n                if (typeof hub.on != 'function' || typeof hub.invoke != 'function') {\n                    throw new Error('The \"hub\" option is not a valid SignalR hub proxy.');\n                }\n                this.hub = hub;\n                kendo.data.RemoteTransport.fn.init.call(this, options);\n            },\n            push: function (callbacks) {\n                var client = this.options.signalr.client || {};\n                if (client.create) {\n                    this.hub.on(client.create, callbacks.pushCreate);\n                }\n                if (client.update) {\n                    this.hub.on(client.update, callbacks.pushUpdate);\n                }\n                if (client.destroy) {\n                    this.hub.on(client.destroy, callbacks.pushDestroy);\n                }\n            },\n            _crud: function (options, type) {\n                var hub = this.hub;\n                var promise = this.promise;\n                var server = this.options.signalr.server;\n                if (!server || !server[type]) {\n                    throw new Error(kendo.format('The \"server.{0}\" option must be set.', type));\n                }\n                var args = [server[type]];\n                var data = this.parameterMap(options.data, type);\n                if (!$.isEmptyObject(data)) {\n                    args.push(data);\n                }\n                if (isJQueryPromise(promise)) {\n                    promise.done(function () {\n                        hub.invoke.apply(hub, args).done(options.success).fail(options.error);\n                    });\n                } else if (isNativePromise(promise)) {\n                    promise.then(function () {\n                        hub.invoke.apply(hub, args).then(options.success).catch(options.error);\n                    });\n                }\n            },\n            read: function (options) {\n                this._crud(options, 'read');\n            },\n            create: function (options) {\n                this._crud(options, 'create');\n            },\n            update: function (options) {\n                this._crud(options, 'update');\n            },\n            destroy: function (options) {\n                this._crud(options, 'destroy');\n            }\n        });\n        $.extend(true, kendo.data, { transports: { signalr: transport } });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.validator', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'validator',\n        name: 'Validator',\n        category: 'web',\n        description: 'The Validator offers an easy way to do a client-side form validation.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, NS = '.kendoValidator', INVALIDMSG = 'k-invalid-msg', invalidMsgRegExp = new RegExp(INVALIDMSG, 'i'), INVALIDINPUT = 'k-invalid', VALIDINPUT = 'k-valid', VALIDATIONSUMMARY = 'k-validation-summary', MESSAGEBOX = 'k-message-box k-message-box-error', emailRegExp = /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/i, urlRegExp = /^(https?|ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i, INPUTSELECTOR = ':input:not(:button,[type=submit],[type=reset],[disabled],[readonly])', CHECKBOXSELECTOR = ':checkbox:not([disabled],[readonly])', NUMBERINPUTSELECTOR = '[type=number],[type=range]', BLUR = 'blur', NAME = 'name', FORM = 'form', NOVALIDATE = 'novalidate', VALIDATE = 'validate', CHANGE = 'change', VALIDATE_INPUT = 'validateInput', proxy = $.proxy, patternMatcher = function (value, pattern) {\n                if (typeof pattern === 'string') {\n                    pattern = new RegExp('^(?:' + pattern + ')$');\n                }\n                return pattern.test(value);\n            }, matcher = function (input, selector, pattern) {\n                var value = input.val();\n                if (input.filter(selector).length && value !== '') {\n                    return patternMatcher(value, pattern);\n                }\n                return true;\n            }, hasAttribute = function (input, name) {\n                if (input.length) {\n                    return input[0].attributes[name] != null;\n                }\n                return false;\n            };\n        if (!kendo.ui.validator) {\n            kendo.ui.validator = {\n                rules: {},\n                messages: {}\n            };\n        }\n        function resolveRules(element) {\n            var resolvers = kendo.ui.validator.ruleResolvers || {}, rules = {}, name;\n            for (name in resolvers) {\n                $.extend(true, rules, resolvers[name].resolve(element));\n            }\n            return rules;\n        }\n        function decode(value) {\n            return value.replace(/&amp/g, '&amp;').replace(/&quot;/g, '\"').replace(/&#39;/g, '\\'').replace(/&lt;/g, '<').replace(/&gt;/g, '>');\n        }\n        function numberOfDecimalDigits(value) {\n            value = (value + '').split('.');\n            if (value.length > 1) {\n                return value[1].length;\n            }\n            return 0;\n        }\n        function parseHtml(text) {\n            if ($.parseHTML) {\n                return $($.parseHTML(text));\n            }\n            return $(text);\n        }\n        function searchForMessageContainer(elements, fieldName) {\n            var containers = $(), element, attr;\n            for (var idx = 0, length = elements.length; idx < length; idx++) {\n                element = elements[idx];\n                if (invalidMsgRegExp.test(element.className)) {\n                    attr = element.getAttribute(kendo.attr('for'));\n                    if (attr === fieldName) {\n                        containers = containers.add(element);\n                    }\n                }\n            }\n            return containers;\n        }\n        var SUMMARYTEMPLATE = '<ul>' + '#for(var i = 0; i < errors.length; i += 1){#' + '<li><a data-field=\"#=errors[i].field#\" href=\"\\\\#\">#= errors[i].message #</a></li>' + '# } #' + '</ul>';\n        var Validator = Widget.extend({\n            init: function (element, options) {\n                var that = this, resolved = resolveRules(element), validateAttributeSelector = '[' + kendo.attr('validate') + '!=false]';\n                options = options || {};\n                options.rules = $.extend({}, kendo.ui.validator.rules, resolved.rules, options.rules);\n                options.messages = $.extend({}, kendo.ui.validator.messages, resolved.messages, options.messages);\n                Widget.fn.init.call(that, element, options);\n                that._errorTemplate = kendo.template(that.options.errorTemplate);\n                that._summaryTemplate = kendo.template(that.options.validationSummary.template || SUMMARYTEMPLATE);\n                if (that.element.is(FORM)) {\n                    that.element.attr(NOVALIDATE, NOVALIDATE);\n                }\n                that._inputSelector = INPUTSELECTOR + validateAttributeSelector;\n                that._checkboxSelector = CHECKBOXSELECTOR + validateAttributeSelector;\n                that._errors = {};\n                that._attachEvents();\n                that._isValidated = false;\n            },\n            events: [\n                VALIDATE,\n                CHANGE,\n                VALIDATE_INPUT\n            ],\n            options: {\n                name: 'Validator',\n                errorTemplate: '<span class=\"k-tooltip k-tooltip-error\">' + '<span class=\"k-tooltip-icon k-icon k-i-error\"></span>' + '<span class=\"k-tooltip-content\">#=message#</span>' + '</span>',\n                messages: {\n                    required: '{0} is required',\n                    pattern: '{0} is not valid',\n                    min: '{0} should be greater than or equal to {1}',\n                    max: '{0} should be smaller than or equal to {1}',\n                    step: '{0} is not valid',\n                    email: '{0} is not valid email',\n                    url: '{0} is not valid URL',\n                    date: '{0} is not valid date',\n                    dateCompare: 'End date should be greater than or equal to the start date'\n                },\n                rules: {\n                    required: function (input) {\n                        var checkbox = input.filter('[type=checkbox]').length && !input.is(':checked'), value = input.val();\n                        return !(hasAttribute(input, 'required') && (!value || value === '' || value.length === 0 || checkbox));\n                    },\n                    pattern: function (input) {\n                        if (input.filter('[type=text],[type=email],[type=url],[type=tel],[type=search],[type=password]').filter('[pattern]').length && input.val() !== '') {\n                            return patternMatcher(input.val(), input.attr('pattern'));\n                        }\n                        return true;\n                    },\n                    min: function (input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + ',[' + kendo.attr('type') + '=number]').filter('[min]').length && input.val() !== '') {\n                            var min = parseFloat(input.attr('min')) || 0, val = kendo.parseFloat(input.val());\n                            return min <= val;\n                        }\n                        return true;\n                    },\n                    max: function (input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + ',[' + kendo.attr('type') + '=number]').filter('[max]').length && input.val() !== '') {\n                            var max = parseFloat(input.attr('max')) || 0, val = kendo.parseFloat(input.val());\n                            return max >= val;\n                        }\n                        return true;\n                    },\n                    step: function (input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + ',[' + kendo.attr('type') + '=number]').filter('[step]').length && input.val() !== '') {\n                            var min = parseFloat(input.attr('min')) || 0, step = parseFloat(input.attr('step')) || 1, val = parseFloat(input.val()), decimals = numberOfDecimalDigits(step), raise;\n                            if (decimals) {\n                                raise = Math.pow(10, decimals);\n                                return Math.floor((val - min) * raise) % (step * raise) / Math.pow(100, decimals) === 0;\n                            }\n                            return (val - min) % step === 0;\n                        }\n                        return true;\n                    },\n                    email: function (input) {\n                        return matcher(input, '[type=email],[' + kendo.attr('type') + '=email]', emailRegExp);\n                    },\n                    url: function (input) {\n                        return matcher(input, '[type=url],[' + kendo.attr('type') + '=url]', urlRegExp);\n                    },\n                    date: function (input) {\n                        if (input.filter('[type^=date],[' + kendo.attr('type') + '=date]').length && input.val() !== '') {\n                            return kendo.parseDate(input.val(), input.attr(kendo.attr('format'))) !== null;\n                        }\n                        return true;\n                    }\n                },\n                validateOnBlur: true,\n                validationSummary: false\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.element.off(NS);\n                if (this.validationSummary) {\n                    this.validationSummary.off(NS);\n                }\n            },\n            value: function () {\n                if (!this._isValidated) {\n                    return false;\n                }\n                return this.errors().length === 0;\n            },\n            _submit: function (e) {\n                if (!this.validate()) {\n                    e.stopPropagation();\n                    e.stopImmediatePropagation();\n                    e.preventDefault();\n                    return false;\n                }\n                return true;\n            },\n            _checkElement: function (element) {\n                var state = this.value();\n                this.validateInput(element);\n                if (this.value() !== state) {\n                    this.trigger(CHANGE);\n                }\n            },\n            _attachEvents: function () {\n                var that = this;\n                if (that.element.is(FORM)) {\n                    that.element.on('submit' + NS, proxy(that._submit, that));\n                }\n                if (that.options.validateOnBlur) {\n                    if (!that.element.is(INPUTSELECTOR)) {\n                        that.element.on(BLUR + NS, that._inputSelector, function () {\n                            that._checkElement($(this));\n                        });\n                        that.element.on('click' + NS, that._checkboxSelector, function () {\n                            that._checkElement($(this));\n                        });\n                    } else {\n                        that.element.on(BLUR + NS, function () {\n                            that._checkElement(that.element);\n                        });\n                        if (that.element.is(CHECKBOXSELECTOR)) {\n                            that.element.on('click' + NS, function () {\n                                that._checkElement(that.element);\n                            });\n                        }\n                    }\n                }\n            },\n            validate: function () {\n                var inputs;\n                var idx;\n                var result = false;\n                var length;\n                var isValid = this.value();\n                this._errors = {};\n                if (!this.element.is(INPUTSELECTOR)) {\n                    var invalid = false;\n                    inputs = this.element.find(this._inputSelector);\n                    for (idx = 0, length = inputs.length; idx < length; idx++) {\n                        if (!this.validateInput(inputs.eq(idx))) {\n                            invalid = true;\n                        }\n                    }\n                    result = !invalid;\n                } else {\n                    result = this.validateInput(this.element);\n                }\n                if (this.options.validationSummary && !isValid) {\n                    this.showValidationSummary();\n                }\n                this.trigger(VALIDATE, {\n                    valid: result,\n                    errors: this.errors()\n                });\n                if (isValid !== result) {\n                    this.trigger(CHANGE);\n                }\n                return result;\n            },\n            validateInput: function (input) {\n                input = $(input);\n                this._isValidated = true;\n                var that = this, template = that._errorTemplate, result = that._checkValidity(input), valid = result.valid, className = '.' + INVALIDMSG, fieldName = input.attr(NAME) || '', lbl = that._findMessageContainer(fieldName).add(input.next(className).filter(function () {\n                        var element = $(this);\n                        if (element.filter('[' + kendo.attr('for') + ']').length) {\n                            return element.attr(kendo.attr('for')) === fieldName;\n                        }\n                        return true;\n                    })).hide(), messageText = !valid ? that._extractMessage(input, result.key) : '', messageLabel = !valid ? parseHtml(template({ message: decode(messageText) })) : '', wasValid = !input.attr('aria-invalid');\n                input.removeAttr('aria-invalid');\n                if (wasValid !== valid) {\n                    if (this.trigger(VALIDATE_INPUT, {\n                            valid: valid,\n                            input: input,\n                            error: messageText,\n                            field: fieldName\n                        })) {\n                        return;\n                    }\n                }\n                if (!valid) {\n                    that._errors[fieldName] = messageText;\n                    var lblId = lbl.attr('id');\n                    that._decorateMessageContainer(messageLabel, fieldName);\n                    if (lblId) {\n                        messageLabel.attr('id', lblId);\n                    }\n                    if (lbl.length !== 0) {\n                        lbl.replaceWith(messageLabel);\n                    } else {\n                        var widgetInstance = kendo.widgetInstance(input);\n                        var parentElement = input.parent().get(0);\n                        var nextElement = input.next().get(0);\n                        if (parentElement && parentElement.nodeName === 'LABEL') {\n                            messageLabel.insertAfter(parentElement);\n                        } else if (nextElement && nextElement.nodeName === 'LABEL') {\n                            messageLabel.insertAfter(nextElement);\n                        } else if (widgetInstance && widgetInstance.wrapper) {\n                            messageLabel.insertAfter(widgetInstance.wrapper);\n                        } else {\n                            messageLabel.insertAfter(input);\n                        }\n                    }\n                    messageLabel.show();\n                    input.attr('aria-invalid', true);\n                } else {\n                    delete that._errors[fieldName];\n                }\n                input.toggleClass(INVALIDINPUT, !valid);\n                input.toggleClass(VALIDINPUT, valid);\n                if (kendo.widgetInstance(input)) {\n                    var inputWrap = kendo.widgetInstance(input)._inputWrapper;\n                    if (inputWrap) {\n                        inputWrap.toggleClass(INVALIDINPUT, !valid);\n                        inputWrap.toggleClass(INVALIDINPUT, !valid);\n                    }\n                }\n                if (wasValid !== valid && this.options.validationSummary && this.options.validateOnBlur) {\n                    this.showValidationSummary();\n                }\n                return valid;\n            },\n            hideMessages: function () {\n                var that = this, className = '.' + INVALIDMSG, element = that.element;\n                if (!element.is(INPUTSELECTOR)) {\n                    element.find(className).hide();\n                } else {\n                    element.next(className).hide();\n                }\n            },\n            _findMessageContainer: function (fieldName) {\n                var locators = kendo.ui.validator.messageLocators, name, containers = $();\n                for (var idx = 0, length = this.element.length; idx < length; idx++) {\n                    containers = containers.add(searchForMessageContainer(this.element[idx].getElementsByTagName('*'), fieldName));\n                }\n                for (name in locators) {\n                    containers = containers.add(locators[name].locate(this.element, fieldName));\n                }\n                return containers;\n            },\n            _decorateMessageContainer: function (container, fieldName) {\n                var locators = kendo.ui.validator.messageLocators, name;\n                container.addClass(INVALIDMSG).attr(kendo.attr('for'), fieldName || '');\n                for (name in locators) {\n                    locators[name].decorate(container, fieldName);\n                }\n                container.attr('role', 'alert');\n            },\n            _extractMessage: function (input, ruleKey) {\n                var that = this, customMessage = that.options.messages[ruleKey], fieldName = input.attr(NAME), nonDefaultMessage;\n                if (!kendo.ui.Validator.prototype.options.messages[ruleKey]) {\n                    nonDefaultMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\n                }\n                customMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\n                return kendo.format(input.attr(kendo.attr(ruleKey + '-msg')) || input.attr('validationMessage') || nonDefaultMessage || customMessage || input.attr('title') || '', fieldName, input.attr(ruleKey) || input.attr(kendo.attr(ruleKey)));\n            },\n            _checkValidity: function (input) {\n                var rules = this.options.rules, rule;\n                for (rule in rules) {\n                    if (!rules[rule].call(this, input)) {\n                        return {\n                            valid: false,\n                            key: rule\n                        };\n                    }\n                }\n                return { valid: true };\n            },\n            errors: function () {\n                var results = [], errors = this._errors, error;\n                for (error in errors) {\n                    results.push(errors[error]);\n                }\n                return results;\n            },\n            setOptions: function (options) {\n                var currentOptions = kendo.deepExtend(this.options, options);\n                this.destroy();\n                this.init(this.element, currentOptions);\n                this._setEvents(currentOptions);\n            },\n            _getInputNames: function () {\n                var that = this, inputs = that.element.find(that._inputSelector), sorted = [];\n                for (var idx = 0, length = inputs.length; idx < length; idx++) {\n                    var input = $(inputs[idx]);\n                    if (hasAttribute(input, NAME)) {\n                        sorted.push(input.attr(NAME));\n                    }\n                }\n                return sorted;\n            },\n            _errorsByName: function () {\n                var that = this, inputNames = that._getInputNames(), sorted = [];\n                for (var i = 0; i < inputNames.length; i += 1) {\n                    var name = inputNames[i];\n                    if (that._errors[name]) {\n                        sorted.push({\n                            field: name,\n                            message: that._errors[name]\n                        });\n                    }\n                }\n                return sorted;\n            },\n            _renderSummary: function () {\n                var that = this, options = this.options.validationSummary, element = this.element, prevElement = element.prev(), container;\n                if (options.container) {\n                    container = $(options.container);\n                } else if (prevElement && prevElement.hasClass(VALIDATIONSUMMARY)) {\n                    container = prevElement;\n                } else {\n                    container = $('<div />').insertBefore(that.element);\n                }\n                container.addClass([\n                    VALIDATIONSUMMARY,\n                    MESSAGEBOX\n                ].join(' '));\n                container.attr('role', 'alert');\n                container.on('click' + NS, proxy(that._summaryClick, that));\n                return container;\n            },\n            _summaryClick: function (e) {\n                e.preventDefault();\n                var that = this, link = $(e.target), target = that.element.find('[name=\\'' + link.data('field') + '\\']'), nextFocusable, kendoInstance;\n                if (!target.length) {\n                    return;\n                }\n                nextFocusable = target.closest(':kendoFocusable');\n                kendoInstance = kendo.widgetInstance(target);\n                if (nextFocusable.length) {\n                    nextFocusable.focus();\n                } else if (kendoInstance) {\n                    kendoInstance.focus();\n                } else {\n                    target.focus();\n                }\n            },\n            showValidationSummary: function () {\n                var that = this, summary = that.validationSummary, errorsList;\n                if (!summary) {\n                    summary = that.validationSummary = that._renderSummary();\n                }\n                errorsList = parseHtml(that._summaryTemplate({ errors: that._errorsByName() }));\n                summary.html(errorsList);\n                summary.show();\n            },\n            hideValidationSummary: function () {\n                var that = this, summary = that.validationSummary;\n                if (!summary) {\n                    return;\n                }\n                summary.hide();\n            }\n        });\n        kendo.ui.plugin(Validator);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.draganddrop', [\n        'kendo.core',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'draganddrop',\n        name: 'Drag & drop',\n        category: 'framework',\n        description: 'Drag & drop functionality for any DOM element.',\n        depends: [\n            'core',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, support = kendo.support, document = window.document, $window = $(window), Class = kendo.Class, Widget = kendo.ui.Widget, Observable = kendo.Observable, UserEvents = kendo.UserEvents, proxy = $.proxy, extend = $.extend, getOffset = kendo.getOffset, draggables = {}, dropTargets = {}, dropAreas = {}, lastDropTarget, elementUnderCursor = kendo.elementUnderCursor, KEYUP = 'keyup', CHANGE = 'change', DRAGSTART = 'dragstart', HOLD = 'hold', DRAG = 'drag', DRAGEND = 'dragend', DRAGCANCEL = 'dragcancel', HINTDESTROYED = 'hintDestroyed', DRAGENTER = 'dragenter', DRAGLEAVE = 'dragleave', DROP = 'drop';\n        function contains(parent, child) {\n            try {\n                return $.contains(parent, child) || parent == child;\n            } catch (e) {\n                return false;\n            }\n        }\n        function numericCssPropery(element, property) {\n            return parseInt(element.css(property), 10) || 0;\n        }\n        function within(value, range) {\n            return Math.min(Math.max(value, range.min), range.max);\n        }\n        function containerBoundaries(container, element) {\n            var offset = getOffset(container), outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, minX = offset.left + numericCssPropery(container, 'borderLeftWidth') + numericCssPropery(container, 'paddingLeft'), minY = offset.top + numericCssPropery(container, 'borderTopWidth') + numericCssPropery(container, 'paddingTop'), maxX = minX + container.width() - outerWidth(element, true), maxY = minY + container.height() - outerHeight(element, true);\n            return {\n                x: {\n                    min: minX,\n                    max: maxX\n                },\n                y: {\n                    min: minY,\n                    max: maxY\n                }\n            };\n        }\n        function checkTarget(target, targets, areas) {\n            var theTarget, theFilter, i = 0, targetLen = targets && targets.length, areaLen = areas && areas.length;\n            while (target && target.parentNode) {\n                for (i = 0; i < targetLen; i++) {\n                    theTarget = targets[i];\n                    if (theTarget.element[0] === target) {\n                        return {\n                            target: theTarget,\n                            targetElement: target\n                        };\n                    }\n                }\n                for (i = 0; i < areaLen; i++) {\n                    theFilter = areas[i];\n                    if ($.contains(theFilter.element[0], target) && support.matchesSelector.call(target, theFilter.options.filter)) {\n                        return {\n                            target: theFilter,\n                            targetElement: target\n                        };\n                    }\n                }\n                target = target.parentNode;\n            }\n            return undefined;\n        }\n        var TapCapture = Observable.extend({\n            init: function (element, options) {\n                var that = this, domElement = element[0];\n                that.capture = false;\n                if (domElement.addEventListener) {\n                    $.each(kendo.eventMap.down.split(' '), function () {\n                        domElement.addEventListener(this, proxy(that._press, that), true);\n                    });\n                    $.each(kendo.eventMap.up.split(' '), function () {\n                        domElement.addEventListener(this, proxy(that._release, that), true);\n                    });\n                } else {\n                    $.each(kendo.eventMap.down.split(' '), function () {\n                        domElement.attachEvent(this, proxy(that._press, that));\n                    });\n                    $.each(kendo.eventMap.up.split(' '), function () {\n                        domElement.attachEvent(this, proxy(that._release, that));\n                    });\n                }\n                Observable.fn.init.call(that);\n                that.bind([\n                    'press',\n                    'release'\n                ], options || {});\n            },\n            captureNext: function () {\n                this.capture = true;\n            },\n            cancelCapture: function () {\n                this.capture = false;\n            },\n            _press: function (e) {\n                var that = this;\n                that.trigger('press');\n                if (that.capture) {\n                    e.preventDefault();\n                }\n            },\n            _release: function (e) {\n                var that = this;\n                that.trigger('release');\n                if (that.capture) {\n                    e.preventDefault();\n                    that.cancelCapture();\n                }\n            }\n        });\n        var PaneDimension = Observable.extend({\n            init: function (options) {\n                var that = this;\n                Observable.fn.init.call(that);\n                that.forcedEnabled = false;\n                $.extend(that, options);\n                that.scale = 1;\n                if (that.horizontal) {\n                    that.measure = 'offsetWidth';\n                    that.scrollSize = 'scrollWidth';\n                    that.axis = 'x';\n                } else {\n                    that.measure = 'offsetHeight';\n                    that.scrollSize = 'scrollHeight';\n                    that.axis = 'y';\n                }\n            },\n            makeVirtual: function () {\n                $.extend(this, {\n                    virtual: true,\n                    forcedEnabled: true,\n                    _virtualMin: 0,\n                    _virtualMax: 0\n                });\n            },\n            virtualSize: function (min, max) {\n                if (this._virtualMin !== min || this._virtualMax !== max) {\n                    this._virtualMin = min;\n                    this._virtualMax = max;\n                    this.update();\n                }\n            },\n            outOfBounds: function (offset) {\n                return offset > this.max || offset < this.min;\n            },\n            forceEnabled: function () {\n                this.forcedEnabled = true;\n            },\n            getSize: function () {\n                return this.container[0][this.measure];\n            },\n            getTotal: function () {\n                return this.element[0][this.scrollSize];\n            },\n            rescale: function (scale) {\n                this.scale = scale;\n            },\n            update: function (silent) {\n                var that = this, total = that.virtual ? that._virtualMax : that.getTotal(), scaledTotal = total * that.scale, size = that.getSize();\n                if (total === 0 && !that.forcedEnabled) {\n                    return;\n                }\n                that.max = that.virtual ? -that._virtualMin : 0;\n                that.size = size;\n                that.total = scaledTotal;\n                that.min = Math.min(that.max, size - scaledTotal);\n                that.minScale = size / total;\n                that.centerOffset = (scaledTotal - size) / 2;\n                that.enabled = that.forcedEnabled || scaledTotal > size;\n                if (!silent) {\n                    that.trigger(CHANGE, that);\n                }\n            }\n        });\n        var PaneDimensions = Observable.extend({\n            init: function (options) {\n                var that = this;\n                Observable.fn.init.call(that);\n                that.x = new PaneDimension(extend({ horizontal: true }, options));\n                that.y = new PaneDimension(extend({ horizontal: false }, options));\n                that.container = options.container;\n                that.forcedMinScale = options.minScale;\n                that.maxScale = options.maxScale || 100;\n                that.bind(CHANGE, options);\n            },\n            rescale: function (newScale) {\n                this.x.rescale(newScale);\n                this.y.rescale(newScale);\n                this.refresh();\n            },\n            centerCoordinates: function () {\n                return {\n                    x: Math.min(0, -this.x.centerOffset),\n                    y: Math.min(0, -this.y.centerOffset)\n                };\n            },\n            refresh: function () {\n                var that = this;\n                that.x.update();\n                that.y.update();\n                that.enabled = that.x.enabled || that.y.enabled;\n                that.minScale = that.forcedMinScale || Math.min(that.x.minScale, that.y.minScale);\n                that.fitScale = Math.max(that.x.minScale, that.y.minScale);\n                that.trigger(CHANGE);\n            }\n        });\n        var PaneAxis = Observable.extend({\n            init: function (options) {\n                var that = this;\n                extend(that, options);\n                Observable.fn.init.call(that);\n            },\n            outOfBounds: function () {\n                return this.dimension.outOfBounds(this.movable[this.axis]);\n            },\n            dragMove: function (delta) {\n                var that = this, dimension = that.dimension, axis = that.axis, movable = that.movable, position = movable[axis] + delta;\n                if (!dimension.enabled) {\n                    return;\n                }\n                if (position < dimension.min && delta < 0 || position > dimension.max && delta > 0) {\n                    delta *= that.resistance;\n                }\n                movable.translateAxis(axis, delta);\n                that.trigger(CHANGE, that);\n            }\n        });\n        var Pane = Class.extend({\n            init: function (options) {\n                var that = this, x, y, resistance, movable;\n                extend(that, { elastic: true }, options);\n                resistance = that.elastic ? 0.5 : 0;\n                movable = that.movable;\n                that.x = x = new PaneAxis({\n                    axis: 'x',\n                    dimension: that.dimensions.x,\n                    resistance: resistance,\n                    movable: movable\n                });\n                that.y = y = new PaneAxis({\n                    axis: 'y',\n                    dimension: that.dimensions.y,\n                    resistance: resistance,\n                    movable: movable\n                });\n                that.userEvents.bind([\n                    'press',\n                    'move',\n                    'end',\n                    'gesturestart',\n                    'gesturechange'\n                ], {\n                    gesturestart: function (e) {\n                        that.gesture = e;\n                        that.offset = that.dimensions.container.offset();\n                    },\n                    press: function (e) {\n                        if ($(e.event.target).closest('a').is('[data-navigate-on-press=true]')) {\n                            e.sender.cancel();\n                        }\n                    },\n                    gesturechange: function (e) {\n                        var previousGesture = that.gesture, previousCenter = previousGesture.center, center = e.center, scaleDelta = e.distance / previousGesture.distance, minScale = that.dimensions.minScale, maxScale = that.dimensions.maxScale, coordinates;\n                        if (movable.scale <= minScale && scaleDelta < 1) {\n                            scaleDelta += (1 - scaleDelta) * 0.8;\n                        }\n                        if (movable.scale * scaleDelta >= maxScale) {\n                            scaleDelta = maxScale / movable.scale;\n                        }\n                        var offsetX = movable.x + that.offset.left, offsetY = movable.y + that.offset.top;\n                        coordinates = {\n                            x: (offsetX - previousCenter.x) * scaleDelta + center.x - offsetX,\n                            y: (offsetY - previousCenter.y) * scaleDelta + center.y - offsetY\n                        };\n                        movable.scaleWith(scaleDelta);\n                        x.dragMove(coordinates.x);\n                        y.dragMove(coordinates.y);\n                        that.dimensions.rescale(movable.scale);\n                        that.gesture = e;\n                        e.preventDefault();\n                    },\n                    move: function (e) {\n                        if (e.event.target.tagName.match(/textarea|input/i)) {\n                            return;\n                        }\n                        if (x.dimension.enabled || y.dimension.enabled) {\n                            x.dragMove(e.x.delta);\n                            y.dragMove(e.y.delta);\n                            e.preventDefault();\n                        } else {\n                            e.touch.skip();\n                        }\n                    },\n                    end: function (e) {\n                        e.preventDefault();\n                    }\n                });\n            }\n        });\n        var TRANSFORM_STYLE = support.transitions.prefix + 'Transform', translate;\n        if (support.hasHW3D) {\n            translate = function (x, y, scale) {\n                return 'translate3d(' + x + 'px,' + y + 'px,0) scale(' + scale + ')';\n            };\n        } else {\n            translate = function (x, y, scale) {\n                return 'translate(' + x + 'px,' + y + 'px) scale(' + scale + ')';\n            };\n        }\n        var Movable = Observable.extend({\n            init: function (element) {\n                var that = this;\n                Observable.fn.init.call(that);\n                that.element = $(element);\n                that.element[0].style.webkitTransformOrigin = 'left top';\n                that.x = 0;\n                that.y = 0;\n                that.scale = 1;\n                that._saveCoordinates(translate(that.x, that.y, that.scale));\n            },\n            translateAxis: function (axis, by) {\n                this[axis] += by;\n                this.refresh();\n            },\n            scaleTo: function (scale) {\n                this.scale = scale;\n                this.refresh();\n            },\n            scaleWith: function (scaleDelta) {\n                this.scale *= scaleDelta;\n                this.refresh();\n            },\n            translate: function (coordinates) {\n                this.x += coordinates.x;\n                this.y += coordinates.y;\n                this.refresh();\n            },\n            moveAxis: function (axis, value) {\n                this[axis] = value;\n                this.refresh();\n            },\n            moveTo: function (coordinates) {\n                extend(this, coordinates);\n                this.refresh();\n            },\n            refresh: function () {\n                var that = this, x = that.x, y = that.y, newCoordinates;\n                if (that.round) {\n                    x = Math.round(x);\n                    y = Math.round(y);\n                }\n                newCoordinates = translate(x, y, that.scale);\n                if (newCoordinates != that.coordinates) {\n                    if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n                        that.element[0].style.position = 'absolute';\n                        that.element[0].style.left = that.x + 'px';\n                        that.element[0].style.top = that.y + 'px';\n                    } else {\n                        that.element[0].style[TRANSFORM_STYLE] = newCoordinates;\n                    }\n                    that._saveCoordinates(newCoordinates);\n                    that.trigger(CHANGE);\n                }\n            },\n            _saveCoordinates: function (coordinates) {\n                this.coordinates = coordinates;\n            }\n        });\n        function destroyDroppable(collection, widget) {\n            var groupName = widget.options.group, droppables = collection[groupName], i;\n            Widget.fn.destroy.call(widget);\n            if (droppables.length > 1) {\n                for (i = 0; i < droppables.length; i++) {\n                    if (droppables[i] == widget) {\n                        droppables.splice(i, 1);\n                        break;\n                    }\n                }\n            } else {\n                droppables.length = 0;\n                delete collection[groupName];\n            }\n        }\n        var DropTarget = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                var group = that.options.group;\n                if (!(group in dropTargets)) {\n                    dropTargets[group] = [that];\n                } else {\n                    dropTargets[group].push(that);\n                }\n            },\n            events: [\n                DRAGENTER,\n                DRAGLEAVE,\n                DROP\n            ],\n            options: {\n                name: 'DropTarget',\n                group: 'default'\n            },\n            destroy: function () {\n                destroyDroppable(dropTargets, this);\n            },\n            _trigger: function (eventName, e) {\n                var that = this, draggable = draggables[that.options.group];\n                if (draggable) {\n                    return that.trigger(eventName, extend({}, e.event, {\n                        draggable: draggable,\n                        dropTarget: e.dropTarget\n                    }));\n                }\n            },\n            _over: function (e) {\n                this._trigger(DRAGENTER, e);\n            },\n            _out: function (e) {\n                this._trigger(DRAGLEAVE, e);\n            },\n            _drop: function (e) {\n                var that = this, draggable = draggables[that.options.group];\n                if (draggable) {\n                    draggable.dropped = !that._trigger(DROP, e);\n                }\n            }\n        });\n        DropTarget.destroyGroup = function (groupName) {\n            var group = dropTargets[groupName] || dropAreas[groupName], i;\n            if (group) {\n                for (i = 0; i < group.length; i++) {\n                    Widget.fn.destroy.call(group[i]);\n                }\n                group.length = 0;\n                delete dropTargets[groupName];\n                delete dropAreas[groupName];\n            }\n        };\n        DropTarget._cache = dropTargets;\n        var DropTargetArea = DropTarget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                var group = that.options.group;\n                if (!(group in dropAreas)) {\n                    dropAreas[group] = [that];\n                } else {\n                    dropAreas[group].push(that);\n                }\n            },\n            destroy: function () {\n                destroyDroppable(dropAreas, this);\n            },\n            options: {\n                name: 'DropTargetArea',\n                group: 'default',\n                filter: null\n            }\n        });\n        var Draggable = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that._activated = false;\n                that.userEvents = new UserEvents(that.element, {\n                    global: true,\n                    allowSelection: true,\n                    filter: that.options.filter,\n                    threshold: that.options.distance,\n                    start: proxy(that._start, that),\n                    hold: proxy(that._hold, that),\n                    move: proxy(that._drag, that),\n                    end: proxy(that._end, that),\n                    cancel: proxy(that._cancel, that),\n                    select: proxy(that._select, that)\n                });\n                if (kendo.support.touch) {\n                    that.element.find(that.options.filter).css('touch-action', 'none');\n                }\n                that._afterEndHandler = proxy(that._afterEnd, that);\n                that._captureEscape = proxy(that._captureEscape, that);\n            },\n            events: [\n                HOLD,\n                DRAGSTART,\n                DRAG,\n                DRAGEND,\n                DRAGCANCEL,\n                HINTDESTROYED\n            ],\n            options: {\n                name: 'Draggable',\n                distance: kendo.support.touch ? 0 : 5,\n                group: 'default',\n                cursorOffset: null,\n                axis: null,\n                container: null,\n                filter: null,\n                ignore: null,\n                holdToDrag: false,\n                autoScroll: false,\n                dropped: false\n            },\n            cancelHold: function () {\n                this._activated = false;\n            },\n            _captureEscape: function (e) {\n                var that = this;\n                if (e.keyCode === kendo.keys.ESC) {\n                    that._trigger(DRAGCANCEL, { event: e });\n                    that.userEvents.cancel();\n                }\n            },\n            _updateHint: function (e) {\n                var that = this, coordinates, options = that.options, boundaries = that.boundaries, axis = options.axis, cursorOffset = that.options.cursorOffset;\n                if (cursorOffset) {\n                    coordinates = {\n                        left: e.x.location + cursorOffset.left,\n                        top: e.y.location + cursorOffset.top\n                    };\n                } else {\n                    that.hintOffset.left += e.x.delta;\n                    that.hintOffset.top += e.y.delta;\n                    coordinates = $.extend({}, that.hintOffset);\n                }\n                if (boundaries) {\n                    coordinates.top = within(coordinates.top, boundaries.y);\n                    coordinates.left = within(coordinates.left, boundaries.x);\n                }\n                if (axis === 'x') {\n                    delete coordinates.top;\n                } else if (axis === 'y') {\n                    delete coordinates.left;\n                }\n                that.hint.css(coordinates);\n            },\n            _shouldIgnoreTarget: function (target) {\n                var ignoreSelector = this.options.ignore;\n                return ignoreSelector && $(target).is(ignoreSelector);\n            },\n            _select: function (e) {\n                if (!this._shouldIgnoreTarget(e.event.target)) {\n                    e.preventDefault();\n                }\n            },\n            _start: function (e) {\n                var that = this, options = that.options, container = options.container ? $(options.container) : null, hint = options.hint;\n                if (this._shouldIgnoreTarget(e.touch.initialTouch) || options.holdToDrag && !that._activated) {\n                    that.userEvents.cancel();\n                    return;\n                }\n                that.currentTarget = e.target;\n                that.currentTargetOffset = getOffset(that.currentTarget);\n                if (hint) {\n                    if (that.hint) {\n                        that.hint.stop(true, true).remove();\n                    }\n                    that.hint = kendo.isFunction(hint) ? $(hint.call(that, that.currentTarget)) : hint;\n                    var offset = getOffset(that.currentTarget);\n                    that.hintOffset = offset;\n                    that.hint.css({\n                        position: 'absolute',\n                        zIndex: 20000,\n                        left: offset.left,\n                        top: offset.top\n                    }).appendTo(document.body);\n                    that.angular('compile', function () {\n                        that.hint.removeAttr('ng-repeat');\n                        var scopeTarget = $(e.target);\n                        while (!scopeTarget.data('$$kendoScope') && scopeTarget.length) {\n                            scopeTarget = scopeTarget.parent();\n                        }\n                        return {\n                            elements: that.hint.get(),\n                            scopeFrom: scopeTarget.data('$$kendoScope')\n                        };\n                    });\n                }\n                draggables[options.group] = that;\n                that.dropped = false;\n                if (container) {\n                    that.boundaries = containerBoundaries(container, that.hint);\n                }\n                $(document).on(KEYUP, that._captureEscape);\n                if (that._trigger(DRAGSTART, e)) {\n                    that.userEvents.cancel();\n                    that._afterEnd();\n                }\n                that.userEvents.capture();\n            },\n            _hold: function (e) {\n                this.currentTarget = e.target;\n                if (this._trigger(HOLD, e)) {\n                    this.userEvents.cancel();\n                } else {\n                    this._activated = true;\n                }\n            },\n            _drag: function (e) {\n                e.preventDefault();\n                var cursorElement = this._elementUnderCursor(e);\n                if (this.options.autoScroll && this._cursorElement !== cursorElement) {\n                    this._scrollableParent = findScrollableParent(cursorElement);\n                    this._cursorElement = cursorElement;\n                }\n                this._lastEvent = e;\n                this._processMovement(e, cursorElement);\n                if (this.options.autoScroll) {\n                    if (this._scrollableParent[0]) {\n                        var velocity = autoScrollVelocity(e.x.location, e.y.location, scrollableViewPort(this._scrollableParent));\n                        this._scrollCompenstation = $.extend({}, this.hintOffset);\n                        this._scrollVelocity = velocity;\n                        if (velocity.y === 0 && velocity.x === 0) {\n                            clearInterval(this._scrollInterval);\n                            this._scrollInterval = null;\n                        } else if (!this._scrollInterval) {\n                            this._scrollInterval = setInterval($.proxy(this, '_autoScroll'), 50);\n                        }\n                    }\n                }\n                if (this.hint) {\n                    this._updateHint(e);\n                }\n            },\n            _processMovement: function (e, cursorElement) {\n                this._withDropTarget(cursorElement, function (target, targetElement) {\n                    if (!target) {\n                        if (lastDropTarget) {\n                            lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\n                            lastDropTarget = null;\n                        }\n                        return;\n                    }\n                    if (lastDropTarget) {\n                        if (targetElement === lastDropTarget.targetElement) {\n                            return;\n                        }\n                        lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\n                    }\n                    target._trigger(DRAGENTER, extend(e, { dropTarget: $(targetElement) }));\n                    lastDropTarget = extend(target, { targetElement: targetElement });\n                });\n                this._trigger(DRAG, extend(e, {\n                    dropTarget: lastDropTarget,\n                    elementUnderCursor: cursorElement\n                }));\n            },\n            _autoScroll: function () {\n                var parent = this._scrollableParent[0], velocity = this._scrollVelocity, compensation = this._scrollCompenstation;\n                if (!parent) {\n                    return;\n                }\n                var cursorElement = this._elementUnderCursor(this._lastEvent);\n                this._processMovement(this._lastEvent, cursorElement);\n                var yIsScrollable, xIsScrollable;\n                var isRootNode = parent === scrollableRoot()[0];\n                if (isRootNode) {\n                    yIsScrollable = document.body.scrollHeight > $window.height();\n                    xIsScrollable = document.body.scrollWidth > $window.width();\n                } else {\n                    yIsScrollable = parent.offsetHeight <= parent.scrollHeight;\n                    xIsScrollable = parent.offsetWidth <= parent.scrollWidth;\n                }\n                var yDelta = parent.scrollTop + velocity.y;\n                var yInBounds = yIsScrollable && yDelta > 0 && yDelta < parent.scrollHeight;\n                var xDelta = parent.scrollLeft + velocity.x;\n                var xInBounds = xIsScrollable && xDelta > 0 && xDelta < parent.scrollWidth;\n                if (yInBounds) {\n                    parent.scrollTop += velocity.y;\n                }\n                if (xInBounds) {\n                    parent.scrollLeft += velocity.x;\n                }\n                if (this.hint && isRootNode && (xInBounds || yInBounds)) {\n                    if (yInBounds) {\n                        compensation.top += velocity.y;\n                    }\n                    if (xInBounds) {\n                        compensation.left += velocity.x;\n                    }\n                    this.hint.css(compensation);\n                }\n            },\n            _end: function (e) {\n                this._withDropTarget(this._elementUnderCursor(e), function (target, targetElement) {\n                    if (target) {\n                        target._drop(extend({}, e, { dropTarget: $(targetElement) }));\n                        lastDropTarget = null;\n                    }\n                });\n                this._cancel(this._trigger(DRAGEND, e));\n            },\n            _cancel: function (isDefaultPrevented) {\n                var that = this;\n                that._scrollableParent = null;\n                this._cursorElement = null;\n                clearInterval(this._scrollInterval);\n                that._activated = false;\n                if (that.hint && !that.dropped) {\n                    setTimeout(function () {\n                        that.hint.stop(true, true);\n                        if (isDefaultPrevented) {\n                            that._afterEndHandler();\n                        } else {\n                            that.hint.animate(that.currentTargetOffset, 'fast', that._afterEndHandler);\n                        }\n                    }, 0);\n                } else {\n                    that._afterEnd();\n                }\n            },\n            _trigger: function (eventName, e) {\n                var that = this;\n                return that.trigger(eventName, extend({}, e.event, {\n                    x: e.x,\n                    y: e.y,\n                    currentTarget: that.currentTarget,\n                    initialTarget: e.touch ? e.touch.initialTouch : null,\n                    dropTarget: e.dropTarget,\n                    elementUnderCursor: e.elementUnderCursor\n                }));\n            },\n            _elementUnderCursor: function (e) {\n                var target = elementUnderCursor(e), hint = this.hint;\n                if (hint && contains(hint[0], target)) {\n                    hint.hide();\n                    target = elementUnderCursor(e);\n                    if (!target) {\n                        target = elementUnderCursor(e);\n                    }\n                    hint.show();\n                }\n                return target;\n            },\n            _withDropTarget: function (element, callback) {\n                var result, group = this.options.group, targets = dropTargets[group], areas = dropAreas[group];\n                if (targets && targets.length || areas && areas.length) {\n                    result = checkTarget(element, targets, areas);\n                    if (result) {\n                        callback(result.target, result.targetElement);\n                    } else {\n                        callback();\n                    }\n                }\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that._afterEnd();\n                that.userEvents.destroy();\n                this._scrollableParent = null;\n                this._cursorElement = null;\n                clearInterval(this._scrollInterval);\n                that.currentTarget = null;\n            },\n            _afterEnd: function () {\n                var that = this;\n                if (that.hint) {\n                    that.hint.remove();\n                }\n                delete draggables[that.options.group];\n                that.trigger('destroy');\n                that.trigger(HINTDESTROYED);\n                $(document).off(KEYUP, that._captureEscape);\n            }\n        });\n        kendo.ui.plugin(DropTarget);\n        kendo.ui.plugin(DropTargetArea);\n        kendo.ui.plugin(Draggable);\n        kendo.TapCapture = TapCapture;\n        kendo.containerBoundaries = containerBoundaries;\n        extend(kendo.ui, {\n            Pane: Pane,\n            PaneDimensions: PaneDimensions,\n            Movable: Movable\n        });\n        function scrollableViewPort(element) {\n            var root = scrollableRoot()[0], offset, top, left;\n            if (element[0] === root) {\n                top = root.scrollTop;\n                left = root.scrollLeft;\n                return {\n                    top: top,\n                    left: left,\n                    bottom: top + $window.height(),\n                    right: left + $window.width()\n                };\n            } else {\n                offset = element.offset();\n                offset.bottom = offset.top + element.height();\n                offset.right = offset.left + element.width();\n                return offset;\n            }\n        }\n        function scrollableRoot() {\n            return $(kendo.support.browser.edge || kendo.support.browser.safari ? document.body : document.documentElement);\n        }\n        function findScrollableParent(element) {\n            var root = scrollableRoot();\n            if (!element || element === document.body || element === document.documentElement) {\n                return root;\n            }\n            var parent = $(element)[0];\n            while (parent && !kendo.isScrollable(parent) && parent !== document.body) {\n                parent = parent.parentNode;\n            }\n            if (parent === document.body) {\n                return root;\n            }\n            return $(parent);\n        }\n        function autoScrollVelocity(mouseX, mouseY, rect) {\n            var velocity = {\n                x: 0,\n                y: 0\n            };\n            var AUTO_SCROLL_AREA = 50;\n            if (mouseX - rect.left < AUTO_SCROLL_AREA) {\n                velocity.x = -(AUTO_SCROLL_AREA - (mouseX - rect.left));\n            } else if (rect.right - mouseX < AUTO_SCROLL_AREA) {\n                velocity.x = AUTO_SCROLL_AREA - (rect.right - mouseX);\n            }\n            if (mouseY - rect.top < AUTO_SCROLL_AREA) {\n                velocity.y = -(AUTO_SCROLL_AREA - (mouseY - rect.top));\n            } else if (rect.bottom - mouseY < AUTO_SCROLL_AREA) {\n                velocity.y = AUTO_SCROLL_AREA - (rect.bottom - mouseY);\n            }\n            return velocity;\n        }\n        kendo.ui.Draggable.utils = {\n            autoScrollVelocity: autoScrollVelocity,\n            scrollableViewPort: scrollableViewPort,\n            findScrollableParent: findScrollableParent\n        };\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.scroller', [\n        'kendo.fx',\n        'kendo.draganddrop'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.scroller',\n        name: 'Scroller',\n        category: 'mobile',\n        description: 'The Kendo Mobile Scroller widget enables touch friendly kinetic scrolling for the contents of a given DOM element.',\n        depends: [\n            'fx',\n            'draganddrop'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, fx = kendo.effects, ui = mobile.ui, proxy = $.proxy, extend = $.extend, Widget = ui.Widget, Class = kendo.Class, Movable = kendo.ui.Movable, Pane = kendo.ui.Pane, PaneDimensions = kendo.ui.PaneDimensions, Transition = fx.Transition, Animation = fx.Animation, abs = Math.abs, SNAPBACK_DURATION = 500, SCROLLBAR_OPACITY = 0.7, FRICTION = 0.96, VELOCITY_MULTIPLIER = 10, MAX_VELOCITY = 55, OUT_OF_BOUNDS_FRICTION = 0.5, ANIMATED_SCROLLER_PRECISION = 5, RELEASECLASS = 'km-scroller-release', REFRESHCLASS = 'km-scroller-refresh', PULL = 'pull', CHANGE = 'change', RESIZE = 'resize', SCROLL = 'scroll', MOUSE_WHEEL_ID = 2;\n        var ZoomSnapBack = Animation.extend({\n            init: function (options) {\n                var that = this;\n                Animation.fn.init.call(that);\n                extend(that, options);\n                that.userEvents.bind('gestureend', proxy(that.start, that));\n                that.tapCapture.bind('press', proxy(that.cancel, that));\n            },\n            enabled: function () {\n                return this.movable.scale < this.dimensions.minScale;\n            },\n            done: function () {\n                return this.dimensions.minScale - this.movable.scale < 0.01;\n            },\n            tick: function () {\n                var movable = this.movable;\n                movable.scaleWith(1.1);\n                this.dimensions.rescale(movable.scale);\n            },\n            onEnd: function () {\n                var movable = this.movable;\n                movable.scaleTo(this.dimensions.minScale);\n                this.dimensions.rescale(movable.scale);\n            }\n        });\n        var DragInertia = Animation.extend({\n            init: function (options) {\n                var that = this;\n                Animation.fn.init.call(that);\n                extend(that, options, {\n                    transition: new Transition({\n                        axis: options.axis,\n                        movable: options.movable,\n                        onEnd: function () {\n                            that._end();\n                        }\n                    })\n                });\n                that.tapCapture.bind('press', function () {\n                    that.cancel();\n                });\n                that.userEvents.bind('end', proxy(that.start, that));\n                that.userEvents.bind('gestureend', proxy(that.start, that));\n                that.userEvents.bind('tap', proxy(that.onEnd, that));\n            },\n            onCancel: function () {\n                this.transition.cancel();\n            },\n            freeze: function (location) {\n                var that = this;\n                that.cancel();\n                that._moveTo(location);\n            },\n            onEnd: function () {\n                var that = this;\n                if (that.paneAxis.outOfBounds()) {\n                    that._snapBack();\n                } else {\n                    that._end();\n                }\n            },\n            done: function () {\n                return abs(this.velocity) < 1;\n            },\n            start: function (e) {\n                var that = this, velocity;\n                if (!that.dimension.enabled) {\n                    return;\n                }\n                if (that.paneAxis.outOfBounds()) {\n                    if (that.transition._started) {\n                        that.transition.cancel();\n                        that.velocity = Math.min(e.touch[that.axis].velocity * that.velocityMultiplier, MAX_VELOCITY);\n                        Animation.fn.start.call(that);\n                    } else {\n                        that._snapBack();\n                    }\n                } else {\n                    velocity = e.touch.id === MOUSE_WHEEL_ID ? 0 : e.touch[that.axis].velocity;\n                    that.velocity = Math.max(Math.min(velocity * that.velocityMultiplier, MAX_VELOCITY), -MAX_VELOCITY);\n                    that.tapCapture.captureNext();\n                    Animation.fn.start.call(that);\n                }\n            },\n            tick: function () {\n                var that = this, dimension = that.dimension, friction = that.paneAxis.outOfBounds() ? OUT_OF_BOUNDS_FRICTION : that.friction, delta = that.velocity *= friction, location = that.movable[that.axis] + delta;\n                if (!that.elastic && dimension.outOfBounds(location)) {\n                    location = Math.max(Math.min(location, dimension.max), dimension.min);\n                    that.velocity = 0;\n                }\n                that.movable.moveAxis(that.axis, location);\n            },\n            _end: function () {\n                this.tapCapture.cancelCapture();\n                this.end();\n            },\n            _snapBack: function () {\n                var that = this, dimension = that.dimension, snapBack = that.movable[that.axis] > dimension.max ? dimension.max : dimension.min;\n                that._moveTo(snapBack);\n            },\n            _moveTo: function (location) {\n                this.transition.moveTo({\n                    location: location,\n                    duration: SNAPBACK_DURATION,\n                    ease: Transition.easeOutExpo\n                });\n            }\n        });\n        var AnimatedScroller = Animation.extend({\n            init: function (options) {\n                var that = this;\n                kendo.effects.Animation.fn.init.call(this);\n                extend(that, options, {\n                    origin: {},\n                    destination: {},\n                    offset: {}\n                });\n            },\n            tick: function () {\n                this._updateCoordinates();\n                this.moveTo(this.origin);\n            },\n            done: function () {\n                return abs(this.offset.y) < ANIMATED_SCROLLER_PRECISION && abs(this.offset.x) < ANIMATED_SCROLLER_PRECISION;\n            },\n            onEnd: function () {\n                this.moveTo(this.destination);\n                if (this.callback) {\n                    this.callback.call();\n                }\n            },\n            setCoordinates: function (from, to) {\n                this.offset = {};\n                this.origin = from;\n                this.destination = to;\n            },\n            setCallback: function (callback) {\n                if (callback && kendo.isFunction(callback)) {\n                    this.callback = callback;\n                } else {\n                    callback = undefined;\n                }\n            },\n            _updateCoordinates: function () {\n                this.offset = {\n                    x: (this.destination.x - this.origin.x) / 4,\n                    y: (this.destination.y - this.origin.y) / 4\n                };\n                this.origin = {\n                    y: this.origin.y + this.offset.y,\n                    x: this.origin.x + this.offset.x\n                };\n            }\n        });\n        var ScrollBar = Class.extend({\n            init: function (options) {\n                var that = this, horizontal = options.axis === 'x', element = $('<div class=\"km-touch-scrollbar km-' + (horizontal ? 'horizontal' : 'vertical') + '-scrollbar\" />');\n                extend(that, options, {\n                    element: element,\n                    elementSize: 0,\n                    movable: new Movable(element),\n                    scrollMovable: options.movable,\n                    alwaysVisible: options.alwaysVisible,\n                    size: horizontal ? 'width' : 'height'\n                });\n                that.scrollMovable.bind(CHANGE, proxy(that.refresh, that));\n                that.container.append(element);\n                if (options.alwaysVisible) {\n                    that.show();\n                }\n            },\n            refresh: function () {\n                var that = this, axis = that.axis, dimension = that.dimension, paneSize = dimension.size, scrollMovable = that.scrollMovable, sizeRatio = paneSize / dimension.total, position = Math.round(-scrollMovable[axis] * sizeRatio), size = Math.round(paneSize * sizeRatio);\n                if (sizeRatio >= 1) {\n                    this.element.css('display', 'none');\n                } else {\n                    this.element.css('display', '');\n                }\n                if (position + size > paneSize) {\n                    size = paneSize - position;\n                } else if (position < 0) {\n                    size += position;\n                    position = 0;\n                }\n                if (that.elementSize != size) {\n                    that.element.css(that.size, size + 'px');\n                    that.elementSize = size;\n                }\n                that.movable.moveAxis(axis, position);\n            },\n            show: function () {\n                this.element.css({\n                    opacity: SCROLLBAR_OPACITY,\n                    visibility: 'visible'\n                });\n            },\n            hide: function () {\n                if (!this.alwaysVisible) {\n                    this.element.css({ opacity: 0 });\n                }\n            }\n        });\n        var Scroller = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                that._native = that.options.useNative && kendo.support.hasNativeScrolling;\n                if (that._native) {\n                    element.addClass('km-native-scroller').prepend('<div class=\"km-scroll-header\"/>');\n                    extend(that, {\n                        scrollElement: element,\n                        fixedContainer: element.children().first()\n                    });\n                    return;\n                }\n                element.css('overflow', 'hidden').addClass('km-scroll-wrapper').wrapInner('<div class=\"km-scroll-container\"/>').prepend('<div class=\"km-scroll-header\"/>');\n                var inner = element.children().eq(1), tapCapture = new kendo.TapCapture(element), movable = new Movable(inner), dimensions = new PaneDimensions({\n                        element: inner,\n                        container: element,\n                        forcedEnabled: that.options.zoom\n                    }), avoidScrolling = this.options.avoidScrolling, userEvents = new kendo.UserEvents(element, {\n                        touchAction: 'pan-y',\n                        fastTap: true,\n                        allowSelection: true,\n                        preventDragEvent: true,\n                        captureUpIfMoved: true,\n                        multiTouch: that.options.zoom,\n                        supportDoubleTap: that.options.supportDoubleTap,\n                        start: function (e) {\n                            dimensions.refresh();\n                            var velocityX = abs(e.x.velocity), velocityY = abs(e.y.velocity), horizontalSwipe = velocityX * 2 >= velocityY, originatedFromFixedContainer = $.contains(that.fixedContainer[0], e.event.target), verticalSwipe = velocityY * 2 >= velocityX;\n                            if (!originatedFromFixedContainer && !avoidScrolling(e) && that.enabled && (dimensions.x.enabled && horizontalSwipe || dimensions.y.enabled && verticalSwipe)) {\n                                userEvents.capture();\n                            } else {\n                                userEvents.cancel();\n                            }\n                        }\n                    }), pane = new Pane({\n                        movable: movable,\n                        dimensions: dimensions,\n                        userEvents: userEvents,\n                        elastic: that.options.elastic\n                    }), zoomSnapBack = new ZoomSnapBack({\n                        movable: movable,\n                        dimensions: dimensions,\n                        userEvents: userEvents,\n                        tapCapture: tapCapture\n                    }), animatedScroller = new AnimatedScroller({\n                        moveTo: function (coordinates) {\n                            that.scrollTo(coordinates.x, coordinates.y);\n                        }\n                    });\n                movable.bind(CHANGE, function () {\n                    that.scrollTop = -movable.y;\n                    that.scrollLeft = -movable.x;\n                    that.trigger(SCROLL, {\n                        scrollTop: that.scrollTop,\n                        scrollLeft: that.scrollLeft\n                    });\n                });\n                if (that.options.mousewheelScrolling) {\n                    element.on('DOMMouseScroll mousewheel', proxy(this, '_wheelScroll'));\n                }\n                extend(that, {\n                    movable: movable,\n                    dimensions: dimensions,\n                    zoomSnapBack: zoomSnapBack,\n                    animatedScroller: animatedScroller,\n                    userEvents: userEvents,\n                    pane: pane,\n                    tapCapture: tapCapture,\n                    pulled: false,\n                    enabled: true,\n                    scrollElement: inner,\n                    scrollTop: 0,\n                    scrollLeft: 0,\n                    fixedContainer: element.children().first()\n                });\n                that._initAxis('x');\n                that._initAxis('y');\n                that._wheelEnd = function () {\n                    that._wheel = false;\n                    that.userEvents.end(0, that._wheelY);\n                };\n                dimensions.refresh();\n                if (that.options.pullToRefresh) {\n                    that._initPullToRefresh();\n                }\n            },\n            _wheelScroll: function (e) {\n                if (e.ctrlKey) {\n                    return;\n                }\n                if (!this._wheel) {\n                    this._wheel = true;\n                    this._wheelY = 0;\n                    this.userEvents.press(0, this._wheelY);\n                }\n                clearTimeout(this._wheelTimeout);\n                this._wheelTimeout = setTimeout(this._wheelEnd, 50);\n                var delta = kendo.wheelDeltaY(e);\n                if (delta) {\n                    this._wheelY += delta;\n                    this.userEvents.move(0, this._wheelY);\n                }\n                e.preventDefault();\n            },\n            makeVirtual: function () {\n                this.dimensions.y.makeVirtual();\n            },\n            virtualSize: function (min, max) {\n                this.dimensions.y.virtualSize(min, max);\n            },\n            height: function () {\n                return this.dimensions.y.size;\n            },\n            scrollHeight: function () {\n                return this.scrollElement[0].scrollHeight;\n            },\n            scrollWidth: function () {\n                return this.scrollElement[0].scrollWidth;\n            },\n            options: {\n                name: 'Scroller',\n                zoom: false,\n                pullOffset: 140,\n                visibleScrollHints: false,\n                elastic: true,\n                useNative: false,\n                mousewheelScrolling: true,\n                avoidScrolling: function () {\n                    return false;\n                },\n                pullToRefresh: false,\n                messages: {\n                    pullTemplate: 'Pull to refresh',\n                    releaseTemplate: 'Release to refresh',\n                    refreshTemplate: 'Refreshing'\n                }\n            },\n            events: [\n                PULL,\n                SCROLL,\n                RESIZE\n            ],\n            _resize: function () {\n                if (!this._native) {\n                    this.contentResized();\n                }\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                if (options.pullToRefresh) {\n                    that._initPullToRefresh();\n                }\n            },\n            reset: function () {\n                if (this._native) {\n                    this.scrollElement.scrollTop(0);\n                } else {\n                    this.movable.moveTo({\n                        x: 0,\n                        y: 0\n                    });\n                    this._scale(1);\n                }\n            },\n            contentResized: function () {\n                this.dimensions.refresh();\n                if (this.pane.x.outOfBounds()) {\n                    this.movable.moveAxis('x', this.dimensions.x.min);\n                }\n                if (this.pane.y.outOfBounds()) {\n                    this.movable.moveAxis('y', this.dimensions.y.min);\n                }\n            },\n            zoomOut: function () {\n                var dimensions = this.dimensions;\n                dimensions.refresh();\n                this._scale(dimensions.fitScale);\n                this.movable.moveTo(dimensions.centerCoordinates());\n            },\n            enable: function () {\n                this.enabled = true;\n            },\n            disable: function () {\n                this.enabled = false;\n            },\n            scrollTo: function (x, y) {\n                if (this._native) {\n                    this.scrollElement.scrollLeft(abs(x));\n                    this.scrollElement.scrollTop(abs(y));\n                } else {\n                    this.dimensions.refresh();\n                    this.movable.moveTo({\n                        x: x,\n                        y: y\n                    });\n                }\n            },\n            animatedScrollTo: function (x, y, callback) {\n                var from, to;\n                if (this._native) {\n                    this.scrollTo(x, y);\n                } else {\n                    from = {\n                        x: this.movable.x,\n                        y: this.movable.y\n                    };\n                    to = {\n                        x: x,\n                        y: y\n                    };\n                    this.animatedScroller.setCoordinates(from, to);\n                    this.animatedScroller.setCallback(callback);\n                    this.animatedScroller.start();\n                }\n            },\n            pullHandled: function () {\n                var that = this;\n                that.refreshHint.removeClass(REFRESHCLASS);\n                that.hintContainer.html(that.pullTemplate({}));\n                that.yinertia.onEnd();\n                that.xinertia.onEnd();\n                that.userEvents.cancel();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                if (this.userEvents) {\n                    this.userEvents.destroy();\n                }\n            },\n            _scale: function (scale) {\n                this.dimensions.rescale(scale);\n                this.movable.scaleTo(scale);\n            },\n            _initPullToRefresh: function () {\n                var that = this;\n                that.dimensions.y.forceEnabled();\n                that.pullTemplate = kendo.template(that.options.messages.pullTemplate);\n                that.releaseTemplate = kendo.template(that.options.messages.releaseTemplate);\n                that.refreshTemplate = kendo.template(that.options.messages.refreshTemplate);\n                that.scrollElement.prepend('<span class=\"km-scroller-pull\"><span class=\"km-icon\"></span><span class=\"km-loading-left\"></span><span class=\"km-loading-right\"></span><span class=\"km-template\">' + that.pullTemplate({}) + '</span></span>');\n                that.refreshHint = that.scrollElement.children().first();\n                that.hintContainer = that.refreshHint.children('.km-template');\n                that.pane.y.bind('change', proxy(that._paneChange, that));\n                that.userEvents.bind('end', proxy(that._dragEnd, that));\n            },\n            _dragEnd: function () {\n                var that = this;\n                if (!that.pulled) {\n                    return;\n                }\n                that.pulled = false;\n                that.refreshHint.removeClass(RELEASECLASS).addClass(REFRESHCLASS);\n                that.hintContainer.html(that.refreshTemplate({}));\n                that.yinertia.freeze(that.options.pullOffset / 2);\n                that.trigger('pull');\n            },\n            _paneChange: function () {\n                var that = this;\n                if (that.movable.y / OUT_OF_BOUNDS_FRICTION > that.options.pullOffset) {\n                    if (!that.pulled) {\n                        that.pulled = true;\n                        that.refreshHint.removeClass(REFRESHCLASS).addClass(RELEASECLASS);\n                        that.hintContainer.html(that.releaseTemplate({}));\n                    }\n                } else if (that.pulled) {\n                    that.pulled = false;\n                    that.refreshHint.removeClass(RELEASECLASS);\n                    that.hintContainer.html(that.pullTemplate({}));\n                }\n            },\n            _initAxis: function (axis) {\n                var that = this, movable = that.movable, dimension = that.dimensions[axis], tapCapture = that.tapCapture, paneAxis = that.pane[axis], scrollBar = new ScrollBar({\n                        axis: axis,\n                        movable: movable,\n                        dimension: dimension,\n                        container: that.element,\n                        alwaysVisible: that.options.visibleScrollHints\n                    });\n                dimension.bind(CHANGE, function () {\n                    scrollBar.refresh();\n                });\n                paneAxis.bind(CHANGE, function () {\n                    scrollBar.show();\n                });\n                that[axis + 'inertia'] = new DragInertia({\n                    axis: axis,\n                    paneAxis: paneAxis,\n                    movable: movable,\n                    tapCapture: tapCapture,\n                    userEvents: that.userEvents,\n                    dimension: dimension,\n                    elastic: that.options.elastic,\n                    friction: that.options.friction || FRICTION,\n                    velocityMultiplier: that.options.velocityMultiplier || VELOCITY_MULTIPLIER,\n                    end: function () {\n                        scrollBar.hide();\n                        that.trigger('scrollEnd', {\n                            axis: axis,\n                            scrollTop: that.scrollTop,\n                            scrollLeft: that.scrollLeft\n                        });\n                    }\n                });\n            }\n        });\n        ui.plugin(Scroller);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.resizable', [\n        'kendo.core',\n        'kendo.draganddrop'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'resizable',\n        name: 'Resizable',\n        category: 'framework',\n        depends: [\n            'core',\n            'draganddrop'\n        ],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, proxy = $.proxy, isFunction = kendo.isFunction, extend = $.extend, HORIZONTAL = 'horizontal', VERTICAL = 'vertical', START = 'start', RESIZE = 'resize', RESIZEEND = 'resizeend';\n        var Resizable = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that.orientation = that.options.orientation.toLowerCase() != VERTICAL ? HORIZONTAL : VERTICAL;\n                that._positionMouse = that.orientation == HORIZONTAL ? 'x' : 'y';\n                that._position = that.orientation == HORIZONTAL ? 'left' : 'top';\n                that._sizingDom = that.orientation == HORIZONTAL ? 'outerWidth' : 'outerHeight';\n                that.draggable = new ui.Draggable(options.draggableElement || element, {\n                    distance: 1,\n                    filter: options.handle,\n                    drag: proxy(that._resize, that),\n                    dragcancel: proxy(that._cancel, that),\n                    dragstart: proxy(that._start, that),\n                    dragend: proxy(that._stop, that)\n                });\n                that.userEvents = that.draggable.userEvents;\n            },\n            events: [\n                RESIZE,\n                RESIZEEND,\n                START\n            ],\n            options: {\n                name: 'Resizable',\n                orientation: HORIZONTAL\n            },\n            resize: function () {\n            },\n            _max: function (e) {\n                var that = this, hintSize = that.hint ? that.hint[that._sizingDom]() : 0, size = that.options.max;\n                return isFunction(size) ? size(e) : size !== undefined ? that._initialElementPosition + size - hintSize : size;\n            },\n            _min: function (e) {\n                var that = this, size = that.options.min;\n                return isFunction(size) ? size(e) : size !== undefined ? that._initialElementPosition + size : size;\n            },\n            _start: function (e) {\n                var that = this, hint = that.options.hint, el = $(e.currentTarget);\n                that._initialElementPosition = el.position()[that._position];\n                that._initialMousePosition = e[that._positionMouse].startLocation;\n                if (hint) {\n                    that.hint = isFunction(hint) ? $(hint(el)) : hint;\n                    that.hint.css({ position: 'absolute' }).css(that._position, that._initialElementPosition).appendTo(that.element);\n                }\n                that.trigger(START, e);\n                that._maxPosition = that._max(e);\n                that._minPosition = that._min(e);\n                $(document.body).css('cursor', el.css('cursor'));\n            },\n            _resize: function (e) {\n                var that = this, maxPosition = that._maxPosition, minPosition = that._minPosition, currentPosition = that._initialElementPosition + (e[that._positionMouse].location - that._initialMousePosition), position;\n                position = minPosition !== undefined ? Math.max(minPosition, currentPosition) : currentPosition;\n                that.position = position = maxPosition !== undefined ? Math.min(maxPosition, position) : position;\n                if (that.hint) {\n                    that.hint.toggleClass(that.options.invalidClass || '', position == maxPosition || position == minPosition).css(that._position, position);\n                }\n                that.resizing = true;\n                that.trigger(RESIZE, extend(e, { position: position }));\n            },\n            _stop: function (e) {\n                var that = this;\n                if (that.hint) {\n                    that.hint.remove();\n                }\n                that.resizing = false;\n                that.trigger(RESIZEEND, extend(e, { position: that.position }));\n                $(document.body).css('cursor', '');\n            },\n            _cancel: function (e) {\n                var that = this;\n                if (that.hint) {\n                    that.position = undefined;\n                    that.hint.css(that._position, that._initialElementPosition);\n                    that._stop(e);\n                }\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                if (that.draggable) {\n                    that.draggable.destroy();\n                }\n            },\n            press: function (target) {\n                if (!target) {\n                    return;\n                }\n                var position = target.position(), that = this;\n                that.userEvents.press(position.left, position.top, target[0]);\n                that.targetPosition = position;\n                that.target = target;\n            },\n            move: function (delta) {\n                var that = this, orientation = that._position, position = that.targetPosition, current = that.position;\n                if (current === undefined) {\n                    current = position[orientation];\n                }\n                position[orientation] = current + delta;\n                that.userEvents.move(position.left, position.top);\n            },\n            end: function () {\n                this.userEvents.end();\n                this.target = this.position = undefined;\n            }\n        });\n        kendo.ui.plugin(Resizable);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.sortable', ['kendo.draganddrop'], f);\n}(function () {\n    var __meta__ = {\n        id: 'sortable',\n        name: 'Sortable',\n        category: 'framework',\n        depends: ['draganddrop']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, START = 'start', BEFORE_MOVE = 'beforeMove', MOVE = 'move', END = 'end', CHANGE = 'change', CANCEL = 'cancel', ACTION_SORT = 'sort', ACTION_REMOVE = 'remove', ACTION_RECEIVE = 'receive', DEFAULT_FILTER = '>*', MISSING_INDEX = -1;\n        function containsOrEqualTo(parent, child) {\n            try {\n                return $.contains(parent, child) || parent == child;\n            } catch (e) {\n                return false;\n            }\n        }\n        function defaultHint(element) {\n            return element.clone();\n        }\n        function defaultPlaceholder(element) {\n            return element.clone().removeAttr('id').css('visibility', 'hidden');\n        }\n        var Sortable = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                if (!that.options.placeholder) {\n                    that.options.placeholder = defaultPlaceholder;\n                }\n                if (!that.options.hint) {\n                    that.options.hint = defaultHint;\n                }\n                that.draggable = that._createDraggable();\n            },\n            events: [\n                START,\n                BEFORE_MOVE,\n                MOVE,\n                END,\n                CHANGE,\n                CANCEL\n            ],\n            options: {\n                name: 'Sortable',\n                hint: null,\n                placeholder: null,\n                filter: DEFAULT_FILTER,\n                holdToDrag: false,\n                disabled: null,\n                container: null,\n                connectWith: null,\n                handler: null,\n                cursorOffset: null,\n                axis: null,\n                ignore: null,\n                autoScroll: false,\n                cursor: 'auto',\n                moveOnDragEnter: false\n            },\n            destroy: function () {\n                this.draggable.destroy();\n                Widget.fn.destroy.call(this);\n            },\n            _createDraggable: function () {\n                var that = this, element = that.element, options = that.options;\n                return new kendo.ui.Draggable(element, {\n                    filter: options.filter,\n                    hint: kendo.isFunction(options.hint) ? options.hint : $(options.hint),\n                    holdToDrag: options.holdToDrag,\n                    container: options.container ? $(options.container) : null,\n                    cursorOffset: options.cursorOffset,\n                    axis: options.axis,\n                    ignore: options.ignore,\n                    autoScroll: options.autoScroll,\n                    dragstart: $.proxy(that._dragstart, that),\n                    dragcancel: $.proxy(that._dragcancel, that),\n                    drag: $.proxy(that._drag, that),\n                    dragend: $.proxy(that._dragend, that)\n                });\n            },\n            _dragstart: function (e) {\n                var draggedElement = this.draggedElement = e.currentTarget, disabled = this.options.disabled, handler = this.options.handler, _placeholder = this.options.placeholder, placeholder = this.placeholder = kendo.isFunction(_placeholder) ? $(_placeholder.call(this, draggedElement)) : $(_placeholder);\n                if (disabled && draggedElement.is(disabled)) {\n                    e.preventDefault();\n                } else if (handler && !$(e.initialTarget).is(handler)) {\n                    e.preventDefault();\n                } else {\n                    if (this.trigger(START, {\n                            item: draggedElement,\n                            draggableEvent: e\n                        })) {\n                        e.preventDefault();\n                    } else {\n                        draggedElement.css('display', 'none');\n                        draggedElement.before(placeholder);\n                        this._setCursor();\n                    }\n                }\n            },\n            _dragcancel: function () {\n                this._cancel();\n                this.trigger(CANCEL, { item: this.draggedElement });\n                this._resetCursor();\n            },\n            _drag: function (e) {\n                var draggedElement = this.draggedElement, target = this._findTarget(e), targetCenter, cursorOffset = {\n                        left: e.x.location,\n                        top: e.y.location\n                    }, offsetDelta, axisDelta = {\n                        x: e.x.delta,\n                        y: e.y.delta\n                    }, direction, sibling, getSibling, axis = this.options.axis, moveOnDragEnter = this.options.moveOnDragEnter, eventData = {\n                        item: draggedElement,\n                        list: this,\n                        draggableEvent: e\n                    };\n                if (axis === 'x' || axis === 'y') {\n                    this._movementByAxis(axis, cursorOffset, axisDelta[axis], eventData);\n                    return;\n                }\n                if (target) {\n                    targetCenter = this._getElementCenter(target.element);\n                    offsetDelta = {\n                        left: Math.round(cursorOffset.left - targetCenter.left),\n                        top: Math.round(cursorOffset.top - targetCenter.top)\n                    };\n                    $.extend(eventData, { target: target.element });\n                    if (target.appendToBottom) {\n                        this._movePlaceholder(target, null, eventData);\n                        return;\n                    }\n                    if (target.appendAfterHidden) {\n                        this._movePlaceholder(target, 'next', eventData);\n                    }\n                    if (this._isFloating(target.element)) {\n                        if (axisDelta.x < 0 && moveOnDragEnter || !moveOnDragEnter && offsetDelta.left < 0) {\n                            direction = 'prev';\n                        } else if (axisDelta.x > 0 && moveOnDragEnter || !moveOnDragEnter && offsetDelta.left > 0) {\n                            direction = 'next';\n                        }\n                    } else {\n                        if (axisDelta.y < 0 && moveOnDragEnter || !moveOnDragEnter && offsetDelta.top < 0) {\n                            direction = 'prev';\n                        } else if (axisDelta.y > 0 && moveOnDragEnter || !moveOnDragEnter && offsetDelta.top > 0) {\n                            direction = 'next';\n                        }\n                    }\n                    if (direction) {\n                        getSibling = direction === 'prev' ? jQuery.fn.prev : jQuery.fn.next;\n                        sibling = getSibling.call(target.element);\n                        while (sibling.length && !sibling.is(':visible')) {\n                            sibling = getSibling.call(sibling);\n                        }\n                        if (sibling[0] != this.placeholder[0]) {\n                            this._movePlaceholder(target, direction, eventData);\n                        }\n                    }\n                }\n            },\n            _dragend: function (e) {\n                var placeholder = this.placeholder, draggedElement = this.draggedElement, draggedIndex = this.indexOf(draggedElement), placeholderIndex = this.indexOf(placeholder), connectWith = this.options.connectWith, connectedList, isDefaultPrevented, eventData, connectedListEventData;\n                this._resetCursor();\n                eventData = {\n                    action: ACTION_SORT,\n                    item: draggedElement,\n                    oldIndex: draggedIndex,\n                    newIndex: placeholderIndex,\n                    draggableEvent: e\n                };\n                if (placeholderIndex >= 0) {\n                    isDefaultPrevented = this.trigger(END, eventData);\n                } else {\n                    connectedList = placeholder.parents(connectWith).getKendoSortable();\n                    eventData.action = ACTION_REMOVE;\n                    connectedListEventData = $.extend({}, eventData, {\n                        action: ACTION_RECEIVE,\n                        oldIndex: MISSING_INDEX,\n                        newIndex: connectedList.indexOf(placeholder)\n                    });\n                    isDefaultPrevented = !(!this.trigger(END, eventData) && !connectedList.trigger(END, connectedListEventData));\n                }\n                if (isDefaultPrevented || placeholderIndex === draggedIndex) {\n                    this._cancel();\n                    return;\n                }\n                placeholder.replaceWith(draggedElement);\n                draggedElement.show();\n                this.draggable.dropped = true;\n                eventData = {\n                    action: this.indexOf(draggedElement) != MISSING_INDEX ? ACTION_SORT : ACTION_REMOVE,\n                    item: draggedElement,\n                    oldIndex: draggedIndex,\n                    newIndex: this.indexOf(draggedElement),\n                    draggableEvent: e\n                };\n                this.trigger(CHANGE, eventData);\n                if (connectedList) {\n                    connectedListEventData = $.extend({}, eventData, {\n                        action: ACTION_RECEIVE,\n                        oldIndex: MISSING_INDEX,\n                        newIndex: connectedList.indexOf(draggedElement)\n                    });\n                    connectedList.trigger(CHANGE, connectedListEventData);\n                }\n            },\n            _findTarget: function (e) {\n                var element = this._findElementUnderCursor(e), items, connectWith = this.options.connectWith, node;\n                if ($.contains(this.element[0], element)) {\n                    items = this.items();\n                    node = items.filter(element)[0] || items.has(element)[0];\n                    return node ? {\n                        element: $(node),\n                        sortable: this\n                    } : null;\n                } else if (this.element[0] == element && this._isEmpty()) {\n                    return {\n                        element: this.element,\n                        sortable: this,\n                        appendToBottom: true\n                    };\n                } else if (this.element[0] == element && this._isLastHidden()) {\n                    node = this.items().eq(0);\n                    return {\n                        element: node,\n                        sortable: this,\n                        appendAfterHidden: true\n                    };\n                } else if (connectWith) {\n                    return this._searchConnectedTargets(element, e);\n                }\n            },\n            _findElementUnderCursor: function (e) {\n                var elementUnderCursor = kendo.elementUnderCursor(e), draggable = e.sender;\n                if (containsOrEqualTo(draggable.hint[0], elementUnderCursor)) {\n                    draggable.hint.hide();\n                    elementUnderCursor = kendo.elementUnderCursor(e);\n                    if (!elementUnderCursor) {\n                        elementUnderCursor = kendo.elementUnderCursor(e);\n                    }\n                    draggable.hint.show();\n                }\n                return elementUnderCursor;\n            },\n            _searchConnectedTargets: function (element, e) {\n                var connected = $(this.options.connectWith), sortableInstance, items, node;\n                for (var i = 0; i < connected.length; i++) {\n                    sortableInstance = connected.eq(i).getKendoSortable();\n                    if ($.contains(connected[i], element)) {\n                        if (sortableInstance) {\n                            items = sortableInstance.items();\n                            node = items.filter(element)[0] || items.has(element)[0];\n                            if (node) {\n                                sortableInstance.placeholder = this.placeholder;\n                                return {\n                                    element: $(node),\n                                    sortable: sortableInstance\n                                };\n                            } else {\n                                return null;\n                            }\n                        }\n                    } else if (connected[i] == element) {\n                        if (sortableInstance && sortableInstance._isEmpty()) {\n                            return {\n                                element: connected.eq(i),\n                                sortable: sortableInstance,\n                                appendToBottom: true\n                            };\n                        } else if (this._isCursorAfterLast(sortableInstance, e)) {\n                            node = sortableInstance.items().last();\n                            return {\n                                element: node,\n                                sortable: sortableInstance\n                            };\n                        }\n                    }\n                }\n            },\n            _isCursorAfterLast: function (sortable, e) {\n                var lastItem = sortable.items().last(), cursorOffset = {\n                        left: e.x.location,\n                        top: e.y.location\n                    }, lastItemOffset, delta;\n                lastItemOffset = kendo.getOffset(lastItem);\n                lastItemOffset.top += outerHeight(lastItem);\n                lastItemOffset.left += outerWidth(lastItem);\n                if (this._isFloating(lastItem)) {\n                    delta = lastItemOffset.left - cursorOffset.left;\n                } else {\n                    delta = lastItemOffset.top - cursorOffset.top;\n                }\n                return delta < 0 ? true : false;\n            },\n            _movementByAxis: function (axis, cursorOffset, delta, eventData) {\n                var cursorPosition = axis === 'x' ? cursorOffset.left : cursorOffset.top, target = delta < 0 ? this.placeholder.prev() : this.placeholder.next(), items = this.items(), targetCenter;\n                if (target.length && !target.is(':visible')) {\n                    target = delta < 0 ? target.prev() : target.next();\n                }\n                if (!items.filter(target).length) {\n                    return;\n                }\n                $.extend(eventData, { target: target });\n                targetCenter = this._getElementCenter(target);\n                if (targetCenter) {\n                    targetCenter = axis === 'x' ? targetCenter.left : targetCenter.top;\n                }\n                if (target.length && delta < 0 && cursorPosition - targetCenter < 0) {\n                    this._movePlaceholder({\n                        element: target,\n                        sortable: this\n                    }, 'prev', eventData);\n                } else if (target.length && delta > 0 && cursorPosition - targetCenter > 0) {\n                    this._movePlaceholder({\n                        element: target,\n                        sortable: this\n                    }, 'next', eventData);\n                }\n            },\n            _movePlaceholder: function (target, direction, eventData) {\n                var placeholder = this.placeholder;\n                if (!target.sortable.trigger(BEFORE_MOVE, eventData)) {\n                    if (!direction) {\n                        target.element.append(placeholder);\n                    } else if (direction === 'prev') {\n                        target.element.before(placeholder);\n                    } else if (direction === 'next') {\n                        target.element.after(placeholder);\n                    }\n                    target.sortable.trigger(MOVE, eventData);\n                }\n            },\n            _setCursor: function () {\n                var cursor = this.options.cursor, body;\n                if (cursor && cursor !== 'auto') {\n                    body = $(document.body);\n                    this._originalCursorType = body.css('cursor');\n                    body.css({ 'cursor': cursor });\n                    if (!this._cursorStylesheet) {\n                        this._cursorStylesheet = $('<style>* { cursor: ' + cursor + ' !important; }</style>');\n                    }\n                    this._cursorStylesheet.appendTo(body);\n                }\n            },\n            _resetCursor: function () {\n                if (this._originalCursorType) {\n                    $(document.body).css('cursor', this._originalCursorType);\n                    this._originalCursorType = null;\n                    this._cursorStylesheet.remove();\n                }\n            },\n            _getElementCenter: function (element) {\n                var center = element.length ? kendo.getOffset(element) : null;\n                if (center) {\n                    center.top += outerHeight(element) / 2;\n                    center.left += outerWidth(element) / 2;\n                }\n                return center;\n            },\n            _isFloating: function (item) {\n                var isFloating = /left|right/.test(item.css('float'));\n                var isTable = /inline|table-cell/.test(item.css('display'));\n                var isHorizontalFlex = /flex/.test(item.parent().css('display')) && (/row|row-reverse/.test(item.parent().css('flex-direction')) || !item.parent().css('flex-direction'));\n                return isFloating || isTable || isHorizontalFlex;\n            },\n            _cancel: function () {\n                this.draggedElement.show();\n                this.placeholder.remove();\n                this.draggable.dropped = true;\n            },\n            _items: function () {\n                var filter = this.options.filter, items;\n                if (filter) {\n                    items = this.element.find(filter);\n                } else {\n                    items = this.element.children();\n                }\n                return items;\n            },\n            indexOf: function (element) {\n                var items = this._items(), placeholder = this.placeholder, draggedElement = this.draggedElement;\n                if (placeholder && element[0] == placeholder[0]) {\n                    return items.not(draggedElement).index(element);\n                } else {\n                    return items.not(placeholder).index(element);\n                }\n            },\n            items: function () {\n                var placeholder = this.placeholder, items = this._items();\n                if (placeholder) {\n                    items = items.not(placeholder);\n                }\n                return items;\n            },\n            _isEmpty: function () {\n                return !this.items().length;\n            },\n            _isLastHidden: function () {\n                return this.items().length === 1 && this.items().is(':hidden');\n            }\n        });\n        kendo.ui.plugin(Sortable);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.selectable', [\n        'kendo.core',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'selectable',\n        name: 'Selectable',\n        category: 'framework',\n        depends: [\n            'core',\n            'userevents'\n        ],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, abs = Math.abs, ARIASELECTED = 'aria-selected', SELECTED = 'k-state-selected', ACTIVE = 'k-state-selecting', SELECTABLE = 'k-selectable', CHANGE = 'change', NS = '.kendoSelectable', UNSELECT = 'unselect', UNSELECTING = 'k-state-unselecting', INPUTSELECTOR = 'input,a,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,span.k-icon.k-i-arrow-60-down,span.k-icon.k-i-arrow-60-up,label.k-checkbox-label.k-no-text,.k-icon.k-i-collapse,.k-icon.k-i-expand,span.k-numeric-wrap,.k-focusable', msie = kendo.support.browser.msie, supportEventDelegation = false;\n        (function ($) {\n            (function () {\n                $('<div class=\"parent\"><span /></div>').on('click', '>*', function () {\n                    supportEventDelegation = true;\n                }).find('span').trigger('click').end().off();\n            }());\n        }($));\n        var Selectable = Widget.extend({\n            init: function (element, options) {\n                var that = this, multiple;\n                Widget.fn.init.call(that, element, options);\n                that._marquee = $('<div class=\\'k-marquee\\'><div class=\\'k-marquee-color\\'></div></div>');\n                that._lastActive = null;\n                that.element.addClass(SELECTABLE);\n                that.relatedTarget = that.options.relatedTarget;\n                multiple = that.options.multiple;\n                if (this.options.aria && multiple) {\n                    that.element.attr('aria-multiselectable', true);\n                }\n                that.userEvents = new kendo.UserEvents(that.element, {\n                    global: true,\n                    allowSelection: true,\n                    filter: (!supportEventDelegation ? '.' + SELECTABLE + ' ' : '') + that.options.filter,\n                    tap: proxy(that._tap, that),\n                    touchAction: multiple ? 'none' : 'pan-x pan-y'\n                });\n                if (multiple) {\n                    that.userEvents.bind('start', proxy(that._start, that)).bind('move', proxy(that._move, that)).bind('end', proxy(that._end, that)).bind('select', proxy(that._select, that));\n                }\n            },\n            events: [\n                CHANGE,\n                UNSELECT\n            ],\n            options: {\n                name: 'Selectable',\n                filter: '>*',\n                inputSelectors: INPUTSELECTOR,\n                multiple: false,\n                relatedTarget: $.noop\n            },\n            _isElement: function (target) {\n                var elements = this.element;\n                var idx, length = elements.length, result = false;\n                target = target[0];\n                for (idx = 0; idx < length; idx++) {\n                    if (elements[idx] === target) {\n                        result = true;\n                        break;\n                    }\n                }\n                return result;\n            },\n            _tap: function (e) {\n                var target = $(e.target), that = this, ctrlKey = e.event.ctrlKey || e.event.metaKey, multiple = that.options.multiple, shiftKey = multiple && e.event.shiftKey, selected, whichCode = e.event.which, buttonCode = e.event.button;\n                if (!that._isElement(target.closest('.' + SELECTABLE)) || whichCode && whichCode == 3 || buttonCode && buttonCode == 2) {\n                    return;\n                }\n                if (!this._allowSelection(e.event.target)) {\n                    return;\n                }\n                selected = target.hasClass(SELECTED);\n                if (!multiple || !ctrlKey) {\n                    that.clear();\n                }\n                target = target.add(that.relatedTarget(target));\n                if (shiftKey) {\n                    that.selectRange(that._firstSelectee(), target, e);\n                } else {\n                    if (selected && ctrlKey) {\n                        that._unselect(target);\n                        that._notify(CHANGE, e);\n                    } else {\n                        that.value(target, e);\n                    }\n                    that._lastActive = that._downTarget = target;\n                }\n            },\n            _start: function (e) {\n                var that = this, target = $(e.target), selected = target.hasClass(SELECTED), currentElement, ctrlKey = e.event.ctrlKey || e.event.metaKey;\n                if (!this._allowSelection(e.event.target)) {\n                    return;\n                }\n                that._downTarget = target;\n                if (!that._isElement(target.closest('.' + SELECTABLE))) {\n                    that.userEvents.cancel();\n                    return;\n                }\n                if (that.options.useAllItems) {\n                    that._items = that.element.find(that.options.filter);\n                } else {\n                    currentElement = target.closest(that.element);\n                    that._items = currentElement.find(that.options.filter);\n                }\n                e.sender.capture();\n                that._marquee.appendTo(document.body).css({\n                    left: e.x.client + 1,\n                    top: e.y.client + 1,\n                    width: 0,\n                    height: 0\n                });\n                if (!ctrlKey) {\n                    that.clear();\n                }\n                target = target.add(that.relatedTarget(target));\n                if (selected) {\n                    that._selectElement(target, true);\n                    if (ctrlKey) {\n                        target.addClass(UNSELECTING);\n                    }\n                }\n            },\n            _move: function (e) {\n                var that = this, position = {\n                        left: e.x.startLocation > e.x.location ? e.x.location : e.x.startLocation,\n                        top: e.y.startLocation > e.y.location ? e.y.location : e.y.startLocation,\n                        width: abs(e.x.initialDelta),\n                        height: abs(e.y.initialDelta)\n                    };\n                that._marquee.css(position);\n                that._invalidateSelectables(position, e.event.ctrlKey || e.event.metaKey);\n                e.preventDefault();\n            },\n            _end: function (e) {\n                var that = this;\n                that._marquee.remove();\n                that._unselect(that.element.find(that.options.filter + '.' + UNSELECTING)).removeClass(UNSELECTING);\n                var target = that.element.find(that.options.filter + '.' + ACTIVE);\n                target = target.add(that.relatedTarget(target));\n                that.value(target, e);\n                that._lastActive = that._downTarget;\n                that._items = null;\n            },\n            _invalidateSelectables: function (position, ctrlKey) {\n                var idx, length, target = this._downTarget[0], items = this._items, related, toSelect;\n                for (idx = 0, length = items.length; idx < length; idx++) {\n                    toSelect = items.eq(idx);\n                    related = toSelect.add(this.relatedTarget(toSelect));\n                    if (collision(toSelect, position)) {\n                        if (toSelect.hasClass(SELECTED)) {\n                            if (ctrlKey && target !== toSelect[0]) {\n                                related.removeClass(SELECTED).addClass(UNSELECTING);\n                            }\n                        } else if (!toSelect.hasClass(ACTIVE) && !toSelect.hasClass(UNSELECTING)) {\n                            related.addClass(ACTIVE);\n                        }\n                    } else {\n                        if (toSelect.hasClass(ACTIVE)) {\n                            related.removeClass(ACTIVE);\n                        } else if (ctrlKey && toSelect.hasClass(UNSELECTING)) {\n                            related.removeClass(UNSELECTING).addClass(SELECTED);\n                        }\n                    }\n                }\n            },\n            value: function (val, e) {\n                var that = this, selectElement = proxy(that._selectElement, that);\n                if (val) {\n                    val.each(function () {\n                        selectElement(this);\n                    });\n                    that._notify(CHANGE, e);\n                    return;\n                }\n                return that.element.find(that.options.filter + '.' + SELECTED);\n            },\n            _firstSelectee: function () {\n                var that = this, selected;\n                if (that._lastActive !== null) {\n                    return that._lastActive;\n                }\n                selected = that.value();\n                return selected.length > 0 ? selected[0] : that.element.find(that.options.filter)[0];\n            },\n            _selectElement: function (element, preventNotify) {\n                var toSelect = $(element), isPrevented = !preventNotify && this._notify('select', { element: element });\n                toSelect.removeClass(ACTIVE);\n                if (!isPrevented) {\n                    toSelect.addClass(SELECTED);\n                    if (this.options.aria) {\n                        toSelect.attr(ARIASELECTED, true);\n                    }\n                }\n            },\n            _notify: function (name, args) {\n                args = args || {};\n                return this.trigger(name, args);\n            },\n            _unselect: function (element) {\n                if (this.trigger(UNSELECT, { element: element })) {\n                    return;\n                }\n                element.removeClass(SELECTED);\n                if (this.options.aria) {\n                    element.attr(ARIASELECTED, false);\n                }\n                return element;\n            },\n            _select: function (e) {\n                if (this._allowSelection(e.event.target)) {\n                    if (!msie || msie && !$(kendo._activeElement()).is(this.options.inputSelectors)) {\n                        e.preventDefault();\n                    }\n                }\n            },\n            _allowSelection: function (target) {\n                if ($(target).is(this.options.inputSelectors)) {\n                    this.userEvents.cancel();\n                    this._downTarget = null;\n                    return false;\n                }\n                return true;\n            },\n            resetTouchEvents: function () {\n                this.userEvents.cancel();\n            },\n            clear: function () {\n                var items = this.element.find(this.options.filter + '.' + SELECTED);\n                this._unselect(items);\n            },\n            selectRange: function (start, end, e) {\n                var that = this, idx, tmp, items;\n                that.clear();\n                if (that.element.length > 1) {\n                    items = that.options.continuousItems();\n                }\n                if (!items || !items.length) {\n                    items = that.element.find(that.options.filter);\n                }\n                start = $.inArray($(start)[0], items);\n                end = $.inArray($(end)[0], items);\n                if (start > end) {\n                    tmp = start;\n                    start = end;\n                    end = tmp;\n                }\n                if (!that.options.useAllItems) {\n                    end += that.element.length - 1;\n                }\n                for (idx = start; idx <= end; idx++) {\n                    that._selectElement(items[idx]);\n                }\n                that._notify(CHANGE, e);\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.element.off(NS);\n                that.userEvents.destroy();\n                that._marquee = that._lastActive = that.element = that.userEvents = null;\n            }\n        });\n        Selectable.parseOptions = function (selectable) {\n            var asLowerString = typeof selectable === 'string' && selectable.toLowerCase();\n            return {\n                multiple: asLowerString && asLowerString.indexOf('multiple') > -1,\n                cell: asLowerString && asLowerString.indexOf('cell') > -1\n            };\n        };\n        function collision(element, position) {\n            if (!element.is(':visible')) {\n                return false;\n            }\n            var elementPosition = kendo.getOffset(element), right = position.left + position.width, bottom = position.top + position.height;\n            elementPosition.right = elementPosition.left + kendo._outerWidth(element);\n            elementPosition.bottom = elementPosition.top + kendo._outerHeight(element);\n            return !(elementPosition.left > right || elementPosition.right < position.left || elementPosition.top > bottom || elementPosition.bottom < position.top);\n        }\n        kendo.ui.plugin(Selectable);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.badge', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'badge',\n        name: 'Badge',\n        category: 'web',\n        description: 'The Badge decorates avatars, navigation menus, or other components in the application when visual notification is needed',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, ui = kendo.ui, PRIMARY = 'k-badge-primary', SECONDARY = 'k-badge-secondary', INFO = 'k-badge-info', SUCCESS = 'k-badge-success', WARNING = 'k-badge-warning', ERROR = 'k-badge-error', OUTLINE = 'k-badge-outline', PILL = 'k-badge-pill', FUNCTION = 'function', STRING = 'string';\n        var Badge = Widget.extend({\n            init: function (element, options) {\n                var that = this, type;\n                Widget.fn.init.call(that, element, options);\n                options = $.extend(true, {}, options);\n                type = options.type || 'primary';\n                that.element = $(element).addClass('k-badge').addClass(that.classPerType[type]);\n                if (options.look == 'outline') {\n                    that.element.addClass(OUTLINE);\n                }\n                if (options.appearance != 'rectangle') {\n                    that.element.addClass(PILL);\n                }\n                if (typeof options.visible !== 'undefined' && !options.visible) {\n                    that.element.hide();\n                }\n                that._setInitialValue();\n                kendo.notify(that);\n            },\n            options: {\n                name: 'Badge',\n                value: '',\n                visible: true,\n                appearance: 'rectangle',\n                template: null,\n                type: 'secondary',\n                look: null\n            },\n            classPerType: {\n                primary: PRIMARY,\n                info: INFO,\n                success: SUCCESS,\n                warning: WARNING,\n                error: ERROR,\n                secondary: SECONDARY\n            },\n            value: function (newValue) {\n                var that = this;\n                if (!newValue) {\n                    return that._value;\n                }\n                that.element.html(kendo.htmlEncode(that._createContent(newValue)));\n                that._value = newValue;\n            },\n            _createContent: function (value) {\n                var template = this.options.template, type = typeof template, html;\n                if (type == FUNCTION) {\n                    html = template(value);\n                } else if (type === STRING) {\n                    html = kendo.template(template)({ value: value });\n                } else {\n                    html = value;\n                }\n                return html;\n            },\n            _setInitialValue: function () {\n                var that = this, value = that.options.value || that.element.html();\n                if (!/\\S/.test(value)) {\n                    value = '';\n                }\n                that._value = value;\n                that.element.html(kendo.htmlEncode(that._createContent(value)));\n            },\n            hide: function () {\n                this.element.hide();\n            },\n            show: function () {\n                this.element.show();\n            },\n            setOptions: function (newOptions) {\n                var that = this;\n                that.element.removeClass(function (index, className) {\n                    if (className.indexOf('k-') >= 0) {\n                        that.element.removeClass(className);\n                    }\n                });\n                that.init(that.element, newOptions);\n            }\n        });\n        ui.plugin(Badge);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.button', [\n        'kendo.core',\n        'kendo.badge'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'button',\n        name: 'Button',\n        category: 'web',\n        description: 'The Button widget displays styled buttons.',\n        depends: [\n            'core',\n            'badge'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, ui = kendo.ui, proxy = $.proxy, keys = kendo.keys, CLICK = 'click', MOUSEDOWN = kendo.support.mousedown, MOUSEUP = kendo.support.mouseup, MOUSEOUT = 'mouseout', KBUTTON = 'k-button', KBUTTONICON = 'k-button-icon', KBUTTONICONTEXT = 'k-button-icontext', NS = '.kendoButton', DISABLED = 'disabled', DISABLEDSTATE = 'k-state-disabled', FOCUSEDSTATE = 'k-state-focused', SELECTEDSTATE = 'k-state-active', OVERLAY = 'k-badge-overlay';\n        var BUTTON_DEFAULTS = {\n            icon: '',\n            iconClass: '',\n            spriteCssClass: '',\n            imageUrl: ''\n        };\n        kendo.setDefaults('button', BUTTON_DEFAULTS);\n        var Button = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                element = that.wrapper = that.element;\n                options = that.options;\n                element.addClass(KBUTTON).attr('role', 'button');\n                options.enable = options.enable && options.enabled && !element.attr(DISABLED);\n                that.enable(options.enable);\n                if (options.enable) {\n                    that._tabindex();\n                }\n                if (options.badge) {\n                    that.createBadge(options.badge);\n                }\n                that.iconElement();\n                element.on(CLICK + NS, proxy(that._click, that)).on('focus' + NS, proxy(that._focus, that)).on('blur' + NS, proxy(that._blur, that)).on('keydown' + NS, proxy(that._keydown, that)).on('keyup' + NS, proxy(that._removeActive, that)).on(MOUSEDOWN + NS, proxy(that._addActive, that)).on(MOUSEUP + NS + ' ' + MOUSEOUT + NS, proxy(that._removeActive, that));\n                kendo.notify(that);\n            },\n            destroy: function () {\n                var that = this;\n                that.wrapper.off(NS);\n                if (that.badge) {\n                    that.badge.destroy();\n                }\n                Widget.fn.destroy.call(that);\n            },\n            events: [CLICK],\n            options: {\n                name: 'Button',\n                enable: true,\n                enabled: true\n            },\n            _isNativeButton: function () {\n                return this.element.prop('tagName').toLowerCase() == 'button';\n            },\n            _click: function (e) {\n                if (this.options.enable) {\n                    if (this.trigger(CLICK, { event: e })) {\n                        e.preventDefault();\n                    }\n                }\n            },\n            _focus: function () {\n                if (this.options.enable) {\n                    this.element.addClass(FOCUSEDSTATE);\n                }\n            },\n            _blur: function () {\n                var that = this;\n                that.element.removeClass(FOCUSEDSTATE);\n                setTimeout(function () {\n                    that.element.removeClass(SELECTEDSTATE);\n                });\n            },\n            _keydown: function (e) {\n                var that = this;\n                if (e.keyCode == keys.ENTER || e.keyCode == keys.SPACEBAR) {\n                    that._addActive();\n                    if (!that._isNativeButton()) {\n                        if (e.keyCode == keys.SPACEBAR) {\n                            e.preventDefault();\n                        }\n                        that._click(e);\n                    }\n                }\n            },\n            _removeActive: function () {\n                this.element.removeClass(SELECTEDSTATE);\n            },\n            _addActive: function () {\n                if (this.options.enable) {\n                    this.element.addClass(SELECTEDSTATE);\n                }\n            },\n            iconElement: function () {\n                var that = this, element = that.element, options = that.options, icon = options.icon, iconClass = options.iconClass, spriteCssClass = options.spriteCssClass, imageUrl = options.imageUrl, span, img, isEmpty;\n                if (spriteCssClass || imageUrl || icon || iconClass) {\n                    isEmpty = true;\n                    element.contents().filter(function () {\n                        return !$(this).hasClass('k-sprite') && !$(this).hasClass('k-icon') && !$(this).hasClass('k-image');\n                    }).each(function (idx, el) {\n                        if (el.nodeType == 1 || el.nodeType == 3 && $.trim(el.nodeValue).length > 0) {\n                            isEmpty = false;\n                        }\n                    });\n                    if (isEmpty) {\n                        element.addClass(KBUTTONICON);\n                    } else {\n                        element.addClass(KBUTTONICONTEXT);\n                    }\n                }\n                if (imageUrl) {\n                    img = element.children('img.k-image').first();\n                    if (!img[0]) {\n                        img = $('<img alt=\"icon\" class=\"k-image\" />').prependTo(element);\n                    }\n                    img.attr('src', imageUrl);\n                } else if (icon || iconClass) {\n                    span = element.children('span.k-icon').first();\n                    if (!span[0]) {\n                        span = $('<span></span>').prependTo(element);\n                    }\n                    span.attr('class', icon ? 'k-icon k-i-' + icon : iconClass);\n                } else if (spriteCssClass) {\n                    span = element.children('span.k-sprite').first();\n                    if (!span[0]) {\n                        span = $('<span class=\"k-sprite\"></span>').prependTo(element);\n                    }\n                    span.addClass(spriteCssClass);\n                }\n            },\n            enable: function (enable) {\n                var that = this, element = that.element;\n                if (enable === undefined) {\n                    enable = true;\n                }\n                enable = !!enable;\n                that.options.enable = enable;\n                element.toggleClass(DISABLEDSTATE, !enable).attr('aria-disabled', !enable).attr(DISABLED, !enable);\n                if (enable) {\n                    that._tabindex();\n                }\n                try {\n                    element.blur();\n                } catch (err) {\n                }\n            },\n            createBadge: function (badgeOptions) {\n                var that = this;\n                var span = $('<span />').appendTo(that.element);\n                if (badgeOptions.overlay !== false) {\n                    that.element.addClass(OVERLAY);\n                }\n                if (typeof badgeOptions == 'string' || typeof badgeOptions == 'number') {\n                    that.badge = new ui.Badge(span, { value: badgeOptions });\n                } else if (typeof badgeOptions == 'boolean') {\n                    that.badge = new ui.Badge(span);\n                } else {\n                    that.badge = new ui.Badge(span, badgeOptions);\n                }\n            }\n        });\n        if (Button.fn.hasOwnProperty('defaults') === false) {\n            Object.defineProperty(Button.fn, 'defaults', {\n                get: function () {\n                    return kendo.defaults.button;\n                }\n            });\n        }\n        kendo.ui.plugin(Button);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.pager', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'pager',\n        name: 'Pager',\n        category: 'framework',\n        depends: ['data'],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, proxy = $.proxy, FIRST = '.k-i-arrow-end-left', LAST = '.k-i-arrow-end-right', PREV = '.k-i-arrow-60-left', NEXT = '.k-i-arrow-60-right', SIZE = 'k-pager-lg k-pager-md k-pager-sm', CHANGE = 'change', NS = '.kendoPager', CLICK = 'click', KEYDOWN = 'keydown', DISABLED = 'disabled', MOUSEDOWN = 'down', MAX_VALUE = Number.MAX_VALUE, iconTemplate = kendo.template('<a href=\"\\\\#\" aria-label=\"#=text#\" title=\"#=text#\" class=\"k-link k-pager-nav #= wrapClassName #\"><span class=\"k-icon #= className #\"></span></a>');\n        function button(template, idx, text, numeric, title) {\n            return template({\n                idx: idx,\n                text: text,\n                ns: kendo.ns,\n                numeric: numeric,\n                title: title || ''\n            });\n        }\n        function selectOption(template, idx, text, selected) {\n            return template({\n                idx: idx,\n                text: text || idx,\n                selected: selected || false\n            });\n        }\n        function icon(className, text, wrapClassName) {\n            return iconTemplate({\n                className: className.substring(1),\n                text: text,\n                wrapClassName: wrapClassName || ''\n            });\n        }\n        function update(element, selector, page, disabled) {\n            element.find(selector).parent().attr(kendo.attr('page'), page).attr('tabindex', -1).toggleClass('k-state-disabled', disabled);\n        }\n        function first(element, page) {\n            update(element, FIRST, 1, page <= 1);\n        }\n        function prev(element, page) {\n            update(element, PREV, Math.max(1, page - 1), page <= 1);\n        }\n        function next(element, page, totalPages) {\n            update(element, NEXT, Math.min(totalPages, page + 1), page >= totalPages);\n        }\n        function last(element, page, totalPages) {\n            update(element, LAST, totalPages, page >= totalPages);\n        }\n        var Pager = Widget.extend({\n            init: function (element, options) {\n                var that = this, page, totalPages;\n                var sizeClassName = null;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                that._createDataSource(options);\n                that.linkTemplate = kendo.template(that.options.linkTemplate);\n                that.selectTemplate = kendo.template(that.options.selectTemplate);\n                that.currentPageTemplate = kendo.template(that.options.currentPageTemplate);\n                that.numericSelectItemTemplate = kendo.template(that.options.numericSelectItemTemplate);\n                page = that.page();\n                totalPages = that.totalPages();\n                that._refreshHandler = proxy(that.refresh, that);\n                that.dataSource.bind(CHANGE, that._refreshHandler);\n                that.downEvent = kendo.applyEventMap(MOUSEDOWN, kendo.guid());\n                if (options.previousNext) {\n                    if (!that.element.find(FIRST).length) {\n                        that.element.append(icon(FIRST, options.messages.first, 'k-pager-first'));\n                        first(that.element, page, totalPages);\n                    }\n                    if (!that.element.find(PREV).length) {\n                        that.element.append(icon(PREV, options.messages.previous));\n                        prev(that.element, page, totalPages);\n                    }\n                }\n                if (options.numeric) {\n                    if (!that._numericWrap) {\n                        that._numericWrap = that.element.find('.k-pager-numbers-wrap');\n                        if (that._numericWrap.length === 0) {\n                            that._numericWrap = $('<div class=\\'k-pager-numbers-wrap\\' />').appendTo(that.element);\n                        }\n                    }\n                    if (!that._numericSelect) {\n                        that._numericSelect = that._numericWrap.find('.k-dropdown');\n                        if (that._numericSelect.length === 0) {\n                            that._numericSelect = $('<select class=\\'k-dropdown\\' />').appendTo(that._numericWrap);\n                        }\n                    }\n                    if (!that.list) {\n                        that.list = that._numericWrap.find('.k-pager-numbers');\n                        if (that.list.length === 0) {\n                            that.list = $('<ul class=\"k-pager-numbers\" />').appendTo(that._numericWrap);\n                        }\n                    }\n                    if (options.dataSource && !options.dataSource.total()) {\n                        that._numericSelect.empty().append('<option value=\\'0\\' />');\n                        that.list.empty().append(that.selectTemplate({ text: 0 }));\n                    }\n                }\n                if (options.input) {\n                    if (!that.element.find('.k-pager-input').length) {\n                        that.element.append('<span class=\"k-pager-input k-label\">' + options.messages.page + '<input class=\"k-textbox\">' + kendo.format(options.messages.of, totalPages) + '</span>');\n                    }\n                    that.element.on(KEYDOWN + NS, '.k-pager-input input', proxy(that._keydown, that));\n                }\n                if (options.previousNext) {\n                    if (!that.element.find(NEXT).length) {\n                        that.element.append(icon(NEXT, options.messages.next));\n                        next(that.element, page, totalPages);\n                    }\n                    if (!that.element.find(LAST).length) {\n                        that.element.append(icon(LAST, options.messages.last, 'k-pager-last'));\n                        last(that.element, page, totalPages);\n                    }\n                }\n                if (options.pageSizes) {\n                    if (!that.element.find('.k-pager-sizes').length) {\n                        var pageSizes = options.pageSizes.length ? options.pageSizes : [\n                            'all',\n                            5,\n                            10,\n                            20\n                        ];\n                        var pageItems = $.map(pageSizes, function (size) {\n                            if (size.toLowerCase && size.toLowerCase() === 'all') {\n                                return '<option value=\\'all\\'>' + options.messages.allPages + '</option>';\n                            }\n                            return '<option>' + size + '</option>';\n                        });\n                        $('<span class=\"k-pager-sizes k-label\"><select/>' + options.messages.itemsPerPage + '</span>').appendTo(that.element).find('select').html(pageItems.join('')).end().appendTo(that.element);\n                    }\n                    that.element.find('.k-pager-sizes select').val(that.pageSize());\n                    if (kendo.ui.DropDownList) {\n                        that.element.find('.k-pager-sizes select').show().kendoDropDownList();\n                    }\n                    that.element.on(CHANGE + NS, '.k-pager-sizes select', proxy(that._change, that));\n                }\n                if (options.refresh) {\n                    if (!that.element.find('.k-pager-refresh').length) {\n                        that.element.append('<a href=\"#\" class=\"k-pager-refresh k-link\" title=\"' + options.messages.refresh + '\" aria-label=\"' + options.messages.refresh + '\"><span class=\"k-icon k-i-reload\"></span></a>');\n                    }\n                    that.element.on(CLICK + NS, '.k-pager-refresh', proxy(that._refreshClick, that));\n                }\n                if (options.info) {\n                    if (!that.element.find('.k-pager-info').length) {\n                        that.element.append('<span class=\"k-pager-info k-label\" />');\n                    }\n                }\n                that.element.on(CLICK + NS, 'a', proxy(that._click, that)).on(CHANGE + NS, 'select.k-dropdown', proxy(that._numericSelectChange, that)).addClass('k-pager-wrap k-widget k-floatwrap');\n                if (options.autoBind) {\n                    that.refresh();\n                }\n                that._resizeHandler = proxy(that.resize, that, true);\n                $(window).on('resize' + NS, that._resizeHandler);\n                sizeClassName = that._getWidthSizeClass(that.element.width());\n                if (sizeClassName) {\n                    that.element.addClass(sizeClassName);\n                }\n                kendo.notify(that);\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.element.off(NS);\n                that.dataSource.unbind(CHANGE, that._refreshHandler);\n                that._refreshHandler = null;\n                $(window).off('resize' + NS, this._resizeHandler);\n                kendo.destroy(that.element);\n                that.element = that.list = null;\n            },\n            events: [CHANGE],\n            options: {\n                name: 'Pager',\n                selectTemplate: '<li><span class=\"k-link k-state-selected\">#=text#</span></li>',\n                currentPageTemplate: '<li class=\"k-current-page\"><span class=\"k-link k-pager-nav\">#=text#</span></li>',\n                linkTemplate: '<li><a tabindex=\"-1\" href=\"\\\\#\" class=\"k-link\" data-#=ns#page=\"#=idx#\" #if (title !== \"\") {# title=\"#=title#\" #}#>#=text#</a></li>',\n                numericItemTemplate: '<li><a tabindex=\"-1\" href=\"\\\\#\" class=\"k-link\" data-#=ns#page=\"#=idx#\" #if (title !== \"\") {# title=\"#=title#\" #}#>#=text#</a></li>',\n                numericSelectItemTemplate: '<option value=\"#= idx #\" #if (selected) {# selected=\"selected\" #}#>#= text #</option>',\n                buttonCount: 10,\n                autoBind: true,\n                numeric: true,\n                info: true,\n                input: false,\n                previousNext: true,\n                pageSizes: false,\n                refresh: false,\n                responsive: true,\n                messages: {\n                    allPages: 'All',\n                    display: '{0} - {1} of {2} items',\n                    empty: 'No items to display',\n                    page: 'Page',\n                    of: 'of {0}',\n                    itemsPerPage: 'items per page',\n                    first: 'Go to the first page',\n                    previous: 'Go to the previous page',\n                    next: 'Go to the next page',\n                    last: 'Go to the last page',\n                    refresh: 'Refresh',\n                    morePages: 'More pages'\n                }\n            },\n            setDataSource: function (dataSource) {\n                var that = this;\n                that.dataSource.unbind(CHANGE, that._refreshHandler);\n                that.dataSource = that.options.dataSource = dataSource;\n                dataSource.bind(CHANGE, that._refreshHandler);\n                if (that.options.autoBind) {\n                    dataSource.fetch();\n                }\n            },\n            _resize: function (size) {\n                if (size.width) {\n                    var sizeClassName = this._getWidthSizeClass(size.width);\n                    var el = this.element;\n                    if (!sizeClassName) {\n                        el.removeClass(SIZE);\n                    } else if (!el.hasClass(sizeClassName)) {\n                        el.removeClass(SIZE);\n                        el.addClass(sizeClassName);\n                    }\n                }\n            },\n            _createDataSource: function (options) {\n                this.dataSource = kendo.data.DataSource.create(options.dataSource);\n            },\n            refresh: function (e) {\n                var that = this, idx, end, start = 1, reminder, page = that.page(), html = '', selectHtml = '', options = that.options, pageSize = that.pageSize(), collapsedTotal = that._collapsedTotal(), total = that.dataSource.total(), totalPages = that.totalPages(), linkTemplate = that.linkTemplate, numericSelectItemTemplate = that.numericSelectItemTemplate, buttonCount = options.buttonCount;\n                if (e && e.action == 'itemchange') {\n                    return;\n                }\n                if (options.numeric) {\n                    if (page > buttonCount) {\n                        reminder = page % buttonCount;\n                        start = reminder === 0 ? page - buttonCount + 1 : page - reminder + 1;\n                    }\n                    end = Math.min(start + buttonCount - 1, totalPages);\n                    if (start > 1) {\n                        html += button(linkTemplate, start - 1, '...', false, options.messages.morePages);\n                        selectHtml += selectOption(numericSelectItemTemplate, start - 1, options.messages.morePages);\n                    }\n                    for (idx = start; idx <= end; idx++) {\n                        html += button(idx == page ? that.selectTemplate : linkTemplate, idx, idx, true);\n                        selectHtml += selectOption(numericSelectItemTemplate, idx, idx, idx == page);\n                    }\n                    if (end < totalPages) {\n                        html += button(linkTemplate, idx, '...', false, options.messages.morePages);\n                        selectHtml += selectOption(numericSelectItemTemplate, idx, options.messages.morePages);\n                    }\n                    if (html === '') {\n                        html = that.selectTemplate({ text: 0 });\n                        selectHtml = $('<option value=\\'0\\' />');\n                    }\n                    that.list.html(html);\n                    that._numericSelect.html(selectHtml);\n                }\n                if (options.info) {\n                    if (total > 0) {\n                        html = kendo.format(options.messages.display, that.dataSource.options.endless ? 1 : Math.min((page - 1) * (that.dataSource.pageSize() || 0) + 1, collapsedTotal), Math.min(page * pageSize, collapsedTotal), total);\n                    } else {\n                        html = options.messages.empty;\n                    }\n                    that.element.find('.k-pager-info').html(html);\n                }\n                if (options.input) {\n                    that.element.find('.k-pager-input').html(that.options.messages.page + '<input class=\"k-textbox\" aria-label=\"' + page + '\">' + kendo.format(options.messages.of, totalPages)).find('input').val(page).attr(DISABLED, total < 1).toggleClass('k-state-disabled', total < 1);\n                }\n                if (options.previousNext) {\n                    first(that.element, page, totalPages);\n                    prev(that.element, page, totalPages);\n                    next(that.element, page, totalPages);\n                    last(that.element, page, totalPages);\n                }\n                if (options.pageSizes) {\n                    var hasAll = that.element.find('.k-pager-sizes option[value=\\'all\\']').length > 0;\n                    var selectAll = hasAll && (pageSize === this.dataSource.total() || pageSize == MAX_VALUE);\n                    var text = pageSize;\n                    if (selectAll) {\n                        pageSize = 'all';\n                        text = options.messages.allPages;\n                    }\n                    that.element.find('.k-pager-sizes select').val(pageSize).attr('aria-label', pageSize).filter('[' + kendo.attr('role') + '=dropdownlist]').kendoDropDownList('value', pageSize).kendoDropDownList('text', text);\n                }\n            },\n            _collapsedTotal: function () {\n                return this.dataSource.total();\n            },\n            _keydown: function (e) {\n                if (e.keyCode === kendo.keys.ENTER) {\n                    var input = this.element.find('.k-pager-input').find('input'), page = parseInt(input.val(), 10);\n                    if (isNaN(page) || page < 1 || page > this.totalPages()) {\n                        page = this.page();\n                    }\n                    input.val(page);\n                    this.page(page);\n                }\n            },\n            _refreshClick: function (e) {\n                e.preventDefault();\n                this.dataSource.read();\n            },\n            _change: function (e) {\n                var value = e.currentTarget.value;\n                var pageSize = parseInt(value, 10);\n                var dataSource = this.dataSource;\n                if (!isNaN(pageSize)) {\n                    dataSource.pageSize(pageSize);\n                } else if ((value + '').toLowerCase() == 'all') {\n                    dataSource._pageSize = undefined;\n                    dataSource._take = undefined;\n                    dataSource._skip = 0;\n                    dataSource.fetch();\n                }\n            },\n            _numericSelectChange: function (e) {\n                var target = e.currentTarget;\n                var value = target.value;\n                var page = parseInt(value, 10);\n                target.blur();\n                this.page(page);\n            },\n            _click: function (e) {\n                var target = $(e.currentTarget);\n                e.preventDefault();\n                if (!target.is('.k-state-disabled')) {\n                    this.page(parseInt(target.attr(kendo.attr('page')), 10));\n                }\n            },\n            totalPages: function () {\n                return Math.ceil((this.dataSource.total() || 0) / (this.pageSize() || 1));\n            },\n            pageSize: function () {\n                return this.dataSource.pageSize() || this.dataSource.total();\n            },\n            page: function (page) {\n                if (page) {\n                    if (this.trigger('pageChange', { index: page })) {\n                        return;\n                    }\n                    this.dataSource.page(page);\n                    this.trigger(CHANGE, { index: page });\n                } else {\n                    if (this.dataSource.total() > 0) {\n                        return this.dataSource.page();\n                    } else {\n                        return 0;\n                    }\n                }\n            },\n            _getWidthSizeClass: function (width) {\n                var that = this, sizes = SIZE.split(' ');\n                if (!that.options.responsive) {\n                    return null;\n                } else if (width <= 480) {\n                    return sizes[2];\n                } else if (width <= 640) {\n                    return sizes[1];\n                } else if (width <= 1024) {\n                    return sizes[0];\n                }\n                return null;\n            }\n        });\n        ui.plugin(Pager);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.popup', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'popup',\n        name: 'Pop-up',\n        category: 'framework',\n        depends: ['core'],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, Class = kendo.Class, support = kendo.support, getOffset = kendo.getOffset, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, OPEN = 'open', CLOSE = 'close', DEACTIVATE = 'deactivate', ACTIVATE = 'activate', CENTER = 'center', LEFT = 'left', RIGHT = 'right', TOP = 'top', BOTTOM = 'bottom', ABSOLUTE = 'absolute', HIDDEN = 'hidden', BODY = 'body', LOCATION = 'location', POSITION = 'position', VISIBLE = 'visible', EFFECTS = 'effects', ACTIVE = 'k-state-active', ACTIVEBORDER = 'k-state-border', ACTIVEBORDERREGEXP = /k-state-border-(\\w+)/, ACTIVECHILDREN = '.k-picker-wrap, .k-dropdown-wrap, .k-link', MOUSEDOWN = 'down', DOCUMENT_ELEMENT = $(document.documentElement), proxy = $.proxy, WINDOW = $(window), SCROLL = 'scroll', cssPrefix = support.transitions.css, TRANSFORM = cssPrefix + 'transform', extend = $.extend, NS = '.kendoPopup', styles = [\n                'font-size',\n                'font-family',\n                'font-stretch',\n                'font-style',\n                'font-weight',\n                'line-height'\n            ];\n        function contains(container, target) {\n            if (!container || !target) {\n                return false;\n            }\n            return container === target || $.contains(container, target);\n        }\n        var Popup = Widget.extend({\n            init: function (element, options) {\n                var that = this, parentPopup;\n                options = options || {};\n                if (options.isRtl) {\n                    options.origin = options.origin || BOTTOM + ' ' + RIGHT;\n                    options.position = options.position || TOP + ' ' + RIGHT;\n                }\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                that.collisions = options.collision ? options.collision.split(' ') : [];\n                that.downEvent = kendo.applyEventMap(MOUSEDOWN, kendo.guid());\n                if (that.collisions.length === 1) {\n                    that.collisions.push(that.collisions[0]);\n                }\n                parentPopup = $(that.options.anchor).closest('.k-popup,.k-group').filter(':not([class^=km-])');\n                options.appendTo = $($(options.appendTo)[0] || parentPopup[0] || document.body);\n                that.element.hide().addClass('k-popup k-group k-reset').toggleClass('k-rtl', !!options.isRtl).css({ position: ABSOLUTE }).appendTo(options.appendTo).attr('aria-hidden', true).on('mouseenter' + NS, function () {\n                    that._hovered = true;\n                }).on('wheel' + NS, function (e) {\n                    var list = $(e.target).find('.k-list');\n                    var scrollArea = list.parent();\n                    if (list.length && list.is(':visible') && (scrollArea.scrollTop() === 0 && e.originalEvent.deltaY < 0 || scrollArea.scrollTop() === scrollArea.prop('scrollHeight') - scrollArea.prop('offsetHeight') && e.originalEvent.deltaY > 0)) {\n                        e.preventDefault();\n                    }\n                }).on('mouseleave' + NS, function () {\n                    that._hovered = false;\n                });\n                that.wrapper = $();\n                if (options.animation === false) {\n                    options.animation = {\n                        open: { effects: {} },\n                        close: {\n                            hide: true,\n                            effects: {}\n                        }\n                    };\n                }\n                extend(options.animation.open, {\n                    complete: function () {\n                        that.wrapper.css({ overflow: VISIBLE });\n                        that._activated = true;\n                        that._trigger(ACTIVATE);\n                    }\n                });\n                extend(options.animation.close, {\n                    complete: function () {\n                        that._animationClose();\n                    }\n                });\n                that._mousedownProxy = function (e) {\n                    that._mousedown(e);\n                };\n                if (support.mobileOS.android) {\n                    that._resizeProxy = function (e) {\n                        setTimeout(function () {\n                            that._resize(e);\n                        }, 600);\n                    };\n                } else {\n                    that._resizeProxy = function (e) {\n                        that._resize(e);\n                    };\n                }\n                if (options.toggleTarget) {\n                    $(options.toggleTarget).on(options.toggleEvent + NS, $.proxy(that.toggle, that));\n                }\n            },\n            events: [\n                OPEN,\n                ACTIVATE,\n                CLOSE,\n                DEACTIVATE\n            ],\n            options: {\n                name: 'Popup',\n                toggleEvent: 'click',\n                origin: BOTTOM + ' ' + LEFT,\n                position: TOP + ' ' + LEFT,\n                anchor: BODY,\n                appendTo: null,\n                collision: 'flip fit',\n                viewport: window,\n                copyAnchorStyles: true,\n                autosize: false,\n                modal: false,\n                adjustSize: {\n                    width: 0,\n                    height: 0\n                },\n                animation: {\n                    open: {\n                        effects: 'slideIn:down',\n                        transition: true,\n                        duration: 200\n                    },\n                    close: {\n                        duration: 100,\n                        hide: true\n                    }\n                }\n            },\n            _animationClose: function () {\n                var that = this;\n                var location = that.wrapper.data(LOCATION);\n                that.wrapper.hide();\n                if (location) {\n                    that.wrapper.css(location);\n                }\n                if (that.options.anchor != BODY) {\n                    that._hideDirClass();\n                }\n                that._closing = false;\n                that._trigger(DEACTIVATE);\n            },\n            destroy: function () {\n                var that = this, options = that.options, element = that.element.off(NS), parent;\n                Widget.fn.destroy.call(that);\n                if (options.toggleTarget) {\n                    $(options.toggleTarget).off(NS);\n                }\n                if (!options.modal) {\n                    DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy);\n                    that._toggleResize(false);\n                }\n                kendo.destroy(that.element.children());\n                element.removeData();\n                if (options.appendTo[0] === document.body) {\n                    parent = element.parent('.k-animation-container');\n                    if (parent[0]) {\n                        parent.remove();\n                    } else {\n                        element.remove();\n                    }\n                }\n            },\n            open: function (x, y) {\n                var that = this, fixed = {\n                        isFixed: !isNaN(parseInt(y, 10)),\n                        x: x,\n                        y: y\n                    }, element = that.element, options = that.options, animation, wrapper, anchor = $(options.anchor), mobile = element[0] && element.hasClass('km-widget');\n                if (!that.visible()) {\n                    if (options.copyAnchorStyles) {\n                        if (mobile && styles[0] == 'font-size') {\n                            styles.shift();\n                        }\n                        element.css(kendo.getComputedStyles(anchor[0], styles));\n                    }\n                    if (element.data('animating') || that._trigger(OPEN)) {\n                        return;\n                    }\n                    that._activated = false;\n                    if (!options.modal) {\n                        DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy).on(that.downEvent, that._mousedownProxy);\n                        that._toggleResize(false);\n                        that._toggleResize(true);\n                    }\n                    that.wrapper = wrapper = kendo.wrap(element, options.autosize).css({\n                        overflow: HIDDEN,\n                        display: 'block',\n                        position: ABSOLUTE\n                    }).attr('aria-hidden', false);\n                    if (support.mobileOS.android) {\n                        wrapper.css(TRANSFORM, 'translatez(0)');\n                    }\n                    wrapper.css(POSITION);\n                    if ($(options.appendTo)[0] == document.body) {\n                        wrapper.css(TOP, '-10000px');\n                    }\n                    that.flipped = that._position(fixed);\n                    animation = that._openAnimation();\n                    if (options.anchor != BODY) {\n                        that._showDirClass(animation);\n                    }\n                    element.data(EFFECTS, animation.effects).kendoStop(true).kendoAnimate(animation).attr('aria-hidden', false);\n                }\n            },\n            _location: function (isFixed) {\n                var that = this, element = that.element, options = that.options, wrapper, anchor = $(options.anchor), mobile = element[0] && element.hasClass('km-widget');\n                if (options.copyAnchorStyles) {\n                    if (mobile && styles[0] == 'font-size') {\n                        styles.shift();\n                    }\n                    element.css(kendo.getComputedStyles(anchor[0], styles));\n                }\n                that.wrapper = wrapper = kendo.wrap(element, options.autosize).css({\n                    overflow: HIDDEN,\n                    display: 'block',\n                    position: ABSOLUTE\n                });\n                if (support.mobileOS.android) {\n                    wrapper.css(TRANSFORM, 'translatez(0)');\n                }\n                wrapper.css(POSITION);\n                if ($(options.appendTo)[0] == document.body) {\n                    wrapper.css(TOP, '-10000px');\n                }\n                that._position(isFixed || {});\n                var offset = wrapper.offset();\n                return {\n                    width: kendo._outerWidth(wrapper),\n                    height: kendo._outerHeight(wrapper),\n                    left: offset.left,\n                    top: offset.top\n                };\n            },\n            _openAnimation: function () {\n                var animation = extend(true, {}, this.options.animation.open);\n                animation.effects = kendo.parseEffects(animation.effects, this.flipped);\n                return animation;\n            },\n            _hideDirClass: function () {\n                var anchor = $(this.options.anchor);\n                var direction = ((anchor.attr('class') || '').match(ACTIVEBORDERREGEXP) || [\n                    '',\n                    'down'\n                ])[1];\n                var dirClass = ACTIVEBORDER + '-' + direction;\n                anchor.removeClass(dirClass).children(ACTIVECHILDREN).removeClass(ACTIVE).removeClass(dirClass);\n                this.element.removeClass(ACTIVEBORDER + '-' + kendo.directions[direction].reverse);\n            },\n            _showDirClass: function (animation) {\n                var direction = animation.effects.slideIn ? animation.effects.slideIn.direction : 'down';\n                var dirClass = ACTIVEBORDER + '-' + direction;\n                $(this.options.anchor).addClass(dirClass).children(ACTIVECHILDREN).addClass(ACTIVE).addClass(dirClass);\n                this.element.addClass(ACTIVEBORDER + '-' + kendo.directions[direction].reverse);\n            },\n            position: function () {\n                if (this.visible()) {\n                    this.flipped = this._position();\n                }\n            },\n            toggle: function () {\n                var that = this;\n                that[that.visible() ? CLOSE : OPEN]();\n            },\n            visible: function () {\n                return this.element.is(':' + VISIBLE);\n            },\n            close: function (skipEffects) {\n                var that = this, options = that.options, wrap, animation, openEffects, closeEffects;\n                if (that.visible()) {\n                    wrap = that.wrapper[0] ? that.wrapper : kendo.wrap(that.element).hide();\n                    that._toggleResize(false);\n                    if (that._closing || that._trigger(CLOSE)) {\n                        that._toggleResize(true);\n                        return;\n                    }\n                    that.element.find('.k-popup').each(function () {\n                        var that = $(this), popup = that.data('kendoPopup');\n                        if (popup) {\n                            popup.close(skipEffects);\n                        }\n                    });\n                    DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy);\n                    if (skipEffects) {\n                        animation = {\n                            hide: true,\n                            effects: {}\n                        };\n                    } else {\n                        animation = extend(true, {}, options.animation.close);\n                        openEffects = that.element.data(EFFECTS);\n                        closeEffects = animation.effects;\n                        if (!closeEffects && !kendo.size(closeEffects) && openEffects && kendo.size(openEffects)) {\n                            animation.effects = openEffects;\n                            animation.reverse = true;\n                        }\n                        that._closing = true;\n                    }\n                    that.element.kendoStop(true).attr('aria-hidden', true);\n                    wrap.css({ overflow: HIDDEN }).attr('aria-hidden', true);\n                    that.element.kendoAnimate(animation);\n                    if (skipEffects) {\n                        that._animationClose();\n                    }\n                }\n            },\n            _trigger: function (ev) {\n                return this.trigger(ev, { type: ev });\n            },\n            _resize: function (e) {\n                var that = this;\n                if (support.resize.indexOf(e.type) !== -1) {\n                    clearTimeout(that._resizeTimeout);\n                    that._resizeTimeout = setTimeout(function () {\n                        that._position();\n                        that._resizeTimeout = null;\n                    }, 50);\n                } else {\n                    if (!that._hovered || that._activated && that.element.hasClass('k-list-container')) {\n                        that.close();\n                    }\n                }\n            },\n            _toggleResize: function (toggle) {\n                var method = toggle ? 'on' : 'off';\n                var eventNames = support.resize;\n                if (!(support.mobileOS.ios || support.mobileOS.android || support.browser.safari)) {\n                    eventNames += ' ' + SCROLL;\n                }\n                if (toggle && !this.scrollableParents) {\n                    this.scrollableParents = this._scrollableParents();\n                }\n                if (this.scrollableParents && this.scrollableParents.length) {\n                    this.scrollableParents[method](SCROLL, this._resizeProxy);\n                }\n                WINDOW[method](eventNames, this._resizeProxy);\n            },\n            _mousedown: function (e) {\n                var that = this, container = that.element[0], options = that.options, anchor = $(options.anchor)[0], toggleTarget = options.toggleTarget, target = kendo.eventTarget(e), popup = $(target).closest('.k-popup'), mobile = popup.parent().parent('.km-shim').length;\n                popup = popup[0];\n                if (!mobile && popup && popup !== that.element[0]) {\n                    return;\n                }\n                if ($(e.target).closest('a').data('rel') === 'popover') {\n                    return;\n                }\n                if (!contains(container, target) && !contains(anchor, target) && !(toggleTarget && contains($(toggleTarget)[0], target))) {\n                    that.close();\n                }\n            },\n            _fit: function (position, size, viewPortSize) {\n                var output = 0;\n                if (position + size > viewPortSize) {\n                    output = viewPortSize - (position + size);\n                }\n                if (position < 0) {\n                    output = -position;\n                }\n                return output;\n            },\n            _flip: function (offset, size, anchorSize, viewPortSize, origin, position, boxSize) {\n                var output = 0;\n                boxSize = boxSize || size;\n                if (position !== origin && position !== CENTER && origin !== CENTER) {\n                    if (offset + boxSize > viewPortSize) {\n                        output += -(anchorSize + size);\n                    }\n                    if (offset + output < 0) {\n                        output += anchorSize + size;\n                    }\n                }\n                return output;\n            },\n            _scrollableParents: function () {\n                return $(this.options.anchor).parentsUntil('body').filter(function (index, element) {\n                    return kendo.isScrollable(element);\n                });\n            },\n            _position: function (fixed) {\n                var that = this, element = that.element, wrapper = that.wrapper, options = that.options, viewport = $(options.viewport), zoomLevel = support.zoomLevel(), isWindow = !!(viewport[0] == window && window.innerWidth && zoomLevel <= 1.02), anchor = $(options.anchor), origins = options.origin.toLowerCase().split(' '), positions = options.position.toLowerCase().split(' '), collisions = that.collisions, siblingContainer, parents, parentZIndex, zIndex = 10002, idx = 0, docEl = document.documentElement, length, viewportOffset, viewportWidth, viewportHeight;\n                if (options.viewport === window) {\n                    viewportOffset = {\n                        top: window.pageYOffset || document.documentElement.scrollTop || 0,\n                        left: window.pageXOffset || document.documentElement.scrollLeft || 0\n                    };\n                } else {\n                    viewportOffset = viewport.offset();\n                }\n                if (isWindow) {\n                    viewportWidth = window.innerWidth;\n                    viewportHeight = window.innerHeight;\n                } else {\n                    viewportWidth = viewport.width();\n                    viewportHeight = viewport.height();\n                }\n                if (isWindow && docEl.scrollHeight - docEl.clientHeight > 0) {\n                    var sign = options.isRtl ? -1 : 1;\n                    viewportWidth -= sign * kendo.support.scrollbar();\n                }\n                siblingContainer = anchor.parents().filter(wrapper.siblings());\n                if (siblingContainer[0]) {\n                    parentZIndex = Math.max(Number(siblingContainer.css('zIndex')), 0);\n                    if (parentZIndex) {\n                        zIndex = parentZIndex + 10;\n                    } else {\n                        parents = anchor.parentsUntil(siblingContainer);\n                        for (length = parents.length; idx < length; idx++) {\n                            parentZIndex = Number($(parents[idx]).css('zIndex'));\n                            if (parentZIndex && zIndex < parentZIndex) {\n                                zIndex = parentZIndex + 10;\n                            }\n                        }\n                    }\n                }\n                wrapper.css('zIndex', zIndex);\n                if (fixed && fixed.isFixed) {\n                    wrapper.css({\n                        left: fixed.x,\n                        top: fixed.y\n                    });\n                } else {\n                    wrapper.css(that._align(origins, positions));\n                }\n                var pos = getOffset(wrapper, POSITION, anchor[0] === wrapper.offsetParent()[0]), offset = getOffset(wrapper), anchorParent = anchor.offsetParent().parent('.k-animation-container,.k-popup,.k-group');\n                if (anchorParent.length) {\n                    pos = getOffset(wrapper, POSITION, true);\n                    offset = getOffset(wrapper);\n                }\n                offset.top -= viewportOffset.top;\n                offset.left -= viewportOffset.left;\n                if (!that.wrapper.data(LOCATION)) {\n                    wrapper.data(LOCATION, extend({}, pos));\n                }\n                var offsets = extend({}, offset), location = extend({}, pos), adjustSize = options.adjustSize;\n                if (collisions[0] === 'fit') {\n                    location.top += that._fit(offsets.top, outerHeight(wrapper) + adjustSize.height, viewportHeight / zoomLevel);\n                }\n                if (collisions[1] === 'fit') {\n                    location.left += that._fit(offsets.left, outerWidth(wrapper) + adjustSize.width, viewportWidth / zoomLevel);\n                }\n                var flipPos = extend({}, location);\n                var elementHeight = outerHeight(element);\n                var wrapperHeight = outerHeight(wrapper);\n                if (!wrapper.height() && elementHeight) {\n                    wrapperHeight = wrapperHeight + elementHeight;\n                }\n                if (collisions[0] === 'flip') {\n                    location.top += that._flip(offsets.top, elementHeight, outerHeight(anchor), viewportHeight / zoomLevel, origins[0], positions[0], wrapperHeight);\n                }\n                if (collisions[1] === 'flip') {\n                    location.left += that._flip(offsets.left, outerWidth(element), outerWidth(anchor), viewportWidth / zoomLevel, origins[1], positions[1], outerWidth(wrapper));\n                }\n                element.css(POSITION, ABSOLUTE);\n                wrapper.css(location);\n                return location.left != flipPos.left || location.top != flipPos.top;\n            },\n            _align: function (origin, position) {\n                var that = this, element = that.wrapper, anchor = $(that.options.anchor), verticalOrigin = origin[0], horizontalOrigin = origin[1], verticalPosition = position[0], horizontalPosition = position[1], anchorOffset = getOffset(anchor), appendTo = $(that.options.appendTo), appendToOffset, width = outerWidth(element), height = outerHeight(element) || outerHeight(element.children().first()), anchorWidth = outerWidth(anchor), anchorHeight = outerHeight(anchor), top = anchorOffset.top, left = anchorOffset.left, round = Math.round;\n                if (appendTo[0] != document.body) {\n                    appendToOffset = getOffset(appendTo);\n                    top -= appendToOffset.top;\n                    left -= appendToOffset.left;\n                }\n                if (verticalOrigin === BOTTOM) {\n                    top += anchorHeight;\n                }\n                if (verticalOrigin === CENTER) {\n                    top += round(anchorHeight / 2);\n                }\n                if (verticalPosition === BOTTOM) {\n                    top -= height;\n                }\n                if (verticalPosition === CENTER) {\n                    top -= round(height / 2);\n                }\n                if (horizontalOrigin === RIGHT) {\n                    left += anchorWidth;\n                }\n                if (horizontalOrigin === CENTER) {\n                    left += round(anchorWidth / 2);\n                }\n                if (horizontalPosition === RIGHT) {\n                    left -= width;\n                }\n                if (horizontalPosition === CENTER) {\n                    left -= round(width / 2);\n                }\n                return {\n                    top: top,\n                    left: left\n                };\n            }\n        });\n        ui.plugin(Popup);\n        var stableSort = kendo.support.stableSort;\n        var tabKeyTrapNS = 'kendoTabKeyTrap';\n        var focusableNodesSelector = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex], *[contenteditable]';\n        var TabKeyTrap = Class.extend({\n            init: function (element) {\n                this.element = $(element);\n                this.element.autoApplyNS(tabKeyTrapNS);\n            },\n            trap: function () {\n                this.element.on('keydown', proxy(this._keepInTrap, this));\n            },\n            removeTrap: function () {\n                this.element.kendoDestroy(tabKeyTrapNS);\n            },\n            destroy: function () {\n                this.element.kendoDestroy(tabKeyTrapNS);\n                this.element = undefined;\n            },\n            shouldTrap: function () {\n                return true;\n            },\n            _keepInTrap: function (e) {\n                if (e.which !== 9 || !this.shouldTrap() || e.isDefaultPrevented()) {\n                    return;\n                }\n                var elements = this._focusableElements();\n                var sortedElements = this._sortFocusableElements(elements);\n                var next = this._nextFocusable(e, sortedElements);\n                this._focus(next);\n                e.preventDefault();\n            },\n            _focusableElements: function () {\n                var elements = this.element.find(focusableNodesSelector).filter(function (i, item) {\n                    return item.tabIndex >= 0 && $(item).is(':visible') && !$(item).is('[disabled]');\n                });\n                if (this.element.is('[tabindex]')) {\n                    elements.push(this.element[0]);\n                }\n                return elements;\n            },\n            _sortFocusableElements: function (elements) {\n                var sortedElements;\n                if (stableSort) {\n                    sortedElements = elements.sort(function (prev, next) {\n                        return prev.tabIndex - next.tabIndex;\n                    });\n                } else {\n                    var attrName = '__k_index';\n                    elements.each(function (i, item) {\n                        item.setAttribute(attrName, i);\n                    });\n                    sortedElements = elements.sort(function (prev, next) {\n                        return prev.tabIndex === next.tabIndex ? parseInt(prev.getAttribute(attrName), 10) - parseInt(next.getAttribute(attrName), 10) : prev.tabIndex - next.tabIndex;\n                    });\n                    elements.removeAttr(attrName);\n                }\n                return sortedElements;\n            },\n            _nextFocusable: function (e, elements) {\n                var count = elements.length;\n                var current = elements.index(e.target);\n                return elements.get((current + (e.shiftKey ? -1 : 1)) % count);\n            },\n            _focus: function (element) {\n                if (element.nodeName == 'IFRAME') {\n                    element.contentWindow.document.body.focus();\n                    return;\n                }\n                element.focus();\n                if (element.nodeName == 'INPUT' && element.setSelectionRange && this._haveSelectionRange(element)) {\n                    element.setSelectionRange(0, element.value.length);\n                }\n            },\n            _haveSelectionRange: function (element) {\n                var elementType = element.type.toLowerCase();\n                return elementType === 'text' || elementType === 'search' || elementType === 'url' || elementType === 'tel' || elementType === 'password';\n            }\n        });\n        ui.Popup.TabKeyTrap = TabKeyTrap;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.notification', [\n        'kendo.core',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'notification',\n        name: 'Notification',\n        category: 'web',\n        description: 'The Notification widget displays user alerts.',\n        depends: [\n            'core',\n            'popup'\n        ],\n        features: [{\n                id: 'notification-fx',\n                name: 'Animation',\n                description: 'Support for animation',\n                depends: ['fx']\n            }]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, extend = $.extend, setTimeout = window.setTimeout, CLICK = 'click', SHOW = 'show', HIDE = 'hide', KNOTIFICATION = 'k-notification', KICLOSE = '.k-notification-wrap .k-i-close', KHIDING = 'k-hiding', INFO = 'info', SUCCESS = 'success', WARNING = 'warning', ERROR = 'error', TOP = 'top', LEFT = 'left', BOTTOM = 'bottom', RIGHT = 'right', UP = 'up', NS = '.kendoNotification', WRAPPER = '<div class=\"k-widget k-popup k-notification\"></div>', TEMPLATE = '<div class=\"k-notification-wrap\">' + '<span class=\"k-icon k-i-#=typeIcon#\" title=\"#=typeIcon#\"></span>' + '<div class=\"k-notification-content\">#=content#</div>' + '<span class=\"k-icon k-i-close\" title=\"Hide\"></span>' + '</div>', SAFE_TEMPLATE = TEMPLATE.replace('#=content#', '#:content#');\n        var Notification = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                if (!options.appendTo || !$(options.appendTo).is(element)) {\n                    that.element.hide();\n                }\n                that._compileTemplates(options.templates);\n                that._guid = '_' + kendo.guid();\n                that._isRtl = kendo.support.isRtl(element);\n                that._compileStacking(options.stacking, options.position.top, options.position.left);\n                kendo.notify(that);\n            },\n            events: [\n                SHOW,\n                HIDE\n            ],\n            options: {\n                name: 'Notification',\n                position: {\n                    pinned: true,\n                    top: null,\n                    left: null,\n                    bottom: 20,\n                    right: 20\n                },\n                stacking: 'default',\n                hideOnClick: true,\n                button: false,\n                allowHideAfter: 0,\n                autoHideAfter: 5000,\n                appendTo: null,\n                width: null,\n                height: null,\n                templates: [],\n                animation: {\n                    open: {\n                        effects: 'fade:in',\n                        duration: 300\n                    },\n                    close: {\n                        effects: 'fade:out',\n                        duration: 600,\n                        hide: true\n                    }\n                }\n            },\n            _compileTemplates: function (templates) {\n                var that = this;\n                var kendoTemplate = kendo.template;\n                that._compiled = {};\n                $.each(templates, function (key, value) {\n                    that._compiled[value.type] = kendoTemplate(value.template || $('#' + value.templateId).html());\n                });\n                that._defaultCompiled = kendoTemplate(TEMPLATE);\n                that._safeCompiled = kendoTemplate(SAFE_TEMPLATE);\n            },\n            _getCompiled: function (type, safe) {\n                var defaultCompiled = safe ? this._safeCompiled : this._defaultCompiled;\n                return type ? this._compiled[type] || defaultCompiled : defaultCompiled;\n            },\n            _compileStacking: function (stacking, top, left) {\n                var that = this, paddings = {\n                        paddingTop: 0,\n                        paddingRight: 0,\n                        paddingBottom: 0,\n                        paddingLeft: 0\n                    }, horizontalAlignment = left !== null ? LEFT : RIGHT, origin, position;\n                switch (stacking) {\n                case 'down':\n                    origin = BOTTOM + ' ' + horizontalAlignment;\n                    position = TOP + ' ' + horizontalAlignment;\n                    delete paddings.paddingBottom;\n                    break;\n                case RIGHT:\n                    origin = TOP + ' ' + RIGHT;\n                    position = TOP + ' ' + LEFT;\n                    delete paddings.paddingRight;\n                    break;\n                case LEFT:\n                    origin = TOP + ' ' + LEFT;\n                    position = TOP + ' ' + RIGHT;\n                    delete paddings.paddingLeft;\n                    break;\n                case UP:\n                    origin = TOP + ' ' + horizontalAlignment;\n                    position = BOTTOM + ' ' + horizontalAlignment;\n                    delete paddings.paddingTop;\n                    break;\n                default:\n                    if (top !== null) {\n                        origin = BOTTOM + ' ' + horizontalAlignment;\n                        position = TOP + ' ' + horizontalAlignment;\n                        delete paddings.paddingBottom;\n                    } else {\n                        origin = TOP + ' ' + horizontalAlignment;\n                        position = BOTTOM + ' ' + horizontalAlignment;\n                        delete paddings.paddingTop;\n                    }\n                    break;\n                }\n                that._popupOrigin = origin;\n                that._popupPosition = position;\n                that._popupPaddings = paddings;\n            },\n            _attachPopupEvents: function (options, popup) {\n                var that = this, allowHideAfter = options.allowHideAfter, attachDelay = !isNaN(allowHideAfter) && allowHideAfter > 0, closeIcon;\n                function attachClick(target) {\n                    target.on(CLICK + NS, function () {\n                        that._hidePopup(popup);\n                    });\n                }\n                if (options.hideOnClick) {\n                    popup.bind('activate', function () {\n                        if (attachDelay) {\n                            setTimeout(function () {\n                                attachClick(popup.element);\n                            }, allowHideAfter);\n                        } else {\n                            attachClick(popup.element);\n                        }\n                    });\n                } else if (options.button) {\n                    closeIcon = popup.element.find(KICLOSE);\n                    if (attachDelay) {\n                        setTimeout(function () {\n                            attachClick(closeIcon);\n                        }, allowHideAfter);\n                    } else {\n                        attachClick(closeIcon);\n                    }\n                }\n            },\n            _showPopup: function (wrapper, options) {\n                var that = this, autoHideAfter = options.autoHideAfter, x = options.position.left, y = options.position.top, popup, openPopup;\n                openPopup = $('.' + that._guid + ':not(.' + KHIDING + ')').last();\n                popup = new kendo.ui.Popup(wrapper, {\n                    anchor: openPopup[0] ? openPopup : document.body,\n                    origin: that._popupOrigin,\n                    position: that._popupPosition,\n                    animation: options.animation,\n                    copyAnchorStyles: false,\n                    modal: true,\n                    collision: '',\n                    isRtl: that._isRtl,\n                    close: function () {\n                        that._triggerHide(this.element);\n                    },\n                    deactivate: function (e) {\n                        e.sender.element.off(NS);\n                        e.sender.element.find(KICLOSE).off(NS);\n                        e.sender.destroy();\n                    }\n                });\n                that._attachPopupEvents(options, popup);\n                wrapper.removeClass('k-group k-reset');\n                if (openPopup[0]) {\n                    popup.open();\n                } else {\n                    if (x === null) {\n                        x = $(window).width() - wrapper.outerWidth() - options.position.right;\n                    }\n                    if (y === null) {\n                        y = $(window).height() - wrapper.outerHeight() - options.position.bottom;\n                    }\n                    popup.open(x, y);\n                }\n                popup.wrapper.addClass(that._guid).css(extend({\n                    margin: 0,\n                    zIndex: 10050\n                }, that._popupPaddings));\n                if (options.position.pinned) {\n                    popup.wrapper.css('position', 'fixed');\n                    if (openPopup[0]) {\n                        that._togglePin(popup.wrapper, true);\n                    }\n                } else if (!openPopup[0]) {\n                    that._togglePin(popup.wrapper, false);\n                }\n                if (autoHideAfter > 0) {\n                    setTimeout(function () {\n                        that._hidePopup(popup);\n                    }, autoHideAfter);\n                }\n            },\n            _hidePopup: function (popup) {\n                popup.wrapper.addClass(KHIDING);\n                popup.close();\n            },\n            _togglePin: function (wrapper, pin) {\n                var win = $(window), sign = pin ? -1 : 1;\n                wrapper.css({\n                    top: parseInt(wrapper.css(TOP), 10) + sign * win.scrollTop(),\n                    left: parseInt(wrapper.css(LEFT), 10) + sign * win.scrollLeft()\n                });\n            },\n            _attachStaticEvents: function (options, wrapper) {\n                var that = this, allowHideAfter = options.allowHideAfter, attachDelay = !isNaN(allowHideAfter) && allowHideAfter > 0;\n                function attachClick(target) {\n                    target.on(CLICK + NS, proxy(that._hideStatic, that, wrapper));\n                }\n                if (options.hideOnClick) {\n                    if (attachDelay) {\n                        setTimeout(function () {\n                            attachClick(wrapper);\n                        }, allowHideAfter);\n                    } else {\n                        attachClick(wrapper);\n                    }\n                } else if (options.button) {\n                    if (attachDelay) {\n                        setTimeout(function () {\n                            attachClick(wrapper.find(KICLOSE));\n                        }, allowHideAfter);\n                    } else {\n                        attachClick(wrapper.find(KICLOSE));\n                    }\n                }\n            },\n            _showStatic: function (wrapper, options) {\n                var that = this, autoHideAfter = options.autoHideAfter, animation = options.animation, insertionMethod = options.stacking == UP || options.stacking == LEFT ? 'prependTo' : 'appendTo', initializedNotifications;\n                wrapper.removeClass('k-popup').addClass(that._guid)[insertionMethod](options.appendTo).hide().kendoAnimate(animation.open || false);\n                initializedNotifications = that.getNotifications();\n                initializedNotifications.each(function (idx, element) {\n                    that._attachStaticEvents(options, $(element));\n                    if (autoHideAfter > 0) {\n                        setTimeout(function () {\n                            that._hideStatic($(element));\n                        }, autoHideAfter);\n                    }\n                });\n            },\n            _hideStatic: function (wrapper) {\n                wrapper.kendoAnimate(extend(this.options.animation.close || false, {\n                    complete: function () {\n                        wrapper.off(NS).find(KICLOSE).off(NS);\n                        wrapper.remove();\n                    }\n                }));\n                this._triggerHide(wrapper);\n            },\n            _triggerHide: function (element) {\n                this.trigger(HIDE, { element: element });\n                this.angular('cleanup', function () {\n                    return { elements: element };\n                });\n            },\n            show: function (content, type, safe) {\n                var that = this, options = that.options, wrapper = $(WRAPPER), args, defaultArgs;\n                if (!type) {\n                    type = INFO;\n                }\n                if (content !== null && content !== undefined && content !== '') {\n                    if (kendo.isFunction(content)) {\n                        content = content();\n                    }\n                    defaultArgs = {\n                        typeIcon: type,\n                        content: ''\n                    };\n                    if ($.isPlainObject(content)) {\n                        args = extend(defaultArgs, content);\n                    } else {\n                        args = extend(defaultArgs, { content: content });\n                    }\n                    wrapper.addClass(KNOTIFICATION + '-' + type).toggleClass(KNOTIFICATION + '-button', options.button).toggleClass(KNOTIFICATION + '-closable', options.button).attr('data-role', 'alert').css({\n                        width: options.width,\n                        height: options.height\n                    }).append(that._getCompiled(type, safe)(args));\n                    that.angular('compile', function () {\n                        return {\n                            elements: wrapper,\n                            data: [{ dataItem: args }]\n                        };\n                    });\n                    if ($(options.appendTo)[0]) {\n                        that._showStatic(wrapper, options);\n                    } else {\n                        that._showPopup(wrapper, options);\n                    }\n                    that.trigger(SHOW, { element: wrapper });\n                }\n                return that;\n            },\n            showText: function (content, type) {\n                this.show(content, type, true);\n            },\n            info: function (content) {\n                return this.show(content, INFO);\n            },\n            success: function (content) {\n                return this.show(content, SUCCESS);\n            },\n            warning: function (content) {\n                return this.show(content, WARNING);\n            },\n            error: function (content) {\n                return this.show(content, ERROR);\n            },\n            hide: function () {\n                var that = this, openedNotifications = that.getNotifications();\n                if (that.options.appendTo) {\n                    openedNotifications.each(function (idx, element) {\n                        that._hideStatic($(element));\n                    });\n                } else {\n                    openedNotifications.each(function (idx, element) {\n                        var popup = $(element).data('kendoPopup');\n                        if (popup) {\n                            that._hidePopup(popup);\n                        }\n                    });\n                }\n                return that;\n            },\n            getNotifications: function () {\n                var that = this, guidElements = $('.' + that._guid + ':not(.' + KHIDING + ')');\n                if (that.options.appendTo) {\n                    return guidElements;\n                } else {\n                    return guidElements.children('.' + KNOTIFICATION);\n                }\n            },\n            setOptions: function (newOptions) {\n                var that = this, options;\n                Widget.fn.setOptions.call(that, newOptions);\n                options = that.options;\n                if (newOptions.templates !== undefined) {\n                    that._compileTemplates(options.templates);\n                }\n                if (newOptions.stacking !== undefined || newOptions.position !== undefined) {\n                    that._compileStacking(options.stacking, options.position.top, options.position.left);\n                }\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.getNotifications().off(NS).find(KICLOSE).off(NS);\n            }\n        });\n        kendo.ui.plugin(Notification);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.tooltip', [\n        'kendo.core',\n        'kendo.popup',\n        'kendo.fx'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'tooltip',\n        name: 'Tooltip',\n        category: 'web',\n        description: 'The Tooltip widget displays a popup hint for a given html element.',\n        depends: [\n            'core',\n            'popup'\n        ],\n        features: [{\n                id: 'tooltip-fx',\n                name: 'Animation',\n                description: 'Support for animation',\n                depends: ['fx']\n            }]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, Popup = kendo.ui.Popup, isFunction = kendo.isFunction, isPlainObject = $.isPlainObject, extend = $.extend, proxy = $.proxy, DOCUMENT = $(document), isLocalUrl = kendo.isLocalUrl, ARIAIDSUFFIX = '_tt_active', DESCRIBEDBY = 'aria-describedby', SHOW = 'show', HIDE = 'hide', ERROR = 'error', CONTENTLOAD = 'contentLoad', REQUESTSTART = 'requestStart', KCONTENTFRAME = 'k-content-frame', TEMPLATE = '<div role=\"tooltip\" class=\"k-widget k-tooltip#if (!autoHide) {# k-tooltip-closable#}#\">' + '#if (!autoHide) {# <div class=\"k-tooltip-button\"><a href=\"\\\\#\" class=\"k-icon k-i-close\" title=\"Close\"></a></div> #}#' + '<div class=\"k-tooltip-content\"></div>' + '#if (callout){ #<div class=\"k-callout k-callout-#=dir#\"></div>#}#' + '</div>', IFRAMETEMPLATE = kendo.template('<iframe frameborder=\\'0\\' class=\\'' + KCONTENTFRAME + '\\' src=\\'#= content.url #\\'>' + 'This page requires frames in order to show content' + '</iframe>'), NS = '.kendoTooltip', POSITIONS = {\n                bottom: {\n                    origin: 'bottom center',\n                    position: 'top center'\n                },\n                top: {\n                    origin: 'top center',\n                    position: 'bottom center'\n                },\n                left: {\n                    origin: 'center left',\n                    position: 'center right',\n                    collision: 'fit flip'\n                },\n                right: {\n                    origin: 'center right',\n                    position: 'center left',\n                    collision: 'fit flip'\n                },\n                center: {\n                    position: 'center center',\n                    origin: 'center center'\n                }\n            }, REVERSE = {\n                'top': 'bottom',\n                'bottom': 'top',\n                'left': 'right',\n                'right': 'left',\n                'center': 'center'\n            }, DIRCLASSES = {\n                bottom: 'n',\n                top: 's',\n                left: 'e',\n                right: 'w',\n                center: 'n'\n            }, DIMENSIONS = {\n                'horizontal': {\n                    offset: 'top',\n                    size: 'outerHeight'\n                },\n                'vertical': {\n                    offset: 'left',\n                    size: 'outerWidth'\n                }\n            }, DEFAULTCONTENT = function (e) {\n                return e.target.data(kendo.ns + 'title');\n            };\n        function restoreTitle(element) {\n            while (element.length) {\n                if (restoreTitleAttributeForElement(element)) {\n                    break;\n                }\n                element = element.parent();\n            }\n        }\n        function restoreTitleAttributeForElement(element) {\n            var title = element.data(kendo.ns + 'title');\n            if (title) {\n                element.attr('title', title);\n                element.removeData(kendo.ns + 'title');\n                return true;\n            }\n        }\n        function saveTitleAttributeForElement(element) {\n            var title = element.attr('title');\n            if (title) {\n                element.data(kendo.ns + 'title', title);\n                element.attr('title', '');\n                return true;\n            }\n        }\n        function saveTitleAttributes(element) {\n            while (element.length && !element.is('body')) {\n                if (saveTitleAttributeForElement(element)) {\n                    break;\n                }\n                element = element.parent();\n            }\n        }\n        var Tooltip = Widget.extend({\n            init: function (element, options) {\n                var that = this, axis;\n                Widget.fn.init.call(that, element, options);\n                axis = that.options.position.match(/left|right/) ? 'horizontal' : 'vertical';\n                that.dimensions = DIMENSIONS[axis];\n                that._documentKeyDownHandler = proxy(that._documentKeyDown, that);\n                if (kendo.support.touch && this._isShownOnMouseEnter()) {\n                    that.element.on(kendo.support.mousedown + NS, that.options.filter, proxy(that._showOn, that));\n                }\n                that.element.on(that.options.showOn + NS, that.options.filter, proxy(that._showOn, that));\n                if (this._isShownOnMouseEnter() || this._isShownOnClick()) {\n                    that.element.on('mouseenter' + NS, that.options.filter, proxy(that._mouseenter, that));\n                }\n                if (this.options.autoHide && this._isShownOnMouseEnter()) {\n                    that.element.on('mouseleave' + NS, that.options.filter, proxy(that._mouseleave, that));\n                }\n                if (this.options.autoHide && this._isShownOnFocus()) {\n                    that.element.on('blur' + NS, that.options.filter, proxy(that._blur, that));\n                }\n                if (kendo.support.touch) {\n                    that.element.on(kendo.support.mousedown + NS, that.options.filter, proxy(that._mouseenter, that));\n                }\n            },\n            options: {\n                name: 'Tooltip',\n                filter: '',\n                content: DEFAULTCONTENT,\n                showAfter: 100,\n                hideAfter: 100,\n                callout: true,\n                offset: 0,\n                position: 'bottom',\n                showOn: 'mouseenter',\n                autoHide: true,\n                width: null,\n                height: null,\n                animation: {\n                    open: {\n                        effects: 'fade:in',\n                        duration: 0\n                    },\n                    close: {\n                        duration: 40,\n                        hide: true\n                    }\n                }\n            },\n            events: [\n                SHOW,\n                HIDE,\n                CONTENTLOAD,\n                ERROR,\n                REQUESTSTART\n            ],\n            _isShownOnFocus: function () {\n                return this.options.showOn && this.options.showOn.match(/focus/);\n            },\n            _isShownOnMouseEnter: function () {\n                return this.options.showOn && this.options.showOn.match(/mouseenter/);\n            },\n            _isShownOnClick: function () {\n                return this.options.showOn && this.options.showOn.match(/click/);\n            },\n            _mouseenter: function (e) {\n                saveTitleAttributes($(e.currentTarget));\n            },\n            _showOn: function (e) {\n                var that = this;\n                var currentTarget = $(e.currentTarget);\n                if (that._isShownOnClick() && !that._isShownOnMouseEnter()) {\n                    that._show(currentTarget);\n                } else if (that._isShownOnFocus()) {\n                    saveTitleAttributes(currentTarget);\n                    that._show(currentTarget);\n                } else {\n                    clearTimeout(that.timeout);\n                    that.timeout = setTimeout(function () {\n                        that._show(currentTarget);\n                    }, that.options.showAfter);\n                }\n            },\n            _appendContent: function (target) {\n                var that = this, contentOptions = that.options.content, element = that.content, showIframe = that.options.iframe, iframe;\n                if (isPlainObject(contentOptions) && contentOptions.url) {\n                    if (!('iframe' in that.options)) {\n                        showIframe = !isLocalUrl(contentOptions.url);\n                    }\n                    that.trigger(REQUESTSTART, {\n                        options: contentOptions,\n                        target: target\n                    });\n                    if (!showIframe) {\n                        element.empty();\n                        kendo.ui.progress(element, true);\n                        that._ajaxRequest(contentOptions);\n                    } else {\n                        element.hide();\n                        iframe = element.find('.' + KCONTENTFRAME)[0];\n                        if (iframe) {\n                            iframe.src = contentOptions.url || iframe.src;\n                        } else {\n                            element.html(IFRAMETEMPLATE({ content: contentOptions }));\n                        }\n                        element.find('.' + KCONTENTFRAME).off('load' + NS).on('load' + NS, function () {\n                            that.trigger(CONTENTLOAD);\n                            element.show();\n                        });\n                    }\n                } else if (contentOptions && isFunction(contentOptions)) {\n                    contentOptions = contentOptions({\n                        sender: this,\n                        target: target\n                    });\n                    element.html(contentOptions || '');\n                } else {\n                    element.html(contentOptions);\n                }\n                that.angular('compile', function () {\n                    return { elements: element };\n                });\n            },\n            _ajaxRequest: function (options) {\n                var that = this;\n                jQuery.ajax(extend({\n                    type: 'GET',\n                    dataType: 'html',\n                    cache: false,\n                    error: function (xhr, status) {\n                        kendo.ui.progress(that.content, false);\n                        that.trigger(ERROR, {\n                            status: status,\n                            xhr: xhr\n                        });\n                    },\n                    success: proxy(function (data) {\n                        kendo.ui.progress(that.content, false);\n                        that.content.html(data);\n                        that.trigger(CONTENTLOAD);\n                    }, that)\n                }, options));\n            },\n            _documentKeyDown: function (e) {\n                if (e.keyCode === kendo.keys.ESC) {\n                    this.hide();\n                }\n            },\n            refresh: function () {\n                var that = this, popup = that.popup;\n                if (popup && popup.options.anchor) {\n                    that._appendContent(popup.options.anchor);\n                }\n            },\n            hide: function () {\n                if (this.popup) {\n                    this.popup.close();\n                }\n            },\n            show: function (target) {\n                target = target || this.element;\n                saveTitleAttributes(target);\n                this._show(target);\n            },\n            _show: function (target) {\n                var that = this, current = that.target();\n                if (!that.popup) {\n                    that._initPopup();\n                }\n                if (current && current[0] != target[0]) {\n                    that.popup.close();\n                    that.popup.element.kendoStop(true, true);\n                }\n                if (!current || current[0] != target[0]) {\n                    that._appendContent(target);\n                    that.popup.options.anchor = target;\n                }\n                that.popup.one('deactivate', function () {\n                    restoreTitle(target);\n                    target.removeAttr(DESCRIBEDBY);\n                    this.element.removeAttr('id').attr('aria-hidden', true);\n                    DOCUMENT.off('keydown' + NS, that._documentKeyDownHandler);\n                });\n                that.popup._hovered = true;\n                that.popup.open();\n            },\n            _initPopup: function () {\n                var that = this, options = that.options, wrapper = $(kendo.template(TEMPLATE)({\n                        callout: options.callout && options.position !== 'center',\n                        dir: DIRCLASSES[options.position],\n                        autoHide: options.autoHide\n                    }));\n                that.popup = new Popup(wrapper, extend({\n                    autosize: true,\n                    activate: function () {\n                        var anchor = this.options.anchor, ariaId = anchor[0].id || that.element[0].id;\n                        if (ariaId) {\n                            anchor.attr(DESCRIBEDBY, ariaId + ARIAIDSUFFIX);\n                            this.element.attr('id', ariaId + ARIAIDSUFFIX);\n                        }\n                        if (options.callout) {\n                            that._positionCallout();\n                        } else {\n                            that._offset(that.options.position, that.options.offset);\n                        }\n                        this.element.removeAttr('aria-hidden');\n                        DOCUMENT.on('keydown' + NS, that._documentKeyDownHandler);\n                        that.trigger(SHOW);\n                        that.popup._hovered = undefined;\n                    },\n                    close: function () {\n                        that.trigger(HIDE);\n                    },\n                    copyAnchorStyles: false,\n                    animation: options.animation\n                }, POSITIONS[options.position]));\n                wrapper.css({\n                    width: options.width,\n                    height: options.height\n                });\n                that.content = wrapper.find('.k-tooltip-content');\n                that.arrow = wrapper.find('.k-callout');\n                if (options.autoHide && this._isShownOnMouseEnter()) {\n                    wrapper.on('mouseleave' + NS, proxy(that._mouseleave, that));\n                } else {\n                    wrapper.on('click' + NS, '.k-tooltip-button', proxy(that._closeButtonClick, that));\n                }\n            },\n            _closeButtonClick: function (e) {\n                e.preventDefault();\n                this.hide();\n            },\n            _mouseleave: function (e) {\n                var that = this;\n                clearTimeout(that.timeout);\n                that.timeout = setTimeout(function () {\n                    that._closePopup(e.currentTarget);\n                }, that.options.hideAfter);\n            },\n            _blur: function (e) {\n                this._closePopup(e.currentTarget);\n            },\n            _closePopup: function (target) {\n                if (this.popup && !this.popup._hovered) {\n                    this.popup.close();\n                } else {\n                    restoreTitle($(target));\n                }\n            },\n            target: function () {\n                if (this.popup) {\n                    return this.popup.options.anchor;\n                }\n                return null;\n            },\n            _positionCallout: function () {\n                var that = this, position = that.options.position, dimensions = that.dimensions, offset = dimensions.offset, popup = that.popup, anchor = popup.options.anchor, anchorOffset = $(anchor).offset(), elementOffset = $(popup.element).offset(), cssClass = DIRCLASSES[popup.flipped ? REVERSE[position] : position], offsetAmount = anchorOffset[offset] - elementOffset[offset] + $(anchor)[dimensions.size]() / 2;\n                that._offset(position, that.options.offset);\n                that.arrow.removeClass('k-callout-n k-callout-s k-callout-w k-callout-e').addClass('k-callout-' + cssClass).css(offset, offsetAmount);\n            },\n            destroy: function () {\n                var popup = this.popup;\n                if (popup) {\n                    popup.element.off(NS);\n                    popup.destroy();\n                }\n                clearTimeout(this.timeout);\n                this.element.off(NS);\n                DOCUMENT.off('keydown' + NS, this._documentKeyDownHandler);\n                Widget.fn.destroy.call(this);\n            },\n            _offset: function (position, offsetAmount) {\n                var that = this, isTopLeft = position == 'top' || position == 'left', isFlipped = that.popup.flipped, direction = isTopLeft && isFlipped || !isTopLeft && !isFlipped ? 1 : -1, marginRule = isTopLeft ? 'margin-' + position : 'margin-' + REVERSE[position], offset = kendo._outerWidth(that.arrow) / 2 + offsetAmount;\n                that.popup.wrapper.css(marginRule, offset * direction + 'px');\n            }\n        });\n        kendo.ui.plugin(Tooltip);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.toolbar', [\n        'kendo.core',\n        'kendo.userevents',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'toolbar',\n        name: 'ToolBar',\n        category: 'web',\n        description: 'The ToolBar widget displays one or more command buttons divided into groups.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Class = kendo.Class, Widget = kendo.ui.Widget, proxy = $.proxy, isFunction = kendo.isFunction, keys = kendo.keys, outerWidth = kendo._outerWidth, ns = '.kendoToolBar', TOOLBAR = 'k-toolbar', BUTTON = 'k-button', OVERFLOW_BUTTON = 'k-overflow-button', TOGGLE_BUTTON = 'k-toggle-button', BUTTON_GROUP = 'k-button-group', SPLIT_BUTTON = 'k-split-button', SEPARATOR = 'k-separator', SPACER_CLASS = 'k-spacer', SPACER = 'spacer', POPUP = 'k-popup', RESIZABLE_TOOLBAR = 'k-toolbar-resizable', STATE_ACTIVE = 'k-state-active', STATE_DISABLED = 'k-state-disabled', STATE_HIDDEN = 'k-state-hidden', GROUP_START = 'k-group-start', GROUP_END = 'k-group-end', PRIMARY = 'k-primary', ARIA_DISABLED = 'aria-disabled', ARIA_PRESSED = 'aria-pressed', ICON = 'k-icon', ICON_PREFIX = 'k-i-', BUTTON_ICON = 'k-button-icon', BUTTON_ICON_TEXT = 'k-button-icontext', LIST_CONTAINER = 'k-list-container k-split-container', SPLIT_BUTTON_ARROW = 'k-split-button-arrow', OVERFLOW_ANCHOR = 'k-overflow-anchor', OVERFLOW_CONTAINER = 'k-overflow-container', FIRST_TOOLBAR_VISIBLE = 'k-toolbar-first-visible', LAST_TOOLBAR_VISIBLE = 'k-toolbar-last-visible', CLICK = 'click', TOGGLE = 'toggle', OPEN = 'open', CLOSE = 'close', OVERFLOW_OPEN = 'overflowOpen', OVERFLOW_CLOSE = 'overflowClose', OVERFLOW_NEVER = 'never', OVERFLOW_AUTO = 'auto', OVERFLOW_ALWAYS = 'always', OVERFLOW_HIDDEN = 'k-overflow-hidden', OPTION_LIST_SUFFIX = '_optionlist', KENDO_UID_ATTR = kendo.attr('uid');\n        kendo.toolbar = {};\n        var components = {\n            overflowAnchor: '<div tabindex=\"0\" class=\"k-overflow-anchor k-button\"></div>',\n            overflowContainer: '<ul class=\"k-overflow-container k-list-container\"></ul>'\n        };\n        kendo.toolbar.registerComponent = function (name, toolbar, overflow) {\n            components[name] = {\n                toolbar: toolbar,\n                overflow: overflow\n            };\n        };\n        var Item = kendo.Class.extend({\n            addOverflowAttr: function () {\n                this.element.attr(kendo.attr('overflow'), this.options.overflow || OVERFLOW_AUTO);\n            },\n            addUidAttr: function () {\n                this.element.attr(KENDO_UID_ATTR, this.options.uid);\n            },\n            addIdAttr: function () {\n                if (this.options.id) {\n                    this.element.attr('id', this.options.id);\n                }\n            },\n            addOverflowIdAttr: function () {\n                if (this.options.id) {\n                    this.element.attr('id', this.options.id + '_overflow');\n                }\n            },\n            attributes: function () {\n                if (this.options.attributes) {\n                    this.element.attr(this.options.attributes);\n                }\n            },\n            show: function () {\n                this.element.removeClass(STATE_HIDDEN);\n                this.element.removeClass('k-hidden');\n                this.options.hidden = false;\n            },\n            hide: function () {\n                this.element.addClass(STATE_HIDDEN);\n                this.element.addClass('k-hidden');\n                if (this.overflow && this.overflowHidden) {\n                    this.overflowHidden();\n                }\n                this.options.hidden = true;\n            },\n            remove: function () {\n                this.element.remove();\n            },\n            enable: function (isEnabled) {\n                if (isEnabled === undefined) {\n                    isEnabled = true;\n                }\n                this.element.toggleClass(STATE_DISABLED, !isEnabled);\n                this.element.attr(ARIA_DISABLED, !isEnabled);\n                this.options.enable = isEnabled;\n            },\n            twin: function () {\n                var uid = this.element.attr(KENDO_UID_ATTR);\n                if (this.overflow && this.options.splitContainerId) {\n                    return $('#' + this.options.splitContainerId).find('[' + KENDO_UID_ATTR + '=\\'' + uid + '\\']').data(this.options.type);\n                } else if (this.overflow) {\n                    return this.toolbar.element.find('[' + KENDO_UID_ATTR + '=\\'' + uid + '\\']').data(this.options.type);\n                } else if (this.toolbar.options.resizable) {\n                    return this.toolbar.popup.element.find('[' + KENDO_UID_ATTR + '=\\'' + uid + '\\']').data(this.options.type);\n                }\n            }\n        });\n        kendo.toolbar.Item = Item;\n        var Button = Item.extend({\n            init: function (options, toolbar) {\n                var element = options.useButtonTag ? $('<button tabindex=\"0\"></button>') : $('<a role=\"button\" href tabindex=\"0\"></a>');\n                this.element = element;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.attributes();\n                if (options.primary) {\n                    element.addClass(PRIMARY);\n                }\n                if (options.togglable) {\n                    element.addClass(TOGGLE_BUTTON);\n                    this.toggle(options.selected);\n                }\n                if (options.url !== undefined && !options.useButtonTag) {\n                    element.attr('href', options.url);\n                    if (options.mobile) {\n                        element.attr(kendo.attr('role'), 'button');\n                    }\n                }\n                if (options.group) {\n                    element.attr(kendo.attr('group'), options.group);\n                    this.group = this.toolbar.addToGroup(this, options.group);\n                }\n                if (!options.togglable && options.click && isFunction(options.click)) {\n                    this.clickHandler = options.click;\n                }\n                if (options.togglable && options.toggle && isFunction(options.toggle)) {\n                    this.toggleHandler = options.toggle;\n                }\n            },\n            toggle: function (state, propagate) {\n                state = !!state;\n                if (this.group && state) {\n                    this.group.select(this);\n                } else if (!this.group) {\n                    this.select(state);\n                }\n                if (propagate && this.twin()) {\n                    this.twin().toggle(state);\n                }\n            },\n            getParentGroup: function () {\n                if (this.options.isChild) {\n                    return this.element.closest('.' + BUTTON_GROUP).data('buttonGroup');\n                }\n            },\n            _addGraphics: function () {\n                var element = this.element, icon = this.options.icon, spriteCssClass = this.options.spriteCssClass, imageUrl = this.options.imageUrl, isEmpty, span, img;\n                if (spriteCssClass || imageUrl || icon) {\n                    isEmpty = true;\n                    element.contents().filter(function () {\n                        return !$(this).hasClass('k-sprite') && !$(this).hasClass(ICON) && !$(this).hasClass('k-image');\n                    }).each(function (idx, el) {\n                        if (el.nodeType == 1 || el.nodeType == 3 && $.trim(el.nodeValue).length > 0) {\n                            isEmpty = false;\n                        }\n                    });\n                    if (isEmpty) {\n                        element.addClass(BUTTON_ICON);\n                    } else {\n                        element.addClass(BUTTON_ICON_TEXT);\n                    }\n                }\n                if (icon) {\n                    span = element.children('span.' + ICON).first();\n                    if (!span[0]) {\n                        span = $('<span class=\"' + ICON + '\"></span>').prependTo(element);\n                    }\n                    span.addClass(ICON_PREFIX + icon);\n                } else if (spriteCssClass) {\n                    span = element.children('span.k-sprite').first();\n                    if (!span[0]) {\n                        span = $('<span class=\"k-sprite ' + ICON + '\"></span>').prependTo(element);\n                    }\n                    span.addClass(spriteCssClass);\n                } else if (imageUrl) {\n                    img = element.children('img.k-image').first();\n                    if (!img[0]) {\n                        img = $('<img alt=\"icon\" class=\"k-image\" />').prependTo(element);\n                    }\n                    img.attr('src', imageUrl);\n                }\n            }\n        });\n        kendo.toolbar.Button = Button;\n        var ToolBarButton = Button.extend({\n            init: function (options, toolbar) {\n                Button.fn.init.call(this, options, toolbar);\n                var element = this.element;\n                element.addClass(BUTTON);\n                this.addIdAttr();\n                if (options.align) {\n                    element.addClass('k-align-' + options.align);\n                }\n                if (options.showText != 'overflow' && options.text) {\n                    if (options.mobile) {\n                        element.html('<span class=\"km-text\">' + options.text + '</span>');\n                    } else {\n                        element.html(options.text);\n                    }\n                }\n                options.hasIcon = options.showIcon != 'overflow' && (options.icon || options.spriteCssClass || options.imageUrl);\n                if (options.hasIcon) {\n                    this._addGraphics();\n                }\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.enable(options.enable);\n                if (options.hidden) {\n                    this.hide();\n                }\n                this.element.data({\n                    type: 'button',\n                    button: this\n                });\n            },\n            select: function (selected) {\n                if (selected === undefined) {\n                    selected = false;\n                }\n                if (this.options.togglable) {\n                    this.element.attr(ARIA_PRESSED, selected);\n                }\n                this.element.toggleClass(STATE_ACTIVE, selected);\n                this.options.selected = selected;\n            }\n        });\n        kendo.toolbar.ToolBarButton = ToolBarButton;\n        var OverflowButton = Button.extend({\n            init: function (options, toolbar) {\n                this.overflow = true;\n                Button.fn.init.call(this, $.extend({}, options), toolbar);\n                var element = this.element;\n                if (options.showText != 'toolbar' && options.text) {\n                    if (options.mobile) {\n                        element.html('<span class=\"km-text\">' + options.text + '</span>');\n                    } else {\n                        element.html('<span class=\"k-text\">' + options.text + '</span>');\n                    }\n                }\n                options.hasIcon = options.showIcon != 'toolbar' && (options.icon || options.spriteCssClass || options.imageUrl);\n                if (options.hasIcon) {\n                    this._addGraphics();\n                }\n                if (!options.isChild) {\n                    this._wrap();\n                }\n                this.addOverflowIdAttr();\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.enable(options.enable);\n                element.addClass(OVERFLOW_BUTTON + ' ' + BUTTON);\n                if (options.hidden) {\n                    this.hide();\n                }\n                if (options.togglable) {\n                    this.toggle(options.selected);\n                }\n                this.element.data({\n                    type: 'button',\n                    button: this\n                });\n            },\n            _wrap: function () {\n                this.element = this.element.wrap('<li></li>').parent();\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            },\n            select: function (selected) {\n                if (selected === undefined) {\n                    selected = false;\n                }\n                if (this.options.isChild) {\n                    this.element.toggleClass(STATE_ACTIVE, selected);\n                } else {\n                    this.element.find('.k-button').toggleClass(STATE_ACTIVE, selected);\n                }\n                this.options.selected = selected;\n            }\n        });\n        kendo.toolbar.OverflowButton = OverflowButton;\n        kendo.toolbar.registerComponent('button', ToolBarButton, OverflowButton);\n        var ButtonGroup = Item.extend({\n            createButtons: function (buttonConstructor) {\n                var options = this.options;\n                var items = options.buttons || [];\n                var item;\n                for (var i = 0; i < items.length; i++) {\n                    if (!items[i].uid) {\n                        items[i].uid = kendo.guid();\n                    }\n                    item = new buttonConstructor($.extend({\n                        mobile: options.mobile,\n                        isChild: true,\n                        type: 'button'\n                    }, items[i]), this.toolbar);\n                    item.element.appendTo(this.element);\n                }\n            },\n            refresh: function () {\n                this.element.children().filter(':not(\\'.' + STATE_HIDDEN + '\\'):first').addClass(GROUP_START);\n                this.element.children().filter(':not(\\'.' + STATE_HIDDEN + '\\'):last').addClass(GROUP_END);\n            }\n        });\n        kendo.toolbar.ButtonGroup = ButtonGroup;\n        var ToolBarButtonGroup = ButtonGroup.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<div></div>');\n                this.options = options;\n                this.toolbar = toolbar;\n                this.addIdAttr();\n                if (options.align) {\n                    element.addClass('k-align-' + options.align);\n                }\n                this.createButtons(ToolBarButton);\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.refresh();\n                element.addClass(BUTTON_GROUP);\n                this.element.data({\n                    type: 'buttonGroup',\n                    buttonGroup: this\n                });\n            }\n        });\n        kendo.toolbar.ToolBarButtonGroup = ToolBarButtonGroup;\n        var OverflowButtonGroup = ButtonGroup.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<li></li>');\n                this.options = options;\n                this.toolbar = toolbar;\n                this.overflow = true;\n                this.addOverflowIdAttr();\n                this.createButtons(OverflowButton);\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.refresh();\n                element.addClass((options.mobile ? '' : BUTTON_GROUP) + ' k-overflow-group');\n                this.element.data({\n                    type: 'buttonGroup',\n                    buttonGroup: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.OverflowButtonGroup = OverflowButtonGroup;\n        kendo.toolbar.registerComponent('buttonGroup', ToolBarButtonGroup, OverflowButtonGroup);\n        var ToolBarSplitButton = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<div class=\"' + SPLIT_BUTTON + '\" tabindex=\"0\"></div>');\n                this.options = options;\n                this.toolbar = toolbar;\n                this.mainButton = new ToolBarButton($.extend({}, options, { hidden: false }), toolbar);\n                this.arrowButton = $('<a class=\"' + BUTTON + ' ' + SPLIT_BUTTON_ARROW + '\"><span class=\"' + (options.mobile ? 'km-icon km-arrowdown' : 'k-icon k-i-arrow-60-down') + '\"></span></a>');\n                this.popupElement = $('<ul class=\"' + LIST_CONTAINER + '\"></ul>');\n                this.mainButton.element.removeAttr('href tabindex').appendTo(element);\n                this.arrowButton.appendTo(element);\n                this.popupElement.appendTo(element);\n                if (options.align) {\n                    element.addClass('k-align-' + options.align);\n                }\n                if (!options.id) {\n                    options.id = options.uid;\n                }\n                element.attr('id', options.id + '_wrapper');\n                this.addOverflowAttr();\n                this.addUidAttr();\n                this.createMenuButtons();\n                this.createPopup();\n                this._navigatable();\n                this.mainButton.main = true;\n                this.enable(options.enable);\n                if (options.hidden) {\n                    this.hide();\n                }\n                element.data({\n                    type: 'splitButton',\n                    splitButton: this,\n                    kendoPopup: this.popup\n                });\n            },\n            _navigatable: function () {\n                var that = this;\n                that.popupElement.on('keydown' + ns, '.' + BUTTON, function (e) {\n                    var li = $(e.target).parent();\n                    e.preventDefault();\n                    if (e.keyCode === keys.ESC || e.keyCode === keys.TAB || e.altKey && e.keyCode === keys.UP) {\n                        that.toggle();\n                        that.focus();\n                    } else if (e.keyCode === keys.DOWN) {\n                        findFocusableSibling(li, 'next').focus();\n                    } else if (e.keyCode === keys.UP) {\n                        findFocusableSibling(li, 'prev').focus();\n                    } else if (e.keyCode === keys.SPACEBAR || e.keyCode === keys.ENTER) {\n                        that.toolbar.userEvents.trigger('tap', { target: $(e.target) });\n                    } else if (e.keyCode === keys.HOME) {\n                        li.parent().find(':kendoFocusable').first().focus();\n                    } else if (e.keyCode === keys.END) {\n                        li.parent().find(':kendoFocusable').last().focus();\n                    }\n                });\n            },\n            createMenuButtons: function () {\n                var options = this.options;\n                var items = options.menuButtons;\n                var item;\n                for (var i = 0; i < items.length; i++) {\n                    item = new ToolBarButton($.extend({\n                        mobile: options.mobile,\n                        type: 'button',\n                        click: options.click\n                    }, items[i]), this.toolbar);\n                    item.element.wrap('<li></li>').parent().appendTo(this.popupElement);\n                }\n            },\n            createPopup: function () {\n                var that = this;\n                var options = this.options;\n                var element = this.element;\n                this.popupElement.attr('id', options.id + OPTION_LIST_SUFFIX).attr(KENDO_UID_ATTR, options.rootUid);\n                if (options.mobile) {\n                    this.popupElement = actionSheetWrap(this.popupElement);\n                }\n                this.popup = this.popupElement.kendoPopup({\n                    appendTo: options.mobile ? $(options.mobile).children('.km-pane') : null,\n                    anchor: element,\n                    isRtl: this.toolbar._isRtl,\n                    copyAnchorStyles: false,\n                    animation: options.animation,\n                    open: function (e) {\n                        var isDefaultPrevented = that.toolbar.trigger(OPEN, { target: element });\n                        if (isDefaultPrevented) {\n                            e.preventDefault();\n                            return;\n                        }\n                        that.adjustPopupWidth(e.sender);\n                    },\n                    activate: function () {\n                        this.element.find(':kendoFocusable').first().focus();\n                    },\n                    close: function (e) {\n                        var isDefaultPrevented = that.toolbar.trigger(CLOSE, { target: element });\n                        if (isDefaultPrevented) {\n                            e.preventDefault();\n                        }\n                        element.focus();\n                    }\n                }).data('kendoPopup');\n                this.popup.element.on(CLICK + ns, 'a.k-button', preventClick);\n            },\n            adjustPopupWidth: function (popup) {\n                var anchor = popup.options.anchor, computedWidth = outerWidth(anchor), width;\n                kendo.wrap(popup.element).addClass('k-split-wrapper');\n                if (popup.element.css('box-sizing') !== 'border-box') {\n                    width = computedWidth - (outerWidth(popup.element) - popup.element.width());\n                } else {\n                    width = computedWidth;\n                }\n                popup.element.css({\n                    fontFamily: anchor.css('font-family'),\n                    'min-width': width\n                });\n            },\n            remove: function () {\n                this.popup.element.off(CLICK + ns, 'a.k-button');\n                this.popup.destroy();\n                this.element.remove();\n            },\n            toggle: function () {\n                if (this.options.enable || this.popup.visible()) {\n                    this.popup.toggle();\n                }\n            },\n            enable: function (isEnabled) {\n                if (isEnabled === undefined) {\n                    isEnabled = true;\n                }\n                this.mainButton.enable(isEnabled);\n                this.element.toggleClass(STATE_DISABLED, !isEnabled);\n                this.element.attr(ARIA_DISABLED, !isEnabled);\n                this.options.enable = isEnabled;\n            },\n            focus: function () {\n                this.element.focus();\n            },\n            hide: function () {\n                if (this.popup) {\n                    this.popup.close();\n                }\n                this.element.addClass(STATE_HIDDEN);\n                this.element.addClass('k-hidden');\n                this.options.hidden = true;\n            },\n            show: function () {\n                this.element.removeClass(STATE_HIDDEN);\n                this.element.removeClass('k-hidden');\n                this.options.hidden = false;\n            }\n        });\n        kendo.toolbar.ToolBarSplitButton = ToolBarSplitButton;\n        var OverflowSplitButton = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<li class=\"' + SPLIT_BUTTON + '\"></li>'), items = options.menuButtons, item, splitContainerId;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.overflow = true;\n                splitContainerId = (options.id || options.uid) + OPTION_LIST_SUFFIX;\n                this.mainButton = new OverflowButton($.extend({ isChild: true }, options));\n                this.mainButton.element.appendTo(element);\n                for (var i = 0; i < items.length; i++) {\n                    item = new OverflowButton($.extend({\n                        mobile: options.mobile,\n                        type: 'button',\n                        splitContainerId: splitContainerId,\n                        isChild: true\n                    }, items[i]), this.toolbar);\n                    item.element.appendTo(element);\n                }\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.mainButton.main = true;\n                element.data({\n                    type: 'splitButton',\n                    splitButton: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.OverflowSplitButton = OverflowSplitButton;\n        kendo.toolbar.registerComponent('splitButton', ToolBarSplitButton, OverflowSplitButton);\n        var ToolBarSeparator = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<div>&nbsp;</div>');\n                this.element = element;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.attributes();\n                this.addIdAttr();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                element.addClass(SEPARATOR);\n                element.data({\n                    type: 'separator',\n                    separator: this\n                });\n            }\n        });\n        var OverflowSeparator = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<li>&nbsp;</li>');\n                this.element = element;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.overflow = true;\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowIdAttr();\n                element.addClass(SEPARATOR);\n                element.data({\n                    type: 'separator',\n                    separator: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.registerComponent('separator', ToolBarSeparator, OverflowSeparator);\n        var ToolBarSpacer = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<div>&nbsp;</div>');\n                this.element = element;\n                this.options = options;\n                this.toolbar = toolbar;\n                element.addClass(SPACER_CLASS);\n                element.data({ type: SPACER });\n            }\n        });\n        kendo.toolbar.registerComponent(SPACER, ToolBarSpacer);\n        var TemplateItem = Item.extend({\n            init: function (template, options, toolbar) {\n                var element = isFunction(template) ? template(options) : template;\n                if (!(element instanceof jQuery)) {\n                    element = $('<div></div>').html(element);\n                } else {\n                    element = element.wrap('<div></div>').parent();\n                }\n                this.element = element;\n                this.options = options;\n                this.options.type = 'template';\n                this.toolbar = toolbar;\n                this.attributes();\n                this.addUidAttr();\n                this.addIdAttr();\n                this.addOverflowAttr();\n                element.data({\n                    type: 'template',\n                    template: this\n                });\n            }\n        });\n        kendo.toolbar.TemplateItem = TemplateItem;\n        var OverflowTemplateItem = Item.extend({\n            init: function (template, options, toolbar) {\n                var element = isFunction(template) ? $(template(options)) : $(template);\n                if (!(element instanceof jQuery)) {\n                    element = $('<li></li>').html(element);\n                } else {\n                    element = element.wrap('<li></li>').parent();\n                }\n                this.element = element;\n                this.options = options;\n                this.options.type = 'template';\n                this.toolbar = toolbar;\n                this.overflow = true;\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowIdAttr();\n                this.addOverflowAttr();\n                element.data({\n                    type: 'template',\n                    template: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.OverflowTemplateItem = OverflowTemplateItem;\n        function toggleActive(e) {\n            if (!e.target.is('.k-toggle-button')) {\n                e.target.toggleClass(STATE_ACTIVE, e.type == 'press');\n            }\n        }\n        function actionSheetWrap(element) {\n            element = $(element);\n            return element.hasClass('km-actionsheet') ? element.closest('.km-popup-wrapper') : element.addClass('km-widget km-actionsheet').wrap('<div class=\"km-actionsheet-wrapper km-actionsheet-tablet km-widget km-popup\"></div>').parent().wrap('<div class=\"km-popup-wrapper k-popup\"></div>').parent();\n        }\n        function preventClick(e) {\n            if ($(e.target).closest('a.k-button').length) {\n                e.preventDefault();\n            }\n        }\n        function findFocusableSibling(element, dir) {\n            var getSibling = dir === 'next' ? $.fn.next : $.fn.prev;\n            var getter = dir === 'next' ? $.fn.first : $.fn.last;\n            var candidate = getSibling.call(element);\n            if (!candidate.length && element.is('.' + OVERFLOW_ANCHOR)) {\n                return element;\n            }\n            if (candidate.is(':kendoFocusable') || !candidate.length) {\n                return candidate;\n            }\n            if (candidate.find(':kendoFocusable').length) {\n                return getter.call(candidate.find(':kendoFocusable'));\n            }\n            return findFocusableSibling(candidate, dir);\n        }\n        var Group = Class.extend({\n            init: function (name) {\n                this.name = name;\n                this.buttons = [];\n            },\n            add: function (button) {\n                this.buttons[this.buttons.length] = button;\n            },\n            remove: function (button) {\n                var index = $.inArray(button, this.buttons);\n                this.buttons.splice(index, 1);\n            },\n            select: function (button) {\n                var tmp;\n                for (var i = 0; i < this.buttons.length; i++) {\n                    tmp = this.buttons[i];\n                    tmp.select(false);\n                }\n                button.select(true);\n                if (button.twin()) {\n                    button.twin().select(true);\n                }\n            }\n        });\n        var ToolBar = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.wrapper = that.element;\n                element.addClass(TOOLBAR + ' k-widget');\n                this.uid = kendo.guid();\n                this._isRtl = kendo.support.isRtl(element);\n                this._groups = {};\n                element.attr(KENDO_UID_ATTR, this.uid);\n                that.isMobile = typeof options.mobile === 'boolean' ? options.mobile : that.element.closest('.km-root')[0];\n                that.animation = that.isMobile ? { open: { effects: 'fade' } } : {};\n                if (that.isMobile) {\n                    element.addClass('km-widget');\n                    ICON = 'km-icon';\n                    ICON_PREFIX = 'km-';\n                    BUTTON = 'km-button';\n                    BUTTON_GROUP = 'km-buttongroup';\n                    STATE_ACTIVE = 'km-state-active';\n                    STATE_DISABLED = 'km-state-disabled';\n                }\n                if (options.resizable) {\n                    that._renderOverflow();\n                    element.addClass(RESIZABLE_TOOLBAR);\n                    that.overflowUserEvents = new kendo.UserEvents(that.element, {\n                        threshold: 5,\n                        allowSelection: true,\n                        filter: '.' + OVERFLOW_ANCHOR,\n                        tap: proxy(that._toggleOverflow, that)\n                    });\n                    that._resizeHandler = kendo.onResize(function () {\n                        that.resize();\n                    });\n                } else {\n                    that.popup = { element: $([]) };\n                }\n                if (options.items && options.items.length) {\n                    for (var i = 0; i < options.items.length; i++) {\n                        that.add(options.items[i]);\n                    }\n                    if (options.resizable) {\n                        that._shrink(that.element.innerWidth());\n                    }\n                }\n                that.userEvents = new kendo.UserEvents(document, {\n                    threshold: 5,\n                    allowSelection: true,\n                    filter: '[' + KENDO_UID_ATTR + '=' + this.uid + '] a.' + BUTTON + ', ' + '[' + KENDO_UID_ATTR + '=' + this.uid + '] .' + OVERFLOW_BUTTON,\n                    tap: proxy(that._buttonClick, that),\n                    press: toggleActive,\n                    release: toggleActive\n                });\n                that.element.on(CLICK + ns, 'a.k-button', preventClick);\n                that._navigatable();\n                if (options.resizable) {\n                    that.popup.element.on(CLICK + ns, +'a.k-button', preventClick);\n                }\n                if (options.resizable) {\n                    this._toggleOverflowAnchor();\n                }\n                kendo.notify(that);\n            },\n            events: [\n                CLICK,\n                TOGGLE,\n                OPEN,\n                CLOSE,\n                OVERFLOW_OPEN,\n                OVERFLOW_CLOSE\n            ],\n            options: {\n                name: 'ToolBar',\n                items: [],\n                resizable: true,\n                mobile: null\n            },\n            addToGroup: function (button, groupName) {\n                var group;\n                if (!this._groups[groupName]) {\n                    group = this._groups[groupName] = new Group();\n                } else {\n                    group = this._groups[groupName];\n                }\n                group.add(button);\n                return group;\n            },\n            destroy: function () {\n                var that = this;\n                that.element.find('.' + SPLIT_BUTTON).each(function (idx, element) {\n                    $(element).data('kendoPopup').destroy();\n                });\n                that.element.off(ns, 'a.k-button');\n                that.userEvents.destroy();\n                if (that.options.resizable) {\n                    kendo.unbindResize(that._resizeHandler);\n                    that.overflowUserEvents.destroy();\n                    that.popup.element.off(ns, 'a.k-button');\n                    that.popup.destroy();\n                }\n                Widget.fn.destroy.call(that);\n            },\n            add: function (options) {\n                var component = components[options.type], template = options.template, tool, that = this, itemClasses = that.isMobile ? '' : 'k-item k-state-default', overflowTemplate = options.overflowTemplate, overflowTool;\n                $.extend(options, {\n                    uid: kendo.guid(),\n                    animation: that.animation,\n                    mobile: that.isMobile,\n                    rootUid: that.uid\n                });\n                if (options.menuButtons) {\n                    for (var i = 0; i < options.menuButtons.length; i++) {\n                        $.extend(options.menuButtons[i], { uid: kendo.guid() });\n                    }\n                }\n                if (template && !overflowTemplate || options.type === SPACER) {\n                    options.overflow = OVERFLOW_NEVER;\n                } else if (!options.overflow) {\n                    options.overflow = OVERFLOW_AUTO;\n                }\n                if (options.overflow !== OVERFLOW_NEVER && that.options.resizable) {\n                    if (overflowTemplate) {\n                        overflowTool = new OverflowTemplateItem(overflowTemplate, options, that);\n                    } else if (component) {\n                        overflowTool = new component.overflow(options, that);\n                        overflowTool.element.addClass(itemClasses);\n                    }\n                    if (overflowTool) {\n                        if (options.overflow === OVERFLOW_AUTO) {\n                            overflowTool.overflowHidden();\n                        }\n                        overflowTool.element.appendTo(that.popup.container);\n                        that.angular('compile', function () {\n                            return { elements: overflowTool.element.get() };\n                        });\n                    }\n                }\n                if (options.overflow !== OVERFLOW_ALWAYS) {\n                    if (template) {\n                        tool = new TemplateItem(template, options, that);\n                    } else if (component) {\n                        tool = new component.toolbar(options, that);\n                    }\n                    if (tool) {\n                        tool.element.appendTo(that.element);\n                        that.angular('compile', function () {\n                            return { elements: tool.element.get() };\n                        });\n                    }\n                }\n            },\n            _getItem: function (candidate) {\n                var element, toolbarItem, overflowItem, isResizable = this.options.resizable, type;\n                element = this.element.find(candidate);\n                if (!element.length) {\n                    element = $('.k-split-container[data-uid=' + this.uid + ']').find(candidate);\n                }\n                type = element.length ? element.data('type') : '';\n                toolbarItem = element.data(type);\n                if (toolbarItem) {\n                    if (toolbarItem.main) {\n                        element = element.parent('.' + SPLIT_BUTTON);\n                        type = 'splitButton';\n                        toolbarItem = element.data(type);\n                    }\n                    if (isResizable) {\n                        overflowItem = toolbarItem.twin();\n                    }\n                } else if (isResizable) {\n                    element = this.popup.element.find(candidate);\n                    type = element.length ? element.data('type') : '';\n                    overflowItem = element.data(type);\n                    if (overflowItem && overflowItem.main) {\n                        element = element.parent('.' + SPLIT_BUTTON);\n                        type = 'splitButton';\n                        overflowItem = element.data(type);\n                    }\n                }\n                return {\n                    type: type,\n                    toolbar: toolbarItem,\n                    overflow: overflowItem\n                };\n            },\n            remove: function (candidate) {\n                var item = this._getItem(candidate);\n                if (item.toolbar) {\n                    item.toolbar.remove();\n                }\n                if (item.overflow) {\n                    item.overflow.remove();\n                }\n                this.resize(true);\n            },\n            hide: function (candidate) {\n                var item = this._getItem(candidate);\n                var buttonGroupInstance;\n                if (item.toolbar) {\n                    if (item.toolbar.options.type === 'button' && item.toolbar.options.isChild) {\n                        buttonGroupInstance = item.toolbar.getParentGroup();\n                        item.toolbar.hide();\n                        if (buttonGroupInstance) {\n                            buttonGroupInstance.refresh();\n                        }\n                    } else if (!item.toolbar.options.hidden) {\n                        item.toolbar.hide();\n                    }\n                }\n                if (item.overflow) {\n                    if (item.overflow.options.type === 'button' && item.overflow.options.isChild) {\n                        buttonGroupInstance = item.overflow.getParentGroup();\n                        item.overflow.hide();\n                        if (buttonGroupInstance) {\n                            buttonGroupInstance.refresh();\n                        }\n                    } else if (!item.overflow.options.hidden) {\n                        item.overflow.hide();\n                    }\n                }\n                this.resize(true);\n            },\n            show: function (candidate) {\n                var item = this._getItem(candidate);\n                if (item.toolbar) {\n                    if (item.toolbar.options.type === 'button' && item.toolbar.options.isChild) {\n                        item.toolbar.show();\n                        item.toolbar.getParentGroup().refresh();\n                    } else if (item.toolbar.options.hidden) {\n                        item.toolbar.show();\n                    }\n                }\n                if (item.overflow) {\n                    if (item.overflow.options.type === 'button' && item.overflow.options.isChild) {\n                        item.toolbar.show();\n                        item.overflow.getParentGroup().refresh();\n                    } else if (item.overflow.options.hidden) {\n                        item.overflow.show();\n                    }\n                }\n                this.resize(true);\n            },\n            enable: function (element, enable) {\n                var item = this._getItem(element);\n                if (typeof enable == 'undefined') {\n                    enable = true;\n                }\n                if (item.toolbar) {\n                    item.toolbar.enable(enable);\n                }\n                if (item.overflow) {\n                    item.overflow.enable(enable);\n                }\n            },\n            getSelectedFromGroup: function (groupName) {\n                return this.element.find('.' + TOGGLE_BUTTON + '[data-group=\\'' + groupName + '\\']').filter('.' + STATE_ACTIVE);\n            },\n            toggle: function (button, checked) {\n                var element = $(button), item = element.data('button');\n                if (item.options.togglable) {\n                    if (checked === undefined) {\n                        checked = true;\n                    }\n                    item.toggle(checked, true);\n                }\n            },\n            _renderOverflow: function () {\n                var that = this, overflowContainer = components.overflowContainer, isRtl = that._isRtl, horizontalDirection = isRtl ? 'left' : 'right';\n                that.overflowAnchor = $(components.overflowAnchor).addClass(BUTTON);\n                that.element.append(that.overflowAnchor);\n                if (that.isMobile) {\n                    that.overflowAnchor.append('<span class=\"km-icon km-more\"></span>');\n                    overflowContainer = actionSheetWrap(overflowContainer);\n                } else {\n                    that.overflowAnchor.append('<span class=\"k-icon k-i-more-vertical\"></span>');\n                }\n                that.popup = new kendo.ui.Popup(overflowContainer, {\n                    origin: 'bottom ' + horizontalDirection,\n                    position: 'top ' + horizontalDirection,\n                    anchor: that.overflowAnchor,\n                    isRtl: isRtl,\n                    animation: that.animation,\n                    appendTo: that.isMobile ? $(that.isMobile).children('.km-pane') : null,\n                    copyAnchorStyles: false,\n                    open: function (e) {\n                        var wrapper = kendo.wrap(that.popup.element).addClass('k-overflow-wrapper');\n                        if (!that.isMobile) {\n                            wrapper.css('margin-left', (isRtl ? -1 : 1) * ((outerWidth(wrapper) - wrapper.width()) / 2 + 1));\n                        } else {\n                            that.popup.container.css('max-height', parseFloat($('.km-content:visible').innerHeight()) - 15 + 'px');\n                        }\n                        if (that.trigger(OVERFLOW_OPEN)) {\n                            e.preventDefault();\n                        }\n                    },\n                    activate: function () {\n                        this.element.find(':kendoFocusable').first().focus();\n                    },\n                    close: function (e) {\n                        if (that.trigger(OVERFLOW_CLOSE)) {\n                            e.preventDefault();\n                        }\n                        this.element.focus();\n                    }\n                });\n                that.popup.element.on('keydown' + ns, '.' + BUTTON, function (e) {\n                    var target = $(e.target), li = target.parent(), isComplexTool = li.is('.' + BUTTON_GROUP) || li.is('.' + SPLIT_BUTTON), element;\n                    e.preventDefault();\n                    if (e.keyCode === keys.ESC || e.keyCode === keys.TAB || e.altKey && e.keyCode === keys.UP) {\n                        that._toggleOverflow();\n                        that.overflowAnchor.focus();\n                    } else if (e.keyCode === keys.DOWN) {\n                        element = !isComplexTool || isComplexTool && target.is(':last-child') ? li : target;\n                        findFocusableSibling(element, 'next').focus();\n                    } else if (e.keyCode === keys.UP) {\n                        element = !isComplexTool || isComplexTool && target.is(':first-child') ? li : target;\n                        findFocusableSibling(element, 'prev').focus();\n                    } else if (e.keyCode === keys.SPACEBAR || e.keyCode === keys.ENTER) {\n                        that.userEvents.trigger('tap', { target: $(e.target) });\n                        that.overflowAnchor.focus();\n                    } else if (e.keyCode === keys.HOME) {\n                        li.parent().find(':kendoFocusable').first().focus();\n                    } else if (e.keyCode === keys.END) {\n                        li.parent().find(':kendoFocusable').last().focus();\n                    }\n                });\n                if (that.isMobile) {\n                    that.popup.container = that.popup.element.find('.' + OVERFLOW_CONTAINER);\n                } else {\n                    that.popup.container = that.popup.element;\n                }\n                that.popup.container.attr(KENDO_UID_ATTR, this.uid);\n            },\n            _toggleOverflowAnchor: function () {\n                var hasVisibleChildren = false;\n                var paddingEnd = this._isRtl ? 'padding-left' : 'padding-right';\n                if (this.options.mobile) {\n                    hasVisibleChildren = this.popup.element.find('.' + OVERFLOW_CONTAINER).children(':not(.' + OVERFLOW_HIDDEN + ', .' + POPUP + ')').length > 0;\n                } else {\n                    hasVisibleChildren = this.popup.element.children(':not(.' + OVERFLOW_HIDDEN + ', .' + POPUP + ')').length > 0;\n                }\n                if (hasVisibleChildren) {\n                    this.overflowAnchor.css({\n                        visibility: 'visible',\n                        width: ''\n                    });\n                    this.wrapper.css(paddingEnd, this.overflowAnchor.outerWidth(true));\n                } else {\n                    this.overflowAnchor.css({\n                        visibility: 'hidden',\n                        width: '1px'\n                    });\n                    this.wrapper.css(paddingEnd, '');\n                }\n            },\n            _buttonClick: function (e) {\n                var that = this, popup, target, item, splitContainer, isSplitButtonArrow = e.target.closest('.' + SPLIT_BUTTON_ARROW).length, handler, eventData, urlTarget;\n                e.preventDefault();\n                if (isSplitButtonArrow) {\n                    that._toggle(e);\n                    return;\n                }\n                target = $(e.target).closest('.' + BUTTON, that.element);\n                if (target.hasClass(OVERFLOW_ANCHOR)) {\n                    return;\n                }\n                item = target.data('button');\n                if (!item && that.popup) {\n                    target = $(e.target).closest('.' + OVERFLOW_BUTTON, that.popup.container);\n                    item = target.parent('li').data('button');\n                }\n                if (!item || !item.options.enable) {\n                    return;\n                }\n                if (item.options.togglable) {\n                    handler = isFunction(item.toggleHandler) ? item.toggleHandler : null;\n                    item.toggle(!item.options.selected, true);\n                    eventData = {\n                        target: target,\n                        group: item.options.group,\n                        checked: item.options.selected,\n                        id: item.options.id,\n                        item: item\n                    };\n                    if (handler) {\n                        handler.call(that, eventData);\n                    }\n                    that.trigger(TOGGLE, eventData);\n                } else {\n                    handler = isFunction(item.clickHandler) ? item.clickHandler : null;\n                    eventData = {\n                        sender: that,\n                        target: target,\n                        id: item.options.id,\n                        item: item\n                    };\n                    if (handler) {\n                        handler.call(that, eventData);\n                    }\n                    that.trigger(CLICK, eventData);\n                }\n                if (item.options.url) {\n                    if (item.options.attributes && item.options.attributes.target) {\n                        urlTarget = item.options.attributes.target;\n                    }\n                    window.open(item.options.url, urlTarget || '_self');\n                }\n                if (target.hasClass(OVERFLOW_BUTTON)) {\n                    that.popup.close();\n                }\n                splitContainer = target.closest('.k-split-container');\n                if (splitContainer[0]) {\n                    popup = splitContainer.data('kendoPopup');\n                    (popup ? popup : splitContainer.parents('.km-popup-wrapper').data('kendoPopup')).close();\n                }\n            },\n            _navigatable: function () {\n                var that = this;\n                that.element.attr('tabindex', 0).on('focusin' + ns, function (ev) {\n                    var target = $(ev.target);\n                    var element = $(this).find(':kendoFocusable:first');\n                    if (!target.is('.' + TOOLBAR) || element.length === 0) {\n                        return;\n                    }\n                    if (element.is('.' + OVERFLOW_ANCHOR)) {\n                        element = findFocusableSibling(element, 'next');\n                    }\n                    if (element.length) {\n                        element[0].focus();\n                    }\n                }).on('keydown' + ns, proxy(that._keydown, that));\n            },\n            _keydown: function (e) {\n                var target = $(e.target), keyCode = e.keyCode, items = this.element.children(':not(.k-separator):visible'), direction = this._isRtl ? -1 : 1;\n                if (keyCode === keys.TAB) {\n                    var element = target.parentsUntil(this.element).last(), lastHasFocus = false, firstHasFocus = false, isOnlyOverflowAnchor = false;\n                    if (!items.not('.' + OVERFLOW_ANCHOR).length) {\n                        isOnlyOverflowAnchor = true;\n                    }\n                    if (!element.length) {\n                        element = target;\n                    }\n                    if (element.is('.' + OVERFLOW_ANCHOR) && !isOnlyOverflowAnchor) {\n                        var lastItemNotOverflowAnchor = items.last();\n                        if (e.shiftKey) {\n                            e.preventDefault();\n                        }\n                        if (lastItemNotOverflowAnchor.is(':kendoFocusable')) {\n                            items.last().focus();\n                        } else {\n                            items.last().find(':kendoFocusable').last().focus();\n                        }\n                    }\n                    if (!e.shiftKey && items.index(element) === items.length - 1) {\n                        if (element.is('.' + BUTTON_GROUP)) {\n                            lastHasFocus = target.is(':last-child');\n                        } else {\n                            lastHasFocus = true;\n                        }\n                    }\n                    var isFirstTool = items.index(element) === items.not('.k-overflow-anchor').first().index();\n                    if (e.shiftKey && isFirstTool) {\n                        if (element.is('.' + BUTTON_GROUP)) {\n                            firstHasFocus = target.is(':first-child');\n                        } else {\n                            firstHasFocus = true;\n                        }\n                    }\n                    if (lastHasFocus && this.overflowAnchor && this.overflowAnchor.css('visibility') !== 'hidden' && !isOnlyOverflowAnchor) {\n                        e.preventDefault();\n                        this.overflowAnchor.focus();\n                    }\n                    if (firstHasFocus || isOnlyOverflowAnchor && e.shiftKey) {\n                        e.preventDefault();\n                        var prevFocusable = this._getPrevFocusable(this.wrapper);\n                        if (prevFocusable) {\n                            prevFocusable.focus();\n                        }\n                    }\n                    this._preventNextFocus = false;\n                }\n                if (e.altKey && keyCode === keys.DOWN) {\n                    var splitButton = $(document.activeElement).data('splitButton');\n                    var isOverflowAnchor = $(document.activeElement).is('.' + OVERFLOW_ANCHOR);\n                    if (splitButton) {\n                        splitButton.toggle();\n                    } else if (isOverflowAnchor) {\n                        this._toggleOverflow();\n                    }\n                    return;\n                }\n                if ((keyCode === keys.SPACEBAR || keyCode === keys.ENTER) && !target.is('input, checkbox')) {\n                    if (keyCode === keys.SPACEBAR) {\n                        e.preventDefault();\n                    }\n                    if (target.is('.' + SPLIT_BUTTON)) {\n                        target = target.children().first();\n                        this.userEvents.trigger('tap', { target: target });\n                    } else if (keyCode === keys.SPACEBAR) {\n                        this.userEvents.trigger('tap', { target: target });\n                    }\n                    return;\n                }\n                if (keyCode === keys.HOME) {\n                    if (target.is('.k-dropdown') || target.is('input')) {\n                        return;\n                    }\n                    if (this.overflowAnchor) {\n                        items.eq(1).focus();\n                    } else {\n                        items.first().focus();\n                    }\n                    e.preventDefault();\n                } else if (keyCode === keys.END) {\n                    if (target.is('.k-dropdown') || target.is('input')) {\n                        return;\n                    }\n                    if (this.overflowAnchor && $(this.overflowAnchor).css('visibility') != 'hidden') {\n                        this.overflowAnchor.focus();\n                    } else {\n                        items.last().focus();\n                    }\n                    e.preventDefault();\n                } else if (keyCode === keys.RIGHT && !this._preventNextFocus && !target.is('input, select, .k-dropdown, .k-colorpicker') && this._getNextElement(e.target, 1 * direction)) {\n                    this._getNextElement(e.target, 1 * direction).focus();\n                    e.preventDefault();\n                } else if (keyCode === keys.LEFT && !this._preventNextFocus && !target.is('input, select, .k-dropdown, .k-colorpicker') && this._getNextElement(e.target, -1 * direction)) {\n                    this._getNextElement(e.target, -1 * direction).focus();\n                    e.preventDefault();\n                }\n            },\n            _getNextElement: function (item, direction) {\n                var items = this.element.children(':not(.k-separator):visible');\n                var itemIndex = items.index(item) === -1 ? items.index(item.parentElement) : items.index(item);\n                var startIndex = this.overflowAnchor ? 1 : 0;\n                var directionNumber = direction;\n                var searchIndex = direction === 1 ? items.length - 1 : startIndex;\n                var index = direction === 1 ? startIndex : items.length - 1;\n                var focusableItem = items[itemIndex + direction];\n                this._preventNextFocus = false;\n                if ($(item).closest('.' + BUTTON_GROUP).length && !$(item).is(direction === 1 ? ':last-child' : ':first-child')) {\n                    return $(item).closest('.' + BUTTON_GROUP).children()[$(item).closest('.' + BUTTON_GROUP).children().index(item) + direction];\n                }\n                if (this.overflowAnchor && item === this.overflowAnchor[0] && direction === -1) {\n                    focusableItem = items[items.length - 1];\n                }\n                if (itemIndex === searchIndex) {\n                    focusableItem = !this.overflowAnchor || this.overflowAnchor && $(this.overflowAnchor).css('visibility') === 'hidden' ? items[index] : this.overflowAnchor;\n                }\n                while (!$(focusableItem).is(':kendoFocusable')) {\n                    if (direction === -1 && $(focusableItem).closest('.' + BUTTON_GROUP).length) {\n                        focusableItem = $(focusableItem).children(':not(label, div)').last();\n                    } else {\n                        focusableItem = $(focusableItem).children(':not(label, div)').first();\n                    }\n                    if (!focusableItem.length) {\n                        directionNumber = directionNumber + direction;\n                        focusableItem = items[itemIndex + directionNumber];\n                        if (!focusableItem) {\n                            return this.overflowAnchor;\n                        }\n                    }\n                    this._preventNextFocus = $(focusableItem).closest('.' + BUTTON_GROUP).length ? false : true;\n                }\n                return focusableItem;\n            },\n            _getPrevFocusable: function (element) {\n                if (element.is('html')) {\n                    return element;\n                }\n                var elementToFocus, prevElement, prevElements = element.prevAll();\n                prevElements.each(function () {\n                    prevElement = $(this);\n                    if (prevElement.is(':kendoFocusable')) {\n                        elementToFocus = prevElement;\n                        return false;\n                    } else if (prevElement.find(':kendoFocusable').length > 0) {\n                        elementToFocus = prevElement.find(':kendoFocusable').last();\n                        return false;\n                    }\n                });\n                if (elementToFocus) {\n                    return elementToFocus;\n                } else {\n                    return this._getPrevFocusable(element.parent());\n                }\n            },\n            _toggle: function (e) {\n                var splitButton = $(e.target).closest('.' + SPLIT_BUTTON).data('splitButton');\n                e.preventDefault();\n                if (!splitButton.options.enable) {\n                    return;\n                }\n                splitButton.toggle();\n            },\n            _toggleOverflow: function () {\n                this.popup.toggle();\n            },\n            _resize: function (e) {\n                var containerWidth = e.width;\n                if (!this.options.resizable) {\n                    return;\n                }\n                this.popup.close();\n                this._shrink(containerWidth);\n                this._stretch(containerWidth);\n                this._markVisibles();\n                this._toggleOverflowAnchor();\n            },\n            _childrenWidth: function () {\n                var childrenWidth = 0;\n                this.element.children(':visible:not(.' + STATE_HIDDEN + ', .' + SPACER_CLASS + ')').each(function () {\n                    childrenWidth += outerWidth($(this), true);\n                });\n                return Math.ceil(childrenWidth);\n            },\n            _shrink: function (containerWidth) {\n                var commandElement, visibleCommands;\n                if (containerWidth < this._childrenWidth()) {\n                    visibleCommands = this.element.children(':visible:not([data-overflow=\\'never\\'], .' + OVERFLOW_ANCHOR + ')');\n                    for (var i = visibleCommands.length - 1; i >= 0; i--) {\n                        commandElement = visibleCommands.eq(i);\n                        if (containerWidth > this._childrenWidth()) {\n                            break;\n                        } else {\n                            this._hideItem(commandElement);\n                        }\n                    }\n                }\n            },\n            _stretch: function (containerWidth) {\n                var commandElement, hiddenCommands;\n                if (containerWidth > this._childrenWidth()) {\n                    hiddenCommands = this.element.children(':hidden:not(\\'.' + STATE_HIDDEN + '\\')');\n                    for (var i = 0; i < hiddenCommands.length; i++) {\n                        commandElement = hiddenCommands.eq(i);\n                        if (containerWidth < this._childrenWidth() || !this._showItem(commandElement, containerWidth)) {\n                            break;\n                        }\n                    }\n                }\n            },\n            _hideItem: function (item) {\n                item.addClass('k-hidden');\n                if (this.popup) {\n                    this.popup.container.find('>li[data-uid=\\'' + item.data('uid') + '\\']').removeClass(OVERFLOW_HIDDEN);\n                }\n            },\n            _showItem: function (item, containerWidth) {\n                item.removeClass('k-hidden');\n                var itemOuterWidth = outerWidth(item, true);\n                item.addClass('k-hidden');\n                if (item.length && containerWidth > this._childrenWidth() + itemOuterWidth) {\n                    item.removeClass('k-hidden');\n                    if (this.popup) {\n                        this.popup.container.find('>li[data-uid=\\'' + item.data('uid') + '\\']').addClass(OVERFLOW_HIDDEN);\n                    }\n                    return true;\n                }\n                return false;\n            },\n            _markVisibles: function () {\n                var overflowItems = this.popup.container.children(), toolbarItems = this.element.children(':not(.k-overflow-anchor)'), visibleOverflowItems = overflowItems.filter(':not(.k-overflow-hidden)'), visibleToolbarItems = toolbarItems.filter(':visible');\n                overflowItems.add(toolbarItems).removeClass(FIRST_TOOLBAR_VISIBLE + ' ' + LAST_TOOLBAR_VISIBLE);\n                visibleOverflowItems.first().add(visibleToolbarItems.first()).addClass(FIRST_TOOLBAR_VISIBLE);\n                visibleOverflowItems.last().add(visibleToolbarItems.last()).addClass(LAST_TOOLBAR_VISIBLE);\n            }\n        });\n        kendo.ui.plugin(ToolBar);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.list', [\n        'kendo.data',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'list',\n        name: 'List',\n        category: 'framework',\n        depends: [\n            'data',\n            'popup'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, outerHeight = kendo._outerHeight, percentageUnitsRegex = /^\\d+(\\.\\d+)?%$/i, Widget = ui.Widget, keys = kendo.keys, support = kendo.support, htmlEncode = kendo.htmlEncode, activeElement = kendo._activeElement, outerWidth = kendo._outerWidth, ObservableArray = kendo.data.ObservableArray, ID = 'id', CHANGE = 'change', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', LOADING = 'k-i-loading', GROUPHEADER = '.k-group-header', ITEMSELECTOR = '.k-item', LABELIDPART = '_label', OPEN = 'open', CLOSE = 'close', CASCADE = 'cascade', SELECT = 'select', SELECTED = 'selected', REQUESTSTART = 'requestStart', REQUESTEND = 'requestEnd', BLUR = 'blur', FOCUS = 'focus', FOCUSOUT = 'focusout', extend = $.extend, proxy = $.proxy, isArray = $.isArray, browser = support.browser, HIDDENCLASS = 'k-hidden', WIDTH = 'width', isIE = browser.msie, isIE8 = isIE && browser.version < 9, quotRegExp = /\"/g, alternativeNames = {\n                'ComboBox': [\n                    'DropDownList',\n                    'MultiColumnComboBox'\n                ],\n                'DropDownList': [\n                    'ComboBox',\n                    'MultiColumnComboBox'\n                ],\n                'MultiColumnComboBox': [\n                    'ComboBox',\n                    'DropDownList'\n                ]\n            };\n        var List = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this, ns = that.ns, id;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                that._isSelect = element.is(SELECT);\n                if (that._isSelect && that.element[0].length) {\n                    if (!options.dataSource) {\n                        options.dataTextField = options.dataTextField || 'text';\n                        options.dataValueField = options.dataValueField || 'value';\n                    }\n                }\n                that.ul = $('<ul unselectable=\"on\" class=\"k-list k-reset\"/>').attr({\n                    tabIndex: -1,\n                    'aria-hidden': true\n                });\n                that.list = $('<div class=\\'k-list-container\\'/>').append(that.ul).on('mousedown' + ns, proxy(that._listMousedown, that));\n                id = element.attr(ID);\n                if (!id) {\n                    id = kendo.guid();\n                }\n                that.list.attr(ID, id + '-list');\n                that.ul.attr(ID, id + '_listbox');\n                if (options.columns && options.columns.length) {\n                    that.ul.removeClass('k-list').addClass('k-grid-list');\n                    that._columnsHeader();\n                }\n                that._header();\n                that._noData();\n                that._footer();\n                that._accessors();\n                that._initValue();\n            },\n            options: {\n                valuePrimitive: false,\n                footerTemplate: '',\n                headerTemplate: '',\n                noDataTemplate: true,\n                messages: {\n                    'noData': 'No data found.',\n                    'clear': 'clear'\n                }\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                if (options && options.enable !== undefined) {\n                    options.enabled = options.enable;\n                }\n                if (options.columns && options.columns.length) {\n                    this._columnsHeader();\n                }\n                this._header();\n                this._noData();\n                this._footer();\n                this._renderFooter();\n                this._renderNoData();\n            },\n            focus: function () {\n                this._focused.focus();\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            _header: function () {\n                var list = this;\n                var header = $(list.header);\n                var template = list.options.headerTemplate;\n                this._angularElement(header, 'cleanup');\n                kendo.destroy(header);\n                header.remove();\n                if (!template) {\n                    list.header = null;\n                    return;\n                }\n                var headerTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n                header = $(headerTemplate({}));\n                list.header = header[0] ? header : null;\n                list.list.prepend(header);\n                this._angularElement(list.header, 'compile');\n            },\n            _columnsHeader: function () {\n                var list = this;\n                var columnsHeader = $(list.columnsHeader);\n                this._angularElement(columnsHeader, 'cleanup');\n                kendo.destroy(columnsHeader);\n                columnsHeader.remove();\n                var header = '<div class=\\'k-grid-header\\'><div class=\\'k-grid-header-wrap\\'><table role=\\'presentation\\'>';\n                var colGroup = '<colgroup>';\n                var row = '<tr>';\n                for (var idx = 0; idx < this.options.columns.length; idx++) {\n                    var currentColumn = this.options.columns[idx];\n                    var title = currentColumn.title || currentColumn.field || '';\n                    var template = currentColumn.headerTemplate || title;\n                    var columnsHeaderTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n                    var currentWidth = currentColumn.width;\n                    var currentWidthInt = parseInt(currentWidth, 10);\n                    var widthStyle = '';\n                    if (currentWidth && !isNaN(currentWidthInt)) {\n                        widthStyle += 'style=\\'width:';\n                        widthStyle += currentWidthInt;\n                        widthStyle += percentageUnitsRegex.test(currentWidth) ? '%' : 'px';\n                        widthStyle += ';\\'';\n                    }\n                    colGroup += '<col ' + widthStyle + '/>';\n                    row += '<th class=\\'k-header\\'>';\n                    row += columnsHeaderTemplate(currentColumn);\n                    row += '</th>';\n                }\n                colGroup += '</colgroup>';\n                row += '</tr>';\n                header += colGroup;\n                header += row;\n                header += '</table></div></div>';\n                list.columnsHeader = columnsHeader = $(header);\n                list.list.prepend(columnsHeader);\n                this._angularElement(list.columnsHeader, 'compile');\n            },\n            _noData: function () {\n                var list = this;\n                var noData = $(list.noData);\n                var template = list.options.noDataTemplate === true ? list.options.messages.noData : list.options.noDataTemplate;\n                list.angular('cleanup', function () {\n                    return { elements: noData };\n                });\n                kendo.destroy(noData);\n                noData.remove();\n                if (!template) {\n                    list.noData = null;\n                    return;\n                }\n                list.noData = $('<div class=\"k-nodata\" style=\"display:none\"><div></div></div>').appendTo(list.list);\n                list.noDataTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n            },\n            _footer: function () {\n                var list = this;\n                var footer = $(list.footer);\n                var template = list.options.footerTemplate;\n                this._angularElement(footer, 'cleanup');\n                kendo.destroy(footer);\n                footer.remove();\n                if (!template) {\n                    list.footer = null;\n                    return;\n                }\n                list.footer = $('<div class=\"k-footer\"></div>').appendTo(list.list);\n                list.footerTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n            },\n            _listOptions: function (options) {\n                var that = this;\n                var currentOptions = that.options;\n                var virtual = currentOptions.virtual;\n                var changeEventOption = { change: proxy(that._listChange, that) };\n                var listBoundHandler = proxy(that._listBound, that);\n                virtual = typeof virtual === 'object' ? virtual : {};\n                options = $.extend({\n                    autoBind: false,\n                    selectable: true,\n                    dataSource: that.dataSource,\n                    click: proxy(that._click, that),\n                    activate: proxy(that._activateItem, that),\n                    columns: currentOptions.columns,\n                    deactivate: proxy(that._deactivateItem, that),\n                    dataBinding: function () {\n                        that.trigger('dataBinding');\n                    },\n                    dataBound: listBoundHandler,\n                    height: currentOptions.height,\n                    dataValueField: currentOptions.dataValueField,\n                    dataTextField: currentOptions.dataTextField,\n                    groupTemplate: currentOptions.groupTemplate,\n                    fixedGroupTemplate: currentOptions.fixedGroupTemplate,\n                    template: currentOptions.template\n                }, options, virtual, changeEventOption);\n                if (!options.template) {\n                    options.template = '#:' + kendo.expr(options.dataTextField, 'data') + '#';\n                }\n                if (currentOptions.$angular) {\n                    options.$angular = currentOptions.$angular;\n                }\n                return options;\n            },\n            _initList: function () {\n                var that = this;\n                var listOptions = that._listOptions({ selectedItemChange: proxy(that._listChange, that) });\n                if (!that.options.virtual) {\n                    that.listView = new kendo.ui.StaticList(that.ul, listOptions);\n                } else {\n                    that.listView = new kendo.ui.VirtualList(that.ul, listOptions);\n                }\n                that.listView.bind('listBound', proxy(that._listBound, that));\n                that._setListValue();\n            },\n            _setListValue: function (value) {\n                value = value || this.options.value;\n                if (value !== undefined) {\n                    this.listView.value(value).done(proxy(this._updateSelectionState, this));\n                }\n            },\n            _updateSelectionState: $.noop,\n            _listMousedown: function (e) {\n                if (!this.filterInput || this.filterInput[0] !== e.target) {\n                    e.preventDefault();\n                }\n            },\n            _isFilterEnabled: function () {\n                var filter = this.options.filter;\n                return filter && filter !== 'none';\n            },\n            _hideClear: function () {\n                var list = this;\n                if (list._clear) {\n                    list._clear.addClass(HIDDENCLASS);\n                }\n            },\n            _showClear: function () {\n                if (this._clear) {\n                    this._clear.removeClass(HIDDENCLASS);\n                }\n            },\n            _clearValue: function () {\n                this._clearText();\n                this._accessor('');\n                this.listView.value([]);\n                if (this._isSelect) {\n                    this._customOption = undefined;\n                }\n                if (this._isFilterEnabled() && !this.options.enforceMinLength) {\n                    this._filter({\n                        word: '',\n                        open: false\n                    });\n                    if (this.options.highlightFirst) {\n                        this.listView.focus(0);\n                    }\n                }\n                this._change();\n            },\n            _clearText: function () {\n                this.text('');\n            },\n            _clearFilter: function () {\n                if (!this.options.virtual) {\n                    this.listView.bound(false);\n                }\n                this._filterSource();\n            },\n            _filterSource: function (filter, force) {\n                var that = this;\n                var options = that.options;\n                var isMultiColumnFiltering = options.filterFields && filter && filter.logic && filter.filters && filter.filters.length;\n                var dataSource = that.dataSource;\n                var expression = extend({}, dataSource.filter() || {});\n                var resetPageSettings = filter || expression.filters && expression.filters.length && !filter;\n                var removed = removeFiltersForField(expression, options.dataTextField);\n                this._clearFilterExpressions(expression);\n                if ((filter || removed) && that.trigger('filtering', { filter: filter })) {\n                    return;\n                }\n                var newExpression = {\n                    filters: [],\n                    logic: 'and'\n                };\n                if (isMultiColumnFiltering) {\n                    newExpression.filters.push(filter);\n                } else {\n                    this._pushFilterExpression(newExpression, filter);\n                }\n                if (isValidFilterExpr(expression)) {\n                    if (newExpression.logic === expression.logic) {\n                        newExpression.filters = newExpression.filters.concat(expression.filters);\n                    } else {\n                        newExpression.filters.push(expression);\n                    }\n                }\n                if (that._cascading) {\n                    this.listView.setDSFilter(newExpression);\n                }\n                var dataSourceState = extend({}, {\n                    page: resetPageSettings ? 1 : dataSource.page(),\n                    pageSize: resetPageSettings ? dataSource.options.pageSize : dataSource.pageSize(),\n                    sort: dataSource.sort(),\n                    filter: dataSource.filter(),\n                    group: dataSource.group(),\n                    aggregate: dataSource.aggregate()\n                }, { filter: newExpression });\n                return dataSource[force ? 'read' : 'query'](dataSource._mergeState(dataSourceState));\n            },\n            _pushFilterExpression: function (newExpression, filter) {\n                if (isValidFilterExpr(filter) && filter.value !== '') {\n                    newExpression.filters.push(filter);\n                }\n            },\n            _clearFilterExpressions: function (expression) {\n                if (!expression.filters) {\n                    return;\n                }\n                var filtersToRemove;\n                for (var i = 0; i < expression.filters.length; i++) {\n                    if ('fromFilter' in expression.filters[i]) {\n                        filtersToRemove = i;\n                    }\n                }\n                if (!isNaN(filtersToRemove)) {\n                    expression.filters.splice(filtersToRemove, 1);\n                }\n            },\n            _angularElement: function (element, action) {\n                if (!element) {\n                    return;\n                }\n                this.angular(action, function () {\n                    return { elements: element };\n                });\n            },\n            _renderNoData: function () {\n                var list = this;\n                var noData = list.noData;\n                if (!noData) {\n                    return;\n                }\n                this._angularElement(noData, 'cleanup');\n                noData.children(':first').html(list.noDataTemplate({ instance: list }));\n                this._angularElement(noData, 'compile');\n            },\n            _toggleNoData: function (show) {\n                $(this.noData).toggle(show);\n            },\n            _toggleHeader: function (show) {\n                var groupHeader = this.listView.content.prev(GROUPHEADER);\n                groupHeader.toggle(show);\n            },\n            _renderFooter: function () {\n                var list = this;\n                var footer = list.footer;\n                if (!footer) {\n                    return;\n                }\n                this._angularElement(footer, 'cleanup');\n                footer.html(list.footerTemplate({ instance: list }));\n                this._angularElement(footer, 'compile');\n            },\n            _allowOpening: function () {\n                return this.options.noDataTemplate || this.dataSource.flatView().length;\n            },\n            _initValue: function () {\n                var that = this, value = that.options.value;\n                if (value !== null) {\n                    that.element.val(value);\n                } else {\n                    value = that._accessor();\n                    that.options.value = value;\n                }\n                that._old = value;\n            },\n            _ignoreCase: function () {\n                var that = this, model = that.dataSource.reader.model, field;\n                if (model && model.fields) {\n                    field = model.fields[that.options.dataTextField];\n                    if (field && field.type && field.type !== 'string') {\n                        that.options.ignoreCase = false;\n                    }\n                }\n            },\n            _focus: function (candidate) {\n                return this.listView.focus(candidate);\n            },\n            _filter: function (options) {\n                var that = this;\n                var widgetOptions = that.options;\n                var word = options.word;\n                var filterFields = widgetOptions.filterFields;\n                var field = widgetOptions.dataTextField;\n                var expression;\n                if (filterFields && filterFields.length) {\n                    expression = {\n                        logic: 'or',\n                        filters: [],\n                        fromFilter: true\n                    };\n                    for (var i = 0; i < filterFields.length; i++) {\n                        this._pushFilterExpression(expression, that._buildExpression(word, filterFields[i]));\n                    }\n                } else {\n                    expression = that._buildExpression(word, field);\n                }\n                that._open = options.open;\n                that._filterSource(expression);\n            },\n            _buildExpression: function (value, field) {\n                var that = this;\n                var widgetOptions = that.options;\n                var ignoreCase = widgetOptions.ignoreCase;\n                var accentFoldingFiltering = that.dataSource.options.accentFoldingFiltering;\n                return {\n                    value: ignoreCase ? accentFoldingFiltering ? value.toLocaleLowerCase(accentFoldingFiltering) : value.toLowerCase() : value,\n                    field: field,\n                    operator: widgetOptions.filter,\n                    ignoreCase: ignoreCase\n                };\n            },\n            _clearButton: function () {\n                var list = this;\n                var clearTitle = list.options.messages.clear;\n                if (!list._clear) {\n                    list._clear = $('<span unselectable=\"on\" class=\"k-icon k-clear-value k-i-close\" title=\"' + clearTitle + '\"></span>').attr({\n                        'role': 'button',\n                        'tabIndex': -1\n                    });\n                }\n                if (!list.options.clearButton) {\n                    list._clear.remove();\n                }\n                this._hideClear();\n            },\n            search: function (word) {\n                var options = this.options;\n                word = typeof word === 'string' ? word : this._inputValue();\n                clearTimeout(this._typingTimeout);\n                if (!options.enforceMinLength && !word.length || word.length >= options.minLength) {\n                    this._state = 'filter';\n                    if (this.listView) {\n                        this.listView._emptySearch = !$.trim(word).length;\n                    }\n                    if (!this._isFilterEnabled()) {\n                        this._searchByWord(word);\n                    } else {\n                        this._filter({\n                            word: word,\n                            open: true\n                        });\n                    }\n                }\n            },\n            current: function (candidate) {\n                return this._focus(candidate);\n            },\n            items: function () {\n                return this.ul[0].children;\n            },\n            destroy: function () {\n                var that = this;\n                var ns = that.ns;\n                Widget.fn.destroy.call(that);\n                that._unbindDataSource();\n                that.listView.destroy();\n                that.list.off(ns);\n                that.popup.destroy();\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n            },\n            dataItem: function (index) {\n                var that = this;\n                if (index === undefined) {\n                    return that.listView.selectedDataItems()[0];\n                }\n                if (typeof index !== 'number') {\n                    if (that.options.virtual) {\n                        return that.dataSource.getByUid($(index).data('uid'));\n                    }\n                    index = $(that.items()).index(index);\n                }\n                return that.dataSource.flatView()[index];\n            },\n            _activateItem: function () {\n                var current = this.listView.focus();\n                if (current) {\n                    this._focused.add(this.filterInput).attr('aria-activedescendant', current.attr('id'));\n                }\n            },\n            _deactivateItem: function () {\n                this._focused.add(this.filterInput).removeAttr('aria-activedescendant');\n            },\n            _accessors: function () {\n                var that = this;\n                var element = that.element;\n                var options = that.options;\n                var getter = kendo.getter;\n                var textField = element.attr(kendo.attr('text-field'));\n                var valueField = element.attr(kendo.attr('value-field'));\n                if (!options.dataTextField && textField) {\n                    options.dataTextField = textField;\n                }\n                if (!options.dataValueField && valueField) {\n                    options.dataValueField = valueField;\n                }\n                that._text = getter(options.dataTextField);\n                that._value = getter(options.dataValueField);\n            },\n            _aria: function (id) {\n                var that = this, options = that.options, element = that._focused.add(that.filterInput);\n                if (options.suggest !== undefined) {\n                    element.attr('aria-autocomplete', options.suggest ? 'both' : 'list');\n                }\n                id = id ? id + ' ' + that.ul[0].id : that.ul[0].id;\n                element.attr('aria-owns', id);\n                that.ul.attr('aria-live', !that._isFilterEnabled() ? 'off' : 'polite');\n                that._ariaLabel();\n            },\n            _ariaLabel: function () {\n                var that = this;\n                var focusedElm = that._focused;\n                var inputElm = that.element;\n                var inputId = inputElm.attr('id');\n                var labelElm = $('label[for=\"' + inputId + '\"]');\n                var ariaLabel = inputElm.attr('aria-label');\n                var ariaLabelledBy = inputElm.attr('aria-labelledby');\n                if (focusedElm === inputElm) {\n                    return;\n                }\n                if (ariaLabel) {\n                    focusedElm.attr('aria-label', ariaLabel);\n                } else if (ariaLabelledBy) {\n                    focusedElm.attr('aria-labelledby', ariaLabelledBy);\n                } else if (labelElm.length) {\n                    var labelId = labelElm.attr('id') || that._generateLabelId(labelElm, inputId || kendo.guid());\n                    focusedElm.attr('aria-labelledby', labelId);\n                }\n            },\n            _generateLabelId: function (label, inputId) {\n                var labelId = inputId + LABELIDPART;\n                label.attr('id', labelId);\n                return labelId;\n            },\n            _blur: function () {\n                var that = this;\n                that._change();\n                that.close();\n                that._userTriggered = false;\n            },\n            _change: function () {\n                var that = this;\n                var index = that.selectedIndex;\n                var optionValue = that.options.value;\n                var value = that.value();\n                var trigger;\n                if (that._isSelect && !that.listView.bound() && optionValue) {\n                    value = optionValue;\n                }\n                if (value !== unifyType(that._old, typeof value) && value !== unifyType(that._oldText, typeof value)) {\n                    trigger = true;\n                } else if (that._valueBeforeCascade !== undefined && that._valueBeforeCascade !== unifyType(that._old, typeof that._valueBeforeCascade) && that._userTriggered) {\n                    trigger = true;\n                } else if (index !== undefined && index !== that._oldIndex && !that.listView.isFiltered()) {\n                    trigger = true;\n                }\n                if (trigger) {\n                    if (that._old === null || that._old === '' || value === '') {\n                        that._valueBeforeCascade = that._old = value;\n                    } else {\n                        if (that.dataItem()) {\n                            that._valueBeforeCascade = that._old = that.options.dataValueField ? that.dataItem()[that.options.dataValueField] : that.dataItem();\n                        } else {\n                            that._valueBeforeCascade = that._old = null;\n                        }\n                    }\n                    that._oldIndex = index;\n                    that._oldText = that.text && that.text();\n                    if (!that._typing) {\n                        that.element.trigger(CHANGE);\n                    }\n                    that.trigger(CHANGE);\n                }\n                that.typing = false;\n            },\n            _data: function () {\n                return this.dataSource.view();\n            },\n            _enable: function () {\n                var that = this, options = that.options, disabled = that.element.is('[disabled]');\n                if (options.enable !== undefined) {\n                    options.enabled = options.enable;\n                }\n                if (!options.enabled || disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(that.element.is('[readonly]'));\n                }\n            },\n            _dataValue: function (dataItem) {\n                var value = this._value(dataItem);\n                if (value === undefined) {\n                    value = this._text(dataItem);\n                }\n                return value;\n            },\n            _offsetHeight: function () {\n                var offsetHeight = 0;\n                var siblings = this.listView.content.prevAll(':visible');\n                siblings.each(function () {\n                    var element = $(this);\n                    offsetHeight += outerHeight(element, true);\n                });\n                return offsetHeight;\n            },\n            _height: function (length) {\n                var that = this;\n                var list = that.list;\n                var height = that.options.height;\n                var visible = that.popup.visible();\n                var offsetTop;\n                var popups;\n                var footerHeight;\n                if (length || that.options.noDataTemplate) {\n                    popups = list.add(list.parent('.k-animation-container')).show();\n                    if (!list.is(':visible')) {\n                        popups.hide();\n                        return;\n                    }\n                    height = that.listView.content[0].scrollHeight > height ? height : 'auto';\n                    popups.height(height);\n                    if (height !== 'auto') {\n                        offsetTop = that._offsetHeight();\n                        footerHeight = outerHeight($(that.footer)) || 0;\n                        height = height - offsetTop - footerHeight;\n                    }\n                    that.listView.content.height(height);\n                    if (!visible) {\n                        popups.hide();\n                    }\n                }\n                return height;\n            },\n            _openHandler: function (e) {\n                this._adjustListWidth();\n                if (this.trigger(OPEN)) {\n                    e.preventDefault();\n                } else {\n                    this._focused.attr('aria-expanded', true);\n                    this.ul.attr('aria-hidden', false);\n                }\n            },\n            _adjustListWidth: function () {\n                var that = this, list = that.list, width = list[0].style.width, wrapper = that.wrapper, computedStyle, computedWidth;\n                if (!list.data(WIDTH) && width) {\n                    return;\n                }\n                computedStyle = window.getComputedStyle ? window.getComputedStyle(wrapper[0], null) : 0;\n                computedWidth = parseFloat(computedStyle && computedStyle.width) || outerWidth(wrapper);\n                if (computedStyle && browser.msie) {\n                    computedWidth += parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight) + parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth);\n                }\n                if (list.css('box-sizing') !== 'border-box') {\n                    width = computedWidth - (outerWidth(list) - list.width());\n                } else {\n                    width = computedWidth;\n                }\n                list.css({\n                    fontFamily: wrapper.css('font-family'),\n                    width: that.options.autoWidth ? 'auto' : width,\n                    minWidth: width,\n                    whiteSpace: that.options.autoWidth ? 'nowrap' : 'normal'\n                }).data(WIDTH, width);\n                return true;\n            },\n            _closeHandler: function (e) {\n                if (this.trigger(CLOSE)) {\n                    e.preventDefault();\n                } else {\n                    this._focused.attr('aria-expanded', false);\n                    this.ul.attr('aria-hidden', true);\n                }\n            },\n            _focusItem: function () {\n                var listView = this.listView;\n                var noFocusedItem = !listView.focus();\n                var index = last(listView.select());\n                if (index === undefined && this.options.highlightFirst && noFocusedItem) {\n                    index = 0;\n                }\n                if (index !== undefined) {\n                    listView.focus(index);\n                } else if (noFocusedItem) {\n                    listView.scrollToIndex(0);\n                }\n            },\n            _calculateGroupPadding: function (height) {\n                var li = this.ul.children('.k-first:first');\n                var groupHeader = this.listView.content.prev(GROUPHEADER);\n                var padding = 0;\n                var direction = 'right';\n                if (groupHeader[0] && groupHeader[0].style.display !== 'none') {\n                    if (height !== 'auto') {\n                        padding = kendo.support.scrollbar();\n                    }\n                    if (this.element.parents('.k-rtl').length) {\n                        direction = 'left';\n                    }\n                    padding += parseFloat(li.css('border-' + direction + '-width'), 10) + parseFloat(li.children('.k-group').css('padding-' + direction), 10);\n                    groupHeader.css('padding-' + direction, padding);\n                }\n            },\n            _calculatePopupHeight: function (force) {\n                var height = this._height(this.dataSource.flatView().length || force);\n                this._calculateGroupPadding(height);\n                this._calculateColumnsHeaderPadding(height);\n            },\n            _calculateColumnsHeaderPadding: function (height) {\n                if (this.options.columns && this.options.columns.length) {\n                    var list = this;\n                    var isRtl = support.isRtl(list.wrapper);\n                    var scrollbar = kendo.support.scrollbar();\n                    list.columnsHeader.css(isRtl ? 'padding-left' : 'padding-right', height !== 'auto' ? scrollbar : 0);\n                }\n            },\n            _refreshScroll: function () {\n                var listView = this.listView;\n                var enableYScroll = listView.element.height() > listView.content.height();\n                if (this.options.autoWidth) {\n                    listView.content.css({\n                        overflowX: 'hidden',\n                        overflowY: enableYScroll ? 'scroll' : 'auto'\n                    });\n                }\n            },\n            _resizePopup: function (force) {\n                if (this.options.virtual) {\n                    return;\n                }\n                if (!this.popup.element.is(':visible')) {\n                    this.popup.one('open', function (force) {\n                        return proxy(function () {\n                            this._calculatePopupHeight(force);\n                        }, this);\n                    }.call(this, force));\n                    this.popup.one('activate', proxy(this._refreshScroll, this));\n                } else {\n                    this._calculatePopupHeight(force);\n                }\n            },\n            _popup: function () {\n                var list = this;\n                list.popup = new ui.Popup(list.list, extend({}, list.options.popup, {\n                    anchor: list.wrapper,\n                    open: proxy(list._openHandler, list),\n                    close: proxy(list._closeHandler, list),\n                    animation: list.options.animation,\n                    isRtl: support.isRtl(list.wrapper),\n                    autosize: list.options.autoWidth\n                }));\n            },\n            _makeUnselectable: function () {\n                if (isIE8) {\n                    this.list.find('*').not('.k-textbox').attr('unselectable', 'on');\n                }\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _toggle: function (open, preventFocus) {\n                var that = this;\n                var touchEnabled = support.mobileOS && (support.touch || support.MSPointers || support.pointers);\n                open = open !== undefined ? open : !that.popup.visible();\n                if (!preventFocus && !touchEnabled && that._focused[0] !== activeElement()) {\n                    that._prevent = true;\n                    that._focused.focus();\n                    that._prevent = false;\n                }\n                that[open ? OPEN : CLOSE]();\n            },\n            _triggerCascade: function () {\n                var that = this;\n                if (!that._cascadeTriggered || that.value() !== unifyType(that._cascadedValue, typeof that.value())) {\n                    that._cascadedValue = that.value();\n                    that._cascadeTriggered = true;\n                    that.trigger(CASCADE, { userTriggered: that._userTriggered });\n                }\n            },\n            _triggerChange: function () {\n                if (this._valueBeforeCascade !== this.value()) {\n                    this.trigger(CHANGE);\n                }\n            },\n            _unbindDataSource: function () {\n                var that = this;\n                that.dataSource.unbind(REQUESTSTART, that._requestStartHandler).unbind(REQUESTEND, that._requestEndHandler).unbind('error', that._errorHandler);\n            },\n            requireValueMapper: function (options, value) {\n                var hasValue = (options.value instanceof Array ? options.value.length : options.value) || (value instanceof Array ? value.length : value);\n                if (hasValue && options.virtual && typeof options.virtual.valueMapper !== 'function') {\n                    throw new Error('ValueMapper is not provided while the value is being set. See http://docs.telerik.com/kendo-ui/controls/editors/combobox/virtualization#the-valuemapper-function');\n                }\n            }\n        });\n        function unifyType(value, type) {\n            if (value !== undefined && value !== '' && value !== null) {\n                if (type === 'boolean') {\n                    if (typeof value !== 'boolean') {\n                        value = value.toLowerCase() === 'true';\n                    }\n                    value = Boolean(value);\n                } else if (type === 'number') {\n                    value = Number(value);\n                } else if (type === 'string') {\n                    value = value.toString();\n                }\n            }\n            return value;\n        }\n        extend(List, {\n            inArray: function (node, parentNode) {\n                var idx, length, siblings = parentNode.children;\n                if (!node || node.parentNode !== parentNode) {\n                    return -1;\n                }\n                for (idx = 0, length = siblings.length; idx < length; idx++) {\n                    if (node === siblings[idx]) {\n                        return idx;\n                    }\n                }\n                return -1;\n            },\n            unifyType: unifyType\n        });\n        kendo.ui.List = List;\n        ui.Select = List.extend({\n            init: function (element, options) {\n                List.fn.init.call(this, element, options);\n                this._initial = this.element.val();\n            },\n            setDataSource: function (dataSource) {\n                var that = this;\n                var parent;\n                that.options.dataSource = dataSource;\n                that._dataSource();\n                if (that.listView.bound()) {\n                    that._initialIndex = null;\n                    that.listView._current = null;\n                }\n                that.listView.setDataSource(that.dataSource);\n                if (that.options.autoBind) {\n                    that.dataSource.fetch();\n                }\n                parent = that._parentWidget();\n                if (parent) {\n                    that._cascadeSelect(parent);\n                }\n            },\n            close: function () {\n                this.popup.close();\n            },\n            select: function (candidate) {\n                var that = this;\n                if (candidate === undefined) {\n                    return that.selectedIndex;\n                } else {\n                    return that._select(candidate).done(function () {\n                        that._cascadeValue = that._old = that._accessor();\n                        that._oldIndex = that.selectedIndex;\n                    });\n                }\n            },\n            _accessor: function (value, idx) {\n                return this[this._isSelect ? '_accessorSelect' : '_accessorInput'](value, idx);\n            },\n            _accessorInput: function (value) {\n                var element = this.element[0];\n                if (value === undefined) {\n                    return element.value;\n                } else {\n                    if (value === null) {\n                        value = '';\n                    }\n                    element.value = value;\n                }\n            },\n            _accessorSelect: function (value, idx) {\n                var element = this.element[0];\n                var hasValue;\n                if (value === undefined) {\n                    return getSelectedOption(element).value || '';\n                }\n                getSelectedOption(element).selected = false;\n                if (idx === undefined) {\n                    idx = -1;\n                }\n                hasValue = value !== null && value !== '';\n                if (hasValue && idx == -1) {\n                    this._custom(value);\n                } else {\n                    if (value) {\n                        element.value = value;\n                    } else {\n                        element.selectedIndex = idx;\n                    }\n                }\n            },\n            _syncValueAndText: function () {\n                return true;\n            },\n            _custom: function (value) {\n                var that = this;\n                var element = that.element;\n                var custom = that._customOption;\n                if (!custom) {\n                    custom = $('<option/>');\n                    that._customOption = custom;\n                    element.append(custom);\n                }\n                custom.text(value);\n                custom[0].selected = true;\n            },\n            _hideBusy: function () {\n                var that = this;\n                clearTimeout(that._busy);\n                that._arrowIcon.removeClass(LOADING);\n                that._focused.attr('aria-busy', false);\n                that._busy = null;\n                that._showClear();\n            },\n            _showBusy: function (e) {\n                var that = this;\n                if (e.isDefaultPrevented()) {\n                    return;\n                }\n                that._request = true;\n                if (that._busy) {\n                    return;\n                }\n                that._busy = setTimeout(function () {\n                    if (that._arrowIcon) {\n                        that._focused.attr('aria-busy', true);\n                        that._arrowIcon.addClass(LOADING);\n                        that._hideClear();\n                    }\n                }, 100);\n            },\n            _requestEnd: function () {\n                this._request = false;\n                this._hideBusy();\n            },\n            _dataSource: function () {\n                var that = this, element = that.element, options = that.options, dataSource = options.dataSource || {}, idx;\n                dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n                if (that._isSelect) {\n                    idx = element[0].selectedIndex;\n                    if (idx > -1) {\n                        options.index = idx;\n                    }\n                    dataSource.select = element;\n                    dataSource.fields = [\n                        { field: options.dataTextField },\n                        { field: options.dataValueField }\n                    ];\n                }\n                if (that.dataSource) {\n                    that._unbindDataSource();\n                } else {\n                    that._requestStartHandler = proxy(that._showBusy, that);\n                    that._requestEndHandler = proxy(that._requestEnd, that);\n                    that._errorHandler = proxy(that._hideBusy, that);\n                }\n                that.dataSource = kendo.data.DataSource.create(dataSource).bind(REQUESTSTART, that._requestStartHandler).bind(REQUESTEND, that._requestEndHandler).bind('error', that._errorHandler);\n            },\n            _firstItem: function () {\n                this.listView.focusFirst();\n            },\n            _lastItem: function () {\n                this.listView.focusLast();\n            },\n            _nextItem: function () {\n                return this.listView.focusNext();\n            },\n            _prevItem: function () {\n                return this.listView.focusPrev();\n            },\n            _getNormalizedDataItem: function (candidate) {\n                var that = this, listView = that.listView, isIndex = typeof candidate === 'number', hasOptionLabel = that.optionLabel && that.optionLabel.length, index;\n                if (isIndex) {\n                    index = hasOptionLabel ? --candidate : candidate;\n                } else {\n                    index = listView.getElementIndex(candidate);\n                }\n                return listView.dataItemByIndex(index);\n            },\n            _getNormalizedSelectCandidate: function (candidate) {\n                var that = this, hasOptionLabel = that.optionLabel && that.optionLabel.length, isIndex = typeof candidate === 'number', normalizedCandidate = candidate;\n                if (hasOptionLabel && isIndex) {\n                    normalizedCandidate++;\n                }\n                return normalizedCandidate;\n            },\n            _move: function (e) {\n                var that = this;\n                var listView = that.listView;\n                var key = e.keyCode;\n                var down = key === keys.DOWN;\n                var isVirtual = that.options.virtual;\n                var dataItem;\n                var pressed;\n                var current;\n                var moveIndex;\n                var selectCandidate;\n                if (key === keys.UP || down) {\n                    if (e.altKey) {\n                        that.toggle(down);\n                    } else {\n                        if (!listView.bound() && !that.ul[0].firstChild) {\n                            if (!that._fetch) {\n                                that.dataSource.one(CHANGE, function () {\n                                    that._fetch = false;\n                                    that._move(e);\n                                });\n                                that._fetch = true;\n                                that._filterSource();\n                            }\n                            e.preventDefault();\n                            return true;\n                        }\n                        current = that._focus();\n                        if (!that._fetch && (!current || current.hasClass('k-state-selected'))) {\n                            if (down) {\n                                moveIndex = that._nextItem();\n                                if (isVirtual && moveIndex <= 0 || !that._focus() && !moveIndex) {\n                                    that._lastItem();\n                                }\n                            } else {\n                                moveIndex = that._prevItem();\n                                if (isVirtual && moveIndex >= listView.dataSource.total() - 1 || !that._focus() && !moveIndex) {\n                                    that._firstItem();\n                                }\n                            }\n                        }\n                        selectCandidate = that._getNormalizedSelectCandidate(that._get(that._focus()) || moveIndex || 0);\n                        that._select(selectCandidate, true).done(function () {\n                            var done = function () {\n                                if (!that.popup.visible()) {\n                                    that._blur();\n                                }\n                                if (that._cascadedValue === null) {\n                                    that._cascadedValue = that.value();\n                                } else {\n                                    that._cascadedValue = that.dataItem() ? that.dataItem()[that.options.dataValueField] || that.dataItem() : null;\n                                }\n                            };\n                            if (that.trigger(SELECT, {\n                                    dataItem: that._getNormalizedDataItem(selectCandidate),\n                                    item: that._focus()\n                                })) {\n                                that._select(current).done(done);\n                            } else {\n                                done();\n                            }\n                        });\n                    }\n                    e.preventDefault();\n                    pressed = true;\n                } else if (key === keys.ENTER || key === keys.TAB) {\n                    if (that.popup.visible()) {\n                        e.preventDefault();\n                    }\n                    current = that._focus();\n                    dataItem = that.dataItem();\n                    if (!that.popup.visible() && (!dataItem || that.text() !== that._text(dataItem))) {\n                        current = null;\n                    }\n                    var activeFilter = that.filterInput && that.filterInput[0] === activeElement();\n                    var selection;\n                    if (current) {\n                        dataItem = listView.dataItemByIndex(listView.getElementIndex(current));\n                        var shouldTrigger = true;\n                        if (dataItem) {\n                            shouldTrigger = that._value(dataItem) !== List.unifyType(that.value(), typeof that._value(dataItem));\n                        }\n                        if (shouldTrigger && that.trigger(SELECT, {\n                                dataItem: dataItem,\n                                item: current\n                            })) {\n                            return;\n                        }\n                        selection = that._select(current);\n                    } else if (that.input) {\n                        if (that._syncValueAndText() || that._isSelect) {\n                            that._accessor(that.input.val());\n                        }\n                        that.listView.value(that.input.val());\n                    }\n                    if (that._focusElement) {\n                        that._focusElement(that.wrapper);\n                    }\n                    if (activeFilter && key === keys.TAB) {\n                        that.wrapper.focusout();\n                    } else {\n                        if (selection && typeof selection.done === 'function') {\n                            selection.done(function () {\n                                that._blur();\n                            });\n                        } else {\n                            that._blur();\n                        }\n                    }\n                    that.close();\n                    pressed = true;\n                } else if (key === keys.ESC) {\n                    if (that.popup.visible()) {\n                        e.preventDefault();\n                    }\n                    that.close();\n                    pressed = true;\n                } else if (that.popup.visible() && (key === keys.PAGEDOWN || key === keys.PAGEUP)) {\n                    e.preventDefault();\n                    var direction = key === keys.PAGEDOWN ? 1 : -1;\n                    listView.scrollWith(direction * listView.screenHeight());\n                    pressed = true;\n                }\n                return pressed;\n            },\n            _fetchData: function () {\n                var that = this;\n                var hasItems = !!that.dataSource.view().length;\n                if (that._request || that.options.cascadeFrom) {\n                    return;\n                }\n                if (!that.listView.bound() && !that._fetch && !hasItems) {\n                    that._fetch = true;\n                    that.dataSource.fetch().done(function () {\n                        that._fetch = false;\n                    });\n                }\n            },\n            _options: function (data, optionLabel, value) {\n                var that = this, element = that.element, htmlElement = element[0], length = data.length, options = '', option, dataItem, dataText, dataValue, idx = 0;\n                if (optionLabel) {\n                    options = optionLabel;\n                }\n                for (; idx < length; idx++) {\n                    option = '<option';\n                    dataItem = data[idx];\n                    dataText = that._text(dataItem);\n                    dataValue = that._value(dataItem);\n                    if (dataValue !== undefined) {\n                        dataValue += '';\n                        if (dataValue.indexOf('\"') !== -1) {\n                            dataValue = dataValue.replace(quotRegExp, '&quot;');\n                        }\n                        option += ' value=\"' + dataValue + '\"';\n                    }\n                    option += '>';\n                    if (dataText !== undefined) {\n                        option += htmlEncode(dataText);\n                    }\n                    option += '</option>';\n                    options += option;\n                }\n                element.html(options);\n                if (value !== undefined) {\n                    htmlElement.value = value;\n                    if (htmlElement.value && !value) {\n                        htmlElement.selectedIndex = -1;\n                    }\n                }\n                if (htmlElement.selectedIndex !== -1) {\n                    option = getSelectedOption(htmlElement);\n                    if (option) {\n                        option.setAttribute(SELECTED, SELECTED);\n                    }\n                }\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(that._initial);\n                        });\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            },\n            _parentWidget: function () {\n                var name = this.options.name;\n                if (!this.options.cascadeFrom) {\n                    return;\n                }\n                var parentElement = $('#' + this.options.cascadeFrom);\n                var parent = parentElement.data('kendo' + name);\n                if (!parent) {\n                    for (var i = 0; i < alternativeNames[name].length; i += 1) {\n                        parent = parentElement.data('kendo' + alternativeNames[name][i]);\n                        if (!!parent) {\n                            break;\n                        }\n                    }\n                }\n                return parent;\n            },\n            _cascade: function () {\n                var that = this;\n                var options = that.options;\n                var cascade = options.cascadeFrom;\n                var parent;\n                if (cascade) {\n                    parent = that._parentWidget();\n                    if (!parent) {\n                        return;\n                    }\n                    that._cascadeHandlerProxy = proxy(that._cascadeHandler, that);\n                    that._cascadeFilterRequests = [];\n                    options.autoBind = false;\n                    parent.bind('set', function () {\n                        that.one('set', function (e) {\n                            that._selectedValue = e.value || that._accessor();\n                        });\n                    });\n                    parent.first(CASCADE, that._cascadeHandlerProxy);\n                    if (parent.listView.bound()) {\n                        that._toggleCascadeOnFocus();\n                        that._cascadeSelect(parent);\n                    } else {\n                        parent.one('dataBound', function () {\n                            that._toggleCascadeOnFocus();\n                            if (parent.popup.visible()) {\n                                parent._focused.focus();\n                            }\n                        });\n                        if (!parent.value()) {\n                            that.enable(false);\n                        }\n                    }\n                }\n            },\n            _toggleCascadeOnFocus: function () {\n                var that = this;\n                var parent = that._parentWidget();\n                var focusout = isIE && parent instanceof ui.DropDownList ? BLUR : FOCUSOUT;\n                parent._focused.add(parent.filterInput).bind(FOCUS, function () {\n                    parent.unbind(CASCADE, that._cascadeHandlerProxy);\n                    parent.first(CHANGE, that._cascadeHandlerProxy);\n                });\n                parent._focused.add(parent.filterInput).bind(focusout, function () {\n                    parent.unbind(CHANGE, that._cascadeHandlerProxy);\n                    parent.first(CASCADE, that._cascadeHandlerProxy);\n                });\n            },\n            _cascadeHandler: function (e) {\n                var parent = this._parentWidget();\n                var valueBeforeCascade = this.value();\n                this._userTriggered = e.userTriggered || parent._userTriggered;\n                if (this.listView.bound()) {\n                    this._clearSelection(parent, true);\n                }\n                this._cascadeSelect(parent, valueBeforeCascade);\n            },\n            _cascadeChange: function (parent) {\n                var that = this;\n                var value = that._accessor() || that._selectedValue;\n                if (!that._cascadeFilterRequests.length) {\n                    that._selectedValue = null;\n                }\n                if (that._userTriggered) {\n                    that._clearSelection(parent, true);\n                } else if (value) {\n                    if (value !== unifyType(that.listView.value()[0], typeof value)) {\n                        that.value(value);\n                    }\n                    if (!that.dataSource.view()[0] || that.selectedIndex === -1) {\n                        that._clearSelection(parent, true);\n                    }\n                } else if (that.dataSource.flatView().length) {\n                    that.select(that.options.index);\n                }\n                that.enable();\n                that._triggerCascade();\n                that._triggerChange();\n                that._userTriggered = false;\n            },\n            _cascadeSelect: function (parent, valueBeforeCascade) {\n                var that = this;\n                var dataItem = parent.dataItem();\n                var filterValue = dataItem ? dataItem[that.options.cascadeFromParentField] || parent._value(dataItem) : null;\n                var valueField = that.options.cascadeFromField || parent.options.dataValueField;\n                var expressions;\n                that._valueBeforeCascade = valueBeforeCascade !== undefined ? valueBeforeCascade : that.value();\n                if (filterValue || filterValue === 0) {\n                    expressions = that.dataSource.filter() || {};\n                    removeFiltersForField(expressions, valueField);\n                    var handler = function () {\n                        var currentHandler = that._cascadeFilterRequests.shift();\n                        if (currentHandler) {\n                            that.unbind('dataBound', currentHandler);\n                        }\n                        currentHandler = that._cascadeFilterRequests[0];\n                        if (currentHandler) {\n                            that.first('dataBound', currentHandler);\n                        }\n                        that._cascadeChange(parent);\n                    };\n                    that._cascadeFilterRequests.push(handler);\n                    if (that._cascadeFilterRequests.length === 1) {\n                        that.first('dataBound', handler);\n                    }\n                    that._cascading = true;\n                    that._filterSource({\n                        field: valueField,\n                        operator: 'eq',\n                        value: filterValue\n                    });\n                    that._cascading = false;\n                } else {\n                    that.enable(false);\n                    that._clearSelection(parent);\n                    that._triggerCascade();\n                    that._triggerChange();\n                    that._userTriggered = false;\n                }\n            }\n        });\n        var STATIC_LIST_NS = '.StaticList';\n        var StaticList = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.element.attr('role', 'listbox').on('click' + STATIC_LIST_NS, 'li', proxy(this._click, this)).on('mouseenter' + STATIC_LIST_NS, 'li', function () {\n                    $(this).addClass(HOVER);\n                }).on('mouseleave' + STATIC_LIST_NS, 'li', function () {\n                    $(this).removeClass(HOVER);\n                });\n                if (support.touch) {\n                    this._touchHandlers();\n                }\n                if (this.options.selectable === 'multiple') {\n                    this.element.attr('aria-multiselectable', true);\n                }\n                this.content = this.element.wrap('<div class=\\'k-list-scroller\\' unselectable=\\'on\\'></div>').parent();\n                this.header = this.content.before('<div class=\"k-group-header\" style=\"display:none\"></div>').prev();\n                this.bound(false);\n                this._optionID = kendo.guid();\n                this._selectedIndices = [];\n                this._view = [];\n                this._dataItems = [];\n                this._values = [];\n                var value = this.options.value;\n                if (value) {\n                    this._values = $.isArray(value) ? value.slice(0) : [value];\n                }\n                this._getter();\n                this._templates();\n                this.setDataSource(this.options.dataSource);\n                this._onScroll = proxy(function () {\n                    var that = this;\n                    clearTimeout(that._scrollId);\n                    that._scrollId = setTimeout(function () {\n                        that._renderHeader();\n                    }, 50);\n                }, this);\n            },\n            options: {\n                name: 'StaticList',\n                dataValueField: null,\n                valuePrimitive: false,\n                selectable: true,\n                template: null,\n                groupTemplate: null,\n                fixedGroupTemplate: null\n            },\n            events: [\n                'click',\n                CHANGE,\n                'activate',\n                'deactivate',\n                'dataBinding',\n                'dataBound',\n                'selectedItemChange'\n            ],\n            setDataSource: function (source) {\n                var that = this;\n                var dataSource = source || {};\n                var value;\n                dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n                dataSource = kendo.data.DataSource.create(dataSource);\n                if (that.dataSource) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler);\n                    value = that.value();\n                    that.value([]);\n                    that.bound(false);\n                    that.value(value);\n                } else {\n                    that._refreshHandler = proxy(that.refresh, that);\n                }\n                that.setDSFilter(dataSource.filter());\n                that.dataSource = dataSource.bind(CHANGE, that._refreshHandler);\n                that._fixedHeader();\n            },\n            _touchHandlers: function () {\n                var that = this;\n                var startY;\n                var endY;\n                var tapPosition = function (event) {\n                    return (event.originalEvent || event).changedTouches[0].pageY;\n                };\n                that.element.on('touchstart' + STATIC_LIST_NS, function (e) {\n                    startY = tapPosition(e);\n                });\n                that.element.on('touchend' + STATIC_LIST_NS, function (e) {\n                    if (e.isDefaultPrevented()) {\n                        return;\n                    }\n                    endY = tapPosition(e);\n                    if (Math.abs(endY - startY) < 10) {\n                        that._touchTriggered = true;\n                        that._triggerClick($(e.target).closest(ITEMSELECTOR).get(0));\n                    }\n                });\n            },\n            skip: function () {\n                return this.dataSource.skip();\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                this._getter();\n                this._templates();\n                this._render();\n            },\n            destroy: function () {\n                this.element.off(STATIC_LIST_NS);\n                if (this._refreshHandler) {\n                    this.dataSource.unbind(CHANGE, this._refreshHandler);\n                }\n                clearTimeout(this._scrollId);\n                Widget.fn.destroy.call(this);\n            },\n            dataItemByIndex: function (index) {\n                return this.dataSource.flatView()[index];\n            },\n            screenHeight: function () {\n                return this.content[0].clientHeight;\n            },\n            scrollToIndex: function (index) {\n                var item = this.element[0].children[index];\n                if (item) {\n                    this.scroll(item);\n                }\n            },\n            scrollWith: function (value) {\n                this.content.scrollTop(this.content.scrollTop() + value);\n            },\n            scroll: function (item) {\n                if (!item) {\n                    return;\n                }\n                if (item[0]) {\n                    item = item[0];\n                }\n                var content = this.content[0], itemOffsetTop = item.offsetTop, itemOffsetHeight = item.offsetHeight, contentScrollTop = content.scrollTop, contentOffsetHeight = content.clientHeight, bottomDistance = itemOffsetTop + itemOffsetHeight;\n                if (contentScrollTop > itemOffsetTop) {\n                    contentScrollTop = itemOffsetTop;\n                } else if (bottomDistance > contentScrollTop + contentOffsetHeight) {\n                    contentScrollTop = bottomDistance - contentOffsetHeight;\n                }\n                content.scrollTop = contentScrollTop;\n            },\n            selectedDataItems: function (dataItems) {\n                if (dataItems === undefined) {\n                    return this._dataItems.slice();\n                }\n                this._dataItems = dataItems;\n                this._values = this._getValues(dataItems);\n            },\n            _getValues: function (dataItems) {\n                var getter = this._valueGetter;\n                return $.map(dataItems, function (dataItem) {\n                    return getter(dataItem);\n                });\n            },\n            focusNext: function () {\n                var current = this.focus();\n                if (!current) {\n                    current = 0;\n                } else {\n                    current = current.next();\n                }\n                this.focus(current);\n            },\n            focusPrev: function () {\n                var current = this.focus();\n                if (!current) {\n                    current = this.element[0].children.length - 1;\n                } else {\n                    current = current.prev();\n                }\n                this.focus(current);\n            },\n            focusFirst: function () {\n                this.focus(this.element[0].children[0]);\n            },\n            focusLast: function () {\n                this.focus(last(this.element[0].children));\n            },\n            focus: function (candidate) {\n                var that = this;\n                var id = that._optionID;\n                var hasCandidate;\n                if (candidate === undefined) {\n                    return that._current;\n                }\n                candidate = last(that._get(candidate));\n                candidate = $(this.element[0].children[candidate]);\n                if (that._current) {\n                    that._current.removeClass(FOCUSED).removeAttr(ID);\n                    that.trigger('deactivate');\n                }\n                hasCandidate = !!candidate[0];\n                if (hasCandidate) {\n                    candidate.addClass(FOCUSED);\n                    that.scroll(candidate);\n                    candidate.attr('id', id);\n                }\n                that._current = hasCandidate ? candidate : null;\n                that.trigger('activate');\n            },\n            focusIndex: function () {\n                return this.focus() ? this.focus().index() : undefined;\n            },\n            skipUpdate: function (skipUpdate) {\n                this._skipUpdate = skipUpdate;\n            },\n            select: function (indices) {\n                var that = this;\n                var selectable = that.options.selectable;\n                var singleSelection = selectable !== 'multiple' && selectable !== false;\n                var selectedIndices = that._selectedIndices;\n                var uiSelectedIndices = [this.element.find('.k-state-selected').index()];\n                var added = [];\n                var removed = [];\n                var result;\n                if (indices === undefined) {\n                    return selectedIndices.slice();\n                }\n                indices = that._get(indices);\n                if (indices.length === 1 && indices[0] === -1) {\n                    indices = [];\n                }\n                var deferred = $.Deferred().resolve();\n                var filtered = that.isFiltered();\n                if (filtered && !singleSelection && that._deselectFiltered(indices)) {\n                    return deferred;\n                }\n                if (singleSelection && !filtered && $.inArray(last(indices), selectedIndices) !== -1 && $.inArray(last(indices), uiSelectedIndices) !== -1) {\n                    if (that._dataItems.length && that._view.length) {\n                        that._dataItems = [that._view[selectedIndices[0]].item];\n                    }\n                    return deferred;\n                }\n                result = that._deselect(indices);\n                removed = result.removed;\n                indices = result.indices;\n                if (indices.length) {\n                    if (singleSelection) {\n                        indices = [last(indices)];\n                    }\n                    added = that._select(indices);\n                }\n                if (added.length || removed.length) {\n                    that._valueComparer = null;\n                    that.trigger(CHANGE, {\n                        added: added,\n                        removed: removed\n                    });\n                }\n                return deferred;\n            },\n            removeAt: function (position) {\n                this._selectedIndices.splice(position, 1);\n                this._values.splice(position, 1);\n                this._valueComparer = null;\n                return {\n                    position: position,\n                    dataItem: this._dataItems.splice(position, 1)[0]\n                };\n            },\n            setValue: function (value) {\n                value = $.isArray(value) || value instanceof ObservableArray ? value.slice(0) : [value];\n                this._values = value;\n                this._valueComparer = null;\n            },\n            value: function (value) {\n                var that = this;\n                var deferred = that._valueDeferred;\n                var indices;\n                if (value === undefined) {\n                    return that._values.slice();\n                }\n                that.setValue(value);\n                if (!deferred || deferred.state() === 'resolved') {\n                    that._valueDeferred = deferred = $.Deferred();\n                }\n                if (that.bound()) {\n                    indices = that._valueIndices(that._values);\n                    if (that.options.selectable === 'multiple') {\n                        that.select(-1);\n                    }\n                    that.select(indices);\n                    deferred.resolve();\n                }\n                that._skipUpdate = false;\n                return deferred;\n            },\n            items: function () {\n                return this.element.children(ITEMSELECTOR);\n            },\n            _click: function (e) {\n                if (this._touchTriggered) {\n                    this._touchTriggered = false;\n                    return;\n                }\n                if (!e.isDefaultPrevented()) {\n                    this._triggerClick(e.currentTarget);\n                }\n            },\n            _triggerClick: function (item) {\n                if (!this.trigger('click', { item: $(item) })) {\n                    this.select(item);\n                }\n            },\n            _valueExpr: function (type, values) {\n                var that = this;\n                var idx = 0;\n                var body;\n                var comparer;\n                var normalized = [];\n                if (!that._valueComparer || that._valueType !== type) {\n                    that._valueType = type;\n                    for (; idx < values.length; idx++) {\n                        normalized.push(unifyType(values[idx], type));\n                    }\n                    body = 'for (var idx = 0; idx < ' + normalized.length + '; idx++) {' + ' if (current === values[idx]) {' + '   return idx;' + ' }' + '} ' + 'return -1;';\n                    comparer = new Function('current', 'values', body);\n                    that._valueComparer = function (current) {\n                        return comparer(current, normalized);\n                    };\n                }\n                return that._valueComparer;\n            },\n            _dataItemPosition: function (dataItem, values) {\n                var value = this._valueGetter(dataItem);\n                var valueExpr = this._valueExpr(typeof value, values);\n                return valueExpr(value);\n            },\n            _getter: function () {\n                this._valueGetter = kendo.getter(this.options.dataValueField);\n            },\n            _deselect: function (indices) {\n                var that = this;\n                var children = that.element[0].children;\n                var selectable = that.options.selectable;\n                var selectedIndices = that._selectedIndices;\n                var dataItems = that._dataItems;\n                var values = that._values;\n                var removed = [];\n                var i = 0;\n                var j;\n                var index, selectedIndex;\n                var removedIndices = 0;\n                indices = indices.slice();\n                if (selectable === true || !indices.length) {\n                    for (; i < selectedIndices.length; i++) {\n                        $(children[selectedIndices[i]]).removeClass('k-state-selected').attr('aria-selected', false);\n                        removed.push({\n                            position: i,\n                            dataItem: dataItems[i]\n                        });\n                    }\n                    that._values = [];\n                    that._dataItems = [];\n                    that._selectedIndices = [];\n                } else if (selectable === 'multiple') {\n                    for (; i < indices.length; i++) {\n                        index = indices[i];\n                        if (!$(children[index]).hasClass('k-state-selected')) {\n                            continue;\n                        }\n                        for (j = 0; j < selectedIndices.length; j++) {\n                            selectedIndex = selectedIndices[j];\n                            if (selectedIndex === index) {\n                                $(children[selectedIndex]).removeClass('k-state-selected').attr('aria-selected', false);\n                                removed.push({\n                                    position: j + removedIndices,\n                                    dataItem: dataItems.splice(j, 1)[0]\n                                });\n                                selectedIndices.splice(j, 1);\n                                indices.splice(i, 1);\n                                values.splice(j, 1);\n                                removedIndices += 1;\n                                i -= 1;\n                                j -= 1;\n                                break;\n                            }\n                        }\n                    }\n                }\n                return {\n                    indices: indices,\n                    removed: removed\n                };\n            },\n            _deselectFiltered: function (indices) {\n                var children = this.element[0].children;\n                var dataItem, index, position;\n                var removed = [];\n                var idx = 0;\n                for (; idx < indices.length; idx++) {\n                    index = indices[idx];\n                    dataItem = this._view[index].item;\n                    position = this._dataItemPosition(dataItem, this._values);\n                    if (position > -1) {\n                        removed.push(this.removeAt(position));\n                        $(children[index]).removeClass('k-state-selected');\n                    }\n                }\n                if (removed.length) {\n                    this.trigger(CHANGE, {\n                        added: [],\n                        removed: removed\n                    });\n                    return true;\n                }\n                return false;\n            },\n            _select: function (indices) {\n                var that = this;\n                var children = that.element[0].children;\n                var data = that._view;\n                var dataItem, index;\n                var added = [];\n                var idx = 0;\n                if (last(indices) !== -1) {\n                    that.focus(indices);\n                }\n                for (; idx < indices.length; idx++) {\n                    index = indices[idx];\n                    dataItem = data[index];\n                    if (index === -1 || !dataItem) {\n                        continue;\n                    }\n                    dataItem = dataItem.item;\n                    that._selectedIndices.push(index);\n                    that._dataItems.push(dataItem);\n                    that._values.push(that._valueGetter(dataItem));\n                    $(children[index]).addClass('k-state-selected').attr('aria-selected', true);\n                    added.push({ dataItem: dataItem });\n                }\n                return added;\n            },\n            getElementIndex: function (element) {\n                return $(element).data('offset-index');\n            },\n            _get: function (candidate) {\n                if (typeof candidate === 'number') {\n                    candidate = [candidate];\n                } else if (!isArray(candidate)) {\n                    candidate = this.getElementIndex(candidate);\n                    candidate = [candidate !== undefined ? candidate : -1];\n                }\n                return candidate;\n            },\n            _template: function () {\n                var that = this;\n                var options = that.options;\n                var template = options.template;\n                if (!template) {\n                    template = kendo.template('<li tabindex=\"-1\" role=\"option\" unselectable=\"on\" class=\"k-item\">${' + kendo.expr(options.dataTextField, 'data') + '}</li>', { useWithBlock: false });\n                } else {\n                    template = kendo.template(template);\n                    template = function (data) {\n                        return '<li tabindex=\"-1\" role=\"option\" unselectable=\"on\" class=\"k-item\">' + template(data) + '</li>';\n                    };\n                }\n                return template;\n            },\n            _templates: function () {\n                var template;\n                var options = this.options;\n                var templates = {\n                    template: options.template,\n                    groupTemplate: options.groupTemplate,\n                    fixedGroupTemplate: options.fixedGroupTemplate\n                };\n                if (options.columns) {\n                    for (var i = 0; i < options.columns.length; i++) {\n                        var currentColumn = options.columns[i];\n                        var templateText = currentColumn.field ? currentColumn.field.toString() : 'text';\n                        templates['column' + i] = currentColumn.template || '#: ' + templateText + '#';\n                    }\n                }\n                for (var key in templates) {\n                    template = templates[key];\n                    if (template && typeof template !== 'function') {\n                        templates[key] = kendo.template(template);\n                    }\n                }\n                this.templates = templates;\n            },\n            _normalizeIndices: function (indices) {\n                var newIndices = [];\n                var idx = 0;\n                for (; idx < indices.length; idx++) {\n                    if (indices[idx] !== undefined) {\n                        newIndices.push(indices[idx]);\n                    }\n                }\n                return newIndices;\n            },\n            _valueIndices: function (values, indices) {\n                var data = this._view;\n                var idx = 0;\n                var index;\n                indices = indices ? indices.slice() : [];\n                if (!values.length) {\n                    return [];\n                }\n                for (; idx < data.length; idx++) {\n                    index = this._dataItemPosition(data[idx].item, values);\n                    if (index !== -1) {\n                        indices[index] = idx;\n                    }\n                }\n                return this._normalizeIndices(indices);\n            },\n            _firstVisibleItem: function () {\n                var element = this.element[0];\n                var content = this.content[0];\n                var scrollTop = content.scrollTop;\n                var itemHeight = $(element.children[0]).height();\n                var itemIndex = Math.floor(scrollTop / itemHeight) || 0;\n                var item = element.children[itemIndex] || element.lastChild;\n                var forward = item.offsetTop < scrollTop;\n                while (item) {\n                    if (forward) {\n                        if (item.offsetTop + itemHeight > scrollTop || !item.nextSibling) {\n                            break;\n                        }\n                        item = item.nextSibling;\n                    } else {\n                        if (item.offsetTop <= scrollTop || !item.previousSibling) {\n                            break;\n                        }\n                        item = item.previousSibling;\n                    }\n                }\n                return this._view[$(item).data('offset-index')];\n            },\n            _fixedHeader: function () {\n                if (this.isGrouped() && this.templates.fixedGroupTemplate) {\n                    this.header.show();\n                    this.content.scroll(this._onScroll);\n                } else {\n                    this.header.hide();\n                    this.content.off('scroll', this._onScroll);\n                }\n            },\n            _renderHeader: function () {\n                var template = this.templates.fixedGroupTemplate;\n                if (!template) {\n                    return;\n                }\n                var visibleItem = this._firstVisibleItem();\n                if (visibleItem && visibleItem.group.toString().length) {\n                    this.header.html(template(visibleItem.group));\n                }\n            },\n            _renderItem: function (context) {\n                var item = '<li tabindex=\"-1\" role=\"option\" unselectable=\"on\" class=\"k-item';\n                var dataItem = context.item;\n                var notFirstItem = context.index !== 0;\n                var selected = context.selected;\n                var isGrouped = this.isGrouped();\n                var hasColumns = this.options.columns && this.options.columns.length;\n                if (notFirstItem && context.newGroup) {\n                    item += ' k-first';\n                }\n                if (context.isLastGroupedItem && hasColumns) {\n                    item += ' k-last';\n                }\n                if (selected) {\n                    item += ' k-state-selected';\n                }\n                item += '\" aria-selected=\"' + (selected ? 'true' : 'false') + '\" data-offset-index=\"' + context.index + '\">';\n                if (hasColumns) {\n                    item += this._renderColumns(dataItem);\n                } else {\n                    item += this.templates.template(dataItem);\n                }\n                if (notFirstItem && context.newGroup) {\n                    if (hasColumns) {\n                        item += '<div class=\"k-cell k-group-cell\"><span>' + this.templates.groupTemplate(context.group) + '</span></div>';\n                    } else {\n                        item += '<div class=\"k-group\">' + this.templates.groupTemplate(context.group) + '</div>';\n                    }\n                } else if (isGrouped && hasColumns) {\n                    item += '<div class=\\'k-cell k-spacer-cell\\'></div>';\n                }\n                return item + '</li>';\n            },\n            _renderColumns: function (dataItem) {\n                var item = '';\n                for (var i = 0; i < this.options.columns.length; i++) {\n                    var currentWidth = this.options.columns[i].width;\n                    var currentWidthInt = parseInt(currentWidth, 10);\n                    var widthStyle = '';\n                    if (currentWidth && !isNaN(currentWidthInt)) {\n                        widthStyle += 'style=\\'width:';\n                        widthStyle += currentWidthInt;\n                        widthStyle += percentageUnitsRegex.test(currentWidth) ? '%' : 'px';\n                        widthStyle += ';\\'';\n                    }\n                    item += '<span class=\\'k-cell\\' ' + widthStyle + '>';\n                    item += this.templates['column' + i](dataItem);\n                    item += '</span>';\n                }\n                return item;\n            },\n            _render: function () {\n                var html = '';\n                var i = 0;\n                var idx = 0;\n                var context;\n                var dataContext = [];\n                var view = this.dataSource.view();\n                var values = this.value();\n                var group, newGroup, j;\n                var isGrouped = this.isGrouped();\n                if (isGrouped) {\n                    for (i = 0; i < view.length; i++) {\n                        group = view[i];\n                        newGroup = true;\n                        for (j = 0; j < group.items.length; j++) {\n                            context = {\n                                selected: this._selected(group.items[j], values),\n                                item: group.items[j],\n                                group: group.value,\n                                newGroup: newGroup,\n                                isLastGroupedItem: j === group.items.length - 1,\n                                index: idx\n                            };\n                            dataContext[idx] = context;\n                            idx += 1;\n                            html += this._renderItem(context);\n                            newGroup = false;\n                        }\n                    }\n                } else {\n                    for (i = 0; i < view.length; i++) {\n                        context = {\n                            selected: this._selected(view[i], values),\n                            item: view[i],\n                            index: i\n                        };\n                        dataContext[i] = context;\n                        html += this._renderItem(context);\n                    }\n                }\n                this._view = dataContext;\n                this.element[0].innerHTML = html;\n                if (isGrouped && dataContext.length) {\n                    this._renderHeader();\n                }\n            },\n            _selected: function (dataItem, values) {\n                var select = !this.isFiltered() || this.options.selectable === 'multiple';\n                return select && this._dataItemPosition(dataItem, values) !== -1;\n            },\n            setDSFilter: function (filter) {\n                this._lastDSFilter = extend({}, filter);\n            },\n            isFiltered: function () {\n                if (!this._lastDSFilter) {\n                    this.setDSFilter(this.dataSource.filter());\n                }\n                return !kendo.data.Query.compareFilters(this.dataSource.filter(), this._lastDSFilter);\n            },\n            refresh: function (e) {\n                var that = this;\n                var action = e && e.action;\n                var skipUpdateOnBind = that.options.skipUpdateOnBind;\n                var isItemChange = action === 'itemchange';\n                var result;\n                that.trigger('dataBinding');\n                that._angularItems('cleanup');\n                that._fixedHeader();\n                that._render();\n                that.bound(true);\n                if (isItemChange || action === 'remove') {\n                    result = mapChangedItems(that._dataItems, e.items);\n                    if (result.changed.length) {\n                        if (isItemChange) {\n                            that.trigger('selectedItemChange', { items: result.changed });\n                        } else {\n                            that.value(that._getValues(result.unchanged));\n                        }\n                    }\n                } else if (that.isFiltered() || that._skipUpdate || that._emptySearch) {\n                    that.focus(0);\n                    if (that._skipUpdate) {\n                        that._skipUpdate = false;\n                        that._selectedIndices = that._valueIndices(that._values, that._selectedIndices);\n                    }\n                } else if (!skipUpdateOnBind && (!action || action === 'add')) {\n                    that.value(that._values);\n                }\n                if (that._valueDeferred) {\n                    that._valueDeferred.resolve();\n                }\n                that._angularItems('compile');\n                that.trigger('dataBound');\n            },\n            bound: function (bound) {\n                if (bound === undefined) {\n                    return this._bound;\n                }\n                this._bound = bound;\n            },\n            isGrouped: function () {\n                return (this.dataSource.group() || []).length;\n            }\n        });\n        ui.plugin(StaticList);\n        function last(list) {\n            return list[list.length - 1];\n        }\n        function getSelectedOption(select) {\n            var index = select.selectedIndex;\n            return index > -1 ? select.options[index] : {};\n        }\n        function mapChangedItems(selected, itemsToMatch) {\n            var itemsLength = itemsToMatch.length;\n            var selectedLength = selected.length;\n            var dataItem;\n            var found;\n            var i, j;\n            var changed = [];\n            var unchanged = [];\n            if (selectedLength) {\n                for (i = 0; i < selectedLength; i++) {\n                    dataItem = selected[i];\n                    found = false;\n                    for (j = 0; j < itemsLength; j++) {\n                        if (dataItem === itemsToMatch[j]) {\n                            found = true;\n                            changed.push({\n                                index: i,\n                                item: dataItem\n                            });\n                            break;\n                        }\n                    }\n                    if (!found) {\n                        unchanged.push(dataItem);\n                    }\n                }\n            }\n            return {\n                changed: changed,\n                unchanged: unchanged\n            };\n        }\n        function isValidFilterExpr(expression) {\n            if (!expression || $.isEmptyObject(expression)) {\n                return false;\n            }\n            if (expression.filters && !expression.filters.length) {\n                return false;\n            }\n            return true;\n        }\n        function removeFiltersForField(expression, field) {\n            var filters;\n            var found = false;\n            if (expression.filters) {\n                filters = $.grep(expression.filters, function (filter) {\n                    found = removeFiltersForField(filter, field);\n                    if (filter.filters) {\n                        return filter.filters.length;\n                    } else {\n                        return filter.field != field;\n                    }\n                });\n                if (!found && expression.filters.length !== filters.length) {\n                    found = true;\n                }\n                expression.filters = filters;\n            }\n            return found;\n        }\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.calendar', [\n        'kendo.core',\n        'kendo.selectable'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'calendar',\n        name: 'Calendar',\n        category: 'web',\n        description: 'The Calendar widget renders a graphical calendar that supports navigation and selection.',\n        depends: [\n            'core',\n            'selectable'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, support = kendo.support, ui = kendo.ui, Widget = ui.Widget, keys = kendo.keys, parse = kendo.parseDate, adjustDST = kendo.date.adjustDST, weekInYear = kendo.date.weekInYear, Selectable = kendo.ui.Selectable, extractFormat = kendo._extractFormat, template = kendo.template, getCulture = kendo.getCulture, transitions = kendo.support.transitions, transitionOrigin = transitions ? transitions.css + 'transform-origin' : '', cellTemplate = template('<td#=data.cssClass# role=\"gridcell\"><a tabindex=\"-1\" class=\"k-link\" href=\"\\\\#\" data-#=data.ns#value=\"#=data.dateString#\">#=data.value#</a></td>', { useWithBlock: false }), emptyCellTemplate = template('<td role=\"gridcell\" class=\"k-out-of-range\"><a class=\"k-link\"></a></td>', { useWithBlock: false }), otherMonthCellTemplate = template('<td role=\"gridcell\" class=\"k-out-of-range\">&nbsp;</td>', { useWithBlock: false }), weekNumberTemplate = template('<td class=\"k-alt\">#= data.weekNumber #</td>', { useWithBlock: false }), browser = kendo.support.browser, isIE8 = browser.msie && browser.version < 9, outerWidth = kendo._outerWidth, ns = '.kendoCalendar', CLICK = 'click' + ns, KEYDOWN_NS = 'keydown' + ns, ID = 'id', MIN = 'min', LEFT = 'left', SLIDE = 'slideIn', MONTH = 'month', CENTURY = 'century', CHANGE = 'change', NAVIGATE = 'navigate', VALUE = 'value', HOVER = 'k-state-hover', DISABLED = 'k-state-disabled', FOCUSED = 'k-state-focused', OTHERMONTH = 'k-other-month', OTHERMONTHCLASS = ' class=\"' + OTHERMONTH + '\"', OUTOFRANGE = 'k-out-of-range', TODAY = 'k-nav-today', CELLSELECTOR = 'td:has(.k-link)', CELLSELECTORVALID = 'td:has(.k-link):not(.' + DISABLED + '):not(.' + OUTOFRANGE + ')', WEEKCOLUMNSELECTOR = 'td:not(:has(.k-link))', SELECTED = 'k-state-selected', BLUR = 'blur' + ns, FOCUS = 'focus', FOCUS_WITH_NS = FOCUS + ns, MOUSEENTER = support.touch ? 'touchstart' : 'mouseenter', MOUSEENTER_WITH_NS = support.touch ? 'touchstart' + ns : 'mouseenter' + ns, MOUSELEAVE = support.touch ? 'touchend' + ns + ' touchmove' + ns : 'mouseleave' + ns, MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000, PREVARROW = '_prevArrow', NEXTARROW = '_nextArrow', ARIA_DISABLED = 'aria-disabled', ARIA_SELECTED = 'aria-selected', ARIA_LABEL = 'aria-label', proxy = $.proxy, extend = $.extend, DATE = Date, views = {\n                month: 0,\n                year: 1,\n                decade: 2,\n                century: 3\n            };\n        var Calendar = Widget.extend({\n            init: function (element, options) {\n                var that = this, value, id;\n                Widget.fn.init.call(that, element, options);\n                element = that.wrapper = that.element;\n                options = that.options;\n                options.url = kendo.unescape(options.url);\n                that.options.disableDates = getDisabledExpr(that.options.disableDates);\n                that._templates();\n                that._selectable();\n                that._header();\n                that._viewWrapper();\n                that._footer(that.footer);\n                id = element.addClass('k-widget k-calendar ' + (options.weekNumber ? ' k-week-number' : '')).on(MOUSEENTER_WITH_NS + ' ' + MOUSELEAVE, CELLSELECTOR, mousetoggle).on(KEYDOWN_NS, 'table.k-content', proxy(that._move, that)).on(CLICK + ' touchend', CELLSELECTOR, function (e) {\n                    var link = e.currentTarget.firstChild, value = toDateObject(link);\n                    if (link.href.indexOf('#') != -1) {\n                        e.preventDefault();\n                    }\n                    if (that._view.name == 'month' && that.options.disableDates(value)) {\n                        return;\n                    }\n                    if (that._view.name != 'month' || options.selectable == 'single') {\n                        that._click($(link));\n                    }\n                }).on('mouseup' + ns, 'table.k-content, .k-footer', function () {\n                    that._focusView(that.options.focusOnNav !== false);\n                }).attr(ID);\n                if (id) {\n                    that._cellID = id + '_cell_selected';\n                }\n                if (that._isMultipleSelection() && that.options.weekNumber) {\n                    element.on(CLICK, WEEKCOLUMNSELECTOR, function (e) {\n                        var first = $(e.currentTarget).closest('tr').find(CELLSELECTORVALID).first(), last = that.selectable._lastActive = $(e.currentTarget).closest('tr').find(CELLSELECTORVALID).last();\n                        that.selectable.selectRange(first, last, { event: e });\n                        that._current = that._value = toDateObject(last.find('a'));\n                        that._class(FOCUSED, that._current);\n                    });\n                }\n                normalize(options);\n                value = parse(options.value, options.format, options.culture);\n                that._selectDates = [];\n                that._index = views[options.start];\n                that._current = new DATE(+restrictValue(value, options.min, options.max));\n                that._addClassProxy = function () {\n                    that._active = true;\n                    if (that._cell.hasClass(DISABLED)) {\n                        var todayString = that._view.toDateString(getToday());\n                        that._cell = that._cellByDate(todayString);\n                    }\n                    that._cell.addClass(FOCUSED);\n                };\n                that._removeClassProxy = function () {\n                    that._active = false;\n                    that._cell.removeClass(FOCUSED);\n                };\n                that.value(value);\n                if (that._isMultipleSelection() && options.selectDates.length > 0) {\n                    that.selectDates(options.selectDates);\n                }\n                kendo.notify(that);\n            },\n            options: {\n                name: 'Calendar',\n                value: null,\n                min: new DATE(1900, 0, 1),\n                max: new DATE(2099, 11, 31),\n                dates: [],\n                disableDates: null,\n                url: '',\n                culture: '',\n                footer: '',\n                format: '',\n                month: {},\n                weekNumber: false,\n                selectable: 'single',\n                selectDates: [],\n                start: MONTH,\n                depth: MONTH,\n                animation: {\n                    horizontal: {\n                        effects: SLIDE,\n                        reverse: true,\n                        duration: 500,\n                        divisor: 2\n                    },\n                    vertical: {\n                        effects: 'zoomIn',\n                        duration: 400\n                    }\n                },\n                messages: { weekColumnHeader: '' }\n            },\n            events: [\n                CHANGE,\n                NAVIGATE\n            ],\n            setOptions: function (options) {\n                var that = this;\n                normalize(options);\n                options.disableDates = getDisabledExpr(options.disableDates);\n                that._destroySelectable();\n                Widget.fn.setOptions.call(that, options);\n                that._templates();\n                that._selectable();\n                that._viewWrapper();\n                that._footer(that.footer);\n                that._index = views[that.options.start];\n                that.navigate();\n                if (options.weekNumber) {\n                    that.element.addClass('k-week-number');\n                }\n            },\n            destroy: function () {\n                var that = this, today = that._today;\n                that.element.off(ns);\n                that._title.off(ns);\n                that[PREVARROW].off(ns);\n                that[NEXTARROW].off(ns);\n                that._destroySelectable();\n                kendo.destroy(that._table);\n                if (today) {\n                    kendo.destroy(today.off(ns));\n                }\n                Widget.fn.destroy.call(that);\n            },\n            current: function () {\n                return this._current;\n            },\n            view: function () {\n                return this._view;\n            },\n            focus: function (table) {\n                table = table || this._table;\n                this._bindTable(table);\n                table.trigger('focus');\n            },\n            min: function (value) {\n                return this._option(MIN, value);\n            },\n            max: function (value) {\n                return this._option('max', value);\n            },\n            navigateToPast: function () {\n                this._navigate(PREVARROW, -1);\n            },\n            navigateToFuture: function () {\n                this._navigate(NEXTARROW, 1);\n            },\n            navigateUp: function () {\n                var that = this, index = that._index;\n                if (that._title.hasClass(DISABLED)) {\n                    return;\n                }\n                that.navigate(that._current, ++index);\n            },\n            navigateDown: function (value) {\n                var that = this, index = that._index, depth = that.options.depth;\n                if (!value) {\n                    return;\n                }\n                if (index === views[depth]) {\n                    if (!isEqualDate(that._value, that._current) || !isEqualDate(that._value, value)) {\n                        that.value(value);\n                        that.trigger(CHANGE);\n                    }\n                    return;\n                }\n                that.navigate(value, --index);\n            },\n            navigate: function (value, view) {\n                view = isNaN(view) ? views[view] : view;\n                var that = this, options = that.options, culture = options.culture, min = options.min, max = options.max, title = that._title, from = that._table, old = that._oldTable, currentValue = that._current, future = value && +value > +currentValue, vertical = view !== undefined && view !== that._index, to, currentView, compare, disabled;\n                if (!value) {\n                    value = currentValue;\n                }\n                that._current = value = new DATE(+restrictValue(value, min, max));\n                if (view === undefined) {\n                    view = that._index;\n                } else {\n                    that._index = view;\n                }\n                that._view = currentView = calendar.views[view];\n                compare = currentView.compare;\n                disabled = view === views[CENTURY];\n                title.toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n                disabled = compare(value, min) < 1;\n                that[PREVARROW].toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n                if (that[PREVARROW].hasClass(DISABLED)) {\n                    that[PREVARROW].removeClass(HOVER);\n                }\n                disabled = compare(value, max) > -1;\n                that[NEXTARROW].toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n                if (that[NEXTARROW].hasClass(DISABLED)) {\n                    that[NEXTARROW].removeClass(HOVER);\n                }\n                if (from && old && old.data('animating')) {\n                    old.kendoStop(true, true);\n                    from.kendoStop(true, true);\n                }\n                that._oldTable = from;\n                if (!from || that._changeView) {\n                    title.html(currentView.title(value, min, max, culture));\n                    that._table = to = $(currentView.content(extend({\n                        min: min,\n                        max: max,\n                        date: value,\n                        url: options.url,\n                        dates: options.dates,\n                        format: options.format,\n                        otherMonth: true,\n                        culture: culture,\n                        disableDates: options.disableDates,\n                        isWeekColumnVisible: options.weekNumber,\n                        messages: options.messages\n                    }, that[currentView.name])));\n                    addClassToViewContainer(to, currentView.name);\n                    makeUnselectable(to);\n                    var replace = from && from.data('start') === to.data('start');\n                    that._animate({\n                        from: from,\n                        to: to,\n                        vertical: vertical,\n                        future: future,\n                        replace: replace\n                    });\n                    that.trigger(NAVIGATE);\n                    that._focus(value);\n                }\n                if (view === views[options.depth] && that._selectDates.length > 0) {\n                    that._visualizeSelectedDatesInView();\n                }\n                if (that.options.selectable === 'single') {\n                    if (view === views[options.depth] && that._value && !that.options.disableDates(that._value)) {\n                        that._class('k-state-selected', that._value);\n                    }\n                }\n                that._class(FOCUSED, value);\n                if (!from && that._cell) {\n                    that._cell.removeClass(FOCUSED);\n                }\n                that._changeView = true;\n            },\n            selectDates: function (dates) {\n                var that = this, validSelectedDates, datesUnique;\n                if (dates === undefined) {\n                    return that._selectDates;\n                }\n                datesUnique = dates.map(function (date) {\n                    return date.getTime();\n                }).filter(function (date, position, array) {\n                    return array.indexOf(date) === position;\n                }).map(function (time) {\n                    return new Date(time);\n                });\n                validSelectedDates = $.grep(datesUnique, function (value) {\n                    if (value) {\n                        return +that._validateValue(new Date(value.setHours(0, 0, 0, 0))) === +value;\n                    }\n                });\n                that._selectDates = validSelectedDates.length > 0 ? validSelectedDates : datesUnique.length === 0 ? datesUnique : that._selectDates;\n                that._visualizeSelectedDatesInView();\n            },\n            value: function (value) {\n                var that = this, old = that._view, view = that._view;\n                if (value === undefined) {\n                    return that._value;\n                }\n                value = that._validateValue(value);\n                if (value && that._isMultipleSelection()) {\n                    var date = new Date(+value);\n                    date.setHours(0, 0, 0, 0);\n                    that._selectDates = [date];\n                    that.selectable._lastActive = null;\n                }\n                if (old && value === null && that._cell) {\n                    that._cell.removeClass(SELECTED);\n                } else {\n                    that._changeView = !value || view && view.compare(value, that._current) !== 0;\n                    that.navigate(value);\n                }\n            },\n            _validateValue: function (value) {\n                var that = this, options = that.options, min = options.min, max = options.max;\n                if (value === null) {\n                    that._current = createDate(that._current.getFullYear(), that._current.getMonth(), that._current.getDate());\n                }\n                value = parse(value, options.format, options.culture);\n                if (value !== null) {\n                    value = new DATE(+value);\n                    if (!isInRange(value, min, max)) {\n                        value = null;\n                    }\n                }\n                if (value === null || !that.options.disableDates(new Date(+value))) {\n                    that._value = value;\n                } else if (that._value === undefined) {\n                    that._value = null;\n                }\n                return that._value;\n            },\n            _visualizeSelectedDatesInView: function () {\n                var that = this;\n                var selectedDates = {};\n                $.each(that._selectDates, function (index, value) {\n                    selectedDates[kendo.calendar.views[0].toDateString(value)] = value;\n                });\n                that.selectable.clear();\n                var cells = that._table.find(CELLSELECTOR).filter(function (index, element) {\n                    return selectedDates[$(element.firstChild).attr(kendo.attr(VALUE))];\n                });\n                if (cells.length > 0) {\n                    that.selectable._selectElement(cells, true);\n                }\n            },\n            _isMultipleSelection: function () {\n                var that = this;\n                return that.options.selectable === 'multiple';\n            },\n            _selectable: function () {\n                var that = this;\n                if (!that._isMultipleSelection()) {\n                    return;\n                }\n                var selectable = that.options.selectable, selectableOptions = Selectable.parseOptions(selectable);\n                if (selectableOptions.multiple) {\n                    that.element.attr('aria-multiselectable', 'true');\n                }\n                that.selectable = new Selectable(that.wrapper, {\n                    aria: true,\n                    inputSelectors: 'input,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,span.k-icon.k-i-arrow-60-down,span.k-icon.k-i-arrow-60-up',\n                    multiple: selectableOptions.multiple,\n                    filter: 'table.k-month:eq(0) ' + CELLSELECTORVALID,\n                    change: proxy(that._onSelect, that),\n                    relatedTarget: proxy(that._onRelatedTarget, that)\n                });\n            },\n            _onRelatedTarget: function (target) {\n                var that = this;\n                if (that.selectable.options.multiple && target.is(CELLSELECTORVALID)) {\n                    that._current = toDateObject(target.find('a'));\n                    that._class(FOCUSED, toDateObject(target.find('a')));\n                }\n            },\n            _onSelect: function (e) {\n                var that = this, eventArgs = e, selectableOptions = Selectable.parseOptions(that.options.selectable);\n                if (!selectableOptions.multiple) {\n                    if ($(eventArgs.event.currentTarget).is('td') && !$(eventArgs.event.currentTarget).hasClass('k-state-selected')) {\n                        $(eventArgs.event.currentTarget).addClass('k-state-selected');\n                    } else {\n                        that._click($(eventArgs.event.currentTarget).find('a'));\n                    }\n                    return;\n                }\n                if (eventArgs.event.ctrlKey || eventArgs.event.metaKey) {\n                    if ($(eventArgs.event.currentTarget).is(CELLSELECTORVALID)) {\n                        that._toggleSelection($(eventArgs.event.currentTarget));\n                    } else {\n                        that._cellsBySelector(CELLSELECTORVALID).each(function (index, element) {\n                            var value = toDateObject($(element).find('a'));\n                            that._deselect(value);\n                        });\n                        that._addSelectedCellsToArray();\n                    }\n                } else if (eventArgs.event.shiftKey) {\n                    that._rangeSelection(that._cell);\n                } else if ($(eventArgs.event.currentTarget).is(CELLSELECTOR)) {\n                    that.value(toDateObject($(eventArgs.event.currentTarget).find('a')));\n                } else {\n                    that._selectDates = [];\n                    that._addSelectedCellsToArray();\n                }\n                that.trigger(CHANGE);\n            },\n            _destroySelectable: function () {\n                var that = this;\n                if (that.selectable) {\n                    that.selectable.destroy();\n                    that.selectable = null;\n                }\n            },\n            _toggleSelection: function (currentCell) {\n                var that = this, date = toDateObject(currentCell.find('a'));\n                if (currentCell.hasClass('k-state-selected')) {\n                    that._selectDates.push(date);\n                } else {\n                    that._deselect(date);\n                }\n            },\n            _rangeSelection: function (toDateCell, startDate) {\n                var that = this, fromDate = startDate || toDateObject(that.selectable.value().first().find('a')), toDate = toDateObject(toDateCell.find('a')), daysDifference;\n                if (that.selectable._lastActive || that._value) {\n                    fromDate = that.selectable._lastActive ? toDateObject(that.selectable._lastActive.find('a')) : new Date(+that._value);\n                } else {\n                    that.selectable._lastActive = startDate ? that._cellByDate(that._view.toDateString(startDate), CELLSELECTORVALID) : that.selectable.value().first();\n                }\n                that._selectDates = [];\n                daysDifference = daysBetweenTwoDates(fromDate, toDate);\n                addDaysToArray(that._selectDates, daysDifference, fromDate, that.options.disableDates);\n                that._visualizeSelectedDatesInView();\n            },\n            _cellsBySelector: function (selector) {\n                var that = this;\n                return that._table.find(selector);\n            },\n            _addSelectedCellsToArray: function () {\n                var that = this;\n                that.selectable.value().each(function (index, item) {\n                    var date = toDateObject($(item.firstChild));\n                    if (!that.options.disableDates(date)) {\n                        that._selectDates.push(date);\n                    }\n                });\n            },\n            _deselect: function (date) {\n                var that = this;\n                var currentDateIndex = that._selectDates.map(Number).indexOf(+date);\n                if (currentDateIndex != -1) {\n                    that._selectDates.splice(currentDateIndex, 1);\n                }\n            },\n            _dateInView: function (date) {\n                var that = this, firstDateInView = toDateObject(that._cellsBySelector(CELLSELECTORVALID + ':first').find('a')), lastDateInView = toDateObject(that._cellsBySelector(CELLSELECTORVALID + ':last').find('a'));\n                return +date <= +lastDateInView && +date >= +firstDateInView;\n            },\n            _isNavigatable: function (currentValue, cellIndex) {\n                var that = this;\n                var isDisabled = that.options.disableDates;\n                var cell;\n                var index;\n                if (that._view.name == 'month') {\n                    return !isDisabled(currentValue);\n                } else {\n                    index = that.wrapper.find('.' + FOCUSED).index();\n                    cell = that.wrapper.find('.k-content td:eq(' + (index + cellIndex) + ')');\n                    return cell.is(CELLSELECTORVALID) || !isDisabled(currentValue);\n                }\n            },\n            _move: function (e) {\n                var that = this, options = that.options, key = e.keyCode, view = that._view, index = that._index, min = that.options.min, max = that.options.max, currentValue = new DATE(+that._current), isRtl = kendo.support.isRtl(that.wrapper), isDisabled = that.options.disableDates, value, prevent, method, temp;\n                if (e.target === that._table[0]) {\n                    that._active = true;\n                }\n                if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {\n                    value = 1;\n                    prevent = true;\n                } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {\n                    value = -1;\n                    prevent = true;\n                } else if (key == keys.UP) {\n                    value = index === 0 ? -7 : -4;\n                    prevent = true;\n                } else if (key == keys.DOWN) {\n                    value = index === 0 ? 7 : 4;\n                    prevent = true;\n                } else if (key == keys.SPACEBAR) {\n                    value = 0;\n                    prevent = true;\n                } else if (key == keys.HOME || key == keys.END) {\n                    method = key == keys.HOME ? 'first' : 'last';\n                    temp = view[method](currentValue);\n                    currentValue = new DATE(temp.getFullYear(), temp.getMonth(), temp.getDate(), currentValue.getHours(), currentValue.getMinutes(), currentValue.getSeconds(), currentValue.getMilliseconds());\n                    currentValue.setFullYear(temp.getFullYear());\n                    prevent = true;\n                }\n                if (e.ctrlKey || e.metaKey) {\n                    if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {\n                        that.navigateToFuture();\n                        prevent = true;\n                    } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {\n                        that.navigateToPast();\n                        prevent = true;\n                    } else if (key == keys.UP) {\n                        that.navigateUp();\n                        prevent = true;\n                    } else if (key == keys.DOWN) {\n                        that._click($(that._cell[0].firstChild));\n                        prevent = true;\n                    } else if ((key == keys.ENTER || key == keys.SPACEBAR) && that._isMultipleSelection()) {\n                        that._keyboardToggleSelection(e);\n                        var focusedDate = toDateObject($(that._cell[0]).find('a'));\n                        that._class(FOCUSED, focusedDate);\n                    }\n                } else if (e.shiftKey) {\n                    if (value !== undefined || method) {\n                        if (!method) {\n                            view.setDate(currentValue, value);\n                        }\n                        if (!isInRange(currentValue, min, max)) {\n                            currentValue = restrictValue(currentValue, options.min, options.max);\n                        }\n                        if (isDisabled(currentValue)) {\n                            currentValue = that._nextNavigatable(currentValue, value);\n                        }\n                        min = createDate(min.getFullYear(), min.getMonth(), min.getDate());\n                        if (that._isMultipleSelection()) {\n                            that._keyboardRangeSelection(e, currentValue);\n                        } else {\n                            that._focus(currentValue);\n                        }\n                    }\n                } else {\n                    if (key == keys.ENTER || key == keys.SPACEBAR) {\n                        if (view.name == 'month' && that._isMultipleSelection()) {\n                            that.value(toDateObject($(that._cell.find('a'))));\n                            that.selectable._lastActive = $(that._cell[0]);\n                            that.trigger(CHANGE);\n                        } else {\n                            that._click($(that._cell[0].firstChild));\n                        }\n                        prevent = true;\n                    } else if (key == keys.PAGEUP) {\n                        prevent = true;\n                        that.navigateToPast();\n                    } else if (key == keys.PAGEDOWN) {\n                        prevent = true;\n                        that.navigateToFuture();\n                    }\n                    if (value || method) {\n                        if (!method) {\n                            view.setDate(currentValue, value);\n                        }\n                        min = createDate(min.getFullYear(), min.getMonth(), min.getDate());\n                        if (!isInRange(currentValue, min, max)) {\n                            currentValue = restrictValue(currentValue, options.min, options.max);\n                        }\n                        if (!that._isNavigatable(currentValue, value)) {\n                            currentValue = that._nextNavigatable(currentValue, value);\n                        }\n                        if (that._isMultipleSelection()) {\n                            if (!that._dateInView(currentValue)) {\n                                that.navigate(currentValue);\n                            } else {\n                                that._current = currentValue;\n                                that._class(FOCUSED, currentValue);\n                            }\n                        } else {\n                            that._focus(currentValue);\n                        }\n                    }\n                }\n                if (prevent) {\n                    e.preventDefault();\n                }\n                return that._current;\n            },\n            _keyboardRangeSelection: function (event, currentValue) {\n                var that = this, fromDate, daysDifference;\n                if (!that._dateInView(currentValue)) {\n                    that._selectDates = [];\n                    fromDate = that.selectable._lastActive ? toDateObject(that.selectable._lastActive.find('a')) : currentValue;\n                    daysDifference = daysBetweenTwoDates(fromDate, new Date(+currentValue));\n                    addDaysToArray(that._selectDates, daysDifference, fromDate, that.options.disableDates);\n                    that.navigate(currentValue);\n                    that._current = currentValue;\n                    that.selectable._lastActive = that.selectable._lastActive || that._cellByDate(that._view.toDateString(currentValue), CELLSELECTORVALID);\n                    that.trigger(CHANGE);\n                    return;\n                }\n                that.selectable.options.filter = that.wrapper.find('table').length > 1 && +currentValue > +that._current ? 'table.k-month:eq(1) ' + CELLSELECTORVALID : 'table.k-month:eq(0) ' + CELLSELECTORVALID;\n                that._class(FOCUSED, currentValue);\n                that._current = currentValue;\n                that._rangeSelection(that._cellByDate(that._view.toDateString(currentValue), CELLSELECTORVALID), currentValue);\n                that.trigger(CHANGE);\n                that.selectable.options.filter = 'table.k-month:eq(0) ' + CELLSELECTORVALID;\n            },\n            _keyboardToggleSelection: function (event) {\n                var that = this;\n                event.currentTarget = that._cell[0];\n                that.selectable._lastActive = $(that._cell[0]);\n                if ($(that._cell[0]).hasClass(SELECTED)) {\n                    that.selectable._unselect($(that._cell[0]));\n                    that.selectable.trigger(CHANGE, { event: event });\n                } else {\n                    that.selectable.value($(that._cell[0]), { event: event });\n                }\n            },\n            _nextNavigatable: function (currentValue, value) {\n                var that = this, disabled = true, view = that._view, min = that.options.min, max = that.options.max, isDisabled = that.options.disableDates, navigatableDate = new Date(currentValue.getTime());\n                view.setDate(navigatableDate, -value);\n                while (disabled) {\n                    view.setDate(currentValue, value);\n                    if (!isInRange(currentValue, min, max)) {\n                        currentValue = navigatableDate;\n                        break;\n                    }\n                    disabled = isDisabled(currentValue);\n                }\n                return currentValue;\n            },\n            _animate: function (options) {\n                var that = this;\n                var from = options.from;\n                var to = options.to;\n                var active = that._active;\n                var viewWrapper = that.element.children('.k-calendar-view');\n                if (!from) {\n                    viewWrapper.append(to);\n                    that._bindTable(to);\n                } else if (from.parent().data('animating')) {\n                    from.off(ns);\n                    from.parent().kendoStop(true, true).remove();\n                    from.remove();\n                    viewWrapper.append(to);\n                    that._focusView(active);\n                } else if (!from.is(':visible') || that.options.animation === false || options.replace) {\n                    to.insertAfter(from);\n                    from.off(ns).remove();\n                    that._focusView(active);\n                } else {\n                    that[options.vertical ? '_vertical' : '_horizontal'](from, to, options.future);\n                }\n            },\n            _horizontal: function (from, to, future) {\n                var that = this, active = that._active, horizontal = that.options.animation.horizontal, effects = horizontal.effects, viewWidth = outerWidth(from);\n                if (effects && effects.indexOf(SLIDE) != -1) {\n                    from.add(to).css({ width: viewWidth });\n                    from.wrap('<div/>');\n                    that._focusView(active, from);\n                    from.parent().css({\n                        position: 'relative',\n                        width: viewWidth * 2,\n                        'float': LEFT,\n                        'margin-left': future ? 0 : -viewWidth\n                    });\n                    to[future ? 'insertAfter' : 'insertBefore'](from);\n                    extend(horizontal, {\n                        effects: SLIDE + ':' + (future ? 'right' : LEFT),\n                        complete: function () {\n                            from.off(ns).remove();\n                            that._oldTable = null;\n                            to.unwrap();\n                            that._focusView(active);\n                        }\n                    });\n                    from.parent().kendoStop(true, true).kendoAnimate(horizontal);\n                }\n            },\n            _vertical: function (from, to) {\n                var that = this, vertical = that.options.animation.vertical, effects = vertical.effects, active = that._active, cell, position;\n                if (effects && effects.indexOf('zoom') != -1) {\n                    to.insertBefore(from);\n                    from.css({\n                        position: 'absolute',\n                        width: to.width()\n                    });\n                    if (transitionOrigin) {\n                        cell = that._cellByDate(that._view.toDateString(that._current));\n                        position = cell.position();\n                        position = position.left + parseInt(cell.width() / 2, 10) + 'px' + ' ' + (position.top + parseInt(cell.height() / 2, 10) + 'px');\n                        to.css(transitionOrigin, position);\n                    }\n                    from.kendoStop(true, true).kendoAnimate({\n                        effects: 'fadeOut',\n                        duration: 600,\n                        complete: function () {\n                            from.off(ns).remove();\n                            that._oldTable = null;\n                            that._focusView(active);\n                        }\n                    });\n                    to.kendoStop(true, true).kendoAnimate(vertical);\n                }\n            },\n            _cellByDate: function (value, selector) {\n                return this._table.find(selector ? selector : 'td:not(.' + OTHERMONTH + ')').filter(function () {\n                    return $(this.firstChild).attr(kendo.attr(VALUE)) === value;\n                });\n            },\n            _class: function (className, date) {\n                var that = this, id = that._cellID, cell = that._cell, value = that._view.toDateString(date), disabledDate;\n                if (cell && cell.length) {\n                    cell[0].removeAttribute(ARIA_SELECTED);\n                    cell[0].removeAttribute(ARIA_LABEL);\n                    cell[0].removeAttribute(ID);\n                }\n                if (date && that._view.name == 'month') {\n                    disabledDate = that.options.disableDates(date);\n                }\n                that._cellsBySelector(that._isMultipleSelection() ? CELLSELECTOR : 'td:not(.' + OTHERMONTH + ')').removeClass(className);\n                cell = that._cellByDate(value, that.options.selectable == 'multiple' ? CELLSELECTOR : 'td:not(.' + OTHERMONTH + ')').attr(ARIA_SELECTED, true);\n                if (className === FOCUSED && !that._active && that.options.focusOnNav !== false || disabledDate) {\n                    className = '';\n                }\n                cell.addClass(className);\n                if (cell[0]) {\n                    that._cell = cell;\n                }\n                if (id) {\n                    cell.attr(ID, id);\n                    that._table[0].removeAttribute('aria-activedescendant');\n                    that._table.attr('aria-activedescendant', id);\n                }\n            },\n            _bindTable: function (table) {\n                table.on(FOCUS_WITH_NS, this._addClassProxy).on(BLUR, this._removeClassProxy);\n            },\n            _click: function (link) {\n                var that = this, options = that.options, currentValue = new Date(+that._current), value = toDateObject(link);\n                adjustDST(value, 0);\n                if (that._view.name == 'month' && that.options.disableDates(value)) {\n                    value = that._value;\n                }\n                that._view.setDate(currentValue, value);\n                that.navigateDown(restrictValue(currentValue, options.min, options.max));\n            },\n            _focus: function (value) {\n                var that = this, view = that._view;\n                if (view.compare(value, that._current) !== 0) {\n                    that.navigate(value);\n                } else {\n                    that._current = value;\n                    that._class(FOCUSED, value);\n                }\n            },\n            _focusView: function (active, table) {\n                if (active) {\n                    this.focus(table);\n                }\n            },\n            _viewWrapper: function () {\n                var that = this;\n                var element = that.element;\n                var viewWrapper = element.children('.k-calendar-view');\n                if (!viewWrapper[0]) {\n                    viewWrapper = $('<div class=\\'k-calendar-view\\' />').insertAfter(element.find('.k-header'));\n                }\n            },\n            _footer: function (template) {\n                var that = this, today = getToday(), element = that.element, footer = element.find('.k-footer');\n                if (!template) {\n                    that._toggle(false);\n                    footer.hide();\n                    return;\n                }\n                if (!footer[0]) {\n                    footer = $('<div class=\"k-footer\"><a href=\"#\" class=\"k-link k-nav-today\"></a></div>').appendTo(element);\n                }\n                that._today = footer.show().find('.k-link').html(template(today)).attr('title', kendo.toString(today, 'D', that.options.culture));\n                that._toggle();\n            },\n            _header: function () {\n                var that = this, element = that.element, links;\n                if (!element.find('.k-header')[0]) {\n                    element.html('<div class=\"k-header\">' + '<a href=\"#\" role=\"button\" class=\"k-link k-nav-prev\" ' + ARIA_LABEL + '=\"Previous\"><span class=\"k-icon k-i-arrow-60-left\"></span></a>' + '<a href=\"#\" role=\"button\" aria-live=\"assertive\" aria-atomic=\"true\" class=\"k-link k-nav-fast\"></a>' + '<a href=\"#\" role=\"button\" class=\"k-link k-nav-next\" ' + ARIA_LABEL + '=\"Next\"><span class=\"k-icon k-i-arrow-60-right\"></span></a>' + '</div>');\n                }\n                links = element.find('.k-link').on(MOUSEENTER_WITH_NS + ' ' + MOUSELEAVE + ' ' + FOCUS_WITH_NS + ' ' + BLUR, mousetoggle).on(CLICK + ' touchend' + ns, function () {\n                    return false;\n                });\n                that._title = links.eq(1).on(CLICK + ' touchend' + ns, function () {\n                    that._active = that.options.focusOnNav !== false;\n                    that.navigateUp();\n                });\n                that[PREVARROW] = links.eq(0).on(CLICK + ' touchend' + ns, function () {\n                    that._active = that.options.focusOnNav !== false;\n                    that.navigateToPast();\n                });\n                that[NEXTARROW] = links.eq(2).on(CLICK + ' touchend' + ns, function () {\n                    that._active = that.options.focusOnNav !== false;\n                    that.navigateToFuture();\n                });\n            },\n            _navigate: function (arrow, modifier) {\n                var that = this, index = that._index + 1, currentValue = new DATE(+that._current);\n                if (that._isMultipleSelection()) {\n                    var firstDayCurrentMonth = that._table.find('td:not(.k-other-month):not(.k-out-of-range)').has('.k-link').first();\n                    currentValue = toDateObject(firstDayCurrentMonth.find('a'));\n                    that._current = new Date(+currentValue);\n                }\n                arrow = that[arrow];\n                if (!arrow.hasClass(DISABLED)) {\n                    if (index > 3) {\n                        currentValue.setFullYear(currentValue.getFullYear() + 100 * modifier);\n                    } else {\n                        calendar.views[index].setDate(currentValue, modifier);\n                    }\n                    that.navigate(currentValue);\n                }\n            },\n            _option: function (option, value) {\n                var that = this, options = that.options, currentValue = that._value || that._current, isBigger;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = parse(value, options.format, options.culture);\n                if (!value) {\n                    return;\n                }\n                options[option] = new DATE(+value);\n                if (option === MIN) {\n                    isBigger = value > currentValue;\n                } else {\n                    isBigger = currentValue > value;\n                }\n                if (isBigger || isEqualMonth(currentValue, value)) {\n                    if (isBigger) {\n                        that._value = null;\n                    }\n                    that._changeView = true;\n                }\n                if (!that._changeView) {\n                    that._changeView = !!(options.month.content || options.month.empty);\n                }\n                that.navigate(that._value);\n                that._toggle();\n            },\n            _toggle: function (toggle) {\n                var that = this, options = that.options, isTodayDisabled = that.options.disableDates(getToday()), link = that._today;\n                if (toggle === undefined) {\n                    toggle = isInRange(getToday(), options.min, options.max);\n                }\n                if (link) {\n                    link.off(CLICK);\n                    if (toggle && !isTodayDisabled) {\n                        link.addClass(TODAY).removeClass(DISABLED).on(CLICK, proxy(that._todayClick, that));\n                    } else {\n                        link.removeClass(TODAY).addClass(DISABLED).on(CLICK, prevent);\n                    }\n                }\n            },\n            _todayClick: function (e) {\n                var that = this, depth = views[that.options.depth], disabled = that.options.disableDates, today = getToday();\n                e.preventDefault();\n                if (disabled(today)) {\n                    return;\n                }\n                if (that._view.compare(that._current, today) === 0 && that._index == depth) {\n                    that._changeView = false;\n                }\n                if (that._isMultipleSelection()) {\n                    that._selectDates = [today];\n                    that.selectable._lastActive = null;\n                }\n                that._value = today;\n                that.navigate(today, depth);\n                that.trigger(CHANGE);\n            },\n            _templates: function () {\n                var that = this, options = that.options, footer = options.footer, month = options.month, content = month.content, weekNumber = month.weekNumber, empty = month.empty, footerTemplate = '#= kendo.toString(data,\"D\",\"' + options.culture + '\") #';\n                that.month = {\n                    content: template('<td#=data.cssClass# role=\"gridcell\"><a tabindex=\"-1\" class=\"k-link#=data.linkClass#\" href=\"#=data.url#\" ' + kendo.attr(VALUE) + '=\"#=data.dateString#\" title=\"#=data.title#\">' + (content || '#=data.value#') + '</a></td>', { useWithBlock: !!content }),\n                    empty: template('<td role=\"gridcell\">' + (empty || '&nbsp;') + '</td>', { useWithBlock: !!empty }),\n                    weekNumber: template('<td class=\"k-alt\">' + (weekNumber || '#= data.weekNumber #') + '</td>', { useWithBlock: !!weekNumber })\n                };\n                if (footer && footer !== true) {\n                    footerTemplate = footer;\n                }\n                that.footer = footer !== false ? template(footerTemplate, { useWithBlock: false }) : null;\n            }\n        });\n        ui.plugin(Calendar);\n        var calendar = {\n            firstDayOfMonth: function (date) {\n                return createDate(date.getFullYear(), date.getMonth(), 1);\n            },\n            firstVisibleDay: function (date, calendarInfo) {\n                calendarInfo = calendarInfo || kendo.culture().calendar;\n                var firstDay = calendarInfo.firstDay, firstVisibleDay = new DATE(date.getFullYear(), date.getMonth(), 1, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n                firstVisibleDay.setFullYear(date.getFullYear());\n                while (firstVisibleDay.getDay() != firstDay) {\n                    calendar.setTime(firstVisibleDay, -1 * MS_PER_DAY);\n                }\n                return firstVisibleDay;\n            },\n            setTime: function (date, time) {\n                var tzOffsetBefore = date.getTimezoneOffset(), resultDATE = new DATE(date.getTime() + time), tzOffsetDiff = resultDATE.getTimezoneOffset() - tzOffsetBefore;\n                date.setTime(resultDATE.getTime() + tzOffsetDiff * MS_PER_MINUTE);\n            },\n            views: [\n                {\n                    name: MONTH,\n                    title: function (date, min, max, culture) {\n                        return getCalendarInfo(culture).months.names[date.getMonth()] + ' ' + date.getFullYear();\n                    },\n                    content: function (options) {\n                        var that = this, idx = 0, min = options.min, max = options.max, date = options.date, dates = options.dates, format = options.format, culture = options.culture, navigateUrl = options.url, showHeader = options.showHeader, otherMonth = options.otherMonth, isWeekColumnVisible = options.isWeekColumnVisible, hasUrl = navigateUrl && dates[0], currentCalendar = getCalendarInfo(culture), firstDayIdx = currentCalendar.firstDay, days = currentCalendar.days, names = shiftArray(days.names, firstDayIdx), shortNames = shiftArray(days.namesShort, firstDayIdx), start = calendar.firstVisibleDay(date, currentCalendar), firstDayOfMonth = that.first(date), lastDayOfMonth = that.last(date), toDateString = that.toDateString, today = getToday(), html = '<table tabindex=\"0\" role=\"grid\" class=\"k-content\" cellspacing=\"0\" data-start=\"' + toDateString(start) + '\">';\n                        if (showHeader) {\n                            html += '<caption class=\"k-month-header\">' + this.title(date, min, max, culture) + '</caption><thead><tr role=\"row\">';\n                        } else {\n                            html += '<thead><tr role=\"row\">';\n                        }\n                        if (isWeekColumnVisible) {\n                            html += '<th scope=\"col\" class=\"k-alt\">' + options.messages.weekColumnHeader + '</th>';\n                        }\n                        for (; idx < 7; idx++) {\n                            html += '<th scope=\"col\" title=\"' + names[idx] + '\">' + shortNames[idx] + '</th>';\n                        }\n                        adjustDST(today, 0);\n                        today = +today;\n                        return view({\n                            cells: 42,\n                            perRow: 7,\n                            html: html += '</tr></thead><tbody><tr role=\"row\">',\n                            start: start,\n                            isWeekColumnVisible: isWeekColumnVisible,\n                            weekNumber: options.weekNumber,\n                            min: createDate(min.getFullYear(), min.getMonth(), min.getDate()),\n                            max: createDate(max.getFullYear(), max.getMonth(), max.getDate()),\n                            otherMonth: otherMonth,\n                            content: options.content,\n                            lastDayOfMonth: lastDayOfMonth,\n                            empty: options.empty,\n                            setter: that.setDate,\n                            disableDates: options.disableDates,\n                            build: function (date, idx, disableDates) {\n                                var cssClass = [], day = date.getDay(), linkClass = '', url = '#';\n                                if (date < firstDayOfMonth || date > lastDayOfMonth) {\n                                    cssClass.push(OTHERMONTH);\n                                }\n                                if (disableDates(date)) {\n                                    cssClass.push(DISABLED);\n                                }\n                                if (+date === today) {\n                                    cssClass.push('k-today');\n                                }\n                                if (day === 0 || day === 6) {\n                                    cssClass.push('k-weekend');\n                                }\n                                if (hasUrl && inArray(+date, dates)) {\n                                    url = navigateUrl.replace('{0}', kendo.toString(date, format, culture));\n                                    linkClass = ' k-action-link';\n                                }\n                                return {\n                                    date: date,\n                                    dates: dates,\n                                    ns: kendo.ns,\n                                    title: kendo.toString(date, 'D', culture),\n                                    value: date.getDate(),\n                                    dateString: toDateString(date),\n                                    cssClass: cssClass[0] ? ' class=\"' + cssClass.join(' ') + '\"' : '',\n                                    linkClass: linkClass,\n                                    url: url\n                                };\n                            },\n                            weekNumberBuild: function (date) {\n                                return {\n                                    weekNumber: weekInYear(date, kendo.culture().calendar.firstDay),\n                                    currentDate: date\n                                };\n                            }\n                        });\n                    },\n                    first: function (date) {\n                        return calendar.firstDayOfMonth(date);\n                    },\n                    last: function (date) {\n                        var last = createDate(date.getFullYear(), date.getMonth() + 1, 0), first = calendar.firstDayOfMonth(date), timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\n                        if (timeOffset) {\n                            last.setHours(first.getHours() + timeOffset / 60);\n                        }\n                        return last;\n                    },\n                    compare: function (date1, date2) {\n                        var result, month1 = date1.getMonth(), year1 = date1.getFullYear(), month2 = date2.getMonth(), year2 = date2.getFullYear();\n                        if (year1 > year2) {\n                            result = 1;\n                        } else if (year1 < year2) {\n                            result = -1;\n                        } else {\n                            result = month1 == month2 ? 0 : month1 > month2 ? 1 : -1;\n                        }\n                        return result;\n                    },\n                    setDate: function (date, value) {\n                        var hours = date.getHours();\n                        if (value instanceof DATE) {\n                            date.setFullYear(value.getFullYear(), value.getMonth(), value.getDate());\n                        } else {\n                            calendar.setTime(date, value * MS_PER_DAY);\n                        }\n                        adjustDST(date, hours);\n                    },\n                    toDateString: function (date) {\n                        return date.getFullYear() + '/' + date.getMonth() + '/' + date.getDate();\n                    }\n                },\n                {\n                    name: 'year',\n                    title: function (date) {\n                        return date.getFullYear();\n                    },\n                    content: function (options) {\n                        var namesAbbr = getCalendarInfo(options.culture).months.namesAbbr, toDateString = this.toDateString, min = options.min, max = options.max, html = '';\n                        if (options.showHeader) {\n                            html += '<table tabindex=\"0\" role=\"grid\" class=\"k-content k-meta-view\" cellspacing=\"0\"><caption class=\"k-meta-header\">';\n                            html += this.title(options.date);\n                            html += '</caption><tbody><tr role=\"row\">';\n                        }\n                        return view({\n                            min: createDate(min.getFullYear(), min.getMonth(), 1),\n                            max: createDate(max.getFullYear(), max.getMonth(), 1),\n                            start: createDate(options.date.getFullYear(), 0, 1),\n                            html: html,\n                            setter: this.setDate,\n                            build: function (date) {\n                                return {\n                                    value: namesAbbr[date.getMonth()],\n                                    ns: kendo.ns,\n                                    dateString: toDateString(date),\n                                    cssClass: ''\n                                };\n                            }\n                        });\n                    },\n                    first: function (date) {\n                        return createDate(date.getFullYear(), 0, date.getDate());\n                    },\n                    last: function (date) {\n                        return createDate(date.getFullYear(), 11, date.getDate());\n                    },\n                    compare: function (date1, date2) {\n                        return compare(date1, date2);\n                    },\n                    setDate: function (date, value) {\n                        var month, hours = date.getHours();\n                        if (value instanceof DATE) {\n                            month = value.getMonth();\n                            date.setFullYear(value.getFullYear(), month, date.getDate());\n                            if (month !== date.getMonth()) {\n                                date.setDate(0);\n                            }\n                        } else {\n                            month = date.getMonth() + value;\n                            date.setMonth(month);\n                            if (month > 11) {\n                                month -= 12;\n                            }\n                            if (month > 0 && date.getMonth() != month) {\n                                date.setDate(0);\n                            }\n                        }\n                        adjustDST(date, hours);\n                    },\n                    toDateString: function (date) {\n                        return date.getFullYear() + '/' + date.getMonth() + '/1';\n                    }\n                },\n                {\n                    name: 'decade',\n                    title: function (date, min, max) {\n                        return title(date, min, max, 10);\n                    },\n                    content: function (options) {\n                        var year = options.date.getFullYear(), toDateString = this.toDateString, html = '';\n                        if (options.showHeader) {\n                            html += '<table tabindex=\"0\" role=\"grid\" class=\"k-content k-meta-view\" cellspacing=\"0\"><caption class=\"k-meta-header\">';\n                            html += this.title(options.date, options.min, options.max);\n                            html += '</caption><tbody><tr role=\"row\">';\n                        }\n                        return view({\n                            start: createDate(year - year % 10 - 1, 0, 1),\n                            min: createDate(options.min.getFullYear(), 0, 1),\n                            max: createDate(options.max.getFullYear(), 0, 1),\n                            otherMonth: options.otherMonth,\n                            html: html,\n                            setter: this.setDate,\n                            build: function (date, idx) {\n                                return {\n                                    value: date.getFullYear(),\n                                    ns: kendo.ns,\n                                    dateString: toDateString(date),\n                                    cssClass: idx === 0 || idx == 11 ? OTHERMONTHCLASS : ''\n                                };\n                            }\n                        });\n                    },\n                    first: function (date) {\n                        var year = date.getFullYear();\n                        return createDate(year - year % 10, date.getMonth(), date.getDate());\n                    },\n                    last: function (date) {\n                        var year = date.getFullYear();\n                        return createDate(year - year % 10 + 9, date.getMonth(), date.getDate());\n                    },\n                    compare: function (date1, date2) {\n                        return compare(date1, date2, 10);\n                    },\n                    setDate: function (date, value) {\n                        setDate(date, value, 1);\n                    },\n                    toDateString: function (date) {\n                        return date.getFullYear() + '/0/1';\n                    }\n                },\n                {\n                    name: CENTURY,\n                    title: function (date, min, max) {\n                        return title(date, min, max, 100);\n                    },\n                    content: function (options) {\n                        var year = options.date.getFullYear(), min = options.min.getFullYear(), max = options.max.getFullYear(), toDateString = this.toDateString, minYear = min, maxYear = max, html = '';\n                        minYear = minYear - minYear % 10;\n                        maxYear = maxYear - maxYear % 10;\n                        if (maxYear - minYear < 10) {\n                            maxYear = minYear + 9;\n                        }\n                        if (options.showHeader) {\n                            html += '<table tabindex=\"0\" role=\"grid\" class=\"k-content k-meta-view\" cellspacing=\"0\"><caption class=\"k-meta-header\">';\n                            html += this.title(options.date, options.min, options.max);\n                            html += '</caption><tbody><tr role=\"row\">';\n                        }\n                        return view({\n                            start: createDate(year - year % 100 - 10, 0, 1),\n                            min: createDate(minYear, 0, 1),\n                            max: createDate(maxYear, 0, 1),\n                            otherMonth: options.otherMonth,\n                            html: html,\n                            setter: this.setDate,\n                            build: function (date, idx) {\n                                var start = date.getFullYear(), end = start + 9;\n                                if (start < min) {\n                                    start = min;\n                                }\n                                if (end > max) {\n                                    end = max;\n                                }\n                                return {\n                                    ns: kendo.ns,\n                                    value: start + ' - ' + end,\n                                    dateString: toDateString(date),\n                                    cssClass: idx === 0 || idx == 11 ? OTHERMONTHCLASS : ''\n                                };\n                            }\n                        });\n                    },\n                    first: function (date) {\n                        var year = date.getFullYear();\n                        return createDate(year - year % 100, date.getMonth(), date.getDate());\n                    },\n                    last: function (date) {\n                        var year = date.getFullYear();\n                        return createDate(year - year % 100 + 99, date.getMonth(), date.getDate());\n                    },\n                    compare: function (date1, date2) {\n                        return compare(date1, date2, 100);\n                    },\n                    setDate: function (date, value) {\n                        setDate(date, value, 10);\n                    },\n                    toDateString: function (date) {\n                        var year = date.getFullYear();\n                        return year - year % 10 + '/0/1';\n                    }\n                }\n            ]\n        };\n        function title(date, min, max, modular) {\n            var start = date.getFullYear(), minYear = min.getFullYear(), maxYear = max.getFullYear(), end;\n            start = start - start % modular;\n            end = start + (modular - 1);\n            if (start < minYear) {\n                start = minYear;\n            }\n            if (end > maxYear) {\n                end = maxYear;\n            }\n            return start + '-' + end;\n        }\n        function view(options) {\n            var idx = 0, data, min = options.min, max = options.max, start = options.start, setter = options.setter, build = options.build, weekNumberBuild = options.weekNumberBuild, length = options.cells || 12, isWeekColumnVisible = options.isWeekColumnVisible, cellsPerRow = options.perRow || 4, otherMonth = options.otherMonth, lastDayOfMonth = options.lastDayOfMonth, weekNumber = options.weekNumber || weekNumberTemplate, content = options.content || cellTemplate, empty = options.empty || emptyCellTemplate, otherMonthTemplate = options.otherMonthCellTemplate || otherMonthCellTemplate, html = options.html || '<table tabindex=\"0\" role=\"grid\" class=\"k-content k-meta-view\" cellspacing=\"0\"><tbody><tr role=\"row\">';\n            if (isWeekColumnVisible) {\n                html += weekNumber(weekNumberBuild(start));\n            }\n            for (; idx < length; idx++) {\n                if (idx > 0 && idx % cellsPerRow === 0) {\n                    html += '</tr><tr role=\"row\">';\n                    if (isWeekColumnVisible) {\n                        html += otherMonth || +start <= +lastDayOfMonth ? weekNumber(weekNumberBuild(start)) : weekNumber({ weekNumber: '&nbsp;' });\n                    }\n                }\n                start = createDate(start.getFullYear(), start.getMonth(), start.getDate());\n                adjustDST(start, 0);\n                data = build(start, idx, options.disableDates);\n                html += data.cssClass.indexOf(OTHERMONTH) !== -1 && !otherMonth ? otherMonthTemplate(data) : isInRange(start, min, max) ? content(data) : empty(data);\n                setter(start, 1);\n            }\n            return html + '</tr></tbody></table>';\n        }\n        function compare(date1, date2, modifier) {\n            var year1 = date1.getFullYear(), start = date2.getFullYear(), end = start, result = 0;\n            if (modifier) {\n                start = start - start % modifier;\n                end = start - start % modifier + modifier - 1;\n            }\n            if (year1 > end) {\n                result = 1;\n            } else if (year1 < start) {\n                result = -1;\n            }\n            return result;\n        }\n        function getToday() {\n            var today = new DATE();\n            return new DATE(today.getFullYear(), today.getMonth(), today.getDate());\n        }\n        function restrictValue(value, min, max) {\n            var today = getToday();\n            if (value) {\n                today = new DATE(+value);\n            }\n            if (min > today) {\n                today = new DATE(+min);\n            } else if (max < today) {\n                today = new DATE(+max);\n            }\n            return today;\n        }\n        function isInRange(date, min, max) {\n            return +date >= +min && +date <= +max;\n        }\n        function shiftArray(array, idx) {\n            return array.slice(idx).concat(array.slice(0, idx));\n        }\n        function setDate(date, value, multiplier) {\n            value = value instanceof DATE ? value.getFullYear() : date.getFullYear() + multiplier * value;\n            date.setFullYear(value);\n        }\n        function daysBetweenTwoDates(startDate, endDate) {\n            if (+endDate < +startDate) {\n                var temp = +startDate;\n                calendar.views[0].setDate(startDate, endDate);\n                calendar.views[0].setDate(endDate, new Date(temp));\n            }\n            var fromDateUTC = Date.UTC(startDate.getFullYear(), startDate.getMonth(), startDate.getDate());\n            var endDateUTC = Date.UTC(endDate.getFullYear(), endDate.getMonth(), endDate.getDate());\n            return Math.ceil((+endDateUTC - +fromDateUTC) / kendo.date.MS_PER_DAY);\n        }\n        function addDaysToArray(array, numberOfDays, fromDate, disableDates) {\n            for (var i = 0; i <= numberOfDays; i++) {\n                var nextDay = new Date(fromDate.getTime());\n                nextDay = new Date(nextDay.setDate(nextDay.getDate() + i));\n                if (!disableDates(nextDay)) {\n                    array.push(nextDay);\n                }\n            }\n        }\n        function mousetoggle(e) {\n            var disabled = $(this).hasClass('k-state-disabled');\n            if (!disabled) {\n                $(this).toggleClass(HOVER, MOUSEENTER.indexOf(e.type) > -1 || e.type == FOCUS);\n            }\n        }\n        function prevent(e) {\n            e.preventDefault();\n        }\n        function createDate(year, month, date) {\n            var dateObject = new DATE(year, month, date);\n            dateObject.setFullYear(year, month, date);\n            return dateObject;\n        }\n        function getCalendarInfo(culture) {\n            return getCulture(culture).calendars.standard;\n        }\n        function normalize(options) {\n            var start = views[options.start], depth = views[options.depth], culture = getCulture(options.culture);\n            options.format = extractFormat(options.format || culture.calendars.standard.patterns.d);\n            if (isNaN(start)) {\n                start = 0;\n                options.start = MONTH;\n            }\n            if (depth === undefined || depth > start) {\n                options.depth = MONTH;\n            }\n            if (options.dates === null) {\n                options.dates = [];\n            }\n        }\n        function makeUnselectable(element) {\n            if (isIE8) {\n                element.find('*').attr('unselectable', 'on');\n            }\n        }\n        function addClassToViewContainer(element, currentView) {\n            element.addClass('k-' + currentView);\n        }\n        function inArray(date, dates) {\n            for (var i = 0, length = dates.length; i < length; i++) {\n                if (date === +dates[i]) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        function isEqualDatePart(value1, value2) {\n            if (value1) {\n                return value1.getFullYear() === value2.getFullYear() && value1.getMonth() === value2.getMonth() && value1.getDate() === value2.getDate();\n            }\n            return false;\n        }\n        function isEqualMonth(value1, value2) {\n            if (value1) {\n                return value1.getFullYear() === value2.getFullYear() && value1.getMonth() === value2.getMonth();\n            }\n            return false;\n        }\n        function getDisabledExpr(option) {\n            if (kendo.isFunction(option)) {\n                return option;\n            }\n            if ($.isArray(option)) {\n                return createDisabledExpr(option);\n            }\n            return $.noop;\n        }\n        function convertDatesArray(dates) {\n            var result = [];\n            for (var i = 0; i < dates.length; i++) {\n                result.push(dates[i].setHours(0, 0, 0, 0));\n            }\n            return result;\n        }\n        function createDisabledExpr(dates) {\n            var body, callback, disabledDates = [], days = [\n                    'su',\n                    'mo',\n                    'tu',\n                    'we',\n                    'th',\n                    'fr',\n                    'sa'\n                ], searchExpression = 'if (found) {' + ' return true ' + '} else {' + 'return false' + '}';\n            if (dates[0] instanceof DATE) {\n                disabledDates = convertDatesArray(dates);\n                body = 'var found = date && window.kendo.jQuery.inArray(date.setHours(0, 0, 0, 0),[' + disabledDates + ']) > -1;' + searchExpression;\n            } else {\n                for (var i = 0; i < dates.length; i++) {\n                    var day = dates[i].slice(0, 2).toLowerCase();\n                    var index = $.inArray(day, days);\n                    if (index > -1) {\n                        disabledDates.push(index);\n                    }\n                }\n                body = 'var found = date && window.kendo.jQuery.inArray(date.getDay(),[' + disabledDates + ']) > -1;' + searchExpression;\n            }\n            callback = new Function('date', body);\n            return callback;\n        }\n        function isEqualDate(oldValue, newValue) {\n            if (oldValue instanceof Date && newValue instanceof Date) {\n                oldValue = oldValue.getTime();\n                newValue = newValue.getTime();\n            }\n            return oldValue === newValue;\n        }\n        function toDateObject(link) {\n            var value = $(link).attr(kendo.attr(VALUE)).split('/');\n            value = createDate(value[0], value[1], value[2]);\n            return value;\n        }\n        calendar.isEqualDatePart = isEqualDatePart;\n        calendar.isEqualDate = isEqualDate;\n        calendar.makeUnselectable = makeUnselectable;\n        calendar.restrictValue = restrictValue;\n        calendar.isInRange = isInRange;\n        calendar.addClassToViewContainer = addClassToViewContainer;\n        calendar.normalize = normalize;\n        calendar.viewsEnum = views;\n        calendar.disabled = getDisabledExpr;\n        calendar.toDateObject = toDateObject;\n        calendar.getToday = getToday;\n        calendar.createDate = createDate;\n        kendo.calendar = calendar;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dateinput', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'dateinput',\n        name: 'DateInput',\n        category: 'web',\n        description: 'The DateInput widget allows to edit date by typing.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var global = window;\n        var kendo = global.kendo;\n        var caret = kendo.caret;\n        var ui = kendo.ui;\n        var Widget = ui.Widget;\n        var keys = kendo.keys;\n        var ns = '.kendoDateInput';\n        var proxy = $.proxy;\n        var objectToString = {}.toString;\n        var INPUT_EVENT_NAME = (kendo.support.propertyChangeEvent ? 'propertychange.kendoDateInput input' : 'input') + ns;\n        var STATEDISABLED = 'k-state-disabled';\n        var STATEDEFAULT = 'k-state-default';\n        var STATEINVALID = 'k-state-invalid';\n        var DISABLED = 'disabled';\n        var READONLY = 'readonly';\n        var CHANGE = 'change';\n        var knownSymbols = 'dMyHhmftsz';\n        var DateInput = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                options.format = kendo._extractFormat(options.format || kendo.getCulture(options.culture).calendars.standard.patterns.d);\n                options.min = kendo.parseDate(element.attr('min')) || kendo.parseDate(options.min);\n                options.max = kendo.parseDate(element.attr('max')) || kendo.parseDate(options.max);\n                var insidePicker = (element.parent().attr('class') || '').indexOf('k-picker-wrap') >= 0;\n                if (insidePicker) {\n                    that.wrapper = element.parent();\n                } else {\n                    that.wrapper = element.wrap('<span class=\\'k-widget k-dateinput\\'></span>').parent();\n                    that.wrapper.addClass(element[0].className).removeClass('input-validation-error');\n                    that.wrapper[0].style.cssText = element[0].style.cssText;\n                    element.css({\n                        width: '100%',\n                        height: element[0].style.height\n                    });\n                }\n                that._inputWrapper = $(that.wrapper[0]);\n                $('<span class=\\'k-icon k-i-warning\\'></span>').insertAfter(element);\n                that._form();\n                that.element.addClass(insidePicker ? ' ' : 'k-textbox').attr('autocomplete', 'off').on('focusout' + ns, function () {\n                    that._change();\n                });\n                try {\n                    element[0].setAttribute('type', 'text');\n                } catch (e) {\n                    element[0].type = 'text';\n                }\n                var disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                that.value(that.options.value || element.val());\n                kendo.notify(that);\n            },\n            options: {\n                name: 'DateInput',\n                culture: '',\n                value: '',\n                format: '',\n                min: new Date(1900, 0, 1),\n                max: new Date(2099, 11, 31),\n                messages: {\n                    'year': 'year',\n                    'month': 'month',\n                    'day': 'day',\n                    'weekday': 'day of the week',\n                    'hour': 'hours',\n                    'minute': 'minutes',\n                    'second': 'seconds',\n                    'dayperiod': 'AM/PM'\n                }\n            },\n            events: [CHANGE],\n            min: function (value) {\n                if (value !== undefined) {\n                    this.options.min = value;\n                } else {\n                    return this.options.min;\n                }\n            },\n            max: function (value) {\n                if (value !== undefined) {\n                    this.options.max = value;\n                } else {\n                    return this.options.max;\n                }\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                this._unbindInput();\n                this._bindInput();\n                this._updateElementValue();\n            },\n            destroy: function () {\n                var that = this;\n                that.element.off(ns);\n                if (that._formElement) {\n                    that._formElement.off('reset', that._resetHandler);\n                }\n                Widget.fn.destroy.call(that);\n            },\n            value: function (value) {\n                if (value === undefined) {\n                    return this._dateTime.getDateObject();\n                }\n                if (value === null) {\n                    value = '';\n                }\n                if (objectToString.call(value) !== '[object Date]') {\n                    value = kendo.parseDate(value, this.options.format, this.options.culture);\n                }\n                if (value && !value.getTime()) {\n                    value = null;\n                }\n                this._dateTime = new customDateTime(value, this.options.format, this.options.culture, this.options.messages);\n                this._updateElementValue();\n                this._oldValue = value;\n            },\n            _updateElementValue: function () {\n                var stringAndFromat = this._dateTime.toPair(this.options.format, this.options.culture, this.options.messages);\n                this.element.val(stringAndFromat[0]);\n                this._oldText = stringAndFromat[0];\n                this._format = stringAndFromat[1];\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            _bindInput: function () {\n                var that = this;\n                that.element.on('focusout' + ns, function () {\n                    that._change();\n                }).on('paste' + ns, proxy(that._paste, that)).on('keydown' + ns, proxy(that._keydown, that)).on(INPUT_EVENT_NAME, proxy(that._input, that)).on('mouseup' + ns, proxy(that._mouseUp, that)).on('DOMMouseScroll' + ns + ' mousewheel' + ns, proxy(that._scroll, that));\n            },\n            _unbindInput: function () {\n                this.element.off('keydown' + ns).off('paste' + ns).off('focusout' + ns).off(INPUT_EVENT_NAME).off('mouseup' + ns).off('DOMMouseScroll' + ns + ' mousewheel' + ns);\n            },\n            _editable: function (options) {\n                var that = this;\n                var element = that.element;\n                var disable = options.disable;\n                var readonly = options.readonly;\n                var wrapper = that.wrapper;\n                that._unbindInput();\n                if (!readonly && !disable) {\n                    wrapper.addClass(STATEDEFAULT).removeClass(STATEDISABLED);\n                    if (element && element.length) {\n                        element[0].removeAttribute(DISABLED);\n                        element[0].removeAttribute(READONLY);\n                    }\n                    that._bindInput();\n                } else {\n                    if (disable) {\n                        wrapper.addClass(STATEDISABLED).removeClass(STATEDEFAULT);\n                        element.attr(DISABLED, disable);\n                        if (element && element.length) {\n                            element[0].removeAttribute(READONLY);\n                        }\n                    }\n                    if (readonly) {\n                        element.attr(READONLY, readonly);\n                    }\n                }\n            },\n            _change: function () {\n                var that = this;\n                var oldValue = that._oldValue;\n                var value = that.value();\n                if (value && that.min() && value < that.min()) {\n                    that.value(that.min());\n                    value = that.value();\n                }\n                if (value && that.max() && value > that.max()) {\n                    that.value(that.max());\n                    value = that.value();\n                }\n                if (oldValue && value && value.getTime() !== oldValue.getTime() || oldValue && !value || !oldValue && value) {\n                    that._oldValue = value;\n                    that.trigger(CHANGE);\n                    that.element.trigger(CHANGE);\n                }\n            },\n            _input: function () {\n                var that = this;\n                var element = that.element[0];\n                var blinkInvalid = false;\n                if (kendo._activeElement() !== element) {\n                    return;\n                }\n                var diff = approximateStringMatching(this._oldText, this._format, this.element[0].value, caret(this.element[0])[0]);\n                var navigationOnly = diff.length === 1 && diff[0][1] === ' ';\n                if (!navigationOnly) {\n                    for (var i = 0; i < diff.length; i++) {\n                        var valid = this._dateTime.parsePart(diff[i][0], diff[i][1]);\n                        blinkInvalid = blinkInvalid || !valid;\n                    }\n                }\n                this._updateElementValue();\n                if (diff.length && diff[0][0] !== ' ') {\n                    this._selectSegment(diff[0][0]);\n                    if (!navigationOnly) {\n                        var difSym = diff[0][0];\n                        setTimeout(function () {\n                            that._selectSegment(difSym);\n                        });\n                    }\n                }\n                if (navigationOnly) {\n                    var newEvent = {\n                        keyCode: 39,\n                        preventDefault: function () {\n                        }\n                    };\n                    this._keydown(newEvent);\n                }\n                if (blinkInvalid) {\n                    clearTimeout(that._blinkInvalidTimeout);\n                    var stateInvalid = STATEINVALID;\n                    that.wrapper.addClass(STATEINVALID);\n                    that._blinkInvalidTimeout = setTimeout(function () {\n                        that.wrapper.removeClass(stateInvalid);\n                    }, 100);\n                }\n            },\n            _mouseUp: function () {\n                var selection = caret(this.element[0]);\n                if (selection[0] === selection[1]) {\n                    this._selectNearestSegment();\n                }\n            },\n            _scroll: function (e) {\n                if (kendo._activeElement() !== this.element[0] || this.element.is('[readonly]')) {\n                    return;\n                }\n                e = window.event || e;\n                var newEvent = {\n                    keyCode: 37,\n                    preventDefault: function () {\n                    }\n                };\n                if (e.shiftKey) {\n                    newEvent.keyCode = (e.wheelDelta || -e.detail) > 0 ? 37 : 39;\n                } else {\n                    newEvent.keyCode = (e.wheelDelta || -e.detail) > 0 ? 38 : 40;\n                }\n                this._keydown(newEvent);\n                e.returnValue = false;\n                if (e.preventDefault) {\n                    e.preventDefault();\n                }\n                if (e.stopPropagation) {\n                    e.stopPropagation();\n                }\n            },\n            _form: function () {\n                var that = this;\n                var element = that.element;\n                var formId = element.attr('form');\n                var form = formId ? $('#' + formId) : element.closest('form');\n                var initialValue = element[0].value;\n                if (!initialValue && that.options.value) {\n                    initialValue = that.options.value;\n                }\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(initialValue);\n                        });\n                    };\n                    that._formElement = form.on('reset', that._resetHandler);\n                }\n            },\n            _paste: function (e) {\n                e.preventDefault();\n            },\n            _keydown: function (e) {\n                var key = e.keyCode;\n                var selection;\n                if (key == 37 || key == 39) {\n                    e.preventDefault();\n                    selection = caret(this.element[0]);\n                    if (selection[0] != selection[1]) {\n                        this._selectNearestSegment();\n                    }\n                    var dir = key == 37 ? -1 : 1;\n                    var index = dir == -1 ? caret(this.element[0])[0] - 1 : caret(this.element[0])[1] + 1;\n                    while (index >= 0 && index < this._format.length) {\n                        if (knownSymbols.indexOf(this._format[index]) >= 0) {\n                            this._selectSegment(this._format[index]);\n                            break;\n                        }\n                        index += dir;\n                    }\n                }\n                if (key == 38 || key == 40) {\n                    e.preventDefault();\n                    selection = caret(this.element[0]);\n                    var symbol = this._format[selection[0]];\n                    if (knownSymbols.indexOf(symbol) >= 0) {\n                        var interval = 1;\n                        if (symbol == 'm') {\n                            interval = this.options.interval || 1;\n                        }\n                        this._dateTime.modifyPart(symbol, key == 38 ? interval * 1 : interval * -1);\n                        this._updateElementValue();\n                        this._selectSegment(symbol);\n                        this.element.trigger(CHANGE);\n                    }\n                }\n                if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n                    var keycode = e.keyCode ? e.keyCode : e.which;\n                    if (keycode === 8 || keycode === 46) {\n                        var that = this;\n                        setTimeout(function () {\n                            that._input();\n                        }, 0);\n                    }\n                }\n                if (key === keys.ENTER) {\n                    this._change();\n                }\n            },\n            _selectNearestSegment: function () {\n                var selection = caret(this.element[0]);\n                var start = selection[0];\n                for (var i = start, j = start - 1; i < this._format.length || j >= 0; i++, j--) {\n                    if (i < this._format.length && knownSymbols.indexOf(this._format[i]) !== -1) {\n                        this._selectSegment(this._format[i]);\n                        return;\n                    }\n                    if (j >= 0 && knownSymbols.indexOf(this._format[j]) !== -1) {\n                        this._selectSegment(this._format[j]);\n                        return;\n                    }\n                }\n            },\n            _selectSegment: function (symbol) {\n                var begin = -1, end = 0;\n                for (var i = 0; i < this._format.length; i++) {\n                    if (this._format[i] === symbol) {\n                        end = i + 1;\n                        if (begin === -1) {\n                            begin = i;\n                        }\n                    }\n                }\n                if (begin < 0) {\n                    begin = 0;\n                }\n                caret(this.element, begin, end);\n            }\n        });\n        ui.plugin(DateInput);\n        var customDateTime = function (initDate, initFormat, initCulture, initMessages) {\n            var value = null;\n            var year = true, month = true, date = true, hours = true, minutes = true, seconds = true, milliseconds = true;\n            var typedMonthPart = '';\n            var typedDayPeriodPart = '';\n            var placeholders = {};\n            var zeros = [\n                '',\n                '0',\n                '00',\n                '000',\n                '0000'\n            ];\n            function pad(number, digits, end) {\n                number = number + '';\n                digits = digits || 2;\n                end = digits - number.length;\n                if (end) {\n                    return zeros[digits].substring(0, end) + number;\n                }\n                return number;\n            }\n            var dateFormatRegExp = /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|\"[^\"]*\"|'[^']*'/g;\n            var months = null, calendar = null, days = null, returnsFormat = false;\n            var matcher = function (match) {\n                var mins, sign;\n                var result;\n                switch (match) {\n                case 'd':\n                    result = date ? value.getDate() : placeholders.day;\n                    break;\n                case 'dd':\n                    result = date ? pad(value.getDate()) : placeholders.day;\n                    break;\n                case 'ddd':\n                    result = date && month && year ? days.namesAbbr[value.getDay()] : placeholders.weekday;\n                    break;\n                case 'dddd':\n                    result = date && month && year ? days.names[value.getDay()] : placeholders.weekday;\n                    break;\n                case 'M':\n                    result = month ? value.getMonth() + 1 : placeholders.month;\n                    break;\n                case 'MM':\n                    result = month ? pad(value.getMonth() + 1) : placeholders.month;\n                    break;\n                case 'MMM':\n                    result = month ? months.namesAbbr[value.getMonth()] : placeholders.month;\n                    break;\n                case 'MMMM':\n                    result = month ? months.names[value.getMonth()] : placeholders.month;\n                    break;\n                case 'yy':\n                    result = year ? pad(value.getFullYear() % 100) : placeholders.year;\n                    break;\n                case 'yyyy':\n                    result = year ? pad(value.getFullYear(), 4) : placeholders.year;\n                    break;\n                case 'h':\n                    result = hours ? value.getHours() % 12 || 12 : placeholders.hour;\n                    break;\n                case 'hh':\n                    result = hours ? pad(value.getHours() % 12 || 12) : placeholders.hour;\n                    break;\n                case 'H':\n                    result = hours ? value.getHours() : placeholders.hour;\n                    break;\n                case 'HH':\n                    result = hours ? pad(value.getHours()) : placeholders.hour;\n                    break;\n                case 'm':\n                    result = minutes ? value.getMinutes() : placeholders.minute;\n                    break;\n                case 'mm':\n                    result = minutes ? pad(value.getMinutes()) : placeholders.minute;\n                    break;\n                case 's':\n                    result = seconds ? value.getSeconds() : placeholders.second;\n                    break;\n                case 'ss':\n                    result = seconds ? pad(value.getSeconds()) : placeholders.second;\n                    break;\n                case 'f':\n                    result = milliseconds ? Math.floor(value.getMilliseconds() / 100) : milliseconds;\n                    break;\n                case 'ff':\n                    result = value.getMilliseconds();\n                    if (result > 99) {\n                        result = Math.floor(result / 10);\n                    }\n                    result = milliseconds ? pad(result) : match;\n                    break;\n                case 'fff':\n                    result = milliseconds ? pad(value.getMilliseconds(), 3) : match;\n                    break;\n                case 'tt':\n                    result = hours ? value.getHours() < 12 ? calendar.AM[0] : calendar.PM[0] : placeholders.dayperiod;\n                    break;\n                case 'zzz':\n                    mins = value.getTimezoneOffset();\n                    sign = mins < 0;\n                    result = Math.abs(mins / 60).toString().split('.')[0];\n                    mins = Math.abs(mins) - result * 60;\n                    result = (sign ? '+' : '-') + pad(result);\n                    result += ':' + pad(mins);\n                    break;\n                case 'z':\n                case 'zz':\n                    result = value.getTimezoneOffset() / 60;\n                    sign = result < 0;\n                    result = Math.abs(result).toString().split('.')[0];\n                    result = (sign ? '+' : '-') + (match === 'zz' ? pad(result) : result);\n                    break;\n                }\n                result = result !== undefined ? result : match.slice(1, match.length - 1);\n                if (returnsFormat) {\n                    result = '' + result;\n                    var formatResult = '';\n                    if (match == 'ddd') {\n                        match = 'EEE';\n                    }\n                    if (match == 'dddd') {\n                        match = 'EEEE';\n                    }\n                    for (var i = 0; i < result.length; i++) {\n                        formatResult += match[0];\n                    }\n                    return formatResult;\n                } else {\n                    return result;\n                }\n            };\n            function generateMatcher(retFormat) {\n                returnsFormat = retFormat;\n                return matcher;\n            }\n            function setExisting(symbol, val) {\n                switch (symbol) {\n                case 'y':\n                    year = val;\n                    break;\n                case 'M':\n                    month = val;\n                    if (!val) {\n                        value.setMonth(0);\n                        typedMonthPart = '';\n                    }\n                    break;\n                case 'd':\n                    date = val;\n                    break;\n                case 'H':\n                case 'h':\n                    hours = val;\n                    if (!val) {\n                        typedDayPeriodPart = '';\n                    }\n                    break;\n                case 'm':\n                    minutes = val;\n                    break;\n                case 's':\n                    seconds = val;\n                    break;\n                default:\n                    return;\n                }\n            }\n            this.setValue = function (val) {\n                date = val;\n            };\n            this.getValue = function () {\n                return date;\n            };\n            this.modifyPart = function (symbol, offset) {\n                var newValue = new Date(value && value.getTime ? value.getTime() : value);\n                switch (symbol) {\n                case 'y':\n                    newValue.setFullYear(newValue.getFullYear() + offset);\n                    break;\n                case 'M':\n                    var newMonth = newValue.getMonth() + offset;\n                    newValue.setMonth(newMonth);\n                    if (newValue.getMonth() % 12 !== (newMonth + 12) % 12) {\n                        newValue.setDate(1);\n                        newValue.setMonth(newMonth);\n                    }\n                    break;\n                case 'd':\n                case 'E':\n                    newValue.setDate(newValue.getDate() + offset);\n                    break;\n                case 'H':\n                case 'h':\n                    newValue.setHours(newValue.getHours() + offset);\n                    break;\n                case 'm':\n                    newValue.setMinutes(newValue.getMinutes() + offset);\n                    break;\n                case 's':\n                    newValue.setSeconds(newValue.getSeconds() + offset);\n                    break;\n                case 't':\n                    newValue.setHours((newValue.getHours() + 12) % 24);\n                    break;\n                default:\n                    break;\n                }\n                if (newValue.getFullYear() > 0) {\n                    setExisting(symbol, true);\n                    value = newValue;\n                }\n            };\n            this.parsePart = function (symbol, currentChar) {\n                if (!currentChar) {\n                    setExisting(symbol, false);\n                    return true;\n                }\n                var newValue = new Date(value && value.getTime ? value.getTime() : value);\n                var newHours;\n                switch (symbol) {\n                case 'd':\n                    var newDate = (date ? newValue.getDate() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newDate)) {\n                        return;\n                    }\n                    while (newDate > 31) {\n                        newDate = parseInt(newDate.toString().slice(1), 10);\n                    }\n                    if (newDate < 1) {\n                        date = false;\n                    } else {\n                        newValue.setDate(newDate);\n                        if (newValue.getMonth() !== value.getMonth()) {\n                            return;\n                        }\n                        date = true;\n                    }\n                    break;\n                case 'M':\n                    var newMonth = (month ? (newValue.getMonth() + 1) * 10 : 0) + parseInt(currentChar, 10);\n                    if (!isNaN(newMonth)) {\n                        while (newMonth > 12) {\n                            newMonth = parseInt(newMonth.toString().slice(1), 10);\n                        }\n                        if (newMonth < 1) {\n                            month = false;\n                        } else {\n                            newValue.setMonth(newMonth - 1);\n                            if (newValue.getMonth() !== newMonth - 1) {\n                                newValue.setDate(1);\n                                newValue.setMonth(newMonth - 1);\n                            }\n                            month = true;\n                        }\n                    } else {\n                        var monthNames = calendar.months.names;\n                        typedMonthPart += currentChar.toLowerCase();\n                        while (typedMonthPart.length > 0) {\n                            for (var i = 0; i < monthNames.length; i++) {\n                                if (monthNames[i].toLowerCase().indexOf(typedMonthPart) === 0) {\n                                    newValue.setMonth(i);\n                                    month = true;\n                                    value = newValue;\n                                    return true;\n                                }\n                            }\n                            typedMonthPart = typedMonthPart.substring(1, typedMonthPart.length);\n                        }\n                        return false;\n                    }\n                    break;\n                case 'y':\n                    var newYear = (year ? newValue.getFullYear() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newYear)) {\n                        return;\n                    }\n                    while (newYear > 9999) {\n                        newYear = parseInt(newYear.toString().slice(1), 10);\n                    }\n                    if (newYear < 1) {\n                        year = false;\n                    } else {\n                        newValue.setFullYear(newYear);\n                        year = true;\n                    }\n                    break;\n                case 'h':\n                    newHours = (hours ? (newValue.getHours() % 12 || 12) * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newHours)) {\n                        return;\n                    }\n                    while (newHours > 12) {\n                        newHours = parseInt(newHours.toString().slice(1), 10);\n                    }\n                    newValue.setHours(Math.floor(newValue.getHours() / 12) * 12 + newHours % 12);\n                    hours = true;\n                    break;\n                case 'H':\n                    newHours = (hours ? newValue.getHours() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newHours)) {\n                        return;\n                    }\n                    while (newHours > 23) {\n                        newHours = parseInt(newHours.toString().slice(1), 10);\n                    }\n                    newValue.setHours(newHours);\n                    hours = true;\n                    break;\n                case 'm':\n                    var newMinutes = (minutes ? newValue.getMinutes() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newMinutes)) {\n                        return;\n                    }\n                    while (newMinutes > 59) {\n                        newMinutes = parseInt(newMinutes.toString().slice(1), 10);\n                    }\n                    newValue.setMinutes(newMinutes);\n                    minutes = true;\n                    break;\n                case 's':\n                    var newSeconds = (seconds ? newValue.getSeconds() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newSeconds)) {\n                        return;\n                    }\n                    while (newSeconds > 59) {\n                        newSeconds = parseInt(newSeconds.toString().slice(1), 10);\n                    }\n                    newValue.setSeconds(newSeconds);\n                    seconds = true;\n                    break;\n                case 't':\n                    if (hours) {\n                        typedDayPeriodPart += currentChar.toLowerCase();\n                        while (typedDayPeriodPart.length > 0) {\n                            if (calendar.AM[0].toLowerCase().indexOf(typedDayPeriodPart) === 0 && newValue.getHours() >= 12 || calendar.PM[0].toLowerCase().indexOf(typedDayPeriodPart) === 0 && newValue.getHours() < 12) {\n                                newValue.setHours((newValue.getHours() + 12) % 24);\n                                value = newValue;\n                                return true;\n                            }\n                            typedDayPeriodPart = typedDayPeriodPart.substring(1, typedDayPeriodPart.length);\n                        }\n                        return false;\n                    }\n                    break;\n                default:\n                    break;\n                }\n                value = newValue;\n                return true;\n            };\n            this.toPair = function (format, culture, messages) {\n                if (!format) {\n                    return [\n                        '',\n                        ''\n                    ];\n                }\n                culture = kendo.getCulture(culture);\n                calendar = culture.calendars.standard;\n                format = calendar.patterns[format] || format;\n                days = calendar.days;\n                months = calendar.months;\n                placeholders = messages;\n                return [\n                    format.replace(dateFormatRegExp, generateMatcher(false)),\n                    format.replace(dateFormatRegExp, generateMatcher(true))\n                ];\n            };\n            this.getDateObject = function () {\n                return year && month && date && hours && minutes && seconds && milliseconds ? new Date(value.getTime()) : null;\n            };\n            if (!initDate) {\n                value = new Date();\n                var sampleFormat = this.toPair(initFormat, initCulture, initMessages)[1];\n                for (var i = 0; i < sampleFormat.length; i++) {\n                    setExisting(sampleFormat[i], false);\n                }\n            } else {\n                value = new Date(initDate.getTime());\n            }\n        };\n        function approximateStringMatching(oldText, oldFormat, newText, caret) {\n            var oldTextSeparator = oldText[caret + oldText.length - newText.length];\n            oldText = oldText.substring(0, caret + oldText.length - newText.length);\n            newText = newText.substring(0, caret);\n            var diff = [];\n            var i;\n            if (oldText === newText && caret > 0) {\n                diff.push([\n                    oldFormat[caret - 1],\n                    newText[caret - 1]\n                ]);\n                return diff;\n            }\n            if (oldText.indexOf(newText) === 0 && (newText.length === 0 || oldFormat[newText.length - 1] !== oldFormat[newText.length])) {\n                var deletedSymbol = '';\n                for (i = newText.length; i < oldText.length; i++) {\n                    if (oldFormat[i] !== deletedSymbol && knownSymbols.indexOf(oldFormat[i]) >= 0) {\n                        deletedSymbol = oldFormat[i];\n                        diff.push([\n                            deletedSymbol,\n                            ''\n                        ]);\n                    }\n                }\n                return diff;\n            }\n            if (newText[newText.length - 1] === ' ' || newText[newText.length - 1] === oldTextSeparator) {\n                return [[\n                        oldFormat[caret - 1],\n                        ' '\n                    ]];\n            }\n            if (newText.indexOf(oldText) === 0 || knownSymbols.indexOf(oldFormat[caret - 1]) === -1) {\n                var symbol = oldFormat[0];\n                for (i = Math.max(0, oldText.length - 1); i < oldFormat.length; i++) {\n                    if (knownSymbols.indexOf(oldFormat[i]) >= 0) {\n                        symbol = oldFormat[i];\n                        break;\n                    }\n                }\n                return [[\n                        symbol,\n                        newText[caret - 1]\n                    ]];\n            }\n            return [[\n                    oldFormat[caret - 1],\n                    newText[caret - 1]\n                ]];\n        }\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.datepicker', [\n        'kendo.calendar',\n        'kendo.popup',\n        'kendo.dateinput'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'datepicker',\n        name: 'DatePicker',\n        category: 'web',\n        description: 'The DatePicker widget allows the user to select a date from a calendar or by direct input.',\n        depends: [\n            'calendar',\n            'popup'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, parse = kendo.parseDate, keys = kendo.keys, support = kendo.support, template = kendo.template, activeElement = kendo._activeElement, DIV = '<div />', SPAN = '<span />', ns = '.kendoDatePicker', CLICK = 'click' + ns, UP = support.mouseAndTouchPresent ? kendo.applyEventMap('up', ns.slice(1)) : CLICK, OPEN = 'open', CLOSE = 'close', CHANGE = 'change', DISABLED = 'disabled', READONLY = 'readonly', DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', HOVER = 'k-state-hover', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, MOUSEDOWN = 'mousedown' + ns, ID = 'id', MIN = 'min', MAX = 'max', MONTH = 'month', ARIA_DISABLED = 'aria-disabled', ARIA_EXPANDED = 'aria-expanded', ARIA_HIDDEN = 'aria-hidden', calendar = kendo.calendar, isInRange = calendar.isInRange, restrictValue = calendar.restrictValue, isEqualDatePart = calendar.isEqualDatePart, extend = $.extend, proxy = $.proxy, DATE = Date;\n        function normalize(options) {\n            var parseFormats = options.parseFormats, format = options.format;\n            calendar.normalize(options);\n            parseFormats = $.isArray(parseFormats) ? parseFormats : [parseFormats];\n            if (!parseFormats.length) {\n                parseFormats.push('yyyy-MM-dd');\n            }\n            if ($.inArray(format, parseFormats) === -1) {\n                parseFormats.splice(0, 0, options.format);\n            }\n            options.parseFormats = parseFormats;\n        }\n        function preventDefault(e) {\n            e.preventDefault();\n        }\n        var DateView = function (options) {\n            var that = this, id, body = document.body, div = $(DIV).attr(ARIA_HIDDEN, 'true').addClass('k-calendar-container').appendTo(body);\n            that.options = options = options || {};\n            id = options.id;\n            if (id) {\n                id += '_dateview';\n                div.attr(ID, id);\n                that._dateViewID = id;\n            }\n            that.popup = new ui.Popup(div, extend(options.popup, options, {\n                name: 'Popup',\n                isRtl: kendo.support.isRtl(options.anchor)\n            }));\n            that.div = div;\n            that.value(options.value);\n        };\n        DateView.prototype = {\n            _calendar: function () {\n                var that = this;\n                var calendar = that.calendar;\n                var options = that.options;\n                var div;\n                if (!calendar) {\n                    div = $(DIV).attr(ID, kendo.guid()).appendTo(that.popup.element).on(MOUSEDOWN, preventDefault).on(CLICK, 'td:has(.k-link)', proxy(that._click, that));\n                    that.calendar = calendar = new ui.Calendar(div);\n                    that._setOptions(options);\n                    kendo.calendar.makeUnselectable(calendar.element);\n                    calendar.navigate(that._value || that._current, options.start);\n                    that.value(that._value);\n                }\n            },\n            _setOptions: function (options) {\n                this.calendar.setOptions({\n                    focusOnNav: false,\n                    change: options.change,\n                    culture: options.culture,\n                    dates: options.dates,\n                    depth: options.depth,\n                    footer: options.footer,\n                    format: options.format,\n                    max: options.max,\n                    min: options.min,\n                    month: options.month,\n                    weekNumber: options.weekNumber,\n                    start: options.start,\n                    disableDates: options.disableDates\n                });\n            },\n            setOptions: function (options) {\n                var old = this.options;\n                var disableDates = options.disableDates;\n                if (disableDates) {\n                    options.disableDates = calendar.disabled(disableDates);\n                }\n                this.options = extend(old, options, {\n                    change: old.change,\n                    close: old.close,\n                    open: old.open\n                });\n                if (this.calendar) {\n                    this._setOptions(this.options);\n                }\n            },\n            destroy: function () {\n                this.popup.destroy();\n            },\n            open: function () {\n                var that = this;\n                var popupHovered;\n                that._calendar();\n                popupHovered = that.popup._hovered;\n                that.popup._hovered = true;\n                that.popup.open();\n                setTimeout(function () {\n                    that.popup._hovered = popupHovered;\n                }, 1);\n            },\n            close: function () {\n                this.popup.close();\n            },\n            min: function (value) {\n                this._option(MIN, value);\n            },\n            max: function (value) {\n                this._option(MAX, value);\n            },\n            toggle: function () {\n                var that = this;\n                that[that.popup.visible() ? CLOSE : OPEN]();\n            },\n            move: function (e) {\n                var that = this, key = e.keyCode, calendar = that.calendar, selectIsClicked = e.ctrlKey && key == keys.DOWN || key == keys.ENTER, handled = false;\n                if (e.altKey) {\n                    if (key == keys.DOWN) {\n                        that.open();\n                        e.preventDefault();\n                        handled = true;\n                    } else if (key == keys.UP) {\n                        that.close();\n                        e.preventDefault();\n                        handled = true;\n                    }\n                } else if (that.popup.visible()) {\n                    if (key == keys.ESC || selectIsClicked && calendar._cell.hasClass(SELECTED)) {\n                        that.close();\n                        e.preventDefault();\n                        return true;\n                    }\n                    if (key != keys.SPACEBAR) {\n                        that._current = calendar._move(e);\n                    }\n                    handled = true;\n                }\n                return handled;\n            },\n            current: function (date) {\n                this._current = date;\n                if (this.calendar) {\n                    this.calendar._focus(date);\n                }\n            },\n            value: function (value) {\n                var that = this, calendar = that.calendar, options = that.options, disabledDate = options.disableDates;\n                if (disabledDate && disabledDate(value)) {\n                    value = null;\n                }\n                that._value = value;\n                that._current = new DATE(+restrictValue(value, options.min, options.max));\n                if (calendar) {\n                    calendar.value(value);\n                }\n            },\n            _click: function (e) {\n                if (e.currentTarget.className.indexOf(SELECTED) !== -1) {\n                    this.calendar.trigger('change');\n                    this.close();\n                }\n            },\n            _option: function (option, value) {\n                var that = this;\n                var calendar = that.calendar;\n                that.options[option] = value;\n                if (calendar) {\n                    calendar[option](value);\n                }\n            }\n        };\n        DateView.normalize = normalize;\n        kendo.DateView = DateView;\n        var DatePicker = Widget.extend({\n            init: function (element, options) {\n                var that = this, disabled, div;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                options.disableDates = kendo.calendar.disabled(options.disableDates);\n                options.min = parse(element.attr('min')) || parse(options.min);\n                options.max = parse(element.attr('max')) || parse(options.max);\n                normalize(options);\n                that._initialOptions = extend({}, options);\n                that._wrapper();\n                that.dateView = new DateView(extend({}, options, {\n                    id: element.attr(ID),\n                    anchor: that.wrapper,\n                    change: function () {\n                        that._change(this.value());\n                        that.close();\n                    },\n                    close: function (e) {\n                        if (that.trigger(CLOSE)) {\n                            e.preventDefault();\n                        } else {\n                            element.attr(ARIA_EXPANDED, false);\n                            div.attr(ARIA_HIDDEN, true);\n                        }\n                    },\n                    open: function (e) {\n                        var options = that.options, date;\n                        if (that.trigger(OPEN)) {\n                            e.preventDefault();\n                        } else {\n                            if (that.element.val() !== that._oldText) {\n                                date = parse(element.val(), options.parseFormats, options.culture);\n                                that.dateView[date ? 'current' : 'value'](date);\n                            }\n                            element.attr(ARIA_EXPANDED, true);\n                            div.attr(ARIA_HIDDEN, false);\n                            that._updateARIA(date);\n                        }\n                    }\n                }));\n                div = that.dateView.div;\n                that._icon();\n                try {\n                    element[0].setAttribute('type', 'text');\n                } catch (e) {\n                    element[0].type = 'text';\n                }\n                element.addClass('k-input').attr({\n                    role: 'combobox',\n                    'aria-expanded': false,\n                    'aria-owns': that.dateView._dateViewID,\n                    'autocomplete': 'off'\n                });\n                that._reset();\n                that._template();\n                disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                that._createDateInput(options);\n                that._old = that._update(options.value || that.element.val());\n                that._oldText = element.val();\n                kendo.notify(that);\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                CHANGE\n            ],\n            options: {\n                name: 'DatePicker',\n                value: null,\n                footer: '',\n                format: '',\n                culture: '',\n                parseFormats: [],\n                min: new Date(1900, 0, 1),\n                max: new Date(2099, 11, 31),\n                start: MONTH,\n                depth: MONTH,\n                animation: {},\n                month: {},\n                dates: [],\n                disableDates: null,\n                ARIATemplate: 'Current focused date is #=kendo.toString(data.current, \"D\")#',\n                dateInput: false,\n                weekNumber: false\n            },\n            setOptions: function (options) {\n                var that = this;\n                var value = that._value;\n                Widget.fn.setOptions.call(that, options);\n                options = that.options;\n                options.min = parse(options.min);\n                options.max = parse(options.max);\n                normalize(options);\n                that.dateView.setOptions(options);\n                that._createDateInput(options);\n                if (!that._dateInput) {\n                    that.element.val(kendo.toString(value, options.format, options.culture));\n                }\n                if (value) {\n                    that._updateARIA(value);\n                }\n            },\n            _editable: function (options) {\n                var that = this, icon = that._dateIcon.off(ns), element = that.element.off(ns), wrapper = that._inputWrapper.off(ns), readonly = options.readonly, disable = options.disable;\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    if (element && element.length) {\n                        element[0].removeAttribute(DISABLED);\n                        element[0].removeAttribute(READONLY);\n                    }\n                    element.attr(ARIA_DISABLED, false).on('keydown' + ns, proxy(that._keydown, that)).on('focusout' + ns, proxy(that._blur, that)).on('focus' + ns, function () {\n                        that._inputWrapper.addClass(FOCUSED);\n                    });\n                    icon.on(UP, proxy(that._click, that)).on(MOUSEDOWN, preventDefault);\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    element.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n                if (this._dateInput) {\n                    this._dateInput._editable({\n                        readonly: readonly === undefined ? true : readonly,\n                        disable: false\n                    });\n                }\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n                if (this._dateInput) {\n                    this._dateInput._editable({\n                        readonly: false,\n                        disable: !(enable = enable === undefined ? true : enable)\n                    });\n                }\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.dateView.destroy();\n                that.element.off(ns);\n                that._dateIcon.off(ns);\n                that._inputWrapper.off(ns);\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n            },\n            open: function () {\n                this.dateView.open();\n            },\n            close: function () {\n                this.dateView.close();\n            },\n            min: function (value) {\n                return this._option(MIN, value);\n            },\n            max: function (value) {\n                return this._option(MAX, value);\n            },\n            value: function (value) {\n                var that = this;\n                if (value === undefined) {\n                    return that._value;\n                }\n                that._old = that._update(value);\n                if (that._old === null) {\n                    that.element.val('');\n                }\n                that._oldText = that.element.val();\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _blur: function () {\n                var that = this, value = that.element.val();\n                that.close();\n                if (value !== that._oldText) {\n                    that._change(value);\n                    if (!value) {\n                        that.dateView.current(kendo.calendar.getToday());\n                    }\n                }\n                that._inputWrapper.removeClass(FOCUSED);\n            },\n            _click: function (e) {\n                var that = this;\n                that.dateView.toggle();\n                that._focusElement(e.type);\n            },\n            _focusElement: function (eventType) {\n                var element = this.element;\n                if ((!support.touch || support.mouseAndTouchPresent && !(eventType || '').match(/touch/i)) && element[0] !== activeElement()) {\n                    element.trigger('focus');\n                }\n            },\n            _change: function (value) {\n                var that = this, oldValue = that.element.val(), dateChanged;\n                value = that._update(value);\n                dateChanged = !kendo.calendar.isEqualDate(that._old, value);\n                var valueUpdated = dateChanged && !that._typing;\n                var textFormatted = oldValue !== that.element.val();\n                if (valueUpdated || textFormatted) {\n                    that.element.trigger(CHANGE);\n                }\n                if (dateChanged) {\n                    that._old = value;\n                    that._oldText = that.element.val();\n                    that.trigger(CHANGE);\n                }\n                that._typing = false;\n            },\n            _keydown: function (e) {\n                var that = this, dateView = that.dateView, value = that.element.val(), handled = false;\n                if (!dateView.popup.visible() && e.keyCode == keys.ENTER && value !== that._oldText) {\n                    that._change(value);\n                } else {\n                    handled = dateView.move(e);\n                    that._updateARIA(dateView._current);\n                    if (!handled) {\n                        that._typing = true;\n                    } else if (that._dateInput && e.stopImmediatePropagation) {\n                        e.stopImmediatePropagation();\n                    }\n                }\n            },\n            _icon: function () {\n                var that = this, element = that.element, icon;\n                icon = element.next('span.k-select');\n                if (!icon[0]) {\n                    icon = $('<span unselectable=\"on\" class=\"k-select\" aria-label=\"select\"><span class=\"k-icon k-i-calendar\"></span></span>').insertAfter(element);\n                }\n                that._dateIcon = icon.attr({\n                    'role': 'button',\n                    'aria-controls': that.dateView._dateViewID\n                });\n            },\n            _option: function (option, value) {\n                var that = this, options = that.options;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = parse(value, options.parseFormats, options.culture);\n                if (!value) {\n                    return;\n                }\n                options[option] = new DATE(+value);\n                that.dateView[option](value);\n            },\n            _update: function (value) {\n                var that = this, options = that.options, min = options.min, max = options.max, current = that._value, date = parse(value, options.parseFormats, options.culture), isSameType = date === null && current === null || date instanceof Date && current instanceof Date, formattedValue;\n                if (options.disableDates(date)) {\n                    date = null;\n                    if (!that._old && !that.element.val()) {\n                        value = null;\n                    }\n                }\n                if (+date === +current && isSameType) {\n                    formattedValue = kendo.toString(date, options.format, options.culture);\n                    if (formattedValue !== value) {\n                        that.element.val(date === null ? value : formattedValue);\n                    }\n                    return date;\n                }\n                if (date !== null && isEqualDatePart(date, min)) {\n                    date = restrictValue(date, min, max);\n                } else if (!isInRange(date, min, max)) {\n                    date = null;\n                }\n                that._value = date;\n                that.dateView.value(date);\n                if (that._dateInput && date) {\n                    that._dateInput.value(date || value);\n                } else {\n                    that.element.val(kendo.toString(date || value, options.format, options.culture));\n                }\n                that._updateARIA(date);\n                return date;\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper;\n                wrapper = element.parents('.k-datepicker');\n                if (!wrapper[0]) {\n                    wrapper = element.wrap(SPAN).parent().addClass('k-picker-wrap k-state-default');\n                    wrapper = wrapper.wrap(SPAN).parent();\n                }\n                wrapper[0].style.cssText = element[0].style.cssText;\n                element.css({\n                    width: '100%',\n                    height: element[0].style.height\n                });\n                that.wrapper = wrapper.addClass('k-widget k-datepicker').addClass(element[0].className).removeClass('input-validation-error');\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), options = that.options, disabledDate = options.disableDates, parseFormats = options.parseFormats.length ? options.parseFormats : null, optionsValue = that._initialOptions.value, form = formId ? $('#' + formId) : element.closest('form'), initialValue = element[0].defaultValue;\n                if (optionsValue && (disabledDate && disabledDate(optionsValue))) {\n                    optionsValue = null;\n                }\n                if ((!initialValue || !kendo.parseDate(initialValue, parseFormats, options.culture)) && optionsValue) {\n                    element.attr('value', kendo.toString(optionsValue, options.format, options.culture));\n                }\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        that.value(optionsValue || element[0].defaultValue);\n                        that.max(that._initialOptions.max);\n                        that.min(that._initialOptions.min);\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            },\n            _template: function () {\n                this._ariaTemplate = template(this.options.ARIATemplate);\n            },\n            _createDateInput: function (options) {\n                if (this._dateInput) {\n                    this._dateInput.destroy();\n                    this._dateInput = null;\n                }\n                if (options.dateInput) {\n                    this._dateInput = new ui.DateInput(this.element, {\n                        culture: options.culture,\n                        format: options.format,\n                        min: options.min,\n                        max: options.max\n                    });\n                }\n            },\n            _updateARIA: function (date) {\n                var cell;\n                var that = this;\n                var calendar = that.dateView.calendar;\n                if (that.element && that.element.length) {\n                    that.element[0].removeAttribute('aria-activedescendant');\n                }\n                if (calendar) {\n                    cell = calendar._cell;\n                    cell.attr('aria-label', that._ariaTemplate({ current: date || calendar.current() }));\n                    that.element.attr('aria-activedescendant', cell.attr('id'));\n                }\n            }\n        });\n        ui.plugin(DatePicker);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.virtuallist', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'virtuallist',\n        name: 'VirtualList',\n        category: 'framework',\n        depends: ['data'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, DataBoundWidget = ui.DataBoundWidget, proxy = $.proxy, percentageUnitsRegex = /^\\d+(\\.\\d+)?%$/i, WRAPPER = 'k-virtual-wrap', VIRTUALLIST = 'k-virtual-list', CONTENT = 'k-virtual-content', LIST = 'k-list', HEADER = 'k-group-header', VIRTUALITEM = 'k-virtual-item', ITEM = 'k-item', HEIGHTCONTAINER = 'k-height-container', GROUPITEM = 'k-group', SELECTED = 'k-state-selected', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', CHANGE = 'change', CLICK = 'click', LISTBOUND = 'listBound', ITEMCHANGE = 'itemChange', ACTIVATE = 'activate', DEACTIVATE = 'deactivate', VIRTUAL_LIST_NS = '.VirtualList';\n        function lastFrom(array) {\n            return array[array.length - 1];\n        }\n        function toArray(value) {\n            return value instanceof Array ? value : [value];\n        }\n        function isPrimitive(dataItem) {\n            return typeof dataItem === 'string' || typeof dataItem === 'number' || typeof dataItem === 'boolean';\n        }\n        function getItemCount(screenHeight, listScreens, itemHeight) {\n            return Math.ceil(screenHeight * listScreens / itemHeight);\n        }\n        function appendChild(parent, className, tagName) {\n            var element = document.createElement(tagName || 'div');\n            if (className) {\n                element.className = className;\n            }\n            parent.appendChild(element);\n            return element;\n        }\n        function getDefaultItemHeight() {\n            var mockList = $('<div class=\"k-popup\"><ul class=\"k-list\"><li class=\"k-item\"><li></ul></div>'), lineHeight;\n            mockList.css({\n                position: 'absolute',\n                left: '-200000px',\n                visibility: 'hidden'\n            });\n            mockList.appendTo(document.body);\n            lineHeight = parseFloat(kendo.getComputedStyles(mockList.find('.k-item')[0], ['line-height'])['line-height']);\n            mockList.remove();\n            return lineHeight;\n        }\n        function bufferSizes(screenHeight, listScreens, opposite) {\n            return {\n                down: screenHeight * opposite,\n                up: screenHeight * (listScreens - 1 - opposite)\n            };\n        }\n        function listValidator(options, screenHeight) {\n            var downThreshold = (options.listScreens - 1 - options.threshold) * screenHeight;\n            var upThreshold = options.threshold * screenHeight;\n            return function (list, scrollTop, lastScrollTop) {\n                if (scrollTop > lastScrollTop) {\n                    return scrollTop - list.top < downThreshold;\n                } else {\n                    return list.top === 0 || scrollTop - list.top > upThreshold;\n                }\n            };\n        }\n        function scrollCallback(element, callback) {\n            return function (force) {\n                return callback(element.scrollTop, force);\n            };\n        }\n        function syncList(reorder) {\n            return function (list, force) {\n                reorder(list.items, list.index, force);\n                return list;\n            };\n        }\n        function position(element, y) {\n            if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n                element.style.top = y + 'px';\n            } else {\n                element.style.webkitTransform = 'translateY(' + y + 'px)';\n                element.style.transform = 'translateY(' + y + 'px)';\n            }\n        }\n        function map2(callback, templates) {\n            return function (arr1, arr2) {\n                for (var i = 0, len = arr1.length; i < len; i++) {\n                    callback(arr1[i], arr2[i], templates);\n                    if (arr2[i].item) {\n                        this.trigger(ITEMCHANGE, {\n                            item: $(arr1[i]),\n                            data: arr2[i].item,\n                            ns: kendo.ui\n                        });\n                    }\n                }\n            };\n        }\n        function reshift(items, diff) {\n            var range;\n            if (diff > 0) {\n                range = items.splice(0, diff);\n                items.push.apply(items, range);\n            } else {\n                range = items.splice(diff, -diff);\n                items.unshift.apply(items, range);\n            }\n            return range;\n        }\n        function render(element, data, templates) {\n            var itemTemplate = templates.template;\n            element = $(element);\n            if (!data.item) {\n                itemTemplate = templates.placeholderTemplate;\n            }\n            if (data.index === 0 && this.header && data.group) {\n                this.header.html(templates.fixedGroupTemplate(data.group));\n            }\n            this.angular('cleanup', function () {\n                return { elements: [element] };\n            });\n            element.attr('data-uid', data.item ? data.item.uid : '').attr('data-offset-index', data.index);\n            if (this.options.columns && this.options.columns.length && data.item) {\n                element.html(renderColumns(this.options, data.item, templates));\n            } else {\n                element.html(itemTemplate(data.item || {}));\n            }\n            element.toggleClass(FOCUSED, data.current);\n            element.toggleClass(SELECTED, data.selected);\n            element.toggleClass('k-first', data.newGroup);\n            element.toggleClass('k-last', data.isLastGroupedItem);\n            element.toggleClass('k-loading-item', !data.item);\n            if (data.index !== 0 && data.newGroup) {\n                $('<div class=' + GROUPITEM + '></div>').appendTo(element).html(templates.groupTemplate(data.group));\n            }\n            if (data.top !== undefined) {\n                position(element[0], data.top);\n            }\n            this.angular('compile', function () {\n                return {\n                    elements: [element],\n                    data: [{\n                            dataItem: data.item,\n                            group: data.group,\n                            newGroup: data.newGroup\n                        }]\n                };\n            });\n        }\n        function renderColumns(options, dataItem, templates) {\n            var item = '';\n            for (var i = 0; i < options.columns.length; i++) {\n                var currentWidth = options.columns[i].width;\n                var currentWidthInt = parseInt(currentWidth, 10);\n                var widthStyle = '';\n                if (currentWidth) {\n                    widthStyle += 'style=\\'width:';\n                    widthStyle += currentWidthInt;\n                    widthStyle += percentageUnitsRegex.test(currentWidth) ? '%' : 'px';\n                    widthStyle += ';\\'';\n                }\n                item += '<span class=\\'k-cell\\' ' + widthStyle + '>';\n                item += templates['column' + i](dataItem);\n                item += '</span>';\n            }\n            return item;\n        }\n        function mapChangedItems(selected, itemsToMatch) {\n            var itemsLength = itemsToMatch.length;\n            var selectedLength = selected.length;\n            var dataItem;\n            var found;\n            var i, j;\n            var changed = [];\n            var unchanged = [];\n            if (selectedLength) {\n                for (i = 0; i < selectedLength; i++) {\n                    dataItem = selected[i];\n                    found = false;\n                    for (j = 0; j < itemsLength; j++) {\n                        if (dataItem === itemsToMatch[j]) {\n                            found = true;\n                            changed.push({\n                                index: i,\n                                item: dataItem\n                            });\n                            break;\n                        }\n                    }\n                    if (!found) {\n                        unchanged.push(dataItem);\n                    }\n                }\n            }\n            return {\n                changed: changed,\n                unchanged: unchanged\n            };\n        }\n        function isActivePromise(promise) {\n            return promise && promise.state() !== 'resolved';\n        }\n        var VirtualList = DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this;\n                that.bound(false);\n                that._fetching = false;\n                Widget.fn.init.call(that, element, options);\n                if (!that.options.itemHeight) {\n                    that.options.itemHeight = getDefaultItemHeight();\n                }\n                options = that.options;\n                that.element.addClass(LIST + ' ' + VIRTUALLIST).attr('role', 'listbox');\n                that.content = that.element.wrap('<div unselectable=\\'on\\' class=\\'' + CONTENT + '\\'></div>').parent();\n                that.wrapper = that.content.wrap('<div class=\\'' + WRAPPER + '\\'></div>').parent();\n                that.header = that.content.before('<div class=\\'' + HEADER + '\\'></div>').prev();\n                if (options.columns && options.columns.length) {\n                    that.element.removeClass(LIST);\n                }\n                that.element.on('mouseenter' + VIRTUAL_LIST_NS, 'li:not(.k-loading-item)', function () {\n                    $(this).addClass(HOVER);\n                }).on('mouseleave' + VIRTUAL_LIST_NS, 'li', function () {\n                    $(this).removeClass(HOVER);\n                });\n                that._values = toArray(that.options.value);\n                that._selectedDataItems = [];\n                that._selectedIndexes = [];\n                that._rangesList = {};\n                that._promisesList = [];\n                that._optionID = kendo.guid();\n                that._templates();\n                that.setDataSource(options.dataSource);\n                that.content.on('scroll' + VIRTUAL_LIST_NS, kendo.throttle(function () {\n                    that._renderItems();\n                    that._triggerListBound();\n                }, options.delay));\n                that._selectable();\n            },\n            options: {\n                name: 'VirtualList',\n                autoBind: true,\n                delay: 100,\n                height: null,\n                listScreens: 4,\n                threshold: 0.5,\n                itemHeight: null,\n                oppositeBuffer: 1,\n                type: 'flat',\n                selectable: false,\n                value: [],\n                dataValueField: null,\n                template: '#:data#',\n                placeholderTemplate: 'loading...',\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: '#:data#',\n                mapValueTo: 'index',\n                valueMapper: null\n            },\n            events: [\n                CHANGE,\n                CLICK,\n                LISTBOUND,\n                ITEMCHANGE,\n                ACTIVATE,\n                DEACTIVATE\n            ],\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                if (this._selectProxy && this.options.selectable === false) {\n                    this.element.off(CLICK, '.' + VIRTUALITEM, this._selectProxy);\n                } else if (!this._selectProxy && this.options.selectable) {\n                    this._selectable();\n                }\n                this._templates();\n                this.refresh();\n            },\n            items: function () {\n                return $(this._items);\n            },\n            destroy: function () {\n                this.wrapper.off(VIRTUAL_LIST_NS);\n                this.dataSource.unbind(CHANGE, this._refreshHandler);\n                Widget.fn.destroy.call(this);\n            },\n            setDataSource: function (source) {\n                var that = this;\n                var dataSource = source || {};\n                var value;\n                dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n                dataSource = kendo.data.DataSource.create(dataSource);\n                if (that.dataSource) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler);\n                    that._clean();\n                    that.bound(false);\n                    that._deferValueSet = true;\n                    value = that.value();\n                    that.value([]);\n                    that.mute(function () {\n                        that.value(value);\n                    });\n                } else {\n                    that._refreshHandler = $.proxy(that.refresh, that);\n                }\n                that.dataSource = dataSource.bind(CHANGE, that._refreshHandler);\n                that.setDSFilter(dataSource.filter());\n                if (dataSource.view().length !== 0) {\n                    that.refresh();\n                } else if (that.options.autoBind) {\n                    dataSource.fetch();\n                }\n            },\n            skip: function () {\n                return this.dataSource.currentRangeStart();\n            },\n            _triggerListBound: function () {\n                var that = this;\n                var skip = that.skip();\n                if (that.bound() && !that._selectingValue && that._skip !== skip) {\n                    that._skip = skip;\n                    that.trigger(LISTBOUND);\n                }\n            },\n            _getValues: function (dataItems) {\n                var getter = this._valueGetter;\n                return $.map(dataItems, function (dataItem) {\n                    return getter(dataItem);\n                });\n            },\n            _highlightSelectedItems: function () {\n                for (var i = 0; i < this._selectedDataItems.length; i++) {\n                    var item = this._getElementByDataItem(this._selectedDataItems[i]);\n                    if (item.length) {\n                        item.addClass(SELECTED);\n                    }\n                }\n            },\n            refresh: function (e) {\n                var that = this;\n                var action = e && e.action;\n                var isItemChange = action === 'itemchange';\n                var filtered = this.isFiltered();\n                var result;\n                if (that._mute) {\n                    return;\n                }\n                that._deferValueSet = false;\n                if (!that._fetching) {\n                    if (filtered) {\n                        that.focus(0);\n                    }\n                    that._createList();\n                    if (!action && that._values.length && !filtered && !that.options.skipUpdateOnBind && !that._emptySearch) {\n                        that._selectingValue = true;\n                        that.bound(true);\n                        that.value(that._values, true).done(function () {\n                            that._selectingValue = false;\n                            that._triggerListBound();\n                        });\n                    } else {\n                        that.bound(true);\n                        that._highlightSelectedItems();\n                        that._triggerListBound();\n                    }\n                } else {\n                    if (that._renderItems) {\n                        that._renderItems(true);\n                    }\n                    that._triggerListBound();\n                }\n                if (isItemChange || action === 'remove') {\n                    result = mapChangedItems(that._selectedDataItems, e.items);\n                    if (result.changed.length) {\n                        if (isItemChange) {\n                            that.trigger('selectedItemChange', { items: result.changed });\n                        } else {\n                            that.value(that._getValues(result.unchanged));\n                        }\n                    }\n                }\n                that._fetching = false;\n            },\n            removeAt: function (position) {\n                this._selectedIndexes.splice(position, 1);\n                this._values.splice(position, 1);\n                return {\n                    position: position,\n                    dataItem: this._selectedDataItems.splice(position, 1)[0]\n                };\n            },\n            setValue: function (value) {\n                this._values = toArray(value);\n            },\n            value: function (value, _forcePrefetch) {\n                var that = this;\n                if (value === undefined) {\n                    return that._values.slice();\n                }\n                if (value === null) {\n                    value = [];\n                }\n                value = toArray(value);\n                if (!that._valueDeferred || that._valueDeferred.state() === 'resolved') {\n                    that._valueDeferred = $.Deferred();\n                }\n                var shouldClear = that.options.selectable === 'multiple' && that.select().length && value.length;\n                if (shouldClear || !value.length) {\n                    that.select(-1);\n                }\n                that._values = value;\n                if (that.bound() && !that._mute && !that._deferValueSet || _forcePrefetch) {\n                    that._prefetchByValue(value);\n                }\n                return that._valueDeferred;\n            },\n            _checkValuesOrder: function (value) {\n                if (this._removedAddedIndexes && this._removedAddedIndexes.length === value.length) {\n                    var newValue = this._removedAddedIndexes.slice();\n                    this._removedAddedIndexes = null;\n                    return newValue;\n                }\n                return value;\n            },\n            _prefetchByValue: function (value) {\n                var that = this, dataView = that._dataView, valueGetter = that._valueGetter, mapValueTo = that.options.mapValueTo, item, match = false, forSelection = [];\n                for (var i = 0; i < value.length; i++) {\n                    for (var idx = 0; idx < dataView.length; idx++) {\n                        item = dataView[idx].item;\n                        if (item) {\n                            match = isPrimitive(item) ? value[i] === item : value[i] === valueGetter(item);\n                            if (match) {\n                                forSelection.push(dataView[idx].index);\n                            }\n                        }\n                    }\n                }\n                if (forSelection.length === value.length) {\n                    that._values = [];\n                    that.select(forSelection);\n                    return;\n                }\n                if (typeof that.options.valueMapper === 'function') {\n                    that.options.valueMapper({\n                        value: this.options.selectable === 'multiple' ? value : value[0],\n                        success: function (response) {\n                            if (mapValueTo === 'index') {\n                                that.mapValueToIndex(response);\n                            } else if (mapValueTo === 'dataItem') {\n                                that.mapValueToDataItem(response);\n                            }\n                        }\n                    });\n                } else {\n                    if (!that.value()[0]) {\n                        that.select([-1]);\n                    } else {\n                        that._selectingValue = false;\n                        that._triggerListBound();\n                    }\n                }\n            },\n            mapValueToIndex: function (indexes) {\n                if (indexes === undefined || indexes === -1 || indexes === null) {\n                    indexes = [];\n                } else {\n                    indexes = toArray(indexes);\n                }\n                if (!indexes.length) {\n                    indexes = [-1];\n                } else {\n                    var removed = this._deselect([]).removed;\n                    if (removed.length) {\n                        this._triggerChange(removed, []);\n                    }\n                }\n                this.select(indexes);\n            },\n            mapValueToDataItem: function (dataItems) {\n                var removed, added;\n                if (dataItems === undefined || dataItems === null) {\n                    dataItems = [];\n                } else {\n                    dataItems = toArray(dataItems);\n                }\n                if (!dataItems.length) {\n                    this.select([-1]);\n                } else {\n                    removed = $.map(this._selectedDataItems, function (item, index) {\n                        return {\n                            index: index,\n                            dataItem: item\n                        };\n                    });\n                    added = $.map(dataItems, function (item, index) {\n                        return {\n                            index: index,\n                            dataItem: item\n                        };\n                    });\n                    this._selectedDataItems = dataItems;\n                    this._selectedIndexes = [];\n                    for (var i = 0; i < this._selectedDataItems.length; i++) {\n                        var item = this._getElementByDataItem(this._selectedDataItems[i]);\n                        this._selectedIndexes.push(this._getIndecies(item)[0]);\n                        item.addClass(SELECTED);\n                    }\n                    this._triggerChange(removed, added);\n                    if (this._valueDeferred) {\n                        this._valueDeferred.resolve();\n                    }\n                }\n            },\n            deferredRange: function (index) {\n                var dataSource = this.dataSource;\n                var take = this.itemCount;\n                var ranges = this._rangesList;\n                var result = $.Deferred();\n                var defs = [];\n                var low = Math.floor(index / take) * take;\n                var high = Math.ceil(index / take) * take;\n                var pages = high === low ? [high] : [\n                    low,\n                    high\n                ];\n                $.each(pages, function (_, skip) {\n                    var end = skip + take;\n                    var existingRange = ranges[skip];\n                    var deferred;\n                    if (!existingRange || existingRange.end !== end) {\n                        deferred = $.Deferred();\n                        ranges[skip] = {\n                            end: end,\n                            deferred: deferred\n                        };\n                        dataSource._multiplePrefetch(skip, take, function () {\n                            deferred.resolve();\n                        });\n                    } else {\n                        deferred = existingRange.deferred;\n                    }\n                    defs.push(deferred);\n                });\n                $.when.apply($, defs).then(function () {\n                    result.resolve();\n                });\n                return result;\n            },\n            prefetch: function (indexes) {\n                var that = this, take = this.itemCount, isEmptyList = !that._promisesList.length;\n                if (!isActivePromise(that._activeDeferred)) {\n                    that._activeDeferred = $.Deferred();\n                    that._promisesList = [];\n                }\n                $.each(indexes, function (_, index) {\n                    that._promisesList.push(that.deferredRange(that._getSkip(index, take)));\n                });\n                if (isEmptyList) {\n                    $.when.apply($, that._promisesList).done(function () {\n                        that._promisesList = [];\n                        that._activeDeferred.resolve();\n                    });\n                }\n                return that._activeDeferred;\n            },\n            _findDataItem: function (view, index) {\n                var group;\n                if (this.options.type === 'group') {\n                    for (var i = 0; i < view.length; i++) {\n                        group = view[i].items;\n                        if (group.length <= index) {\n                            index = index - group.length;\n                        } else {\n                            return group[index];\n                        }\n                    }\n                }\n                return view[index];\n            },\n            _getRange: function (skip, take) {\n                return this.dataSource._findRange(skip, Math.min(skip + take, this.dataSource.total()));\n            },\n            dataItemByIndex: function (index) {\n                var that = this;\n                var take = that.itemCount;\n                var skip = that._getSkip(index, take);\n                var view = this._getRange(skip, take);\n                if (!that._getRange(skip, take).length) {\n                    return null;\n                }\n                if (that.options.type === 'group') {\n                    kendo.ui.progress($(that.wrapper), true);\n                    that.mute(function () {\n                        that.dataSource.range(skip, take, function () {\n                            kendo.ui.progress($(that.wrapper), false);\n                        });\n                        view = that.dataSource.view();\n                    });\n                }\n                return that._findDataItem(view, [index - skip]);\n            },\n            selectedDataItems: function () {\n                return this._selectedDataItems.slice();\n            },\n            scrollWith: function (value) {\n                this.content.scrollTop(this.content.scrollTop() + value);\n            },\n            scrollTo: function (y) {\n                this.content.scrollTop(y);\n            },\n            scrollToIndex: function (index) {\n                this.scrollTo(index * this.options.itemHeight);\n            },\n            focus: function (candidate) {\n                var element, index, data, current, itemHeight = this.options.itemHeight, id = this._optionID, triggerEvent = true;\n                if (candidate === undefined) {\n                    current = this.element.find('.' + FOCUSED);\n                    return current.length ? current : null;\n                }\n                if (typeof candidate === 'function') {\n                    data = this.dataSource.flatView();\n                    for (var idx = 0; idx < data.length; idx++) {\n                        if (candidate(data[idx])) {\n                            candidate = idx;\n                            break;\n                        }\n                    }\n                }\n                if (candidate instanceof Array) {\n                    candidate = lastFrom(candidate);\n                }\n                if (isNaN(candidate)) {\n                    element = $(candidate);\n                    index = parseInt($(element).attr('data-offset-index'), 10);\n                } else {\n                    index = candidate;\n                    element = this._getElementByIndex(index);\n                }\n                if (index === -1) {\n                    this.element.find('.' + FOCUSED).removeClass(FOCUSED);\n                    this._focusedIndex = undefined;\n                    return;\n                }\n                if (element.length) {\n                    if (element.hasClass(FOCUSED)) {\n                        triggerEvent = false;\n                    }\n                    if (this._focusedIndex !== undefined) {\n                        current = this._getElementByIndex(this._focusedIndex);\n                        current.removeClass(FOCUSED).removeAttr('id');\n                        if (triggerEvent) {\n                            this.trigger(DEACTIVATE);\n                        }\n                    }\n                    this._focusedIndex = index;\n                    element.addClass(FOCUSED).attr('id', id);\n                    var position = this._getElementLocation(index);\n                    if (position === 'top') {\n                        this.scrollTo(index * itemHeight);\n                    } else if (position === 'bottom') {\n                        this.scrollTo(index * itemHeight + itemHeight - this._screenHeight);\n                    } else if (position === 'outScreen') {\n                        this.scrollTo(index * itemHeight);\n                    }\n                    if (triggerEvent) {\n                        this.trigger(ACTIVATE);\n                    }\n                } else {\n                    this._focusedIndex = index;\n                    this.items().removeClass(FOCUSED);\n                    this.scrollToIndex(index);\n                }\n            },\n            focusIndex: function () {\n                return this._focusedIndex;\n            },\n            focusFirst: function () {\n                this.scrollTo(0);\n                this.focus(0);\n            },\n            focusLast: function () {\n                var lastIndex = this.dataSource.total();\n                this.scrollTo(this.heightContainer.offsetHeight);\n                this.focus(lastIndex - 1);\n            },\n            focusPrev: function () {\n                var index = this._focusedIndex;\n                var current;\n                if (!isNaN(index) && index > 0) {\n                    index -= 1;\n                    this.focus(index);\n                    current = this.focus();\n                    if (current && current.hasClass('k-loading-item')) {\n                        index += 1;\n                        this.focus(index);\n                    }\n                    return index;\n                } else {\n                    index = this.dataSource.total() - 1;\n                    this.focus(index);\n                    return index;\n                }\n            },\n            focusNext: function () {\n                var index = this._focusedIndex;\n                var lastIndex = this.dataSource.total() - 1;\n                var current;\n                if (!isNaN(index) && index < lastIndex) {\n                    index += 1;\n                    this.focus(index);\n                    current = this.focus();\n                    if (current && current.hasClass('k-loading-item')) {\n                        index -= 1;\n                        this.focus(index);\n                    }\n                    return index;\n                } else {\n                    index = 0;\n                    this.focus(index);\n                    return index;\n                }\n            },\n            _triggerChange: function (removed, added) {\n                removed = removed || [];\n                added = added || [];\n                if (removed.length || added.length) {\n                    this.trigger(CHANGE, {\n                        removed: removed,\n                        added: added\n                    });\n                }\n            },\n            select: function (candidate) {\n                var that = this, indices, initialIndices, singleSelection = that.options.selectable !== 'multiple', prefetchStarted = isActivePromise(that._activeDeferred), filtered = this.isFiltered(), isAlreadySelected, deferred, result, removed = [];\n                if (candidate === undefined) {\n                    return that._selectedIndexes.slice();\n                }\n                if (!that._selectDeferred || that._selectDeferred.state() === 'resolved') {\n                    that._selectDeferred = $.Deferred();\n                }\n                indices = that._getIndecies(candidate);\n                isAlreadySelected = singleSelection && !filtered && lastFrom(indices) === lastFrom(this._selectedIndexes);\n                removed = that._deselectCurrentValues(indices);\n                if (removed.length || !indices.length || isAlreadySelected) {\n                    that._triggerChange(removed);\n                    if (that._valueDeferred) {\n                        that._valueDeferred.resolve().promise();\n                    }\n                    return that._selectDeferred.resolve().promise();\n                }\n                if (indices.length === 1 && indices[0] === -1) {\n                    indices = [];\n                }\n                initialIndices = indices;\n                result = that._deselect(indices);\n                removed = result.removed;\n                indices = result.indices;\n                if (singleSelection) {\n                    prefetchStarted = false;\n                    if (indices.length) {\n                        indices = [lastFrom(indices)];\n                    }\n                }\n                var done = function () {\n                    var added = that._select(indices);\n                    if (initialIndices.length === indices.length || singleSelection) {\n                        that.focus(indices);\n                    }\n                    that._triggerChange(removed, added);\n                    if (that._valueDeferred) {\n                        that._valueDeferred.resolve();\n                    }\n                    that._selectDeferred.resolve();\n                };\n                deferred = that.prefetch(indices);\n                if (!prefetchStarted) {\n                    if (deferred) {\n                        deferred.done(done);\n                    } else {\n                        done();\n                    }\n                }\n                return that._selectDeferred.promise();\n            },\n            bound: function (bound) {\n                if (bound === undefined) {\n                    return this._listCreated;\n                }\n                this._listCreated = bound;\n            },\n            mute: function (callback) {\n                this._mute = true;\n                proxy(callback(), this);\n                this._mute = false;\n            },\n            setDSFilter: function (filter) {\n                this._lastDSFilter = $.extend({}, filter);\n            },\n            isFiltered: function () {\n                if (!this._lastDSFilter) {\n                    this.setDSFilter(this.dataSource.filter());\n                }\n                return !kendo.data.Query.compareFilters(this.dataSource.filter(), this._lastDSFilter);\n            },\n            skipUpdate: $.noop,\n            _getElementByIndex: function (index) {\n                return this.items().filter(function (idx, element) {\n                    return index === parseInt($(element).attr('data-offset-index'), 10);\n                });\n            },\n            _getElementByDataItem: function (dataItem) {\n                var dataView = this._dataView, valueGetter = this._valueGetter, element, match;\n                for (var i = 0; i < dataView.length; i++) {\n                    match = dataView[i].item && isPrimitive(dataView[i].item) ? dataView[i].item === dataItem : dataView[i].item && dataItem && valueGetter(dataView[i].item) == valueGetter(dataItem);\n                    if (match) {\n                        element = dataView[i];\n                        break;\n                    }\n                }\n                return element ? this._getElementByIndex(element.index) : $();\n            },\n            _clean: function () {\n                this.result = undefined;\n                this._lastScrollTop = undefined;\n                this._skip = undefined;\n                $(this.heightContainer).remove();\n                this.heightContainer = undefined;\n                this.element.empty();\n            },\n            _height: function () {\n                var hasData = !!this.dataSource.view().length, height = this.options.height, itemHeight = this.options.itemHeight, total = this.dataSource.total();\n                if (!hasData) {\n                    height = 0;\n                } else if (height / itemHeight > total) {\n                    height = total * itemHeight;\n                }\n                return height;\n            },\n            setScreenHeight: function () {\n                var height = this._height();\n                this.content.height(height);\n                this._screenHeight = height;\n            },\n            screenHeight: function () {\n                return this._screenHeight;\n            },\n            _getElementLocation: function (index) {\n                var scrollTop = this.content.scrollTop(), screenHeight = this._screenHeight, itemHeight = this.options.itemHeight, yPosition = index * itemHeight, yDownPostion = yPosition + itemHeight, screenEnd = scrollTop + screenHeight, position;\n                if (yPosition === scrollTop - itemHeight || yDownPostion > scrollTop && yPosition < scrollTop) {\n                    position = 'top';\n                } else if (yPosition === screenEnd || yPosition < screenEnd && screenEnd < yDownPostion) {\n                    position = 'bottom';\n                } else if (yPosition >= scrollTop && yPosition <= scrollTop + (screenHeight - itemHeight)) {\n                    position = 'inScreen';\n                } else {\n                    position = 'outScreen';\n                }\n                return position;\n            },\n            _templates: function () {\n                var options = this.options;\n                var templates = {\n                    template: options.template,\n                    placeholderTemplate: options.placeholderTemplate,\n                    groupTemplate: options.groupTemplate,\n                    fixedGroupTemplate: options.fixedGroupTemplate\n                };\n                if (options.columns) {\n                    for (var i = 0; i < options.columns.length; i++) {\n                        var currentColumn = options.columns[i];\n                        var templateText = currentColumn.field ? currentColumn.field.toString() : 'text';\n                        templates['column' + i] = currentColumn.template || '#: ' + templateText + '#';\n                    }\n                }\n                for (var key in templates) {\n                    if (typeof templates[key] !== 'function') {\n                        templates[key] = kendo.template(templates[key] || '');\n                    }\n                }\n                this.templates = templates;\n            },\n            _generateItems: function (element, count) {\n                var items = [], item, itemHeight = this.options.itemHeight + 'px';\n                while (count-- > 0) {\n                    item = document.createElement('li');\n                    item.tabIndex = -1;\n                    item.className = VIRTUALITEM + ' ' + ITEM;\n                    item.setAttribute('role', 'option');\n                    item.style.height = itemHeight;\n                    item.style.minHeight = itemHeight;\n                    element.appendChild(item);\n                    items.push(item);\n                }\n                return items;\n            },\n            _saveInitialRanges: function () {\n                var ranges = this.dataSource._ranges;\n                var deferred = $.Deferred();\n                deferred.resolve();\n                this._rangesList = {};\n                for (var i = 0; i < ranges.length; i++) {\n                    this._rangesList[ranges[i].start] = {\n                        end: ranges[i].end,\n                        deferred: deferred\n                    };\n                }\n            },\n            _createList: function () {\n                var that = this, content = that.content.get(0), options = that.options, dataSource = that.dataSource;\n                if (that.bound()) {\n                    that._clean();\n                }\n                that._saveInitialRanges();\n                that._buildValueGetter();\n                that.setScreenHeight();\n                that.itemCount = getItemCount(that._screenHeight, options.listScreens, options.itemHeight);\n                if (that.itemCount > dataSource.total()) {\n                    that.itemCount = dataSource.total();\n                }\n                that._items = that._generateItems(that.element[0], that.itemCount);\n                that._setHeight(options.itemHeight * dataSource.total());\n                that.options.type = (dataSource.group() || []).length ? 'group' : 'flat';\n                if (that.options.type === 'flat') {\n                    that.header.hide();\n                } else {\n                    that.header.show();\n                }\n                that.getter = that._getter(function () {\n                    that._renderItems(true);\n                });\n                that._onScroll = function (scrollTop, force) {\n                    var getList = that._listItems(that.getter);\n                    return that._fixedHeader(scrollTop, getList(scrollTop, force));\n                };\n                that._renderItems = that._whenChanged(scrollCallback(content, that._onScroll), syncList(that._reorderList(that._items, $.proxy(render, that))));\n                that._renderItems();\n                that._calculateGroupPadding(that._screenHeight);\n                that._calculateColumnsHeaderPadding();\n            },\n            _setHeight: function (height) {\n                var currentHeight, heightContainer = this.heightContainer;\n                if (!heightContainer) {\n                    heightContainer = this.heightContainer = appendChild(this.content[0], HEIGHTCONTAINER);\n                } else {\n                    currentHeight = heightContainer.offsetHeight;\n                }\n                if (height !== currentHeight) {\n                    heightContainer.innerHTML = '';\n                    while (height > 0) {\n                        var padHeight = Math.min(height, 250000);\n                        appendChild(heightContainer).style.height = padHeight + 'px';\n                        height -= padHeight;\n                    }\n                }\n            },\n            _getter: function () {\n                var lastRequestedRange = null, dataSource = this.dataSource, lastRangeStart = dataSource.skip(), type = this.options.type, pageSize = this.itemCount, flatGroups = {};\n                if (dataSource.pageSize() < pageSize) {\n                    this.mute(function () {\n                        dataSource.pageSize(pageSize);\n                    });\n                }\n                return function (index, rangeStart) {\n                    var that = this;\n                    if (!dataSource.inRange(rangeStart, pageSize)) {\n                        if (lastRequestedRange !== rangeStart) {\n                            lastRequestedRange = rangeStart;\n                            lastRangeStart = rangeStart;\n                            if (that._getterDeferred) {\n                                that._getterDeferred.reject();\n                            }\n                            that._getterDeferred = that.deferredRange(rangeStart);\n                            that._getterDeferred.then(function () {\n                                var firstItemIndex = that._indexConstraint(that.content[0].scrollTop);\n                                that._getterDeferred = null;\n                                if (rangeStart <= firstItemIndex && firstItemIndex <= rangeStart + pageSize) {\n                                    that._fetching = true;\n                                    dataSource.range(rangeStart, pageSize);\n                                }\n                            });\n                        }\n                        return null;\n                    } else {\n                        if (lastRangeStart !== rangeStart) {\n                            this.mute(function () {\n                                dataSource.range(rangeStart, pageSize);\n                                lastRangeStart = rangeStart;\n                            });\n                        }\n                        var result;\n                        if (type === 'group') {\n                            if (!flatGroups[rangeStart]) {\n                                var flatGroup = flatGroups[rangeStart] = [];\n                                var groups = dataSource.view();\n                                for (var i = 0, len = groups.length; i < len; i++) {\n                                    var group = groups[i];\n                                    for (var j = 0, groupLength = group.items.length; j < groupLength; j++) {\n                                        flatGroup.push({\n                                            item: group.items[j],\n                                            group: group.value\n                                        });\n                                    }\n                                }\n                            }\n                            result = flatGroups[rangeStart][index - rangeStart];\n                        } else {\n                            result = dataSource.view()[index - rangeStart];\n                        }\n                        return result;\n                    }\n                };\n            },\n            _fixedHeader: function (scrollTop, list) {\n                var group = this.currentVisibleGroup, itemHeight = this.options.itemHeight, firstVisibleDataItemIndex = Math.floor((scrollTop - list.top) / itemHeight), firstVisibleDataItem = list.items[firstVisibleDataItemIndex];\n                if (firstVisibleDataItem && firstVisibleDataItem.item) {\n                    var firstVisibleGroup = firstVisibleDataItem.group;\n                    if (firstVisibleGroup !== group) {\n                        var fixedGroupText = firstVisibleGroup || '';\n                        this.header.html(this.templates.fixedGroupTemplate(fixedGroupText));\n                        this.currentVisibleGroup = firstVisibleGroup;\n                    }\n                }\n                return list;\n            },\n            _itemMapper: function (item, index, value) {\n                var listType = this.options.type, itemHeight = this.options.itemHeight, currentIndex = this._focusedIndex, selected = false, current = false, newGroup = false, group = null, match = false, valueGetter = this._valueGetter;\n                if (listType === 'group') {\n                    if (item) {\n                        newGroup = index === 0 || this._currentGroup !== false && this._currentGroup !== item.group;\n                        this._currentGroup = item.group;\n                    }\n                    group = item ? item.group : null;\n                    item = item ? item.item : null;\n                }\n                if (this.options.mapValueTo === 'dataItem' && this._selectedDataItems.length && item) {\n                    for (var i = 0; i < this._selectedDataItems.length; i++) {\n                        match = valueGetter(this._selectedDataItems[i]) === valueGetter(item);\n                        if (match) {\n                            selected = true;\n                            break;\n                        }\n                    }\n                } else if (!this.isFiltered() && value.length && item) {\n                    for (var j = 0; j < value.length; j++) {\n                        match = isPrimitive(item) ? value[j] === item : value[j] === valueGetter(item);\n                        if (match) {\n                            value.splice(j, 1);\n                            selected = true;\n                            break;\n                        }\n                    }\n                }\n                if (currentIndex === index) {\n                    current = true;\n                }\n                return {\n                    item: item ? item : null,\n                    group: group,\n                    newGroup: newGroup,\n                    selected: selected,\n                    current: current,\n                    index: index,\n                    top: index * itemHeight\n                };\n            },\n            _range: function (index) {\n                var itemCount = this.itemCount, value = this._values.slice(), items = [], item;\n                this._view = {};\n                this._currentGroup = false;\n                for (var i = index, length = index + itemCount; i < length; i++) {\n                    item = this._itemMapper(this.getter(i, index), i, value);\n                    if (items[items.length - 1]) {\n                        items[items.length - 1].isLastGroupedItem = item.newGroup;\n                    }\n                    items.push(item);\n                    this._view[item.index] = item;\n                }\n                this._dataView = items;\n                return items;\n            },\n            _getDataItemsCollection: function (scrollTop, lastScrollTop) {\n                var items = this._range(this._listIndex(scrollTop, lastScrollTop));\n                return {\n                    index: items.length ? items[0].index : 0,\n                    top: items.length ? items[0].top : 0,\n                    items: items\n                };\n            },\n            _listItems: function () {\n                var screenHeight = this._screenHeight, options = this.options;\n                var theValidator = listValidator(options, screenHeight);\n                return $.proxy(function (value, force) {\n                    var result = this.result, lastScrollTop = this._lastScrollTop;\n                    if (force || !result || !theValidator(result, value, lastScrollTop)) {\n                        result = this._getDataItemsCollection(value, lastScrollTop);\n                    }\n                    this._lastScrollTop = value;\n                    this.result = result;\n                    return result;\n                }, this);\n            },\n            _whenChanged: function (getter, callback) {\n                var current;\n                return function (force) {\n                    var theNew = getter(force);\n                    if (theNew !== current) {\n                        current = theNew;\n                        callback(theNew, force);\n                    }\n                };\n            },\n            _reorderList: function (list, reorder) {\n                var that = this;\n                var length = list.length;\n                var currentOffset = -Infinity;\n                reorder = $.proxy(map2(reorder, this.templates), this);\n                return function (list2, offset, force) {\n                    var diff = offset - currentOffset;\n                    var range, range2;\n                    if (force || Math.abs(diff) >= length) {\n                        range = list;\n                        range2 = list2;\n                    } else {\n                        range = reshift(list, diff);\n                        range2 = diff > 0 ? list2.slice(-diff) : list2.slice(0, -diff);\n                    }\n                    reorder(range, range2, that.bound());\n                    currentOffset = offset;\n                };\n            },\n            _bufferSizes: function () {\n                var options = this.options;\n                return bufferSizes(this._screenHeight, options.listScreens, options.oppositeBuffer);\n            },\n            _indexConstraint: function (position) {\n                var itemCount = this.itemCount, itemHeight = this.options.itemHeight, total = this.dataSource.total();\n                return Math.min(Math.max(total - itemCount, 0), Math.max(0, Math.floor(position / itemHeight)));\n            },\n            _listIndex: function (scrollTop, lastScrollTop) {\n                var buffers = this._bufferSizes(), position;\n                position = scrollTop - (scrollTop > lastScrollTop ? buffers.down : buffers.up);\n                return this._indexConstraint(position);\n            },\n            _selectable: function () {\n                if (this.options.selectable) {\n                    this._selectProxy = $.proxy(this, '_clickHandler');\n                    this.element.on(CLICK + VIRTUAL_LIST_NS, '.' + VIRTUALITEM, this._selectProxy);\n                }\n            },\n            getElementIndex: function (element) {\n                if (!(element instanceof jQuery)) {\n                    return undefined;\n                }\n                return parseInt(element.attr('data-offset-index'), 10);\n            },\n            _getIndecies: function (candidate) {\n                var result = [], data;\n                if (typeof candidate === 'function') {\n                    data = this.dataSource.flatView();\n                    for (var idx = 0; idx < data.length; idx++) {\n                        if (candidate(data[idx])) {\n                            result.push(idx);\n                            break;\n                        }\n                    }\n                }\n                if (typeof candidate === 'number') {\n                    result.push(candidate);\n                }\n                var elementIndex = this.getElementIndex(candidate);\n                if (!isNaN(elementIndex)) {\n                    result.push(elementIndex);\n                }\n                if (candidate instanceof Array) {\n                    result = candidate;\n                }\n                return result;\n            },\n            _deselect: function (indices) {\n                var removed = [], selectedIndex, dataItem, selectedIndexes = this._selectedIndexes, selectedDataItems = this._selectedDataItems, position = 0, selectable = this.options.selectable, removedindexesCounter = 0, valueGetter = this._valueGetter, item, match, result = null;\n                indices = indices.slice();\n                if (selectable === true || !indices.length) {\n                    for (var idx = 0; idx < selectedIndexes.length; idx++) {\n                        if (selectedIndexes[idx] !== undefined) {\n                            this._getElementByIndex(selectedIndexes[idx]).removeClass(SELECTED);\n                        } else if (selectedDataItems[idx]) {\n                            this._getElementByDataItem(selectedDataItems[idx]).removeClass(SELECTED);\n                        }\n                        removed.push({\n                            index: selectedIndexes[idx],\n                            position: idx,\n                            dataItem: selectedDataItems[idx]\n                        });\n                    }\n                    this._values = [];\n                    this._selectedDataItems = [];\n                    this._selectedIndexes = [];\n                } else if (selectable === 'multiple') {\n                    for (var i = 0; i < indices.length; i++) {\n                        result = null;\n                        position = $.inArray(indices[i], selectedIndexes);\n                        dataItem = this.dataItemByIndex(indices[i]);\n                        if (position === -1 && dataItem) {\n                            for (var j = 0; j < selectedDataItems.length; j++) {\n                                match = isPrimitive(dataItem) ? selectedDataItems[j] === dataItem : valueGetter(selectedDataItems[j]) === valueGetter(dataItem);\n                                if (match) {\n                                    item = this._getElementByIndex(indices[i]);\n                                    result = this._deselectSingleItem(item, j, indices[i], removedindexesCounter);\n                                }\n                            }\n                        } else {\n                            selectedIndex = selectedIndexes[position];\n                            if (selectedIndex !== undefined) {\n                                item = this._getElementByIndex(selectedIndex);\n                                result = this._deselectSingleItem(item, position, selectedIndex, removedindexesCounter);\n                            }\n                        }\n                        if (result) {\n                            indices.splice(i, 1);\n                            removed.push(result);\n                            removedindexesCounter++;\n                            i--;\n                        }\n                    }\n                }\n                return {\n                    indices: indices,\n                    removed: removed\n                };\n            },\n            _deselectSingleItem: function (item, position, selectedIndex, removedindexesCounter) {\n                var dataItem;\n                if (!item.hasClass('k-state-selected')) {\n                    return;\n                }\n                item.removeClass(SELECTED);\n                this._values.splice(position, 1);\n                this._selectedIndexes.splice(position, 1);\n                dataItem = this._selectedDataItems.splice(position, 1)[0];\n                return {\n                    index: selectedIndex,\n                    position: position + removedindexesCounter,\n                    dataItem: dataItem\n                };\n            },\n            _deselectCurrentValues: function (indices) {\n                var children = this.element[0].children;\n                var value, index, position;\n                var values = this._values;\n                var removed = [];\n                var idx = 0;\n                var j;\n                if (this.options.selectable !== 'multiple' || !this.isFiltered()) {\n                    return [];\n                }\n                if (indices[0] === -1) {\n                    $(children).removeClass('k-state-selected');\n                    removed = $.map(this._selectedDataItems.slice(0), function (dataItem, idx) {\n                        return {\n                            dataItem: dataItem,\n                            position: idx\n                        };\n                    });\n                    this._selectedIndexes = [];\n                    this._selectedDataItems = [];\n                    this._values = [];\n                    return removed;\n                }\n                for (; idx < indices.length; idx++) {\n                    position = -1;\n                    index = indices[idx];\n                    if (this.dataItemByIndex(index)) {\n                        value = this._valueGetter(this.dataItemByIndex(index));\n                    }\n                    for (j = 0; j < values.length; j++) {\n                        if (value == values[j]) {\n                            position = j;\n                            break;\n                        }\n                    }\n                    if (position > -1) {\n                        removed.push(this.removeAt(position));\n                        $(children[index]).removeClass('k-state-selected');\n                    }\n                }\n                return removed;\n            },\n            _getSkip: function (index, take) {\n                var page = index < take ? 1 : Math.floor(index / take) + 1;\n                return (page - 1) * take;\n            },\n            _select: function (indexes) {\n                var that = this, singleSelection = this.options.selectable !== 'multiple', dataSource = this.dataSource, dataItem, oldSkip, take = this.itemCount, valueGetter = this._valueGetter, added = [];\n                if (singleSelection) {\n                    that._selectedIndexes = [];\n                    that._selectedDataItems = [];\n                    that._values = [];\n                }\n                oldSkip = dataSource.skip();\n                $.each(indexes, function (_, index) {\n                    var skip = that._getSkip(index, take);\n                    that.mute(function () {\n                        dataSource.range(skip, take);\n                        dataItem = that._findDataItem(dataSource.view(), [index - skip]);\n                        that._selectedIndexes.push(index);\n                        that._selectedDataItems.push(dataItem);\n                        that._values.push(isPrimitive(dataItem) ? dataItem : valueGetter(dataItem));\n                        added.push({\n                            index: index,\n                            dataItem: dataItem\n                        });\n                        that._getElementByIndex(index).addClass(SELECTED);\n                        dataSource.range(oldSkip, take);\n                    });\n                });\n                that._values = that._checkValuesOrder(that._values);\n                return added;\n            },\n            _clickHandler: function (e) {\n                var item = $(e.currentTarget);\n                if (!e.isDefaultPrevented() && item.attr('data-uid')) {\n                    this.trigger(CLICK, { item: item });\n                }\n            },\n            _buildValueGetter: function () {\n                this._valueGetter = kendo.getter(this.options.dataValueField);\n            },\n            _calculateGroupPadding: function (height) {\n                var firstItem = this.items().first(), groupHeader = this.header, padding = 0;\n                if (groupHeader[0] && groupHeader[0].style.display !== 'none') {\n                    if (height !== 'auto') {\n                        padding = kendo.support.scrollbar();\n                    }\n                    padding += parseFloat(firstItem.css('border-right-width'), 10) + parseFloat(firstItem.children('.k-group').css('right'), 10);\n                    groupHeader.css('padding-right', padding);\n                }\n            },\n            _calculateColumnsHeaderPadding: function () {\n                if (this.options.columns && this.options.columns.length) {\n                    var isRtl = kendo.support.isRtl(this.wrapper);\n                    var scrollbar = kendo.support.scrollbar();\n                    var columnsHeader = this.content.parent().parent().find('.k-grid-header');\n                    var total = this.dataSource.total();\n                    columnsHeader.css(isRtl ? 'padding-left' : 'padding-right', total ? scrollbar : 0);\n                }\n            }\n        });\n        kendo.ui.VirtualList = VirtualList;\n        kendo.ui.plugin(VirtualList);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.autocomplete', [\n        'kendo.list',\n        'kendo.mobile.scroller',\n        'kendo.virtuallist'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'autocomplete',\n        name: 'AutoComplete',\n        category: 'web',\n        description: 'The AutoComplete widget provides suggestions depending on the typed text.It also allows multiple value entries.',\n        depends: ['list'],\n        features: [\n            {\n                id: 'mobile-scroller',\n                name: 'Mobile scroller',\n                description: 'Support for kinetic scrolling in mobile device',\n                depends: ['mobile.scroller']\n            },\n            {\n                id: 'virtualization',\n                name: 'VirtualList',\n                description: 'Support for virtualization',\n                depends: ['virtuallist']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, support = kendo.support, caret = kendo.caret, activeElement = kendo._activeElement, placeholderSupported = support.placeholder, ui = kendo.ui, List = ui.List, keys = kendo.keys, DataSource = kendo.data.DataSource, ARIA_DISABLED = 'aria-disabled', ARIA_READONLY = 'aria-readonly', CHANGE = 'change', DEFAULT = 'k-state-default', DISABLED = 'disabled', READONLY = 'readonly', FOCUSED = 'k-state-focused', SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', AUTOCOMPLETEVALUE = 'off', HOVER = 'k-state-hover', ns = '.kendoAutoComplete', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, proxy = $.proxy;\n        function indexOfWordAtCaret(caretIdx, text, separator) {\n            return separator ? text.substring(0, caretIdx).split(separator).length - 1 : 0;\n        }\n        function wordAtCaret(caretIdx, text, separator) {\n            return text.split(separator)[indexOfWordAtCaret(caretIdx, text, separator)];\n        }\n        function replaceWordAtCaret(caretIdx, text, word, separator, defaultSeparator) {\n            var words = text.split(separator);\n            words.splice(indexOfWordAtCaret(caretIdx, text, separator), 1, word);\n            if (separator && words[words.length - 1] !== '') {\n                words.push('');\n            }\n            return words.join(defaultSeparator);\n        }\n        var AutoComplete = List.extend({\n            init: function (element, options) {\n                var that = this, wrapper, disabled;\n                that.ns = ns;\n                options = $.isArray(options) ? { dataSource: options } : options;\n                List.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                options.placeholder = options.placeholder || element.attr('placeholder');\n                if (placeholderSupported) {\n                    element.attr('placeholder', options.placeholder);\n                }\n                that._wrapper();\n                that._loader();\n                that._clearButton();\n                that._dataSource();\n                that._ignoreCase();\n                element[0].type = 'text';\n                wrapper = that.wrapper;\n                that._popup();\n                element.addClass('k-input').on('keydown' + ns, proxy(that._keydown, that)).on('keypress' + ns, proxy(that._keypress, that)).on('input' + ns, proxy(that._search, that)).on('paste' + ns, proxy(that._search, that)).on('focus' + ns, function () {\n                    that._prev = that._accessor();\n                    that._oldText = that._prev;\n                    that._placeholder(false);\n                    wrapper.addClass(FOCUSED);\n                }).on('focusout' + ns, function () {\n                    that._change();\n                    that._placeholder();\n                    that.close();\n                    wrapper.removeClass(FOCUSED);\n                }).attr({\n                    autocomplete: AUTOCOMPLETEVALUE,\n                    role: 'textbox',\n                    'aria-haspopup': true\n                });\n                that._clear.on('click' + ns + ' touchend' + ns, proxy(that._clearValue, that));\n                that._enable();\n                that._old = that._accessor();\n                if (element[0].id) {\n                    element.attr('aria-owns', that.ul[0].id);\n                }\n                that._aria();\n                that._placeholder();\n                that._initList();\n                disabled = $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                }\n                that.listView.bind('click', function (e) {\n                    e.preventDefault();\n                });\n                that._resetFocusItemHandler = $.proxy(that._resetFocusItem, that);\n                kendo.notify(that);\n                that._toggleCloseVisibility();\n            },\n            options: {\n                name: 'AutoComplete',\n                enabled: true,\n                suggest: false,\n                template: '',\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: '#:data#',\n                dataTextField: '',\n                minLength: 1,\n                enforceMinLength: false,\n                delay: 200,\n                height: 200,\n                filter: 'startswith',\n                ignoreCase: true,\n                highlightFirst: false,\n                separator: null,\n                placeholder: '',\n                animation: {},\n                virtual: false,\n                value: null,\n                clearButton: true,\n                autoWidth: false,\n                popup: null\n            },\n            _dataSource: function () {\n                var that = this;\n                if (that.dataSource && that._refreshHandler) {\n                    that._unbindDataSource();\n                } else {\n                    that._progressHandler = proxy(that._showBusy, that);\n                    that._errorHandler = proxy(that._hideBusy, that);\n                }\n                that.dataSource = DataSource.create(that.options.dataSource).bind('progress', that._progressHandler).bind('error', that._errorHandler);\n            },\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._dataSource();\n                this.listView.setDataSource(this.dataSource);\n            },\n            events: [\n                'open',\n                'close',\n                CHANGE,\n                'select',\n                'filtering',\n                'dataBinding',\n                'dataBound'\n            ],\n            setOptions: function (options) {\n                var listOptions = this._listOptions(options);\n                List.fn.setOptions.call(this, options);\n                this.listView.setOptions(listOptions);\n                this._accessors();\n                this._aria();\n                this._clearButton();\n            },\n            _listOptions: function (options) {\n                var listOptions = List.fn._listOptions.call(this, $.extend(options, { skipUpdateOnBind: true }));\n                listOptions.dataValueField = listOptions.dataTextField;\n                listOptions.selectedItemChange = null;\n                return listOptions;\n            },\n            _editable: function (options) {\n                var that = this, element = that.element, wrapper = that.wrapper.off(ns), readonly = options.readonly, disable = options.disable;\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    element.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false).attr(ARIA_READONLY, false);\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    element.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable).attr(ARIA_READONLY, readonly);\n                }\n            },\n            close: function () {\n                var that = this;\n                var current = that.listView.focus();\n                if (current) {\n                    current.removeClass(SELECTED);\n                }\n                that.popup.close();\n            },\n            destroy: function () {\n                var that = this;\n                that.element.off(ns);\n                that._clear.off(ns);\n                that.wrapper.off(ns);\n                List.fn.destroy.call(that);\n            },\n            refresh: function () {\n                this.listView.refresh();\n            },\n            select: function (li) {\n                this._select(li);\n            },\n            search: function (word) {\n                var that = this, options = that.options, ignoreCase = options.ignoreCase, separator = that._separator(), length, accentFoldingFiltering = that.dataSource.options.accentFoldingFiltering;\n                word = word || that._accessor();\n                clearTimeout(that._typingTimeout);\n                if (separator) {\n                    word = wordAtCaret(caret(that.element)[0], word, separator);\n                }\n                length = word.length;\n                if (!options.enforceMinLength && !length || length >= options.minLength) {\n                    that._open = true;\n                    that._mute(function () {\n                        this.listView.value([]);\n                    });\n                    that._filterSource({\n                        value: ignoreCase ? accentFoldingFiltering ? word.toLocaleLowerCase(accentFoldingFiltering) : word.toLowerCase() : word,\n                        operator: options.filter,\n                        field: options.dataTextField,\n                        ignoreCase: ignoreCase\n                    });\n                    that.one('close', $.proxy(that._unifySeparators, that));\n                }\n                that._toggleCloseVisibility();\n            },\n            suggest: function (word) {\n                var that = this, key = that._last, value = that._accessor(), element = that.element[0], caretIdx = caret(element)[0], separator = that._separator(), words = value.split(separator), wordIndex = indexOfWordAtCaret(caretIdx, value, separator), selectionEnd = caretIdx, idx, accentFoldingFiltering = that.dataSource.options.accentFoldingFiltering;\n                if (key == keys.BACKSPACE || key == keys.DELETE) {\n                    that._last = undefined;\n                    return;\n                }\n                word = word || '';\n                if (typeof word !== 'string') {\n                    if (word[0]) {\n                        word = that.dataSource.view()[List.inArray(word[0], that.ul[0])];\n                    }\n                    word = word ? that._text(word) : '';\n                }\n                if (caretIdx <= 0) {\n                    caretIdx = (accentFoldingFiltering ? value.toLocaleLowerCase(accentFoldingFiltering) : value.toLowerCase()).indexOf(accentFoldingFiltering ? word.toLocaleLowerCase(accentFoldingFiltering) : word.toLowerCase()) + 1;\n                }\n                idx = value.substring(0, caretIdx).lastIndexOf(separator);\n                idx = idx > -1 ? caretIdx - (idx + separator.length) : caretIdx;\n                value = words[wordIndex].substring(0, idx);\n                if (word) {\n                    word = word.toString();\n                    idx = (accentFoldingFiltering ? word.toLocaleLowerCase(accentFoldingFiltering) : word.toLowerCase()).indexOf(accentFoldingFiltering ? value.toLocaleLowerCase(accentFoldingFiltering) : value.toLowerCase());\n                    if (idx > -1) {\n                        word = word.substring(idx + value.length);\n                        selectionEnd = caretIdx + word.length;\n                        value += word;\n                    }\n                    if (separator && words[words.length - 1] !== '') {\n                        words.push('');\n                    }\n                }\n                words[wordIndex] = value;\n                that._accessor(words.join(separator || ''));\n                if (element === activeElement()) {\n                    caret(element, caretIdx, selectionEnd);\n                }\n            },\n            value: function (value) {\n                if (value !== undefined) {\n                    this.listView.value(value);\n                    this._accessor(value);\n                    this._old = this._accessor();\n                    this._oldText = this._accessor();\n                } else {\n                    return this._accessor();\n                }\n                this._toggleCloseVisibility();\n            },\n            _click: function (e) {\n                var item = e.item;\n                var that = this;\n                var element = that.element;\n                var dataItem = that.listView.dataItemByIndex(that.listView.getElementIndex(item));\n                e.preventDefault();\n                that._active = true;\n                if (that.trigger('select', {\n                        dataItem: dataItem,\n                        item: item\n                    })) {\n                    that.close();\n                    return;\n                }\n                that._oldText = element.val();\n                that._select(item).done(function () {\n                    that._blur();\n                    caret(element, element.val().length);\n                });\n            },\n            _clearText: $.noop,\n            _resetFocusItem: function () {\n                var index = this.options.highlightFirst ? 0 : -1;\n                if (this.options.virtual) {\n                    this.listView.scrollTo(0);\n                }\n                this.listView.focus(index);\n            },\n            _listBound: function () {\n                var that = this;\n                var popup = that.popup;\n                var options = that.options;\n                var data = that.dataSource.flatView();\n                var length = data.length;\n                var groupsLength = that.dataSource._group.length;\n                var isActive = that.element[0] === activeElement();\n                var action;\n                that._renderFooter();\n                that._renderNoData();\n                that._toggleNoData(!length);\n                that._toggleHeader(!!groupsLength && !!length);\n                that._resizePopup();\n                popup.position();\n                if (length) {\n                    if (options.suggest && isActive && that._inputValue()) {\n                        that.suggest(data[0]);\n                    }\n                }\n                if (that._open) {\n                    that._open = false;\n                    action = that._allowOpening() ? 'open' : 'close';\n                    if (that._typingTimeout && !isActive) {\n                        action = 'close';\n                    }\n                    if (length) {\n                        that._resetFocusItem();\n                        if (options.virtual) {\n                            that.popup.unbind('activate', that._resetFocusItemHandler).one('activate', that._resetFocusItemHandler);\n                        }\n                    }\n                    popup[action]();\n                    that._typingTimeout = undefined;\n                }\n                if (that._touchScroller) {\n                    that._touchScroller.reset();\n                }\n                that._hideBusy();\n                that._makeUnselectable();\n                that.trigger('dataBound');\n            },\n            _mute: function (callback) {\n                this._muted = true;\n                callback.call(this);\n                this._muted = false;\n            },\n            _listChange: function () {\n                var isActive = this._active || this.element[0] === activeElement();\n                if (isActive && !this._muted) {\n                    this._selectValue(this.listView.selectedDataItems()[0]);\n                }\n            },\n            _selectValue: function (dataItem) {\n                var separator = this._separator();\n                var text = '';\n                if (dataItem) {\n                    text = this._text(dataItem);\n                }\n                if (text === null) {\n                    text = '';\n                }\n                if (separator) {\n                    text = replaceWordAtCaret(caret(this.element)[0], this._accessor(), text, separator, this._defaultSeparator());\n                }\n                this._prev = text;\n                this._accessor(text);\n                this._placeholder();\n            },\n            _unifySeparators: function () {\n                this._accessor(this.value().split(this._separator()).join(this._defaultSeparator()));\n                return this;\n            },\n            _preselect: function (value, text) {\n                this._inputValue(text);\n                this._accessor(value);\n                this._old = this.oldText = this._accessor();\n                this.listView.setValue(value);\n                this._placeholder();\n            },\n            _change: function () {\n                var that = this;\n                var value = that._unifySeparators().value();\n                var trigger = value !== List.unifyType(that._old, typeof value);\n                var valueUpdated = trigger && !that._typing;\n                var itemSelected = that._oldText !== value;\n                that._old = value;\n                that._oldText = value;\n                if (valueUpdated || itemSelected) {\n                    that.element.trigger(CHANGE);\n                }\n                if (trigger) {\n                    that.trigger(CHANGE);\n                }\n                that.typing = false;\n                that._toggleCloseVisibility();\n            },\n            _accessor: function (value) {\n                var that = this, element = that.element[0];\n                if (value !== undefined) {\n                    element.value = value === null ? '' : value;\n                    that._placeholder();\n                } else {\n                    value = element.value;\n                    if (element.className.indexOf('k-readonly') > -1) {\n                        if (value === that.options.placeholder) {\n                            return '';\n                        } else {\n                            return value;\n                        }\n                    }\n                    return value;\n                }\n            },\n            _keydown: function (e) {\n                var that = this;\n                var key = e.keyCode;\n                var listView = that.listView;\n                var visible = that.popup.visible();\n                var current = listView.focus();\n                that._last = key;\n                if (key === keys.DOWN) {\n                    if (visible) {\n                        this._move(current ? 'focusNext' : 'focusFirst');\n                    } else if (that.value()) {\n                        that._filterSource({\n                            value: that.ignoreCase ? that.value().toLowerCase() : that.value(),\n                            operator: that.options.filter,\n                            field: that.options.dataTextField,\n                            ignoreCase: that.ignoreCase\n                        }).done(function () {\n                            if (that._allowOpening()) {\n                                that._resetFocusItem();\n                                that.popup.open();\n                            }\n                        });\n                    }\n                    e.preventDefault();\n                } else if (key === keys.UP) {\n                    if (visible) {\n                        this._move(current ? 'focusPrev' : 'focusLast');\n                    }\n                    e.preventDefault();\n                } else if (key === keys.HOME) {\n                    this._move('focusFirst');\n                } else if (key === keys.END) {\n                    this._move('focusLast');\n                } else if (key === keys.ENTER || key === keys.TAB) {\n                    if (key === keys.ENTER && visible) {\n                        e.preventDefault();\n                    }\n                    if (visible && current) {\n                        var dataItem = listView.dataItemByIndex(listView.getElementIndex(current));\n                        if (that.trigger('select', {\n                                dataItem: dataItem,\n                                item: current\n                            })) {\n                            return;\n                        }\n                        this._select(current);\n                    }\n                    this._blur();\n                } else if (key === keys.ESC) {\n                    if (visible) {\n                        e.preventDefault();\n                    } else {\n                        that._clearValue();\n                    }\n                    that.close();\n                } else if (that.popup.visible() && (key === keys.PAGEDOWN || key === keys.PAGEUP)) {\n                    e.preventDefault();\n                    var direction = key === keys.PAGEDOWN ? 1 : -1;\n                    listView.scrollWith(direction * listView.screenHeight());\n                } else {\n                    that.popup._hovered = true;\n                    that._search();\n                }\n            },\n            _keypress: function () {\n                this._oldText = this.element.val();\n                this._typing = true;\n            },\n            _move: function (action) {\n                this.listView[action]();\n                if (this.options.suggest) {\n                    this.suggest(this.listView.focus());\n                }\n            },\n            _hideBusy: function () {\n                var that = this;\n                clearTimeout(that._busy);\n                that._loading.hide();\n                that.element.attr('aria-busy', false);\n                that._busy = null;\n                that._showClear();\n            },\n            _showBusy: function () {\n                var that = this;\n                if (that._busy) {\n                    return;\n                }\n                that._busy = setTimeout(function () {\n                    that.element.attr('aria-busy', true);\n                    that._loading.show();\n                    that._hideClear();\n                }, 100);\n            },\n            _placeholder: function (show) {\n                if (placeholderSupported) {\n                    return;\n                }\n                var that = this, element = that.element, placeholder = that.options.placeholder, value;\n                if (placeholder) {\n                    value = element.val();\n                    if (show === undefined) {\n                        show = !value;\n                    }\n                    if (!show) {\n                        if (value !== placeholder) {\n                            placeholder = value;\n                        } else {\n                            placeholder = '';\n                        }\n                    }\n                    if (value === that._old && !show) {\n                        return;\n                    }\n                    element.toggleClass('k-readonly', show).val(placeholder);\n                    if (!placeholder && element[0] === document.activeElement) {\n                        caret(element[0], 0, 0);\n                    }\n                }\n            },\n            _separator: function () {\n                var separator = this.options.separator;\n                if (separator instanceof Array) {\n                    return new RegExp(separator.join('|'), 'gi');\n                }\n                return separator;\n            },\n            _defaultSeparator: function () {\n                var separator = this.options.separator;\n                if (separator instanceof Array) {\n                    return separator[0];\n                }\n                return separator;\n            },\n            _inputValue: function () {\n                return this.element.val();\n            },\n            _search: function () {\n                var that = this;\n                clearTimeout(that._typingTimeout);\n                that._typingTimeout = setTimeout(function () {\n                    if (that._prev !== that._accessor()) {\n                        that._prev = that._accessor();\n                        that.search();\n                    }\n                }, that.options.delay);\n            },\n            _select: function (candidate) {\n                var that = this;\n                that._active = true;\n                return that.listView.select(candidate).done(function () {\n                    that._active = false;\n                });\n            },\n            _loader: function () {\n                this._loading = $('<span class=\"k-icon k-i-loading\" style=\"display:none\"></span>').insertAfter(this.element);\n            },\n            _clearButton: function () {\n                List.fn._clearButton.call(this);\n                if (this.options.clearButton) {\n                    this._clear.insertAfter(this.element);\n                    this.wrapper.addClass('k-autocomplete-clearable');\n                }\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _toggleCloseVisibility: function () {\n                if (this.value()) {\n                    this._showClear();\n                } else {\n                    this._hideClear();\n                }\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, DOMelement = element[0], wrapper;\n                wrapper = element.parent();\n                if (!wrapper.is('span.k-widget')) {\n                    wrapper = element.wrap('<span />').parent();\n                }\n                wrapper.attr('tabindex', -1);\n                wrapper.attr('role', 'presentation');\n                wrapper[0].style.cssText = DOMelement.style.cssText;\n                element.css({\n                    width: '',\n                    height: DOMelement.style.height\n                });\n                that._focused = that.element;\n                that.wrapper = wrapper.addClass('k-widget k-autocomplete').addClass(DOMelement.className).removeClass('input-validation-error');\n                that._inputWrapper = $(wrapper[0]);\n            },\n            _clearValue: function () {\n                List.fn._clearValue.call(this);\n                this.element.focus();\n            }\n        });\n        ui.plugin(AutoComplete);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dropdownlist', [\n        'kendo.list',\n        'kendo.mobile.scroller',\n        'kendo.virtuallist'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dropdownlist',\n        name: 'DropDownList',\n        category: 'web',\n        description: 'The DropDownList widget displays a list of values and allows the selection of a single value from the list.',\n        depends: ['list'],\n        features: [\n            {\n                id: 'mobile-scroller',\n                name: 'Mobile scroller',\n                description: 'Support for kinetic scrolling in mobile device',\n                depends: ['mobile.scroller']\n            },\n            {\n                id: 'virtualization',\n                name: 'VirtualList',\n                description: 'Support for virtualization',\n                depends: ['virtuallist']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, List = ui.List, Select = ui.Select, support = kendo.support, activeElement = kendo._activeElement, ObservableObject = kendo.data.ObservableObject, keys = kendo.keys, ns = '.kendoDropDownList', nsFocusEvent = ns + 'FocusEvent', DISABLED = 'disabled', READONLY = 'readonly', CHANGE = 'change', FOCUSED = 'k-state-focused', DEFAULT = 'k-state-default', STATEDISABLED = 'k-state-disabled', ARIA_DISABLED = 'aria-disabled', CLICKEVENTS = 'click' + ns + ' touchend' + ns, HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, TABINDEX = 'tabindex', STATE_FILTER = 'filter', STATE_ACCEPT = 'accept', MSG_INVALID_OPTION_LABEL = 'The `optionLabel` option is not valid due to missing fields. Define a custom optionLabel as shown here http://docs.telerik.com/kendo-ui/api/javascript/ui/dropdownlist#configuration-optionLabel', proxy = $.proxy;\n        var DropDownList = Select.extend({\n            init: function (element, options) {\n                var that = this;\n                var index = options && options.index;\n                var optionLabel, text, disabled;\n                that.ns = ns;\n                options = $.isArray(options) ? { dataSource: options } : options;\n                Select.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element.on('focus' + ns, proxy(that._focusHandler, that));\n                that._focusInputHandler = $.proxy(that._focusInput, that);\n                that.optionLabel = $();\n                that._optionLabel();\n                that._inputTemplate();\n                that._reset();\n                that._prev = '';\n                that._word = '';\n                that._wrapper();\n                that._tabindex();\n                that.wrapper.data(TABINDEX, that.wrapper.attr(TABINDEX));\n                that._span();\n                that._popup();\n                that._mobile();\n                that._dataSource();\n                that._ignoreCase();\n                that._filterHeader();\n                that._aria();\n                that.wrapper.attr('aria-live', 'polite');\n                that._enable();\n                that._attachFocusHandlers();\n                that._oldIndex = that.selectedIndex = -1;\n                if (index !== undefined) {\n                    options.index = index;\n                }\n                that._initialIndex = options.index;\n                that.requireValueMapper(that.options);\n                that._initList();\n                that._cascade();\n                that.one('set', function (e) {\n                    if (!e.sender.listView.bound() && that.hasOptionLabel()) {\n                        that._textAccessor(that._optionLabelText());\n                    }\n                });\n                if (options.autoBind) {\n                    that.dataSource.fetch();\n                } else if (that.selectedIndex === -1) {\n                    text = options.text || '';\n                    if (!text) {\n                        optionLabel = options.optionLabel;\n                        if (optionLabel && options.index === 0) {\n                            text = optionLabel;\n                        } else if (that._isSelect) {\n                            text = element.children(':selected').text();\n                        }\n                    }\n                    that._textAccessor(text);\n                }\n                disabled = $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                }\n                that.listView.bind('click', function (e) {\n                    e.preventDefault();\n                });\n                kendo.notify(that);\n            },\n            options: {\n                name: 'DropDownList',\n                enabled: true,\n                autoBind: true,\n                index: 0,\n                text: null,\n                value: null,\n                delay: 500,\n                height: 200,\n                dataTextField: '',\n                dataValueField: '',\n                optionLabel: '',\n                cascadeFrom: '',\n                cascadeFromField: '',\n                cascadeFromParentField: '',\n                ignoreCase: true,\n                animation: {},\n                filter: 'none',\n                minLength: 1,\n                enforceMinLength: false,\n                virtual: false,\n                template: null,\n                valueTemplate: null,\n                optionLabelTemplate: null,\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: '#:data#',\n                autoWidth: false,\n                popup: null\n            },\n            events: [\n                'open',\n                'close',\n                CHANGE,\n                'select',\n                'filtering',\n                'dataBinding',\n                'dataBound',\n                'cascade',\n                'set',\n                'kendoKeydown'\n            ],\n            setOptions: function (options) {\n                Select.fn.setOptions.call(this, options);\n                this.listView.setOptions(this._listOptions(options));\n                this._optionLabel();\n                this._inputTemplate();\n                this._accessors();\n                this._filterHeader();\n                this._enable();\n                this._aria();\n                if (!this.value() && this.hasOptionLabel()) {\n                    this.select(0);\n                }\n            },\n            destroy: function () {\n                var that = this;\n                Select.fn.destroy.call(that);\n                that.wrapper.off(ns);\n                that.wrapper.off(nsFocusEvent);\n                that.element.off(ns);\n                that._inputWrapper.off(ns);\n                that._arrow.off();\n                that._arrow = null;\n                that._arrowIcon = null;\n                that.optionLabel.off();\n                if (that.filterInput) {\n                    that.filterInput.off(nsFocusEvent);\n                }\n            },\n            open: function () {\n                var that = this;\n                var isFiltered = that.dataSource.filter() ? that.dataSource.filter().filters.length > 0 : false;\n                if (that.popup.visible()) {\n                    return;\n                }\n                if (!that.listView.bound() || that._state === STATE_ACCEPT) {\n                    that._open = true;\n                    that._state = 'rebind';\n                    if (that.filterInput) {\n                        that.filterInput.val('');\n                        that._prev = '';\n                    }\n                    if (that.filterInput && that.options.minLength !== 1 && !isFiltered) {\n                        that.refresh();\n                        that.popup.one('activate', that._focusInputHandler);\n                        that.popup.open();\n                        that._resizeFilterInput();\n                    } else {\n                        that._filterSource();\n                    }\n                } else if (that._allowOpening()) {\n                    that._focusFilter = true;\n                    that.popup.one('activate', that._focusInputHandler);\n                    that.popup._hovered = true;\n                    that.popup.open();\n                    that._resizeFilterInput();\n                    that._focusItem();\n                }\n            },\n            _focusInput: function () {\n                this._focusElement(this.filterInput);\n            },\n            _resizeFilterInput: function () {\n                var filterInput = this.filterInput;\n                var originalPrevent = this._prevent;\n                if (!filterInput) {\n                    return;\n                }\n                var isInputActive = this.filterInput[0] === activeElement();\n                var caret = kendo.caret(this.filterInput[0])[0];\n                this._prevent = true;\n                filterInput.css('display', 'none').css('width', this.popup.element.css('width')).css('display', 'inline-block');\n                if (isInputActive) {\n                    filterInput.focus();\n                    kendo.caret(filterInput[0], caret);\n                }\n                this._prevent = originalPrevent;\n            },\n            _allowOpening: function () {\n                return this.hasOptionLabel() || this.filterInput || Select.fn._allowOpening.call(this);\n            },\n            toggle: function (toggle) {\n                this._toggle(toggle, true);\n            },\n            current: function (candidate) {\n                var current;\n                if (candidate === undefined) {\n                    current = this.listView.focus();\n                    if (!current && this.selectedIndex === 0 && this.hasOptionLabel()) {\n                        return this.optionLabel;\n                    }\n                    return current;\n                }\n                this._focus(candidate);\n            },\n            dataItem: function (index) {\n                var that = this;\n                var dataItem = null;\n                if (index === null) {\n                    return index;\n                }\n                if (index === undefined) {\n                    dataItem = that.listView.selectedDataItems()[0];\n                } else {\n                    if (typeof index !== 'number') {\n                        if (that.options.virtual) {\n                            return that.dataSource.getByUid($(index).data('uid'));\n                        }\n                        if (index.hasClass('k-list-optionlabel')) {\n                            index = -1;\n                        } else {\n                            index = $(that.items()).index(index);\n                        }\n                    } else if (that.hasOptionLabel()) {\n                        index -= 1;\n                    }\n                    dataItem = that.dataSource.flatView()[index];\n                }\n                if (!dataItem) {\n                    dataItem = that._optionLabelDataItem();\n                }\n                return dataItem;\n            },\n            refresh: function () {\n                this.listView.refresh();\n            },\n            text: function (text) {\n                var that = this;\n                var loweredText;\n                var ignoreCase = that.options.ignoreCase;\n                text = text === null ? '' : text;\n                if (text !== undefined) {\n                    if (typeof text !== 'string') {\n                        that._textAccessor(text);\n                        return;\n                    }\n                    loweredText = ignoreCase ? text.toLowerCase() : text;\n                    that._select(function (data) {\n                        data = that._text(data);\n                        if (ignoreCase) {\n                            data = (data + '').toLowerCase();\n                        }\n                        return data === loweredText;\n                    }).done(function () {\n                        that._textAccessor(that.dataItem() || text);\n                    });\n                } else {\n                    return that._textAccessor();\n                }\n            },\n            _clearFilter: function () {\n                $(this.filterInput).val('');\n                Select.fn._clearFilter.call(this);\n            },\n            value: function (value) {\n                var that = this;\n                var listView = that.listView;\n                var dataSource = that.dataSource;\n                if (value === undefined) {\n                    value = that._accessor() || that.listView.value()[0];\n                    return value === undefined || value === null ? '' : value;\n                }\n                that.requireValueMapper(that.options, value);\n                if (value || !that.hasOptionLabel()) {\n                    that._initialIndex = null;\n                }\n                this.trigger('set', { value: value });\n                if (that._request && that.options.cascadeFrom && that.listView.bound()) {\n                    if (that._valueSetter) {\n                        dataSource.unbind(CHANGE, that._valueSetter);\n                    }\n                    that._valueSetter = proxy(function () {\n                        that.value(value);\n                    }, that);\n                    dataSource.one(CHANGE, that._valueSetter);\n                    return;\n                }\n                if (that._isFilterEnabled() && listView.bound() && listView.isFiltered()) {\n                    that._clearFilter();\n                } else {\n                    that._fetchData();\n                }\n                listView.value(value).done(function () {\n                    that._old = that._valueBeforeCascade = that._accessor();\n                    that._oldIndex = that.selectedIndex;\n                });\n            },\n            hasOptionLabel: function () {\n                return this.optionLabel && !!this.optionLabel[0];\n            },\n            _optionLabel: function () {\n                var that = this;\n                var options = that.options;\n                var optionLabel = options.optionLabel;\n                var template = options.optionLabelTemplate;\n                if (!optionLabel) {\n                    that.optionLabel.off().remove();\n                    that.optionLabel = $();\n                    return;\n                }\n                if (!template) {\n                    template = '#:';\n                    if (typeof optionLabel === 'string') {\n                        template += 'data';\n                    } else {\n                        template += kendo.expr(options.dataTextField, 'data');\n                    }\n                    template += '#';\n                }\n                if (typeof template !== 'function') {\n                    template = kendo.template(template);\n                }\n                that.optionLabelTemplate = template;\n                if (!that.hasOptionLabel()) {\n                    that.optionLabel = $('<div class=\"k-list-optionlabel\"></div>').prependTo(that.list);\n                }\n                that.optionLabel.html(template(optionLabel)).off().on(CLICKEVENTS, proxy(that._click, that)).on(HOVEREVENTS, that._toggleHover);\n                that.angular('compile', function () {\n                    return {\n                        elements: that.optionLabel,\n                        data: [{ dataItem: that._optionLabelDataItem() }]\n                    };\n                });\n            },\n            _optionLabelText: function () {\n                var optionLabel = this.options.optionLabel;\n                return typeof optionLabel === 'string' ? optionLabel : this._text(optionLabel);\n            },\n            _optionLabelDataItem: function () {\n                var that = this;\n                var optionLabel = that.options.optionLabel;\n                if (that.hasOptionLabel()) {\n                    return $.isPlainObject(optionLabel) ? new ObservableObject(optionLabel) : that._assignInstance(that._optionLabelText(), '');\n                }\n                return undefined;\n            },\n            _buildOptions: function (data) {\n                var that = this;\n                if (!that._isSelect) {\n                    return;\n                }\n                var value = that.listView.value()[0];\n                var optionLabel = that._optionLabelDataItem();\n                var optionLabelValue = optionLabel && that._value(optionLabel);\n                if (value === undefined || value === null) {\n                    value = '';\n                }\n                if (optionLabel) {\n                    if (optionLabelValue === undefined || optionLabelValue === null) {\n                        optionLabelValue = '';\n                    }\n                    optionLabel = '<option value=\"' + optionLabelValue + '\">' + that._text(optionLabel) + '</option>';\n                }\n                that._options(data, optionLabel, value);\n                if (value !== List.unifyType(that._accessor(), typeof value)) {\n                    that._customOption = null;\n                    that._custom(value);\n                }\n            },\n            _listBound: function () {\n                var that = this;\n                var initialIndex = that._initialIndex;\n                var filtered = that._state === STATE_FILTER;\n                var data = that.dataSource.flatView();\n                var dataItem;\n                that._presetValue = false;\n                that._renderFooter();\n                that._renderNoData();\n                that._toggleNoData(!data.length);\n                that._resizePopup(true);\n                that.popup.position();\n                that._buildOptions(data);\n                that._makeUnselectable();\n                if (!filtered) {\n                    if (that._open) {\n                        that.toggle(that._allowOpening());\n                    }\n                    that._open = false;\n                    if (!that._fetch) {\n                        if (data.length) {\n                            if (!that.listView.value().length && initialIndex > -1 && initialIndex !== null) {\n                                that.select(initialIndex);\n                            }\n                            that._initialIndex = null;\n                            dataItem = that.listView.selectedDataItems()[0];\n                            if (dataItem && that.text() !== that._text(dataItem)) {\n                                that._selectValue(dataItem);\n                            }\n                        } else if (that._textAccessor() !== that._optionLabelText()) {\n                            that.listView.value('');\n                            that._selectValue(null);\n                            that._oldIndex = that.selectedIndex;\n                        }\n                    }\n                }\n                that._hideBusy();\n                that.trigger('dataBound');\n            },\n            _listChange: function () {\n                this._selectValue(this.listView.selectedDataItems()[0]);\n                if (this._presetValue || this._old && this._oldIndex === -1) {\n                    this._oldIndex = this.selectedIndex;\n                }\n            },\n            _filterPaste: function () {\n                this._search();\n            },\n            _attachFocusHandlers: function () {\n                var that = this;\n                var wrapper = that.wrapper;\n                wrapper.on('focusin' + nsFocusEvent, proxy(that._focusinHandler, that)).on('focusout' + nsFocusEvent, proxy(that._focusoutHandler, that));\n                if (that.filterInput) {\n                    that.filterInput.on('focusin' + nsFocusEvent, proxy(that._focusinHandler, that)).on('focusout' + nsFocusEvent, proxy(that._focusoutHandler, that));\n                }\n            },\n            _focusHandler: function () {\n                this.wrapper.focus();\n            },\n            _focusinHandler: function () {\n                this._inputWrapper.addClass(FOCUSED);\n                this._prevent = false;\n            },\n            _focusoutHandler: function () {\n                var that = this;\n                var isIFrame = window.self !== window.top;\n                if (!that._prevent) {\n                    clearTimeout(that._typingTimeout);\n                    if (support.mobileOS.ios && isIFrame) {\n                        that._change();\n                    } else {\n                        that._blur();\n                    }\n                    that._inputWrapper.removeClass(FOCUSED);\n                    that._prevent = true;\n                    that._open = false;\n                    that.element.blur();\n                }\n            },\n            _wrapperMousedown: function () {\n                this._prevent = !!this.filterInput;\n            },\n            _wrapperClick: function (e) {\n                e.preventDefault();\n                this.popup.unbind('activate', this._focusInputHandler);\n                this._focused = this.wrapper;\n                this._prevent = false;\n                this._toggle();\n            },\n            _editable: function (options) {\n                var that = this;\n                var element = that.element;\n                var disable = options.disable;\n                var readonly = options.readonly;\n                var wrapper = that.wrapper.add(that.filterInput).off(ns);\n                var dropDownWrapper = that._inputWrapper.off(HOVEREVENTS);\n                if (!readonly && !disable) {\n                    element.removeAttr(DISABLED).removeAttr(READONLY);\n                    dropDownWrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    wrapper.attr(TABINDEX, wrapper.data(TABINDEX)).attr(ARIA_DISABLED, false).on('keydown' + ns, that, proxy(that._keydown, that)).on(kendo.support.mousedown + ns, proxy(that._wrapperMousedown, that)).on('paste' + ns, proxy(that._filterPaste, that));\n                    that.wrapper.on('click' + ns, proxy(that._wrapperClick, that));\n                    if (!that.filterInput) {\n                        wrapper.on('keypress' + ns, proxy(that._keypress, that));\n                    } else {\n                        wrapper.on('input' + ns, proxy(that._search, that));\n                    }\n                } else if (disable) {\n                    wrapper.removeAttr(TABINDEX);\n                    dropDownWrapper.addClass(STATEDISABLED).removeClass(DEFAULT);\n                } else {\n                    dropDownWrapper.addClass(DEFAULT).removeClass(STATEDISABLED);\n                }\n                element.attr(DISABLED, disable).attr(READONLY, readonly);\n                wrapper.attr(ARIA_DISABLED, disable);\n            },\n            _keydown: function (e) {\n                var that = this;\n                var key = e.keyCode;\n                var altKey = e.altKey;\n                var isInputActive;\n                var handled;\n                var isPopupVisible = that.popup.visible();\n                if (that.filterInput) {\n                    isInputActive = that.filterInput[0] === activeElement();\n                }\n                if (key === keys.LEFT) {\n                    key = keys.UP;\n                    handled = true;\n                } else if (key === keys.RIGHT) {\n                    key = keys.DOWN;\n                    handled = true;\n                }\n                if (handled && isInputActive) {\n                    return;\n                }\n                e.keyCode = key;\n                if (altKey && key === keys.UP || key === keys.ESC) {\n                    that._focusElement(that.wrapper);\n                }\n                if (that._state === STATE_FILTER && key === keys.ESC) {\n                    that._clearFilter();\n                    that._open = false;\n                    that._state = STATE_ACCEPT;\n                }\n                if (key === keys.ENTER && that._typingTimeout && that.filterInput && isPopupVisible) {\n                    e.preventDefault();\n                    return;\n                }\n                if (key === keys.SPACEBAR && !isInputActive) {\n                    that.toggle(!isPopupVisible);\n                    e.preventDefault();\n                }\n                handled = that._move(e);\n                if (handled) {\n                    return;\n                }\n                if (!isPopupVisible || !that.filterInput) {\n                    var current = that._focus();\n                    if (key === keys.HOME) {\n                        handled = true;\n                        that._firstItem();\n                    } else if (key === keys.END) {\n                        handled = true;\n                        that._lastItem();\n                    }\n                    if (handled) {\n                        if (that.trigger('select', {\n                                dataItem: that._getElementDataItem(that._focus()),\n                                item: that._focus()\n                            })) {\n                            that._focus(current);\n                            return;\n                        }\n                        that._select(that._focus(), true).done(function () {\n                            if (!isPopupVisible) {\n                                that._blur();\n                            }\n                        });\n                        e.preventDefault();\n                    }\n                }\n                if (!altKey && !handled && that.filterInput) {\n                    that._search();\n                }\n            },\n            _matchText: function (text, word) {\n                var ignoreCase = this.options.ignoreCase;\n                if (text === undefined || text === null) {\n                    return false;\n                }\n                text = text + '';\n                if (ignoreCase) {\n                    text = text.toLowerCase();\n                }\n                return text.indexOf(word) === 0;\n            },\n            _shuffleData: function (data, splitIndex) {\n                var optionDataItem = this._optionLabelDataItem();\n                if (optionDataItem) {\n                    data = [optionDataItem].concat(data);\n                }\n                return data.slice(splitIndex).concat(data.slice(0, splitIndex));\n            },\n            _selectNext: function () {\n                var that = this;\n                var data = that.dataSource.flatView();\n                var dataLength = data.length + (that.hasOptionLabel() ? 1 : 0);\n                var isInLoop = sameCharsOnly(that._word, that._last);\n                var startIndex = that.selectedIndex;\n                var oldFocusedItem;\n                var text;\n                if (startIndex === -1) {\n                    startIndex = 0;\n                } else {\n                    startIndex += isInLoop ? 1 : 0;\n                    startIndex = normalizeIndex(startIndex, dataLength);\n                }\n                data = data.toJSON ? data.toJSON() : data.slice();\n                data = that._shuffleData(data, startIndex);\n                for (var idx = 0; idx < dataLength; idx++) {\n                    text = that._text(data[idx]);\n                    if (isInLoop && that._matchText(text, that._last)) {\n                        break;\n                    } else if (that._matchText(text, that._word)) {\n                        break;\n                    }\n                }\n                if (idx !== dataLength) {\n                    oldFocusedItem = that._focus();\n                    that._select(normalizeIndex(startIndex + idx, dataLength)).done(function () {\n                        var done = function () {\n                            if (!that.popup.visible()) {\n                                that._change();\n                            }\n                        };\n                        if (that.trigger('select', {\n                                dataItem: that._getElementDataItem(that._focus()),\n                                item: that._focus()\n                            })) {\n                            that._select(oldFocusedItem).done(done);\n                        } else {\n                            done();\n                        }\n                    });\n                }\n            },\n            _keypress: function (e) {\n                var that = this;\n                if (e.which === 0 || e.keyCode === kendo.keys.ENTER) {\n                    return;\n                }\n                var character = String.fromCharCode(e.charCode || e.keyCode);\n                if (that.options.ignoreCase) {\n                    character = character.toLowerCase();\n                }\n                if (character === ' ') {\n                    e.preventDefault();\n                }\n                that._word += character;\n                that._last = character;\n                that._search();\n            },\n            _popupOpen: function () {\n                var popup = this.popup;\n                popup.wrapper = kendo.wrap(popup.element);\n                if (popup.element.closest('.km-root')[0]) {\n                    popup.wrapper.addClass('km-popup km-widget');\n                    this.wrapper.addClass('km-widget');\n                }\n            },\n            _popup: function () {\n                Select.fn._popup.call(this);\n                this.popup.one('open', proxy(this._popupOpen, this));\n            },\n            _getElementDataItem: function (element) {\n                if (!element || !element[0]) {\n                    return null;\n                }\n                if (element[0] === this.optionLabel[0]) {\n                    return this._optionLabelDataItem();\n                }\n                return this.listView.dataItemByIndex(this.listView.getElementIndex(element));\n            },\n            _click: function (e) {\n                var that = this;\n                var item = e.item || $(e.currentTarget);\n                e.preventDefault();\n                if (that.trigger('select', {\n                        dataItem: that._getElementDataItem(item),\n                        item: item\n                    })) {\n                    that.close();\n                    return;\n                }\n                that._userTriggered = true;\n                that._select(item).done(function () {\n                    that._blur();\n                    that._focusElement(that.wrapper);\n                });\n            },\n            _focusElement: function (element) {\n                var active = activeElement();\n                var wrapper = this.wrapper;\n                var filterInput = this.filterInput;\n                var compareElement = element === filterInput ? wrapper : filterInput;\n                var touchEnabled = support.mobileOS && (support.touch || support.MSPointers || support.pointers);\n                if (filterInput && filterInput[0] === element[0] && touchEnabled) {\n                    return;\n                }\n                if (filterInput && (compareElement[0] === active || this._focusFilter)) {\n                    this._focusFilter = false;\n                    this._prevent = true;\n                    this._focused = element.focus();\n                }\n            },\n            _searchByWord: function (word) {\n                if (!word) {\n                    return;\n                }\n                var that = this;\n                var ignoreCase = that.options.ignoreCase;\n                if (ignoreCase) {\n                    word = word.toLowerCase();\n                }\n                that._select(function (dataItem) {\n                    return that._matchText(that._text(dataItem), word);\n                });\n            },\n            _inputValue: function () {\n                return this.text();\n            },\n            _search: function () {\n                var that = this;\n                var dataSource = that.dataSource;\n                clearTimeout(that._typingTimeout);\n                if (that._isFilterEnabled()) {\n                    that._typingTimeout = setTimeout(function () {\n                        var value = that.filterInput.val();\n                        if (that._prev !== value) {\n                            that._prev = value;\n                            that.search(value);\n                            that._resizeFilterInput();\n                        }\n                        that._typingTimeout = null;\n                    }, that.options.delay);\n                } else {\n                    that._typingTimeout = setTimeout(function () {\n                        that._word = '';\n                    }, that.options.delay);\n                    if (!that.listView.bound()) {\n                        dataSource.fetch().done(function () {\n                            that._selectNext();\n                        });\n                        return;\n                    }\n                    that._selectNext();\n                }\n            },\n            _get: function (candidate) {\n                var data, found, idx;\n                var isFunction = typeof candidate === 'function';\n                var jQueryCandidate = !isFunction ? $(candidate) : $();\n                if (this.hasOptionLabel()) {\n                    if (typeof candidate === 'number') {\n                        if (candidate > -1) {\n                            candidate -= 1;\n                        }\n                    } else if (jQueryCandidate.hasClass('k-list-optionlabel')) {\n                        candidate = -1;\n                    }\n                }\n                if (isFunction) {\n                    data = this.dataSource.flatView();\n                    for (idx = 0; idx < data.length; idx++) {\n                        if (candidate(data[idx])) {\n                            candidate = idx;\n                            found = true;\n                            break;\n                        }\n                    }\n                    if (!found) {\n                        candidate = -1;\n                    }\n                }\n                return candidate;\n            },\n            _firstItem: function () {\n                if (this.hasOptionLabel()) {\n                    this._focus(this.optionLabel);\n                } else {\n                    this.listView.focusFirst();\n                }\n            },\n            _lastItem: function () {\n                this._resetOptionLabel();\n                this.listView.focusLast();\n            },\n            _nextItem: function () {\n                var focusIndex;\n                if (this.optionLabel.hasClass('k-state-focused')) {\n                    this._resetOptionLabel();\n                    this.listView.focusFirst();\n                    focusIndex = 1;\n                } else {\n                    focusIndex = this.listView.focusNext();\n                }\n                return focusIndex;\n            },\n            _prevItem: function () {\n                var focusIndex;\n                if (this.optionLabel.hasClass('k-state-focused')) {\n                    return;\n                }\n                focusIndex = this.listView.focusPrev();\n                if (!this.listView.focus() && !this.options.virtual) {\n                    this._focus(this.optionLabel);\n                }\n                return focusIndex;\n            },\n            _focusItem: function () {\n                var options = this.options;\n                var listView = this.listView;\n                var focusedItem = listView.focus();\n                var index = listView.select();\n                index = index[index.length - 1];\n                if (index === undefined && options.highlightFirst && !focusedItem) {\n                    index = 0;\n                }\n                if (index !== undefined) {\n                    listView.focus(index);\n                } else {\n                    if (options.optionLabel && (!options.virtual || options.virtual.mapValueTo !== 'dataItem')) {\n                        this._focus(this.optionLabel);\n                        this._select(this.optionLabel);\n                        this.listView.content.scrollTop(0);\n                    } else {\n                        listView.scrollToIndex(0);\n                    }\n                }\n            },\n            _resetOptionLabel: function (additionalClass) {\n                this.optionLabel.removeClass('k-state-focused' + (additionalClass || '')).removeAttr('id');\n            },\n            _focus: function (candidate) {\n                var listView = this.listView;\n                var optionLabel = this.optionLabel;\n                if (candidate === undefined) {\n                    candidate = listView.focus();\n                    if (!candidate && optionLabel.hasClass('k-state-focused')) {\n                        candidate = optionLabel;\n                    }\n                    return candidate;\n                }\n                this._resetOptionLabel();\n                candidate = this._get(candidate);\n                listView.focus(candidate);\n                if (candidate === -1) {\n                    optionLabel.addClass('k-state-focused').attr('id', listView._optionID);\n                    this._focused.add(this.filterInput).removeAttr('aria-activedescendant').attr('aria-activedescendant', listView._optionID);\n                }\n            },\n            _select: function (candidate, keepState) {\n                var that = this;\n                candidate = that._get(candidate);\n                return that.listView.select(candidate).done(function () {\n                    if (!keepState && that._state === STATE_FILTER) {\n                        that._state = STATE_ACCEPT;\n                    }\n                    if (candidate === -1) {\n                        that._selectValue(null);\n                    }\n                });\n            },\n            _selectValue: function (dataItem) {\n                var that = this;\n                var optionLabel = that.options.optionLabel;\n                var idx = that.listView.select();\n                var value = '';\n                var text = '';\n                idx = idx[idx.length - 1];\n                if (idx === undefined) {\n                    idx = -1;\n                }\n                this._resetOptionLabel(' k-state-selected');\n                if (dataItem || dataItem === 0) {\n                    text = dataItem;\n                    value = that._dataValue(dataItem);\n                    if (optionLabel) {\n                        idx += 1;\n                    }\n                } else if (optionLabel) {\n                    that._focus(that.optionLabel.addClass('k-state-selected'));\n                    text = that._optionLabelText();\n                    if (typeof optionLabel === 'string') {\n                        value = '';\n                    } else {\n                        value = that._value(optionLabel);\n                    }\n                    idx = 0;\n                }\n                that.selectedIndex = idx;\n                if (value === null) {\n                    value = '';\n                }\n                that._textAccessor(text);\n                that._accessor(value, idx);\n                that._triggerCascade();\n            },\n            _mobile: function () {\n                var that = this, popup = that.popup, mobileOS = support.mobileOS, root = popup.element.parents('.km-root').eq(0);\n                if (root.length && mobileOS) {\n                    popup.options.animation.open.effects = mobileOS.android || mobileOS.meego ? 'fadeIn' : mobileOS.ios || mobileOS.wp ? 'slideIn:up' : popup.options.animation.open.effects;\n                }\n            },\n            _filterHeader: function () {\n                var icon;\n                if (this.filterInput) {\n                    this.filterInput.off(ns).parent().remove();\n                    this.filterInput = null;\n                }\n                if (this._isFilterEnabled()) {\n                    icon = '<span class=\"k-icon k-i-zoom\"></span>';\n                    this.filterInput = $('<input class=\"k-textbox\"/>').attr({\n                        placeholder: this.element.attr('placeholder'),\n                        title: this.element.attr('title'),\n                        role: 'listbox',\n                        'aria-haspopup': true,\n                        'aria-expanded': false\n                    });\n                    this.list.prepend($('<span class=\"k-list-filter\" />').append(this.filterInput.add(icon)));\n                }\n            },\n            _span: function () {\n                var that = this, wrapper = that.wrapper, SELECTOR = 'span.k-input', span;\n                span = wrapper.find(SELECTOR);\n                if (!span[0]) {\n                    wrapper.append('<span unselectable=\"on\" class=\"k-dropdown-wrap k-state-default\"><span unselectable=\"on\" class=\"k-input\">&nbsp;</span><span unselectable=\"on\" class=\"k-select\" aria-label=\"select\"><span class=\"k-icon k-i-arrow-60-down\"></span></span></span>').append(that.element);\n                    span = wrapper.find(SELECTOR);\n                }\n                that.span = span;\n                that._inputWrapper = $(wrapper[0].firstChild);\n                that._arrow = wrapper.find('.k-select');\n                that._arrowIcon = that._arrow.find('.k-icon');\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, DOMelement = element[0], wrapper;\n                wrapper = element.parent();\n                if (!wrapper.is('span.k-widget')) {\n                    wrapper = element.wrap('<span />').parent();\n                    wrapper[0].style.cssText = DOMelement.style.cssText;\n                    wrapper[0].title = DOMelement.title;\n                }\n                that._focused = that.wrapper = wrapper.addClass('k-widget k-dropdown').addClass(DOMelement.className).removeClass('input-validation-error').css('display', '').attr({\n                    accesskey: element.attr('accesskey'),\n                    unselectable: 'on',\n                    role: 'listbox',\n                    'aria-haspopup': true,\n                    'aria-expanded': false\n                });\n                element.hide().removeAttr('accesskey');\n            },\n            _clearSelection: function (parent) {\n                this.select(parent.value() ? 0 : -1);\n            },\n            _inputTemplate: function () {\n                var that = this, template = that.options.valueTemplate;\n                if (!template) {\n                    template = $.proxy(kendo.template('#:this._text(data)#', { useWithBlock: false }), that);\n                } else {\n                    template = kendo.template(template);\n                }\n                that.valueTemplate = template;\n                if (that.hasOptionLabel() && !that.options.optionLabelTemplate) {\n                    try {\n                        that.valueTemplate(that._optionLabelDataItem());\n                    } catch (e) {\n                        throw new Error(MSG_INVALID_OPTION_LABEL);\n                    }\n                }\n            },\n            _textAccessor: function (text) {\n                var dataItem = null;\n                var template = this.valueTemplate;\n                var optionLabelText = this._optionLabelText();\n                var span = this.span;\n                if (text === undefined) {\n                    return span.text();\n                }\n                if ($.isPlainObject(text) || text instanceof ObservableObject) {\n                    dataItem = text;\n                } else if (optionLabelText && optionLabelText === text) {\n                    dataItem = this.options.optionLabel;\n                }\n                if (!dataItem) {\n                    dataItem = this._assignInstance(text, this._accessor());\n                }\n                if (this.hasOptionLabel()) {\n                    if (dataItem === optionLabelText || this._text(dataItem) === optionLabelText) {\n                        template = this.optionLabelTemplate;\n                        if (typeof this.options.optionLabel === 'string' && !this.options.optionLabelTemplate) {\n                            dataItem = optionLabelText;\n                        }\n                    }\n                }\n                var getElements = function () {\n                    return {\n                        elements: span.get(),\n                        data: [{ dataItem: dataItem }]\n                    };\n                };\n                this.angular('cleanup', getElements);\n                try {\n                    span.html(template(dataItem));\n                } catch (e) {\n                    span.html('');\n                }\n                this.angular('compile', getElements);\n            },\n            _preselect: function (value, text) {\n                if (!value && !text) {\n                    text = this._optionLabelText();\n                }\n                this._accessor(value);\n                this._textAccessor(text);\n                this._old = this._accessor();\n                this._oldIndex = this.selectedIndex;\n                this.listView.setValue(value);\n                this._initialIndex = null;\n                this._presetValue = true;\n            },\n            _assignInstance: function (text, value) {\n                var dataTextField = this.options.dataTextField;\n                var dataItem = {};\n                if (dataTextField) {\n                    assign(dataItem, dataTextField.split('.'), text);\n                    assign(dataItem, this.options.dataValueField.split('.'), value);\n                    dataItem = new ObservableObject(dataItem);\n                } else {\n                    dataItem = text;\n                }\n                return dataItem;\n            }\n        });\n        function assign(instance, fields, value) {\n            var idx = 0, lastIndex = fields.length - 1, field;\n            for (; idx < lastIndex; ++idx) {\n                field = fields[idx];\n                if (!(field in instance)) {\n                    instance[field] = {};\n                }\n                instance = instance[field];\n            }\n            instance[fields[lastIndex]] = value;\n        }\n        function normalizeIndex(index, length) {\n            if (index >= length) {\n                index -= length;\n            }\n            return index;\n        }\n        function sameCharsOnly(word, character) {\n            for (var idx = 0; idx < word.length; idx++) {\n                if (word.charAt(idx) !== character) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        ui.plugin(DropDownList);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.combobox', [\n        'kendo.list',\n        'kendo.mobile.scroller',\n        'kendo.virtuallist'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'combobox',\n        name: 'ComboBox',\n        category: 'web',\n        description: 'The ComboBox widget allows the selection from pre-defined values or entering a new value.',\n        depends: ['list'],\n        features: [\n            {\n                id: 'mobile-scroller',\n                name: 'Mobile scroller',\n                description: 'Support for kinetic scrolling in mobile device',\n                depends: ['mobile.scroller']\n            },\n            {\n                id: 'virtualization',\n                name: 'VirtualList',\n                description: 'Support for virtualization',\n                depends: ['virtuallist']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, List = ui.List, Select = ui.Select, caret = kendo.caret, support = kendo.support, isIE = kendo.support.browser.msie, placeholderSupported = support.placeholder, activeElement = kendo._activeElement, keys = kendo.keys, ns = '.kendoComboBox', nsFocusEvent = ns + 'FocusEvent', CLICK = 'click' + ns, MOUSEDOWN = 'mousedown' + ns, DISABLED = 'disabled', READONLY = 'readonly', CHANGE = 'change', LOADING = 'k-i-loading', DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', STATEDISABLED = 'k-state-disabled', ARIA_DISABLED = 'aria-disabled', AUTOCOMPLETEVALUE = 'off', STATE_FILTER = 'filter', STATE_ACCEPT = 'accept', STATE_REBIND = 'rebind', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, proxy = $.proxy, newLineRegEx = /(\\r\\n|\\n|\\r)/gm;\n        var ComboBox = Select.extend({\n            init: function (element, options) {\n                var that = this, text, disabled;\n                that.ns = ns;\n                options = $.isArray(options) ? { dataSource: options } : options;\n                Select.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element.on('focus' + ns, proxy(that._focusHandler, that));\n                options.placeholder = options.placeholder || element.attr('placeholder');\n                that._reset();\n                that._wrapper();\n                that._input();\n                that._clearButton();\n                that._tabindex(that.input);\n                that._popup();\n                that._dataSource();\n                that._ignoreCase();\n                that._enable();\n                that._attachFocusEvents();\n                that._oldIndex = that.selectedIndex = -1;\n                that._aria();\n                that._initialIndex = options.index;\n                that.requireValueMapper(that.options);\n                that._initList();\n                that._cascade();\n                if (options.autoBind) {\n                    that._filterSource();\n                } else {\n                    text = options.text;\n                    if (!text && that._isSelect) {\n                        text = element.children(':selected').text();\n                    }\n                    if (text) {\n                        that._setText(text);\n                    }\n                }\n                if (!text) {\n                    that._placeholder();\n                }\n                disabled = $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                }\n                kendo.notify(that);\n                that._toggleCloseVisibility();\n            },\n            options: {\n                name: 'ComboBox',\n                enabled: true,\n                index: -1,\n                text: null,\n                value: null,\n                autoBind: true,\n                delay: 200,\n                dataTextField: '',\n                dataValueField: '',\n                minLength: 1,\n                enforceMinLength: false,\n                height: 200,\n                highlightFirst: true,\n                filter: 'none',\n                placeholder: '',\n                suggest: false,\n                cascadeFrom: '',\n                cascadeFromField: '',\n                cascadeFromParentField: '',\n                ignoreCase: true,\n                animation: {},\n                virtual: false,\n                template: null,\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: '#:data#',\n                clearButton: true,\n                syncValueAndText: true,\n                autoWidth: false,\n                popup: null\n            },\n            events: [\n                'open',\n                'close',\n                CHANGE,\n                'select',\n                'filtering',\n                'dataBinding',\n                'dataBound',\n                'cascade',\n                'set'\n            ],\n            setOptions: function (options) {\n                var listOptions = this._listOptions(options);\n                Select.fn.setOptions.call(this, options);\n                this.listView.setOptions(listOptions);\n                this._accessors();\n                this._aria();\n                this._clearButton();\n            },\n            destroy: function () {\n                var that = this;\n                that.input.off(ns);\n                that.input.off(nsFocusEvent);\n                that.element.off(ns);\n                that.wrapper.off(ns);\n                that._inputWrapper.off(ns);\n                clearTimeout(that._pasteTimeout);\n                that._arrow.off(CLICK + ' ' + MOUSEDOWN);\n                that._clear.off(CLICK + ' ' + MOUSEDOWN);\n                Select.fn.destroy.call(that);\n            },\n            _change: function () {\n                var that = this;\n                var text = that.text();\n                var hasText = text && text !== that._oldText && text !== that.options.placeholder;\n                var index = that.selectedIndex;\n                var isCustom = index === -1;\n                if (!that.options.syncValueAndText && !that.value() && isCustom && hasText) {\n                    that._old = '';\n                    that._oldIndex = index;\n                    that._oldText = text;\n                    if (!that._typing) {\n                        that.element.trigger(CHANGE);\n                    }\n                    that.trigger(CHANGE);\n                    that._typing = false;\n                    return;\n                }\n                Select.fn._change.call(that);\n                that._toggleCloseVisibility();\n            },\n            _attachFocusEvents: function () {\n                var that = this;\n                that.input.on('focus' + nsFocusEvent, proxy(that._inputFocus, that)).on('focusout' + nsFocusEvent, proxy(that._inputFocusout, that));\n            },\n            _focusHandler: function (e) {\n                if (e.target === this.element[0]) {\n                    this.input.focus();\n                }\n            },\n            _arrowClick: function () {\n                this._toggle();\n            },\n            _inputFocus: function () {\n                this._inputWrapper.addClass(FOCUSED);\n                this._placeholder(false);\n            },\n            _inputFocusout: function () {\n                var that = this;\n                var value = that.value();\n                that._userTriggered = true;\n                that._inputWrapper.removeClass(FOCUSED);\n                clearTimeout(that._typingTimeout);\n                that._typingTimeout = null;\n                if (this._userTriggered && isIE) {\n                    return;\n                }\n                that.text(that.text());\n                var item = that._focus();\n                var dataItem = this.listView.dataItemByIndex(this.listView.getElementIndex(item));\n                if (value !== that.value() && that.trigger('select', {\n                        dataItem: dataItem,\n                        item: item\n                    })) {\n                    that.value(value);\n                    return;\n                }\n                that._placeholder();\n                that._valueBeforeCascade = that._old;\n                that._blur();\n                that.element.blur();\n            },\n            _inputPaste: function () {\n                var that = this;\n                clearTimeout(that._pasteTimeout);\n                that._pasteTimeout = null;\n                that._pasteTimeout = setTimeout(function () {\n                    that.search();\n                });\n            },\n            _editable: function (options) {\n                var that = this, disable = options.disable, readonly = options.readonly, wrapper = that._inputWrapper.off(ns), input = that.element.add(that.input.off(ns)), arrow = that._arrow.off(CLICK + ' ' + MOUSEDOWN), clear = that._clear;\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    input.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false);\n                    arrow.on(CLICK, proxy(that._arrowClick, that)).on(MOUSEDOWN, function (e) {\n                        e.preventDefault();\n                    });\n                    clear.on(CLICK + ' touchend' + ns, proxy(that._clearValue, that));\n                    that.input.on('keydown' + ns, proxy(that._keydown, that)).on('input' + ns, proxy(that._search, that)).on('paste' + ns, proxy(that._inputPaste, that));\n                    that.wrapper.on(CLICK + ns, proxy(that._focusHandler, that));\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    input.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n                that._toggleCloseVisibility();\n            },\n            open: function () {\n                var that = this;\n                var state = that._state;\n                var isFiltered = that.dataSource.filter() ? that.dataSource.filter().filters.length > 0 : false;\n                var reinitialized = !that.ul.find(that.listView.focus()).length;\n                if (that.popup.visible()) {\n                    return;\n                }\n                if (!that.listView.bound() && state !== STATE_FILTER || state === STATE_ACCEPT) {\n                    that._open = true;\n                    that._state = STATE_REBIND;\n                    if (that.options.minLength !== 1 && !isFiltered || isFiltered && that.value() && that.selectedIndex === -1) {\n                        that.refresh();\n                        that._openPopup();\n                        if (!this.options.virtual) {\n                            that.listView.bound(false);\n                        }\n                    } else {\n                        that._filterSource();\n                    }\n                } else if (that._allowOpening()) {\n                    that.popup._hovered = true;\n                    that._openPopup();\n                    if (that.options.virtual) {\n                        that._focusItem();\n                    } else if (reinitialized && that.options.highlightFirst) {\n                        that.listView.focus(0);\n                    }\n                }\n            },\n            _scrollToFocusedItem: function () {\n                var listView = this.listView;\n                listView.scrollToIndex(listView.getElementIndex(listView.focus()));\n            },\n            _openPopup: function () {\n                this.popup.one('activate', proxy(this._scrollToFocusedItem, this));\n                this.popup.open();\n            },\n            _updateSelectionState: function () {\n                var that = this;\n                var text = that.options.text;\n                var value = that.options.value;\n                if (that.listView.isFiltered()) {\n                    return;\n                }\n                if (that.selectedIndex === -1) {\n                    if (text === undefined || text === null) {\n                        text = value;\n                    }\n                    that._accessor(value);\n                    that.input.val(text || that.input.val());\n                    that._placeholder();\n                } else if (that._oldIndex === -1) {\n                    that._oldIndex = that.selectedIndex;\n                }\n            },\n            _buildOptions: function (data) {\n                var that = this;\n                if (!that._isSelect) {\n                    return;\n                }\n                var custom = that._customOption;\n                if (that._state === STATE_REBIND) {\n                    that._state = '';\n                }\n                that._customOption = undefined;\n                that._options(data, '', that.value());\n                if (custom && custom[0].selected && !that.listView._emptySearch) {\n                    that._custom(custom.val());\n                }\n            },\n            _updateSelection: function () {\n                var that = this;\n                var listView = that.listView;\n                var initialIndex = that._initialIndex;\n                var hasInitialIndex = initialIndex !== null && initialIndex > -1;\n                var filtered = that._state === STATE_FILTER;\n                if (filtered) {\n                    $(listView.focus()).removeClass('k-state-selected');\n                    return;\n                }\n                if (that._fetch) {\n                    return;\n                }\n                if (!listView.value().length) {\n                    if (hasInitialIndex) {\n                        that.select(initialIndex);\n                    } else if (that._accessor()) {\n                        listView.value(that._accessor());\n                    }\n                }\n                that._initialIndex = null;\n                var dataItem = listView.selectedDataItems()[0];\n                if (!dataItem) {\n                    return;\n                }\n                if (that._value(dataItem) !== that.value()) {\n                    that._custom(that._value(dataItem));\n                } else if (that._value(dataItem) !== that.element[0].value) {\n                    that._accessor(that._value(dataItem));\n                }\n                if (that.text() && that.text() !== that._text(dataItem)) {\n                    that._selectValue(dataItem);\n                }\n            },\n            _updateItemFocus: function () {\n                var listView = this.listView;\n                if (!this.options.highlightFirst) {\n                    listView.focus(-1);\n                } else if (!listView.focus() && !listView.focusIndex()) {\n                    listView.focus(0);\n                }\n            },\n            _listBound: function () {\n                var that = this;\n                var isActive = that.input[0] === activeElement();\n                var data = that.dataSource.flatView();\n                var skip = that.listView.skip();\n                var length = data.length;\n                var groupsLength = that.dataSource._group ? that.dataSource._group.length : 0;\n                var isFirstPage = skip === undefined || skip === 0;\n                that._presetValue = false;\n                that._renderFooter();\n                that._renderNoData();\n                that._toggleNoData(!length);\n                that._toggleHeader(!!groupsLength && !!length);\n                that._resizePopup();\n                that.popup.position();\n                that._buildOptions(data);\n                that._makeUnselectable();\n                that._updateSelection();\n                if (data.length && isFirstPage) {\n                    that._updateItemFocus();\n                    if (that.options.suggest && isActive && that.input.val()) {\n                        that.suggest(data[0]);\n                    }\n                }\n                if (that._open) {\n                    that._open = false;\n                    if (that._typingTimeout && !isActive) {\n                        that.popup.close();\n                    } else {\n                        that.toggle(that._allowOpening());\n                    }\n                    that._typingTimeout = null;\n                }\n                that._hideBusy();\n                that.trigger('dataBound');\n            },\n            _listChange: function () {\n                this._selectValue(this.listView.selectedDataItems()[0]);\n                if (this._presetValue) {\n                    this._oldIndex = this.selectedIndex;\n                }\n            },\n            _get: function (candidate) {\n                var data, found, idx;\n                if (typeof candidate === 'function') {\n                    data = this.dataSource.flatView();\n                    for (idx = 0; idx < data.length; idx++) {\n                        if (candidate(data[idx])) {\n                            candidate = idx;\n                            found = true;\n                            break;\n                        }\n                    }\n                    if (!found) {\n                        candidate = -1;\n                    }\n                }\n                return candidate;\n            },\n            _select: function (candidate, keepState) {\n                var that = this;\n                candidate = that._get(candidate);\n                if (candidate === -1) {\n                    that.input[0].value = '';\n                    that._accessor('');\n                }\n                return that.listView.select(candidate).done(function () {\n                    if (!keepState && that._state === STATE_FILTER) {\n                        that._state = STATE_ACCEPT;\n                    }\n                    that._toggleCloseVisibility();\n                });\n            },\n            _selectValue: function (dataItem) {\n                var idx = this.listView.select();\n                var value = '';\n                var text = '';\n                idx = idx[idx.length - 1];\n                if (idx === undefined) {\n                    idx = -1;\n                }\n                this.selectedIndex = idx;\n                if (this.listView.isFiltered() && idx !== -1) {\n                    this._valueBeforeCascade = this._old;\n                }\n                if (idx === -1 && !dataItem) {\n                    if (this.options.syncValueAndText) {\n                        if (this.options.dataTextField === this.options.dataValueField) {\n                            text = this._accessor();\n                        } else {\n                            text = this.input[0].value;\n                        }\n                        value = text;\n                    } else {\n                        text = this.text();\n                    }\n                    this.listView.focus(-1);\n                } else {\n                    if (dataItem || dataItem === 0) {\n                        value = this._dataValue(dataItem);\n                        text = this._text(dataItem);\n                    }\n                    if (value === null) {\n                        value = '';\n                    }\n                }\n                this._setDomInputValue(text);\n                this._accessor(value !== undefined ? value : text, idx);\n                this._placeholder();\n                this._triggerCascade();\n            },\n            _setDomInputValue: function (text) {\n                var that = this;\n                var currentCaret = caret(this.input);\n                var caretStart;\n                if (currentCaret && currentCaret.length) {\n                    caretStart = currentCaret[0];\n                }\n                this._prev = this.input[0].value = text;\n                if (caretStart && this.selectedIndex === -1) {\n                    var mobile = support.mobileOS;\n                    if (mobile.wp || mobile.android) {\n                        setTimeout(function () {\n                            that.input[0].setSelectionRange(caretStart, caretStart);\n                        }, 0);\n                    } else {\n                        this.input[0].setSelectionRange(caretStart, caretStart);\n                    }\n                }\n            },\n            refresh: function () {\n                this.listView.refresh();\n            },\n            _toggleCloseVisibility: function () {\n                var preventShow = this.element.is(':disabled') || this.element.is('[readonly]');\n                if (this.text() && !preventShow) {\n                    this._showClear();\n                } else {\n                    this._hideClear();\n                }\n            },\n            suggest: function (word) {\n                var that = this;\n                var element = that.input[0];\n                var value = that.text();\n                var caretIdx = caret(element)[0];\n                var key = that._last;\n                var idx;\n                var accentFoldingFiltering = that.dataSource.options.accentFoldingFiltering;\n                if (key == keys.BACKSPACE || key == keys.DELETE) {\n                    that._last = undefined;\n                    return;\n                }\n                word = word || '';\n                if (typeof word !== 'string') {\n                    if (word[0]) {\n                        word = that.dataSource.view()[List.inArray(word[0], that.ul[0])];\n                    }\n                    word = word ? that._text(word) : '';\n                }\n                if (caretIdx <= 0) {\n                    caretIdx = (accentFoldingFiltering ? value.toLocaleLowerCase(accentFoldingFiltering) : value.toLowerCase()).indexOf(accentFoldingFiltering ? word.toLocaleLowerCase(accentFoldingFiltering) : word.toLowerCase()) + 1;\n                }\n                if (word) {\n                    word = word.toString();\n                    idx = (accentFoldingFiltering ? word.toLocaleLowerCase(accentFoldingFiltering) : word.toLowerCase()).indexOf(accentFoldingFiltering ? value.toLocaleLowerCase(accentFoldingFiltering) : value.toLowerCase());\n                    if (idx > -1) {\n                        value += word.substring(idx + value.length);\n                    }\n                } else {\n                    value = value.substring(0, caretIdx);\n                }\n                if (value.length !== caretIdx || !word) {\n                    element.value = value;\n                    if (element === activeElement()) {\n                        caret(element, caretIdx, value.length);\n                    }\n                }\n            },\n            text: function (text) {\n                text = text === null ? '' : text;\n                var that = this;\n                var input = that.input[0];\n                var ignoreCase = that.options.ignoreCase;\n                var loweredText = text;\n                var dataItem;\n                var value;\n                if (text === undefined) {\n                    return input.value;\n                }\n                if (that.options.autoBind === false && !that.listView.bound()) {\n                    that._setText(text);\n                    return;\n                }\n                dataItem = that.dataItem();\n                if (dataItem && that._text(dataItem).replace && that._text(dataItem).replace(newLineRegEx, '') === text) {\n                    value = that._value(dataItem);\n                    if (value === List.unifyType(that._old, typeof value)) {\n                        that._triggerCascade();\n                        return;\n                    }\n                }\n                if (ignoreCase) {\n                    loweredText = loweredText.toLowerCase();\n                }\n                if (that.dataItem() && that._text(that.dataItem()) === text) {\n                    return;\n                }\n                that._select(function (data) {\n                    data = that._text(data);\n                    if (ignoreCase) {\n                        data = (data + '').toLowerCase();\n                    }\n                    return data === loweredText;\n                }).done(function () {\n                    if (that.selectedIndex < 0) {\n                        input.value = text;\n                        if (that.options.syncValueAndText) {\n                            that._accessor(text);\n                        }\n                        that._cascadeTriggered = true;\n                        that._triggerCascade();\n                    }\n                    that._prev = input.value;\n                });\n                that._toggleCloseVisibility();\n            },\n            toggle: function (toggle) {\n                this._toggle(toggle, true);\n            },\n            value: function (value) {\n                var that = this;\n                var options = that.options;\n                var listView = that.listView;\n                if (value === undefined) {\n                    value = that._accessor() || that.listView.value()[0];\n                    return value === undefined || value === null ? '' : value;\n                }\n                that.requireValueMapper(that.options, value);\n                that.trigger('set', { value: value });\n                if (value === options.value && that.input.val() === options.text && !that.options.cascadeFrom) {\n                    return;\n                }\n                that._accessor(value);\n                if (that._isFilterEnabled() && listView.bound() && listView.isFiltered()) {\n                    that._clearFilter();\n                } else {\n                    that._fetchData();\n                }\n                listView.value(value).done(function () {\n                    if (that.selectedIndex === -1 && (!listView._selectedDataItems || !listView._selectedDataItems.length)) {\n                        that._accessor(value);\n                        that.input.val(value);\n                        that._placeholder(true);\n                    }\n                    if (that._userTriggered) {\n                        that._old = that._accessor();\n                    } else {\n                        that._old = that._valueBeforeCascade = that._accessor();\n                    }\n                    that._oldIndex = that.selectedIndex;\n                    that._prev = that.input.val();\n                    if (that._state === STATE_FILTER) {\n                        that._state = STATE_ACCEPT;\n                    }\n                    that._toggleCloseVisibility();\n                });\n            },\n            _hideBusy: function () {\n                var that = this;\n                clearTimeout(that._busy);\n                that._arrowIcon.removeClass(LOADING);\n                that._focused.attr('aria-busy', false);\n                that._busy = null;\n                that._toggleCloseVisibility();\n            },\n            _click: function (e) {\n                var that = this;\n                var item = e.item;\n                var dataItem = that.listView.dataItemByIndex(that.listView.getElementIndex(item));\n                var shouldTrigger = true;\n                e.preventDefault();\n                if (dataItem) {\n                    shouldTrigger = that._value(dataItem) !== List.unifyType(that.value(), typeof that._value(dataItem));\n                    if (!shouldTrigger) {\n                        that.input.val(that._text(dataItem));\n                    }\n                }\n                if (shouldTrigger && that.trigger('select', {\n                        dataItem: dataItem,\n                        item: item\n                    })) {\n                    that.close();\n                    return;\n                }\n                that._userTriggered = true;\n                that._select(item).done(function () {\n                    that._blur();\n                });\n            },\n            _syncValueAndText: function () {\n                return this.options.syncValueAndText;\n            },\n            _inputValue: function () {\n                return this.text();\n            },\n            _searchByWord: function (word) {\n                var that = this;\n                var options = that.options;\n                var dataSource = that.dataSource;\n                var ignoreCase = options.ignoreCase;\n                var predicate = function (dataItem) {\n                    var text = that._text(dataItem);\n                    if (text !== undefined) {\n                        text = text + '';\n                        if (text !== '' && word === '') {\n                            return false;\n                        }\n                        if (ignoreCase) {\n                            text = text.toLowerCase();\n                        }\n                        return text.indexOf(word) === 0;\n                    }\n                };\n                if (ignoreCase) {\n                    word = word.toLowerCase();\n                }\n                if (!that.ul[0].firstChild) {\n                    dataSource.one(CHANGE, function () {\n                        if (dataSource.view()[0]) {\n                            that.search(word);\n                        }\n                    }).fetch();\n                    return;\n                }\n                this.listView.focus(this._get(predicate));\n                var current = this.listView.focus();\n                if (current) {\n                    if (options.suggest) {\n                        that.suggest(current);\n                    }\n                    this.open();\n                }\n                if (this.options.highlightFirst && !word) {\n                    this.listView.focusFirst();\n                }\n            },\n            _input: function () {\n                var that = this, element = that.element.removeClass('k-input')[0], accessKey = element.accessKey, wrapper = that.wrapper, SELECTOR = 'input.k-input', name = element.name || '', input, maxLength;\n                if (name) {\n                    name = 'name=\"' + name + '_input\" ';\n                }\n                input = wrapper.find(SELECTOR);\n                if (!input[0]) {\n                    wrapper.append('<span tabindex=\"-1\" unselectable=\"on\" class=\"k-dropdown-wrap k-state-default\"><input ' + name + 'class=\"k-input\" type=\"text\" autocomplete=\"' + AUTOCOMPLETEVALUE + '\"/><span unselectable=\"on\" class=\"k-select\" aria-label=\"select\"><span class=\"k-icon k-i-arrow-60-down\"></span></span></span>').append(that.element);\n                    input = wrapper.find(SELECTOR);\n                }\n                input[0].style.cssText = element.style.cssText;\n                input[0].title = element.title;\n                maxLength = parseInt(this.element.prop('maxlength') || this.element.attr('maxlength'), 10);\n                if (maxLength > -1) {\n                    input[0].maxLength = maxLength;\n                }\n                input.addClass(element.className).css({\n                    width: '',\n                    height: element.style.height\n                }).attr({\n                    'role': 'combobox',\n                    'aria-expanded': false\n                }).show();\n                if (placeholderSupported) {\n                    input.attr('placeholder', that.options.placeholder);\n                }\n                if (accessKey) {\n                    element.accessKey = '';\n                    input[0].accessKey = accessKey;\n                }\n                that._focused = that.input = input;\n                that._inputWrapper = $(wrapper[0].firstChild);\n                that._arrow = wrapper.find('.k-select').attr({\n                    'role': 'button',\n                    'tabIndex': -1\n                });\n                that._arrowIcon = that._arrow.find('.k-icon');\n                if (element.id) {\n                    that._arrow.attr('aria-controls', that.ul[0].id);\n                }\n            },\n            _clearButton: function () {\n                List.fn._clearButton.call(this);\n                if (this.options.clearButton) {\n                    this._clear.insertAfter(this.input);\n                    this.wrapper.addClass('k-combobox-clearable');\n                }\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode;\n                that._last = key;\n                clearTimeout(that._typingTimeout);\n                that._typingTimeout = null;\n                if (key === keys.HOME) {\n                    that._firstItem();\n                } else if (key === keys.END) {\n                    that._lastItem();\n                } else if (key === keys.ENTER || key === keys.TAB && that.popup.visible()) {\n                    var current = that.listView.focus();\n                    var dataItem = that.dataItem();\n                    var shouldTrigger = true;\n                    if (!that.popup.visible() && (!dataItem || that.text() !== that._text(dataItem))) {\n                        current = null;\n                    }\n                    if (current) {\n                        if (that.popup.visible()) {\n                            e.preventDefault();\n                        }\n                        dataItem = that.listView.dataItemByIndex(that.listView.getElementIndex(current));\n                        if (dataItem) {\n                            shouldTrigger = that._value(dataItem) !== List.unifyType(that.value(), typeof that._value(dataItem));\n                        }\n                        if (shouldTrigger && that.trigger('select', {\n                                dataItem: dataItem,\n                                item: current\n                            })) {\n                            return;\n                        }\n                        that._userTriggered = true;\n                        that._select(current).done(function () {\n                            that._blur();\n                            that._valueBeforeCascade = that._old = that.value();\n                        });\n                    } else {\n                        if (that._syncValueAndText() || that._isSelect) {\n                            that._accessor(that.input.val());\n                        }\n                        if (that.options.highlightFirst) {\n                            that.listView.value(that.input.val());\n                            that._blur();\n                        } else {\n                            that._oldText = that.text();\n                        }\n                    }\n                } else if (key != keys.TAB && !that._move(e)) {\n                    that._search();\n                } else if (key === keys.ESC && !that.popup.visible() && that.text()) {\n                    that._clearValue();\n                }\n            },\n            _placeholder: function (show) {\n                if (placeholderSupported) {\n                    return;\n                }\n                var that = this, input = that.input, placeholder = that.options.placeholder, value;\n                if (placeholder) {\n                    value = that.value();\n                    if (show === undefined) {\n                        show = !value;\n                    }\n                    input.toggleClass('k-readonly', show);\n                    if (!show) {\n                        if (!value) {\n                            placeholder = '';\n                        } else {\n                            return;\n                        }\n                    }\n                    input.val(placeholder);\n                    if (!placeholder && input[0] === activeElement()) {\n                        caret(input[0], 0, 0);\n                    }\n                }\n            },\n            _search: function () {\n                var that = this;\n                clearTimeout(that._typingTimeout);\n                that._typingTimeout = setTimeout(function () {\n                    var value = that.text();\n                    if (value !== '' && that._prev !== value) {\n                        that._prev = value;\n                        if (that.options.filter === 'none' && that.options.virtual) {\n                            that.listView.select(-1);\n                        }\n                        that.search(value);\n                        that._toggleCloseVisibility();\n                    } else if (value === '' && that._prev !== '') {\n                        that._clearValue();\n                        that.search('');\n                    }\n                    that._typingTimeout = null;\n                }, that.options.delay);\n            },\n            _setText: function (text) {\n                this.input.val(text);\n                this._prev = text;\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper = element.parent();\n                if (!wrapper.is('span.k-widget')) {\n                    wrapper = element.hide().wrap('<span />').parent();\n                    wrapper[0].style.cssText = element[0].style.cssText;\n                }\n                that.wrapper = wrapper.addClass('k-widget k-combobox').addClass(element[0].className).removeClass('input-validation-error').css('display', '');\n            },\n            _clearSelection: function (parent, isFiltered) {\n                var that = this;\n                var hasValue = parent.value();\n                var custom = hasValue && parent.selectedIndex === -1;\n                if (this.selectedIndex == -1 && this.value()) {\n                    return;\n                }\n                if (isFiltered || !hasValue || custom) {\n                    that.options.value = '';\n                    that.value('');\n                }\n            },\n            _preselect: function (value, text) {\n                this.input.val(text);\n                this._accessor(value);\n                this._old = this._accessor();\n                this._oldIndex = this.selectedIndex;\n                this.listView.setValue(value);\n                this._placeholder();\n                this._initialIndex = null;\n                this._presetValue = true;\n                this._toggleCloseVisibility();\n            },\n            _clearText: function () {\n                this._old = this.value();\n                this.text('');\n            },\n            _clearValue: function () {\n                Select.fn._clearValue.call(this);\n                this.input.focus();\n            }\n        });\n        ui.plugin(ComboBox);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.multiselect', [\n        'kendo.list',\n        'kendo.mobile.scroller',\n        'kendo.virtuallist'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'multiselect',\n        name: 'MultiSelect',\n        category: 'web',\n        description: 'The MultiSelect widget allows the selection from pre-defined values.',\n        depends: ['list'],\n        features: [\n            {\n                id: 'mobile-scroller',\n                name: 'Mobile scroller',\n                description: 'Support for kinetic scrolling in mobile device',\n                depends: ['mobile.scroller']\n            },\n            {\n                id: 'virtualization',\n                name: 'VirtualList',\n                description: 'Support for virtualization',\n                depends: ['virtuallist']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, List = ui.List, keys = $.extend({ A: 65 }, kendo.keys), activeElement = kendo._activeElement, ObservableArray = kendo.data.ObservableArray, proxy = $.proxy, ID = 'id', LI = 'li', ACCEPT = 'accept', FILTER = 'filter', REBIND = 'rebind', OPEN = 'open', CLOSE = 'close', CHANGE = 'change', PROGRESS = 'progress', SELECT = 'select', DESELECT = 'deselect', ARIA_DISABLED = 'aria-disabled', FOCUSEDCLASS = 'k-state-focused', SELECTEDCLASS = 'k-state-selected', HIDDENCLASS = 'k-hidden', HOVERCLASS = 'k-state-hover', STATEDISABLED = 'k-state-disabled', NOCLICKCLASS = 'k-no-click', DISABLED = 'disabled', READONLY = 'readonly', AUTOCOMPLETEVALUE = 'off', ns = '.kendoMultiSelect', CLICK = 'click' + ns, KEYDOWN = 'keydown' + ns, MOUSEENTER = 'mouseenter' + ns, MOUSELEAVE = 'mouseleave' + ns, HOVEREVENTS = MOUSEENTER + ' ' + MOUSELEAVE, quotRegExp = /\"/g, isArray = $.isArray, styles = [\n                'font-family',\n                'font-size',\n                'font-stretch',\n                'font-style',\n                'font-weight',\n                'letter-spacing',\n                'text-transform',\n                'line-height'\n            ];\n        var MultiSelect = List.extend({\n            init: function (element, options) {\n                var that = this, id, disabled;\n                that.ns = ns;\n                List.fn.init.call(that, element, options);\n                that._optionsMap = {};\n                that._customOptions = {};\n                that._wrapper();\n                that._tagList();\n                that._input();\n                that._textContainer();\n                that._loader();\n                that._clearButton();\n                that._tabindex(that.input);\n                element = that.element.attr('multiple', 'multiple').hide();\n                options = that.options;\n                if (!options.placeholder) {\n                    options.placeholder = element.data('placeholder');\n                }\n                id = element.attr(ID);\n                if (id) {\n                    that._tagID = id + '_tag_active';\n                    id = id + '_taglist';\n                    that.tagList.attr(ID, id);\n                    that.input.attr('aria-describedby', id);\n                }\n                that._initialOpen = true;\n                that._ariaLabel();\n                that._ariaSetLive();\n                that._dataSource();\n                that._ignoreCase();\n                that._popup();\n                that._tagTemplate();\n                that.requireValueMapper(that.options);\n                that._initList();\n                that._reset();\n                that._enable();\n                that._placeholder();\n                if (options.autoBind) {\n                    that.dataSource.fetch();\n                } else if (options.value) {\n                    that._preselect(options.value);\n                }\n                disabled = $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                }\n                that._ariaSetSize(that.value().length);\n                kendo.notify(that);\n                that._toggleCloseVisibility();\n            },\n            options: {\n                name: 'MultiSelect',\n                tagMode: 'multiple',\n                enabled: true,\n                autoBind: true,\n                autoClose: true,\n                highlightFirst: true,\n                dataTextField: '',\n                dataValueField: '',\n                filter: 'startswith',\n                ignoreCase: true,\n                minLength: 1,\n                messages: {\n                    'singleTag': 'item(s) selected',\n                    'clear': 'clear',\n                    'deleteTag': 'delete',\n                    'noData': 'No data found.'\n                },\n                enforceMinLength: false,\n                delay: 100,\n                value: null,\n                maxSelectedItems: null,\n                placeholder: '',\n                height: 200,\n                animation: {},\n                virtual: false,\n                itemTemplate: '',\n                tagTemplate: '',\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: '#:data#',\n                clearButton: true,\n                autoWidth: false,\n                popup: null\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                CHANGE,\n                SELECT,\n                DESELECT,\n                'filtering',\n                'dataBinding',\n                'dataBound'\n            ],\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._state = '';\n                this._dataSource();\n                this.persistTagList = false;\n                this.listView.setDataSource(this.dataSource);\n                if (this.options.autoBind) {\n                    this.dataSource.fetch();\n                }\n            },\n            setOptions: function (options) {\n                var listOptions = this._listOptions(options);\n                List.fn.setOptions.call(this, options);\n                this.listView.setOptions(listOptions);\n                this._accessors();\n                this._aria(this.tagList.attr(ID));\n                this._tagTemplate();\n                this._placeholder();\n                this._clearButton();\n            },\n            currentTag: function (candidate) {\n                var that = this;\n                if (candidate !== undefined) {\n                    if (that._currentTag) {\n                        that._currentTag.removeClass(FOCUSEDCLASS).removeAttr(ID);\n                        that._currentTag.find('.k-select').attr('aria-hidden', true);\n                        that.input.removeAttr('aria-activedescendant');\n                    }\n                    if (candidate) {\n                        candidate.addClass(FOCUSEDCLASS).attr(ID, that._tagID);\n                        candidate.find('.k-select').removeAttr('aria-hidden');\n                        that.input.attr('aria-activedescendant', that._tagID);\n                    }\n                    that._currentTag = candidate;\n                } else {\n                    return that._currentTag;\n                }\n            },\n            dataItems: function () {\n                return this.listView.selectedDataItems();\n            },\n            destroy: function () {\n                var that = this, ns = that.ns;\n                clearTimeout(that._busy);\n                clearTimeout(that._typingTimeout);\n                that.wrapper.off(ns);\n                that.tagList.off(ns);\n                that.input.off(ns);\n                that._clear.off(ns);\n                List.fn.destroy.call(that);\n            },\n            _activateItem: function () {\n                if (this.popup.visible()) {\n                    List.fn._activateItem.call(this);\n                }\n                this.currentTag(null);\n            },\n            _listOptions: function (options) {\n                var that = this;\n                var listOptions = List.fn._listOptions.call(that, $.extend(options, {\n                    selectedItemChange: proxy(that._selectedItemChange, that),\n                    selectable: 'multiple'\n                }));\n                var itemTemplate = this.options.itemTemplate || this.options.template;\n                var template = listOptions.itemTemplate || itemTemplate || listOptions.template;\n                if (!template) {\n                    template = '#:' + kendo.expr(listOptions.dataTextField, 'data') + '#';\n                }\n                listOptions.template = template;\n                return listOptions;\n            },\n            _setListValue: function () {\n                List.fn._setListValue.call(this, this._initialValues.slice(0));\n            },\n            _listChange: function (e) {\n                var data = this.dataSource.flatView();\n                var optionsMap = this._optionsMap;\n                var valueGetter = this._value;\n                if (this._state === REBIND) {\n                    this._state = '';\n                }\n                for (var i = 0; i < e.added.length; i++) {\n                    if (optionsMap[valueGetter(e.added[i].dataItem)] === undefined) {\n                        this._render(data);\n                        break;\n                    }\n                }\n                this._selectValue(e.added, e.removed);\n            },\n            _selectedItemChange: function (e) {\n                var items = e.items;\n                var context;\n                var idx;\n                for (idx = 0; idx < items.length; idx++) {\n                    context = items[idx];\n                    this.tagList.children().eq(context.index).children('span:first').html(this.tagTextTemplate(context.item));\n                }\n            },\n            _wrapperMousedown: function (e) {\n                var that = this;\n                var notInput = e.target.nodeName.toLowerCase() !== 'input';\n                var target = $(e.target);\n                var closeButton = target.hasClass('k-select') || target.hasClass('k-icon');\n                if (closeButton) {\n                    closeButton = !target.closest('.k-select').children('.k-i-arrow-60-down').length;\n                }\n                if (notInput && !(closeButton && kendo.support.mobileOS) && e.cancelable) {\n                    e.preventDefault();\n                }\n                if (!closeButton) {\n                    if (that.input[0] !== activeElement() && notInput) {\n                        that.input.focus();\n                    }\n                    if (that.options.minLength === 1) {\n                        that.open();\n                    }\n                }\n            },\n            _inputFocus: function () {\n                this._placeholder(false);\n                this.wrapper.addClass(FOCUSEDCLASS);\n            },\n            _inputFocusout: function () {\n                var that = this;\n                clearTimeout(that._typingTimeout);\n                that.wrapper.removeClass(FOCUSEDCLASS);\n                that._placeholder(!that.listView.selectedDataItems()[0], true);\n                that.close();\n                if (that._state === FILTER) {\n                    that._state = ACCEPT;\n                    that.listView.skipUpdate(true);\n                }\n                if (that.listView.bound() && that.listView.isFiltered()) {\n                    that.persistTagList = true;\n                    that._clearFilter();\n                }\n                that.element.blur();\n            },\n            _removeTag: function (tag, shouldTrigger) {\n                var that = this;\n                var state = that._state;\n                var position = tag.index();\n                var listView = that.listView;\n                var value = listView.value()[position];\n                var dataItem = that.listView.selectedDataItems()[position];\n                var customIndex = that._customOptions[value];\n                var listViewChildren = listView.element[0].children;\n                var option;\n                var listViewChild;\n                if (that.trigger(DESELECT, {\n                        dataItem: dataItem,\n                        item: tag\n                    })) {\n                    that._close();\n                    return;\n                }\n                if (customIndex === undefined && (state === ACCEPT || state === FILTER)) {\n                    customIndex = that._optionsMap[value];\n                }\n                var done = function () {\n                    that.currentTag(null);\n                    if (shouldTrigger) {\n                        that._change();\n                    }\n                    that._close();\n                };\n                if (customIndex === undefined && listView.select().length) {\n                    that.persistTagList = false;\n                    listView.select(listView.select()[position]).done(done);\n                } else {\n                    option = that.element[0].children[customIndex];\n                    if (option) {\n                        option.selected = false;\n                    }\n                    listView.removeAt(position);\n                    listViewChild = listViewChildren[customIndex];\n                    if (listViewChild) {\n                        listViewChildren[customIndex].classList.remove('k-state-selected');\n                    }\n                    if (that.options.tagMode !== 'single') {\n                        tag.remove();\n                    } else {\n                        that._updateTagListHTML();\n                    }\n                    done();\n                }\n            },\n            _tagListClick: function (e) {\n                e.preventDefault();\n                e.stopPropagation();\n                var target = $(e.currentTarget);\n                if (!target.children('.k-i-arrow-60-down').length) {\n                    this._removeTag(target.closest(LI), true);\n                }\n            },\n            _clearValue: function () {\n                var that = this;\n                if (that.options.tagMode === 'single') {\n                    that._clearSingleTagValue();\n                } else {\n                    that.tagList.children().each(function (index, tag) {\n                        that._removeTag($(tag), false);\n                    });\n                }\n                that.input.val('');\n                that._search();\n                that._change();\n                that.focus();\n                that._hideClear();\n                if (that._state === FILTER) {\n                    that._state = ACCEPT;\n                }\n            },\n            _clearSingleTagValue: function () {\n                var that = this;\n                var items = that.dataItems();\n                var tags = that.tagList.children();\n                var persistTagList = that.persistTagList;\n                for (var i = 0; i < items.length; i += 1) {\n                    if (that.trigger(DESELECT, {\n                            dataItem: items[i],\n                            item: tags.first()\n                        })) {\n                        that._close();\n                        return;\n                    }\n                }\n                if (persistTagList) {\n                    that.persistTagList = false;\n                }\n                that.listView.value([]);\n                that.persistTagList = persistTagList;\n            },\n            _focusHandler: function () {\n                this.input.focus();\n            },\n            _editable: function (options) {\n                var that = this, disable = options.disable, readonly = options.readonly, wrapper = that.wrapper.off(ns), tagList = that.tagList.off(ns), input = that.element.add(that.input.off(ns));\n                if (!readonly && !disable) {\n                    wrapper.removeClass(STATEDISABLED).removeClass(NOCLICKCLASS).on(HOVEREVENTS, that._toggleHover).on('mousedown' + ns + ' touchend' + ns, proxy(that._wrapperMousedown, that)).on(CLICK, proxy(that._focusHandler, that));\n                    that.input.on(KEYDOWN, proxy(that._keydown, that)).on('paste' + ns, proxy(that._search, that)).on('input' + ns, proxy(that._search, that)).on('focus' + ns, proxy(that._inputFocus, that)).on('focusout' + ns, proxy(that._inputFocusout, that));\n                    that._clear.on(CLICK + ' touchend' + ns, proxy(that._clearValue, that));\n                    input.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false);\n                    tagList.on(MOUSEENTER, LI, function () {\n                        $(this).addClass(HOVERCLASS);\n                    }).on(MOUSELEAVE, LI, function () {\n                        $(this).removeClass(HOVERCLASS);\n                    }).on(CLICK + ' touchend' + ns, 'li.k-button .k-select', proxy(that._tagListClick, that));\n                } else {\n                    wrapper.toggleClass(STATEDISABLED, disable).toggleClass(NOCLICKCLASS, readonly);\n                    input.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n            },\n            _close: function () {\n                var that = this;\n                if (that.options.autoClose) {\n                    that.close();\n                } else {\n                    that.popup.position();\n                }\n            },\n            _filterSource: function (filter, force) {\n                if (!force) {\n                    force = this._retrieveData;\n                }\n                this._retrieveData = false;\n                List.fn._filterSource.call(this, filter, force);\n            },\n            close: function () {\n                this._activeItem = null;\n                this.input.removeAttr('aria-activedescendant');\n                this.popup.close();\n            },\n            open: function () {\n                var that = this;\n                if (that._request) {\n                    that._retrieveData = false;\n                }\n                if (that._retrieveData || !that.listView.bound() || that._state === ACCEPT) {\n                    that._open = true;\n                    that._state = REBIND;\n                    that.listView.skipUpdate(true);\n                    that.persistTagList = that._initialOpen && !that.listView.bound() ? false : true;\n                    that._filterSource();\n                    that._focusItem();\n                } else if (that._allowOpening()) {\n                    if (that._initialOpen && !that.options.autoBind && !that.options.virtual && that.options.value && !$.isPlainObject(that.options.value[0])) {\n                        that.value(that.value() || that._initialValues);\n                    }\n                    that.popup._hovered = true;\n                    that._initialOpen = false;\n                    that.popup.open();\n                    that._focusItem();\n                }\n            },\n            toggle: function (toggle) {\n                toggle = toggle !== undefined ? toggle : !this.popup.visible();\n                this[toggle ? OPEN : CLOSE]();\n            },\n            refresh: function () {\n                this.listView.refresh();\n            },\n            _listBound: function () {\n                var that = this;\n                var data = that.dataSource.flatView();\n                var skip = that.listView.skip();\n                that._render(data);\n                that._renderFooter();\n                that._renderNoData();\n                that._toggleNoData(!data.length);\n                that._resizePopup();\n                if (that._open) {\n                    that._open = false;\n                    that.toggle(that._allowOpening());\n                }\n                that.popup.position();\n                if (that.options.highlightFirst && (skip === undefined || skip === 0)) {\n                    that.listView.focusFirst();\n                }\n                if (that._touchScroller) {\n                    that._touchScroller.reset();\n                }\n                that._hideBusy();\n                that._makeUnselectable();\n                that.trigger('dataBound');\n            },\n            _inputValue: function () {\n                var that = this;\n                var inputValue = that.input.val();\n                if (that.options.placeholder === inputValue) {\n                    inputValue = '';\n                }\n                return inputValue;\n            },\n            value: function (value) {\n                var that = this;\n                var listView = that.listView;\n                var oldValue = listView.value().slice();\n                var maxSelectedItems = that.options.maxSelectedItems;\n                var clearFilters = listView.bound() && listView.isFiltered();\n                if (value === undefined) {\n                    return oldValue;\n                }\n                that.persistTagList = false;\n                that.requireValueMapper(that.options, value);\n                value = that._normalizeValues(value);\n                if (maxSelectedItems !== null && value.length > maxSelectedItems) {\n                    value = value.slice(0, maxSelectedItems);\n                }\n                if (clearFilters) {\n                    that._clearFilter();\n                }\n                listView.value(value);\n                that._old = that._valueBeforeCascade = value.slice();\n                if (!clearFilters) {\n                    that._fetchData();\n                }\n                that._ariaSetSize(that.value().length);\n                that._toggleCloseVisibility();\n            },\n            _preselect: function (data, value) {\n                var that = this;\n                if (!isArray(data) && !(data instanceof kendo.data.ObservableArray)) {\n                    data = [data];\n                }\n                if ($.isPlainObject(data[0]) || data[0] instanceof kendo.data.ObservableObject || !that.options.dataValueField) {\n                    that.dataSource.data(data);\n                    that.value(value || that._initialValues);\n                    that._retrieveData = true;\n                }\n            },\n            _setOption: function (value, selected) {\n                var option = this.element[0].children[this._optionsMap[value]];\n                if (option) {\n                    option.selected = selected;\n                }\n            },\n            _fetchData: function () {\n                var that = this;\n                var hasItems = !!that.dataSource.view().length;\n                var isEmptyArray = that.listView.value().length === 0;\n                if (isEmptyArray || that._request) {\n                    return;\n                }\n                if (that._retrieveData || !that._fetch && !hasItems) {\n                    that._fetch = true;\n                    that._retrieveData = false;\n                    that.dataSource.read().done(function () {\n                        that._fetch = false;\n                    });\n                }\n            },\n            _isBound: function () {\n                return this.listView.bound() && !this._retrieveData;\n            },\n            _dataSource: function () {\n                var that = this, element = that.element, options = that.options, dataSource = options.dataSource || {};\n                dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n                dataSource.select = element;\n                dataSource.fields = [\n                    { field: options.dataTextField },\n                    { field: options.dataValueField }\n                ];\n                if (that.dataSource && that._refreshHandler) {\n                    that._unbindDataSource();\n                } else {\n                    that._progressHandler = proxy(that._showBusy, that);\n                    that._errorHandler = proxy(that._hideBusy, that);\n                }\n                that.dataSource = kendo.data.DataSource.create(dataSource).bind(PROGRESS, that._progressHandler).bind('error', that._errorHandler);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(that._initialValues);\n                            that._placeholder();\n                        });\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            },\n            _initValue: function () {\n                var value = this.options.value || this.element.val();\n                this._old = this._initialValues = this._normalizeValues(value);\n            },\n            _normalizeValues: function (value) {\n                var that = this;\n                if (value === null) {\n                    value = [];\n                } else if (value && $.isPlainObject(value)) {\n                    value = [that._value(value)];\n                } else if (value && $.isPlainObject(value[0])) {\n                    value = $.map(value, function (dataItem) {\n                        return that._value(dataItem);\n                    });\n                } else if (!isArray(value) && !(value instanceof ObservableArray)) {\n                    value = [value];\n                } else if (isArray(value)) {\n                    value = value.slice();\n                }\n                return value;\n            },\n            _change: function () {\n                var that = this, value = that.value();\n                if (!compare(value, that._old)) {\n                    that._old = value.slice();\n                    that.trigger(CHANGE);\n                    that.element.trigger(CHANGE);\n                }\n                that.popup.position();\n                that._ariaSetSize(value.length);\n                that._toggleCloseVisibility();\n            },\n            _click: function (e) {\n                var that = this;\n                var item = e.item;\n                e.preventDefault();\n                that._select(item).done(function () {\n                    that._activeItem = item;\n                    that._change();\n                    that._close();\n                });\n            },\n            _getActiveItem: function () {\n                return this._activeItem || $(this.listView.items()[this._getSelectedIndices().length - 1]) || this.listView.focus();\n            },\n            _getSelectedIndices: function () {\n                return this.listView._selectedIndices || this.listView._selectedIndexes;\n            },\n            _keydown: function (e) {\n                var that = this;\n                var key = e.keyCode;\n                var tag = that._currentTag;\n                var listView = that.listView;\n                var hasValue = that.input.val();\n                var isRtl = kendo.support.isRtl(that.wrapper);\n                var visible = that.popup.visible();\n                var dir = 0;\n                var activeItemIdx;\n                if (key !== keys.ENTER) {\n                    this._multipleSelection = false;\n                }\n                if (key === keys.DOWN) {\n                    e.preventDefault();\n                    if (!visible) {\n                        that.open();\n                        if (!listView.focus()) {\n                            listView.focusFirst();\n                        }\n                        return;\n                    }\n                    if (listView.focus()) {\n                        if (!that._activeItem && e.shiftKey) {\n                            that._activeItem = listView.focus();\n                            dir = -1;\n                        }\n                        activeItemIdx = listView.getElementIndex(that._getActiveItem().first());\n                        listView.focusNext();\n                        if (!listView.focus()) {\n                            listView.focusLast();\n                        } else {\n                            if (e.shiftKey) {\n                                this._multipleSelection = true;\n                                that._selectRange(activeItemIdx, listView.getElementIndex(listView.focus().first()) + dir);\n                            }\n                        }\n                    } else {\n                        listView.focusFirst();\n                    }\n                } else if (key === keys.UP) {\n                    if (visible) {\n                        if (!that._activeItem && e.shiftKey) {\n                            that._activeItem = listView.focus();\n                            dir = 1;\n                        }\n                        activeItemIdx = listView.getElementIndex(that._getActiveItem().first());\n                        listView.focusPrev();\n                        if (!listView.focus()) {\n                            that.close();\n                        } else {\n                            if (e.shiftKey) {\n                                this._multipleSelection = true;\n                                that._selectRange(activeItemIdx, listView.getElementIndex(listView.focus().first()) + dir);\n                            }\n                        }\n                    }\n                    e.preventDefault();\n                } else if (key === keys.LEFT && !isRtl || key === keys.RIGHT && isRtl) {\n                    if (!hasValue) {\n                        tag = tag ? tag.prev() : $(that.tagList[0].lastChild);\n                        if (tag[0]) {\n                            that.currentTag(tag);\n                        }\n                    }\n                } else if (key === keys.RIGHT && !isRtl || key === keys.LEFT && isRtl) {\n                    if (!hasValue && tag) {\n                        tag = tag.next();\n                        that.currentTag(tag[0] ? tag : null);\n                    }\n                } else if (e.ctrlKey && !e.altKey && key === keys.A && visible && !that.options.virtual) {\n                    this._multipleSelection = true;\n                    if (this._getSelectedIndices().length === listView.items().length) {\n                        that._activeItem = null;\n                    }\n                    if (listView.items().length) {\n                        that._selectRange(0, listView.items().length - 1);\n                    }\n                } else if (key === keys.ENTER && visible) {\n                    if (!listView.focus()) {\n                        return;\n                    }\n                    e.preventDefault();\n                    if (this._multipleSelection) {\n                        this._multipleSelection = false;\n                        if (listView.focus().hasClass(SELECTEDCLASS)) {\n                            that._close();\n                            return;\n                        }\n                    }\n                    that._select(listView.focus()).done(function () {\n                        that._change();\n                        that._close();\n                    });\n                } else if (key === keys.SPACEBAR && e.ctrlKey && visible) {\n                    if (that._activeItem && listView.focus() && listView.focus()[0] === that._activeItem[0]) {\n                        that._activeItem = null;\n                    }\n                    if (!$(listView.focus()).hasClass(SELECTEDCLASS)) {\n                        that._activeItem = listView.focus();\n                    }\n                    that._select(listView.focus()).done(function () {\n                        that._change();\n                    });\n                    e.preventDefault();\n                } else if (key === keys.SPACEBAR && e.shiftKey && visible) {\n                    var activeIndex = listView.getElementIndex(that._getActiveItem());\n                    var currentIndex = listView.getElementIndex(listView.focus());\n                    if (activeIndex !== undefined && currentIndex !== undefined) {\n                        that._selectRange(activeIndex, currentIndex);\n                    }\n                    e.preventDefault();\n                } else if (key === keys.ESC) {\n                    if (visible) {\n                        e.preventDefault();\n                    } else {\n                        that.tagList.children().each(function (index, tag) {\n                            that._removeTag($(tag), false);\n                        });\n                        that._change();\n                    }\n                    that.close();\n                } else if (key === keys.HOME) {\n                    if (visible) {\n                        if (!listView.focus()) {\n                            that.close();\n                        } else {\n                            if (e.ctrlKey && e.shiftKey && !that.options.virtual) {\n                                that._selectRange(listView.getElementIndex(listView.focus()[0]), 0);\n                            }\n                            listView.focusFirst();\n                        }\n                    } else if (!hasValue) {\n                        tag = that.tagList[0].firstChild;\n                        if (tag) {\n                            that.currentTag($(tag));\n                        }\n                    }\n                } else if (key === keys.END) {\n                    if (visible) {\n                        if (!listView.focus()) {\n                            that.close();\n                        } else {\n                            if (e.ctrlKey && e.shiftKey && !that.options.virtual) {\n                                that._selectRange(listView.getElementIndex(listView.focus()[0]), listView.element.children().length - 1);\n                            }\n                            listView.focusLast();\n                        }\n                    } else if (!hasValue) {\n                        tag = that.tagList[0].lastChild;\n                        if (tag) {\n                            that.currentTag($(tag));\n                        }\n                    }\n                } else if ((key === keys.DELETE || key === keys.BACKSPACE) && !hasValue) {\n                    that._state = ACCEPT;\n                    if (that.options.tagMode === 'single') {\n                        that._clearSingleTagValue();\n                        that._change();\n                        that._close();\n                        return;\n                    }\n                    if (key === keys.BACKSPACE && !tag) {\n                        tag = $(that.tagList[0].lastChild);\n                    }\n                    if (tag && tag[0]) {\n                        that._removeTag(tag, true);\n                    }\n                } else if (that.popup.visible() && (key === keys.PAGEDOWN || key === keys.PAGEUP)) {\n                    e.preventDefault();\n                    var direction = key === keys.PAGEDOWN ? 1 : -1;\n                    listView.scrollWith(direction * listView.screenHeight());\n                } else {\n                    clearTimeout(that._typingTimeout);\n                    setTimeout(function () {\n                        that._scale();\n                    });\n                    that._search();\n                }\n            },\n            _hideBusy: function () {\n                var that = this;\n                clearTimeout(that._busy);\n                that.input.attr('aria-busy', false);\n                that._loading.addClass(HIDDENCLASS);\n                that._request = false;\n                that._busy = null;\n                that._toggleCloseVisibility();\n            },\n            _showBusyHandler: function () {\n                this.input.attr('aria-busy', true);\n                this._loading.removeClass(HIDDENCLASS);\n                this._hideClear();\n            },\n            _showBusy: function () {\n                var that = this;\n                that._request = true;\n                if (that._busy) {\n                    return;\n                }\n                that._busy = setTimeout(proxy(that._showBusyHandler, that), 100);\n            },\n            _placeholder: function (show, skipCaret) {\n                var that = this;\n                var input = that.input;\n                var active = activeElement();\n                var placeholder = that.options.placeholder;\n                var inputValue = input.val();\n                var isActive = input[0] === active;\n                var caretPos = inputValue.length;\n                if (!isActive || that.options.autoClose || inputValue === placeholder) {\n                    caretPos = 0;\n                    inputValue = '';\n                }\n                if (show === undefined) {\n                    show = false;\n                    if (input[0] !== active) {\n                        show = !that.listView.selectedDataItems()[0];\n                    }\n                }\n                that._prev = inputValue;\n                input.toggleClass('k-readonly', show).val(show ? placeholder : inputValue);\n                if (isActive && !skipCaret) {\n                    kendo.caret(input[0], caretPos, caretPos);\n                }\n                that._scale();\n            },\n            _scale: function () {\n                var that = this, wrapper = that.wrapper.find('.k-multiselect-wrap'), wrapperWidth = wrapper.width(), span = that._span.text(that.input.val()), textWidth;\n                if (!wrapper.is(':visible')) {\n                    span.appendTo(document.documentElement);\n                    wrapperWidth = textWidth = span.width() + 25;\n                    span.appendTo(wrapper);\n                } else {\n                    textWidth = span.width() + 25;\n                }\n                that.input.width(textWidth > wrapperWidth ? wrapperWidth : textWidth);\n            },\n            _option: function (dataValue, dataText, selected) {\n                var option = '<option';\n                if (dataValue !== undefined) {\n                    dataValue += '';\n                    if (dataValue.indexOf('\"') !== -1) {\n                        dataValue = dataValue.replace(quotRegExp, '&quot;');\n                    }\n                    option += ' value=\"' + dataValue + '\"';\n                }\n                if (selected) {\n                    option += ' selected';\n                }\n                option += '>';\n                if (dataText !== undefined) {\n                    option += kendo.htmlEncode(dataText);\n                }\n                return option += '</option>';\n            },\n            _render: function (data) {\n                var selectedItems = this.listView.selectedDataItems();\n                var values = this.listView.value();\n                var length = data.length;\n                var selectedIndex;\n                var options = '';\n                var dataItem;\n                var value;\n                var idx;\n                if (values.length !== selectedItems.length) {\n                    selectedItems = this._buildSelectedItems(values);\n                }\n                var custom = {};\n                var optionsMap = {};\n                for (idx = 0; idx < length; idx++) {\n                    dataItem = data[idx];\n                    value = this._value(dataItem);\n                    selectedIndex = this._selectedItemIndex(value, selectedItems);\n                    if (selectedIndex !== -1) {\n                        selectedItems.splice(selectedIndex, 1);\n                    }\n                    optionsMap[value] = idx;\n                    options += this._option(value, this._text(dataItem), selectedIndex !== -1);\n                }\n                if (selectedItems.length) {\n                    for (idx = 0; idx < selectedItems.length; idx++) {\n                        dataItem = selectedItems[idx];\n                        value = this._value(dataItem);\n                        custom[value] = length;\n                        optionsMap[value] = length;\n                        length += 1;\n                        options += this._option(value, this._text(dataItem), true);\n                    }\n                }\n                this._customOptions = custom;\n                this._optionsMap = optionsMap;\n                this.element.html(options);\n            },\n            _buildSelectedItems: function (values) {\n                var valueField = this.options.dataValueField;\n                var textField = this.options.dataTextField;\n                var result = [];\n                var item;\n                for (var idx = 0; idx < values.length; idx++) {\n                    item = {};\n                    item[valueField] = values[idx];\n                    item[textField] = values[idx];\n                    result.push(item);\n                }\n                return result;\n            },\n            _selectedItemIndex: function (value, selectedItems) {\n                var valueGetter = this._value;\n                var idx = 0;\n                for (; idx < selectedItems.length; idx++) {\n                    if (value === valueGetter(selectedItems[idx])) {\n                        return idx;\n                    }\n                }\n                return -1;\n            },\n            _search: function () {\n                var that = this;\n                clearTimeout(that._typingTimeout);\n                that._typingTimeout = setTimeout(function () {\n                    var value = that._inputValue();\n                    if (that._prev !== value) {\n                        that._prev = value;\n                        that.search(value);\n                        that._toggleCloseVisibility();\n                    }\n                }, that.options.delay);\n            },\n            _toggleCloseVisibility: function () {\n                if (this.value().length || this.input.val() && this.input.val() !== this.options.placeholder) {\n                    this._showClear();\n                } else {\n                    this._hideClear();\n                }\n            },\n            _allowOpening: function () {\n                return this._allowSelection() && List.fn._allowOpening.call(this);\n            },\n            _allowSelection: function () {\n                var max = this.options.maxSelectedItems;\n                return max === null || max > this.listView.value().length;\n            },\n            _angularTagItems: function (cmd) {\n                var that = this;\n                that.angular(cmd, function () {\n                    return {\n                        elements: that.tagList[0].children,\n                        data: $.map(that.dataItems(), function (dataItem) {\n                            return { dataItem: dataItem };\n                        })\n                    };\n                });\n            },\n            updatePersistTagList: function (added, removed) {\n                if (this.persistTagList.added && this.persistTagList.added.length === removed.length && this.persistTagList.removed && this.persistTagList.removed.length === added.length) {\n                    this.persistTagList = false;\n                } else {\n                    this.listView._removedAddedIndexes = this._old.slice();\n                    this.persistTagList = {\n                        added: added,\n                        removed: removed\n                    };\n                }\n            },\n            _selectValue: function (added, removed) {\n                var that = this;\n                var total = that.dataSource.total();\n                var tagList = that.tagList;\n                var getter = that._value;\n                var removedItem;\n                var addedItem;\n                var idx;\n                if (this.persistTagList) {\n                    this.updatePersistTagList(added, removed);\n                    return;\n                }\n                that._angularTagItems('cleanup');\n                if (that.options.tagMode === 'multiple') {\n                    for (idx = removed.length - 1; idx > -1; idx--) {\n                        removedItem = removed[idx];\n                        if (tagList.children().length) {\n                            tagList[0].removeChild(tagList[0].children[removedItem.position]);\n                            that._setOption(getter(removedItem.dataItem), false);\n                        }\n                    }\n                    for (idx = 0; idx < added.length; idx++) {\n                        addedItem = added[idx];\n                        tagList.append(that.tagTemplate(addedItem.dataItem));\n                        that._setOption(getter(addedItem.dataItem), true);\n                    }\n                } else {\n                    if (!that._maxTotal || that._maxTotal < total) {\n                        that._maxTotal = total;\n                    }\n                    this._updateTagListHTML();\n                    for (idx = removed.length - 1; idx > -1; idx--) {\n                        that._setOption(getter(removed[idx].dataItem), false);\n                    }\n                    for (idx = 0; idx < added.length; idx++) {\n                        that._setOption(getter(added[idx].dataItem), true);\n                    }\n                }\n                that._angularTagItems('compile');\n                that._placeholder();\n            },\n            _updateTagListHTML: function () {\n                var that = this;\n                var values = that.value();\n                var total = that.dataSource.total();\n                var tagList = that.tagList;\n                tagList.html('');\n                if (values.length) {\n                    tagList.append(that.tagTemplate({\n                        values: values,\n                        dataItems: that.dataItems(),\n                        maxTotal: that._maxTotal,\n                        currentTotal: total\n                    }));\n                }\n            },\n            _select: function (candidate) {\n                var resolved = $.Deferred().resolve();\n                if (!candidate) {\n                    return resolved;\n                }\n                var that = this;\n                var listView = that.listView;\n                var dataItem = listView.dataItemByIndex(listView.getElementIndex(candidate));\n                var isSelected = candidate.hasClass('k-state-selected');\n                if (that._state === REBIND) {\n                    that._state = '';\n                }\n                if (!that._allowSelection() && !isSelected) {\n                    return resolved;\n                }\n                if (that.trigger(isSelected ? DESELECT : SELECT, {\n                        dataItem: dataItem,\n                        item: candidate\n                    })) {\n                    that._close();\n                    return resolved;\n                }\n                that.persistTagList = false;\n                return listView.select(candidate).done(function () {\n                    that._placeholder();\n                    if (that._state === FILTER) {\n                        that._state = ACCEPT;\n                        listView.skipUpdate(true);\n                    }\n                });\n            },\n            _selectRange: function (startIndex, endIndex) {\n                var that = this;\n                var listView = this.listView;\n                var maxSelectedItems = this.options.maxSelectedItems;\n                var indices = this._getSelectedIndices().slice();\n                var indicesToSelect = [];\n                var i;\n                var selectIndices = function (indices) {\n                    listView.select(indices).done(function () {\n                        indices.forEach(function (index) {\n                            var dataItem = listView.dataItemByIndex(index);\n                            var candidate = listView.element.children()[index];\n                            var isSelected = $(candidate).hasClass('k-state-selected');\n                            that.trigger(isSelected ? SELECT : DESELECT, {\n                                dataItem: dataItem,\n                                item: $(candidate)\n                            });\n                        });\n                        that._change();\n                    });\n                };\n                if (indices.length - 1 === endIndex - startIndex) {\n                    return selectIndices(indices);\n                }\n                if (startIndex < endIndex) {\n                    for (i = startIndex; i <= endIndex; i++) {\n                        indicesToSelect.push(i);\n                    }\n                } else {\n                    for (i = startIndex; i >= endIndex; i--) {\n                        indicesToSelect.push(i);\n                    }\n                }\n                if (maxSelectedItems !== null && indicesToSelect.length > maxSelectedItems) {\n                    indicesToSelect = indicesToSelect.slice(0, maxSelectedItems);\n                }\n                for (i = 0; i < indicesToSelect.length; i++) {\n                    var index = indicesToSelect[i];\n                    if (this._getSelectedIndices().indexOf(index) == -1) {\n                        indices.push(index);\n                    } else {\n                        indices.splice(indices.indexOf(index), 1);\n                    }\n                }\n                if (!indices.length) {\n                    return;\n                }\n                that.persistTagList = false;\n                return selectIndices(indices);\n            },\n            _input: function () {\n                var that = this;\n                var element = that.element;\n                var accessKey = element[0].accessKey;\n                var input = that._inputWrapper.children('input.k-input');\n                if (!input[0]) {\n                    input = $('<input class=\"k-input\" style=\"width: 25px\" />').appendTo(that._inputWrapper);\n                }\n                element.removeAttr('accesskey');\n                that._focused = that.input = input.attr({\n                    'accesskey': accessKey,\n                    'autocomplete': AUTOCOMPLETEVALUE,\n                    'role': 'listbox',\n                    'title': element[0].title,\n                    'aria-expanded': false,\n                    'aria-haspopup': 'listbox',\n                    'aria-autocomplete': 'list'\n                });\n            },\n            _tagList: function () {\n                var that = this, tagList = that._inputWrapper.children('ul');\n                if (!tagList[0]) {\n                    tagList = $('<ul unselectable=\"on\" class=\"k-reset\"/>').appendTo(that._inputWrapper);\n                }\n                that.tagList = tagList;\n            },\n            _tagTemplate: function () {\n                var that = this;\n                var options = that.options;\n                var tagTemplate = options.tagTemplate;\n                var hasDataSource = options.dataSource;\n                var isMultiple = options.tagMode === 'multiple';\n                var singleTag = options.messages.singleTag;\n                var defaultTemplate;\n                if (that.element[0].length && !hasDataSource) {\n                    options.dataTextField = options.dataTextField || 'text';\n                    options.dataValueField = options.dataValueField || 'value';\n                }\n                defaultTemplate = isMultiple ? kendo.template('#:' + kendo.expr(options.dataTextField, 'data') + '#', { useWithBlock: false }) : kendo.template('#:values.length# ' + singleTag);\n                that.tagTextTemplate = tagTemplate = tagTemplate ? kendo.template(tagTemplate) : defaultTemplate;\n                that.tagTemplate = function (data) {\n                    return '<li role=\"option\" aria-selected=\"true\" class=\"k-button\" unselectable=\"on\"><span unselectable=\"on\">' + tagTemplate(data) + '</span>' + '<span aria-hidden=\"true\" unselectable=\"on\" aria-label=\"' + (isMultiple ? 'delete\" title=\"' + that.options.messages.deleteTag + '\" aria-label=\"' + that.options.messages.deleteTag : 'open') + '\" class=\"k-select\"><span class=\"k-icon ' + (isMultiple ? 'k-i-close' : 'k-i-arrow-60-down') + '\">' + '</span></span></li>';\n                };\n            },\n            _loader: function () {\n                this._loading = $('<span class=\"k-icon k-i-loading ' + HIDDENCLASS + '\"></span>').insertAfter(this.input);\n            },\n            _clearButton: function () {\n                List.fn._clearButton.call(this);\n                if (this.options.clearButton) {\n                    this._clear.insertAfter(this.input);\n                    this.wrapper.addClass('k-multiselect-clearable');\n                }\n            },\n            _textContainer: function () {\n                var computedStyles = kendo.getComputedStyles(this.input[0], styles);\n                computedStyles.position = 'absolute';\n                computedStyles.visibility = 'hidden';\n                computedStyles.top = -3333;\n                computedStyles.left = -3333;\n                this._span = $('<span/>').css(computedStyles).appendTo(this.wrapper);\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper = element.parent('span.k-multiselect');\n                if (!wrapper[0]) {\n                    wrapper = element.wrap('<div class=\"k-widget k-multiselect\" unselectable=\"on\" />').parent();\n                    wrapper[0].style.cssText = element[0].style.cssText;\n                    wrapper[0].title = element[0].title;\n                    $('<div class=\"k-multiselect-wrap k-floatwrap\" role=\"listbox\" unselectable=\"on\" />').insertBefore(element);\n                }\n                that.wrapper = wrapper.addClass(element[0].className).removeClass('input-validation-error').css('display', '');\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _ariaSetSize: function (value) {\n                var that = this;\n                var selectedItems = that.tagList.children();\n                if (value && selectedItems.length) {\n                    selectedItems.attr('aria-setsize', value);\n                }\n            },\n            _ariaSetLive: function () {\n                var that = this;\n                that.ul.attr('aria-live', !that._isFilterEnabled() ? 'off' : 'polite');\n            }\n        });\n        function compare(a, b) {\n            var length;\n            if (a === null && b !== null || a !== null && b === null) {\n                return false;\n            }\n            length = a.length;\n            if (length !== b.length) {\n                return false;\n            }\n            while (length--) {\n                if (a[length] !== b[length]) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        ui.plugin(MultiSelect);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.color', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'color',\n        name: 'Color utils',\n        category: 'framework',\n        advanced: true,\n        description: 'Color utilities used across components',\n        depends: ['core']\n    };\n    window.kendo = window.kendo || {};\n    var Class = kendo.Class;\n    var support = kendo.support;\n    var namedColors = {\n        aliceblue: 'f0f8ff',\n        antiquewhite: 'faebd7',\n        aqua: '00ffff',\n        aquamarine: '7fffd4',\n        azure: 'f0ffff',\n        beige: 'f5f5dc',\n        bisque: 'ffe4c4',\n        black: '000000',\n        blanchedalmond: 'ffebcd',\n        blue: '0000ff',\n        blueviolet: '8a2be2',\n        brown: 'a52a2a',\n        burlywood: 'deb887',\n        cadetblue: '5f9ea0',\n        chartreuse: '7fff00',\n        chocolate: 'd2691e',\n        coral: 'ff7f50',\n        cornflowerblue: '6495ed',\n        cornsilk: 'fff8dc',\n        crimson: 'dc143c',\n        cyan: '00ffff',\n        darkblue: '00008b',\n        darkcyan: '008b8b',\n        darkgoldenrod: 'b8860b',\n        darkgray: 'a9a9a9',\n        darkgrey: 'a9a9a9',\n        darkgreen: '006400',\n        darkkhaki: 'bdb76b',\n        darkmagenta: '8b008b',\n        darkolivegreen: '556b2f',\n        darkorange: 'ff8c00',\n        darkorchid: '9932cc',\n        darkred: '8b0000',\n        darksalmon: 'e9967a',\n        darkseagreen: '8fbc8f',\n        darkslateblue: '483d8b',\n        darkslategray: '2f4f4f',\n        darkslategrey: '2f4f4f',\n        darkturquoise: '00ced1',\n        darkviolet: '9400d3',\n        deeppink: 'ff1493',\n        deepskyblue: '00bfff',\n        dimgray: '696969',\n        dimgrey: '696969',\n        dodgerblue: '1e90ff',\n        firebrick: 'b22222',\n        floralwhite: 'fffaf0',\n        forestgreen: '228b22',\n        fuchsia: 'ff00ff',\n        gainsboro: 'dcdcdc',\n        ghostwhite: 'f8f8ff',\n        gold: 'ffd700',\n        goldenrod: 'daa520',\n        gray: '808080',\n        grey: '808080',\n        green: '008000',\n        greenyellow: 'adff2f',\n        honeydew: 'f0fff0',\n        hotpink: 'ff69b4',\n        indianred: 'cd5c5c',\n        indigo: '4b0082',\n        ivory: 'fffff0',\n        khaki: 'f0e68c',\n        lavender: 'e6e6fa',\n        lavenderblush: 'fff0f5',\n        lawngreen: '7cfc00',\n        lemonchiffon: 'fffacd',\n        lightblue: 'add8e6',\n        lightcoral: 'f08080',\n        lightcyan: 'e0ffff',\n        lightgoldenrodyellow: 'fafad2',\n        lightgray: 'd3d3d3',\n        lightgrey: 'd3d3d3',\n        lightgreen: '90ee90',\n        lightpink: 'ffb6c1',\n        lightsalmon: 'ffa07a',\n        lightseagreen: '20b2aa',\n        lightskyblue: '87cefa',\n        lightslategray: '778899',\n        lightslategrey: '778899',\n        lightsteelblue: 'b0c4de',\n        lightyellow: 'ffffe0',\n        lime: '00ff00',\n        limegreen: '32cd32',\n        linen: 'faf0e6',\n        magenta: 'ff00ff',\n        maroon: '800000',\n        mediumaquamarine: '66cdaa',\n        mediumblue: '0000cd',\n        mediumorchid: 'ba55d3',\n        mediumpurple: '9370d8',\n        mediumseagreen: '3cb371',\n        mediumslateblue: '7b68ee',\n        mediumspringgreen: '00fa9a',\n        mediumturquoise: '48d1cc',\n        mediumvioletred: 'c71585',\n        midnightblue: '191970',\n        mintcream: 'f5fffa',\n        mistyrose: 'ffe4e1',\n        moccasin: 'ffe4b5',\n        navajowhite: 'ffdead',\n        navy: '000080',\n        oldlace: 'fdf5e6',\n        olive: '808000',\n        olivedrab: '6b8e23',\n        orange: 'ffa500',\n        orangered: 'ff4500',\n        orchid: 'da70d6',\n        palegoldenrod: 'eee8aa',\n        palegreen: '98fb98',\n        paleturquoise: 'afeeee',\n        palevioletred: 'd87093',\n        papayawhip: 'ffefd5',\n        peachpuff: 'ffdab9',\n        peru: 'cd853f',\n        pink: 'ffc0cb',\n        plum: 'dda0dd',\n        powderblue: 'b0e0e6',\n        purple: '800080',\n        red: 'ff0000',\n        rosybrown: 'bc8f8f',\n        royalblue: '4169e1',\n        saddlebrown: '8b4513',\n        salmon: 'fa8072',\n        sandybrown: 'f4a460',\n        seagreen: '2e8b57',\n        seashell: 'fff5ee',\n        sienna: 'a0522d',\n        silver: 'c0c0c0',\n        skyblue: '87ceeb',\n        slateblue: '6a5acd',\n        slategray: '708090',\n        slategrey: '708090',\n        snow: 'fffafa',\n        springgreen: '00ff7f',\n        steelblue: '4682b4',\n        tan: 'd2b48c',\n        teal: '008080',\n        thistle: 'd8bfd8',\n        tomato: 'ff6347',\n        turquoise: '40e0d0',\n        violet: 'ee82ee',\n        wheat: 'f5deb3',\n        white: 'ffffff',\n        whitesmoke: 'f5f5f5',\n        yellow: 'ffff00',\n        yellowgreen: '9acd32'\n    };\n    var browser = support.browser;\n    var matchNamedColor = function (color) {\n        var colorNames = Object.keys(namedColors);\n        colorNames.push('transparent');\n        var regexp = new RegExp('^(' + colorNames.join('|') + ')(\\\\W|$)', 'i');\n        matchNamedColor = function (color) {\n            return regexp.exec(color);\n        };\n        return regexp.exec(color);\n    };\n    var BaseColor = Class.extend({\n        init: function () {\n        },\n        toHSV: function () {\n            return this;\n        },\n        toRGB: function () {\n            return this;\n        },\n        toHex: function () {\n            return this.toBytes().toHex();\n        },\n        toBytes: function () {\n            return this;\n        },\n        toCss: function () {\n            return '#' + this.toHex();\n        },\n        toCssRgba: function () {\n            var rgb = this.toBytes();\n            return 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', ' + parseFloat(Number(this.a).toFixed(3)) + ')';\n        },\n        toDisplay: function () {\n            if (browser.msie && browser.version < 9) {\n                return this.toCss();\n            }\n            return this.toCssRgba();\n        },\n        equals: function (c) {\n            return c === this || c !== null && this.toCssRgba() === parseColor(c).toCssRgba();\n        },\n        diff: function (other) {\n            if (other === null) {\n                return NaN;\n            }\n            var c1 = this.toBytes();\n            var c2 = other.toBytes();\n            return Math.sqrt(Math.pow((c1.r - c2.r) * 0.3, 2) + Math.pow((c1.g - c2.g) * 0.59, 2) + Math.pow((c1.b - c2.b) * 0.11, 2));\n        },\n        clone: function () {\n            var c = this.toBytes();\n            if (c === this) {\n                c = new Bytes(c.r, c.g, c.b, c.a);\n            }\n            return c;\n        }\n    });\n    var RGB = BaseColor.extend({\n        init: function (r, g, b, a) {\n            BaseColor.fn.init.call(this);\n            this.r = r;\n            this.g = g;\n            this.b = b;\n            this.a = a;\n        },\n        toHSV: function () {\n            var ref = this;\n            var r = ref.r;\n            var g = ref.g;\n            var b = ref.b;\n            var min = Math.min(r, g, b);\n            var max = Math.max(r, g, b);\n            var delta = max - min;\n            var v = max;\n            var h, s;\n            if (delta === 0) {\n                return new HSV(0, 0, v, this.a);\n            }\n            if (max !== 0) {\n                s = delta / max;\n                if (r === max) {\n                    h = (g - b) / delta;\n                } else if (g === max) {\n                    h = 2 + (b - r) / delta;\n                } else {\n                    h = 4 + (r - g) / delta;\n                }\n                h *= 60;\n                if (h < 0) {\n                    h += 360;\n                }\n            } else {\n                s = 0;\n                h = -1;\n            }\n            return new HSV(h, s, v, this.a);\n        },\n        toHSL: function () {\n            var ref = this;\n            var r = ref.r;\n            var g = ref.g;\n            var b = ref.b;\n            var max = Math.max(r, g, b);\n            var min = Math.min(r, g, b);\n            var h, s, l = (max + min) / 2;\n            if (max === min) {\n                h = s = 0;\n            } else {\n                var d = max - min;\n                s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n                switch (max) {\n                case r:\n                    h = (g - b) / d + (g < b ? 6 : 0);\n                    break;\n                case g:\n                    h = (b - r) / d + 2;\n                    break;\n                case b:\n                    h = (r - g) / d + 4;\n                    break;\n                default:\n                    break;\n                }\n            }\n            return new HSL(h * 60, s * 100, l * 100, this.a);\n        },\n        toBytes: function () {\n            return new Bytes(this.r * 255, this.g * 255, this.b * 255, this.a);\n        }\n    });\n    var Bytes = RGB.extend({\n        init: function (r, g, b, a) {\n            RGB.fn.init.call(this, Math.round(r), Math.round(g), Math.round(b), a);\n        },\n        toRGB: function () {\n            return new RGB(this.r / 255, this.g / 255, this.b / 255, this.a);\n        },\n        toHSV: function () {\n            return this.toRGB().toHSV();\n        },\n        toHSL: function () {\n            return this.toRGB().toHSL();\n        },\n        toHex: function () {\n            return hex(this.r, 2) + hex(this.g, 2) + hex(this.b, 2);\n        },\n        toBytes: function () {\n            return this;\n        }\n    });\n    function hex(n, width, pad) {\n        if (pad === void 0) {\n            pad = '0';\n        }\n        var result = n.toString(16);\n        while (width > result.length) {\n            result = pad + result;\n        }\n        return result;\n    }\n    var HSV = BaseColor.extend({\n        init: function (h, s, v, a) {\n            BaseColor.fn.init.call(this);\n            this.h = h;\n            this.s = s;\n            this.v = v;\n            this.a = a;\n        },\n        toRGB: function () {\n            var ref = this;\n            var h = ref.h;\n            var s = ref.s;\n            var v = ref.v;\n            var r, g, b;\n            if (s === 0) {\n                r = g = b = v;\n            } else {\n                h /= 60;\n                var i = Math.floor(h);\n                var f = h - i;\n                var p = v * (1 - s);\n                var q = v * (1 - s * f);\n                var t = v * (1 - s * (1 - f));\n                switch (i) {\n                case 0:\n                    r = v;\n                    g = t;\n                    b = p;\n                    break;\n                case 1:\n                    r = q;\n                    g = v;\n                    b = p;\n                    break;\n                case 2:\n                    r = p;\n                    g = v;\n                    b = t;\n                    break;\n                case 3:\n                    r = p;\n                    g = q;\n                    b = v;\n                    break;\n                case 4:\n                    r = t;\n                    g = p;\n                    b = v;\n                    break;\n                default:\n                    r = v;\n                    g = p;\n                    b = q;\n                    break;\n                }\n            }\n            return new RGB(r, g, b, this.a);\n        },\n        toHSL: function () {\n            return this.toRGB().toHSL();\n        },\n        toBytes: function () {\n            return this.toRGB().toBytes();\n        }\n    });\n    var HSL = BaseColor.extend({\n        init: function (h, s, l, a) {\n            BaseColor.fn.init.call(this);\n            this.h = h;\n            this.s = s;\n            this.l = l;\n            this.a = a;\n        },\n        toRGB: function () {\n            var h = this.h / 360;\n            var s = this.s / 100;\n            var l = this.l / 100;\n            var r, g, b;\n            if (s === 0) {\n                r = g = b = l;\n            } else {\n                var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n                var p = 2 * l - q;\n                r = hue2rgb(p, q, h + 1 / 3);\n                g = hue2rgb(p, q, h);\n                b = hue2rgb(p, q, h - 1 / 3);\n            }\n            return new RGB(r, g, b, this.a);\n        },\n        toHSV: function () {\n            return this.toRGB().toHSV();\n        },\n        toBytes: function () {\n            return this.toRGB().toBytes();\n        }\n    });\n    function hue2rgb(p, q, s) {\n        var t = s;\n        if (t < 0) {\n            t += 1;\n        }\n        if (t > 1) {\n            t -= 1;\n        }\n        if (t < 1 / 6) {\n            return p + (q - p) * 6 * t;\n        }\n        if (t < 1 / 2) {\n            return q;\n        }\n        if (t < 2 / 3) {\n            return p + (q - p) * (2 / 3 - t) * 6;\n        }\n        return p;\n    }\n    function parseColor(value, safe) {\n        var m, ret;\n        if (value == null || value === 'none') {\n            return null;\n        }\n        if (value instanceof BaseColor) {\n            return value;\n        }\n        var color = value.toLowerCase();\n        if (m = matchNamedColor(color)) {\n            if (m[1] === 'transparent') {\n                color = new RGB(1, 1, 1, 0);\n            } else {\n                color = parseColor(namedColors[m[1]], safe);\n            }\n            color.match = [m[1]];\n            return color;\n        }\n        if (m = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\\b/i.exec(color)) {\n            ret = new Bytes(parseInt(m[1], 16), parseInt(m[2], 16), parseInt(m[3], 16), 1);\n        } else if (m = /^#?([0-9a-f])([0-9a-f])([0-9a-f])\\b/i.exec(color)) {\n            ret = new Bytes(parseInt(m[1] + m[1], 16), parseInt(m[2] + m[2], 16), parseInt(m[3] + m[3], 16), 1);\n        } else if (m = /^rgb\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*\\)/.exec(color)) {\n            ret = new Bytes(parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10), 1);\n        } else if (m = /^rgba\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9.]+)\\s*\\)/.exec(color)) {\n            ret = new Bytes(parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10), parseFloat(m[4]));\n        } else if (m = /^rgb\\(\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*\\)/.exec(color)) {\n            ret = new RGB(parseFloat(m[1]) / 100, parseFloat(m[2]) / 100, parseFloat(m[3]) / 100, 1);\n        } else if (m = /^rgba\\(\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9.]+)\\s*\\)/.exec(color)) {\n            ret = new RGB(parseFloat(m[1]) / 100, parseFloat(m[2]) / 100, parseFloat(m[3]) / 100, parseFloat(m[4]));\n        }\n        if (ret) {\n            ret.match = m;\n        } else if (!safe) {\n            throw new Error('Cannot parse color: ' + color);\n        }\n        return ret;\n    }\n    var Color = Class.extend({\n        init: function (value) {\n            var this$1 = this;\n            if (arguments.length === 1) {\n                var formats = Color.formats;\n                var resolvedColor = this.resolveColor(value);\n                for (var idx = 0; idx < formats.length; idx++) {\n                    var formatRegex = formats[idx].re;\n                    var processor = formats[idx].process;\n                    var parts = formatRegex.exec(resolvedColor);\n                    if (parts) {\n                        var channels = processor(parts);\n                        this$1.r = channels[0];\n                        this$1.g = channels[1];\n                        this$1.b = channels[2];\n                    }\n                }\n            } else {\n                this.r = arguments[0];\n                this.g = arguments[1];\n                this.b = arguments[2];\n            }\n            this.r = this.normalizeByte(this.r);\n            this.g = this.normalizeByte(this.g);\n            this.b = this.normalizeByte(this.b);\n        },\n        toHex: function () {\n            var pad = this.padDigit;\n            var r = this.r.toString(16);\n            var g = this.g.toString(16);\n            var b = this.b.toString(16);\n            return '#' + pad(r) + pad(g) + pad(b);\n        },\n        resolveColor: function (value) {\n            var color = value || 'black';\n            if (color.charAt(0) === '#') {\n                color = color.substr(1, 6);\n            }\n            color = color.replace(/ /g, '');\n            color = color.toLowerCase();\n            color = Color.namedColors[color] || color;\n            return color;\n        },\n        normalizeByte: function (value) {\n            if (value < 0 || isNaN(value)) {\n                return 0;\n            }\n            return value > 255 ? 255 : value;\n        },\n        padDigit: function (value) {\n            return value.length === 1 ? '0' + value : value;\n        },\n        brightness: function (value) {\n            var round = Math.round;\n            this.r = round(this.normalizeByte(this.r * value));\n            this.g = round(this.normalizeByte(this.g * value));\n            this.b = round(this.normalizeByte(this.b * value));\n            return this;\n        },\n        percBrightness: function () {\n            return Math.sqrt(0.241 * this.r * this.r + 0.691 * this.g * this.g + 0.068 * this.b * this.b);\n        }\n    });\n    Color.fromBytes = function (r, g, b, a) {\n        return new Bytes(r, g, b, a != null ? a : 1);\n    };\n    Color.fromRGB = function (r, g, b, a) {\n        return new RGB(r, g, b, a != null ? a : 1);\n    };\n    Color.fromHSV = function (h, s, v, a) {\n        return new HSV(h, s, v, a != null ? a : 1);\n    };\n    Color.fromHSL = function (h, s, l, a) {\n        return new HSL(h, s, l, a != null ? a : 1);\n    };\n    Color.formats = [\n        {\n            re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\n            process: function (parts) {\n                return [\n                    parseInt(parts[1], 10),\n                    parseInt(parts[2], 10),\n                    parseInt(parts[3], 10)\n                ];\n            }\n        },\n        {\n            re: /^(\\w{2})(\\w{2})(\\w{2})$/,\n            process: function (parts) {\n                return [\n                    parseInt(parts[1], 16),\n                    parseInt(parts[2], 16),\n                    parseInt(parts[3], 16)\n                ];\n            }\n        },\n        {\n            re: /^(\\w{1})(\\w{1})(\\w{1})$/,\n            process: function (parts) {\n                return [\n                    parseInt(parts[1] + parts[1], 16),\n                    parseInt(parts[2] + parts[2], 16),\n                    parseInt(parts[3] + parts[3], 16)\n                ];\n            }\n        }\n    ];\n    Color.namedColors = namedColors;\n    kendo.deepExtend(kendo, {\n        parseColor: parseColor,\n        Color: Color\n    });\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.slider', ['kendo.draganddrop'], f);\n}(function () {\n    var __meta__ = {\n        id: 'slider',\n        name: 'Slider',\n        category: 'web',\n        description: 'The Slider widget provides a rich input for selecting values or ranges of values.',\n        depends: ['draganddrop']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, Draggable = kendo.ui.Draggable, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, extend = $.extend, format = kendo.format, parse = kendo.parseFloat, proxy = $.proxy, isArray = $.isArray, math = Math, support = kendo.support, pointers = support.pointers, msPointers = support.msPointers, CHANGE = 'change', SLIDE = 'slide', NS = '.slider', MOUSE_DOWN = 'touchstart' + NS + ' mousedown' + NS, TRACK_MOUSE_DOWN = pointers ? 'pointerdown' + NS : msPointers ? 'MSPointerDown' + NS : MOUSE_DOWN, MOUSE_UP = 'touchend' + NS + ' mouseup' + NS, TRACK_MOUSE_UP = pointers ? 'pointerup' : msPointers ? 'MSPointerUp' + NS : MOUSE_UP, MOVE_SELECTION = 'moveSelection', KEY_DOWN = 'keydown' + NS, CLICK = 'click' + NS, MOUSE_OVER = 'mouseover' + NS, FOCUS = 'focus' + NS, BLUR = 'blur' + NS, DRAG_HANDLE = '.k-draghandle', TRACK_SELECTOR = '.k-slider-track', TICK_SELECTOR = '.k-tick', STATE_SELECTED = 'k-state-selected', STATE_FOCUSED = 'k-state-focused', STATE_DEFAULT = 'k-state-default', STATE_DISABLED = 'k-state-disabled', DISABLED = 'disabled', UNDEFINED = 'undefined', TABINDEX = 'tabindex', getTouches = kendo.getTouches;\n        var SliderBase = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                that._isHorizontal = options.orientation == 'horizontal';\n                that._isRtl = that._isHorizontal && kendo.support.isRtl(element);\n                that._position = that._isHorizontal ? 'left' : 'bottom';\n                that._sizeFn = that._isHorizontal ? 'width' : 'height';\n                that._outerSize = that._isHorizontal ? outerWidth : outerHeight;\n                options.tooltip.format = options.tooltip.enabled ? options.tooltip.format || '{0}' : '{0}';\n                if (options.smallStep <= 0) {\n                    throw new Error('Kendo UI Slider smallStep must be a positive number.');\n                }\n                that._createHtml();\n                that.wrapper = that.element.closest('.k-slider');\n                that._trackDiv = that.wrapper.find(TRACK_SELECTOR);\n                that._setTrackDivWidth();\n                that._maxSelection = that._trackDiv[that._sizeFn]();\n                that._sliderItemsInit();\n                that._reset();\n                that._tabindex(that.wrapper.find(DRAG_HANDLE));\n                that[options.enabled ? 'enable' : 'disable']();\n                var rtlDirectionSign = kendo.support.isRtl(that.wrapper) ? -1 : 1;\n                that._keyMap = {\n                    37: step(-1 * rtlDirectionSign * options.smallStep),\n                    40: step(-options.smallStep),\n                    39: step(+1 * rtlDirectionSign * options.smallStep),\n                    38: step(+options.smallStep),\n                    35: setValue(options.max),\n                    36: setValue(options.min),\n                    33: step(+options.largeStep),\n                    34: step(-options.largeStep)\n                };\n                kendo.notify(that);\n            },\n            events: [\n                CHANGE,\n                SLIDE\n            ],\n            options: {\n                enabled: true,\n                min: 0,\n                max: 10,\n                smallStep: 1,\n                largeStep: 5,\n                orientation: 'horizontal',\n                tickPlacement: 'both',\n                tooltip: {\n                    enabled: true,\n                    format: '{0}'\n                }\n            },\n            _distance: function () {\n                return round(this.options.max - this.options.min);\n            },\n            _resize: function () {\n                this._setTrackDivWidth();\n                this.wrapper.find('.k-slider-items').remove();\n                this._maxSelection = this._trackDiv[this._sizeFn]();\n                this._sliderItemsInit();\n                this._refresh();\n                if (this.options.enabled) {\n                    this.enable(true);\n                }\n            },\n            _sliderItemsInit: function () {\n                var that = this, options = that.options;\n                var sizeBetweenTicks = that._maxSelection / ((options.max - options.min) / options.smallStep);\n                var pixelWidths = that._calculateItemsWidth(math.floor(removeFraction(that._distance()) / removeFraction(options.smallStep)));\n                if (options.tickPlacement != 'none' && sizeBetweenTicks >= 2) {\n                    $(this.element).parent().find('.k-slider-items').remove();\n                    that._trackDiv.before(createSliderItems(options, that._distance()));\n                    that._setItemsWidth(pixelWidths);\n                    that._setItemsTitle();\n                }\n                that._calculateSteps(pixelWidths);\n                if (options.tickPlacement != 'none' && sizeBetweenTicks >= 2 && options.largeStep >= options.smallStep) {\n                    that._setItemsLargeTick();\n                }\n            },\n            getSize: function () {\n                return kendo.dimensions(this.wrapper);\n            },\n            _setTrackDivWidth: function () {\n                var that = this, trackDivPosition = parseFloat(that._trackDiv.css(that._isRtl ? 'right' : that._position), 10) * 2;\n                that._trackDiv[that._sizeFn](that.wrapper[that._sizeFn]() - 2 - trackDivPosition);\n            },\n            _setItemsWidth: function (pixelWidths) {\n                var that = this, options = that.options, first = 0, last = pixelWidths.length - 1, items = that.wrapper.find(TICK_SELECTOR), i, paddingTop = 0, bordersWidth = 2, count = items.length, selection = 0;\n                for (i = 0; i < count - 2; i++) {\n                    $(items[i + 1])[that._sizeFn](pixelWidths[i]);\n                }\n                if (that._isHorizontal) {\n                    $(items[first]).addClass('k-first')[that._sizeFn](pixelWidths[last - 1]);\n                    $(items[last]).addClass('k-last')[that._sizeFn](pixelWidths[last]);\n                } else {\n                    $(items[last]).addClass('k-first')[that._sizeFn](pixelWidths[last]);\n                    $(items[first]).addClass('k-last')[that._sizeFn](pixelWidths[last - 1]);\n                }\n                if (that._distance() % options.smallStep !== 0 && !that._isHorizontal) {\n                    for (i = 0; i < pixelWidths.length; i++) {\n                        selection += pixelWidths[i];\n                    }\n                    paddingTop = that._maxSelection - selection;\n                    paddingTop += parseFloat(that._trackDiv.css(that._position), 10) + bordersWidth;\n                    that.wrapper.find('.k-slider-items').css('padding-top', paddingTop);\n                }\n            },\n            _setItemsTitle: function () {\n                var that = this, options = that.options, items = that.wrapper.find(TICK_SELECTOR), titleNumber = options.min, count = items.length, i = that._isHorizontal && !that._isRtl ? 0 : count - 1, limit = that._isHorizontal && !that._isRtl ? count : -1, increment = that._isHorizontal && !that._isRtl ? 1 : -1;\n                for (; i - limit !== 0; i += increment) {\n                    $(items[i]).attr('title', format(options.tooltip.format, round(titleNumber)));\n                    titleNumber += options.smallStep;\n                }\n            },\n            _setItemsLargeTick: function () {\n                var that = this, options = that.options, items = that.wrapper.find(TICK_SELECTOR), i = 0, item, value;\n                if (removeFraction(options.largeStep) % removeFraction(options.smallStep) === 0 || that._distance() / options.largeStep >= 3) {\n                    if (!that._isHorizontal && !that._isRtl) {\n                        items = $.makeArray(items).reverse();\n                    }\n                    for (i = 0; i < items.length; i++) {\n                        item = $(items[i]);\n                        value = that._values[i];\n                        var valueWithoutFraction = round(removeFraction(value - this.options.min));\n                        if (valueWithoutFraction % removeFraction(options.smallStep) === 0 && valueWithoutFraction % removeFraction(options.largeStep) === 0) {\n                            item.addClass('k-tick-large').html('<span class=\\'k-label\\'>' + item.attr('title') + '</span>');\n                            if (i !== 0 && i !== items.length - 1) {\n                                item.css('line-height', item[that._sizeFn]() + 'px');\n                            }\n                        }\n                    }\n                }\n            },\n            _calculateItemsWidth: function (itemsCount) {\n                var that = this, options = that.options, trackDivSize = parseFloat(that._trackDiv.css(that._sizeFn)) + 1, distance = that._distance(), preciseItemsCount = removeFraction(distance) / removeFraction(options.smallStep), pixelStep = trackDivSize / removeFraction(distance), itemWidth, pixelWidths, i;\n                if (preciseItemsCount - itemsCount > 0) {\n                    trackDivSize -= removeFraction(distance) % removeFraction(options.smallStep) * pixelStep;\n                }\n                itemWidth = trackDivSize / itemsCount;\n                pixelWidths = [];\n                for (i = 0; i < itemsCount - 1; i++) {\n                    pixelWidths[i] = itemWidth;\n                }\n                pixelWidths[itemsCount - 1] = pixelWidths[itemsCount] = itemWidth / 2;\n                return that._roundWidths(pixelWidths);\n            },\n            _roundWidths: function (pixelWidthsArray) {\n                var balance = 0, count = pixelWidthsArray.length, i;\n                for (i = 0; i < count; i++) {\n                    balance += pixelWidthsArray[i] - math.floor(pixelWidthsArray[i]);\n                    pixelWidthsArray[i] = math.floor(pixelWidthsArray[i]);\n                }\n                balance = math.round(balance);\n                return this._addAdditionalSize(balance, pixelWidthsArray);\n            },\n            _addAdditionalSize: function (additionalSize, pixelWidthsArray) {\n                if (additionalSize === 0) {\n                    return pixelWidthsArray;\n                }\n                var step = parseFloat(pixelWidthsArray.length - 1) / parseFloat(additionalSize == 1 ? additionalSize : additionalSize - 1), i;\n                for (i = 0; i < additionalSize; i++) {\n                    pixelWidthsArray[parseInt(math.round(step * i), 10)] += 1;\n                }\n                return pixelWidthsArray;\n            },\n            _calculateSteps: function (pixelWidths) {\n                var that = this, options = that.options, val = options.min, selection = 0, distance = that._distance(), itemsCount = math.ceil(removeFraction(distance) / removeFraction(options.smallStep)), i = 1, lastItem;\n                itemsCount += removeFraction(distance) / removeFraction(options.smallStep) % 1 === 0 ? 1 : 0;\n                pixelWidths.splice(0, 0, pixelWidths[itemsCount - 2] * 2);\n                pixelWidths.splice(itemsCount - 1, 1, pixelWidths.pop() * 2);\n                that._pixelSteps = [selection];\n                that._values = [val];\n                if (itemsCount === 0) {\n                    return;\n                }\n                while (i < itemsCount) {\n                    selection += (pixelWidths[i - 1] + pixelWidths[i]) / 2;\n                    that._pixelSteps[i] = selection;\n                    val += options.smallStep;\n                    that._values[i] = round(val);\n                    i++;\n                }\n                lastItem = removeFraction(distance) % removeFraction(options.smallStep) === 0 ? itemsCount - 1 : itemsCount;\n                that._pixelSteps[lastItem] = that._maxSelection;\n                that._values[lastItem] = options.max;\n                if (that._isRtl) {\n                    that._pixelSteps.reverse();\n                    that._values.reverse();\n                }\n            },\n            _getValueFromPosition: function (mousePosition, dragableArea) {\n                var that = this, options = that.options, step = math.max(options.smallStep * (that._maxSelection / that._distance()), 0), position = 0, halfStep = step / 2, i;\n                if (that._isHorizontal) {\n                    position = mousePosition - dragableArea.startPoint;\n                    if (that._isRtl) {\n                        position = that._maxSelection - position;\n                    }\n                } else {\n                    position = dragableArea.startPoint - mousePosition;\n                }\n                if (that._maxSelection - (parseInt(that._maxSelection % step, 10) - 3) / 2 < position) {\n                    return options.max;\n                }\n                for (i = 0; i < that._pixelSteps.length; i++) {\n                    if (math.abs(that._pixelSteps[i] - position) - 1 <= halfStep) {\n                        return round(that._values[i]);\n                    }\n                }\n            },\n            _getFormattedValue: function (val, drag) {\n                var that = this, html = '', tooltip = that.options.tooltip, tooltipTemplate, selectionStart, selectionEnd;\n                if (isArray(val)) {\n                    selectionStart = val[0];\n                    selectionEnd = val[1];\n                } else if (drag && drag.type) {\n                    selectionStart = drag.selectionStart;\n                    selectionEnd = drag.selectionEnd;\n                }\n                if (drag) {\n                    tooltipTemplate = drag.tooltipTemplate;\n                }\n                if (!tooltipTemplate && tooltip.template) {\n                    tooltipTemplate = kendo.template(tooltip.template);\n                }\n                if (isArray(val) || drag && drag.type) {\n                    if (tooltipTemplate) {\n                        html = tooltipTemplate({\n                            selectionStart: selectionStart,\n                            selectionEnd: selectionEnd\n                        });\n                    } else {\n                        selectionStart = format(tooltip.format, selectionStart);\n                        selectionEnd = format(tooltip.format, selectionEnd);\n                        html = selectionStart + ' - ' + selectionEnd;\n                    }\n                } else {\n                    if (drag) {\n                        drag.val = val;\n                    }\n                    if (tooltipTemplate) {\n                        html = tooltipTemplate({ value: val });\n                    } else {\n                        html = format(tooltip.format, val);\n                    }\n                }\n                return html;\n            },\n            _getDraggableArea: function () {\n                var that = this, offset = kendo.getOffset(that._trackDiv);\n                return {\n                    startPoint: that._isHorizontal ? offset.left : offset.top + that._maxSelection,\n                    endPoint: that._isHorizontal ? offset.left + that._maxSelection : offset.top\n                };\n            },\n            _createHtml: function () {\n                var that = this, element = that.element, options = that.options, inputs = element.find('input');\n                if (inputs.length == 2) {\n                    inputs.eq(0).prop('value', formatValue(options.selectionStart));\n                    inputs.eq(1).prop('value', formatValue(options.selectionEnd));\n                } else {\n                    element.prop('value', formatValue(options.value));\n                }\n                element.wrap(createWrapper(options, element, that._isHorizontal)).hide();\n                if (options.showButtons) {\n                    element.before(createButton(options, 'increase', that._isHorizontal, that._isRtl)).before(createButton(options, 'decrease', that._isHorizontal, that._isRtl));\n                }\n                element.before(createTrack(options, element));\n            },\n            _focus: function (e) {\n                var that = this, target = e.target, val = that.value(), drag = that._drag;\n                if (!drag) {\n                    if (target == that.wrapper.find(DRAG_HANDLE).eq(0)[0]) {\n                        drag = that._firstHandleDrag;\n                        that._activeHandle = 0;\n                    } else {\n                        drag = that._lastHandleDrag;\n                        that._activeHandle = 1;\n                    }\n                    val = val[that._activeHandle];\n                }\n                $(target).addClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                if (drag) {\n                    that._activeHandleDrag = drag;\n                    drag.selectionStart = that.options.selectionStart;\n                    drag.selectionEnd = that.options.selectionEnd;\n                    drag._updateTooltip(val);\n                }\n            },\n            _focusWithMouse: function (target) {\n                target = $(target);\n                var that = this, idx = target.is(DRAG_HANDLE) ? target.index() : 0;\n                window.setTimeout(function () {\n                    that.wrapper.find(DRAG_HANDLE)[idx == 2 ? 1 : 0].focus();\n                }, 1);\n                that._setTooltipTimeout();\n            },\n            _blur: function (e) {\n                var that = this, drag = that._activeHandleDrag;\n                $(e.target).removeClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                if (drag) {\n                    drag._removeTooltip();\n                    delete that._activeHandleDrag;\n                    delete that._activeHandle;\n                }\n            },\n            _setTooltipTimeout: function () {\n                var that = this;\n                that._tooltipTimeout = window.setTimeout(function () {\n                    var drag = that._drag || that._activeHandleDrag;\n                    if (drag) {\n                        drag._removeTooltip();\n                    }\n                }, 300);\n            },\n            _clearTooltipTimeout: function () {\n                var that = this;\n                window.clearTimeout(this._tooltipTimeout);\n                var drag = that._drag || that._activeHandleDrag;\n                if (drag && drag.tooltipDiv) {\n                    drag.tooltipDiv.stop(true, false).css('opacity', 1);\n                }\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._form = form.on('reset', proxy(that._formResetHandler, that));\n                }\n            },\n            min: function (value) {\n                if (!value) {\n                    return this.options.min;\n                }\n                this.setOptions({ 'min': value });\n            },\n            max: function (value) {\n                if (!value) {\n                    return this.options.max;\n                }\n                this.setOptions({ 'max': value });\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                this._sliderItemsInit();\n                this._refresh();\n            },\n            destroy: function () {\n                if (this._form) {\n                    this._form.off('reset', this._formResetHandler);\n                }\n                Widget.fn.destroy.call(this);\n            }\n        });\n        function createWrapper(options, element, isHorizontal) {\n            var orientationCssClass = isHorizontal ? ' k-slider-horizontal' : ' k-slider-vertical', style = options.style ? options.style : element.attr('style'), cssClasses = element.attr('class') ? ' ' + element.attr('class') : '', tickPlacementCssClass = '';\n            if (options.tickPlacement == 'bottomRight') {\n                tickPlacementCssClass = ' k-slider-bottomright';\n            } else if (options.tickPlacement == 'topLeft') {\n                tickPlacementCssClass = ' k-slider-topleft';\n            }\n            style = style ? ' style=\\'' + style + '\\'' : '';\n            return '<div class=\\'k-widget k-slider' + orientationCssClass + cssClasses + '\\'' + style + '>' + '<div class=\\'k-slider-wrap' + (options.showButtons ? ' k-slider-buttons' : '') + tickPlacementCssClass + '\\'></div></div>';\n        }\n        function createButton(options, type, isHorizontal, isRtl) {\n            var buttonCssClass = '';\n            if (isHorizontal) {\n                if (!isRtl && type == 'increase' || isRtl && type != 'increase') {\n                    buttonCssClass = 'k-i-arrow-60-right';\n                } else {\n                    buttonCssClass = 'k-i-arrow-60-left';\n                }\n            } else {\n                if (type == 'increase') {\n                    buttonCssClass = 'k-i-arrow-60-up';\n                } else {\n                    buttonCssClass = 'k-i-arrow-60-down';\n                }\n            }\n            return '<a class=\\'k-button k-button-' + type + '\\' ' + 'title=\\'' + options[type + 'ButtonTitle'] + '\\' ' + 'aria-label=\\'' + options[type + 'ButtonTitle'] + '\\'>' + '<span class=\\'k-icon ' + buttonCssClass + '\\'></span></a>';\n        }\n        function createSliderItems(options, distance) {\n            var result = '<ul class=\\'k-reset k-slider-items\\'>', count = math.floor(round(distance / options.smallStep)) + 1, i;\n            for (i = 0; i < count; i++) {\n                result += '<li class=\\'k-tick\\' role=\\'presentation\\'>&nbsp;</li>';\n            }\n            result += '</ul>';\n            return result;\n        }\n        function createTrack(options, element) {\n            var dragHandleCount = element.is('input') ? 1 : 2, firstDragHandleTitle = dragHandleCount == 2 ? options.leftDragHandleTitle : options.dragHandleTitle;\n            return '<div class=\\'k-slider-track\\'><div class=\\'k-slider-selection\\'><!-- --></div>' + '<a href=\\'#\\' class=\\'k-draghandle\\' title=\\'' + firstDragHandleTitle + '\\' role=\\'slider\\' aria-valuemin=\\'' + options.min + '\\' aria-valuemax=\\'' + options.max + '\\' aria-valuenow=\\'' + (dragHandleCount > 1 ? options.selectionStart || options.min : options.value || options.min) + '\\'></a>' + (dragHandleCount > 1 ? '<a href=\\'#\\' class=\\'k-draghandle\\' title=\\'' + options.rightDragHandleTitle + '\\'role=\\'slider\\' aria-valuemin=\\'' + options.min + '\\' aria-valuemax=\\'' + options.max + '\\' aria-valuenow=\\'' + (options.selectionEnd || options.max) + '\\'></a>' : '') + '</div>';\n        }\n        function step(stepValue) {\n            return function (value) {\n                return value + stepValue;\n            };\n        }\n        function setValue(value) {\n            return function () {\n                return value;\n            };\n        }\n        function formatValue(value) {\n            return (value + '').replace('.', kendo.cultures.current.numberFormat['.']);\n        }\n        function calculatePrecision(value) {\n            var number = value.toString();\n            var precision = 0;\n            number = number.split('.');\n            if (number[1]) {\n                precision = number[1].length;\n            }\n            precision = precision > 10 ? 10 : precision;\n            return precision;\n        }\n        function round(value) {\n            var precision, power;\n            value = parseFloat(value, 10);\n            precision = calculatePrecision(value);\n            power = math.pow(10, precision || 0);\n            return math.round(value * power) / power;\n        }\n        function parseAttr(element, name) {\n            var value = parse(element.getAttribute(name));\n            if (value === null) {\n                value = undefined;\n            }\n            return value;\n        }\n        function defined(value) {\n            return typeof value !== UNDEFINED;\n        }\n        function removeFraction(value) {\n            return value * 10000;\n        }\n        var Slider = SliderBase.extend({\n            init: function (element, options) {\n                var that = this, dragHandle;\n                element.type = 'text';\n                options = extend({}, {\n                    value: parseAttr(element, 'value'),\n                    min: parseAttr(element, 'min'),\n                    max: parseAttr(element, 'max'),\n                    smallStep: parseAttr(element, 'step')\n                }, options);\n                element = $(element);\n                if (options && options.enabled === undefined) {\n                    options.enabled = !element.is('[disabled]');\n                }\n                SliderBase.fn.init.call(that, element, options);\n                options = that.options;\n                if (!defined(options.value) || options.value === null) {\n                    options.value = options.min;\n                    element.prop('value', formatValue(options.min));\n                }\n                options.value = math.max(math.min(options.value, options.max), options.min);\n                dragHandle = that.wrapper.find(DRAG_HANDLE);\n                this._selection = new Slider.Selection(dragHandle, that, options);\n                that._drag = new Slider.Drag(dragHandle, '', that, options);\n            },\n            options: {\n                name: 'Slider',\n                showButtons: true,\n                increaseButtonTitle: 'Increase',\n                decreaseButtonTitle: 'Decrease',\n                dragHandleTitle: 'drag',\n                tooltip: { format: '{0:#,#.##}' },\n                value: null\n            },\n            enable: function (enable) {\n                var that = this, options = that.options, clickHandler, move;\n                that.disable();\n                if (enable === false) {\n                    return;\n                }\n                that.wrapper.removeClass(STATE_DISABLED).addClass(STATE_DEFAULT);\n                that.wrapper.find('input').removeAttr(DISABLED);\n                clickHandler = function (e) {\n                    var touch = getTouches(e)[0];\n                    if (!touch) {\n                        return;\n                    }\n                    var mousePosition = that._isHorizontal ? touch.location.pageX : touch.location.pageY, dragableArea = that._getDraggableArea(), target = $(e.target);\n                    if (target.hasClass('k-draghandle')) {\n                        target.addClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                        return;\n                    }\n                    that._update(that._getValueFromPosition(mousePosition, dragableArea));\n                    that._focusWithMouse(e.target);\n                    that._drag.dragstart(e);\n                    e.preventDefault();\n                };\n                that.wrapper.find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).on(TRACK_MOUSE_DOWN, clickHandler).end().on(TRACK_MOUSE_DOWN, function () {\n                    $(document.documentElement).one('selectstart', kendo.preventDefault);\n                }).on(TRACK_MOUSE_UP, function () {\n                    that._drag._end();\n                });\n                that.wrapper.find(DRAG_HANDLE).attr(TABINDEX, 0).on(MOUSE_UP, function () {\n                    that._setTooltipTimeout();\n                }).on(CLICK, function (e) {\n                    that._focusWithMouse(e.target);\n                    e.preventDefault();\n                }).on(FOCUS, proxy(that._focus, that)).on(BLUR, proxy(that._blur, that));\n                move = proxy(function (sign) {\n                    var newVal = that._nextValueByIndex(that._valueIndex + sign * 1);\n                    that._setValueInRange(newVal);\n                    that._drag._updateTooltip(newVal);\n                }, that);\n                if (options.showButtons) {\n                    var mouseDownHandler = proxy(function (e, sign) {\n                        this._clearTooltipTimeout();\n                        if (e.which === 1 || support.touch && e.which === 0) {\n                            move(sign);\n                            this.timeout = setTimeout(proxy(function () {\n                                this.timer = setInterval(function () {\n                                    move(sign);\n                                }, 60);\n                            }, this), 200);\n                        }\n                    }, that);\n                    that.wrapper.find('.k-button').on(MOUSE_UP, proxy(function (e) {\n                        this._clearTimer();\n                        that._focusWithMouse(e.target);\n                    }, that)).on(MOUSE_OVER, function (e) {\n                        $(e.currentTarget).addClass('k-state-hover');\n                    }).on('mouseout' + NS, proxy(function (e) {\n                        $(e.currentTarget).removeClass('k-state-hover');\n                        this._clearTimer();\n                    }, that)).eq(0).on(MOUSE_DOWN, proxy(function (e) {\n                        mouseDownHandler(e, 1);\n                    }, that)).click(false).end().eq(1).on(MOUSE_DOWN, proxy(function (e) {\n                        mouseDownHandler(e, -1);\n                    }, that)).click(kendo.preventDefault);\n                }\n                that.wrapper.find(DRAG_HANDLE).off(KEY_DOWN, false).on(KEY_DOWN, proxy(this._keydown, that));\n                options.enabled = true;\n            },\n            disable: function () {\n                var that = this;\n                that.wrapper.removeClass(STATE_DEFAULT).addClass(STATE_DISABLED);\n                $(that.element).prop(DISABLED, DISABLED);\n                that.wrapper.find('.k-button').off(MOUSE_DOWN).on(MOUSE_DOWN, function (e) {\n                    e.preventDefault();\n                    $(this).addClass('k-state-active');\n                }).off(MOUSE_UP).on(MOUSE_UP, function (e) {\n                    e.preventDefault();\n                    $(this).removeClass('k-state-active');\n                }).off('mouseleave' + NS).on('mouseleave' + NS, kendo.preventDefault).off(MOUSE_OVER).on(MOUSE_OVER, kendo.preventDefault);\n                that.wrapper.find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).off(TRACK_MOUSE_DOWN).off(TRACK_MOUSE_UP);\n                that.wrapper.find(DRAG_HANDLE).attr(TABINDEX, -1).off(MOUSE_UP).off(KEY_DOWN).off(CLICK).off(FOCUS).off(BLUR);\n                that.options.enabled = false;\n            },\n            _update: function (val) {\n                var that = this, change = that.value() != val;\n                that.value(val);\n                if (change) {\n                    that.trigger(CHANGE, { value: that.options.value });\n                }\n            },\n            value: function (value) {\n                var that = this, options = that.options;\n                value = round(value);\n                if (isNaN(value)) {\n                    return options.value;\n                }\n                if (value >= options.min && value <= options.max) {\n                    if (options.value != value) {\n                        that.element.prop('value', formatValue(value));\n                        options.value = value;\n                        that._refreshAriaAttr(value);\n                        that._refresh();\n                    }\n                }\n            },\n            _refresh: function () {\n                this.trigger(MOVE_SELECTION, { value: this.options.value });\n            },\n            _refreshAriaAttr: function (value) {\n                var that = this, drag = that._drag, formattedValue;\n                if (drag && drag._tooltipDiv) {\n                    formattedValue = drag._tooltipDiv.text();\n                } else {\n                    formattedValue = that._getFormattedValue(value, null);\n                }\n                this.wrapper.find(DRAG_HANDLE).attr('aria-valuenow', value).attr('aria-valuetext', formattedValue);\n            },\n            _clearTimer: function () {\n                clearTimeout(this.timeout);\n                clearInterval(this.timer);\n            },\n            _keydown: function (e) {\n                var that = this;\n                if (e.keyCode in that._keyMap) {\n                    that._clearTooltipTimeout();\n                    that._setValueInRange(that._keyMap[e.keyCode](that.options.value));\n                    that._drag._updateTooltip(that.value());\n                    e.preventDefault();\n                }\n            },\n            _setValueInRange: function (val) {\n                var that = this, options = that.options;\n                val = round(val);\n                if (isNaN(val)) {\n                    that._update(options.min);\n                    return;\n                }\n                val = math.max(math.min(val, options.max), options.min);\n                that._update(val);\n            },\n            _nextValueByIndex: function (index) {\n                var count = this._values.length;\n                if (this._isRtl) {\n                    index = count - 1 - index;\n                }\n                return this._values[math.max(0, math.min(index, count - 1))];\n            },\n            _formResetHandler: function () {\n                var that = this, min = that.options.min;\n                setTimeout(function () {\n                    var value = that.element[0].value;\n                    that.value(value === '' || isNaN(value) ? min : value);\n                });\n            },\n            destroy: function () {\n                var that = this;\n                SliderBase.fn.destroy.call(that);\n                that.wrapper.off(NS).find('.k-button').off(NS).end().find(DRAG_HANDLE).off(NS).end().find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).off(NS).end();\n                that._drag.draggable.destroy();\n                that._drag._removeTooltip(true);\n            }\n        });\n        Slider.Selection = function (dragHandle, that, options) {\n            function moveSelection(val) {\n                var selectionValue = val - options.min, index = that._valueIndex = math.ceil(round(selectionValue / options.smallStep)), selection = parseInt(that._pixelSteps[index], 10), selectionDiv = that._trackDiv.find('.k-slider-selection'), halfDragHanndle = parseInt(that._outerSize(dragHandle) / 2, 10), rtlCorrection = that._isRtl ? 2 : 0;\n                selectionDiv[that._sizeFn](that._isRtl ? that._maxSelection - selection : selection);\n                dragHandle.css(that._position, selection - halfDragHanndle - rtlCorrection);\n            }\n            moveSelection(options.value);\n            that.bind([\n                SLIDE,\n                MOVE_SELECTION\n            ], function (e) {\n                moveSelection(parseFloat(e.value, 10));\n            });\n            that.bind(CHANGE, function (e) {\n                moveSelection(parseFloat(e.sender.value(), 10));\n            });\n        };\n        Slider.Drag = function (element, type, owner, options) {\n            var that = this;\n            that.owner = owner;\n            that.options = options;\n            that.element = element;\n            that.type = type;\n            that.draggable = new Draggable(element, {\n                distance: 0,\n                dragstart: proxy(that._dragstart, that),\n                drag: proxy(that.drag, that),\n                dragend: proxy(that.dragend, that),\n                dragcancel: proxy(that.dragcancel, that)\n            });\n            element.click(false);\n            element.on('dragstart', function (e) {\n                e.preventDefault();\n            });\n        };\n        Slider.Drag.prototype = {\n            dragstart: function (e) {\n                this.owner._activeDragHandle = this;\n                this.draggable.userEvents.cancel();\n                this._dragstart(e);\n                this.dragend();\n            },\n            _dragstart: function (e) {\n                var that = this, owner = that.owner, options = that.options;\n                if (!options.enabled) {\n                    e.preventDefault();\n                    return;\n                }\n                this.owner._activeDragHandle = this;\n                owner.element.off(MOUSE_OVER);\n                owner.wrapper.find('.' + STATE_FOCUSED).removeClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                that.element.addClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                $(document.documentElement).css('cursor', 'pointer');\n                that.dragableArea = owner._getDraggableArea();\n                that.step = math.max(options.smallStep * (owner._maxSelection / owner._distance()), 0);\n                if (that.type) {\n                    that.selectionStart = options.selectionStart;\n                    that.selectionEnd = options.selectionEnd;\n                    owner._setZIndex(that.type);\n                } else {\n                    that.oldVal = that.val = options.value;\n                }\n                that._removeTooltip(true);\n                that._createTooltip();\n            },\n            _createTooltip: function () {\n                var that = this, owner = that.owner, tooltip = that.options.tooltip, html = '', wnd = $(window), tooltipTemplate, colloutCssClass;\n                if (!tooltip.enabled) {\n                    return;\n                }\n                if (tooltip.template) {\n                    tooltipTemplate = that.tooltipTemplate = kendo.template(tooltip.template);\n                }\n                $('.k-slider-tooltip').remove();\n                that.tooltipDiv = $('<div class=\\'k-widget k-tooltip k-slider-tooltip\\'><!-- --></div>').appendTo(document.body);\n                html = owner._getFormattedValue(that.val || owner.value(), that);\n                if (!that.type) {\n                    colloutCssClass = 'k-callout-' + (owner._isHorizontal ? 's' : 'e');\n                    that.tooltipInnerDiv = '<div class=\\'k-callout ' + colloutCssClass + '\\'><!-- --></div>';\n                    html += that.tooltipInnerDiv;\n                }\n                that.tooltipDiv.html(html);\n                that._scrollOffset = {\n                    top: wnd.scrollTop(),\n                    left: wnd.scrollLeft()\n                };\n                that.moveTooltip();\n            },\n            drag: function (e) {\n                var that = this, owner = that.owner, x = e.x.location, y = e.y.location, startPoint = that.dragableArea.startPoint, endPoint = that.dragableArea.endPoint, slideParams;\n                e.preventDefault();\n                if (owner._isHorizontal) {\n                    if (owner._isRtl) {\n                        that.val = that.constrainValue(x, startPoint, endPoint, x < endPoint);\n                    } else {\n                        that.val = that.constrainValue(x, startPoint, endPoint, x >= endPoint);\n                    }\n                } else {\n                    that.val = that.constrainValue(y, endPoint, startPoint, y <= endPoint);\n                }\n                if (that.oldVal != that.val) {\n                    that.oldVal = that.val;\n                    if (that.type) {\n                        if (that.type == 'firstHandle') {\n                            if (that.val < that.selectionEnd) {\n                                that.selectionStart = that.val;\n                            } else {\n                                that.selectionStart = that.selectionEnd = that.val;\n                            }\n                        } else {\n                            if (that.val > that.selectionStart) {\n                                that.selectionEnd = that.val;\n                            } else {\n                                that.selectionStart = that.selectionEnd = that.val;\n                            }\n                        }\n                        slideParams = {\n                            values: [\n                                that.selectionStart,\n                                that.selectionEnd\n                            ],\n                            value: [\n                                that.selectionStart,\n                                that.selectionEnd\n                            ]\n                        };\n                    } else {\n                        slideParams = { value: that.val };\n                    }\n                    owner.trigger(SLIDE, slideParams);\n                }\n                that._updateTooltip(that.val);\n            },\n            _updateTooltip: function (val) {\n                var that = this, options = that.options, tooltip = options.tooltip, html = '';\n                if (!tooltip.enabled) {\n                    return;\n                }\n                if (!that.tooltipDiv) {\n                    that._createTooltip();\n                }\n                html = that.owner._getFormattedValue(round(val), that);\n                if (!that.type) {\n                    html += that.tooltipInnerDiv;\n                }\n                that.tooltipDiv.html(html);\n                that.moveTooltip();\n            },\n            dragcancel: function () {\n                this.owner._refresh();\n                $(document.documentElement).css('cursor', '');\n                return this._end();\n            },\n            dragend: function () {\n                var that = this, owner = that.owner;\n                $(document.documentElement).css('cursor', '');\n                if (that.type) {\n                    owner._update(that.selectionStart, that.selectionEnd);\n                } else {\n                    owner._update(that.val);\n                    that.draggable.userEvents._disposeAll();\n                }\n                that.draggable.userEvents.cancel();\n                return that._end();\n            },\n            _end: function () {\n                var that = this, owner = that.owner;\n                owner._focusWithMouse(that.element);\n                owner.element.on(MOUSE_OVER);\n                return false;\n            },\n            _removeTooltip: function (noAnimation) {\n                var that = this, owner = that.owner;\n                if (that.tooltipDiv && owner.options.tooltip.enabled && owner.options.enabled) {\n                    if (noAnimation) {\n                        that.tooltipDiv.remove();\n                        that.tooltipDiv = null;\n                    } else {\n                        that.tooltipDiv.fadeOut('slow', function () {\n                            $(this).remove();\n                            that.tooltipDiv = null;\n                        });\n                    }\n                }\n            },\n            moveTooltip: function () {\n                var that = this, owner = that.owner, top = 0, left = 0, element = that.element, offset = kendo.getOffset(element), margin = 8, viewport = $(window), callout = that.tooltipDiv.find('.k-callout'), width = outerWidth(that.tooltipDiv), height = outerHeight(that.tooltipDiv), dragHandles, sdhOffset, diff, anchorSize;\n                if (that.type) {\n                    dragHandles = owner.wrapper.find(DRAG_HANDLE);\n                    offset = kendo.getOffset(dragHandles.eq(0));\n                    sdhOffset = kendo.getOffset(dragHandles.eq(1));\n                    if (owner._isHorizontal) {\n                        top = sdhOffset.top;\n                        left = offset.left + (sdhOffset.left - offset.left) / 2;\n                    } else {\n                        top = offset.top + (sdhOffset.top - offset.top) / 2;\n                        left = sdhOffset.left;\n                    }\n                    anchorSize = outerWidth(dragHandles.eq(0)) + 2 * margin;\n                } else {\n                    top = offset.top;\n                    left = offset.left;\n                    anchorSize = outerWidth(element) + 2 * margin;\n                }\n                if (owner._isHorizontal) {\n                    left -= parseInt((width - owner._outerSize(element)) / 2, 10);\n                    top -= height + margin + (callout.length ? callout.height() : 0);\n                } else {\n                    top -= parseInt((height - owner._outerSize(element)) / 2, 10);\n                    left -= width + margin + (callout.length ? callout.width() : 0);\n                }\n                if (owner._isHorizontal) {\n                    diff = that._flip(top, height, anchorSize, outerHeight(viewport) + that._scrollOffset.top);\n                    top += diff;\n                    left += that._fit(left, width, outerWidth(viewport) + that._scrollOffset.left);\n                } else {\n                    diff = that._flip(left, width, anchorSize, outerWidth(viewport) + that._scrollOffset.left);\n                    top += that._fit(top, height, outerHeight(viewport) + that._scrollOffset.top);\n                    left += diff;\n                }\n                if (diff > 0 && callout) {\n                    callout.removeClass();\n                    callout.addClass('k-callout k-callout-' + (owner._isHorizontal ? 'n' : 'w'));\n                }\n                that.tooltipDiv.css({\n                    top: top,\n                    left: left\n                });\n            },\n            _fit: function (position, size, viewPortEnd) {\n                var output = 0;\n                if (position + size > viewPortEnd) {\n                    output = viewPortEnd - (position + size);\n                }\n                if (position < 0) {\n                    output = -position;\n                }\n                return output;\n            },\n            _flip: function (offset, size, anchorSize, viewPortEnd) {\n                var output = 0;\n                if (offset + size > viewPortEnd) {\n                    output += -(anchorSize + size);\n                }\n                if (offset + output < 0) {\n                    output += anchorSize + size;\n                }\n                return output;\n            },\n            constrainValue: function (position, min, max, maxOverflow) {\n                var that = this, val = 0;\n                if (min < position && position < max) {\n                    val = that.owner._getValueFromPosition(position, that.dragableArea);\n                } else {\n                    if (maxOverflow) {\n                        val = that.options.max;\n                    } else {\n                        val = that.options.min;\n                    }\n                }\n                return val;\n            }\n        };\n        kendo.ui.plugin(Slider);\n        var RangeSlider = SliderBase.extend({\n            init: function (element, options) {\n                var that = this, inputs = $(element).find('input'), firstInput = inputs.eq(0)[0], secondInput = inputs.eq(1)[0];\n                firstInput.type = 'text';\n                secondInput.type = 'text';\n                if (options && options.showButtons) {\n                    if (window.console) {\n                        window.console.warn('showbuttons option is not supported for the range slider, ignoring');\n                    }\n                    options.showButtons = false;\n                }\n                options = extend({}, {\n                    selectionStart: parseAttr(firstInput, 'value'),\n                    min: parseAttr(firstInput, 'min'),\n                    max: parseAttr(firstInput, 'max'),\n                    smallStep: parseAttr(firstInput, 'step')\n                }, {\n                    selectionEnd: parseAttr(secondInput, 'value'),\n                    min: parseAttr(secondInput, 'min'),\n                    max: parseAttr(secondInput, 'max'),\n                    smallStep: parseAttr(secondInput, 'step')\n                }, options);\n                if (options && options.enabled === undefined) {\n                    options.enabled = !inputs.is('[disabled]');\n                }\n                SliderBase.fn.init.call(that, element, options);\n                options = that.options;\n                if (!defined(options.selectionStart) || options.selectionStart === null) {\n                    options.selectionStart = options.min;\n                    inputs.eq(0).prop('value', formatValue(options.min));\n                }\n                if (!defined(options.selectionEnd) || options.selectionEnd === null) {\n                    options.selectionEnd = options.max;\n                    inputs.eq(1).prop('value', formatValue(options.max));\n                }\n                var dragHandles = that.wrapper.find(DRAG_HANDLE);\n                this._selection = new RangeSlider.Selection(dragHandles, that, options);\n                that._firstHandleDrag = new Slider.Drag(dragHandles.eq(0), 'firstHandle', that, options);\n                that._lastHandleDrag = new Slider.Drag(dragHandles.eq(1), 'lastHandle', that, options);\n            },\n            options: {\n                name: 'RangeSlider',\n                leftDragHandleTitle: 'drag',\n                rightDragHandleTitle: 'drag',\n                tooltip: { format: '{0:#,#.##}' },\n                selectionStart: null,\n                selectionEnd: null\n            },\n            enable: function (enable) {\n                var that = this, options = that.options, clickHandler;\n                that.disable();\n                if (enable === false) {\n                    return;\n                }\n                that.wrapper.removeClass(STATE_DISABLED).addClass(STATE_DEFAULT);\n                that.wrapper.find('input').removeAttr(DISABLED);\n                clickHandler = function (e) {\n                    var touch = getTouches(e)[0];\n                    if (!touch) {\n                        return;\n                    }\n                    var mousePosition = that._isHorizontal ? touch.location.pageX : touch.location.pageY, dragableArea = that._getDraggableArea(), val = that._getValueFromPosition(mousePosition, dragableArea), target = $(e.target), from, to, drag;\n                    if (target.hasClass('k-draghandle')) {\n                        that.wrapper.find('.' + STATE_FOCUSED).removeClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                        target.addClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                        return;\n                    }\n                    if (val < options.selectionStart) {\n                        from = val;\n                        to = options.selectionEnd;\n                        drag = that._firstHandleDrag;\n                    } else if (val > that.selectionEnd) {\n                        from = options.selectionStart;\n                        to = val;\n                        drag = that._lastHandleDrag;\n                    } else {\n                        if (val - options.selectionStart <= options.selectionEnd - val) {\n                            from = val;\n                            to = options.selectionEnd;\n                            drag = that._firstHandleDrag;\n                        } else {\n                            from = options.selectionStart;\n                            to = val;\n                            drag = that._lastHandleDrag;\n                        }\n                    }\n                    drag.dragstart(e);\n                    that._setValueInRange(from, to);\n                    that._focusWithMouse(drag.element);\n                };\n                that.wrapper.find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).on(TRACK_MOUSE_DOWN, clickHandler).end().on(TRACK_MOUSE_DOWN, function () {\n                    $(document.documentElement).one('selectstart', kendo.preventDefault);\n                }).on(TRACK_MOUSE_UP, function () {\n                    if (that._activeDragHandle) {\n                        that._activeDragHandle._end();\n                    }\n                });\n                that.wrapper.find(DRAG_HANDLE).attr(TABINDEX, 0).on(MOUSE_UP, function () {\n                    that._setTooltipTimeout();\n                }).on(CLICK, function (e) {\n                    that._focusWithMouse(e.target);\n                    e.preventDefault();\n                }).on(FOCUS, proxy(that._focus, that)).on(BLUR, proxy(that._blur, that));\n                that.wrapper.find(DRAG_HANDLE).off(KEY_DOWN, kendo.preventDefault).eq(0).on(KEY_DOWN, proxy(function (e) {\n                    this._keydown(e, 'firstHandle');\n                }, that)).end().eq(1).on(KEY_DOWN, proxy(function (e) {\n                    this._keydown(e, 'lastHandle');\n                }, that));\n                that.options.enabled = true;\n            },\n            disable: function () {\n                var that = this;\n                that.wrapper.removeClass(STATE_DEFAULT).addClass(STATE_DISABLED);\n                that.wrapper.find('input').prop(DISABLED, DISABLED);\n                that.wrapper.find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).off(TRACK_MOUSE_DOWN).off(TRACK_MOUSE_UP);\n                that.wrapper.find(DRAG_HANDLE).attr(TABINDEX, -1).off(MOUSE_UP).off(KEY_DOWN).off(CLICK).off(FOCUS).off(BLUR);\n                that.options.enabled = false;\n            },\n            _keydown: function (e, handle) {\n                var that = this, selectionStartValue = that.options.selectionStart, selectionEndValue = that.options.selectionEnd, dragSelectionStart, dragSelectionEnd, activeHandleDrag;\n                if (e.keyCode in that._keyMap) {\n                    that._clearTooltipTimeout();\n                    if (handle == 'firstHandle') {\n                        activeHandleDrag = that._activeHandleDrag = that._firstHandleDrag;\n                        selectionStartValue = that._keyMap[e.keyCode](selectionStartValue);\n                        if (selectionStartValue > selectionEndValue) {\n                            selectionEndValue = selectionStartValue;\n                        }\n                    } else {\n                        activeHandleDrag = that._activeHandleDrag = that._lastHandleDrag;\n                        selectionEndValue = that._keyMap[e.keyCode](selectionEndValue);\n                        if (selectionStartValue > selectionEndValue) {\n                            selectionStartValue = selectionEndValue;\n                        }\n                    }\n                    that._setValueInRange(round(selectionStartValue), round(selectionEndValue));\n                    dragSelectionStart = Math.max(selectionStartValue, that.options.selectionStart);\n                    dragSelectionEnd = Math.min(selectionEndValue, that.options.selectionEnd);\n                    activeHandleDrag.selectionEnd = Math.max(dragSelectionEnd, that.options.selectionStart);\n                    activeHandleDrag.selectionStart = Math.min(dragSelectionStart, that.options.selectionEnd);\n                    activeHandleDrag._updateTooltip(that.value()[that._activeHandle]);\n                    e.preventDefault();\n                }\n            },\n            _update: function (selectionStart, selectionEnd) {\n                var that = this, values = that.value();\n                var change = values[0] != selectionStart || values[1] != selectionEnd;\n                that.value([\n                    selectionStart,\n                    selectionEnd\n                ]);\n                if (change) {\n                    that.trigger(CHANGE, {\n                        values: [\n                            selectionStart,\n                            selectionEnd\n                        ],\n                        value: [\n                            selectionStart,\n                            selectionEnd\n                        ]\n                    });\n                }\n            },\n            value: function (value) {\n                if (value && value.length) {\n                    return this._value(value[0], value[1]);\n                } else {\n                    return this._value();\n                }\n            },\n            _value: function (start, end) {\n                var that = this, options = that.options, selectionStart = options.selectionStart, selectionEnd = options.selectionEnd;\n                if (isNaN(start) && isNaN(end)) {\n                    return [\n                        selectionStart,\n                        selectionEnd\n                    ];\n                } else {\n                    start = round(start);\n                    end = round(end);\n                }\n                if (start >= options.min && start <= options.max && end >= options.min && end <= options.max && start <= end) {\n                    if (selectionStart != start || selectionEnd != end) {\n                        that.element.find('input').eq(0).prop('value', formatValue(start)).end().eq(1).prop('value', formatValue(end));\n                        options.selectionStart = start;\n                        options.selectionEnd = end;\n                        that._refresh();\n                        that._refreshAriaAttr(start, end);\n                    }\n                }\n            },\n            values: function (start, end) {\n                if (isArray(start)) {\n                    return this._value(start[0], start[1]);\n                } else {\n                    return this._value(start, end);\n                }\n            },\n            _refresh: function () {\n                var that = this, options = that.options;\n                that.trigger(MOVE_SELECTION, {\n                    values: [\n                        options.selectionStart,\n                        options.selectionEnd\n                    ],\n                    value: [\n                        options.selectionStart,\n                        options.selectionEnd\n                    ]\n                });\n                if (options.selectionStart == options.max && options.selectionEnd == options.max) {\n                    that._setZIndex('firstHandle');\n                }\n            },\n            _refreshAriaAttr: function (start, end) {\n                var that = this, dragHandles = that.wrapper.find(DRAG_HANDLE), drag = that._activeHandleDrag, formattedValue;\n                formattedValue = that._getFormattedValue([\n                    start,\n                    end\n                ], drag);\n                dragHandles.eq(0).attr('aria-valuenow', start);\n                dragHandles.eq(1).attr('aria-valuenow', end);\n                dragHandles.attr('aria-valuetext', formattedValue);\n            },\n            _setValueInRange: function (selectionStart, selectionEnd) {\n                var options = this.options;\n                selectionStart = math.max(math.min(selectionStart, options.max), options.min);\n                selectionEnd = math.max(math.min(selectionEnd, options.max), options.min);\n                if (selectionStart == options.max && selectionEnd == options.max) {\n                    this._setZIndex('firstHandle');\n                }\n                this._update(math.min(selectionStart, selectionEnd), math.max(selectionStart, selectionEnd));\n            },\n            _setZIndex: function (type) {\n                this.wrapper.find(DRAG_HANDLE).each(function (index) {\n                    $(this).css('z-index', type == 'firstHandle' ? 1 - index : index);\n                });\n            },\n            _formResetHandler: function () {\n                var that = this, options = that.options;\n                setTimeout(function () {\n                    var inputs = that.element.find('input');\n                    var start = inputs[0].value;\n                    var end = inputs[1].value;\n                    that.values(start === '' || isNaN(start) ? options.min : start, end === '' || isNaN(end) ? options.max : end);\n                });\n            },\n            destroy: function () {\n                var that = this;\n                SliderBase.fn.destroy.call(that);\n                that.wrapper.off(NS).find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).off(NS).end().find(DRAG_HANDLE).off(NS);\n                that._firstHandleDrag.draggable.destroy();\n                that._lastHandleDrag.draggable.destroy();\n            }\n        });\n        RangeSlider.Selection = function (dragHandles, that, options) {\n            function moveSelection(value) {\n                value = value || [];\n                var selectionStartValue = value[0] - options.min, selectionEndValue = value[1] - options.min, selectionStartIndex = math.ceil(round(selectionStartValue / options.smallStep)), selectionEndIndex = math.ceil(round(selectionEndValue / options.smallStep)), selectionStart = that._pixelSteps[selectionStartIndex], selectionEnd = that._pixelSteps[selectionEndIndex], halfHandle = parseInt(that._outerSize(dragHandles.eq(0)) / 2, 10), rtlCorrection = that._isRtl ? 2 : 0;\n                dragHandles.eq(0).css(that._position, selectionStart - halfHandle - rtlCorrection).end().eq(1).css(that._position, selectionEnd - halfHandle - rtlCorrection);\n                makeSelection(selectionStart, selectionEnd);\n            }\n            function makeSelection(selectionStart, selectionEnd) {\n                var selection, selectionPosition, selectionDiv = that._trackDiv.find('.k-slider-selection');\n                selection = math.abs(selectionStart - selectionEnd);\n                selectionDiv[that._sizeFn](selection);\n                if (that._isRtl) {\n                    selectionPosition = math.max(selectionStart, selectionEnd);\n                    selectionDiv.css('right', that._maxSelection - selectionPosition - 1);\n                } else {\n                    selectionPosition = math.min(selectionStart, selectionEnd);\n                    selectionDiv.css(that._position, selectionPosition - 1);\n                }\n            }\n            moveSelection(that.value());\n            that.bind([\n                CHANGE,\n                SLIDE,\n                MOVE_SELECTION\n            ], function (e) {\n                moveSelection(e.values);\n            });\n        };\n        kendo.ui.plugin(RangeSlider);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.colorpicker', [\n        'kendo.core',\n        'kendo.color',\n        'kendo.popup',\n        'kendo.slider',\n        'kendo.userevents',\n        'kendo.button'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'colorpicker',\n        name: 'Color tools',\n        category: 'web',\n        description: 'Color selection widgets',\n        depends: [\n            'core',\n            'color',\n            'popup',\n            'slider',\n            'userevents',\n            'button'\n        ]\n    };\n    (function ($, parseInt, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, parseColor = kendo.parseColor, Color = kendo.Color, KEYS = kendo.keys, BACKGROUNDCOLOR = 'background-color', ITEMSELECTEDCLASS = 'k-state-selected', SIMPLEPALETTE = '000000,7f7f7f,880015,ed1c24,ff7f27,fff200,22b14c,00a2e8,3f48cc,a349a4,ffffff,c3c3c3,b97a57,ffaec9,ffc90e,efe4b0,b5e61d,99d9ea,7092be,c8bfe7', WEBPALETTE = 'FFFFFF,FFCCFF,FF99FF,FF66FF,FF33FF,FF00FF,CCFFFF,CCCCFF,CC99FF,CC66FF,CC33FF,CC00FF,99FFFF,99CCFF,9999FF,9966FF,9933FF,9900FF,FFFFCC,FFCCCC,FF99CC,FF66CC,FF33CC,FF00CC,CCFFCC,CCCCCC,CC99CC,CC66CC,CC33CC,CC00CC,99FFCC,99CCCC,9999CC,9966CC,9933CC,9900CC,FFFF99,FFCC99,FF9999,FF6699,FF3399,FF0099,CCFF99,CCCC99,CC9999,CC6699,CC3399,CC0099,99FF99,99CC99,999999,996699,993399,990099,FFFF66,FFCC66,FF9966,FF6666,FF3366,FF0066,CCFF66,CCCC66,CC9966,CC6666,CC3366,CC0066,99FF66,99CC66,999966,996666,993366,990066,FFFF33,FFCC33,FF9933,FF6633,FF3333,FF0033,CCFF33,CCCC33,CC9933,CC6633,CC3333,CC0033,99FF33,99CC33,999933,996633,993333,990033,FFFF00,FFCC00,FF9900,FF6600,FF3300,FF0000,CCFF00,CCCC00,CC9900,CC6600,CC3300,CC0000,99FF00,99CC00,999900,996600,993300,990000,66FFFF,66CCFF,6699FF,6666FF,6633FF,6600FF,33FFFF,33CCFF,3399FF,3366FF,3333FF,3300FF,00FFFF,00CCFF,0099FF,0066FF,0033FF,0000FF,66FFCC,66CCCC,6699CC,6666CC,6633CC,6600CC,33FFCC,33CCCC,3399CC,3366CC,3333CC,3300CC,00FFCC,00CCCC,0099CC,0066CC,0033CC,0000CC,66FF99,66CC99,669999,666699,663399,660099,33FF99,33CC99,339999,336699,333399,330099,00FF99,00CC99,009999,006699,003399,000099,66FF66,66CC66,669966,666666,663366,660066,33FF66,33CC66,339966,336666,333366,330066,00FF66,00CC66,009966,006666,003366,000066,66FF33,66CC33,669933,666633,663333,660033,33FF33,33CC33,339933,336633,333333,330033,00FF33,00CC33,009933,006633,003333,000033,66FF00,66CC00,669900,666600,663300,660000,33FF00,33CC00,339900,336600,333300,330000,00FF00,00CC00,009900,006600,003300,000000', WHITE = '#ffffff', MESSAGES = {\n                apply: 'Apply',\n                cancel: 'Cancel',\n                noColor: 'no color',\n                clearColor: 'Clear color',\n                previewInput: 'Color Hexadecimal Code'\n            }, NS = '.kendoColorTools', CLICK_NS = 'click' + NS, KEYDOWN_NS = 'keydown' + NS, DISABLED = 'k-state-disabled', browser = kendo.support.browser, isIE8 = browser.msie && browser.version < 9;\n        var ColorSelector = Widget.extend({\n            init: function (element, options) {\n                var that = this, ariaId;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                that._value = options.value = parseColor(options.value);\n                that._tabIndex = element.attr('tabIndex') || 0;\n                ariaId = that._ariaId = options.ariaId;\n                if (ariaId) {\n                    element.attr('aria-labelledby', ariaId);\n                }\n                if (options._standalone) {\n                    that._triggerSelect = that._triggerChange;\n                }\n            },\n            options: {\n                name: 'ColorSelector',\n                value: null,\n                _standalone: true\n            },\n            events: [\n                'change',\n                'select',\n                'cancel'\n            ],\n            color: function (value) {\n                if (value !== undefined) {\n                    this._value = parseColor(value);\n                    this._updateUI(this._value);\n                }\n                return this._value;\n            },\n            value: function (color) {\n                color = this.color(color);\n                if (color) {\n                    if (this.options.opacity) {\n                        color = color.toCssRgba();\n                    } else {\n                        color = color.toCss();\n                    }\n                }\n                return color || null;\n            },\n            enable: function (enable) {\n                if (arguments.length === 0) {\n                    enable = true;\n                }\n                this.wrapper.toggleClass(DISABLED, !enable);\n                this._onEnable(enable);\n            },\n            _select: function (color, nohooks) {\n                var prev = this._value;\n                color = this.color(color);\n                if (!nohooks) {\n                    this.element.trigger('change');\n                    if (!color.equals(prev)) {\n                        this.trigger('change', { value: this.value() });\n                    } else if (!this._standalone) {\n                        this.trigger('cancel');\n                    }\n                }\n            },\n            _triggerSelect: function (color) {\n                triggerEvent(this, 'select', color);\n            },\n            _triggerChange: function (color) {\n                triggerEvent(this, 'change', color);\n            },\n            destroy: function () {\n                if (this.element) {\n                    this.element.off(NS);\n                }\n                if (this.wrapper) {\n                    this.wrapper.off(NS).find('*').off(NS);\n                }\n                this.wrapper = null;\n                Widget.fn.destroy.call(this);\n            },\n            _updateUI: $.noop,\n            _selectOnHide: function () {\n                return null;\n            },\n            _cancel: function () {\n                this.trigger('cancel');\n            }\n        });\n        function triggerEvent(self, type, color) {\n            color = parseColor(color);\n            if (color && !color.equals(self.color())) {\n                if (type == 'change') {\n                    self._value = color;\n                }\n                if (color.a != 1) {\n                    color = color.toCssRgba();\n                } else {\n                    color = color.toCss();\n                }\n                self.trigger(type, { value: color });\n            }\n        }\n        var ColorPalette = ColorSelector.extend({\n            init: function (element, options) {\n                var that = this;\n                ColorSelector.fn.init.call(that, element, options);\n                element = that.wrapper = that.element;\n                options = that.options;\n                var colors = options.palette;\n                if (colors == 'websafe') {\n                    colors = WEBPALETTE;\n                    options.columns = 18;\n                } else if (colors == 'basic') {\n                    colors = SIMPLEPALETTE;\n                }\n                if (typeof colors == 'string') {\n                    colors = colors.split(',');\n                }\n                if ($.isArray(colors)) {\n                    colors = $.map(colors, function (x) {\n                        return parseColor(x);\n                    });\n                }\n                that._selectedID = (options.ariaId || kendo.guid()) + '_selected';\n                element.addClass('k-widget k-colorpalette').attr('role', 'grid').attr('aria-readonly', 'true').append($(that._template({\n                    colors: colors,\n                    columns: options.columns,\n                    tileSize: options.tileSize,\n                    value: that._value,\n                    id: options.ariaId\n                }))).on(CLICK_NS, '.k-item', function (ev) {\n                    that._select($(ev.currentTarget).css(BACKGROUNDCOLOR));\n                }).attr('tabIndex', that._tabIndex).on(KEYDOWN_NS, bind(that._keydown, that));\n                var tileSize = options.tileSize, width, height;\n                if (tileSize) {\n                    if (/number|string/.test(typeof tileSize)) {\n                        width = height = parseFloat(tileSize);\n                    } else if (typeof tileSize == 'object') {\n                        width = parseFloat(tileSize.width);\n                        height = parseFloat(tileSize.height);\n                    } else {\n                        throw new Error('Unsupported value for the \\'tileSize\\' argument');\n                    }\n                    element.find('.k-item').css({\n                        width: width,\n                        height: height\n                    });\n                }\n            },\n            focus: function () {\n                if (this.wrapper && !this.wrapper.is('[unselectable=\\'on\\']')) {\n                    this.wrapper.focus();\n                }\n            },\n            options: {\n                name: 'ColorPalette',\n                columns: 10,\n                tileSize: null,\n                palette: 'basic'\n            },\n            _onEnable: function (enable) {\n                if (enable) {\n                    this.wrapper.attr('tabIndex', this._tabIndex);\n                } else {\n                    this.wrapper.removeAttr('tabIndex');\n                }\n            },\n            _keydown: function (e) {\n                var selected, wrapper = this.wrapper, items = wrapper.find('.k-item'), current = items.filter('.' + ITEMSELECTEDCLASS).get(0), keyCode = e.keyCode;\n                if (keyCode == KEYS.LEFT) {\n                    selected = relative(items, current, -1);\n                } else if (keyCode == KEYS.RIGHT) {\n                    selected = relative(items, current, 1);\n                } else if (keyCode == KEYS.DOWN) {\n                    selected = relative(items, current, this.options.columns);\n                } else if (keyCode == KEYS.UP) {\n                    selected = relative(items, current, -this.options.columns);\n                } else if (keyCode == KEYS.ENTER) {\n                    preventDefault(e);\n                    if (current) {\n                        this._select($(current).css(BACKGROUNDCOLOR));\n                    }\n                } else if (keyCode == KEYS.ESC) {\n                    this._cancel();\n                }\n                if (selected) {\n                    preventDefault(e);\n                    this._current(selected);\n                    try {\n                        var color = parseColor(selected.css(BACKGROUNDCOLOR));\n                        this._triggerSelect(color);\n                    } catch (ex) {\n                    }\n                }\n            },\n            _current: function (item) {\n                this.wrapper.find('.' + ITEMSELECTEDCLASS).removeClass(ITEMSELECTEDCLASS).attr('aria-selected', false).removeAttr('id');\n                $(item).addClass(ITEMSELECTEDCLASS).attr('aria-selected', true).attr('id', this._selectedID);\n                this.element.removeAttr('aria-activedescendant').attr('aria-activedescendant', this._selectedID);\n            },\n            _updateUI: function (color) {\n                var item = null;\n                this.wrapper.find('.k-item').each(function () {\n                    var c = parseColor($(this).css(BACKGROUNDCOLOR));\n                    if (c && c.equals(color)) {\n                        item = this;\n                        return false;\n                    }\n                });\n                this._current(item);\n            },\n            _template: kendo.template('<table class=\"k-palette k-reset\" role=\"presentation\"><tr role=\"row\">' + '# for (var i = 0; i < colors.length; ++i) { #' + '# var selected = colors[i].equals(value); #' + '# if (i && i % columns == 0) { # </tr><tr role=\"row\"> # } #' + '<td role=\"gridcell\" unselectable=\"on\" style=\"background-color:#= colors[i].toCss() #\"' + '#= selected ? \" aria-selected=true\" : \"\" # ' + '#=(id && i === 0) ? \"id=\\\\\"\"+id+\"\\\\\" \" : \"\" # ' + 'class=\"k-item#= selected ? \" ' + ITEMSELECTEDCLASS + '\" : \"\" #\" ' + 'aria-label=\"#= colors[i].toCss() #\"></td>' + '# } #' + '</tr></table>')\n        });\n        var FlatColorPicker = ColorSelector.extend({\n            init: function (element, options) {\n                var that = this;\n                ColorSelector.fn.init.call(that, element, options);\n                options = that.options;\n                options.messages = options.options ? $.extend(that.options.messages, options.options.messages) : that.options.messages;\n                element = that.element;\n                that.wrapper = element.addClass('k-widget k-flatcolorpicker').append(that._template(options));\n                that._hueElements = $('.k-hsv-rectangle, .k-alpha-slider .k-slider-track', element);\n                that._selectedColor = $('.k-selected-color-display', element);\n                that._colorAsText = $('input.k-color-value', element);\n                that._sliders();\n                that._hsvArea();\n                that._updateUI(that._value || parseColor('#f00'));\n                element.find('input.k-color-value').on(KEYDOWN_NS, function (ev) {\n                    var input = this;\n                    if (ev.keyCode == KEYS.ENTER) {\n                        try {\n                            var color = parseColor(input.value);\n                            var val = that.color();\n                            that._select(color, color.equals(val));\n                        } catch (ex) {\n                            $(input).addClass('k-state-error');\n                        }\n                    } else if (that.options.autoupdate) {\n                        setTimeout(function () {\n                            var color = parseColor(input.value, true);\n                            if (color) {\n                                that._updateUI(color, true);\n                            }\n                        }, 10);\n                    }\n                }).end().on(CLICK_NS, '.k-controls button.apply', function () {\n                    if (that.options._clearedColor) {\n                        that.trigger('change');\n                    } else {\n                        that._select(that._getHSV());\n                    }\n                }).on(CLICK_NS, '.k-controls button.cancel', function () {\n                    that._updateUI(that.color());\n                    that._cancel();\n                });\n                if (isIE8) {\n                    that._applyIEFilter();\n                }\n            },\n            destroy: function () {\n                this._hsvEvents.destroy();\n                this._hueSlider.destroy();\n                if (this._opacitySlider) {\n                    this._opacitySlider.destroy();\n                }\n                this._hueSlider = this._opacitySlider = this._hsvRect = this._hsvHandle = this._hueElements = this._selectedColor = this._colorAsText = null;\n                ColorSelector.fn.destroy.call(this);\n            },\n            options: {\n                name: 'FlatColorPicker',\n                opacity: false,\n                buttons: false,\n                input: true,\n                preview: true,\n                clearButton: false,\n                autoupdate: true,\n                messages: MESSAGES\n            },\n            _applyIEFilter: function () {\n                var track = this.element.find('.k-hue-slider .k-slider-track')[0], url = track.currentStyle.backgroundImage;\n                url = url.replace(/^url\\([\\'\\\"]?|[\\'\\\"]?\\)$/g, '');\n                track.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\\'' + url + '\\', sizingMethod=\\'scale\\')';\n            },\n            _sliders: function () {\n                var that = this, element = that.element, hueSlider = element.find('.k-hue-slider'), opacitySlider = element.find('.k-alpha-slider');\n                function hueChange(e) {\n                    that._updateUI(that._getHSV(e.value, null, null, null));\n                }\n                hueSlider.attr('aria-label', 'hue saturation');\n                that._hueSlider = hueSlider.kendoSlider({\n                    min: 0,\n                    max: 360,\n                    tickPlacement: 'none',\n                    showButtons: false,\n                    slide: hueChange,\n                    change: hueChange\n                }).data('kendoSlider');\n                function opacityChange(e) {\n                    that._updateUI(that._getHSV(null, null, null, e.value / 100));\n                }\n                opacitySlider.attr('aria-label', 'opacity');\n                that._opacitySlider = opacitySlider.kendoSlider({\n                    min: 0,\n                    max: 100,\n                    tickPlacement: 'none',\n                    showButtons: false,\n                    slide: opacityChange,\n                    change: opacityChange\n                }).data('kendoSlider');\n            },\n            _hsvArea: function () {\n                var that = this, element = that.element, hsvRect = element.find('.k-hsv-rectangle'), hsvHandle = hsvRect.find('.k-draghandle').attr('tabIndex', 0).on(KEYDOWN_NS, bind(that._keydown, that));\n                function update(x, y) {\n                    var offset = this.offset, dx = x - offset.left, dy = y - offset.top, rw = this.width, rh = this.height;\n                    dx = dx < 0 ? 0 : dx > rw ? rw : dx;\n                    dy = dy < 0 ? 0 : dy > rh ? rh : dy;\n                    that._svChange(dx / rw, 1 - dy / rh);\n                }\n                that._hsvEvents = new kendo.UserEvents(hsvRect, {\n                    global: true,\n                    press: function (e) {\n                        this.offset = kendo.getOffset(hsvRect);\n                        this.width = hsvRect.width();\n                        this.height = hsvRect.height();\n                        hsvHandle.focus();\n                        update.call(this, e.x.location, e.y.location);\n                    },\n                    start: function () {\n                        hsvRect.addClass('k-dragging');\n                        hsvHandle.focus();\n                    },\n                    move: function (e) {\n                        e.preventDefault();\n                        update.call(this, e.x.location, e.y.location);\n                    },\n                    end: function () {\n                        hsvRect.removeClass('k-dragging');\n                    }\n                });\n                that._hsvRect = hsvRect;\n                that._hsvHandle = hsvHandle;\n            },\n            _onEnable: function (enable) {\n                this._hueSlider.enable(enable);\n                if (this._opacitySlider) {\n                    this._opacitySlider.enable(enable);\n                }\n                this.wrapper.find('input').attr('disabled', !enable);\n                var handle = this._hsvRect.find('.k-draghandle');\n                if (enable) {\n                    handle.attr('tabIndex', this._tabIndex);\n                } else {\n                    handle.removeAttr('tabIndex');\n                }\n            },\n            _keydown: function (ev) {\n                var that = this;\n                function move(prop, d) {\n                    var c = that._getHSV();\n                    c[prop] += d * (ev.shiftKey ? 0.01 : 0.05);\n                    if (c[prop] < 0) {\n                        c[prop] = 0;\n                    }\n                    if (c[prop] > 1) {\n                        c[prop] = 1;\n                    }\n                    that._updateUI(c);\n                    preventDefault(ev);\n                }\n                function hue(d) {\n                    var c = that._getHSV();\n                    c.h += d * (ev.shiftKey ? 1 : 5);\n                    if (c.h < 0) {\n                        c.h = 0;\n                    }\n                    if (c.h > 359) {\n                        c.h = 359;\n                    }\n                    that._updateUI(c);\n                    preventDefault(ev);\n                }\n                switch (ev.keyCode) {\n                case KEYS.LEFT:\n                    if (ev.ctrlKey) {\n                        hue(-1);\n                    } else {\n                        move('s', -1);\n                    }\n                    break;\n                case KEYS.RIGHT:\n                    if (ev.ctrlKey) {\n                        hue(1);\n                    } else {\n                        move('s', 1);\n                    }\n                    break;\n                case KEYS.UP:\n                    move(ev.ctrlKey && that._opacitySlider ? 'a' : 'v', 1);\n                    break;\n                case KEYS.DOWN:\n                    move(ev.ctrlKey && that._opacitySlider ? 'a' : 'v', -1);\n                    break;\n                case KEYS.ENTER:\n                    that._select(that._getHSV());\n                    break;\n                case KEYS.F2:\n                    that.wrapper.find('input.k-color-value').focus().select();\n                    break;\n                case KEYS.ESC:\n                    that._cancel();\n                    break;\n                }\n            },\n            focus: function () {\n                this._hsvHandle.focus();\n            },\n            _getHSV: function (h, s, v, a) {\n                var rect = this._hsvRect, width = rect.width(), height = rect.height(), handlePosition = this._hsvHandle.position();\n                if (h == null) {\n                    h = this._hueSlider.value();\n                }\n                if (s == null) {\n                    s = handlePosition.left / width;\n                }\n                if (v == null) {\n                    v = 1 - handlePosition.top / height;\n                }\n                if (a == null) {\n                    a = this._opacitySlider ? this._opacitySlider.value() / 100 : 1;\n                }\n                return Color.fromHSV(h, s, v, a);\n            },\n            _svChange: function (s, v) {\n                var color = this._getHSV(null, s, v, null);\n                this._updateUI(color);\n            },\n            _updateUI: function (color, dontChangeInput) {\n                var that = this, rect = that._hsvRect;\n                if (!color) {\n                    return;\n                }\n                this._colorAsText.attr('title', that.options.messages.previewInput);\n                this._colorAsText.removeClass('k-state-error');\n                that._selectedColor.css(BACKGROUNDCOLOR, color.toDisplay());\n                if (!dontChangeInput) {\n                    that._colorAsText.val(that._opacitySlider ? color.toCssRgba() : color.toCss());\n                }\n                that._triggerSelect(color);\n                color = color.toHSV();\n                that._hsvHandle.css({\n                    left: color.s * rect.width() + 'px',\n                    top: (1 - color.v) * rect.height() + 'px'\n                });\n                that._hueElements.css(BACKGROUNDCOLOR, Color.fromHSV(color.h, 1, 1, 1).toCss());\n                that._hueSlider.value(color.h);\n                if (that._opacitySlider) {\n                    that._opacitySlider.value(100 * color.a);\n                }\n            },\n            _selectOnHide: function () {\n                return this.options.buttons ? null : this._getHSV();\n            },\n            _template: kendo.template('# if (preview) { #' + '<div class=\"k-selected-color\"><div class=\"k-selected-color-display\"><div class=\"k-color-input\"><input class=\"k-color-value\" ' + '# if (clearButton && !_standalone) { #' + 'placeholder=\"#: messages.noColor #\" ' + '# } #' + '#= !data.input ? \\'style=\"visibility: hidden;\"\\' : \"\" #>' + '# if (clearButton && !_standalone) { #' + '<span class=\"k-clear-color k-button k-bare\" title=\"#: messages.clearColor #\"></span>' + '# } #' + '</div></div></div>' + '# } #' + '# if (clearButton && !_standalone && !preview) { #' + '<div class=\"k-clear-color-container\"><span class=\"k-clear-color k-button k-bare\">#: messages.clearColor #</span></div>' + '# } #' + '<div class=\"k-hsv-rectangle\"><div class=\"k-hsv-gradient\"></div><div class=\"k-draghandle\"></div></div>' + '<div class=\"k-sliders-wrap k-vbox\">' + '<input class=\"k-hue-slider\" />' + '# if (opacity) { #' + '<input class=\"k-alpha-slider k-transparency-slider\" />' + '# } #' + '</div>' + '# if (buttons) { #' + '<div unselectable=\"on\" class=\"k-controls\"><button class=\"k-button k-primary apply\">#: messages.apply #</button> <button class=\"k-button cancel\">#: messages.cancel #</button></div>' + '# } #')\n        });\n        function relative(array, element, delta) {\n            array = Array.prototype.slice.call(array);\n            var n = array.length;\n            var pos = array.indexOf(element);\n            if (pos < 0) {\n                return delta < 0 ? array[n - 1] : array[0];\n            }\n            pos += delta;\n            if (pos < 0) {\n                pos += n;\n            } else {\n                pos %= n;\n            }\n            return array[pos];\n        }\n        var ColorPicker = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element;\n                var value = element.attr('value') || element.val();\n                if (value) {\n                    value = parseColor(value, true);\n                } else {\n                    value = parseColor(options.value, true);\n                }\n                that._value = options.value = value;\n                var content = that.wrapper = $(that._template(options));\n                element.hide().after(content);\n                if (element.is('input')) {\n                    element.appendTo(content);\n                    var label = element.closest('label');\n                    var id = element.attr('id');\n                    if (id) {\n                        label = label.add('label[for=\"' + id + '\"]');\n                    }\n                    label.click(function (ev) {\n                        that.open();\n                        ev.preventDefault();\n                    });\n                }\n                that._tabIndex = element.attr('tabIndex') || 0;\n                that.enable(!element.attr('disabled'));\n                var accesskey = element.attr('accesskey');\n                if (accesskey) {\n                    element.attr('accesskey', null);\n                    content.attr('accesskey', accesskey);\n                }\n                that.bind('activate', function (ev) {\n                    if (!ev.isDefaultPrevented()) {\n                        that.toggle();\n                    }\n                });\n                that._updateUI(value);\n            },\n            destroy: function () {\n                this.wrapper.off(NS).find('*').off(NS);\n                if (this._popup) {\n                    this._selector.destroy();\n                    this._popup.destroy();\n                }\n                this._selector = this._popup = this.wrapper = null;\n                Widget.fn.destroy.call(this);\n            },\n            enable: function (enable) {\n                var that = this, wrapper = that.wrapper, innerWrapper = wrapper.children('.k-picker-wrap'), arrow = innerWrapper.find('.k-select');\n                if (arguments.length === 0) {\n                    enable = true;\n                }\n                that.element.attr('disabled', !enable);\n                wrapper.attr('aria-disabled', !enable);\n                arrow.off(NS).on('mousedown' + NS, preventDefault);\n                wrapper.addClass('k-state-disabled').removeAttr('tabIndex').add('*', wrapper).off(NS);\n                if (enable) {\n                    wrapper.removeClass('k-state-disabled').attr('tabIndex', that._tabIndex).on('mouseenter' + NS, function () {\n                        innerWrapper.addClass('k-state-hover');\n                    }).on('mouseleave' + NS, function () {\n                        innerWrapper.removeClass('k-state-hover');\n                    }).on('focus' + NS, function () {\n                        innerWrapper.addClass('k-state-focused');\n                    }).on('blur' + NS, function () {\n                        innerWrapper.removeClass('k-state-focused');\n                    }).on(KEYDOWN_NS, bind(that._keydown, that)).on(CLICK_NS, '.k-select', bind(that.toggle, that)).on(CLICK_NS, that.options.toolIcon ? '.k-tool-icon' : '.k-selected-color', function () {\n                        that.trigger('activate');\n                    });\n                } else {\n                    that.close();\n                }\n            },\n            _template: kendo.template('<span role=\"textbox\" aria-haspopup=\"true\" class=\"k-widget k-colorpicker\">' + '<span class=\"k-picker-wrap k-state-default\">' + '# if (toolIcon) { #' + '<span class=\"k-icon k-tool-icon #= toolIcon #\">' + '<span class=\"k-selected-color\"></span>' + '</span>' + '# } else { #' + '<span class=\"k-selected-color\"><span class=\"k-icon k-i-line\" style=\"display: none;\"></span></span>' + '# } #' + '<span class=\"k-select\" unselectable=\"on\" aria-label=\"select\">' + '<span class=\"k-icon k-i-arrow-60-down\"></span>' + '</span>' + '</span>' + '</span>'),\n            options: {\n                name: 'ColorPicker',\n                palette: null,\n                columns: 10,\n                toolIcon: null,\n                value: null,\n                messages: MESSAGES,\n                opacity: false,\n                buttons: true,\n                preview: true,\n                clearButton: false,\n                ARIATemplate: 'Current selected color is #=data || \"\"#'\n            },\n            events: [\n                'activate',\n                'change',\n                'select',\n                'open',\n                'close'\n            ],\n            open: function () {\n                if (!this.element.prop('disabled')) {\n                    this._getPopup().open();\n                }\n            },\n            close: function () {\n                var selOptions = this._selector && this._selector.options || {};\n                selOptions._closing = true;\n                this._getPopup().close();\n                delete selOptions._closing;\n            },\n            toggle: function () {\n                if (!this.element.prop('disabled')) {\n                    this._getPopup().toggle();\n                }\n            },\n            _noColorIcon: function () {\n                return this.wrapper.find('.k-picker-wrap > .k-selected-color > .k-icon.k-i-line');\n            },\n            color: ColorSelector.fn.color,\n            value: ColorSelector.fn.value,\n            _select: ColorSelector.fn._select,\n            _triggerSelect: ColorSelector.fn._triggerSelect,\n            _isInputTypeColor: function () {\n                var el = this.element[0];\n                return /^input$/i.test(el.tagName) && /^color$/i.test(el.type);\n            },\n            _updateUI: function (value) {\n                var formattedValue = '';\n                if (value) {\n                    if (this._isInputTypeColor() || value.a == 1) {\n                        formattedValue = value.toCss();\n                    } else {\n                        formattedValue = value.toCssRgba();\n                    }\n                    this.element.val(formattedValue);\n                }\n                if (!this._ariaTemplate) {\n                    this._ariaTemplate = kendo.template(this.options.ARIATemplate);\n                }\n                this.wrapper.attr('aria-label', this._ariaTemplate(formattedValue));\n                this._triggerSelect(value);\n                this.wrapper.find('.k-selected-color').css(BACKGROUNDCOLOR, value ? value.toDisplay() : WHITE);\n                this._noColorIcon()[formattedValue ? 'hide' : 'show']();\n            },\n            _keydown: function (ev) {\n                var key = ev.keyCode;\n                if (this._getPopup().visible()) {\n                    if (key == KEYS.ESC) {\n                        this._selector._cancel();\n                    } else {\n                        this._selector._keydown(ev);\n                    }\n                    preventDefault(ev);\n                } else if (key == KEYS.ENTER || key == KEYS.DOWN) {\n                    this.open();\n                    preventDefault(ev);\n                }\n            },\n            _getPopup: function () {\n                var that = this, popup = that._popup;\n                if (!popup) {\n                    var options = that.options;\n                    var selectorType;\n                    if (options.palette) {\n                        selectorType = ColorPalette;\n                    } else {\n                        selectorType = FlatColorPicker;\n                    }\n                    options._standalone = false;\n                    delete options.select;\n                    delete options.change;\n                    delete options.cancel;\n                    var id = kendo.guid();\n                    var selector = that._selector = new selectorType($('<div id=\"' + id + '\"/>').appendTo(document.body), options);\n                    that.wrapper.attr('aria-owns', id);\n                    that._popup = popup = selector.wrapper.kendoPopup({\n                        anchor: that.wrapper,\n                        adjustSize: {\n                            width: 5,\n                            height: 0\n                        }\n                    }).data('kendoPopup');\n                    selector.element.find('.k-clear-color').kendoButton({\n                        icon: 'reset-color',\n                        click: function (e) {\n                            selector.options._clearedColor = true;\n                            that.value(null);\n                            that.element.val(null);\n                            that._updateUI(null);\n                            selector._colorAsText.val('');\n                            selector._hsvHandle.css({\n                                top: '0px',\n                                left: '0px'\n                            });\n                            selector._selectedColor.css(BACKGROUNDCOLOR, WHITE);\n                            that.trigger('change', { value: that.value() });\n                            e.preventDefault();\n                        }\n                    });\n                    selector.bind({\n                        select: function (ev) {\n                            that._updateUI(parseColor(ev.value));\n                            delete selector.options._clearedColor;\n                        },\n                        change: function () {\n                            if (!selector.options._clearedColor) {\n                                that._select(selector.color());\n                            }\n                            that.close();\n                        },\n                        cancel: function () {\n                            if (selector.options._clearedColor && !that.value() && selector.value()) {\n                                that._select(selector.color(), true);\n                            }\n                            that.close();\n                        }\n                    });\n                    popup.bind({\n                        close: function (ev) {\n                            if (that.trigger('close')) {\n                                ev.preventDefault();\n                                return;\n                            }\n                            that.wrapper.children('.k-picker-wrap').removeClass('k-state-focused');\n                            var color = selector._selectOnHide();\n                            var selectorColor = selector.value();\n                            var value = that.value();\n                            var options = selector.options;\n                            if (!color) {\n                                setTimeout(function () {\n                                    if (that.wrapper && !that.wrapper.is('[unselectable=\\'on\\']')) {\n                                        that.wrapper.focus();\n                                    }\n                                });\n                                if (!options._closing && options._clearedColor && !value && selectorColor) {\n                                    that._select(selectorColor, true);\n                                } else {\n                                    that._updateUI(that.color());\n                                }\n                            } else if (!(options._clearedColor && !value)) {\n                                that._select(color);\n                            }\n                        },\n                        open: function (ev) {\n                            if (that.trigger('open')) {\n                                ev.preventDefault();\n                            } else {\n                                that.wrapper.children('.k-picker-wrap').addClass('k-state-focused');\n                            }\n                        },\n                        activate: function () {\n                            selector._select(that.color(), true);\n                            selector.focus();\n                            that.wrapper.children('.k-picker-wrap').addClass('k-state-focused');\n                        }\n                    });\n                }\n                return popup;\n            }\n        });\n        function preventDefault(ev) {\n            ev.preventDefault();\n        }\n        function bind(callback, obj) {\n            return function () {\n                return callback.apply(obj, arguments);\n            };\n        }\n        ui.plugin(ColorPalette);\n        ui.plugin(FlatColorPicker);\n        ui.plugin(ColorPicker);\n    }(jQuery, parseInt));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.numerictextbox', [\n        'kendo.core',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'numerictextbox',\n        name: 'NumericTextBox',\n        category: 'web',\n        description: 'The NumericTextBox widget can format and display numeric, percentage or currency textbox.',\n        depends: [\n            'core',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, caret = kendo.caret, keys = kendo.keys, ui = kendo.ui, Widget = ui.Widget, activeElement = kendo._activeElement, extractFormat = kendo._extractFormat, parse = kendo.parseFloat, placeholderSupported = kendo.support.placeholder, getCulture = kendo.getCulture, CHANGE = 'change', DISABLED = 'disabled', READONLY = 'readonly', INPUT = 'k-input', SPIN = 'spin', ns = '.kendoNumericTextBox', TOUCHEND = 'touchend', MOUSELEAVE = 'mouseleave' + ns, HOVEREVENTS = 'mouseenter' + ns + ' ' + MOUSELEAVE, DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', FOCUS = 'focus', POINT = '.', CLASS_ICON = 'k-icon', SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', STATE_INVALID = 'k-state-invalid', ARIA_DISABLED = 'aria-disabled', INTEGER_REGEXP = /^(-)?(\\d*)$/, NULL = null, proxy = $.proxy, extend = $.extend;\n        var NumericTextBox = Widget.extend({\n            init: function (element, options) {\n                var that = this, isStep = options && options.step !== undefined, min, max, step, value, disabled;\n                var inputType;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element.on('focusout' + ns, proxy(that._focusout, that)).attr('role', 'spinbutton');\n                options.placeholder = options.placeholder || element.attr('placeholder');\n                min = that.min(element.attr('min'));\n                max = that.max(element.attr('max'));\n                step = that._parse(element.attr('step'));\n                if (options.min === NULL && min !== NULL) {\n                    options.min = min;\n                }\n                if (options.max === NULL && max !== NULL) {\n                    options.max = max;\n                }\n                if (!isStep && step !== NULL) {\n                    options.step = step;\n                }\n                that._initialOptions = extend({}, options);\n                inputType = element.attr('type');\n                that._reset();\n                that._wrapper();\n                that._arrows();\n                that._validation();\n                that._input();\n                if (!kendo.support.mobileOS) {\n                    that._text.on(FOCUS + ns, proxy(that._click, that));\n                } else {\n                    that._text.on(TOUCHEND + ns + ' ' + FOCUS + ns, function () {\n                        if (kendo.support.browser.edge) {\n                            that._text.one(FOCUS + ns, function () {\n                                that._toggleText(false);\n                                element.focus();\n                            });\n                        } else {\n                            that._toggleText(false);\n                            element.focus();\n                        }\n                    });\n                }\n                element.attr('aria-valuemin', options.min !== NULL ? options.min * options.factor : options.min).attr('aria-valuemax', options.max !== NULL ? options.max * options.factor : options.max);\n                options.format = extractFormat(options.format);\n                value = options.value;\n                if (value == NULL) {\n                    if (inputType == 'number') {\n                        value = parseFloat(element.val());\n                    } else {\n                        value = element.val();\n                    }\n                }\n                that.value(value);\n                disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                that.angular('compile', function () {\n                    return { elements: that._text.get() };\n                });\n                kendo.notify(that);\n            },\n            options: {\n                name: 'NumericTextBox',\n                decimals: NULL,\n                restrictDecimals: false,\n                min: NULL,\n                max: NULL,\n                value: NULL,\n                step: 1,\n                round: true,\n                culture: '',\n                format: 'n',\n                spinners: true,\n                placeholder: '',\n                factor: 1,\n                upArrowText: 'Increase value',\n                downArrowText: 'Decrease value'\n            },\n            events: [\n                CHANGE,\n                SPIN\n            ],\n            _editable: function (options) {\n                var that = this, element = that.element, disable = options.disable, readonly = options.readonly, text = that._text.add(element), wrapper = that._inputWrapper.off(HOVEREVENTS);\n                that._toggleText(true);\n                that._upArrowEventHandler.unbind('press');\n                that._downArrowEventHandler.unbind('press');\n                element.off('keydown' + ns).off('keyup' + ns).off('input' + ns).off('paste' + ns);\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    text.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false);\n                    that._upArrowEventHandler.bind('press', function (e) {\n                        e.preventDefault();\n                        that._spin(1);\n                        that._upArrow.addClass(SELECTED);\n                    });\n                    that._downArrowEventHandler.bind('press', function (e) {\n                        e.preventDefault();\n                        that._spin(-1);\n                        that._downArrow.addClass(SELECTED);\n                    });\n                    that.element.on('keydown' + ns, proxy(that._keydown, that)).on('keyup' + ns, proxy(that._keyup, that)).on('paste' + ns, proxy(that._paste, that)).on('input' + ns, proxy(that._inputHandler, that));\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    text.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                that._arrowsWrap.toggle(that.options.spinners);\n                that._inputWrapper.toggleClass('k-expand-padding', !that.options.spinners);\n                that._text.prop('placeholder', that.options.placeholder);\n                that._placeholder(that.options.placeholder);\n                that.element.attr({\n                    'aria-valuemin': that.options.min !== NULL ? that.options.min * that.options.factor : that.options.min,\n                    'aria-valuemax': that.options.max !== NULL ? that.options.max * that.options.factor : that.options.max\n                });\n                that.options.format = extractFormat(that.options.format);\n                if (options.value !== undefined) {\n                    that.value(options.value);\n                }\n            },\n            destroy: function () {\n                var that = this;\n                that.element.add(that._text).add(that._upArrow).add(that._downArrow).add(that._inputWrapper).off(ns);\n                that._upArrowEventHandler.destroy();\n                that._downArrowEventHandler.destroy();\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n                Widget.fn.destroy.call(that);\n            },\n            min: function (value) {\n                return this._option('min', value);\n            },\n            max: function (value) {\n                return this._option('max', value);\n            },\n            step: function (value) {\n                return this._option('step', value);\n            },\n            value: function (value) {\n                var that = this, adjusted;\n                if (value === undefined) {\n                    return that._value;\n                }\n                value = that._parse(value);\n                adjusted = that._adjust(value);\n                if (value !== adjusted) {\n                    return;\n                }\n                that._update(value);\n                that._old = that._value;\n            },\n            focus: function () {\n                this._focusin();\n            },\n            _adjust: function (value) {\n                var that = this, options = that.options, min = options.min, max = options.max;\n                if (value === NULL) {\n                    return value;\n                }\n                if (min !== NULL && value < min) {\n                    value = min;\n                } else if (max !== NULL && value > max) {\n                    value = max;\n                }\n                return value;\n            },\n            _arrows: function () {\n                var that = this, arrows, _release = function () {\n                        clearTimeout(that._spinning);\n                        arrows.removeClass(SELECTED);\n                    }, options = that.options, spinners = options.spinners, element = that.element;\n                arrows = element.siblings('.' + CLASS_ICON);\n                if (!arrows[0]) {\n                    arrows = $(buttonHtml('increase', options.upArrowText) + buttonHtml('decrease', options.downArrowText)).insertAfter(element);\n                    that._arrowsWrap = arrows.wrapAll('<span class=\"k-select\"/>').parent();\n                }\n                if (!spinners) {\n                    arrows.parent().toggle(spinners);\n                    that._inputWrapper.addClass('k-expand-padding');\n                }\n                that._upArrow = arrows.eq(0);\n                that._upArrowEventHandler = new kendo.UserEvents(that._upArrow, { release: _release });\n                that._downArrow = arrows.eq(1);\n                that._downArrowEventHandler = new kendo.UserEvents(that._downArrow, { release: _release });\n            },\n            _validation: function () {\n                var that = this;\n                var element = that.element;\n                that._validationIcon = $('<span class=\\'' + CLASS_ICON + ' k-i-warning\\'></span>').hide().insertAfter(element);\n            },\n            _blur: function () {\n                var that = this;\n                that._toggleText(true);\n                that._change(that.element.val());\n            },\n            _click: function (e) {\n                var that = this;\n                clearTimeout(that._focusing);\n                that._focusing = setTimeout(function () {\n                    var input = e.target, idx = caret(input)[0], value = input.value.substring(0, idx), format = that._format(that.options.format), group = format[','], result, groupRegExp, extractRegExp, caretPosition = 0;\n                    if (group) {\n                        groupRegExp = new RegExp('\\\\' + group, 'g');\n                        extractRegExp = new RegExp('(^(-)$)|(^(-)?([\\\\d\\\\' + group + ']+)(\\\\' + format[POINT] + ')?(\\\\d+)?)');\n                    }\n                    if (extractRegExp) {\n                        result = extractRegExp.exec(value);\n                    }\n                    if (result) {\n                        caretPosition = result[0].replace(groupRegExp, '').length;\n                        if (value.indexOf('(') != -1 && that._value < 0) {\n                            caretPosition++;\n                        }\n                    }\n                    that._focusin();\n                    caret(that.element[0], caretPosition);\n                });\n            },\n            _change: function (value) {\n                var that = this, factor = that.options.factor;\n                if (factor && factor !== 1) {\n                    value = kendo.parseFloat(value);\n                    if (value !== null) {\n                        value = value / factor;\n                    }\n                }\n                that._update(value);\n                value = that._value;\n                if (that._old != value) {\n                    that._old = value;\n                    if (!that._typing) {\n                        that.element.trigger(CHANGE);\n                    }\n                    that.trigger(CHANGE);\n                }\n                that._typing = false;\n            },\n            _culture: function (culture) {\n                return culture || getCulture(this.options.culture);\n            },\n            _focusin: function () {\n                var that = this;\n                that._inputWrapper.addClass(FOCUSED);\n                that._toggleText(false);\n                that.element[0].focus();\n            },\n            _focusout: function () {\n                var that = this;\n                clearTimeout(that._focusing);\n                that._inputWrapper.removeClass(FOCUSED).removeClass(HOVER);\n                that._blur();\n                that._removeInvalidState();\n            },\n            _format: function (format, culture) {\n                var numberFormat = this._culture(culture).numberFormat;\n                format = format.toLowerCase();\n                if (format.indexOf('c') > -1) {\n                    numberFormat = numberFormat.currency;\n                } else if (format.indexOf('p') > -1) {\n                    numberFormat = numberFormat.percent;\n                }\n                return numberFormat;\n            },\n            _input: function () {\n                var that = this, options = that.options, CLASSNAME = 'k-formatted-value', element = that.element.addClass(INPUT).show()[0], accessKey = element.accessKey, wrapper = that.wrapper, text;\n                text = wrapper.find(POINT + CLASSNAME);\n                if (!text[0]) {\n                    text = $('<input type=\"text\"/>').insertBefore(element).addClass(CLASSNAME);\n                }\n                try {\n                    element.setAttribute('type', 'text');\n                } catch (e) {\n                    element.type = 'text';\n                }\n                text[0].title = element.title;\n                text[0].tabIndex = element.tabIndex;\n                text[0].style.cssText = element.style.cssText;\n                text.prop('placeholder', options.placeholder);\n                if (accessKey) {\n                    text.attr('accesskey', accessKey);\n                    element.accessKey = '';\n                }\n                that._text = text.addClass(element.className).attr({\n                    'role': 'spinbutton',\n                    'aria-valuemin': options.min !== NULL ? options.min * options.factor : options.min,\n                    'aria-valuemax': options.max !== NULL ? options.max * options.factor : options.max,\n                    'autocomplete': 'off'\n                });\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode;\n                if (key == keys.DOWN) {\n                    that._step(-1);\n                    return;\n                } else if (key == keys.UP) {\n                    that._step(1);\n                    return;\n                } else if (key == keys.ENTER) {\n                    that._change(that.element.val());\n                    return;\n                }\n                if (key != keys.TAB) {\n                    that._typing = true;\n                }\n                that._cachedCaret = caret(that.element);\n            },\n            _keyup: function () {\n                this._removeInvalidState();\n            },\n            _inputHandler: function () {\n                var element = this.element;\n                var value = element.val();\n                var numberFormat = this._format(this.options.format);\n                var isValid = this._numericRegex(numberFormat).test(value);\n                if (isValid) {\n                    this._oldText = value;\n                } else {\n                    this._blinkInvalidState();\n                    this.element.val(this._oldText);\n                    if (this._cachedCaret) {\n                        caret(element, this._cachedCaret[0]);\n                        this._cachedCaret = null;\n                    }\n                }\n            },\n            _blinkInvalidState: function () {\n                var that = this;\n                that._addInvalidState();\n                clearTimeout(that._invalidStateTimeout);\n                that._invalidStateTimeout = setTimeout(proxy(that._removeInvalidState, that), 100);\n            },\n            _addInvalidState: function () {\n                var that = this;\n                that._inputWrapper.addClass(STATE_INVALID);\n                that._validationIcon.show();\n            },\n            _removeInvalidState: function () {\n                var that = this;\n                that._inputWrapper.removeClass(STATE_INVALID);\n                that._validationIcon.hide();\n                that._invalidStateTimeout = null;\n            },\n            _numericRegex: function (numberFormat) {\n                var that = this;\n                var separator = numberFormat[POINT];\n                var precision = that.options.decimals;\n                var fractionRule = '*';\n                if (separator === POINT) {\n                    separator = '\\\\' + separator;\n                }\n                if (precision === NULL) {\n                    precision = numberFormat.decimals;\n                }\n                if (precision === 0 && that.options.restrictDecimals) {\n                    return INTEGER_REGEXP;\n                }\n                if (that.options.restrictDecimals) {\n                    fractionRule = '{0,' + precision + '}';\n                }\n                if (that._separator !== separator) {\n                    that._separator = separator;\n                    that._floatRegExp = new RegExp('^(-)?(((\\\\d+(' + separator + '\\\\d' + fractionRule + ')?)|(' + separator + '\\\\d' + fractionRule + ')))?$');\n                }\n                return that._floatRegExp;\n            },\n            _paste: function (e) {\n                var that = this;\n                var element = e.target;\n                var value = element.value;\n                var numberFormat = that._format(that.options.format);\n                setTimeout(function () {\n                    var result = that._parse(element.value);\n                    if (result === NULL) {\n                        that._update(value);\n                    } else {\n                        element.value = result.toString().replace(POINT, numberFormat[POINT]);\n                        if (that._adjust(result) !== result || !that._numericRegex(numberFormat).test(element.value)) {\n                            that._update(value);\n                        }\n                    }\n                });\n            },\n            _option: function (option, value) {\n                var that = this, element = that.element, options = that.options;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = that._parse(value);\n                if (!value && option === 'step') {\n                    return;\n                }\n                options[option] = value;\n                element.add(that._text).attr('aria-value' + option, value);\n                element.attr(option, value);\n            },\n            _spin: function (step, timeout) {\n                var that = this;\n                timeout = timeout || 500;\n                clearTimeout(that._spinning);\n                that._spinning = setTimeout(function () {\n                    that._spin(step, 50);\n                }, timeout);\n                that._step(step);\n            },\n            _step: function (step) {\n                var that = this, element = that.element, originalValue = that._value, value = that._parse(element.val()) || 0, precision = that.options.decimals || 2;\n                if (activeElement() != element[0]) {\n                    that._focusin();\n                }\n                if (that.options.factor && value) {\n                    value = value / that.options.factor;\n                }\n                value = +(value + that.options.step * step).toFixed(precision);\n                value = that._adjust(value);\n                that._update(value);\n                that._typing = false;\n                if (originalValue !== value) {\n                    that.trigger(SPIN);\n                }\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _toggleText: function (toggle) {\n                var that = this;\n                that._text.toggle(toggle);\n                that.element.toggle(!toggle);\n            },\n            _parse: function (value, culture) {\n                return parse(value, this._culture(culture), this.options.format);\n            },\n            _round: function (value, precision) {\n                var rounder = this.options.round ? kendo._round : truncate;\n                return rounder(value, precision);\n            },\n            _update: function (value) {\n                var that = this, options = that.options, factor = options.factor, format = options.format, decimals = options.decimals, culture = that._culture(), numberFormat = that._format(format, culture), isNotNull;\n                if (decimals === NULL) {\n                    decimals = numberFormat.decimals;\n                }\n                value = that._parse(value, culture);\n                isNotNull = value !== NULL;\n                if (isNotNull) {\n                    value = parseFloat(that._round(value, decimals), 10);\n                }\n                that._value = value = that._adjust(value);\n                that._placeholder(kendo.toString(value, format, culture));\n                if (isNotNull) {\n                    if (factor) {\n                        value = parseFloat(that._round(value * factor, decimals), 10);\n                    }\n                    value = value.toString();\n                    if (value.indexOf('e') !== -1) {\n                        value = that._round(+value, decimals);\n                    }\n                    value = value.replace(POINT, numberFormat[POINT]);\n                } else {\n                    value = null;\n                }\n                that.element.val(value);\n                that._oldText = value;\n                that.element.add(that._text).attr('aria-valuenow', value);\n            },\n            _placeholder: function (value) {\n                var input = this._text;\n                input.val(value);\n                if (!placeholderSupported && !value) {\n                    input.val(this.options.placeholder);\n                }\n                input.attr('title', this.element.attr('title') || input.val());\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, DOMElement = element[0], wrapper;\n                wrapper = element.parents('.k-numerictextbox');\n                if (!wrapper.is('span.k-numerictextbox')) {\n                    wrapper = element.hide().wrap('<span class=\"k-numeric-wrap k-state-default\" />').parent();\n                    wrapper = wrapper.wrap('<span/>').parent();\n                }\n                wrapper[0].style.cssText = DOMElement.style.cssText;\n                DOMElement.style.width = '';\n                that.wrapper = wrapper.addClass('k-widget k-numerictextbox').addClass(DOMElement.className).removeClass('input-validation-error').css('display', '');\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(element[0].value);\n                            that.max(that._initialOptions.max);\n                            that.min(that._initialOptions.min);\n                        });\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            }\n        });\n        function buttonHtml(direction, text) {\n            var className = 'k-i-arrow-' + (direction === 'increase' ? '60-up' : '60-down');\n            return '<span unselectable=\"on\" class=\"k-link k-link-' + direction + '\" aria-label=\"' + text + '\" title=\"' + text + '\">' + '<span unselectable=\"on\" class=\"' + CLASS_ICON + ' ' + className + '\"></span>' + '</span>';\n        }\n        function truncate(value, precision) {\n            var parts = parseFloat(value, 10).toString().split(POINT);\n            if (parts[1]) {\n                parts[1] = parts[1].substring(0, precision);\n            }\n            return parts.join(POINT);\n        }\n        ui.plugin(NumericTextBox);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.editable', [\n        'kendo.datepicker',\n        'kendo.numerictextbox',\n        'kendo.validator',\n        'kendo.binder'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'editable',\n        name: 'Editable',\n        category: 'framework',\n        depends: [\n            'datepicker',\n            'numerictextbox',\n            'validator',\n            'binder'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, extend = $.extend, oldIE = kendo.support.browser.msie && kendo.support.browser.version < 9, isFunction = kendo.isFunction, isPlainObject = $.isPlainObject, inArray = $.inArray, POINT = '.', support = kendo.support, AUTOCOMPLETEVALUE = support.browser.chrome ? 'disabled' : 'off', nameSpecialCharRegExp = /(\"|\\%|'|\\[|\\]|\\$|\\.|\\,|\\:|\\;|\\+|\\*|\\&|\\!|\\#|\\(|\\)|<|>|\\=|\\?|\\@|\\^|\\{|\\}|\\~|\\/|\\||`)/g, ERRORTEMPLATE = '<span class=\"k-widget k-tooltip k-tooltip-error\" style=\"margin:0.5em\">' + '<span class=\"k-icon k-i-error\"></span>' + '<span class=\"k-tooltip-content\">#= message #</span>' + '<span class=\"k-callout k-callout-n\"></span>' + '</span>', CHANGE = 'change';\n        var EQUAL_SET = 'equalSet';\n        var specialRules = [\n            'url',\n            'email',\n            'number',\n            'date',\n            'boolean'\n        ];\n        function fieldType(field) {\n            field = field != null ? field : '';\n            return field.type || $.type(field) || 'string';\n        }\n        function convertToValueBinding(container) {\n            container.find(':input:not(:button, .k-combobox .k-input, [' + kendo.attr('role') + '=listbox], [' + kendo.attr('role') + '=upload], [' + kendo.attr('skip') + '], [type=file])').each(function () {\n                var bindAttr = kendo.attr('bind'), binding = this.getAttribute(bindAttr) || '', bindingName = this.type === 'checkbox' || this.type === 'radio' ? 'checked:' : 'value:', fieldName = this.name;\n                if (binding.indexOf(bindingName) === -1 && fieldName) {\n                    binding += (binding.length ? ',' : '') + bindingName + fieldName;\n                    $(this).attr(bindAttr, binding);\n                }\n            });\n        }\n        function createAttributes(options) {\n            var field = (options.model.fields || options.model)[options.field], type = fieldType(field), validation = field ? field.validation : {}, ruleName, DATATYPE = kendo.attr('type'), BINDING = kendo.attr('bind'), rule, attr = {\n                    name: options.field,\n                    title: options.title ? options.title : options.field\n                };\n            for (ruleName in validation) {\n                rule = validation[ruleName];\n                if (inArray(ruleName, specialRules) >= 0) {\n                    attr[DATATYPE] = ruleName;\n                } else if (!isFunction(rule)) {\n                    var culture = kendo.getCulture();\n                    if (typeof rule === 'number' && culture.name.length) {\n                        var numberFormat = culture.numberFormat;\n                        var stringRule = rule.toString().replace(POINT, numberFormat[POINT]);\n                        attr[ruleName] = stringRule;\n                    } else {\n                        attr[ruleName] = isPlainObject(rule) ? rule.value || ruleName : rule;\n                    }\n                }\n                attr[kendo.attr(ruleName + '-msg')] = rule.message;\n                attr.autocomplete = AUTOCOMPLETEVALUE;\n            }\n            if (inArray(type, specialRules) >= 0) {\n                attr[DATATYPE] = type;\n            }\n            attr[BINDING] = (type === 'boolean' ? 'checked:' : 'value:') + options.field;\n            return attr;\n        }\n        function addIdAttribute(container, attr) {\n            var id = container.attr('id');\n            if (id) {\n                attr.id = id;\n                container.removeAttr('id');\n            }\n            return attr;\n        }\n        function convertItems(items) {\n            var idx, length, item, value, text, result;\n            if (items && items.length) {\n                result = [];\n                for (idx = 0, length = items.length; idx < length; idx++) {\n                    item = items[idx];\n                    text = item.text || item.value || item;\n                    value = item.value == null ? item.text || item : item.value;\n                    result[idx] = {\n                        text: text,\n                        value: value\n                    };\n                }\n            }\n            return result;\n        }\n        var editors = {\n            'number': function (container, options) {\n                var attr = createAttributes(options);\n                $('<input type=\"text\"/>').attr(attr).appendTo(container).kendoNumericTextBox({ format: options.format });\n                $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n            },\n            'date': function (container, options) {\n                var attr = createAttributes(options), format = options.format;\n                if (format) {\n                    format = kendo._extractFormat(format);\n                }\n                attr[kendo.attr('format')] = format;\n                $('<input type=\"text\"/>').attr(attr).appendTo(container).kendoDatePicker({ format: options.format });\n                $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n            },\n            'string': function (container, options) {\n                var attr = createAttributes(options);\n                $('<input type=\"text\" class=\"k-textbox\"/>').attr(attr).appendTo(container);\n            },\n            'boolean': function (container, options) {\n                var attr = createAttributes(options);\n                $('<input type=\"checkbox\" />').attr(attr).appendTo(container);\n            },\n            'values': function (container, options) {\n                var attr = createAttributes(options);\n                var items = kendo.stringify(convertItems(options.values));\n                $('<select ' + kendo.attr('text-field') + '=\"text\"' + kendo.attr('value-field') + '=\"value\"' + kendo.attr('source') + '=\\'' + (items ? items.replace(/\\'/g, '&apos;') : items) + '\\'' + kendo.attr('role') + '=\"dropdownlist\"/>').attr(attr).appendTo(container);\n                $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n            }\n        };\n        var mobileEditors = {\n            'number': function (container, options) {\n                var attr = createAttributes(options);\n                attr = addIdAttribute(container, attr);\n                $('<input type=\"number\"/>').attr(attr).appendTo(container);\n            },\n            'date': function (container, options) {\n                var attr = createAttributes(options);\n                attr = addIdAttribute(container, attr);\n                $('<input type=\"date\"/>').attr(attr).appendTo(container);\n            },\n            'string': function (container, options) {\n                var attr = createAttributes(options);\n                attr = addIdAttribute(container, attr);\n                $('<input type=\"text\" />').attr(attr).appendTo(container);\n            },\n            'boolean': function (container, options) {\n                var attr = createAttributes(options);\n                attr = addIdAttribute(container, attr);\n                $('<input type=\"checkbox\" />').attr(attr).appendTo(container);\n            },\n            'values': function (container, options) {\n                var attr = createAttributes(options);\n                var items = options.values;\n                var select = $('<select />');\n                attr = addIdAttribute(container, attr);\n                for (var index in items) {\n                    $('<option value=\"' + items[index].value + '\">' + items[index].text + '</option>').appendTo(select);\n                }\n                select.attr(attr).appendTo(container);\n            }\n        };\n        function addValidationRules(modelField, rules) {\n            var validation = modelField ? modelField.validation || {} : {}, rule, descriptor;\n            for (rule in validation) {\n                descriptor = validation[rule];\n                if (isPlainObject(descriptor) && descriptor.value) {\n                    descriptor = descriptor.value;\n                }\n                if (isFunction(descriptor)) {\n                    rules[rule] = descriptor;\n                }\n            }\n        }\n        var Editable = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                if (options.target) {\n                    options.$angular = options.target.options.$angular;\n                    if (options.target.pane) {\n                        that._isMobile = true;\n                    }\n                }\n                Widget.fn.init.call(that, element, options);\n                that._validateProxy = $.proxy(that._validate, that);\n                that.refresh();\n            },\n            events: [CHANGE],\n            options: {\n                name: 'Editable',\n                editors: editors,\n                mobileEditors: mobileEditors,\n                clearContainer: true,\n                errorTemplate: ERRORTEMPLATE,\n                skipFocus: false\n            },\n            editor: function (field, modelField) {\n                var that = this, editors = that._isMobile ? mobileEditors : that.options.editors, isObject = isPlainObject(field), fieldName = isObject ? field.field : field, model = that.options.model || {}, isValuesEditor = isObject && field.values, type = isValuesEditor ? 'values' : fieldType(modelField), isCustomEditor = isObject && field.editor, editor = isCustomEditor ? field.editor : editors[type], container = that.element.find('[' + kendo.attr('container-for') + '=' + fieldName.replace(nameSpecialCharRegExp, '\\\\$1') + ']');\n                editor = editor ? editor : editors.string;\n                if (isCustomEditor && typeof field.editor === 'string') {\n                    editor = function (container) {\n                        container.append(field.editor);\n                    };\n                }\n                container = container.length ? container : that.element;\n                editor(container, extend(true, {}, isObject ? field : { field: fieldName }, { model: model }));\n            },\n            _validate: function (e) {\n                var that = this, input, value = e.value, preventChangeTrigger = that._validationEventInProgress, values = {}, bindAttribute = kendo.attr('bind'), fieldName = e.field.replace(nameSpecialCharRegExp, '\\\\$1'), bindingRegex = new RegExp('(value|checked)\\\\s*:\\\\s*' + fieldName + '\\\\s*(,|$)');\n                values[e.field] = e.value;\n                input = $(':input[' + bindAttribute + '*=\"' + fieldName + '\"]', that.element).filter('[' + kendo.attr('validate') + '!=\\'false\\']').filter(function () {\n                    return bindingRegex.test($(this).attr(bindAttribute));\n                });\n                if (input.length > 1) {\n                    input = input.filter(function () {\n                        var element = $(this);\n                        return !element.is(':radio') || element.val() == value;\n                    });\n                }\n                try {\n                    that._validationEventInProgress = true;\n                    if (!that.validatable.validateInput(input) || !preventChangeTrigger && that.trigger(CHANGE, { values: values })) {\n                        e.preventDefault();\n                    }\n                } finally {\n                    that._validationEventInProgress = false;\n                }\n            },\n            end: function () {\n                return this.validatable.validate();\n            },\n            destroy: function () {\n                var that = this;\n                that.angular('cleanup', function () {\n                    return { elements: that.element };\n                });\n                Widget.fn.destroy.call(that);\n                that.options.model.unbind('set', that._validateProxy);\n                that.options.model.unbind(EQUAL_SET, that._validateProxy);\n                kendo.unbind(that.element);\n                if (that.validatable) {\n                    that.validatable.destroy();\n                }\n                kendo.destroy(that.element);\n                that.element.removeData('kendoValidator');\n                if (that.element.is('[' + kendo.attr('role') + '=editable]')) {\n                    that.element.removeAttr(kendo.attr('role'));\n                }\n            },\n            refresh: function () {\n                var that = this, idx, length, fields = that.options.fields || [], container = that.options.clearContainer ? that.element.empty() : that.element, model = that.options.model || {}, rules = {}, field, isObject, fieldName, modelField, modelFields;\n                if (!$.isArray(fields)) {\n                    fields = [fields];\n                }\n                for (idx = 0, length = fields.length; idx < length; idx++) {\n                    field = fields[idx];\n                    isObject = isPlainObject(field);\n                    fieldName = isObject ? field.field : field;\n                    modelField = (model.fields || model)[fieldName];\n                    addValidationRules(modelField, rules);\n                    that.editor(field, modelField);\n                }\n                if (that.options.target) {\n                    that.angular('compile', function () {\n                        return {\n                            elements: container,\n                            data: container.map(function () {\n                                return { dataItem: model };\n                            })\n                        };\n                    });\n                }\n                if (!length) {\n                    modelFields = model.fields || model;\n                    for (fieldName in modelFields) {\n                        addValidationRules(modelFields[fieldName], rules);\n                    }\n                }\n                convertToValueBinding(container);\n                if (that.validatable) {\n                    that.validatable.destroy();\n                }\n                kendo.bind(container, that.options.model);\n                that.options.model.unbind('set', that._validateProxy);\n                that.options.model.bind('set', that._validateProxy);\n                that.options.model.unbind(EQUAL_SET, that._validateProxy);\n                that.options.model.bind(EQUAL_SET, that._validateProxy);\n                that.validatable = new kendo.ui.Validator(container, {\n                    validateOnBlur: false,\n                    errorTemplate: that.options.errorTemplate || undefined,\n                    rules: rules\n                });\n                if (!that.options.skipFocus) {\n                    var focusable = container.find(':kendoFocusable').eq(0).focus();\n                    if (oldIE) {\n                        focusable.focus();\n                    }\n                }\n            }\n        });\n        ui.plugin(Editable);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.listview', [\n        'kendo.data',\n        'kendo.editable',\n        'kendo.selectable'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'listview',\n        name: 'ListView',\n        category: 'web',\n        description: 'The ListView widget offers rich support for interacting with data.',\n        depends: ['data'],\n        features: [\n            {\n                id: 'listview-editing',\n                name: 'Editing',\n                description: 'Support for record editing',\n                depends: ['editable']\n            },\n            {\n                id: 'listview-selection',\n                name: 'Selection',\n                description: 'Support for selection',\n                depends: ['selectable']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, CHANGE = 'change', KENDO_KEYDOWN = 'kendoKeydown', CANCEL = 'cancel', DATABOUND = 'dataBound', DATABINDING = 'dataBinding', Widget = kendo.ui.Widget, keys = kendo.keys, FOCUSSELECTOR = '>*:not(.k-loading-mask)', PROGRESS = 'progress', ERROR = 'error', FOCUSED = 'k-state-focused', SELECTED = 'k-state-selected', KEDITITEM = 'k-edit-item', EDIT = 'edit', REMOVE = 'remove', SAVE = 'save', MOUSEDOWN = 'mousedown', CLICK = 'click', TOUCHSTART = 'touchstart', NS = '.kendoListView', proxy = $.proxy, activeElement = kendo._activeElement, progress = kendo.ui.progress, DataSource = kendo.data.DataSource;\n        var ListView = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this;\n                options = $.isArray(options) ? { dataSource: options } : options;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                that.wrapper = element = that.element;\n                if (element[0].id) {\n                    that._itemId = element[0].id + '_lv_active';\n                }\n                that._element();\n                that._dataSource();\n                that._templates();\n                that._navigatable();\n                that._selectable();\n                that._pageable();\n                that._crudHandlers();\n                that._scrollable();\n                if (that.options.autoBind) {\n                    that.dataSource.fetch();\n                }\n                kendo.notify(that);\n            },\n            events: [\n                CHANGE,\n                CANCEL,\n                DATABINDING,\n                DATABOUND,\n                EDIT,\n                REMOVE,\n                SAVE,\n                KENDO_KEYDOWN\n            ],\n            options: {\n                name: 'ListView',\n                autoBind: true,\n                selectable: false,\n                navigatable: false,\n                height: null,\n                template: '',\n                altTemplate: '',\n                editTemplate: ''\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                this._templates();\n                if (this.selectable) {\n                    this.selectable.destroy();\n                    this.selectable = null;\n                }\n                this._selectable();\n            },\n            _templates: function () {\n                var options = this.options;\n                this.template = kendo.template(options.template || '');\n                this.altTemplate = kendo.template(options.altTemplate || options.template);\n                this.editTemplate = kendo.template(options.editTemplate || '');\n            },\n            _item: function (action) {\n                return this.element.children()[action]();\n            },\n            items: function () {\n                return this.element.children();\n            },\n            dataItem: function (element) {\n                var attr = kendo.attr('uid');\n                var uid = $(element).closest('[' + attr + ']').attr(attr);\n                return this.dataSource.getByUid(uid);\n            },\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._dataSource();\n                if (this.options.autoBind) {\n                    dataSource.fetch();\n                }\n            },\n            _unbindDataSource: function () {\n                var that = this;\n                that.dataSource.unbind(CHANGE, that._refreshHandler).unbind(PROGRESS, that._progressHandler).unbind(ERROR, that._errorHandler);\n            },\n            _dataSource: function () {\n                var that = this;\n                if (that.dataSource && that._refreshHandler) {\n                    that._unbindDataSource();\n                } else {\n                    that._refreshHandler = proxy(that.refresh, that);\n                    that._progressHandler = proxy(that._progress, that);\n                    that._errorHandler = proxy(that._error, that);\n                }\n                that.dataSource = DataSource.create(that.options.dataSource).bind(CHANGE, that._refreshHandler).bind(PROGRESS, that._progressHandler).bind(ERROR, that._errorHandler);\n            },\n            _progress: function (toggle) {\n                var element = this.element;\n                progress(element, toggle, { opacity: true });\n            },\n            _error: function () {\n                progress(this.element, false);\n            },\n            _element: function () {\n                var height = this.options.height;\n                this.element.addClass('k-widget k-listview').attr('role', 'listbox');\n                if (height) {\n                    this.element.css('height', height);\n                }\n            },\n            refresh: function (e) {\n                var that = this, view = that.dataSource.view(), data, items, item, html = '', idx, length, template = that.template, altTemplate = that.altTemplate, active = activeElement(), endlessAppend = that._endlessFetchInProgress, index = endlessAppend ? that._skipRerenderItemsCount : 0, scrollable = that.options.scrollable;\n                e = e || {};\n                if (e.action === 'itemchange') {\n                    if (!that._hasBindingTarget() && !that.editable) {\n                        data = e.items[0];\n                        item = that.items().filter('[' + kendo.attr('uid') + '=' + data.uid + ']');\n                        if (item.length > 0) {\n                            idx = item.index();\n                            that.angular('cleanup', function () {\n                                return { elements: [item] };\n                            });\n                            item.replaceWith(template(data));\n                            item = that.items().eq(idx);\n                            item.attr(kendo.attr('uid'), data.uid);\n                            that.angular('compile', function () {\n                                return {\n                                    elements: [item],\n                                    data: [{ dataItem: data }]\n                                };\n                            });\n                            that.trigger('itemChange', {\n                                item: item,\n                                data: data\n                            });\n                        }\n                    }\n                    return;\n                }\n                if (that.trigger(DATABINDING, {\n                        action: e.action || 'rebind',\n                        items: e.items,\n                        index: e.index\n                    })) {\n                    return;\n                }\n                that._angularItems('cleanup');\n                if (!endlessAppend) {\n                    that._destroyEditable();\n                }\n                for (idx = index, length = view.length; idx < length; idx++) {\n                    if (idx % 2) {\n                        html += altTemplate(view[idx]);\n                    } else {\n                        html += template(view[idx]);\n                    }\n                }\n                if (endlessAppend) {\n                    that.element.append(html);\n                } else {\n                    that.element.html(html);\n                }\n                items = that.items().not('.k-loading-mask');\n                for (idx = index, length = view.length; idx < length; idx++) {\n                    items.eq(idx).attr(kendo.attr('uid'), view[idx].uid).attr('role', 'option').attr('aria-selected', 'false');\n                }\n                if (that.element[0] === active && that.options.navigatable) {\n                    if (that._focusNext) {\n                        that.current(that.current().next());\n                    } else {\n                        if (!scrollable) {\n                            that.current(items.eq(0));\n                        }\n                    }\n                }\n                that._angularItems('compile');\n                that._progress(false);\n                that._endlessFetchInProgress = null;\n                that.trigger(DATABOUND, {\n                    action: e.action || 'rebind',\n                    items: e.items,\n                    index: e.index\n                });\n            },\n            _pageable: function () {\n                var that = this, pageable = that.options.pageable, settings, pagerId;\n                if ($.isPlainObject(pageable)) {\n                    pagerId = pageable.pagerId;\n                    settings = $.extend({}, pageable, {\n                        dataSource: that.dataSource,\n                        pagerId: null\n                    });\n                    that.pager = new kendo.ui.Pager($('#' + pagerId), settings);\n                }\n            },\n            _selectable: function () {\n                var that = this, multi, current, selectable = that.options.selectable, navigatable = that.options.navigatable;\n                if (selectable) {\n                    multi = kendo.ui.Selectable.parseOptions(selectable).multiple;\n                    that.selectable = new kendo.ui.Selectable(that.element, {\n                        aria: true,\n                        multiple: multi,\n                        filter: FOCUSSELECTOR,\n                        change: function () {\n                            that.trigger(CHANGE);\n                        }\n                    });\n                    if (navigatable) {\n                        that.element.on('keydown' + NS, function (e) {\n                            if (e.keyCode === keys.SPACEBAR) {\n                                current = that.current();\n                                if (e.target == e.currentTarget) {\n                                    e.preventDefault();\n                                }\n                                if (multi) {\n                                    if (!e.ctrlKey) {\n                                        that.selectable.clear();\n                                    } else {\n                                        if (current && current.hasClass(SELECTED)) {\n                                            current.removeClass(SELECTED);\n                                            return;\n                                        }\n                                    }\n                                } else {\n                                    that.selectable.clear();\n                                }\n                                that.selectable.value(current);\n                            }\n                        });\n                    }\n                }\n            },\n            _scrollable: function () {\n                var that = this;\n                var scrollable = that.options.scrollable;\n                if (scrollable) {\n                    that.element.css({\n                        'overflow-y': 'scroll',\n                        'position': 'relative',\n                        '-webkit-overflow-scrolling': 'touch'\n                    });\n                    if (scrollable === 'endless') {\n                        var originalPageSize = that._endlessPageSize = that.dataSource.options.pageSize;\n                        that.element.off('scroll' + NS).on('scroll' + NS, function () {\n                            if (this.scrollTop + this.clientHeight - this.scrollHeight >= -15 && !that._endlessFetchInProgress && that._endlessPageSize < that.dataSource.total()) {\n                                that._skipRerenderItemsCount = that._endlessPageSize;\n                                that._endlessPageSize = that._skipRerenderItemsCount + originalPageSize;\n                                that.dataSource.options.endless = true;\n                                that._endlessFetchInProgress = true;\n                                that.dataSource.pageSize(that._endlessPageSize);\n                            }\n                        });\n                    }\n                }\n            },\n            current: function (candidate) {\n                var that = this, element = that.element, current = that._current, id = that._itemId;\n                if (candidate === undefined) {\n                    return current;\n                }\n                if (current && current[0]) {\n                    if (current[0].id === id) {\n                        current.removeAttr('id');\n                    }\n                    current.removeClass(FOCUSED);\n                    element.removeAttr('aria-activedescendant');\n                }\n                if (candidate && candidate[0]) {\n                    id = candidate[0].id || id;\n                    that._scrollTo(candidate[0]);\n                    element.attr('aria-activedescendant', id);\n                    candidate.addClass(FOCUSED).attr('id', id);\n                }\n                that._current = candidate;\n            },\n            _scrollTo: function (element) {\n                var that = this, container, UseJQueryoffset = false, SCROLL = 'scroll';\n                if (that.wrapper.css('overflow') == 'auto' || that.wrapper.css('overflow') == SCROLL || that.wrapper.css('overflow-y') == SCROLL) {\n                    container = that.wrapper[0];\n                } else {\n                    container = window;\n                    UseJQueryoffset = true;\n                }\n                var scrollDirectionFunc = function (direction, dimension) {\n                    var elementOffset = UseJQueryoffset ? $(element).offset()[direction.toLowerCase()] : element['offset' + direction], elementDimension = element['client' + dimension], containerScrollAmount = $(container)[SCROLL + direction](), containerDimension = $(container)[dimension.toLowerCase()]();\n                    if (elementOffset + elementDimension > containerScrollAmount + containerDimension) {\n                        $(container)[SCROLL + direction](elementOffset + elementDimension - containerDimension);\n                    } else if (elementOffset < containerScrollAmount) {\n                        $(container)[SCROLL + direction](elementOffset);\n                    }\n                };\n                scrollDirectionFunc('Top', 'Height');\n                scrollDirectionFunc('Left', 'Width');\n            },\n            _navigatable: function () {\n                var that = this, navigatable = that.options.navigatable, element = that.element, clickCallback = function (e) {\n                        that.current($(e.currentTarget));\n                        if (!$(e.target).is(':button,a,:input,a>.k-icon,textarea')) {\n                            kendo.focusElement(element);\n                        }\n                    };\n                if (navigatable) {\n                    that._tabindex();\n                    element.on('focus' + NS, function () {\n                        var current = that._current;\n                        if (!current || !current.is(':visible')) {\n                            current = that._item('first');\n                        }\n                        that.current(current);\n                    }).on('focusout' + NS, function () {\n                        if (that._current) {\n                            that._current.removeClass(FOCUSED);\n                        }\n                    }).on('keydown' + NS, that, function (e) {\n                        var key = e.keyCode, current = that.current(), target = $(e.target), canHandle = !target.is(':button,textarea,a,a>.t-icon,input'), isTextBox = target.is(':text,:password'), preventDefault = kendo.preventDefault, editItem = element.find('.' + KEDITITEM), active = activeElement(), idx, scrollable = that.options.scrollable;\n                        if (!canHandle && !isTextBox && keys.ESC != key || isTextBox && keys.ESC != key && keys.ENTER != key) {\n                            return;\n                        }\n                        if (keys.UP === key || keys.LEFT === key) {\n                            if (current && current[0]) {\n                                current = current.prev();\n                            }\n                            if (current && current[0]) {\n                                that.current(current);\n                            } else if (!scrollable) {\n                                that.current(that._item('last'));\n                            }\n                            preventDefault(e);\n                        } else if (keys.DOWN === key || keys.RIGHT === key) {\n                            if (scrollable) {\n                                if (that.options.scrollable === 'endless' && !current.next().length) {\n                                    that.element[0].scrollTop = that.element[0].scrollHeight;\n                                    that._focusNext = true;\n                                } else {\n                                    current = current.next();\n                                    if (current && current[0]) {\n                                        that.current(current);\n                                    }\n                                }\n                            } else {\n                                current = current.next();\n                                that.current(!current || !current[0] ? that._item('first') : current);\n                            }\n                            preventDefault(e);\n                        } else if (keys.PAGEUP === key) {\n                            that.current(null);\n                            that.dataSource.page(that.dataSource.page() - 1);\n                            preventDefault(e);\n                        } else if (keys.PAGEDOWN === key) {\n                            that.current(null);\n                            that.dataSource.page(that.dataSource.page() + 1);\n                            preventDefault(e);\n                        } else if (keys.HOME === key) {\n                            that.current(that._item('first'));\n                            preventDefault(e);\n                        } else if (keys.END === key) {\n                            that.current(that._item('last'));\n                            preventDefault(e);\n                        } else if (keys.ENTER === key) {\n                            if (editItem.length !== 0 && (canHandle || isTextBox)) {\n                                idx = that.items().index(editItem);\n                                if (active) {\n                                    active.blur();\n                                }\n                                that.save();\n                                var focusAgain = function () {\n                                    that.element.trigger('focus');\n                                    that.current(that.items().eq(idx));\n                                };\n                                that.one('dataBound', focusAgain);\n                            } else if (that.options.editTemplate !== '') {\n                                that.edit(current);\n                            }\n                        } else if (keys.ESC === key) {\n                            editItem = element.find('.' + KEDITITEM);\n                            if (editItem.length === 0) {\n                                return;\n                            }\n                            idx = that.items().index(editItem);\n                            that.cancel();\n                            that.element.trigger('focus');\n                            that.current(that.items().eq(idx));\n                        }\n                    });\n                    element.on(MOUSEDOWN + NS + ' ' + TOUCHSTART + NS, FOCUSSELECTOR, proxy(clickCallback, that));\n                }\n            },\n            clearSelection: function () {\n                var that = this;\n                that.selectable.clear();\n                that.trigger(CHANGE);\n            },\n            select: function (items) {\n                var that = this, selectable = that.selectable;\n                items = $(items);\n                if (items.length) {\n                    if (!selectable.options.multiple) {\n                        selectable.clear();\n                        items = items.first();\n                    }\n                    selectable.value(items);\n                    return;\n                }\n                return selectable.value();\n            },\n            _destroyEditable: function () {\n                var that = this;\n                if (that.editable) {\n                    that.editable.destroy();\n                    delete that.editable;\n                }\n            },\n            _modelFromElement: function (element) {\n                var uid = element.attr(kendo.attr('uid'));\n                return this.dataSource.getByUid(uid);\n            },\n            _closeEditable: function () {\n                var that = this, editable = that.editable, data, item, index, template = that.template;\n                if (editable) {\n                    if (editable.element.index() % 2) {\n                        template = that.altTemplate;\n                    }\n                    that.angular('cleanup', function () {\n                        return { elements: [editable.element] };\n                    });\n                    data = that._modelFromElement(editable.element);\n                    that._destroyEditable();\n                    index = editable.element.index();\n                    editable.element.replaceWith(template(data));\n                    item = that.items().eq(index);\n                    item.attr(kendo.attr('uid'), data.uid);\n                    item.attr('role', 'option');\n                    if (that._hasBindingTarget()) {\n                        kendo.bind(item, data);\n                    }\n                    that.angular('compile', function () {\n                        return {\n                            elements: [item],\n                            data: [{ dataItem: data }]\n                        };\n                    });\n                }\n                return true;\n            },\n            edit: function (item) {\n                var that = this, data = that._modelFromElement(item), container, uid = data.uid, index;\n                that.cancel();\n                item = that.items().filter('[' + kendo.attr('uid') + '=' + uid + ']');\n                index = item.index();\n                item.replaceWith(that.editTemplate(data));\n                container = that.items().eq(index).addClass(KEDITITEM).attr(kendo.attr('uid'), data.uid);\n                that.editable = container.kendoEditable({\n                    model: data,\n                    clearContainer: false,\n                    errorTemplate: false,\n                    target: that\n                }).data('kendoEditable');\n                that.trigger(EDIT, {\n                    model: data,\n                    item: container\n                });\n            },\n            save: function () {\n                var that = this, editable = that.editable, model;\n                if (!editable) {\n                    return;\n                }\n                var container = editable.element;\n                model = that._modelFromElement(container);\n                if (editable.end() && !that.trigger(SAVE, {\n                        model: model,\n                        item: container\n                    })) {\n                    that._closeEditable();\n                    that.dataSource.sync();\n                }\n            },\n            remove: function (item) {\n                var that = this, dataSource = that.dataSource, data = that._modelFromElement(item);\n                if (that.editable) {\n                    dataSource.cancelChanges(that._modelFromElement(that.editable.element));\n                    that._closeEditable();\n                }\n                if (!that.trigger(REMOVE, {\n                        model: data,\n                        item: item\n                    })) {\n                    item.hide();\n                    dataSource.remove(data);\n                    dataSource.sync();\n                }\n            },\n            add: function () {\n                var that = this, dataItem, dataSource = that.dataSource, index = dataSource.indexOf((dataSource.view() || [])[0]);\n                if (index < 0) {\n                    index = 0;\n                }\n                that.cancel();\n                dataItem = dataSource.insert(index, {});\n                that.edit(that.element.find('[data-uid=\\'' + dataItem.uid + '\\']'));\n            },\n            cancel: function () {\n                var that = this, dataSource = that.dataSource;\n                if (that.editable) {\n                    var container = that.editable.element;\n                    var model = that._modelFromElement(container);\n                    if (!that.trigger(CANCEL, {\n                            model: model,\n                            container: container\n                        })) {\n                        dataSource.cancelChanges(model);\n                        that._closeEditable();\n                    }\n                }\n            },\n            _crudHandlers: function () {\n                var that = this, mousedownNs = MOUSEDOWN + NS, touchstartNs = TOUCHSTART + NS, clickNs = CLICK + NS;\n                that.element.on(mousedownNs + ' ' + touchstartNs, '.k-edit-button', function (e) {\n                    e.preventDefault();\n                    var item = $(this).closest('[' + kendo.attr('uid') + ']');\n                    setTimeout(function () {\n                        that.edit(item);\n                    });\n                });\n                that.element.on(mousedownNs + ' ' + touchstartNs, '.k-delete-button', function (e) {\n                    e.preventDefault();\n                    var item = $(this).closest('[' + kendo.attr('uid') + ']');\n                    setTimeout(function () {\n                        that.remove(item);\n                    });\n                });\n                that.element.on(clickNs, '.k-update-button', function (e) {\n                    that.save();\n                    e.preventDefault();\n                });\n                that.element.on(clickNs, '.k-cancel-button', function (e) {\n                    that.cancel();\n                    e.preventDefault();\n                });\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that._unbindDataSource();\n                that._destroyEditable();\n                that.element.off(NS);\n                that._endlessFetchInProgress = that._endlessPageSize = that._skipRerenderItemsCount = that._focusNext = null;\n                if (that.pager) {\n                    that.pager.destroy();\n                }\n                kendo.destroy(that.element);\n            }\n        });\n        kendo.ui.plugin(ListView);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.listbox', [\n        'kendo.draganddrop',\n        'kendo.data',\n        'kendo.selectable'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'listbox',\n        name: 'ListBox',\n        category: 'web',\n        depends: [\n            'draganddrop',\n            'data',\n            'selectable'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo;\n        var kendoAttr = kendo.attr;\n        var data = kendo.data;\n        var keys = kendo.keys;\n        var kendoTemplate = kendo.template;\n        var Widget = kendo.ui.Widget;\n        var DataSource = data.DataSource;\n        var Selectable = kendo.ui.Selectable;\n        var DataBoundWidget = kendo.ui.DataBoundWidget;\n        var Class = kendo.Class;\n        var extend = $.extend;\n        var noop = $.noop;\n        var proxy = $.proxy;\n        var DASH = '-';\n        var DOT = '.';\n        var SPACE = ' ';\n        var HASH = '#';\n        var KENDO_LISTBOX = 'kendoListBox';\n        var NS = DOT + KENDO_LISTBOX;\n        var DISABLED_STATE_CLASS = 'k-state-disabled';\n        var SELECTED_STATE_CLASS = 'k-state-selected';\n        var ENABLED_ITEM_SELECTOR = '.k-item:not(.k-state-disabled)';\n        var ENABLED_ITEMS_SELECTOR = '.k-list:not(.k-state-disabled) >' + ENABLED_ITEM_SELECTOR;\n        var TOOLBAR_CLASS = 'k-listbox-toolbar';\n        var TOOL_SELECTOR = 'li > a.k-button:not(.k-state-disabled)';\n        var FOCUSED_CLASS = 'k-state-focused';\n        var DRAG_CLUE_CLASS = 'k-drag-clue';\n        var DROP_HINT_CLASS = 'k-drop-hint';\n        var LIST_CLASS = 'k-reset k-list';\n        var LIST_SELECTOR = '.k-reset.k-list';\n        var RESET = 'k-reset';\n        var CLICK = 'click' + NS;\n        var KEYDOWN = 'keydown' + NS;\n        var BLUR = 'blur' + NS;\n        var outerWidth = kendo._outerWidth;\n        var outerHeight = kendo._outerHeight;\n        var CHANGE = 'change';\n        var DATABOUND = 'dataBound';\n        var ADD = 'add';\n        var REMOVE = 'remove';\n        var REORDER = 'reorder';\n        var MOVE_UP = 'moveUp';\n        var MOVE_DOWN = 'moveDown';\n        var TRANSFER_TO = 'transferTo';\n        var TRANSFER_FROM = 'transferFrom';\n        var TRANSFER_ALL_TO = 'transferAllTo';\n        var TRANSFER_ALL_FROM = 'transferAllFrom';\n        var DRAGGEDCLASS = 'k-ghost';\n        var UNIQUE_ID = 'uid';\n        var TABINDEX = 'tabindex';\n        var COMMAND = 'command';\n        var MOVE_UP_OFFSET = -1;\n        var MOVE_DOWN_OFFSET = 1;\n        var DRAGSTART = 'dragstart';\n        var DRAG = 'drag';\n        var DROP = 'drop';\n        var DRAGEND = 'dragend';\n        var DEFAULT_FILTER = 'ul.k-reset.k-list>li.k-item';\n        var RIGHT = 'right';\n        var BOTTOM = 'bottom';\n        var TOOLBAR_POSITION_CLASS_NAMES = [\n            TOOLBAR_CLASS + DASH + 'left',\n            TOOLBAR_CLASS + DASH + RIGHT,\n            TOOLBAR_CLASS + DASH + 'top',\n            TOOLBAR_CLASS + DASH + BOTTOM\n        ];\n        function getSortedDomIndices(items) {\n            var indices = $.map(items, function (item) {\n                return $(item).index();\n            });\n            return indices;\n        }\n        function isUndefined(value) {\n            return typeof value === 'undefined';\n        }\n        function defaultHint(element) {\n            return element.clone().removeClass(DRAGGEDCLASS).removeClass(FOCUSED_CLASS).addClass(kendo.format('{0} {1} {2}', SELECTED_STATE_CLASS, RESET, DRAG_CLUE_CLASS)).width(element.width());\n        }\n        function defaultPlaceholder() {\n            return $('<li>').addClass(DROP_HINT_CLASS);\n        }\n        var ListBox = DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that._wrapper();\n                that._list();\n                element = that.element.attr('multiple', 'multiple').hide();\n                if (element[0] && !that.options.dataSource) {\n                    that.options.dataTextField = that.options.dataTextField || 'text';\n                    that.options.dataValueField = that.options.dataValueField || 'value';\n                }\n                that._templates();\n                that._selectable();\n                that._dataSource();\n                that._createToolbar();\n                that._createDraggable();\n                that._createNavigatable();\n            },\n            destroy: function () {\n                var that = this;\n                DataBoundWidget.fn.destroy.call(that);\n                if (!isNaN(that._listTabIndex)) {\n                    that._getList().off();\n                    that._listTabIndex = null;\n                }\n                that._unbindDataSource();\n                that._destroySelectable();\n                that._destroyToolbar();\n                that.wrapper.off(NS);\n                if (that._target) {\n                    that._target = null;\n                }\n                if (that._draggable) {\n                    that._draggable.destroy();\n                    that.placeholder = null;\n                }\n                kendo.destroy(that.element);\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                this._templates();\n                this._dataSource();\n            },\n            events: [\n                CHANGE,\n                DATABOUND,\n                ADD,\n                REMOVE,\n                REORDER,\n                DRAGSTART,\n                DRAG,\n                DROP,\n                DRAGEND\n            ],\n            options: {\n                name: 'ListBox',\n                autoBind: true,\n                template: '',\n                dataTextField: '',\n                dataValueField: '',\n                selectable: 'single',\n                draggable: null,\n                dropSources: [],\n                connectWith: '',\n                navigatable: true,\n                toolbar: {\n                    position: RIGHT,\n                    tools: []\n                },\n                messages: {\n                    tools: {\n                        remove: 'Delete',\n                        moveUp: 'Move Up',\n                        moveDown: 'Move Down',\n                        transferTo: 'Transfer To',\n                        transferFrom: 'Transfer From',\n                        transferAllTo: 'Transfer All To',\n                        transferAllFrom: 'Transfer All From'\n                    }\n                }\n            },\n            add: function (dataItems) {\n                var that = this;\n                var items = dataItems && dataItems.length ? dataItems : [dataItems];\n                var itemsLength = items.length;\n                var list = that._getList();\n                var i;\n                that._unbindDataSource();\n                that._unbindDataChange();\n                for (i = 0; i < itemsLength; i++) {\n                    that._addItem(items[i], list);\n                }\n                that._bindDataChange();\n                that._bindDataSource();\n                that._syncElement();\n            },\n            _addItem: function (dataItem, list) {\n                var that = this;\n                var item = that.templates.itemTemplate({\n                    item: dataItem,\n                    r: that.templates.itemContent\n                });\n                $(item).attr(kendoAttr(UNIQUE_ID), dataItem.uid).appendTo(list);\n                if (typeof dataItem === typeof '') {\n                    that.dataSource._data.push(dataItem);\n                } else {\n                    that.dataSource.add(dataItem);\n                }\n            },\n            _addItemAt: function (dataItem, index) {\n                var that = this;\n                var item = that.templates.itemTemplate({\n                    item: dataItem,\n                    r: that.templates.itemContent\n                });\n                that._unbindDataSource();\n                if (typeof dataItem === typeof '') {\n                    that._insertElementAt(item, index);\n                    that.dataSource._data.push(dataItem);\n                } else {\n                    that._insertElementAt($(item).attr(kendoAttr(UNIQUE_ID), dataItem.uid), index);\n                    that.dataSource.add(dataItem);\n                }\n                that._bindDataSource();\n                that._syncElement();\n            },\n            _insertElementAt: function (item, index) {\n                var that = this;\n                var list = that._getList();\n                if (index > 0) {\n                    $(item).insertAfter(list.children().eq(index - 1));\n                } else {\n                    $(list).prepend(item);\n                }\n            },\n            _createNavigatable: function () {\n                var that = this;\n                var options = that.options;\n                if (options.navigatable) {\n                    that._getList().on(CLICK, ENABLED_ITEM_SELECTOR, proxy(that._click, that)).on(KEYDOWN, proxy(that._keyDown, that)).on(BLUR, proxy(that._blur, that));\n                }\n            },\n            _getTabIndex: function () {\n                var that = this;\n                var tabindex;\n                if (!isNaN(that._listTabIndex)) {\n                    return that._listTabIndex;\n                }\n                tabindex = that.element.attr(TABINDEX);\n                that._listTabIndex = !isNaN(tabindex) ? tabindex : 0;\n                that.element.removeAttr(TABINDEX);\n                return that._listTabIndex;\n            },\n            _blur: function () {\n                if (this._target) {\n                    this._target.removeClass(FOCUSED_CLASS);\n                    this._getList().removeAttr('aria-activedescendant');\n                }\n                this._target = null;\n            },\n            _click: function (e) {\n                var that = this;\n                var target = $(e.currentTarget);\n                var oldTarget = that._target;\n                var isInput = isInputElement(e.target);\n                if (oldTarget) {\n                    oldTarget.removeClass(FOCUSED_CLASS);\n                }\n                that._target = target;\n                target.addClass(FOCUSED_CLASS);\n                that._getList().attr('aria-activedescendant', target.attr('id'));\n                if (that._getList()[0] !== kendo._activeElement() && !isInput) {\n                    that.focus();\n                }\n            },\n            _getNavigatableItem: function (key) {\n                var that = this;\n                var current;\n                if (!that._target) {\n                    current = that.items().filter(ENABLED_ITEM_SELECTOR).first();\n                } else {\n                    current = that._target;\n                }\n                if (key === keys.UP && that._target) {\n                    current = that._target.prevAll(ENABLED_ITEM_SELECTOR).first();\n                }\n                if (key === keys.DOWN && that._target) {\n                    current = that._target.nextAll(ENABLED_ITEM_SELECTOR).first();\n                }\n                return current.length ? current : null;\n            },\n            _scrollIntoView: function (item) {\n                if (!item) {\n                    return;\n                }\n                if (item[0]) {\n                    item = item[0];\n                }\n                var list = this._getList().parent()[0];\n                var itemOffsetTop = item.offsetTop;\n                var contentScrollTop = list.scrollTop;\n                var contentOffsetHeight = list.clientHeight;\n                var bottomDistance = itemOffsetTop + item.offsetHeight;\n                if (contentScrollTop > itemOffsetTop) {\n                    contentScrollTop = itemOffsetTop;\n                } else if (bottomDistance > contentScrollTop + contentOffsetHeight) {\n                    contentScrollTop = bottomDistance - contentOffsetHeight;\n                }\n                list.scrollTop = contentScrollTop;\n            },\n            _keyDown: function (e) {\n                var that = this;\n                var key = e.keyCode;\n                var current = that._getNavigatableItem(key);\n                var shouldPreventDefault;\n                if (that._target) {\n                    that._target.removeClass(FOCUSED_CLASS);\n                }\n                if (!(e.shiftKey && !e.ctrlKey && (key === keys.DOWN || key === keys.UP))) {\n                    that._shiftSelecting = false;\n                }\n                if (key == keys.DELETE) {\n                    that._executeCommand(REMOVE);\n                    if (that._target) {\n                        that._target.removeClass(FOCUSED_CLASS);\n                        that._getList().removeAttr('aria-activedescendant');\n                        that._target = null;\n                    }\n                    shouldPreventDefault = true;\n                } else if (key === keys.DOWN || key === keys.UP) {\n                    if (!current) {\n                        e.preventDefault();\n                        return;\n                    }\n                    if (e.shiftKey && !e.ctrlKey) {\n                        if (!that._shiftSelecting) {\n                            that.clearSelection();\n                            that._shiftSelecting = true;\n                        }\n                        if (that._target && current.hasClass('k-state-selected')) {\n                            that._target.removeClass(SELECTED_STATE_CLASS);\n                            that.trigger(CHANGE);\n                        } else if (that.options.selectable == 'single') {\n                            that.select(current);\n                        } else {\n                            that.select(current.add(that._target));\n                        }\n                    } else if (e.shiftKey && e.ctrlKey) {\n                        that._executeCommand(key === keys.DOWN ? MOVE_DOWN : MOVE_UP);\n                        that._scrollIntoView(that._target);\n                        e.preventDefault();\n                        return;\n                    } else if (!e.shiftKey && !e.ctrlKey) {\n                        if (that.options.selectable === 'multiple') {\n                            that.clearSelection();\n                        }\n                        that.select(current);\n                    }\n                    that._target = current;\n                    if (that._target) {\n                        that._target.addClass(FOCUSED_CLASS);\n                        that._scrollIntoView(that._target);\n                        that._getList().attr('aria-activedescendant', that._target.attr('id'));\n                    } else {\n                        that._getList().removeAttr('aria-activedescendant');\n                    }\n                    shouldPreventDefault = true;\n                } else if (key == keys.SPACEBAR) {\n                    if (e.ctrlKey && that._target) {\n                        if (that._target.hasClass(SELECTED_STATE_CLASS)) {\n                            that._target.removeClass(SELECTED_STATE_CLASS);\n                            that.trigger(CHANGE);\n                        } else {\n                            that.select(that._target);\n                        }\n                    } else {\n                        that.clearSelection();\n                        that.select(that._target);\n                    }\n                    shouldPreventDefault = true;\n                } else if (e.ctrlKey && key == keys.RIGHT) {\n                    if (e.shiftKey) {\n                        that._executeCommand(TRANSFER_ALL_TO);\n                    } else {\n                        that._executeCommand(TRANSFER_TO);\n                    }\n                    that._target = that.select().length ? that.select() : null;\n                    shouldPreventDefault = true;\n                } else if (e.ctrlKey && key == keys.LEFT) {\n                    if (e.shiftKey) {\n                        that._executeCommand(TRANSFER_ALL_FROM);\n                    } else {\n                        that._executeCommand(TRANSFER_FROM);\n                    }\n                    shouldPreventDefault = true;\n                }\n                if (shouldPreventDefault) {\n                    e.preventDefault();\n                }\n            },\n            focus: function () {\n                kendo.focusElement(this._getList());\n            },\n            _createDraggable: function () {\n                var that = this;\n                var draggable = that.options.draggable;\n                var hint;\n                if (draggable) {\n                    hint = draggable.hint;\n                    if (!that.options.selectable) {\n                        throw new Error('Dragging requires selection to be enabled');\n                    }\n                    if (!hint) {\n                        hint = defaultHint;\n                    }\n                    that._draggable = new kendo.ui.Draggable(that.wrapper, {\n                        filter: draggable.filter ? draggable.filter : DEFAULT_FILTER,\n                        hint: kendo.isFunction(hint) ? hint : $(hint),\n                        dragstart: proxy(that._dragstart, that),\n                        dragcancel: proxy(that._clear, that),\n                        drag: proxy(that._drag, that),\n                        dragend: proxy(that._dragend, that)\n                    });\n                }\n            },\n            _dragstart: function (e) {\n                var that = this;\n                var draggedElement = that.draggedElement = e.currentTarget;\n                var placeholder = that.options.draggable.placeholder;\n                var dataItem = that.dataItem(draggedElement);\n                var eventData = {\n                    dataItems: dataItem,\n                    items: $(draggedElement),\n                    draggableEvent: e\n                };\n                if (that.options.draggable.enabled === false) {\n                    e.preventDefault();\n                    return;\n                }\n                if (!placeholder) {\n                    placeholder = defaultPlaceholder;\n                }\n                that.placeholder = kendo.isFunction(placeholder) ? $(placeholder.call(that, draggedElement)) : $(placeholder);\n                if (draggedElement.is(DOT + DISABLED_STATE_CLASS)) {\n                    e.preventDefault();\n                } else {\n                    if (that.trigger(DRAGSTART, eventData)) {\n                        e.preventDefault();\n                    } else {\n                        that.clearSelection();\n                        that.select(draggedElement);\n                        draggedElement.addClass(DRAGGEDCLASS);\n                    }\n                }\n            },\n            _clear: function () {\n                this.draggedElement.removeClass(DRAGGEDCLASS);\n                this.placeholder.remove();\n            },\n            _findElementUnderCursor: function (e) {\n                var elementUnderCursor = kendo.elementUnderCursor(e);\n                var draggable = e.sender;\n                if ($.contains(draggable.hint[0], elementUnderCursor) || draggable.hint[0] === elementUnderCursor) {\n                    draggable.hint.hide();\n                    elementUnderCursor = kendo.elementUnderCursor(e);\n                    draggable.hint.show();\n                }\n                return elementUnderCursor;\n            },\n            _findTarget: function (e) {\n                var that = this;\n                var element = that._findElementUnderCursor(e);\n                var elementNode = $(element);\n                var list = that._getList();\n                var items;\n                var node;\n                if ($.contains(list[0], element)) {\n                    items = that.items();\n                    element = elementNode.is('li') ? element : elementNode.closest('li')[0];\n                    node = items.filter(element)[0] || items.has(element)[0];\n                    if (node) {\n                        node = $(node);\n                        return !node.hasClass(DISABLED_STATE_CLASS) ? {\n                            element: node,\n                            listBox: that\n                        } : null;\n                    } else {\n                        return null;\n                    }\n                } else if (list[0] == element || list.parent()[0] == element) {\n                    return {\n                        element: $(list),\n                        appendToBottom: true,\n                        listBox: that\n                    };\n                } else {\n                    return that._searchConnectedListBox(elementNode);\n                }\n            },\n            _getElementCenter: function (element) {\n                var center = element.length ? kendo.getOffset(element) : null;\n                if (center) {\n                    center.top += outerHeight(element) / 2;\n                    center.left += outerWidth(element) / 2;\n                }\n                return center;\n            },\n            _searchConnectedListBox: function (element) {\n                var connectedListBox;\n                var items;\n                var node;\n                var originalElement = element;\n                var closestContainer;\n                if (element.hasClass('k-list-scroller k-selectable')) {\n                    closestContainer = element;\n                } else {\n                    closestContainer = element.closest('.k-list-scroller.k-selectable');\n                }\n                if (closestContainer.length) {\n                    connectedListBox = closestContainer.parent().find('[data-role=\\'listbox\\']').getKendoListBox();\n                } else {\n                    return null;\n                }\n                if (connectedListBox && $.inArray(this.element[0].id, connectedListBox.options.dropSources) !== -1) {\n                    items = connectedListBox.items();\n                    element = element.is('li') ? element[0] : element.closest('li')[0];\n                    node = items.filter(element)[0] || items.has(element)[0];\n                    if (node) {\n                        node = $(node);\n                        return !node.hasClass(DISABLED_STATE_CLASS) ? {\n                            element: node,\n                            listBox: connectedListBox\n                        } : null;\n                    } else if (!items.length || originalElement.hasClass('k-list-scroller k-selectable') || originalElement.hasClass('k-reset k-list')) {\n                        return {\n                            element: connectedListBox._getList(),\n                            listBox: connectedListBox,\n                            appendToBottom: true\n                        };\n                    } else {\n                        return null;\n                    }\n                }\n                return null;\n            },\n            _drag: function (e) {\n                var that = this;\n                var draggedElement = that.draggedElement;\n                var target = that._findTarget(e);\n                var cursorOffset = {\n                    left: e.x.location,\n                    top: e.y.location\n                };\n                var dataItem = that.dataItem(draggedElement);\n                var eventData = {\n                    dataItems: [dataItem],\n                    items: $(draggedElement),\n                    draggableEvent: e\n                };\n                var targetCenter;\n                var offsetDelta;\n                var direction;\n                if (that.trigger(DRAG, eventData)) {\n                    e.preventDefault();\n                    return;\n                }\n                if (target) {\n                    targetCenter = this._getElementCenter(target.element);\n                    offsetDelta = {\n                        left: Math.round(cursorOffset.left - targetCenter.left),\n                        top: Math.round(cursorOffset.top - targetCenter.top)\n                    };\n                    if (target.appendToBottom) {\n                        that._movePlaceholder(target, null, draggedElement);\n                        return;\n                    }\n                    if (offsetDelta.top < 0) {\n                        direction = 'prev';\n                    } else if (offsetDelta.top > 0) {\n                        direction = 'next';\n                    }\n                    if (direction) {\n                        if (target.element[0] != that.placeholder[0]) {\n                            that._movePlaceholder(target, direction, draggedElement);\n                        }\n                    }\n                } else if (that.placeholder.parent().length) {\n                    that.placeholder.remove();\n                }\n            },\n            _movePlaceholder: function (target, direction, draggedElement) {\n                var that = this;\n                var placeholder = that.placeholder;\n                var draggableOptions = target.listBox.options.draggable;\n                if (placeholder.parent().length) {\n                    that.placeholder.remove();\n                    if (draggableOptions && draggableOptions.placeholder) {\n                        that.placeholder = kendo.isFunction(draggableOptions.placeholder) ? $(draggableOptions.placeholder.call(that, draggedElement)) : $(draggableOptions.placeholder);\n                    } else {\n                        that.placeholder = $(defaultPlaceholder.call(that, draggedElement));\n                    }\n                }\n                if (!direction) {\n                    target.element.append(that.placeholder);\n                } else if (direction === 'prev') {\n                    target.element.before(that.placeholder);\n                } else if (direction === 'next') {\n                    target.element.after(that.placeholder);\n                }\n            },\n            _dragend: function (e) {\n                var that = this;\n                var draggedItem = that.draggedElement;\n                var items = that.items();\n                var placeholderIndex = items.not(that.draggedElement).index(that.placeholder);\n                var draggedIndex = items.not(that.placeholder).index(that.draggedElement);\n                var dataItem = that.dataItem(draggedItem);\n                var eventData = {\n                    dataItems: [dataItem],\n                    items: $(draggedItem)\n                };\n                var connectedListBox = that.placeholder.closest('.k-widget.k-listbox').find('[data-role=\\'listbox\\']').getKendoListBox();\n                if (that.trigger(DROP, extend({}, eventData, { draggableEvent: e }))) {\n                    e.preventDefault();\n                    this._clear();\n                    return;\n                }\n                if (placeholderIndex >= 0) {\n                    if (placeholderIndex !== draggedIndex && !that.trigger(REORDER, extend({}, eventData, { offset: placeholderIndex - draggedIndex }))) {\n                        draggedItem.removeClass(DRAGGEDCLASS);\n                        that.reorder(draggedItem, placeholderIndex);\n                    }\n                } else if (connectedListBox) {\n                    if (!that.trigger(REMOVE, eventData)) {\n                        that.remove($(draggedItem));\n                    }\n                    if (!connectedListBox.trigger(ADD, eventData)) {\n                        connectedListBox._addItemAt(dataItem, connectedListBox.items().index(that.placeholder));\n                    }\n                }\n                that._clear();\n                that._draggable.dropped = true;\n                that.trigger(DRAGEND, extend({}, eventData, { draggableEvent: e }));\n                that._updateToolbar();\n                that._updateAllToolbars();\n            },\n            reorder: function (item, index) {\n                var that = this;\n                var dataSource = that.dataSource;\n                var dataItem = that.dataItem(item);\n                var dataItemAtIndex = dataSource.at(index);\n                var itemAtIndex = that.items()[index];\n                var listItem = $(item);\n                if (dataItem && itemAtIndex && dataItemAtIndex) {\n                    that._removeElement(listItem);\n                    that._insertElementAt(listItem, index);\n                    that._updateToolbar();\n                }\n            },\n            remove: function (items) {\n                var that = this;\n                var listItems = that._getItems(items);\n                var itemsLength = listItems.length;\n                var i;\n                that._unbindDataSource();\n                that._unbindDataChange();\n                for (i = 0; i < itemsLength; i++) {\n                    that._removeItem($(listItems[i]));\n                }\n                that._bindDataChange();\n                that._bindDataSource();\n                that._syncElement();\n                that._updateToolbar();\n                that._updateAllToolbars();\n            },\n            _removeItem: function (item) {\n                var that = this;\n                var dataSource = that.dataSource;\n                var dataItem = that.dataItem(item);\n                if (!dataItem || !dataSource) {\n                    return;\n                }\n                if (typeof dataItem === typeof '') {\n                    var data = dataSource._data;\n                    for (var i = 0; i < data.length; i++) {\n                        if (dataItem === data[i]) {\n                            data[i] = data[data.length - 1];\n                            data.pop();\n                            break;\n                        }\n                    }\n                } else {\n                    dataSource.remove(dataItem);\n                }\n                that._removeElement(item);\n            },\n            _removeElement: function (item) {\n                kendo.destroy(item);\n                $(item).off().remove();\n            },\n            dataItem: function (element) {\n                var uniqueIdAttr = kendoAttr(UNIQUE_ID);\n                var uid = $(element).attr(uniqueIdAttr) || $(element).closest('[' + uniqueIdAttr + ']').attr(uniqueIdAttr);\n                if (uid) {\n                    return this.dataSource.getByUid(uid);\n                } else {\n                    return $(element).html();\n                }\n            },\n            _dataItems: function (items) {\n                var dataItems = [];\n                var listItems = $(items);\n                var itemsLength = listItems.length;\n                var i;\n                for (i = 0; i < itemsLength; i++) {\n                    dataItems.push(this.dataItem(listItems.eq(i)));\n                }\n                return dataItems;\n            },\n            items: function () {\n                var list = this._getList();\n                return list.children();\n            },\n            select: function (items) {\n                var that = this;\n                var selectable = that.selectable;\n                var enabledItems;\n                if (isUndefined(items)) {\n                    return selectable.value();\n                }\n                enabledItems = that.items().filter(items).filter(ENABLED_ITEMS_SELECTOR);\n                if (!selectable.options.multiple) {\n                    selectable.clear();\n                    enabledItems = enabledItems.first();\n                }\n                return selectable.value(enabledItems);\n            },\n            clearSelection: function () {\n                var that = this;\n                var selectable = that.selectable;\n                if (selectable) {\n                    selectable.clear();\n                }\n            },\n            enable: function (items, enable) {\n                var that = this;\n                var enabled = isUndefined(enable) ? true : !!enable;\n                var listItems = that._getItems(items);\n                var itemsLength = listItems.length;\n                var i;\n                for (i = 0; i < itemsLength; i++) {\n                    that._enableItem($(listItems[i]), enabled);\n                }\n                that._updateAllToolbars();\n            },\n            _enableItem: function (item, enable) {\n                var that = this;\n                var dataItem = that.dataItem(item);\n                if (dataItem) {\n                    if (enable) {\n                        $(item).removeClass(DISABLED_STATE_CLASS);\n                    } else {\n                        $(item).addClass(DISABLED_STATE_CLASS).removeClass(SELECTED_STATE_CLASS);\n                    }\n                }\n            },\n            setDataSource: function (dataSource) {\n                var that = this;\n                that.options.dataSource = dataSource;\n                that._dataSource();\n            },\n            _dataSource: function () {\n                var that = this;\n                var options = that.options;\n                var dataSource = options.dataSource || {};\n                dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n                dataSource.select = that.element;\n                dataSource.fields = [\n                    { field: options.dataTextField },\n                    { field: options.dataValueField }\n                ];\n                that._unbindDataSource();\n                that.dataSource = DataSource.create(dataSource);\n                that._bindDataSource();\n                if (that.options.autoBind) {\n                    that.dataSource.fetch();\n                }\n            },\n            _bindDataChange: function () {\n                var dataSource = this.dataSource;\n                if (dataSource._data && dataSource._changeHandler) {\n                    dataSource._data.bind(CHANGE, dataSource._changeHandler);\n                    dataSource._data.trigger(CHANGE);\n                }\n            },\n            _unbindDataChange: function () {\n                var dataSource = this.dataSource;\n                if (dataSource._data && dataSource._changeHandler) {\n                    dataSource._data.unbind(CHANGE, dataSource._changeHandler);\n                }\n            },\n            _bindDataSource: function () {\n                var that = this;\n                var dataSource = that.dataSource;\n                that._dataChangeHandler = proxy(that.refresh, that);\n                if (dataSource) {\n                    dataSource.bind(CHANGE, that._dataChangeHandler);\n                }\n            },\n            _unbindDataSource: function () {\n                var that = this;\n                var dataSource = that.dataSource;\n                if (dataSource) {\n                    dataSource.unbind(CHANGE, that._dataChangeHandler);\n                }\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper = element.parent('div.k-listbox');\n                if (!wrapper[0]) {\n                    wrapper = element.wrap('<div class=\"k-widget k-listbox\" unselectable=\"on\" />').parent();\n                    wrapper[0].style.cssText = element[0].style.cssText;\n                    wrapper[0].title = element[0].title;\n                    $('<div class=\"k-list-scroller\" />').insertBefore(element);\n                }\n                that.wrapper = wrapper.addClass(element[0].className).css('display', '');\n                that._innerWrapper = $(wrapper[0].firstChild);\n            },\n            _list: function () {\n                var that = this;\n                $('<ul class=\\'' + LIST_CLASS + '\\' role=\\'listbox\\'></ul>').appendTo(that._innerWrapper);\n                if (that.options.navigatable) {\n                    that._getList().attr(TABINDEX, that._getTabIndex());\n                }\n            },\n            _templates: function () {\n                var that = this;\n                var options = this.options;\n                var template;\n                if (options.template && typeof options.template == 'string') {\n                    template = kendo.template(options.template);\n                } else if (!options.template) {\n                    template = kendo.template('${' + kendo.expr(options.dataTextField, 'data') + '}', { useWithBlock: false });\n                } else {\n                    template = options.template;\n                }\n                that.templates = {\n                    itemTemplate: kendo.template('# var item = data.item, r = data.r; # <li class=\\'k-item\\' role=\\'option\\' aria-selected=\\'false\\'>#=r(item)#</li>', { useWithBlock: false }),\n                    itemContent: template,\n                    toolbar: '<div class=\\'' + TOOLBAR_CLASS + '\\'></div>'\n                };\n            },\n            refresh: function () {\n                var that = this;\n                var view = that.dataSource.view();\n                var template = that.templates.itemTemplate;\n                var html = '';\n                for (var idx = 0; idx < view.length; idx++) {\n                    html += template({\n                        item: view[idx],\n                        r: that.templates.itemContent\n                    });\n                }\n                that._getList().html(html);\n                that._setItemIds();\n                that._createToolbar();\n                that._syncElement();\n                that._updateToolbar();\n                that._updateAllToolbars();\n                that.trigger(DATABOUND);\n            },\n            _syncElement: function () {\n                var options = '';\n                var view = this.dataSource.view();\n                for (var idx = 0; idx < view.length; idx++) {\n                    options += this._option(view[idx][this.options.dataValueField] || view[idx], view[idx][this.options.dataTextField] || view[idx], true);\n                }\n                this.element.html(options);\n            },\n            _option: function (dataValue, dataText) {\n                var option = '<option';\n                if (dataValue !== undefined) {\n                    dataValue += '';\n                    if (dataValue.indexOf('\"') !== -1) {\n                        dataValue = dataValue.replace(/\"/g, '&quot;');\n                    }\n                    option += ' value=\"' + dataValue + '\"';\n                }\n                option += ' selected>';\n                if (dataText !== undefined) {\n                    option += kendo.htmlEncode(dataText);\n                }\n                return option += '</option>';\n            },\n            _setItemIds: function () {\n                var that = this;\n                var items = that.items();\n                var view = that.dataSource.view();\n                var viewLength = view.length;\n                var i;\n                for (i = 0; i < viewLength; i++) {\n                    items.eq(i).attr(kendoAttr(UNIQUE_ID), view[i].uid).attr('id', view[i].uid);\n                }\n            },\n            _selectable: function () {\n                var that = this;\n                var selectable = that.options.selectable;\n                var selectableOptions = Selectable.parseOptions(selectable);\n                if (selectableOptions.multiple) {\n                    that.element.attr('aria-multiselectable', 'true');\n                }\n                that.selectable = new Selectable(that._innerWrapper, {\n                    aria: true,\n                    multiple: selectableOptions.multiple,\n                    filter: ENABLED_ITEM_SELECTOR,\n                    change: proxy(that._onSelect, that)\n                });\n            },\n            _onSelect: function () {\n                var that = this;\n                that._updateToolbar();\n                that._updateAllToolbars();\n                that.trigger(CHANGE);\n            },\n            _destroySelectable: function () {\n                var that = this;\n                if (that.selectable && that.selectable.element) {\n                    that.selectable.destroy();\n                    that.selectable = null;\n                }\n            },\n            _getList: function () {\n                return this.wrapper.find(LIST_SELECTOR);\n            },\n            _getItems: function (items) {\n                return this.items().filter(items);\n            },\n            _createToolbar: function () {\n                var that = this;\n                var toolbarOptions = that.options.toolbar;\n                var position = toolbarOptions.position || RIGHT;\n                var toolbarInsertion = position === BOTTOM ? 'insertAfter' : 'insertBefore';\n                var tools = toolbarOptions.tools || [];\n                var messages = that.options.messages;\n                that._destroyToolbar();\n                that.wrapper.removeClass(TOOLBAR_POSITION_CLASS_NAMES.join(SPACE));\n                if (tools.length && tools.length > 0) {\n                    var toolbarElement = $(that.templates.toolbar)[toolbarInsertion](that._innerWrapper);\n                    that.toolbar = new ToolBar(toolbarElement, extend({}, toolbarOptions, {\n                        listBox: that,\n                        messages: messages\n                    }));\n                    that.wrapper.addClass(TOOLBAR_CLASS + DASH + position);\n                }\n            },\n            _destroyToolbar: function () {\n                var that = this;\n                if (that.toolbar) {\n                    that.toolbar.destroy();\n                    that.toolbar = null;\n                }\n            },\n            _executeCommand: function (commandName) {\n                var that = this;\n                var command = CommandFactory.current.create(commandName, { listBox: that });\n                if (command) {\n                    command.execute();\n                    that._updateToolbar();\n                    that._updateAllToolbars();\n                }\n            },\n            _updateToolbar: function () {\n                var toolbar = this.toolbar;\n                if (toolbar) {\n                    toolbar._updateToolStates();\n                }\n            },\n            _updateAllToolbars: function () {\n                var listBoxElements = $('select[data-role=\\'listbox\\']');\n                var elementsLength = listBoxElements.length;\n                var listBox;\n                var i;\n                for (i = 0; i < elementsLength; i++) {\n                    listBox = $(listBoxElements[i]).data(KENDO_LISTBOX);\n                    if (listBox) {\n                        listBox._updateToolbar();\n                    }\n                }\n            }\n        });\n        kendo.ui.plugin(ListBox);\n        var CommandFactory = Class.extend({\n            init: function () {\n                this._commands = [];\n            },\n            register: function (commandName, commandType) {\n                this._commands.push({\n                    commandName: commandName,\n                    commandType: commandType\n                });\n            },\n            create: function (commandName, options) {\n                var commands = this._commands;\n                var itemsLength = commands.length;\n                var name = commandName ? commandName.toLowerCase() : '';\n                var match;\n                var command;\n                var i;\n                for (i = 0; i < itemsLength; i++) {\n                    command = commands[i];\n                    if (command.commandName.toLowerCase() === name) {\n                        match = command;\n                        break;\n                    }\n                }\n                if (match) {\n                    return new match.commandType(options);\n                }\n            }\n        });\n        CommandFactory.current = new CommandFactory();\n        var ListBoxCommand = Class.extend({\n            init: function (options) {\n                var that = this;\n                that.options = extend({}, that.options, options);\n                that.listBox = that.options.listBox;\n            },\n            options: { listBox: null },\n            getItems: function () {\n                return $(this.listBox.select());\n            },\n            execute: noop,\n            canExecute: noop\n        });\n        var RemoveItemsCommand = ListBoxCommand.extend({\n            execute: function () {\n                var that = this;\n                var listBox = that.listBox;\n                var items = that.getItems();\n                if (!listBox.trigger(REMOVE, {\n                        dataItems: listBox._dataItems(items),\n                        items: items\n                    })) {\n                    listBox.remove(items);\n                }\n            },\n            canExecute: function () {\n                return this.listBox.select().length > 0;\n            }\n        });\n        CommandFactory.current.register(REMOVE, RemoveItemsCommand);\n        var MoveItemsCommand = ListBoxCommand.extend({\n            execute: function () {\n                var that = this;\n                if (that.canExecute()) {\n                    that.moveItems();\n                }\n            },\n            canExecute: noop,\n            moveItems: function () {\n                var that = this;\n                var listBox = that.listBox;\n                var options = that.options;\n                var items = that.getItems();\n                var offset = options.offset;\n                var indecesInDom = getSortedDomIndices(items);\n                var movedItems = $.makeArray(items.sort(that.itemComparer));\n                var moveAction = options.moveAction;\n                var movedItem;\n                if (!listBox.trigger(REORDER, {\n                        dataItems: listBox._dataItems(movedItems),\n                        items: $(movedItems),\n                        offset: offset\n                    })) {\n                    while (movedItems.length > 0 && indecesInDom.length > 0) {\n                        movedItem = movedItems[moveAction]();\n                        listBox.reorder(movedItem, indecesInDom[moveAction]() + offset);\n                    }\n                }\n            },\n            options: {\n                offset: 0,\n                moveAction: 'pop'\n            },\n            itemComparer: function (item1, item2) {\n                var indexItem1 = $(item1).index();\n                var indexItem2 = $(item2).index();\n                if (indexItem1 === indexItem2) {\n                    return 0;\n                } else {\n                    return indexItem1 > indexItem2 ? 1 : -1;\n                }\n            }\n        });\n        var MoveUpItemsCommand = MoveItemsCommand.extend({\n            options: {\n                offset: MOVE_UP_OFFSET,\n                moveAction: 'shift'\n            },\n            canExecute: function () {\n                var items = this.getItems();\n                var domIndices = getSortedDomIndices(items);\n                return domIndices.length > 0 && domIndices[0] > 0;\n            }\n        });\n        CommandFactory.current.register(MOVE_UP, MoveUpItemsCommand);\n        var MoveDownItemsCommand = MoveItemsCommand.extend({\n            options: {\n                offset: MOVE_DOWN_OFFSET,\n                moveAction: 'pop'\n            },\n            canExecute: function () {\n                var that = this;\n                var items = that.getItems();\n                var domIndices = getSortedDomIndices(items);\n                return domIndices.length > 0 && $(domIndices).last()[0] < that.listBox.items().length - 1;\n            }\n        });\n        CommandFactory.current.register(MOVE_DOWN, MoveDownItemsCommand);\n        var TransferItemsCommand = ListBoxCommand.extend({\n            options: { filter: ENABLED_ITEM_SELECTOR },\n            execute: function () {\n                var that = this;\n                var sourceListBox = that.getSourceListBox();\n                var items = that.getItems().filter(that.options.filter);\n                var dataItems = sourceListBox ? sourceListBox._dataItems(items) : [];\n                var destinationListBox = that.getDestinationListBox();\n                var updatedSelection = that.getUpdatedSelection(items);\n                if (destinationListBox && items.length > 0) {\n                    if (!destinationListBox.trigger(ADD, {\n                            dataItems: dataItems,\n                            items: items\n                        })) {\n                        destinationListBox.add(dataItems);\n                    }\n                    if (!sourceListBox.trigger(REMOVE, {\n                            dataItems: dataItems,\n                            items: items\n                        })) {\n                        sourceListBox.remove(items);\n                        that.updateSelection(updatedSelection);\n                    }\n                }\n            },\n            getUpdatedSelection: function (items) {\n                if (items.length !== 1) {\n                    return null;\n                }\n                var that = this;\n                var itemFilter = that.options.filter;\n                var sourceListBox = that.getSourceListBox();\n                var lastEnabledItem = sourceListBox ? sourceListBox.items().filter(itemFilter).last() : null;\n                var containsLastItem = $(items).filter(lastEnabledItem).length > 0;\n                var itemToSelect = containsLastItem ? $(items).prevAll(itemFilter)[0] : $(items).nextAll(itemFilter)[0];\n                if (itemToSelect) {\n                    return itemToSelect;\n                } else {\n                    return null;\n                }\n            },\n            updateSelection: function (item) {\n                var sourceListBox = this.getSourceListBox();\n                if (sourceListBox && item) {\n                    $(sourceListBox.select($(item)));\n                    sourceListBox._scrollIntoView(item);\n                }\n            },\n            getSourceListBox: noop,\n            getDestinationListBox: noop\n        });\n        var TransferItemsToCommand = TransferItemsCommand.extend({\n            canExecute: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.select().length > 0 : false;\n            },\n            getSourceListBox: function () {\n                return this.listBox;\n            },\n            getDestinationListBox: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox && sourceListBox.options.connectWith ? $(HASH + sourceListBox.options.connectWith).data(KENDO_LISTBOX) : null;\n            },\n            getItems: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? $(sourceListBox.select()) : $();\n            }\n        });\n        CommandFactory.current.register(TRANSFER_TO, TransferItemsToCommand);\n        var TransferItemsFromCommand = TransferItemsCommand.extend({\n            canExecute: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.select().length > 0 : false;\n            },\n            getSourceListBox: function () {\n                var destinationListBox = this.getDestinationListBox();\n                return destinationListBox && destinationListBox.options.connectWith ? $(HASH + destinationListBox.options.connectWith).data(KENDO_LISTBOX) : null;\n            },\n            getDestinationListBox: function () {\n                return this.listBox;\n            },\n            getItems: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? $(sourceListBox.select()) : $();\n            }\n        });\n        CommandFactory.current.register(TRANSFER_FROM, TransferItemsFromCommand);\n        var TransferAllItemsToCommand = TransferItemsToCommand.extend({\n            canExecute: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.wrapper.find(ENABLED_ITEMS_SELECTOR).length > 0 : false;\n            },\n            getItems: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.items() : $();\n            },\n            getUpdatedSelection: noop,\n            updateSelection: noop\n        });\n        CommandFactory.current.register(TRANSFER_ALL_TO, TransferAllItemsToCommand);\n        var TransferAllItemsFromCommand = TransferItemsFromCommand.extend({\n            canExecute: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.wrapper.find(ENABLED_ITEMS_SELECTOR).length > 0 : false;\n            },\n            getItems: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.items() : $();\n            },\n            getUpdatedSelection: noop,\n            updateSelection: noop\n        });\n        CommandFactory.current.register(TRANSFER_ALL_FROM, TransferAllItemsFromCommand);\n        var ToolBar = Class.extend({\n            init: function (element, options) {\n                var that = this;\n                that.element = $(element).addClass(TOOLBAR_CLASS);\n                that.options = extend({}, that.options, options);\n                that.listBox = that.options.listBox;\n                that._initTemplates();\n                that._createTools();\n                that._updateToolStates();\n                that._attachEventHandlers();\n            },\n            destroy: function () {\n                var that = this;\n                that._detachEventHandlers();\n                kendo.destroy(that.element);\n                that.element.remove();\n                that.element = null;\n            },\n            options: {\n                position: RIGHT,\n                tools: []\n            },\n            _initTemplates: function () {\n                this.templates = { tool: kendoTemplate('<li>' + '<a href=\\'\\\\\\\\#\\' class=\\'k-button k-button-icon\\' data-command=\\'#= command #\\' title=\\'#= text #\\' aria-label=\\'#= text #\\' role=\\'button\\'>' + '<span class=\\'k-icon #= iconClass #\\'></span>' + '</a>' + '</li>') };\n            },\n            _createTools: function () {\n                var that = this;\n                var tools = that.options.tools;\n                var toolsLength = tools.length;\n                var toolsMessages = that.options.messages.tools;\n                var toolList = that._createToolList();\n                var tool;\n                var i;\n                for (i = 0; i < toolsLength; i++) {\n                    tool = extend({}, ToolBar.defaultTools[tools[i]], { text: toolsMessages[tools[i]] });\n                    if (tool) {\n                        toolList.append($(that.templates.tool(tool)));\n                    }\n                }\n                that.element.append(toolList);\n            },\n            _createToolList: function () {\n                return $('<ul class=\\'k-reset\\' />');\n            },\n            _attachEventHandlers: function () {\n                var that = this;\n                that.element.on(CLICK, TOOL_SELECTOR, proxy(that._onToolClick, that));\n            },\n            _detachEventHandlers: function () {\n                this.element.off(NS).find('*').off(NS);\n            },\n            _onToolClick: function (e) {\n                e.preventDefault();\n                this._executeToolCommand($(e.currentTarget).data(COMMAND));\n            },\n            _executeToolCommand: function (command) {\n                var that = this;\n                var listBox = that.listBox;\n                if (listBox) {\n                    listBox._executeCommand(command);\n                }\n            },\n            _updateToolStates: function () {\n                var that = this;\n                var tools = that.options.tools;\n                var toolsLength = tools.length;\n                var i;\n                for (i = 0; i < toolsLength; i++) {\n                    that._updateToolState(tools[i]);\n                }\n            },\n            _updateToolState: function (toolName) {\n                var that = this;\n                var command = CommandFactory.current.create(toolName, { listBox: that.listBox });\n                var tool = that.element.find('[data-command=\\'' + toolName + '\\']');\n                var toolElement = tool[0];\n                if (toolElement && command && command.canExecute) {\n                    if (command.canExecute()) {\n                        tool.removeClass(DISABLED_STATE_CLASS).removeAttr(TABINDEX);\n                    } else {\n                        tool.addClass(DISABLED_STATE_CLASS).attr(TABINDEX, '-1');\n                    }\n                }\n            }\n        });\n        ToolBar.defaultTools = {\n            remove: {\n                command: REMOVE,\n                iconClass: 'k-i-x'\n            },\n            moveUp: {\n                command: MOVE_UP,\n                iconClass: 'k-i-arrow-60-up'\n            },\n            moveDown: {\n                command: MOVE_DOWN,\n                iconClass: 'k-i-arrow-60-down'\n            },\n            transferTo: {\n                command: TRANSFER_TO,\n                iconClass: 'k-i-arrow-60-right'\n            },\n            transferFrom: {\n                command: TRANSFER_FROM,\n                iconClass: 'k-i-arrow-60-left'\n            },\n            transferAllTo: {\n                command: TRANSFER_ALL_TO,\n                iconClass: 'k-i-arrow-double-60-right'\n            },\n            transferAllFrom: {\n                command: TRANSFER_ALL_FROM,\n                iconClass: 'k-i-arrow-double-60-left'\n            }\n        };\n        extend(ListBox, { ToolBar: ToolBar });\n        function isInputElement(element) {\n            return $(element).is(':button,a,:input,a>.k-icon,textarea,span.k-select,span.k-icon,span.k-link,label.k-checkbox-label,.k-input,.k-multiselect-wrap,.k-picker-wrap,.k-picker-wrap>.k-selected-color,.k-tool-icon,.k-dropdown');\n        }\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.maskedtextbox', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'maskedtextbox',\n        name: 'MaskedTextBox',\n        category: 'web',\n        description: 'The MaskedTextBox widget allows to specify a mask type on an input field.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var global = window;\n        var min = global.Math.min;\n        var kendo = global.kendo;\n        var caret = kendo.caret;\n        var keys = kendo.keys;\n        var ui = kendo.ui;\n        var Widget = ui.Widget;\n        var NS = '.kendoMaskedTextBox';\n        var proxy = $.proxy;\n        var setTimeout = window.setTimeout;\n        var STATEDISABLED = 'k-state-disabled';\n        var STATEINVALID = 'k-state-invalid';\n        var DISABLED = 'disabled';\n        var READONLY = 'readonly';\n        var CHANGE = 'change';\n        var MOUSEUP = 'mouseup';\n        var DROP = 'drop';\n        var KEYDOWN = 'keydown';\n        var PASTE = 'paste';\n        var INPUT = 'input';\n        function ns(name) {\n            return name + NS;\n        }\n        var INPUT_EVENT_NAME = ns(kendo.support.propertyChangeEvent ? 'propertychange' : INPUT);\n        function stringDiffStart(str1, str2) {\n            var i = 0;\n            while (i < str2.length) {\n                if (str1[i] !== str2[i]) {\n                    break;\n                }\n                i++;\n            }\n            return i;\n        }\n        var MaskedTextBox = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                var DOMElement;\n                Widget.fn.init.call(that, element, options);\n                that._rules = $.extend({}, that.rules, that.options.rules);\n                element = that.element;\n                DOMElement = element[0];\n                that._wrapper();\n                that._tokenize();\n                that._form();\n                that.element.addClass('k-textbox').attr('autocomplete', 'off').on('focus' + NS, function () {\n                    var value = DOMElement.value;\n                    if (!value) {\n                        DOMElement.value = that._old = that._emptyMask;\n                    } else {\n                        that._togglePrompt(true);\n                    }\n                    that._oldValue = value;\n                    that._timeoutId = setTimeout(function () {\n                        caret(element, 0, value ? that._maskLength : 0);\n                    });\n                }).on('focusout' + NS, function () {\n                    var value = element.val();\n                    clearTimeout(that._timeoutId);\n                    DOMElement.value = that._old = '';\n                    if (value !== that._emptyMask) {\n                        DOMElement.value = that._old = value;\n                    }\n                    that._change();\n                    that._togglePrompt();\n                });\n                var disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                that.value(that.options.value || element.val());\n                that._validationIcon = $('<span class=\\'k-icon k-i-warning\\'></span>').insertAfter(element);\n                kendo.notify(that);\n            },\n            options: {\n                name: 'MaskedTextBox',\n                clearPromptChar: false,\n                unmaskOnPost: false,\n                promptChar: '_',\n                culture: '',\n                rules: {},\n                value: '',\n                mask: ''\n            },\n            events: [CHANGE],\n            rules: {\n                '0': /\\d/,\n                '9': /\\d|\\s/,\n                '#': /\\d|\\s|\\+|\\-/,\n                'L': /[a-zA-Z]/,\n                '?': /[a-zA-Z]|\\s/,\n                '&': /\\S/,\n                'C': /./,\n                'A': /[a-zA-Z0-9]/,\n                'a': /[a-zA-Z0-9]|\\s/\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                that._rules = $.extend({}, that.rules, that.options.rules);\n                that._tokenize();\n                this._unbindInput();\n                this._bindInput();\n                that.value(that.element.val());\n            },\n            destroy: function () {\n                var that = this;\n                that.element.off(NS);\n                if (that._formElement) {\n                    that._formElement.off('reset', that._resetHandler);\n                    that._formElement.off('submit', that._submitHandler);\n                }\n                Widget.fn.destroy.call(that);\n            },\n            raw: function () {\n                var unmasked = this._unmask(this.element.val(), 0);\n                return unmasked.replace(new RegExp(escapeRegExp(this.options.promptChar), 'g'), '');\n            },\n            value: function (value) {\n                var element = this.element;\n                var emptyMask = this._emptyMask;\n                if (value === undefined) {\n                    return this.element.val();\n                }\n                if (value === null) {\n                    value = '';\n                }\n                if (!emptyMask) {\n                    this._oldValue = value;\n                    element.val(value);\n                    return;\n                }\n                value = this._unmask(value + '');\n                element.val(value ? emptyMask : '');\n                this._mask(0, this._maskLength, value);\n                this._unmaskedValue = null;\n                value = element.val();\n                this._oldValue = value;\n                if (kendo._activeElement() !== element) {\n                    if (value === emptyMask) {\n                        element.val('');\n                    } else {\n                        this._togglePrompt();\n                    }\n                }\n            },\n            _togglePrompt: function (show) {\n                var DOMElement = this.element[0];\n                var value = DOMElement.value;\n                if (this.options.clearPromptChar) {\n                    if (!show) {\n                        value = value.replace(new RegExp(escapeRegExp(this.options.promptChar), 'g'), ' ');\n                    } else {\n                        value = this._oldValue;\n                    }\n                    DOMElement.value = this._old = value;\n                }\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            _bindInput: function () {\n                var that = this;\n                if (that._maskLength) {\n                    if (that.options.$angular) {\n                        that.element.off(INPUT);\n                    }\n                    that.element.on(ns(KEYDOWN), proxy(that._keydown, that)).on(ns(DROP), proxy(that._drop, that)).on(ns(CHANGE), proxy(that._trackChange, that)).on(INPUT_EVENT_NAME, proxy(that._inputHandler, that));\n                    if (kendo.support.browser.msie) {\n                        var version = kendo.support.browser.version;\n                        if (version > 8 && version < 11) {\n                            var events = [\n                                ns(MOUSEUP),\n                                ns(DROP),\n                                ns(KEYDOWN),\n                                ns(PASTE)\n                            ].join(' ');\n                            that.element.on(events, proxy(that._legacyIEInputHandler, that));\n                        }\n                    }\n                }\n            },\n            _unbindInput: function () {\n                var events = [\n                    INPUT_EVENT_NAME,\n                    ns(KEYDOWN),\n                    ns(MOUSEUP),\n                    ns(DROP),\n                    ns(PASTE)\n                ].join(' ');\n                this.element.off(events);\n            },\n            _editable: function (options) {\n                var that = this;\n                var element = that.element;\n                var wrapper = that.wrapper;\n                var disable = options.disable;\n                var readonly = options.readonly;\n                that._unbindInput();\n                if (!readonly && !disable) {\n                    element.removeAttr(DISABLED).removeAttr(READONLY);\n                    wrapper.removeClass(STATEDISABLED);\n                    that._bindInput();\n                } else {\n                    element.attr(DISABLED, disable).attr(READONLY, readonly);\n                    wrapper.toggleClass(STATEDISABLED, disable);\n                }\n            },\n            _change: function () {\n                var that = this;\n                var value = that.value();\n                if (value !== that._oldValue) {\n                    that._oldValue = value;\n                    that.trigger(CHANGE);\n                    that.element.trigger(CHANGE);\n                } else if (value === '' && that.__changing) {\n                    that.element.trigger(CHANGE);\n                }\n            },\n            inputChange: function (backward) {\n                var that = this;\n                var old = that._old;\n                var element = that.element[0];\n                var value = element.value;\n                var selection = caret(element);\n                var cursor = selection[1];\n                var lengthDiff = value.length - old.length;\n                var mobile = kendo.support.mobileOS;\n                if (that.__dropping && lengthDiff < 0) {\n                    return;\n                }\n                if (lengthDiff === -1 && mobile.android && mobile.browser === 'chrome') {\n                    backward = true;\n                }\n                var contentStart = min(cursor, stringDiffStart(value, old));\n                var content = value.substring(contentStart, cursor);\n                element.value = value.substring(0, contentStart) + that._emptyMask.substring(contentStart);\n                var caretPos = that._mask(contentStart, cursor, content);\n                var endContent = that._trimStartPromptChars(value.substring(cursor), min(lengthDiff, caretPos - contentStart));\n                var unmasked = that._unmask(endContent, old.length - endContent.length);\n                that._mask(caretPos, caretPos, unmasked);\n                if (backward) {\n                    caretPos = that._findCaretPosBackwards(contentStart);\n                }\n                caret(element, caretPos);\n                that.__dropping = false;\n            },\n            _trimStartPromptChars: function (content, count) {\n                var promptChar = this.options.promptChar;\n                while (count-- > 0 && content.indexOf(promptChar) === 0) {\n                    content = content.substring(1);\n                }\n                return content;\n            },\n            _findCaretPosBackwards: function (pos) {\n                var caretStart = this._find(pos, true);\n                if (caretStart < pos) {\n                    caretStart += 1;\n                }\n                return caretStart;\n            },\n            _inputHandler: function () {\n                if (kendo._activeElement() !== this.element[0]) {\n                    return;\n                }\n                this.inputChange(this.__backward);\n            },\n            _legacyIEInputHandler: function (e) {\n                var that = this;\n                var input = that.element[0];\n                var value = input.value;\n                var type = e.type;\n                that.__pasting = type === 'paste';\n                setTimeout(function () {\n                    if (type === 'mouseup' && that.__pasting) {\n                        return;\n                    }\n                    if (input.value && input.value !== value) {\n                        that.inputChange(that.__backward);\n                    }\n                });\n            },\n            _trackChange: function () {\n                var that = this;\n                that.__changing = true;\n                setTimeout(function () {\n                    that.__changing = false;\n                });\n            },\n            _form: function () {\n                var that = this;\n                var element = that.element;\n                var formId = element.attr('form');\n                var form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(element[0].value);\n                        });\n                    };\n                    that._submitHandler = function () {\n                        that.element[0].value = that._old = that.raw();\n                    };\n                    if (that.options.unmaskOnPost) {\n                        form.on('submit', that._submitHandler);\n                    }\n                    that._formElement = form.on('reset', that._resetHandler);\n                }\n            },\n            _keydown: function (e) {\n                var key = e.keyCode;\n                this.__backward = key === keys.BACKSPACE;\n                if (key === keys.ENTER) {\n                    this._change();\n                }\n            },\n            _drop: function () {\n                this.__dropping = true;\n            },\n            _find: function (idx, backward) {\n                var value = this.element.val() || this._emptyMask;\n                var step = 1;\n                if (backward === true) {\n                    step = -1;\n                }\n                while (idx > -1 || idx <= this._maskLength) {\n                    if (value.charAt(idx) !== this.tokens[idx]) {\n                        return idx;\n                    }\n                    idx += step;\n                }\n                return -1;\n            },\n            _mask: function (start, end, value, backward) {\n                var element = this.element[0];\n                var current = element.value || this._emptyMask;\n                var empty = this.options.promptChar;\n                var valueLength;\n                var chrIdx = 0;\n                var unmasked;\n                var chr;\n                var idx;\n                start = this._find(start, backward);\n                if (start > end) {\n                    end = start;\n                }\n                unmasked = this._unmask(current.substring(end), end);\n                value = this._unmask(value, start);\n                valueLength = value.length;\n                if (value) {\n                    unmasked = unmasked.replace(new RegExp('^_{0,' + valueLength + '}'), '');\n                }\n                value += unmasked;\n                current = current.split('');\n                chr = value.charAt(chrIdx);\n                while (start < this._maskLength) {\n                    current[start] = chr || empty;\n                    chr = value.charAt(++chrIdx);\n                    if (idx === undefined && chrIdx > valueLength) {\n                        idx = start;\n                    }\n                    start = this._find(start + 1);\n                }\n                element.value = this._old = current.join('');\n                if (kendo._activeElement() === element) {\n                    if (idx === undefined) {\n                        idx = this._maskLength;\n                    }\n                    caret(element, idx);\n                }\n                return idx;\n            },\n            _unmask: function (value, idx) {\n                if (!value) {\n                    return '';\n                }\n                if (this._unmaskedValue === value) {\n                    return this._unmaskedValue;\n                }\n                value = (value + '').split('');\n                var chr;\n                var token;\n                var chrIdx = 0;\n                var tokenIdx = idx || 0;\n                var empty = this.options.promptChar;\n                var valueLength = value.length;\n                var tokensLength = this.tokens.length;\n                var result = '';\n                while (tokenIdx < tokensLength) {\n                    chr = value[chrIdx];\n                    token = this.tokens[tokenIdx];\n                    if (chr === token || chr === empty) {\n                        result += chr === empty ? empty : '';\n                        chrIdx += 1;\n                        tokenIdx += 1;\n                    } else if (typeof token !== 'string') {\n                        if (token && token.test && token.test(chr) || $.isFunction(token) && token(chr)) {\n                            result += chr;\n                            tokenIdx += 1;\n                        } else {\n                            if (valueLength === 1) {\n                                this._blinkInvalidState();\n                            }\n                        }\n                        chrIdx += 1;\n                    } else {\n                        tokenIdx += 1;\n                    }\n                    if (chrIdx >= valueLength) {\n                        break;\n                    }\n                }\n                this._unmaskedValue = result;\n                return result;\n            },\n            _wrapper: function () {\n                var that = this;\n                var element = that.element;\n                var DOMElement = element[0];\n                var wrapper = element.wrap('<span class=\\'k-widget k-maskedtextbox\\'></span>').parent();\n                wrapper[0].style.cssText = DOMElement.style.cssText;\n                DOMElement.style.width = '100%';\n                that.wrapper = wrapper.addClass(DOMElement.className).removeClass('input-validation-error');\n            },\n            _blinkInvalidState: function () {\n                var that = this;\n                that.wrapper.addClass(STATEINVALID);\n                clearTimeout(that._invalidStateTimeout);\n                that._invalidStateTimeout = setTimeout(proxy(that._removeInvalidState, that), 100);\n            },\n            _removeInvalidState: function () {\n                var that = this;\n                that.wrapper.removeClass(STATEINVALID);\n                that._invalidStateTimeout = null;\n            },\n            _tokenize: function () {\n                var tokens = [];\n                var tokenIdx = 0;\n                var mask = this.options.mask || '';\n                var maskChars = mask.split('');\n                var length = maskChars.length;\n                var idx = 0;\n                var chr;\n                var rule;\n                var emptyMask = '';\n                var promptChar = this.options.promptChar;\n                var numberFormat = kendo.getCulture(this.options.culture).numberFormat;\n                var rules = this._rules;\n                for (; idx < length; idx++) {\n                    chr = maskChars[idx];\n                    rule = rules[chr];\n                    if (rule) {\n                        tokens[tokenIdx] = rule;\n                        emptyMask += promptChar;\n                        tokenIdx += 1;\n                    } else {\n                        if (chr === '.' || chr === ',') {\n                            chr = numberFormat[chr];\n                        } else if (chr === '$') {\n                            chr = numberFormat.currency.symbol;\n                        } else if (chr === '\\\\') {\n                            idx += 1;\n                            chr = maskChars[idx];\n                        }\n                        chr = chr.split('');\n                        for (var i = 0, l = chr.length; i < l; i++) {\n                            tokens[tokenIdx] = chr[i];\n                            emptyMask += chr[i];\n                            tokenIdx += 1;\n                        }\n                    }\n                }\n                this.tokens = tokens;\n                this._emptyMask = emptyMask;\n                this._maskLength = emptyMask.length;\n            }\n        });\n        function escapeRegExp(text) {\n            return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n        }\n        ui.plugin(MaskedTextBox);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.menu', [\n        'kendo.popup',\n        'kendo.data'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'menu',\n        name: 'Menu',\n        category: 'web',\n        description: 'The Menu widget displays hierarchical data as a multi-level menu.',\n        depends: [\n            'popup',\n            'data',\n            'data.odata'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, activeElement = kendo._activeElement, touch = kendo.support.touch && kendo.support.mobileOS, isArray = $.isArray, HierarchicalDataSource = kendo.data.HierarchicalDataSource, MOUSEDOWN = 'mousedown', CLICK = 'click', DELAY = 30, SCROLLSPEED = 50, extend = $.extend, proxy = $.proxy, each = $.each, template = kendo.template, keys = kendo.keys, Widget = ui.Widget, excludedNodesRegExp = /^(ul|a|div)$/i, NS = '.kendoMenu', IMG = 'img', OPEN = 'open', MENU = 'k-menu', LINK = 'k-link k-menu-link', LINK_SELECTOR = '.k-link', ICON_SELECTOR = '.k-menu-expand-arrow', LAST = 'k-last', CLOSE = 'close', TIMER = 'timer', FIRST = 'k-first', IMAGE = 'k-image', SELECT = 'select', ZINDEX = 'zIndex', ACTIVATE = 'activate', DEACTIVATE = 'deactivate', POINTERDOWN = 'touchstart' + NS + ' MSPointerDown' + NS + ' pointerdown' + NS, pointers = kendo.support.pointers, msPointers = kendo.support.msPointers, allPointers = msPointers || pointers, CHANGE = 'change', ERROR = 'error', TOUCHSTART = kendo.support.touch ? 'touchstart' : '', MOUSEENTER = pointers ? 'pointerover' : msPointers ? 'MSPointerOver' : 'mouseenter', MOUSELEAVE = pointers ? 'pointerout' : msPointers ? 'MSPointerOut' : 'mouseleave', MOUSEWHEEL = 'DOMMouseScroll' + NS + ' mousewheel' + NS, RESIZE = kendo.support.resize + NS, SCROLLWIDTH = 'scrollWidth', SCROLLHEIGHT = 'scrollHeight', OFFSETWIDTH = 'offsetWidth', OFFSETHEIGHT = 'offsetHeight', POPUP_ID_ATTR = 'group', POPUP_OPENER_ATTR = 'groupparent', DOCUMENT_ELEMENT = $(document.documentElement), KENDOPOPUP = 'kendoPopup', DEFAULTSTATE = 'k-state-default', HOVERSTATE = 'k-state-hover', FOCUSEDSTATE = 'k-state-focused', DISABLEDSTATE = 'k-state-disabled', SELECTEDSTATE = 'k-state-selected', menuSelector = '.k-menu', groupSelector = '.k-menu-group', animationContainerSelector = '.k-animation-container', popupSelector = groupSelector + ',' + animationContainerSelector, allItemsSelector = ':not(.k-list) > .k-item', disabledSelector = '.k-item.k-state-disabled', itemSelector = '.k-item', availableItemsSelector = '.k-item:not(.k-state-disabled)', linkSelector = '.k-item:not(.k-state-disabled) > .k-link', exclusionSelector = ':not(.k-item.k-separator)', nextSelector = itemSelector + exclusionSelector + ':eq(0)', lastSelector = itemSelector + exclusionSelector + ':last', templateSelector = 'div:not(.k-animation-container,.k-list-container)', scrollButtonSelector = '.k-menu-scroll-button', touchPointerTypes = {\n                '2': 1,\n                'touch': 1\n            }, STRING = 'string', DATABOUND = 'dataBound', bindings = {\n                text: 'dataTextField',\n                url: 'dataUrlField',\n                spriteCssClass: 'dataSpriteCssClassField',\n                imageUrl: 'dataImageUrlField',\n                imageAttr: 'dataImageAttrField',\n                content: 'dataContentField'\n            }, rendering = {\n                wrapperCssClass: function (group, item) {\n                    var result = 'k-item k-menu-item', index = item.index;\n                    if (item.enabled === false) {\n                        result += ' k-state-disabled';\n                    } else {\n                        result += ' k-state-default';\n                    }\n                    if (group.firstLevel && index === 0) {\n                        result += ' k-first';\n                    }\n                    if (index == group.length - 1) {\n                        result += ' k-last';\n                    }\n                    if (item.cssClass) {\n                        result += ' ' + item.cssClass;\n                    }\n                    if (item.attr && item.attr.hasOwnProperty('class')) {\n                        result += ' ' + item.attr['class'];\n                    }\n                    if (item.selected) {\n                        result += ' ' + SELECTEDSTATE;\n                    }\n                    return result;\n                },\n                itemCssAttributes: function (item) {\n                    var result = '';\n                    var attributes = item.attr || {};\n                    for (var attr in attributes) {\n                        if (attributes.hasOwnProperty(attr) && attr !== 'class') {\n                            result += attr + '=\"' + attributes[attr] + '\" ';\n                        }\n                    }\n                    return result;\n                },\n                imageCssAttributes: function (imgAttributes) {\n                    var result = '';\n                    var attributes = imgAttributes && imgAttributes.toJSON ? imgAttributes.toJSON() : {};\n                    if (!attributes['class']) {\n                        attributes['class'] = IMAGE;\n                    } else {\n                        attributes['class'] += ' ' + IMAGE;\n                    }\n                    for (var attr in attributes) {\n                        if (attributes.hasOwnProperty(attr)) {\n                            result += attr + '=\"' + attributes[attr] + '\" ';\n                        }\n                    }\n                    return result;\n                },\n                contentCssAttributes: function (item) {\n                    var result = '';\n                    var attributes = item.contentAttr || {};\n                    var defaultClasses = 'k-content k-group k-menu-group';\n                    if (!attributes['class']) {\n                        attributes['class'] = defaultClasses;\n                    } else {\n                        attributes['class'] += ' ' + defaultClasses;\n                    }\n                    for (var attr in attributes) {\n                        if (attributes.hasOwnProperty(attr)) {\n                            result += attr + '=\"' + attributes[attr] + '\" ';\n                        }\n                    }\n                    return result;\n                },\n                textClass: function () {\n                    return LINK;\n                },\n                arrowClass: function (item, group) {\n                    var result = 'k-menu-expand-arrow k-icon';\n                    if (group.horizontal) {\n                        result += ' k-i-arrow-60-down';\n                    } else {\n                        result += ' k-i-arrow-60-right';\n                    }\n                    return result;\n                },\n                groupAttributes: function (group) {\n                    return group.expanded !== true ? ' style=\\'display:none\\'' : '';\n                },\n                groupCssClass: function () {\n                    return 'k-group k-menu-group';\n                },\n                content: function (item) {\n                    return item.content ? item.content : '&nbsp;';\n                }\n            };\n        function getEffectDirection(direction, root) {\n            direction = direction.split(' ')[!root + 0] || direction;\n            return direction.replace('top', 'up').replace('bottom', 'down');\n        }\n        function parseDirection(direction, root, isRtl) {\n            direction = direction.split(' ')[!root + 0] || direction;\n            var output = {\n                    origin: [\n                        'bottom',\n                        isRtl ? 'right' : 'left'\n                    ],\n                    position: [\n                        'top',\n                        isRtl ? 'right' : 'left'\n                    ]\n                }, horizontal = /left|right/.test(direction);\n            if (horizontal) {\n                output.origin = [\n                    'top',\n                    direction\n                ];\n                output.position[1] = kendo.directions[direction].reverse;\n            } else {\n                output.origin[0] = direction;\n                output.position[0] = kendo.directions[direction].reverse;\n            }\n            output.origin = output.origin.join(' ');\n            output.position = output.position.join(' ');\n            return output;\n        }\n        function contains(parent, child) {\n            try {\n                return $.contains(parent, child);\n            } catch (e) {\n                return false;\n            }\n        }\n        function updateItemClasses(item) {\n            item = $(item);\n            item.addClass('k-item k-menu-item').children(IMG).addClass(IMAGE);\n            item.children('a').addClass(LINK).children(IMG).addClass(IMAGE);\n            item.filter(':not([disabled])').addClass(DEFAULTSTATE);\n            item.filter('.k-separator').removeClass('k-menu-item').addClass('k-menu-separator').empty().append('&nbsp;');\n            item.filter('li[disabled]').addClass(DISABLEDSTATE).removeAttr('disabled').attr('aria-disabled', true);\n            if (!item.filter('[role]').length) {\n                item.attr('role', 'menuitem');\n            }\n            if (!item.children(LINK_SELECTOR).length) {\n                item.contents().filter(function () {\n                    return !this.nodeName.match(excludedNodesRegExp) && !(this.nodeType == 3 && !$.trim(this.nodeValue));\n                }).wrapAll('<span class=\\'' + LINK + '\\'/>');\n            }\n            updateArrow(item);\n            updateFirstLast(item);\n        }\n        function updateArrow(item) {\n            item = $(item);\n            item.find('> .k-link > [class*=k-i-arrow-60]:not(.k-sprite)').remove();\n            item.filter(':has(.k-menu-group)').children('.k-link:not(:has([class*=k-i-arrow]:not(.k-sprite)))').each(function () {\n                var item = $(this), arrowCssClass = getArrowCssClass(item);\n                item.append('<span class=\\'k-menu-expand-arrow k-icon ' + arrowCssClass + '\\' />');\n            });\n        }\n        function getArrowCssClass(item) {\n            var arrowCssClass, parent = item.parent().parent(), isRtl = kendo.support.isRtl(parent);\n            if (parent.hasClass(MENU + '-horizontal')) {\n                arrowCssClass = 'k-i-arrow-60-down';\n            } else {\n                if (isRtl) {\n                    arrowCssClass = 'k-i-arrow-60-left';\n                } else {\n                    arrowCssClass = 'k-i-arrow-60-right';\n                }\n            }\n            return arrowCssClass;\n        }\n        function updateFirstLast(item) {\n            item = $(item);\n            item.filter('.k-first:not(:first-child)').removeClass(FIRST);\n            item.filter('.k-last:not(:last-child)').removeClass(LAST);\n            item.filter(':first-child').addClass(FIRST);\n            item.filter(':last-child').addClass(LAST);\n        }\n        function updateHasAriaPopup(parents) {\n            if (parents && parents.length) {\n                for (var index in parents) {\n                    var parentLi = parents.eq(index);\n                    if (parentLi.find('ul').length) {\n                        parentLi.attr('aria-haspopup', true);\n                    } else {\n                        parentLi.removeAttr('aria-haspopup');\n                    }\n                }\n            }\n        }\n        function getParentLiItems(group) {\n            if (!group.hasClass(MENU)) {\n                return group.parentsUntil('.' + MENU, 'li');\n            }\n        }\n        function storeItemSelectEventHandler(element, options) {\n            var selectHandler = getItemSelectEventHandler(options);\n            if (selectHandler) {\n                setItemData(element, selectHandler);\n            }\n            if (options.items) {\n                $(element).children('ul').children('li').each(function (i) {\n                    storeItemSelectEventHandler(this, options.items[i]);\n                });\n            }\n        }\n        function setItemData(element, selectHandler) {\n            $(element).children('.k-link').data({ selectHandler: selectHandler });\n        }\n        function getItemSelectEventHandler(options) {\n            var selectHandler = options.select, isFunction = kendo.isFunction;\n            if (selectHandler && isFunction(selectHandler)) {\n                return selectHandler;\n            }\n            return null;\n        }\n        function popupOpenerSelector(id) {\n            return id ? 'li[data-groupparent=\\'' + id + '\\']' : 'li[data-groupparent]';\n        }\n        function popupGroupSelector(id) {\n            var selector = id ? '[data-group=\\'' + id + '\\']' : '[data-group]';\n            return 'ul' + selector + ',div' + selector;\n        }\n        function getChildPopups(currentPopup, overflowWrapper) {\n            var childPopupOpener = currentPopup.find(popupOpenerSelector());\n            var result = [];\n            childPopupOpener.each(function (i, opener) {\n                opener = $(opener);\n                var popupId = opener.data(POPUP_OPENER_ATTR);\n                var popup = currentPopup;\n                while (popupId) {\n                    popup = overflowWrapper.find(popupGroupSelector(popupId) + ':visible');\n                    if (popup.length) {\n                        result.push(popup);\n                    }\n                    opener = popup.find(popupOpenerSelector());\n                    popupId = opener.data(POPUP_OPENER_ATTR);\n                }\n            });\n            return result;\n        }\n        function popupParentItem(popupElement, overflowWrapper) {\n            var popupId = popupElement.data(POPUP_ID_ATTR);\n            return popupId ? overflowWrapper.find(popupOpenerSelector(popupId)) : $([]);\n        }\n        function itemPopup(item, overflowWrapper) {\n            var popupId = item.data(POPUP_OPENER_ATTR);\n            return popupId ? overflowWrapper.children(animationContainerSelector).children(popupGroupSelector(popupId)) : $([]);\n        }\n        function overflowMenuParents(current, overflowWrapper) {\n            var parents = [];\n            var getParents = function (item) {\n                while (item.parentNode && !overflowWrapper.is(item.parentNode)) {\n                    parents.push(item.parentNode);\n                    item = item.parentNode;\n                }\n            };\n            var elem = current[0] || current;\n            getParents(elem);\n            var last = parents[parents.length - 1];\n            while ($(last).is(animationContainerSelector)) {\n                var popupElement = $(last).children('ul');\n                elem = popupParentItem(popupElement, overflowWrapper)[0];\n                if (!elem) {\n                    break;\n                }\n                parents.push(elem);\n                getParents(elem);\n                last = parents[parents.length - 1];\n            }\n            return parents;\n        }\n        function mousewheelDelta(e) {\n            var delta = 0;\n            if (e.wheelDelta) {\n                delta = -e.wheelDelta / 120;\n                delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);\n            }\n            if (e.detail) {\n                delta = Math.round(e.detail / 3);\n            }\n            return delta;\n        }\n        function parentsScroll(current, scrollDirection) {\n            var scroll = 0;\n            var parent = current.parentNode;\n            while (parent && !isNaN(parent[scrollDirection])) {\n                scroll += parent[scrollDirection];\n                parent = parent.parentNode;\n            }\n            return scroll;\n        }\n        function isPointerTouch(e) {\n            return allPointers && e.originalEvent && e.originalEvent.pointerType in touchPointerTypes;\n        }\n        function isTouch(e) {\n            var ev = e.originalEvent;\n            return touch && /touch/i.test(ev.type || '');\n        }\n        function removeSpacesBetweenItems(ul) {\n            ul.contents().filter(function () {\n                return this.nodeName != 'LI';\n            }).remove();\n        }\n        var Menu = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                element = that.wrapper = that.element;\n                options = that.options;\n                that._accessors();\n                that._templates();\n                that._dataSource();\n                that._updateClasses();\n                that._animations(options);\n                that.nextItemZIndex = 100;\n                that._tabindex();\n                that._initOverflow(options);\n                that._attachMenuEventsHandlers();\n                if (options.openOnClick) {\n                    that.clicked = false;\n                }\n                element.attr('role', 'menubar');\n                if (element[0].id) {\n                    that._ariaId = kendo.format('{0}_mn_active', element[0].id);\n                }\n                kendo.notify(that);\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                ACTIVATE,\n                DEACTIVATE,\n                SELECT,\n                DATABOUND\n            ],\n            options: {\n                name: 'Menu',\n                animation: {\n                    open: { duration: 200 },\n                    close: { duration: 100 }\n                },\n                orientation: 'horizontal',\n                direction: 'default',\n                openOnClick: false,\n                closeOnClick: true,\n                hoverDelay: 100,\n                scrollable: false,\n                popupCollision: undefined\n            },\n            _initData: function () {\n                var that = this;\n                if (that.dataSource) {\n                    that.angular('cleanup', function () {\n                        return { elements: that.element.children() };\n                    });\n                    that.element.empty();\n                    that.append(that.dataSource.view(), that.element);\n                    that.angular('compile', function () {\n                        return { elements: that.element.children() };\n                    });\n                }\n            },\n            _attachMenuEventsHandlers: function () {\n                var that = this;\n                var element = that.element;\n                var options = that.options;\n                var overflowWrapper = that._overflowWrapper();\n                (overflowWrapper || element).on(POINTERDOWN, itemSelector, proxy(that._focusHandler, that)).on(CLICK + NS, disabledSelector, false).on(CLICK + NS, itemSelector, proxy(that._click, that)).on(POINTERDOWN + ' ' + MOUSEDOWN + NS, '.k-content', proxy(that._preventClose, that)).on(MOUSEENTER + NS, availableItemsSelector, proxy(that._mouseenter, that)).on(MOUSELEAVE + NS, availableItemsSelector, proxy(that._mouseleave, that)).on(MOUSEDOWN + NS, availableItemsSelector, proxy(that._mousedown, that)).on(TOUCHSTART + NS + ' ' + MOUSEENTER + NS + ' ' + MOUSELEAVE + NS + ' ' + MOUSEDOWN + NS + ' ' + CLICK + NS, linkSelector, proxy(that._toggleHover, that));\n                element.on('keydown' + NS, proxy(that._keydown, that)).on('focus' + NS, proxy(that._focus, that)).on('focus' + NS, '.k-content', proxy(that._focus, that)).on('blur' + NS, proxy(that._removeHoverItem, that)).on('blur' + NS, '[tabindex]', proxy(that._checkActiveElement, that));\n                if (overflowWrapper) {\n                    overflowWrapper.on(MOUSELEAVE + NS, popupSelector, proxy(that._mouseleavePopup, that)).on(MOUSEENTER + NS, popupSelector, proxy(that._mouseenterPopup, that));\n                }\n                if (options.openOnClick) {\n                    that._documentClickHandler = proxy(that._documentClick, that);\n                    $(document).click(that._documentClickHandler);\n                }\n            },\n            _detachMenuEventsHandlers: function () {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                if (overflowWrapper) {\n                    overflowWrapper.off(NS);\n                }\n                that.element.off(NS);\n                if (that._documentClickHandler) {\n                    $(document).unbind('click', that._documentClickHandler);\n                }\n            },\n            _initOverflow: function (options) {\n                var that = this;\n                var isHorizontal = options.orientation == 'horizontal';\n                var backwardBtn, forwardBtn;\n                if (options.scrollable) {\n                    that._openedPopups = {};\n                    that._scrollWrapper = that.element.wrap('<div class=\\'k-menu-scroll-wrapper ' + options.orientation + '\\'></div>').parent();\n                    if (isHorizontal) {\n                        removeSpacesBetweenItems(that.element);\n                    }\n                    backwardBtn = $(that.templates.scrollButton({ direction: isHorizontal ? 'left' : 'up' }));\n                    forwardBtn = $(that.templates.scrollButton({ direction: isHorizontal ? 'right' : 'down' }));\n                    backwardBtn.add(forwardBtn).appendTo(that._scrollWrapper);\n                    that._initScrolling(that.element, backwardBtn, forwardBtn, isHorizontal);\n                    var initialWidth = that.element.outerWidth();\n                    var initialCssWidth = that.element[0].style.width;\n                    initialCssWidth = initialCssWidth === 'auto' ? '' : initialCssWidth;\n                    if (isHorizontal) {\n                        $(window).on(RESIZE, kendo.throttle(function () {\n                            that._setOverflowWrapperWidth(initialWidth, initialCssWidth);\n                            that._toggleScrollButtons(that.element, backwardBtn, forwardBtn, isHorizontal);\n                        }, 100));\n                    }\n                    that._setOverflowWrapperWidth(initialWidth, initialCssWidth);\n                    that._toggleScrollButtons(that.element, backwardBtn, forwardBtn, isHorizontal);\n                }\n            },\n            _overflowWrapper: function () {\n                return this._scrollWrapper || this._popupsWrapper;\n            },\n            _setOverflowWrapperWidth: function (initialWidth, initialCssWidth) {\n                var that = this;\n                var wrapperCssWidth = that._scrollWrapper.css('width');\n                that._scrollWrapper.css({ width: '' });\n                var wrapperWidth = that._scrollWrapper.outerWidth();\n                that._scrollWrapper.css({ width: wrapperCssWidth });\n                var menuWidth = that.element.outerWidth();\n                var borders = that.element[0].offsetWidth - that.element[0].clientWidth;\n                if (menuWidth != wrapperWidth && wrapperWidth > 0) {\n                    var width = initialCssWidth ? Math.min(initialWidth, wrapperWidth) : wrapperWidth;\n                    that.element.width(width - borders);\n                    that._scrollWrapper.width(width);\n                }\n            },\n            _reinitOverflow: function (options) {\n                var that = this;\n                var overflowChanged = options.scrollable && !that.options.scrollable || !options.scrollable && that.options.scrollable || options.scrollable && that.options.scrollable && options.scrollable.distance != that.options.scrollable.distance || options.orientation != that.options.orientation;\n                if (overflowChanged) {\n                    that._detachMenuEventsHandlers();\n                    that._destroyOverflow();\n                    that._initOverflow(options);\n                    that._attachMenuEventsHandlers();\n                }\n            },\n            _destroyOverflow: function () {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                if (overflowWrapper) {\n                    overflowWrapper.off(NS);\n                    overflowWrapper.find(scrollButtonSelector).off(NS).remove();\n                    overflowWrapper.children(animationContainerSelector).each(function (i, popupWrapper) {\n                        var ul = $(popupWrapper).children(groupSelector);\n                        ul.off(MOUSEWHEEL);\n                        var popupParentLi = popupParentItem(ul, overflowWrapper);\n                        if (popupParentLi.length) {\n                            popupParentLi.append(popupWrapper);\n                        }\n                    });\n                    overflowWrapper.find(popupOpenerSelector()).removeAttr('data-groupparent');\n                    overflowWrapper.find(popupGroupSelector()).removeAttr('data-group');\n                    that.element.off(MOUSEWHEEL);\n                    $(window).off(RESIZE);\n                    overflowWrapper.contents().unwrap();\n                    that._scrollWrapper = that._popupsWrapper = that._openedPopups = undefined;\n                }\n            },\n            _initScrolling: function (scrollElement, backwardBtn, forwardBtn, isHorizontal) {\n                var that = this;\n                var scrollable = that.options.scrollable;\n                var distance = $.isNumeric(scrollable.distance) ? scrollable.distance : SCROLLSPEED;\n                var mouseWheelDistance = distance / 2;\n                var backward = '-=' + distance;\n                var forward = '+=' + distance;\n                var backwardDouble = '-=' + distance * 2;\n                var forwardDouble = '+=' + distance * 2;\n                var scrolling = false;\n                var touchEvents = false;\n                var scroll = function (value) {\n                    var scrollValue = isHorizontal ? { 'scrollLeft': value } : { 'scrollTop': value };\n                    scrollElement.finish().animate(scrollValue, 'fast', 'linear', function () {\n                        if (scrolling) {\n                            scroll(value);\n                        }\n                    });\n                    that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n                };\n                var mouseenterHandler = function (e) {\n                    if (!scrolling && !touchEvents) {\n                        scroll(e.data.direction);\n                        scrolling = true;\n                    }\n                };\n                var mousedownHandler = function (e) {\n                    var scrollValue = isHorizontal ? { 'scrollLeft': e.data.direction } : { 'scrollTop': e.data.direction };\n                    touchEvents = isTouch(e) || isPointerTouch(e);\n                    scrollElement.stop().animate(scrollValue, 'fast', 'linear', function () {\n                        if (!touchEvents) {\n                            $(e.currentTarget).trigger(MOUSEENTER);\n                        } else {\n                            that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n                            scrolling = true;\n                        }\n                    });\n                    scrolling = false;\n                    e.stopPropagation();\n                    e.preventDefault();\n                };\n                backwardBtn.on(MOUSEENTER + NS, { direction: backward }, mouseenterHandler).on(kendo.eventMap.down + NS, { direction: backwardDouble }, mousedownHandler);\n                forwardBtn.on(MOUSEENTER + NS, { direction: forward }, mouseenterHandler).on(kendo.eventMap.down + NS, { direction: forwardDouble }, mousedownHandler);\n                backwardBtn.add(forwardBtn).on(MOUSELEAVE + NS, function () {\n                    scrollElement.stop();\n                    scrolling = false;\n                    that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n                });\n                scrollElement.on(MOUSEWHEEL, function (e) {\n                    if (!e.ctrlKey && !e.shiftKey && !e.altKey) {\n                        var wheelDelta = mousewheelDelta(e.originalEvent);\n                        var scrollSpeed = Math.abs(wheelDelta) * mouseWheelDistance;\n                        var value = (wheelDelta > 0 ? '+=' : '-=') + scrollSpeed;\n                        var scrollValue = isHorizontal ? { 'scrollLeft': value } : { 'scrollTop': value };\n                        that._closeChildPopups(scrollElement);\n                        scrollElement.finish().animate(scrollValue, 'fast', 'linear', function () {\n                            that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n                        });\n                        e.preventDefault();\n                    }\n                });\n            },\n            _toggleScrollButtons: function (scrollElement, backwardBtn, forwardBtn, horizontal) {\n                var currentScroll = horizontal ? scrollElement.scrollLeft() : scrollElement.scrollTop();\n                var scrollSize = horizontal ? SCROLLWIDTH : SCROLLHEIGHT;\n                var offset = horizontal ? OFFSETWIDTH : OFFSETHEIGHT;\n                backwardBtn.toggle(currentScroll !== 0);\n                forwardBtn.toggle(currentScroll < scrollElement[0][scrollSize] - scrollElement[0][offset] - 1);\n            },\n            setOptions: function (options) {\n                var animation = this.options.animation;\n                this._animations(options);\n                options.animation = extend(true, animation, options.animation);\n                if ('dataSource' in options) {\n                    this._dataSource(options);\n                }\n                this._updateClasses();\n                this._reinitOverflow(options);\n                Widget.fn.setOptions.call(this, options);\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that._detachMenuEventsHandlers();\n                that._destroyOverflow();\n                kendo.destroy(that.element);\n            },\n            enable: function (element, enable) {\n                this._toggleDisabled(element, enable !== false);\n                return this;\n            },\n            disable: function (element) {\n                this._toggleDisabled(element, false);\n                return this;\n            },\n            attemptGetItem: function (candidate) {\n                candidate = candidate || this.element;\n                var item = this.element.find(candidate);\n                var overflowWrapper = this._overflowWrapper();\n                if (item.length || candidate === this.element) {\n                    return item;\n                } else if (overflowWrapper) {\n                    return overflowWrapper.find(candidate);\n                } else {\n                    return $();\n                }\n            },\n            append: function (item, referenceItem) {\n                referenceItem = this.attemptGetItem(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.length ? this._childPopupElement(referenceItem) : null);\n                each(inserted.items, function (i) {\n                    inserted.group.append(this);\n                    updateArrow(this);\n                    storeItemSelectEventHandler(this, item[i] || item);\n                });\n                updateArrow(referenceItem);\n                updateFirstLast(inserted.group.find('.k-first, .k-last').add(inserted.items));\n                updateHasAriaPopup(getParentLiItems(inserted.group));\n                return this;\n            },\n            insertBefore: function (item, referenceItem) {\n                referenceItem = this.attemptGetItem(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.parent());\n                each(inserted.items, function (i) {\n                    referenceItem.before(this);\n                    updateArrow(this);\n                    updateFirstLast(this);\n                    storeItemSelectEventHandler(this, item[i] || item);\n                });\n                updateFirstLast(referenceItem);\n                return this;\n            },\n            insertAfter: function (item, referenceItem) {\n                referenceItem = this.attemptGetItem(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.parent());\n                each(inserted.items, function (i) {\n                    referenceItem.after(this);\n                    updateArrow(this);\n                    updateFirstLast(this);\n                    storeItemSelectEventHandler(this, item[i] || item);\n                });\n                updateFirstLast(referenceItem);\n                return this;\n            },\n            _insert: function (item, referenceItem, parent) {\n                var that = this, items, groups;\n                if (!referenceItem || !referenceItem.length) {\n                    parent = that.element;\n                }\n                var plain = $.isPlainObject(item) || item instanceof kendo.data.ObservableObject, groupData = {\n                        firstLevel: parent.hasClass(MENU),\n                        horizontal: parent.hasClass(MENU + '-horizontal'),\n                        expanded: true,\n                        length: parent.children().length\n                    };\n                if (referenceItem && !parent.length) {\n                    parent = $(that.renderGroup({\n                        group: groupData,\n                        options: that.options\n                    })).appendTo(referenceItem);\n                }\n                if (plain || isArray(item) || item instanceof kendo.data.ObservableArray) {\n                    items = $($.map(plain ? [item] : item, function (value, idx) {\n                        if (typeof value === 'string') {\n                            return $(value).get();\n                        } else {\n                            return $(that.renderItem({\n                                group: groupData,\n                                item: extend(value, { index: idx })\n                            })).get();\n                        }\n                    }));\n                } else {\n                    if (typeof item == 'string' && item.charAt(0) != '<') {\n                        items = that.element.find(item);\n                    } else {\n                        items = $(item);\n                    }\n                    groups = items.find('> ul').addClass('k-menu-group').attr('role', 'menu');\n                    items = items.filter('li');\n                    items.add(groups.find('> li')).each(function () {\n                        updateItemClasses(this);\n                    });\n                }\n                return {\n                    items: items,\n                    group: parent\n                };\n            },\n            remove: function (element) {\n                element = this.attemptGetItem(element);\n                var that = this, parent = element.parentsUntil(that.element, allItemsSelector), group = element.parent('ul:not(.k-menu)');\n                element.remove();\n                if (group && !group.children(allItemsSelector).length) {\n                    var parentItems = getParentLiItems(group);\n                    var container = group.parent(animationContainerSelector);\n                    if (container.length) {\n                        container.remove();\n                    } else {\n                        group.remove();\n                    }\n                    updateHasAriaPopup(parentItems);\n                }\n                if (parent.length) {\n                    parent = parent.eq(0);\n                    updateArrow(parent);\n                    updateFirstLast(parent);\n                }\n                return that;\n            },\n            _openAfterLoad: function (element, dataItem) {\n                var that = this;\n                if (dataItem.loaded()) {\n                    that.open(element);\n                    that._loading = false;\n                } else {\n                    dataItem.one(CHANGE, function () {\n                        element.find(ICON_SELECTOR).removeClass('k-i-loading');\n                        if (that._loading) {\n                            that.open(element);\n                            that._loading = false;\n                        }\n                    });\n                }\n            },\n            open: function (element) {\n                var that = this;\n                var options = that.options;\n                var horizontal = options.orientation == 'horizontal';\n                var direction = options.direction;\n                var isRtl = kendo.support.isRtl(that.wrapper);\n                var overflowWrapper = that._overflowWrapper();\n                element = (overflowWrapper || that.element).find(element);\n                var dataItem = that.dataSource && that.dataSource.getByUid(element.data(kendo.ns + 'uid'));\n                if (dataItem && dataItem.hasChildren && !dataItem.loaded() && !that._loading) {\n                    that._loading = true;\n                    element.find(ICON_SELECTOR).addClass('k-i-loading');\n                    dataItem.load();\n                    that._openAfterLoad(element, dataItem);\n                    return;\n                }\n                if (/^(top|bottom|default)$/.test(direction)) {\n                    if (isRtl) {\n                        direction = horizontal ? (direction + ' left').replace('default', 'bottom') : 'left';\n                    } else {\n                        direction = horizontal ? (direction + ' right').replace('default', 'bottom') : 'right';\n                    }\n                }\n                var visiblePopups = '>.k-popup:visible,>.k-animation-container>.k-popup:visible';\n                var closePopup = function () {\n                    var popup = $(this).data(KENDOPOPUP);\n                    if (popup) {\n                        that.close($(this).closest('li.k-item'), true);\n                    }\n                };\n                element.siblings().find(visiblePopups).each(closePopup);\n                if (overflowWrapper) {\n                    element.find(visiblePopups).each(closePopup);\n                }\n                if (that.options.openOnClick) {\n                    that.clicked = true;\n                }\n                element.each(function () {\n                    var li = $(this);\n                    clearTimeout(li.data(TIMER));\n                    li.data(TIMER, setTimeout(function () {\n                        var ul = li.find('.k-menu-group:first:hidden');\n                        var popup;\n                        var overflowPopup;\n                        if (!ul[0] && overflowWrapper) {\n                            overflowPopup = that._getPopup(li);\n                            ul = overflowPopup && overflowPopup.element;\n                        }\n                        if (ul.is(':visible')) {\n                            return;\n                        }\n                        if (ul[0] && that._triggerEvent({\n                                item: li[0],\n                                type: OPEN\n                            }) === false) {\n                            if (!ul.find('.k-menu-group')[0] && ul.children('.k-item').length > 1) {\n                                var windowHeight = $(window).height(), setScrolling = function () {\n                                        ul.css({\n                                            maxHeight: windowHeight - (kendo._outerHeight(ul) - ul.height()) - kendo.getShadows(ul).bottom,\n                                            overflow: 'auto'\n                                        });\n                                    };\n                                if (kendo.support.browser.msie && kendo.support.browser.version <= 7) {\n                                    setTimeout(setScrolling, 0);\n                                } else {\n                                    setScrolling();\n                                }\n                            } else {\n                                ul.css({\n                                    maxHeight: '',\n                                    overflow: ''\n                                });\n                            }\n                            li.data(ZINDEX, li.css(ZINDEX));\n                            var nextZindex = that.nextItemZIndex++;\n                            li.css(ZINDEX, nextZindex);\n                            if (that.options.scrollable) {\n                                li.parent().siblings(scrollButtonSelector).css({ zIndex: ++nextZindex });\n                            }\n                            popup = ul.data(KENDOPOPUP);\n                            var root = li.parent().hasClass(MENU), parentHorizontal = root && horizontal, directions = parseDirection(direction, root, isRtl), effects = options.animation.open.effects, openEffects = effects !== undefined ? effects : 'slideIn:' + getEffectDirection(direction, root);\n                            if (!popup) {\n                                popup = ul.kendoPopup({\n                                    activate: function () {\n                                        that._triggerEvent({\n                                            item: this.wrapper.parent(),\n                                            type: ACTIVATE\n                                        });\n                                    },\n                                    deactivate: function (e) {\n                                        that._closing = false;\n                                        e.sender.element.removeData('targetTransform').css({ opacity: '' });\n                                        that._triggerEvent({\n                                            item: this.wrapper.parent(),\n                                            type: DEACTIVATE\n                                        });\n                                    },\n                                    origin: directions.origin,\n                                    position: directions.position,\n                                    collision: options.popupCollision !== undefined ? options.popupCollision : parentHorizontal ? 'fit' : 'fit flip',\n                                    anchor: li,\n                                    appendTo: overflowWrapper || li,\n                                    animation: {\n                                        open: extend(true, { effects: openEffects }, options.animation.open),\n                                        close: options.animation.close\n                                    },\n                                    open: proxy(that._popupOpen, that),\n                                    close: function (e) {\n                                        that._closing = true;\n                                        var li = e.sender.wrapper.parent();\n                                        if (overflowWrapper) {\n                                            var popupId = e.sender.element.data(POPUP_ID_ATTR);\n                                            if (popupId) {\n                                                li = (overflowWrapper || that.element).find(popupOpenerSelector(popupId));\n                                            }\n                                            e.sender.wrapper.children(scrollButtonSelector).hide();\n                                        }\n                                        if (!that._triggerEvent({\n                                                item: li[0],\n                                                type: CLOSE\n                                            })) {\n                                            li.css(ZINDEX, li.data(ZINDEX));\n                                            li.removeData(ZINDEX);\n                                            if (that.options.scrollable) {\n                                                li.parent().siblings(scrollButtonSelector).css({ zIndex: '' });\n                                            }\n                                            if (touch || allPointers || kendo.support.mouseAndTouchPresent) {\n                                                li.removeClass(HOVERSTATE);\n                                                that._removeHoverItem();\n                                            }\n                                        } else {\n                                            e.preventDefault();\n                                        }\n                                    }\n                                }).data(KENDOPOPUP);\n                            } else {\n                                popup = ul.data(KENDOPOPUP);\n                                popup.options.origin = directions.origin;\n                                popup.options.position = directions.position;\n                                popup.options.animation.open.effects = openEffects;\n                            }\n                            ul.removeAttr('aria-hidden');\n                            that._configurePopupOverflow(popup, li);\n                            popup._hovered = true;\n                            popup.open();\n                            that._initPopupScrolling(popup);\n                        }\n                    }, that.options.hoverDelay));\n                });\n                return that;\n            },\n            _configurePopupOverflow: function (popup, popupOpener) {\n                var that = this;\n                if (that.options.scrollable) {\n                    that._wrapPopupElement(popup);\n                    if (!popupOpener.attr('data-groupparent')) {\n                        var groupId = new Date().getTime();\n                        popupOpener.attr('data-groupparent', groupId);\n                        popup.element.attr('data-group', groupId);\n                    }\n                }\n            },\n            _wrapPopupElement: function (popup) {\n                if (!popup.element.parent().is(animationContainerSelector)) {\n                    popup.wrapper = kendo.wrap(popup.element, popup.options.autosize).css({\n                        overflow: 'hidden',\n                        display: 'block',\n                        position: 'absolute'\n                    });\n                }\n            },\n            _initPopupScrolling: function (popup, isHorizontal, skipMouseEvents) {\n                var that = this;\n                if (that.options.scrollable && popup.element[0].scrollHeight > popup.element[0].offsetHeight) {\n                    that._initPopupScrollButtons(popup, isHorizontal, skipMouseEvents);\n                }\n            },\n            _initPopupScrollButtons: function (popup, isHorizontal, skipMouseEvents) {\n                var that = this;\n                var scrollButtons = popup.wrapper.children(scrollButtonSelector);\n                var animation = that.options.animation;\n                var timeout = (animation && animation.open && animation.open.duration || 0) + DELAY;\n                setTimeout(function () {\n                    if (!scrollButtons.length) {\n                        var backwardBtn = $(that.templates.scrollButton({ direction: isHorizontal ? 'left' : 'up' }));\n                        var forwardBtn = $(that.templates.scrollButton({ direction: isHorizontal ? 'right' : 'down' }));\n                        scrollButtons = backwardBtn.add(forwardBtn).appendTo(popup.wrapper);\n                        that._initScrolling(popup.element, backwardBtn, forwardBtn, isHorizontal);\n                        if (!skipMouseEvents) {\n                            scrollButtons.on(MOUSEENTER + NS, function () {\n                                var overflowWrapper = that._overflowWrapper();\n                                $(getChildPopups(popup.element, overflowWrapper)).each(function (i, p) {\n                                    var popupOpener = overflowWrapper.find(popupOpenerSelector(p.data(POPUP_ID_ATTR)));\n                                    that.close(popupOpener);\n                                });\n                            }).on(MOUSELEAVE + NS, function () {\n                                setTimeout(function () {\n                                    if ($.isEmptyObject(that._openedPopups)) {\n                                        that._closeParentPopups(popup.element);\n                                    }\n                                }, DELAY);\n                            });\n                        }\n                    }\n                    that._toggleScrollButtons(popup.element, scrollButtons.first(), scrollButtons.last(), isHorizontal);\n                }, timeout);\n            },\n            _popupOpen: function (e) {\n                if (!this._keyTriggered) {\n                    e.sender.element.children('.' + FOCUSEDSTATE).removeClass(FOCUSEDSTATE);\n                }\n                if (this.options.scrollable) {\n                    this._setPopupHeight(e.sender);\n                }\n            },\n            _setPopupHeight: function (popup, isFixed) {\n                var popupElement = popup.element;\n                var popups = popupElement.add(popupElement.parent(animationContainerSelector));\n                popups.height(popupElement.hasClass(MENU) && this._initialHeight || '');\n                var location = popup._location(isFixed);\n                var windowHeight = $(window).height();\n                var popupOuterHeight = location.height;\n                var popupOffsetTop = isFixed ? 0 : Math.max(location.top, 0);\n                var scrollTop = isFixed ? 0 : parentsScroll(this._overflowWrapper()[0], 'scrollTop');\n                var bottomScrollbar = window.innerHeight - windowHeight;\n                var maxHeight = windowHeight - kendo.getShadows(popupElement).bottom + bottomScrollbar;\n                var canFit = maxHeight + scrollTop > popupOuterHeight + popupOffsetTop;\n                if (!canFit) {\n                    var height = Math.min(maxHeight, maxHeight - popupOffsetTop + scrollTop);\n                    popups.css({\n                        overflow: 'hidden',\n                        height: height + 'px'\n                    });\n                }\n            },\n            close: function (items, dontClearClose) {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                var element = overflowWrapper || that.element;\n                items = element.find(items);\n                if (!items.length) {\n                    items = element.find('>.k-item');\n                }\n                var hasChildPopupsHovered = function (currentPopup) {\n                    var result = false;\n                    if ($.isEmptyObject(that._openedPopups)) {\n                        return result;\n                    }\n                    $(getChildPopups(currentPopup, overflowWrapper)).each(function (i, popup) {\n                        result = !!that._openedPopups[popup.data(POPUP_ID_ATTR).toString()];\n                        return !result;\n                    });\n                    return result;\n                };\n                var isPopupMouseLeaved = function (opener) {\n                    var groupId = opener.data(POPUP_OPENER_ATTR);\n                    return !overflowWrapper || !groupId || !that._openedPopups[groupId.toString()];\n                };\n                items.each(function () {\n                    var li = $(this);\n                    if (!dontClearClose && that._isRootItem(li)) {\n                        that.clicked = false;\n                    }\n                    clearTimeout(li.data(TIMER));\n                    li.data(TIMER, setTimeout(function () {\n                        var popup = that._getPopup(li);\n                        if (popup && (isPopupMouseLeaved(li) || that._forceClose)) {\n                            if (!that._forceClose && hasChildPopupsHovered(popup.element)) {\n                                return;\n                            }\n                            popup.close();\n                            popup.element.attr('aria-hidden', true);\n                            if (overflowWrapper) {\n                                if (that._forceClose && items.last().is(li[0])) {\n                                    delete that._forceClose;\n                                }\n                            }\n                        }\n                    }, that.options.hoverDelay));\n                });\n                return that;\n            },\n            _getPopup: function (li) {\n                var that = this;\n                var popup = li.find('.k-menu-group:not(.k-list-container):not(.k-calendar-container):first:visible').data(KENDOPOPUP);\n                var overflowWrapper = that._overflowWrapper();\n                if (!popup && overflowWrapper) {\n                    var groupId = li.data(POPUP_OPENER_ATTR);\n                    if (groupId) {\n                        var popupElement = overflowWrapper.find(popupGroupSelector(groupId));\n                        popup = popupElement.data(KENDOPOPUP);\n                    }\n                }\n                return popup;\n            },\n            _toggleDisabled: function (items, enable) {\n                this.element.find(items).each(function () {\n                    $(this).toggleClass(DEFAULTSTATE, enable).toggleClass(DISABLEDSTATE, !enable).attr('aria-disabled', !enable);\n                });\n            },\n            _toggleHover: function (e) {\n                var target = $(kendo.eventTarget(e) || e.target).closest(allItemsSelector), isEnter = e.type == MOUSEENTER || MOUSEDOWN.indexOf(e.type) !== -1;\n                target.siblings().removeClass(HOVERSTATE);\n                if (!target.parents('li.' + DISABLEDSTATE).length) {\n                    target.toggleClass(HOVERSTATE, isEnter || e.type == 'mousedown' || e.type == 'pointerover' || e.type == TOUCHSTART);\n                }\n                this._removeHoverItem();\n            },\n            _preventClose: function () {\n                if (!this.options.closeOnClick) {\n                    this._closurePrevented = true;\n                }\n            },\n            _checkActiveElement: function (e) {\n                var that = this, hoverItem = $(e ? e.currentTarget : this._hoverItem()), target = that._findRootParent(hoverItem)[0];\n                if (!this._closurePrevented) {\n                    setTimeout(function () {\n                        if (!document.hasFocus() || !contains(target, kendo._activeElement()) && e && !contains(target, e.currentTarget)) {\n                            that.close(target);\n                        }\n                    }, 0);\n                }\n                this._closurePrevented = false;\n            },\n            _removeHoverItem: function () {\n                var oldHoverItem = this._hoverItem();\n                if (oldHoverItem && oldHoverItem.hasClass(FOCUSEDSTATE)) {\n                    oldHoverItem.removeClass(FOCUSEDSTATE);\n                    this._oldHoverItem = null;\n                }\n            },\n            _updateClasses: function () {\n                var element = this.element, nonContentGroupsSelector = '.k-menu-init div ul', items;\n                element.removeClass('k-menu-horizontal k-menu-vertical');\n                element.addClass('k-widget k-reset k-header k-menu-init ' + MENU).addClass(MENU + '-' + this.options.orientation);\n                element.find('li > ul').filter(function () {\n                    return !kendo.support.matchesSelector.call(this, nonContentGroupsSelector);\n                }).addClass('k-group k-menu-group').attr('role', 'menu').attr('aria-hidden', element.is(':visible')).parent('li').attr('aria-haspopup', 'true').end().find('li > div').addClass('k-content').attr('tabindex', '-1');\n                items = element.find('> li,.k-menu-group > li');\n                element.removeClass('k-menu-init');\n                items.each(function () {\n                    updateItemClasses(this);\n                });\n            },\n            _mouseenter: function (e) {\n                var that = this;\n                var element = $(e.currentTarget);\n                var hasChildren = that._itemHasChildren(element);\n                var popupId = element.data(POPUP_OPENER_ATTR) || element.parent().data(POPUP_ID_ATTR);\n                var pointerTouch = isPointerTouch(e);\n                if (popupId) {\n                    that._openedPopups[popupId.toString()] = true;\n                }\n                if (that._closing || e.delegateTarget != element.parents(menuSelector)[0] && e.delegateTarget != element.parents('.k-menu-scroll-wrapper,.k-popups-wrapper')[0]) {\n                    return;\n                }\n                that._keyTriggered = false;\n                if (that.options.openOnClick.rootMenuItems && that._isRootItem(element.closest(allItemsSelector)) || that.options.openOnClick.subMenuItems && !that._isRootItem(element.closest(allItemsSelector))) {\n                    return;\n                }\n                if ((that.options.openOnClick === false || that.options.openOnClick.rootMenuItems === false && that._isRootItem(element.closest(allItemsSelector)) || that.options.openOnClick.subMenuItems === false && !that._isRootItem(element.closest(allItemsSelector)) || that.clicked) && !touch && !(pointerTouch && that._isRootItem(element.closest(allItemsSelector)))) {\n                    if (!contains(e.currentTarget, e.relatedTarget) && hasChildren) {\n                        that.open(element);\n                    }\n                }\n                if (that.options.openOnClick === true && that.clicked || touch) {\n                    element.siblings().each(proxy(function (_, sibling) {\n                        that.close(sibling, true);\n                    }, that));\n                }\n            },\n            _mousedown: function (e) {\n                var that = this;\n                var element = $(e.currentTarget);\n                if (that.options.openOnClick.subMenuItems && !that._isRootItem(element) || touch) {\n                    element.siblings().each(proxy(function (_, sibling) {\n                        that.close(sibling, true);\n                    }, that));\n                }\n            },\n            _mouseleave: function (e) {\n                var that = this;\n                var element = $(e.currentTarget);\n                var popupOpener = element.data(POPUP_OPENER_ATTR);\n                var hasChildren = element.children(animationContainerSelector).length || element.children(groupSelector).length || popupOpener;\n                var $window = $(window);\n                if (popupOpener) {\n                    delete that._openedPopups[popupOpener.toString()];\n                }\n                if (element.parentsUntil(animationContainerSelector, '.k-list-container,.k-calendar-container')[0]) {\n                    e.stopImmediatePropagation();\n                    return;\n                }\n                if ((that.options.openOnClick === false || !that.options.openOnClick.rootMenuItems && that._isRootItem(element) || !that.options.openOnClick.subMenuItems && !that._isRootItem(element)) && !touch && !isPointerTouch(e) && !contains(e.currentTarget, e.relatedTarget || e.target) && hasChildren && !contains(e.currentTarget, kendo._activeElement())) {\n                    that.close(element, true);\n                    that._loading = false;\n                    return;\n                }\n                if (kendo.support.browser.msie && !e.toElement && !e.relatedTarget && !isPointerTouch(e) || e.clientX < 0 || e.clientY < 0 || e.clientY > $window.height() || e.clientX > $window.width()) {\n                    that.close(element);\n                }\n            },\n            _mouseenterPopup: function (e) {\n                var that = this;\n                var popupElement = $(e.currentTarget);\n                if (popupElement.parent().is(animationContainerSelector)) {\n                    return;\n                }\n                popupElement = popupElement.children('ul');\n                var popupId = popupElement.data(POPUP_ID_ATTR);\n                if (popupId) {\n                    that._openedPopups[popupId.toString()] = true;\n                }\n            },\n            _mouseleavePopup: function (e) {\n                var that = this;\n                var popupElement = $(e.currentTarget);\n                if (!isPointerTouch(e) && popupElement.is(animationContainerSelector)) {\n                    that._closePopups(popupElement.children('ul'));\n                }\n            },\n            _closePopups: function (rootPopup) {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                var popupId = rootPopup.data(POPUP_ID_ATTR);\n                if (popupId) {\n                    delete that._openedPopups[popupId.toString()];\n                    var groupParent = overflowWrapper.find(popupOpenerSelector(popupId));\n                    setTimeout(function () {\n                        if (that.options.openOnClick) {\n                            that._closeChildPopups(rootPopup);\n                        } else {\n                            if ($.isEmptyObject(that._openedPopups)) {\n                                var innerPopup = that._innerPopup(rootPopup);\n                                that._closeParentPopups(innerPopup);\n                            } else {\n                                that.close(groupParent, true);\n                            }\n                        }\n                    }, 0);\n                }\n            },\n            _closeChildPopups: function (current) {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                $(getChildPopups(current, overflowWrapper)).each(function () {\n                    var popupOpener = overflowWrapper.find(popupOpenerSelector(this.data(POPUP_ID_ATTR)));\n                    that.close(popupOpener, true);\n                });\n            },\n            _innerPopup: function (current) {\n                var overflowWrapper = this._overflowWrapper();\n                var popups = getChildPopups(current, overflowWrapper);\n                return popups[popups.length - 1] || current;\n            },\n            _closeParentPopups: function (current) {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                var popupId = current.data(POPUP_ID_ATTR);\n                var popupOpener = overflowWrapper.find(popupOpenerSelector(popupId));\n                popupId = popupOpener.parent().data(POPUP_ID_ATTR);\n                that.close(popupOpener, true);\n                while (popupId && !that._openedPopups[popupId]) {\n                    if (popupOpener.parent().is(menuSelector)) {\n                        break;\n                    }\n                    popupOpener = overflowWrapper.find(popupOpenerSelector(popupId));\n                    that.close(popupOpener, true);\n                    popupId = popupOpener.parent().data(POPUP_ID_ATTR);\n                }\n            },\n            _click: function (e) {\n                var that = this, openHandle, options = that.options, target = $(kendo.eventTarget(e)), targetElement = target[0], nodeName = target[0] ? target[0].nodeName.toUpperCase() : '', formNode = nodeName == 'INPUT' || nodeName == 'SELECT' || nodeName == 'BUTTON' || nodeName == 'LABEL', link = target.closest(LINK_SELECTOR), element = target.closest(allItemsSelector), itemElement = element[0], href = link.attr('href'), childGroup, childGroupVisible, targetHref = target.attr('href'), sampleHref = $('<a href=\\'#\\' />').attr('href'), isLink = !!href && href !== sampleHref, isLocalLink = isLink && !!href.match(/^#/), isTargetLink = !!targetHref && targetHref !== sampleHref, overflowWrapper = that._overflowWrapper(), shouldCloseTheRootItem;\n                while (targetElement && targetElement.parentNode != itemElement) {\n                    targetElement = targetElement.parentNode;\n                }\n                if ($(targetElement).is(templateSelector)) {\n                    return;\n                }\n                if (element.hasClass(DISABLEDSTATE)) {\n                    e.preventDefault();\n                    return;\n                }\n                if (!e.handled && that._triggerSelect(target, itemElement) && !formNode) {\n                    e.preventDefault();\n                }\n                e.handled = true;\n                childGroup = element.children(popupSelector);\n                if (overflowWrapper) {\n                    var childPopupId = element.data(POPUP_OPENER_ATTR);\n                    if (childPopupId) {\n                        childGroup = overflowWrapper.find(popupGroupSelector(childPopupId));\n                    }\n                }\n                childGroupVisible = childGroup.is(':visible');\n                shouldCloseTheRootItem = options.openOnClick && childGroupVisible && that._isRootItem(element);\n                if (options.closeOnClick && (!isLink || isLocalLink) && (!childGroup.length || shouldCloseTheRootItem)) {\n                    element.removeClass(HOVERSTATE).css('height');\n                    that._oldHoverItem = that._findRootParent(element);\n                    var item = that._parentsUntil(link, that.element, allItemsSelector);\n                    that._forceClose = !!overflowWrapper;\n                    that.close(item);\n                    that.clicked = false;\n                    if ('MSPointerUp'.indexOf(e.type) != -1) {\n                        e.preventDefault();\n                    }\n                    return;\n                }\n                if (isLink && e.enterKey) {\n                    link[0].click();\n                }\n                if ((!that._isRootItem(element) || options.openOnClick === false) && !options.openOnClick.subMenuItems && !kendo.support.touch && !(isPointerTouch(e) && that._isRootItem(element.closest(allItemsSelector)))) {\n                    return;\n                }\n                if (!isLink && !formNode && !isTargetLink) {\n                    e.preventDefault();\n                }\n                that.clicked = true;\n                openHandle = childGroup.is(':visible') ? CLOSE : OPEN;\n                if (!options.closeOnClick && openHandle == CLOSE) {\n                    return;\n                }\n                that[openHandle](element);\n            },\n            _parentsUntil: function (context, top, selector) {\n                var overflowWrapper = this._overflowWrapper();\n                if (!overflowWrapper) {\n                    return context.parentsUntil(top, selector);\n                } else {\n                    var parents = overflowMenuParents(context, overflowWrapper);\n                    var result = [];\n                    $(parents).each(function () {\n                        var parent = $(this);\n                        if (parent.is(top)) {\n                            return false;\n                        }\n                        if (parent.is(selector)) {\n                            result.push(this);\n                        }\n                    });\n                    return $(result);\n                }\n            },\n            _triggerSelect: function (target, itemElement) {\n                target = target.is('.k-link') ? target : target.closest('.k-link');\n                var selectHandler = target.data('selectHandler'), itemSelectEventData;\n                if (selectHandler) {\n                    itemSelectEventData = this._getEventData(target);\n                    selectHandler.call(this, itemSelectEventData);\n                }\n                var isSelectItemDefaultPrevented = itemSelectEventData && itemSelectEventData.isDefaultPrevented();\n                var isSelectDefaultPrevented = this._triggerEvent({\n                    item: itemElement,\n                    type: SELECT\n                });\n                return isSelectItemDefaultPrevented || isSelectDefaultPrevented;\n            },\n            _getEventData: function (target) {\n                var eventData = {\n                    sender: this,\n                    target: target,\n                    _defaultPrevented: false,\n                    preventDefault: function () {\n                        this._defaultPrevented = true;\n                    },\n                    isDefaultPrevented: function () {\n                        return this._defaultPrevented;\n                    }\n                };\n                return eventData;\n            },\n            _documentClick: function (e) {\n                var that = this;\n                if (contains((that._overflowWrapper() || that.element)[0], e.target)) {\n                    return;\n                }\n                that.clicked = false;\n            },\n            _focus: function (e) {\n                var that = this, target = e.target, hoverItem = that._hoverItem(), active = activeElement();\n                if (target != that.wrapper[0] && !$(target).is(':kendoFocusable')) {\n                    e.stopPropagation();\n                    $(target).closest('.k-content').closest('.k-menu-group').closest('.k-item').addClass(FOCUSEDSTATE);\n                    that.wrapper.focus();\n                    return;\n                }\n                if (active === e.currentTarget) {\n                    if (hoverItem.length) {\n                        that._moveHover([], hoverItem);\n                    } else if (!that._oldHoverItem) {\n                        that._moveHover([], that.wrapper.children().first());\n                    }\n                }\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, hoverItem = that._oldHoverItem, target, belongsToVertical, hasChildren, isRtl = kendo.support.isRtl(that.wrapper);\n                if (e.target != e.currentTarget && key != keys.ESC) {\n                    return;\n                }\n                if (!hoverItem) {\n                    hoverItem = that._oldHoverItem = that._hoverItem();\n                }\n                belongsToVertical = that._itemBelongsToVertival(hoverItem);\n                hasChildren = that._itemHasChildren(hoverItem);\n                that._keyTriggered = true;\n                if (key == keys.RIGHT) {\n                    target = that[isRtl ? '_itemLeft' : '_itemRight'](hoverItem, belongsToVertical, hasChildren);\n                } else if (key == keys.LEFT) {\n                    target = that[isRtl ? '_itemRight' : '_itemLeft'](hoverItem, belongsToVertical, hasChildren);\n                } else if (key == keys.DOWN) {\n                    target = that._itemDown(hoverItem, belongsToVertical, hasChildren);\n                } else if (key == keys.UP) {\n                    target = that._itemUp(hoverItem, belongsToVertical, hasChildren);\n                } else if (key == keys.HOME) {\n                    that._moveHover(hoverItem, hoverItem.parent().children().first());\n                    e.preventDefault();\n                } else if (key == keys.END) {\n                    that._moveHover(hoverItem, hoverItem.parent().children().last());\n                    e.preventDefault();\n                } else if (key == keys.ESC) {\n                    target = that._itemEsc(hoverItem, belongsToVertical);\n                } else if (key == keys.ENTER || key == keys.SPACEBAR) {\n                    target = hoverItem.children('.k-link');\n                    if (target.length > 0) {\n                        that._click({\n                            target: target[0],\n                            preventDefault: function () {\n                            },\n                            enterKey: true\n                        });\n                        if (hasChildren && !hoverItem.hasClass(DISABLEDSTATE)) {\n                            that.open(hoverItem);\n                            that._moveHover(hoverItem, that._childPopupElement(hoverItem).children().first());\n                        } else {\n                            that._moveHover(hoverItem, that._findRootParent(hoverItem));\n                        }\n                    }\n                } else if (key == keys.TAB) {\n                    target = that._findRootParent(hoverItem);\n                    that._moveHover(hoverItem, target);\n                    that._checkActiveElement();\n                    return;\n                }\n                if (target && target[0]) {\n                    e.preventDefault();\n                    e.stopPropagation();\n                }\n            },\n            _hoverItem: function () {\n                return this.wrapper.find('.k-item.k-state-hover,.k-item.k-state-focused').filter(':visible');\n            },\n            _itemBelongsToVertival: function (item) {\n                var menuIsVertical = this.wrapper.hasClass('k-menu-vertical');\n                if (!item.length) {\n                    return menuIsVertical;\n                }\n                return item.parent().hasClass('k-menu-group') || menuIsVertical;\n            },\n            _itemHasChildren: function (item) {\n                if (!item || !item.length || !item[0].nodeType) {\n                    return false;\n                }\n                return item.children('.k-menu-group, div.k-animation-container').length > 0 || !!item.data(POPUP_OPENER_ATTR) && !!this._overflowWrapper().children(popupGroupSelector(item.data(POPUP_OPENER_ATTR)));\n            },\n            _moveHover: function (item, nextItem) {\n                var that = this, id = that._ariaId;\n                if (item.length && nextItem.length) {\n                    item.removeClass(FOCUSEDSTATE);\n                }\n                if (nextItem.length) {\n                    if (nextItem[0].id) {\n                        id = nextItem[0].id;\n                    }\n                    nextItem.addClass(FOCUSEDSTATE);\n                    that._oldHoverItem = nextItem;\n                    if (id) {\n                        that.element.removeAttr('aria-activedescendant');\n                        $('#' + id).removeAttr('id');\n                        nextItem.attr('id', id);\n                        that.element.attr('aria-activedescendant', id);\n                    }\n                    that._scrollToItem(nextItem);\n                }\n            },\n            _findRootParent: function (item) {\n                if (this._isRootItem(item)) {\n                    return item;\n                } else {\n                    return this._parentsUntil(item, menuSelector, 'li.k-item').last();\n                }\n            },\n            _isRootItem: function (item) {\n                return item.parent().hasClass(MENU);\n            },\n            _itemRight: function (item, belongsToVertical, hasChildren) {\n                var that = this, nextItem, parentItem, overflowWrapper;\n                if (!belongsToVertical) {\n                    nextItem = item.nextAll(nextSelector);\n                    if (!nextItem.length) {\n                        nextItem = item.prevAll(lastSelector);\n                    }\n                    that.close(item);\n                } else if (hasChildren && !item.hasClass(DISABLEDSTATE)) {\n                    that.open(item);\n                    nextItem = that._childPopupElement(item).children().first();\n                } else if (that.options.orientation == 'horizontal') {\n                    parentItem = that._findRootParent(item);\n                    overflowWrapper = that._overflowWrapper();\n                    if (overflowWrapper) {\n                        var rootPopup = itemPopup(parentItem, overflowWrapper);\n                        that._closeChildPopups(rootPopup);\n                    }\n                    that.close(parentItem);\n                    nextItem = parentItem.nextAll(nextSelector);\n                }\n                if (nextItem && !nextItem.length) {\n                    nextItem = that.wrapper.children('.k-item').first();\n                } else if (!nextItem) {\n                    nextItem = [];\n                }\n                that._moveHover(item, nextItem);\n                return nextItem;\n            },\n            _itemLeft: function (item, belongsToVertical) {\n                var that = this, nextItem, overflowWrapper;\n                if (!belongsToVertical) {\n                    nextItem = item.prevAll(nextSelector);\n                    if (!nextItem.length) {\n                        nextItem = item.nextAll(lastSelector);\n                    }\n                    that.close(item);\n                } else {\n                    nextItem = item.parent().closest('.k-item');\n                    overflowWrapper = that._overflowWrapper();\n                    if (!nextItem.length && overflowWrapper) {\n                        nextItem = popupParentItem(item.parent(), overflowWrapper);\n                    }\n                    that.close(nextItem);\n                    if (that._isRootItem(nextItem) && that.options.orientation == 'horizontal') {\n                        nextItem = nextItem.prevAll(nextSelector);\n                    }\n                }\n                if (!nextItem.length) {\n                    nextItem = that.wrapper.children('.k-item').last();\n                }\n                that._moveHover(item, nextItem);\n                return nextItem;\n            },\n            _itemDown: function (item, belongsToVertical, hasChildren) {\n                var that = this, nextItem;\n                if (!belongsToVertical) {\n                    if (!hasChildren || item.hasClass(DISABLEDSTATE)) {\n                        return;\n                    } else {\n                        that.open(item);\n                        nextItem = that._childPopupElement(item).children().first();\n                    }\n                } else {\n                    nextItem = item.nextAll(nextSelector);\n                }\n                if (!nextItem.length && item.length) {\n                    nextItem = item.parent().children().first();\n                } else if (!item.length) {\n                    nextItem = that.wrapper.children('.k-item').first();\n                }\n                that._moveHover(item, nextItem);\n                return nextItem;\n            },\n            _itemUp: function (item, belongsToVertical) {\n                var that = this, nextItem;\n                if (!belongsToVertical) {\n                    return;\n                } else {\n                    nextItem = item.prevAll(nextSelector);\n                }\n                if (!nextItem.length && item.length) {\n                    nextItem = item.parent().children().last();\n                } else if (!item.length) {\n                    nextItem = that.wrapper.children('.k-item').last();\n                }\n                that._moveHover(item, nextItem);\n                return nextItem;\n            },\n            _scrollToItem: function (item) {\n                var that = this;\n                if (that.options.scrollable && item && item.length) {\n                    var ul = item.parent();\n                    var isHorizontal = ul.hasClass(MENU) ? that.options.orientation == 'horizontal' : false;\n                    var scrollDir = isHorizontal ? 'scrollLeft' : 'scrollTop';\n                    var getSize = isHorizontal ? kendo._outerWidth : kendo._outerHeight;\n                    var currentScrollOffset = ul[scrollDir]();\n                    var itemSize = getSize(item);\n                    var itemOffset = item[0][isHorizontal ? 'offsetLeft' : 'offsetTop'];\n                    var ulSize = getSize(ul);\n                    var scrollButtons = ul.siblings(scrollButtonSelector);\n                    var scrollButtonSize = scrollButtons.length ? getSize(scrollButtons.first()) : 0;\n                    var itemPosition;\n                    if (currentScrollOffset + ulSize < itemOffset + itemSize + scrollButtonSize) {\n                        itemPosition = itemOffset + itemSize - ulSize + scrollButtonSize;\n                    } else if (currentScrollOffset > itemOffset - scrollButtonSize) {\n                        itemPosition = itemOffset - scrollButtonSize;\n                    }\n                    if (!isNaN(itemPosition)) {\n                        var scrolling = {};\n                        scrolling[scrollDir] = itemPosition;\n                        ul.finish().animate(scrolling, 'fast', 'linear', function () {\n                            that._toggleScrollButtons(ul, scrollButtons.first(), scrollButtons.last(), isHorizontal);\n                        });\n                    }\n                }\n            },\n            _itemEsc: function (item, belongsToVertical) {\n                var that = this, nextItem;\n                if (!belongsToVertical) {\n                    return item;\n                } else {\n                    nextItem = item.parent().closest('.k-item');\n                    that.close(nextItem);\n                    that._moveHover(item, nextItem);\n                }\n                return nextItem;\n            },\n            _childPopupElement: function (item) {\n                var popupElement = item.find('.k-menu-group');\n                var wrapper = this._overflowWrapper();\n                if (!popupElement.length && wrapper) {\n                    popupElement = itemPopup(item, wrapper);\n                }\n                return popupElement;\n            },\n            _triggerEvent: function (e) {\n                var that = this;\n                return that.trigger(e.type, {\n                    type: e.type,\n                    item: e.item\n                });\n            },\n            _focusHandler: function (e) {\n                var that = this, item = $(kendo.eventTarget(e)).closest(allItemsSelector);\n                if (item.hasClass(DISABLEDSTATE)) {\n                    return;\n                }\n                setTimeout(function () {\n                    that._moveHover([], item);\n                    if (item.children('.k-content')[0]) {\n                        item.parent().closest('.k-item').removeClass(FOCUSEDSTATE);\n                    }\n                }, 200);\n            },\n            _animations: function (options) {\n                if (options && 'animation' in options && !options.animation) {\n                    options.animation = {\n                        open: { effects: {} },\n                        close: {\n                            hide: true,\n                            effects: {}\n                        }\n                    };\n                }\n            },\n            _dataSource: function (options) {\n                var that = this, dataSource = options ? options.dataSource : that.options.dataSource;\n                if (!dataSource) {\n                    return;\n                }\n                dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n                that._unbindDataSource();\n                if (!dataSource.fields) {\n                    dataSource.fields = [\n                        { field: 'uid' },\n                        { field: 'text' },\n                        { field: 'url' },\n                        { field: 'cssClass' },\n                        { field: 'spriteCssClass' },\n                        { field: 'imageUrl' },\n                        { field: 'imageAttr' },\n                        { field: 'attr' },\n                        { field: 'contentAttr' },\n                        { field: 'content' },\n                        { field: 'encoded' },\n                        { field: 'items' },\n                        { field: 'select' }\n                    ];\n                }\n                that.dataSource = HierarchicalDataSource.create(dataSource);\n                that._bindDataSource();\n                that.dataSource.fetch();\n            },\n            _bindDataSource: function () {\n                this._refreshHandler = proxy(this.refresh, this);\n                this._errorHandler = proxy(this._error, this);\n                this.dataSource.bind(CHANGE, this._refreshHandler);\n                this.dataSource.bind(ERROR, this._errorHandler);\n            },\n            _unbindDataSource: function () {\n                var dataSource = this.dataSource;\n                if (dataSource) {\n                    dataSource.unbind(CHANGE, this._refreshHandler);\n                    dataSource.unbind(ERROR, this._errorHandler);\n                }\n            },\n            _error: function () {\n            },\n            findByUid: function (uid) {\n                var wrapperElement = this._overflowWrapper() || this.element;\n                return wrapperElement.find('[' + kendo.attr('uid') + '=' + uid + ']');\n            },\n            refresh: function (ev) {\n                var that = this;\n                var node = ev.node;\n                var action = ev.action;\n                var parentElement = node ? that.findByUid(node.uid) : that.element;\n                var itemsToUpdate = ev.items;\n                var index = ev.index;\n                var updateProxy = $.proxy(that._updateItem, that);\n                var removeProxy = $.proxy(that._removeItem, that);\n                if (action == 'add') {\n                    that._appendItems(itemsToUpdate, index, parentElement);\n                } else if (action == 'remove') {\n                    itemsToUpdate.forEach(removeProxy);\n                } else if (action == 'itemchange') {\n                    itemsToUpdate.forEach(updateProxy);\n                } else if (action === 'itemloaded') {\n                    that.append(ev.items, parentElement);\n                } else {\n                    this._initData();\n                }\n                this.trigger(DATABOUND, {\n                    item: parentElement,\n                    dataItem: node\n                });\n            },\n            _appendItems: function (items, index, parent) {\n                var that = this;\n                var referenceItem = parent.find(itemSelector).eq(index);\n                if (referenceItem.length) {\n                    that.insertBefore(items, referenceItem);\n                } else {\n                    that.append(items, parent);\n                }\n            },\n            _removeItem: function (item) {\n                var that = this;\n                var element = that.findByUid(item.uid);\n                that.remove(element);\n            },\n            _updateItem: function (item) {\n                var that = this;\n                var element = that.findByUid(item.uid);\n                var nextElement = element.next();\n                var parentNode = item.parentNode();\n                that.remove(element);\n                if (nextElement.length) {\n                    that.insertBefore(item, nextElement);\n                } else {\n                    that.append(item, parentNode && that.findByUid(parentNode.uid));\n                }\n            },\n            _accessors: function () {\n                var that = this, options = that.options, i, field, textField, element = that.element;\n                for (i in bindings) {\n                    field = options[bindings[i]];\n                    textField = element.attr(kendo.attr(i + '-field'));\n                    if (!field && textField) {\n                        field = textField;\n                    }\n                    if (!field) {\n                        field = i;\n                    }\n                    if (!isArray(field)) {\n                        field = [field];\n                    }\n                    options[bindings[i]] = field;\n                }\n            },\n            _fieldAccessor: function (fieldName) {\n                var fieldBindings = this.options[bindings[fieldName]] || [], count = fieldBindings.length, result = '(function(item) {';\n                if (count === 0) {\n                    result += 'return item[\\'' + fieldName + '\\'];';\n                } else {\n                    result += 'var levels = [' + $.map(fieldBindings, function (x) {\n                        return 'function(d){ return ' + kendo.expr(x) + '}';\n                    }).join(',') + '];';\n                    result += 'if(item.level){return levels[Math.min(item.level(), ' + count + '-1)](item);}else';\n                    result += '{return levels[' + count + '-1](item)}';\n                }\n                result += '})';\n                return result;\n            },\n            _templates: function () {\n                var that = this, options = that.options, fieldAccessor = proxy(that._fieldAccessor, that);\n                if (options.template && typeof options.template == STRING) {\n                    options.template = template(options.template);\n                } else if (!options.template) {\n                    options.template = template('# var text = ' + fieldAccessor('text') + '(data.item); #' + '# if (typeof data.item.encoded != \\'undefined\\' && data.item.encoded === false) {#' + '#= text #' + '# } else { #' + '#: text #' + '# } #');\n                }\n                that.templates = {\n                    content: template('#var contentHtml = ' + fieldAccessor('content') + '(item);#' + '<div #= contentCssAttributes(item.toJSON ? item.toJSON() : item) # tabindex=\\'-1\\'>#= contentHtml || \\'\\' #</div>'),\n                    group: template('<ul class=\\'#= groupCssClass(group) #\\'#= groupAttributes(group) # role=\\'menu\\' aria-hidden=\\'true\\'>' + '#= renderItems(data) #' + '</ul>'),\n                    itemWrapper: template('# var url = ' + fieldAccessor('url') + '(item); #' + '# var imageUrl = ' + fieldAccessor('imageUrl') + '(item); #' + '# var imgAttributes = ' + fieldAccessor('imageAttr') + '(item);#' + '# var tag = url ? \\'a\\' : \\'span\\' #' + '<#= tag # class=\\'#= textClass(item) #\\' #if(url){#href=\\'#= url #\\'#}#>' + '# if (imageUrl) { #' + '<img #= imageCssAttributes(imgAttributes) #  alt=\\'\\' src=\\'#= imageUrl #\\' />' + '# } #' + '#= sprite(item) ##= data.menu.options.template(data) #' + '#= arrow(data) #' + '</#= tag #>'),\n                    item: template('#var contentHtml = ' + fieldAccessor('content') + '(item);#' + '<li class=\\'#= wrapperCssClass(group, item) #\\' #= itemCssAttributes(item.toJSON ? item.toJSON() : item) # role=\\'menuitem\\'  #=item.items ? \"aria-haspopup=\\'true\\'\": \"\"#' + '#=item.enabled === false ? \"aria-disabled=\\'true\\'\" : \\'\\'#' + kendo.attr('uid') + '=\\'#= item.uid #\\' >' + '#= itemWrapper(data) #' + '#if (item.hasChildren || item.items) { #' + '#= subGroup({ items: item.items, menu: menu, group: { expanded: item.expanded } }) #' + '# } else if (item.content || item.contentUrl || contentHtml) { #' + '#= renderContent(data) #' + '# } #' + '</li>'),\n                    scrollButton: template('<span class=\\'k-button k-button-icon k-menu-scroll-button k-scroll-#= direction #\\' unselectable=\\'on\\'>' + '<span class=\\'k-icon k-i-arrow-60-#= direction #\\'></span></span>'),\n                    arrow: template('<span class=\\'#= arrowClass(item, group) #\\'></span>'),\n                    sprite: template('# var spriteCssClass = ' + fieldAccessor('spriteCssClass') + '(data); if(spriteCssClass) {#<span class=\\'k-sprite #= spriteCssClass #\\'></span>#}#'),\n                    empty: template('')\n                };\n            },\n            renderItem: function (options) {\n                var that = this;\n                options = extend({\n                    menu: that,\n                    group: {}\n                }, options);\n                var empty = that.templates.empty, item = options.item;\n                return that.templates.item(extend(options, {\n                    sprite: that.templates.sprite,\n                    itemWrapper: that.templates.itemWrapper,\n                    renderContent: that.renderContent,\n                    arrow: item.items || item.content || item[that.options.dataContentField[0]] ? that.templates.arrow : empty,\n                    subGroup: that.renderGroup\n                }, rendering));\n            },\n            renderGroup: function (options) {\n                var that = this;\n                var templates = that.templates || options.menu.templates;\n                return templates.group(extend({\n                    renderItems: function (options) {\n                        var html = '', i = 0, items = options.items, len = items ? items.length : 0, group = extend({ length: len }, options.group);\n                        for (; i < len; i++) {\n                            html += options.menu.renderItem(extend(options, {\n                                group: group,\n                                item: extend({ index: i }, items[i])\n                            }));\n                        }\n                        return html;\n                    }\n                }, options, rendering));\n            },\n            renderContent: function (options) {\n                return options.menu.templates.content(extend(options, rendering));\n            }\n        });\n        var ContextMenu = Menu.extend({\n            init: function (element, options) {\n                var that = this;\n                Menu.fn.init.call(that, element, options);\n                that._marker = kendo.guid().substring(0, 8);\n                that.target = $(that.options.target);\n                that._popup();\n                that._wire();\n            },\n            _initOverflow: function (options) {\n                var that = this;\n                if (options.scrollable && !that._overflowWrapper()) {\n                    that._openedPopups = {};\n                    that._popupsWrapper = (that.element.parent().is(animationContainerSelector) ? that.element.parent() : that.element).wrap('<div class=\\'k-popups-wrapper ' + options.orientation + '\\'></div>').parent();\n                    if (that.options.orientation == 'horizontal') {\n                        removeSpacesBetweenItems(that.element);\n                    }\n                    if (options.appendTo) {\n                        options.appendTo = $(options.appendTo);\n                        options.appendTo.append(that._popupsWrapper);\n                    }\n                    that._initialHeight = that.element[0].style.height;\n                    that._initialWidth = that.element[0].style.width;\n                }\n            },\n            options: {\n                name: 'ContextMenu',\n                filter: null,\n                showOn: 'contextmenu',\n                orientation: 'vertical',\n                alignToAnchor: false,\n                copyAnchorStyles: true,\n                target: 'body'\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                ACTIVATE,\n                DEACTIVATE,\n                SELECT\n            ],\n            setOptions: function (options) {\n                var that = this;\n                Menu.fn.setOptions.call(that, options);\n                that.target.off(that.showOn + NS + that._marker, that._showProxy);\n                if (that.userEvents) {\n                    that.userEvents.destroy();\n                }\n                that.target = $(that.options.target);\n                if (options.orientation && that.popup.wrapper[0]) {\n                    that.popup.element.unwrap();\n                }\n                that._wire();\n                Menu.fn.setOptions.call(this, options);\n            },\n            destroy: function () {\n                var that = this;\n                that.target.off(that.options.showOn + NS + that._marker);\n                DOCUMENT_ELEMENT.off(kendo.support.mousedown + NS + that._marker, that._closeProxy);\n                if (that.userEvents) {\n                    that.userEvents.destroy();\n                }\n                Menu.fn.destroy.call(that);\n            },\n            open: function (x, y) {\n                var that = this;\n                x = $(x)[0];\n                if (contains(that.element[0], $(x)[0]) || that._itemHasChildren($(x))) {\n                    Menu.fn.open.call(that, x);\n                } else {\n                    if (that._triggerEvent({\n                            item: that.element,\n                            type: OPEN\n                        }) === false) {\n                        if (that.popup.visible() && that.options.filter) {\n                            that.popup.close(true);\n                            that.popup.element.kendoStop(true);\n                        }\n                        if (y !== undefined) {\n                            var overflowWrapper = that._overflowWrapper();\n                            if (overflowWrapper) {\n                                var offset = overflowWrapper.offset();\n                                x -= offset.left;\n                                y -= offset.top;\n                            }\n                            that.popup.wrapper.hide();\n                            that._configurePopupScrolling(x, y);\n                            that.popup.open(x, y);\n                        } else {\n                            that.popup.options.anchor = (x ? x : that.popup.anchor) || that.target;\n                            that.popup.element.kendoStop(true);\n                            that._configurePopupScrolling();\n                            that.popup.open();\n                        }\n                        DOCUMENT_ELEMENT.off(that.popup.downEvent, that.popup._mousedownProxy);\n                        DOCUMENT_ELEMENT.on(kendo.support.mousedown + NS + that._marker, that._closeProxy);\n                    }\n                }\n                return that;\n            },\n            _configurePopupScrolling: function (x, y) {\n                var that = this;\n                var popup = that.popup;\n                var isHorizontal = that.options.orientation == 'horizontal';\n                if (that.options.scrollable) {\n                    that._wrapPopupElement(popup);\n                    popup.element.parent().css({\n                        position: '',\n                        height: ''\n                    });\n                    popup.element.css({\n                        visibility: 'hidden',\n                        display: '',\n                        position: ''\n                    });\n                    if (isHorizontal) {\n                        that._setPopupWidth(popup, isNaN(x) ? undefined : {\n                            isFixed: true,\n                            x: x,\n                            y: y\n                        });\n                    } else {\n                        that._setPopupHeight(popup, isNaN(x) ? undefined : {\n                            isFixed: true,\n                            x: x,\n                            y: y\n                        });\n                    }\n                    popup.element.css({\n                        visibility: '',\n                        display: 'none',\n                        position: 'absolute'\n                    });\n                    that._initPopupScrollButtons(popup, isHorizontal, true);\n                    popup.element.siblings(scrollButtonSelector).hide();\n                }\n            },\n            _setPopupWidth: function (popup, isFixed) {\n                var popupElement = popup.element;\n                var popups = popupElement.add(popupElement.parent(animationContainerSelector));\n                popups.width(this._initialWidth || '');\n                var location = popup._location(isFixed);\n                var windowWidth = $(window).width();\n                var popupOuterWidth = location.width;\n                var popupOffsetLeft = Math.max(location.left, 0);\n                var scrollLeft = isFixed ? 0 : parentsScroll(this._overflowWrapper()[0], 'scrollLeft');\n                var shadow = kendo.getShadows(popupElement);\n                var maxWidth = windowWidth - shadow.left - shadow.right;\n                var canFit = maxWidth + scrollLeft > popupOuterWidth + popupOffsetLeft;\n                if (!canFit) {\n                    popups.css({\n                        overflow: 'hidden',\n                        width: maxWidth - popupOffsetLeft + scrollLeft + 'px'\n                    });\n                }\n            },\n            close: function () {\n                var that = this;\n                if (contains(that.element[0], $(arguments[0])[0]) || that._itemHasChildren(arguments[0])) {\n                    Menu.fn.close.call(that, arguments[0]);\n                } else {\n                    if (that.popup.visible()) {\n                        if (that._triggerEvent({\n                                item: that.element,\n                                type: CLOSE\n                            }) === false) {\n                            that.popup.close();\n                            DOCUMENT_ELEMENT.off(kendo.support.mousedown + NS + that._marker, that._closeProxy);\n                            that.unbind(SELECT, that._closeTimeoutProxy);\n                        }\n                    }\n                }\n            },\n            _showHandler: function (e) {\n                var ev = e, offset, that = this, options = that.options, target = kendo.support.mobileOS ? $(ev.target) : $(ev.currentTarget);\n                if (e.event) {\n                    ev = e.event;\n                    ev.pageX = e.x.location;\n                    ev.pageY = e.y.location;\n                }\n                if (contains(that.element[0], e.relatedTarget || e.target)) {\n                    return;\n                }\n                that._eventOrigin = ev;\n                ev.preventDefault();\n                ev.stopImmediatePropagation();\n                that.element.find('.' + FOCUSEDSTATE).removeClass(FOCUSEDSTATE);\n                if (options.filter && target.is(options.filter) || !options.filter) {\n                    if (options.alignToAnchor) {\n                        that.popup.options.anchor = ev.currentTarget;\n                        that.open(ev.currentTarget);\n                    } else {\n                        that.popup.options.anchor = ev.currentTarget;\n                        if (that._targetChild) {\n                            offset = that.target.offset();\n                            that.open(ev.pageX - offset.left, ev.pageY - offset.top);\n                        } else {\n                            that.open(ev.pageX, ev.pageY);\n                        }\n                    }\n                }\n            },\n            _closeHandler: function (e) {\n                var that = this, target = $(e.relatedTarget || e.target), sameTarget = target.closest(that.target.selector)[0] == that.target[0], item = target.closest(itemSelector), children = that._itemHasChildren(item), overflowWrapper = that._overflowWrapper(), containment = contains(that.element[0], target[0]) || overflowWrapper && contains(overflowWrapper[0], target[0]);\n                that._eventOrigin = e;\n                var normalClick = e.which !== 3;\n                if (that.popup.visible() && (normalClick && sameTarget || !sameTarget) && (that.options.closeOnClick && !children && containment || !containment)) {\n                    if (containment) {\n                        this.unbind(SELECT, this._closeTimeoutProxy);\n                        that.bind(SELECT, that._closeTimeoutProxy);\n                    } else {\n                        that.close();\n                    }\n                }\n            },\n            _wire: function () {\n                var that = this, options = that.options, target = that.target;\n                that._preventProxy = null;\n                that._showProxy = proxy(that._showHandler, that);\n                that._closeProxy = proxy(that._closeHandler, that);\n                that._closeTimeoutProxy = proxy(that.close, that);\n                if (target[0]) {\n                    if (kendo.support.mobileOS && options.showOn == 'contextmenu') {\n                        that.userEvents = new kendo.UserEvents(target, {\n                            filter: options.filter,\n                            allowSelection: false\n                        });\n                        that._preventProxy = function () {\n                            return false;\n                        };\n                        that.userEvents.bind('hold', that._showProxy);\n                    }\n                    if (options.filter) {\n                        target.on(options.showOn + NS + that._marker, options.filter, that._preventProxy || that._showProxy);\n                    } else {\n                        target.on(options.showOn + NS + that._marker, that._preventProxy || that._showProxy);\n                    }\n                }\n            },\n            _triggerEvent: function (e) {\n                var that = this, anchor = $(that.popup.options.anchor)[0], origin = that._eventOrigin;\n                that._eventOrigin = undefined;\n                return that.trigger(e.type, extend({\n                    type: e.type,\n                    item: e.item || this.element[0],\n                    target: anchor\n                }, origin ? { event: origin } : {}));\n            },\n            _popup: function () {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                that._triggerProxy = proxy(that._triggerEvent, that);\n                that.popup = that.element.addClass('k-context-menu').kendoPopup({\n                    autosize: that.options.orientation === 'horizontal',\n                    anchor: that.target || 'body',\n                    copyAnchorStyles: that.options.copyAnchorStyles,\n                    collision: that.options.popupCollision || 'fit',\n                    animation: that.options.animation,\n                    activate: that._triggerProxy,\n                    deactivate: that._triggerProxy,\n                    appendTo: overflowWrapper || that.options.appendTo,\n                    close: !overflowWrapper ? $.noop : function (e) {\n                        $(getChildPopups(e.sender.element, overflowWrapper)).each(function (i, p) {\n                            var popup = p.data(KENDOPOPUP);\n                            if (popup) {\n                                popup.close(true);\n                            }\n                        });\n                    }\n                }).data(KENDOPOPUP);\n                that._targetChild = contains(that.target[0], that.popup.element[0]);\n            }\n        });\n        ui.plugin(Menu);\n        ui.plugin(ContextMenu);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.panelbar', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'panelbar',\n        name: 'PanelBar',\n        category: 'web',\n        description: 'The PanelBar widget displays hierarchical data as a multi-level expandable panel bar.',\n        depends: [\n            'core',\n            'data',\n            'data.odata'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, keys = kendo.keys, extend = $.extend, proxy = $.proxy, each = $.each, isArray = $.isArray, template = kendo.template, Widget = ui.Widget, HierarchicalDataSource = kendo.data.HierarchicalDataSource, excludedNodesRegExp = /^(ul|a|div)$/i, NS = '.kendoPanelBar', IMG = 'img', HREF = 'href', LAST = 'k-last', LINK = 'k-link', LINKSELECTOR = '.' + LINK, ERROR = 'error', ITEM = '.k-item', GROUP = '.k-group', VISIBLEGROUP = GROUP + ':visible', IMAGE = 'k-image', FIRST = 'k-first', CHANGE = 'change', EXPAND = 'expand', SELECT = 'select', CLICK = 'click', CONTENT = 'k-content', ACTIVATE = 'activate', COLLAPSE = 'collapse', DATABOUND = 'dataBound', MOUSEENTER = 'mouseenter', MOUSELEAVE = 'mouseleave', CONTENTLOAD = 'contentLoad', UNDEFINED = 'undefined', ACTIVECLASS = 'k-state-active', GROUPS = '> .k-panel', CONTENTS = '> .k-content', STRING = 'string', FOCUSEDCLASS = 'k-state-focused', DISABLEDCLASS = 'k-state-disabled', SELECTEDCLASS = 'k-state-selected', SELECTEDSELECTOR = '.' + SELECTEDCLASS, HIGHLIGHTCLASS = 'k-state-highlight', ACTIVEITEMSELECTOR = ITEM + ':not(.k-state-disabled)', clickableItems = '> ' + ACTIVEITEMSELECTOR + ' > ' + LINKSELECTOR + ', .k-panel > ' + ACTIVEITEMSELECTOR + ' > ' + LINKSELECTOR, disabledItems = ITEM + '.k-state-disabled > .k-link', selectableItems = '> li > ' + SELECTEDSELECTOR + ', .k-panel > li > ' + SELECTEDSELECTOR, defaultState = 'k-state-default', ARIA_DISABLED = 'aria-disabled', ARIA_EXPANDED = 'aria-expanded', ARIA_HIDDEN = 'aria-hidden', ARIA_SELECTED = 'aria-selected', VISIBLE = ':visible', EMPTY = ':empty', SINGLE = 'single', bindings = {\n                text: 'dataTextField',\n                url: 'dataUrlField',\n                spriteCssClass: 'dataSpriteCssClassField',\n                imageUrl: 'dataImageUrlField'\n            }, itemIcon, rendering = {\n                aria: function (item) {\n                    var attr = '';\n                    if (item.items || item.content || item.contentUrl || item.expanded) {\n                        attr += ARIA_EXPANDED + '=\\'' + (item.expanded ? 'true' : 'false') + '\\' ';\n                    }\n                    if (item.enabled === false) {\n                        attr += ARIA_DISABLED + '=\\'true\\'';\n                    }\n                    return attr;\n                },\n                wrapperCssClass: function (group, item) {\n                    var result = 'k-item', index = item.index;\n                    if (item.enabled === false) {\n                        result += ' ' + DISABLEDCLASS;\n                    } else if (item.expanded === true) {\n                        result += ' ' + ACTIVECLASS;\n                    } else {\n                        result += ' k-state-default';\n                    }\n                    if (index === 0) {\n                        result += ' k-first';\n                    }\n                    if (index == group.length - 1) {\n                        result += ' k-last';\n                    }\n                    if (item.cssClass) {\n                        result += ' ' + item.cssClass;\n                    }\n                    return result;\n                },\n                textClass: function (item, group) {\n                    var result = LINK;\n                    if (group.firstLevel) {\n                        result += ' k-header';\n                    }\n                    if (item.selected) {\n                        result += ' ' + SELECTEDCLASS;\n                    }\n                    return result;\n                },\n                textAttributes: function (url) {\n                    return url ? ' href=\\'' + url + '\\'' : '';\n                },\n                arrowClass: function (item) {\n                    var result = 'k-icon';\n                    result += item.expanded ? ' k-panelbar-collapse k-i-arrow-60-up' : ' k-panelbar-expand k-i-arrow-60-down';\n                    return result;\n                },\n                text: function (item) {\n                    return item.encoded === false ? item.text : kendo.htmlEncode(item.text);\n                },\n                groupAttributes: function (group) {\n                    return group.expanded !== true ? ' style=\\'display:none\\'' : '';\n                },\n                ariaHidden: function (group) {\n                    return group.expanded !== true;\n                },\n                groupCssClass: function () {\n                    return 'k-group k-panel';\n                },\n                contentAttributes: function (content) {\n                    return content.item.expanded !== true ? ' style=\\'display:none\\'' : '';\n                },\n                content: function (item) {\n                    return item.content ? item.content : item.contentUrl ? '' : '&nbsp;';\n                },\n                contentUrl: function (item) {\n                    return item.contentUrl ? 'href=\"' + item.contentUrl + '\"' : '';\n                }\n            };\n        function updateFirstLast(items) {\n            items = $(items);\n            items.filter('.k-first:not(:first-child)').removeClass(FIRST);\n            items.filter('.k-last:not(:last-child)').removeClass(LAST);\n            items.filter(':first-child').addClass(FIRST);\n            items.filter(':last-child').addClass(LAST);\n        }\n        function updateItemHtml(item) {\n            var wrapper = item, group = item.children('ul'), toggleButton = wrapper.children('.k-link').children('.k-icon');\n            if (item.hasClass('k-panelbar')) {\n                return;\n            }\n            if (!toggleButton.length && group.length) {\n                toggleButton = $('<span class=\\'k-icon\\' />').appendTo(wrapper);\n            } else if (!group.length || !group.children().length) {\n                toggleButton.remove();\n                group.remove();\n            }\n        }\n        itemIcon = function (item) {\n            return item.children('span').children('.k-icon');\n        };\n        var PanelBar = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this, content, hasDataSource;\n                if (isArray(options)) {\n                    options = { dataSource: options };\n                }\n                hasDataSource = options && !!options.dataSource;\n                Widget.fn.init.call(that, element, options);\n                element = that.wrapper = that.element.addClass('k-widget k-reset k-header k-panelbar');\n                options = that.options;\n                if (element[0].id) {\n                    that._itemId = element[0].id + '_pb_active';\n                }\n                that._tabindex();\n                that._accessors();\n                that._dataSource();\n                that._templates();\n                that._initData(hasDataSource);\n                that._updateClasses();\n                that._animations(options);\n                element.on(CLICK + NS, clickableItems, proxy(that._click, that)).on(MOUSEENTER + NS + ' ' + MOUSELEAVE + NS, clickableItems, that._toggleHover).on(CLICK + NS, disabledItems, false).on(CLICK + NS, '.k-request-retry', proxy(that._retryRequest, that)).on('keydown' + NS, proxy(that._keydown, that)).on('focus' + NS, function () {\n                    var item = that.select();\n                    that._current(item[0] ? item : that._first());\n                }).on('blur' + NS, function () {\n                    that._current(null);\n                }).attr('role', 'menu');\n                content = element.find('li.' + ACTIVECLASS + ' > .' + CONTENT);\n                if (content[0]) {\n                    that.expand(content.parent(), false);\n                }\n                if (!options.dataSource) {\n                    that._angularCompile();\n                }\n                kendo.notify(that);\n            },\n            events: [\n                EXPAND,\n                COLLAPSE,\n                SELECT,\n                ACTIVATE,\n                CHANGE,\n                ERROR,\n                DATABOUND,\n                CONTENTLOAD\n            ],\n            options: {\n                name: 'PanelBar',\n                dataSource: {},\n                animation: {\n                    expand: {\n                        effects: 'expand:vertical',\n                        duration: 200\n                    },\n                    collapse: { duration: 200 }\n                },\n                messages: {\n                    loading: 'Loading...',\n                    requestFailed: 'Request failed.',\n                    retry: 'Retry'\n                },\n                autoBind: true,\n                loadOnDemand: true,\n                expandMode: 'multiple',\n                template: '',\n                dataTextField: null\n            },\n            _angularCompile: function () {\n                var that = this;\n                that.angular('compile', function () {\n                    return {\n                        elements: that.element.children('li'),\n                        data: [{ dataItem: that.options.$angular }]\n                    };\n                });\n            },\n            _angularCompileElements: function (html, items) {\n                var that = this;\n                that.angular('compile', function () {\n                    return {\n                        elements: html,\n                        data: $.map(items, function (item) {\n                            return [{ dataItem: item }];\n                        })\n                    };\n                });\n            },\n            _angularCleanup: function () {\n                var that = this;\n                that.angular('cleanup', function () {\n                    return { elements: that.element.children('li') };\n                });\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.element.off(NS);\n                this._angularCleanup();\n                kendo.destroy(this.element);\n            },\n            _initData: function (hasDataSource) {\n                var that = this;\n                if (hasDataSource) {\n                    that.element.empty();\n                    if (that.options.autoBind) {\n                        that._progress(true);\n                        that.dataSource.fetch();\n                    }\n                }\n            },\n            _templates: function () {\n                var that = this, options = that.options, fieldAccessor = proxy(that._fieldAccessor, that);\n                if (options.template && typeof options.template == STRING) {\n                    options.template = template(options.template);\n                } else if (!options.template) {\n                    options.template = template('# var text = ' + fieldAccessor('text') + '(data.item); #' + '# if (typeof data.item.encoded != \\'undefined\\' && data.item.encoded === false) {#' + '#= text #' + '# } else { #' + '#: text #' + '# } #');\n                }\n                that.templates = {\n                    content: template('<div role=\\'region\\' class=\\'k-content\\'#= contentAttributes(data) #>#= content(item) #</div>'),\n                    group: template('<ul role=\\'group\\' aria-hidden=\\'#= ariaHidden(group) #\\' class=\\'#= groupCssClass(group) #\\'#= groupAttributes(group) #>' + '#= renderItems(data) #' + '</ul>'),\n                    itemWrapper: template('# var url = ' + fieldAccessor('url') + '(item); #' + '# var imageUrl = ' + fieldAccessor('imageUrl') + '(item); #' + '# var spriteCssClass = ' + fieldAccessor('spriteCssClass') + '(item); #' + '# var contentUrl = contentUrl(item); #' + '# var tag = url||contentUrl ? \\'a\\' : \\'span\\'; #' + '<#= tag # class=\\'#= textClass(item, group) #\\' #= contentUrl ##= textAttributes(url) #>' + '# if (imageUrl) { #' + '<img class=\\'k-image\\' alt=\\'\\' src=\\'#= imageUrl #\\' />' + '# } #' + '# if (spriteCssClass) { #' + '<span class=\\'k-sprite #= spriteCssClass #\\'></span>' + '# } #' + '#= data.panelBar.options.template(data) #' + '#= arrow(data) #' + '</#= tag #>'),\n                    item: template('<li role=\\'menuitem\\' #=aria(item)#class=\\'#= wrapperCssClass(group, item) #\\'' + kendo.attr('uid') + '=\\'#= item.uid #\\'>' + '#= itemWrapper(data) #' + '# if (item.items && item.items.length > 0) { #' + '#= subGroup({ items: item.items, panelBar: panelBar, group: { expanded: item.expanded } }) #' + '# } else if (item.content || item.contentUrl) { #' + '#= renderContent(data) #' + '# } #' + '</li>'),\n                    loading: template('<div class=\\'k-item\\'><span class=\\'k-icon k-i-loading\\'></span> #: data.messages.loading #</div>'),\n                    retry: template('#: data.messages.requestFailed # ' + '<button class=\\'k-button k-request-retry\\'>#: data.messages.retry #</button>'),\n                    arrow: template('<span class=\\'#= arrowClass(item) #\\'></span>'),\n                    empty: template('')\n                };\n            },\n            setOptions: function (options) {\n                var animation = this.options.animation;\n                this._animations(options);\n                options.animation = extend(true, animation, options.animation);\n                if ('dataSource' in options) {\n                    this.setDataSource(options.dataSource);\n                }\n                Widget.fn.setOptions.call(this, options);\n            },\n            expand: function (element, useAnimation) {\n                var that = this, animBackup = {};\n                element = this.element.find(element);\n                if (that._animating && element.find('ul').is(':visible')) {\n                    that.one('complete', function () {\n                        setTimeout(function () {\n                            that.expand(element);\n                        });\n                    });\n                    return;\n                }\n                that._animating = true;\n                useAnimation = useAnimation !== false;\n                element.each(function (index, item) {\n                    item = $(item);\n                    var wrapper = element.children('.k-group,.k-content');\n                    if (!wrapper.length) {\n                        wrapper = that._addGroupElement(element);\n                    }\n                    var groups = wrapper.add(item.find(CONTENTS));\n                    if (!item.hasClass(DISABLEDCLASS) && groups.length > 0) {\n                        if (that.options.expandMode == SINGLE && that._collapseAllExpanded(item)) {\n                            return that;\n                        }\n                        element.find('.' + HIGHLIGHTCLASS).removeClass(HIGHLIGHTCLASS);\n                        item.addClass(HIGHLIGHTCLASS);\n                        if (!useAnimation) {\n                            animBackup = that.options.animation;\n                            that.options.animation = {\n                                expand: { effects: {} },\n                                collapse: {\n                                    hide: true,\n                                    effects: {}\n                                }\n                            };\n                        }\n                        if (!that._triggerEvent(EXPAND, item)) {\n                            that._toggleItem(item, false, false);\n                        }\n                        if (!useAnimation) {\n                            that.options.animation = animBackup;\n                        }\n                    }\n                });\n                return that;\n            },\n            collapse: function (element, useAnimation) {\n                var that = this, animBackup = {};\n                that._animating = true;\n                useAnimation = useAnimation !== false;\n                element = that.element.find(element);\n                element.each(function (index, item) {\n                    item = $(item);\n                    var groups = item.find(GROUPS).add(item.find(CONTENTS));\n                    if (!item.hasClass(DISABLEDCLASS) && groups.is(VISIBLE)) {\n                        item.removeClass(HIGHLIGHTCLASS);\n                        if (!useAnimation) {\n                            animBackup = that.options.animation;\n                            that.options.animation = {\n                                expand: { effects: {} },\n                                collapse: {\n                                    hide: true,\n                                    effects: {}\n                                }\n                            };\n                        }\n                        if (!that._triggerEvent(COLLAPSE, item)) {\n                            that._toggleItem(item, true);\n                        }\n                        if (!useAnimation) {\n                            that.options.animation = animBackup;\n                        }\n                    }\n                });\n                return that;\n            },\n            updateArrow: function (items) {\n                var that = this;\n                items = $(items);\n                items.children(LINKSELECTOR).children('.k-panelbar-collapse, .k-panelbar-expand').remove();\n                items.filter(function () {\n                    var dataItem = that.dataItem(this);\n                    if (!dataItem) {\n                        return $(this).find('.k-panel').length > 0 || $(this).find('.k-content').length > 0;\n                    }\n                    return dataItem.hasChildren || dataItem.content || dataItem.contentUrl;\n                }).children('.k-link:not(:has([class*=k-i-arrow]))').each(function () {\n                    var item = $(this), parent = item.parent();\n                    item.append('<span class=\\'k-icon ' + (parent.hasClass(ACTIVECLASS) ? ' k-panelbar-collapse k-i-arrow-60-up' : ' k-panelbar-expand k-i-arrow-60-down') + '\\'/>');\n                });\n            },\n            _accessors: function () {\n                var that = this, options = that.options, i, field, textField, element = that.element;\n                for (i in bindings) {\n                    field = options[bindings[i]];\n                    textField = element.attr(kendo.attr(i + '-field'));\n                    if (!field && textField) {\n                        field = textField;\n                    }\n                    if (!field) {\n                        field = i;\n                    }\n                    if (!isArray(field)) {\n                        field = [field];\n                    }\n                    options[bindings[i]] = field;\n                }\n            },\n            _progress: function (item, showProgress) {\n                var element = this.element;\n                var loadingText = this.templates.loading({ messages: this.options.messages });\n                if (arguments.length == 1) {\n                    showProgress = item;\n                    if (showProgress) {\n                        element.html(loadingText);\n                    } else {\n                        element.empty();\n                    }\n                } else {\n                    itemIcon(item).toggleClass('k-i-loading', showProgress).removeClass('k-i-refresh');\n                }\n            },\n            _refreshRoot: function (items) {\n                var that = this;\n                var parent = that.element;\n                var groupData = {\n                    firstLevel: true,\n                    expanded: true,\n                    length: parent.children().length\n                };\n                this.element.empty();\n                var rootItemsHtml = $.map(items, function (value, idx) {\n                    if (typeof value === 'string') {\n                        return $(value);\n                    } else {\n                        value.items = [];\n                        return $(that.renderItem({\n                            group: groupData,\n                            item: extend(value, { index: idx })\n                        }));\n                    }\n                });\n                this.element.append(rootItemsHtml);\n                var elements = this.element.children('.k-item');\n                for (var i = 0; i < items.length; i++) {\n                    this.trigger('itemChange', {\n                        item: elements.eq(i).find('.k-link').first(),\n                        data: items[i],\n                        ns: ui\n                    });\n                }\n                this._angularCompileElements(rootItemsHtml, items);\n            },\n            _refreshChildren: function (item, parentNode) {\n                var i, children, child;\n                parentNode.children('.k-group').empty();\n                var items = item.children.data();\n                if (!items.length) {\n                    updateItemHtml(parentNode);\n                    children = parentNode.children('.k-group').children('li');\n                    this._angularCompileElements(children, items);\n                } else {\n                    this.append(item.children, parentNode);\n                    if (this.options.loadOnDemand) {\n                        this._toggleGroup(parentNode.children('.k-group'), false);\n                    }\n                    children = parentNode.children('.k-group').children('li');\n                    for (i = 0; i < children.length; i++) {\n                        child = children.eq(i);\n                        this.trigger('itemChange', {\n                            item: child.find('.k-link').first(),\n                            data: this.dataItem(child),\n                            ns: ui\n                        });\n                    }\n                }\n            },\n            findByUid: function (uid) {\n                var items = this.element.find('.k-item');\n                var uidAttr = kendo.attr('uid');\n                var result;\n                for (var i = 0; i < items.length; i++) {\n                    if (items[i].getAttribute(uidAttr) == uid) {\n                        result = items[i];\n                        break;\n                    }\n                }\n                return $(result);\n            },\n            refresh: function (e) {\n                var options = this.options;\n                var node = e.node;\n                var action = e.action;\n                var items = e.items;\n                var parentNode = this.wrapper;\n                var loadOnDemand = options.loadOnDemand;\n                if (e.field) {\n                    if (!items[0] || !items[0].level) {\n                        return;\n                    }\n                    return this._updateItems(items, e.field);\n                }\n                if (node) {\n                    parentNode = this.findByUid(node.uid);\n                    this._progress(parentNode, false);\n                }\n                if (action == 'add') {\n                    this._appendItems(e.index, items, parentNode);\n                } else if (action == 'remove') {\n                    this.remove(this.findByUid(items[0].uid));\n                } else if (action == 'itemchange') {\n                    this._updateItems(items);\n                } else if (action == 'itemloaded') {\n                    this._refreshChildren(node, parentNode);\n                } else {\n                    this._refreshRoot(items);\n                }\n                if (action != 'remove') {\n                    for (var k = 0; k < items.length; k++) {\n                        if (!loadOnDemand || items[k].expanded) {\n                            var tempItem = items[k];\n                            if (this._hasChildItems(tempItem)) {\n                                tempItem.load();\n                            }\n                        }\n                    }\n                }\n                this.trigger(DATABOUND, { node: node ? parentNode : undefined });\n            },\n            _error: function (e) {\n                var node = e.node && this.findByUid(e.node.uid);\n                var retryHtml = this.templates.retry({ messages: this.options.messages });\n                if (node) {\n                    this._progress(node, false);\n                    this._expanded(node, false);\n                    itemIcon(node).addClass('k-i-refresh');\n                    e.node.loaded(false);\n                } else {\n                    this._progress(false);\n                    this.element.html(retryHtml);\n                }\n            },\n            _retryRequest: function (e) {\n                e.preventDefault();\n                this.dataSource.fetch();\n            },\n            items: function () {\n                return this.element.find('.k-item > span:first-child');\n            },\n            setDataSource: function (dataSource) {\n                var options = this.options;\n                options.dataSource = dataSource;\n                this._dataSource();\n                if (this.options.autoBind) {\n                    this._progress(true);\n                    this.dataSource.fetch();\n                }\n            },\n            _bindDataSource: function () {\n                this._refreshHandler = proxy(this.refresh, this);\n                this._errorHandler = proxy(this._error, this);\n                this.dataSource.bind(CHANGE, this._refreshHandler);\n                this.dataSource.bind(ERROR, this._errorHandler);\n            },\n            _unbindDataSource: function () {\n                var dataSource = this.dataSource;\n                if (dataSource) {\n                    dataSource.unbind(CHANGE, this._refreshHandler);\n                    dataSource.unbind(ERROR, this._errorHandler);\n                }\n            },\n            _fieldAccessor: function (fieldName) {\n                var fieldBindings = this.options[bindings[fieldName]] || [], count = fieldBindings.length, result = '(function(item) {';\n                if (count === 0) {\n                    result += 'return item[\\'' + fieldName + '\\'];';\n                } else {\n                    result += 'var levels = [' + $.map(fieldBindings, function (x) {\n                        return 'function(d){ return ' + kendo.expr(x) + '}';\n                    }).join(',') + '];';\n                    result += 'if(item.level){return levels[Math.min(item.level(), ' + count + '-1)](item);}else';\n                    result += '{return levels[' + count + '-1](item)}';\n                }\n                result += '})';\n                return result;\n            },\n            _dataSource: function () {\n                var that = this, options = that.options, dataSource = options.dataSource;\n                if (!dataSource) {\n                    return;\n                }\n                dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n                that._unbindDataSource();\n                if (!dataSource.fields) {\n                    dataSource.fields = [\n                        { field: 'text' },\n                        { field: 'url' },\n                        { field: 'spriteCssClass' },\n                        { field: 'imageUrl' }\n                    ];\n                }\n                that.dataSource = HierarchicalDataSource.create(dataSource);\n                that._bindDataSource();\n            },\n            _appendItems: function (index, items, parentNode) {\n                var that = this, children, wrapper;\n                if (parentNode.hasClass('k-panelbar')) {\n                    children = parentNode.children('li');\n                    wrapper = parentNode;\n                } else {\n                    wrapper = parentNode.children('.k-group');\n                    if (!wrapper.length) {\n                        wrapper = that._addGroupElement(parentNode);\n                    }\n                    children = wrapper.children('li');\n                }\n                var groupData = {\n                    firstLevel: parentNode.hasClass('k-panelbar'),\n                    expanded: true,\n                    length: children.length\n                };\n                var itemsHtml = $.map(items, function (value, idx) {\n                    if (typeof value === 'string') {\n                        return $(value);\n                    } else {\n                        return $(that.renderItem({\n                            group: groupData,\n                            item: extend(value, { index: idx })\n                        }));\n                    }\n                });\n                if (typeof index == UNDEFINED) {\n                    index = children.length;\n                }\n                for (var i = 0; i < itemsHtml.length; i++) {\n                    if (children.length === 0 || index === 0) {\n                        wrapper.append(itemsHtml[i]);\n                    } else {\n                        itemsHtml[i].insertAfter(children[index - 1]);\n                    }\n                }\n                that._angularCompileElements(itemsHtml, items);\n                if (that.dataItem(parentNode)) {\n                    that.dataItem(parentNode).hasChildren = true;\n                    that.updateArrow(parentNode);\n                }\n            },\n            _updateItems: function (items, field) {\n                var that = this;\n                var i, node, nodeWrapper, item;\n                var context = {\n                    panelBar: that.options,\n                    item: item,\n                    group: {}\n                };\n                var render = field != 'expanded';\n                if (field == 'selected') {\n                    if (items[0][field]) {\n                        var currentNode = that.findByUid(items[0].uid);\n                        if (!currentNode.hasClass(DISABLEDCLASS)) {\n                            that.select(currentNode, true);\n                        }\n                    } else {\n                        that.clearSelection();\n                    }\n                } else {\n                    var elements = $.map(items, function (item) {\n                        return that.findByUid(item.uid);\n                    });\n                    if (render) {\n                        that.angular('cleanup', function () {\n                            return { elements: elements };\n                        });\n                    }\n                    for (i = 0; i < items.length; i++) {\n                        context.item = item = items[i];\n                        context.panelBar = that;\n                        nodeWrapper = elements[i];\n                        node = nodeWrapper.parent();\n                        if (render) {\n                            context.group = {\n                                firstLevel: node.hasClass('k-panelbar'),\n                                expanded: nodeWrapper.parent().hasClass(ACTIVECLASS),\n                                length: nodeWrapper.children().length\n                            };\n                            nodeWrapper.children('.k-link').remove();\n                            nodeWrapper.prepend(that.templates.itemWrapper(extend(context, { arrow: item.hasChildren || item.content || item.contentUrl ? that.templates.arrow : that.templates.empty }, rendering)));\n                        }\n                        if (field == 'expanded') {\n                            that._toggleItem(nodeWrapper, !item[field], item[field] ? 'true' : true);\n                        } else if (field == 'enabled') {\n                            that.enable(nodeWrapper, item[field]);\n                            if (!item[field]) {\n                                if (item.selected) {\n                                    item.set('selected', false);\n                                }\n                            }\n                        }\n                        if (nodeWrapper.length) {\n                            this.trigger('itemChange', {\n                                item: nodeWrapper.find('.k-link').first(),\n                                data: item,\n                                ns: ui\n                            });\n                        }\n                    }\n                    if (render) {\n                        that.angular('compile', function () {\n                            return {\n                                elements: elements,\n                                data: $.map(items, function (item) {\n                                    return [{ dataItem: item }];\n                                })\n                            };\n                        });\n                    }\n                }\n            },\n            _toggleDisabled: function (element, enable) {\n                element = this.element.find(element);\n                element.toggleClass(defaultState, enable).toggleClass(DISABLEDCLASS, !enable).attr(ARIA_DISABLED, !enable);\n            },\n            dataItem: function (item) {\n                var uid = $(item).closest(ITEM).attr(kendo.attr('uid')), dataSource = this.dataSource;\n                return dataSource && dataSource.getByUid(uid);\n            },\n            select: function (element, skipChange) {\n                var that = this;\n                if (element === undefined) {\n                    return that.element.find(selectableItems).parent();\n                }\n                element = that.element.find(element);\n                if (!element.length) {\n                    this._updateSelected(element);\n                } else {\n                    element.each(function () {\n                        var item = $(this), link = item.children(LINKSELECTOR);\n                        if (item.hasClass(DISABLEDCLASS)) {\n                            return that;\n                        }\n                        that._updateSelected(link, skipChange);\n                    });\n                }\n                return that;\n            },\n            clearSelection: function () {\n                this.select($());\n            },\n            enable: function (element, state) {\n                this._toggleDisabled(element, state !== false);\n                return this;\n            },\n            disable: function (element) {\n                this._toggleDisabled(element, false);\n                return this;\n            },\n            append: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.length ? referenceItem.find(GROUPS) : null);\n                each(inserted.items, function () {\n                    inserted.group.append(this);\n                    updateFirstLast(this);\n                });\n                this.updateArrow(referenceItem);\n                updateFirstLast(inserted.group.find('.k-first, .k-last'));\n                inserted.group.height('auto');\n                return this;\n            },\n            insertBefore: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.parent());\n                each(inserted.items, function () {\n                    referenceItem.before(this);\n                    updateFirstLast(this);\n                });\n                updateFirstLast(referenceItem);\n                inserted.group.height('auto');\n                return this;\n            },\n            insertAfter: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.parent());\n                each(inserted.items, function () {\n                    referenceItem.after(this);\n                    updateFirstLast(this);\n                });\n                updateFirstLast(referenceItem);\n                inserted.group.height('auto');\n                return this;\n            },\n            remove: function (element) {\n                element = this.element.find(element);\n                var that = this, parent = element.parentsUntil(that.element, ITEM), group = element.parent('ul');\n                element.remove();\n                if (group && !group.hasClass('k-panelbar') && !group.children(ITEM).length) {\n                    group.remove();\n                }\n                if (parent.length) {\n                    parent = parent.eq(0);\n                    that.updateArrow(parent);\n                    updateFirstLast(parent);\n                }\n                return that;\n            },\n            reload: function (element) {\n                var that = this;\n                element = that.element.find(element);\n                element.each(function () {\n                    var item = $(this);\n                    that._ajaxRequest(item, item.children('.' + CONTENT), !item.is(VISIBLE));\n                });\n            },\n            _first: function () {\n                return this.element.children(ACTIVEITEMSELECTOR).first();\n            },\n            _last: function () {\n                var item = this.element.children(ACTIVEITEMSELECTOR).last(), group = item.children(VISIBLEGROUP);\n                if (group[0]) {\n                    return group.children(ACTIVEITEMSELECTOR).last();\n                }\n                return item;\n            },\n            _current: function (candidate) {\n                var that = this, focused = that._focused, id = that._itemId;\n                if (candidate === undefined) {\n                    return focused;\n                }\n                that.element.removeAttr('aria-activedescendant');\n                if (focused && focused.length) {\n                    if (focused[0].id === id) {\n                        focused.removeAttr('id');\n                    }\n                    focused.children(LINKSELECTOR).removeClass(FOCUSEDCLASS);\n                }\n                if ($(candidate).length) {\n                    id = candidate[0].id || id;\n                    candidate.attr('id', id).children(LINKSELECTOR).addClass(FOCUSEDCLASS);\n                    that.element.attr('aria-activedescendant', id);\n                }\n                that._focused = candidate;\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, current = that._current();\n                if (e.target != e.currentTarget) {\n                    return;\n                }\n                if (key == keys.DOWN || key == keys.RIGHT) {\n                    that._current(that._nextItem(current));\n                    e.preventDefault();\n                } else if (key == keys.UP || key == keys.LEFT) {\n                    that._current(that._prevItem(current));\n                    e.preventDefault();\n                } else if (key == keys.ENTER || key == keys.SPACEBAR) {\n                    that._click(e);\n                    e.preventDefault();\n                } else if (key == keys.HOME) {\n                    that._current(that._first());\n                    e.preventDefault();\n                } else if (key == keys.END) {\n                    that._current(that._last());\n                    e.preventDefault();\n                }\n            },\n            _nextItem: function (item) {\n                if (!item) {\n                    return this._first();\n                }\n                var group = item.children(VISIBLEGROUP), next = item.nextAll(':visible').first();\n                if (group[0]) {\n                    next = group.children('.' + FIRST);\n                }\n                if (!next[0]) {\n                    next = item.parent(VISIBLEGROUP).parent(ITEM).next();\n                }\n                if (!next[0]) {\n                    next = this._first();\n                }\n                if (next.hasClass(DISABLEDCLASS)) {\n                    next = this._nextItem(next);\n                }\n                return next;\n            },\n            _prevItem: function (item) {\n                if (!item) {\n                    return this._last();\n                }\n                var prev = item.prevAll(':visible').first(), result;\n                if (!prev[0]) {\n                    prev = item.parent(VISIBLEGROUP).parent(ITEM);\n                    if (!prev[0]) {\n                        prev = this._last();\n                    }\n                } else {\n                    result = prev;\n                    while (result[0]) {\n                        result = result.children(VISIBLEGROUP).children('.' + LAST);\n                        if (result[0]) {\n                            prev = result;\n                        }\n                    }\n                }\n                if (prev.hasClass(DISABLEDCLASS)) {\n                    prev = this._prevItem(prev);\n                }\n                return prev;\n            },\n            _insert: function (item, referenceItem, parent) {\n                var that = this, items, plain = $.isPlainObject(item), isReferenceItem = referenceItem && referenceItem[0], groupData;\n                if (!isReferenceItem) {\n                    parent = that.element;\n                }\n                groupData = {\n                    firstLevel: parent.hasClass('k-panelbar'),\n                    expanded: $(referenceItem).hasClass(ACTIVECLASS),\n                    length: parent.children().length\n                };\n                if (isReferenceItem && !parent.length) {\n                    parent = $(that.renderGroup({\n                        group: groupData,\n                        options: that.options\n                    })).appendTo(referenceItem);\n                }\n                if (plain || $.isArray(item) || item instanceof HierarchicalDataSource) {\n                    if (item instanceof HierarchicalDataSource) {\n                        item = item.data();\n                    }\n                    items = $.map(plain ? [item] : item, function (value, idx) {\n                        if (typeof value === 'string') {\n                            return $(value);\n                        } else {\n                            return $(that.renderItem({\n                                group: groupData,\n                                item: extend(value, { index: idx })\n                            }));\n                        }\n                    });\n                    if (isReferenceItem) {\n                        var dataItem = that.dataItem(referenceItem);\n                        if (dataItem) {\n                            dataItem.hasChildren = true;\n                            referenceItem.attr(ARIA_EXPANDED, dataItem.expanded).not('.' + ACTIVECLASS).children('ul').attr(ARIA_HIDDEN, !dataItem.expanded);\n                        } else {\n                            referenceItem.attr(ARIA_EXPANDED, false);\n                        }\n                    }\n                } else {\n                    if (typeof item == 'string' && item.charAt(0) != '<') {\n                        items = that.element.find(item);\n                    } else {\n                        items = $(item);\n                    }\n                    that._updateItemsClasses(items);\n                }\n                if (!item.length) {\n                    item = [item];\n                }\n                that._angularCompileElements(items, item);\n                return {\n                    items: items,\n                    group: parent\n                };\n            },\n            _toggleHover: function (e) {\n                var target = $(e.currentTarget);\n                if (!target.parents('li.' + DISABLEDCLASS).length) {\n                    target.toggleClass('k-state-hover', e.type == MOUSEENTER);\n                }\n            },\n            _updateClasses: function () {\n                var that = this, panels, items, expanded, panelsParent, dataItem;\n                panels = that.element.find('li > ul').not(function () {\n                    return $(this).parentsUntil('.k-panelbar', 'div').length;\n                }).addClass('k-group k-panel').attr('role', 'group');\n                panelsParent = panels.parent();\n                dataItem = that.dataItem(panelsParent);\n                expanded = dataItem && dataItem.expanded || false;\n                panels.parent().attr(ARIA_EXPANDED, expanded).not('.' + ACTIVECLASS).children('ul').attr(ARIA_HIDDEN, !expanded).hide();\n                items = that.element.add(panels).children();\n                that._updateItemsClasses(items);\n                that.updateArrow(items);\n                updateFirstLast(items);\n            },\n            _updateItemsClasses: function (items) {\n                var length = items.length, idx = 0;\n                for (; idx < length; idx++) {\n                    this._updateItemClasses(items[idx], idx);\n                }\n            },\n            _updateItemClasses: function (item, index) {\n                var selected = this._selected, contentUrls = this.options.contentUrls, url = contentUrls && contentUrls[index], root = this.element[0], wrapElement, link;\n                item = $(item).addClass('k-item').attr('role', 'menuitem');\n                if (kendo.support.browser.msie) {\n                    item.css('list-style-position', 'inside').css('list-style-position', '');\n                }\n                item.children(IMG).addClass(IMAGE);\n                link = item.children('a').addClass(LINK);\n                if (link[0]) {\n                    link.attr('href', url);\n                    link.children(IMG).addClass(IMAGE);\n                }\n                item.filter(':not([disabled]):not([class*=k-state])').addClass('k-state-default');\n                item.filter('li[disabled]').addClass('k-state-disabled').attr(ARIA_DISABLED, true).removeAttr('disabled');\n                item.children('div').addClass(CONTENT).attr('role', 'region').attr(ARIA_HIDDEN, true).hide().parent().attr(ARIA_EXPANDED, false);\n                link = item.children(SELECTEDSELECTOR);\n                if (link[0]) {\n                    if (selected) {\n                        selected.removeAttr(ARIA_SELECTED).children(SELECTEDSELECTOR).removeClass(SELECTEDCLASS);\n                    }\n                    link.addClass(SELECTEDCLASS);\n                    this._selected = item.attr(ARIA_SELECTED, true);\n                }\n                if (!item.children(LINKSELECTOR)[0]) {\n                    wrapElement = '<span class=\\'' + LINK + '\\'/>';\n                    if (contentUrls && contentUrls[index] && item[0].parentNode == root) {\n                        wrapElement = '<a class=\"k-link k-header\" href=\"' + contentUrls[index] + '\"/>';\n                    }\n                    item.contents().filter(function () {\n                        return !this.nodeName.match(excludedNodesRegExp) && !(this.nodeType == 3 && !$.trim(this.nodeValue));\n                    }).wrapAll(wrapElement);\n                }\n                if (item.parent('.k-panelbar')[0]) {\n                    item.children(LINKSELECTOR).addClass('k-header');\n                }\n            },\n            _click: function (e) {\n                var that = this, target = e.type == CLICK ? $(e.target) : that._current().children(LINKSELECTOR), element = that.element, prevent, contents, href, isAnchor;\n                if (target.parents('li.' + DISABLEDCLASS).length) {\n                    return;\n                }\n                if (target.closest('.k-widget')[0] != element[0]) {\n                    return;\n                }\n                if (target.is(':kendoFocusable') && !target.hasClass(LINK)) {\n                    return;\n                }\n                var link = target.closest(LINKSELECTOR), item = link.closest(ITEM);\n                that._updateSelected(link);\n                var wrapper = item.children('.k-group,.k-content');\n                var dataItem = this.dataItem(item);\n                if (!wrapper.length && (that.options.loadOnDemand && dataItem && dataItem.hasChildren || this._hasChildItems(item) || item.content || item.contentUrl)) {\n                    wrapper = that._addGroupElement(item);\n                }\n                contents = item.find(GROUPS).add(item.find(CONTENTS));\n                href = link.attr(HREF);\n                isAnchor = href && (href.charAt(href.length - 1) == '#' || href.indexOf('#' + that.element[0].id + '-') != -1);\n                prevent = !!(isAnchor || contents.length);\n                if (contents.data('animating') && prevent) {\n                    e.preventDefault();\n                    return;\n                }\n                if (that._triggerEvent(SELECT, item)) {\n                    prevent = true;\n                }\n                if (prevent === false) {\n                    return;\n                }\n                if (that.options.expandMode == SINGLE) {\n                    if (that._collapseAllExpanded(item) && prevent) {\n                        e.preventDefault();\n                        return;\n                    }\n                }\n                if (contents.length) {\n                    var visibility = contents.is(VISIBLE);\n                    if (!that._triggerEvent(!visibility ? EXPAND : COLLAPSE, item)) {\n                        prevent = that._toggleItem(item, visibility);\n                    }\n                }\n                if (prevent) {\n                    e.preventDefault();\n                }\n            },\n            _hasChildItems: function (item) {\n                return item.items && item.items.length > 0 || item.hasChildren;\n            },\n            _toggleItem: function (element, isVisible, expanded) {\n                var that = this, childGroup = element.find(GROUPS), link = element.find(LINKSELECTOR), url = link.attr(HREF), prevent, content, dataItem = that.dataItem(element), notVisible = !isVisible;\n                var loaded = dataItem && dataItem.loaded();\n                if (dataItem && !expanded && dataItem.expanded !== notVisible) {\n                    dataItem.set('expanded', notVisible);\n                    prevent = dataItem.hasChildren || !!dataItem.content || !!dataItem.contentUrl;\n                    return prevent;\n                }\n                if (dataItem && (!expanded || expanded === 'true') && !loaded && !dataItem.content && !dataItem.contentUrl) {\n                    if (that.options.loadOnDemand) {\n                        this._progress(element, true);\n                    }\n                    element.children('.k-group,.k-content').remove();\n                    prevent = dataItem.hasChildren;\n                    dataItem.load();\n                } else {\n                    if (childGroup.length) {\n                        this._toggleGroup(childGroup, isVisible);\n                        prevent = true;\n                    } else {\n                        content = element.children('.' + CONTENT);\n                        if (content.length) {\n                            prevent = true;\n                            if (!content.is(EMPTY) || url === undefined) {\n                                that._toggleGroup(content, isVisible);\n                            } else {\n                                that._ajaxRequest(element, content, isVisible);\n                            }\n                        }\n                    }\n                }\n                return prevent;\n            },\n            _toggleGroup: function (element, visibility) {\n                var that = this, animationSettings = that.options.animation, animation = animationSettings.expand, hasCollapseAnimation = animationSettings.collapse && 'effects' in animationSettings.collapse, collapse = extend({}, animationSettings.expand, animationSettings.collapse);\n                if (!hasCollapseAnimation) {\n                    collapse = extend(collapse, { reverse: true });\n                }\n                if (element.is(VISIBLE) != visibility) {\n                    that._animating = false;\n                    return;\n                }\n                element.attr(ARIA_HIDDEN, !!visibility);\n                element.parent().attr(ARIA_EXPANDED, !visibility).toggleClass(ACTIVECLASS, !visibility).find('> .k-link > .k-panelbar-collapse,> .k-link > .k-panelbar-expand').toggleClass('k-i-arrow-60-up', !visibility).toggleClass('k-panelbar-collapse', !visibility).toggleClass('k-i-arrow-60-down', visibility).toggleClass('k-panelbar-expand', visibility);\n                if (visibility) {\n                    animation = extend(collapse, { hide: true });\n                    animation.complete = function () {\n                        that._animationCallback();\n                    };\n                } else {\n                    animation = extend({\n                        complete: function (element) {\n                            that._triggerEvent(ACTIVATE, element.closest(ITEM));\n                            that._animationCallback();\n                        }\n                    }, animation);\n                }\n                element.kendoStop(true, true).kendoAnimate(animation);\n            },\n            _animationCallback: function () {\n                var that = this;\n                that.trigger('complete');\n                that._animating = false;\n            },\n            _addGroupElement: function (element) {\n                var group = $('<ul role=\"group\" aria-hidden=\"true\" class=\"k-group k-panel\" style=\"display:none\"></ul>');\n                element.append(group);\n                return group;\n            },\n            _collapseAllExpanded: function (item) {\n                var that = this, children, stopExpand = false;\n                var groups = item.find(GROUPS).add(item.find(CONTENTS));\n                if (groups.is(VISIBLE)) {\n                    stopExpand = true;\n                }\n                if (!(groups.is(VISIBLE) || groups.length === 0)) {\n                    children = item.siblings();\n                    children.find(GROUPS).add(children.find(CONTENTS)).filter(function () {\n                        return $(this).is(VISIBLE);\n                    }).each(function (index, content) {\n                        content = $(content);\n                        stopExpand = that._triggerEvent(COLLAPSE, content.closest(ITEM));\n                        if (!stopExpand) {\n                            that._toggleGroup(content, true);\n                        }\n                    });\n                    that.one('complete', function () {\n                        setTimeout(function () {\n                            children.each(function (index, child) {\n                                var dataItem = that.dataItem(child);\n                                if (dataItem) {\n                                    dataItem.set('expanded', false);\n                                }\n                            });\n                        });\n                    });\n                }\n                return stopExpand;\n            },\n            _ajaxRequest: function (element, contentElement, isVisible) {\n                var that = this, statusIcon = element.find('.k-panelbar-collapse, .k-panelbar-expand'), link = element.find(LINKSELECTOR), loadingIconTimeout = setTimeout(function () {\n                        statusIcon.addClass('k-i-loading');\n                    }, 100), data = {}, url = link.attr(HREF);\n                $.ajax({\n                    type: 'GET',\n                    cache: false,\n                    url: url,\n                    dataType: 'html',\n                    data: data,\n                    error: function (xhr, status) {\n                        statusIcon.removeClass('k-i-loading');\n                        if (that.trigger(ERROR, {\n                                xhr: xhr,\n                                status: status\n                            })) {\n                            this.complete();\n                        }\n                    },\n                    complete: function () {\n                        clearTimeout(loadingIconTimeout);\n                        statusIcon.removeClass('k-i-loading');\n                    },\n                    success: function (data) {\n                        function getElements() {\n                            return { elements: contentElement.get() };\n                        }\n                        try {\n                            that.angular('cleanup', getElements);\n                            contentElement.html(data);\n                            that.angular('compile', getElements);\n                        } catch (e) {\n                            var console = window.console;\n                            if (console && console.error) {\n                                console.error(e.name + ': ' + e.message + ' in ' + url);\n                            }\n                            this.error(this.xhr, 'error');\n                        }\n                        that._toggleGroup(contentElement, isVisible);\n                        that.trigger(CONTENTLOAD, {\n                            item: element[0],\n                            contentElement: contentElement[0]\n                        });\n                    }\n                });\n            },\n            _triggerEvent: function (eventName, element) {\n                var that = this;\n                return that.trigger(eventName, { item: element[0] });\n            },\n            _updateSelected: function (link, skipChange) {\n                var that = this, element = that.element, item = link.parent(ITEM), selected = that._selected, dataItem = that.dataItem(item);\n                if (selected) {\n                    selected.removeAttr(ARIA_SELECTED);\n                }\n                that._selected = item.attr(ARIA_SELECTED, true);\n                element.find(selectableItems).removeClass(SELECTEDCLASS);\n                element.find('> .' + HIGHLIGHTCLASS + ', .k-panel > .' + HIGHLIGHTCLASS).removeClass(HIGHLIGHTCLASS);\n                link.addClass(SELECTEDCLASS);\n                link.parentsUntil(element, ITEM).filter(':has(.k-header)').addClass(HIGHLIGHTCLASS);\n                that._current(item[0] ? item : null);\n                if (dataItem) {\n                    dataItem.set('selected', true);\n                }\n                if (!skipChange) {\n                    that.trigger(CHANGE);\n                }\n            },\n            _animations: function (options) {\n                if (options && 'animation' in options && !options.animation) {\n                    options.animation = {\n                        expand: { effects: {} },\n                        collapse: {\n                            hide: true,\n                            effects: {}\n                        }\n                    };\n                }\n            },\n            renderItem: function (options) {\n                var that = this;\n                options = extend({\n                    panelBar: that,\n                    group: {}\n                }, options);\n                var empty = that.templates.empty, item = options.item;\n                return that.templates.item(extend(options, {\n                    itemWrapper: that.templates.itemWrapper,\n                    renderContent: that.renderContent,\n                    arrow: that._hasChildItems(item) || item.content || item.contentUrl ? that.templates.arrow : empty,\n                    subGroup: !options.loadOnDemand || item.expanded ? that.renderGroup : empty\n                }, rendering));\n            },\n            renderGroup: function (options) {\n                var that = this;\n                var templates = that.templates || options.panelBar.templates;\n                return templates.group(extend({\n                    renderItems: function (options) {\n                        var html = '', i = 0, items = options.items, len = items ? items.length : 0, group = extend({ length: len }, options.group);\n                        for (; i < len; i++) {\n                            html += options.panelBar.renderItem(extend(options, {\n                                group: group,\n                                item: extend({ index: i }, items[i])\n                            }));\n                        }\n                        return html;\n                    }\n                }, options, rendering));\n            },\n            renderContent: function (options) {\n                return options.panelBar.templates.content(extend(options, rendering));\n            }\n        });\n        kendo.ui.plugin(PanelBar);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.progressbar', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'progressbar',\n        name: 'ProgressBar',\n        category: 'web',\n        description: 'The ProgressBar offers rich functionality for displaying and tracking progress',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, HORIZONTAL = 'horizontal', VERTICAL = 'vertical', DEFAULTMIN = 0, DEFAULTMAX = 100, DEFAULTVALUE = 0, DEFAULTCHUNKCOUNT = 5, KPROGRESSBAR = 'k-progressbar', KPROGRESSBARREVERSE = 'k-progressbar-reverse', KPROGRESSBARINDETERMINATE = 'k-progressbar-indeterminate', KPROGRESSBARCOMPLETE = 'k-complete', KPROGRESSWRAPPER = 'k-state-selected', KPROGRESSSTATUS = 'k-progress-status', LABEL_POSITION_END = 'k-progress-end', KCOMPLETEDCHUNK = 'k-state-selected', KUPCOMINGCHUNK = 'k-state-default', STATEDISABLED = 'k-state-disabled', PROGRESSTYPE = {\n                VALUE: 'value',\n                PERCENT: 'percent',\n                CHUNK: 'chunk'\n            }, CHANGE = 'change', COMPLETE = 'complete', BOOLEAN = 'boolean', math = Math, extend = $.extend, proxy = $.proxy, HUNDREDPERCENT = 100, DEFAULTANIMATIONDURATION = 400, PRECISION = 3, templates = { progressStatus: '<span class=\\'k-progress-status-wrap ' + LABEL_POSITION_END + '\\'><span class=\\'k-progress-status\\'></span></span>' };\n        var ProgressBar = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(this, element, options);\n                options = that.options;\n                that._progressProperty = options.orientation === HORIZONTAL ? 'width' : 'height';\n                that._fields();\n                options.value = that._validateValue(options.value);\n                that._validateType(options.type);\n                that._wrapper();\n                that._progressAnimation();\n                if (options.value !== options.min && options.value !== false) {\n                    that._updateProgress();\n                }\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                if (options.hasOwnProperty('reverse')) {\n                    that.wrapper.toggleClass('k-progressbar-reverse', options.reverse);\n                }\n                if (options.hasOwnProperty('enable')) {\n                    that.enable(options.enable);\n                }\n                that._progressAnimation();\n                that._validateValue();\n                that._updateProgress();\n            },\n            events: [\n                CHANGE,\n                COMPLETE\n            ],\n            options: {\n                name: 'ProgressBar',\n                orientation: HORIZONTAL,\n                reverse: false,\n                min: DEFAULTMIN,\n                max: DEFAULTMAX,\n                value: DEFAULTVALUE,\n                enable: true,\n                type: PROGRESSTYPE.VALUE,\n                chunkCount: DEFAULTCHUNKCOUNT,\n                showStatus: true,\n                animation: {}\n            },\n            _fields: function () {\n                var that = this;\n                that._isStarted = false;\n                that.progressWrapper = that.progressStatus = $();\n            },\n            _validateType: function (currentType) {\n                var isValid = false;\n                $.each(PROGRESSTYPE, function (k, type) {\n                    if (type === currentType) {\n                        isValid = true;\n                        return false;\n                    }\n                });\n                if (!isValid) {\n                    throw new Error(kendo.format('Invalid ProgressBar type \\'{0}\\'', currentType));\n                }\n            },\n            _wrapper: function () {\n                var that = this;\n                var container = that.wrapper = that.element;\n                var options = that.options;\n                var orientation = options.orientation;\n                var initialStatusValue;\n                container.addClass('k-widget ' + KPROGRESSBAR);\n                container.addClass(KPROGRESSBAR + '-' + (orientation === HORIZONTAL ? HORIZONTAL : VERTICAL));\n                if (options.enable === false) {\n                    container.addClass(STATEDISABLED);\n                }\n                if (options.reverse) {\n                    container.addClass(KPROGRESSBARREVERSE);\n                }\n                if (options.value === false) {\n                    container.addClass(KPROGRESSBARINDETERMINATE);\n                }\n                if (options.type === PROGRESSTYPE.CHUNK) {\n                    that._addChunkProgressWrapper();\n                } else {\n                    if (options.showStatus) {\n                        that.progressStatus = that.wrapper.prepend(templates.progressStatus).find('.' + KPROGRESSSTATUS);\n                        initialStatusValue = options.value !== false ? options.value : options.min;\n                        if (options.type === PROGRESSTYPE.VALUE) {\n                            that.progressStatus.text(initialStatusValue);\n                        } else {\n                            that.progressStatus.text(that._calculatePercentage(initialStatusValue).toFixed() + '%');\n                        }\n                    }\n                }\n            },\n            value: function (value) {\n                return this._value(value);\n            },\n            _value: function (value) {\n                var that = this;\n                var options = that.options;\n                var validated;\n                if (value === undefined) {\n                    return options.value;\n                } else {\n                    if (typeof value !== BOOLEAN) {\n                        value = that._roundValue(value);\n                        if (!isNaN(value)) {\n                            validated = that._validateValue(value);\n                            if (validated !== options.value) {\n                                that.wrapper.removeClass(KPROGRESSBARINDETERMINATE);\n                                options.value = validated;\n                                that._isStarted = true;\n                                that._updateProgress();\n                            }\n                        }\n                    } else if (!value) {\n                        that.wrapper.addClass(KPROGRESSBARINDETERMINATE);\n                        options.value = false;\n                    }\n                }\n            },\n            _roundValue: function (value) {\n                value = parseFloat(value);\n                var power = math.pow(10, PRECISION);\n                return kendo._round(value * power) / power;\n            },\n            _validateValue: function (value) {\n                var that = this;\n                var options = that.options;\n                if (value !== false) {\n                    if (value <= options.min || value === true) {\n                        return options.min;\n                    } else if (value >= options.max) {\n                        return options.max;\n                    }\n                } else if (value === false) {\n                    return false;\n                }\n                if (isNaN(that._roundValue(value))) {\n                    return options.min;\n                }\n                return value;\n            },\n            _updateProgress: function () {\n                var that = this;\n                var options = that.options;\n                var percentage = that._calculatePercentage();\n                if (options.type === PROGRESSTYPE.CHUNK) {\n                    that._updateChunks(percentage);\n                    that._onProgressUpdateAlways(options.value);\n                } else {\n                    that._updateProgressWrapper(percentage);\n                }\n            },\n            _updateChunks: function (percentage) {\n                var that = this;\n                var options = that.options;\n                var chunkCount = options.chunkCount;\n                var percentagesPerChunk = parseInt(HUNDREDPERCENT / chunkCount * 100, 10) / 100;\n                var percentageParsed = parseInt(percentage * 100, 10) / 100;\n                var completedChunksCount = math.floor(percentageParsed / percentagesPerChunk);\n                var completedChunks;\n                if (options.orientation === HORIZONTAL && !options.reverse || options.orientation === VERTICAL && options.reverse) {\n                    completedChunks = that.wrapper.find('li.k-item:lt(' + completedChunksCount + ')');\n                } else {\n                    completedChunks = that.wrapper.find('li.k-item:gt(-' + (completedChunksCount + 1) + ')');\n                }\n                that.wrapper.find('.' + KCOMPLETEDCHUNK).removeClass(KCOMPLETEDCHUNK).addClass(KUPCOMINGCHUNK);\n                completedChunks.removeClass(KUPCOMINGCHUNK).addClass(KCOMPLETEDCHUNK);\n            },\n            _updateProgressWrapper: function (percentage) {\n                var that = this;\n                var options = that.options;\n                var progressWrapper = that.wrapper.find('.' + KPROGRESSWRAPPER);\n                var animationDuration = that._isStarted ? that._animation.duration : 0;\n                var animationCssOptions = {};\n                if (progressWrapper.length === 0) {\n                    that._addRegularProgressWrapper();\n                }\n                animationCssOptions[that._progressProperty] = percentage + '%';\n                that.progressWrapper.animate(animationCssOptions, {\n                    duration: animationDuration,\n                    start: proxy(that._onProgressAnimateStart, that),\n                    progress: proxy(that._onProgressAnimate, that),\n                    complete: proxy(that._onProgressAnimateComplete, that, options.value),\n                    always: proxy(that._onProgressUpdateAlways, that, options.value)\n                });\n            },\n            _onProgressAnimateStart: function () {\n                this.progressWrapper.show();\n            },\n            _onProgressAnimate: function (e) {\n                var that = this;\n                var options = that.options;\n                var progressInPercent = parseFloat(e.elem.style[that._progressProperty], 10);\n                var progressStatusWrapSize;\n                if (options.showStatus) {\n                    progressStatusWrapSize = 10000 / parseFloat(that.progressWrapper[0].style[that._progressProperty]);\n                    that.progressWrapper.find('.k-progress-status-wrap').css(that._progressProperty, progressStatusWrapSize + '%');\n                }\n                if (options.type !== PROGRESSTYPE.CHUNK && progressInPercent <= 98) {\n                    that.progressWrapper.removeClass(KPROGRESSBARCOMPLETE);\n                }\n            },\n            _onProgressAnimateComplete: function (currentValue) {\n                var that = this;\n                var options = that.options;\n                var progressWrapperSize = parseFloat(that.progressWrapper[0].style[that._progressProperty]);\n                var progressValue;\n                if (options.type !== PROGRESSTYPE.CHUNK && progressWrapperSize > 98) {\n                    that.progressWrapper.addClass(KPROGRESSBARCOMPLETE);\n                }\n                if (options.showStatus) {\n                    if (options.type === PROGRESSTYPE.VALUE) {\n                        progressValue = currentValue;\n                    } else if (options.type == PROGRESSTYPE.PERCENT) {\n                        progressValue = that._calculatePercentage(currentValue).toFixed() + '%';\n                    } else {\n                        progressValue = math.floor(that._calculatePercentage(currentValue)) + '%';\n                    }\n                    that.progressStatus.text(progressValue);\n                }\n                if (currentValue === options.min) {\n                    that.progressWrapper.hide();\n                }\n            },\n            _onProgressUpdateAlways: function (currentValue) {\n                var that = this;\n                var options = that.options;\n                if (that._isStarted) {\n                    that.trigger(CHANGE, { value: currentValue });\n                }\n                if (currentValue === options.max && that._isStarted) {\n                    that.trigger(COMPLETE, { value: options.max });\n                }\n            },\n            enable: function (enable) {\n                var that = this;\n                var options = that.options;\n                options.enable = typeof enable === 'undefined' ? true : enable;\n                that.wrapper.toggleClass(STATEDISABLED, !options.enable);\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n            },\n            _addChunkProgressWrapper: function () {\n                var that = this;\n                var options = that.options;\n                var container = that.wrapper;\n                var chunkSize = HUNDREDPERCENT / options.chunkCount;\n                var html = '';\n                if (options.chunkCount <= 1) {\n                    options.chunkCount = 1;\n                }\n                html += '<ul class=\\'k-reset\\'>';\n                for (var i = options.chunkCount - 1; i >= 0; i--) {\n                    html += '<li class=\\'k-item k-state-default\\'></li>';\n                }\n                html += '</ul>';\n                container.append(html).find('.k-item').css(that._progressProperty, chunkSize + '%').first().addClass('k-first').end().last().addClass('k-last');\n                that._normalizeChunkSize();\n            },\n            _normalizeChunkSize: function () {\n                var that = this;\n                var options = that.options;\n                var lastChunk = that.wrapper.find('.k-item:last');\n                var currentSize = parseFloat(lastChunk[0].style[that._progressProperty]);\n                var difference = HUNDREDPERCENT - options.chunkCount * currentSize;\n                if (difference > 0) {\n                    lastChunk.css(that._progressProperty, currentSize + difference + '%');\n                }\n            },\n            _addRegularProgressWrapper: function () {\n                var that = this;\n                that.progressWrapper = $('<div class=\\'' + KPROGRESSWRAPPER + '\\'></div>').appendTo(that.wrapper);\n                if (that.options.showStatus) {\n                    that.progressWrapper.append(templates.progressStatus);\n                    that.progressStatus = that.wrapper.find('.' + KPROGRESSSTATUS);\n                }\n            },\n            _calculateChunkSize: function () {\n                var that = this;\n                var chunkCount = that.options.chunkCount;\n                var chunkContainer = that.wrapper.find('ul.k-reset');\n                return (parseInt(chunkContainer.css(that._progressProperty), 10) - (chunkCount - 1)) / chunkCount;\n            },\n            _calculatePercentage: function (currentValue) {\n                var that = this;\n                var options = that.options;\n                var value = currentValue !== undefined ? currentValue : options.value;\n                var min = options.min;\n                var max = options.max;\n                that._onePercent = math.abs((max - min) / 100);\n                return math.abs((value - min) / that._onePercent);\n            },\n            _progressAnimation: function () {\n                var that = this;\n                var options = that.options;\n                var animation = options.animation;\n                if (animation === false) {\n                    that._animation = { duration: 0 };\n                } else {\n                    that._animation = extend({ duration: DEFAULTANIMATIONDURATION }, options.animation);\n                }\n            }\n        });\n        kendo.ui.plugin(ProgressBar);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.responsivepanel', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'responsive-panel',\n        name: 'Responsive Panel',\n        category: 'web',\n        description: 'The Responsive Panel widget allows a panel of content to be hidden on mobile devices, available through a toggle button.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var proxy = $.proxy;\n        var NS = '.kendoResponsivePanel';\n        var OPEN = 'open';\n        var CLOSE = 'close';\n        var ACTIVATE_EVENTS = 'click' + NS + ' touchstart' + NS + ' touchend' + NS;\n        var Widget = kendo.ui.Widget;\n        var ResponsivePanel = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this._guid = '_' + kendo.guid();\n                this._toggleHandler = proxy(this._toggleButtonClick, this);\n                this._closeHandler = proxy(this._close, this);\n                $(document.documentElement).on(ACTIVATE_EVENTS, this.options.toggleButton, this._toggleHandler);\n                this._registerBreakpoint();\n                this.element.addClass('k-rpanel k-rpanel-' + this.options.orientation + ' ' + this._guid);\n                this._resizeHandler = proxy(this.resize, this, true);\n                $(window).on('resize' + NS, this._resizeHandler);\n            },\n            _mediaQuery: '@media (max-width: #= breakpoint-1 #px) {' + '.#= guid #.k-rpanel-animate.k-rpanel-left,' + '.#= guid #.k-rpanel-animate.k-rpanel-right {' + '-webkit-transition: -webkit-transform .2s ease-out;' + '-ms-transition: -ms-transform .2s ease-out;' + 'transition: transform .2s ease-out;' + '} ' + '.#= guid #.k-rpanel-top {' + 'overflow: hidden;' + '}' + '.#= guid #.k-rpanel-animate.k-rpanel-top {' + '-webkit-transition: max-height .2s linear;' + '-ms-transition: max-height .2s linear;' + 'transition: max-height .2s linear;' + '}' + '} ' + '@media (min-width: #= breakpoint #px) {' + '#= toggleButton # { display: none; } ' + '.#= guid #.k-rpanel-left { float: left; } ' + '.#= guid #.k-rpanel-right { float: right; } ' + '.#= guid #.k-rpanel-left, .#= guid #.k-rpanel-right {' + 'position: relative;' + '-webkit-transform: translateX(0);' + '-ms-transform: translateX(0);' + 'transform: translateX(0);' + '-webkit-transform: translateX(0) translateZ(0);' + '-ms-transform: translateX(0) translateZ(0);' + 'transform: translateX(0) translateZ(0);' + '} ' + '.k-ie9 .#= guid #.k-rpanel-left { left: 0; } ' + '.#= guid #.k-rpanel-top { max-height: none; }' + '}',\n            _registerBreakpoint: function () {\n                var options = this.options;\n                this._registerStyle(kendo.template(this._mediaQuery)({\n                    breakpoint: options.breakpoint,\n                    toggleButton: options.toggleButton,\n                    guid: this._guid\n                }));\n            },\n            _registerStyle: function (cssText) {\n                var head = $('head,body')[0];\n                var style = document.createElement('style');\n                head.appendChild(style);\n                if (style.styleSheet) {\n                    style.styleSheet.cssText = cssText;\n                } else {\n                    style.appendChild(document.createTextNode(cssText));\n                }\n            },\n            options: {\n                name: 'ResponsivePanel',\n                orientation: 'left',\n                toggleButton: '.k-rpanel-toggle',\n                breakpoint: 640,\n                autoClose: true\n            },\n            events: [\n                OPEN,\n                CLOSE\n            ],\n            _resize: function () {\n                this.element.removeClass('k-rpanel-animate k-rpanel-expanded');\n                $(document.documentElement).off(ACTIVATE_EVENTS, this._closeHandler);\n            },\n            _toggleButtonClick: function (e) {\n                e.preventDefault();\n                if (e.type == 'touchend') {\n                    return;\n                }\n                if (this.element.hasClass('k-rpanel-expanded')) {\n                    this.close();\n                } else {\n                    this.open();\n                }\n            },\n            open: function () {\n                if (!this.trigger(OPEN)) {\n                    this.element.addClass('k-rpanel-animate k-rpanel-expanded');\n                    if (this.options.autoClose) {\n                        $(document.documentElement).on(ACTIVATE_EVENTS, this._closeHandler);\n                    }\n                }\n            },\n            close: function () {\n                if (!this.trigger(CLOSE)) {\n                    this.element.addClass('k-rpanel-animate').removeClass('k-rpanel-expanded');\n                    $(document.documentElement).off(ACTIVATE_EVENTS, this._closeHandler);\n                }\n            },\n            _close: function (e) {\n                var prevented = e.isDefaultPrevented();\n                var container = $(e.target).closest(this.options.toggleButton + ',.k-rpanel');\n                if (!container.length && !prevented) {\n                    this.close();\n                }\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                $(window).off('resize' + NS, this._resizeHandler);\n                $(document.documentElement).off(ACTIVATE_EVENTS, this._closeHandler);\n            }\n        });\n        kendo.ui.plugin(ResponsivePanel);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.tabstrip', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'tabstrip',\n        name: 'TabStrip',\n        category: 'web',\n        description: 'The TabStrip widget displays a collection of tabs with associated tab content.',\n        depends: ['data'],\n        features: [{\n                id: 'tabstrip-fx',\n                name: 'Animation',\n                description: 'Support for animation',\n                depends: ['fx']\n            }]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, keys = kendo.keys, map = $.map, each = $.each, trim = $.trim, extend = $.extend, isFunction = kendo.isFunction, template = kendo.template, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, Widget = ui.Widget, excludedNodesRegExp = /^(a|div)$/i, NS = '.kendoTabStrip', IMG = 'img', HREF = 'href', PREV = 'prev', NEXT = 'next', SHOW = 'show', LINK = 'k-link', LAST = 'k-last', CLICK = 'click', ERROR = 'error', EMPTY = ':empty', IMAGE = 'k-image', FIRST = 'k-first', SELECT = 'select', ACTIVATE = 'activate', CONTENT = 'k-content', CONTENTURL = 'contentUrl', MOUSEENTER = 'mouseenter', MOUSELEAVE = 'mouseleave', CONTENTLOAD = 'contentLoad', DISABLEDSTATE = 'k-state-disabled', DEFAULTSTATE = 'k-state-default', ACTIVESTATE = 'k-state-active', FOCUSEDSTATE = 'k-state-focused', HOVERSTATE = 'k-state-hover', TABONTOP = 'k-tab-on-top', NAVIGATABLEITEMS = '.k-item:not(.' + DISABLEDSTATE + ')', KEYBOARDNAVIGATABLEITEMS = '.k-item', HOVERABLEITEMS = '.k-tabstrip-items > ' + NAVIGATABLEITEMS + ':not(.' + ACTIVESTATE + ')', DEFAULTDISTANCE = 200, templates = {\n                content: template('<div class=\\'k-content\\'#= contentAttributes(data) # role=\\'tabpanel\\'>#= content(item) #</div>'),\n                itemWrapper: template('<#= tag(item) # class=\\'k-link\\'#= contentUrl(item) ##= textAttributes(item) #>' + '#= image(item) ##= sprite(item) ##= text(item) #' + '</#= tag(item) #>'),\n                item: template('<li class=\\'#= wrapperCssClass(group, item) #\\' role=\\'tab\\' #=item.active ? \"aria-selected=\\'true\\'\" : \\'\\'#>' + '#= itemWrapper(data) #' + '</li>'),\n                image: template('<img class=\\'k-image\\' alt=\\'\\' src=\\'#= imageUrl #\\' />'),\n                sprite: template('<span class=\\'k-sprite #= spriteCssClass #\\'></span>'),\n                empty: template('')\n            }, rendering = {\n                wrapperCssClass: function (group, item) {\n                    var result = 'k-item', index = item.index;\n                    if (item.enabled === false) {\n                        result += ' k-state-disabled';\n                    } else {\n                        result += ' k-state-default';\n                    }\n                    if (index === 0) {\n                        result += ' k-first';\n                    }\n                    if (index == group.length - 1) {\n                        result += ' k-last';\n                    }\n                    return result;\n                },\n                textAttributes: function (item) {\n                    return item.url ? ' href=\\'' + item.url + '\\'' : '';\n                },\n                text: function (item) {\n                    return item.encoded === false ? item.text : kendo.htmlEncode(item.text);\n                },\n                tag: function (item) {\n                    return item.url ? 'a' : 'span';\n                },\n                contentAttributes: function (content) {\n                    return content.active !== true ? ' style=\\'display:none\\' aria-hidden=\\'true\\' aria-expanded=\\'false\\'' : '';\n                },\n                content: function (item) {\n                    return item.content ? item.content : item.contentUrl ? '' : '&nbsp;';\n                },\n                contentUrl: function (item) {\n                    return item.contentUrl ? kendo.attr('content-url') + '=\"' + item.contentUrl + '\"' : '';\n                }\n            };\n        function updateTabClasses(tabs) {\n            tabs.children(IMG).addClass(IMAGE);\n            tabs.children('a').addClass(LINK).children(IMG).addClass(IMAGE);\n            tabs.filter(':not([disabled]):not([class*=k-state-disabled])').addClass(DEFAULTSTATE);\n            tabs.filter('li[disabled]').addClass(DISABLEDSTATE).attr('aria-disabled', 'true').removeAttr('disabled');\n            tabs.filter(':not([class*=k-state])').children('a').filter(':focus').parent().addClass(ACTIVESTATE + ' ' + TABONTOP);\n            tabs.attr('role', 'tab');\n            tabs.filter('.' + ACTIVESTATE).attr('aria-selected', true);\n            tabs.each(function () {\n                var item = $(this);\n                if (!item.children('.' + LINK).length) {\n                    item.contents().filter(function () {\n                        return !this.nodeName.match(excludedNodesRegExp) && !(this.nodeType == 3 && !trim(this.nodeValue));\n                    }).wrapAll('<span UNSELECTABLE=\\'on\\' class=\\'' + LINK + '\\'/>');\n                }\n            });\n        }\n        function updateFirstLast(tabGroup) {\n            var tabs = tabGroup.children('.k-item');\n            tabs.filter('.k-first:not(:first-child)').removeClass(FIRST);\n            tabs.filter('.k-last:not(:last-child)').removeClass(LAST);\n            tabs.filter(':first-child').addClass(FIRST);\n            tabs.filter(':last-child').addClass(LAST);\n        }\n        function scrollButtonHtml(buttonClass, iconClass) {\n            return '<span class=\\'k-button k-button-icon k-bare k-tabstrip-' + buttonClass + '\\' unselectable=\\'on\\'><span class=\\'k-icon ' + iconClass + '\\'></span></span>';\n        }\n        var TabStrip = Widget.extend({\n            init: function (element, options) {\n                var that = this, value;\n                Widget.fn.init.call(that, element, options);\n                that._animations(that.options);\n                options = that.options;\n                that._contentUrls = options.contentUrls || [];\n                that._wrapper();\n                that._isRtl = kendo.support.isRtl(that.wrapper);\n                that._tabindex();\n                that._updateClasses();\n                that._dataSource();\n                if (options.dataSource) {\n                    that.dataSource.fetch();\n                }\n                that._tabPosition();\n                that._scrollable();\n                if (that._contentUrls.length) {\n                    that.wrapper.find('.k-tabstrip-items > .k-item').each(function (index, item) {\n                        var url = that._contentUrls[index];\n                        if (typeof url === 'string') {\n                            $(item).find('>.' + LINK).data(CONTENTURL, url);\n                        }\n                    });\n                } else {\n                    that._contentUrls.length = that.tabGroup.find('li.k-item').length;\n                }\n                that.wrapper.on(MOUSEENTER + NS + ' ' + MOUSELEAVE + NS, HOVERABLEITEMS, that._toggleHover).on('focus' + NS, $.proxy(that._active, that)).on('blur' + NS, function () {\n                    that._current(null);\n                });\n                that._keyDownProxy = $.proxy(that._keydown, that);\n                if (options.navigatable) {\n                    that.wrapper.on('keydown' + NS, that._keyDownProxy);\n                }\n                if (that.options.value) {\n                    value = that.options.value;\n                }\n                that.wrapper.children('.k-tabstrip-items').on(CLICK + NS, '.k-state-disabled .k-link', false).on(CLICK + NS, ' > ' + NAVIGATABLEITEMS, function (e) {\n                    var wr = that.wrapper[0];\n                    if (wr !== document.activeElement) {\n                        var msie = kendo.support.browser.msie;\n                        if (msie) {\n                            try {\n                                wr.setActive();\n                            } catch (j) {\n                                wr.focus();\n                            }\n                        } else {\n                            wr.focus();\n                        }\n                    }\n                    if (that._click($(e.currentTarget))) {\n                        e.preventDefault();\n                    }\n                });\n                var selectedItems = that.tabGroup.children('li.' + ACTIVESTATE), content = that.contentHolder(selectedItems.index());\n                if (selectedItems[0] && content.length > 0 && content[0].childNodes.length === 0) {\n                    that.activateTab(selectedItems.eq(0));\n                }\n                that.element.attr('role', 'tablist');\n                if (that.element[0].id) {\n                    that._ariaId = that.element[0].id + '_ts_active';\n                }\n                that.value(value);\n                kendo.notify(that);\n            },\n            _active: function () {\n                var item = this.tabGroup.children().filter('.' + ACTIVESTATE);\n                item = item[0] ? item : this._endItem('first');\n                if (item[0]) {\n                    this._current(item);\n                }\n            },\n            _endItem: function (action) {\n                return this.tabGroup.children(NAVIGATABLEITEMS)[action]();\n            },\n            _getItem: function (action) {\n                return this.tabGroup.children(KEYBOARDNAVIGATABLEITEMS)[action]();\n            },\n            _item: function (item, action) {\n                var endItem;\n                if (action === PREV) {\n                    endItem = 'last';\n                } else {\n                    endItem = 'first';\n                }\n                if (!item) {\n                    return this._endItem(endItem);\n                }\n                item = item[action]();\n                if (!item[0]) {\n                    item = this.tabGroup.children(KEYBOARDNAVIGATABLEITEMS)[endItem]();\n                }\n                if (item.hasClass(DISABLEDSTATE)) {\n                    item.addClass(FOCUSEDSTATE);\n                }\n                if (item.hasClass(DISABLEDSTATE) || item.hasClass(ACTIVESTATE)) {\n                    this._focused = item;\n                }\n                return item;\n            },\n            _current: function (candidate) {\n                var that = this, focused = that._focused, id = that._ariaId;\n                if (candidate === undefined) {\n                    return focused;\n                }\n                if (focused) {\n                    that.tabGroup.children('#' + id).removeAttr('id');\n                    focused.removeClass(FOCUSEDSTATE);\n                }\n                if (candidate) {\n                    if (!candidate.hasClass(ACTIVESTATE)) {\n                        candidate.addClass(FOCUSEDSTATE);\n                    }\n                    that.element.removeAttr('aria-activedescendant');\n                    id = candidate[0].id || id;\n                    if (id) {\n                        candidate.attr('id', id);\n                        that.element.attr('aria-activedescendant', id);\n                    }\n                }\n                that._focused = candidate;\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, current = that._current(), rtl = that._isRtl, isHorizontal = /top|bottom/.test(that.options.tabPosition), action;\n                if (e.target != e.currentTarget || !current) {\n                    return;\n                }\n                if (key === keys.DOWN && !isHorizontal) {\n                    action = NEXT;\n                } else if (key === keys.UP && !isHorizontal) {\n                    action = PREV;\n                } else if (key === keys.RIGHT && isHorizontal) {\n                    action = rtl ? PREV : NEXT;\n                } else if (key === keys.LEFT && isHorizontal) {\n                    action = rtl ? NEXT : PREV;\n                } else if (key == keys.ENTER || key == keys.SPACEBAR) {\n                    that._click(current);\n                    e.preventDefault();\n                } else if (key == keys.HOME) {\n                    that._click(that._getItem('first'));\n                    e.preventDefault();\n                    return;\n                } else if (key == keys.END) {\n                    that._click(that._getItem('last'));\n                    e.preventDefault();\n                    return;\n                }\n                if (action) {\n                    that._click(that._item(current, action));\n                    e.preventDefault();\n                }\n            },\n            _dataSource: function () {\n                var that = this;\n                if (that.dataSource && that._refreshHandler) {\n                    that.dataSource.unbind('change', that._refreshHandler);\n                } else {\n                    that._refreshHandler = $.proxy(that.refresh, that);\n                }\n                that.dataSource = kendo.data.DataSource.create(that.options.dataSource).bind('change', that._refreshHandler);\n            },\n            setDataSource: function (dataSource) {\n                var that = this;\n                that.options.dataSource = dataSource;\n                that._dataSource();\n                that.dataSource.fetch();\n            },\n            _animations: function (options) {\n                if (options && 'animation' in options && !options.animation) {\n                    options.animation = {\n                        open: { effects: {} },\n                        close: { effects: {} }\n                    };\n                }\n            },\n            refresh: function (e) {\n                var that = this, options = that.options, encoded = kendo.getter(options.dataEncodedField), text = kendo.getter(options.dataTextField), content = kendo.getter(options.dataContentField), contentUrl = kendo.getter(options.dataContentUrlField), image = kendo.getter(options.dataImageUrlField), url = kendo.getter(options.dataUrlField), sprite = kendo.getter(options.dataSpriteCssClass), idx, tabs = [], tab, action, view = that.dataSource.view(), length;\n                e = e || {};\n                action = e.action;\n                if (action) {\n                    view = e.items;\n                }\n                for (idx = 0, length = view.length; idx < length; idx++) {\n                    tab = { text: text(view[idx]) };\n                    if (options.dataEncodedField) {\n                        tab.encoded = encoded(view[idx]);\n                    }\n                    if (options.dataContentField) {\n                        tab.content = content(view[idx]);\n                    }\n                    if (options.dataContentUrlField) {\n                        tab.contentUrl = contentUrl(view[idx]);\n                    }\n                    if (options.dataUrlField) {\n                        tab.url = url(view[idx]);\n                    }\n                    if (options.dataImageUrlField) {\n                        tab.imageUrl = image(view[idx]);\n                    }\n                    if (options.dataSpriteCssClass) {\n                        tab.spriteCssClass = sprite(view[idx]);\n                    }\n                    tabs[idx] = tab;\n                }\n                if (e.action == 'add') {\n                    if (e.index < that.tabGroup.children().length) {\n                        that.insertBefore(tabs, that.tabGroup.children().eq(e.index));\n                    } else {\n                        that.append(tabs);\n                    }\n                } else if (e.action == 'remove') {\n                    for (idx = 0; idx < view.length; idx++) {\n                        that.remove(e.index);\n                    }\n                } else if (e.action == 'itemchange') {\n                    idx = that.dataSource.view().indexOf(view[0]);\n                    if (e.field === options.dataTextField) {\n                        that.tabGroup.children().eq(idx).find('.k-link').text(view[0].get(e.field));\n                    }\n                    if (e.field === options.dataUrlField) {\n                        that._contentUrls[idx] = view[0].get(e.field);\n                    }\n                } else {\n                    that.trigger('dataBinding');\n                    that.remove('li');\n                    that._contentUrls = [];\n                    that.append(tabs);\n                    that.trigger('dataBound');\n                }\n            },\n            value: function (value) {\n                var that = this;\n                if (value !== undefined) {\n                    if (value != that.value()) {\n                        that.tabGroup.children().each(function () {\n                            if ($.trim($(this).text()) == value) {\n                                that.select(this);\n                            }\n                        });\n                    }\n                } else {\n                    return that.select().text();\n                }\n            },\n            items: function () {\n                return this.tabGroup[0].children;\n            },\n            setOptions: function (options) {\n                var that = this, animation = that.options.animation;\n                that._animations(options);\n                if (options.contentUrls) {\n                    that._contentUrls = options.contentUrls;\n                }\n                options.animation = extend(true, animation, options.animation);\n                if (options.navigatable) {\n                    that.wrapper.on('keydown' + NS, that._keyDownProxy);\n                } else {\n                    that.wrapper.off('keydown' + NS, that._keyDownProxy);\n                }\n                Widget.fn.setOptions.call(that, options);\n            },\n            events: [\n                SELECT,\n                ACTIVATE,\n                SHOW,\n                ERROR,\n                CONTENTLOAD,\n                'change',\n                'dataBinding',\n                'dataBound'\n            ],\n            options: {\n                name: 'TabStrip',\n                dataEncodedField: '',\n                dataTextField: '',\n                dataContentField: '',\n                dataImageUrlField: '',\n                dataUrlField: '',\n                dataSpriteCssClass: '',\n                dataContentUrlField: '',\n                tabPosition: 'top',\n                animation: {\n                    open: {\n                        effects: 'expand:vertical fadeIn',\n                        duration: 200\n                    },\n                    close: { duration: 200 }\n                },\n                collapsible: false,\n                navigatable: true,\n                contentUrls: false,\n                scrollable: { distance: DEFAULTDISTANCE }\n            },\n            destroy: function () {\n                var that = this, scrollWrap = that.scrollWrap;\n                Widget.fn.destroy.call(that);\n                if (that._refreshHandler) {\n                    that.dataSource.unbind('change', that._refreshHandler);\n                }\n                that.wrapper.off(NS);\n                that.wrapper.children('.k-tabstrip-items').off(NS);\n                if (that._scrollableModeActive) {\n                    that._scrollPrevButton.off().remove();\n                    that._scrollNextButton.off().remove();\n                }\n                kendo.destroy(that.wrapper);\n                scrollWrap.children('.k-tabstrip').unwrap();\n            },\n            select: function (element) {\n                var that = this;\n                if (arguments.length === 0) {\n                    return that.tabGroup.children('li.' + ACTIVESTATE);\n                }\n                if (!isNaN(element)) {\n                    element = that.tabGroup.children().get(element);\n                }\n                element = that.tabGroup.find(element);\n                $(element).each(function (index, item) {\n                    item = $(item);\n                    if (!item.hasClass(ACTIVESTATE) && !that.trigger(SELECT, {\n                            item: item[0],\n                            contentElement: that.contentHolder(item.index())[0]\n                        })) {\n                        that.activateTab(item);\n                    }\n                });\n                return that;\n            },\n            enable: function (element, state) {\n                this._toggleDisabled(element, state !== false);\n                return this;\n            },\n            disable: function (element) {\n                this._toggleDisabled(element, false);\n                return this;\n            },\n            reload: function (element) {\n                element = this.tabGroup.find(element);\n                var that = this;\n                var contentUrls = that._contentUrls;\n                element.each(function () {\n                    var item = $(this), contentUrl = item.find('.' + LINK).data(CONTENTURL) || contentUrls[item.index()], content = that.contentHolder(item.index());\n                    if (contentUrl) {\n                        that.ajaxRequest(item, content, null, contentUrl);\n                    }\n                });\n                return that;\n            },\n            append: function (tab) {\n                var that = this, inserted = that._create(tab);\n                each(inserted.tabs, function (idx) {\n                    var contents = inserted.contents[idx];\n                    that.tabGroup.append(this);\n                    if (that.options.tabPosition == 'bottom') {\n                        that.tabGroup.before(contents);\n                    } else if (that._scrollableModeActive) {\n                        that._scrollPrevButton.before(contents);\n                    } else {\n                        that.wrapper.append(contents);\n                    }\n                    that.angular('compile', function () {\n                        return { elements: [contents] };\n                    });\n                });\n                updateFirstLast(that.tabGroup);\n                that._updateContentElements();\n                that.resize(true);\n                return that;\n            },\n            _appendUrlItem: function (url) {\n                this._contentUrls.push(url);\n            },\n            _moveUrlItem: function (from, to) {\n                this._contentUrls.splice(to, 0, this._contentUrls.splice(from, 1)[0]);\n            },\n            _removeUrlItem: function (index) {\n                this._contentUrls.splice(index, 1);\n            },\n            insertBefore: function (tab, referenceTab) {\n                if ($(tab).is($(referenceTab))) {\n                    referenceTab = this.tabGroup.find(referenceTab).next();\n                } else {\n                    referenceTab = this.tabGroup.find(referenceTab);\n                }\n                var that = this, inserted = that._create(tab), referenceContent = that.element.find('[id=\\'' + referenceTab.attr('aria-controls') + '\\']');\n                each(inserted.tabs, function (idx) {\n                    var contents = inserted.contents[idx];\n                    var fromIndex = inserted.newTabsCreated ? that._contentUrls.length - (inserted.tabs.length - idx) : $(contents).index() - 1;\n                    referenceTab.before(this);\n                    referenceContent.before(contents);\n                    that._moveUrlItem(fromIndex, $(this).index());\n                    that.angular('compile', function () {\n                        return { elements: [contents] };\n                    });\n                });\n                updateFirstLast(that.tabGroup);\n                that._updateContentElements(inserted.newTabsCreated);\n                that.resize(true);\n                return that;\n            },\n            insertAfter: function (tab, referenceTab) {\n                if ($(tab).is($(referenceTab))) {\n                    referenceTab = this.tabGroup.find(referenceTab).prev();\n                } else {\n                    referenceTab = this.tabGroup.find(referenceTab);\n                }\n                var that = this, inserted = that._create(tab), referenceContent = that.element.find('[id=\\'' + referenceTab.attr('aria-controls') + '\\']');\n                each(inserted.tabs, function (idx) {\n                    var contents = inserted.contents[idx];\n                    var fromIndex = inserted.newTabsCreated ? that._contentUrls.length - (inserted.tabs.length - idx) : $(contents).index() - 1;\n                    referenceTab.after(this);\n                    referenceContent.after(contents);\n                    that._moveUrlItem(fromIndex, $(this).index());\n                    that.angular('compile', function () {\n                        return { elements: [contents] };\n                    });\n                });\n                updateFirstLast(that.tabGroup);\n                that._updateContentElements(inserted.newTabsCreated);\n                that.resize(true);\n                return that;\n            },\n            remove: function (elements) {\n                var that = this;\n                var type = typeof elements;\n                var contents;\n                if (type === 'string') {\n                    elements = that.tabGroup.find(elements);\n                } else if (type === 'number') {\n                    elements = that.tabGroup.children().eq(elements);\n                }\n                contents = elements.map(function () {\n                    var idx = $(this).index();\n                    var content = that.contentElement(idx);\n                    kendo.destroy(content);\n                    that._removeUrlItem(idx);\n                    return content;\n                });\n                elements.remove();\n                contents.empty();\n                contents.remove();\n                that._updateContentElements();\n                that.resize(true);\n                return that;\n            },\n            _create: function (tab) {\n                var that = this, tabs, contents, content, newTabsCreated = false;\n                tab = tab instanceof kendo.data.ObservableArray ? tab.toJSON() : tab;\n                if ($.isPlainObject(tab) || $.isArray(tab)) {\n                    tab = $.isArray(tab) ? tab : [tab];\n                    newTabsCreated = true;\n                    tabs = map(tab, function (value, idx) {\n                        that._appendUrlItem(tab[idx].contentUrl || null);\n                        return $(TabStrip.renderItem({\n                            group: that.tabGroup,\n                            item: extend(value, { index: idx })\n                        }));\n                    });\n                    contents = map(tab, function (value, idx) {\n                        if (typeof value.content == 'string' || value.contentUrl) {\n                            return $(TabStrip.renderContent({ item: extend(value, { index: idx }) }));\n                        }\n                    });\n                } else {\n                    if (typeof tab == 'string' && tab[0] != '<') {\n                        tabs = that.element.find(tab);\n                    } else {\n                        tabs = $(tab);\n                    }\n                    contents = $();\n                    tabs.each(function () {\n                        if (/k-tabstrip-items/.test(this.parentNode.className)) {\n                            var element = that.element.find('[id=\\'' + this.getAttribute('aria-controls') + '\\']');\n                            content = element;\n                        } else {\n                            content = $('<div class=\\'' + CONTENT + '\\'/>');\n                        }\n                        contents = contents.add(content);\n                    });\n                    updateTabClasses(tabs);\n                }\n                return {\n                    tabs: tabs,\n                    contents: contents,\n                    newTabsCreated: newTabsCreated\n                };\n            },\n            _toggleDisabled: function (element, enable) {\n                element = this.tabGroup.find(element);\n                element.each(function () {\n                    $(this).toggleClass(DEFAULTSTATE, enable).toggleClass(DISABLEDSTATE, !enable).attr('aria-disabled', !enable);\n                });\n            },\n            _updateClasses: function () {\n                var that = this, tabs, activeItem, activeTab;\n                that.wrapper.addClass('k-widget k-header k-tabstrip');\n                that.tabGroup = that.wrapper.children('ul').addClass('k-tabstrip-items k-reset');\n                if (!that.tabGroup[0]) {\n                    that.tabGroup = $('<ul class=\\'k-tabstrip-items k-reset\\'/>').appendTo(that.wrapper);\n                }\n                tabs = that.tabGroup.find('li').addClass('k-item');\n                if (tabs.length) {\n                    activeItem = tabs.filter('.' + ACTIVESTATE).index();\n                    activeTab = activeItem >= 0 ? activeItem : undefined;\n                    that.tabGroup.contents().filter(function () {\n                        return this.nodeType == 3 && !trim(this.nodeValue);\n                    }).remove();\n                }\n                if (activeItem >= 0) {\n                    tabs.eq(activeItem).addClass(TABONTOP);\n                }\n                that.contentElements = that.wrapper.children('div');\n                that.contentElements.addClass(CONTENT).eq(activeTab).addClass(ACTIVESTATE).css({ display: 'block' });\n                if (tabs.length) {\n                    updateTabClasses(tabs);\n                    updateFirstLast(that.tabGroup);\n                    that._updateContentElements(true);\n                }\n            },\n            _elementId: function (element, idx) {\n                var elementId = element.attr('id');\n                var wrapperId = this.element.attr('id');\n                if (!elementId || elementId.indexOf(wrapperId + '-') > -1) {\n                    var tabStripID = (wrapperId || kendo.guid()) + '-';\n                    return tabStripID + (idx + 1);\n                }\n                return elementId;\n            },\n            _updateContentElements: function (isInitialUpdate) {\n                var that = this, contentUrls = that._contentUrls, items = that.tabGroup.children('.k-item'), contentElements = that.wrapper.children('div'), _elementId = that._elementId.bind(that);\n                if (contentElements.length && items.length > contentElements.length) {\n                    contentElements.each(function (idx) {\n                        var id = _elementId($(this), idx);\n                        var item = items.filter('[aria-controls=' + (this.id || 0) + ']')[0];\n                        if (!item && isInitialUpdate) {\n                            item = items[idx];\n                        }\n                        if (item) {\n                            item.setAttribute('aria-controls', id);\n                        }\n                        this.setAttribute('id', id);\n                    });\n                } else {\n                    items.each(function (idx) {\n                        var currentContent = contentElements.eq(idx);\n                        var id = _elementId(currentContent, idx);\n                        this.setAttribute('aria-controls', id);\n                        if (!currentContent.length && contentUrls[idx]) {\n                            $('<div class=\\'' + CONTENT + '\\'/>').appendTo(that.wrapper).attr('id', id);\n                        } else {\n                            currentContent.attr('id', id);\n                            if (!$(this).children('.k-loading')[0] && !contentUrls[idx]) {\n                                $('<span class=\\'k-loading k-complete\\'/>').prependTo(this);\n                            }\n                        }\n                        currentContent.attr('role', 'tabpanel');\n                        currentContent.filter(':not(.' + ACTIVESTATE + ')').attr('aria-hidden', true).attr('aria-expanded', false);\n                        currentContent.filter('.' + ACTIVESTATE).attr('aria-expanded', true);\n                    });\n                }\n                that.contentElements = that.contentAnimators = that.wrapper.children('div');\n                that.tabsHeight = outerHeight(that.tabGroup) + parseInt(that.wrapper.css('border-top-width'), 10) + parseInt(that.wrapper.css('border-bottom-width'), 10);\n                if (kendo.kineticScrollNeeded && kendo.mobile.ui.Scroller) {\n                    kendo.touchScroller(that.contentElements);\n                    that.contentElements = that.contentElements.children('.km-scroll-container');\n                }\n            },\n            _wrapper: function () {\n                var that = this;\n                if (that.element.is('ul')) {\n                    that.wrapper = that.element.wrapAll('<div />').parent();\n                } else {\n                    that.wrapper = that.element;\n                }\n                that.scrollWrap = that.wrapper.parent('.k-tabstrip-wrapper');\n                if (!that.scrollWrap[0]) {\n                    that.scrollWrap = that.wrapper.wrapAll('<div class=\\'k-tabstrip-wrapper\\' />').parent();\n                }\n            },\n            _tabPosition: function () {\n                var that = this, tabPosition = that.options.tabPosition;\n                that.wrapper.addClass('k-floatwrap k-tabstrip-' + tabPosition);\n                if (tabPosition == 'bottom') {\n                    that.tabGroup.appendTo(that.wrapper);\n                }\n                that.resize(true);\n            },\n            _setContentElementsDimensions: function () {\n                var that = this, tabPosition = that.options.tabPosition;\n                if (tabPosition == 'left' || tabPosition == 'right') {\n                    var contentDivs = that.wrapper.children('.k-content'), activeDiv = contentDivs.filter(':visible'), marginStyleProperty = 'margin-' + tabPosition, tabGroup = that.tabGroup, margin = outerWidth(tabGroup);\n                    var minHeight = Math.ceil(tabGroup.height()) - parseInt(activeDiv.css('padding-top'), 10) - parseInt(activeDiv.css('padding-bottom'), 10) - parseInt(activeDiv.css('border-top-width'), 10) - parseInt(activeDiv.css('border-bottom-width'), 10);\n                    setTimeout(function () {\n                        contentDivs.css(marginStyleProperty, margin).css('min-height', minHeight);\n                    });\n                }\n            },\n            _resize: function () {\n                this._setContentElementsDimensions();\n                this._scrollable();\n            },\n            _sizeScrollWrap: function (element) {\n                if (element.is(':visible')) {\n                    var tabPosition = this.options.tabPosition;\n                    var h = Math.floor(outerHeight(element, true)) + (tabPosition === 'left' || tabPosition === 'right' ? 2 : this.tabsHeight);\n                    this.scrollWrap.css('height', h).css('height');\n                }\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVERSTATE, e.type == MOUSEENTER);\n            },\n            _click: function (item) {\n                var that = this, link = item.find('.' + LINK), href = link.attr(HREF), collapse = that.options.collapsible, index = item.index(), contentHolder = that.contentHolder(index), prevent, isAnchor, neighbours = item.parent().children(), oldFocusedTab = neighbours.filter('.' + FOCUSEDSTATE);\n                if (item.closest('.k-widget')[0] != that.wrapper[0]) {\n                    return;\n                }\n                if (item.is('.' + DISABLEDSTATE + (!collapse ? ',.' + ACTIVESTATE : ''))) {\n                    oldFocusedTab.removeClass(FOCUSEDSTATE);\n                    that._focused = item;\n                    item.addClass(FOCUSEDSTATE);\n                    that._current(item);\n                    if (that._scrollableModeActive) {\n                        that._scrollTabsToItem(item);\n                    }\n                    return true;\n                }\n                isAnchor = link.data(CONTENTURL) || that._contentUrls[index] || href && (href.charAt(href.length - 1) == '#' || href.indexOf('#' + that.element[0].id + '-') != -1);\n                prevent = !href || isAnchor;\n                if (that.tabGroup.children('[data-animating]').length) {\n                    return prevent;\n                }\n                if (that.trigger(SELECT, {\n                        item: item[0],\n                        contentElement: contentHolder[0]\n                    })) {\n                    return true;\n                }\n                if (prevent === false) {\n                    return;\n                }\n                if (collapse && item.is('.' + ACTIVESTATE)) {\n                    that.deactivateTab(item);\n                    return true;\n                }\n                if (that.activateTab(item)) {\n                    prevent = true;\n                }\n                return prevent;\n            },\n            _scrollable: function () {\n                var that = this, options = that.options, wrapperOffsetWidth, tabGroupScrollWidth, scrollPrevButton, scrollNextButton;\n                if (that._scrollableAllowed()) {\n                    that.wrapper.addClass('k-tabstrip-scrollable');\n                    wrapperOffsetWidth = that.wrapper[0].offsetWidth;\n                    tabGroupScrollWidth = that.tabGroup[0].scrollWidth;\n                    if (tabGroupScrollWidth > wrapperOffsetWidth && !that._scrollableModeActive) {\n                        that._nowScrollingTabs = false;\n                        that._isRtl = kendo.support.isRtl(that.element);\n                        var mouseDown = kendo.support.mobileOS ? 'touchstart' : 'mousedown';\n                        var mouseUp = kendo.support.mobileOS ? 'touchend' : 'mouseup';\n                        var browser = kendo.support.browser;\n                        var isRtlScrollDirection = that._isRtl && !browser.msie && !browser.edge;\n                        that.wrapper.append(scrollButtonHtml('prev', 'k-i-arrow-60-left') + scrollButtonHtml('next', 'k-i-arrow-60-right'));\n                        scrollPrevButton = that._scrollPrevButton = that.wrapper.children('.k-tabstrip-prev');\n                        scrollNextButton = that._scrollNextButton = that.wrapper.children('.k-tabstrip-next');\n                        that.tabGroup.css({\n                            marginLeft: outerWidth(scrollPrevButton) + 9,\n                            marginRight: outerWidth(scrollNextButton) + 12\n                        });\n                        scrollPrevButton.on(mouseDown + NS, function () {\n                            that._nowScrollingTabs = true;\n                            that._scrollTabsByDelta(options.scrollable.distance * (isRtlScrollDirection ? 1 : -1));\n                        });\n                        scrollNextButton.on(mouseDown + NS, function () {\n                            that._nowScrollingTabs = true;\n                            that._scrollTabsByDelta(options.scrollable.distance * (isRtlScrollDirection ? -1 : 1));\n                        });\n                        scrollPrevButton.add(scrollNextButton).on(mouseUp + NS, function () {\n                            that._nowScrollingTabs = false;\n                        });\n                        that._scrollableModeActive = true;\n                        that._toggleScrollButtons();\n                    } else if (that._scrollableModeActive && tabGroupScrollWidth <= wrapperOffsetWidth) {\n                        that._scrollableModeActive = false;\n                        that.wrapper.removeClass('k-tabstrip-scrollable');\n                        that._scrollPrevButton.off().remove();\n                        that._scrollNextButton.off().remove();\n                        that.tabGroup.css({\n                            marginLeft: '',\n                            marginRight: ''\n                        });\n                    } else if (!that._scrollableModeActive) {\n                        that.wrapper.removeClass('k-tabstrip-scrollable');\n                    } else {\n                        that._toggleScrollButtons();\n                    }\n                }\n            },\n            _scrollableAllowed: function () {\n                var options = this.options;\n                if (options.scrollable && !options.scrollable.distance) {\n                    options.scrollable = { distance: DEFAULTDISTANCE };\n                }\n                return options.scrollable && !isNaN(options.scrollable.distance) && (options.tabPosition == 'top' || options.tabPosition == 'bottom');\n            },\n            _scrollTabsToItem: function (item) {\n                var that = this, tabGroup = that.tabGroup, currentScrollOffset = tabGroup.scrollLeft(), itemWidth = outerWidth(item), itemOffset = that._isRtl ? item.position().left : item.position().left - tabGroup.children().first().position().left, tabGroupWidth = tabGroup[0].offsetWidth, tabGroupPadding = Math.ceil(parseFloat(tabGroup.css('padding-left'))), itemPosition;\n                if (that._isRtl) {\n                    if (itemOffset < 0) {\n                        itemPosition = currentScrollOffset + itemOffset - (tabGroupWidth - currentScrollOffset) - tabGroupPadding;\n                    } else if (itemOffset + itemWidth > tabGroupWidth) {\n                        itemPosition = currentScrollOffset + itemOffset - itemWidth + tabGroupPadding * 2;\n                    }\n                } else {\n                    if (currentScrollOffset + tabGroupWidth < itemOffset + itemWidth) {\n                        itemPosition = itemOffset + itemWidth - tabGroupWidth + tabGroupPadding * 2;\n                    } else if (currentScrollOffset > itemOffset) {\n                        itemPosition = itemOffset - tabGroupPadding;\n                    }\n                }\n                tabGroup.finish().animate({ 'scrollLeft': itemPosition }, 'fast', 'linear', function () {\n                    that._toggleScrollButtons();\n                });\n            },\n            _scrollTabsByDelta: function (delta) {\n                var that = this;\n                var tabGroup = that.tabGroup;\n                var scrLeft = tabGroup.scrollLeft();\n                tabGroup.finish().animate({ 'scrollLeft': scrLeft + delta }, 'fast', 'linear', function () {\n                    if (that._nowScrollingTabs && !jQuery.fx.off) {\n                        that._scrollTabsByDelta(delta);\n                    } else {\n                        that._toggleScrollButtons();\n                    }\n                });\n            },\n            _toggleScrollButtons: function () {\n                var that = this, ul = that.tabGroup, scrollLeft = kendo.scrollLeft(ul);\n                that._scrollPrevButton.toggle(scrollLeft !== 0);\n                that._scrollNextButton.toggle(scrollLeft < ul[0].scrollWidth - ul[0].offsetWidth - 1);\n            },\n            deactivateTab: function (item) {\n                var that = this, animationSettings = that.options.animation, animation = animationSettings.open, close = extend({}, animationSettings.close), hasCloseAnimation = close && 'effects' in close;\n                item = that.tabGroup.find(item);\n                close = extend(hasCloseAnimation ? close : extend({ reverse: true }, animation), { hide: true });\n                if (kendo.size(animation.effects)) {\n                    item.kendoAddClass(DEFAULTSTATE, { duration: animation.duration });\n                    item.kendoRemoveClass(ACTIVESTATE, { duration: animation.duration });\n                } else {\n                    item.addClass(DEFAULTSTATE);\n                    item.removeClass(ACTIVESTATE);\n                }\n                item.removeAttr('aria-selected');\n                that.contentAnimators.filter('.' + ACTIVESTATE).kendoStop(true, true).kendoAnimate(close).removeClass(ACTIVESTATE).attr('aria-hidden', true);\n            },\n            activateTab: function (item) {\n                if (this.tabGroup.children('[data-animating]').length) {\n                    return;\n                }\n                item = this.tabGroup.find(item);\n                var that = this, animationSettings = that.options.animation, animation = animationSettings.open, close = extend({}, animationSettings.close), hasCloseAnimation = close && 'effects' in close, neighbours = item.parent().children(), oldTab = neighbours.filter('.' + ACTIVESTATE), itemIndex = neighbours.index(item), isAnimationEnabled = animation && 'duration' in animation && 'effects' in animation;\n                close = extend(hasCloseAnimation ? close : extend({ reverse: true }, animation), { hide: true });\n                if (kendo.size(animation.effects)) {\n                    oldTab.kendoRemoveClass(ACTIVESTATE, { duration: close.duration });\n                    item.kendoRemoveClass(HOVERSTATE, { duration: close.duration });\n                } else {\n                    oldTab.removeClass(ACTIVESTATE);\n                    item.removeClass(HOVERSTATE);\n                }\n                var contentAnimators = that.contentAnimators;\n                if (that.inRequest) {\n                    that.xhr.abort();\n                    that.inRequest = false;\n                }\n                if (contentAnimators.length === 0) {\n                    that.tabGroup.find('.' + TABONTOP).removeClass(TABONTOP);\n                    item.addClass(TABONTOP).css('z-index');\n                    item.addClass(ACTIVESTATE);\n                    that._current(item);\n                    that.trigger('change');\n                    if (that._scrollableModeActive) {\n                        that._scrollTabsToItem(item);\n                    }\n                    return false;\n                }\n                var visibleContents = contentAnimators.filter('.' + ACTIVESTATE), contentHolder = that.contentHolder(itemIndex), contentElement = contentHolder.closest('.k-content');\n                that.tabsHeight = outerHeight(that.tabGroup) + parseInt(that.wrapper.css('border-top-width'), 10) + parseInt(that.wrapper.css('border-bottom-width'), 10);\n                that._sizeScrollWrap(visibleContents);\n                if (contentHolder.length === 0) {\n                    visibleContents.removeClass(ACTIVESTATE).attr('aria-hidden', true).kendoStop(true, true).kendoAnimate(close);\n                    return false;\n                }\n                item.attr('data-animating', true);\n                var isAjaxContent = (item.children('.' + LINK).data(CONTENTURL) || that._contentUrls[itemIndex] || false) && contentHolder.is(EMPTY), showContentElement = function () {\n                        oldTab.removeAttr('aria-selected');\n                        item.attr('aria-selected', true);\n                        that._current(item);\n                        that._sizeScrollWrap(contentElement);\n                        contentElement.addClass(ACTIVESTATE).removeAttr('aria-hidden').kendoStop(true, true).attr('aria-expanded', true).kendoAnimate(extend({\n                            init: function () {\n                                that.trigger(SHOW, {\n                                    item: item[0],\n                                    contentElement: contentHolder[0]\n                                });\n                                kendo.resize(contentHolder);\n                            }\n                        }, animation, {\n                            complete: function () {\n                                item.removeAttr('data-animating');\n                                that.trigger(ACTIVATE, {\n                                    item: item[0],\n                                    contentElement: contentHolder[0]\n                                });\n                                kendo.resize(contentHolder);\n                                that.scrollWrap.css('height', '').css('height');\n                                if (isAnimationEnabled && (kendo.support.browser.msie || kendo.support.browser.edge)) {\n                                    contentHolder.finish().animate({ opacity: 0.9 }, 'fast', 'linear', function () {\n                                        contentHolder.finish().animate({ opacity: 1 }, 'fast', 'linear');\n                                    });\n                                }\n                            }\n                        }));\n                    }, showContent = function () {\n                        if (!isAjaxContent) {\n                            showContentElement();\n                            that.trigger('change');\n                        } else {\n                            item.removeAttr('data-animating');\n                            that.ajaxRequest(item, contentHolder, function () {\n                                item.attr('data-animating', true);\n                                showContentElement();\n                                that.trigger('change');\n                            });\n                        }\n                        if (that._scrollableModeActive) {\n                            that._scrollTabsToItem(item);\n                        }\n                    };\n                visibleContents.removeClass(ACTIVESTATE);\n                that.tabGroup.find('.' + TABONTOP).removeClass(TABONTOP);\n                item.addClass(TABONTOP).css('z-index');\n                if (kendo.size(animation.effects)) {\n                    oldTab.kendoAddClass(DEFAULTSTATE, { duration: animation.duration });\n                    item.kendoAddClass(ACTIVESTATE, { duration: animation.duration });\n                } else {\n                    oldTab.addClass(DEFAULTSTATE);\n                    item.addClass(ACTIVESTATE);\n                }\n                visibleContents.attr('aria-hidden', true);\n                visibleContents.attr('aria-expanded', false);\n                if (visibleContents.length) {\n                    visibleContents.kendoStop(true, true).kendoAnimate(extend({ complete: showContent }, close));\n                } else {\n                    showContent();\n                }\n                return true;\n            },\n            contentElement: function (itemIndex) {\n                if (isNaN(itemIndex - 0)) {\n                    return undefined;\n                }\n                var contentElements = this.contentElements && this.contentElements[0] && !kendo.kineticScrollNeeded ? this.contentElements : this.contentAnimators;\n                var id = $(this.tabGroup.children()[itemIndex]).attr('aria-controls');\n                if (contentElements) {\n                    for (var i = 0, len = contentElements.length; i < len; i++) {\n                        if (contentElements.eq(i).closest('.k-content')[0].id == id) {\n                            return contentElements[i];\n                        }\n                    }\n                }\n                return undefined;\n            },\n            contentHolder: function (itemIndex) {\n                var contentElement = $(this.contentElement(itemIndex)), scrollContainer = contentElement.children('.km-scroll-container');\n                return kendo.support.touch && scrollContainer[0] ? scrollContainer : contentElement;\n            },\n            ajaxRequest: function (element, content, complete, url) {\n                element = this.tabGroup.find(element);\n                var that = this, xhr = $.ajaxSettings.xhr, link = element.find('.' + LINK), data = {}, halfWidth = element.width() / 2, fakeProgress = false, statusIcon = element.find('.k-loading').removeClass('k-complete');\n                if (!statusIcon[0]) {\n                    statusIcon = $('<span class=\\'k-loading\\'/>').prependTo(element);\n                }\n                var endState = halfWidth * 2 - statusIcon.width();\n                var oldProgressAnimation = function () {\n                    statusIcon.animate({ marginLeft: (parseInt(statusIcon.css('marginLeft'), 10) || 0) < halfWidth ? endState : 0 }, 500, oldProgressAnimation);\n                };\n                if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n                    setTimeout(oldProgressAnimation, 40);\n                }\n                url = url || link.data(CONTENTURL) || that._contentUrls[element.index()] || link.attr(HREF);\n                that.inRequest = true;\n                var ajaxOptions = {\n                    type: 'GET',\n                    cache: false,\n                    url: url,\n                    dataType: 'html',\n                    data: data,\n                    xhr: function () {\n                        var current = this, request = xhr(), event = current.progressUpload ? 'progressUpload' : current.progress ? 'progress' : false;\n                        if (request) {\n                            $.each([\n                                request,\n                                request.upload\n                            ], function () {\n                                if (this.addEventListener) {\n                                    this.addEventListener('progress', function (evt) {\n                                        if (event) {\n                                            current[event](evt);\n                                        }\n                                    }, false);\n                                }\n                            });\n                        }\n                        current.noProgress = !(window.XMLHttpRequest && 'upload' in new XMLHttpRequest());\n                        return request;\n                    },\n                    progress: function (evt) {\n                        if (evt.lengthComputable) {\n                            var percent = parseInt(evt.loaded / evt.total * 100, 10) + '%';\n                            statusIcon.stop(true).addClass('k-progress').css({\n                                'width': percent,\n                                'marginLeft': 0\n                            });\n                        }\n                    },\n                    error: function (xhr, status) {\n                        if (that.trigger('error', {\n                                xhr: xhr,\n                                status: status\n                            })) {\n                            this.complete();\n                        }\n                    },\n                    stopProgress: function () {\n                        clearInterval(fakeProgress);\n                        statusIcon.stop(true).addClass('k-progress')[0].style.cssText = '';\n                    },\n                    complete: function (xhr) {\n                        that.inRequest = false;\n                        if (this.noProgress) {\n                            setTimeout(this.stopProgress, 500);\n                        } else {\n                            this.stopProgress();\n                        }\n                        if (xhr.statusText == 'abort') {\n                            statusIcon.remove();\n                        }\n                    },\n                    success: function (data) {\n                        statusIcon.addClass('k-complete');\n                        try {\n                            var current = this, loaded = 10;\n                            if (current.noProgress) {\n                                statusIcon.width(loaded + '%');\n                                fakeProgress = setInterval(function () {\n                                    current.progress({\n                                        lengthComputable: true,\n                                        loaded: Math.min(loaded, 100),\n                                        total: 100\n                                    });\n                                    loaded += 10;\n                                }, 40);\n                            }\n                            that.angular('cleanup', function () {\n                                return { elements: content.get() };\n                            });\n                            kendo.destroy(content);\n                            content.html(data);\n                        } catch (e) {\n                            var console = window.console;\n                            if (console && console.error) {\n                                console.error(e.name + ': ' + e.message + ' in ' + url);\n                            }\n                            this.error(this.xhr, 'error');\n                        }\n                        if (complete) {\n                            complete.call(that, content);\n                        }\n                        that.angular('compile', function () {\n                            return { elements: content.get() };\n                        });\n                        that.trigger(CONTENTLOAD, {\n                            item: element[0],\n                            contentElement: content[0]\n                        });\n                    }\n                };\n                if (typeof url === 'object') {\n                    ajaxOptions = $.extend(true, {}, ajaxOptions, url);\n                    if (isFunction(ajaxOptions.url)) {\n                        ajaxOptions.url = ajaxOptions.url();\n                    }\n                }\n                that.xhr = $.ajax(ajaxOptions);\n            }\n        });\n        extend(TabStrip, {\n            renderItem: function (options) {\n                options = extend({\n                    tabStrip: {},\n                    group: {}\n                }, options);\n                var empty = templates.empty, item = options.item;\n                return templates.item(extend(options, {\n                    image: item.imageUrl ? templates.image : empty,\n                    sprite: item.spriteCssClass ? templates.sprite : empty,\n                    itemWrapper: templates.itemWrapper\n                }, rendering));\n            },\n            renderContent: function (options) {\n                return templates.content(extend(options, rendering));\n            }\n        });\n        kendo.ui.plugin(TabStrip);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.timepicker', [\n        'kendo.popup',\n        'kendo.dateinput'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'timepicker',\n        name: 'TimePicker',\n        category: 'web',\n        description: 'The TimePicker widget allows the end user to select a value from a list of predefined values or to type a new value.',\n        depends: ['popup']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, keys = kendo.keys, parse = kendo.parseDate, activeElement = kendo._activeElement, extractFormat = kendo._extractFormat, support = kendo.support, browser = support.browser, ui = kendo.ui, Widget = ui.Widget, OPEN = 'open', CLOSE = 'close', CHANGE = 'change', ns = '.kendoTimePicker', CLICK = 'click' + ns, DEFAULT = 'k-state-default', DISABLED = 'disabled', READONLY = 'readonly', LI = 'li', SPAN = '<span/>', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, MOUSEDOWN = 'mousedown' + ns, MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000, SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', ARIA_SELECTED = 'aria-selected', ARIA_EXPANDED = 'aria-expanded', ARIA_HIDDEN = 'aria-hidden', ARIA_DISABLED = 'aria-disabled', ARIA_ACTIVEDESCENDANT = 'aria-activedescendant', ID = 'id', isArray = $.isArray, extend = $.extend, proxy = $.proxy, DATE = Date, TODAY = new DATE();\n        TODAY = new DATE(TODAY.getFullYear(), TODAY.getMonth(), TODAY.getDate(), 0, 0, 0);\n        var TimeView = function (options) {\n            var that = this, id = options.id;\n            that.options = options;\n            that._dates = [];\n            that.ul = $('<ul tabindex=\"-1\" role=\"listbox\" aria-hidden=\"true\" unselectable=\"on\" class=\"k-list k-reset\"/>').css({ overflow: support.kineticScrollNeeded ? '' : 'auto' }).on(CLICK, LI, proxy(that._click, that)).on('mouseenter' + ns, LI, function () {\n                $(this).addClass(HOVER);\n            }).on('mouseleave' + ns, LI, function () {\n                $(this).removeClass(HOVER);\n            });\n            that.list = $('<div class=\\'k-list-container k-list-scroller\\' unselectable=\\'on\\'/>').append(that.ul).on(MOUSEDOWN, preventDefault);\n            if (id) {\n                that._timeViewID = id + '_timeview';\n                that._optionID = id + '_option_selected';\n                that.ul.attr(ID, that._timeViewID);\n            }\n            that._popup();\n            that._heightHandler = proxy(that._height, that);\n            that.template = kendo.template('<li tabindex=\"-1\" role=\"option\" class=\"k-item\" unselectable=\"on\">#=data#</li>', { useWithBlock: false });\n        };\n        TimeView.prototype = {\n            current: function (candidate) {\n                var that = this, active = that.options.active;\n                if (candidate !== undefined) {\n                    if (that._current) {\n                        that._current.removeClass(SELECTED);\n                        if (that._current && that._current.length) {\n                            that._current[0].removeAttribute(ID);\n                            that._current[0].removeAttribute(ARIA_SELECTED);\n                        }\n                    }\n                    if (candidate) {\n                        candidate = $(candidate).addClass(SELECTED).attr(ID, that._optionID).attr(ARIA_SELECTED, true);\n                        that.scroll(candidate[0]);\n                    }\n                    that._current = candidate;\n                    if (active) {\n                        active(candidate);\n                    }\n                } else {\n                    return that._current;\n                }\n            },\n            close: function () {\n                this.popup.close();\n            },\n            destroy: function () {\n                var that = this;\n                that.ul.off(ns);\n                that.list.off(ns);\n                that.popup.destroy();\n            },\n            open: function () {\n                var that = this;\n                var popupHovered;\n                if (!that.ul[0].firstChild) {\n                    that.bind();\n                }\n                popupHovered = that.popup._hovered;\n                that.popup._hovered = true;\n                that.popup.open();\n                setTimeout(function () {\n                    that.popup._hovered = popupHovered;\n                }, 1);\n                if (that._current) {\n                    that.scroll(that._current[0]);\n                }\n            },\n            dataBind: function (dates) {\n                var that = this, options = that.options, format = options.format, toString = kendo.toString, template = that.template, length = dates.length, idx = 0, date, html = '';\n                for (; idx < length; idx++) {\n                    date = dates[idx];\n                    if (isInRange(date, options.min, options.max)) {\n                        html += template(toString(date, format, options.culture));\n                    }\n                }\n                that._html(html);\n            },\n            refresh: function () {\n                var that = this, options = that.options, format = options.format, offset = dst(), ignoreDST = offset < 0, value = kendo.parseDate(that._value), parsedValue = value ? mergeDateAndTime(value, options.min) : mergeDateAndTime(new Date(), options.min), min = options.min, max = options.max, msMin = getMilliseconds(min), msMax = getMilliseconds(max), msLastTime = getMilliseconds(lastTimeOption(options.interval)), msInterval = options.interval * MS_PER_MINUTE, toString = kendo.toString, template = that.template, start = options.useValueToRender ? parsedValue : new Date(+options.min), startDate = new DATE(start), msStart, length, html = '';\n                if (ignoreDST) {\n                    length = (MS_PER_DAY + offset * MS_PER_MINUTE) / msInterval;\n                } else {\n                    length = MS_PER_DAY / msInterval;\n                }\n                if (msMin != msMax || msLastTime === msMax) {\n                    if (msMin > msMax) {\n                        msMax += MS_PER_DAY;\n                    }\n                    length = (msMax - msMin) / msInterval + 1;\n                }\n                while (true) {\n                    if (msMax && (getMilliseconds(start) >= msMax || startDate.getDate() != start.getDate())) {\n                        msStart = getMilliseconds(start);\n                        if (startDate < start) {\n                            msStart += MS_PER_DAY;\n                        }\n                        if (msStart > msMax) {\n                            start = new DATE(+max);\n                        }\n                        if (getMilliseconds(start) > 0) {\n                            html += template(toString(start, format, options.culture));\n                        }\n                        break;\n                    }\n                    if (startDate.getDate() != start.getDate()) {\n                        break;\n                    }\n                    html += template(toString(start, format, options.culture));\n                    start.setTime(start.getTime() + msInterval);\n                }\n                that._html(html);\n            },\n            bind: function () {\n                var that = this, dates = that.options.dates;\n                if (dates && dates[0]) {\n                    that.dataBind(dates);\n                } else {\n                    that.refresh();\n                }\n            },\n            _html: function (html) {\n                var that = this;\n                that.ul[0].innerHTML = html;\n                that.popup.unbind(OPEN, that._heightHandler);\n                that.popup.one(OPEN, that._heightHandler);\n                that.current(null);\n                that.select(that._value);\n            },\n            scroll: function (item) {\n                if (!item) {\n                    return;\n                }\n                var content = this.list[0], itemOffsetTop = item.offsetTop, itemOffsetHeight = item.offsetHeight, contentScrollTop = content.scrollTop, contentOffsetHeight = content.clientHeight, bottomDistance = itemOffsetTop + itemOffsetHeight;\n                if (contentScrollTop > itemOffsetTop) {\n                    contentScrollTop = itemOffsetTop;\n                } else if (bottomDistance > contentScrollTop + contentOffsetHeight) {\n                    contentScrollTop = bottomDistance - contentOffsetHeight;\n                }\n                content.scrollTop = contentScrollTop;\n            },\n            select: function (li) {\n                var that = this, options = that.options, current = that._current, selection;\n                if (li instanceof Date) {\n                    li = kendo.toString(li, options.format, options.culture);\n                }\n                if (typeof li === 'string') {\n                    if (!current || current.text() !== li) {\n                        li = $.grep(that.ul[0].childNodes, function (node) {\n                            return (node.textContent || node.innerText) == li;\n                        });\n                        li = li[0] ? li : null;\n                    } else {\n                        li = current;\n                    }\n                }\n                selection = that._distinctSelection(li);\n                that.current(selection);\n            },\n            _distinctSelection: function (selection) {\n                var that = this, currentValue, selectionIndex;\n                if (selection && selection.length > 1) {\n                    currentValue = getMilliseconds(that._value);\n                    selectionIndex = $.inArray(currentValue, that._dates);\n                    selection = that.ul.children()[selectionIndex];\n                }\n                return selection;\n            },\n            setOptions: function (options) {\n                var old = this.options;\n                options.min = parse(options.min);\n                options.max = parse(options.max);\n                this.options = extend(old, options, {\n                    active: old.active,\n                    change: old.change,\n                    close: old.close,\n                    open: old.open\n                });\n                this.bind();\n            },\n            toggle: function () {\n                var that = this;\n                if (that.popup.visible()) {\n                    that.close();\n                } else {\n                    that.open();\n                }\n            },\n            value: function (value) {\n                var that = this;\n                that._value = value;\n                if (that.ul[0].firstChild) {\n                    that.select(value);\n                }\n            },\n            _click: function (e) {\n                var that = this, li = $(e.currentTarget), date = li.text(), dates = that.options.dates;\n                if (dates && dates.length > 0) {\n                    date = dates[li.index()];\n                }\n                if (!e.isDefaultPrevented()) {\n                    that.select(li);\n                    that.options.change(date, true);\n                    that.close();\n                }\n            },\n            _height: function () {\n                var that = this;\n                var list = that.list;\n                var parent = list.parent('.k-animation-container');\n                var height = that.options.height;\n                if (that.ul[0].children.length) {\n                    list.add(parent).show().height(that.ul[0].scrollHeight > height ? height : 'auto').hide();\n                }\n            },\n            _parse: function (value) {\n                var that = this, options = that.options, min = getMilliseconds(options.min) != getMilliseconds(TODAY) ? options.min : null, max = getMilliseconds(options.max) != getMilliseconds(TODAY) ? options.max : null, current = that._value || min || max || TODAY;\n                if (value instanceof DATE) {\n                    return value;\n                }\n                value = parse(value, options.parseFormats, options.culture);\n                if (value) {\n                    value = new DATE(current.getFullYear(), current.getMonth(), current.getDate(), value.getHours(), value.getMinutes(), value.getSeconds(), value.getMilliseconds());\n                }\n                return value;\n            },\n            _adjustListWidth: function () {\n                var list = this.list, width = list[0].style.width, wrapper = this.options.anchor, computedStyle, computedWidth, outerWidth = kendo._outerWidth;\n                if (!list.data('width') && width) {\n                    return;\n                }\n                computedStyle = window.getComputedStyle ? window.getComputedStyle(wrapper[0], null) : 0;\n                computedWidth = computedStyle ? parseFloat(computedStyle.width) : outerWidth(wrapper);\n                if (computedStyle && (browser.mozilla || browser.msie)) {\n                    computedWidth += parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight) + parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth);\n                }\n                width = computedWidth - (outerWidth(list) - list.width());\n                list.css({\n                    fontFamily: wrapper.css('font-family'),\n                    width: width\n                }).data('width', width);\n            },\n            _popup: function () {\n                var that = this, list = that.list, options = that.options, anchor = options.anchor;\n                that.popup = new ui.Popup(list, extend(options.popup, {\n                    anchor: anchor,\n                    open: options.open,\n                    close: options.close,\n                    animation: options.animation,\n                    isRtl: support.isRtl(options.anchor)\n                }));\n            },\n            move: function (e) {\n                var that = this, key = e.keyCode, ul = that.ul[0], current = that._current, down = key === keys.DOWN;\n                if (key === keys.UP || down) {\n                    if (e.altKey) {\n                        that.toggle(down);\n                        return;\n                    } else if (down) {\n                        current = current ? current[0].nextSibling : ul.firstChild;\n                    } else {\n                        current = current ? current[0].previousSibling : ul.lastChild;\n                    }\n                    if (current) {\n                        that.select(current);\n                    }\n                    that.options.change(that._current.text());\n                    e.preventDefault();\n                } else if (key === keys.ENTER || key === keys.TAB || key === keys.ESC) {\n                    e.preventDefault();\n                    if (current) {\n                        that.options.change(current.text(), true);\n                    }\n                    that.close();\n                }\n            }\n        };\n        function dst() {\n            var today = new DATE(), midnight = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0), noon = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 12, 0, 0);\n            return -1 * (midnight.getTimezoneOffset() - noon.getTimezoneOffset());\n        }\n        function getMilliseconds(date) {\n            return date.getHours() * 60 * MS_PER_MINUTE + date.getMinutes() * MS_PER_MINUTE + date.getSeconds() * 1000 + date.getMilliseconds();\n        }\n        function lastTimeOption(interval) {\n            var date = new Date(2100, 0, 1);\n            date.setMinutes(-interval);\n            return date;\n        }\n        function isInRange(value, min, max) {\n            var msMin = getMilliseconds(min), msMax = getMilliseconds(max), msValue;\n            if (!value || msMin == msMax) {\n                return true;\n            }\n            msValue = getMilliseconds(value);\n            if (msMin > msValue) {\n                msValue += MS_PER_DAY;\n            }\n            if (msMax < msMin) {\n                msMax += MS_PER_DAY;\n            }\n            return msValue >= msMin && msValue <= msMax;\n        }\n        TimeView.getMilliseconds = getMilliseconds;\n        kendo.TimeView = TimeView;\n        var TimePicker = Widget.extend({\n            init: function (element, options) {\n                var that = this, ul, timeView, disabled;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                options.min = parse(element.attr('min')) || parse(options.min);\n                options.max = parse(element.attr('max')) || parse(options.max);\n                normalize(options);\n                that._initialOptions = extend({}, options);\n                that._wrapper();\n                that.timeView = timeView = new TimeView(extend({}, options, {\n                    id: element.attr(ID),\n                    anchor: that.wrapper,\n                    format: options.format,\n                    change: function (value, trigger) {\n                        if (trigger) {\n                            that._change(value);\n                        } else {\n                            element.val(value);\n                        }\n                    },\n                    open: function (e) {\n                        that.timeView._adjustListWidth();\n                        if (that.trigger(OPEN)) {\n                            e.preventDefault();\n                        } else {\n                            element.attr(ARIA_EXPANDED, true);\n                            ul.attr(ARIA_HIDDEN, false);\n                        }\n                    },\n                    close: function (e) {\n                        if (that.trigger(CLOSE)) {\n                            e.preventDefault();\n                        } else {\n                            element.attr(ARIA_EXPANDED, false);\n                            ul.attr(ARIA_HIDDEN, true);\n                        }\n                    },\n                    active: function (current) {\n                        if (element && element.length) {\n                            element[0].removeAttribute(ARIA_ACTIVEDESCENDANT);\n                        }\n                        if (current) {\n                            element.attr(ARIA_ACTIVEDESCENDANT, timeView._optionID);\n                        }\n                    }\n                }));\n                ul = timeView.ul;\n                that._icon();\n                that._reset();\n                try {\n                    element[0].setAttribute('type', 'text');\n                } catch (e) {\n                    element[0].type = 'text';\n                }\n                element.addClass('k-input').attr({\n                    'role': 'combobox',\n                    'aria-expanded': false,\n                    'aria-owns': timeView._timeViewID,\n                    'autocomplete': 'off'\n                });\n                disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                if (options.dateInput) {\n                    var min = options.min;\n                    var max = options.max;\n                    var today = new DATE();\n                    if (getMilliseconds(min) == getMilliseconds(max)) {\n                        min = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0);\n                        max = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 24, 0, 0);\n                    }\n                    that._dateInput = new ui.DateInput(element, {\n                        culture: options.culture,\n                        format: options.format,\n                        min: min,\n                        max: max,\n                        value: options.value,\n                        interval: options.interval\n                    });\n                }\n                that._old = that._update(options.value || that.element.val());\n                that._oldText = element.val();\n                kendo.notify(that);\n            },\n            options: {\n                name: 'TimePicker',\n                min: TODAY,\n                max: TODAY,\n                format: '',\n                dates: [],\n                parseFormats: [],\n                value: null,\n                interval: 30,\n                height: 200,\n                animation: {},\n                dateInput: false\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                CHANGE\n            ],\n            setOptions: function (options) {\n                var that = this;\n                var value = that._value;\n                Widget.fn.setOptions.call(that, options);\n                options = that.options;\n                normalize(options);\n                that.timeView.setOptions(options);\n                if (value) {\n                    that.element.val(kendo.toString(value, options.format, options.culture));\n                }\n            },\n            dataBind: function (dates) {\n                if (isArray(dates)) {\n                    this.timeView.dataBind(dates);\n                }\n            },\n            _editable: function (options) {\n                var that = this, disable = options.disable, readonly = options.readonly, arrow = that._arrow.off(ns), element = that.element.off(ns), wrapper = that._inputWrapper.off(ns);\n                if (that._dateInput) {\n                    that._dateInput._unbindInput();\n                }\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    if (element && element.length) {\n                        element[0].removeAttribute(DISABLED);\n                        element[0].removeAttribute(READONLY);\n                    }\n                    element.attr(ARIA_DISABLED, false).on('keydown' + ns, proxy(that._keydown, that)).on('focusout' + ns, proxy(that._blur, that)).on('focus' + ns, function () {\n                        that._inputWrapper.addClass(FOCUSED);\n                    });\n                    if (that._dateInput) {\n                        that._dateInput._bindInput();\n                    }\n                    arrow.on(CLICK, proxy(that._click, that)).on(MOUSEDOWN, preventDefault);\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    element.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.timeView.destroy();\n                that.element.off(ns);\n                that._arrow.off(ns);\n                that._inputWrapper.off(ns);\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n            },\n            close: function () {\n                this.timeView.close();\n            },\n            open: function () {\n                this.timeView.open();\n            },\n            min: function (value) {\n                return this._option('min', value);\n            },\n            max: function (value) {\n                return this._option('max', value);\n            },\n            value: function (value) {\n                var that = this;\n                if (value === undefined) {\n                    return that._value;\n                }\n                that._old = that._update(value);\n                if (that._old === null) {\n                    that.element.val('');\n                }\n                that._oldText = that.element.val();\n            },\n            _blur: function () {\n                var that = this, value = that.element.val();\n                that.close();\n                if (value !== that._oldText) {\n                    that._change(value);\n                }\n                that._inputWrapper.removeClass(FOCUSED);\n            },\n            _click: function () {\n                var that = this, element = that.element;\n                that.timeView.toggle();\n                if (!support.touch && element[0] !== activeElement()) {\n                    element.trigger('focus');\n                }\n            },\n            _change: function (value) {\n                var that = this, oldValue = that.element.val(), dateChanged;\n                value = that._update(value);\n                dateChanged = !kendo.calendar.isEqualDate(that._old, value);\n                var valueUpdated = dateChanged && !that._typing;\n                var textFormatted = oldValue !== that.element.val();\n                if (valueUpdated || textFormatted) {\n                    that.element.trigger(CHANGE);\n                }\n                if (dateChanged) {\n                    that._old = value;\n                    that._oldText = that.element.val();\n                    that.trigger(CHANGE);\n                }\n                that._typing = false;\n            },\n            _icon: function () {\n                var that = this, element = that.element, arrow;\n                arrow = element.next('span.k-select');\n                if (!arrow[0]) {\n                    arrow = $('<span unselectable=\"on\" class=\"k-select\" aria-label=\"select\"><span class=\"k-icon k-i-clock\"></span></span>').insertAfter(element);\n                }\n                that._arrow = arrow.attr({\n                    'role': 'button',\n                    'aria-controls': that.timeView._timeViewID\n                });\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, timeView = that.timeView, value = that.element.val();\n                if (timeView.popup.visible() || e.altKey) {\n                    timeView.move(e);\n                    if (that._dateInput && e.stopImmediatePropagation) {\n                        e.stopImmediatePropagation();\n                    }\n                } else if (key === keys.ENTER && value !== that._oldText) {\n                    that._change(value);\n                } else {\n                    that._typing = true;\n                }\n            },\n            _option: function (option, value) {\n                var that = this, options = that.options;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = that.timeView._parse(value);\n                if (!value) {\n                    return;\n                }\n                value = new DATE(+value);\n                options[option] = value;\n                that.timeView.options[option] = value;\n                that.timeView.bind();\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _update: function (value) {\n                var that = this, options = that.options, timeView = that.timeView, date = timeView._parse(value);\n                if (!isInRange(date, options.min, options.max)) {\n                    date = null;\n                }\n                that._value = date;\n                if (that._dateInput && date) {\n                    that._dateInput.value(date || value);\n                } else {\n                    that.element.val(kendo.toString(date || value, options.format, options.culture));\n                }\n                timeView.value(date);\n                return date;\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper;\n                wrapper = element.parents('.k-timepicker');\n                if (!wrapper[0]) {\n                    wrapper = element.wrap(SPAN).parent().addClass('k-picker-wrap k-state-default');\n                    wrapper = wrapper.wrap(SPAN).parent();\n                }\n                wrapper[0].style.cssText = element[0].style.cssText;\n                that.wrapper = wrapper.addClass('k-widget k-timepicker').addClass(element[0].className);\n                element.css({\n                    width: '100%',\n                    height: element[0].style.height\n                });\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        that.value(element[0].defaultValue);\n                        that.max(that._initialOptions.max);\n                        that.min(that._initialOptions.min);\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            }\n        });\n        function normalize(options) {\n            var parseFormats = options.parseFormats;\n            options.format = extractFormat(options.format || kendo.getCulture(options.culture).calendars.standard.patterns.t);\n            parseFormats = isArray(parseFormats) ? parseFormats : [parseFormats];\n            parseFormats.splice(0, 0, options.format);\n            options.parseFormats = parseFormats;\n        }\n        function preventDefault(e) {\n            e.preventDefault();\n        }\n        function mergeDateAndTime(date, time) {\n            return new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());\n        }\n        ui.plugin(TimePicker);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.datetimepicker', [\n        'kendo.datepicker',\n        'kendo.timepicker'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'datetimepicker',\n        name: 'DateTimePicker',\n        category: 'web',\n        description: 'The DateTimePicker allows the end user to select a value from a calendar or a time drop-down list.',\n        depends: [\n            'datepicker',\n            'timepicker'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, TimeView = kendo.TimeView, parse = kendo.parseDate, support = kendo.support, activeElement = kendo._activeElement, extractFormat = kendo._extractFormat, calendar = kendo.calendar, isInRange = calendar.isInRange, restrictValue = calendar.restrictValue, isEqualDatePart = calendar.isEqualDatePart, getMilliseconds = TimeView.getMilliseconds, ui = kendo.ui, Widget = ui.Widget, OPEN = 'open', CLOSE = 'close', CHANGE = 'change', ns = '.kendoDateTimePicker', CLICK = 'click' + ns, UP = support.mouseAndTouchPresent ? kendo.applyEventMap('up', ns.slice(1)) : CLICK, DISABLED = 'disabled', READONLY = 'readonly', DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', STATEDISABLED = 'k-state-disabled', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, MOUSEDOWN = 'mousedown' + ns, MONTH = 'month', SPAN = '<span/>', ARIA_ACTIVEDESCENDANT = 'aria-activedescendant', ARIA_EXPANDED = 'aria-expanded', ARIA_HIDDEN = 'aria-hidden', ARIA_OWNS = 'aria-owns', ARIA_DISABLED = 'aria-disabled', DATE = Date, MIN = new DATE(1800, 0, 1), MAX = new DATE(2099, 11, 31), dateViewParams = { view: 'date' }, timeViewParams = { view: 'time' }, extend = $.extend;\n        var DateTimePicker = Widget.extend({\n            init: function (element, options) {\n                var that = this, disabled;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                options.disableDates = kendo.calendar.disabled(options.disableDates);\n                options.min = parse(element.attr('min')) || parse(options.min);\n                options.max = parse(element.attr('max')) || parse(options.max);\n                normalize(options);\n                that._initialOptions = extend({}, options);\n                that._wrapper();\n                that._views();\n                that._icons();\n                that._reset();\n                that._template();\n                try {\n                    element[0].setAttribute('type', 'text');\n                } catch (e) {\n                    element[0].type = 'text';\n                }\n                element.addClass('k-input').attr({\n                    'role': 'combobox',\n                    'aria-expanded': false,\n                    'autocomplete': 'off'\n                });\n                that._midnight = that._calculateMidnight(options.min, options.max);\n                disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                that._createDateInput(options);\n                that._old = that._update(options.value || that.element.val());\n                that._oldText = element.val();\n                kendo.notify(that);\n            },\n            options: {\n                name: 'DateTimePicker',\n                value: null,\n                format: '',\n                timeFormat: '',\n                culture: '',\n                parseFormats: [],\n                dates: [],\n                disableDates: null,\n                min: new DATE(MIN),\n                max: new DATE(MAX),\n                interval: 30,\n                height: 200,\n                footer: '',\n                start: MONTH,\n                depth: MONTH,\n                animation: {},\n                month: {},\n                ARIATemplate: 'Current focused date is #=kendo.toString(data.current, \"d\")#',\n                dateButtonText: 'Open the date view',\n                timeButtonText: 'Open the time view',\n                dateInput: false,\n                weekNumber: false\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                CHANGE\n            ],\n            setOptions: function (options) {\n                var that = this, value = that._value, min, max, currentValue;\n                Widget.fn.setOptions.call(that, options);\n                options = that.options;\n                options.min = min = parse(options.min);\n                options.max = max = parse(options.max);\n                normalize(options);\n                that._midnight = that._calculateMidnight(options.min, options.max);\n                currentValue = options.value || that._value || that.dateView._current;\n                if (min && !isEqualDatePart(min, currentValue)) {\n                    min = new DATE(MIN);\n                }\n                if (max && !isEqualDatePart(max, currentValue)) {\n                    max = new DATE(MAX);\n                }\n                that.dateView.setOptions(options);\n                that.timeView.setOptions(extend({}, options, {\n                    format: options.timeFormat,\n                    min: min,\n                    max: max\n                }));\n                that._createDateInput(options);\n                if (!that._dateInput) {\n                    that.element.val(kendo.toString(value, options.format, options.culture));\n                }\n                if (value) {\n                    that._updateARIA(value);\n                }\n            },\n            _editable: function (options) {\n                var that = this, element = that.element.off(ns), dateIcon = that._dateIcon.off(ns), timeIcon = that._timeIcon.off(ns), wrapper = that._inputWrapper.off(ns), readonly = options.readonly, disable = options.disable;\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    if (element && element.length) {\n                        element[0].removeAttribute(DISABLED);\n                        element[0].removeAttribute(READONLY, false);\n                        element[0].removeAttribute(ARIA_DISABLED, false);\n                    }\n                    element.on('keydown' + ns, $.proxy(that._keydown, that)).on('focus' + ns, function () {\n                        that._inputWrapper.addClass(FOCUSED);\n                    }).on('focusout' + ns, function () {\n                        that._inputWrapper.removeClass(FOCUSED);\n                        if (element.val() !== that._oldText) {\n                            that._change(element.val());\n                            if (!element.val()) {\n                                that.dateView.current(kendo.calendar.getToday());\n                            }\n                        }\n                        that.close('date');\n                        that.close('time');\n                    });\n                    dateIcon.on(MOUSEDOWN, preventDefault).on(UP, function (e) {\n                        that.toggle('date');\n                        that._focusElement(e.type);\n                    });\n                    timeIcon.on(MOUSEDOWN, preventDefault).on(UP, function (e) {\n                        that.toggle('time');\n                        that._focusElement(e.type);\n                    });\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    element.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n            },\n            _focusElement: function (eventType) {\n                var element = this.element;\n                if ((!support.touch || support.mouseAndTouchPresent && !(eventType || '').match(/touch/i)) && element[0] !== activeElement()) {\n                    element.trigger('focus');\n                }\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.dateView.destroy();\n                that.timeView.destroy();\n                that.element.off(ns);\n                that._dateIcon.off(ns);\n                that._timeIcon.off(ns);\n                that._inputWrapper.off(ns);\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n            },\n            close: function (view) {\n                if (view !== 'time') {\n                    view = 'date';\n                }\n                this[view + 'View'].close();\n            },\n            open: function (view) {\n                if (view !== 'time') {\n                    view = 'date';\n                }\n                this[view + 'View'].open();\n            },\n            min: function (value) {\n                return this._option('min', value);\n            },\n            max: function (value) {\n                return this._option('max', value);\n            },\n            toggle: function (view) {\n                var secondView = 'timeView';\n                if (view !== 'time') {\n                    view = 'date';\n                } else {\n                    secondView = 'dateView';\n                }\n                this[view + 'View'].toggle();\n                this[secondView].close();\n            },\n            value: function (value) {\n                var that = this;\n                if (value === undefined) {\n                    return that._value;\n                }\n                that._old = that._update(value);\n                if (that._old === null) {\n                    that.element.val('');\n                }\n                that._oldText = that.element.val();\n            },\n            _change: function (value) {\n                var that = this, oldValue = that.element.val(), dateChanged;\n                value = that._update(value);\n                dateChanged = +that._old != +value;\n                var valueUpdated = dateChanged && !that._typing;\n                var textFormatted = oldValue !== that.element.val();\n                if (valueUpdated || textFormatted) {\n                    that.element.trigger(CHANGE);\n                }\n                if (dateChanged) {\n                    that._old = value;\n                    that._oldText = that.element.val();\n                    that.trigger(CHANGE);\n                }\n                that._typing = false;\n            },\n            _option: function (option, value) {\n                var that = this;\n                var options = that.options;\n                var timeView = that.timeView;\n                var timeViewOptions = timeView.options;\n                var current = that._value || that._old;\n                var minDateEqual;\n                var maxDateEqual;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = parse(value, options.parseFormats, options.culture);\n                if (!value) {\n                    return;\n                }\n                if (options.min.getTime() === options.max.getTime()) {\n                    timeViewOptions.dates = [];\n                }\n                options[option] = new DATE(value.getTime());\n                that.dateView[option](value);\n                that._midnight = that._calculateMidnight(options.min, options.max);\n                if (current) {\n                    minDateEqual = isEqualDatePart(options.min, current);\n                    maxDateEqual = isEqualDatePart(options.max, current);\n                }\n                if (minDateEqual || maxDateEqual) {\n                    timeViewOptions[option] = value;\n                    if (minDateEqual && !maxDateEqual) {\n                        timeViewOptions.max = lastTimeOption(options.interval);\n                    }\n                    if (maxDateEqual) {\n                        if (that._midnight) {\n                            timeView.dataBind([MAX]);\n                            return;\n                        } else if (!minDateEqual) {\n                            timeViewOptions.min = MIN;\n                        }\n                    }\n                } else {\n                    timeViewOptions.max = MAX;\n                    timeViewOptions.min = MIN;\n                }\n                timeView.bind();\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _update: function (value) {\n                var that = this, options = that.options, min = options.min, max = options.max, dates = options.dates, timeView = that.timeView, current = that._value, date = parse(value, options.parseFormats, options.culture), isSameType = date === null && current === null || date instanceof Date && current instanceof Date, rebind, timeViewOptions, old, skip, formattedValue;\n                if (options.disableDates && options.disableDates(date)) {\n                    date = null;\n                    if (!that._old && !that.element.val()) {\n                        value = null;\n                    }\n                }\n                if (+date === +current && isSameType) {\n                    formattedValue = kendo.toString(date, options.format, options.culture);\n                    if (formattedValue !== value) {\n                        that.element.val(date === null ? value : formattedValue);\n                        if (value instanceof String) {\n                            that.element.trigger(CHANGE);\n                        }\n                    }\n                    return date;\n                }\n                if (date !== null && isEqualDatePart(date, min)) {\n                    date = restrictValue(date, min, max);\n                } else if (!isInRange(date, min, max)) {\n                    date = null;\n                }\n                that._value = date;\n                timeView.value(date);\n                that.dateView.value(date);\n                if (date) {\n                    old = that._old;\n                    timeViewOptions = timeView.options;\n                    if (dates[0]) {\n                        dates = $.grep(dates, function (d) {\n                            return isEqualDatePart(date, d);\n                        });\n                        if (dates[0]) {\n                            timeView.dataBind(dates);\n                            skip = true;\n                        }\n                    }\n                    if (!skip) {\n                        if (isEqualDatePart(date, min)) {\n                            timeViewOptions.min = min;\n                            timeViewOptions.max = lastTimeOption(options.interval);\n                            rebind = true;\n                        }\n                        if (isEqualDatePart(date, max)) {\n                            if (that._midnight) {\n                                timeView.dataBind([MAX]);\n                                skip = true;\n                            } else {\n                                timeViewOptions.max = max;\n                                if (!rebind) {\n                                    timeViewOptions.min = MIN;\n                                }\n                                rebind = true;\n                            }\n                        }\n                    }\n                    if (!skip && (!old && rebind || old && !isEqualDatePart(old, date))) {\n                        if (!rebind) {\n                            timeViewOptions.max = MAX;\n                            timeViewOptions.min = MIN;\n                        }\n                        timeView.bind();\n                    }\n                }\n                if (that._dateInput && date) {\n                    that._dateInput.value(date || value);\n                } else {\n                    that.element.val(kendo.toString(date || value, options.format, options.culture));\n                }\n                that._updateARIA(date);\n                return date;\n            },\n            _keydown: function (e) {\n                var that = this, dateView = that.dateView, timeView = that.timeView, value = that.element.val(), isDateViewVisible = dateView.popup.visible();\n                var stopPropagation = that._dateInput && e.stopImmediatePropagation;\n                if (e.altKey && e.keyCode === kendo.keys.DOWN) {\n                    that.toggle(isDateViewVisible ? 'time' : 'date');\n                } else if (isDateViewVisible) {\n                    dateView.move(e);\n                    that._updateARIA(dateView._current);\n                } else if (timeView.popup.visible()) {\n                    timeView.move(e);\n                } else if (e.keyCode === kendo.keys.ENTER && value !== that._oldText) {\n                    that._change(value);\n                } else {\n                    that._typing = true;\n                    stopPropagation = false;\n                }\n                if (stopPropagation) {\n                    e.stopImmediatePropagation();\n                }\n            },\n            _views: function () {\n                var that = this, element = that.element, options = that.options, id = element.attr('id'), dateView, timeView, div, ul, msMin, date;\n                that.dateView = dateView = new kendo.DateView(extend({}, options, {\n                    id: id,\n                    anchor: that.wrapper,\n                    change: function () {\n                        var value = dateView.calendar.value(), msValue = +value, msMin = +options.min, msMax = +options.max, current, adjustedDate;\n                        if (msValue === msMin || msValue === msMax) {\n                            current = msValue === msMin ? msMin : msMax;\n                            current = new DATE(that._value || current);\n                            current.setFullYear(value.getFullYear(), value.getMonth(), value.getDate());\n                            if (isInRange(current, msMin, msMax)) {\n                                value = current;\n                            }\n                        }\n                        if (that._value) {\n                            adjustedDate = kendo.date.setHours(new Date(value), that._value);\n                            if (isInRange(adjustedDate, msMin, msMax)) {\n                                value = adjustedDate;\n                            }\n                        }\n                        that._change(value);\n                        that.close('date');\n                    },\n                    close: function (e) {\n                        if (that.trigger(CLOSE, dateViewParams)) {\n                            e.preventDefault();\n                        } else {\n                            element.attr(ARIA_EXPANDED, false);\n                            div.attr(ARIA_HIDDEN, true);\n                            if (!timeView.popup.visible()) {\n                                if (element && element.length) {\n                                    element[0].removeAttribute(ARIA_OWNS);\n                                }\n                            }\n                        }\n                    },\n                    open: function (e) {\n                        if (that.trigger(OPEN, dateViewParams)) {\n                            e.preventDefault();\n                        } else {\n                            if (element.val() !== that._oldText) {\n                                date = parse(element.val(), options.parseFormats, options.culture);\n                                that.dateView[date ? 'current' : 'value'](date);\n                            }\n                            div.attr(ARIA_HIDDEN, false);\n                            element.attr(ARIA_EXPANDED, true).attr(ARIA_OWNS, dateView._dateViewID);\n                            that._updateARIA(date);\n                        }\n                    }\n                }));\n                div = dateView.div;\n                msMin = options.min.getTime();\n                that.timeView = timeView = new TimeView({\n                    id: id,\n                    value: options.value,\n                    anchor: that.wrapper,\n                    animation: options.animation,\n                    format: options.timeFormat,\n                    culture: options.culture,\n                    height: options.height,\n                    interval: options.interval,\n                    min: new DATE(MIN),\n                    max: new DATE(MAX),\n                    dates: msMin === options.max.getTime() ? [new Date(msMin)] : [],\n                    parseFormats: options.parseFormats,\n                    change: function (value, trigger) {\n                        value = timeView._parse(value);\n                        if (value < options.min) {\n                            value = new DATE(+options.min);\n                            timeView.options.min = value;\n                        } else if (value > options.max) {\n                            value = new DATE(+options.max);\n                            timeView.options.max = value;\n                        }\n                        if (trigger) {\n                            that._timeSelected = true;\n                            that._change(value);\n                        } else {\n                            element.val(kendo.toString(value, options.format, options.culture));\n                            dateView.value(value);\n                            that._updateARIA(value);\n                        }\n                    },\n                    close: function (e) {\n                        if (that.trigger(CLOSE, timeViewParams)) {\n                            e.preventDefault();\n                        } else {\n                            ul.attr(ARIA_HIDDEN, true);\n                            element.attr(ARIA_EXPANDED, false);\n                            if (!dateView.popup.visible()) {\n                                if (element && element.length) {\n                                    element[0].removeAttribute(ARIA_OWNS);\n                                }\n                            }\n                        }\n                    },\n                    open: function (e) {\n                        timeView._adjustListWidth();\n                        if (that.trigger(OPEN, timeViewParams)) {\n                            e.preventDefault();\n                        } else {\n                            if (element.val() !== that._oldText) {\n                                date = parse(element.val(), options.parseFormats, options.culture);\n                                that.timeView.value(date);\n                            }\n                            ul.attr(ARIA_HIDDEN, false);\n                            element.attr(ARIA_EXPANDED, true).attr(ARIA_OWNS, timeView._timeViewID);\n                            timeView.options.active(timeView.current());\n                        }\n                    },\n                    active: function (current) {\n                        if (element && element.length) {\n                            element[0].removeAttribute(ARIA_ACTIVEDESCENDANT);\n                        }\n                        if (current) {\n                            element.attr(ARIA_ACTIVEDESCENDANT, timeView._optionID);\n                        }\n                    },\n                    popup: options.popup,\n                    useValueToRender: true\n                });\n                ul = timeView.ul;\n            },\n            _icons: function () {\n                var that = this;\n                var element = that.element;\n                var options = that.options;\n                var icons;\n                icons = element.next('span.k-select');\n                if (!icons[0]) {\n                    icons = $('<span unselectable=\"on\" class=\"k-select\">' + '<span class=\"k-link k-link-date\" aria-label=\"' + options.dateButtonText + '\"><span unselectable=\"on\" class=\"k-icon k-i-calendar\"></span></span>' + '<span class=\"k-link k-link-time\" aria-label=\"' + options.timeButtonText + '\"><span unselectable=\"on\" class=\"k-icon k-i-clock\"></span></span>' + '</span>').insertAfter(element);\n                }\n                icons = icons.children();\n                that._dateIcon = icons.eq(0).attr('aria-controls', that.dateView._dateViewID);\n                that._timeIcon = icons.eq(1).attr('aria-controls', that.timeView._timeViewID);\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper;\n                wrapper = element.parents('.k-datetimepicker');\n                if (!wrapper[0]) {\n                    wrapper = element.wrap(SPAN).parent().addClass('k-picker-wrap k-state-default');\n                    wrapper = wrapper.wrap(SPAN).parent();\n                }\n                wrapper[0].style.cssText = element[0].style.cssText;\n                element.css({\n                    width: '100%',\n                    height: element[0].style.height\n                });\n                that.wrapper = wrapper.addClass('k-widget k-datetimepicker').addClass(element[0].className).removeClass('input-validation-error');\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form'), options = that.options, disabledDate = options.disableDates, parseFormats = options.parseFormats.length ? options.parseFormats : null, optionsValue = that._initialOptions.value, initialValue = element[0].defaultValue;\n                if (optionsValue && (disabledDate && disabledDate(optionsValue))) {\n                    optionsValue = null;\n                }\n                if ((!initialValue || !kendo.parseDate(initialValue, parseFormats, options.culture)) && optionsValue) {\n                    element.attr('value', kendo.toString(optionsValue, options.format, options.culture));\n                }\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        that.value(optionsValue || element[0].defaultValue);\n                        that.max(that._initialOptions.max);\n                        that.min(that._initialOptions.min);\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            },\n            _template: function () {\n                this._ariaTemplate = kendo.template(this.options.ARIATemplate);\n            },\n            _createDateInput: function (options) {\n                if (this._dateInput) {\n                    this._dateInput.destroy();\n                    this._dateInput = null;\n                }\n                if (options.dateInput) {\n                    this._dateInput = new ui.DateInput(this.element, {\n                        culture: options.culture,\n                        format: options.format,\n                        min: options.min,\n                        max: options.max,\n                        interval: options.interval\n                    });\n                }\n            },\n            _calculateMidnight: function (min, max) {\n                return getMilliseconds(min) + getMilliseconds(max) === 0;\n            },\n            _updateARIA: function (date) {\n                var cell;\n                var that = this;\n                var calendar = that.dateView.calendar;\n                if (that.element && that.element.length) {\n                    that.element[0].removeAttribute(ARIA_ACTIVEDESCENDANT);\n                }\n                if (calendar) {\n                    cell = calendar._cell;\n                    cell.attr('aria-label', that._ariaTemplate({ current: date || calendar.current() }));\n                    that.element.attr(ARIA_ACTIVEDESCENDANT, cell.attr('id'));\n                }\n            }\n        });\n        function lastTimeOption(interval) {\n            var date = new Date(2100, 0, 1);\n            date.setMinutes(-interval);\n            return date;\n        }\n        function preventDefault(e) {\n            e.preventDefault();\n        }\n        function normalize(options) {\n            var patterns = kendo.getCulture(options.culture).calendars.standard.patterns, parseFormats = !options.parseFormats.length, timeFormat;\n            options.format = extractFormat(options.format || patterns.g);\n            options.timeFormat = timeFormat = extractFormat(options.timeFormat || patterns.t);\n            kendo.DateView.normalize(options);\n            if (parseFormats) {\n                options.parseFormats.unshift('yyyy-MM-ddTHH:mm:ss');\n            }\n            if ($.inArray(timeFormat, options.parseFormats) === -1) {\n                options.parseFormats.push(timeFormat);\n            }\n        }\n        ui.plugin(DateTimePicker);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.splitter', ['kendo.resizable'], f);\n}(function () {\n    var __meta__ = {\n        id: 'splitter',\n        name: 'Splitter',\n        category: 'web',\n        description: 'The Splitter widget provides an easy way to create a dynamic layout of resizable and collapsible panes.',\n        depends: ['resizable']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, keys = kendo.keys, extend = $.extend, proxy = $.proxy, Widget = ui.Widget, pxUnitsRegex = /^\\d+(\\.\\d+)?px$/i, percentageUnitsRegex = /^\\d+(\\.\\d+)?%$/i, NS = '.kendoSplitter', EXPAND = 'expand', COLLAPSE = 'collapse', CONTENTLOAD = 'contentLoad', ERROR = 'error', RESIZE = 'resize', LAYOUTCHANGE = 'layoutChange', HORIZONTAL = 'horizontal', VERTICAL = 'vertical', MOUSEENTER = 'mouseenter', CLICK = 'click', PANE = 'pane', MOUSELEAVE = 'mouseleave', FOCUSED = 'k-state-focused', KPANE = 'k-' + PANE, PANECLASS = '.' + KPANE;\n        function isPercentageSize(size) {\n            return percentageUnitsRegex.test(size);\n        }\n        function isPixelSize(size) {\n            return pxUnitsRegex.test(size) || /^\\d+$/.test(size);\n        }\n        function isFluid(size) {\n            return !isPercentageSize(size) && !isPixelSize(size);\n        }\n        function calculateSize(size, total) {\n            var output = parseInt(size, 10);\n            if (isPercentageSize(size)) {\n                output = Math.floor(output * total / 100);\n            }\n            return output;\n        }\n        function panePropertyAccessor(propertyName, triggersResize) {\n            return function (pane, value) {\n                var paneConfig = this.element.find(pane).data(PANE);\n                if (arguments.length == 1) {\n                    return paneConfig[propertyName];\n                }\n                paneConfig[propertyName] = value;\n                if (triggersResize) {\n                    var splitter = this.element.data('kendo' + this.options.name);\n                    splitter.resize(true);\n                }\n            };\n        }\n        var Splitter = Widget.extend({\n            init: function (element, options) {\n                var that = this, isHorizontal;\n                Widget.fn.init.call(that, element, options);\n                that.wrapper = that.element;\n                if (that.options.orientation) {\n                    isHorizontal = that.options.orientation.toLowerCase() != VERTICAL;\n                }\n                that.orientation = isHorizontal ? HORIZONTAL : VERTICAL;\n                that._dimension = isHorizontal ? 'width' : 'height';\n                that._keys = {\n                    decrease: isHorizontal ? keys.LEFT : keys.UP,\n                    increase: isHorizontal ? keys.RIGHT : keys.DOWN\n                };\n                that._resizeStep = 10;\n                that._marker = kendo.guid().substring(0, 8);\n                that._initPanes();\n                that.resizing = new PaneResizing(that);\n                that.element.triggerHandler('init' + NS);\n            },\n            events: [\n                EXPAND,\n                COLLAPSE,\n                CONTENTLOAD,\n                ERROR,\n                RESIZE,\n                LAYOUTCHANGE\n            ],\n            _addOverlays: function () {\n                this._panes().append('<div class=\\'k-splitter-overlay k-overlay\\' />');\n            },\n            _removeOverlays: function () {\n                this._panes().children('.k-splitter-overlay').remove();\n            },\n            _attachEvents: function () {\n                var that = this, orientation = that.options.orientation;\n                that.element.children('.k-splitbar-draggable-' + orientation).on('keydown' + NS, proxy(that._keydown, that)).on('mousedown' + NS, function (e) {\n                    e.currentTarget.focus();\n                }).on('focus' + NS, function (e) {\n                    $(e.currentTarget).addClass(FOCUSED);\n                }).on('blur' + NS, function (e) {\n                    $(e.currentTarget).removeClass(FOCUSED);\n                    if (that.resizing) {\n                        that.resizing.end();\n                    }\n                }).on(MOUSEENTER + NS, function () {\n                    $(this).addClass('k-splitbar-' + that.orientation + '-hover');\n                }).on(MOUSELEAVE + NS, function () {\n                    $(this).removeClass('k-splitbar-' + that.orientation + '-hover');\n                }).on('mousedown' + NS, proxy(that._addOverlays, that)).end().children('.k-splitbar').on('dblclick' + NS, proxy(that._togglePane, that)).children('.k-collapse-next, .k-collapse-prev').on(CLICK + NS, that._arrowClick(COLLAPSE)).end().children('.k-expand-next, .k-expand-prev').on(CLICK + NS, that._arrowClick(EXPAND)).end().end();\n                $(window).on('resize' + NS + that._marker, proxy(that.resize, that, false));\n                $(document).on('mouseup' + NS + that._marker, proxy(that._removeOverlays, that));\n            },\n            _detachEvents: function () {\n                var that = this;\n                that.element.children('.k-splitbar-draggable-' + that.orientation).off(NS).end().children('.k-splitbar').off('dblclick' + NS).children('.k-collapse-next, .k-collapse-prev, .k-expand-next, .k-expand-prev').off(NS);\n                $(window).off(NS + that._marker);\n                $(document).off(NS + that._marker);\n            },\n            options: {\n                name: 'Splitter',\n                orientation: HORIZONTAL,\n                panes: []\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this._detachEvents();\n                if (this.resizing) {\n                    this.resizing.destroy();\n                }\n                kendo.destroy(this.element);\n                this.wrapper = this.element = null;\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, resizing = that.resizing, target = $(e.currentTarget), navigationKeys = that._keys, increase = key === navigationKeys.increase, decrease = key === navigationKeys.decrease, pane;\n                if (increase || decrease) {\n                    if (e.ctrlKey) {\n                        pane = target[decrease ? 'next' : 'prev']();\n                        if (resizing && resizing.isResizing()) {\n                            resizing.end();\n                        }\n                        if (!pane[that._dimension]()) {\n                            that._triggerAction(EXPAND, pane);\n                        } else {\n                            that._triggerAction(COLLAPSE, target[decrease ? 'prev' : 'next']());\n                        }\n                    } else if (resizing) {\n                        resizing.move((decrease ? -1 : 1) * that._resizeStep, target);\n                    }\n                    e.preventDefault();\n                } else if (key === keys.HOME) {\n                    resizing.move(-resizing._maxPosition, target);\n                    e.preventDefault();\n                } else if (key === keys.END) {\n                    resizing.move(resizing._maxPosition, target);\n                    e.preventDefault();\n                } else if (key === keys.ENTER && resizing) {\n                    resizing.end();\n                    e.preventDefault();\n                }\n            },\n            _initPanes: function () {\n                var panesConfig = this.options.panes || [];\n                var that = this;\n                this.element.addClass('k-widget').addClass('k-splitter').children().each(function (i, pane) {\n                    if (pane.nodeName.toLowerCase() != 'script') {\n                        that._initPane(pane, panesConfig[i]);\n                    }\n                });\n                this.resize();\n            },\n            _initPane: function (pane, config) {\n                pane = $(pane).attr('role', 'group').addClass(KPANE);\n                pane.data(PANE, config ? config : {}).toggleClass('k-scrollable', config ? config.scrollable !== false : true);\n                this.ajaxRequest(pane);\n            },\n            ajaxRequest: function (pane, url, data) {\n                var that = this, paneConfig;\n                pane = that.element.find(pane);\n                paneConfig = pane.data(PANE);\n                url = url || paneConfig.contentUrl;\n                if (url) {\n                    pane.append('<span class=\\'k-icon k-i-loading k-pane-loading\\' />');\n                    if (kendo.isLocalUrl(url)) {\n                        jQuery.ajax({\n                            url: url,\n                            data: data || {},\n                            type: 'GET',\n                            dataType: 'html',\n                            success: function (data) {\n                                that.angular('cleanup', function () {\n                                    return { elements: pane.get() };\n                                });\n                                pane.html(data);\n                                that.angular('compile', function () {\n                                    return { elements: pane.get() };\n                                });\n                                that.trigger(CONTENTLOAD, { pane: pane[0] });\n                            },\n                            error: function (xhr, status) {\n                                that.trigger(ERROR, {\n                                    pane: pane[0],\n                                    status: status,\n                                    xhr: xhr\n                                });\n                            }\n                        });\n                    } else {\n                        pane.removeClass('k-scrollable').html('<iframe src=\\'' + url + '\\' frameborder=\\'0\\' class=\\'k-content-frame\\'>' + 'This page requires frames in order to show content' + '</iframe>');\n                    }\n                }\n            },\n            _triggerAction: function (type, pane) {\n                if (!this.trigger(type, { pane: pane[0] })) {\n                    this[type](pane[0]);\n                }\n            },\n            _togglePane: function (e) {\n                var that = this, target = $(e.target), arrow;\n                if (target.closest('.k-splitter')[0] != that.element[0]) {\n                    return;\n                }\n                arrow = target.children('.k-icon:not(.k-resize-handle)');\n                if (arrow.length !== 1) {\n                    return;\n                }\n                if (arrow.is('.k-collapse-prev')) {\n                    that._triggerAction(COLLAPSE, target.prev());\n                } else if (arrow.is('.k-collapse-next')) {\n                    that._triggerAction(COLLAPSE, target.next());\n                } else if (arrow.is('.k-expand-prev')) {\n                    that._triggerAction(EXPAND, target.prev());\n                } else if (arrow.is('.k-expand-next')) {\n                    that._triggerAction(EXPAND, target.next());\n                }\n            },\n            _arrowClick: function (arrowType) {\n                var that = this;\n                return function (e) {\n                    var target = $(e.target), pane;\n                    if (target.closest('.k-splitter')[0] != that.element[0]) {\n                        return;\n                    }\n                    if (target.is('.k-' + arrowType + '-prev')) {\n                        pane = target.parent().prev();\n                    } else {\n                        pane = target.parent().next();\n                    }\n                    that._triggerAction(arrowType, pane);\n                };\n            },\n            _updateSplitBar: function (splitbar, previousPane, nextPane) {\n                var catIconIf = function (iconType, condition) {\n                        return condition ? '<div class=\\'k-icon ' + iconType + '\\' />' : '';\n                    }, orientation = this.orientation, draggable = previousPane.resizable !== false && nextPane.resizable !== false, prevCollapsible = previousPane.collapsible, prevCollapsed = previousPane.collapsed, nextCollapsible = nextPane.collapsible, nextCollapsed = nextPane.collapsed;\n                splitbar.addClass('k-splitbar k-state-default k-splitbar-' + orientation).attr('role', 'separator').attr('aria-expanded', !(prevCollapsed || nextCollapsed)).removeClass('k-splitbar-' + orientation + '-hover').toggleClass('k-splitbar-draggable-' + orientation, draggable && !prevCollapsed && !nextCollapsed).toggleClass('k-splitbar-static-' + orientation, !draggable && !prevCollapsible && !nextCollapsible).html(catIconIf('k-collapse-prev k-i-arrow-60-up', prevCollapsible && !prevCollapsed && !nextCollapsed && orientation == VERTICAL) + catIconIf('k-collapse-prev k-i-arrow-60-left', prevCollapsible && !prevCollapsed && !nextCollapsed && orientation == HORIZONTAL) + catIconIf('k-expand-prev k-i-arrow-60-down', prevCollapsible && prevCollapsed && !nextCollapsed && orientation == VERTICAL) + catIconIf('k-expand-prev k-i-arrow-60-right', prevCollapsible && prevCollapsed && !nextCollapsed && orientation == HORIZONTAL) + catIconIf('k-resize-handle k-i-hbar', draggable && orientation == VERTICAL) + catIconIf('k-resize-handle k-i-vbar', draggable && orientation == HORIZONTAL) + catIconIf('k-collapse-next k-i-arrow-60-down', nextCollapsible && !nextCollapsed && !prevCollapsed && orientation == VERTICAL) + catIconIf('k-collapse-next k-i-arrow-60-right', nextCollapsible && !nextCollapsed && !prevCollapsed && orientation == HORIZONTAL) + catIconIf('k-expand-next k-i-arrow-60-up', nextCollapsible && nextCollapsed && !prevCollapsed && orientation == VERTICAL) + catIconIf('k-expand-next k-i-arrow-60-left', nextCollapsible && nextCollapsed && !prevCollapsed && orientation == HORIZONTAL));\n                if (!draggable && !prevCollapsible && !nextCollapsible) {\n                    splitbar.removeAttr('tabindex');\n                }\n            },\n            _updateSplitBars: function () {\n                var that = this;\n                this.element.children('.k-splitbar').each(function () {\n                    var splitbar = $(this), previousPane = splitbar.prevAll(PANECLASS).first().data(PANE), nextPane = splitbar.nextAll(PANECLASS).first().data(PANE);\n                    if (!nextPane) {\n                        return;\n                    }\n                    that._updateSplitBar(splitbar, previousPane, nextPane);\n                });\n            },\n            _removeSplitBars: function () {\n                this.element.children('.k-splitbar').remove();\n            },\n            _panes: function () {\n                if (!this.element) {\n                    return $();\n                }\n                return this.element.children(PANECLASS);\n            },\n            _resize: function () {\n                var that = this, element = that.element, panes = element.children(PANECLASS), isHorizontal = that.orientation == HORIZONTAL, splitBars = element.children('.k-splitbar'), splitBarsCount = splitBars.length, sizingProperty = isHorizontal ? 'width' : 'height', totalSize = element[sizingProperty]();\n                that.wrapper.addClass('k-splitter-resizing');\n                if (splitBarsCount === 0) {\n                    splitBarsCount = panes.length - 1;\n                    panes.slice(0, splitBarsCount).after('<div tabindex=\\'0\\' class=\\'k-splitbar\\' data-marker=\\'' + that._marker + '\\' />');\n                    that._updateSplitBars();\n                    splitBars = element.children('.k-splitbar');\n                } else {\n                    that._updateSplitBars();\n                }\n                splitBars.each(function () {\n                    totalSize -= this[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n                });\n                var sizedPanesWidth = 0, sizedPanesCount = 0, freeSizedPanes = $();\n                panes.css({\n                    position: 'absolute',\n                    top: 0\n                })[sizingProperty](function () {\n                    var element = $(this), config = element.data(PANE) || {}, size;\n                    element.removeClass('k-state-collapsed');\n                    if (config.collapsed) {\n                        size = config.collapsedSize ? calculateSize(config.collapsedSize, totalSize) : 0;\n                        element.css('overflow', 'hidden').addClass('k-state-collapsed');\n                    } else if (isFluid(config.size)) {\n                        freeSizedPanes = freeSizedPanes.add(this);\n                        return;\n                    } else {\n                        size = calculateSize(config.size, totalSize);\n                    }\n                    sizedPanesCount++;\n                    sizedPanesWidth += size;\n                    return size;\n                });\n                totalSize -= sizedPanesWidth;\n                var freeSizePanesCount = freeSizedPanes.length, freeSizePaneWidth = Math.floor(totalSize / freeSizePanesCount);\n                freeSizedPanes.slice(0, freeSizePanesCount - 1).css(sizingProperty, freeSizePaneWidth).end().eq(freeSizePanesCount - 1).css(sizingProperty, totalSize - (freeSizePanesCount - 1) * freeSizePaneWidth);\n                var sum = 0, alternateSizingProperty = isHorizontal ? 'height' : 'width', positioningProperty = isHorizontal ? 'left' : 'top', sizingDomProperty = isHorizontal ? 'offsetWidth' : 'offsetHeight';\n                if (freeSizePanesCount === 0) {\n                    var lastNonCollapsedPane = panes.filter(function () {\n                        return !($(this).data(PANE) || {}).collapsed;\n                    }).last();\n                    lastNonCollapsedPane[sizingProperty](totalSize + lastNonCollapsedPane[0][sizingDomProperty]);\n                }\n                element.children().css(alternateSizingProperty, element[alternateSizingProperty]()).each(function (i, child) {\n                    if (child.tagName.toLowerCase() != 'script') {\n                        child.style[positioningProperty] = Math.floor(sum) + 'px';\n                        sum += child[sizingDomProperty];\n                    }\n                });\n                that._detachEvents();\n                that._attachEvents();\n                that.wrapper.removeClass('k-splitter-resizing');\n                kendo.resize(panes);\n                that.trigger(LAYOUTCHANGE);\n            },\n            toggle: function (pane, expand) {\n                var that = this, paneConfig;\n                pane = that.element.find(pane);\n                paneConfig = pane.data(PANE);\n                if (!expand && !paneConfig.collapsible) {\n                    return;\n                }\n                if (arguments.length == 1) {\n                    expand = paneConfig.collapsed === undefined ? false : paneConfig.collapsed;\n                }\n                paneConfig.collapsed = !expand;\n                if (paneConfig.collapsed) {\n                    pane.css('overflow', 'hidden');\n                } else {\n                    pane.css('overflow', '');\n                }\n                that.resize(true);\n            },\n            collapse: function (pane) {\n                this.toggle(pane, false);\n            },\n            expand: function (pane) {\n                this.toggle(pane, true);\n            },\n            _addPane: function (config, idx, paneElement) {\n                var that = this;\n                if (paneElement.length) {\n                    that.options.panes.splice(idx, 0, config);\n                    that._initPane(paneElement, config);\n                    that._removeSplitBars();\n                    that.resize(true);\n                }\n                return paneElement;\n            },\n            append: function (config) {\n                config = config || {};\n                var that = this, paneElement = $('<div />').appendTo(that.element);\n                return that._addPane(config, that.options.panes.length, paneElement);\n            },\n            insertBefore: function (config, referencePane) {\n                referencePane = $(referencePane);\n                config = config || {};\n                var that = this, idx = that.wrapper.children('.k-pane').index(referencePane), paneElement = $('<div />').insertBefore($(referencePane));\n                return that._addPane(config, idx, paneElement);\n            },\n            insertAfter: function (config, referencePane) {\n                referencePane = $(referencePane);\n                config = config || {};\n                var that = this, idx = that.wrapper.children('.k-pane').index(referencePane), paneElement = $('<div />').insertAfter($(referencePane));\n                return that._addPane(config, idx + 1, paneElement);\n            },\n            remove: function (pane) {\n                var that = this;\n                pane = that.wrapper.find(pane);\n                if (pane.length) {\n                    kendo.destroy(pane);\n                    pane.each(function (idx, element) {\n                        that.options.panes.splice(that.wrapper.children('.k-pane').index(element), 1);\n                        $(element).remove();\n                    });\n                    that._removeSplitBars();\n                    if (that.options.panes.length) {\n                        that.resize(true);\n                    }\n                }\n                return that;\n            },\n            size: panePropertyAccessor('size', true),\n            min: panePropertyAccessor('min'),\n            max: panePropertyAccessor('max')\n        });\n        ui.plugin(Splitter);\n        var verticalDefaults = {\n            sizingProperty: 'height',\n            sizingDomProperty: 'offsetHeight',\n            alternateSizingProperty: 'width',\n            positioningProperty: 'top',\n            mousePositioningProperty: 'pageY'\n        };\n        var horizontalDefaults = {\n            sizingProperty: 'width',\n            sizingDomProperty: 'offsetWidth',\n            alternateSizingProperty: 'height',\n            positioningProperty: 'left',\n            mousePositioningProperty: 'pageX'\n        };\n        function PaneResizing(splitter) {\n            var that = this, orientation = splitter.orientation;\n            that.owner = splitter;\n            that._element = splitter.element;\n            that.orientation = orientation;\n            extend(that, orientation === HORIZONTAL ? horizontalDefaults : verticalDefaults);\n            that._resizable = new kendo.ui.Resizable(splitter.element, {\n                orientation: orientation,\n                handle: '.k-splitbar-draggable-' + orientation + '[data-marker=' + splitter._marker + ']',\n                hint: proxy(that._createHint, that),\n                start: proxy(that._start, that),\n                max: proxy(that._max, that),\n                min: proxy(that._min, that),\n                invalidClass: 'k-restricted-size-' + orientation,\n                resizeend: proxy(that._stop, that)\n            });\n        }\n        PaneResizing.prototype = {\n            press: function (target) {\n                this._resizable.press(target);\n            },\n            move: function (delta, target) {\n                if (!this.pressed) {\n                    this.press(target);\n                    this.pressed = true;\n                }\n                if (!this._resizable.target) {\n                    this._resizable.press(target);\n                }\n                this._resizable.move(delta);\n            },\n            end: function () {\n                this._resizable.end();\n                this.pressed = false;\n            },\n            destroy: function () {\n                this._resizable.destroy();\n                this._resizable = this._element = this.owner = null;\n            },\n            isResizing: function () {\n                return this._resizable.resizing;\n            },\n            _createHint: function (handle) {\n                var that = this;\n                return $('<div class=\\'k-ghost-splitbar k-ghost-splitbar-' + that.orientation + ' k-state-default\\' />').css(that.alternateSizingProperty, handle[that.alternateSizingProperty]());\n            },\n            _start: function (e) {\n                var that = this, splitbar = $(e.currentTarget), previousPane = splitbar.prev(), nextPane = splitbar.next(), previousPaneConfig = previousPane.data(PANE), nextPaneConfig = nextPane.data(PANE), prevBoundary = parseInt(previousPane[0].style[that.positioningProperty], 10), nextBoundary = parseInt(nextPane[0].style[that.positioningProperty], 10) + nextPane[0][that.sizingDomProperty] - splitbar[0][that.sizingDomProperty], totalSize = parseInt(that._element.css(that.sizingProperty), 10), toPx = function (value) {\n                        var val = parseInt(value, 10);\n                        return (isPixelSize(value) ? val : totalSize * val / 100) || 0;\n                    }, prevMinSize = toPx(previousPaneConfig.min), prevMaxSize = toPx(previousPaneConfig.max) || nextBoundary - prevBoundary, nextMinSize = toPx(nextPaneConfig.min), nextMaxSize = toPx(nextPaneConfig.max) || nextBoundary - prevBoundary;\n                that.previousPane = previousPane;\n                that.nextPane = nextPane;\n                that._maxPosition = Math.min(nextBoundary - nextMinSize, prevBoundary + prevMaxSize);\n                that._minPosition = Math.max(prevBoundary + prevMinSize, nextBoundary - nextMaxSize);\n            },\n            _max: function () {\n                return this._maxPosition;\n            },\n            _min: function () {\n                return this._minPosition;\n            },\n            _stop: function (e) {\n                var that = this, splitbar = $(e.currentTarget), owner = that.owner;\n                owner._panes().children('.k-splitter-overlay').remove();\n                if (e.keyCode !== kendo.keys.ESC) {\n                    var ghostPosition = e.position, previousPane = splitbar.prev(), nextPane = splitbar.next(), previousPaneConfig = previousPane.data(PANE), nextPaneConfig = nextPane.data(PANE), previousPaneNewSize = ghostPosition - parseInt(previousPane[0].style[that.positioningProperty], 10), nextPaneNewSize = parseInt(nextPane[0].style[that.positioningProperty], 10) + nextPane[0][that.sizingDomProperty] - ghostPosition - splitbar[0][that.sizingDomProperty], fluidPanesCount = that._element.children(PANECLASS).filter(function () {\n                            return isFluid($(this).data(PANE).size);\n                        }).length;\n                    if (!isFluid(previousPaneConfig.size) || fluidPanesCount > 1) {\n                        if (isFluid(previousPaneConfig.size)) {\n                            fluidPanesCount--;\n                        }\n                        previousPaneConfig.size = previousPaneNewSize + 'px';\n                    }\n                    if (!isFluid(nextPaneConfig.size) || fluidPanesCount > 1) {\n                        nextPaneConfig.size = nextPaneNewSize + 'px';\n                    }\n                    owner.resize(true);\n                }\n                return false;\n            }\n        };\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dialog', [\n        'kendo.core',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dialog',\n        name: 'Dialog',\n        category: 'web',\n        description: 'The dialog widget is a modal popup that brings information to the user.',\n        depends: [\n            'core',\n            'popup'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, TabKeyTrap = kendo.ui.Popup.TabKeyTrap, proxy = $.proxy, template = kendo.template, keys = kendo.keys, isFunction = $.isFunction, NS = 'kendoWindow', KDIALOG = '.k-dialog', KWINDOW = '.k-window', KICONCLOSE = '.k-dialog-close', KCONTENTCLASS = 'k-content k-window-content k-dialog-content', KCONTENTSELECTOR = '.k-window-content', KCONTENT = '.k-content', KSCROLL = 'k-scroll', KTITLELESS = 'k-dialog-titleless', KDIALOGTITLE = '.k-dialog-title', KDIALOGTITLEBAR = KDIALOGTITLE + 'bar', KBUTTONGROUP = '.k-dialog-buttongroup', KBUTTON = '.k-button', KALERT = 'k-alert', KCONFIRM = 'k-confirm', KPROMPT = 'k-prompt', KTEXTBOX = '.k-textbox', KOVERLAY = '.k-overlay', VISIBLE = ':visible', ZINDEX = 'zIndex', BODY = 'body', INITOPEN = 'initOpen', TOUCHSTART = 'touchstart', TOUCHMOVE = 'touchmove', OPEN = 'open', CLOSE = 'close', SHOW = 'show', HIDE = 'hide', WIDTH = 'width', SIZE = {\n                small: 'k-window-sm',\n                medium: 'k-window-md',\n                large: 'k-window-lg'\n            }, HIDDEN = 'hidden', OVERFLOW = 'overflow', DATADOCOVERFLOWRULE = 'original-overflow-rule', DATAHTMLTAPYRULE = 'tap-y', HUNDREDPERCENT = 100, CSSFLEXBOX = kendo.support.cssFlexbox, messages = {\n                okText: 'OK',\n                cancel: 'Cancel',\n                promptInput: 'Input'\n            }, ceil = Math.ceil, templates, overlaySelector = ':not(link,meta,script,style)';\n        function defined(x) {\n            return typeof x != 'undefined';\n        }\n        function constrain(value, low, high) {\n            return Math.max(Math.min(parseInt(value, 10), high === Infinity ? high : parseInt(high, 10)), parseInt(low, 10));\n        }\n        function buttonKeyTrigger(e) {\n            return e.keyCode == keys.ENTER || e.keyCode == keys.SPACEBAR;\n        }\n        var DialogBase = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that._init(that.element, that.options);\n                kendo.notify(that);\n            },\n            _init: function (element, options) {\n                var that = this, wrapper;\n                that._centerCallback = proxy(that._center, that);\n                that.appendTo = $(BODY);\n                if (!defined(options.visible) || options.visible === null) {\n                    options.visible = element.is(VISIBLE);\n                }\n                if (that.wrapperTemplate === undefined) {\n                    that.wrapperTemplate = templates.wrapper;\n                }\n                that._createDialog();\n                wrapper = that.wrapper = element.closest(KDIALOG);\n                if (options._defaultFocus === undefined) {\n                    that._defaultFocus = element[0];\n                }\n                that._tabindex(element);\n                that._dimensions();\n                this._tabKeyTrap = new TabKeyTrap(wrapper);\n                if (!that.options.visible) {\n                    that.wrapper.hide();\n                } else {\n                    that._triggerOpen();\n                }\n            },\n            setOptions: function (options) {\n                var that = this;\n                var sizeClass = that.options.size;\n                options = $.extend(that.options, options);\n                Widget.fn.setOptions.call(that, options);\n                if (options.title !== undefined) {\n                    that.title(options.title);\n                }\n                if (options.content) {\n                    kendo.destroy(that.element.children());\n                    that.element.html(options.content);\n                }\n                if (options.actions) {\n                    that.wrapper.children(KBUTTONGROUP).remove();\n                    that._createActionbar(that.wrapper);\n                }\n                that.wrapper.show();\n                that._closable(that.wrapper);\n                that.wrapper.removeClass(SIZE[sizeClass]);\n                that._dimensions();\n                if (!options.visible) {\n                    that.wrapper.hide();\n                } else {\n                    that._triggerOpen();\n                }\n                if (typeof options.modal !== 'undefined') {\n                    var visible = that.options.visible !== false;\n                    that._enableDocumentScrolling();\n                    that._overlay(options.modal && visible);\n                }\n            },\n            _dimensions: function () {\n                var that = this, wrapper = that.wrapper, options = that.options, width = options.width, height = options.height, sizeClass = options.size, dimensions = [\n                        'minWidth',\n                        'minHeight',\n                        'maxWidth',\n                        'maxHeight'\n                    ];\n                for (var i = 0; i < dimensions.length; i++) {\n                    var value = options[dimensions[i]];\n                    if (value && value != Infinity) {\n                        wrapper.css(dimensions[i], value);\n                    }\n                }\n                this._setElementMaxHeight();\n                if (width) {\n                    if (width.toString().indexOf('%') > 0) {\n                        wrapper.width(width);\n                    } else {\n                        wrapper.outerWidth(constrain(width, options.minWidth, options.maxWidth));\n                    }\n                }\n                if (height) {\n                    if (height.toString().indexOf('%') > 0) {\n                        wrapper.height(height);\n                    } else {\n                        wrapper.outerHeight(constrain(height, options.minHeight, options.maxHeight));\n                    }\n                    this._setElementHeight();\n                }\n                if (sizeClass && SIZE[sizeClass]) {\n                    wrapper.addClass(SIZE[sizeClass]);\n                }\n            },\n            _setElementMaxHeight: function () {\n                var that = this, element = that.element, maxHeight = that.options.maxHeight, paddingBox, elementMaxHeight;\n                if (maxHeight != Infinity) {\n                    paddingBox = that._paddingBox(element);\n                    elementMaxHeight = parseFloat(maxHeight, 10) - that._uiHeight() - paddingBox.vertical;\n                    if (elementMaxHeight > 0) {\n                        element.css({ maxHeight: ceil(elementMaxHeight) + 'px' });\n                    }\n                }\n            },\n            _paddingBox: function (element) {\n                var paddingTop = parseFloat(element.css('padding-top'), 10), paddingLeft = parseFloat(element.css('padding-left'), 10), paddingBottom = parseFloat(element.css('padding-bottom'), 10), paddingRight = parseFloat(element.css('padding-right'), 10);\n                return {\n                    vertical: paddingTop + paddingBottom,\n                    horizontal: paddingLeft + paddingRight\n                };\n            },\n            _setElementHeight: function () {\n                var that = this, element = that.element, height = that.options.height, paddingBox = that._paddingBox(element), elementHeight = parseFloat(height, 10) - that._uiHeight() - paddingBox.vertical;\n                if (elementHeight < 0) {\n                    elementHeight = 0;\n                }\n                element.css({ height: ceil(elementHeight) + 'px' });\n                this._applyScrollClassName(element);\n            },\n            _applyScrollClassName: function (element) {\n                var hasScroll = element.get(0).scrollHeight > element.outerHeight();\n                if (hasScroll) {\n                    element.addClass(KSCROLL);\n                } else {\n                    element.removeClass(KSCROLL);\n                }\n            },\n            _uiHeight: function () {\n                var that = this, wrapper = that.wrapper, actionbar = wrapper.children(KBUTTONGROUP), actionbarHeight = actionbar[0] && actionbar[0].offsetHeight || 0, titlebar = wrapper.children(KDIALOGTITLEBAR), titlebarHeight = titlebar[0] && titlebar[0].offsetHeight || 0;\n                return actionbarHeight + titlebarHeight;\n            },\n            _overlay: function (visible) {\n                var overlay = this.appendTo.children(KOVERLAY), wrapper = this.wrapper;\n                if (!overlay.length) {\n                    overlay = $(templates.overlay);\n                }\n                overlay.insertBefore(wrapper[0]).toggle(visible).css(ZINDEX, parseInt(wrapper.css(ZINDEX), 10) - 1);\n                if (visible) {\n                    this._waiAriaOverlay();\n                } else {\n                    this._removeWaiAriaOverlay();\n                }\n                if (this.options.modal.preventScroll) {\n                    this._stopDocumentScrolling();\n                }\n                return overlay;\n            },\n            _waiAriaOverlay: function () {\n                var node = this.wrapper;\n                this._overlayedNodes = node.prevAll(overlaySelector).add(node.nextAll(overlaySelector)).each(function () {\n                    var jthis = $(this);\n                    jthis.data('ariaHidden', jthis.attr('aria-hidden'));\n                    jthis.attr('aria-hidden', 'true');\n                });\n            },\n            _removeWaiAriaOverlay: function () {\n                return this._overlayedNodes && this._overlayedNodes.each(function () {\n                    var node = $(this);\n                    var hiddenValue = node.data('ariaHidden');\n                    if (hiddenValue) {\n                        node.attr('aria-hidden', hiddenValue);\n                    } else {\n                        node.removeAttr('aria-hidden');\n                    }\n                });\n            },\n            _closeClick: function (e) {\n                e.preventDefault();\n                this.close(false);\n            },\n            _closeKeyHandler: function (e) {\n                if (buttonKeyTrigger(e) || e.keyCode == keys.ESC) {\n                    this.close(false);\n                }\n            },\n            _keydown: function (e) {\n                var that = this, options = that.options, keyCode = e.keyCode;\n                if (keyCode == keys.ESC && !that._closing && options.closable) {\n                    that.close(false);\n                }\n            },\n            _createDialog: function () {\n                var that = this, content = that.element, options = that.options, isRtl = kendo.support.isRtl(content), titlebar = $(templates.titlebar(options)), titleId = (content.id || kendo.guid()) + '_title', wrapper = $(that.wrapperTemplate(options));\n                wrapper.toggleClass('k-rtl', isRtl);\n                content.addClass(KCONTENTCLASS);\n                that.appendTo.append(wrapper);\n                if (options.title !== false) {\n                    wrapper.append(titlebar);\n                    titlebar.attr('id', titleId);\n                    wrapper.attr('aria-labelledby', titleId);\n                } else {\n                    wrapper.addClass(KTITLELESS);\n                }\n                that._closable(wrapper);\n                wrapper.append(content);\n                if (options.content) {\n                    kendo.destroy(content.children());\n                    content.html(options.content);\n                }\n                if (options.actions.length) {\n                    that._createActionbar(wrapper);\n                }\n            },\n            _closable: function (wrapper) {\n                var that = this;\n                var options = that.options;\n                var titlebar = wrapper.children(KDIALOGTITLEBAR);\n                var titlebarActions = titlebar.find('.k-window-actions');\n                var closeAction = titlebarActions.length ? titlebarActions.find('.k-dialog-close') : wrapper.find('.k-dialog-close');\n                closeAction.remove();\n                if (options.closable !== false) {\n                    if (options.title !== false && titlebarActions.length) {\n                        titlebarActions.append(templates.close(options));\n                    } else {\n                        wrapper.prepend(templates.close(options));\n                    }\n                    wrapper.autoApplyNS(NS);\n                    that.element.autoApplyNS(NS);\n                    wrapper.find(KICONCLOSE).on('click', proxy(that._closeClick, that)).on('keydown', proxy(that._closeKeyHandler, that));\n                    that.element.on('keydown', proxy(that._keydown, that));\n                }\n            },\n            _createActionbar: function (wrapper) {\n                var isStretchedLayout = this.options.buttonLayout === 'stretched';\n                var buttonLayout = isStretchedLayout ? 'stretched' : 'normal';\n                var actionbar = $(templates.actionbar({ buttonLayout: buttonLayout }));\n                this._addButtons(actionbar);\n                if (isStretchedLayout && !CSSFLEXBOX) {\n                    this._normalizeButtonSize(actionbar);\n                }\n                wrapper.append(actionbar);\n            },\n            _addButtons: function (actionbar) {\n                var that = this, o = that.options, actionClick = proxy(that._actionClick, that), actionKeyHandler = proxy(that._actionKeyHandler, that), actions = that.options.actions, length = actions.length, buttonSize = Math.round(HUNDREDPERCENT / length), action, text;\n                for (var i = 0; i < length; i++) {\n                    action = actions[i];\n                    text = that._mergeTextWithOptions(action);\n                    var btn = $(templates.action(action)).autoApplyNS(NS).html(text).appendTo(actionbar).data('action', action.action).on('click', actionClick).on('keydown', actionKeyHandler);\n                    if (o.buttonLayout === 'stretched' && !CSSFLEXBOX) {\n                        if (i == length - 1) {\n                            buttonSize = HUNDREDPERCENT - i * buttonSize;\n                        }\n                        btn.css(WIDTH, buttonSize + '%');\n                    }\n                }\n            },\n            _mergeTextWithOptions: function (action) {\n                var text = action.text;\n                return text ? template(text)(this.options) : '';\n            },\n            _normalizeButtonSize: function (actionbar) {\n                var that = this, options = that.options, lastButton = actionbar.children(KBUTTON + ':last'), currentSize = parseFloat(lastButton[0] ? lastButton[0].style[WIDTH] : 0), difference = HUNDREDPERCENT - options.actions.length * currentSize;\n                if (difference > 0) {\n                    lastButton.css(WIDTH, currentSize + difference + '%');\n                }\n            },\n            _tabindex: function (target) {\n                var that = this;\n                var wrapper = that.wrapper;\n                var closeBtn = wrapper.find(KICONCLOSE);\n                var actionButtons = wrapper.find(KBUTTONGROUP + ' ' + KBUTTON);\n                Widget.fn._tabindex.call(this, target);\n                var tabIndex = target.attr('tabindex');\n                closeBtn.attr('tabIndex', tabIndex);\n                actionButtons.attr('tabIndex', tabIndex);\n            },\n            _actionClick: function (e) {\n                if (this.wrapper.is(VISIBLE)) {\n                    this._runActionBtn(e.currentTarget);\n                }\n            },\n            _actionKeyHandler: function (e) {\n                if (buttonKeyTrigger(e)) {\n                    this._runActionBtn(e.currentTarget);\n                } else if (e.keyCode == keys.ESC) {\n                    this.close(false);\n                }\n            },\n            _runActionBtn: function (target) {\n                var that = this;\n                if (that._closing) {\n                    return;\n                }\n                var action = $(target).data('action'), preventClose = isFunction(action) && action({ sender: that }) === false;\n                if (!preventClose) {\n                    that.close(false);\n                }\n            },\n            _triggerOpen: function () {\n                var that = this;\n                var options = that.options;\n                var wrapper = that.wrapper;\n                that.toFront();\n                that._triggerInitOpen();\n                that.trigger(OPEN);\n                if (options.modal) {\n                    that._overlay(wrapper.is(VISIBLE)).css({ opacity: 0.5 });\n                    that._focusDialog();\n                }\n            },\n            open: function () {\n                var that = this, wrapper = that.wrapper, showOptions = this._animationOptions(OPEN), options = that.options, overlay, otherModalsVisible;\n                this._triggerInitOpen();\n                if (!that.trigger(OPEN)) {\n                    if (that._closing) {\n                        wrapper.kendoStop(true, true);\n                    }\n                    that._closing = false;\n                    that.toFront();\n                    options.visible = true;\n                    if (options.modal) {\n                        otherModalsVisible = !!that._modals().length;\n                        overlay = that._overlay(otherModalsVisible);\n                        overlay.kendoStop(true, true);\n                        if (showOptions.duration && kendo.effects.Fade && !otherModalsVisible) {\n                            var overlayFx = kendo.fx(overlay).fadeIn();\n                            overlayFx.duration(showOptions.duration || 0);\n                            overlayFx.endValue(0.5);\n                            overlayFx.play();\n                        } else {\n                            overlay.css('opacity', 0.5);\n                        }\n                        overlay.show();\n                    }\n                    wrapper.show().kendoStop().kendoAnimate({\n                        effects: showOptions.effects,\n                        duration: showOptions.duration,\n                        complete: proxy(that._openAnimationEnd, that)\n                    });\n                    wrapper.show();\n                }\n                return that;\n            },\n            _animationOptions: function (id) {\n                var animation = this.options.animation;\n                var basicAnimation = {\n                    open: { effects: {} },\n                    close: {\n                        hide: true,\n                        effects: {}\n                    }\n                };\n                return animation && animation[id] || basicAnimation[id];\n            },\n            _openAnimationEnd: function () {\n                if (this.options.modal) {\n                    this._focusDialog();\n                }\n                this.trigger(SHOW);\n            },\n            _triggerInitOpen: function () {\n                if (!defined(this._initOpenTriggered)) {\n                    this._initOpenTriggered = true;\n                    this.trigger(INITOPEN);\n                }\n            },\n            toFront: function () {\n                var that = this, wrapper = that.wrapper, zIndex = +wrapper.css(ZINDEX), originalZIndex = zIndex;\n                that.center();\n                $(KWINDOW).each(function (i, element) {\n                    var windowObject = $(element), zIndexNew = windowObject.css(ZINDEX);\n                    if (!isNaN(zIndexNew)) {\n                        zIndex = Math.max(+zIndexNew, zIndex);\n                    }\n                });\n                if (!wrapper[0].style.zIndex || originalZIndex < zIndex) {\n                    wrapper.css(ZINDEX, zIndex + 2);\n                }\n                that.element.find('> .k-overlay').remove();\n                wrapper = null;\n                return that;\n            },\n            close: function (systemTriggered) {\n                if (!arguments.length) {\n                    systemTriggered = true;\n                }\n                this._close(systemTriggered);\n                this._stopCenterOnResize();\n                return this;\n            },\n            _close: function (systemTriggered) {\n                var that = this, wrapper = that.wrapper, options = that.options, showOptions = this._animationOptions('open'), hideOptions = this._animationOptions('close');\n                if (wrapper.is(VISIBLE) && !that.trigger(CLOSE, { userTriggered: !systemTriggered })) {\n                    if (that._closing) {\n                        return;\n                    }\n                    that._closing = true;\n                    options.visible = false;\n                    this._removeOverlay();\n                    wrapper.kendoStop().kendoAnimate({\n                        effects: hideOptions.effects || showOptions.effects,\n                        reverse: hideOptions.reverse === true,\n                        duration: hideOptions.duration,\n                        complete: proxy(this._closeAnimationEnd, this)\n                    });\n                }\n                return that;\n            },\n            center: function () {\n                this._center();\n                this._centerOnResize();\n            },\n            _center: function () {\n                var that = this, wrapper = that.wrapper, documentWindow = $(window), scrollTop = 0, scrollLeft = 0, newLeft = scrollLeft + Math.max(0, (documentWindow.width() - wrapper.width()) / 2), newTop = scrollTop + Math.max(0, (documentWindow.height() - wrapper.height() - parseInt(wrapper.css('paddingTop'), 10)) / 2);\n                wrapper.css({\n                    left: newLeft,\n                    top: newTop\n                });\n                return that;\n            },\n            _centerOnResize: function () {\n                if (this._trackResize) {\n                    return;\n                }\n                kendo.onResize(this._centerCallback);\n                this._trackResize = true;\n            },\n            _stopCenterOnResize: function () {\n                kendo.unbindResize(this._centerCallback);\n                this._trackResize = false;\n            },\n            _removeOverlay: function () {\n                var modals = this._modals();\n                var options = this.options;\n                var hideOverlay = options.modal && !modals.length;\n                if (hideOverlay) {\n                    this._overlay(false).remove();\n                    if (options.modal.preventScroll) {\n                        this._enableDocumentScrolling();\n                    }\n                } else if (modals.length) {\n                    this._object(modals.last())._overlay(true);\n                    if (options.modal.preventScroll) {\n                        this._stopDocumentScrolling();\n                    }\n                }\n            },\n            _stopDocumentScrolling: function () {\n                var that = this;\n                var $body = $('body');\n                that._storeOverflowRule($body);\n                $body.css(OVERFLOW, HIDDEN);\n                var $html = $('html');\n                var html = $html[0];\n                that._storeOverflowRule($html);\n                $html.css(OVERFLOW, HIDDEN);\n                if (kendo.support.mobileOS.ios) {\n                    html.addEventListener(TOUCHSTART, that._touchStart, { passive: false });\n                    html.addEventListener(TOUCHMOVE, that._touchMove, { passive: false });\n                }\n            },\n            _touchStart: function (e) {\n                $(this).data(DATAHTMLTAPYRULE, e.changedTouches[0].pageY);\n            },\n            _touchMove: function (e) {\n                var target = e.target;\n                var $target = $(e.target);\n                var upScroll = e.changedTouches[0].pageY - $(this).data(DATAHTMLTAPYRULE) > 0;\n                var preventYScroll = $target.is(KCONTENTSELECTOR) && (upScroll && $target.scrollTop() === 0) || !upScroll && $target.scrollTop() === target.scrollHeight - target.clientHeight;\n                if (!$target.is(KCONTENTSELECTOR) || preventYScroll) {\n                    e.preventDefault();\n                }\n            },\n            _enableDocumentScrolling: function () {\n                var that = this;\n                var $body = $(document.body);\n                var $html = $('html');\n                var html = $html[0];\n                that._restoreOverflowRule($body);\n                that._restoreOverflowRule($html);\n                if (kendo.support.mobileOS.ios) {\n                    $html.removeData(DATAHTMLTAPYRULE);\n                    html.removeEventListener(TOUCHSTART, that._touchStart, { passive: false });\n                    html.removeEventListener(TOUCHMOVE, that._touchMove, { passive: false });\n                }\n            },\n            _storeOverflowRule: function ($element) {\n                if (this._isOverflowStored($element)) {\n                    return;\n                }\n                var overflowRule = $element.get(0).style.overflow;\n                if (typeof overflowRule === 'string') {\n                    $element.data(DATADOCOVERFLOWRULE, overflowRule);\n                }\n            },\n            _isOverflowStored: function ($element) {\n                return typeof $element.data(DATADOCOVERFLOWRULE) === 'string';\n            },\n            _restoreOverflowRule: function ($element) {\n                var overflowRule = $element.data(DATADOCOVERFLOWRULE);\n                if (overflowRule !== null && overflowRule !== undefined) {\n                    $element.css(OVERFLOW, overflowRule);\n                    $element.removeData(DATADOCOVERFLOWRULE);\n                } else {\n                    $element.css(OVERFLOW, '');\n                }\n            },\n            _closeAnimationEnd: function () {\n                var that = this;\n                that._closing = false;\n                that.wrapper.hide().css('opacity', '');\n                that.trigger(HIDE);\n                if (that.options.modal) {\n                    var lastModal = that._object(that._modals().last());\n                    if (lastModal) {\n                        lastModal.toFront();\n                    }\n                }\n            },\n            _modals: function () {\n                var that = this;\n                var zStack = $(KWINDOW).filter(function () {\n                    var dom = $(this);\n                    var object = that._object(dom);\n                    var options = object && object.options;\n                    return options && options.modal && that.options.appendTo == options.appendTo && options.visible && dom.is(VISIBLE);\n                }).sort(function (a, b) {\n                    return +$(a).css('zIndex') - +$(b).css('zIndex');\n                });\n                that = null;\n                return zStack;\n            },\n            _object: function (element) {\n                var content = element.children(KCONTENT);\n                var widget = kendo.widgetInstance(content);\n                if (widget) {\n                    return widget;\n                }\n                return undefined;\n            },\n            destroy: function () {\n                var that = this;\n                that._destroy();\n                Widget.fn.destroy.call(that);\n                that.wrapper.remove();\n                that.wrapper = that.element = $();\n            },\n            _destroy: function () {\n                var that = this;\n                var ns = '.' + NS;\n                that.wrapper.off(ns);\n                that.element.off(ns);\n                that.wrapper.find(KICONCLOSE + ',' + KBUTTONGROUP + ' > ' + KBUTTON).off(ns);\n                that._stopCenterOnResize();\n            },\n            title: function (html) {\n                var that = this, wrapper = that.wrapper, options = that.options, titlebar = wrapper.children(KDIALOGTITLEBAR), title = titlebar.children(KDIALOGTITLE), encodedHtml = kendo.htmlEncode(html);\n                if (!arguments.length) {\n                    return title.html();\n                }\n                if (html === false) {\n                    titlebar.remove();\n                    wrapper.addClass(KTITLELESS);\n                } else {\n                    if (!titlebar.length) {\n                        titlebar = $(templates.titlebar(options)).prependTo(wrapper);\n                        title = titlebar.children(KDIALOGTITLE);\n                        wrapper.removeClass(KTITLELESS);\n                    }\n                    title.html(encodedHtml);\n                }\n                that.options.title = encodedHtml;\n                return that;\n            },\n            content: function (html, data) {\n                var that = this, content = that.wrapper.children(KCONTENT);\n                if (!defined(html)) {\n                    return content.html();\n                }\n                this.angular('cleanup', function () {\n                    return { elements: content.children() };\n                });\n                kendo.destroy(content.children());\n                content.html(html);\n                this.angular('compile', function () {\n                    var a = [];\n                    for (var i = content.length; --i >= 0;) {\n                        a.push({ dataItem: data });\n                    }\n                    return {\n                        elements: content.children(),\n                        data: a\n                    };\n                });\n                that.options.content = html;\n                return that;\n            },\n            _focusDialog: function () {\n                if (this._defaultFocus) {\n                    this._focus(this._defaultFocus);\n                }\n                this._tabKeyTrap.trap();\n            },\n            _focus: function (node) {\n                if (node) {\n                    node.focus();\n                }\n            },\n            events: [\n                INITOPEN,\n                OPEN,\n                CLOSE,\n                SHOW,\n                HIDE\n            ],\n            options: {\n                title: '',\n                buttonLayout: 'stretched',\n                actions: [],\n                modal: true,\n                size: 'auto',\n                width: null,\n                height: null,\n                minWidth: 0,\n                minHeight: 0,\n                maxWidth: Infinity,\n                maxHeight: Infinity,\n                content: null,\n                visible: null,\n                appendTo: BODY,\n                closable: true\n            }\n        });\n        var Dialog = DialogBase.extend({\n            options: {\n                name: 'Dialog',\n                messages: { close: 'Close' }\n            }\n        });\n        kendo.ui.plugin(Dialog);\n        var PopupBox = DialogBase.extend({\n            _init: function (element, options) {\n                var that = this;\n                that.wrapperTemplate = templates.alertWrapper;\n                options._defaultFocus = null;\n                that._ensureContentId(element);\n                DialogBase.fn._init.call(that, element, options);\n                that.bind(HIDE, proxy(that.destroy, that));\n                that._ariaDescribedBy();\n                that._initFocus();\n            },\n            _ensureContentId: function (element) {\n                var node = $(element);\n                if (!node.attr('id')) {\n                    node.attr('id', kendo.guid() + '_k-popup');\n                }\n            },\n            _ariaDescribedBy: function () {\n                this.wrapper.attr('aria-describedby', this.element.attr('id'));\n            },\n            _initFocus: function () {\n                var o = this.options;\n                this._defaultFocus = this._chooseEntryFocus();\n                if (this._defaultFocus && o.visible && o.modal) {\n                    this._focusDialog();\n                }\n            },\n            _chooseEntryFocus: function () {\n                return this.wrapper.find(KBUTTONGROUP + ' > ' + KBUTTON)[0];\n            },\n            options: {\n                title: window.location.host,\n                closable: false,\n                messages: messages\n            }\n        });\n        var Alert = PopupBox.extend({\n            _init: function (element, options) {\n                var that = this;\n                PopupBox.fn._init.call(that, element, options);\n                that.wrapper.addClass(KALERT);\n            },\n            options: {\n                name: 'Alert',\n                modal: true,\n                actions: [{ text: '#: messages.okText #' }]\n            }\n        });\n        kendo.ui.plugin(Alert);\n        var kendoAlert = function (text) {\n            return $(templates.alert).kendoAlert({ content: text }).data('kendoAlert').open();\n        };\n        var Confirm = PopupBox.extend({\n            _init: function (element, options) {\n                var that = this;\n                PopupBox.fn._init.call(that, element, options);\n                that.wrapper.addClass(KCONFIRM);\n                that.result = $.Deferred();\n            },\n            options: {\n                name: 'Confirm',\n                modal: true,\n                actions: [\n                    {\n                        text: '#: messages.okText #',\n                        primary: true,\n                        action: function (e) {\n                            e.sender.result.resolve();\n                        }\n                    },\n                    {\n                        text: '#: messages.cancel #',\n                        action: function (e) {\n                            e.sender.result.reject();\n                        }\n                    }\n                ]\n            }\n        });\n        kendo.ui.plugin(Confirm);\n        var kendoConfirm = function (text) {\n            var confirmDialog = $(templates.confirm).kendoConfirm({ content: text }).data('kendoConfirm').open();\n            return confirmDialog.result;\n        };\n        var Prompt = PopupBox.extend({\n            _init: function (element, options) {\n                var that = this;\n                PopupBox.fn._init.call(that, element, options);\n                that.wrapper.addClass(KPROMPT);\n                that._createPrompt();\n                that.result = $.Deferred();\n            },\n            _createPrompt: function () {\n                var value = this.options.value, promptContainer = $(templates.promptInputContainer(this.options)).insertAfter(this.element);\n                if (value) {\n                    promptContainer.children(KTEXTBOX).val(value);\n                }\n                this._defaultFocus = this._chooseEntryFocus();\n                this._focusDialog();\n            },\n            _chooseEntryFocus: function () {\n                return this.wrapper.find(KTEXTBOX)[0];\n            },\n            options: {\n                name: 'Prompt',\n                modal: true,\n                value: '',\n                actions: [\n                    {\n                        text: '#: messages.okText #',\n                        primary: true,\n                        action: function (e) {\n                            var sender = e.sender, value = sender.wrapper.find(KTEXTBOX).val();\n                            sender.result.resolve(value);\n                        }\n                    },\n                    {\n                        text: '#: messages.cancel #',\n                        action: function (e) {\n                            var sender = e.sender, value = sender.wrapper.find(KTEXTBOX).val();\n                            e.sender.result.reject(value);\n                        }\n                    }\n                ]\n            }\n        });\n        kendo.ui.plugin(Prompt);\n        var kendoPrompt = function (text, value) {\n            var promptDialog = $(templates.prompt).kendoPrompt({\n                content: text,\n                value: value\n            }).data('kendoPrompt').open();\n            return promptDialog.result;\n        };\n        templates = {\n            wrapper: template('<div class=\\'k-widget k-window k-dialog\\' role=\\'dialog\\' />'),\n            action: template('<button type=\\'button\\' class=\\'k-button# if (data.primary) { # k-primary# } role=\\'button\\' #\\'></button>'),\n            titlebar: template('<div class=\\'k-window-titlebar k-dialog-titlebar k-header\\'>' + '<span class=\\'k-window-title k-dialog-title\\'>#: title #</span>' + '<div class=\\'k-window-actions k-dialog-actions\\' />' + '</div>'),\n            close: template('<a role=\\'button\\' href=\\'\\\\#\\' class=\\'k-button k-bare k-button-icon k-window-action k-dialog-action k-dialog-close\\' title=\\'#: messages.close #\\' aria-label=\\'#: messages.close #\\' tabindex=\\'-1\\'><span class=\\'k-icon k-i-close\\'></span></a>'),\n            actionbar: template('<div class=\\'k-dialog-buttongroup k-dialog-button-layout-#: buttonLayout #\\' role=\\'toolbar\\' />'),\n            overlay: '<div class=\\'k-overlay\\' />',\n            alertWrapper: template('<div class=\\'k-widget k-window k-dialog\\' role=\\'alertdialog\\' />'),\n            alert: '<div />',\n            confirm: '<div />',\n            prompt: '<div />',\n            promptInputContainer: template('<div class=\\'k-prompt-container\\'><input type=\\'text\\' class=\\'k-textbox\\' title=\\'#: messages.promptInput #\\' aria-label=\\'#: messages.promptInput #\\' /></div>')\n        };\n        kendo.alert = kendoAlert;\n        kendo.confirm = kendoConfirm;\n        kendo.prompt = kendoPrompt;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.window', [\n        'kendo.draganddrop',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'window',\n        name: 'Window',\n        category: 'web',\n        description: 'The Window widget displays content in a modal or non-modal HTML window.',\n        depends: [\n            'draganddrop',\n            'popup'\n        ],\n        features: [{\n                id: 'window-fx',\n                name: 'Animation',\n                description: 'Support for animation',\n                depends: ['fx']\n            }]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, TabKeyTrap = kendo.ui.Popup.TabKeyTrap, Draggable = kendo.ui.Draggable, isPlainObject = $.isPlainObject, activeElement = kendo._activeElement, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, proxy = $.proxy, extend = $.extend, each = $.each, template = kendo.template, BODY = 'body', templates, NS = '.kendoWindow', MODAL_NS = '.kendoWindowModal', KWINDOW = '.k-window', KWINDOWTITLE = '.k-window-title', KWINDOWTITLEBAR = KWINDOWTITLE + 'bar', KWINDOWCONTENT = '.k-window-content', KDIALOGCONTENT = '.k-dialog-content', KWINDOWRESIZEHANDLES = '.k-resize-handle', KOVERLAY = '.k-overlay', KCONTENTFRAME = 'k-content-frame', LOADING = 'k-i-loading', KHOVERSTATE = 'k-state-hover', KFOCUSEDSTATE = 'k-state-focused', MAXIMIZEDSTATE = 'k-window-maximized', VISIBLE = ':visible', HIDDEN = 'hidden', CURSOR = 'cursor', OPEN = 'open', ACTIVATE = 'activate', DEACTIVATE = 'deactivate', CLOSE = 'close', REFRESH = 'refresh', MINIMIZE = 'minimize', MAXIMIZE = 'maximize', RESIZESTART = 'resizeStart', RESIZE = 'resize', RESIZEEND = 'resizeEnd', DRAGSTART = 'dragstart', DRAGEND = 'dragend', ERROR = 'error', OVERFLOW = 'overflow', DATADOCOVERFLOWRULE = 'original-overflow-rule', ZINDEX = 'zIndex', MINIMIZE_MAXIMIZE = '.k-window-actions .k-i-window-minimize,.k-window-actions .k-i-window-maximize', KPIN = '.k-i-pin', KUNPIN = '.k-i-unpin', PIN_UNPIN = KPIN + ',' + KUNPIN, TITLEBAR_BUTTONS = '.k-window-titlebar .k-window-action', REFRESHICON = '.k-window-titlebar .k-i-refresh', WINDOWEVENTSHANDLED = 'WindowEventsHandled', zero = /^0[a-z]*$/i, isLocalUrl = kendo.isLocalUrl, SIZE = {\n                small: 'k-window-sm',\n                medium: 'k-window-md',\n                large: 'k-window-lg'\n            };\n        function defined(x) {\n            return typeof x != 'undefined';\n        }\n        function toInt(element, property) {\n            return parseInt(element.css(property), 10) || 0;\n        }\n        function constrain(value, low, high) {\n            var normalizedValue;\n            if (value && isNaN(value) && value.toString().indexOf('px') < 0) {\n                normalizedValue = value;\n            } else {\n                normalizedValue = Math.max(Math.min(parseInt(value, 10), high === Infinity ? high : parseInt(high, 10)), low === -Infinity ? low : parseInt(low, 10));\n            }\n            return normalizedValue;\n        }\n        function executableScript() {\n            return !this.type || this.type.toLowerCase().indexOf('script') >= 0;\n        }\n        function getPosition(elem) {\n            var result = {\n                    top: elem.offsetTop,\n                    left: elem.offsetLeft\n                }, parent = elem.offsetParent;\n            while (parent) {\n                result.top += parent.offsetTop;\n                result.left += parent.offsetLeft;\n                var parentOverflowX = $(parent).css('overflowX');\n                var parentOverflowY = $(parent).css('overflowY');\n                if (parentOverflowY === 'auto' || parentOverflowY === 'scroll') {\n                    result.top -= parent.scrollTop;\n                }\n                if (parentOverflowX === 'auto' || parentOverflowX === 'scroll') {\n                    result.left -= parent.scrollLeft;\n                }\n                parent = parent.offsetParent;\n            }\n            return result;\n        }\n        var Window = Widget.extend({\n            init: function (element, options) {\n                var that = this, wrapper, offset = {}, visibility, display, position, isVisible = false, content, windowContent, windowFrame, globalWindow, suppressActions = options && options.actions && !options.actions.length, id;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                position = options.position;\n                element = that.element;\n                content = options.content;\n                globalWindow = $(window);\n                if (suppressActions) {\n                    options.actions = [];\n                }\n                that.appendTo = $(options.appendTo);\n                that.containment = options.draggable.containment ? $(options.draggable.containment).first() : null;\n                if (content && !isPlainObject(content)) {\n                    content = options.content = { url: content };\n                }\n                element.find('script').filter(executableScript).remove();\n                if (!element.parent().is(that.appendTo) && !that.containment && (position.top === undefined || position.left === undefined)) {\n                    if (element.is(VISIBLE)) {\n                        offset = element.offset();\n                        isVisible = true;\n                    } else {\n                        visibility = element.css('visibility');\n                        display = element.css('display');\n                        element.css({\n                            visibility: HIDDEN,\n                            display: ''\n                        });\n                        offset = element.offset();\n                        element.css({\n                            visibility: visibility,\n                            display: display\n                        });\n                    }\n                    if (position.top === undefined) {\n                        position.top = offset.top;\n                    }\n                    if (position.left === undefined) {\n                        position.left = offset.left;\n                    }\n                }\n                if (!defined(options.visible) || options.visible === null) {\n                    options.visible = element.is(VISIBLE);\n                }\n                wrapper = that.wrapper = element.closest(KWINDOW);\n                if (!element.is('.k-content') || !wrapper[0]) {\n                    element.addClass('k-window-content k-content');\n                    that._createWindow(element, options);\n                    wrapper = that.wrapper = element.closest(KWINDOW);\n                    that.title(that.options.title);\n                    that._dimensions();\n                }\n                that.minTop = that.minLeft = -Infinity;\n                that.maxTop = that.maxLeft = Infinity;\n                that._position();\n                if (content) {\n                    that.refresh(content);\n                }\n                if (options.visible) {\n                    that.toFront();\n                }\n                windowContent = wrapper.children(KWINDOWCONTENT);\n                that._tabindex(windowContent);\n                if (options.visible && options.modal) {\n                    that._overlay(wrapper.is(VISIBLE)).css({ opacity: 0.5 });\n                }\n                wrapper.on('mouseenter' + NS, TITLEBAR_BUTTONS, proxy(that._buttonEnter, that)).on('mouseleave' + NS, TITLEBAR_BUTTONS, proxy(that._buttonLeave, that)).on('click' + NS, '> ' + TITLEBAR_BUTTONS, proxy(that._windowActionHandler, that)).on('keydown' + NS, proxy(that._keydown, that)).on('focus' + NS, proxy(that._focus, that)).on('blur' + NS, proxy(that._blur, that));\n                windowContent.on('keydown' + NS, proxy(that._keydown, that)).on('focus' + NS, proxy(that._focus, that)).on('blur' + NS, proxy(that._blur, that));\n                windowFrame = windowContent.find('.' + KCONTENTFRAME)[0];\n                if (windowFrame && !globalWindow.data(WINDOWEVENTSHANDLED)) {\n                    globalWindow.on('blur' + NS, function () {\n                        var element = $(document.activeElement).parent(KWINDOWCONTENT);\n                        if (element.length) {\n                            var windowInstance = kendo.widgetInstance(element);\n                            windowInstance._focus();\n                        }\n                    });\n                    globalWindow.on('focus' + NS, function () {\n                        $(KWINDOWCONTENT).not(KDIALOGCONTENT).each(function (i, element) {\n                            kendo.widgetInstance($(element))._blur();\n                        });\n                    });\n                    globalWindow.data(WINDOWEVENTSHANDLED, true);\n                }\n                this._resizable();\n                this._draggable();\n                if (options.pinned && this.wrapper.is(':visible')) {\n                    that.pin();\n                }\n                id = element.attr('id');\n                if (id) {\n                    id = id + '_wnd_title';\n                    wrapper.children(KWINDOWTITLEBAR).children(KWINDOWTITLE).attr('id', id);\n                    windowContent.attr({\n                        'role': 'dialog',\n                        'aria-labelledby': id\n                    });\n                }\n                wrapper.add(wrapper.children('.k-resize-handle,' + KWINDOWTITLEBAR)).on('mousedown' + NS, proxy(that.toFront, that));\n                that.touchScroller = kendo.touchScroller(element);\n                that._resizeHandler = proxy(that._onDocumentResize, that);\n                that._marker = kendo.guid().substring(0, 8);\n                $(window).on('resize' + NS + that._marker, that._resizeHandler);\n                if (options.visible) {\n                    that.trigger(OPEN);\n                    that.trigger(ACTIVATE);\n                }\n                kendo.notify(that);\n                if (this.options.modal) {\n                    this._tabKeyTrap = new TabKeyTrap(wrapper);\n                    this._tabKeyTrap.trap();\n                    this._tabKeyTrap.shouldTrap = function () {\n                        return windowContent.data('isFront');\n                    };\n                }\n            },\n            _buttonEnter: function (e) {\n                $(e.currentTarget).addClass(KHOVERSTATE);\n            },\n            _buttonLeave: function (e) {\n                $(e.currentTarget).removeClass(KHOVERSTATE);\n            },\n            _focus: function () {\n                this.wrapper.addClass(KFOCUSEDSTATE);\n            },\n            _blur: function () {\n                this.wrapper.removeClass(KFOCUSEDSTATE);\n            },\n            _dimensions: function () {\n                var wrapper = this.wrapper;\n                var options = this.options;\n                var width = options.width;\n                var height = options.height;\n                var maxHeight = options.maxHeight;\n                var sizeClass = options.size;\n                var dimensions = [\n                    'minWidth',\n                    'minHeight',\n                    'maxWidth',\n                    'maxHeight'\n                ];\n                var contentBoxSizing = wrapper.css('box-sizing') == 'content-box';\n                var lrBorderWidth = contentBoxSizing ? toInt(wrapper, 'border-left-width') + toInt(wrapper, 'border-right-width') : 0;\n                var tbBorderWidth = contentBoxSizing ? toInt(wrapper, 'border-top-width') + toInt(wrapper, 'border-bottom-width') : 0;\n                var paddingTop = contentBoxSizing ? toInt(wrapper, 'padding-top') : 0;\n                if (this.containment && !this._isPinned) {\n                    this._updateBoundaries();\n                    options.maxHeight = Math.min(this.containment.height - (tbBorderWidth + paddingTop), maxHeight);\n                    options.maxWidth = Math.min(this.containment.width - lrBorderWidth, options.maxWidth);\n                }\n                for (var i = 0; i < dimensions.length; i++) {\n                    var value = options[dimensions[i]] || '';\n                    if (value != Infinity) {\n                        wrapper.css(dimensions[i], value);\n                    }\n                }\n                if (maxHeight != Infinity) {\n                    this.element.css('maxHeight', maxHeight);\n                }\n                if (width) {\n                    wrapper.width(constrain(width, options.minWidth, options.maxWidth));\n                } else {\n                    wrapper.width('');\n                }\n                if (height) {\n                    wrapper.height(constrain(height, options.minHeight, options.maxHeight));\n                } else {\n                    wrapper.height('');\n                }\n                if (!options.visible) {\n                    wrapper.hide();\n                }\n                if (sizeClass && SIZE[sizeClass]) {\n                    wrapper.addClass(SIZE[sizeClass]);\n                }\n            },\n            _position: function () {\n                var wrapper = this.wrapper, position = this.options.position;\n                this._updateBoundaries();\n                if (this.containment) {\n                    position.top = Math.min(this.minTop + (position.top || 0), this.maxTop);\n                    position.left = Math.min(this.minLeft + (position.left || 0), this.maxLeft);\n                }\n                if (position.top === 0) {\n                    position.top = position.top.toString();\n                }\n                if (position.left === 0) {\n                    position.left = position.left.toString();\n                }\n                wrapper.css({\n                    top: position.top || '',\n                    left: position.left || ''\n                });\n            },\n            _updateBoundaries: function () {\n                var containment = this.containment;\n                if (!containment) {\n                    return null;\n                }\n                containment.width = containment.innerWidth();\n                containment.height = containment.innerHeight();\n                if (parseInt(containment.width, 10) > containment[0].clientWidth) {\n                    containment.width -= kendo.support.scrollbar();\n                }\n                if (parseInt(containment.height, 10) > containment[0].clientHeight) {\n                    containment.height -= kendo.support.scrollbar();\n                }\n                containment.position = getPosition(containment[0]);\n                if (this._isPinned) {\n                    this.minTop = this.minLeft = -Infinity;\n                    this.maxTop = this.maxLeft = Infinity;\n                } else {\n                    this.minTop = containment.scrollTop();\n                    this.minLeft = containment.scrollLeft();\n                    this.maxLeft = this.minLeft + containment.width - outerWidth(this.wrapper, true);\n                    this.maxTop = this.minTop + containment.height - outerHeight(this.wrapper, true);\n                }\n            },\n            _animationOptions: function (id) {\n                var animation = this.options.animation;\n                var basicAnimation = {\n                    open: { effects: {} },\n                    close: {\n                        hide: true,\n                        effects: {}\n                    }\n                };\n                return animation && animation[id] || basicAnimation[id];\n            },\n            _resize: function () {\n                kendo.resize(this.element.children());\n            },\n            _resizable: function () {\n                var resizable = this.options.resizable;\n                var wrapper = this.wrapper;\n                if (this.resizing) {\n                    wrapper.off('dblclick' + NS).children(KWINDOWRESIZEHANDLES).remove();\n                    this.resizing.destroy();\n                    this.resizing = null;\n                }\n                if (resizable) {\n                    wrapper.on('dblclick' + NS, KWINDOWTITLEBAR, proxy(function (e) {\n                        if (!$(e.target).closest('.k-window-action').length) {\n                            this.toggleMaximization();\n                        }\n                    }, this));\n                    each('n e s w se sw ne nw'.split(' '), function (index, handler) {\n                        wrapper.append(templates.resizeHandle(handler));\n                    });\n                    this.resizing = new WindowResizing(this);\n                }\n                wrapper = null;\n            },\n            _draggable: function () {\n                var draggable = this.options.draggable;\n                if (this.dragging) {\n                    this.dragging.destroy();\n                    this.dragging = null;\n                }\n                if (draggable) {\n                    this.dragging = new WindowDragging(this, draggable.dragHandle || KWINDOWTITLEBAR);\n                }\n            },\n            _actions: function () {\n                var options = this.options;\n                var actions = options.actions;\n                var pinned = options.pinned;\n                var titlebar = this.wrapper.children(KWINDOWTITLEBAR);\n                var container = titlebar.find('.k-window-actions');\n                var windowSpecificCommands = [\n                    'maximize',\n                    'minimize'\n                ];\n                actions = $.map(actions, function (action) {\n                    action = pinned && action.toLowerCase() === 'pin' ? 'unpin' : action;\n                    return { name: windowSpecificCommands.indexOf(action.toLowerCase()) > -1 ? 'window-' + action : action };\n                });\n                container.html(kendo.render(templates.action, actions));\n            },\n            setOptions: function (options) {\n                var that = this;\n                var sizeClass = that.options.size;\n                var cachedOptions = JSON.parse(JSON.stringify(options));\n                extend(options.position, that.options.position);\n                extend(options.position, cachedOptions.position);\n                Widget.fn.setOptions.call(that, options);\n                var scrollable = that.options.scrollable !== false;\n                that.restore();\n                if (typeof options.title !== 'undefined') {\n                    that.title(options.title);\n                }\n                that.wrapper.removeClass(SIZE[sizeClass]);\n                that._dimensions();\n                that._position();\n                that._resizable();\n                that._draggable();\n                that._actions();\n                if (typeof options.modal !== 'undefined') {\n                    var visible = that.options.visible !== false;\n                    that._enableDocumentScrolling();\n                    that._overlay(options.modal && visible);\n                }\n                that.element.css(OVERFLOW, scrollable ? '' : 'hidden');\n            },\n            events: [\n                OPEN,\n                ACTIVATE,\n                DEACTIVATE,\n                CLOSE,\n                MINIMIZE,\n                MAXIMIZE,\n                REFRESH,\n                RESIZESTART,\n                RESIZE,\n                RESIZEEND,\n                DRAGSTART,\n                DRAGEND,\n                ERROR\n            ],\n            options: {\n                name: 'Window',\n                animation: {\n                    open: {\n                        effects: {\n                            zoom: { direction: 'in' },\n                            fade: { direction: 'in' }\n                        },\n                        duration: 350\n                    },\n                    close: {\n                        effects: {\n                            zoom: {\n                                direction: 'out',\n                                properties: { scale: 0.7 }\n                            },\n                            fade: { direction: 'out' }\n                        },\n                        duration: 350,\n                        hide: true\n                    }\n                },\n                title: '',\n                actions: ['Close'],\n                autoFocus: true,\n                modal: false,\n                size: 'auto',\n                resizable: true,\n                draggable: true,\n                minWidth: 90,\n                minHeight: 50,\n                maxWidth: Infinity,\n                maxHeight: Infinity,\n                pinned: false,\n                scrollable: true,\n                position: {},\n                content: null,\n                visible: null,\n                height: null,\n                width: null,\n                appendTo: 'body',\n                isMaximized: false,\n                isMinimized: false\n            },\n            _closable: function () {\n                return $.inArray('close', $.map(this.options.actions, function (x) {\n                    return x.toLowerCase();\n                })) > -1;\n            },\n            _keydown: function (e) {\n                var that = this, options = that.options, keys = kendo.keys, keyCode = e.keyCode, wrapper = that.wrapper, offset, handled, distance = 10, isMaximized = options.isMaximized, isMinimized = options.isMinimized, newWidth, newHeight, w, h;\n                if (keyCode == keys.ESC && that._closable()) {\n                    e.stopPropagation();\n                    that._close(false);\n                }\n                if (e.target != e.currentTarget || that._closing) {\n                    return;\n                }\n                if (e.altKey && keyCode == 82) {\n                    that.refresh();\n                }\n                if (e.altKey && keyCode == 80) {\n                    if (that.options.pinned) {\n                        that.unpin();\n                    } else {\n                        that.pin();\n                    }\n                }\n                if (e.altKey && keyCode == keys.UP) {\n                    if (isMinimized) {\n                        that.restore();\n                        that.element.focus();\n                    } else if (!isMaximized) {\n                        that.maximize();\n                        that.element.focus();\n                    }\n                } else if (e.altKey && keyCode == keys.DOWN) {\n                    if (!isMinimized && !isMaximized) {\n                        that.minimize();\n                        that.wrapper.focus();\n                    } else if (isMaximized) {\n                        that.restore();\n                        that.element.focus();\n                    }\n                }\n                offset = kendo.getOffset(wrapper);\n                if (that.containment && !that._isPinned) {\n                    offset = that.options.position;\n                }\n                if (options.draggable && !e.ctrlKey && !e.altKey && !isMaximized) {\n                    that._updateBoundaries();\n                    if (keyCode == keys.UP) {\n                        offset.top = constrain(offset.top - distance, that.minTop, that.maxTop);\n                        handled = wrapper.css('top', offset.top);\n                    } else if (keyCode == keys.DOWN) {\n                        offset.top = constrain(offset.top + distance, that.minTop, that.maxTop);\n                        handled = wrapper.css('top', offset.top);\n                    } else if (keyCode == keys.LEFT) {\n                        offset.left = constrain(offset.left - distance, that.minLeft, that.maxLeft);\n                        handled = wrapper.css('left', offset.left);\n                    } else if (keyCode == keys.RIGHT) {\n                        offset.left = constrain(offset.left + distance, that.minLeft, that.maxLeft);\n                        handled = wrapper.css('left', offset.left);\n                    }\n                }\n                if (options.resizable && e.ctrlKey && !isMaximized && !isMinimized) {\n                    if (keyCode == keys.UP) {\n                        handled = true;\n                        newHeight = wrapper.height() - distance;\n                    } else if (keyCode == keys.DOWN) {\n                        handled = true;\n                        if (that.containment && !that._isPinned) {\n                            newHeight = Math.min(wrapper.height() + distance, that.containment.height - offset.top - toInt(wrapper, 'padding-top') - toInt(wrapper, 'borderBottomWidth') - toInt(wrapper, 'borderTopWidth'));\n                        } else {\n                            newHeight = wrapper.height() + distance;\n                        }\n                    }\n                    if (keyCode == keys.LEFT) {\n                        handled = true;\n                        newWidth = wrapper.width() - distance;\n                    } else if (keyCode == keys.RIGHT) {\n                        handled = true;\n                        if (that.containment && !that._isPinned) {\n                            newWidth = Math.min(wrapper.width() + distance, that.containment.width - offset.left - toInt(wrapper, 'borderLeftWidth') - toInt(wrapper, 'borderRightWidth'));\n                        } else {\n                            newWidth = wrapper.width() + distance;\n                        }\n                    }\n                    if (handled) {\n                        w = constrain(newWidth, options.minWidth, options.maxWidth);\n                        h = constrain(newHeight, options.minHeight, options.maxHeight);\n                        if (!isNaN(w)) {\n                            wrapper.width(w);\n                            that.options.width = w + 'px';\n                        }\n                        if (!isNaN(h)) {\n                            wrapper.height(h);\n                            that.options.height = h + 'px';\n                        }\n                        that.resize();\n                    }\n                }\n                if (handled) {\n                    e.preventDefault();\n                }\n            },\n            _overlay: function (visible) {\n                var overlay = this.containment ? this.containment.children(KOVERLAY) : this.appendTo.children(KOVERLAY), wrapper = this.wrapper;\n                if (!overlay.length) {\n                    overlay = $('<div class=\\'k-overlay\\' />');\n                }\n                overlay.insertBefore(wrapper[0]).toggle(visible).css(ZINDEX, parseInt(wrapper.css(ZINDEX), 10) - 1);\n                if (this.options.modal.preventScroll && !this.containment) {\n                    this._stopDocumentScrolling();\n                }\n                return overlay;\n            },\n            _actionForIcon: function (icon) {\n                var iconClass = /\\bk-i(-\\w+)+\\b/.exec(icon[0].className)[0];\n                return {\n                    'k-i-close': '_close',\n                    'k-i-window-maximize': 'maximize',\n                    'k-i-window-minimize': 'minimize',\n                    'k-i-window-restore': 'restore',\n                    'k-i-refresh': 'refresh',\n                    'k-i-pin': 'pin',\n                    'k-i-unpin': 'unpin'\n                }[iconClass];\n            },\n            _windowActionHandler: function (e) {\n                if (this._closing) {\n                    return;\n                }\n                var icon = $(e.target).closest('.k-window-action').find('.k-icon');\n                var action = this._actionForIcon(icon);\n                if (action) {\n                    e.preventDefault();\n                    this[action]();\n                    return false;\n                }\n            },\n            _modals: function () {\n                var that = this;\n                var zStack = $(KWINDOW).filter(function () {\n                    var dom = $(this);\n                    var object = that._object(dom);\n                    var options = object && object.options;\n                    return options && options.modal && options.visible && options.appendTo === that.options.appendTo && dom.is(VISIBLE);\n                }).sort(function (a, b) {\n                    return +$(a).css('zIndex') - +$(b).css('zIndex');\n                });\n                that = null;\n                return zStack;\n            },\n            _object: function (element) {\n                var content = element.children(KWINDOWCONTENT);\n                var widget = kendo.widgetInstance(content);\n                if (widget) {\n                    return widget;\n                }\n                return undefined;\n            },\n            center: function () {\n                var that = this, position = that.options.position, wrapper = that.wrapper, documentWindow = $(window), scrollTop = 0, scrollLeft = 0, newTop, newLeft;\n                if (that.options.isMaximized) {\n                    return that;\n                }\n                if (that.options.pinned && !that._isPinned) {\n                    that.pin();\n                }\n                if (!that.options.pinned) {\n                    scrollTop = documentWindow.scrollTop();\n                    scrollLeft = documentWindow.scrollLeft();\n                }\n                if (this.containment && !that.options.pinned) {\n                    newTop = this.minTop + (this.maxTop - this.minTop) / 2;\n                    newLeft = this.minLeft + (this.maxLeft - this.minLeft) / 2;\n                } else {\n                    that._scrollIsAppended = true;\n                    newLeft = scrollLeft + Math.max(0, (documentWindow.width() - wrapper.width()) / 2);\n                    newTop = scrollTop + Math.max(0, (documentWindow.height() - wrapper.height() - toInt(wrapper, 'paddingTop')) / 2);\n                }\n                wrapper.css({\n                    left: newLeft,\n                    top: newTop\n                });\n                position.top = newTop;\n                position.left = newLeft;\n                return that;\n            },\n            title: function (title) {\n                var that = this, value, encoded = true, wrapper = that.wrapper, titleBar = wrapper.children(KWINDOWTITLEBAR), titleElement = titleBar.children(KWINDOWTITLE), titleBarHeight, display, visibility;\n                if (!arguments.length) {\n                    return titleElement.html();\n                }\n                if ($.isPlainObject(title)) {\n                    value = typeof title.text !== 'undefined' ? title.text : '';\n                    encoded = title.encoded !== false;\n                } else {\n                    value = title;\n                }\n                if (value === false) {\n                    wrapper.addClass('k-window-titleless');\n                    wrapper.css('padding-top', 0);\n                    titleBar.remove();\n                } else {\n                    if (!titleBar.length) {\n                        wrapper.prepend(templates.titlebar({ title: encoded ? kendo.htmlEncode(value) : value }));\n                        that._actions();\n                        titleBar = wrapper.children(KWINDOWTITLEBAR);\n                    } else {\n                        titleElement.html(encoded ? kendo.htmlEncode(value) : value);\n                    }\n                    visibility = wrapper.css('visibility');\n                    display = wrapper.css('display');\n                    if (visibility === HIDDEN) {\n                        wrapper.css({ display: '' });\n                        titleBarHeight = parseInt(outerHeight(titleBar), 10);\n                        wrapper.css({ display: display });\n                    } else {\n                        wrapper.css({\n                            visibility: HIDDEN,\n                            display: ''\n                        });\n                        titleBarHeight = parseInt(outerHeight(titleBar), 10);\n                        wrapper.css({\n                            visibility: visibility,\n                            display: display\n                        });\n                    }\n                    wrapper.css('padding-top', titleBarHeight);\n                    titleBar.css('margin-top', -titleBarHeight);\n                }\n                that.options.title = value;\n                return that;\n            },\n            content: function (html, data) {\n                var content = this.wrapper.children(KWINDOWCONTENT), scrollContainer = content.children('.km-scroll-container');\n                content = scrollContainer[0] ? scrollContainer : content;\n                if (!defined(html)) {\n                    return content.html();\n                }\n                this.angular('cleanup', function () {\n                    return { elements: content.children() };\n                });\n                kendo.destroy(this.element.children());\n                content.empty().html(html);\n                this.angular('compile', function () {\n                    var a = [];\n                    for (var i = content.length; --i >= 0;) {\n                        a.push({ dataItem: data });\n                    }\n                    return {\n                        elements: content.children(),\n                        data: a\n                    };\n                });\n                return this;\n            },\n            open: function () {\n                var that = this, wrapper = that.wrapper, options = that.options, showOptions = this._animationOptions('open'), contentElement = wrapper.children(KWINDOWCONTENT), overlay, otherModalsVisible, containmentContext = this.containment && !that._isPinned, doc = containmentContext ? this.containment : $(document);\n                if (!that.trigger(OPEN)) {\n                    if (that._closing) {\n                        wrapper.kendoStop(true, true);\n                    }\n                    that._closing = false;\n                    that.toFront();\n                    if (options.autoFocus) {\n                        that.element.focus();\n                    }\n                    options.visible = true;\n                    if (options.modal) {\n                        otherModalsVisible = !!that._modals().length;\n                        overlay = that._overlay(otherModalsVisible);\n                        overlay.kendoStop(true, true);\n                        if (showOptions.duration && kendo.effects.Fade && !otherModalsVisible) {\n                            var overlayFx = kendo.fx(overlay).fadeIn();\n                            overlayFx.duration(showOptions.duration || 0);\n                            overlayFx.endValue(0.5);\n                            overlayFx.play();\n                        } else {\n                            overlay.css('opacity', 0.5);\n                        }\n                        overlay.show();\n                        $(window).on('focus' + MODAL_NS, function () {\n                            if (contentElement.data('isFront') && !$(document.activeElement).closest(contentElement).length) {\n                                that.element.focus();\n                            }\n                        });\n                    }\n                    if (!wrapper.is(VISIBLE)) {\n                        contentElement.css(OVERFLOW, HIDDEN);\n                        that.wrapper.find(TITLEBAR_BUTTONS).addClass('k-bare');\n                        wrapper.show().kendoStop().kendoAnimate({\n                            effects: showOptions.effects,\n                            duration: showOptions.duration,\n                            complete: proxy(this._activate, this)\n                        });\n                    }\n                }\n                if (options.isMaximized) {\n                    that._containerScrollTop = doc.scrollTop();\n                    that._containerScrollLeft = doc.scrollLeft();\n                    that._stopDocumentScrolling();\n                }\n                if (this.options.pinned && !this._isPinned) {\n                    this.pin();\n                }\n                return that;\n            },\n            _activate: function () {\n                var scrollable = this.options.scrollable !== false;\n                if (this.options.autoFocus) {\n                    this.element.focus();\n                }\n                this.element.css(OVERFLOW, scrollable ? '' : 'hidden');\n                kendo.resize(this.element.children());\n                this.trigger(ACTIVATE);\n            },\n            _removeOverlay: function (suppressAnimation) {\n                var modals = this._modals();\n                var options = this.options;\n                var hideOverlay = options.modal && !modals.length;\n                var overlay = options.modal ? this._overlay(true) : $(undefined);\n                var hideOptions = this._animationOptions('close');\n                if (hideOverlay) {\n                    if (!suppressAnimation && hideOptions.duration && kendo.effects.Fade) {\n                        var overlayFx = kendo.fx(overlay).fadeOut();\n                        overlayFx.duration(hideOptions.duration || 0);\n                        overlayFx.startValue(0.5);\n                        overlayFx.play();\n                    } else {\n                        this._overlay(false).remove();\n                    }\n                    if (options.modal.preventScroll) {\n                        this._enableDocumentScrolling();\n                    }\n                } else if (modals.length) {\n                    this._object(modals.last())._overlay(true);\n                    if (options.modal.preventScroll) {\n                        this._stopDocumentScrolling();\n                    }\n                }\n            },\n            _close: function (systemTriggered) {\n                var that = this, wrapper = that.wrapper, options = that.options, showOptions = this._animationOptions('open'), hideOptions = this._animationOptions('close'), containmentContext = this.containment && !that._isPinned, doc = containmentContext ? this.containment : $(document), defaultPrevented;\n                if (that._closing) {\n                    return;\n                }\n                defaultPrevented = that.trigger(CLOSE, { userTriggered: !systemTriggered });\n                that._closing = !defaultPrevented;\n                if (wrapper.is(VISIBLE) && !defaultPrevented) {\n                    options.visible = false;\n                    $(KWINDOW).each(function (i, element) {\n                        var contentElement = $(element).children(KWINDOWCONTENT);\n                        if (element != wrapper && contentElement.find('> .' + KCONTENTFRAME).length > 0) {\n                            contentElement.children(KOVERLAY).remove();\n                        }\n                    });\n                    this._removeOverlay();\n                    that.wrapper.find(TITLEBAR_BUTTONS).removeClass('k-bare');\n                    wrapper.kendoStop().kendoAnimate({\n                        effects: hideOptions.effects || showOptions.effects,\n                        reverse: hideOptions.reverse === true,\n                        duration: hideOptions.duration,\n                        complete: proxy(this._deactivate, this)\n                    });\n                    $(window).off(MODAL_NS);\n                }\n                if (that.options.isMaximized) {\n                    that._enableDocumentScrolling();\n                    if (that._containerScrollTop && that._containerScrollTop > 0) {\n                        doc.scrollTop(that._containerScrollTop);\n                    }\n                    if (that._containerScrollLeft && that._containerScrollLeft > 0) {\n                        doc.scrollLeft(that._containerScrollLeft);\n                    }\n                }\n            },\n            _deactivate: function () {\n                var that = this;\n                that.wrapper.hide().css('opacity', '');\n                that.trigger(DEACTIVATE);\n                if (that.options.modal) {\n                    var lastModal = that._object(that._modals().last());\n                    if (lastModal) {\n                        lastModal.toFront();\n                    }\n                }\n            },\n            close: function () {\n                this._close(true);\n                return this;\n            },\n            _actionable: function (element) {\n                return $(element).is(TITLEBAR_BUTTONS + ',' + TITLEBAR_BUTTONS + ' .k-icon,:input,a');\n            },\n            _shouldFocus: function (target) {\n                var active = activeElement(), element = this.element;\n                return this.options.autoFocus && !$(active).is(element) && !this._actionable(target) && (!element.find(active).length || !element.find(target).length);\n            },\n            toFront: function (e) {\n                var that = this, wrapper = that.wrapper, currentWindow = wrapper[0], containmentContext = that.containment && !that._isPinned, zIndex = +wrapper.css(ZINDEX), originalZIndex = zIndex, target = e && e.target || null;\n                $(KWINDOW).each(function (i, element) {\n                    var windowObject = $(element), zIndexNew = windowObject.css(ZINDEX), contentElement = windowObject.children(KWINDOWCONTENT);\n                    if (!isNaN(zIndexNew)) {\n                        zIndex = Math.max(+zIndexNew, zIndex);\n                    }\n                    contentElement.data('isFront', element == currentWindow);\n                    if (element != currentWindow && contentElement.find('> .' + KCONTENTFRAME).length > 0) {\n                        contentElement.append(templates.overlay);\n                    }\n                });\n                if (!wrapper[0].style.zIndex || originalZIndex < zIndex) {\n                    wrapper.css(ZINDEX, zIndex + 2);\n                }\n                that.element.find('> .k-overlay').remove();\n                if (that._shouldFocus(target)) {\n                    if (that.isMinimized()) {\n                        that.wrapper.focus();\n                    } else if ($(target).is(KOVERLAY)) {\n                        setTimeout(function () {\n                            that.element.focus();\n                        });\n                    } else {\n                        that.element.focus();\n                    }\n                    var scrollTop = containmentContext ? that.containment.scrollTop() : $(window).scrollTop(), windowTop = parseInt(wrapper.position().top, 10);\n                    if (!that.options.pinned && windowTop > 0 && windowTop < scrollTop) {\n                        if (scrollTop > 0) {\n                            $(window).scrollTop(windowTop);\n                        } else {\n                            wrapper.css('top', scrollTop);\n                        }\n                    }\n                }\n                wrapper = null;\n                return that;\n            },\n            toggleMaximization: function () {\n                if (this._closing) {\n                    return this;\n                }\n                return this[this.options.isMaximized ? 'restore' : 'maximize']();\n            },\n            restore: function () {\n                var that = this;\n                var options = that.options;\n                var minHeight = options.minHeight;\n                var restoreOptions = that.restoreOptions;\n                var shouldRestrictTop;\n                var container = that.containment && !that._isPinned ? that.containment : $(document);\n                if (!options.isMaximized && !options.isMinimized) {\n                    return that;\n                }\n                if (minHeight && minHeight != Infinity) {\n                    that.wrapper.css('min-height', minHeight);\n                }\n                if (restoreOptions && !options.isMaximized) {\n                    restoreOptions.height = constrain(restoreOptions.height, that.options.minHeight, that.options.maxHeight);\n                    shouldRestrictTop = options.position.top + parseInt(restoreOptions.height, 10) > that.maxTop;\n                    if (shouldRestrictTop) {\n                        options.position.top = constrain(options.position.top, that.minTop, that.maxTop - parseInt(restoreOptions.height, 10));\n                        extend(restoreOptions, {\n                            left: options.position.left,\n                            top: options.position.top\n                        });\n                    }\n                }\n                that.wrapper.css({\n                    position: options.pinned ? 'fixed' : 'absolute',\n                    left: restoreOptions.left,\n                    top: restoreOptions.top,\n                    width: restoreOptions.width,\n                    height: restoreOptions.height\n                }).removeClass(MAXIMIZEDSTATE).find('.k-window-content,.k-resize-handle').show().end().find('.k-window-titlebar .k-i-window-restore').parent().remove().end().end().find(MINIMIZE_MAXIMIZE).parent().show().end().end().find(PIN_UNPIN).parent().show();\n                if (options.isMaximized) {\n                    that.wrapper.find('.k-i-window-maximize').parent().focus();\n                } else if (options.isMinimized) {\n                    that.wrapper.find('.k-i-window-minimize').parent().focus();\n                }\n                that.options.width = restoreOptions.width;\n                that.options.height = restoreOptions.height;\n                if (!that.options.modal.preventScroll) {\n                    that._enableDocumentScrolling();\n                }\n                if (that._containerScrollTop && that._containerScrollTop > 0) {\n                    container.scrollTop(that._containerScrollTop);\n                }\n                if (that._containerScrollLeft && that._containerScrollLeft > 0) {\n                    container.scrollLeft(that._containerScrollLeft);\n                }\n                options.isMaximized = options.isMinimized = false;\n                that.wrapper.removeAttr('tabindex');\n                that.wrapper.removeAttr('aria-labelled-by');\n                that.resize();\n                return that;\n            },\n            _sizingAction: function (actionId, callback) {\n                var that = this, wrapper = that.wrapper, style = wrapper[0].style, options = that.options;\n                if (options.isMaximized || options.isMinimized) {\n                    return that;\n                }\n                that.restoreOptions = {\n                    width: style.width,\n                    height: style.height\n                };\n                wrapper.children(KWINDOWRESIZEHANDLES).hide().end().children(KWINDOWTITLEBAR).find(MINIMIZE_MAXIMIZE).parent().hide().eq(0).before(templates.action({ name: 'window-restore' }));\n                callback.call(that);\n                that.wrapper.children(KWINDOWTITLEBAR).find(PIN_UNPIN).parent().toggle(actionId !== 'maximize');\n                that.trigger(actionId);\n                wrapper.find('.k-i-window-restore').parent().focus();\n                return that;\n            },\n            maximize: function () {\n                this._sizingAction('maximize', function () {\n                    var that = this, wrapper = that.wrapper, containmentContext = this.containment && !that._isPinned, position = wrapper.position(), doc = $(document);\n                    extend(that.restoreOptions, {\n                        left: position.left + (containmentContext ? this.containment.scrollLeft() : 0),\n                        top: position.top + (containmentContext ? this.containment.scrollTop() : 0)\n                    });\n                    this._containerScrollTop = containmentContext ? this.containment.scrollTop() : doc.scrollTop();\n                    this._containerScrollLeft = containmentContext ? this.containment.scrollLeft() : doc.scrollLeft();\n                    that._stopDocumentScrolling();\n                    wrapper.css({\n                        top: containmentContext ? this.containment.scrollTop() : 0,\n                        left: containmentContext ? this.containment.scrollLeft() : 0,\n                        position: containmentContext ? 'absolute' : 'fixed'\n                    }).addClass(MAXIMIZEDSTATE);\n                    that.options.isMaximized = true;\n                    that._onDocumentResize();\n                });\n                return this;\n            },\n            _stopDocumentScrolling: function () {\n                var that = this;\n                var containment = that.containment;\n                if (containment && !that._isPinned) {\n                    that._storeOverflowRule(containment);\n                    containment.css(OVERFLOW, HIDDEN);\n                    that.wrapper.css({\n                        maxWidth: containment.innerWidth(),\n                        maxHeight: containment.innerHeight()\n                    });\n                    return;\n                }\n                var $body = $('body');\n                that._storeOverflowRule($body);\n                $body.css(OVERFLOW, HIDDEN);\n                var $html = $('html');\n                that._storeOverflowRule($html);\n                $html.css(OVERFLOW, HIDDEN);\n            },\n            _enableDocumentScrolling: function () {\n                var that = this;\n                var containment = that.containment;\n                if (containment && !that._isPinned) {\n                    that._restoreOverflowRule(containment);\n                    that.wrapper.css({\n                        maxWidth: containment.width,\n                        maxHeight: containment.height\n                    });\n                    return;\n                }\n                that._restoreOverflowRule($(document.body));\n                that._restoreOverflowRule($('html'));\n            },\n            _storeOverflowRule: function ($element) {\n                if (this._isOverflowStored($element)) {\n                    return;\n                }\n                var overflowRule = $element.get(0).style.overflow;\n                if (typeof overflowRule === 'string') {\n                    $element.data(DATADOCOVERFLOWRULE, overflowRule);\n                }\n            },\n            _isOverflowStored: function ($element) {\n                return typeof $element.data(DATADOCOVERFLOWRULE) === 'string';\n            },\n            _restoreOverflowRule: function ($element) {\n                var overflowRule = $element.data(DATADOCOVERFLOWRULE);\n                if (overflowRule !== null && overflowRule !== undefined) {\n                    $element.css(OVERFLOW, overflowRule);\n                    $element.removeData(DATADOCOVERFLOWRULE);\n                } else {\n                    $element.css(OVERFLOW, '');\n                }\n            },\n            isMaximized: function () {\n                return this.options.isMaximized;\n            },\n            minimize: function () {\n                this._sizingAction('minimize', function () {\n                    var that = this;\n                    that.wrapper.css({\n                        height: '',\n                        minHeight: ''\n                    });\n                    that.element.hide();\n                    that.options.isMinimized = true;\n                });\n                this.wrapper.attr('tabindex', 0);\n                this.wrapper.attr('aria-labelled-by', this.element.attr('aria-labelled-by'));\n                this._updateBoundaries();\n                return this;\n            },\n            isMinimized: function () {\n                return this.options.isMinimized;\n            },\n            pin: function () {\n                var that = this, win = $(window), wrapper = that.wrapper, options = that.options, position = options.position, top = this.containment ? getPosition(wrapper[0]).top + toInt(this.containment, 'borderTopWidth') : toInt(wrapper, 'top'), left = this.containment ? getPosition(wrapper[0]).left + toInt(this.containment, 'borderLeftWidth') : toInt(wrapper, 'left');\n                if (!that.options.isMaximized) {\n                    position.top = top;\n                    position.left = left;\n                    if (that._scrollIsAppended && (!this.containment || this.containment.css('position') !== 'fixed')) {\n                        position.top -= win.scrollTop();\n                        position.left -= win.scrollLeft();\n                        that._scrollIsAppended = false;\n                    }\n                    wrapper.css(extend(position, { position: 'fixed' }));\n                    wrapper.children(KWINDOWTITLEBAR).find(KPIN).addClass('k-i-unpin').removeClass('k-i-pin');\n                    that._isPinned = true;\n                    that.options.pinned = true;\n                    if (this.containment) {\n                        options.maxWidth = options.maxHeight = Infinity;\n                        wrapper.css({\n                            maxWidth: '',\n                            maxHeight: ''\n                        });\n                    }\n                }\n            },\n            unpin: function () {\n                var that = this, win = $(window), wrapper = that.wrapper, options = that.options, position = that.options.position, containment = that.containment, top = parseInt(wrapper.css('top'), 10) + win.scrollTop(), left = parseInt(wrapper.css('left'), 10) + win.scrollLeft();\n                if (!that.options.isMaximized) {\n                    that._isPinned = false;\n                    that._scrollIsAppended = true;\n                    that.options.pinned = false;\n                    if (containment) {\n                        that._updateBoundaries();\n                        options.maxWidth = Math.min(containment.width, options.maxWidth);\n                        options.maxHeight = Math.min(containment.height - toInt(wrapper, 'padding-top'), options.maxHeight);\n                        wrapper.css({\n                            maxWidth: options.maxWidth,\n                            maxHeight: options.maxHeight\n                        });\n                        if (top < containment.position.top) {\n                            top = that.minTop;\n                        } else if (top > containment.position.top + containment.height) {\n                            top = that.maxTop;\n                        } else {\n                            top = top + containment.scrollTop() - (containment.position.top + toInt(containment, 'border-top-width'));\n                        }\n                        if (left < containment.position.left) {\n                            left = that.minLeft;\n                        } else if (left > containment.position.left + containment.width) {\n                            left = that.maxLeft;\n                        } else {\n                            left = left + containment.scrollLeft() - (containment.position.left + toInt(containment, 'border-left-width'));\n                        }\n                    }\n                    position.top = constrain(top, that.minTop, that.maxTop);\n                    position.left = constrain(left, that.minLeft, that.maxLeft);\n                    wrapper.css(extend(position, { position: '' }));\n                    wrapper.children(KWINDOWTITLEBAR).find(KUNPIN).addClass('k-i-pin').removeClass('k-i-unpin');\n                }\n            },\n            _onDocumentResize: function () {\n                var that = this, wrapper = that.wrapper, wnd = $(window), zoomLevel = kendo.support.zoomLevel(), contentBoxSizing = wrapper.css('box-sizing') == 'content-box', w, h;\n                if (!that.options.isMaximized) {\n                    return;\n                }\n                var lrBorderWidth = contentBoxSizing ? toInt(wrapper, 'border-left-width') + toInt(wrapper, 'border-right-width') : 0;\n                var tbBorderWidth = contentBoxSizing ? toInt(wrapper, 'border-top-width') + toInt(wrapper, 'border-bottom-width') : 0;\n                var paddingTop = contentBoxSizing ? toInt(wrapper, 'padding-top') : 0;\n                if (that.containment && !that._isPinned) {\n                    w = that.containment.innerWidth() - lrBorderWidth;\n                    h = that.containment.innerHeight() - (tbBorderWidth + paddingTop);\n                } else {\n                    w = wnd.width() / zoomLevel - lrBorderWidth;\n                    h = wnd.height() / zoomLevel - (tbBorderWidth + paddingTop);\n                }\n                wrapper.css({\n                    width: w,\n                    height: h\n                });\n                that.options.width = w;\n                that.options.height = h;\n                that.resize();\n            },\n            refresh: function (options) {\n                var that = this, initOptions = that.options, element = $(that.element), iframe, showIframe, url;\n                if (!isPlainObject(options)) {\n                    options = { url: options };\n                }\n                options = extend({}, initOptions.content, options);\n                showIframe = defined(initOptions.iframe) ? initOptions.iframe : options.iframe;\n                url = options.url;\n                if (url) {\n                    if (!defined(showIframe)) {\n                        showIframe = !isLocalUrl(url);\n                    }\n                    if (!showIframe) {\n                        that._ajaxRequest(options);\n                    } else {\n                        iframe = element.find('.' + KCONTENTFRAME)[0];\n                        if (iframe) {\n                            iframe.src = url || iframe.src;\n                        } else {\n                            element.html(templates.contentFrame(extend({}, initOptions, { content: options })));\n                        }\n                        element.find('.' + KCONTENTFRAME).unbind('load' + NS).on('load' + NS, proxy(this._triggerRefresh, this));\n                    }\n                } else {\n                    if (options.template) {\n                        that.content(template(options.template)({}));\n                    }\n                    that.trigger(REFRESH);\n                }\n                element.toggleClass('k-window-iframecontent', !!showIframe);\n                return that;\n            },\n            _triggerRefresh: function () {\n                this.trigger(REFRESH);\n            },\n            _ajaxComplete: function () {\n                clearTimeout(this._loadingIconTimeout);\n                this.wrapper.find(REFRESHICON).removeClass(LOADING);\n            },\n            _ajaxError: function (xhr, status) {\n                this.trigger(ERROR, {\n                    status: status,\n                    xhr: xhr\n                });\n            },\n            _ajaxSuccess: function (contentTemplate) {\n                return function (data) {\n                    var html = data;\n                    if (contentTemplate) {\n                        html = template(contentTemplate)(data || {});\n                    }\n                    this.content(html, data);\n                    this.element.prop('scrollTop', 0);\n                    this.trigger(REFRESH);\n                };\n            },\n            _showLoading: function () {\n                this.wrapper.find(REFRESHICON).addClass(LOADING);\n            },\n            _ajaxRequest: function (options) {\n                this._loadingIconTimeout = setTimeout(proxy(this._showLoading, this), 100);\n                $.ajax(extend({\n                    type: 'GET',\n                    dataType: 'html',\n                    cache: false,\n                    error: proxy(this._ajaxError, this),\n                    complete: proxy(this._ajaxComplete, this),\n                    success: proxy(this._ajaxSuccess(options.template), this)\n                }, options));\n            },\n            _destroy: function () {\n                if (this.resizing) {\n                    this.resizing.destroy();\n                }\n                if (this.dragging) {\n                    this.dragging.destroy();\n                }\n                this.wrapper.off(NS).children(KWINDOWCONTENT).off(NS).end().find('.k-resize-handle,.k-window-titlebar').off(NS);\n                $(window).off('resize' + NS + this._marker);\n                $(window).off(MODAL_NS);\n                $(window).off(NS);\n                clearTimeout(this._loadingIconTimeout);\n                Widget.fn.destroy.call(this);\n                this.unbind(undefined);\n                kendo.destroy(this.wrapper);\n                this._removeOverlay(true);\n            },\n            destroy: function () {\n                this._destroy();\n                this.wrapper.empty().remove();\n                this.wrapper = this.appendTo = this.element = $();\n            },\n            _createWindow: function () {\n                var contentHtml = this.element, options = this.options, iframeSrcAttributes, wrapper, isRtl = kendo.support.isRtl(contentHtml);\n                if (options.scrollable === false) {\n                    contentHtml.css('overflow', 'hidden');\n                }\n                wrapper = $(templates.wrapper(options));\n                iframeSrcAttributes = contentHtml.find('iframe:not(.k-content)').map(function () {\n                    var src = this.getAttribute('src');\n                    this.src = '';\n                    return src;\n                });\n                wrapper.toggleClass('k-rtl', isRtl).append(contentHtml).find('iframe:not(.k-content)').each(function (index) {\n                    this.src = iframeSrcAttributes[index];\n                });\n                if (this.containment) {\n                    this.containment.prepend(wrapper);\n                } else if (this.appendTo) {\n                    wrapper.appendTo(this.appendTo);\n                }\n                wrapper.find('.k-window-title').css(isRtl ? 'left' : 'right', outerWidth(wrapper.find('.k-window-actions')) + 10);\n                contentHtml.css('visibility', '').show();\n                contentHtml.find('[data-role=editor]').each(function () {\n                    var editor = $(this).data('kendoEditor');\n                    if (editor) {\n                        editor.refresh();\n                    }\n                });\n                wrapper = contentHtml = null;\n            }\n        });\n        templates = {\n            wrapper: template('<div class=\\'k-widget k-window\\' />'),\n            action: template('<a role=\\'button\\' href=\\'\\\\#\\' class=\\'k-button k-bare k-button-icon k-window-action\\' aria-label=\\'#= name #\\'>' + '<span class=\\'k-icon k-i-#= name.toLowerCase() #\\'></span>' + '</a>'),\n            titlebar: template('<div class=\\'k-window-titlebar k-header\\'>' + '<span class=\\'k-window-title\\'>#= title #</span>' + '<div class=\\'k-window-actions\\' />' + '</div>'),\n            overlay: '<div class=\\'k-overlay\\' />',\n            contentFrame: template('<iframe frameborder=\\'0\\' title=\\'#= title #\\' class=\\'' + KCONTENTFRAME + '\\' ' + 'src=\\'#= content.url #\\'>' + 'This page requires frames in order to show content' + '</iframe>'),\n            resizeHandle: template('<div class=\\'k-resize-handle k-resize-#= data #\\'></div>')\n        };\n        function WindowResizing(wnd) {\n            var that = this;\n            that.owner = wnd;\n            that._preventDragging = false;\n            that._draggable = new Draggable(wnd.wrapper, {\n                filter: '>' + KWINDOWRESIZEHANDLES,\n                group: wnd.wrapper.id + '-resizing',\n                dragstart: proxy(that.dragstart, that),\n                drag: proxy(that.drag, that),\n                dragend: proxy(that.dragend, that)\n            });\n            that._draggable.userEvents.bind('press', proxy(that.addOverlay, that));\n            that._draggable.userEvents.bind('release', proxy(that.removeOverlay, that));\n        }\n        WindowResizing.prototype = {\n            addOverlay: function () {\n                this.owner.wrapper.append(templates.overlay);\n            },\n            removeOverlay: function () {\n                this.owner.wrapper.find(KOVERLAY).remove();\n            },\n            dragstart: function (e) {\n                var that = this;\n                var wnd = that.owner;\n                var wrapper = wnd.wrapper;\n                that._preventDragging = wnd.trigger(RESIZESTART);\n                if (that._preventDragging) {\n                    return;\n                }\n                that.elementPadding = parseInt(wrapper.css('padding-top'), 10);\n                that.initialPosition = kendo.getOffset(wrapper, 'position');\n                that.resizeDirection = e.currentTarget.prop('className').replace('k-resize-handle k-resize-', '');\n                that.initialSize = {\n                    width: wrapper.width(),\n                    height: wrapper.height()\n                };\n                wnd._updateBoundaries();\n                that.containerOffset = wnd.containment ? wnd.containment.position : kendo.getOffset(wnd.appendTo, 'position');\n                var offsetParent = wrapper.offsetParent();\n                if (offsetParent.is('html')) {\n                    that.containerOffset.top = that.containerOffset.left = 0;\n                } else {\n                    var marginTop = offsetParent.css('margin-top');\n                    var marginLeft = offsetParent.css('margin-left');\n                    var hasMargin = !zero.test(marginTop) || !zero.test(marginLeft);\n                    if (hasMargin) {\n                        var wrapperPosition = getPosition(wrapper[0]);\n                        var relativeElMarginLeft = wrapperPosition.left - that.containerOffset.left - that.initialPosition.left;\n                        var relativeElMarginTop = wrapperPosition.top - that.containerOffset.top - that.initialPosition.top;\n                        that._relativeElMarginLeft = relativeElMarginLeft > 1 ? relativeElMarginLeft : 0;\n                        that._relativeElMarginTop = relativeElMarginTop > 1 ? relativeElMarginTop : 0;\n                        that.initialPosition.left += that._relativeElMarginLeft;\n                        that.initialPosition.top += that._relativeElMarginTop;\n                    }\n                }\n                wrapper.children(KWINDOWRESIZEHANDLES).not(e.currentTarget).hide();\n                $(BODY).css(CURSOR, e.currentTarget.css(CURSOR));\n            },\n            drag: function (e) {\n                if (this._preventDragging) {\n                    return;\n                }\n                var that = this, wnd = that.owner, wrapper = wnd.wrapper, options = wnd.options, position = options.position, direction = that.resizeDirection, containerOffset = that.containerOffset, initialPosition = that.initialPosition, initialSize = that.initialSize, containmentContext = wnd.containment && !wnd._isPinned, rtl = kendo.support.isRtl(wnd.containment), leftRtlOffset = containmentContext && rtl && wnd.containment.innerWidth() > wnd.containment.width ? kendo.support.scrollbar() : 0, scrollOffset = containmentContext ? {\n                        top: wnd.containment.scrollTop(),\n                        left: wnd.containment.scrollLeft()\n                    } : {\n                        top: 0,\n                        left: 0\n                    }, newWidth, newHeight, windowBottom, windowRight, x = Math.max(e.x.location, 0), y = Math.max(e.y.location, 0);\n                if (direction.indexOf('e') >= 0) {\n                    if (wnd.containment && x - initialSize.width >= wnd.maxLeft - scrollOffset.left + containerOffset.left + leftRtlOffset) {\n                        newWidth = wnd.maxLeft + leftRtlOffset - initialPosition.left + initialSize.width - scrollOffset.left;\n                    } else {\n                        newWidth = x - initialPosition.left - containerOffset.left;\n                    }\n                    wrapper.width(constrain(newWidth, options.minWidth, options.maxWidth));\n                } else if (direction.indexOf('w') >= 0) {\n                    windowRight = initialPosition.left + initialSize.width + containerOffset.left;\n                    newWidth = constrain(windowRight - x, options.minWidth, options.maxWidth);\n                    position.left = windowRight - newWidth - containerOffset.left - leftRtlOffset - (that._relativeElMarginLeft || 0) + scrollOffset.left;\n                    if (wnd.containment && position.left <= wnd.minLeft) {\n                        position.left = wnd.minLeft;\n                        newWidth = constrain(windowRight - leftRtlOffset - position.left - containerOffset.left + scrollOffset.left, options.minWidth, options.maxWidth);\n                    }\n                    wrapper.css({\n                        left: position.left,\n                        width: newWidth\n                    });\n                }\n                var newWindowTop = y;\n                if (wnd.options.pinned) {\n                    newWindowTop -= $(window).scrollTop();\n                }\n                if (direction.indexOf('s') >= 0) {\n                    newHeight = newWindowTop - initialPosition.top - that.elementPadding - containerOffset.top;\n                    if (newWindowTop - initialSize.height - that.elementPadding >= wnd.maxTop + containerOffset.top - scrollOffset.top) {\n                        newHeight = wnd.maxTop - initialPosition.top + initialSize.height - scrollOffset.top;\n                    }\n                    wrapper.height(constrain(newHeight, options.minHeight, options.maxHeight));\n                } else if (direction.indexOf('n') >= 0) {\n                    windowBottom = initialPosition.top + initialSize.height + containerOffset.top;\n                    newHeight = constrain(windowBottom - newWindowTop, options.minHeight, options.maxHeight);\n                    position.top = windowBottom - newHeight - containerOffset.top - (that._relativeElMarginTop || 0) + scrollOffset.top;\n                    if (position.top <= wnd.minTop && wnd.containment) {\n                        position.top = wnd.minTop;\n                        newHeight = constrain(windowBottom - position.top - containerOffset.top + scrollOffset.top, options.minHeight, options.maxHeight);\n                    }\n                    wrapper.css({\n                        top: position.top,\n                        height: newHeight\n                    });\n                }\n                if (newWidth) {\n                    wnd.options.width = newWidth + 'px';\n                }\n                if (newHeight) {\n                    wnd.options.height = newHeight + 'px';\n                }\n                wnd.resize();\n            },\n            dragend: function (e) {\n                if (this._preventDragging) {\n                    return;\n                }\n                var that = this, wnd = that.owner, wrapper = wnd.wrapper;\n                wrapper.children(KWINDOWRESIZEHANDLES).not(e.currentTarget).show();\n                $(BODY).css(CURSOR, '');\n                if (wnd.touchScroller) {\n                    wnd.touchScroller.reset();\n                }\n                if (e.keyCode == 27) {\n                    wrapper.css(that.initialPosition).css(that.initialSize);\n                }\n                wnd.trigger(RESIZEEND);\n                return false;\n            },\n            destroy: function () {\n                if (this._draggable) {\n                    this._draggable.destroy();\n                }\n                this._draggable = this.owner = null;\n            }\n        };\n        function WindowDragging(wnd, dragHandle) {\n            var that = this;\n            that.owner = wnd;\n            that._preventDragging = false;\n            that._draggable = new Draggable(wnd.wrapper, {\n                filter: dragHandle,\n                group: wnd.wrapper.id + '-moving',\n                dragstart: proxy(that.dragstart, that),\n                drag: proxy(that.drag, that),\n                dragend: proxy(that.dragend, that),\n                dragcancel: proxy(that.dragcancel, that)\n            });\n            that._draggable.userEvents.stopPropagation = false;\n        }\n        WindowDragging.prototype = {\n            dragstart: function (e) {\n                var wnd = this.owner, draggable = wnd.options.draggable, element = wnd.element, actions = element.find('.k-window-actions'), containerOffset = kendo.getOffset(wnd.appendTo);\n                this._preventDragging = wnd.trigger(DRAGSTART) || !draggable;\n                if (this._preventDragging || wnd.isMaximized()) {\n                    return;\n                }\n                wnd.initialWindowPosition = kendo.getOffset(wnd.wrapper, 'position');\n                wnd.initialPointerPosition = {\n                    left: wnd.options.position.left,\n                    top: wnd.options.position.top\n                };\n                wnd.startPosition = {\n                    left: e.x.client - wnd.initialWindowPosition.left,\n                    top: e.y.client - wnd.initialWindowPosition.top\n                };\n                wnd._updateBoundaries();\n                if (!wnd.containment) {\n                    if (actions.length > 0) {\n                        wnd.minLeft = outerWidth(actions) + parseInt(actions.css('right'), 10) - outerWidth(element);\n                    } else {\n                        wnd.minLeft = 20 - outerWidth(element);\n                    }\n                    wnd.minLeft -= containerOffset.left;\n                    wnd.minTop = -containerOffset.top;\n                }\n                wnd.wrapper.append(templates.overlay).children(KWINDOWRESIZEHANDLES).hide();\n                $(BODY).css(CURSOR, e.currentTarget.css(CURSOR));\n            },\n            drag: function (e) {\n                var wnd = this.owner;\n                var position = wnd.options.position;\n                var axis = wnd.options.draggable.axis;\n                var left;\n                var top;\n                if (this._preventDragging || wnd.isMaximized()) {\n                    return;\n                }\n                if (!axis || axis.toLowerCase() === 'x') {\n                    left = e.x.client - wnd.startPosition.left;\n                    if (wnd.containment && !wnd._isPinned) {\n                        left += wnd.containment.scrollLeft();\n                    }\n                    position.left = constrain(left, wnd.minLeft, wnd.maxLeft);\n                }\n                if (!axis || axis.toLowerCase() === 'y') {\n                    top = e.y.client - wnd.startPosition.top;\n                    if (wnd.containment && !wnd._isPinned) {\n                        top += wnd.containment.scrollTop();\n                    }\n                    position.top = constrain(top, wnd.minTop, wnd.maxTop);\n                }\n                if (kendo.support.transforms) {\n                    $(wnd.wrapper).css('transform', 'translate(' + (position.left - wnd.initialPointerPosition.left) + 'px, ' + (position.top - wnd.initialPointerPosition.top) + 'px)');\n                } else {\n                    $(wnd.wrapper).css(position);\n                }\n            },\n            _finishDrag: function () {\n                var wnd = this.owner;\n                wnd.wrapper.children(KWINDOWRESIZEHANDLES).toggle(!wnd.options.isMinimized).end().find(KOVERLAY).remove();\n                $(BODY).css(CURSOR, '');\n            },\n            dragcancel: function (e) {\n                if (this._preventDragging) {\n                    return;\n                }\n                this._finishDrag();\n                e.currentTarget.closest(KWINDOW).css(this.owner.initialWindowPosition);\n            },\n            dragend: function () {\n                var wnd = this.owner;\n                if (this._preventDragging || wnd.isMaximized()) {\n                    return;\n                }\n                $(wnd.wrapper).css(wnd.options.position).css('transform', '');\n                this._finishDrag();\n                wnd.trigger(DRAGEND);\n                return false;\n            },\n            destroy: function () {\n                if (this._draggable) {\n                    this._draggable.destroy();\n                }\n                this._draggable = this.owner = null;\n            }\n        };\n        kendo.ui.plugin(Window);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.view', [\n        'kendo.core',\n        'kendo.fx',\n        'kendo.mobile.scroller',\n        'kendo.view'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.view',\n        name: 'View',\n        category: 'mobile',\n        description: 'Mobile View',\n        depends: [\n            'core',\n            'fx',\n            'mobile.scroller',\n            'view'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, ui = mobile.ui, attr = kendo.attr, Widget = ui.Widget, ViewClone = kendo.ViewClone, INIT = 'init', UI_OVERLAY = '<div style=\"height: 100%; width: 100%; position: absolute; top: 0; left: 0; z-index: 20000; display: none\" />', BEFORE_SHOW = 'beforeShow', SHOW = 'show', AFTER_SHOW = 'afterShow', BEFORE_HIDE = 'beforeHide', TRANSITION_END = 'transitionEnd', TRANSITION_START = 'transitionStart', HIDE = 'hide', DESTROY = 'destroy', attrValue = kendo.attrValue, roleSelector = kendo.roleSelector, directiveSelector = kendo.directiveSelector, compileMobileDirective = kendo.compileMobileDirective;\n        function initPopOvers(element) {\n            var popovers = element.find(roleSelector('popover')), idx, length, roles = ui.roles;\n            for (idx = 0, length = popovers.length; idx < length; idx++) {\n                kendo.initWidget(popovers[idx], {}, roles);\n            }\n        }\n        function preventScrollIfNotInput(e) {\n            if (!kendo.triggeredByInput(e)) {\n                e.preventDefault();\n            }\n        }\n        var View = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.params = {};\n                $.extend(this, options);\n                this.transition = this.transition || this.defaultTransition;\n                this._id();\n                if (!this.options.$angular) {\n                    this._layout();\n                    this._overlay();\n                    this._scroller();\n                    this._model();\n                } else {\n                    this._overlay();\n                }\n            },\n            events: [\n                INIT,\n                BEFORE_SHOW,\n                SHOW,\n                AFTER_SHOW,\n                BEFORE_HIDE,\n                HIDE,\n                DESTROY,\n                TRANSITION_START,\n                TRANSITION_END\n            ],\n            options: {\n                name: 'View',\n                title: '',\n                layout: null,\n                getLayout: $.noop,\n                reload: false,\n                transition: '',\n                defaultTransition: '',\n                useNativeScrolling: false,\n                stretch: false,\n                zoom: false,\n                model: null,\n                modelScope: window,\n                scroller: {},\n                initWidgets: true\n            },\n            enable: function (enable) {\n                if (typeof enable == 'undefined') {\n                    enable = true;\n                }\n                if (enable) {\n                    this.overlay.hide();\n                } else {\n                    this.overlay.show();\n                }\n            },\n            destroy: function () {\n                if (this.layout) {\n                    this.layout.detach(this);\n                }\n                this.trigger(DESTROY);\n                Widget.fn.destroy.call(this);\n                if (this.scroller) {\n                    this.scroller.destroy();\n                }\n                if (this.options.$angular) {\n                    this.element.scope().$destroy();\n                }\n                kendo.destroy(this.element);\n            },\n            purge: function () {\n                this.destroy();\n                this.element.remove();\n            },\n            triggerBeforeShow: function () {\n                if (this.trigger(BEFORE_SHOW, { view: this })) {\n                    return false;\n                }\n                return true;\n            },\n            triggerBeforeHide: function () {\n                if (this.trigger(BEFORE_HIDE, { view: this })) {\n                    return false;\n                }\n                return true;\n            },\n            showStart: function () {\n                var element = this.element;\n                element.css('display', '');\n                if (!this.inited) {\n                    this.inited = true;\n                    this.trigger(INIT, { view: this });\n                } else {\n                    this._invokeNgController();\n                }\n                if (this.layout) {\n                    this.layout.attach(this);\n                }\n                this._padIfNativeScrolling();\n                this.trigger(SHOW, { view: this });\n                kendo.resize(element);\n            },\n            showEnd: function () {\n                this.trigger(AFTER_SHOW, { view: this });\n                this._padIfNativeScrolling();\n            },\n            hideEnd: function () {\n                var that = this;\n                that.element.hide();\n                that.trigger(HIDE, { view: that });\n                if (that.layout) {\n                    that.layout.trigger(HIDE, {\n                        view: that,\n                        layout: that.layout\n                    });\n                }\n            },\n            beforeTransition: function (type) {\n                this.trigger(TRANSITION_START, { type: type });\n            },\n            afterTransition: function (type) {\n                this.trigger(TRANSITION_END, { type: type });\n            },\n            _padIfNativeScrolling: function () {\n                if (mobile.appLevelNativeScrolling()) {\n                    var isAndroid = kendo.support.mobileOS && kendo.support.mobileOS.android, skin = mobile.application.skin() || '', isAndroidForced = mobile.application.os.android || skin.indexOf('android') > -1, hasPlatformIndependentSkin = skin === 'flat' || skin.indexOf('material') > -1, topContainer = (isAndroid || isAndroidForced) && !hasPlatformIndependentSkin ? 'footer' : 'header', bottomContainer = (isAndroid || isAndroidForced) && !hasPlatformIndependentSkin ? 'header' : 'footer';\n                    this.content.css({\n                        paddingTop: this[topContainer].height(),\n                        paddingBottom: this[bottomContainer].height()\n                    });\n                }\n            },\n            contentElement: function () {\n                var that = this;\n                return that.options.stretch ? that.content : that.scrollerContent;\n            },\n            clone: function () {\n                return new ViewClone(this);\n            },\n            _scroller: function () {\n                var that = this;\n                if (mobile.appLevelNativeScrolling()) {\n                    return;\n                }\n                if (that.options.stretch) {\n                    that.content.addClass('km-stretched-view');\n                } else {\n                    that.content.kendoMobileScroller($.extend(that.options.scroller, {\n                        zoom: that.options.zoom,\n                        useNative: that.options.useNativeScrolling\n                    }));\n                    that.scroller = that.content.data('kendoMobileScroller');\n                    that.scrollerContent = that.scroller.scrollElement;\n                }\n                if (kendo.support.kineticScrollNeeded) {\n                    $(that.element).on('touchmove', '.km-header', preventScrollIfNotInput);\n                    if (!that.options.useNativeScrolling && !that.options.stretch) {\n                        $(that.element).on('touchmove', '.km-content', preventScrollIfNotInput);\n                    }\n                }\n            },\n            _model: function () {\n                var that = this, element = that.element, model = that.options.model;\n                if (typeof model === 'string') {\n                    model = kendo.getter(model)(that.options.modelScope);\n                }\n                that.model = model;\n                initPopOvers(element);\n                that.element.css('display', '');\n                if (that.options.initWidgets) {\n                    if (model) {\n                        kendo.bind(element, model, ui, kendo.ui, kendo.dataviz.ui);\n                    } else {\n                        mobile.init(element.children());\n                    }\n                }\n                that.element.css('display', 'none');\n            },\n            _id: function () {\n                var element = this.element, idAttrValue = element.attr('id') || '';\n                this.id = attrValue(element, 'url') || '#' + idAttrValue;\n                if (this.id == '#') {\n                    this.id = kendo.guid();\n                    element.attr('id', this.id);\n                }\n            },\n            _layout: function () {\n                var contentSelector = roleSelector('content'), element = this.element;\n                element.addClass('km-view');\n                this.header = element.children(roleSelector('header')).addClass('km-header');\n                this.footer = element.children(roleSelector('footer')).addClass('km-footer');\n                if (!element.children(contentSelector)[0]) {\n                    element.wrapInner('<div ' + attr('role') + '=\"content\"></div>');\n                }\n                this.content = element.children(roleSelector('content')).addClass('km-content');\n                this.element.prepend(this.header).append(this.footer);\n                this.layout = this.options.getLayout(this.layout);\n                if (this.layout) {\n                    this.layout.setup(this);\n                }\n            },\n            _overlay: function () {\n                this.overlay = $(UI_OVERLAY).appendTo(this.element);\n            },\n            _invokeNgController: function () {\n                var controller, scope;\n                if (this.options.$angular) {\n                    controller = this.element.controller();\n                    scope = this.options.$angular[0];\n                    if (controller) {\n                        var callback = $.proxy(this, '_callController', controller, scope);\n                        if (/^\\$(digest|apply)$/.test(scope.$$phase)) {\n                            callback();\n                        } else {\n                            scope.$apply(callback);\n                        }\n                    }\n                }\n            },\n            _callController: function (controller, scope) {\n                this.element.injector().invoke(controller.constructor, controller, { $scope: scope });\n            }\n        });\n        function initWidgets(collection) {\n            collection.each(function () {\n                kendo.initWidget($(this), {}, ui.roles);\n            });\n        }\n        var Layout = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                element = this.element;\n                this.header = element.children(this._locate('header')).addClass('km-header');\n                this.footer = element.children(this._locate('footer')).addClass('km-footer');\n                this.elements = this.header.add(this.footer);\n                initPopOvers(element);\n                if (!this.options.$angular) {\n                    kendo.mobile.init(this.element.children());\n                }\n                this.element.detach();\n                this.trigger(INIT, { layout: this });\n            },\n            _locate: function (selectors) {\n                return this.options.$angular ? directiveSelector(selectors) : roleSelector(selectors);\n            },\n            options: {\n                name: 'Layout',\n                id: null,\n                platform: null\n            },\n            events: [\n                INIT,\n                SHOW,\n                HIDE\n            ],\n            setup: function (view) {\n                if (!view.header[0]) {\n                    view.header = this.header;\n                }\n                if (!view.footer[0]) {\n                    view.footer = this.footer;\n                }\n            },\n            detach: function (view) {\n                var that = this;\n                if (view.header === that.header && that.header[0]) {\n                    view.element.prepend(that.header.detach()[0].cloneNode(true));\n                }\n                if (view.footer === that.footer && that.footer.length) {\n                    view.element.append(that.footer.detach()[0].cloneNode(true));\n                }\n            },\n            attach: function (view) {\n                var that = this, previousView = that.currentView;\n                if (previousView) {\n                    that.detach(previousView);\n                }\n                if (view.header === that.header) {\n                    that.header.detach();\n                    view.element.children(roleSelector('header')).remove();\n                    view.element.prepend(that.header);\n                }\n                if (view.footer === that.footer) {\n                    that.footer.detach();\n                    view.element.children(roleSelector('footer')).remove();\n                    view.element.append(that.footer);\n                }\n                that.trigger(SHOW, {\n                    layout: that,\n                    view: view\n                });\n                that.currentView = view;\n            }\n        });\n        var Observable = kendo.Observable, bodyRegExp = /<body[^>]*>(([\\u000a\\u000d\\u2028\\u2029]|.)*)<\\/body>/i, LOAD_START = 'loadStart', LOAD_COMPLETE = 'loadComplete', SHOW_START = 'showStart', SAME_VIEW_REQUESTED = 'sameViewRequested', VIEW_SHOW = 'viewShow', VIEW_TYPE_DETERMINED = 'viewTypeDetermined', AFTER = 'after';\n        var ViewEngine = Observable.extend({\n            init: function (options) {\n                var that = this, views, errorMessage, container, collection;\n                Observable.fn.init.call(that);\n                $.extend(that, options);\n                that.sandbox = $('<div />');\n                container = that.container;\n                views = that._hideViews(container);\n                that.rootView = views.first();\n                if (!that.rootView[0] && options.rootNeeded) {\n                    if (container[0] == kendo.mobile.application.element[0]) {\n                        errorMessage = 'Your kendo mobile application element does not contain any direct child elements with data-role=\"view\" attribute set. Make sure that you instantiate the mobile application using the correct container.';\n                    } else {\n                        errorMessage = 'Your pane element does not contain any direct child elements with data-role=\"view\" attribute set.';\n                    }\n                    throw new Error(errorMessage);\n                }\n                that.layouts = {};\n                that.viewContainer = new kendo.ViewContainer(that.container);\n                that.viewContainer.bind('accepted', function (e) {\n                    e.view.params = that.params;\n                });\n                that.viewContainer.bind('complete', function (e) {\n                    that.trigger(VIEW_SHOW, { view: e.view });\n                });\n                that.viewContainer.bind(AFTER, function () {\n                    that.trigger(AFTER);\n                });\n                this.getLayoutProxy = $.proxy(this, '_getLayout');\n                that._setupLayouts(container);\n                collection = container.children(that._locate('modalview drawer'));\n                if (that.$angular) {\n                    that.$angular[0].viewOptions = {\n                        defaultTransition: that.transition,\n                        loader: that.loader,\n                        container: that.container,\n                        getLayout: that.getLayoutProxy\n                    };\n                    collection.each(function (idx, element) {\n                        compileMobileDirective($(element), options.$angular[0]);\n                    });\n                } else {\n                    initWidgets(collection);\n                }\n                this.bind(this.events, options);\n            },\n            events: [\n                SHOW_START,\n                AFTER,\n                VIEW_SHOW,\n                LOAD_START,\n                LOAD_COMPLETE,\n                SAME_VIEW_REQUESTED,\n                VIEW_TYPE_DETERMINED\n            ],\n            destroy: function () {\n                kendo.destroy(this.container);\n                for (var id in this.layouts) {\n                    this.layouts[id].destroy();\n                }\n            },\n            view: function () {\n                return this.viewContainer.view;\n            },\n            showView: function (url, transition, params) {\n                url = url.replace(new RegExp('^' + this.remoteViewURLPrefix), '');\n                if (url === '' && this.remoteViewURLPrefix) {\n                    url = '/';\n                }\n                if (url.replace(/^#/, '') === this.url) {\n                    this.trigger(SAME_VIEW_REQUESTED);\n                    return false;\n                }\n                this.trigger(SHOW_START);\n                var that = this, showClosure = function (view) {\n                        return that.viewContainer.show(view, transition, url);\n                    }, element = that._findViewElement(url), view = kendo.widgetInstance(element);\n                that.url = url.replace(/^#/, '');\n                that.params = params;\n                if (view && view.reload) {\n                    view.purge();\n                    element = [];\n                }\n                this.trigger(VIEW_TYPE_DETERMINED, {\n                    remote: element.length === 0,\n                    url: url\n                });\n                if (element[0]) {\n                    if (!view) {\n                        view = that._createView(element);\n                    }\n                    return showClosure(view);\n                } else {\n                    if (this.serverNavigation) {\n                        location.href = url;\n                    } else {\n                        that._loadView(url, showClosure);\n                    }\n                    return true;\n                }\n            },\n            append: function (html, url) {\n                var sandbox = this.sandbox, urlPath = (url || '').split('?')[0], container = this.container, views, modalViews, view;\n                if (bodyRegExp.test(html)) {\n                    html = RegExp.$1;\n                }\n                sandbox[0].innerHTML = html;\n                container.append(sandbox.children('script, style'));\n                views = this._hideViews(sandbox);\n                view = views.first();\n                if (!view.length) {\n                    views = view = sandbox.wrapInner('<div data-role=view />').children();\n                }\n                if (urlPath) {\n                    view.hide().attr(attr('url'), urlPath);\n                }\n                this._setupLayouts(sandbox);\n                modalViews = sandbox.children(this._locate('modalview drawer'));\n                container.append(sandbox.children(this._locate('layout modalview drawer')).add(views));\n                initWidgets(modalViews);\n                return this._createView(view);\n            },\n            _locate: function (selectors) {\n                return this.$angular ? directiveSelector(selectors) : roleSelector(selectors);\n            },\n            _findViewElement: function (url) {\n                var element, urlPath = url.split('?')[0];\n                if (!urlPath) {\n                    return this.rootView;\n                }\n                element = this.container.children('[' + attr('url') + '=\\'' + urlPath + '\\']');\n                if (!element[0] && urlPath.indexOf('/') === -1) {\n                    element = this.container.children(urlPath.charAt(0) === '#' ? urlPath : '#' + urlPath);\n                }\n                return element;\n            },\n            _createView: function (element) {\n                if (this.$angular) {\n                    return compileMobileDirective(element, this.$angular[0]);\n                } else {\n                    return kendo.initWidget(element, {\n                        defaultTransition: this.transition,\n                        loader: this.loader,\n                        container: this.container,\n                        getLayout: this.getLayoutProxy,\n                        modelScope: this.modelScope,\n                        reload: attrValue(element, 'reload')\n                    }, ui.roles);\n                }\n            },\n            _getLayout: function (name) {\n                if (name === '') {\n                    return null;\n                }\n                return name ? this.layouts[name] : this.layouts[this.layout];\n            },\n            _loadView: function (url, callback) {\n                if (this._xhr) {\n                    this._xhr.abort();\n                }\n                this.trigger(LOAD_START);\n                this._xhr = $.get(kendo.absoluteURL(url, this.remoteViewURLPrefix), 'html').always($.proxy(this, '_xhrComplete', callback, url));\n            },\n            _xhrComplete: function (callback, url, response) {\n                var success = true;\n                if (typeof response === 'object') {\n                    if (response.status === 0) {\n                        if (response.responseText && response.responseText.length > 0) {\n                            success = true;\n                            response = response.responseText;\n                        } else {\n                            return;\n                        }\n                    }\n                }\n                this.trigger(LOAD_COMPLETE);\n                if (success) {\n                    callback(this.append(response, url));\n                }\n            },\n            _hideViews: function (container) {\n                return container.children(this._locate('view splitview')).hide();\n            },\n            _setupLayouts: function (element) {\n                var that = this, layout;\n                element.children(that._locate('layout')).each(function () {\n                    if (that.$angular) {\n                        layout = compileMobileDirective($(this), that.$angular[0]);\n                    } else {\n                        layout = kendo.initWidget($(this), {}, ui.roles);\n                    }\n                    var platform = layout.options.platform;\n                    if (!platform || platform === mobile.application.os.name) {\n                        that.layouts[layout.options.id] = layout;\n                    } else {\n                        layout.destroy();\n                    }\n                });\n            }\n        });\n        kendo.mobile.ViewEngine = ViewEngine;\n        ui.plugin(View);\n        ui.plugin(Layout);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.loader', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.loader',\n        name: 'Loader',\n        category: 'mobile',\n        description: 'Mobile Loader',\n        depends: ['core'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Widget = ui.Widget, CAPTURE_EVENTS = $.map(kendo.eventMap, function (value) {\n                return value;\n            }).join(' ').split(' ');\n        var Loader = Widget.extend({\n            init: function (container, options) {\n                var that = this, element = $('<div class=\"km-loader\"><span class=\"km-loading km-spin\"></span><span class=\"km-loading-left\"></span><span class=\"km-loading-right\"></span></div>');\n                Widget.fn.init.call(that, element, options);\n                that.container = container;\n                that.captureEvents = false;\n                that._attachCapture();\n                element.append(that.options.loading).hide().appendTo(container);\n            },\n            options: {\n                name: 'Loader',\n                loading: '<h1>Loading...</h1>',\n                timeout: 100\n            },\n            show: function () {\n                var that = this;\n                clearTimeout(that._loading);\n                if (that.options.loading === false) {\n                    return;\n                }\n                that.captureEvents = true;\n                that._loading = setTimeout(function () {\n                    that.element.show();\n                }, that.options.timeout);\n            },\n            hide: function () {\n                this.captureEvents = false;\n                clearTimeout(this._loading);\n                this.element.hide();\n            },\n            changeMessage: function (message) {\n                this.options.loading = message;\n                this.element.find('>h1').html(message);\n            },\n            transition: function () {\n                this.captureEvents = true;\n                this.container.css('pointer-events', 'none');\n            },\n            transitionDone: function () {\n                this.captureEvents = false;\n                this.container.css('pointer-events', '');\n            },\n            _attachCapture: function () {\n                var that = this;\n                that.captureEvents = false;\n                function capture(e) {\n                    if (that.captureEvents) {\n                        e.preventDefault();\n                    }\n                }\n                for (var i = 0; i < CAPTURE_EVENTS.length; i++) {\n                    that.container[0].addEventListener(CAPTURE_EVENTS[i], capture, true);\n                }\n            }\n        });\n        ui.plugin(Loader);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.pane', [\n        'kendo.mobile.view',\n        'kendo.mobile.loader'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.pane',\n        name: 'Pane',\n        category: 'mobile',\n        description: 'Mobile Pane',\n        depends: [\n            'mobile.view',\n            'mobile.loader'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, roleSelector = kendo.roleSelector, ui = mobile.ui, Widget = ui.Widget, ViewEngine = mobile.ViewEngine, View = ui.View, Loader = mobile.ui.Loader, EXTERNAL = 'external', HREF = 'href', DUMMY_HREF = '#!', NAVIGATE = 'navigate', VIEW_SHOW = 'viewShow', SAME_VIEW_REQUESTED = 'sameViewRequested', OS = kendo.support.mobileOS, SKIP_TRANSITION_ON_BACK_BUTTON = OS.ios && !OS.appMode && OS.flatVersion >= 700, WIDGET_RELS = /popover|actionsheet|modalview|drawer/, BACK = '#:back', attrValue = kendo.attrValue;\n        var Pane = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element;\n                element.addClass('km-pane');\n                if (that.options.collapsible) {\n                    element.addClass('km-collapsible-pane');\n                }\n                this.history = [];\n                this.historyCallback = function (url, params, backButtonPressed) {\n                    var transition = that.transition;\n                    that.transition = null;\n                    if (SKIP_TRANSITION_ON_BACK_BUTTON && backButtonPressed) {\n                        transition = 'none';\n                    }\n                    return that.viewEngine.showView(url, transition, params);\n                };\n                this._historyNavigate = function (url) {\n                    if (url === BACK) {\n                        if (that.history.length === 1) {\n                            return;\n                        }\n                        that.history.pop();\n                        url = that.history[that.history.length - 1];\n                    } else {\n                        that.history.push(url);\n                    }\n                    that.historyCallback(url, kendo.parseQueryStringParams(url));\n                };\n                this._historyReplace = function (url) {\n                    var params = kendo.parseQueryStringParams(url);\n                    that.history[that.history.length - 1] = url;\n                    that.historyCallback(url, params);\n                };\n                that.loader = new Loader(element, { loading: that.options.loading });\n                that.viewEngine = new ViewEngine({\n                    container: element,\n                    transition: options.transition,\n                    modelScope: options.modelScope,\n                    rootNeeded: !options.initial,\n                    serverNavigation: options.serverNavigation,\n                    remoteViewURLPrefix: options.root || '',\n                    layout: options.layout,\n                    $angular: options.$angular,\n                    loader: that.loader,\n                    showStart: function () {\n                        that.loader.transition();\n                        that.closeActiveDialogs();\n                    },\n                    after: function () {\n                        that.loader.transitionDone();\n                    },\n                    viewShow: function (e) {\n                        that.trigger(VIEW_SHOW, e);\n                    },\n                    loadStart: function () {\n                        that.loader.show();\n                    },\n                    loadComplete: function () {\n                        that.loader.hide();\n                    },\n                    sameViewRequested: function () {\n                        that.trigger(SAME_VIEW_REQUESTED);\n                    },\n                    viewTypeDetermined: function (e) {\n                        if (!e.remote || !that.options.serverNavigation) {\n                            that.trigger(NAVIGATE, { url: e.url });\n                        }\n                    }\n                });\n                this._setPortraitWidth();\n                kendo.onResize(function () {\n                    that._setPortraitWidth();\n                });\n                that._setupAppLinks();\n            },\n            closeActiveDialogs: function () {\n                var dialogs = this.element.find(roleSelector('actionsheet popover modalview')).filter(':visible');\n                dialogs.each(function () {\n                    kendo.widgetInstance($(this), ui).close();\n                });\n            },\n            navigateToInitial: function () {\n                var initial = this.options.initial;\n                if (initial) {\n                    this.navigate(initial);\n                }\n                return initial;\n            },\n            options: {\n                name: 'Pane',\n                portraitWidth: '',\n                transition: '',\n                layout: '',\n                collapsible: false,\n                initial: null,\n                modelScope: window,\n                loading: '<h1>Loading...</h1>'\n            },\n            events: [\n                NAVIGATE,\n                VIEW_SHOW,\n                SAME_VIEW_REQUESTED\n            ],\n            append: function (html) {\n                return this.viewEngine.append(html);\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.viewEngine.destroy();\n                this.userEvents.destroy();\n            },\n            navigate: function (url, transition) {\n                if (url instanceof View) {\n                    url = url.id;\n                }\n                this.transition = transition;\n                this._historyNavigate(url);\n            },\n            replace: function (url, transition) {\n                if (url instanceof View) {\n                    url = url.id;\n                }\n                this.transition = transition;\n                this._historyReplace(url);\n            },\n            bindToRouter: function (router) {\n                var that = this, history = this.history, viewEngine = this.viewEngine;\n                router.bind('init', function (e) {\n                    var url = e.url, attrUrl = router.pushState ? url : '/';\n                    viewEngine.rootView.attr(kendo.attr('url'), attrUrl);\n                    var length = history.length;\n                    if (url === '/' && length) {\n                        router.navigate(history[length - 1], true);\n                        e.preventDefault();\n                    }\n                });\n                router.bind('routeMissing', function (e) {\n                    if (!that.historyCallback(e.url, e.params, e.backButtonPressed)) {\n                        e.preventDefault();\n                    }\n                });\n                router.bind('same', function () {\n                    that.trigger(SAME_VIEW_REQUESTED);\n                });\n                that._historyNavigate = function (url) {\n                    router.navigate(url);\n                };\n                that._historyReplace = function (url) {\n                    router.replace(url);\n                };\n            },\n            hideLoading: function () {\n                this.loader.hide();\n            },\n            showLoading: function () {\n                this.loader.show();\n            },\n            changeLoadingMessage: function (message) {\n                this.loader.changeMessage(message);\n            },\n            view: function () {\n                return this.viewEngine.view();\n            },\n            _setPortraitWidth: function () {\n                var width, portraitWidth = this.options.portraitWidth;\n                if (portraitWidth) {\n                    width = kendo.mobile.application.element.is('.km-vertical') ? portraitWidth : 'auto';\n                    this.element.css('width', width);\n                }\n            },\n            _setupAppLinks: function () {\n                var that = this, linkRoles = 'tab', pressedButtonSelector = '[data-' + kendo.ns + 'navigate-on-press]', buttonSelectors = $.map([\n                        'button',\n                        'backbutton',\n                        'detailbutton',\n                        'listview-link'\n                    ], function (role) {\n                        return roleSelector(role) + ':not(' + pressedButtonSelector + ')';\n                    }).join(',');\n                this.element.handler(this).on('down', roleSelector(linkRoles) + ',' + pressedButtonSelector, '_mouseup').on('click', roleSelector(linkRoles) + ',' + buttonSelectors + ',' + pressedButtonSelector, '_appLinkClick');\n                this.userEvents = new kendo.UserEvents(this.element, {\n                    fastTap: true,\n                    filter: buttonSelectors,\n                    tap: function (e) {\n                        e.event.currentTarget = e.touch.currentTarget;\n                        that._mouseup(e.event);\n                    }\n                });\n                this.element.css('-ms-touch-action', '');\n            },\n            _appLinkClick: function (e) {\n                var href = $(e.currentTarget).attr('href');\n                var remote = href && href[0] !== '#' && this.options.serverNavigation;\n                if (!remote && attrValue($(e.currentTarget), 'rel') != EXTERNAL) {\n                    e.preventDefault();\n                }\n            },\n            _mouseup: function (e) {\n                if (e.which > 1 || e.isDefaultPrevented()) {\n                    return;\n                }\n                var pane = this, link = $(e.currentTarget), transition = attrValue(link, 'transition'), rel = attrValue(link, 'rel') || '', target = attrValue(link, 'target'), href = link.attr(HREF), delayedTouchEnd = SKIP_TRANSITION_ON_BACK_BUTTON && link[0].offsetHeight === 0, remote = href && href[0] !== '#' && this.options.serverNavigation;\n                if (delayedTouchEnd || remote || rel === EXTERNAL || typeof href === 'undefined' || href === DUMMY_HREF) {\n                    return;\n                }\n                link.attr(HREF, DUMMY_HREF);\n                setTimeout(function () {\n                    link.attr(HREF, href);\n                });\n                if (rel.match(WIDGET_RELS)) {\n                    kendo.widgetInstance($(href), ui).openFor(link);\n                    if (rel === 'actionsheet' || rel === 'drawer') {\n                        e.stopPropagation();\n                    }\n                } else {\n                    if (target === '_top') {\n                        pane = mobile.application.pane;\n                    } else if (target) {\n                        pane = $('#' + target).data('kendoMobilePane');\n                    }\n                    pane.navigate(href, transition);\n                }\n                e.preventDefault();\n            }\n        });\n        Pane.wrap = function (element) {\n            if (!element.is(roleSelector('view'))) {\n                element = element.wrap('<div data-' + kendo.ns + 'role=\"view\" data-stretch=\"true\"></div>').parent();\n            }\n            var paneContainer = element.wrap('<div class=\"km-pane-wrapper\"><div></div></div>').parent(), pane = new Pane(paneContainer);\n            pane.navigate('');\n            return pane;\n        };\n        ui.plugin(Pane);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.popover', [\n        'kendo.popup',\n        'kendo.mobile.pane'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.popover',\n        name: 'PopOver',\n        category: 'mobile',\n        description: 'The mobile PopOver widget represents a transient view which is displayed when the user taps on a navigational widget or area on the screen. ',\n        depends: [\n            'popup',\n            'mobile.pane'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, ui = mobile.ui, HIDE = 'hide', OPEN = 'open', CLOSE = 'close', WRAPPER = '<div class=\"km-popup-wrapper\" />', ARROW = '<div class=\"km-popup-arrow\" />', OVERLAY = '<div class=\"km-popup-overlay\" />', DIRECTION_CLASSES = 'km-up km-down km-left km-right', Widget = ui.Widget, DIRECTIONS = {\n                'down': {\n                    origin: 'bottom center',\n                    position: 'top center'\n                },\n                'up': {\n                    origin: 'top center',\n                    position: 'bottom center'\n                },\n                'left': {\n                    origin: 'center left',\n                    position: 'center right',\n                    collision: 'fit flip'\n                },\n                'right': {\n                    origin: 'center right',\n                    position: 'center left',\n                    collision: 'fit flip'\n                }\n            }, ANIMATION = {\n                animation: {\n                    open: {\n                        effects: 'fade:in',\n                        duration: 0\n                    },\n                    close: {\n                        effects: 'fade:out',\n                        duration: 400\n                    }\n                }\n            }, DIMENSIONS = {\n                'horizontal': {\n                    offset: 'top',\n                    size: 'height'\n                },\n                'vertical': {\n                    offset: 'left',\n                    size: 'width'\n                }\n            }, REVERSE = {\n                'up': 'down',\n                'down': 'up',\n                'left': 'right',\n                'right': 'left'\n            };\n        var Popup = Widget.extend({\n            init: function (element, options) {\n                var that = this, containerPopup = element.closest('.km-modalview-wrapper'), viewport = element.closest('.km-root').children('.km-pane').first(), container = containerPopup[0] ? containerPopup : viewport, popupOptions, axis;\n                if (options.viewport) {\n                    viewport = options.viewport;\n                } else if (!viewport[0]) {\n                    viewport = window;\n                }\n                if (options.container) {\n                    container = options.container;\n                } else if (!container[0]) {\n                    container = document.body;\n                }\n                popupOptions = {\n                    viewport: viewport,\n                    copyAnchorStyles: false,\n                    autosize: true,\n                    open: function () {\n                        that.overlay.show();\n                    },\n                    activate: $.proxy(that._activate, that),\n                    deactivate: function () {\n                        that.overlay.hide();\n                        if (!that._apiCall) {\n                            that.trigger(HIDE);\n                        }\n                        that._apiCall = false;\n                    }\n                };\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                element.wrap(WRAPPER).addClass('km-popup').show();\n                axis = that.options.direction.match(/left|right/) ? 'horizontal' : 'vertical';\n                that.dimensions = DIMENSIONS[axis];\n                that.wrapper = element.parent().css({\n                    width: options.width,\n                    height: options.height\n                }).addClass('km-popup-wrapper km-' + options.direction).hide();\n                that.arrow = $(ARROW).prependTo(that.wrapper).hide();\n                that.overlay = $(OVERLAY).appendTo(container).hide();\n                popupOptions.appendTo = that.overlay;\n                if (options.className) {\n                    that.overlay.addClass(options.className);\n                }\n                that.popup = new kendo.ui.Popup(that.wrapper, $.extend(true, popupOptions, ANIMATION, DIRECTIONS[options.direction]));\n            },\n            options: {\n                name: 'Popup',\n                width: 240,\n                height: '',\n                direction: 'down',\n                container: null,\n                viewport: null\n            },\n            events: [HIDE],\n            show: function (target) {\n                this.popup.options.anchor = $(target);\n                this.popup.open();\n            },\n            hide: function () {\n                this._apiCall = true;\n                this.popup.close();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.popup.destroy();\n                this.overlay.remove();\n            },\n            target: function () {\n                return this.popup.options.anchor;\n            },\n            _activate: function () {\n                var that = this, direction = that.options.direction, dimensions = that.dimensions, offset = dimensions.offset, popup = that.popup, anchor = popup.options.anchor, anchorOffset = $(anchor).offset(), elementOffset = $(popup.element).offset(), cssClass = popup.flipped ? REVERSE[direction] : direction, min = that.arrow[dimensions.size]() * 2, max = that.element[dimensions.size]() - that.arrow[dimensions.size](), size = $(anchor)[dimensions.size](), offsetAmount = anchorOffset[offset] - elementOffset[offset] + size / 2;\n                if (offsetAmount < min) {\n                    offsetAmount = min;\n                }\n                if (offsetAmount > max) {\n                    offsetAmount = max;\n                }\n                that.wrapper.removeClass(DIRECTION_CLASSES).addClass('km-' + cssClass);\n                that.arrow.css(offset, offsetAmount).show();\n            }\n        });\n        var PopOver = Widget.extend({\n            init: function (element, options) {\n                var that = this, popupOptions;\n                that.initialOpen = false;\n                Widget.fn.init.call(that, element, options);\n                popupOptions = $.extend({\n                    className: 'km-popover-root',\n                    hide: function () {\n                        that.trigger(CLOSE);\n                    }\n                }, this.options.popup);\n                that.popup = new Popup(that.element, popupOptions);\n                that.popup.overlay.on('move', function (e) {\n                    if (e.target == that.popup.overlay[0]) {\n                        e.preventDefault();\n                    }\n                });\n                that.pane = new ui.Pane(that.element, $.extend(this.options.pane, { $angular: this.options.$angular }));\n                kendo.notify(that, ui);\n            },\n            options: {\n                name: 'PopOver',\n                popup: {},\n                pane: {}\n            },\n            events: [\n                OPEN,\n                CLOSE\n            ],\n            open: function (target) {\n                this.popup.show(target);\n                if (!this.initialOpen) {\n                    if (!this.pane.navigateToInitial()) {\n                        this.pane.navigate('');\n                    }\n                    this.popup.popup._position();\n                    this.initialOpen = true;\n                } else {\n                    this.pane.view()._invokeNgController();\n                }\n            },\n            openFor: function (target) {\n                this.open(target);\n                this.trigger(OPEN, { target: this.popup.target() });\n            },\n            close: function () {\n                this.popup.hide();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.pane.destroy();\n                this.popup.destroy();\n                kendo.destroy(this.element);\n            }\n        });\n        ui.plugin(Popup);\n        ui.plugin(PopOver);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.shim', ['kendo.popup'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.shim',\n        name: 'Shim',\n        category: 'mobile',\n        description: 'Mobile Shim',\n        depends: ['popup'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Popup = kendo.ui.Popup, SHIM = '<div class=\"km-shim\"/>', HIDE = 'hide', Widget = ui.Widget;\n        var Shim = Widget.extend({\n            init: function (element, options) {\n                var that = this, app = kendo.mobile.application, os = kendo.support.mobileOS, osname = app ? app.os.name : os ? os.name : 'ios', ioswp = osname === 'ios' || osname === 'wp' || (app ? app.os.skin : false), bb = osname === 'blackberry', align = options.align || (ioswp ? 'bottom center' : bb ? 'center right' : 'center center'), position = options.position || (ioswp ? 'bottom center' : bb ? 'center right' : 'center center'), effect = options.effect || (ioswp ? 'slideIn:up' : bb ? 'slideIn:left' : 'fade:in'), shim = $(SHIM).handler(that).hide();\n                Widget.fn.init.call(that, element, options);\n                that.shim = shim;\n                element = that.element;\n                options = that.options;\n                if (options.className) {\n                    that.shim.addClass(options.className);\n                }\n                if (!options.modal) {\n                    that.shim.on('down', '_hide');\n                }\n                (app ? app.element : $(document.body)).append(shim);\n                that.popup = new Popup(that.element, {\n                    anchor: shim,\n                    modal: true,\n                    appendTo: shim,\n                    origin: align,\n                    position: position,\n                    animation: {\n                        open: {\n                            effects: effect,\n                            duration: options.duration\n                        },\n                        close: { duration: options.duration }\n                    },\n                    close: function (e) {\n                        var prevented = false;\n                        if (!that._apiCall) {\n                            prevented = that.trigger(HIDE);\n                        }\n                        if (prevented) {\n                            e.preventDefault();\n                        }\n                        that._apiCall = false;\n                    },\n                    deactivate: function () {\n                        shim.hide();\n                    },\n                    open: function () {\n                        shim.show();\n                    }\n                });\n                kendo.notify(that);\n            },\n            events: [HIDE],\n            options: {\n                name: 'Shim',\n                modal: false,\n                align: undefined,\n                position: undefined,\n                effect: undefined,\n                duration: 200\n            },\n            show: function () {\n                this.popup.open();\n            },\n            hide: function () {\n                this._apiCall = true;\n                this.popup.close();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.shim.kendoDestroy();\n                this.popup.destroy();\n                this.shim.remove();\n            },\n            _hide: function (e) {\n                if (!e || !$.contains(this.shim.children().children('.k-popup')[0], e.target)) {\n                    this.popup.close();\n                }\n            }\n        });\n        ui.plugin(Shim);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.modalview', [\n        'kendo.mobile.shim',\n        'kendo.mobile.view'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.modalview',\n        name: 'ModalView',\n        category: 'mobile',\n        description: 'The Kendo ModalView is used to present self-contained functionality in the context of the current task.',\n        depends: [\n            'mobile.shim',\n            'mobile.view'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Shim = ui.Shim, Widget = ui.Widget, BEFORE_OPEN = 'beforeOpen', OPEN = 'open', CLOSE = 'close', INIT = 'init', WRAP = '<div class=\"km-modalview-wrapper\" />';\n        var ModalView = ui.View.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that._id();\n                that._wrap();\n                that._shim();\n                if (!this.options.$angular) {\n                    that._layout();\n                    that._scroller();\n                    that._model();\n                }\n                that.element.css('display', '');\n                that.trigger(INIT);\n            },\n            events: [\n                INIT,\n                BEFORE_OPEN,\n                OPEN,\n                CLOSE\n            ],\n            options: {\n                name: 'ModalView',\n                modal: true,\n                width: null,\n                height: null\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.shim.destroy();\n            },\n            open: function (target) {\n                var that = this;\n                that.target = $(target);\n                that.shim.show();\n                that._invokeNgController();\n                that.trigger('show', { view: that });\n            },\n            openFor: function (target) {\n                if (!this.trigger(BEFORE_OPEN, { target: target })) {\n                    this.open(target);\n                    this.trigger(OPEN, { target: target });\n                }\n            },\n            close: function () {\n                if (this.element.is(':visible') && !this.trigger(CLOSE)) {\n                    this.shim.hide();\n                }\n            },\n            _wrap: function () {\n                var that = this, element = that.element, options = that.options, width, height;\n                width = element[0].style.width || 'auto';\n                height = element[0].style.height || 'auto';\n                element.addClass('km-modalview').wrap(WRAP);\n                that.wrapper = element.parent().css({\n                    width: options.width || width || 300,\n                    height: options.height || height || 300\n                }).addClass(height == 'auto' ? ' km-auto-height' : '');\n                element.css({\n                    width: '',\n                    height: ''\n                });\n            },\n            _shim: function () {\n                var that = this;\n                that.shim = new Shim(that.wrapper, {\n                    modal: that.options.modal,\n                    position: 'center center',\n                    align: 'center center',\n                    effect: 'fade:in',\n                    className: 'km-modalview-root',\n                    hide: function (e) {\n                        if (that.trigger(CLOSE)) {\n                            e.preventDefault();\n                        }\n                    }\n                });\n            }\n        });\n        ui.plugin(ModalView);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.drawer', [\n        'kendo.mobile.view',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.drawer',\n        name: 'Drawer',\n        category: 'mobile',\n        description: 'The Kendo Mobile Drawer widget provides slide to reveal global application toolbox',\n        depends: [\n            'mobile.view',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, os = kendo.support.mobileOS, Transition = kendo.effects.Transition, roleSelector = kendo.roleSelector, AXIS = 'x', ui = mobile.ui, SWIPE_TO_OPEN = !(os.ios && os.majorVersion == 7 && !os.appMode), BEFORE_SHOW = 'beforeShow', INIT = 'init', SHOW = 'show', HIDE = 'hide', AFTER_HIDE = 'afterHide', NULL_VIEW = { enable: $.noop };\n        var Drawer = ui.View.extend({\n            init: function (element, options) {\n                $(element).parent().prepend(element);\n                mobile.ui.Widget.fn.init.call(this, element, options);\n                if (!this.options.$angular) {\n                    this._layout();\n                    this._scroller();\n                }\n                this._model();\n                var pane = this.element.closest(roleSelector('pane')).data('kendoMobilePane'), userEvents;\n                if (pane) {\n                    this.pane = pane;\n                    this.pane.bind('viewShow', function (e) {\n                        drawer._viewShow(e);\n                    });\n                    this.pane.bind('sameViewRequested', function () {\n                        drawer.hide();\n                    });\n                    userEvents = this.userEvents = new kendo.UserEvents(pane.element, {\n                        fastTap: true,\n                        filter: roleSelector('view splitview'),\n                        allowSelection: true\n                    });\n                } else {\n                    this.currentView = NULL_VIEW;\n                    var container = $(this.options.container);\n                    if (!container) {\n                        throw new Error('The drawer needs a container configuration option set.');\n                    }\n                    userEvents = this.userEvents = new kendo.UserEvents(container, {\n                        fastTap: true,\n                        allowSelection: true\n                    });\n                    this._attachTransition(container);\n                }\n                var drawer = this;\n                var hide = function (e) {\n                    if (drawer.visible) {\n                        drawer.hide();\n                        e.preventDefault();\n                    }\n                };\n                if (this.options.swipeToOpen && SWIPE_TO_OPEN) {\n                    userEvents.bind('press', function () {\n                        drawer.transition.cancel();\n                    });\n                    userEvents.bind('start', function (e) {\n                        drawer._start(e);\n                    });\n                    userEvents.bind('move', function (e) {\n                        drawer._update(e);\n                    });\n                    userEvents.bind('end', function (e) {\n                        drawer._end(e);\n                    });\n                    userEvents.bind('tap', hide);\n                } else {\n                    userEvents.bind('press', hide);\n                }\n                this.leftPositioned = this.options.position === 'left';\n                this.visible = false;\n                this.element.hide().addClass('km-drawer').addClass(this.leftPositioned ? 'km-left-drawer' : 'km-right-drawer');\n                this.trigger(INIT);\n            },\n            options: {\n                name: 'Drawer',\n                position: 'left',\n                views: [],\n                swipeToOpenViews: [],\n                swipeToOpen: true,\n                title: '',\n                container: null\n            },\n            events: [\n                BEFORE_SHOW,\n                HIDE,\n                AFTER_HIDE,\n                INIT,\n                SHOW\n            ],\n            show: function () {\n                if (this._activate()) {\n                    this._show();\n                }\n            },\n            hide: function () {\n                if (!this.currentView) {\n                    return;\n                }\n                this.currentView.enable();\n                Drawer.current = null;\n                this._moveViewTo(0);\n                this.trigger(HIDE, { view: this });\n            },\n            openFor: function () {\n                if (this.visible) {\n                    this.hide();\n                } else {\n                    this.show();\n                }\n            },\n            destroy: function () {\n                ui.View.fn.destroy.call(this);\n                this.userEvents.destroy();\n            },\n            _activate: function () {\n                if (this.visible) {\n                    return true;\n                }\n                var visibleOnCurrentView = this._currentViewIncludedIn(this.options.views);\n                if (!visibleOnCurrentView || this.trigger(BEFORE_SHOW, { view: this })) {\n                    return false;\n                }\n                this._setAsCurrent();\n                this.element.show();\n                this.trigger(SHOW, { view: this });\n                this._invokeNgController();\n                return true;\n            },\n            _currentViewIncludedIn: function (views) {\n                if (!this.pane || !views.length) {\n                    return true;\n                }\n                var view = this.pane.view();\n                return $.inArray(view.id.replace('#', ''), views) > -1 || $.inArray(view.element.attr('id'), views) > -1;\n            },\n            _show: function () {\n                this.currentView.enable(false);\n                this.visible = true;\n                var offset = this.element.width();\n                if (!this.leftPositioned) {\n                    offset = -offset;\n                }\n                this._moveViewTo(offset);\n            },\n            _setAsCurrent: function () {\n                if (Drawer.last !== this) {\n                    if (Drawer.last) {\n                        Drawer.last.element.hide();\n                    }\n                    this.element.show();\n                }\n                Drawer.last = this;\n                Drawer.current = this;\n            },\n            _moveViewTo: function (offset) {\n                this.userEvents.cancel();\n                this.transition.moveTo({\n                    location: offset,\n                    duration: 400,\n                    ease: Transition.easeOutExpo\n                });\n            },\n            _viewShow: function (e) {\n                if (this.currentView) {\n                    this.currentView.enable();\n                }\n                if (this.currentView === e.view) {\n                    this.hide();\n                    return;\n                }\n                this.currentView = e.view;\n                this._attachTransition(e.view.element);\n            },\n            _attachTransition: function (element) {\n                var that = this, movable = this.movable, currentOffset = movable && movable.x;\n                if (this.transition) {\n                    this.transition.cancel();\n                    this.movable.moveAxis('x', 0);\n                }\n                movable = this.movable = new kendo.ui.Movable(element);\n                this.transition = new Transition({\n                    axis: AXIS,\n                    movable: this.movable,\n                    onEnd: function () {\n                        if (movable[AXIS] === 0) {\n                            element[0].style.cssText = '';\n                            that.element.hide();\n                            that.trigger(AFTER_HIDE);\n                            that.visible = false;\n                        }\n                    }\n                });\n                if (currentOffset) {\n                    element.addClass('k-fx-hidden');\n                    kendo.animationFrame(function () {\n                        element.removeClass('k-fx-hidden');\n                        that.movable.moveAxis(AXIS, currentOffset);\n                        that.hide();\n                    });\n                }\n            },\n            _start: function (e) {\n                var userEvents = e.sender;\n                if (Math.abs(e.x.velocity) < Math.abs(e.y.velocity) || kendo.triggeredByInput(e.event) || !this._currentViewIncludedIn(this.options.swipeToOpenViews)) {\n                    userEvents.cancel();\n                    return;\n                }\n                var leftPositioned = this.leftPositioned, visible = this.visible, canMoveLeft = leftPositioned && visible || !leftPositioned && !Drawer.current, canMoveRight = !leftPositioned && visible || leftPositioned && !Drawer.current, leftSwipe = e.x.velocity < 0;\n                if (canMoveLeft && leftSwipe || canMoveRight && !leftSwipe) {\n                    if (this._activate()) {\n                        userEvents.capture();\n                        return;\n                    }\n                }\n                userEvents.cancel();\n            },\n            _update: function (e) {\n                var movable = this.movable, newPosition = movable.x + e.x.delta, limitedPosition;\n                if (this.leftPositioned) {\n                    limitedPosition = Math.min(Math.max(0, newPosition), this.element.width());\n                } else {\n                    limitedPosition = Math.max(Math.min(0, newPosition), -this.element.width());\n                }\n                this.movable.moveAxis(AXIS, limitedPosition);\n                e.event.preventDefault();\n                e.event.stopPropagation();\n            },\n            _end: function (e) {\n                var velocity = e.x.velocity, pastHalf = Math.abs(this.movable.x) > this.element.width() / 2, velocityThreshold = 0.8, shouldShow;\n                if (this.leftPositioned) {\n                    shouldShow = velocity > -velocityThreshold && (velocity > velocityThreshold || pastHalf);\n                } else {\n                    shouldShow = velocity < velocityThreshold && (velocity < -velocityThreshold || pastHalf);\n                }\n                if (shouldShow) {\n                    this._show();\n                } else {\n                    this.hide();\n                }\n            }\n        });\n        ui.plugin(Drawer);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.splitview', ['kendo.mobile.pane'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.splitview',\n        name: 'SplitView',\n        category: 'mobile',\n        description: 'The mobile SplitView is a tablet-specific view that consists of two or more mobile Pane widgets.',\n        depends: ['mobile.pane']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Widget = ui.Widget, EXPANED_PANE_SHIM = '<div class=\\'km-expanded-pane-shim\\' />', View = ui.View;\n        var SplitView = View.extend({\n            init: function (element, options) {\n                var that = this, pane, modalViews;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                $.extend(that, options);\n                that._id();\n                if (!that.options.$angular) {\n                    that._layout();\n                    that._overlay();\n                } else {\n                    that._overlay();\n                }\n                that._style();\n                modalViews = element.children(that._locate('modalview'));\n                if (!that.options.$angular) {\n                    kendo.mobile.init(modalViews);\n                } else {\n                    modalViews.each(function (idx, element) {\n                        kendo.compileMobileDirective($(element), options.$angular[0]);\n                    });\n                }\n                that.panes = [];\n                that._paramsHistory = [];\n                if (!that.options.$angular) {\n                    that.content.children(kendo.roleSelector('pane')).each(function () {\n                        pane = kendo.initWidget(this, {}, ui.roles);\n                        that.panes.push(pane);\n                    });\n                } else {\n                    that.element.children(kendo.directiveSelector('pane')).each(function () {\n                        pane = kendo.compileMobileDirective($(this), options.$angular[0]);\n                        that.panes.push(pane);\n                    });\n                    that.element.children(kendo.directiveSelector('header footer')).each(function () {\n                        kendo.compileMobileDirective($(this), options.$angular[0]);\n                    });\n                }\n                that.expandedPaneShim = $(EXPANED_PANE_SHIM).appendTo(that.element);\n                that._shimUserEvents = new kendo.UserEvents(that.expandedPaneShim, {\n                    fastTap: true,\n                    tap: function () {\n                        that.collapsePanes();\n                    }\n                });\n            },\n            _locate: function (selectors) {\n                return this.options.$angular ? kendo.directiveSelector(selectors) : kendo.roleSelector(selectors);\n            },\n            options: {\n                name: 'SplitView',\n                style: 'horizontal'\n            },\n            expandPanes: function () {\n                this.element.addClass('km-expanded-splitview');\n            },\n            collapsePanes: function () {\n                this.element.removeClass('km-expanded-splitview');\n            },\n            _layout: function () {\n                var that = this, element = that.element;\n                that.transition = kendo.attrValue(element, 'transition');\n                kendo.mobile.ui.View.prototype._layout.call(this);\n                kendo.mobile.init(this.header.add(this.footer));\n                that.element.addClass('km-splitview');\n                that.content.addClass('km-split-content');\n            },\n            _style: function () {\n                var style = this.options.style, element = this.element, styles;\n                if (style) {\n                    styles = style.split(' ');\n                    $.each(styles, function () {\n                        element.addClass('km-split-' + this);\n                    });\n                }\n            },\n            showStart: function () {\n                var that = this;\n                that.element.css('display', '');\n                if (!that.inited) {\n                    that.inited = true;\n                    $.each(that.panes, function () {\n                        if (this.options.initial) {\n                            this.navigateToInitial();\n                        } else {\n                            this.navigate('');\n                        }\n                    });\n                    that.trigger('init', { view: that });\n                } else {\n                    this._invokeNgController();\n                }\n                that.trigger('show', { view: that });\n            }\n        });\n        ui.plugin(SplitView);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.application', [\n        'kendo.mobile.pane',\n        'kendo.router'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.application',\n        name: 'Application',\n        category: 'mobile',\n        description: 'The Mobile application provides a framework to build native looking web applications on mobile devices.',\n        depends: [\n            'mobile.pane',\n            'router'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, support = kendo.support, Widget = mobile.ui.Widget, Pane = mobile.ui.Pane, DEFAULT_OS = 'ios7', OS = support.mobileOS, BERRYPHONEGAP = OS.device == 'blackberry' && OS.flatVersion >= 600 && OS.flatVersion < 1000 && OS.appMode, FONT_SIZE_COEF = 0.93, VERTICAL = 'km-vertical', CHROME = OS.browser === 'chrome', BROKEN_WEBVIEW_RESIZE = OS.ios && OS.flatVersion >= 700 && OS.flatVersion < 800 && (OS.appMode || CHROME), INITIALLY_HORIZONTAL = Math.abs(window.orientation) / 90 == 1, HORIZONTAL = 'km-horizontal', MOBILE_PLATFORMS = {\n                ios7: {\n                    ios: true,\n                    browser: 'default',\n                    device: 'iphone',\n                    flatVersion: '700',\n                    majorVersion: '7',\n                    minorVersion: '0.0',\n                    name: 'ios',\n                    tablet: false\n                },\n                ios: {\n                    ios: true,\n                    browser: 'default',\n                    device: 'iphone',\n                    flatVersion: '612',\n                    majorVersion: '6',\n                    minorVersion: '1.2',\n                    name: 'ios',\n                    tablet: false\n                },\n                android: {\n                    android: true,\n                    browser: 'default',\n                    device: 'android',\n                    flatVersion: '442',\n                    majorVersion: '4',\n                    minorVersion: '4.2',\n                    name: 'android',\n                    tablet: false\n                },\n                blackberry: {\n                    blackberry: true,\n                    browser: 'default',\n                    device: 'blackberry',\n                    flatVersion: '710',\n                    majorVersion: '7',\n                    minorVersion: '1.0',\n                    name: 'blackberry',\n                    tablet: false\n                },\n                meego: {\n                    meego: true,\n                    browser: 'default',\n                    device: 'meego',\n                    flatVersion: '850',\n                    majorVersion: '8',\n                    minorVersion: '5.0',\n                    name: 'meego',\n                    tablet: false\n                },\n                wp: {\n                    wp: true,\n                    browser: 'default',\n                    device: 'wp',\n                    flatVersion: '800',\n                    majorVersion: '8',\n                    minorVersion: '0.0',\n                    name: 'wp',\n                    tablet: false\n                }\n            }, viewportTemplate = kendo.template('<meta content=\"initial-scale=#: data.scale #, maximum-scale=#: data.scale #, user-scalable=no#=data.height#\" name=\"viewport\" />', { usedWithBlock: false }), systemMeta = kendo.template('<meta name=\"apple-mobile-web-app-capable\" content=\"#= data.webAppCapable === false ? \\'no\\' : \\'yes\\' #\" /> ' + '<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"#=data.statusBarStyle#\" /> ' + '<meta name=\"msapplication-tap-highlight\" content=\"no\" /> ', { usedWithBlock: false }), clipTemplate = kendo.template('<style>.km-view { clip: rect(0 #= data.width #px #= data.height #px 0); }</style>', { usedWithBlock: false }), ENABLE_CLIP = OS.android && OS.browser != 'chrome' || OS.blackberry, iconMeta = kendo.template('<link rel=\"apple-touch-icon' + (OS.android ? '-precomposed' : '') + '\" # if(data.size) { # sizes=\"#=data.size#\" #}# href=\"#=data.icon#\" />', { usedWithBlock: false }), HIDEBAR = (OS.device == 'iphone' || OS.device == 'ipod') && OS.majorVersion < 7, SUPPORT_SWIPE_TO_GO_BACK = (OS.device == 'iphone' || OS.device == 'ipod') && OS.majorVersion >= 7, HISTORY_TRANSITION = SUPPORT_SWIPE_TO_GO_BACK ? 'none' : null, BARCOMPENSATION = OS.browser == 'mobilesafari' ? 60 : 0, STATUS_BAR_HEIGHT = 20, WINDOW = $(window), SCREEN = window.screen, HEAD = $('head'), INIT = 'init', proxy = $.proxy;\n        function osCssClass(os, options) {\n            var classes = [];\n            if (OS) {\n                classes.push('km-on-' + OS.name);\n            }\n            if (os.skin) {\n                classes.push('km-' + os.skin);\n            } else {\n                if (os.name == 'ios' && os.majorVersion > 6) {\n                    classes.push('km-ios7');\n                } else {\n                    classes.push('km-' + os.name);\n                }\n            }\n            if (os.name == 'ios' && os.majorVersion < 7 || os.name != 'ios') {\n                classes.push('km-' + os.name + os.majorVersion);\n            }\n            classes.push('km-' + os.majorVersion);\n            classes.push('km-m' + (os.minorVersion ? os.minorVersion[0] : 0));\n            if (os.variant && (os.skin && os.skin === os.name || !os.skin || os.setDefaultPlatform === false)) {\n                classes.push('km-' + (os.skin ? os.skin : os.name) + '-' + os.variant);\n            }\n            if (os.cordova) {\n                classes.push('km-cordova');\n            }\n            if (os.appMode) {\n                classes.push('km-app');\n            } else {\n                classes.push('km-web');\n            }\n            if (options && options.statusBarStyle) {\n                classes.push('km-' + options.statusBarStyle + '-status-bar');\n            }\n            return classes.join(' ');\n        }\n        function wp8Background(os) {\n            return 'km-wp-' + (os.noVariantSet ? parseInt($('<div style=\\'background: Background\\' />').css('background-color').split(',')[1], 10) === 0 ? 'dark' : 'light' : os.variant + ' km-wp-' + os.variant + '-force');\n        }\n        function isOrientationHorizontal(element) {\n            return OS.wp ? element.css('animation-name') == '-kendo-landscape' : Math.abs(window.orientation) / 90 == 1;\n        }\n        function getOrientationClass(element) {\n            return isOrientationHorizontal(element) ? HORIZONTAL : VERTICAL;\n        }\n        function setMinimumHeight(pane) {\n            pane.parent().addBack().css('min-height', window.innerHeight);\n        }\n        function applyViewportHeight() {\n            $('meta[name=viewport]').remove();\n            HEAD.append(viewportTemplate({ height: ', width=device-width' + (isOrientationHorizontal() ? ', height=' + window.innerHeight + 'px' : support.mobileOS.flatVersion >= 600 && support.mobileOS.flatVersion < 700 ? ', height=' + window.innerWidth + 'px' : ', height=device-height') }));\n        }\n        var Application = Widget.extend({\n            init: function (element, options) {\n                mobile.application = this;\n                $($.proxy(this, 'bootstrap', element, options));\n            },\n            bootstrap: function (element, options) {\n                element = $(element);\n                if (!element[0]) {\n                    element = $(document.body);\n                }\n                Widget.fn.init.call(this, element, options);\n                this.element.removeAttr('data-' + kendo.ns + 'role');\n                this._setupPlatform();\n                this._attachMeta();\n                this._setupElementClass();\n                this._attachHideBarHandlers();\n                var paneOptions = $.extend({}, this.options);\n                delete paneOptions.name;\n                var that = this, startHistory = function () {\n                        that.pane = new Pane(that.element, paneOptions);\n                        that.pane.navigateToInitial();\n                        if (that.options.updateDocumentTitle) {\n                            that._setupDocumentTitle();\n                        }\n                        that._startHistory();\n                        that.trigger(INIT);\n                    };\n                if (this.options.$angular) {\n                    setTimeout(startHistory);\n                } else {\n                    startHistory();\n                }\n            },\n            options: {\n                name: 'Application',\n                hideAddressBar: true,\n                browserHistory: true,\n                historyTransition: HISTORY_TRANSITION,\n                modelScope: window,\n                statusBarStyle: 'black',\n                transition: '',\n                retina: false,\n                platform: null,\n                skin: null,\n                updateDocumentTitle: true,\n                useNativeScrolling: false\n            },\n            events: [INIT],\n            navigate: function (url, transition) {\n                this.pane.navigate(url, transition);\n            },\n            replace: function (url, transition) {\n                this.pane.replace(url, transition);\n            },\n            scroller: function () {\n                return this.view().scroller;\n            },\n            hideLoading: function () {\n                if (this.pane) {\n                    this.pane.hideLoading();\n                } else {\n                    throw new Error('The mobile application instance is not fully instantiated. Please consider activating loading in the application init event handler.');\n                }\n            },\n            showLoading: function () {\n                if (this.pane) {\n                    this.pane.showLoading();\n                } else {\n                    throw new Error('The mobile application instance is not fully instantiated. Please consider activating loading in the application init event handler.');\n                }\n            },\n            changeLoadingMessage: function (message) {\n                if (this.pane) {\n                    this.pane.changeLoadingMessage(message);\n                } else {\n                    throw new Error('The mobile application instance is not fully instantiated. Please consider changing the message in the application init event handler.');\n                }\n            },\n            view: function () {\n                return this.pane.view();\n            },\n            skin: function (skin) {\n                var that = this;\n                if (!arguments.length) {\n                    return that.options.skin;\n                }\n                that.options.skin = skin || '';\n                that.element[0].className = 'km-pane';\n                that._setupPlatform();\n                that._setupElementClass();\n                return that.options.skin;\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.pane.destroy();\n                if (this.options.browserHistory) {\n                    this.router.destroy();\n                }\n            },\n            _setupPlatform: function () {\n                var that = this, platform = that.options.platform, skin = that.options.skin, split = [], os = OS || MOBILE_PLATFORMS[DEFAULT_OS];\n                if (platform) {\n                    os.setDefaultPlatform = true;\n                    if (typeof platform === 'string') {\n                        split = platform.split('-');\n                        os = $.extend({ variant: split[1] }, os, MOBILE_PLATFORMS[split[0]]);\n                    } else {\n                        os = platform;\n                    }\n                }\n                if (skin) {\n                    split = skin.split('-');\n                    if (!OS) {\n                        os.setDefaultPlatform = false;\n                    }\n                    os = $.extend({}, os, {\n                        skin: split[0],\n                        variant: split[1]\n                    });\n                }\n                if (!os.variant) {\n                    os.noVariantSet = true;\n                    os.variant = 'dark';\n                }\n                that.os = os;\n                that.osCssClass = osCssClass(that.os, that.options);\n                if (os.name == 'wp') {\n                    if (!that.refreshBackgroundColorProxy) {\n                        that.refreshBackgroundColorProxy = $.proxy(function () {\n                            if (that.os.variant && (that.os.skin && that.os.skin === that.os.name) || !that.os.skin) {\n                                that.element.removeClass('km-wp-dark km-wp-light km-wp-dark-force km-wp-light-force').addClass(wp8Background(that.os));\n                            }\n                        }, that);\n                    }\n                    $(document).off('visibilitychange', that.refreshBackgroundColorProxy);\n                    $(document).off('resume', that.refreshBackgroundColorProxy);\n                    if (!os.skin) {\n                        that.element.parent().css('overflow', 'hidden');\n                        $(document).on('visibilitychange', that.refreshBackgroundColorProxy);\n                        $(document).on('resume', that.refreshBackgroundColorProxy);\n                        that.refreshBackgroundColorProxy();\n                    }\n                }\n            },\n            _startHistory: function () {\n                if (this.options.browserHistory) {\n                    this.router = new kendo.Router({\n                        pushState: this.options.pushState,\n                        root: this.options.root,\n                        hashBang: this.options.hashBang\n                    });\n                    this.pane.bindToRouter(this.router);\n                    this.router.start();\n                } else {\n                    if (!this.options.initial) {\n                        this.pane.navigate('');\n                    }\n                }\n            },\n            _resizeToScreenHeight: function () {\n                var includeStatusBar = $('meta[name=apple-mobile-web-app-status-bar-style]').attr('content').match(/black-translucent|hidden/), element = this.element, height;\n                if (CHROME) {\n                    height = window.innerHeight;\n                } else {\n                    if (isOrientationHorizontal(element)) {\n                        if (includeStatusBar) {\n                            if (INITIALLY_HORIZONTAL) {\n                                height = SCREEN.availWidth + STATUS_BAR_HEIGHT;\n                            } else {\n                                height = SCREEN.availWidth;\n                            }\n                        } else {\n                            if (INITIALLY_HORIZONTAL) {\n                                height = SCREEN.availWidth;\n                            } else {\n                                height = SCREEN.availWidth - STATUS_BAR_HEIGHT;\n                            }\n                        }\n                    } else {\n                        if (includeStatusBar) {\n                            if (INITIALLY_HORIZONTAL) {\n                                height = SCREEN.availHeight;\n                            } else {\n                                height = SCREEN.availHeight + STATUS_BAR_HEIGHT;\n                            }\n                        } else {\n                            if (INITIALLY_HORIZONTAL) {\n                                height = SCREEN.availHeight - STATUS_BAR_HEIGHT;\n                            } else {\n                                height = SCREEN.availHeight;\n                            }\n                        }\n                    }\n                }\n                element.height(height);\n            },\n            _setupElementClass: function () {\n                var that = this, size, element = that.element;\n                element.parent().addClass('km-root km-' + (that.os.tablet ? 'tablet' : 'phone'));\n                element.addClass(that.osCssClass + ' ' + getOrientationClass(element));\n                if (this.options.useNativeScrolling) {\n                    element.parent().addClass('km-native-scrolling');\n                }\n                if (CHROME) {\n                    element.addClass('km-ios-chrome');\n                }\n                if (support.wpDevicePixelRatio) {\n                    element.parent().css('font-size', support.wpDevicePixelRatio + 'em');\n                }\n                if (this.options.retina) {\n                    element.parent().addClass('km-retina');\n                    element.parent().css('font-size', support.devicePixelRatio * FONT_SIZE_COEF + 'em');\n                }\n                if (BERRYPHONEGAP) {\n                    applyViewportHeight();\n                }\n                if (that.options.useNativeScrolling) {\n                    element.parent().addClass('km-native-scrolling');\n                } else if (ENABLE_CLIP) {\n                    size = (screen.availWidth > screen.availHeight ? screen.availWidth : screen.availHeight) + 200;\n                    $(clipTemplate({\n                        width: size,\n                        height: size\n                    })).appendTo(HEAD);\n                }\n                if (BROKEN_WEBVIEW_RESIZE) {\n                    that._resizeToScreenHeight();\n                }\n                kendo.onResize(function () {\n                    element.removeClass('km-horizontal km-vertical').addClass(getOrientationClass(element));\n                    if (that.options.useNativeScrolling) {\n                        setMinimumHeight(element);\n                    }\n                    if (BROKEN_WEBVIEW_RESIZE) {\n                        that._resizeToScreenHeight();\n                    }\n                    if (BERRYPHONEGAP) {\n                        applyViewportHeight();\n                    }\n                    kendo.resize(element);\n                });\n            },\n            _clearExistingMeta: function () {\n                HEAD.find('meta').filter('[name|=\\'apple-mobile-web-app\\'],[name|=\\'msapplication-tap\\'],[name=\\'viewport\\']').remove();\n            },\n            _attachMeta: function () {\n                var options = this.options, icon = options.icon, size;\n                this._clearExistingMeta();\n                if (!BERRYPHONEGAP) {\n                    HEAD.prepend(viewportTemplate({\n                        height: '',\n                        scale: this.options.retina ? 1 / support.devicePixelRatio : '1.0'\n                    }));\n                }\n                HEAD.prepend(systemMeta(options));\n                if (icon) {\n                    if (typeof icon === 'string') {\n                        icon = { '': icon };\n                    }\n                    for (size in icon) {\n                        HEAD.prepend(iconMeta({\n                            icon: icon[size],\n                            size: size\n                        }));\n                    }\n                }\n                if (options.useNativeScrolling) {\n                    setMinimumHeight(this.element);\n                }\n            },\n            _attachHideBarHandlers: function () {\n                var that = this, hideBar = proxy(that, '_hideBar');\n                if (support.mobileOS.appMode || !that.options.hideAddressBar || !HIDEBAR || that.options.useNativeScrolling) {\n                    return;\n                }\n                that._initialHeight = {};\n                WINDOW.on('load', hideBar);\n                kendo.onResize(function () {\n                    setTimeout(window.scrollTo, 0, 0, 1);\n                });\n            },\n            _setupDocumentTitle: function () {\n                var that = this, defaultTitle = document.title;\n                that.pane.bind('viewShow', function (e) {\n                    var title = e.view.title;\n                    document.title = title !== undefined ? title : defaultTitle;\n                });\n            },\n            _hideBar: function () {\n                var that = this, element = that.element;\n                element.height(kendo.support.transforms.css + 'calc(100% + ' + BARCOMPENSATION + 'px)');\n                $(window).trigger(kendo.support.resize);\n            }\n        });\n        kendo.mobile.Application = Application;\n        kendo.ui.plugin(Application, kendo.mobile, 'Mobile');\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.actionsheet', [\n        'kendo.mobile.popover',\n        'kendo.mobile.shim'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.actionsheet',\n        name: 'ActionSheet',\n        category: 'mobile',\n        description: 'The mobile ActionSheet widget displays a set of choices related to a task the user initiates.',\n        depends: [\n            'mobile.popover',\n            'mobile.shim'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, support = kendo.support, ui = kendo.mobile.ui, Shim = ui.Shim, Popup = ui.Popup, Widget = ui.Widget, OPEN = 'open', CLOSE = 'close', COMMAND = 'command', BUTTONS = 'li>a', CONTEXT_DATA = 'actionsheetContext', WRAP = '<div class=\"km-actionsheet-wrapper\" />', cancelTemplate = kendo.template('<li class=\"km-actionsheet-cancel\"><a href=\"\\\\#\">#:cancel#</a></li>');\n        var ActionSheet = Widget.extend({\n            init: function (element, options) {\n                var that = this, ShimClass, tablet, type, os = support.mobileOS;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                type = options.type;\n                element = that.element;\n                if (type === 'auto') {\n                    tablet = os && os.tablet;\n                } else {\n                    tablet = type === 'tablet';\n                }\n                ShimClass = tablet ? Popup : Shim;\n                if (options.cancelTemplate) {\n                    cancelTemplate = kendo.template(options.cancelTemplate);\n                }\n                element.addClass('km-actionsheet').append(cancelTemplate({ cancel: that.options.cancel })).wrap(WRAP).on('up', BUTTONS, '_click').on('click', BUTTONS, kendo.preventDefault);\n                that.view().bind('destroy', function () {\n                    that.destroy();\n                });\n                that.wrapper = element.parent().addClass(type ? ' km-actionsheet-' + type : '');\n                that.shim = new ShimClass(that.wrapper, $.extend({\n                    modal: os.ios && os.majorVersion < 7,\n                    className: 'km-actionsheet-root'\n                }, that.options.popup));\n                that._closeProxy = $.proxy(that, '_close');\n                that._shimHideProxy = $.proxy(that, '_shimHide');\n                that.shim.bind('hide', that._shimHideProxy);\n                if (tablet) {\n                    kendo.onResize(that._closeProxy);\n                }\n                kendo.notify(that, ui);\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                COMMAND\n            ],\n            options: {\n                name: 'ActionSheet',\n                cancel: 'Cancel',\n                type: 'auto',\n                popup: { height: 'auto' }\n            },\n            open: function (target, context) {\n                var that = this;\n                that.target = $(target);\n                that.context = context;\n                that.shim.show(target);\n            },\n            close: function () {\n                this.context = this.target = null;\n                this.shim.hide();\n            },\n            openFor: function (target) {\n                var that = this, context = target.data(CONTEXT_DATA);\n                that.open(target, context);\n                that.trigger(OPEN, {\n                    target: target,\n                    context: context\n                });\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                kendo.unbindResize(this._closeProxy);\n                this.shim.destroy();\n            },\n            _click: function (e) {\n                if (e.isDefaultPrevented()) {\n                    return;\n                }\n                var currentTarget = $(e.currentTarget);\n                var action = currentTarget.data('action');\n                if (action) {\n                    var actionData = {\n                            target: this.target,\n                            context: this.context\n                        }, $angular = this.options.$angular;\n                    if ($angular) {\n                        this.element.injector().get('$parse')(action)($angular[0])(actionData);\n                    } else {\n                        kendo.getter(action)(window)(actionData);\n                    }\n                }\n                this.trigger(COMMAND, {\n                    target: this.target,\n                    context: this.context,\n                    currentTarget: currentTarget\n                });\n                e.preventDefault();\n                this._close();\n            },\n            _shimHide: function (e) {\n                if (!this.trigger(CLOSE)) {\n                    this.context = this.target = null;\n                } else {\n                    e.preventDefault();\n                }\n            },\n            _close: function (e) {\n                if (!this.trigger(CLOSE)) {\n                    this.close();\n                } else {\n                    e.preventDefault();\n                }\n            }\n        });\n        ui.plugin(ActionSheet);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.button', ['kendo.userevents'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.button',\n        name: 'Button',\n        category: 'mobile',\n        description: 'The Button widget navigates between mobile Application views when pressed.',\n        depends: ['userevents']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, ui = mobile.ui, Widget = ui.Widget, support = kendo.support, os = support.mobileOS, ANDROID3UP = os.android && os.flatVersion >= 300, CLICK = 'click', DISABLED = 'disabled', DISABLEDSTATE = 'km-state-disabled';\n        function highlightButton(widget, event, highlight) {\n            $(event.target).closest('.km-button,.km-detail').toggleClass('km-state-active', highlight);\n            if (ANDROID3UP && widget.deactivateTimeoutID) {\n                clearTimeout(widget.deactivateTimeoutID);\n                widget.deactivateTimeoutID = 0;\n            }\n        }\n        function createBadge(value) {\n            return $('<span class=\"km-badge\">' + value + '</span>');\n        }\n        var Button = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                var useTap = that.options.clickOn === 'up';\n                that._wrap();\n                that._style();\n                if (!useTap) {\n                    that.element.attr('data-navigate-on-press', true);\n                }\n                that.options.enable = that.options.enable && !that.element.attr(DISABLED);\n                that.enable(that.options.enable);\n                that._userEvents = new kendo.UserEvents(that.element, {\n                    allowSelection: !useTap,\n                    fastTap: true,\n                    press: function (e) {\n                        that._activate(e);\n                    },\n                    release: function (e) {\n                        highlightButton(that, e, false);\n                        if (!useTap) {\n                            e.event.stopPropagation();\n                        }\n                    }\n                });\n                that._userEvents.bind(useTap ? 'tap' : 'press', function (e) {\n                    that._release(e);\n                });\n                if (ANDROID3UP) {\n                    that.element.on('move', function (e) {\n                        that._timeoutDeactivate(e);\n                    });\n                }\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this._userEvents.destroy();\n            },\n            events: [CLICK],\n            options: {\n                name: 'Button',\n                icon: '',\n                style: '',\n                badge: '',\n                clickOn: 'up',\n                enable: true\n            },\n            badge: function (value) {\n                var badge = this.badgeElement = this.badgeElement || createBadge(value).appendTo(this.element);\n                if (value || value === 0) {\n                    badge.html(value);\n                    return this;\n                }\n                if (value === false) {\n                    badge.empty().remove();\n                    this.badgeElement = false;\n                    return this;\n                }\n                return badge.html();\n            },\n            enable: function (enable) {\n                var element = this.element;\n                if (typeof enable == 'undefined') {\n                    enable = true;\n                }\n                this.options.enable = enable;\n                if (enable) {\n                    element.removeAttr(DISABLED);\n                } else {\n                    element.attr(DISABLED, DISABLED);\n                }\n                element.toggleClass(DISABLEDSTATE, !enable);\n            },\n            _timeoutDeactivate: function (e) {\n                if (!this.deactivateTimeoutID) {\n                    this.deactivateTimeoutID = setTimeout(highlightButton, 500, this, e, false);\n                }\n            },\n            _activate: function (e) {\n                var activeElement = document.activeElement, nodeName = activeElement ? activeElement.nodeName : '';\n                if (this.options.enable) {\n                    highlightButton(this, e, true);\n                    if (nodeName == 'INPUT' || nodeName == 'TEXTAREA') {\n                        activeElement.blur();\n                    }\n                }\n            },\n            _release: function (e) {\n                var that = this;\n                if (e.which > 1) {\n                    return;\n                }\n                if (!that.options.enable) {\n                    e.preventDefault();\n                    return;\n                }\n                if (that.trigger(CLICK, {\n                        target: $(e.target),\n                        button: that.element\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _style: function () {\n                var style = this.options.style, element = this.element, styles;\n                if (style) {\n                    styles = style.split(' ');\n                    $.each(styles, function () {\n                        element.addClass('km-' + this);\n                    });\n                }\n            },\n            _wrap: function () {\n                var that = this, icon = that.options.icon, badge = that.options.badge, iconSpan = '<span class=\"km-icon km-' + icon, element = that.element.addClass('km-button'), span = element.children('span:not(.km-icon)').addClass('km-text'), image = element.find('img').addClass('km-image');\n                if (!span[0] && element.html()) {\n                    span = element.wrapInner('<span class=\"km-text\" />').children('span.km-text');\n                }\n                if (!image[0] && icon) {\n                    if (!span[0]) {\n                        iconSpan += ' km-notext';\n                    }\n                    that.iconElement = element.prepend($(iconSpan + '\" />'));\n                }\n                if (badge || badge === 0) {\n                    that.badgeElement = createBadge(badge).appendTo(element);\n                }\n            }\n        });\n        var BackButton = Button.extend({\n            options: {\n                name: 'BackButton',\n                style: 'back'\n            },\n            init: function (element, options) {\n                var that = this;\n                Button.fn.init.call(that, element, options);\n                if (typeof that.element.attr('href') === 'undefined') {\n                    that.element.attr('href', '#:back');\n                }\n            }\n        });\n        var DetailButton = Button.extend({\n            options: {\n                name: 'DetailButton',\n                style: ''\n            },\n            init: function (element, options) {\n                Button.fn.init.call(this, element, options);\n            },\n            _style: function () {\n                var style = this.options.style + ' detail', element = this.element;\n                if (style) {\n                    var styles = style.split(' ');\n                    $.each(styles, function () {\n                        element.addClass('km-' + this);\n                    });\n                }\n            },\n            _wrap: function () {\n                var that = this, icon = that.options.icon, iconSpan = '<span class=\"km-icon km-' + icon, element = that.element, span = element.children('span'), image = element.find('img').addClass('km-image');\n                if (!image[0] && icon) {\n                    if (!span[0]) {\n                        iconSpan += ' km-notext';\n                    }\n                    element.prepend($(iconSpan + '\" />'));\n                }\n            }\n        });\n        ui.plugin(Button);\n        ui.plugin(BackButton);\n        ui.plugin(DetailButton);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.buttongroup', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.buttongroup',\n        name: 'ButtonGroup',\n        category: 'mobile',\n        description: 'The Kendo mobile ButtonGroup widget is a linear set of grouped buttons.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Widget = ui.Widget, ACTIVE = 'state-active', DISABLE = 'state-disabled', SELECT = 'select', SELECTOR = 'li:not(.km-' + ACTIVE + ')';\n        function className(name) {\n            return 'k-' + name + ' km-' + name;\n        }\n        function createBadge(value) {\n            return $('<span class=\"' + className('badge') + '\">' + value + '</span>');\n        }\n        var ButtonGroup = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that.element.addClass('km-buttongroup k-widget k-button-group').find('li').each(that._button);\n                that.element.on(that.options.selectOn, SELECTOR, '_select');\n                that._enable = true;\n                that.select(that.options.index);\n                if (!that.options.enable) {\n                    that._enable = false;\n                    that.wrapper.addClass(className(DISABLE));\n                }\n            },\n            events: [SELECT],\n            options: {\n                name: 'ButtonGroup',\n                selectOn: 'down',\n                index: -1,\n                enable: true\n            },\n            current: function () {\n                return this.element.find('.km-' + ACTIVE);\n            },\n            select: function (li) {\n                var that = this, index = -1;\n                if (li === undefined || li === -1 || !that._enable || $(li).is('.km-' + DISABLE)) {\n                    return;\n                }\n                that.current().removeClass(className(ACTIVE));\n                if (typeof li === 'number') {\n                    index = li;\n                    li = $(that.element[0].children[li]);\n                } else if (li.nodeType) {\n                    li = $(li);\n                    index = li.index();\n                }\n                li.addClass(className(ACTIVE));\n                that.selectedIndex = index;\n            },\n            badge: function (item, value) {\n                var buttongroup = this.element, badge;\n                if (!isNaN(item)) {\n                    item = buttongroup.children().get(item);\n                }\n                item = buttongroup.find(item);\n                badge = $(item.children('.km-badge')[0] || createBadge(value).appendTo(item));\n                if (value || value === 0) {\n                    badge.html(value);\n                    return this;\n                }\n                if (value === false) {\n                    badge.empty().remove();\n                    return this;\n                }\n                return badge.html();\n            },\n            enable: function (enable) {\n                if (typeof enable == 'undefined') {\n                    enable = true;\n                }\n                this.wrapper.toggleClass(className(DISABLE), !enable);\n                this._enable = this.options.enable = enable;\n            },\n            _button: function () {\n                var button = $(this).addClass(className('button')), icon = kendo.attrValue(button, 'icon'), badge = kendo.attrValue(button, 'badge'), span = button.children('span'), image = button.find('img').addClass(className('image'));\n                if (!span[0]) {\n                    span = button.wrapInner('<span/>').children('span');\n                }\n                span.addClass(className('text'));\n                if (!image[0] && icon) {\n                    button.prepend($('<span class=\"' + className('icon') + ' ' + className(icon) + '\"/>'));\n                }\n                if (badge || badge === 0) {\n                    createBadge(badge).appendTo(button);\n                }\n            },\n            _select: function (e) {\n                if (e.which > 1 || e.isDefaultPrevented() || !this._enable) {\n                    return;\n                }\n                this.select(e.currentTarget);\n                this.trigger(SELECT, { index: this.selectedIndex });\n            }\n        });\n        ui.plugin(ButtonGroup);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.collapsible', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.collapsible',\n        name: 'Collapsible',\n        category: 'mobile',\n        description: 'The Kendo mobile Collapsible widget provides ability for creating collapsible blocks of content.',\n        depends: [\n            'core',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Widget = ui.Widget, COLLAPSIBLE = 'km-collapsible', HEADER = 'km-collapsible-header', CONTENT = 'km-collapsible-content', INSET = 'km-collapsibleinset', HEADER_WRAPPER = '<div data-role=\\'collapsible-header\\' class=\\'' + HEADER + '\\'></div>', CONTENT_WRAPPER = '<div data-role=\\'collapsible-content\\' class=\\'' + CONTENT + '\\'></div>', COLLAPSED = 'km-collapsed', EXPANDED = 'km-expanded', ANIMATED = 'km-animated', LEFT = 'left', EXAPND = 'expand', COLLAPSE = 'collapse';\n        var Collapsible = Widget.extend({\n            init: function (element, options) {\n                var that = this, container = $(element);\n                Widget.fn.init.call(that, container, options);\n                container.addClass(COLLAPSIBLE);\n                that._buildHeader();\n                that.content = container.children().not(that.header).wrapAll(CONTENT_WRAPPER).parent();\n                that._userEvents = new kendo.UserEvents(that.header, {\n                    fastTap: true,\n                    tap: function () {\n                        that.toggle();\n                    }\n                });\n                container.addClass(that.options.collapsed ? COLLAPSED : EXPANDED);\n                if (that.options.inset) {\n                    container.addClass(INSET);\n                }\n                if (that.options.animation) {\n                    that.content.addClass(ANIMATED);\n                    that.content.height(0);\n                    if (that.options.collapsed) {\n                        that.content.hide();\n                    }\n                } else if (that.options.collapsed) {\n                    that.content.hide();\n                }\n            },\n            events: [\n                EXAPND,\n                COLLAPSE\n            ],\n            options: {\n                name: 'Collapsible',\n                collapsed: true,\n                collapseIcon: 'arrow-n',\n                expandIcon: 'arrow-s',\n                iconPosition: LEFT,\n                animation: true,\n                inset: false\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this._userEvents.destroy();\n            },\n            expand: function (instant) {\n                var icon = this.options.collapseIcon, content = this.content, ios = kendo.support.mobileOS.ios;\n                if (!this.trigger(EXAPND)) {\n                    if (icon) {\n                        this.header.find('.km-icon').removeClass().addClass('km-icon km-' + icon);\n                    }\n                    this.element.removeClass(COLLAPSED).addClass(EXPANDED);\n                    if (this.options.animation && !instant) {\n                        content.off('transitionend');\n                        content.show();\n                        if (ios) {\n                            content.removeClass(ANIMATED);\n                        }\n                        content.height(this._getContentHeight());\n                        if (ios) {\n                            content.addClass(ANIMATED);\n                        }\n                        kendo.resize(content);\n                    } else {\n                        content.show();\n                    }\n                }\n            },\n            collapse: function (instant) {\n                var icon = this.options.expandIcon, content = this.content;\n                if (!this.trigger(COLLAPSE)) {\n                    if (icon) {\n                        this.header.find('.km-icon').removeClass().addClass('km-icon km-' + icon);\n                    }\n                    this.element.removeClass(EXPANDED).addClass(COLLAPSED);\n                    if (this.options.animation && !instant) {\n                        content.one('transitionend', function () {\n                            content.hide();\n                        });\n                        content.height(0);\n                    } else {\n                        content.hide();\n                    }\n                }\n            },\n            toggle: function (instant) {\n                if (this.isCollapsed()) {\n                    this.expand(instant);\n                } else {\n                    this.collapse(instant);\n                }\n            },\n            isCollapsed: function () {\n                return this.element.hasClass(COLLAPSED);\n            },\n            resize: function () {\n                if (!this.isCollapsed() && this.options.animation) {\n                    this.content.height(this._getContentHeight());\n                }\n            },\n            _buildHeader: function () {\n                var header = this.element.children(':header').wrapAll(HEADER_WRAPPER), iconSpan = $('<span class=\"km-icon\"/>'), icon = this.options.collapsed ? this.options.expandIcon : this.options.collapseIcon, iconPosition = this.options.iconPosition;\n                if (icon) {\n                    header.prepend(iconSpan);\n                    iconSpan.addClass('km-' + icon);\n                }\n                this.header = header.parent();\n                this.header.addClass('km-icon-' + iconPosition);\n            },\n            _getContentHeight: function () {\n                var style = this.content.attr('style'), height;\n                this.content.css({\n                    position: 'absolute',\n                    visibility: 'hidden',\n                    height: 'auto'\n                });\n                height = this.content.height();\n                this.content.attr('style', style ? style : '');\n                return height;\n            }\n        });\n        ui.plugin(Collapsible);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.listview', [\n        'kendo.data',\n        'kendo.userevents',\n        'kendo.mobile.button'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.listview',\n        name: 'ListView',\n        category: 'mobile',\n        description: 'The Kendo Mobile ListView widget is used to display flat or grouped list of items.',\n        depends: [\n            'data',\n            'userevents',\n            'mobile.button'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Node = window.Node, mobile = kendo.mobile, ui = mobile.ui, outerHeight = kendo._outerHeight, DataSource = kendo.data.DataSource, Widget = ui.DataBoundWidget, ITEM_SELECTOR = '.km-list > li, > li:not(.km-group-container)', HIGHLIGHT_SELECTOR = '.km-listview-link, .km-listview-label', ICON_SELECTOR = '[' + kendo.attr('icon') + ']', proxy = $.proxy, attrValue = kendo.attrValue, GROUP_CLASS = 'km-group-title', ACTIVE_CLASS = 'km-state-active', GROUP_WRAPPER = '<div class=\"' + GROUP_CLASS + '\"><div class=\"km-text\"></div></div>', GROUP_TEMPLATE = kendo.template('<li><div class=\"' + GROUP_CLASS + '\"><div class=\"km-text\">#= this.headerTemplate(data) #</div></div><ul>#= kendo.render(this.template, data.items)#</ul></li>'), WRAPPER = '<div class=\"km-listview-wrapper\" />', SEARCH_TEMPLATE = kendo.template('<form class=\"km-filter-form\"><div class=\"km-filter-wrap\"><input type=\"search\" placeholder=\"#=placeholder#\"/><a href=\"\\\\#\" class=\"km-filter-reset\" title=\"Clear\"><span class=\"km-icon km-clear\"></span><span class=\"km-text\">Clear</span></a></div></form>'), NS = '.kendoMobileListView', STYLED = 'styled', DATABOUND = 'dataBound', DATABINDING = 'dataBinding', ITEM_CHANGE = 'itemChange', CLICK = 'click', CHANGE = 'change', PROGRESS = 'progress', FUNCTION = 'function', whitespaceRegExp = /^\\s+$/, buttonRegExp = /button/;\n        function whitespace() {\n            return this.nodeType === Node.TEXT_NODE && this.nodeValue.match(whitespaceRegExp);\n        }\n        function addIcon(item, icon) {\n            if (icon && !item[0].querySelector('.km-icon')) {\n                item.prepend('<span class=\"km-icon km-' + icon + '\"/>');\n            }\n        }\n        function enhanceItem(item) {\n            addIcon(item, attrValue(item, 'icon'));\n            addIcon(item, attrValue(item.children(ICON_SELECTOR), 'icon'));\n        }\n        function enhanceLinkItem(item) {\n            var parent = item.parent(), itemAndDetailButtons = item.add(parent.children(kendo.roleSelector('detailbutton'))), otherNodes = parent.contents().not(itemAndDetailButtons).not(whitespace);\n            if (otherNodes.length) {\n                return;\n            }\n            item.addClass('km-listview-link').attr(kendo.attr('role'), 'listview-link');\n            addIcon(item, attrValue(parent, 'icon'));\n            addIcon(item, attrValue(item, 'icon'));\n        }\n        function enhanceCheckBoxItem(label) {\n            if (!label[0].querySelector('input[type=checkbox],input[type=radio]')) {\n                return;\n            }\n            var item = label.parent();\n            if (item.contents().not(label).not(function () {\n                    return this.nodeType == 3;\n                })[0]) {\n                return;\n            }\n            label.addClass('km-listview-label');\n            label.children('[type=checkbox],[type=radio]').addClass('km-widget km-icon km-check');\n        }\n        function putAt(element, top) {\n            $(element).css('transform', 'translate3d(0px, ' + top + 'px, 0px)');\n        }\n        var HeaderFixer = kendo.Class.extend({\n            init: function (listView) {\n                var scroller = listView.scroller();\n                if (!scroller) {\n                    return;\n                }\n                this.options = listView.options;\n                this.element = listView.element;\n                this.scroller = listView.scroller();\n                this._shouldFixHeaders();\n                var headerFixer = this;\n                var cacheHeaders = function () {\n                    headerFixer._cacheHeaders();\n                };\n                listView.bind('resize', cacheHeaders);\n                listView.bind(STYLED, cacheHeaders);\n                listView.bind(DATABOUND, cacheHeaders);\n                this._scrollHandler = function (e) {\n                    headerFixer._fixHeader(e);\n                };\n                scroller.bind('scroll', this._scrollHandler);\n            },\n            destroy: function () {\n                var that = this;\n                if (that.scroller) {\n                    that.scroller.unbind('scroll', that._scrollHandler);\n                }\n            },\n            _fixHeader: function (e) {\n                if (!this.fixedHeaders) {\n                    return;\n                }\n                var i = 0, scroller = this.scroller, headers = this.headers, scrollTop = e.scrollTop, headerPair, offset, header;\n                do {\n                    headerPair = headers[i++];\n                    if (!headerPair) {\n                        header = $('<div />');\n                        break;\n                    }\n                    offset = headerPair.offset;\n                    header = headerPair.header;\n                } while (offset + 1 > scrollTop);\n                if (this.currentHeader != i) {\n                    scroller.fixedContainer.html(header.clone());\n                    this.currentHeader = i;\n                }\n            },\n            _shouldFixHeaders: function () {\n                this.fixedHeaders = this.options.type === 'group' && this.options.fixedHeaders;\n            },\n            _cacheHeaders: function () {\n                this._shouldFixHeaders();\n                if (!this.fixedHeaders) {\n                    return;\n                }\n                var headers = [], offset = this.scroller.scrollTop;\n                this.element.find('.' + GROUP_CLASS).each(function (_, header) {\n                    header = $(header);\n                    headers.unshift({\n                        offset: header.position().top + offset,\n                        header: header\n                    });\n                });\n                this.headers = headers;\n                this._fixHeader({ scrollTop: offset });\n            }\n        });\n        var DEFAULT_PULL_PARAMETERS = function () {\n            return { page: 1 };\n        };\n        var RefreshHandler = kendo.Class.extend({\n            init: function (listView) {\n                var handler = this, options = listView.options, scroller = listView.scroller(), pullParameters = options.pullParameters || DEFAULT_PULL_PARAMETERS;\n                this.listView = listView;\n                this.scroller = scroller;\n                listView.bind('_dataSource', function (e) {\n                    handler.setDataSource(e.dataSource);\n                });\n                scroller.setOptions({\n                    pullToRefresh: true,\n                    pull: function () {\n                        if (!handler._pulled) {\n                            handler._pulled = true;\n                            handler.dataSource.read(pullParameters.call(listView, handler._first));\n                        }\n                    },\n                    messages: {\n                        pullTemplate: options.messages.pullTemplate,\n                        releaseTemplate: options.messages.releaseTemplate,\n                        refreshTemplate: options.messages.refreshTemplate\n                    }\n                });\n            },\n            setDataSource: function (dataSource) {\n                var handler = this;\n                this._first = dataSource.view()[0];\n                this.dataSource = dataSource;\n                dataSource.bind('change', function () {\n                    handler._change();\n                });\n                dataSource.bind('error', function () {\n                    handler._change();\n                });\n            },\n            _change: function () {\n                var scroller = this.scroller, dataSource = this.dataSource;\n                if (this._pulled) {\n                    scroller.pullHandled();\n                }\n                if (this._pulled || !this._first) {\n                    var view = dataSource.view();\n                    if (view[0]) {\n                        this._first = view[0];\n                    }\n                }\n                this._pulled = false;\n            }\n        });\n        var VirtualList = kendo.Observable.extend({\n            init: function (options) {\n                var list = this;\n                kendo.Observable.fn.init.call(list);\n                list.buffer = options.buffer;\n                list.height = options.height;\n                list.item = options.item;\n                list.items = [];\n                list.footer = options.footer;\n                list.buffer.bind('reset', function () {\n                    list.refresh();\n                });\n            },\n            refresh: function () {\n                var buffer = this.buffer, items = this.items, endReached = false;\n                while (items.length) {\n                    items.pop().destroy();\n                }\n                this.offset = buffer.offset;\n                var itemConstructor = this.item, prevItem, item;\n                for (var idx = 0; idx < buffer.viewSize; idx++) {\n                    if (idx === buffer.total()) {\n                        endReached = true;\n                        break;\n                    }\n                    item = itemConstructor(this.content(this.offset + items.length));\n                    item.below(prevItem);\n                    prevItem = item;\n                    items.push(item);\n                }\n                this.itemCount = items.length;\n                this.trigger('reset');\n                this._resize();\n                if (endReached) {\n                    this.trigger('endReached');\n                }\n            },\n            totalHeight: function () {\n                if (!this.items[0]) {\n                    return 0;\n                }\n                var list = this, items = list.items, top = items[0].top, bottom = items[items.length - 1].bottom, averageItemHeight = (bottom - top) / list.itemCount, remainingItemsCount = list.buffer.length - list.offset - list.itemCount;\n                return (this.footer ? this.footer.height : 0) + bottom + remainingItemsCount * averageItemHeight;\n            },\n            batchUpdate: function (top) {\n                var height = this.height(), items = this.items, item, initialOffset = this.offset;\n                if (!items[0]) {\n                    return;\n                }\n                if (this.lastDirection) {\n                    while (items[items.length - 1].bottom > top + height * 2) {\n                        if (this.offset === 0) {\n                            break;\n                        }\n                        this.offset--;\n                        item = items.pop();\n                        item.update(this.content(this.offset));\n                        item.above(items[0]);\n                        items.unshift(item);\n                    }\n                } else {\n                    while (items[0].top < top - height) {\n                        var nextIndex = this.offset + this.itemCount;\n                        if (nextIndex === this.buffer.total()) {\n                            this.trigger('endReached');\n                            break;\n                        }\n                        if (nextIndex === this.buffer.length) {\n                            break;\n                        }\n                        item = items.shift();\n                        item.update(this.content(this.offset + this.itemCount));\n                        item.below(items[items.length - 1]);\n                        items.push(item);\n                        this.offset++;\n                    }\n                }\n                if (initialOffset !== this.offset) {\n                    this._resize();\n                }\n            },\n            update: function (top) {\n                var list = this, items = this.items, item, firstItem, lastItem, height = this.height(), itemCount = this.itemCount, padding = height / 2, up = (this.lastTop || 0) > top, topBorder = top - padding, bottomBorder = top + height + padding;\n                if (!items[0]) {\n                    return;\n                }\n                this.lastTop = top;\n                this.lastDirection = up;\n                if (up) {\n                    if (items[0].top > topBorder && items[items.length - 1].bottom > bottomBorder + padding && this.offset > 0) {\n                        this.offset--;\n                        item = items.pop();\n                        firstItem = items[0];\n                        item.update(this.content(this.offset));\n                        items.unshift(item);\n                        item.above(firstItem);\n                        list._resize();\n                    }\n                } else {\n                    if (items[items.length - 1].bottom < bottomBorder && items[0].top < topBorder - padding) {\n                        var nextIndex = this.offset + itemCount;\n                        if (nextIndex === this.buffer.total()) {\n                            this.trigger('endReached');\n                        } else if (nextIndex !== this.buffer.length) {\n                            item = items.shift();\n                            lastItem = items[items.length - 1];\n                            items.push(item);\n                            item.update(this.content(this.offset + this.itemCount));\n                            list.offset++;\n                            item.below(lastItem);\n                            list._resize();\n                        }\n                    }\n                }\n            },\n            content: function (index) {\n                return this.buffer.at(index);\n            },\n            destroy: function () {\n                this.unbind();\n            },\n            _resize: function () {\n                var items = this.items, top = 0, bottom = 0, firstItem = items[0], lastItem = items[items.length - 1];\n                if (firstItem) {\n                    top = firstItem.top;\n                    bottom = lastItem.bottom;\n                }\n                this.trigger('resize', {\n                    top: top,\n                    bottom: bottom\n                });\n                if (this.footer) {\n                    this.footer.below(lastItem);\n                }\n            }\n        });\n        kendo.mobile.ui.VirtualList = VirtualList;\n        var VirtualListViewItem = kendo.Class.extend({\n            init: function (listView, dataItem) {\n                var element = listView.append([dataItem], true)[0], height = element.offsetHeight;\n                $.extend(this, {\n                    top: 0,\n                    element: element,\n                    listView: listView,\n                    height: height,\n                    bottom: height\n                });\n            },\n            update: function (dataItem) {\n                this.element = this.listView.setDataItem(this.element, dataItem);\n            },\n            above: function (item) {\n                if (item) {\n                    this.height = this.element.offsetHeight;\n                    this.top = item.top - this.height;\n                    this.bottom = item.top;\n                    putAt(this.element, this.top);\n                }\n            },\n            below: function (item) {\n                if (item) {\n                    this.height = this.element.offsetHeight;\n                    this.top = item.bottom;\n                    this.bottom = this.top + this.height;\n                    putAt(this.element, this.top);\n                }\n            },\n            destroy: function () {\n                kendo.destroy(this.element);\n                $(this.element).remove();\n            }\n        });\n        var LOAD_ICON = '<div><span class=\"km-icon\"></span><span class=\"km-loading-left\"></span><span class=\"km-loading-right\"></span></div>';\n        var VirtualListViewLoadingIndicator = kendo.Class.extend({\n            init: function (listView) {\n                this.element = $('<li class=\"km-load-more km-scroller-refresh\" style=\"display: none\"></li>').appendTo(listView.element);\n                this._loadIcon = $(LOAD_ICON).appendTo(this.element);\n            },\n            enable: function () {\n                this.element.show();\n                this.height = outerHeight(this.element, true);\n            },\n            disable: function () {\n                this.element.hide();\n                this.height = 0;\n            },\n            below: function (item) {\n                if (item) {\n                    this.top = item.bottom;\n                    this.bottom = this.height + this.top;\n                    putAt(this.element, this.top);\n                }\n            }\n        });\n        var VirtualListViewPressToLoadMore = VirtualListViewLoadingIndicator.extend({\n            init: function (listView, buffer) {\n                this._loadIcon = $(LOAD_ICON).hide();\n                this._loadButton = $('<a class=\"km-load\">' + listView.options.messages.loadMoreText + '</a>').hide();\n                this.element = $('<li class=\"km-load-more\" style=\"display: none\"></li>').append(this._loadIcon).append(this._loadButton).appendTo(listView.element);\n                var loadMore = this;\n                this._loadButton.kendoMobileButton().data('kendoMobileButton').bind('click', function () {\n                    loadMore._hideShowButton();\n                    buffer.next();\n                });\n                buffer.bind('resize', function () {\n                    loadMore._showLoadButton();\n                });\n                this.height = outerHeight(this.element, true);\n                this.disable();\n            },\n            _hideShowButton: function () {\n                this._loadButton.hide();\n                this.element.addClass('km-scroller-refresh');\n                this._loadIcon.css('display', 'block');\n            },\n            _showLoadButton: function () {\n                this._loadButton.show();\n                this.element.removeClass('km-scroller-refresh');\n                this._loadIcon.hide();\n            }\n        });\n        var VirtualListViewItemBinder = kendo.Class.extend({\n            init: function (listView) {\n                var binder = this;\n                this.chromeHeight = outerHeight(listView.wrapper.children().not(listView.element));\n                this.listView = listView;\n                this.scroller = listView.scroller();\n                this.options = listView.options;\n                listView.bind('_dataSource', function (e) {\n                    binder.setDataSource(e.dataSource, e.empty);\n                });\n                listView.bind('resize', function () {\n                    if (!binder.list.items.length) {\n                        return;\n                    }\n                    binder.scroller.reset();\n                    binder.buffer.range(0);\n                    binder.list.refresh();\n                });\n                this.scroller.makeVirtual();\n                this._scroll = function (e) {\n                    binder.list.update(e.scrollTop);\n                };\n                this.scroller.bind('scroll', this._scroll);\n                this._scrollEnd = function (e) {\n                    binder.list.batchUpdate(e.scrollTop);\n                };\n                this.scroller.bind('scrollEnd', this._scrollEnd);\n            },\n            destroy: function () {\n                this.list.unbind();\n                this.buffer.unbind();\n                this.scroller.unbind('scroll', this._scroll);\n                this.scroller.unbind('scrollEnd', this._scrollEnd);\n            },\n            setDataSource: function (dataSource, empty) {\n                var binder = this, options = this.options, listView = this.listView, scroller = listView.scroller(), pressToLoadMore = options.loadMore, pageSize, buffer, footer;\n                this.dataSource = dataSource;\n                pageSize = dataSource.pageSize() || options.virtualViewSize;\n                if (!pageSize && !empty) {\n                    throw new Error('the DataSource does not have page size configured. Page Size setting is mandatory for the mobile listview virtual scrolling to work as expected.');\n                }\n                if (this.buffer) {\n                    this.buffer.destroy();\n                }\n                buffer = new kendo.data.Buffer(dataSource, Math.floor(pageSize / 2), pressToLoadMore);\n                if (pressToLoadMore) {\n                    footer = new VirtualListViewPressToLoadMore(listView, buffer);\n                } else {\n                    footer = new VirtualListViewLoadingIndicator(listView);\n                }\n                if (this.list) {\n                    this.list.destroy();\n                }\n                var list = new VirtualList({\n                    buffer: buffer,\n                    footer: footer,\n                    item: function (dataItem) {\n                        return new VirtualListViewItem(listView, dataItem);\n                    },\n                    height: function () {\n                        return scroller.height();\n                    }\n                });\n                list.bind('resize', function () {\n                    binder.updateScrollerSize();\n                    listView.updateSize();\n                });\n                list.bind('reset', function () {\n                    binder.footer.enable();\n                });\n                list.bind('endReached', function () {\n                    footer.disable();\n                    binder.updateScrollerSize();\n                });\n                buffer.bind('expand', function () {\n                    list.lastDirection = false;\n                    list.batchUpdate(scroller.scrollTop);\n                });\n                $.extend(this, {\n                    buffer: buffer,\n                    scroller: scroller,\n                    list: list,\n                    footer: footer\n                });\n            },\n            updateScrollerSize: function () {\n                this.scroller.virtualSize(0, this.list.totalHeight() + this.chromeHeight);\n            },\n            refresh: function () {\n                this.list.refresh();\n            },\n            reset: function () {\n                this.buffer.range(0);\n                this.list.refresh();\n            }\n        });\n        var ListViewItemBinder = kendo.Class.extend({\n            init: function (listView) {\n                var binder = this;\n                this.listView = listView;\n                this.options = listView.options;\n                var itemBinder = this;\n                this._refreshHandler = function (e) {\n                    itemBinder.refresh(e);\n                };\n                this._progressHandler = function () {\n                    listView.showLoading();\n                };\n                listView.bind('_dataSource', function (e) {\n                    binder.setDataSource(e.dataSource);\n                });\n            },\n            destroy: function () {\n                this._unbindDataSource();\n            },\n            reset: function () {\n            },\n            refresh: function (e) {\n                var action = e && e.action, dataItems = e && e.items, listView = this.listView, dataSource = this.dataSource, prependOnRefresh = this.options.appendOnRefresh, view = dataSource.view(), groups = dataSource.group(), groupedMode = groups && groups[0], item;\n                if (action === 'itemchange') {\n                    if (!listView._hasBindingTarget()) {\n                        item = listView.findByDataItem(dataItems)[0];\n                        if (item) {\n                            listView.setDataItem(item, dataItems[0]);\n                        }\n                    }\n                    return;\n                }\n                var removedItems, addedItems, addedDataItems;\n                var adding = action === 'add' && !groupedMode || prependOnRefresh && !listView._filter;\n                var removing = action === 'remove' && !groupedMode;\n                if (adding) {\n                    removedItems = [];\n                } else if (removing) {\n                    removedItems = listView.findByDataItem(dataItems);\n                }\n                if (listView.trigger(DATABINDING, {\n                        action: action || 'rebind',\n                        items: dataItems,\n                        removedItems: removedItems,\n                        index: e && e.index\n                    })) {\n                    if (this._shouldShowLoading()) {\n                        listView.hideLoading();\n                    }\n                    return;\n                }\n                if (action === 'add' && !groupedMode) {\n                    var index = view.indexOf(dataItems[0]);\n                    if (index > -1) {\n                        addedItems = listView.insertAt(dataItems, index);\n                        addedDataItems = dataItems;\n                    }\n                } else if (action === 'remove' && !groupedMode) {\n                    addedItems = [];\n                    listView.remove(dataItems);\n                } else if (groupedMode) {\n                    listView.replaceGrouped(view);\n                } else if (prependOnRefresh && !listView._filter) {\n                    addedItems = listView.prepend(view);\n                    addedDataItems = view;\n                } else {\n                    listView.replace(view);\n                }\n                if (this._shouldShowLoading()) {\n                    listView.hideLoading();\n                }\n                listView.trigger(DATABOUND, {\n                    ns: ui,\n                    addedItems: addedItems,\n                    addedDataItems: addedDataItems\n                });\n            },\n            setDataSource: function (dataSource) {\n                if (this.dataSource) {\n                    this._unbindDataSource();\n                }\n                this.dataSource = dataSource;\n                dataSource.bind(CHANGE, this._refreshHandler);\n                if (this._shouldShowLoading()) {\n                    this.dataSource.bind(PROGRESS, this._progressHandler);\n                }\n            },\n            _unbindDataSource: function () {\n                this.dataSource.unbind(CHANGE, this._refreshHandler).unbind(PROGRESS, this._progressHandler);\n            },\n            _shouldShowLoading: function () {\n                var options = this.options;\n                return !options.pullToRefresh && !options.loadMore && !options.endlessScroll;\n            }\n        });\n        var ListViewFilter = kendo.Class.extend({\n            init: function (listView) {\n                var filter = this, filterable = listView.options.filterable, events = 'change paste', that = this;\n                this.listView = listView;\n                this.options = filterable;\n                listView.element.before(SEARCH_TEMPLATE({ placeholder: filterable.placeholder || 'Search...' }));\n                if (filterable.autoFilter !== false) {\n                    events += ' keyup';\n                }\n                this.element = listView.wrapper.find('.km-search-form');\n                this.searchInput = listView.wrapper.find('input[type=search]').closest('form').on('submit' + NS, function (e) {\n                    e.preventDefault();\n                }).end().on('focus' + NS, function () {\n                    filter._oldFilter = filter.searchInput.val();\n                }).on(events.split(' ').join(NS + ' ') + NS, proxy(this._filterChange, this));\n                this.clearButton = listView.wrapper.find('.km-filter-reset').on(CLICK, proxy(this, '_clearFilter')).hide();\n                this._dataSourceChange = $.proxy(this._refreshInput, this);\n                listView.bind('_dataSource', function (e) {\n                    e.dataSource.bind('change', that._dataSourceChange);\n                });\n            },\n            _refreshInput: function () {\n                var appliedFilters = this.listView.dataSource.filter();\n                var searchInput = this.listView._filter.searchInput;\n                if (!appliedFilters || appliedFilters.filters[0].field !== this.listView.options.filterable.field) {\n                    searchInput.val('');\n                } else {\n                    searchInput.val(appliedFilters.filters[0].value);\n                }\n            },\n            _search: function (expr) {\n                this._filter = true;\n                this.clearButton[expr ? 'show' : 'hide']();\n                this.listView.dataSource.filter(expr);\n            },\n            _filterChange: function (e) {\n                var filter = this;\n                if (e.type == 'paste' && this.options.autoFilter !== false) {\n                    setTimeout(function () {\n                        filter._applyFilter();\n                    }, 1);\n                } else {\n                    this._applyFilter();\n                }\n            },\n            _applyFilter: function () {\n                var options = this.options, value = this.searchInput.val(), expr = value.length ? {\n                        field: options.field,\n                        operator: options.operator || 'startswith',\n                        ignoreCase: options.ignoreCase,\n                        value: value\n                    } : null;\n                if (value === this._oldFilter) {\n                    return;\n                }\n                this._oldFilter = value;\n                this._search(expr);\n            },\n            _clearFilter: function (e) {\n                this.searchInput.val('');\n                this._search(null);\n                e.preventDefault();\n            }\n        });\n        var ListView = Widget.extend({\n            init: function (element, options) {\n                var listView = this;\n                Widget.fn.init.call(this, element, options);\n                element = this.element;\n                options = this.options;\n                if (options.scrollTreshold) {\n                    options.scrollThreshold = options.scrollTreshold;\n                }\n                element.on('down', HIGHLIGHT_SELECTOR, '_highlight').on('move up cancel', HIGHLIGHT_SELECTOR, '_dim');\n                this._userEvents = new kendo.UserEvents(element, {\n                    fastTap: true,\n                    filter: ITEM_SELECTOR,\n                    allowSelection: true,\n                    tap: function (e) {\n                        listView._click(e);\n                    }\n                });\n                element.css('-ms-touch-action', 'auto');\n                element.wrap(WRAPPER);\n                this.wrapper = this.element.parent();\n                this._headerFixer = new HeaderFixer(this);\n                this._itemsCache = {};\n                this._templates();\n                this.virtual = options.endlessScroll || options.loadMore;\n                this._style();\n                if (this.options.$angular && (this.virtual || this.options.pullToRefresh)) {\n                    setTimeout($.proxy(this, '_start'));\n                } else {\n                    this._start();\n                }\n            },\n            _start: function () {\n                var options = this.options;\n                if (this.options.filterable) {\n                    this._filter = new ListViewFilter(this);\n                }\n                if (this.virtual) {\n                    this._itemBinder = new VirtualListViewItemBinder(this);\n                } else {\n                    this._itemBinder = new ListViewItemBinder(this);\n                }\n                if (this.options.pullToRefresh) {\n                    this._pullToRefreshHandler = new RefreshHandler(this);\n                }\n                this.setDataSource(options.dataSource);\n                this._enhanceItems(this.items());\n                kendo.notify(this, ui);\n            },\n            events: [\n                CLICK,\n                DATABINDING,\n                DATABOUND,\n                ITEM_CHANGE\n            ],\n            options: {\n                name: 'ListView',\n                style: '',\n                type: 'flat',\n                autoBind: true,\n                fixedHeaders: false,\n                template: '#:data#',\n                headerTemplate: '<span class=\"km-text\">#:value#</span>',\n                appendOnRefresh: false,\n                loadMore: false,\n                endlessScroll: false,\n                scrollThreshold: 30,\n                pullToRefresh: false,\n                messages: {\n                    loadMoreText: 'Press to load more',\n                    pullTemplate: 'Pull to refresh',\n                    releaseTemplate: 'Release to refresh',\n                    refreshTemplate: 'Refreshing'\n                },\n                pullOffset: 140,\n                filterable: false,\n                virtualViewSize: null\n            },\n            refresh: function () {\n                this._itemBinder.refresh();\n            },\n            reset: function () {\n                this._itemBinder.reset();\n            },\n            setDataSource: function (dataSource) {\n                var emptyDataSource = !dataSource;\n                this.dataSource = DataSource.create(dataSource);\n                this.trigger('_dataSource', {\n                    dataSource: this.dataSource,\n                    empty: emptyDataSource\n                });\n                if (this.options.autoBind && !emptyDataSource) {\n                    this.items().remove();\n                    this.dataSource.fetch();\n                }\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                kendo.destroy(this.element);\n                this._userEvents.destroy();\n                if (this._itemBinder) {\n                    this._itemBinder.destroy();\n                }\n                if (this._headerFixer) {\n                    this._headerFixer.destroy();\n                }\n                this.element.unwrap();\n                delete this.element;\n                delete this.wrapper;\n                delete this._userEvents;\n            },\n            items: function () {\n                if (this.options.type === 'group') {\n                    return this.element.find('.km-list').children();\n                } else {\n                    return this.element.children().not('.km-load-more');\n                }\n            },\n            scroller: function () {\n                if (!this._scrollerInstance) {\n                    this._scrollerInstance = this.element.closest('.km-scroll-wrapper').data('kendoMobileScroller');\n                }\n                return this._scrollerInstance;\n            },\n            showLoading: function () {\n                var view = this.view();\n                if (view && view.loader) {\n                    view.loader.show();\n                }\n            },\n            hideLoading: function () {\n                var view = this.view();\n                if (view && view.loader) {\n                    view.loader.hide();\n                }\n            },\n            insertAt: function (dataItems, index, triggerChange) {\n                var listView = this;\n                return listView._renderItems(dataItems, function (items) {\n                    if (index === 0) {\n                        listView.element.prepend(items);\n                    } else if (index === -1) {\n                        listView.element.append(items);\n                    } else {\n                        listView.items().eq(index - 1).after(items);\n                    }\n                    if (triggerChange) {\n                        for (var i = 0; i < items.length; i++) {\n                            listView.trigger(ITEM_CHANGE, {\n                                item: items.eq(i),\n                                data: dataItems[i],\n                                ns: ui\n                            });\n                        }\n                    }\n                });\n            },\n            append: function (dataItems, triggerChange) {\n                return this.insertAt(dataItems, -1, triggerChange);\n            },\n            prepend: function (dataItems, triggerChange) {\n                return this.insertAt(dataItems, 0, triggerChange);\n            },\n            replace: function (dataItems) {\n                this.options.type = 'flat';\n                this._angularItems('cleanup');\n                kendo.destroy(this.element.children());\n                this.element.empty();\n                this._userEvents.cancel();\n                this._style();\n                return this.insertAt(dataItems, 0);\n            },\n            replaceGrouped: function (groups) {\n                this.options.type = 'group';\n                this._angularItems('cleanup');\n                this.element.empty();\n                var items = $(kendo.render(this.groupTemplate, groups));\n                this._enhanceItems(items.children('ul').children('li'));\n                this.element.append(items);\n                mobile.init(items);\n                this._style();\n                this._angularItems('compile');\n            },\n            remove: function (dataItems) {\n                var items = this.findByDataItem(dataItems);\n                this.angular('cleanup', function () {\n                    return { elements: items };\n                });\n                kendo.destroy(items);\n                items.remove();\n            },\n            findByDataItem: function (dataItems) {\n                var selectors = [];\n                for (var idx = 0, length = dataItems.length; idx < length; idx++) {\n                    selectors[idx] = '[data-' + kendo.ns + 'uid=' + dataItems[idx].uid + ']';\n                }\n                return this.element.find(selectors.join(','));\n            },\n            setDataItem: function (item, dataItem) {\n                var listView = this, replaceItem = function (items) {\n                        var newItem = $(items[0]);\n                        kendo.destroy(item);\n                        listView.angular('cleanup', function () {\n                            return { elements: [$(item)] };\n                        });\n                        $(item).replaceWith(newItem);\n                        listView.trigger(ITEM_CHANGE, {\n                            item: newItem,\n                            data: dataItem,\n                            ns: ui\n                        });\n                    };\n                return this._renderItems([dataItem], replaceItem)[0];\n            },\n            updateSize: function () {\n                this._size = this.getSize();\n            },\n            _renderItems: function (dataItems, callback) {\n                var items = $(kendo.render(this.template, dataItems));\n                callback(items);\n                this.angular('compile', function () {\n                    return {\n                        elements: items,\n                        data: dataItems.map(function (data) {\n                            return { dataItem: data };\n                        })\n                    };\n                });\n                mobile.init(items);\n                this._enhanceItems(items);\n                return items;\n            },\n            _dim: function (e) {\n                this._toggle(e, false);\n            },\n            _highlight: function (e) {\n                this._toggle(e, true);\n            },\n            _toggle: function (e, highlight) {\n                if (e.which > 1) {\n                    return;\n                }\n                var clicked = $(e.currentTarget), item = clicked.parent(), role = attrValue(clicked, 'role') || '', plainItem = !role.match(buttonRegExp), prevented = e.isDefaultPrevented();\n                if (plainItem) {\n                    item.toggleClass(ACTIVE_CLASS, highlight && !prevented);\n                }\n            },\n            _templates: function () {\n                var template = this.options.template, headerTemplate = this.options.headerTemplate, dataIDAttribute = ' data-uid=\"#=arguments[0].uid || \"\"#\"', templateProxy = {}, groupTemplateProxy = {};\n                if (typeof template === FUNCTION) {\n                    templateProxy.template = template;\n                    template = '#=this.template(data)#';\n                }\n                this.template = proxy(kendo.template('<li' + dataIDAttribute + '>' + template + '</li>'), templateProxy);\n                groupTemplateProxy.template = this.template;\n                if (typeof headerTemplate === FUNCTION) {\n                    groupTemplateProxy._headerTemplate = headerTemplate;\n                    headerTemplate = '#=this._headerTemplate(data)#';\n                }\n                groupTemplateProxy.headerTemplate = kendo.template(headerTemplate);\n                this.groupTemplate = proxy(GROUP_TEMPLATE, groupTemplateProxy);\n            },\n            _click: function (e) {\n                if (e.event.which > 1 || e.event.isDefaultPrevented()) {\n                    return;\n                }\n                var dataItem, item = e.target, target = $(e.event.target), buttonElement = target.closest(kendo.roleSelector('button', 'detailbutton', 'backbutton')), button = kendo.widgetInstance(buttonElement, ui), id = item.attr(kendo.attr('uid'));\n                if (id) {\n                    dataItem = this.dataSource.getByUid(id);\n                }\n                if (this.trigger(CLICK, {\n                        target: target,\n                        item: item,\n                        dataItem: dataItem,\n                        button: button\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _styleGroups: function () {\n                var rootItems = this.element.children();\n                rootItems.children('ul').addClass('km-list');\n                rootItems.each(function () {\n                    var li = $(this), groupHeader = li.contents().first();\n                    li.addClass('km-group-container');\n                    if (!groupHeader.is('ul') && !groupHeader.is('div.' + GROUP_CLASS)) {\n                        groupHeader.wrap(GROUP_WRAPPER);\n                    }\n                });\n            },\n            _style: function () {\n                var options = this.options, grouped = options.type === 'group', element = this.element, inset = options.style === 'inset';\n                element.addClass('km-listview').toggleClass('km-list', !grouped).toggleClass('km-virtual-list', this.virtual).toggleClass('km-listinset', !grouped && inset).toggleClass('km-listgroup', grouped && !inset).toggleClass('km-listgroupinset', grouped && inset);\n                if (!element.parents('.km-listview')[0]) {\n                    element.closest('.km-content').toggleClass('km-insetcontent', inset);\n                }\n                if (grouped) {\n                    this._styleGroups();\n                }\n                this.trigger(STYLED);\n            },\n            _enhanceItems: function (items) {\n                items.each(function () {\n                    var item = $(this), child, enhanced = false;\n                    item.children().each(function () {\n                        child = $(this);\n                        if (child.is('a')) {\n                            enhanceLinkItem(child);\n                            enhanced = true;\n                        } else if (child.is('label')) {\n                            enhanceCheckBoxItem(child);\n                            enhanced = true;\n                        }\n                    });\n                    if (!enhanced) {\n                        enhanceItem(item);\n                    }\n                });\n            }\n        });\n        ui.plugin(ListView);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.navbar', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.navbar',\n        name: 'NavBar',\n        category: 'mobile',\n        description: 'The Kendo mobile NavBar widget is used inside a mobile View or Layout Header element to display an application navigation bar.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, ui = mobile.ui, Widget = ui.Widget;\n        function createContainer(align, element) {\n            var items = element.find('[' + kendo.attr('align') + '=' + align + ']');\n            if (items[0]) {\n                return $('<div class=\"km-' + align + 'item\" />').append(items).prependTo(element);\n            }\n        }\n        function toggleTitle(centerElement) {\n            var siblings = centerElement.siblings(), noTitle = !!centerElement.children('ul')[0], showTitle = !!siblings[0] && $.trim(centerElement.text()) === '', android = !!(kendo.mobile.application && kendo.mobile.application.element.is('.km-android'));\n            centerElement.prevAll().toggleClass('km-absolute', noTitle);\n            centerElement.toggleClass('km-show-title', showTitle);\n            centerElement.toggleClass('km-fill-title', showTitle && !$.trim(centerElement.html()));\n            centerElement.toggleClass('km-no-title', noTitle);\n            centerElement.toggleClass('km-hide-title', android && !siblings.children().is(':visible'));\n        }\n        var NavBar = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                that.container().bind('show', $.proxy(this, 'refresh'));\n                element.addClass('km-navbar').wrapInner($('<div class=\"km-view-title km-show-title\" />'));\n                that.leftElement = createContainer('left', element);\n                that.rightElement = createContainer('right', element);\n                that.centerElement = element.find('.km-view-title');\n            },\n            options: { name: 'NavBar' },\n            title: function (value) {\n                this.element.find(kendo.roleSelector('view-title')).text(value);\n                toggleTitle(this.centerElement);\n            },\n            refresh: function (e) {\n                var view = e.view;\n                this.title(view.options.title);\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                kendo.destroy(this.element);\n            }\n        });\n        ui.plugin(NavBar);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.scrollview', [\n        'kendo.fx',\n        'kendo.data',\n        'kendo.draganddrop'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.scrollview',\n        name: 'ScrollView',\n        category: 'mobile',\n        description: 'The Kendo Mobile ScrollView widget is used to scroll content wider than the device screen.',\n        depends: [\n            'fx',\n            'data',\n            'draganddrop'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, ui = mobile.ui, proxy = $.proxy, Transition = kendo.effects.Transition, Pane = kendo.ui.Pane, PaneDimensions = kendo.ui.PaneDimensions, Widget = ui.DataBoundWidget, DataSource = kendo.data.DataSource, Buffer = kendo.data.Buffer, BatchBuffer = kendo.data.BatchBuffer, math = Math, abs = math.abs, ceil = math.ceil, round = math.round, max = math.max, min = math.min, floor = math.floor, CHANGE = 'change', CHANGING = 'changing', REFRESH = 'refresh', CURRENT_PAGE_CLASS = 'current-page', VIRTUAL_PAGE_CLASS = 'virtual-page', FUNCTION = 'function', ITEM_CHANGE = 'itemChange', CLEANUP = 'cleanup', VIRTUAL_PAGE_COUNT = 3, LEFT_PAGE = -1, CETER_PAGE = 0, RIGHT_PAGE = 1, LEFT_SWIPE = -1, NUDGE = 0, RIGHT_SWIPE = 1;\n        function className(name) {\n            return 'k-' + name + ' km-' + name;\n        }\n        var Pager = kendo.Class.extend({\n            init: function (scrollView) {\n                var that = this, element = $('<ol class=\\'' + className('pages') + '\\'/>');\n                scrollView.element.append(element);\n                this._changeProxy = proxy(that, '_change');\n                this._refreshProxy = proxy(that, '_refresh');\n                scrollView.bind(CHANGE, this._changeProxy);\n                scrollView.bind(REFRESH, this._refreshProxy);\n                $.extend(that, {\n                    element: element,\n                    scrollView: scrollView\n                });\n            },\n            items: function () {\n                return this.element.children();\n            },\n            _refresh: function (e) {\n                var pageHTML = '';\n                for (var idx = 0; idx < e.pageCount; idx++) {\n                    pageHTML += '<li/>';\n                }\n                this.element.html(pageHTML);\n                this.items().eq(e.page).addClass(className(CURRENT_PAGE_CLASS));\n            },\n            _change: function (e) {\n                this.items().removeClass(className(CURRENT_PAGE_CLASS)).eq(e.page).addClass(className(CURRENT_PAGE_CLASS));\n            },\n            destroy: function () {\n                this.scrollView.unbind(CHANGE, this._changeProxy);\n                this.scrollView.unbind(REFRESH, this._refreshProxy);\n                this.element.remove();\n            }\n        });\n        kendo.mobile.ui.ScrollViewPager = Pager;\n        var TRANSITION_END = 'transitionEnd', DRAG_START = 'dragStart', DRAG_END = 'dragEnd';\n        var ElasticPane = kendo.Observable.extend({\n            init: function (element, options) {\n                var that = this;\n                kendo.Observable.fn.init.call(this);\n                this.element = element;\n                this.container = element.parent();\n                var movable, transition, userEvents, dimensions, dimension, pane;\n                movable = new kendo.ui.Movable(that.element);\n                transition = new Transition({\n                    axis: 'x',\n                    movable: movable,\n                    onEnd: function () {\n                        that.trigger(TRANSITION_END);\n                    }\n                });\n                userEvents = new kendo.UserEvents(element, {\n                    fastTap: true,\n                    start: function (e) {\n                        if (abs(e.x.velocity) * 2 >= abs(e.y.velocity)) {\n                            userEvents.capture();\n                        } else {\n                            userEvents.cancel();\n                        }\n                        that.trigger(DRAG_START, e);\n                        transition.cancel();\n                    },\n                    allowSelection: true,\n                    end: function (e) {\n                        that.trigger(DRAG_END, e);\n                    }\n                });\n                dimensions = new PaneDimensions({\n                    element: that.element,\n                    container: that.container\n                });\n                dimension = dimensions.x;\n                dimension.bind(CHANGE, function () {\n                    that.trigger(CHANGE);\n                });\n                pane = new Pane({\n                    dimensions: dimensions,\n                    userEvents: userEvents,\n                    movable: movable,\n                    elastic: true\n                });\n                $.extend(that, {\n                    duration: options && options.duration || 1,\n                    movable: movable,\n                    transition: transition,\n                    userEvents: userEvents,\n                    dimensions: dimensions,\n                    dimension: dimension,\n                    pane: pane\n                });\n                this.bind([\n                    TRANSITION_END,\n                    DRAG_START,\n                    DRAG_END,\n                    CHANGE\n                ], options);\n            },\n            size: function () {\n                return {\n                    width: this.dimensions.x.getSize(),\n                    height: this.dimensions.y.getSize()\n                };\n            },\n            total: function () {\n                return this.dimension.getTotal();\n            },\n            offset: function () {\n                return -this.movable.x;\n            },\n            updateDimension: function () {\n                this.dimension.update(true);\n            },\n            refresh: function () {\n                this.dimensions.refresh();\n            },\n            moveTo: function (offset) {\n                this.movable.moveAxis('x', -offset);\n            },\n            transitionTo: function (offset, ease, instant) {\n                if (instant) {\n                    this.moveTo(-offset);\n                } else {\n                    this.transition.moveTo({\n                        location: offset,\n                        duration: this.duration,\n                        ease: ease\n                    });\n                }\n            }\n        });\n        kendo.mobile.ui.ScrollViewElasticPane = ElasticPane;\n        var ScrollViewContent = kendo.Observable.extend({\n            init: function (element, pane, options) {\n                var that = this;\n                kendo.Observable.fn.init.call(this);\n                that.element = element;\n                that.pane = pane;\n                that._getPages();\n                this.page = 0;\n                this.pageSize = options.pageSize || 1;\n                this.contentHeight = options.contentHeight;\n                this.enablePager = options.enablePager;\n                this.pagerOverlay = options.pagerOverlay;\n            },\n            scrollTo: function (page, instant) {\n                this.page = page;\n                this.pane.transitionTo(-page * this.pane.size().width, Transition.easeOutExpo, instant);\n            },\n            paneMoved: function (swipeType, bounce, callback, instant) {\n                var that = this, pane = that.pane, width = pane.size().width * that.pageSize, approx = round, ease = bounce ? Transition.easeOutBack : Transition.easeOutExpo, snap, nextPage;\n                if (swipeType === LEFT_SWIPE) {\n                    approx = ceil;\n                } else if (swipeType === RIGHT_SWIPE) {\n                    approx = floor;\n                }\n                nextPage = approx(pane.offset() / width);\n                snap = max(that.minSnap, min(-nextPage * width, that.maxSnap));\n                if (nextPage != that.page) {\n                    if (callback && callback({\n                            currentPage: that.page,\n                            nextPage: nextPage\n                        })) {\n                        snap = -that.page * pane.size().width;\n                    }\n                }\n                pane.transitionTo(snap, ease, instant);\n            },\n            updatePage: function () {\n                var pane = this.pane, page = round(pane.offset() / pane.size().width);\n                if (page != this.page) {\n                    this.page = page;\n                    return true;\n                }\n                return false;\n            },\n            forcePageUpdate: function () {\n                return this.updatePage();\n            },\n            resizeTo: function (size) {\n                var pane = this.pane, width = size.width;\n                this.pageElements.width(width);\n                if (this.contentHeight === '100%') {\n                    var containerHeight = this.element.parent().height();\n                    if (this.enablePager === true) {\n                        var pager = this.element.parent().find('ol.km-pages');\n                        if (!this.pagerOverlay && pager.length) {\n                            containerHeight -= kendo._outerHeight(pager, true);\n                        }\n                    }\n                    this.element.css('height', containerHeight);\n                    this.pageElements.css('height', containerHeight);\n                }\n                pane.updateDimension();\n                if (!this._paged) {\n                    this.page = floor(pane.offset() / width);\n                }\n                this.scrollTo(this.page, true);\n                this.pageCount = ceil(pane.total() / width);\n                this.minSnap = -(this.pageCount - 1) * width;\n                this.maxSnap = 0;\n            },\n            _getPages: function () {\n                this.pageElements = this.element.find(kendo.roleSelector('page'));\n                this._paged = this.pageElements.length > 0;\n            }\n        });\n        kendo.mobile.ui.ScrollViewContent = ScrollViewContent;\n        var VirtualScrollViewContent = kendo.Observable.extend({\n            init: function (element, pane, options) {\n                var that = this;\n                kendo.Observable.fn.init.call(this);\n                that.element = element;\n                that.pane = pane;\n                that.options = options;\n                that._templates();\n                that.page = options.page || 0;\n                that.pages = [];\n                that._initPages();\n                that.resizeTo(that.pane.size());\n                that.pane.dimension.forceEnabled();\n            },\n            setDataSource: function (dataSource) {\n                this.dataSource = DataSource.create(dataSource);\n                this._buffer();\n                this._pendingPageRefresh = false;\n                this._pendingWidgetRefresh = false;\n            },\n            _viewShow: function () {\n                var that = this;\n                if (that._pendingWidgetRefresh) {\n                    setTimeout(function () {\n                        that._resetPages();\n                    }, 0);\n                    that._pendingWidgetRefresh = false;\n                }\n            },\n            _buffer: function () {\n                var itemsPerPage = this.options.itemsPerPage;\n                if (this.buffer) {\n                    this.buffer.destroy();\n                }\n                if (itemsPerPage > 1) {\n                    this.buffer = new BatchBuffer(this.dataSource, itemsPerPage);\n                } else {\n                    this.buffer = new Buffer(this.dataSource, itemsPerPage * 3);\n                }\n                this._resizeProxy = proxy(this, '_onResize');\n                this._resetProxy = proxy(this, '_onReset');\n                this._endReachedProxy = proxy(this, '_onEndReached');\n                this.buffer.bind({\n                    'resize': this._resizeProxy,\n                    'reset': this._resetProxy,\n                    'endreached': this._endReachedProxy\n                });\n            },\n            _templates: function () {\n                var template = this.options.template, emptyTemplate = this.options.emptyTemplate, templateProxy = {}, emptyTemplateProxy = {};\n                if (typeof template === FUNCTION) {\n                    templateProxy.template = template;\n                    template = '#=this.template(data)#';\n                }\n                this.template = proxy(kendo.template(template), templateProxy);\n                if (typeof emptyTemplate === FUNCTION) {\n                    emptyTemplateProxy.emptyTemplate = emptyTemplate;\n                    emptyTemplate = '#=this.emptyTemplate(data)#';\n                }\n                this.emptyTemplate = proxy(kendo.template(emptyTemplate), emptyTemplateProxy);\n            },\n            _initPages: function () {\n                var pages = this.pages, element = this.element, page;\n                for (var i = 0; i < VIRTUAL_PAGE_COUNT; i++) {\n                    page = new Page(element);\n                    pages.push(page);\n                }\n                this.pane.updateDimension();\n            },\n            resizeTo: function (size) {\n                var pages = this.pages, pane = this.pane;\n                for (var i = 0; i < pages.length; i++) {\n                    pages[i].setWidth(size.width);\n                }\n                if (this.options.contentHeight === 'auto') {\n                    this.element.css('height', this.pages[1].element.height());\n                } else if (this.options.contentHeight === '100%') {\n                    var containerHeight = this.element.parent().height();\n                    if (this.options.enablePager === true) {\n                        var pager = this.element.parent().find('ol.km-pages');\n                        if (!this.options.pagerOverlay && pager.length) {\n                            containerHeight -= kendo._outerHeight(pager, true);\n                        }\n                    }\n                    this.element.css('height', containerHeight);\n                    pages[0].element.css('height', containerHeight);\n                    pages[1].element.css('height', containerHeight);\n                    pages[2].element.css('height', containerHeight);\n                }\n                pane.updateDimension();\n                this._repositionPages();\n                this.width = size.width;\n            },\n            scrollTo: function (page) {\n                var buffer = this.buffer, dataItem;\n                buffer.syncDataSource();\n                dataItem = buffer.at(page);\n                if (!dataItem) {\n                    return;\n                }\n                this._updatePagesContent(page);\n                this.page = page;\n            },\n            paneMoved: function (swipeType, bounce, callback, instant) {\n                var that = this, pane = that.pane, width = pane.size().width, offset = pane.offset(), thresholdPassed = Math.abs(offset) >= width / 3, ease = bounce ? kendo.effects.Transition.easeOutBack : kendo.effects.Transition.easeOutExpo, isEndReached = that.page + 2 > that.buffer.total(), nextPage, delta = 0;\n                if (swipeType === RIGHT_SWIPE) {\n                    if (that.page !== 0) {\n                        delta = -1;\n                    }\n                } else if (swipeType === LEFT_SWIPE && !isEndReached) {\n                    delta = 1;\n                } else if (offset > 0 && (thresholdPassed && !isEndReached)) {\n                    delta = 1;\n                } else if (offset < 0 && thresholdPassed) {\n                    if (that.page !== 0) {\n                        delta = -1;\n                    }\n                }\n                nextPage = that.page;\n                if (delta) {\n                    nextPage = delta > 0 ? nextPage + 1 : nextPage - 1;\n                }\n                if (callback && callback({\n                        currentPage: that.page,\n                        nextPage: nextPage\n                    })) {\n                    delta = 0;\n                }\n                if (delta === 0) {\n                    that._cancelMove(ease, instant);\n                } else if (delta === -1) {\n                    that._moveBackward(instant);\n                } else if (delta === 1) {\n                    that._moveForward(instant);\n                }\n            },\n            updatePage: function () {\n                var pages = this.pages;\n                if (this.pane.offset() === 0) {\n                    return false;\n                }\n                if (this.pane.offset() > 0) {\n                    pages.push(this.pages.shift());\n                    this.page++;\n                    this.setPageContent(pages[2], this.page + 1);\n                } else {\n                    pages.unshift(this.pages.pop());\n                    this.page--;\n                    this.setPageContent(pages[0], this.page - 1);\n                }\n                this._repositionPages();\n                this._resetMovable();\n                return true;\n            },\n            forcePageUpdate: function () {\n                var offset = this.pane.offset(), threshold = this.pane.size().width * 3 / 4;\n                if (abs(offset) > threshold) {\n                    return this.updatePage();\n                }\n                return false;\n            },\n            _resetMovable: function () {\n                this.pane.moveTo(0);\n            },\n            _moveForward: function (instant) {\n                this.pane.transitionTo(-this.width, kendo.effects.Transition.easeOutExpo, instant);\n            },\n            _moveBackward: function (instant) {\n                this.pane.transitionTo(this.width, kendo.effects.Transition.easeOutExpo, instant);\n            },\n            _cancelMove: function (ease, instant) {\n                this.pane.transitionTo(0, ease, instant);\n            },\n            _resetPages: function () {\n                this.page = this.options.page || 0;\n                this._updatePagesContent(this.page);\n                this._repositionPages();\n                this.trigger('reset');\n            },\n            _onResize: function () {\n                this.pageCount = ceil(this.dataSource.total() / this.options.itemsPerPage);\n                if (this._pendingPageRefresh) {\n                    this._updatePagesContent(this.page);\n                    this._pendingPageRefresh = false;\n                }\n                this.trigger('resize');\n            },\n            _onReset: function () {\n                this.pageCount = ceil(this.dataSource.total() / this.options.itemsPerPage);\n                this._resetPages();\n            },\n            _onEndReached: function () {\n                this._pendingPageRefresh = true;\n            },\n            _repositionPages: function () {\n                var pages = this.pages;\n                pages[0].position(LEFT_PAGE);\n                pages[1].position(CETER_PAGE);\n                pages[2].position(RIGHT_PAGE);\n            },\n            _updatePagesContent: function (offset) {\n                var pages = this.pages, currentPage = offset || 0;\n                this.setPageContent(pages[0], currentPage - 1);\n                this.setPageContent(pages[1], currentPage);\n                this.setPageContent(pages[2], currentPage + 1);\n            },\n            setPageContent: function (page, index) {\n                var buffer = this.buffer, template = this.template, emptyTemplate = this.emptyTemplate, view = null;\n                if (index >= 0) {\n                    view = buffer.at(index);\n                    if ($.isArray(view) && !view.length) {\n                        view = null;\n                    }\n                }\n                this.trigger(CLEANUP, { item: page.element });\n                if (view !== null) {\n                    page.content(template(view));\n                } else {\n                    page.content(emptyTemplate({}));\n                }\n                kendo.mobile.init(page.element);\n                this.trigger(ITEM_CHANGE, {\n                    item: page.element,\n                    data: view,\n                    ns: kendo.mobile.ui\n                });\n            }\n        });\n        kendo.mobile.ui.VirtualScrollViewContent = VirtualScrollViewContent;\n        var Page = kendo.Class.extend({\n            init: function (container) {\n                this.element = $('<div class=\\'' + className(VIRTUAL_PAGE_CLASS) + '\\'></div>');\n                this.width = container.width();\n                this.element.width(this.width);\n                container.append(this.element);\n            },\n            content: function (theContent) {\n                this.element.html(theContent);\n            },\n            position: function (position) {\n                this.element.css('transform', 'translate3d(' + this.width * position + 'px, 0, 0)');\n            },\n            setWidth: function (width) {\n                this.width = width;\n                this.element.width(width);\n            }\n        });\n        kendo.mobile.ui.VirtualPage = Page;\n        var ScrollView = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element;\n                kendo.stripWhitespace(element[0]);\n                element.wrapInner('<div/>').addClass('k-widget ' + className('scrollview'));\n                if (this.options.enablePager) {\n                    this.pager = new Pager(this);\n                    if (this.options.pagerOverlay) {\n                        element.addClass(className('scrollview-overlay'));\n                    }\n                }\n                that.inner = element.children().first();\n                that.page = 0;\n                that.inner.css('height', options.contentHeight);\n                that.pane = new ElasticPane(that.inner, {\n                    duration: this.options.duration,\n                    transitionEnd: proxy(this, '_transitionEnd'),\n                    dragStart: proxy(this, '_dragStart'),\n                    dragEnd: proxy(this, '_dragEnd'),\n                    change: proxy(this, REFRESH)\n                });\n                that.bind('resize', function () {\n                    that.pane.refresh();\n                });\n                that.page = options.page;\n                var empty = this.inner.children().length === 0;\n                var content = empty ? new VirtualScrollViewContent(that.inner, that.pane, options) : new ScrollViewContent(that.inner, that.pane, options);\n                content.page = that.page;\n                content.bind('reset', function () {\n                    this._pendingPageRefresh = false;\n                    that._syncWithContent();\n                    that.trigger(REFRESH, {\n                        pageCount: content.pageCount,\n                        page: content.page\n                    });\n                });\n                content.bind('resize', function () {\n                    that.trigger(REFRESH, {\n                        pageCount: content.pageCount,\n                        page: content.page\n                    });\n                });\n                content.bind(ITEM_CHANGE, function (e) {\n                    that.trigger(ITEM_CHANGE, e);\n                    that.angular('compile', function () {\n                        return {\n                            elements: e.item,\n                            data: [{ dataItem: e.data }]\n                        };\n                    });\n                });\n                content.bind(CLEANUP, function (e) {\n                    that.angular('cleanup', function () {\n                        return { elements: e.item };\n                    });\n                });\n                that._content = content;\n                that.setDataSource(options.dataSource);\n                var mobileContainer = that.container();\n                if (mobileContainer.nullObject) {\n                    that.viewInit();\n                    that.viewShow();\n                } else {\n                    mobileContainer.bind('show', proxy(this, 'viewShow')).bind('init', proxy(this, 'viewInit'));\n                }\n            },\n            options: {\n                name: 'ScrollView',\n                page: 0,\n                duration: 400,\n                velocityThreshold: 0.8,\n                contentHeight: 'auto',\n                pageSize: 1,\n                itemsPerPage: 1,\n                bounceVelocityThreshold: 1.6,\n                enablePager: true,\n                pagerOverlay: false,\n                autoBind: true,\n                template: '',\n                emptyTemplate: ''\n            },\n            events: [\n                CHANGING,\n                CHANGE,\n                REFRESH\n            ],\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                kendo.destroy(this.element);\n            },\n            viewInit: function () {\n                if (this.options.autoBind) {\n                    this._content.scrollTo(this._content.page, true);\n                }\n            },\n            viewShow: function () {\n                this.pane.refresh();\n            },\n            refresh: function () {\n                var content = this._content;\n                content.resizeTo(this.pane.size());\n                this.page = content.page;\n                this.trigger(REFRESH, {\n                    pageCount: content.pageCount,\n                    page: content.page\n                });\n            },\n            content: function (html) {\n                this.element.children().first().html(html);\n                this._content._getPages();\n                this.pane.refresh();\n            },\n            value: function (item) {\n                var dataSource = this.dataSource;\n                if (item) {\n                    this.scrollTo(dataSource.indexOf(item), true);\n                } else {\n                    return dataSource.at(this.page);\n                }\n            },\n            scrollTo: function (page, instant) {\n                this._content.scrollTo(page, instant);\n                this._syncWithContent();\n            },\n            prev: function () {\n                var that = this, prevPage = that.page - 1;\n                if (that._content instanceof VirtualScrollViewContent) {\n                    that._content.paneMoved(RIGHT_SWIPE, undefined, function (eventData) {\n                        return that.trigger(CHANGING, eventData);\n                    });\n                } else if (prevPage > -1) {\n                    that.scrollTo(prevPage);\n                }\n            },\n            next: function () {\n                var that = this, nextPage = that.page + 1;\n                if (that._content instanceof VirtualScrollViewContent) {\n                    that._content.paneMoved(LEFT_SWIPE, undefined, function (eventData) {\n                        return that.trigger(CHANGING, eventData);\n                    });\n                } else if (nextPage < that._content.pageCount) {\n                    that.scrollTo(nextPage);\n                }\n            },\n            setDataSource: function (dataSource) {\n                if (!(this._content instanceof VirtualScrollViewContent)) {\n                    return;\n                }\n                var emptyDataSource = !dataSource;\n                this.dataSource = DataSource.create(dataSource);\n                this._content.setDataSource(this.dataSource);\n                if (this.options.autoBind && !emptyDataSource) {\n                    this.dataSource.fetch();\n                }\n            },\n            items: function () {\n                return this.element.find('.km-' + VIRTUAL_PAGE_CLASS);\n            },\n            _syncWithContent: function () {\n                var pages = this._content.pages, buffer = this._content.buffer, data, element;\n                this.page = this._content.page;\n                data = buffer ? buffer.at(this.page) : undefined;\n                if (!(data instanceof Array)) {\n                    data = [data];\n                }\n                element = pages ? pages[1].element : undefined;\n                this.trigger(CHANGE, {\n                    page: this.page,\n                    element: element,\n                    data: data\n                });\n            },\n            _dragStart: function () {\n                if (this._content.forcePageUpdate()) {\n                    this._syncWithContent();\n                }\n            },\n            _dragEnd: function (e) {\n                var that = this, velocity = e.x.velocity, velocityThreshold = this.options.velocityThreshold, swipeType = NUDGE, bounce = abs(velocity) > this.options.bounceVelocityThreshold;\n                if (velocity > velocityThreshold) {\n                    swipeType = RIGHT_SWIPE;\n                } else if (velocity < -velocityThreshold) {\n                    swipeType = LEFT_SWIPE;\n                }\n                this._content.paneMoved(swipeType, bounce, function (eventData) {\n                    return that.trigger(CHANGING, eventData);\n                });\n            },\n            _transitionEnd: function () {\n                if (this._content.updatePage()) {\n                    this._syncWithContent();\n                }\n            }\n        });\n        ui.plugin(ScrollView);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.switch', [\n        'kendo.fx',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.switch',\n        name: 'Switch',\n        category: 'mobile',\n        description: 'The mobile Switch widget is used to display two exclusive choices.',\n        depends: [\n            'fx',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, outerWidth = kendo._outerWidth, Widget = ui.Widget, support = kendo.support, CHANGE = 'change', SWITCHON = 'switch-on', SWITCHOFF = 'switch-off', MARGINLEFT = 'margin-left', ACTIVE_STATE = 'state-active', DISABLED_STATE = 'state-disabled', DISABLED = 'disabled', RESOLVEDPREFIX = support.transitions.css === undefined ? '' : support.transitions.css, TRANSFORMSTYLE = RESOLVEDPREFIX + 'transform', proxy = $.proxy;\n        function className(name) {\n            return 'km-' + name;\n        }\n        function limitValue(value, minLimit, maxLimit) {\n            return Math.max(minLimit, Math.min(maxLimit, value));\n        }\n        var SWITCH_MARKUP = '<span class=\"' + className('switch') + ' ' + className('widget') + '\">        <span class=\"' + className('switch-wrapper') + '\">            <span class=\"' + className('switch-background') + '\"></span>        </span>         <span class=\"' + className('switch-container') + '\">            <span class=\"' + className('switch-handle') + '\">                 <span class=\"' + className('switch-label-on') + '\">{0}</span>                 <span class=\"' + className('switch-label-off') + '\">{1}</span>             </span>         </span>    </span>';\n        var Switch = Widget.extend({\n            init: function (element, options) {\n                var that = this, checked;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                that.wrapper = $(kendo.format(SWITCH_MARKUP, options.onLabel, options.offLabel));\n                that.handle = that.wrapper.find('.km-switch-handle');\n                that.background = that.wrapper.find('.km-switch-background');\n                that.wrapper.insertBefore(that.element).prepend(that.element);\n                that._drag();\n                that.origin = parseInt(that.background.css(MARGINLEFT), 10);\n                that.constrain = 0;\n                that.snapPoint = 0;\n                element = that.element[0];\n                element.type = 'checkbox';\n                that._animateBackground = true;\n                checked = that.options.checked;\n                if (checked === null) {\n                    checked = element.checked;\n                }\n                that.check(checked);\n                that.options.enable = that.options.enable && !that.element.attr(DISABLED);\n                that.enable(that.options.enable);\n                that.refresh();\n                kendo.notify(that, kendo.mobile.ui);\n            },\n            refresh: function () {\n                var that = this, handleWidth = outerWidth(that.handle, true);\n                that.width = that.wrapper.width();\n                that.constrain = that.width - handleWidth;\n                that.snapPoint = that.constrain / 2;\n                if (typeof that.origin != 'number') {\n                    that.origin = parseInt(that.background.css(MARGINLEFT), 10);\n                }\n                that.background.data('origin', that.origin);\n                that.check(that.element[0].checked);\n            },\n            events: [CHANGE],\n            options: {\n                name: 'Switch',\n                onLabel: 'on',\n                offLabel: 'off',\n                checked: null,\n                enable: true\n            },\n            check: function (check) {\n                var that = this, element = that.element[0];\n                if (check === undefined) {\n                    return element.checked;\n                }\n                that._position(check ? that.constrain : 0);\n                element.checked = check;\n                that.wrapper.toggleClass(className(SWITCHON), check).toggleClass(className(SWITCHOFF), !check);\n            },\n            value: function () {\n                return this.check.apply(this, arguments);\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.userEvents.destroy();\n            },\n            toggle: function () {\n                var that = this;\n                that.check(!that.element[0].checked);\n            },\n            enable: function (enable) {\n                var element = this.element, wrapper = this.wrapper;\n                if (typeof enable == 'undefined') {\n                    enable = true;\n                }\n                this.options.enable = enable;\n                if (enable) {\n                    element.removeAttr(DISABLED);\n                } else {\n                    element.attr(DISABLED, DISABLED);\n                }\n                wrapper.toggleClass(className(DISABLED_STATE), !enable);\n            },\n            _resize: function () {\n                this.refresh();\n            },\n            _move: function (e) {\n                var that = this;\n                e.preventDefault();\n                that._position(limitValue(that.position + e.x.delta, 0, that.width - outerWidth(that.handle, true)));\n            },\n            _position: function (position) {\n                var that = this;\n                that.position = position;\n                that.handle.css(TRANSFORMSTYLE, 'translatex(' + position + 'px)');\n                if (that._animateBackground) {\n                    that.background.css(MARGINLEFT, that.origin + position);\n                }\n            },\n            _start: function () {\n                if (!this.options.enable) {\n                    this.userEvents.cancel();\n                } else {\n                    this.userEvents.capture();\n                    this.handle.addClass(className(ACTIVE_STATE));\n                }\n            },\n            _stop: function () {\n                var that = this;\n                that.handle.removeClass(className(ACTIVE_STATE));\n                that._toggle(that.position > that.snapPoint);\n            },\n            _toggle: function (checked) {\n                var that = this, handle = that.handle, element = that.element[0], value = element.checked, duration = kendo.mobile.application && kendo.mobile.application.os.wp ? 100 : 200, distance;\n                that.wrapper.toggleClass(className(SWITCHON), checked).toggleClass(className(SWITCHOFF), !checked);\n                that.position = distance = checked * that.constrain;\n                if (that._animateBackground) {\n                    that.background.kendoStop(true, true).kendoAnimate({\n                        effects: 'slideMargin',\n                        offset: distance,\n                        reset: true,\n                        reverse: !checked,\n                        axis: 'left',\n                        duration: duration\n                    });\n                }\n                handle.kendoStop(true, true).kendoAnimate({\n                    effects: 'slideTo',\n                    duration: duration,\n                    offset: distance + 'px,0',\n                    reset: true,\n                    complete: function () {\n                        if (value !== checked) {\n                            element.checked = checked;\n                            that.trigger(CHANGE, { checked: checked });\n                        }\n                    }\n                });\n            },\n            _drag: function () {\n                var that = this;\n                that.userEvents = new kendo.UserEvents(that.wrapper, {\n                    fastTap: true,\n                    tap: function () {\n                        if (that.options.enable) {\n                            that._toggle(!that.element[0].checked);\n                        }\n                    },\n                    start: proxy(that._start, that),\n                    move: proxy(that._move, that),\n                    end: proxy(that._stop, that)\n                });\n            }\n        });\n        ui.plugin(Switch);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.tabstrip', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.tabstrip',\n        name: 'TabStrip',\n        category: 'mobile',\n        description: 'The mobile TabStrip widget is used inside a mobile view or layout footer element to display an application-wide group of navigation buttons.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Widget = ui.Widget, ACTIVE_STATE_CLASS = 'km-state-active', SELECT = 'select';\n        function createBadge(value) {\n            return $('<span class=\"km-badge\">' + value + '</span>');\n        }\n        var TabStrip = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that.container().bind('show', $.proxy(this, 'refresh'));\n                that.element.addClass('km-tabstrip').find('a').each(that._buildButton).eq(that.options.selectedIndex).addClass(ACTIVE_STATE_CLASS);\n                that.element.on('down', 'a', '_release');\n            },\n            events: [SELECT],\n            switchTo: function (url) {\n                var tabs = this.element.find('a'), tab, path, idx = 0, length = tabs.length;\n                if (isNaN(url)) {\n                    for (; idx < length; idx++) {\n                        tab = tabs[idx];\n                        path = tab.href.replace(/(\\#.+)(\\?.+)$/, '$1');\n                        if (path.indexOf(url, path.length - url.length) !== -1) {\n                            this._setActiveItem($(tab));\n                            return true;\n                        }\n                    }\n                } else {\n                    this._setActiveItem(tabs.eq(url));\n                    return true;\n                }\n                return false;\n            },\n            switchByFullUrl: function (url) {\n                var tab;\n                tab = this.element.find('a[href$=\\'' + url + '\\']');\n                this._setActiveItem(tab);\n            },\n            clear: function () {\n                this.currentItem().removeClass(ACTIVE_STATE_CLASS);\n            },\n            currentItem: function () {\n                return this.element.children('.' + ACTIVE_STATE_CLASS);\n            },\n            badge: function (item, value) {\n                var tabstrip = this.element, badge;\n                if (!isNaN(item)) {\n                    item = tabstrip.children().get(item);\n                }\n                item = tabstrip.find(item);\n                badge = $(item.find('.km-badge')[0] || createBadge(value).insertAfter(item.children('.km-icon')));\n                if (value || value === 0) {\n                    badge.html(value);\n                    return this;\n                }\n                if (value === false) {\n                    badge.empty().remove();\n                    return this;\n                }\n                return badge.html();\n            },\n            _release: function (e) {\n                if (e.which > 1) {\n                    return;\n                }\n                var that = this, item = $(e.currentTarget);\n                if (item[0] === that.currentItem()[0]) {\n                    return;\n                }\n                if (that.trigger(SELECT, { item: item })) {\n                    e.preventDefault();\n                } else {\n                    that._setActiveItem(item);\n                }\n            },\n            _setActiveItem: function (item) {\n                if (!item[0]) {\n                    return;\n                }\n                this.clear();\n                item.addClass(ACTIVE_STATE_CLASS);\n            },\n            _buildButton: function () {\n                var button = $(this), icon = kendo.attrValue(button, 'icon'), badge = kendo.attrValue(button, 'badge'), image = button.find('img'), iconSpan = $('<span class=\"km-icon\"/>');\n                button.addClass('km-button').attr(kendo.attr('role'), 'tab').contents().not(image).wrapAll('<span class=\"km-text\"/>');\n                if (image[0]) {\n                    image.addClass('km-image').prependTo(button);\n                } else {\n                    button.prepend(iconSpan);\n                    if (icon) {\n                        iconSpan.addClass('km-' + icon);\n                        if (badge || badge === 0) {\n                            createBadge(badge).insertAfter(iconSpan);\n                        }\n                    }\n                }\n            },\n            refresh: function (e) {\n                var url = e.view.id;\n                if (url && !this.switchTo(e.view.id)) {\n                    this.switchTo(url);\n                }\n            },\n            options: {\n                name: 'TabStrip',\n                selectedIndex: 0,\n                enable: true\n            }\n        });\n        ui.plugin(TabStrip);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.angular', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'angular',\n        name: 'AngularJS Directives',\n        category: 'framework',\n        description: 'Adds Kendo UI for AngularJS directives',\n        depends: ['core'],\n        defer: true\n    };\n    (function ($, angular, undefined) {\n        'use strict';\n        if (!angular || !angular.injector) {\n            return;\n        }\n        var module = angular.module('kendo.directives', []), $injector = angular.injector(['ng']), $parse = $injector.get('$parse'), $timeout = $injector.get('$timeout'), $defaultCompile, $log = $injector.get('$log');\n        function withoutTimeout(f) {\n            var save = $timeout;\n            try {\n                $timeout = function (f) {\n                    return f();\n                };\n                return f();\n            } finally {\n                $timeout = save;\n            }\n        }\n        var OPTIONS_NOW;\n        var createDataSource = function () {\n            var types = {\n                TreeList: 'TreeListDataSource',\n                TreeView: 'HierarchicalDataSource',\n                Scheduler: 'SchedulerDataSource',\n                PivotGrid: 'PivotDataSource',\n                PivotConfigurator: 'PivotDataSource',\n                PanelBar: 'HierarchicalDataSource',\n                Menu: '$PLAIN',\n                ContextMenu: '$PLAIN'\n            };\n            var toDataSource = function (dataSource, type) {\n                if (type == '$PLAIN') {\n                    return dataSource;\n                }\n                return kendo.data[type].create(dataSource);\n            };\n            return function (scope, element, role, source) {\n                var type = types[role] || 'DataSource';\n                var current = scope.$eval(source);\n                var ds = toDataSource(current, type);\n                scope.$watch(source, function (mew) {\n                    var widget = kendoWidgetInstance(element);\n                    if (widget && typeof widget.setDataSource == 'function') {\n                        if (mew !== current && mew !== widget.dataSource) {\n                            var ds = toDataSource(mew, type);\n                            widget.setDataSource(ds);\n                            current = mew;\n                        }\n                    }\n                });\n                return ds;\n            };\n        }();\n        var ignoredAttributes = {\n            kDataSource: true,\n            kOptions: true,\n            kRebind: true,\n            kNgModel: true,\n            kNgDelay: true\n        };\n        var ignoredOwnProperties = {\n            name: true,\n            title: true,\n            style: true\n        };\n        function createWidget(scope, element, attrs, widget, origAttr, controllers) {\n            if (!(element instanceof jQuery)) {\n                throw new Error('The Kendo UI directives require jQuery to be available before AngularJS. Please include jquery before angular in the document.');\n            }\n            var kNgDelay = attrs.kNgDelay, delayValue = scope.$eval(kNgDelay);\n            controllers = controllers || [];\n            var ngModel = controllers[0], ngForm = controllers[1];\n            var ctor = $(element)[widget];\n            if (!ctor) {\n                window.console.error('Could not find: ' + widget);\n                return null;\n            }\n            var parsed = parseOptions(scope, element, attrs, widget, ctor);\n            var options = parsed.options;\n            if (parsed.unresolved.length) {\n                var promises = [];\n                for (var i = 0, len = parsed.unresolved.length; i < len; i++) {\n                    var unresolved = parsed.unresolved[i];\n                    var promise = $.Deferred(function (d) {\n                        var unwatch = scope.$watch(unresolved.path, function (newValue) {\n                            if (newValue !== undefined) {\n                                unwatch();\n                                d.resolve();\n                            }\n                        });\n                    }).promise();\n                    promises.push(promise);\n                }\n                $.when.apply(null, promises).then(createIt);\n                return;\n            }\n            if (kNgDelay && !delayValue) {\n                var root = scope.$root || scope;\n                var register = function () {\n                    var unregister = scope.$watch(kNgDelay, function (newValue) {\n                        if (newValue !== undefined) {\n                            unregister();\n                            element.removeAttr(attrs.$attr.kNgDelay);\n                            kNgDelay = null;\n                            $timeout(createIt);\n                        }\n                    });\n                };\n                if (/^\\$(digest|apply)$/.test(root.$$phase)) {\n                    register();\n                } else {\n                    scope.$apply(register);\n                }\n                return;\n            } else {\n                return createIt();\n            }\n            function createIt() {\n                var originalElement;\n                if (attrs.kRebind) {\n                    originalElement = $($(element)[0].cloneNode(true));\n                }\n                options = parseOptions(scope, element, attrs, widget, ctor).options;\n                if (element.is('select')) {\n                    (function (options) {\n                        if (options.length > 0) {\n                            var first = $(options[0]);\n                            if (!/\\S/.test(first.text()) && /^\\?/.test(first.val())) {\n                                first.remove();\n                            }\n                            for (var i = 0; i < options.length; i++) {\n                                $(options[i]).off('$destroy');\n                            }\n                        }\n                    }(element[0].options));\n                }\n                var object = ctor.call(element, OPTIONS_NOW = options).data(widget);\n                exposeWidget(object, scope, attrs, widget, origAttr);\n                scope.$emit('kendoWidgetCreated', object);\n                var destroyRegister = destroyWidgetOnScopeDestroy(scope, object);\n                if (attrs.kRebind) {\n                    setupRebind(object, scope, element, originalElement, attrs.kRebind, destroyRegister, attrs);\n                }\n                if (attrs.kNgDisabled) {\n                    var kNgDisabled = attrs.kNgDisabled;\n                    var isDisabled = scope.$eval(kNgDisabled);\n                    if (isDisabled) {\n                        object.enable(!isDisabled);\n                    }\n                    bindToKNgDisabled(object, scope, element, kNgDisabled);\n                }\n                if (attrs.kNgReadonly) {\n                    var kNgReadonly = attrs.kNgReadonly;\n                    var isReadonly = scope.$eval(kNgReadonly);\n                    if (isReadonly) {\n                        object.readonly(isReadonly);\n                    }\n                    bindToKNgReadonly(object, scope, element, kNgReadonly);\n                }\n                if (attrs.kNgModel) {\n                    bindToKNgModel(object, scope, attrs.kNgModel);\n                }\n                if (ngModel) {\n                    bindToNgModel(object, scope, element, ngModel, ngForm);\n                }\n                if (object) {\n                    propagateClassToWidgetWrapper(object, element);\n                }\n                return object;\n            }\n        }\n        function parseOptions(scope, element, attrs, widget, ctor) {\n            var role = widget.replace(/^kendo/, '');\n            var unresolved = [];\n            var optionsPath = attrs.kOptions || attrs.options;\n            var optionsValue = scope.$eval(optionsPath);\n            if (optionsPath && optionsValue === undefined) {\n                unresolved.push({\n                    option: 'options',\n                    path: optionsPath\n                });\n            }\n            var options = angular.extend({}, attrs.defaultOptions, optionsValue);\n            function addOption(name, value) {\n                var scopeValue = angular.copy(scope.$eval(value));\n                if (scopeValue === undefined) {\n                    unresolved.push({\n                        option: name,\n                        path: value\n                    });\n                } else {\n                    options[name] = scopeValue;\n                }\n            }\n            var widgetOptions = ctor.widget.prototype.options;\n            var widgetEvents = ctor.widget.prototype.events;\n            $.each(attrs, function (name, value) {\n                if (name === 'source' || name === 'kDataSource' || name === 'kScopeField' || name === 'scopeField') {\n                    return;\n                }\n                var dataName = 'data' + name.charAt(0).toUpperCase() + name.slice(1);\n                if (name.indexOf('on') === 0) {\n                    var eventKey = name.replace(/^on./, function (prefix) {\n                        return prefix.charAt(2).toLowerCase();\n                    });\n                    if (widgetEvents.indexOf(eventKey) > -1) {\n                        options[eventKey] = value;\n                    }\n                }\n                if (widgetOptions.hasOwnProperty(dataName)) {\n                    addOption(dataName, value);\n                } else if (widgetOptions.hasOwnProperty(name) && !ignoredOwnProperties[name]) {\n                    addOption(name, value);\n                } else if (!ignoredAttributes[name]) {\n                    var match = name.match(/^k(On)?([A-Z].*)/);\n                    if (match) {\n                        var optionName = match[2].charAt(0).toLowerCase() + match[2].slice(1);\n                        if (match[1] && name != 'kOnLabel') {\n                            options[optionName] = value;\n                        } else {\n                            if (name == 'kOnLabel') {\n                                optionName = 'onLabel';\n                            }\n                            addOption(optionName, value);\n                        }\n                    }\n                }\n            });\n            var dataSource = attrs.kDataSource || attrs.source;\n            if (dataSource) {\n                options.dataSource = createDataSource(scope, element, role, dataSource);\n            }\n            options.$angular = [scope];\n            return {\n                options: options,\n                unresolved: unresolved\n            };\n        }\n        function bindToKNgDisabled(widget, scope, element, kNgDisabled) {\n            if (kendo.ui.PanelBar && widget instanceof kendo.ui.PanelBar || kendo.ui.Menu && widget instanceof kendo.ui.Menu) {\n                $log.warn('k-ng-disabled specified on a widget that does not have the enable() method: ' + widget.options.name);\n                return;\n            }\n            scope.$watch(kNgDisabled, function (newValue, oldValue) {\n                if (newValue != oldValue) {\n                    widget.enable(!newValue);\n                }\n            });\n        }\n        function bindToKNgReadonly(widget, scope, element, kNgReadonly) {\n            if (typeof widget.readonly != 'function') {\n                $log.warn('k-ng-readonly specified on a widget that does not have the readonly() method: ' + widget.options.name);\n                return;\n            }\n            scope.$watch(kNgReadonly, function (newValue, oldValue) {\n                if (newValue != oldValue) {\n                    widget.readonly(newValue);\n                }\n            });\n        }\n        function exposeWidget(widget, scope, attrs, kendoWidget, origAttr) {\n            if (attrs[origAttr]) {\n                var set = $parse(attrs[origAttr]).assign;\n                if (set) {\n                    set(scope, widget);\n                } else {\n                    throw new Error(origAttr + ' attribute used but expression in it is not assignable: ' + attrs[kendoWidget]);\n                }\n            }\n        }\n        function formValue(element) {\n            if (/checkbox|radio/i.test(element.attr('type'))) {\n                return element.prop('checked');\n            }\n            return element.val();\n        }\n        var formRegExp = /^(input|select|textarea)$/i;\n        function isForm(element) {\n            return formRegExp.test(element[0].tagName);\n        }\n        function bindToNgModel(widget, scope, element, ngModel, ngForm) {\n            if (!widget.value) {\n                return;\n            }\n            var value;\n            var haveChangeOnElement = false;\n            if (isForm(element)) {\n                value = function () {\n                    return formValue(element);\n                };\n            } else {\n                value = function () {\n                    return widget.value();\n                };\n            }\n            var viewRender = function () {\n                var val = ngModel.$viewValue;\n                if (val === undefined) {\n                    val = ngModel.$modelValue;\n                }\n                if (val === undefined) {\n                    val = null;\n                }\n                haveChangeOnElement = true;\n                setTimeout(function () {\n                    haveChangeOnElement = false;\n                    if (widget) {\n                        var kNgModel = scope[widget.element.attr('k-ng-model')];\n                        if (kNgModel) {\n                            val = kNgModel;\n                        }\n                        if (widget.options.autoBind === false && !widget.listView.bound()) {\n                            if (val) {\n                                widget.value(val);\n                            }\n                        } else {\n                            widget.value(val);\n                        }\n                    }\n                }, 0);\n            };\n            ngModel.$render = viewRender;\n            setTimeout(function () {\n                if (ngModel.$render !== viewRender) {\n                    ngModel.$render = viewRender;\n                    ngModel.$render();\n                }\n            });\n            if (isForm(element)) {\n                element.on('change', function () {\n                    haveChangeOnElement = true;\n                });\n            }\n            var onChange = function (pristine) {\n                return function () {\n                    var formPristine;\n                    if (haveChangeOnElement && !element.is('select')) {\n                        return;\n                    }\n                    if (pristine && ngForm) {\n                        formPristine = ngForm.$pristine;\n                    }\n                    ngModel.$setViewValue(value());\n                    if (pristine) {\n                        ngModel.$setPristine();\n                        if (formPristine) {\n                            ngForm.$setPristine();\n                        }\n                    }\n                    digest(scope);\n                };\n            };\n            widget.first('change', onChange(false));\n            widget.first('spin', onChange(false));\n            if (!(kendo.ui.AutoComplete && widget instanceof kendo.ui.AutoComplete)) {\n                widget.first('dataBound', onChange(true));\n            }\n            var currentVal = value();\n            if (!isNaN(ngModel.$viewValue) && currentVal != ngModel.$viewValue) {\n                if (!ngModel.$isEmpty(ngModel.$viewValue)) {\n                    widget.value(ngModel.$viewValue);\n                } else if (currentVal != null && currentVal !== '' && currentVal != ngModel.$viewValue) {\n                    ngModel.$setViewValue(currentVal);\n                }\n            }\n            ngModel.$setPristine();\n        }\n        function bindToKNgModel(widget, scope, kNgModel) {\n            if (kendo.ui.DateRangePicker && widget instanceof kendo.ui.DateRangePicker) {\n                var rangePickerModels = kNgModel.split(',');\n                var rangePickerStartModel = rangePickerModels[0].trim();\n                var rangePickerEndModel;\n                bindToKNgModel(widget._startDateInput, scope, rangePickerStartModel);\n                if (rangePickerModels[1]) {\n                    rangePickerEndModel = rangePickerModels[1].trim();\n                    bindToKNgModel(widget._endDateInput, scope, rangePickerEndModel);\n                    widget.range({\n                        start: scope[rangePickerStartModel],\n                        end: scope[rangePickerEndModel]\n                    });\n                } else {\n                    widget.range({\n                        start: scope[rangePickerStartModel],\n                        end: null\n                    });\n                }\n                return;\n            }\n            if (typeof widget.value != 'function') {\n                $log.warn('k-ng-model specified on a widget that does not have the value() method: ' + widget.options.name);\n                return;\n            }\n            var form = $(widget.element).parents('ng-form, form').first();\n            var ngForm = kendo.getter(form.attr('name'), true)(scope);\n            var getter = $parse(kNgModel);\n            var setter = getter.assign;\n            var updating = false;\n            var valueIsCollection = kendo.ui.MultiSelect && widget instanceof kendo.ui.MultiSelect || kendo.ui.RangeSlider && widget instanceof kendo.ui.RangeSlider;\n            var length = function (value) {\n                return value && valueIsCollection ? value.length : 0;\n            };\n            var currentValueLength = length(getter(scope));\n            widget.$angular_setLogicValue(getter(scope));\n            var watchHandler = function (newValue, oldValue) {\n                if (newValue === undefined) {\n                    newValue = null;\n                }\n                if (updating || newValue == oldValue && length(newValue) == currentValueLength) {\n                    return;\n                }\n                currentValueLength = length(newValue);\n                widget.$angular_setLogicValue(newValue);\n            };\n            if (valueIsCollection) {\n                scope.$watchCollection(kNgModel, watchHandler);\n            } else {\n                scope.$watch(kNgModel, watchHandler);\n            }\n            var changeHandler = function () {\n                updating = true;\n                if (ngForm && ngForm.$pristine) {\n                    ngForm.$setDirty();\n                }\n                digest(scope, function () {\n                    setter(scope, widget.$angular_getLogicValue());\n                    currentValueLength = length(getter(scope));\n                });\n                updating = false;\n            };\n            widget.first('change', changeHandler);\n            widget.first('spin', changeHandler);\n        }\n        function destroyWidgetOnScopeDestroy(scope, widget) {\n            var deregister = scope.$on('$destroy', function () {\n                deregister();\n                if (widget) {\n                    kendo.destroy(widget.element);\n                    widget = null;\n                }\n            });\n            return deregister;\n        }\n        function propagateClassToWidgetWrapper(widget, element) {\n            if (!(window.MutationObserver && widget.wrapper)) {\n                return;\n            }\n            var prevClassList = [].slice.call($(element)[0].classList);\n            var mo = new MutationObserver(function (changes) {\n                suspend();\n                if (!widget) {\n                    return;\n                }\n                changes.forEach(function (chg) {\n                    var w = $(widget.wrapper)[0];\n                    switch (chg.attributeName) {\n                    case 'class':\n                        var currClassList = [].slice.call(chg.target.classList);\n                        currClassList.forEach(function (cls) {\n                            if (prevClassList.indexOf(cls) < 0) {\n                                w.classList.add(cls);\n                                if (kendo.ui.ComboBox && widget instanceof kendo.ui.ComboBox) {\n                                    widget.input[0].classList.add(cls);\n                                }\n                            }\n                        });\n                        prevClassList.forEach(function (cls) {\n                            if (currClassList.indexOf(cls) < 0) {\n                                w.classList.remove(cls);\n                                if (kendo.ui.ComboBox && widget instanceof kendo.ui.ComboBox) {\n                                    widget.input[0].classList.remove(cls);\n                                }\n                            }\n                        });\n                        prevClassList = currClassList;\n                        break;\n                    case 'disabled':\n                        if (typeof widget.enable == 'function' && !widget.element.attr('readonly')) {\n                            widget.enable(!$(chg.target).attr('disabled'));\n                        }\n                        break;\n                    case 'readonly':\n                        if (typeof widget.readonly == 'function' && !widget.element.attr('disabled')) {\n                            widget.readonly(!!$(chg.target).attr('readonly'));\n                        }\n                        break;\n                    }\n                });\n                resume();\n            });\n            function suspend() {\n                mo.disconnect();\n            }\n            function resume() {\n                mo.observe($(element)[0], { attributes: true });\n            }\n            resume();\n            widget.first('destroy', suspend);\n        }\n        function setupRebind(widget, scope, element, originalElement, rebindAttr, destroyRegister, attrs) {\n            var unregister = scope.$watch(rebindAttr, function (newValue, oldValue) {\n                if (!widget._muteRebind && newValue !== oldValue) {\n                    unregister();\n                    if (attrs._cleanUp) {\n                        attrs._cleanUp();\n                    }\n                    var templateOptions = WIDGET_TEMPLATE_OPTIONS[widget.options.name];\n                    if (templateOptions) {\n                        templateOptions.forEach(function (name) {\n                            var templateContents = scope.$eval(attrs['k' + name]);\n                            if (templateContents) {\n                                originalElement.append($(templateContents).attr(kendo.toHyphens('k' + name), ''));\n                            }\n                        });\n                    }\n                    var _wrapper = $(widget.wrapper)[0];\n                    var _element = $(widget.element)[0];\n                    var isUpload = widget.options.name === 'Upload';\n                    if (isUpload) {\n                        element = $(_element);\n                    }\n                    var compile = element.injector().get('$compile');\n                    widget._destroy();\n                    if (destroyRegister) {\n                        destroyRegister();\n                    }\n                    widget = null;\n                    if (_element) {\n                        if (_wrapper) {\n                            _wrapper.parentNode.replaceChild(_element, _wrapper);\n                        }\n                        $(element).replaceWith(originalElement);\n                    }\n                    compile(originalElement)(scope);\n                }\n            }, true);\n            digest(scope);\n        }\n        function bind(f, obj) {\n            return function (a, b) {\n                return f.call(obj, a, b);\n            };\n        }\n        function setTemplate(key, value) {\n            this[key] = kendo.stringify(value);\n        }\n        module.factory('directiveFactory', [\n            '$compile',\n            function (compile) {\n                var kendoRenderedTimeout;\n                var RENDERED = false;\n                $defaultCompile = compile;\n                var create = function (role, origAttr) {\n                    return {\n                        restrict: 'AC',\n                        require: [\n                            '?ngModel',\n                            '^?form'\n                        ],\n                        scope: false,\n                        controller: [\n                            '$scope',\n                            '$attrs',\n                            '$element',\n                            function ($scope, $attrs) {\n                                this.template = bind(setTemplate, $attrs);\n                                $attrs._cleanUp = bind(function () {\n                                    this.template = null;\n                                    $attrs._cleanUp = null;\n                                }, this);\n                            }\n                        ],\n                        link: function (scope, element, attrs, controllers) {\n                            var $element = $(element);\n                            var roleattr = role.replace(/([A-Z])/g, '-$1');\n                            $element.attr(roleattr, $element.attr('data-' + roleattr));\n                            $element[0].removeAttribute('data-' + roleattr);\n                            var widget = createWidget(scope, element, attrs, role, origAttr, controllers);\n                            if (!widget) {\n                                return;\n                            }\n                            if (kendoRenderedTimeout) {\n                                clearTimeout(kendoRenderedTimeout);\n                            }\n                            kendoRenderedTimeout = setTimeout(function () {\n                                scope.$emit('kendoRendered');\n                                if (!RENDERED) {\n                                    RENDERED = true;\n                                    $('form').each(function () {\n                                        var form = $(this).controller('form');\n                                        if (form) {\n                                            form.$setPristine();\n                                        }\n                                    });\n                                }\n                            });\n                        }\n                    };\n                };\n                return { create: create };\n            }\n        ]);\n        var TAGNAMES = {\n            Editor: 'textarea',\n            NumericTextBox: 'input',\n            DatePicker: 'input',\n            DateTimePicker: 'input',\n            TimePicker: 'input',\n            AutoComplete: 'input',\n            ColorPicker: 'input',\n            MaskedTextBox: 'input',\n            MultiSelect: 'input',\n            Upload: 'input',\n            Validator: 'form',\n            Button: 'button',\n            MobileButton: 'a',\n            MobileBackButton: 'a',\n            MobileDetailButton: 'a',\n            ListView: 'ul',\n            MobileListView: 'ul',\n            ScrollView: 'div',\n            PanelBar: 'ul',\n            TreeView: 'ul',\n            Menu: 'ul',\n            ContextMenu: 'ul',\n            ActionSheet: 'ul',\n            Switch: 'input'\n        };\n        var SKIP_SHORTCUTS = [\n            'MobileView',\n            'MobileDrawer',\n            'MobileLayout',\n            'MobileSplitView',\n            'MobilePane',\n            'MobileModalView'\n        ];\n        var MANUAL_DIRECTIVES = [\n            'MobileApplication',\n            'MobileView',\n            'MobileModalView',\n            'MobileLayout',\n            'MobileActionSheet',\n            'MobileDrawer',\n            'MobileSplitView',\n            'MobilePane',\n            'MobileScrollView',\n            'MobilePopOver'\n        ];\n        angular.forEach([\n            'MobileNavBar',\n            'MobileButton',\n            'MobileBackButton',\n            'MobileDetailButton',\n            'MobileTabStrip',\n            'MobileScrollView',\n            'MobileScroller'\n        ], function (widget) {\n            MANUAL_DIRECTIVES.push(widget);\n            widget = 'kendo' + widget;\n            module.directive(widget, function () {\n                return {\n                    restrict: 'A',\n                    link: function (scope, element, attrs) {\n                        createWidget(scope, element, attrs, widget, widget);\n                    }\n                };\n            });\n        });\n        function createDirectives(klass, isMobile) {\n            function make(directiveName, widgetName) {\n                module.directive(directiveName, [\n                    'directiveFactory',\n                    function (directiveFactory) {\n                        return directiveFactory.create(widgetName, directiveName);\n                    }\n                ]);\n            }\n            var name = isMobile ? 'Mobile' : '';\n            name += klass.fn.options.name;\n            var className = name;\n            var shortcut = 'kendo' + name.charAt(0) + name.substr(1).toLowerCase();\n            name = 'kendo' + name;\n            var dashed = name.replace(/([A-Z])/g, '-$1');\n            if (SKIP_SHORTCUTS.indexOf(name.replace('kendo', '')) == -1) {\n                var names = name === shortcut ? [name] : [\n                    name,\n                    shortcut\n                ];\n                angular.forEach(names, function (directiveName) {\n                    module.directive(directiveName, function () {\n                        return {\n                            restrict: 'E',\n                            replace: true,\n                            template: function (element, attributes) {\n                                var tag = TAGNAMES[className] || 'div';\n                                var scopeField = attributes.kScopeField || attributes.scopeField;\n                                return '<' + tag + ' ' + dashed + (scopeField ? '=\"' + scopeField + '\"' : '') + '>' + element.html() + '</' + tag + '>';\n                            }\n                        };\n                    });\n                });\n            }\n            if (MANUAL_DIRECTIVES.indexOf(name.replace('kendo', '')) > -1) {\n                return;\n            }\n            make(name, name);\n            if (shortcut != name) {\n                make(shortcut, name);\n            }\n        }\n        function kendoWidgetInstance(el) {\n            el = $(el);\n            return kendo.widgetInstance(el, kendo.ui) || kendo.widgetInstance(el, kendo.mobile.ui) || kendo.widgetInstance(el, kendo.dataviz.ui);\n        }\n        function digest(scope, func) {\n            var root = scope.$root || scope;\n            var isDigesting = /^\\$(digest|apply)$/.test(root.$$phase);\n            if (func) {\n                if (isDigesting) {\n                    func();\n                } else {\n                    root.$apply(func);\n                }\n            } else if (!isDigesting) {\n                root.$digest();\n            }\n        }\n        function destroyScope(scope, el) {\n            scope.$destroy();\n            if (el) {\n                $(el).removeData('$scope').removeData('$$kendoScope').removeData('$isolateScope').removeData('$isolateScopeNoTemplate').removeClass('ng-scope');\n            }\n        }\n        var encode = kendo.htmlEncode;\n        var open = /{{/g;\n        var close = /}}/g;\n        var encOpen = '{&#8203;{';\n        var encClose = '}&#8203;}';\n        kendo.htmlEncode = function (str) {\n            return encode(str).replace(open, encOpen).replace(close, encClose);\n        };\n        var pendingPatches = [];\n        function defadvice(klass, methodName, func) {\n            if ($.isArray(klass)) {\n                return angular.forEach(klass, function (klass) {\n                    defadvice(klass, methodName, func);\n                });\n            }\n            if (typeof klass == 'string') {\n                var a = klass.split('.');\n                var x = kendo;\n                while (x && a.length > 0) {\n                    x = x[a.shift()];\n                }\n                if (!x) {\n                    pendingPatches.push([\n                        klass,\n                        methodName,\n                        func\n                    ]);\n                    return false;\n                }\n                klass = x.prototype;\n            }\n            var origMethod = klass[methodName];\n            klass[methodName] = function () {\n                var self = this, args = arguments;\n                return func.apply({\n                    self: self,\n                    next: function () {\n                        return origMethod.apply(self, arguments.length > 0 ? arguments : args);\n                    }\n                }, args);\n            };\n            return true;\n        }\n        kendo.onWidgetRegistered(function (entry) {\n            pendingPatches = $.grep(pendingPatches, function (args) {\n                return !defadvice.apply(null, args);\n            });\n            createDirectives(entry.widget, entry.prefix == 'Mobile');\n        });\n        defadvice([\n            'ui.Widget',\n            'mobile.ui.Widget'\n        ], 'angular', function (cmd, arg) {\n            var self = this.self;\n            if (cmd == 'init') {\n                if (!arg && OPTIONS_NOW) {\n                    arg = OPTIONS_NOW;\n                }\n                OPTIONS_NOW = null;\n                if (arg && arg.$angular) {\n                    self.$angular_scope = arg.$angular[0];\n                    self.$angular_init(self.element, arg);\n                }\n                return;\n            }\n            var scope = self.$angular_scope;\n            if (scope) {\n                withoutTimeout(function () {\n                    var x = arg(), elements = x.elements, data = x.data;\n                    if (elements.length > 0) {\n                        switch (cmd) {\n                        case 'cleanup':\n                            angular.forEach(elements, function (el) {\n                                var itemScope = $(el).data('$$kendoScope');\n                                if (itemScope && itemScope !== scope && itemScope.$$kendoScope) {\n                                    destroyScope(itemScope, el);\n                                }\n                            });\n                            break;\n                        case 'compile':\n                            var injector = self.element.injector();\n                            var compile = injector ? injector.get('$compile') : $defaultCompile;\n                            angular.forEach(elements, function (el, i) {\n                                var itemScope;\n                                if (x.scopeFrom) {\n                                    itemScope = x.scopeFrom;\n                                } else {\n                                    var vars = data && data[i];\n                                    if (vars !== undefined) {\n                                        itemScope = $.extend(scope.$new(), vars);\n                                        itemScope.$$kendoScope = true;\n                                    } else {\n                                        itemScope = scope;\n                                    }\n                                }\n                                $(el).data('$$kendoScope', itemScope);\n                                compile(el)(itemScope);\n                            });\n                            digest(scope);\n                            break;\n                        }\n                    }\n                });\n            }\n        });\n        defadvice('ui.Widget', '$angular_getLogicValue', function () {\n            return this.self.value();\n        });\n        defadvice('ui.Widget', '$angular_setLogicValue', function (val) {\n            this.self.value(val);\n        });\n        defadvice('ui.Select', '$angular_getLogicValue', function () {\n            var item = this.self.dataItem(), valueField = this.self.options.dataValueField;\n            if (item) {\n                if (this.self.options.valuePrimitive) {\n                    if (!!valueField) {\n                        return item[valueField];\n                    } else {\n                        return item;\n                    }\n                } else {\n                    return item.toJSON();\n                }\n            } else {\n                return null;\n            }\n        });\n        defadvice('ui.Select', '$angular_setLogicValue', function (val) {\n            var self = this.self;\n            var options = self.options;\n            var valueField = options.dataValueField;\n            var text = options.text || '';\n            if (val === undefined) {\n                val = '';\n            }\n            if (valueField && !options.valuePrimitive && val) {\n                text = val[options.dataTextField] || '';\n                val = val[valueField || options.dataTextField];\n            }\n            if (self.options.autoBind === false && !self.listView.bound()) {\n                if (!text && val && options.valuePrimitive) {\n                    self.value(val);\n                } else {\n                    self._preselect(val, text);\n                }\n            } else {\n                self.value(val);\n            }\n        });\n        defadvice('ui.MultiSelect', '$angular_getLogicValue', function () {\n            var value = this.self.dataItems().slice(0);\n            var valueField = this.self.options.dataValueField;\n            if (valueField && this.self.options.valuePrimitive) {\n                value = $.map(value, function (item) {\n                    return item[valueField];\n                });\n            }\n            return value;\n        });\n        defadvice('ui.MultiSelect', '$angular_setLogicValue', function (val) {\n            if (val == null) {\n                val = [];\n            }\n            var self = this.self;\n            var options = self.options;\n            var valueField = options.dataValueField;\n            var data = val;\n            if (valueField && !options.valuePrimitive) {\n                val = $.map(val, function (item) {\n                    return item[valueField];\n                });\n            }\n            if (options.autoBind === false && !options.valuePrimitive && !self.listView.bound()) {\n                self._preselect(data, val);\n            } else {\n                self.value(val);\n            }\n        });\n        defadvice('ui.Widget', '$angular_init', function (element, options) {\n            var self = this.self;\n            if (options && !$.isArray(options)) {\n                var scope = self.$angular_scope;\n                for (var i = self.events.length; --i >= 0;) {\n                    var event = self.events[i];\n                    var handler = options[event];\n                    if (handler && typeof handler == 'string') {\n                        options[event] = self.$angular_makeEventHandler(event, scope, handler);\n                    }\n                }\n            }\n        });\n        defadvice('ui.Widget', '$angular_makeEventHandler', function (event, scope, handler) {\n            handler = $parse(handler);\n            return function (e) {\n                digest(scope, function () {\n                    handler(scope, { kendoEvent: e });\n                });\n            };\n        });\n        defadvice([\n            'ui.Grid',\n            'ui.ListView',\n            'ui.TreeView',\n            'ui.PanelBar'\n        ], '$angular_makeEventHandler', function (event, scope, handler) {\n            if (event != 'change') {\n                return this.next();\n            }\n            handler = $parse(handler);\n            return function (ev) {\n                var widget = ev.sender;\n                var options = widget.options;\n                var cell, multiple, locals = { kendoEvent: ev }, elems, items, columns, colIdx;\n                if (angular.isString(options.selectable)) {\n                    cell = options.selectable.indexOf('cell') !== -1;\n                    multiple = options.selectable.indexOf('multiple') !== -1;\n                }\n                if (widget._checkBoxSelection) {\n                    multiple = true;\n                }\n                elems = locals.selected = this.select();\n                items = locals.data = [];\n                columns = locals.columns = [];\n                for (var i = 0; i < elems.length; i++) {\n                    var item = cell ? elems[i].parentNode : elems[i];\n                    var dataItem = widget.dataItem(item);\n                    if (cell) {\n                        if (angular.element.inArray(dataItem, items) < 0) {\n                            items.push(dataItem);\n                        }\n                        colIdx = angular.element(elems[i]).index();\n                        if (angular.element.inArray(colIdx, columns) < 0) {\n                            columns.push(colIdx);\n                        }\n                    } else {\n                        items.push(dataItem);\n                    }\n                }\n                if (!multiple) {\n                    locals.dataItem = locals.data = items[0];\n                    locals.angularDataItem = kendo.proxyModelSetters(locals.dataItem);\n                    locals.selected = elems[0];\n                }\n                digest(scope, function () {\n                    handler(scope, locals);\n                });\n            };\n        });\n        defadvice('ui.Grid', '$angular_init', function (element, options) {\n            this.next();\n            if (options.columns) {\n                var settings = $.extend({}, kendo.Template, options.templateSettings);\n                angular.forEach(options.columns, function (col) {\n                    if (col.field && !col.template && !col.format && !col.values && (col.encoded === undefined || col.encoded)) {\n                        col.template = '<span ng-bind=\\'' + kendo.expr(col.field, 'dataItem') + '\\'>#: ' + kendo.expr(col.field, settings.paramName) + '#</span>';\n                    }\n                });\n            }\n        });\n        {\n            defadvice('mobile.ui.ButtonGroup', 'value', function (mew) {\n                var self = this.self;\n                if (mew != null) {\n                    self.select(self.element.children('li.km-button').eq(mew));\n                    self.trigger('change');\n                    self.trigger('select', { index: self.selectedIndex });\n                }\n                return self.selectedIndex;\n            });\n            defadvice('mobile.ui.ButtonGroup', '_select', function () {\n                this.next();\n                this.self.trigger('change');\n            });\n        }\n        module.directive('kendoMobileApplication', function () {\n            return {\n                terminal: true,\n                link: function (scope, element, attrs) {\n                    createWidget(scope, element, attrs, 'kendoMobileApplication', 'kendoMobileApplication');\n                }\n            };\n        }).directive('kendoMobileView', function () {\n            return {\n                scope: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileView', 'kendoMobileView');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                        attrs._instance._scroller();\n                    }\n                }\n            };\n        }).directive('kendoMobileDrawer', function () {\n            return {\n                scope: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileDrawer', 'kendoMobileDrawer');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                        attrs._instance._scroller();\n                    }\n                }\n            };\n        }).directive('kendoMobileModalView', function () {\n            return {\n                scope: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileModalView', 'kendoMobileModalView');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                        attrs._instance._scroller();\n                    }\n                }\n            };\n        }).directive('kendoMobileSplitView', function () {\n            return {\n                terminal: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileSplitView', 'kendoMobileSplitView');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                    }\n                }\n            };\n        }).directive('kendoMobilePane', function () {\n            return {\n                terminal: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        createWidget(scope, element, attrs, 'kendoMobilePane', 'kendoMobilePane');\n                    }\n                }\n            };\n        }).directive('kendoMobileLayout', function () {\n            return {\n                link: {\n                    pre: function (scope, element, attrs) {\n                        createWidget(scope, element, attrs, 'kendoMobileLayout', 'kendoMobileLayout');\n                    }\n                }\n            };\n        }).directive('kendoMobileActionSheet', function () {\n            return {\n                restrict: 'A',\n                link: function (scope, element, attrs) {\n                    element.find('a[k-action]').each(function () {\n                        $(this).attr('data-' + kendo.ns + 'action', $(this).attr('k-action'));\n                    });\n                    createWidget(scope, element, attrs, 'kendoMobileActionSheet', 'kendoMobileActionSheet');\n                }\n            };\n        }).directive('kendoMobilePopOver', function () {\n            return {\n                terminal: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        createWidget(scope, element, attrs, 'kendoMobilePopOver', 'kendoMobilePopOver');\n                    }\n                }\n            };\n        }).directive('kendoViewTitle', function () {\n            return {\n                restrict: 'E',\n                replace: true,\n                template: function (element) {\n                    return '<span data-' + kendo.ns + 'role=\\'view-title\\'>' + element.html() + '</span>';\n                }\n            };\n        }).directive('kendoMobileHeader', function () {\n            return {\n                restrict: 'E',\n                link: function (scope, element) {\n                    element.addClass('km-header').attr('data-role', 'header');\n                }\n            };\n        }).directive('kendoMobileFooter', function () {\n            return {\n                restrict: 'E',\n                link: function (scope, element) {\n                    element.addClass('km-footer').attr('data-role', 'footer');\n                }\n            };\n        }).directive('kendoMobileScrollViewPage', function () {\n            return {\n                restrict: 'E',\n                replace: true,\n                template: function (element) {\n                    return '<div data-' + kendo.ns + 'role=\\'page\\'>' + element.html() + '</div>';\n                }\n            };\n        });\n        angular.forEach([\n            'align',\n            'icon',\n            'rel',\n            'transition',\n            'actionsheetContext'\n        ], function (attr) {\n            var kAttr = 'k' + attr.slice(0, 1).toUpperCase() + attr.slice(1);\n            module.directive(kAttr, function () {\n                return {\n                    restrict: 'A',\n                    priority: 2,\n                    link: function (scope, element, attrs) {\n                        element.attr(kendo.attr(kendo.toHyphens(attr)), scope.$eval(attrs[kAttr]));\n                    }\n                };\n            });\n        });\n        var WIDGET_TEMPLATE_OPTIONS = {\n            'TreeMap': ['Template'],\n            'MobileListView': [\n                'HeaderTemplate',\n                'Template'\n            ],\n            'MobileScrollView': [\n                'EmptyTemplate',\n                'Template'\n            ],\n            'Grid': [\n                'AltRowTemplate',\n                'DetailTemplate',\n                'RowTemplate'\n            ],\n            'ListView': [\n                'EditTemplate',\n                'Template',\n                'AltTemplate'\n            ],\n            'Pager': [\n                'SelectTemplate',\n                'LinkTemplate'\n            ],\n            'PivotGrid': [\n                'ColumnHeaderTemplate',\n                'DataCellTemplate',\n                'RowHeaderTemplate'\n            ],\n            'Scheduler': [\n                'AllDayEventTemplate',\n                'DateHeaderTemplate',\n                'EventTemplate',\n                'MajorTimeHeaderTemplate',\n                'MinorTimeHeaderTemplate'\n            ],\n            'ScrollView': ['Template'],\n            'PanelBar': ['Template'],\n            'TreeView': ['Template'],\n            'Validator': ['ErrorTemplate']\n        };\n        (function () {\n            var templateDirectives = {};\n            angular.forEach(WIDGET_TEMPLATE_OPTIONS, function (templates, widget) {\n                angular.forEach(templates, function (template) {\n                    if (!templateDirectives[template]) {\n                        templateDirectives[template] = [];\n                    }\n                    templateDirectives[template].push('?^^kendo' + widget);\n                });\n            });\n            angular.forEach(templateDirectives, function (parents, directive) {\n                var templateName = 'k' + directive;\n                var attrName = kendo.toHyphens(templateName);\n                module.directive(templateName, function () {\n                    return {\n                        restrict: 'A',\n                        require: parents,\n                        terminal: true,\n                        compile: function ($element, $attrs) {\n                            if ($attrs[templateName] !== '') {\n                                return;\n                            }\n                            $element.removeAttr(attrName);\n                            var template = $element[0].outerHTML;\n                            return function (scope, element, attrs, controllers) {\n                                var controller;\n                                while (!controller && controllers.length) {\n                                    controller = controllers.shift();\n                                }\n                                if (!controller) {\n                                    $log.warn(attrName + ' without a matching parent widget found. It can be one of the following: ' + parents.join(', '));\n                                } else {\n                                    controller.template(templateName, template);\n                                    element.remove();\n                                }\n                            };\n                        }\n                    };\n                });\n            });\n        }());\n    }(window.kendo.jQuery, window.angular));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.ui.core', [\n        'kendo.core',\n        'kendo.router',\n        'kendo.touch',\n        'kendo.view',\n        'kendo.fx',\n        'kendo.data.odata',\n        'kendo.data.xml',\n        'kendo.data',\n        'kendo.data.signalr',\n        'kendo.binder',\n        'kendo.validator',\n        'kendo.userevents',\n        'kendo.draganddrop',\n        'kendo.mobile.scroller',\n        'kendo.resizable',\n        'kendo.sortable',\n        'kendo.selectable',\n        'kendo.button',\n        'kendo.pager',\n        'kendo.popup',\n        'kendo.notification',\n        'kendo.tooltip',\n        'kendo.toolbar',\n        'kendo.list',\n        'kendo.calendar',\n        'kendo.dateinput',\n        'kendo.datepicker',\n        'kendo.autocomplete',\n        'kendo.dropdownlist',\n        'kendo.combobox',\n        'kendo.multiselect',\n        'kendo.colorpicker',\n        'kendo.listview',\n        'kendo.listbox',\n        'kendo.numerictextbox',\n        'kendo.maskedtextbox',\n        'kendo.menu',\n        'kendo.editable',\n        'kendo.panelbar',\n        'kendo.progressbar',\n        'kendo.responsivepanel',\n        'kendo.tabstrip',\n        'kendo.timepicker',\n        'kendo.datetimepicker',\n        'kendo.slider',\n        'kendo.splitter',\n        'kendo.dialog',\n        'kendo.window',\n        'kendo.virtuallist',\n        'kendo.mobile.popover',\n        'kendo.mobile.loader',\n        'kendo.mobile.scroller',\n        'kendo.mobile.shim',\n        'kendo.mobile.view',\n        'kendo.mobile.modalview',\n        'kendo.mobile.drawer',\n        'kendo.mobile.splitview',\n        'kendo.mobile.pane',\n        'kendo.mobile.application',\n        'kendo.mobile.actionsheet',\n        'kendo.mobile.button',\n        'kendo.mobile.buttongroup',\n        'kendo.mobile.collapsible',\n        'kendo.mobile.listview',\n        'kendo.mobile.navbar',\n        'kendo.mobile.scrollview',\n        'kendo.mobile.switch',\n        'kendo.mobile.tabstrip',\n        'kendo.angular'\n    ], f);\n}(function () {\n    'bundle all';\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));"]}