{"version":3,"file":"kendo.pivotgrid.min.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","kendopivotgrid","js","this","Navigation","options","tabIndex","root","eventHandlers","update","prototypeAccessors","elements","configurable","first","last","current","get","Array","from","querySelectorAll","selectors","join","querySelector","all","length","find","el","matches","prototype","start","this$1$1","loop","eventType","mouseEvents","ev","target","Element","closest","call","undefined","addEventListener","eventType$1","keyboardEvents","key","stop","removeEventListener","focusElement","element","previous","removeAttribute","classList","remove","setAttribute","String","focus","preventScroll","Object","defineProperties","scrollableValuesSel","scrollableColumnHeaderSel","scrollableRowHeaderSel","emptyCellSel","tableSel","cellSel","scrollables","selectors$1","onEnter","nav","icon","index","indexOf","click","preventDefault","tryScrollLeft","scrollable","elToScroll","offsetLeft","scrollLeft","tryScrollRight","offsetWidth","tryScrollUp","scrollTop","offsetTop","tryScrollDown","offsetHeight","scrollTo","scrollFunc","forEach","scroll","tableMap","table","rows","colsCount","cells","map","c","colSpan","reduce","prev","cur","row","r","curColSpan","colSp","rowSp","rowSpan","ind","findIndex","val","curInd","navigationMap","columnHeader","rowHeader","values","emptyCell","emptyCellRow","fill","i","push","concat","i$1","ctrlKey","metaKey","cellAt","pos","targetPos","getTargetPos","nextPos","next","keyboardEvents$1","keydown","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","o","_target","_ev","nextElementSibling","HTMLElement","parentNode","setTimeout","confHeader","Enter","Space","Home","ro","Boolean","x","End","mouseEvents$1","hasAttribute","PivotGridNavigation","apply","arguments","__proto__","create","constructor","$","undefined$1","kendo","window","ui","encode","htmlEncode","Class","Comparer","data","Widget","DataSource","outerWidth","_outerWidth","outerHeight","_outerHeight","common","pivotgrid","fetchDiscover","normalizeFilter","Query","normalizeSort","toString","identity","extend","keys","isFunction","fetchData","createLocalDataState","createDataTree","sumAggregate","averageAggregate","minAggregate","maxAggregate","createDataState","toColumns","toRows","toTree","toData","headersReducer","RESIZE","READ","CHANGE","ERROR","PROGRESS","MEASURES","STATERESET","AUTO","DIV","NS","ROW_TOTAL_KEY","DATABINDING","DATABOUND","EXPANDMEMBER","HEADERTEMPLATE","ref","id","headerClass","colspan","rowspan","expandable","iconClass","role","expanded","COLLAPSEMEMBER","STATE_EXPANDED_ICONNAME","STATE_COLLAPSED_ICONNAME","HEADER_TEMPLATE","member","caption","name","PIVOTGRID_TREND_ICONS_MAP","KPISTATUS_TEMPLATE","dataItem","value","KPITREND_TEMPLATE","DATACELL_TEMPLATE","fmtValue","tableStyles","normalizeMeasures","measure","descriptor","descriptors","d","type","normalizeMembers","expand","slice","normalizeName","accumulateMembers","accumulator","rootTuple","tuple","level","idx","children","members","stringify","buildPath","descriptorsForAxes","tuples","result","k","JSON","parse","descriptorsForMembers","axis","measures","firstTuple","tupleMembers","found","j","getName","hierarchy","addMissingPathMembers","tupletoSearch","findExistingTuple","tupleToDescriptors","createAggregateGetter","m","measureGetter","getter","field","aggregatorContext","state","aggregate","isNumber","isNaN","isDate","getTime","flattenSortDescriptors","dir","split","pop","createLocalMeasure","format","measureMap","Sum","Average","Min","Max","item","bind","uniqueName","functions","sum","count","average","max","min","PivotCubeBuilder","init","dimensions","_normalizeDescriptors","keyField","fields","_rootTuples","rootNames","measureAggregators","parts","aggregatorsLength","dimensionsSchema","measureIdx","rootNamesLength","levelName","levelNum","hasChildren","parentName","_sortMap","sortDescriptors","flattenTree","mapItem","sortedMaps","sortTree","directParentName","fillSortTree","sortItemsTree","flatColumns","_expandedTuples","currentKeys","memberInfo","expandedNames","accumulatorKeys","isEmptyObject","_findExpandedMember","uniquePath","names","expandedIdx","_asTuples","rootInfo","expandedInfo","_measuresInfo","rowAxis","aggregateNames","resultFuncs","formats","_toDataArray","measuresInfo","rowKeys","columnKeys","aggregates","n","column","columnKey","columnMeasureNames","rowMeasureNamesLength","rowMeasureNames","rowLength","columnLength","items","_addData","resultFunc","ordinal","_matchDescriptors","getters","parentField","expectedValue","_calculateAggregate","totalItem","aggregator","_processColumns","columns","rowTotal","updateColumn","path","columnIndex","childrenMap","_measureAggregators","defaultAggregate","measureDescriptors","aggregators","toLowerCase","Error","_buildGetters","_parseDescriptors","parsedDescriptors","parseDescriptors","getRootNames","mapNames","_filter","filter","expr","filters","operator","_normalizeFilter","logic","process","measuresRowAxis","measuresAxis","columnDescriptors","rowDescriptors","rowValue","rowIdx","rowDescriptor","rowName","columnsInfo","rowsInfo","aggregatedData","columnGetters","rowGetters","processed","expandedColumns","expandedRows","hasExpandedRows","sort","axes","PivotTransport","transport","discover","read","destroy","success","catalog","connection","cube","PivotDataSourceV2","schema","cubes","catalogs","hierarchies","levels","cubeSchema","_cubeSchema","fn","transportOptions","_online","XmlaTransportV2","_columns","_rows","_measuresAxis","_measures","serverSorting","serverPaging","serverFiltering","serverGrouping","serverAggregates","normalizeAxis","_mergeState","fetch","callback","that","_data","_query","done","_createSettings","settings","dimensionsSettings","displayValueFunc","sortValueFunc","displayValue","sortValue","defaultHierarchy","restoreMeasure","memberType","_pristineData","distinct","levelUniqueName","childrenCardinality","isPrevented","trigger","params","_params","deferred","Deferred","originalData","reader","columnSettings","columnAxes","rowSettings","rowAxes","stateArgs","dataTree","dataField","columnsData","reverse","_saveState","resolve","newDataState","response","_preventRefresh","error","err","promise","measureAxes","schemaMeasures","command","restrictions","catalogName","cubeName","schemaKPIs","schemaDimensions","schemaHierarchies","dimensionName","dimensionUniqueName","schemaLevels","hierarchyName","hierarchyUniqueName","schemaCubes","schemaCatalogs","schemaMembers","_columnTuples","_rowTuples","_view","PivotDataSource","cubeBuilder","_skipNormalize","_axes","memberUniqueName","schemaData","dataGetter","_rawData","treeOp","_clearAxesData","query","rowsAxisDescriptors","columnsAxisDescriptors","_expandPath","origin","other","memberToExpand","_lastExpanded","_descriptorsForAxis","_process","e","page","pageSize","group","_updateLocalData","expandColumn","expandRow","_processResult","processedData","_requestData","columnIndexes","rowIndexes","resultAxis","axisToSkip","hasColumnTuples","_rowMeasures","_normalizeTuples","_columnMeasures","_normalizeData","columnsLength","rowsLength","validateAxis","sourceTuples","targetTuples","columnIdx","dataIdx","targetColumnsLength","membersCount","measuresLength","tupleIndex","adjustDataByColumn","adjustDataByRow","_mergeAxes","_readData","newData","_createTuple","buildRoot","Number","_hasRoot","source","isRoot","sourceAxes","startIndex","columnMeasures","rowMeasures","oldRowsLength","newRowsLength","oldColumnsLength","newColumnsLength","rowIndex","dataIndex","calcIndex","indices","buildDataIndices","Math","prepareDataOnColumns","parseSource","mergedColumns","mergeTuples","targetIndex","sourceIndex","parseInt","prepareDataOnRows","mergedRows","findDataIndex","parsedRoot","memberIndex","offset","_mergeColumnData","_mergeRowData","toAdd","toJSON","drop","splice","_observe","_ranges","_addRange","_total","_pristineTotal","memberIdx","roots","indexes","tupleName","_addMissingDataItems","metadata","addEmptyDataItem","_normalizeOrdinals","lastOrdinal","converter","_handleCustomErrors","status","reject","kpis","sortFunction","currentItem","newAxis","collection","queue","shift","counter","targetMembers","sourceMembers","equalTuples","second","equal","toFind","membersLength","addMembers","len","findParentMember","parentMember","parentPath","normalizeTupleMeasures","measureIndex","measurePosition","spliceIndex","baseHierarchyPath","memberName","expandMemberDescriptor","sortDescriptor","sortDescriptorForMember","crossJoin","crossJoinCommand","tmp","measureNames","rootName","rootLength","l","child","serializeMembers","crossJoinCommands","dataSource","filterFunctionFormats","contains","doesnotcontain","startswith","endswith","eq","neq","serializeExpression","expression","serializeOptions","parentTagName","capitalize","replace","toUpperCase","xmlaDiscoverCommands","convertersMap","serializeFilters","properties","Catalog","XmlaTransport","RemoteTransport","originalOptions","url","setup","dataType","contentType","parameterMap","ajax","fetchOptions","noop","then","catch","asArray","object","translateAxis","captionGetter","unameGetter","levelNameGetter","levelNumGetter","childrenGetter","hierarchyGetter","parentNameGetter","Member","schemaDataReaderMap","description","groupName","displayFolder","defaultFormat","goal","trend","statusGraphic","trendGraphic","defaultMember","orderingProperty","xmlaReaderMethods","XmlaDataReader","XmlDataReader","_extend","methodName","option","xml","errors","fault","faultstring","faultcode","ordinalGetter","valueGetter","fmtValueGetter","_mapSchema","obj","transports","xmla","readers","removeExpr","expressions","PivotSettingTarget","addClass","_refreshHandler","refresh","template","actions","enabled","emptyTemplate","_sortable","on","action","attr","hasClass","sortable","sortDirection","currentTarget","filterable","fieldMenu","PivotFieldMenu","messages","setting","empty","setDataSource","unbind","kendoSortable","connectWith","hint","cursor","change","add","move","newIndex","_isKPI","validate","isMeasure","isArray","sortExpressions","_sort","skipExpr","allowUnsort","html","sortIcon","_sortIcon","off","sortExpr","PivotSettingTargetV2","parent","text","navigatable","chip","keyCode","DELETE","BACKSPACE","configuratorNavigation","DOWN","altKey","shiftKey","LEFT","RIGHT","UP","otherTarget","PivotFieldMenuV2","events","_applyState","_sortState","_stateFilter","_savedState","_cancelChanges","deepExtend","_initialState","_redraw","_state","newState","modifyInit","blur","_savedFilter","_emptyState","enable","removeClass","_targetsHTML","menuenabled","PivotConfiguratorButton","_element","_attachEvents","configurator","setOptions","toggle","pivot","pivotEl","toggleClass","getKendoPivotGridV2","_setContentWidth","_updateDimensions","PivotContainer","_addClasses","configuratorPosition","className","PivotGridV2","_dataSource","_bindConfigurator","_ariaId","guid","_wrapper","_columnHeadersWrapper","_rowHeadersWrapper","_contentWrapper","wrapper","append","_columnBuilder","ColumnRowBuilder","columnHeaderTemplate","ariaId","_rowBuilder","rowHeaderTemplate","_contentBuilder","ContentBuilderV2","dataCellTemplate","_scrollable","button","is","isRow","paths","eventName","reducerPayLoad","payload","tree","getTree","currentAxes","newHeaders","autoBind","_aria","_initPivotGridNavigation","notify","height","columnWidth","emptyCellLabel","_windowResizeHandler","navigation","firstCell","_matchAriaAttributes","rowHeaderRows","rowHeaderCols","acc","curr","getAttribute","colHeaderRows","colHeaderCells","valueTableCells","firstColHeadersRow","firstColHeaderRowCellsIds","valueCellsIds","filterAndMap","idParts","cell","cellColIndex","colHeaderCellsIds","headerCellColIndex","headerCellColspan","arr","predicate","mapper","_progressHandler","_errorHandler","_requestStart","_error","_resize","div","scrollbar","style","setProperty","document","createElement","cssText","innerHTML","body","appendChild","scrollWidth","removeChild","columnsHeader","rowsHeader","_wheelScroll","delta","wheelDeltaY","one","css","_progress","progress","contentTable","columnTable","rowTable","width","kendoPivotConfiguratorV2","cellInfoByElement","cellInfo","contentBuilder","columnsCount","rowsCount","columnTuple","hash","rowTuple","lastFocusedCellID","_activeElement","lastCellIdWithTabIndex","setTuples","build","setRowColumnInfo","columnHeaderLeafs","getHeaderLeafs","rowHeaderLeafs","columnHeaderBreadth","getBreadth","rowHeaderDepth","plugin","PivotGrid","columnBuilder","rowBuilder","support","isRtl","_createLayout","ColumnBuilder","RowBuilder","ContentBuilder","_templates","builder","eventArgs","parseJSON","request","childrenLoaded","maxChildren","reorderable","kpiStatusTemplate","kpiTrendTemplate","measureFields","columnFields","rowFields","columnTemplate","rowTemplate","dataTemplate","useWithBlock","kendoPivotConfigurator","columnInfo","rowInfo","view","measuresTarget","rowsTarget","columnsTarget","clearTimeout","_headerReflowTimeout","_stateResetHandler","_stateReset","reset","_measureFields","_createSettingTarget","pivotOptions","getIcons","_initSettingTargets","layoutTable","leftContainer","rightContainer","gridWrapper","wrap","content","columnsHeaderTree","dom","Tree","rowsHeaderTree","contentTree","firstChild","_setSectionsWidth","_setSectionsHeight","_setContentHeight","_columnHeaderReflow","browser","mozilla","leftColumn","measureFieldsHeight","columnFieldsHeight","rowFieldsHeight","innerHeight","columnsHeight","padding","firstRowHeight","secondRowHeight","calculatedWidth","minWidth","ceil","_resetColspan","skipScrollbar","clientHeight","_colspan","_layoutTimeout","_axisMeasures","hasMeasure","columnAxis","render","_indexes","touchScroller","contentResized","movable","sender","y","htmlNode","createMetadata","maxMembers","addColElements","addRowElements","addColumCell","rowEl","rowItem","cellEl","total","headerTemplate","columnHeaderRows","treeData","headerRows","headerLeafs","breadth","rowHeaderBreadth","_tree","_breadth","_headerLeafs","tbody","_tbody","colgroup","_colGroup","_rowLength","_buildRows","_normalize","cellsLength","cellIdx","tupleAll","_rowIndex","_row","parentRow","rowKey","notFirst","collapsed","measureRow","_cell","_content","childRow","childrenLength","allCell","nextMember","cellChildren","memberCollapsed","rootLevelNum","cellIconEl","maxcolSpan","allRow","firstMemberName","tuplePath","hasChild","axisInfo","axisInfoMember","skipChildren","firstEmpty","_buildRow","templateInfo","cellContent","startIdx","PivotExcelExporter","widget","columnHeaderTable","rowHeaderTable","columnHeaderLength","rowHeaderLength","autoWidth","_cells","background","color","contentRows","columnRows","rowRows","_freezePane","colSplit","rowSplit","workbook","sheets","freezePane","PivotExcelMixin","proto","excel","saveAsExcel","proxyURL","fileName","book","ooxml","Workbook","toDataURLAsync","dataURI","saveAs","forceProxy","PDFMixin","_drawPDF","_drawPDFShadow","avoidLinks","pdf","jQuery"],"sources":["kendo.pivotgrid.js"],"mappings":"CAAA,SAAWA,EAAQC,GACI,iBAAZC,SAA0C,oBAAXC,OAAyBA,OAAOD,QAAUD,EAAQG,QAAQ,yBAA0BA,QAAQ,gBAAiBA,QAAQ,iBAAkBA,QAAQ,mBACnK,mBAAXC,QAAyBA,OAAOC,IAAMD,OAAO,CAAC,yBAA0B,gBAAiB,iBAAkB,mBAAoBJ,KACrID,EAA+B,oBAAfO,WAA6BA,WAAaP,GAAUQ,MAAcC,eAAiBT,EAAOS,gBAAkB,GAAIT,EAAOS,eAAeC,GAAKT,KAHhK,CAIGU,MAAM,WACL,IAAIC,EAAa,SAAoBC,GACjCF,KAAKG,SAAW,EAChBH,KAAKI,KAAO,KACZJ,KAAKK,cAAgB,GACrBL,KAAKM,OAAS,aACdN,KAAKG,SAAWD,EAAQC,UAGxBI,EAAqB,CAAEC,SAAU,CAAEC,cAAc,GAAOC,MAAO,CAAED,cAAc,GAAOE,KAAM,CAAEF,cAAc,GAAOG,QAAS,CAAEH,cAAc,IAChJF,EAAmBC,SAASK,IAAM,WAC9B,OAAOb,KAAKI,KAAOU,MAAMC,KAAKf,KAAKI,KAAKY,iBAAiBhB,KAAKiB,UAAUC,KAAK,OAAS,IAE1FX,EAAmBG,MAAMG,IAAM,WAC3B,OAAQb,KAAKI,MAAQJ,KAAKI,KAAKe,cAAcnB,KAAKiB,UAAUC,KAAK,OAAU,MAE/EX,EAAmBI,KAAKE,IAAM,WAC1B,IAAIO,EAAMpB,KAAKQ,SACf,OAAOY,EAAIA,EAAIC,OAAS,IAAM,MAElCd,EAAmBK,QAAQC,IAAM,WAC7B,OAAOb,KAAKQ,SAASc,MAAK,SAAUC,GAAM,OAAOA,EAAGC,QAAQ,cAEhEvB,EAAWwB,UAAUC,MAAQ,SAAgBtB,GACrC,IAAIuB,EAAW3B,KAEnBA,KAAKI,KAAOA,EACZ,IAAIwB,EAAO,SAAWC,GACdF,EAASG,YAAYD,KACrBF,EAAStB,cAAcwB,GAAa,SAAWE,GAC3C,IAAIC,EAASD,EAAGC,kBAAkBC,SAAWF,EAAGC,OAAOE,QAAQP,EAASV,UAAUC,KAAK,MACnFc,GACAL,EAASG,YAAYD,GAAWM,UAAKC,EAAWJ,EAAQL,EAAUI,IAG1E3B,EAAKiC,iBAAiBR,EAAWF,EAAStB,cAAcwB,MAI5D,IAAK,IAAIA,KAAaF,EAASG,YAAaF,EAAMC,GAclD,IAAK,IAAIS,KAAeX,EAASY,eAZ7BZ,EAASY,eAAeD,KACxBX,EAAStB,cAAciC,GAAe,SAAWP,GAC7C,IAAIC,EAASD,EAAGC,kBAAkBC,SAAWF,EAAGC,OAAOE,QAAQP,EAASV,UAAUC,KAAK,MACnFsB,EAAiB,MAAXT,EAAGS,IAAc,QAAUT,EAAGS,IACpCR,GAAUL,EAASY,eAAeD,GAAaE,IAC/Cb,EAASY,eAAeD,GAAaE,GAAKL,UAAKC,EAAWJ,EAAQL,EAAUI,IAGpF3B,EAAKiC,iBAAiBC,EAAaX,EAAStB,cAAciC,MAMtErC,EAAWwB,UAAUgB,KAAO,WACxB,GAAIzC,KAAKI,KACL,IAAK,IAAIyB,KAAa7B,KAAKK,cACnBL,KAAKK,cAAcwB,IACnB7B,KAAKI,KAAKsC,oBAAoBb,EAAW7B,KAAKK,cAAcwB,IAIxE7B,KAAKI,KAAO,MAEhBH,EAAWwB,UAAUkB,aAAe,SAAuBC,EAASC,GAC5DD,IACIC,IACAA,EAASC,gBAAgB,YACzBD,EAASE,UAAUC,OAAO,YAE9BJ,EAAQK,aAAa,WAAYC,OAAOlD,KAAKG,WAC7CyC,EAAQO,MAAM,CAAEC,eAAe,MAIvCC,OAAOC,iBAAkBrD,EAAWwB,UAAWlB,GAE/C,IAAIgD,EAAsB,mCACtBC,EAA4B,2CAC5BC,EAAyB,wCACzBC,EAAe,yCACfC,EAAW,0BACXC,EAAU,oBACVC,EAAc,CAACN,EAAqBC,EAA2BC,GAAwBvC,KAAK,KAC5F4C,EAAc,CACdJ,EACA,CAACF,EAA2BG,EAAUC,GAAS1C,KAAK,KACpD,CAACuC,EAAwBE,EAAUC,GAAS1C,KAAK,KACjD,CAACqC,EAAqBI,EAAUC,GAAS1C,KAAK,MAE9C6C,EAAU,SAAU/B,EAAQgC,EAAKjC,GACjC,IAAIkC,EAAOjC,EAAOb,cAAc,wBAChC,GAAI8C,EAAM,CACN,IAAIC,EAAQF,EAAIxD,SAAS2D,QAAQnC,GACjCgC,EAAI1D,OAAS,WACT0D,EAAIrB,aAAaqB,EAAIxD,SAAS0D,GAAQ,MACtCF,EAAI1D,OAAS,cAEjB2D,EAAKG,QACLrC,EAAGsC,mBAGPC,EAAgB,SAAUtC,EAAQuC,EAAYC,GAC1CxC,EAAOyC,WAAaF,EAAWG,aAC/BF,EAAWE,WAAa1C,EAAOyC,aAGnCE,EAAiB,SAAU3C,EAAQuC,EAAYC,GAC3CxC,EAAOyC,WAAazC,EAAO4C,YAAcL,EAAWG,WAAaH,EAAWK,aAC5E5C,EAAO4C,YAAcL,EAAWK,cAChCJ,EAAWE,WAAa1C,EAAOyC,WAAazC,EAAO4C,YAAcL,EAAWK,cAGhFC,EAAc,SAAU7C,EAAQuC,EAAYC,GACxCD,EAAWO,WAAa9C,EAAO+C,UAAYR,EAAWO,YACtDN,EAAWM,UAAY9C,EAAO+C,YAGlCC,EAAgB,SAAUhD,EAAQuC,EAAYC,GAC1CxC,EAAO+C,UAAY/C,EAAOiD,aAAeV,EAAWO,UAAYP,EAAWU,cAC3EjD,EAAOiD,aAAeV,EAAWU,eACjCT,EAAWM,UAAY9C,EAAO+C,UAAY/C,EAAOiD,aAAeV,EAAWU,eAG/EC,EAAW,SAAUlD,EAAQ5B,EAAM+E,GACnC,IAAIX,EAAapE,EAAKe,cAAcoC,GAChCgB,EAAavC,GAAUA,EAAOE,QAAQ2B,GACrCW,GAAeD,GAAevC,GAGnCmD,EAAWC,SAAQ,SAAUC,GAAU,OAAOA,EAAOrD,EAAQuC,EAAYC,OAEzEc,EAAW,SAAUC,GACrB,IAAIC,EAAO1E,MAAMC,KAAKwE,EAAMC,MACxBC,EAAY3E,MAAMC,KAAMyE,GAAQA,EAAK,IAAMA,EAAK,GAAGE,OAAU,IAC5DC,KAAI,SAAUC,GAAK,OAAOA,EAAEC,WAC5BC,QAAO,SAAUC,EAAMC,GAAO,OAAOD,EAAOC,IAAQ,GACrDL,EAAMH,EAAKG,KAAI,WAAc,OAAO,IAAI7E,MAAM2E,MAalD,OAZAD,EAAKJ,SAAQ,SAAUa,EAAKC,GACxB,IAAIC,EAAa,EACjBrF,MAAMC,KAAKkF,EAAIP,OAAON,SAAQ,SAAUQ,GACpC,IAAK,IAAIQ,EAAQ,EAAGA,EAAQR,EAAEC,QAASO,IAAS,CAC5C,IAAK,IAAIC,EAAQ,EAAGA,EAAQT,EAAEU,QAASD,IAAS,CAC5C,IAAIE,EAAMZ,EAAIO,EAAIG,GAAOG,WAAU,SAAUC,EAAKC,GAAU,OAAOA,GAAUP,IAAeM,KAC5Fd,EAAIO,EAAIG,GAAOE,GAAOX,EAE1BO,WAILR,GAEPgB,EAAgB,SAAUvG,GAO1B,IANA,IAAIwG,EAAetB,EAASlF,EAAKe,cAAc,CAACqC,EAA2BG,GAAUzC,KAAK,OACtF2F,EAAYvB,EAASlF,EAAKe,cAAc,CAACsC,EAAwBE,GAAUzC,KAAK,OAChF4F,EAASxB,EAASlF,EAAKe,cAAc,CAACoC,EAAqBI,GAAUzC,KAAK,OAC1E6F,EAAY3G,EAAKe,cAAcuC,GAC/BsD,EAAe,IAAIlG,MAAM+F,EAAU,GAAGxF,QAAQ4F,KAAKF,GACnDpB,EAAM,GACDuB,EAAI,EAAGA,EAAIN,EAAavF,OAAQ6F,IACrCvB,EAAIwB,KAAKH,EAAaI,OAAOR,EAAaM,KAE9C,IAAK,IAAIG,EAAM,EAAGA,EAAMR,EAAUxF,OAAQgG,IACtC1B,EAAIwB,KAAKN,EAAUQ,GAAKD,OAAON,EAAOO,KAE1C,OAAO1B,GAYP2B,EAAU,SAAUvF,GAAM,OAAOA,EAAGuF,SAAWvF,EAAGwF,SAClDC,EAAS,SAAUpH,EAAM4B,EAAQyF,GAKjC,IAJA,IAAI9B,EAAMgB,EAAcvG,GACpBsH,EAbW,SAAU/B,EAAK3D,GAC9B,IAAK,IAAIkE,EAAI,EAAGA,EAAIP,EAAItE,OAAQ6E,IAC5B,IAAK,IAAIN,EAAI,EAAGA,EAAID,EAAIO,GAAG7E,OAAQuE,IAC/B,GAAID,EAAIO,GAAGN,KAAO5D,EACd,MAAO,CAACkE,EAAGN,GAIvB,MAAO,EAAE,GAAI,GAKG+B,CAAahC,EAAK3D,GAC9B4F,EAAU,CAACF,EAAU,GAAKD,EAAI,GAAIC,EAAU,GAAKD,EAAI,IACrDI,EAAOlC,EAAIiC,EAAQ,KAAOjC,EAAIiC,EAAQ,IAAIA,EAAQ,IAC/CC,GAAQA,IAAS7F,GAEpB6F,EAAOlC,GADPiC,EAAU,CAACA,EAAQ,GAAKH,EAAI,GAAIG,EAAQ,GAAKH,EAAI,KAC9B,KAAO9B,EAAIiC,EAAQ,IAAIA,EAAQ,IAEtD,OAAOC,GAEPC,EAAmB,CACnBC,QAAS,CACLC,UAAW,SAAUhG,EAAQgC,EAAKjC,GAC9BA,EAAGsC,iBACH,IAAIwD,EAAOL,EAAOxD,EAAI5D,KAAM4B,EAAQ,CAAC,GAAI,IACzCgC,EAAIrB,aAAakF,EAAM7F,GACvBkD,EAAS2C,EAAM7D,EAAI5D,KAAM,CAACuE,EAAgBL,EAAeU,EAAeH,KAE5EoD,WAAY,SAAUjG,EAAQgC,EAAKjC,GAC/BA,EAAGsC,iBACH,IAAIwD,EAAOL,EAAOxD,EAAI5D,KAAM4B,EAAQ,CAAC,EAAG,IACxCgC,EAAIrB,aAAakF,EAAM7F,GACvBkD,EAAS2C,EAAM7D,EAAI5D,KAAM,CAACkE,EAAeK,EAAgBK,EAAeH,KAE5EqD,QAAS,SAAUlG,EAAQgC,EAAKjC,GAC5BA,EAAGsC,iBACH,IAAIwD,EAAOL,EAAOxD,EAAI5D,KAAM4B,EAAQ,EAAE,EAAG,IACzCgC,EAAIrB,aAAakF,EAAM7F,GACvBkD,EAAS2C,EAAM7D,EAAI5D,KAAM,CAACuE,EAAgBL,EAAeU,EAAeH,KAE5EsD,UAAW,SAAUnG,EAAQgC,EAAKjC,GAC9BA,EAAGsC,iBACH,IAAIwD,EAAOL,EAAOxD,EAAI5D,KAAM4B,EAAQ,CAAC,EAAG,IACxCgC,EAAIrB,aAAakF,EAAM7F,GACvBkD,EAAS2C,EAAM7D,EAAI5D,KAAM,CAACuE,EAAgBL,EAAeO,EAAaG,KAE1EoD,EAAG,SAAUC,EAASrE,EAAKsE,GACvB,GAAKtE,EAAI5D,KAAT,CAKA,IAAIyH,EAAO7D,EAAI5D,KAAKmI,mBACdV,GAAQA,aAAgBW,cAIzBX,EAAKrG,QAAQ,yCACdqG,EAAOA,EAAKU,oBAGZV,GAAQA,aAAgBW,aAAeX,EAAKrG,QAAQ,yCAC/CwC,EAAI5D,KAAKqI,aAAczE,EAAI5D,KAAKqI,WAAWtH,cAAc,uCAC1D0G,EAAKzD,QAGTsE,YAAW,WACP,GAAI1E,EAAI5D,KAAKqI,WAAY,CACrB,IAAIE,EAAa3E,EAAI5D,KAAKqI,WAAWtH,cAAc,sFAC/CwH,aAAsBH,cACtBG,EAAW1F,aAAa,WAAYC,OAAOc,EAAI7D,WAC/CwI,EAAWxF,YAGpB,OAGXyF,MAAO7E,EACP8E,MAAO9E,EACP+E,KAAM,SAAU9G,EAAQgC,EAAKjC,GACzB,IAAI4D,EAAMgB,EAAc3C,EAAI5D,MAGxByH,GAFOP,EAAQvF,GACF4D,EAAI,GAAMA,EAAIrE,MAAK,SAAUyH,GAAM,OAAOC,QAAQD,EAAGzH,MAAK,SAAU2H,GAAK,OAAOA,IAAMjH,UAAmB,IAC3G,GACX6F,IACA7D,EAAIrB,aAAakF,EAAM7F,GACvBkD,EAAS2C,EAAM7D,EAAI5D,KAAM,CAACuE,EAAgBL,EAAeU,EAAeH,IACxE9C,EAAGsC,mBAGX6E,IAAK,SAAUlH,EAAQgC,EAAKjC,GACxB,IAAI4D,EAAMgB,EAAc3C,EAAI5D,MAExB6F,EADOqB,EAAQvF,GACF4D,EAAIA,EAAItE,OAAS,GAAMsE,EAAIrE,MAAK,SAAUyH,GAAM,OAAOC,QAAQD,EAAGzH,MAAK,SAAU2H,GAAK,OAAOA,IAAMjH,UAAmB,GACnI6F,EAAO5B,GAAOA,EAAIA,EAAI5E,OAAS,IAAM,KACrCwG,IACA7D,EAAIrB,aAAakF,EAAM7F,GACvBkD,EAAS2C,EAAM7D,EAAI5D,KAAM,CAACkE,EAAeK,EAAgBE,EAAaG,IACtEjD,EAAGsC,qBAKf8E,EAAgB,CAChB/E,MAAO,SAAUpC,EAAQgC,GACrB,GAAIhC,GAAUA,aAAkBwG,YAAa,CACzC,IAAIzC,EAAO/B,EAAIxD,SAASc,MAAK,SAAUsE,GAAK,OAAOA,EAAEwD,aAAa,gBAAmB,KACrFpF,EAAIrB,aAAaX,EAAQ+D,MAqBjCsD,EAAoC,SAAUpJ,GAC9C,SAASoJ,IACLpJ,EAAWqJ,MAAMtJ,KAAMuJ,WACvBvJ,KAAKiB,UAAY6C,EACjB9D,KAAK8B,YAAcqH,EACnBnJ,KAAKuC,eAAiBuF,EAO1B,OAJK7H,IAAaoJ,EAAoBG,UAAYvJ,GAClDoJ,EAAoB5H,UAAY4B,OAAOoG,OAAQxJ,GAAcA,EAAWwB,WACxE4H,EAAoB5H,UAAUiI,YAAcL,EAErCA,EAZ4B,CAarCpJ,GAq5NF,OAxxNA,SAAU0J,EAAGC,GACT,IAAIC,EAAQC,OAAOD,MACfE,EAAKF,EAAME,GACXC,EAASH,EAAMI,WACfC,EAAQL,EAAMK,MACdC,EAAWN,EAAMO,KAAKD,SACtBE,EAASN,EAAGM,OACZC,EAAaT,EAAMO,KAAKE,WACxBC,EAAaV,EAAMW,YACnBC,EAAcZ,EAAMa,aACpBC,EAASb,OAAOD,MAAMe,UAAUD,OAChCE,EAAgBF,EAAOE,cACvBC,EAAkBjB,EAAMO,KAAKW,MAAMD,gBACnCE,EAAgBnB,EAAMO,KAAKW,MAAMC,cACjCC,EAAW,GAAGA,SACdC,EAAW,SAAS9C,GAAK,OAAOA,GAChCzC,EAAMgE,EAAEhE,IACRwF,EAASxB,EAAEwB,OACXC,EAAOvB,EAAMuB,KACbC,EAAaxB,EAAMwB,WACnBC,EAAYX,EAAOW,UACnBC,EAAuBZ,EAAOY,qBAC9BC,EAAiBb,EAAOa,eACxBC,EAAed,EAAOc,aACtBC,EAAmBf,EAAOe,iBAC1BC,EAAehB,EAAOgB,aACtBC,EAAejB,EAAOiB,aACtBC,EAAkBlB,EAAOkB,gBACzBC,EAAYnB,EAAOmB,UACnBC,EAASpB,EAAOoB,OAChBC,EAASrB,EAAOqB,OAChBC,EAAStB,EAAOsB,OAChBC,EAAiBvB,EAAOuB,eACxBC,EAAS,SACTC,EAAO,OACPC,EAAS,SACTC,EAAQ,QAERC,EAAW,WAEXC,EAAW,WACXC,EAAa,aACbC,EAAO,OACPC,EAAM,cACNC,EAAK,kBACLC,EAAgB,gBAChBC,EAAc,cACdC,EAAY,YACZC,EAAe,eACfC,EAAiB,SAAUC,GACvB,IAAIC,EAAKD,EAAIC,GACT3K,EAAM0K,EAAI1K,IACV4K,EAAcF,EAAIE,YAClBC,EAAUH,EAAIG,QACdC,EAAUJ,EAAII,QACdC,EAAaL,EAAIK,WACjBC,EAAYN,EAAIM,UAChBC,EAAOP,EAAIO,KACXC,EAAWR,EAAIQ,SAEnB,MAAO,WAAcP,EAAK,WAAeM,EAAO,MAASF,EAAc,kBAAqBG,EAAW,IAAQ,IAAM,eAAmB1D,EAAOxH,GAAQ,uBAA4BwH,EAAOoD,GAAgB,MAASC,EAAU,YAAcrD,EAAOqD,GAAW,IAAM,IAAM,KAAOC,EAAU,YAActD,EAAOsD,GAAW,IAAM,IAAM,KACxSC,EAAa1D,EAAME,GAAG9F,KAAK0F,EAAE,gEAAiE,CAAE1F,KAAO,WAAc+F,EAAOwD,KAAkB,IACxJ,SAExBG,EAAiB,iBACjBC,EAA0B,iBAE1BC,EAA2B,kBAC3BC,EAAkB,SAAUZ,GACxB,IAAIa,EAASb,EAAIa,OAEjB,MAAQ,SAAY/D,EAAO+D,EAAOC,SAAWD,EAAOE,MAAS,WAEjEC,GAA4B,CACxB,qBAAsB,iBACtB,qBAAsB,eACtB,kBAAmB,SAEvBC,GAAqB,SAAUjB,GAC3B,IAAIkB,EAAWlB,EAAIkB,SAEnB,OAAOvE,EAAME,GAAG9F,KAAK0F,EAAG,gBAAoBK,EAAOoE,EAASC,OAAU,aAAgB,CAAEpK,KAAO,eAAiBmK,EAASC,MAAQ,EAAI,OAASD,EAASC,MAAQ,EAAI,OAAS,WAEhLC,GAAoB,SAAUpB,GAC1B,IAAIkB,EAAWlB,EAAIkB,SAEnB,OAAOvE,EAAME,GAAG9F,KAAK0F,EAAG,gBAAoBK,EAAOoE,EAASC,OAAU,aAAgB,CAAEpK,KAAMiK,GAA2B,cAAgBE,EAASC,MAAQ,EAAI,WAAaD,EAASC,MAAQ,EAAI,WAAa,aAEjNE,GAAoB,SAAUrB,GAC1B,IAAIkB,EAAWlB,EAAIkB,SAEnB,MAAQ,IAAMA,GAAWpE,EAAOoE,EAASI,UAAYJ,EAASC,QAAqB,WAenFI,GACU,cADVA,GAEQ,sBAFRA,GAGa,yCAHbA,GAIO,qBAJPA,GAKc,kCALdA,GAMO,gBANPA,GAOW,aAGnB,SAASC,GAAkBC,GACvB,IAAIC,EAAgC,iBAAZD,EAAuB,CAAC,CAAEV,KAAMU,IAAaA,EACjEE,EAA4C,mBAA9B5D,EAAS9I,KAAKyM,GAAmCA,EAAcA,IAAehF,EAAc,CAACgF,GAAc,GAE7H,OAAOjJ,EAAIkJ,GAAa,SAASC,GAC7B,MAAiB,iBAANA,EACA,CAAEb,KAAMa,GAEZnF,EAAEwB,QAAO,EAAM2D,EAAG,CAAEb,KAAMa,EAAEb,KAAMc,KAAMD,EAAEC,UAIzD,SAASC,GAAiBjB,GACtB,IAAIa,EAA+B,iBAAXb,EAAsB,CAAC,CAAEE,KAAM,CAACF,GAASkB,QAAQ,IAAWlB,EAChFc,EAA4C,mBAA9B5D,EAAS9I,KAAKyM,GAAmCA,EAAcA,IAAehF,EAAc,CAACgF,GAAc,GAE7H,OAAOjJ,EAAIkJ,GAAa,SAASC,GAC7B,MAAiB,iBAANA,EACA,CAAEb,KAAM,CAACa,GAAIG,QAAQ,GAEzB,CAAEhB,KAAiC,mBAA1BhD,EAAS9I,KAAK2M,EAAEb,MAA6Ba,EAAEb,KAAKiB,QAAU,CAACJ,EAAEb,MAAQgB,OAAQH,EAAEG,WAI3G,SAASE,GAAclB,GAKnB,OAJ2B,IAAvBA,EAAK9J,QAAQ,OACb8J,EAAO,KAAOA,EAAO,MAGlBA,EAGX,SAASmB,GAAkBC,EAAaC,EAAWC,EAAOC,GACtD,IAAIC,EAAKpO,EACLqO,EACA3B,EAYJ,GAVKwB,IACDA,EAAQD,GAGPE,IACDA,EAAQ,IAGZzB,EAASwB,EAAMI,QAAQH,MAERzB,EAAOY,QAAtB,CAaA,GARAtN,GADAqO,EAAW3B,EAAO2B,UACArO,OAEdkO,IAAUD,EACVD,EAAYxF,EAAM+F,UAAU,CAAC7B,EAAOE,UAAY5M,EACzCA,IACPgO,EAAYxF,EAAM+F,UAAUC,GAAUN,EAAOC,MAAW,GAGxDnO,EACA,IAAKoO,EAAM,EAAGA,EAAMpO,EAAQoO,IACxBL,GAAkBC,EAAaC,EAAWI,EAASD,GAAMD,GAIjEJ,GAAkBC,EAAaC,EAAWC,EAAOC,EAAQ,IAG7D,SAASM,GAAmBC,GACxB,IAAIC,EAAS,GAETD,EAAO1O,QACP+N,GAAkBY,EAAQD,EAAO,IAGrC,IAAIlB,EAAc,GAClB,IAAK,IAAIoB,KAAKD,EACVnB,EAAY1H,KAAK,CAAE8G,KAAMiC,KAAKC,MAAMF,GAAIhB,OAAQe,EAAOC,KAG3D,OAAOpB,EA8CX,SAASuB,GAAsBC,EAAMV,EAASW,IA3C9C,SAA+BX,EAASU,GACpC,IACIE,GADSF,EAAKN,QAAU,IACJ,GAExB,GAAIQ,GAAcZ,EAAQtO,OAASkP,EAAWZ,QAAQtO,OAGlD,IAFA,IAAImP,EAAeD,EAAWZ,QAErBF,EAAM,EAAGA,EAAMe,EAAanP,OAAQoO,IACzC,IAAIe,EAAaf,GAAKd,QAAtB,CAKA,IADA,IAAI8B,GAAQ,EACHC,EAAI,EAAGA,EAAIf,EAAQtO,OAAQqP,IAChC,GAAiE,IAA7DC,GAAQhB,EAAQe,IAAIvM,QAAQqM,EAAaf,GAAKmB,WAAkB,CAChEH,GAAQ,EACR,MAIHA,GACDd,EAAQxI,KAAK,CAAE8G,KAAM,CAACuC,EAAaf,GAAKxB,MAAOgB,QAAQ,MAyBnE4B,CAAsBlB,EAFtBU,EAAOA,GAAQ,IAIXC,EAASjP,OAAS,GAClBsO,EAAQxI,KAAK,CACT8G,KAAMzB,EACNmC,SAAS,EACTe,SAAUV,GAAiBsB,KAInC,IAAIQ,EAAgB,CAChBnB,QAASA,GAGb,GAAIU,EAAKN,OAAQ,CACb,IAAIC,EAASe,GAAkBV,EAAKN,OAAQe,GACxCd,EAAOT,QACPI,EApCZ,SAA4BJ,GAIxB,IAHA,IAAIS,EAAS,GACTL,EAAUJ,EAAMI,QAEXF,EAAM,EAAGA,EAAME,EAAQtO,OAAQoO,IAChCE,EAAQF,GAAKd,SAKjBqB,EAAO7I,KAAK,CAAE8G,KAAM,CAAC0B,EAAQF,GAAKxB,MAAOgB,OAAQU,EAAQF,GAAKC,SAASrO,OAAS,IAGpF,OAAO2O,EAuBWgB,CAAmBhB,EAAOT,QAI5C,OAAOI,EAGX,SAASsB,GAAsBC,GAC3B,IAAIC,EAAgBtH,EAAMuH,OAAOF,EAAEG,OAAO,GAC1C,OAAO,SAASC,EAAmBC,GAC/B,OAAOL,EAAEM,UAAUL,EAAcG,EAAkBlD,UAAWmD,EAAOD,IAI7E,SAASG,GAAShL,GACd,MAAsB,iBAARA,IAAqBiL,MAAMjL,GAG7C,SAASkL,GAAOlL,GACZ,OAAOA,GAAOA,EAAImL,QAqBtB,SAASC,GAAuBhD,GAE5B,IADA,IAAImB,EAAS,GACJ9I,EAAI,EAAGA,EAAI2H,EAAYxN,OAAQ6F,IACpC8I,EAAO7I,KAAK,CACR2K,IAAKjD,EAAY3H,GAAG4K,IACpBT,MAAOxC,EAAY3H,GAAGmK,MAAMU,MAAM,KAAKC,QAG/C,OAAOhC,EAGX,SAASiC,GAAmBZ,EAAO7O,EAAK0P,GACpC,IACIC,EAAa,CACbC,IAAO3G,EACP4G,QAAW3G,EACX4G,IAAO3G,EACP4G,IAAO3G,GAGP+C,EAAU,CACNN,MAFQ,SAASmE,GAAQ,OAAOA,EAAKxS,KAAKqR,QAEzBoB,KAAK,CAAEpB,MAAOA,IAC/BG,UAAWW,EAAW3P,GACtBwL,QAASxL,EACTkQ,WAAYlQ,EACZuM,KAAM,EACNd,KAAM,CAACzL,IAMf,OAJI0P,IACAvD,EAAQ6C,UAAUU,OAjBL,SAAS7D,GAAS,OAAOxE,EAAMqI,OAAOlS,KAAKkS,OAAQ7D,IAiB1BoE,KAAK,CAAEP,OAAQA,KAGlDvD,EAuBX,IAAIgE,GAAY,CACZC,IAAK,SAASvE,EAAOkD,GACjB,IAAIlC,EAAckC,EAAMlC,YAQxB,OANKoC,GAASpC,GAEHoC,GAASpD,KAChBgB,GAAehB,GAFfgB,EAAchB,EAKXgB,GAEXwD,MAAO,SAASxE,EAAOkD,GACnB,OAAQA,EAAMlC,aAAe,GAAK,GAEtCyD,QAAS,CACLtB,UAAW,SAASnD,EAAOkD,GACvB,IAAIlC,EAAckC,EAAMlC,YAgBxB,OAdIkC,EAAMsB,QAAUjJ,IAChB2H,EAAMsB,MAAQ,GAGbpB,GAASpC,GAEHoC,GAASpD,KAChBgB,GAAehB,GAFfgB,EAAchB,EAKdoD,GAASpD,IACTkD,EAAMsB,QAGHxD,GAEXW,OAAQ,SAASuB,GACb,IAAIlC,EAAckC,EAAMlC,YAMxB,OAJIoC,GAASpC,KACTA,GAA4BkC,EAAMsB,OAG/BxD,IAGf0D,IAAK,SAAS1E,EAAOkD,GACjB,IAAIlC,EAAckC,EAAMlC,YASxB,OAPKoC,GAASpC,IAAiBsC,GAAOtC,KAClCA,EAAchB,GAGdgB,EAAchB,IAAUoD,GAASpD,IAAUsD,GAAOtD,MAClDgB,EAAchB,GAEXgB,GAEX2D,IAAK,SAAS3E,EAAOkD,GACjB,IAAIlC,EAAckC,EAAMlC,YASxB,OAPKoC,GAASpC,IAAiBsC,GAAOtC,KAClCA,EAAchB,GAGdgB,EAAchB,IAAUoD,GAASpD,IAAUsD,GAAOtD,MAClDgB,EAAchB,GAEXgB,IAIX4D,GAAmB/I,EAAMiB,OAAO,CAChC+H,KAAM,SAAShT,GACXF,KAAKE,QAAUiL,EAAO,GAAInL,KAAKE,QAASA,GACxCF,KAAKmT,WAAanT,KAAKoT,sBAAsB,QAASpT,KAAKE,QAAQiT,YACnEnT,KAAKsQ,SAAWtQ,KAAKoT,sBAAsB,OAAQpT,KAAKE,QAAQoQ,WAGpE8C,sBAAuB,SAASC,EAAUxE,GACtCA,EAAcA,GAAe,GAC7B,IACIwC,EADAiC,EAAS,GAGb,GAAmC,mBAA/BrI,EAAS9I,KAAK0M,GAAmC,CACjD,IAAK,IAAIY,EAAM,EAAGpO,EAASwN,EAAYxN,OAAQoO,EAAMpO,EAAQoO,IAEpC,iBADrB4B,EAAQxC,EAAYY,IAEhB6D,EAAOjC,GAAS,GACTA,EAAMgC,KACbC,EAAOjC,EAAMgC,IAAahC,GAGlCxC,EAAcyE,EAGlB,OAAOzE,GAGX0E,YAAa,SAASC,EAAWC,GAC7B,IAEIrT,EAAM6N,EAAMyF,EAEZjE,EAJAkE,EAAoBF,EAAmBpS,QAAU,EACjDuS,EAAmB5T,KAAKmT,YAAc,GAEtCU,EAAa,EAGbC,EAAkBN,EAAUnS,OAC5B2O,EAAS,GACT5E,EAAO,GAEX,GAAI0I,GAAmBL,EAAmBpS,OAAQ,CAC9C,IAAKwS,EAAa,EAAGA,EAAaF,EAAmBE,IAAc,CAI/D,IAFAzT,EAAO,CAAEuP,QAAS,IAEbF,EAAM,EAAGA,EAAMqE,EAAiBrE,IAEjCiE,GADAzF,EAAOuF,EAAU/D,IACJsC,MAAM,KAEnB3R,EAAKuP,QAAQvP,EAAKuP,QAAQtO,QAAU,CAChCqO,SAAU,GACV1B,SAAU4F,EAAiB3F,IAAS,IAAID,SAAW,MACnDC,KAAMA,EACN8F,UAAW9F,EACX+F,SAAU,IACVC,aAAa,EACbC,WAAYR,EAAMrS,OAAS,EAAIqS,EAAM,GAAK9J,EAC1CgH,UAAW3C,GAIf0F,EAAoB,IACpBvT,EAAKuP,QAAQvP,EAAKuP,QAAQtO,QAAU,CAChCqO,SAAU,GACV1B,QAAUyF,EAAmBI,GAAa7F,QAC1CC,KAAMwF,EAAmBI,GAAYjF,WAAWX,KAChD8F,UAAW,WACXC,SAAU,IACVC,aAAa,EACbC,WAAYtK,EACZgH,UAAW,aAInBZ,EAAOA,EAAO3O,QAAUjB,EAG5BgL,EAAKjE,KAAK0F,GAGd,MAAO,CACHzB,KAAMA,EACN2E,OAAQC,IAIhBmE,SAAU,SAASxO,EAAKyO,GACpB,IAEIC,EACAC,EACA9R,EAJA+R,EAAa,GACbC,EAAW,GAKf,IAAKhS,KAAOmD,EACHA,EAAInD,GAAKiS,kBACVD,EAASrN,KAAKwC,EAAEwB,OAAO,GAAI,CAAE8C,KAAMzL,EAAK0R,WAAYvO,EAAInD,GAAK0R,cAMrE,IAAKM,EAASnT,OACV,IAAKmB,KAAOmD,EACR6O,EAASrN,KAAKwC,EAAEwB,OAAO,GAAI,CAAE8C,KAAMzL,EAAK0R,WAAYvO,EAAInD,GAAK0R,cAIrEQ,GAAaF,EAAU7O,GAGvB,IAAK,IAAIuB,EAAI,EAAGA,EAAIkN,EAAgB/S,OAAQ6F,IACxCyN,GAAcP,EAAgBlN,GAAGmK,MAAMU,MAAM,KAAKC,MAAOwC,EAAUrK,EAASV,OAAO,CAAE4H,MAAO,OAAQS,IAAKsC,EAAgBlN,GAAG4K,OAGhIuC,EAAcO,GAAYJ,GAG1B,IAAK,IAAI9D,EAAI,EAAGA,EAAI2D,EAAYhT,OAAQqP,KACpC4D,EAAU3O,EAAI0O,EAAY3D,GAAGzC,OACrB/J,MAAQwM,EAChB6D,EAAW7D,GAAK4D,EAGpB,OAAOC,GAGXM,gBAAiB,SAASlP,EAAK+H,EAAU+F,EAAoBW,GACzD,IAEIP,EACAtE,EAEA/M,EACA8R,EACA1T,EACAkU,EAGAC,EAEAC,EACAtB,EACAzF,EACAwB,EAhBAkE,EAAoBF,EAAmBpS,QAAU,EACjDuS,EAAmB5T,KAAKmT,YAAc,GAQtC9D,EAAc,GACd4F,EAAkB,GAYtB,IAAKzS,KAJD4R,GAAmBA,EAAgB/S,SAAWsI,EAAEuL,cAAcvP,KAC9DA,EAAM3F,KAAKmU,SAASxO,EAAKyO,IAGjBzO,EAAK,CASb,IARA2O,EAAU3O,EAAInD,GAGd5B,EAAUyO,GAFV0F,EAAa/U,KAAKmV,oBAAoBzH,EAAU4G,EAAQc,aAEvBlR,QAAU,GAC3C4Q,EAAcG,EAAgBF,EAAW7Q,QAAU,GAEnD8Q,EAAgBD,EAAWhH,OAAOsH,MAE7BxB,EAAa,EAAGA,EAAaF,EAAmBE,IAAc,CAE/D,IADAtE,EAAQ,CAAEI,QAAS,IACdF,EAAM,EAAGA,EAAMuF,EAAc3T,OAAQoO,IAClCA,IAAQsF,EAAWhH,OAAOuH,aAC1B/F,EAAMI,QAAQJ,EAAMI,QAAQtO,QAAU,CAClCqO,SAAU,GACV1B,QAASsG,EAAQjG,MACjBJ,KAAMqG,EAAQrG,KACdgG,aAAa,EACbD,SAAU,EACVD,UAAWO,EAAQJ,WAAaI,EAAQrG,KACxCiG,WAAYI,EAAQJ,WACpBtD,UAAW0D,EAAQJ,WAAaI,EAAQrG,MAGzB,IAAf4F,GACAiB,EAAY3N,KAAK0I,GAAUN,EAAOE,GAAKvO,KAAK,OAIhDwS,GADAzF,EAAO+G,EAAcvF,IACRsC,MAAM,KACnBxC,EAAMI,QAAQJ,EAAMI,QAAQtO,QAAU,CAClCqO,SAAU,GACV1B,SAAU4F,EAAiB3F,IAAS,IAAID,SAAW,MACnDC,KAAMA,EACN8F,UAAW9F,EACX+F,SAAU,IACVC,aAAa,EACbC,WAAYR,EAAMrS,OAAS,EAAIqS,EAAM,GAAK9J,EAC1CgH,UAAW3C,IAKnB0F,EAAoB,IACpBpE,EAAMI,QAAQJ,EAAMI,QAAQtO,QAAU,CAClCqO,SAAU,GACV1B,QAASyF,EAAmBI,GAAY7F,QACxCC,KAAMwF,EAAmBI,GAAYjF,WAAWX,KAChD8F,UAAW,WACXC,SAAU,IACVC,aAAa,EACbC,WAAYtK,EACZgH,UAAW,aAInBhQ,EAAQA,EAAQS,QAAUkO,EAG9BF,EAAY0F,EAAW7Q,OAAStD,EAChCqU,EAAgBF,EAAW7Q,OAAS4Q,EAGxC,MAAO,CACH1J,KAAM6J,EACNlF,OAAQV,IAIhB8F,oBAAqB,SAASxF,EAASuE,GACnC,IAAK,IAAIzE,EAAM,EAAGA,EAAME,EAAQtO,OAAQoO,IACpC,GAAIE,EAAQF,GAAK2F,aAAelB,EAC5B,MAAO,CACHnG,OAAQ4B,EAAQF,GAChBvL,MAAOuL,IAMvB8F,UAAW,SAAS5P,EAAKiJ,EAAY6E,EAAoBW,GACrDX,EAAqBA,GAAsB,GAE3C,IAAI+B,EAAWxV,KAAKuT,YAAY3E,EAAWxO,KAAMqT,GAC7CgC,EAAezV,KAAK6U,gBAAgBlP,EAAKiJ,EAAWlB,SAAU+F,EAAoBW,GAEtF,MAAO,CACHhJ,KAAM,GAAGhE,OAAOkC,MAAMkM,EAASpK,KAAMqK,EAAarK,MAClD2E,OAAQ,GAAG3I,OAAOkC,MAAMkM,EAASzF,OAAQ0F,EAAa1F,UAI9D2F,cAAe,SAASpF,EAAUqF,GAY9B,IAXA,IAQIhH,EACAV,EATAwB,EAAM,EACNpO,EAASiP,GAAYA,EAASjP,OAE9BuU,EAAiB,GACjBC,EAAc,GACdC,EAAU,GAEVjH,EAAe7O,KAAKsQ,UAAY,GAI7Bb,EAAMpO,EAAQoO,IAEjBd,EAAUE,EADVZ,EAAOqC,EAASb,GAAKb,WAAWX,OACD,GAE/B2H,EAAezO,KAAK8G,GAEhBU,EAAQqB,SACR6F,EAAY5H,GAAQU,EAAQqB,QAG5BrB,EAAQuD,SACR4D,EAAQ7H,GAAQU,EAAQuD,QAIhC,MAAO,CACHmD,MAAOO,EACPE,QAASA,EACTD,YAAaA,EACbF,QAASA,IAIjBI,aAAc,SAASpQ,EAAKqQ,EAAcC,EAASC,GAC/C,IAEIC,EACAlI,EAAM/G,EAAGwJ,EAAGT,EAAGmG,EACfnQ,EAAKoQ,EAAQC,EAIbC,EARAvG,EAAS,GAMTwG,EAAwB,EACxBC,EAAkB,GAGlBC,EAAYT,EAAQ5U,QAAU,EAC9BsV,EAAeT,EAAW7U,QAAU,EASxC,IAPI2U,EAAaL,QAEba,GADAC,EAAkBT,EAAaX,OACShU,OAExCkV,EAAqBP,EAAaX,MAGjCnO,EAAI,EAAGA,EAAIwP,EAAWxP,IAGvB,IAFAjB,EAAMN,EAAIsQ,EAAQ/O,IAAM2F,GAEnBuJ,EAAI,EAAGA,EAAII,EAAuBJ,IAKnC,IAJIJ,EAAaL,UACbY,EAAqB,CAACE,EAAgBL,KAGrC1F,EAAI,EAAGA,EAAIiG,EAAcjG,IAU1B,IATA4F,EAAYJ,EAAWxF,IAAM7D,EAC7BwJ,EAASpQ,EAAI2Q,MAAMN,GAGfH,EADAG,IAAczJ,EACD5G,EAAIkQ,WAEJE,EAASA,EAAOF,WAAa,GAGzClG,EAAI,EAAGA,EAAIsG,EAAmBlV,OAAQ4O,IACvChC,EAAOsI,EAAmBtG,GAC1BjQ,KAAK6W,SAAS7G,EAAQmG,EAAWlI,GAAO+H,EAAaF,QAAQ7H,GAAO+H,EAAaH,YAAY5H,IAM7G,OAAO+B,GAGX6G,SAAU,SAAS7G,EAAQ3B,EAAO6D,EAAQ4E,GACtC,IACIC,EADAvI,EAAW,GAGXH,IACAA,EAAQyI,EAAaA,EAAWzI,GAASA,EAAMgB,YAC/Cb,EAAW0D,EAASrI,EAAMqI,OAAOA,EAAQ7D,GAASA,GAKtD2B,EAFA+G,EAAU/G,EAAO3O,QAEC,CACd0V,QAASA,EACT1I,MAAOA,GAAS,GAChBG,SAAUA,IAIlBwI,kBAAmB,SAAS5I,EAAUQ,EAAYqI,GAS9C,IARA,IAAIvD,EACAwD,EACAC,EAIA9I,EAFAgH,EAAQzG,EAAWyG,MACnB5F,EAAMb,EAAW0G,YAGd7F,EAAM,GAET,IADAiE,EAAQ2B,IAAQ5F,GAAKsC,MAAM,MACjB1Q,OAAS,IACf6V,EAAcxD,EAAM,GACpByD,EAAgBzD,EAAM,IAGtBrF,GADAA,EAAQ4I,EAAQC,GAAa9I,MACVxE,GAAyB,OAAVyE,EAAkBA,EAAMpD,WAAaoD,IAE1D8I,GACT,OAAO,EAInB,OAAO,GAGXC,oBAAqB,SAAS3D,EAAoBnC,EAAmB+F,GAKjE,IAJA,IACI9F,EACAtD,EAFA+B,EAAS,GAIJ6D,EAAa,EAAGA,EAAaJ,EAAmBpS,OAAQwS,IAC7D5F,EAAOwF,EAAmBI,GAAYjF,WAAWX,MACjDsD,EAAQ8F,EAAUlB,WAAWlI,IAAS,IAChCoB,YAAcoE,EAAmBI,GAAYyD,WAAWhG,EAAmBC,GACjFvB,EAAO/B,GAAQsD,EAGnB,OAAOvB,GAGXuH,gBAAiB,SAAS9D,EAAoB5E,EAAaoI,EAASO,EAASlG,EAAmBmG,EAAUlG,EAAOmG,GAS7G,IARA,IAAIrJ,EACAO,EACAyH,EACAgB,EACA7U,EAAKyL,EAAMiG,EAAYyD,EACvBvJ,EAAWkD,EAAkBlD,SAC7BqB,EAAM,EAEHA,EAAMZ,EAAYxN,OAAQoO,IAC7Bb,EAAaC,EAAYY,GAGpBzP,KAAKgX,kBAAkB5I,EAAUQ,EAAYqI,KAIlDU,EAAO/I,EAAWyG,MAAMnG,MAAM,EAAGN,EAAW0G,aAAapU,KAAK,IAO9DgT,EANAjG,EAAOW,EAAWyG,MAAMzG,EAAW0G,aAUnCe,EAASmB,EAFThV,EAAMmV,GADN1J,EAAOA,EAAO,KAHdI,GADAA,EAAQ4I,EAAQhJ,GAAMG,MACHxE,GAAyB,OAAVyE,EAAkBA,EAAMpD,WAAaoD,MAM9C,CACrBnK,MAAOqN,EAAMqG,YACb1D,WAAYA,EACZjG,KAAMA,EACNwG,kBAAyC,IAAvBkD,EAAKxT,QAAQ,KAAcwT,EAAO,GACpDvC,WAAYuC,EAAOzD,EACnB2D,YAAa,GACbxJ,MAAOA,GAGPsJ,GAAQH,EAAQG,KAAUH,EAAQG,GAAME,YAAYF,EAAOzD,EAAa,IAAM7F,KAC9EmJ,EAAQG,GAAME,YAAYF,EAAOzD,EAAa,IAAM7F,IAAS,GAGjEgJ,EAAYI,EAASb,MAAMpU,IAAQ,CAC/B2T,WAAY,IAGhBsB,EAASb,MAAMpU,GAAO,CAClB0B,MAAOmS,EAAOnS,MACdiS,WAAYnW,KAAKoX,oBAAoB3D,EAAoBnC,EAAmB+F,IAG5EK,IACKF,EAAQhV,IACT+O,EAAMqG,cAEVJ,EAAQhV,GAAO6T,KAK3ByB,oBAAqB,SAAS5X,GAC1B,IAGI0O,EAAYD,EAASc,EAAKpO,EAC1B0W,EAAkBvG,EAJlBwG,EAAqB9X,EAAQoQ,UAAY,GACzCA,EAAWtQ,KAAKsQ,UAAY,GAC5B2H,EAAc,GAIlB,GAAID,EAAmB3W,QACnB,IAAKoO,EAAM,EAAGpO,EAAS2W,EAAmB3W,OAAQoO,EAAMpO,EAAQoO,IAK5D,GAFAsI,EAAmB,KADnBpJ,EAAU2B,GADV1B,EAAaoJ,EAAmBvI,IACFxB,MAGjB,CAET,GAAyB,iBADzBuD,EAAY7C,EAAQ6C,WACe,CAG/B,KAFAuG,EAAmBpF,GAAUnB,EAAU0G,gBAGnC,MAAM,IAAIC,MAAM,uCAGpBxJ,EAAQ6C,UAAYuG,EAAiBvG,WAAauG,EAClDpJ,EAAQqB,OAAS+H,EAAiB/H,OAItCiI,EAAY9Q,KAAK,CACbyH,WAAYA,EACZZ,QAASW,EAAQX,QACjBgC,OAAQrB,EAAQqB,OAChBsH,WAAYrG,GAAsBtC,WAK9CsJ,EAAY9Q,KAAK,CACbyH,WAAY,CAAEX,KAAM,WACpBD,QAAS,UACTsJ,WAAY,WAAa,OAAO,KAIxC,OAAOW,GAGXG,cAAe,SAAS/C,GAKpB,IAJA,IACI3B,EACAzF,EAFA+B,EAAS,GAIJP,EAAM,EAAGA,EAAM4F,EAAMhU,OAAQoO,KAElCiE,GADAzF,EAAOoH,EAAM5F,IACAsC,MAAM,MAET1Q,OAAS,EACf2O,EAAO0D,EAAM,IAAM7J,EAAMuH,OAAOsC,EAAM,IAAI,GAE1C1D,EAAO/B,GAAQpE,EAAMuH,OAAOjC,GAAclB,IAAO,GAIzD,OAAO+B,GAGXqI,kBAAmB,SAASxJ,GAMxB,IALA,IAAIyJ,EAAoBC,GAAiB1J,GACrC2E,EAAYgF,GAAaF,EAAkBlY,MAC3CsN,EAAW4K,EAAkB5K,SAC7BsC,EAAS,GAEJP,EAAM,EAAGA,EAAM/B,EAASrM,OAAQoO,IACrCO,EAAO7I,KAAKsR,GAAS/K,EAAS+B,GAAKxB,KAAMuF,IAG7C,MAAO,CACHpT,KAAMoT,EACN9F,SAAUsC,IAIlB0I,QAAS,SAAStO,EAAMuO,GACpB,IAAKA,EACD,OAAOvO,EAOX,IAJA,IAAIwO,EACAnJ,EAAM,EACNoJ,EAAUF,EAAOE,QAEdpJ,EAAMoJ,EAAQxX,OAAQoO,IAGH,QAFtBmJ,EAAOC,EAAQpJ,IAENqJ,WACLD,EAAQpJ,GAAOzP,KAAK+Y,iBAAiBH,IAI7C,OAAO,IAAI/O,EAAMO,KAAKW,MAAMX,GAAMuO,OAAOA,GAAQvO,MAGrD2O,iBAAkB,SAASJ,GACvB,IAAItK,EAAQsK,EAAOtK,MAAM0D,MAAM,KAC3B/B,EAAS,GAEb,IAAK3B,EAAMhN,OACP,OAAOgN,EAGX,IAAK,IAAIoB,EAAM,EAAGA,EAAMpB,EAAMhN,OAAQoO,IAClCO,EAAO7I,KAAK,CACRkK,MAAOsH,EAAOtH,MACdyH,SAAU,KACVzK,MAAOA,EAAMoB,KAIrB,MAAO,CACHuJ,MAAO,KACPH,QAAS7I,IAIjBiJ,QAAS,SAAS7O,EAAMlK,GACpBkK,EAAOA,GAAQ,GACflK,EAAUA,GAAW,GAErBkK,EAAOpK,KAAK0Y,QAAQtO,EAAMlK,EAAQyY,QAElC,IAAIrI,EAAWpQ,EAAQoQ,UAAY,GAE/B4I,EAA2C,SAAzBhZ,EAAQiZ,aAE1BC,EAAoBlZ,EAAQsX,SAAW,GACvC6B,EAAiBnZ,EAAQsF,MAAQ,IAEhC4T,EAAkB/X,QAAUgY,EAAehY,UAAYiP,EAASjP,QAAWiP,EAASjP,QAAU6X,KAC/FE,EAAoBC,EACpBA,EAAiB,GACjBH,GAAkB,GAGjBE,EAAkB/X,QAAWgY,EAAehY,SAC7C6X,GAAkB,IAGjBE,EAAkB/X,QAAUiP,EAASjP,SACtC+X,EAAoBpK,GAAiB9O,EAAQoQ,WAGjD8I,EAAoBpZ,KAAKqY,kBAAkBe,GAC3CC,EAAiBrZ,KAAKqY,kBAAkBgB,GAExC,IAIIC,EAaAlL,EACAkD,EAGAiI,EAAQC,EAAeC,EAAShC,EAChCjV,EAAKmV,EAAMzD,EAAY7F,EACvBqL,EAAaC,EAvBbC,EAAiB,GACjBpC,EAAU,GACVhS,EAAO,GAGP+L,EAAQ,CAAEqG,YAAa,GAEvBnE,EAAqBzT,KAAK8X,oBAAoB5X,GAE9C2Z,EAAgB7Z,KAAKoY,cAAcgB,EAAkBhZ,MACrD0Z,EAAa9Z,KAAKoY,cAAciB,EAAejZ,MAE/C2Z,GAAY,EAEZC,EAAkBZ,EAAkB1L,SACpCuM,EAAeZ,EAAe3L,SAI9BwM,EAA0C,IAAxBD,EAAa5Y,OAK/BA,EAAS+I,EAAK/I,OACdoO,EAAM,EAEV,GAAI2J,EAAkBhZ,KAAKiB,QAAUgY,EAAejZ,KAAKiB,OAGrD,IAFA0Y,GAAY,EAEPtK,EAAM,EAAGA,EAAMpO,EAAQoO,IAkBxB,IAfA6B,EAAoB,CAChBlD,SAHJA,EAAWhE,EAAKqF,GAIZvL,MAAOuL,GAGXgI,EAAWmC,EAA4B,eAAK,CACxChD,MAAO,GACPT,WAAY,IAGhBnW,KAAKuX,gBAAgB9D,EAAoBuG,EAAiBH,EAAerC,EAASlG,EAAmBmG,EAAUlG,GAAQ2I,GAEvHzC,EAAStB,WAAanW,KAAKoX,oBAAoB3D,EAAoBnC,EAAmBmG,GACtFmC,EAA4B,cAAInC,EAE3B8B,EAAS,EAAGA,EAASU,EAAa5Y,OAAQkY,IAC3CC,EAAgBS,EAAaV,GAExBvZ,KAAKgX,kBAAkB5I,EAAUoL,EAAeM,IAKrDnC,EAAO6B,EAAcnE,MAAMnG,MAAM,EAAGsK,EAAclE,aAAapU,KAAK,IAGpEgT,EAFAuF,EAAUD,EAAcnE,MAAMmE,EAAclE,aAU5C9P,EAFAhD,EAAMmV,GADN8B,EAAUA,EAAU,KAFpBH,GADAA,EAAWQ,EAAWL,GAASrL,MACPxE,EAAc0P,EAASrO,WAAaqO,KAKhD,CACRlE,WAAYuC,EAAOzD,EACnBA,WAAYA,EACZjG,KAAMwL,EACNpL,MAAOiL,GAGXjL,EAAQuL,EAAepX,IAAQ,CAC3BoU,MAAO,GACPT,WAAY,IAGhBnW,KAAKuX,gBAAgB9D,EAAoBuG,EAAiBH,EAAerC,EAASlG,EAAmBjD,EAAOkD,GAAO,GAEnHlD,EAAM8H,WAAanW,KAAKoX,oBAAoB3D,EAAoBnC,EAAmBjD,GACnFuL,EAAepX,GAAO6L,GA9BlBrO,KAAKuX,gBAAgB9D,EAAoBuG,EAAiBH,EAAerC,EAASlG,EAAmB,CAAEsF,MAAO,GAAIT,WAAY,IAAM5E,GAAO,GAsD3J,OAnBIwI,GAAa1Y,KACToS,EAAmBpS,OAAS,IAAOnB,EAAQsX,SAAYtX,EAAQsX,QAAQnW,SACvE+X,EAAoB,CAChBhZ,KAAM,GACNsN,SAAU,KAIlBgM,EAAc1Z,KAAKuV,UAAUiC,EAAS4B,EAAmBF,EAAkB,GAAKzF,EAAoBvT,EAAQia,KAAOja,EAAQia,KAAO,IAClIR,EAAW3Z,KAAKuV,UAAU/P,EAAM6T,EAAgBH,EAAkBzF,EAAqB,GAAIvT,EAAQia,KAAOja,EAAQia,KAAO,IAEzH3C,EAAUkC,EAAY3J,OACtBvK,EAAOmU,EAAS5J,OAEhB6J,EAAiB5Z,KAAK+V,aAAa6D,EAAgB5Z,KAAK0V,cAAcjC,EAAoByF,GAAkBS,EAASvO,KAAMsO,EAAYtO,OAEvIwO,EAAiBpC,EAAUhS,EAAO,GAG/B,CACH4U,KAAM,CACF5C,QAAS,CAAEzH,OAAQyH,GACnBhS,KAAM,CAAEuK,OAAQvK,IAEpB4E,KAAMwP,MAKdS,GAAiBnQ,EAAMiB,OAAO,CAC9B+H,KAAM,SAAShT,EAASoa,GACpBta,KAAKsa,UAAYA,EACjBta,KAAKE,QAAUoa,EAAUpa,SAAW,GAE/BF,KAAKsa,UAAUC,UACZlP,EAAWnL,EAAQqa,YACnBva,KAAKua,SAAWra,EAAQqa,WAIpCC,KAAM,SAASta,GACX,OAAOF,KAAKsa,UAAUE,KAAKta,IAE/BI,OAAQ,SAASJ,GACb,OAAOF,KAAKsa,UAAUha,OAAOJ,IAEjCuJ,OAAQ,SAASvJ,GACb,OAAOF,KAAKsa,UAAU7Q,OAAOvJ,IAEjCua,QAAS,SAASva,GACd,OAAOF,KAAKsa,UAAUG,QAAQva,IAElCqa,SAAU,SAASra,GACf,GAAIF,KAAKsa,UAAUC,SACf,OAAOva,KAAKsa,UAAUC,SAASra,GAEnCA,EAAQwa,QAAQ,KAEpBC,QAAS,SAASlU,GACd,IAAIvG,EAAUF,KAAKE,SAAW,GAE9B,GAAIuG,IAAQmD,EACR,OAAQ1J,EAAQ0a,YAAc,IAAID,QAItC,IAAIC,EAAa1a,EAAQ0a,YAAc,GACvCA,EAAWD,QAAUlU,EAErBzG,KAAKE,QAAQ0a,WAAaA,EAC1BjR,EAAEwB,OAAOnL,KAAKsa,UAAUpa,QAAS,CAAE0a,WAAYA,KAEnDC,KAAM,SAASpU,GACX,IAAIvG,EAAUF,KAAKE,SAAW,GAE9B,GAAIuG,IAAQmD,EACR,OAAQ1J,EAAQ0a,YAAc,IAAIC,KAGtC,IAAID,EAAa1a,EAAQ0a,YAAc,GACvCA,EAAWC,KAAOpU,EAElBzG,KAAKE,QAAQ0a,WAAaA,EAC1BzP,GAAO,EAAMnL,KAAKsa,UAAUpa,QAAS,CAAE0a,WAAYA,OAIvDE,GAAoBxQ,EAAWa,OAAO,CACtC+H,KAAM,SAAShT,GAEX,IAAI2a,IAAS3a,GAAW,IAAI6a,QAAU,IAAIF,KAEtCE,EAAS,CACTX,KAAMlP,EACN8P,MAAO9P,EACP+P,SAAU/P,EACVoF,SAAUpF,EACViI,WAAYjI,EACZgQ,YAAahQ,EACbiQ,OAAQjQ,EACRyE,QAASzE,GAGT2P,IACA7a,KAAKob,WAAazR,EAAEwB,OAAO4P,EAAQ/a,KAAKqb,YAAYR,KAGxDvQ,EAAWgR,GAAGpI,KAAK/Q,KAAKnC,KAAMmL,GAAO,EAAM,GAAI,GAE5CjL,IAEH,IAAIqb,EAAmBvb,KAAKE,QAAQoa,WAAa,GACG,UAA/Cta,KAAKE,QAAQ6O,MAAQ,QAAQmJ,gBAC9BlY,KAAKwb,SAAU,EACfxb,KAAKsa,UAAY,IAAImB,GAAgBF,IAGzCvb,KAAK0b,SAAW1M,GAAiBhP,KAAKE,QAAQsX,SAC9CxX,KAAK2b,MAAQ3M,GAAiBhP,KAAKE,QAAQsF,MAE3C,IAAI8K,EAAWtQ,KAAKob,WAAapb,KAAKob,WAAW9K,WAAatQ,KAAKE,QAAQoQ,UAAY,GAEvD,oBAA5BrF,EAAS9I,KAAKmO,KACdtQ,KAAK4b,cAAgBtL,EAASD,MAAQ,UACtCC,EAAWA,EAASxJ,QAAU,IAGlC9G,KAAK6b,UAAYnN,GAAkB4B,IAGvCpQ,QAAS,CACL4b,eAAe,EACfC,cAAc,EACdC,iBAAiB,EACjBC,gBAAgB,EAChBC,kBAAkB,GAGtB9B,KAAM,WACF,MAAO,CACH5C,QAAS2E,GAAcnc,KAAKwX,WAC5BhS,KAAM2W,GAAcnc,KAAKwF,UAIjCmV,QAAS,SAASlU,GACd,GAAIA,IAAQmD,EACR,OAAO5J,KAAKsa,UAAUK,UAG1B3a,KAAKsa,UAAUK,QAAQlU,GACvBzG,KAAKoc,YAAY,IACjBpc,KAAKwa,QAGTK,KAAM,SAASpU,GACX,GAAIA,IAAQmD,EACR,OAAO5J,KAAKsa,UAAUO,OAG1B7a,KAAKsa,UAAUO,KAAKpU,GACpBzG,KAAKoc,YAAY,IACjBpc,KAAKwa,QAGTrB,aAAc,WACV,OAAOnZ,KAAK4b,eAAiB,WAGjCS,MAAO,SAASC,GACZ,IAAIC,EAAOvc,KACX,GAAIA,KAAKwc,QAAU5S,GAAqC,IAAtB5J,KAAKwc,MAAMnb,OAAc,CAOvD,OAAOrB,KAAKyc,SAASC,MANZ,WACDrR,EAAWiR,IACXA,EAASna,KAAKoa,QAQ9BI,gBAAiB,SAASvC,GAMtB,IALA,IACI5X,EADAoa,EAAW,GAEXzJ,EAAanT,KAAKob,WAAWyB,qBAC7BC,EAAmB,SAAStK,GAAQ,OAAOA,EAAKxS,KAAKwC,MACrDua,EAAgB,SAAS1O,GAAS,OAAOA,GACpCnH,EAAI,EAAGA,EAAIkT,EAAK/Y,OAAQ6F,IAC7B1E,EAAM4X,EAAKlT,GAAG+G,KAAK,GACnB2O,EAASzV,KAAK,CACV3E,IAAKA,EACLwa,aAAcF,EAAiBrK,KAAK,CAAEjQ,IAAKA,IAC3Cya,UAAWF,EACX/O,SAAUmF,EAAW3Q,IAAQ,IAAIwL,SAAWxL,IAGpD,OAAOoa,GAGXvB,YAAa,SAASR,GAClB,MAAO,CACHgC,mBAAoB,WAChB,OAAOhC,EAAK1H,YAEhBA,WAAY,WACR,IAAInD,EAAS,GACTmD,EAAa0H,EAAK1H,WAEtB,IAAK,IAAI3Q,KAAO2Q,EACZnD,EAAO7I,KAAK,CACR8G,KAAMzL,EACNwL,QAASmF,EAAW3Q,GAAKwL,SAAWxL,EACpCkQ,WAAYlQ,EACZ0a,iBAAkB1a,EAClBuM,KAAM,IAad,OATI8L,EAAKvK,UACLN,EAAO7I,KAAK,CACR8G,KAAMzB,EACNwB,QAASxB,EACTkG,WAAYlG,EACZuC,KAAM,IAIPiB,GAEXmN,eAAgB,SAAS7M,EAAU3B,GAC/B,IAAK,IAAIzH,EAAI,EAAGA,EAAIoJ,EAASjP,OAAQ6F,IAC5BoJ,EAASpJ,GAAGsK,YACblB,EAASpJ,GAAGsK,UAAY7C,EAAQ6C,UAChClB,EAASpJ,GAAGmH,MAAQM,EAAQN,MAC5BiC,EAASpJ,GAAG8G,QAAUW,EAAQX,QAC9BsC,EAASpJ,GAAGwL,WAAa/D,EAAQ+D,WACjCpC,EAASpJ,GAAG6H,KAAO,IAI/BuB,SAAU,WACN,IAAIN,EAAS,GACTM,EAAWuK,EAAKvK,SAEpB,IAAK,IAAI9N,KAAO8N,EACZN,EAAO7I,KAAK8K,GAAmB3B,EAAS9N,GAAK6O,MAAO7O,EAAK8N,EAAS9N,GAAK0P,SAG3E,OAAOlC,GAEXoN,WAAY,SAASnP,GACjB,IAAImD,EAASvH,EAAMuH,OAAOjC,GAAclB,IAAO,GAC3C7D,EAAOpK,KAAKE,QAAQkK,MAAQpK,KAAKqd,eAAiB,GACtD,OAAKjT,EAAK/I,cAII+P,EAAOhH,EAAK,IAHf,MAIbqI,KAAKzS,MACP2P,QAAS,SAAS1B,GACd,IAGImD,EACA/C,EAJAjE,EAAOpK,KAAKE,QAAQkK,MAAQpK,KAAKqd,eAAiB,GAClDrN,EAAS,GACTsN,EAAW,GAGX7N,EAAM,EAEV,IAAiC,IAA7BxB,EAAK9J,QAAQ,WACb,MAAO,CACH,CACI6J,QAAS6M,EAAK1H,WAAWlF,EAAK8D,MAAM,KAAK,IAAI/D,SAAWC,EACxDsP,gBAAiBtP,EACjBA,KAAMA,EACNuP,oBAAqB,EACrB9K,WAAYzE,IAOxB,IAFAmD,EAASvH,EAAMuH,OAAOjC,GAAclB,IAAO,GAEpCwB,EAAMrF,EAAK/I,OAAQoO,MACtBpB,EAAQ+C,EAAOhH,EAAKqF,MACI,IAAVpB,IAAyB,IAAVA,GAAqBiP,EAASjP,KACvDiP,EAASjP,IAAS,EAElB2B,EAAO7I,KAAK,CACR6G,QAASK,EAAQ,GACjBJ,KAAMI,EAAQ,GACdmP,oBAAqB,EACrB9K,WAAYrE,KAKxB,OAAO2B,GACTyC,KAAKzS,QAIfwa,KAAM,SAASpQ,GACX,IAAImS,EAAOvc,KACPyd,EAAclB,EAAKmB,QAl2CZ,eAk2CkC,CAAE3O,KAAM3C,IACjDuR,EAASpB,EAAKqB,QAAQxT,GACtByT,EAAWlU,EAAEmU,WACjB,IAAKL,EAGD,GAFAlB,EAAKmB,QAAQnR,GAETgQ,EAAKrc,QAAQkK,KAAM,CAEnB,IAAI2T,GAAgB/d,KAAKge,OAAO5T,KAAKpK,KAAKE,QAAQkK,OAAS,IAAI8E,MAAM,GACjE6O,IAAiB/d,KAAKqd,gBACtBrd,KAAKqd,cAAgBU,GAEzB,IAAIE,EAAiB1B,EAAKI,gBAAgBgB,EAAOO,YAC7CC,EAAc5B,EAAKI,gBAAgBgB,EAAOS,SAC1C9N,EAAWiM,EAAKjM,WAGhB+N,EAAY,CACZC,SAHW9S,EAAe+Q,EAAKrc,QAAQkK,KAAM+T,EAAaF,EAAgB3N,EAAU,CAAEiO,UAAW,YAAaC,YAAa,WAAajC,EAAK5D,UAAY,IAIzJsF,eAAgBA,EAChBE,YAAaA,EACbD,WAAYP,EAAOO,WACnBE,QAAST,EAAOS,QAChB9N,SAAUA,EAAS3K,KAAI,SAAS6M,GAAQ,OAAOA,KAASiM,UACxDnL,OAAQ,CAAEiL,UAAW,YAAaC,YAAa,WAC/CrE,KAAMtI,GAAuB8L,EAAOxD,MAAQ,KAGhDoC,EAAKmC,WAAWnT,EAAqB8S,IACrC9B,EAAKmB,QAAQrR,GACbwR,EAASc,eAETpC,EAAKjC,UAAUE,KAAK,CAChBpQ,KAAMuT,EACNjD,QAAS,SAASkE,GACdrC,EAAKmC,WAAWE,GAChBrC,EAAKmB,QAp4CZ,aAo4CgC,CAAEmB,SAAUD,EAAc7P,KAAM3C,IACzDmQ,EAAKmB,QAAQrR,GACTkQ,EAAKuC,kBACLvC,EAAKuC,iBAAkB,GAE3BjB,EAASc,WAEbI,MAAO,SAASC,GACZzC,EAAKmB,QAAQpR,EAAO,CAAEyS,MAAOC,OAK7C,OAAOnB,EAASoB,WAGpBrB,QAAS,SAASxT,GACd,IAAImS,EAAOvc,KACPE,EAAUoK,EAAWgR,GAAGsC,QAAQzb,KAAKoa,EAAMnS,GAsB/C,OApBAlK,EAAUiL,EAAO,CACb+S,WAAYhO,KAAKC,MAAMD,KAAKN,UAAU2M,EAAKb,WAC3C0C,QAASlO,KAAKC,MAAMD,KAAKN,UAAU2M,EAAKZ,QACxCxC,aAAcoD,EAAKpD,eACnB+F,YAAa3C,EAAKV,WACnB3b,GAE6C,UAA3CF,KAAKE,QAAQ6O,MAAQ,IAAImJ,gBAC1BhY,EAAQ0a,WAAa2B,EAAKrc,QAAQoa,UAAUM,YAG5C1a,EAAQyY,SACRzY,EAAQyY,OAAS7N,EAAgB5K,EAAQyY,QACzCzY,EAAQyY,QAAUzY,EAAQyY,QAAU,IAAIE,SAGxC3Y,EAAQia,OACRja,EAAQia,KAAOnP,EAAc9K,EAAQia,OAGlCja,GAGXqa,SAAU,SAASra,GACf,IACIoa,EADOta,KACUsa,UAErB,GAAIA,EAAUC,SACV,OAAOD,EAAUC,SAASra,IAIlCif,eAAgB,WACZ,IAAI5C,EAAOvc,KACX,OAAOuc,EAAKhC,SACR,CACI6E,QAAS,iBACTC,aAAc,CACVC,YAAa/C,EAAKjC,UAAUK,UAC5B4E,SAAUhD,EAAKjC,UAAUO,UAE9B,SAASgE,GACR,OAAOA,MAInBW,WAAY,WACR,IAAIjD,EAAOvc,KAEX,OAAOuc,EAAKhC,SACZ,CACI6E,QAAS,aACTC,aAAc,CACVC,YAAa/C,EAAKjC,UAAUK,UAC5B4E,SAAUhD,EAAKjC,UAAUO,UAE9B,SAASgE,GACR,OAAOA,MAIfY,iBAAkB,WACd,IAAIlD,EAAOvc,KAEX,OAAOuc,EAAKhC,SACZ,CACI6E,QAAS,mBACTC,aAAc,CACVC,YAAa/C,EAAKjC,UAAUK,UAC5B4E,SAAUhD,EAAKjC,UAAUO,UAE9B,SAASgE,GACR,OAAOA,MAIfa,kBAAmB,SAASC,GACxB,IAAIpD,EAAOvc,KAEX,OAAOuc,EAAKhC,SAAS,CAClB6E,QAAS,oBACTC,aAAc,CACVC,YAAa/C,EAAKjC,UAAUK,UAC5B4E,SAAUhD,EAAKjC,UAAUO,OACzB+E,oBAAqBD,KAEzB,SAASd,GACR,OAAOA,MAIfgB,aAAc,SAASC,GACnB,IAAIvD,EAAOvc,KAEX,OAAOuc,EAAKhC,SAAS,CACjB6E,QAAS,eACTC,aAAc,CACVC,YAAa/C,EAAKjC,UAAUK,UAC5B4E,SAAUhD,EAAKjC,UAAUO,OACzBkF,oBAAqBD,KAE1B,SAASjB,GACR,OAAOA,MAIfmB,YAAa,WAGT,OAFWhgB,KAECua,SAAS,CACjB6E,QAAS,cACTC,aAAc,CACVC,YALGtf,KAKesa,UAAUK,aAEjC,SAASkE,GACR,OAAOA,MAIfoB,eAAgB,WAGZ,OAFWjgB,KAECua,SAAS,CACjB6E,QAAS,mBACV,SAASP,GACR,OAAOA,MAIfqB,cAAe,SAASb,GACpB,IAAI9C,EAAOvc,KAEX,OAAOuc,EAAKhC,SAAS,CACjB6E,QAAS,gBACTC,aAAclU,EAAO,CAClBmU,YAAa/C,EAAKjC,UAAUK,UAC5B4E,SAAUhD,EAAKjC,UAAUO,QACzBwE,KACJ,SAASR,GACR,OAAOA,MAIfH,WAAY,SAASnN,GACjB,IAAIgL,EAAOvc,KAEXuc,EAAK4D,cAAgB5O,EAAMiG,QAC3B+E,EAAK6D,WAAa7O,EAAM/L,KACxB+W,EAAK8D,MAAQ9D,EAAKC,MAAQjL,EAAMnH,MAGpCoN,QAAS,SAAS/Q,GACd,GAAIA,IAAQmD,EACR,OAAO5J,KAAK0b,SAGhB1b,KAAK0b,SAAW1M,GAAiBvI,GACjCzG,KAAKwa,QAGThV,KAAM,SAASiB,GACX,GAAIA,IAAQmD,EACR,OAAO5J,KAAK2b,MAGhB3b,KAAK2b,MAAQ3M,GAAiBvI,GAE9BzG,KAAKwa,QAGTlK,SAAU,SAAS7J,GACf,GAAIA,IAAQmD,EACR,OAAO5J,KAAK6b,UAGhB7b,KAAK6b,UAAYnN,GAAkBjI,GAEnCzG,KAAKwa,QAGT4B,YAAa,SAASlc,GAGlB,OAFAA,EAAUoK,EAAWgR,GAAGc,YAAYja,KAAKnC,KAAME,IAKnDuc,OAAQ,SAASvc,GACb,IAAIqc,EAAOvc,KACP2d,EAASxS,EAAO,GAAI,CACpBgP,KAAMoC,EAAKpC,OACXhB,aAAcoD,EAAKpD,eACnBR,OAAQ4D,EAAK5D,UACdzY,GAGH,OAFAF,KAAKoc,YAAYuB,GAEV3d,KAAKwa,UAIhB8F,GAAkBhW,EAAWa,OAAO,CACpC+H,KAAM,SAAShT,GACX,IAEIoQ,EAFAuK,IAAS3a,GAAW,IAAI6a,QAAU,IAAIF,KACtC1B,EAAe,UAGf4B,EAAS,CACTX,KAAMlP,EACN8P,MAAO9P,EACP+P,SAAU/P,EACVoF,SAAUpF,EACViI,WAAYjI,EACZgQ,YAAahQ,EACbiQ,OAAQjQ,EACRyE,QAASzE,GAGT2P,IACAE,EAASpR,EAAEwB,OAAO4P,EAAQ/a,KAAKqb,YAAYR,IAC3C7a,KAAKugB,YAAc,IAAItN,GAAiB4H,IAG5CvQ,EAAWgR,GAAGpI,KAAK/Q,KAAKnC,KAAMmL,GAAO,EAAM,GAAI,CAC3C4P,OAAQA,GACT7a,IAEHF,KAAKsa,UAAY,IAAID,GAAera,KAAKE,QAAQoa,WAAa,GAAIta,KAAKsa,WAEvEta,KAAK0b,SAAW1M,GAAiBhP,KAAKE,QAAQsX,SAC9CxX,KAAK2b,MAAQ3M,GAAiBhP,KAAKE,QAAQsF,MAE3C8K,EAAWtQ,KAAKE,QAAQoQ,UAAY,GAEJ,oBAA5BrF,EAAS9I,KAAKmO,KACd6I,EAAe7I,EAASD,MAAQ,UAChCC,EAAWA,EAASxJ,QAAU,IAGlC9G,KAAK6b,UAAYnN,GAAkB4B,GACnCtQ,KAAK4b,cAAgBzC,EAErBnZ,KAAKwgB,eAAiB,EACtBxgB,KAAKygB,MAAQ,IAGjBpF,YAAa,SAASR,GAClB,MAAO,CACH1H,WAAY,WACR,IAAInD,EAAS,GACTmD,EAAa0H,EAAK1H,WAEtB,IAAK,IAAI3Q,KAAO2Q,EACZnD,EAAO7I,KAAK,CACR8G,KAAMzL,EACNwL,QAASmF,EAAW3Q,GAAKwL,SAAWxL,EACpCkQ,WAAYlQ,EACZ0a,iBAAkB1a,EAClBuM,KAAM,IAad,OATI8L,EAAKvK,UACLN,EAAO7I,KAAK,CACR8G,KAAMzB,EACNwB,QAASxB,EACTkG,WAAYlG,EACZuC,KAAM,IAIPiB,GAEXkL,YAAa,WACT,MAAO,IAEX5K,SAAU,WACN,IAAIN,EAAS,GACTM,EAAWuK,EAAKvK,SAEpB,IAAK,IAAI9N,KAAO8N,EACZN,EAAO7I,KAAK,CACR8G,KAAMzL,EACNwL,QAASxL,EACTkQ,WAAYlQ,EACZ8U,WAAY9U,IAIpB,OAAOwN,GAEXL,QAAS,SAASkP,EAAUQ,GACxB,IAKIjO,EACA/C,EANAJ,EAAOoR,EAAa9B,iBAAmB8B,EAAaqB,iBACpDC,EAAa3gB,KAAKE,QAAQ6a,OAAO3Q,KACjCwW,EAAavV,EAAWsV,GAAcA,EAAa9W,EAAMuH,OAAOuP,GAAY,GAC5EvW,EAAQpK,KAAKE,QAAQkK,MAAQwW,EAAW5gB,KAAKE,QAAQkK,OAAUpK,KAAK6gB,UAAY,GAChF7Q,EAAS,GAGTP,EAAM,EACN6N,EAAW,GAMf,GAJIrP,IACAA,EAAOA,EAAK8D,MAAM,KAAK,KAGtBsN,EAAayB,OAWd,OAVA9Q,EAAO7I,KAAK,CACR6G,QAAS6M,EAAK1H,WAAWlF,GAAMD,SAAWC,EAC1CuP,oBAAqB,IACrBoC,oBAAqB3R,EACrB8R,oBAAqB9R,EACrBsP,gBAAiBtP,EACjBA,KAAMA,EACNyE,WAAYzE,IAGT+B,EAKX,IAFAoB,EAASvH,EAAMuH,OAAOjC,GAAclB,IAAO,GAEpCwB,EAAMrF,EAAK/I,OAAQoO,MACtBpB,EAAQ+C,EAAOhH,EAAKqF,MACI,IAAVpB,GAAiBiP,EAASjP,KACpCiP,EAASjP,IAAS,EAElB2B,EAAO7I,KAAK,CACR6G,QAASK,EACTmP,oBAAqB,IACrBoC,oBAAqB3R,EACrB8R,oBAAqB9R,EACrBsP,gBAAiBtP,EACjBA,KAAMI,EACNqE,WAAYrE,KAKxB,OAAO2B,GACTyC,KAAKzS,QAIfE,QAAS,CACL4b,eAAe,EACfC,cAAc,EACdC,iBAAiB,EACjBC,gBAAgB,EAChBC,kBAAkB,GAGtBvB,QAAS,SAASlU,GACd,GAAIA,IAAQmD,EACR,OAAO5J,KAAKsa,UAAUK,UAG1B3a,KAAKsa,UAAUK,QAAQlU,GACvBzG,KAAKoc,YAAY,IACjBpc,KAAKygB,MAAQ,GACbzgB,KAAKoK,KAAK,KAGdyQ,KAAM,SAASpU,GACX,GAAIA,IAAQmD,EACR,OAAO5J,KAAKsa,UAAUO,OAG1B7a,KAAKsa,UAAUO,KAAKpU,GACpBzG,KAAKygB,MAAQ,GACbzgB,KAAKoc,YAAY,IACjBpc,KAAKoK,KAAK,KAGdgQ,KAAM,WACF,OAAOpa,KAAKygB,OAGhBjJ,QAAS,SAAS/Q,GACd,GAAIA,IAAQmD,EACR,OAAO5J,KAAK0b,SAGhB1b,KAAKwgB,gBAAkB,EACvBxgB,KAAK+gB,gBAAiB,EAEtB/gB,KAAK0b,SAAW1M,GAAiBvI,GACjCzG,KAAKghB,MAAM,CACPxJ,QAAS/Q,EACTjB,KAAMxF,KAAKihB,sBACX3Q,SAAUtQ,KAAKsQ,WACf6J,KAAMna,KAAKma,OACXxB,OAAQ3Y,KAAK2Y,YAIrBnT,KAAM,SAASiB,GACX,GAAIA,IAAQmD,EACR,OAAO5J,KAAK2b,MAGhB3b,KAAKwgB,gBAAkB,EACvBxgB,KAAK+gB,gBAAiB,EAEtB/gB,KAAK2b,MAAQ3M,GAAiBvI,GAE9BzG,KAAKghB,MAAM,CACPxJ,QAASxX,KAAKkhB,yBACd1b,KAAMiB,EACN6J,SAAUtQ,KAAKsQ,WACf6J,KAAMna,KAAKma,OACXxB,OAAQ3Y,KAAK2Y,YAIrBrI,SAAU,SAAS7J,GACf,GAAIA,IAAQmD,EACR,OAAO5J,KAAK6b,UAGhB7b,KAAKwgB,gBAAkB,EACvBxgB,KAAK+gB,gBAAiB,EAEtB/gB,KAAKghB,MAAM,CACPxJ,QAASxX,KAAKkhB,yBACd1b,KAAMxF,KAAKihB,sBACX3Q,SAAU5B,GAAkBjI,GAC5B0T,KAAMna,KAAKma,OACXxB,OAAQ3Y,KAAK2Y,YAIrBQ,aAAc,WACV,OAAOnZ,KAAK4b,eAAiB,WAGjCuF,YAAa,SAASxJ,EAAMtH,GACxB,IAAI+Q,EAAkB,YAAT/Q,EAAqB,UAAY,OAC1CgR,EAAiB,YAAThR,EAAqB,OAAS,UAEtCV,EAAUX,GAAiB2I,GAC3B2J,EAAiB3Q,GAAQhB,EAAQA,EAAQtO,OAAS,IAEtDrB,KAAKuhB,cAAgBH,EAErBzR,EAAUS,GAAsBpQ,KAAKoa,OAAOgH,GAASzR,EAAS3P,KAAKsQ,YAEnE,IAAK,IAAIb,EAAM,EAAGA,EAAME,EAAQtO,OAAQoO,IAAO,CAG3C,GAFiBkB,GAAQhB,EAAQF,MAEd6R,EAAgB,CAC/B,GAAI3R,EAAQF,GAAKR,OACb,OAEJU,EAAQF,GAAKR,QAAS,OAEtBU,EAAQF,GAAKR,QAAS,EAI9B,IAAIJ,EAAc,GAClBA,EAAYuS,GAAUzR,EACtBd,EAAYwS,GAASrhB,KAAKwhB,oBAAoBH,GAE9CrhB,KAAKyc,OAAO5N,IAGhB2S,oBAAqB,SAASnR,GAC1B,IAAI+J,EAAOpa,KAAKoa,OACZvL,EAAc7O,KAAKqQ,MAAW,GAKlC,OAHI+J,GAAQA,EAAK/J,IAAS+J,EAAK/J,GAAMN,QAAUqK,EAAK/J,GAAMN,OAAO,KAC7DlB,EAAciB,GAAmBsK,EAAK/J,GAAMN,QAAU,KAEnDlB,GAGXqS,uBAAwB,WACpB,OAAOlhB,KAAKwhB,oBAAoB,YAGpCP,oBAAqB,WACjB,OAAOjhB,KAAKwhB,oBAAoB,SAGpCC,SAAU,SAASrX,EAAMsX,GACrB1hB,KAAKqgB,MAAQjW,GAEbsX,EAAIA,GAAK,IACP9K,MAAQ8K,EAAE9K,OAAS5W,KAAKqgB,MAE1BrgB,KAAK0d,QAAQrR,EAAQqV,IAGzBjF,OAAQ,SAASvc,GACb,IAAIqc,EAAOvc,KAOX,OALKE,IACDF,KAAKwgB,gBAAkB,EACvBxgB,KAAK+gB,gBAAiB,GAGnBxE,EAAKyE,MAAM7V,EAAO,GAAI,CACzBwW,KAAMpF,EAAKoF,OACXC,SAAUrF,EAAKqF,WACfzH,KAAMoC,EAAKpC,OACXxB,OAAQ4D,EAAK5D,SACbkJ,MAAOtF,EAAKsF,QACZrQ,UAAW+K,EAAK/K,YAChBgG,QAASxX,KAAKkhB,yBACd1b,KAAMxF,KAAKihB,sBACX3Q,SAAUtQ,KAAKsQ,YAChBpQ,KAGP8gB,MAAO,SAAS9gB,GACZ,IAAIqR,EAAQvR,KAAKoc,YAAYlc,GAE7B,OAAIF,KAAKwc,MAAMnb,QAAUrB,KAAKugB,aAC1BvgB,KAAK4d,QAAQrM,GACbvR,KAAK8hB,iBAAiB9hB,KAAKqd,eAEpB1T,EAAEmU,WAAWa,UAAUM,WAG3Bjf,KAAKwa,KAAKjJ,IAGrB6K,YAAa,SAASlc,GAkBlB,OAjBAA,EAAUoK,EAAWgR,GAAGc,YAAYja,KAAKnC,KAAME,MAE/B0J,IACZ5J,KAAK6b,UAAYnN,GAAkBxO,EAAQoQ,UAEvCpQ,EAAQsX,QACRtX,EAAQsX,QAAUxI,GAAiB9O,EAAQsX,SACnCtX,EAAQsX,UAChBxX,KAAK0b,SAAW,IAGhBxb,EAAQsF,KACRtF,EAAQsF,KAAOwJ,GAAiB9O,EAAQsF,MAChCtF,EAAQsF,OAChBxF,KAAK2b,MAAQ,KAGdzb,GAGXyY,OAAQ,SAASlS,GACb,GAAIA,IAAQmD,EACR,OAAO5J,KAAK0Y,QAGhB1Y,KAAKwgB,gBAAkB,EACvBxgB,KAAK+gB,gBAAiB,EACtB/gB,KAAKyc,OAAO,CAAE9D,OAAQlS,EAAKkb,KAAM,KAGrCI,aAAc,SAASpK,GACnB3X,KAAKmhB,YAAYxJ,EAAM,YAG3BqK,UAAW,SAASrK,GAChB3X,KAAKmhB,YAAYxJ,EAAM,SAG3B+C,QAAS,SAAStQ,GACd,IAAI2T,EACA/d,KAAKugB,cACLxC,GAAgB/d,KAAKge,OAAO5T,KAAKA,IAAS,IAAI8E,MAAM,IAExD5E,EAAWgR,GAAGZ,QAAQvY,KAAKnC,KAAMoK,GAC7B2T,IACA/d,KAAKqd,cAAgBU,IAI7BkE,eAAgB,SAAS7X,EAAMgQ,GAC3B,GAAIpa,KAAKugB,YAAa,CAClB,IAAI2B,EAAgBliB,KAAKugB,YAAYtH,QAAQ7O,EAAMpK,KAAKmiB,cAExD/X,EAAO8X,EAAc9X,KACrBgQ,EAAO8H,EAAc9H,KAGzB,IAAIgI,EAAeC,EACftS,EAAQuS,EAAYhS,EAAUiS,EAC9BnJ,EAAoBpZ,KAAKwX,UACzB6B,EAAiBrZ,KAAKwF,OACtBgd,EAAkBpI,EAAK5C,SAAW4C,EAAK5C,QAAQzH,OAE9CqJ,EAAkB/X,SAAUgY,EAAehY,SAAUmhB,IAAoBxiB,KAAKyiB,eAAephB,QAAWrB,KAAKsQ,WAAWjP,SACzH+Y,EAAO,CACH5C,QAAS,GACThS,KAAM4U,EAAK5C,UAId4B,EAAkB/X,QAAWgY,EAAehY,QAAkC,SAAxBrB,KAAKmZ,iBAA6BqJ,IACzFpI,EAAO,CACH5C,QAAS,GACThS,KAAM4U,EAAK5C,UAInBxX,KAAKygB,MAAQ,CACTjJ,QAAS2E,GAAcnc,KAAKygB,MAAMjJ,SAClChS,KAAM2W,GAAcnc,KAAKygB,MAAMjb,OAGnC4U,EAAO,CACH5C,QAAS2E,GAAc/B,EAAK5C,SAC5BhS,KAAM2W,GAAc/B,EAAK5U,OAG7B4c,EAAgBpiB,KAAK0iB,iBAAiBtI,EAAK5C,QAAQzH,OAAQ/P,KAAKygB,MAAMjJ,QAAQzH,OAAQqJ,EAAmBpZ,KAAK2iB,mBAC9GN,EAAariB,KAAK0iB,iBAAiBtI,EAAK5U,KAAKuK,OAAQ/P,KAAKygB,MAAMjb,KAAKuK,OAAQsJ,EAAgBrZ,KAAKyiB,gBAE9FziB,KAAKwgB,eAAiB,IACtBxgB,KAAKwgB,gBAAkB,GAGtBxgB,KAAKugB,cACNnW,EAAOpK,KAAK4iB,eAAe,CACvBC,cAAezI,EAAK5C,QAAQzH,OAAO1O,OACnCyhB,WAAY1I,EAAK5U,KAAKuK,OAAO1O,OAC7B+gB,cAAeA,EACfC,WAAYA,EACZjY,KAAMA,KAIY,QAAtBpK,KAAKuhB,eACLxR,EAASqK,EAAK5C,QAAQzH,OACtBO,EAAWtQ,KAAK2iB,mBAChBL,EAAaS,GAAa3I,EAAK5C,QAASxX,KAAKygB,MAAMjJ,QAASlH,MAGxDiS,EAAa,UACbnI,EAAK5C,QAAU8K,EAkpB/B,SAA4BU,EAAcC,EAAcH,EAAYxS,EAAUlG,GAC1E,IAAI8Y,EAAW3J,EAAQ4J,EACnBN,EAAgBG,EAAa3hB,OAC7B+hB,EAAsBC,GAAaJ,EAAc3S,GACjDgT,EAAiBhT,EAASjP,QAAU,EAExC,IAAKkY,EAAS,EAAGA,EAASuJ,EAAYvJ,IAClC,IAAK2J,EAAY,EAAGA,EAAYL,EAAeK,IAC3CC,EAAUI,GAAWP,EAAaE,GAAYD,GAAgBK,EAC9DH,GAAWD,EAAYI,EAEvBlZ,EAAKmP,EAASsJ,EAAgBK,GAAWnM,QAAUwC,EAAS6J,EAAsBD,EA5pB9EK,CAAmBzT,EAAQuS,EAAWvS,OAAQqK,EAAK5U,KAAKuK,OAAO1O,OAAQiP,EAAUlG,GAC5EpK,KAAKugB,cACNnW,EAAOpK,KAAK4iB,eAAe,CACvBC,cAAeQ,GAAajJ,EAAK5C,QAAQzH,OAAQO,GACjDwS,WAAY1I,EAAK5U,KAAKuK,OAAO1O,OAC7B+I,KAAMA,OAIW,WAAtBpK,KAAKuhB,gBACZxR,EAASqK,EAAK5U,KAAKuK,OACnBO,EAAWtQ,KAAKyiB,gBAChBH,EAAaS,GAAa3I,EAAK5U,KAAMxF,KAAKygB,MAAMjb,KAAM8K,MAGlDiS,EAAa,OACbnI,EAAK5U,KAAO8c,EAipB5B,SAAyBU,EAAcC,EAAcJ,EAAevS,EAAUlG,GAC1E,IAAI8Y,EAAW3J,EAAQ4J,EACnBL,EAAaE,EAAa3hB,OAC1BiiB,EAAiBhT,EAASjP,QAAU,EAExC,IAAKkY,EAAS,EAAGA,EAASuJ,EAAYvJ,IAKlC,IAJA4J,EAAUI,GAAWP,EAAazJ,GAAS0J,GAC3CE,GAAWG,EACXH,GAAW5J,EAAS+J,EAEfJ,EAAY,EAAGA,EAAYL,EAAeK,IAC3C9Y,EAAKmP,EAASsJ,EAAgBK,GAAWnM,QAAUoM,EAAUN,EAAgBK,EA3pBzEO,CAAgB1T,EAAQuS,EAAWvS,OAAQqK,EAAK5C,QAAQzH,OAAO1O,OAAQiP,EAAUlG,GAE5EpK,KAAKugB,cACNnW,EAAOpK,KAAK4iB,eAAe,CACvBC,cAAeQ,GAAajJ,EAAK5U,KAAKuK,OAAQO,GAC9CwS,WAAY1I,EAAK5C,QAAQzH,OAAO1O,OAChC+I,KAAMA,OAMtBpK,KAAKuhB,cAAgB,KAErB,IAAIvR,EAAShQ,KAAK0jB,WAAWtJ,EAAMhQ,EAAMmY,GAGzC,OAFAviB,KAAKygB,MAAQzQ,EAAOoK,KAEbpK,EAAO5F,MAGlBuZ,UAAW,SAASvZ,GAChB,IAAIgQ,EAAOpa,KAAKge,OAAO5D,KAAKhQ,GACxBwZ,EAAU5jB,KAAKge,OAAO5T,KAAKA,GAM/B,OAJIpK,KAAKugB,cACLvgB,KAAK6gB,SAAW+C,GAGb5jB,KAAKiiB,eAAe2B,EAASxJ,IAGxCyJ,aAAc,SAAStU,EAAOZ,EAASmV,GACnC,IAGI/P,EAAWC,EACX/F,EAAMiG,EACND,EACArD,EACA5C,EACAD,EARA4B,EAAUJ,EAAMI,QAChBtO,EAASsO,EAAQtO,OACjBjB,EAAO,CAAEuP,QAAS,IAOlBF,EAAM,EAMV,IAJId,IACAtN,GAAU,GAGPoO,EAAMpO,EAAQoO,IACjB1B,EAAS4B,EAAQF,GACjBuE,EAAW+P,OAAOhW,EAAOiG,UAEzB/F,EAAOF,EAAOE,KACdiG,EAAanG,EAAOmG,WACpBlG,EAAUD,EAAOC,SAAWC,EAC5BgG,EAAclG,EAAOkG,YACrBrD,EAAY7C,EAAO6C,UACnBmD,EAAYhG,EAAOgG,UAEf+P,IACA9V,EAAU,MACO,IAAbgG,EACAE,EAAanG,EAAOE,KAEpB+F,GAAY,EAGhBC,GAAc,EACdhG,EAAO2C,EAAYmD,EAAYG,GAGnC9T,EAAKuP,QAAQxI,KAAK,CACd8G,KAAMA,EACNyB,SAAU,GACV1B,QAASA,EACT+F,UAAWA,EACXC,SAAUA,EAAS/I,WACnBgJ,YAAaA,EACbrD,UAAWA,EACXsD,WAAa4P,EAAyB,GAAb5P,IAWjC,OAPIvF,GACAvO,EAAKuP,QAAQxI,KAAK,CACd8G,KAAMU,EAAQV,KACdyB,SAAU,KAIXtP,GAGX4jB,SAAU,SAAShiB,EAAQiiB,EAAQpV,GAC/B,GAAIoV,EAAO5iB,OACP,OAAO0P,GAAkBkT,EAAQjiB,GAAQuN,MAU7C,IAPA,IACIxB,EACAa,EAGAoF,EALArE,EAAU3N,EAAO2N,QAIjBuU,GAAS,EAGJzU,EAAM,EAAGpO,EAASsO,EAAQtO,OAAQoO,EAAMpO,EAAQoO,IAKrD,GAJA1B,EAAS4B,EAAQF,GACjBuE,EAAW+P,OAAOhW,EAAOiG,WAAa,EACtCpF,EAAaC,EAAYY,KAEN,IAAbuE,GAAmBpF,GAAcb,EAAOE,OAAS0C,GAAQ/B,IAAe,CAC1EsV,GAAS,EACT,MAIR,OAAOA,GAGXR,WAAY,SAASS,EAAY/Z,EAAMmY,GACnC,IAGI6B,EAAYrU,EAHZsU,EAAiBrkB,KAAK2iB,kBACtB2B,EAActkB,KAAKyiB,eACnBrI,EAAOpa,KAAKoa,OAGZmK,EAAgBlB,GAAajJ,EAAK5U,KAAKuK,OAAQuU,GAC/CE,EAAgBL,EAAW3e,KAAKuK,OAAO1O,OAEvCojB,EAAmBpB,GAAajJ,EAAK5C,QAAQzH,OAAQsU,GACrDK,EAAmBP,EAAW3M,QAAQzH,OAAO1O,OAE/B,WAAdkhB,GACAmC,EAAmBD,EACnB1U,EAASoU,EAAW3M,QAAQzH,QAG5B3F,EAi2BZ,SAA8B2F,EAAQ3F,GAClC,IAAK2F,IAAWA,EAAO1O,OACnB,OAAO+I,EAGX,IAIIwN,EAAa+M,EAAUC,EAAWC,EAJlC7U,EAAS,GACT8U,EAAUC,GAAiBhV,GAC3B8S,EAAgBiC,EAAQzjB,OACxByhB,EAAakC,KAAKjS,IAAI3I,EAAK/I,OAASwhB,EAAe,GAGvD,IAAK8B,EAAW,EAAGA,EAAW7B,EAAY6B,IAEtC,IADAC,EAAY/B,EAAgB8B,EACvB/M,EAAc,EAAGA,EAAciL,EAAejL,IAC/CiN,EAAYC,EAAQlN,GAAegN,EACnC5U,EAAO4U,EAAYhN,GAAexN,EAAKya,IAAc,CAAExW,MAAO,GAAIG,SAAU,GAAIuI,QAAS8N,GAIjG,OAAO7U,EAp3BQiV,CADPlV,EAASmV,GAAYf,EAAW3M,QAAQzH,OAAQsU,GACZja,GAGxC,IAAI+a,EAAgBC,GAAYhL,EAAK5C,QAAQzH,OAAQA,EAAQsU,GAE3C,QAAd9B,GACAiC,EAAgBnB,GAAac,EAAW3e,KAAKuK,OAAQuU,GACrDvU,EAASoU,EAAW3e,KAAKuK,QAGzB3F,EA+zBZ,SAA2B2F,EAAQ3F,GAC/B,IAAK2F,IAAWA,EAAO1O,OACnB,OAAO+I,EAGX,IAIIua,EAAU/M,EAAayN,EAAaC,EACpCT,EALA7U,EAAS,GACT8U,EAAUC,GAAiBhV,GAC3B+S,EAAagC,EAAQzjB,OACrBwhB,EAAgBmC,KAAKjS,IAAI3I,EAAK/I,OAASyhB,EAAY,GAIvD,IAAK6B,EAAW,EAAGA,EAAW7B,EAAY6B,IAGtC,IAFAU,EAAcxC,EAAgB8B,EAC9BW,EAAczC,EAAgBiC,EAAQH,GACjC/M,EAAc,EAAGA,EAAciL,EAAejL,IAC/CiN,EAAYU,SAASD,EAAc1N,EAAa,IAChD5H,EAAOuV,SAASF,EAAczN,EAAa,KAAOxN,EAAKya,IAAc,CAAExW,MAAO,GAAIG,SAAU,GAAIuI,QAAS8N,GAIjH,OAAO7U,EAp1BQwV,CADPzV,EAASmV,GAAYf,EAAW3e,KAAKuK,OAAQuU,GACZla,GAErC,IAAIqb,EAAaL,GAAYhL,EAAK5U,KAAKuK,OAAQA,EAAQuU,GAKvD,GAHAlK,EAAK5C,QAAQzH,OAASoV,EAAcpV,OACpCqK,EAAK5U,KAAKuK,OAAS0V,EAAW1V,OAE1B0U,IAAqBpB,GAAajJ,EAAK5C,QAAQzH,OAAQsU,GAAiB,CAExED,EAAae,EAAcjhB,MAAQwhB,GAAcP,EAAcQ,WAAYR,EAAcS,YAAavB,GACtG,IAAIwB,EAASpB,EAAmBC,EAChCta,EAAOpK,KAAK8lB,iBAAiB1b,EAAMga,EAAYI,EAAeE,EAAkBmB,QACzEtB,IAAkBlB,GAAajJ,EAAK5U,KAAKuK,OAAQuU,KAExDF,EAAaqB,EAAWvhB,MAAQwhB,GAAcD,EAAWE,WAAYF,EAAWG,YAAatB,GAC7Fla,EAAOpK,KAAK+lB,cAAc3b,EAAMga,EAAYI,EAAeE,IAO/D,OAJmC,IAA/BtK,EAAK5C,QAAQzH,OAAO1O,QAA4C,IAA5B+Y,EAAK5U,KAAKuK,OAAO1O,SACrD+I,EAAO,IAGJ,CACHgQ,KAAMA,EACNhQ,KAAMA,IAId0b,iBAAkB,SAASlC,EAAShM,EAAakL,EAAYD,EAAegD,GACxE,IACIlB,EAAUzgB,EAAiB8hB,EAD3B5b,EAAOpK,KAAKoK,OAAO6b,SACFC,EAAO,EACxB7B,EAAiBW,KAAKjS,IAAI/S,KAAK2iB,kBAAkBthB,OAAQ,GAU7D,IARAyhB,EAAakC,KAAKjS,IAAI+P,EAAY,GAE9B1Y,EAAK/I,OAAS,IAEd6kB,EAAO7B,EACPwB,GAAUxB,GAGTM,EAAW,EAAGA,EAAW7B,EAAY6B,IACtCzgB,EAAQ0T,EAAe+M,EAAWkB,GAClCG,EAAQpC,EAAQuC,OAAO,EAAGtD,IACpBsD,OAAO,EAAGD,GAChB,GAAGC,OAAO7c,MAAMc,EAAM,CAAClG,EAAO,GAAGkD,OAAO4e,IAG5C,OAAO5b,GAGX2b,cAAe,SAASnC,EAASe,EAAU7B,EAAYD,GACnD,IACIpT,EAAKmV,EAAWoB,EADhB5b,EAAOpK,KAAKoK,OAAO6b,SAEnB3B,EAAcU,KAAKjS,IAAI/S,KAAKyiB,eAAephB,OAAQ,GASvD,IAPAwhB,EAAgBmC,KAAKjS,IAAI8P,EAAe,GACpCzY,EAAK/I,OAAS,IAEdyhB,GAAcwB,EACdV,EAAQuC,OAAO,EAAGtD,EAAgByB,IAGjC7U,EAAM,EAAGA,EAAMqT,EAAYrT,IAC5BuW,EAAQpC,EAAQuC,OAAO,EAAGtD,GAC1B+B,EAAaD,EAAW9B,EAAkBpT,EAAMoT,EAChD,GAAGsD,OAAO7c,MAAMc,EAAM,CAACwa,EAAW,GAAGxd,OAAO4e,IAGhD,OAAO5b,GAGXuY,gBAAiB,WACb,IAAIrS,EAAWtQ,KAAKsQ,WAChB+T,EAAiB,GAUrB,MAR4B,YAAxBrkB,KAAKmZ,iBACyB,IAA1BnZ,KAAKwX,UAAUnW,QAERiP,EAASjP,OAAS,KADzBgjB,EAAiB/T,GAMlB+T,GAGX5B,aAAc,WACV,IAAInS,EAAWtQ,KAAKsQ,WAChBgU,EAAc,GAUlB,MAR4B,SAAxBtkB,KAAKmZ,iBACsB,IAAvBnZ,KAAKwF,OAAOnE,QAELiP,EAASjP,OAAS,KADzBijB,EAAchU,GAMfgU,GAGXxC,iBAAkB,SAAS1X,EAAMmH,GACzBvR,KAAKugB,cACDhP,IACAvR,KAAKmiB,aAAe5Q,GAExBnH,EAAOpK,KAAKiiB,eAAe7X,IAG/BpK,KAAKwc,MAAQxc,KAAKomB,SAAShc,GAE3BpK,KAAKqmB,QAAU,GACfrmB,KAAKsmB,UAAUtmB,KAAKwc,OAEpBxc,KAAKumB,OAASvmB,KAAKwc,MAAMnb,OACzBrB,KAAKwmB,eAAiBxmB,KAAKumB,OAC3BvmB,KAAKyhB,SAASzhB,KAAKwc,QAGvBpS,KAAM,SAASiE,GAEX,GAAIA,IAAUzE,EAQV,OATO5J,KASKwc,MAPZxc,KAAKqd,cAAgBhP,EAAMa,MAAM,GACjClP,KAAK8hB,iBAAiBzT,EAAO,CACrBmJ,QAASxX,KAAKwX,UACdhS,KAAMxF,KAAKwF,OACX8K,SAAUtQ,KAAKsQ,cAO/BoS,iBAAkB,SAAS3S,EAAQkU,EAAQpV,EAAayB,GACpD,IAMIf,EAAOkX,EAAW9lB,EANlBU,EAASiP,EAASjP,QAAU,EAC5BoO,EAAM,EAENiX,EAAQ,GACRC,EAAU,GACV9S,EAAa,EAGjB,GAAK9D,EAAO1O,OAAZ,CAIA,GAAIrB,KAAKwgB,gBAAkB,IAAMxgB,KAAKgkB,SAASjU,EAAO,GAAIkU,EAAQpV,GAAc,CAE5E,IADA7O,KAAKwgB,eAAiB,EACf/Q,EAAMpO,EAAQoO,IACjBiX,EAAMvf,KAAKnH,KAAK6jB,aAAa9T,EAAO,GAAIO,EAASb,IAAM,IACvDkX,EAAQlX,GAAOA,EAGnBM,EAAOoW,OAAO7c,MAAMyG,EAAQ,CAAC,EAAGA,EAAO1O,QAAQ+F,OAAOsf,GAAOtf,OAAO2I,IACpEN,EAAMpO,EAGV,GAAIiP,EAASjP,OAIT,IAHAV,EAAO4O,EAAQQ,EAAON,GACtBgX,EAAYlX,EAAMI,QAAQtO,OAAS,EAE5BkO,GAAO,CAcV,GAbIsE,GAAcxS,IACdwS,EAAa,GAGbtE,EAAMI,QAAQ8W,GAAWxY,OAASqC,EAASuD,GAAY5F,OACvD8B,EAAOoW,OAAO1W,EAAK,EAAGzP,KAAK6jB,aAAatU,EAAOe,EAASuD,KACxD8S,EAAQlX,GAAOA,GAInBoE,GAAc,EACdtE,EAAQQ,EAFRN,GAAO,GAIHpO,EAASwS,KAAgBtE,GAASqX,GAAUjmB,EAAM8lB,EAAY,KAAOG,GAAUrX,EAAOkX,EAAY,IAAK,CACvG,KAAO5S,EAAaxS,EAAQwS,IACxB9D,EAAOoW,OAAO1W,EAAK,EAAGzP,KAAK6jB,aAAaljB,EAAM2P,EAASuD,KACvD8S,EAAQlX,GAAOA,EACfA,GAAO,EAEXF,EAAQQ,EAAON,GAEnB9O,EAAO4O,EAIf,OAAOoX,IAGXE,qBAAsB,SAAS7W,EAAQ8W,GACnC,KAAOA,EAASzE,WAAWkD,SAASvV,EAAO3O,OAASylB,EAASjE,cAAe,OAASjZ,GACjF,IAAK,IAAI6F,EAAM,EAAGA,EAAMqX,EAASjE,cAAepT,IAC5CO,EAAS+W,GAAiB/W,GAIlC,KAAO8W,EAAS1E,cAAcpS,EAAO3O,OAASylB,EAASjE,iBAAmBjZ,GACtEoG,EAAS+W,GAAiB/W,GAG9B,OAAOA,GAGXgX,mBAAoB,SAAShX,EAAQ5B,EAAU0Y,GAC3C,IAAIG,EAAcH,EAASG,YAE3B,IAAK7Y,EACD,OAAO2Y,GAAiB/W,GAG5B,GAAK5B,EAAS2I,QAAUkQ,EAAe,EAGnC,IAFAA,GAAe,EAERA,EAAc7Y,EAAS2I,SAAW/G,EAAO3O,OAASylB,EAASzlB,QAC9D2O,EAAShQ,KAAK6mB,qBAAqBE,GAAiB/W,GAAS8W,GAC7DG,GAAe,EAOvB,OAHA7Y,EAAS2I,QAAU/G,EAAO3O,OAC1B2O,EAAOA,EAAO3O,QAAU+M,EAEjB4B,GAGX4S,eAAgB,SAAS1iB,GACrB,IAEIkO,EAEA6Y,EACA5lB,EALA+I,EAAOlK,EAAQkK,KACf+Y,EAAU,EAEVnT,EAAS,GAYb,GARA9P,EAAQ+mB,YAAc,EACtB/mB,EAAQkiB,cAAgBliB,EAAQkiB,eAAiB,GACjDliB,EAAQmiB,WAAaniB,EAAQmiB,YAAc,GAC3CniB,EAAQ2iB,cAAgB3iB,EAAQ2iB,eAAiB,EACjD3iB,EAAQ4iB,WAAa5iB,EAAQ4iB,YAAc,EAC3C5iB,EAAQmB,OAASnB,EAAQ2iB,cAAgB3iB,EAAQ4iB,WACjDzhB,EAASnB,EAAQmB,OAEb+I,EAAK/I,SAAWA,EAChB,OAAO+I,EAGX,KAAO4F,EAAO3O,OAASA,IACnB+M,EAAWhE,EAAK+Y,QAEZ8D,EAAc7Y,EAAS2I,SAG3B/G,EAAShQ,KAAKgnB,mBAAmBhnB,KAAK6mB,qBAAqB7W,EAAQ9P,GAAUkO,EAAUlO,GAEvFA,EAAQ+mB,YAAcA,EAG1B,OAAOjX,GAGXuK,SAAU,SAASra,EAASgnB,GACxB,IAAI3K,EAAOvc,KACPsa,EAAYiC,EAAKjC,UAErB,OAAO3Q,EAAEmU,UAAS,SAASD,GACvBvD,EAAUC,SAASpP,EAAO,CACtBuP,QAAS,SAASmE,GACfA,EAAWtC,EAAKyB,OAAO7N,MAAM0O,GAExBtC,EAAK4K,oBAAoBtI,KAIzBqI,IACArI,EAAWqI,EAAUrI,IAEzBhB,EAASc,QAAQE,KAErBE,MAAO,SAASF,EAAUuI,EAAQrI,GAC9BlB,EAASwJ,OAAOxI,GAChBtC,EAAKwC,MAAMF,EAAUuI,EAAQrI,KAElC7e,OACJ+e,UAAUvC,MAAK,WACdH,EAAKmB,QAAQ,oBAIrByB,eAAgB,WACZ,IAAI5C,EAAOvc,KAEX,OAAOuc,EAAKhC,SAAS,CACjBnQ,KAAM,CACFgV,QAAS,iBACTC,aAAc,CACVC,YAAa/C,EAAKjC,UAAUK,UAC5B4E,SAAUhD,EAAKjC,UAAUO,WAGlC,SAASgE,GACR,OAAOtC,EAAKyB,OAAO1N,SAASuO,OAIpCW,WAAY,WACR,IAAIjD,EAAOvc,KAEX,OAAOuc,EAAKhC,SAAS,CACjBnQ,KAAM,CACFgV,QAAS,aACTC,aAAc,CACVC,YAAa/C,EAAKjC,UAAUK,UAC5B4E,SAAUhD,EAAKjC,UAAUO,WAGlC,SAASgE,GACR,OAAOtC,EAAKyB,OAAOsJ,KAAKzI,OAIhCY,iBAAkB,WACd,IAAIlD,EAAOvc,KAEX,OAAOuc,EAAKhC,SAAS,CACjBnQ,KAAM,CACFgV,QAAS,mBACTC,aAAc,CACVC,YAAa/C,EAAKjC,UAAUK,UAC5B4E,SAAUhD,EAAKjC,UAAUO,WAGlC,SAASgE,GACR,OAAOtC,EAAKyB,OAAO7K,WAAW0L,OAItCa,kBAAmB,SAASC,GACxB,IAAIpD,EAAOvc,KAEX,OAAOuc,EAAKhC,SAAS,CACjBnQ,KAAM,CACFgV,QAAS,oBACTC,aAAc,CACVC,YAAa/C,EAAKjC,UAAUK,UAC5B4E,SAAUhD,EAAKjC,UAAUO,OACzB+E,oBAAqBD,MAG9B,SAASd,GACR,OAAOtC,EAAKyB,OAAO9C,YAAY2D,OAIvCgB,aAAc,SAASC,GACnB,IAAIvD,EAAOvc,KAEX,OAAOuc,EAAKhC,SAAS,CACjBnQ,KAAM,CACFgV,QAAS,eACTC,aAAc,CACVC,YAAa/C,EAAKjC,UAAUK,UAC5B4E,SAAUhD,EAAKjC,UAAUO,OACzBkF,oBAAqBD,MAG9B,SAASjB,GACR,OAAOtC,EAAKyB,OAAO7C,OAAO0D,OAIlCmB,YAAa,WACT,IAAIzD,EAAOvc,KAEX,OAAOuc,EAAKhC,SAAS,CACjBnQ,KAAM,CACFgV,QAAS,cACTC,aAAc,CACVC,YAAa/C,EAAKjC,UAAUK,cAGrC,SAASkE,GACR,OAAOtC,EAAKyB,OAAOhD,MAAM6D,OAIjCoB,eAAgB,WACZ,IAAI1D,EAAOvc,KAEX,OAAOuc,EAAKhC,SAAS,CACjBnQ,KAAM,CACFgV,QAAS,oBAEd,SAASP,GACR,OAAOtC,EAAKyB,OAAO/C,SAAS4D,OAIpCqB,cAAe,SAASb,GACpB,IAAI9C,EAAOvc,KACP0a,EAAW,SAAS2E,GACpB,OAAO,SAASR,GACZ,OAAOtC,EAAKyB,OAAOrO,QAAQkP,EAAUQ,IAF/B,CAIZA,GAEF,OAAO9C,EAAKhC,SAAS,CACjBnQ,KAAM,CACFgV,QAAS,gBACTC,aAAclU,EAAO,CAClBmU,YAAa/C,EAAKjC,UAAUK,UAC5B4E,SAAUhD,EAAKjC,UAAUO,QAC1BwE,KAEP3E,IAGPkD,QAAS,SAASxT,GACVpK,KAAK+gB,iBACL/gB,KAAKygB,MAAQ,GACbzgB,KAAKwc,MAAQxc,KAAKomB,SAAS,IAC3BpmB,KAAK+gB,gBAAiB,EACtB/gB,KAAK0d,QAAQjR,IAGjB,IAAIvM,EAAUoK,EAAWgR,GAAGsC,QAAQzb,KAAKnC,KAAMoK,GAa/C,OAXAlK,EAAUiL,EAAO,CACbmF,SAAUtQ,KAAKsQ,WACf6I,aAAcnZ,KAAKmZ,eACnB3B,QAASxX,KAAKwX,UACdhS,KAAMxF,KAAKwF,QACZtF,GAECF,KAAKugB,cACLvgB,KAAKmiB,aAAejiB,GAGjBA,KAIf,SAAS0U,GAAY4C,GAEjB,IADA,IAAIxH,EAAS,GACJP,EAAM,EAAGA,EAAM+H,EAAQnW,OAAQoO,IACpCO,EAAO7I,KAAKqQ,EAAQ/H,IAChB+H,EAAQ/H,GAAKC,WACbM,EAASA,EAAO5I,OAAOwN,GAAY4C,EAAQ/H,GAAKC,YAIxD,OAAOM,EAGX,SAAS2E,GAActD,EAAOuF,EAAO2Q,GACjC,IAAK,IAAIrgB,EAAI,EAAGA,EAAI0P,EAAMvV,OAAQ6F,IAC1B0P,EAAM1P,GAAGwI,UAAYkH,EAAM1P,GAAGwI,SAASrO,QACvCsT,GAActD,EAAOuF,EAAM1P,GAAGwI,SAAU6X,GAG5C3Q,EAAM,GAAG1C,YAAc7C,IAG3BuF,EAAQA,EAAMuD,KAAKoN,IAGvB,SAAS7S,GAAakC,EAAOjR,GACzB,IAAK,IAAIuB,EAAI,EAAGA,EAAI0P,EAAMvV,OAAQ6F,IAAK,CACnC,IAAIsgB,EAAc7hB,EAAIiR,EAAM1P,GAAG+G,MAE/B,IAAKtE,EAAEuL,cAAcsS,EAAY3P,aAAc,CAE3C,IAAK,IAAI5J,KADT2I,EAAM1P,GAAGwI,SAAW,GACH8X,EAAY3P,YACzBjB,EAAM1P,GAAGwI,SAASvI,KAAKwC,EAAEwB,OAAO,GAAI,CAAE8C,KAAMA,EAAMiG,WAAYvO,EAAIsI,GAAMiG,cAG5EQ,GAAakC,EAAM1P,GAAGwI,SAAU/J,KAK5C,SAASohB,GAAiB/W,GAEtB,OADAA,EAAOA,EAAO3O,QAAU,CAAEgN,MAAO,GAAIG,SAAU,GAAIuI,QAAS/G,EAAO3O,QAC5D2O,EAGX,SAAS+S,GAAa0E,EAASpX,EAAMC,GACjC,GAAImX,EAAQ1X,OAAO1O,OAASgiB,GAAahT,EAAKN,OAAQO,GAElD,OAAOD,EAsCf,SAASkT,GAAWhU,EAAOmY,GACvB,OAAO3W,GAAkB2W,EAAYnY,GAAOrL,MAGhD,SAASmf,GAAatT,EAAQO,GAC1B,IAAKP,EAAO1O,OACR,OAAO,EAOX,IAJA,IAAIsmB,EAAQ5X,EAAOb,QACftO,EAAU+mB,EAAMC,QAChB5X,EAAS,EAENpP,GACCA,EAAQ+O,QACR,GAAGxI,KAAKmC,MAAMqe,EAAO/mB,EAAQ+O,SACtB/O,EAAQ8O,WACV9O,EAAQ+N,UACTqB,GAAUpP,EAAQ8O,SAASrO,QAE/B,GAAG8F,KAAKmC,MAAMqe,EAAO/mB,EAAQ8O,WAGjC9O,EAAU+mB,EAAMC,QAOpB,OAJItX,EAASjP,SACT2O,GAAkBM,EAASjP,QAGxB2O,EAGX,SAASmM,GAAc9L,GAWnB,OAVKA,IACDA,EAAO,CACHN,OAAQ,KAIXM,EAAKN,SACNM,EAAKN,OAAS,IAGXM,EAGX,SAASqV,GAAcnW,EAAOqW,EAAatV,GACvC,IAAKf,EACD,OAAO,EAYX,IATA,IAAI+T,EAAiB0B,KAAKjS,IAAIzC,EAASjP,OAAQ,GAC3C0O,EAASR,EAAMI,QAAQT,MAAM,EAAG0W,GAChChlB,EAAUmP,EAAO6X,QAKjBC,EAAUvE,EAEP1iB,GACCA,EAAQqN,OAASzB,EAGjBqb,GAAYvE,EAAiB,EACtB1iB,EAAQ8O,SAEf,GAAGvI,KAAKmC,MAAMyG,EAAQnP,EAAQ8O,WAG9BmY,IACA,GAAG1gB,KAAKmC,MAAMyG,EAAQnP,EAAQ+O,UAGlC/O,EAAUmP,EAAO6X,QAGrB,OAAOC,EAGX,SAASzC,GAAYpjB,EAAQiiB,EAAQ3T,GACjC,IAAK2T,EAAO,GACR,MAAO,CACH0B,WAAY,KACZ5V,OAAQ/N,EACR4jB,YAAa,EACb1hB,MAAO,GAIf,IAAI8L,EAASe,GAAkB/O,EAAQiiB,EAAO,IAE9C,IAAKjU,EAAOT,MACR,MAAO,CACHoW,WAAY,KACZ5V,OAAQkU,EACR2B,YAAa,EACb1hB,MAAO,GAIf,IAAI4jB,EAAgB9X,EAAOT,MAAMI,QAC7BoY,EAAgB9D,EAAO,GAAGtU,QAC1BiW,GAAe,EAEnB,GAAIkC,EAAczmB,SAAW0mB,EAAc1mB,OACvC,MAAO,CACHskB,WAAY,KACZ5V,OAAQkU,EACR2B,YAAa,EACb1hB,MAAO,GAIf,IAAK,IAAIuL,EAAM,EAAGpO,EAASymB,EAAczmB,OAAQoO,EAAMpO,EAAQoO,KACtDqY,EAAcrY,GAAKd,SAAWoZ,EAActY,GAAKC,SAAS,MACvC,GAAhBkW,GAAqBmC,EAActY,GAAKC,SAASrO,SACjDukB,EAAcnW,GAGlBqY,EAAcrY,GAAKC,SAAWqY,EAActY,GAAKC,UAMzD,OAFAY,EAAW0U,KAAKjS,IAAIzC,EAASjP,OAAQ,GAE9B,CACHskB,WAAY3V,EAAOT,MACnBrL,MAAO8L,EAAO9L,MAAQoM,EACtBsV,YAAaA,EACb7V,OAAQ/N,GAIhB,SAASgmB,GAAYtnB,EAAOunB,GACxB,IACIxY,EAAKpO,EADL6mB,GAAQ,EAMZ,IAHAxnB,EAAQA,EAAMiP,QACdsY,EAASA,EAAOtY,QAEXF,EAAM,EAAGpO,EAASX,EAAMW,OAAQoO,EAAMpO,EAAQoO,IAC3C/O,EAAM+O,GAAKd,SAAWsZ,EAAOxY,GAAKd,UAItCuZ,EAAQA,GAAUvX,GAAQjQ,EAAM+O,MAAUkB,GAAQsX,EAAOxY,KAG7D,OAAOyY,EAGX,SAASnX,GAAkBhB,EAAQoY,GAC/B,IAAI1Y,EAAKpO,EAAQkO,EAAOkB,EACpBmV,EAAawC,EAAera,EADD8Z,EAAU,EAGzC,IAAKpY,EAAM,EAAGpO,EAAS0O,EAAO1O,OAAQoO,EAAMpO,EAAQoO,IAAO,CAEvD,GAAIuY,GADJzY,EAAQQ,EAAON,GACQ0Y,GACnB,MAAO,CACH5Y,MAAOA,EACPrL,MAAO2jB,GAMf,IAFAA,IAEKjC,EAAc,EAAGwC,EAAgB7Y,EAAMI,QAAQtO,OAAQukB,EAAcwC,EAAexC,IAErF,KADA7X,EAASwB,EAAMI,QAAQiW,IACZjX,UAKXkZ,IADApX,EAAQM,GAAkBhD,EAAO2B,SAAUyY,IAC1BjkB,MACbuM,EAAMlB,OACN,MAAO,CACHA,MAAOkB,EAAMlB,MACbrL,MAAO2jB,GAMvB,MAAO,CACH3jB,MAAO2jB,GAIf,SAASQ,GAAW1Y,EAAShK,GACzB,IAAIoI,EAAQ7G,EAAGohB,EAAK3Q,EAAO,GAC3B,IAAKzQ,EAAI,EAAGohB,EAAM3Y,EAAQtO,OAAQ6F,EAAIohB,EAAKphB,IAGlCvB,EADLgS,IADA5J,EAAS4B,EAAQzI,IACF+G,QAEXtI,EAAIgS,GAAQ5J,GAMxB,SAASwa,GAAiBhZ,EAAO5J,GAC7B,IACIuB,EAAGohB,EAAKva,EAERya,EAHA7Y,EAAUJ,EAAMI,QACAgI,EAAO,GACvB8Q,EAAa,GAGjB,IAAKvhB,EAAI,EAAGohB,EAAM3Y,EAAQtO,OAAQ6F,EAAIohB,EAAKphB,IAAK,CAE5C,GADA6G,EAAS4B,EAAQzI,GACbshB,EAAc,CACd,GAAI7iB,EAAIgS,EAAO5J,EAAOE,MAAO,CAEzBua,EAAe7iB,EADfgS,GAAQ5J,EAAOE,MAEf,SACG,OAAItI,EAAIgS,EAAO5J,EAAOmG,YAClBvO,EAAIgS,EAAO5J,EAAOmG,YAClBvO,EAAI8iB,EAAa1a,EAAOmG,YACxBvO,EAAI8iB,EAAa1a,EAAOmG,YAExBvO,EAAI8iB,GAOnB,GAHA9Q,GAAQ5J,EAAOE,OACfua,EAAe7iB,EAAIoI,EAAOmG,gBAGtBsU,EAAe7iB,EAAIgS,IAEf,OAAO,KAIX6Q,IACAC,GAAcD,EAAava,MAInC,OAAOua,EAiBX,SAASE,GAAuBnZ,EAAOrL,GACnC,KAAIA,EAAQ,GAAZ,CAGA,IAAI6J,EAAS,CACTE,KAAMzB,EACNmC,SAAS,EACTe,SAAU,CACN/F,EAAEwB,OAAO,CAAEwE,QAAS,GAAIiV,UAAWrV,EAAMqV,WAAarV,EAAMI,QAAQzL,MAG5EqL,EAAMI,QAAQwW,OAAOjiB,EAAO,EAAG6J,GAC/BwB,EAAMqV,UAAYhb,GAGtB,SAASsb,GAAYnV,EAAQO,GACzB,GAAIP,EAAO1O,OAAS,EAChB,MAAO,GAMX,IAJA,IAAI2O,EAAS,GACTrK,EAAM,GACNgjB,EAnCR,SAAyBpZ,EAAOe,GAC5B,GAAwB,IAApBA,EAASjP,OACT,OAAQ,EAKZ,IAFA,IAAIsN,EAAU2B,EAAS,GACnBX,EAAUJ,EAAMI,QACXF,EAAM,EAAG6Y,EAAM3Y,EAAQtO,OAAQoO,EAAM6Y,EAAK7Y,IAC/C,GAAIE,EAAQF,GAAKxB,MAAQU,EAAQV,KAC7B,OAAOwB,EA0BImZ,CAAgB7Y,EAAO,GAAIO,GAErCpJ,EAAI,EAAGA,EAAI6I,EAAO1O,OAAQ6F,IAAK,CACpC,IAAIqI,EAAQQ,EAAO7I,GAGnBqI,EAAMqV,UAAY1d,EAElBwhB,GAAuBnZ,EAAOoZ,GAC9B,IAAIH,EAAeD,GAAiBhZ,EAAO5J,GAEvC6iB,EACIG,EAAe,IAAMH,EAAa7Z,QAClC6Z,EAAa9Y,SAASvI,KAAKoI,GAE3BiZ,EAAa9Y,SAASvI,KAAKoI,EAAMI,QAAQgZ,GAAcjZ,SAAS,IAGpEM,EAAO7I,KAAKoI,GAGhB8Y,GAAW9Y,EAAMI,QAAShK,GAG9B,OAAOqK,EAiDX,SAAS+U,GAAiBhV,GAMtB,IAJA,IAEIN,EAAKpO,EAAQwnB,EAAanZ,EAAU3B,EAFpCiC,EAAS,GACTT,GAFJQ,EAASA,EAAOb,SAEG0Y,QAGZrY,GAAO,CAOV,IALIA,EAAMqV,YAAchb,GACpBoG,EAAO7I,KAAKoI,EAAMqV,WAGtBiE,EAAc,EACTpZ,EAAM,EAAGpO,EAASkO,EAAMI,QAAQtO,OAAQoO,EAAMpO,EAAQoO,IAEvDC,GADA3B,EAASwB,EAAMI,QAAQF,IACLC,SACd3B,EAAOY,QACP,GAAGwX,OAAO7c,MAAMyG,EAAQ,CAAC,EAAG,GAAG3I,OAAOsI,IAEtC,GAAGyW,OAAO7c,MAAMyG,EAAQ,CAAC8Y,EAAa,GAAGzhB,OAAOsI,IAEpDmZ,GAAenZ,EAASrO,OAG5BkO,EAAQQ,EAAO6X,QAGnB,OAAO5X,EAiCX,SAAS8Y,GAAkBC,GACvB,IAAIrV,EAAQqV,EAAWhX,MAAM,KAC7B,OAAI2B,EAAMrS,OAAS,EACRqS,EAAM,GAAK,IAAMA,EAAM,GAE3BqV,EAGX,SAASC,GAAuB3T,EAAO8E,GACnC,IAEI8O,EAFAxZ,EAAM4F,EAAMhU,OAAS,EACrB4M,EAAOoH,EAAM5F,GAajB,OAVAwZ,EAaJ,SAAiC9O,EAAMpM,GACnC,IAAK,IAAI0B,EAAM,EAAGpO,EAAS8Y,EAAK9Y,OAAQoO,EAAMpO,EAAQoO,IAClD,GAAwC,IAApC1B,EAAO5J,QAAQgW,EAAK1K,GAAK4B,OACzB,OAAO8I,EAAK1K,GAGpB,OAAO,KAnBUyZ,CAAwB/O,EAAMlM,GAE3Cgb,GAAkBA,EAAenX,IACjC7D,EAAO,SAAWA,EAAO,aAAegb,EAAe5X,MAAQ,iCAAmC4X,EAAenX,IAAM,IAEvH7D,GAAQ,YAGZoH,EAAM5F,GAAOxB,EAENoH,EAYX,SAAS8T,GAAU9T,GACf,IACInP,EADA8J,EAAS,cAcb,OAXIqF,EAAMhU,OAAS,GACf6E,EAAImP,EAAMrD,MACVhC,GAAUmZ,GAAU9T,KAEpBrF,GAAUqF,EAAMuS,QAChB1hB,EAAImP,EAAMrD,OAGdhC,GAAU,MACVA,GAAU9J,EACV8J,GAAU,KAId,SAASoZ,GAAiBzZ,EAASW,GAC/B,IAAI+Y,EAAM1Z,EAAQT,MAAM,GAMxB,OAJIoB,EAASjP,OAAS,GAClBgoB,EAAIliB,KAAK,IAAMmiB,GAAahZ,GAAUpP,KAAK,KAAO,KAG/CioB,GAAUE,GAGrB,SAASC,GAAahZ,GAMlB,IALA,IAGI3B,EAHAc,EAAM,EACNpO,EAASiP,EAASjP,OAClB2O,EAAS,GAGNP,EAAMpO,EAAQoO,IACjBd,EAAU2B,EAASb,GACnBO,EAAO7I,KAAKwH,EAAQV,OAASrE,EAAc+E,EAAQV,KAAOU,GAG9D,OAAOqB,EAGX,SAAS7L,GAAQ8J,EAAM2I,GACnB,IAAInH,EAAKpO,EAAQ6C,GAAS,EAE1B,IAAKuL,EAAM,EAAGpO,EAASuV,EAAMvV,OAAQoO,EAAMpO,EAAQoO,IAC/C,GAAIkB,GAAQiG,EAAMnH,MAAUxB,EAAM,CAC9B/J,EAAQuL,EACR,MAGR,OAAOvL,EAGX,SAASyM,GAAQ1C,GAOb,OANAA,EAAOA,EAAKA,MAAQA,EAEQ,mBAAxBhD,EAAS9I,KAAK8L,KACdA,EAAOA,EAAKA,EAAK5M,OAAS,IAGvB4M,EAGX,SAASuK,GAAa7I,GAKlB,IAJA,IAAItO,EAASsO,EAAQtO,OACjBgU,EAAQ,GACR5F,EAAM,EAEHA,EAAMpO,EAAQoO,IACjB4F,EAAMlO,KAAKwI,EAAQF,GAAKxB,KAAK,IAGjC,OAAOoH,EAGX,SAASoD,GAASpD,EAAO7B,GACrB,IAAIvF,EACAsb,EAEA7Y,EACAjB,EAAM,EACNpO,EAASgU,EAAMhU,OACfmoB,EAAahW,EAAUnS,OAI3B,IAFAmS,EAAYA,EAAUtE,MAAM,GAErBO,EAAMpO,EAAQoO,IAGjB,IAFAxB,EAAOoH,EAAM5F,GAERiB,EAAI,EAAGA,EAAI8Y,EAAY9Y,IAGxB,GAFA6Y,EAAWT,GAAkBtV,EAAU9C,KAEP,IAA5BzC,EAAK9J,QAAQolB,GAAkB,CAC/B/V,EAAU9C,GAAKzC,EACf,MAKZ,MAAO,CACHoH,MAAO7B,EACP8B,YAAa5E,EACb0E,WAAY5B,EAAUtE,MAAM,EAAGwB,EAAI,GAAGxP,KAAK,KAInD,SAASqX,GAAiB5I,GAetB,IAdA,IAGI5B,EAEA2C,EAAG+Y,EAIHxb,EACA6R,EAEArP,EAZA/C,EAAW,GACXgc,EAAQ,GACRtpB,EAAO,GAIPqP,EAAM,EACNpO,EAASsO,EAAQtO,OAOdoO,EAAMpO,EAAQoO,IASjB,GAPAxB,GADAF,EAAS4B,EAAQF,IACHxB,KACdwC,GAAQ,EAEoB,mBAAxBxF,EAAS9I,KAAK8L,KACdF,EAAOE,KAAOA,EAAO,CAACA,IAGtBA,EAAK5M,OAAS,EACdqoB,EAAMviB,KAAK4G,OACR,CAGH,IAFA+R,EAAgBgJ,GAAkB7a,EAAK,IAElCyC,EAAI,EAAG+Y,EAAIrpB,EAAKiB,OAAQqP,EAAI+Y,EAAG/Y,IAChC,GAA+C,IAA3CtQ,EAAKsQ,GAAGzC,KAAK,GAAG9J,QAAQ2b,GAAsB,CAC9CrP,GAAQ,EACR,MAIHA,GACDrQ,EAAK+G,KAAK4G,GAGVA,EAAOkB,QACPvB,EAASvG,KAAK4G,GAO1B,MAAO,CACH3N,KAAMA,EACNsN,SAJJA,EAAWA,EAAStG,OAAOsiB,IAQ/B,SAASC,GAAiBha,EAASW,EAAU6J,GACzC,IAeI4O,EAfA3J,EAAU,GAIV1R,EAAW6K,GAFf5I,EAAUA,GAAW,IAKjB6D,EAAYgF,GAFL9K,EAAStN,MAGhBwpB,EAAoB,GAIpBvoB,GAFJqM,EAAWA,EAASA,UAEErM,OAClBoO,EAAM,EAGN4F,EAAQ,GAEZ,GAAI7B,EAAUnS,OAAS,GAAKiP,EAASjP,OAAS,EAAG,CAG7C,IAFAuoB,EAAkBziB,KAAKiiB,GAAiB5V,EAAWlD,IAE5Cb,EAAMpO,EAAQoO,IAEjB4F,EAAQoD,GADRsQ,EAAaC,GAAuBtb,EAAS+B,GAAKxB,KAAMkM,GAC3B3G,GAAW6B,MAExCuU,EAAkBziB,KAAKiiB,GAAiB/T,EAAO/E,IAGnD8O,GAAWwK,EAAkB1oB,KAAK,SAC/B,CACH,KAAOuO,EAAMpO,EAAQoO,IACjBsZ,EAAaC,GAAuBtb,EAAS+B,GAAKxB,KAAMkM,GACxD9E,EAAMlO,KAAK4hB,EAAW,IAG1B3J,GAAW5L,EAAUpM,OAAOiO,GAAOnU,KAAK,KAG5C,OAAOke,EAzQXtE,GAAkBrR,OAAS,SAASvJ,GAGhC,IAAI2pB,GAFJ3pB,EAAUA,GAAWA,EAAQiH,KAAO,CAAEiD,KAAMlK,GAAYA,IAE5B,GACxBkK,EAAOyf,EAAWzf,KAItB,GAFAyf,EAAWzf,KAAOA,IAEZyf,aAAsB/O,KAAsB+O,aAAsBhgB,EAAMO,KAAKE,WAC/E,MAAM,IAAI6N,MAAM,2EAGpB,OAAO0R,aAAsB/O,GAAoB+O,EAAa,IAAI/O,GAAkB+O,IAGxFvJ,GAAgB7W,OAAS,SAASvJ,GAG9B,IAAI2pB,GAFJ3pB,EAAUA,GAAWA,EAAQiH,KAAO,CAAEiD,KAAMlK,GAAYA,IAE5B,GACxBkK,EAAOyf,EAAWzf,KAItB,GAFAyf,EAAWzf,KAAOA,IAEZyf,aAAsBvJ,KAAoBuJ,aAAsBhgB,EAAMO,KAAKE,WAC7E,MAAM,IAAI6N,MAAM,2EAGpB,OAAO0R,aAAsBvJ,GAAkBuJ,EAAa,IAAIvJ,GAAgBuJ,IAiPpF,IAAIC,GAAwB,CACxBC,SAAU,sDACVC,eAAgB,kDAChBC,WAAY,4DACZC,SAAU,6DACVC,GAAI,6CACJC,IAAK,8CAGT,SAASC,GAAoBC,GACzB,IAAIlL,EAAU,GACV/Q,EAAQic,EAAWjc,MACnBgD,EAAQiZ,EAAWjZ,MACnByH,EAAWwR,EAAWxR,SAc1B,MAZgB,MAAZA,GACAsG,GAAW,IACXA,GAAW/Q,EACX+Q,GAAW,MAEXA,GAAuB,OAAZtG,GAAiC,kBAAZA,EAA+B,IAAM,GACrEsG,GAAW,UACXA,GAAW/N,EAAQ,WACnB+N,GAAWvV,EAAMqI,OAAO4X,GAAsBhR,GAAWzH,EAAOhD,GAChE+Q,GAAW,KAGRA,EA0BX,SAASmL,GAAiBC,EAAetqB,EAASuqB,GAC9C,IAAIza,EAAS,GAEb,GAAI9P,EAAS,CAET,IAAImO,EACJ,IAAK,IAAI7L,KAFTwN,GAAU,IAAMwa,EAAgB,IAEhBtqB,EACZmO,EAAQnO,EAAQsC,GACZioB,IACAjoB,EAAMA,EAAIkoB,QAAQ,yCAA0C,OAAOC,cAAcD,QAAQ,KAAM,KAEnG1a,GAAU,IAAMxN,EAAM,IAAM6L,EAAQ,KAAO7L,EAAM,IAErDwN,GAAU,KAAOwa,EAAgB,SAEjCxa,GAAU,IAAMwa,EAAgB,KAEpC,OAAOxa,EAGX,IAAI4a,GAAuB,CACvB5K,YAAa,iBACbC,eAAgB,oBAChBd,eAAgB,oBAChBM,iBAAkB,sBAClBC,kBAAmB,uBACnBG,aAAc,kBACdK,cAAe,mBACfV,WAAY,iBAGZqL,GAAgB,CAChBrQ,KAAM,SAASta,GACX,IAAIkf,EAAU,0JAEdA,GAAW,qBAEX,IAAI5H,EAAUtX,EAAQsX,SAAW,GAC7BhS,EAAOtF,EAAQsF,MAAQ,GAEvB8K,EAAWpQ,EAAQoQ,UAAY,GAC/B4I,EAA2C,SAAzBhZ,EAAQiZ,aAC1BgB,EAAOja,EAAQia,MAAQ,GA8C3B,OA5CK3C,EAAQnW,QAAUmE,EAAKnE,UAAYiP,EAASjP,QAAWiP,EAASjP,QAAU6X,KAC3E1B,EAAUhS,EACVA,EAAO,GACP0T,GAAkB,GAGjB1B,EAAQnW,QAAWmE,EAAKnE,SACzB6X,GAAkB,GAGlB1B,EAAQnW,OACR+d,GAAWuK,GAAiBnS,EAAU0B,EAA6B,GAAX5I,EAAe6J,GAChE7J,EAASjP,SAAW6X,IAC3BkG,GAAWkK,GAAahZ,GAAUpP,KAAK,MAG3Cke,GAAW,8EAEP5Z,EAAKnE,QAAW6X,GAAmB5I,EAASjP,OAAS,KACrD+d,GAAW,gBAEP5Z,EAAKnE,OACL+d,GAAWuK,GAAiBnkB,EAAM0T,EAAkB5I,EAAW,GAAI6J,GAEnEiF,GAAWkK,GAAahZ,GAAUpP,KAAK,KAG3Cke,GAAW,2EAGXlf,EAAQyY,QACRyG,GAAW,SACXA,GAAW,IACXA,GApGZ,SAA0BzG,EAAQkC,GAC9B,IAAkBja,EAGd6O,EAHA2P,EAAU,GACVvG,EAAUF,EAAOE,QACjBxX,EAASwX,EAAQxX,OAGrB,IAAKoO,EAAMpO,EAAS,EAAGoO,GAAO,EAAGA,IAE7B7O,EAAU,WACVA,GAAWypB,GAAoBxR,EAAQpJ,IACvC7O,GAAW,SAIPwe,EAFA3P,GAAOpO,EAAS,EAChBT,GAAW,UAAYia,EAAO,IAGpBja,EAAU,WAAawe,EAAU,KAInD,OAAOA,EAgFY0L,CAAiB5qB,EAAQyY,OAAQzY,EAAQ0a,WAAWC,MAC/DuE,GAAW,KAEXA,GAAW,UAAYlf,EAAQ0a,WAAWC,KAAO,IAG9B,GAAnBvK,EAASjP,QAAemW,EAAQnW,SAChC+d,GAAW,WAAakK,GAAahZ,GAAUpP,KAAK,KAAO,MAG/Dke,GAAW,4DAA8Dlf,EAAQ0a,WAAWD,QAAU,uGACvF+P,QAAQ,MAAO,UAElCnQ,SAAU,SAASra,GAGf,IAAIkf,EAAU,uIAcd,OAbAA,GAAW,iBAAmBwL,IAH9B1qB,EAAUA,GAAW,IAGsCkf,UAAYlf,EAAQkf,SAAW,iBAE1FA,GAAW,iBAAmBmL,GAAiB,kBAAmBrqB,EAAQmf,cAAc,GAAQ,kBAE5Fnf,EAAQ0a,YAAc1a,EAAQ0a,WAAWD,UACzCza,EAAQ6qB,WAAaphB,EAAEwB,OAAO,GAAI,CAC9B6f,QAAS9qB,EAAQ0a,WAAWD,SAC7Bza,EAAQ6qB,aAGf3L,GAAW,eAAiBmL,GAAiB,eAAgBrqB,EAAQ6qB,YAAc,gBAEnF3L,GAAW,kCAKf6L,GAAgBphB,EAAMO,KAAK8gB,gBAAgB/f,OAAO,CAClD+H,KAAM,SAAShT,GACX,IAAIirB,EAAkBjrB,EAEtBA,EAAUF,KAAKE,QAAUiL,GAAO,EAAM,GAAInL,KAAKE,QAASA,GAExD2J,EAAMO,KAAK8gB,gBAAgB/oB,KAAKnC,KAAME,GAElCmL,EAAW8f,EAAgB5Q,UAC3Bva,KAAKua,SAAW4Q,EAAgB5Q,SACW,iBAA7B4Q,EAAgB5Q,SAC9Bva,KAAKE,QAAQqa,SAAW,CACpB6Q,IAAKD,EAAgB5Q,UAEjB4Q,EAAgB5Q,WACxBva,KAAKE,QAAQqa,SAAWva,KAAKE,QAAQsa,OAG7C6Q,MAAO,SAASnrB,EAAS6O,GAIrB,OAHA7O,EAAQkK,KAAOlK,EAAQkK,MAAQ,GAC/BT,EAAEwB,QAAO,EAAMjL,EAAQkK,KAAM,CAAEwQ,WAAY5a,KAAKE,QAAQ0a,aAEjD/Q,EAAMO,KAAK8gB,gBAAgB5P,GAAG+P,MAAMlpB,KAAKnC,KAAME,EAAS6O,IAEnE7O,QAAS,CACLsa,KAAM,CACF8Q,SAAU,OACVC,YAAa,WACbxc,KAAM,QAEVwL,SAAU,CACN+Q,SAAU,OACVC,YAAa,WACbxc,KAAM,QAEVyc,aAAc,SAAStrB,EAAS6O,GAC5B,OAAO8b,GAAc9b,GAAM7O,EAAQ6O,KAI3CwL,SAAU,SAASra,GACf,OAAOyJ,EAAE8hB,KAAKzrB,KAAKqrB,MAAMnrB,EAAS,gBAItCub,GAAkBvR,EAAMiB,OAAO,CAC/B+H,KAAM,SAAShT,GACXA,EAAUF,KAAKE,QAAUiL,GAAO,EAAM,GAAInL,KAAKE,QAASA,IAE5DmrB,MAAO,SAASnrB,GACZ,OAAOyJ,EAAEwB,QAAO,EAAMjL,GAAW,GAAI,CAAE0a,WAAY5a,KAAKE,QAAQ0a,cAEpEJ,KAAM,SAASta,GACX,IACIwa,EACAqE,EAFAxC,EAAOvc,KAIP0rB,EAAenP,EAAK8O,MAAMnrB,EAAQkK,KAAMgC,GAE5CsO,EAAUxa,EAAQwa,SAAW/Q,EAAEgiB,KAC/B5M,EAAQ7e,EAAQ6e,OAASpV,EAAEgiB,KAEvBzrB,EAAQsrB,eACRE,EAAenP,EAAKiP,aAAaE,EAActf,IAGnDd,EAAU,CAAE8f,IAAK7O,EAAKrc,QAAQsa,MAAQkR,GACrCE,KAAK/f,GACL+f,MAAK,SAAShN,GACXlE,EAAQkE,MAEXiN,OAAM,SAAS7M,GAAOD,EAAMC,OAGjCrE,QAAS,SAASlU,GACd,IAAIvG,EAAUF,KAAKE,SAAW,GAE9B,GAAIuG,IAAQmD,EACR,OAAQ1J,EAAQ0a,YAAc,IAAID,QAItC,IAAIC,EAAa1a,EAAQ0a,YAAc,GACvCA,EAAWD,QAAUlU,EAErBzG,KAAKE,QAAQ0a,WAAaA,EAC1BjR,EAAEwB,OAAOnL,KAAKsa,UAAUpa,QAAS,CAAE0a,WAAYA,KAEnDC,KAAM,SAASpU,GACX,IAAIvG,EAAUF,KAAKE,SAAW,GAE9B,GAAIuG,IAAQmD,EACR,OAAQ1J,EAAQ0a,YAAc,IAAIC,KAGtC,IAAID,EAAa1a,EAAQ0a,YAAc,GACvCA,EAAWC,KAAOpU,EAElBzG,KAAKE,QAAQ0a,WAAaA,EAC1BzP,GAAO,EAAMnL,KAAKsa,UAAUpa,QAAS,CAAE0a,WAAYA,KAGvDL,SAAU,SAASra,GACf,OAAO2K,EAAc,CAAEugB,IAAKprB,KAAKE,QAAQsa,MAAQta,MAIzD,SAAS4rB,GAAQC,GACb,OAAc,MAAVA,EACO,GAIE,mBADF9gB,EAAS9I,KAAK4pB,GAEd,CAACA,GAGLA,EAGX,SAASC,GAAc3b,GAWnB,IAVA,IAAIL,EAAS,CAAED,OAAQ,IACnBA,EAAS+b,GAAQjiB,EAAMuH,OAAO,gBAAgB,EAA7BvH,CAAmCwG,IACpD4b,EAAgBpiB,EAAMuH,OAAO,oBAC7B8a,EAAcriB,EAAMuH,OAAO,kBAC3B+a,EAAkBtiB,EAAMuH,OAAO,kBAC/Bgb,EAAiBviB,EAAMuH,OAAO,iBAC9Bib,EAAiBxiB,EAAMuH,OAAO,iCAAiC,GAC/Dkb,EAAkBziB,EAAMuH,OAAO,kBAC/Bmb,EAAmB1iB,EAAMuH,OAAO,+BAA+B,GAE1D3B,EAAM,EAAGA,EAAMM,EAAO1O,OAAQoO,IAAO,CAG1C,IAFA,IAAIE,EAAU,GACV5B,EAAS+d,GAAQ/b,EAAON,GAAK+c,QACxB/F,EAAY,EAAGA,EAAY1Y,EAAO1M,OAAQolB,IAC/C9W,EAAQxI,KAAK,CACTuI,SAAU,GACV1B,QAASie,EAAcle,EAAO0Y,IAC9BxY,KAAMie,EAAYne,EAAO0Y,IACzB1S,UAAWoY,EAAgBpe,EAAO0Y,IAClCzS,SAAUoY,EAAere,EAAO0Y,IAChCxS,YAAasR,SAAS8G,EAAete,EAAO0Y,IAAa,IAAM,EAC/DvS,WAAYqY,EAAiBxe,EAAO0Y,IACpC7V,UAAW0b,EAAgBve,EAAO0Y,MAI1CzW,EAAOD,OAAO5I,KAAK,CAAEwI,QAASA,IAElC,OAAOK,EAGX,IAAIyc,GAAsB,CACtBzR,MAAO,CACH/M,KAAMpE,EAAMuH,OAAO,sBAAsB,GACzCpD,QAASnE,EAAMuH,OAAO,yBAAyB,GAC/Csb,YAAa7iB,EAAMuH,OAAO,wBAAwB,GAClDrC,KAAMlF,EAAMuH,OAAO,sBAAsB,IAE7C6J,SAAU,CACNhN,KAAMpE,EAAMuH,OAAO,yBAAyB,GAC5Csb,YAAa7iB,EAAMuH,OAAO,wBAAwB,IAEtDd,SAAU,CACNrC,KAAMpE,EAAMuH,OAAO,yBAAyB,GAC5CpD,QAASnE,EAAMuH,OAAO,4BAA4B,GAClDsB,WAAY7I,EAAMuH,OAAO,gCAAgC,GACzDsb,YAAa7iB,EAAMuH,OAAO,wBAAwB,GAClDkG,WAAYzN,EAAMuH,OAAO,+BAA+B,GACxDub,UAAW9iB,EAAMuH,OAAO,8BAA8B,GACtDwb,cAAe/iB,EAAMuH,OAAO,mCAAmC,GAC/Dyb,cAAehjB,EAAMuH,OAAO,kCAAkC,IAElEkW,KAAM,CACFrZ,KAAMpE,EAAMuH,OAAO,qBAAqB,GACxCpD,QAASnE,EAAMuH,OAAO,wBAAwB,GAC9C/C,MAAOxE,EAAMuH,OAAO,sBAAsB,GAC1C0b,KAAMjjB,EAAMuH,OAAO,qBAAqB,GACxCgW,OAAQvd,EAAMuH,OAAO,uBAAuB,GAC5C2b,MAAOljB,EAAMuH,OAAO,sBAAsB,GAC1C4b,cAAenjB,EAAMuH,OAAO,+BAA+B,GAC3D6b,aAAcpjB,EAAMuH,OAAO,8BAA8B,GACzDsb,YAAa7iB,EAAMuH,OAAO,4BAA4B,GACtDub,UAAW9iB,EAAMuH,OAAO,8BAA8B,IAE1D+B,WAAY,CACRlF,KAAMpE,EAAMuH,OAAO,2BAA2B,GAC9CpD,QAASnE,EAAMuH,OAAO,8BAA8B,GACpDsb,YAAa7iB,EAAMuH,OAAO,wBAAwB,GAClDsB,WAAY7I,EAAMuH,OAAO,kCAAkC,GAC3D8L,iBAAkBrT,EAAMuH,OAAO,8BAA8B,GAC7DrC,KAAMlF,EAAMuH,OAAO,2BAA2B,IAIlD8J,YAAa,CACTjN,KAAMpE,EAAMuH,OAAO,2BAA2B,GAC9CpD,QAASnE,EAAMuH,OAAO,8BAA8B,GACpDsb,YAAa7iB,EAAMuH,OAAO,wBAAwB,GAClDsB,WAAY7I,EAAMuH,OAAO,kCAAkC,GAC3DwO,oBAAqB/V,EAAMuH,OAAO,kCAAkC,GACpEwb,cAAe/iB,EAAMuH,OAAO,qCAAqC,GACjEgQ,OAAQvX,EAAMuH,OAAO,6BAA6B,GAClD8b,cAAerjB,EAAMuH,OAAO,2BAA2B,IAE3D+J,OAAQ,CACJlN,KAAMpE,EAAMuH,OAAO,uBAAuB,GAC1CpD,QAASnE,EAAMuH,OAAO,0BAA0B,GAChDsb,YAAa7iB,EAAMuH,OAAO,wBAAwB,GAClDsB,WAAY7I,EAAMuH,OAAO,8BAA8B,GACvDwO,oBAAqB/V,EAAMuH,OAAO,kCAAkC,GACpEwb,cAAe/iB,EAAMuH,OAAO,iCAAiC,GAC7D+b,iBAAkBtjB,EAAMuH,OAAO,oCAAoC,GACnEgQ,OAAQvX,EAAMuH,OAAO,yBAAyB,GAC9C2O,oBAAqBlW,EAAMuH,OAAO,kCAAkC,IAExEzB,QAAS,CACL1B,KAAMpE,EAAMuH,OAAO,wBAAwB,GAC3CpD,QAASnE,EAAMuH,OAAO,2BAA2B,GACjDsB,WAAY7I,EAAMuH,OAAO,+BAA+B,GACxDwO,oBAAqB/V,EAAMuH,OAAO,kCAAkC,GACpE2O,oBAAqBlW,EAAMuH,OAAO,kCAAkC,GACpEmM,gBAAiB1T,EAAMuH,OAAO,8BAA8B,GAC5DoM,oBAAqB3T,EAAMuH,OAAO,iCAAiC,KAIvEgc,GAAoB,CAAC,OAAQ,WAAY,QAAS,aAAc,cAAe,SAAU,YAEzFC,GAAiBxjB,EAAMO,KAAKkjB,cAAcniB,OAAO,CACjD+H,KAAM,SAAShT,GACX2J,EAAMO,KAAKkjB,cAAcnrB,KAAKnC,KAAME,GAEpCF,KAAKutB,QAAQrtB,IAEjBqtB,QAAS,SAASrtB,GAMd,IALA,IAEIstB,EACAC,EAHAhe,EAAM,EACNpO,EAAS+rB,GAAkB/rB,OAIxBoO,EAAMpO,EAAQoO,KAEjBge,EAASvtB,EADTstB,EAAaJ,GAAkB3d,MAGjBge,IAAWviB,IACrBlL,KAAKwtB,GAAcC,IAI/Btd,MAAO,SAASud,GACZ,IAAI1d,EAASnG,EAAMO,KAAKkjB,cAAchS,GAAGnL,MAAMud,EAAIhD,QAAQ,kBAAmB,QAC9E,OAAO7gB,EAAMuH,OAAO,wBAAwB,EAArCvH,CAA2CmG,IAEtD2d,OAAQ,SAASvtB,GACb,IAAIwtB,EAAQ/jB,EAAMuH,OAAO,aAAa,EAA1BvH,CAAgCzJ,GAC5C,OAAIwtB,EACO,CAAC,CACJC,YAAahkB,EAAMuH,OAAO,wBAAwB,EAArCvH,CAA2C+jB,GACxDE,UAAWjkB,EAAMuH,OAAO,sBAAsB,EAAnCvH,CAAyC+jB,KAGrD,MAEXxT,KAAM,SAASha,GACXA,EAAOyJ,EAAMuH,OAAO,kCAAoC,EAAjDvH,CAAuDzJ,GAU9D,IARA,IACIiQ,EADA+J,EAAO0R,GAAQjiB,EAAMuH,OAAO,aAAa,EAA1BvH,CAAgCzJ,IAG/C4P,EAAS,CACTwH,QAAS,GACThS,KAAM,IAGDiK,EAAM,EAAGA,EAAM2K,EAAK/Y,OAAQoO,IAGG,gBAFpCY,EAAO+J,EAAK3K,IAEH,SAASyI,gBACTlI,EAAOwH,QAAQzH,OAGhBC,EAAOxK,KAAOwmB,GAAc3b,GAF5BL,EAAOwH,QAAUwU,GAAc3b,IAO3C,OAAOL,GAEX5F,KAAM,SAAShK,GACXA,EAAOyJ,EAAMuH,OAAO,kCAAoC,EAAjDvH,CAAuDzJ,GAS9D,IAPA,IAAIsF,EAAQomB,GAAQjiB,EAAMuH,OAAO,iBAAiB,EAA9BvH,CAAoCzJ,IAEpD4P,EAAS,GACT+d,EAAgBlkB,EAAMuH,OAAO,oBAC7B4c,EAAcnkB,EAAMuH,OAAO,kBAC3B6c,EAAiBpkB,EAAMuH,OAAO,qBAEzB3B,EAAM,EAAGA,EAAM/J,EAAMrE,OAAQoO,IAClCO,EAAO7I,KAAK,CACRkH,MAAO2f,EAAYtoB,EAAM+J,IACzBjB,SAAUyf,EAAevoB,EAAM+J,IAC/BsH,QAASwO,SAASwI,EAAcroB,EAAM+J,IAAO,MAIrD,OAAOO,GAEXke,WAAY,SAAS9tB,EAAM6W,GACvB7W,EAAOyJ,EAAMuH,OAAO,mCAAqC,EAAlDvH,CAAwDzJ,GAK/D,IAJA,IAAIoF,EAAOsmB,GAAQjiB,EAAMuH,OAAO,OAAO,EAApBvH,CAA0BzJ,IAEzC4P,EAAS,GAEJP,EAAM,EAAGA,EAAMjK,EAAKnE,OAAQoO,IAAO,CACxC,IAAI0e,EAAM,GACV,IAAK,IAAI3rB,KAAOyU,EACZkX,EAAI3rB,GAAOyU,EAAQzU,GAAKgD,EAAKiK,IAEjCO,EAAO7I,KAAKgnB,GAGhB,OAAOne,GAEXM,SAAU,SAASlQ,GACf,OAAOJ,KAAKkuB,WAAW9tB,EAAMqsB,GAAoBnc,WAErDgX,KAAM,SAASlnB,GACX,OAAOJ,KAAKkuB,WAAW9tB,EAAMqsB,GAAoBnF,OAErDpM,YAAa,SAAS9a,GAClB,OAAOJ,KAAKkuB,WAAW9tB,EAAMqsB,GAAoBvR,cAErDC,OAAQ,SAAS/a,GACb,OAAOJ,KAAKkuB,WAAW9tB,EAAMqsB,GAAoBtR,SAErDhI,WAAY,SAAS/S,GACjB,OAAOJ,KAAKkuB,WAAW9tB,EAAMqsB,GAAoBtZ,aAErD6H,MAAO,SAAS5a,GACZ,OAAOJ,KAAKkuB,WAAW9tB,EAAMqsB,GAAoBzR,QAErDC,SAAU,SAAS7a,GACf,OAAOJ,KAAKkuB,WAAW9tB,EAAMqsB,GAAoBxR,WAErDtL,QAAS,SAASvP,GACd,OAAOJ,KAAKkuB,WAAW9tB,EAAMqsB,GAAoB9c,YAIzDxE,GAAO,EAAMtB,EAAMO,KAAM,CACtBkW,gBAAiBA,GACjBxF,kBAAmBA,GACnBmQ,cAAeA,GACfoC,eAAgBA,GAChBpa,iBAAkBA,GAClBmb,WAAY,CACRC,KAAMpD,IAEVqD,QAAS,CACLD,KAAMhB,MAIb,IAcIkB,GAAa,SAASC,EAAavgB,GAGnC,IAFA,IAAI+B,EAAS,GAEJP,EAAM,EAAGpO,EAASmtB,EAAYntB,OAAQoO,EAAMpO,EAAQoO,IACrD+e,EAAY/e,GAAK4B,QAAUpD,GAC3B+B,EAAO7I,KAAKqnB,EAAY/e,IAIhC,OAAOO,GAGXnG,EAAME,GAAG0kB,mBAAqBpkB,EAAOc,OAAO,CACxC+H,KAAM,SAAStQ,EAAS1C,GACpB,IAAIqc,EAAOvc,KAWX,GATAqK,EAAOiR,GAAGpI,KAAK/Q,KAAKoa,EAAM3Z,EAAS1C,GAEnCqc,EAAK3Z,QAAQ8rB,SAAS,mBAEtBnS,EAAKsN,WAAahgB,EAAMO,KAAKkW,gBAAgB7W,OAAOvJ,EAAQ2pB,YAE5DtN,EAAKoS,gBAAkBpS,EAAKqS,QAAQnc,KAAK8J,GACzCA,EAAKsN,WAAWnpB,MAAM2L,EAAQkQ,EAAKoS,kBAE9BzuB,EAAQ2uB,SAAU,CACnB,IAAIC,EAAU,GAEVvS,EAAKrc,QAAQ6uB,UACbD,EAAU,gDAAqDjlB,EAAME,GAAG9F,KAAK,KAAQ,WAGzFsY,EAAKrc,QAAQ2uB,SAAW,SAAUzkB,GAAQ,MACpC,qFAA0FP,EAAQ,GAAI,UAAaO,EAAK6D,MAAQ7D,GADrF,6DAGDA,EAAK6D,MAAQ7D,GAHZ,8CAKL0kB,EALK,kBASrDvS,EAAKsS,SAAWhlB,EAAMglB,SAAStS,EAAKrc,QAAQ2uB,UAC5CtS,EAAKyS,cAAgBnlB,EAAMglB,SAAStS,EAAKrc,QAAQ8uB,eAEjDzS,EAAK0S,YAEL1S,EAAK3Z,QAAQssB,GAAG,QAAUtiB,EAAI,sBAAuB,SAAS8U,GAC1D,IAAI1f,EAAS2H,EAAE+X,EAAE1f,QAAQE,QAAQ,kBAC7BitB,EAASntB,EAAOE,QAAQ,kBACxB+L,EAAOjM,EAAOE,QAAQ,IAAM2H,EAAMulB,KAAK,QAAU,KACnCA,KAAKvlB,EAAMulB,KAAK,SAElC,GAAKnhB,EAIL,GAAIkhB,EAAOE,SAAS,oBAChB9S,EAAKvZ,OAAOiL,QAIhB,KAAIjM,EAAOE,QAAQ,mBAAmBb,OAAS,IAI3Ckb,EAAKrc,QAAQovB,SAAU,CACvB,IAAIC,EAAgB5lB,EAAE+X,EAAE8N,eAAettB,QAAQ,kBAAkBZ,KAAK,+CAA+CD,OAAS,OAAS,MAEvIkb,EAAKpC,KAAK,CACN9I,MAAOpD,EACP6D,IAAKyd,SAKbrvB,EAAQuvB,YAAcvvB,EAAQovB,YAC9B/S,EAAKmT,UAAY,IAAI3lB,EAAG4lB,eAAepT,EAAK3Z,QAAS,CACjDgtB,SAAUrT,EAAKrc,QAAQ0vB,SAASF,UAChC/W,OAAQ,uBACR8W,WAAYvvB,EAAQuvB,WACpBH,SAAUpvB,EAAQovB,SAClBzF,WAAYtN,EAAKsN,cAIzBtN,EAAKqS,WAGT1uB,QAAS,CACL+N,KAAM,qBACN4gB,SAAU,KACVY,YAAY,EACZH,UAAU,EACVN,cAAe,SAAU5kB,GAAQ,MAAQ,wBAA0BA,EAAO,UAC1EylB,QAAS,UACTd,SAAS,EACTa,SAAU,CACNE,MAAO,qBAGfC,cAAe,SAASlG,GACpB7pB,KAAK6pB,WAAWmG,OAAO3jB,EAAQrM,KAAK2uB,iBACpC3uB,KAAK6pB,WAAa7pB,KAAKE,QAAQ2pB,WAAaA,EAExC7pB,KAAK0vB,WACL1vB,KAAK0vB,UAAUK,cAAclG,GAEjCA,EAAWnpB,MAAM2L,EAAQrM,KAAK2uB,iBAE9B3uB,KAAK4uB,WAGTK,UAAW,WACP,IAAI1S,EAAOvc,KAEPuc,EAAKrc,QAAQ6uB,UACb/uB,KAAKsvB,SAAWtvB,KAAK4C,QAAQqtB,cAAc,CACvCC,YAAalwB,KAAKE,QAAQgwB,YAC1BC,KAAM5T,EAAKrc,QAAQiwB,KACnBxX,OAAQ,mBACRyX,OAAQ,OACR1uB,MAAO,SAASggB,GACZA,EAAElP,KAAKkL,QAAQ,SAASA,QAAQ,SAEpC2S,OAAQ,SAAS3O,GACb,IAAIzT,EAAOyT,EAAElP,KAAK4c,KAAKvlB,EAAMulB,KAAK,SAElB,WAAZ1N,EAAEyN,OACF5S,EAAK+T,IAAIriB,GACU,UAAZyT,EAAEyN,OACT5S,EAAKvZ,OAAOiL,GACO,QAAZyT,EAAEyN,QACT5S,EAAKgU,KAAKtiB,EAAMyT,EAAE8O,aAG3BpmB,KAAK,mBAIhBqmB,OAAQ,SAASrmB,GACb,MAAqB,QAAdA,EAAK2E,MAAkB3E,EAAKuE,SAGvC+hB,SAAU,SAAStmB,GACf,IAAIumB,EAA0B,GAAbvmB,EAAK2E,MAAa,eAAgB3E,GAAQpK,KAAKywB,OAAOrmB,GAEvE,GAAIumB,EACA,MAAgC,aAAzB3wB,KAAKE,QAAQ2vB,QAGxB,GAA6B,aAAzB7vB,KAAKE,QAAQ2vB,QACb,OAAOc,EAGX,IAAI/Z,EAAQ5W,KAAK6pB,WAAW7pB,KAAKE,QAAQ2vB,WACrC5hB,EAAO7D,EAAK8S,kBAAoB9S,EAAKsI,WACzC,QAAIvO,GAAQ8J,EAAM2I,IAAU,MAKxBzS,GAAQ8J,EADZ2I,EAAQ5W,KAAK6pB,WAAoC,YAAzB7pB,KAAKE,QAAQ2vB,QAAwB,OAAS,eAC1C,IAOhCS,IAAK,SAASriB,GACV,IACI/G,EAAGuiB,EADH7S,EAAQ5W,KAAK6pB,WAAW7pB,KAAKE,QAAQ2vB,WAKzC,IAAK3oB,EAAI,EAAGuiB,GAFZxb,EAAOnN,MAAM8vB,QAAQ3iB,GAAQA,EAAKiB,MAAM,GAAK,CAACjB,IAEzB5M,OAAQ6F,EAAIuiB,EAAGviB,KACC,IAA7B/C,GAAQ8J,EAAK/G,GAAI0P,KACjB3I,EAAKkY,OAAOjf,EAAG,GACfA,GAAK,EACLuiB,GAAK,GAITxb,EAAK5M,SACLuV,EAAQA,EAAMxP,OAAO6G,GACrBjO,KAAK6pB,WAAW7pB,KAAKE,QAAQ2vB,SAASjZ,KAI9C2Z,KAAM,SAAStiB,EAAM/J,GACjB,IAAI0S,EAAQ5W,KAAK6pB,WAAW7pB,KAAKE,QAAQ2vB,WACrCpgB,EAAMtL,GAAQ8J,EAAM2I,GAEpBnH,GAAO,IACPxB,EAAO2I,EAAMuP,OAAO1W,EAAK,GAAG,GAE5BmH,EAAMuP,OAAOjiB,EAAO,EAAG+J,GAEvBjO,KAAK6pB,WAAW7pB,KAAKE,QAAQ2vB,SAASjZ,KAI9C5T,OAAQ,SAASiL,GACb,IAAI2I,EAAQ5W,KAAK6pB,WAAW7pB,KAAKE,QAAQ2vB,WACrCpgB,EAAMtL,GAAQ8J,EAAM2I,GACpBia,EAAkB7wB,KAAK6pB,WAAW1P,OAClCxB,EAAS3Y,KAAK6pB,WAAWlR,SAEzBlJ,GAAO,IACHkJ,IACAA,EAAOE,QAAU0V,GAAW5V,EAAOE,QAAS5K,GAC5CjO,KAAK6pB,WAAWnR,QAAQG,QAAUF,EAAOE,QACpCF,EAAOE,QAAQxX,SAChBrB,KAAK6pB,WAAWnR,QAAU,OAG9BmY,IACAA,EAAkBtC,GAAWsC,EAAiB5iB,GAC9CjO,KAAK6pB,WAAWiH,MAAQD,GAE5Bja,EAAMuP,OAAO1W,EAAK,GAClBzP,KAAK6pB,WAAW7pB,KAAKE,QAAQ2vB,SAASjZ,KAI9CuD,KAAM,SAASvB,GACX,IAAI0W,EAAWtvB,KAAKE,QAAQovB,SAExByB,IAD2B,IAAbzB,GAAqBA,EAAS0B,cACL,QAAbpY,EAAK9G,IAE/B0c,EAAexuB,KAAK6pB,WAAW1P,QAAU,GACzCnK,EAASue,GAAWC,EAAa5V,EAAKvH,OAEtC0f,GAAYvC,EAAYntB,SAAW2O,EAAO3O,SAC1CuX,EAAO,MAGPA,GACA5I,EAAO7I,KAAKyR,GAGhB5Y,KAAK6pB,WAAW1P,KAAKnK,IAGzB4e,QAAS,WACL,IAIIpc,EAJAye,EAAO,GACPra,EAAQ5W,KAAK6pB,WAAW7pB,KAAKE,QAAQ2vB,WACrCxuB,EAASuV,EAAMvV,OACfoO,EAAM,EAGV,GAAIpO,EACA,KAAOoO,EAAMpO,EAAQoO,IAEjB+C,GADAA,EAAOoE,EAAMnH,IACDxB,OAASrE,EAAc,CAAEqE,KAAMuE,GAASA,EAEpDye,GAAQjxB,KAAK6uB,SAAS1jB,EAAO,CAAE+lB,SAAUlxB,KAAKmxB,UAAU3e,EAAKvE,OAASuE,SAG1Eye,EAAOjxB,KAAKgvB,cAAchvB,KAAKE,QAAQ0vB,SAASE,OAGpD9vB,KAAK4C,QAAQquB,KAAKA,IAGtBxW,QAAS,WACLpQ,EAAOiR,GAAGb,QAAQtY,KAAKnC,MAEvBA,KAAK6pB,WAAWmG,OAAO3jB,EAAQrM,KAAK2uB,iBACpC3uB,KAAK4C,QAAQwuB,IAAIxkB,GAEb5M,KAAKsvB,UACLtvB,KAAKsvB,SAAS7U,UAGdza,KAAK0vB,WACL1vB,KAAK0vB,UAAUjV,UAGnBza,KAAK4C,QAAU,KACf5C,KAAK2uB,gBAAkB,MAG3BwC,UAAW,SAASljB,GAChB,IACI2K,EA1SG,SAAS4V,EAAavgB,GACjC,IAAKugB,EACD,OAAO,KAGX,IAAK,IAAI/e,EAAM,EAAGpO,EAASmtB,EAAYntB,OAAQoO,EAAMpO,EAAQoO,IACzD,GAAI+e,EAAY/e,GAAK4B,QAAUpD,EAC3B,OAAOugB,EAAY/e,GAI3B,OAAO,KA+RQ4hB,CADOrxB,KAAK6pB,WAAW1P,OACDxJ,GAAQ1C,IACrChK,EAAO,GAMX,OAJI2U,IACA3U,EAAO,QAAU2U,EAAK9G,KAGnB7N,KAIf4F,EAAME,GAAGunB,qBAAuBjnB,EAAOc,OAAO,CAC1C+H,KAAM,SAAStQ,EAAS1C,GACpB,IAAIqc,EAAOvc,KAEXqK,EAAOiR,GAAGpI,KAAK/Q,KAAKoa,EAAM3Z,EAAS1C,GAEnCqc,EAAKsN,WAAahgB,EAAMO,KAAK0Q,kBAAkBrR,OAAOvJ,EAAQ2pB,YAE9DtN,EAAKoS,gBAAkBpS,EAAKqS,QAAQnc,KAAK8J,GACzCA,EAAKsN,WAAWnpB,MAAM2L,EAAQkQ,EAAKoS,iBAEnCpS,EAAKsS,SAAWhlB,EAAMglB,SAAStS,EAAKrc,QAAQ2uB,UAE5CtS,EAAK0S,YAEL1S,EAAK3Z,QAAQssB,GAAG,QAAUtiB,EAAI,mCAAmC,SAAS8U,GACtE,IACI6P,EADS5nB,EAAE+X,EAAE1f,QAAQE,QAAQ,kBACbA,QAAQ,WACxB+L,EAAOsjB,EAAOjwB,KAAK,iBAAiBkwB,OAEnCvjB,IAILsO,EAAKvZ,OAAOiL,GACZsjB,EAAOvuB,SACPuZ,EAAKmB,QAAQ,SAAU,CAAEzP,KAAMA,QAG/BsO,EAAKrc,QAAQuxB,aACblV,EAAK3Z,QAAQssB,GAAG,UAAYtiB,EAAI,WAAW,SAAS7K,GAChD,IAAI2vB,EAAO/nB,EAAE5H,EAAGC,QACZQ,EAAMT,EAAG4vB,QACT1jB,EAAOyjB,EAAKpwB,KAAK,iBAAiBkwB,OAEtC,GAAIhvB,IAAQ4I,EAAKwmB,QAAUpvB,IAAQ4I,EAAKymB,UAAW,CAC/C,IAAIxM,EAAc9I,EAAKrc,QAAQ4xB,uBAAyBvV,EAAKrc,QAAQ4xB,uBAAuBtxB,SAAS2D,QAAQutB,EAAK,KAAO,EAEzH,GADAA,EAAKpwB,KAAK,mCAAmCoc,QAAQ,UAChDnB,EAAKrc,QAAQ4xB,uBACd,OAGJvV,EAAKrc,QAAQ4xB,uBAAuBnvB,aAChC4Z,EAAKrc,QAAQ4xB,uBAAuBtxB,SAAS6kB,EAAc,SAE5D,GAAI7iB,IAAQ4I,EAAK2mB,MAAQhwB,EAAGiwB,OAC/BN,EAAKpwB,KAAK,6CAA6Coc,QAAQ,cAC5D,GAAI3b,EAAGuF,SAAWvF,EAAGkwB,SACxB,GAAIzvB,GAAO4I,EAAK8mB,KAAM,CAGlB,GAFA3V,EAAKgU,KAAKtiB,EAAM+W,KAAKjS,IAAI,EAAG2e,EAAKxtB,QAAU,KAEtCqY,EAAKrc,QAAQ4xB,uBACd,OAGJvV,EAAKrc,QAAQ4xB,uBAAuBnvB,aAChC4Z,EAAK3Z,QAAQtB,KAAK,yBACbqX,QAAO,SAAUpS,EAAKhF,GAAM,OAAOoI,EAAEpI,GAAIiwB,QAAUvjB,KACnD/L,QAAQ,WAAW,SAEzB,GAAIM,GAAO4I,EAAK+mB,MAAO,CAG1B,GAFA5V,EAAKgU,KAAKtiB,EAAM+W,KAAKhS,IAAI0e,EAAKxtB,QAAU,EAAGwtB,EAAKH,SAASjwB,KAAK,aAAaD,OAAS,KAE/Ekb,EAAKrc,QAAQ4xB,uBACd,OAGJvV,EAAKrc,QAAQ4xB,uBAAuBnvB,aAChC4Z,EAAK3Z,QAAQtB,KAAK,yBACbqX,QAAO,SAAUpS,EAAKhF,GAAM,OAAOoI,EAAEpI,GAAIiwB,QAAUvjB,KACnD/L,QAAQ,WAAW,SAEzB,GAAKM,GAAO4I,EAAKgnB,IAA8B,QAAxB7V,EAAKrc,QAAQ2vB,SACtCrtB,GAAO4I,EAAK2mB,MAAgC,WAAxBxV,EAAKrc,QAAQ2vB,QAAuB,CAEzD,IAAIwC,EAAc9V,EAAK+S,SAASpvB,QAAQgwB,YAAY9lB,KAAK,6BACzD,IAAKioB,EACD,OAKJ,GAFA9V,EAAKvZ,OAAOiL,GACZokB,EAAY/B,IAAIriB,IACXsO,EAAKrc,QAAQ4xB,uBACd,OAGJvV,EAAKrc,QAAQ4xB,uBAAuBnvB,aAChC0vB,EAAYzvB,QAAQtB,KAAK,WAAWX,OAAO,SAO3DT,EAAQuvB,YAAcvvB,EAAQovB,YAC9B/S,EAAKmT,UAAY,IAAI3lB,EAAGuoB,iBAAiB/V,EAAK3Z,QAAS,CACnDgtB,SAAUrT,EAAKrc,QAAQ0vB,SAASF,UAChCD,WAAYvvB,EAAQuvB,WACpB9W,OAAQ,4CACR2W,SAAUpvB,EAAQovB,SAClBzF,WAAYtN,EAAKsN,cAIzBtN,EAAKqS,WAGT2D,OAAQ,CAAC,UAETryB,QAAS,CACL+N,KAAM,uBACN4gB,SAAU,KACVY,YAAY,EACZH,UAAU,EACVO,QAAS,UACTd,SAAS,EACTa,SAAU,CACNE,MAAO,qBAGfC,cAAe,SAASlG,GACpB7pB,KAAK6pB,WAAWmG,OAAO3jB,EAAQrM,KAAK2uB,iBACpC3uB,KAAK6pB,WAAa7pB,KAAKE,QAAQ2pB,WAAaA,EAExC7pB,KAAK0vB,WACL1vB,KAAK0vB,UAAUK,cAAclG,GAEjCA,EAAWnpB,MAAM2L,EAAQrM,KAAK2uB,iBAE9B3uB,KAAK4uB,WAGT4D,YAAa,WACLxyB,KAAKyyB,aAAe7oB,IACpB5J,KAAK6pB,WAAWiH,MAAQ9wB,KAAKyyB,WAC7BzyB,KAAKyyB,WAAa7oB,GAGlB5J,KAAK0yB,eAAiB9oB,IACtB5J,KAAK6pB,WAAWnR,QAAU1Y,KAAK0yB,aAC/B1yB,KAAK0yB,aAAe9oB,GAGxB5J,KAAK6pB,WAAW,IAAM7pB,KAAKE,QAAQ2vB,SAAoC,aAAzB7vB,KAAKE,QAAQ2vB,QAAyBnhB,GAAkB1O,KAAK2yB,aAAe3jB,GAAiBhP,KAAK2yB,cAGpJC,eAAgB,WACZ5yB,KAAKyyB,WAAa7oB,EAClB5J,KAAK0yB,aAAe9oB,EACpB5J,KAAK2yB,YAAc9oB,EAAMgpB,WAAW,GAAI7yB,KAAK8yB,eAC7C9yB,KAAK+yB,WAGTC,OAAQ,SAASC,EAAUC,GACvB,IAAI3W,EAAOvc,KAEX,IAAKizB,EACD,OAAO1W,EAAKoW,aAAe,GAEtBpW,EAAKoW,cAAeO,IACrB3W,EAAKuW,cAAgBjpB,EAAMgpB,WAAW,GAAII,IAE9C1W,EAAKoW,YAAc9oB,EAAMgpB,WAAW,GAAII,IAIhDhE,UAAW,WACP,IAAI1S,EAAOvc,KAEXA,KAAKsvB,SAAWtvB,KAAK4C,QAAQqtB,cAAc,CACvCC,YAAalwB,KAAKE,QAAQgwB,YAC1BC,KAAM5T,EAAKrc,QAAQiwB,KACnBxX,OAAQ,mBACRyX,OAAQ,OACR1uB,MAAO,SAASggB,GACZA,EAAElP,KAAKrP,QAAQgwB,QAEnB9C,OAAQ,SAAS3O,GACb,IAAIzT,EAAOyT,EAAElP,KAAKlR,KAAK,iBAAiBkwB,OAExB,WAAZ9P,EAAEyN,OACF5S,EAAK+T,IAAIriB,GACU,UAAZyT,EAAEyN,OACT5S,EAAKvZ,OAAOiL,GACO,QAAZyT,EAAEyN,QACT5S,EAAKgU,KAAKtiB,EAAMyT,EAAE8O,aAG3BpmB,KAAK,kBAGZkmB,IAAK,SAASriB,GACV,IACI/G,EAAGuiB,EADH7S,EAAQ5W,KAAKgzB,SAKjB,IAAK9rB,EAAI,EAAGuiB,GAFZxb,EAAOnN,MAAM8vB,QAAQ3iB,GAAQA,EAAKiB,MAAM,GAAK,CAACjB,IAEzB5M,OAAQ6F,EAAIuiB,EAAGviB,KACC,IAA7B/C,GAAQ8J,EAAK/G,GAAI0P,KACjB3I,EAAKkY,OAAOjf,EAAG,GACfA,GAAK,EACLuiB,GAAK,GAITxb,EAAK5M,SACLuV,EAAQA,EAAMxP,OAAO6G,GACrBjO,KAAKgzB,OAAOpc,GACZ5W,KAAK+yB,YAIbxC,KAAM,SAAStiB,EAAM/J,GACjB,IAAI0S,EAAQ5W,KAAKgzB,SACbvjB,EAAMtL,GAAQ8J,EAAM2I,GAEpBnH,GAAO,IACPxB,EAAO2I,EAAMuP,OAAO1W,EAAK,GAAG,GAE5BmH,EAAMuP,OAAOjiB,EAAO,EAAG+J,GAEvBjO,KAAKgzB,OAAOpc,GACZ5W,KAAK+yB,YAIb/vB,OAAQ,SAASiL,GACb,IAAI2I,EAAQ5W,KAAKgzB,SACbvjB,EAAMtL,GAAQ8J,EAAM2I,GACpBia,EAAkB7wB,KAAK6pB,WAAW1P,OAClCxB,EAAS3Y,KAAK6pB,WAAWlR,SAEzBlJ,GAAO,IACHkJ,IACAA,EAAOE,QAAU0V,GAAW5V,EAAOE,QAAS5K,GAC5CjO,KAAKozB,aAAepzB,KAAK6pB,WAAWnR,QACpC1Y,KAAKozB,aAAava,QAAUF,EAAOE,QAC9BF,EAAOE,QAAQxX,SAChBrB,KAAKozB,aAAe,OAGxBvC,IACAA,EAAkBtC,GAAWsC,EAAiB5iB,GAC9CjO,KAAKyyB,WAAa5B,GAEtBja,EAAMuP,OAAO1W,EAAK,GAClBzP,KAAKgzB,OAAOpc,GACZ5W,KAAK+yB,YAIbM,YAAa,SAASC,GAEdA,EADOtzB,KAEF4C,QAAQquB,KAAKjxB,KAAKE,QAAQ0vB,SAASE,OACnCpB,SAAS,0BACT6E,YAAY,eAJVvzB,KAMF4C,QACA2wB,YAAY,0BACZ7E,SAAS,gBAItBqE,QAAS,WACL,IAAInc,EAAQ5W,KAAKgzB,UAAY,GAC7BhzB,KAAKqzB,aAAazc,EAAMvV,QACpBuV,EAAMvV,QACNrB,KAAK4C,QAAQquB,KAAKjxB,KAAKwzB,aAAa5c,KAI5C4c,aAAc,SAAS5c,GACnB,IAAIpE,EACAye,EAAO,GACPxhB,EAAM,EACNvP,EAAUF,KAAKE,QACf6uB,GAAU,EAMd,GAJ4B,YAAxB/uB,KAAKE,QAAQ2vB,UACbd,EAAU7uB,EAAQuvB,YAAcvvB,EAAQovB,UAGxC1Y,EAAMvV,OACN,KAAOoO,EAAMmH,EAAMvV,OAAQoO,IAEvB+C,GADAA,EAAOoE,EAAMnH,IACDxB,OAASrE,EAAc,CAAEqE,KAAMuE,GAASA,EAEpDye,GAAQjxB,KAAK6uB,SAAS,CAAE5gB,KAAMuE,EAAKvE,KAAMwlB,YAAa1E,IAG9D,OAAOkC,GAGXrC,QAAS,WACL,IAAI5uB,KAAK6pB,WAAW/K,gBAApB,CAGA,IAAIlI,EAAQ5W,KAAK6pB,WAAW7pB,KAAKE,QAAQ2vB,WACzC7vB,KAAKgzB,OAAOpc,GAAO,GACnB5W,KAAKqzB,aAAarzB,KAAKgzB,SAAS3xB,QAC5BuV,EAAMvV,QACNrB,KAAK4C,QAAQquB,KAAKjxB,KAAKwzB,aAAa5c,MAI5C6D,QAAS,WACLpQ,EAAOiR,GAAGb,QAAQtY,KAAKnC,MAEvBA,KAAK6pB,WAAWmG,OAAO3jB,EAAQrM,KAAK2uB,iBACpC3uB,KAAK4C,QAAQwuB,IAAIxkB,GAEb5M,KAAKsvB,UACLtvB,KAAKsvB,SAAS7U,UAGdza,KAAK0vB,WACL1vB,KAAK0vB,UAAUjV,UAGnBza,KAAK4C,QAAU,KACf5C,KAAK2uB,gBAAkB,QAI/B,IAAI+E,GAA0BrpB,EAAOc,OAAO,CACxC+H,KAAM,SAAStQ,EAAS1C,GACpB,IAAIqc,EAAOvc,KACXqK,EAAOiR,GAAGpI,KAAK/Q,KAAKoa,EAAM3Z,EAAS1C,GACnCqc,EAAK3Z,QAAU+G,EAAE/G,GAEjB2Z,EAAKoX,WACLpX,EAAKqX,iBAGT1zB,QAAS,CACL+N,KAAM,0BACNujB,KAAM,kBACNqC,aAAc,IAGlBpZ,QAAS,WACLza,KAAK4C,QAAQwuB,IAAIxkB,IAGrBknB,WAAY,SAAS5zB,GAEjB2J,EAAMgpB,WADK7yB,KACWE,QAASA,GAC/BF,KAAKkT,KAAKlT,KAAK4C,QAAS5C,KAAKE,UAGjC6zB,OAAQ,WACJ,IAIIC,EAJA5E,EAAOvlB,EAAMulB,KAAK,QAClB6E,EAAUj0B,KAAK4C,QACdV,QAAQ,IAAMktB,EAAO,oBACrB9tB,KAAK,IAAM8tB,EAAO,iBAGvBzlB,EAAE,IAAM3J,KAAKE,QAAQ2zB,cAAcK,YAAY,YAE3CD,EAAQ5yB,UACR2yB,EAAQC,EAAQE,uBACVC,mBACNJ,EAAMK,sBAIdT,cAAe,WACX5zB,KAAK4C,QAAQssB,GAAG,QAAUtiB,EAAI5M,KAAK+zB,OAAOthB,KAAKzS,QAGnD2zB,SAAU,WACN,IAAIzzB,EAAUF,KAAKE,QACnBF,KAAK4C,QAAQ8rB,SAAS,mCACtB1uB,KAAK4C,QAAQquB,KAAKpnB,EAAMqI,OAAO,wDAAwDhS,EAAQsxB,UAInG8C,GAAiBjqB,EAAOc,OAAO,CAC/B+H,KAAM,SAAStQ,EAAS1C,GACpB,IAAIqc,EAAOvc,KACXqK,EAAOiR,GAAGpI,KAAK/Q,KAAKoa,EAAM3Z,EAAS1C,GACnCqc,EAAK3Z,QAAU+G,EAAE/G,GACjB2Z,EAAKrc,QAAUA,EAGfqc,EAAKgY,eAGTr0B,QAAS,CACL+N,KAAM,iBACNumB,qBAAsB,QAG1BV,WAAY,SAAS5zB,GAEjB2J,EAAMgpB,WADK7yB,KACWE,QAASA,GAC/BF,KAAKkT,KAAKlT,KAAK4C,QAAS5C,KAAKE,UAGjCq0B,YAAa,WACT,IACIE,EADAv0B,EAAUF,KAAKE,QAInB,OAFAF,KAAK4C,QAAQ2wB,YAAY,qEAEjBrzB,EAAQs0B,sBACZ,IAAK,QAYL,QACIC,EAAY,mBAVhB,IAAK,OACDA,EAAY,qBACZ,MACJ,IAAK,SACDA,EAAY,gBACZ,MACJ,IAAK,MACDA,EAAY,wBAMpBz0B,KAAK4C,QACA8rB,SAAS,2BACTA,SAAS+F,MAIlBC,GAAcrqB,EAAOc,OAAO,CAC5B+H,KAAM,SAAStQ,EAAS1C,GACpB,IAAIqc,EAAOvc,KAEXqK,EAAOiR,GAAGpI,KAAK/Q,KAAKoa,EAAM3Z,EAAS1C,GAEnCqc,EAAKoY,cAELpY,EAAKqY,oBAELrY,EAAKsY,QAAUtY,EAAK3Z,QAAQwsB,KAAK,OAASvlB,EAAMirB,OAChDvY,EAAKwY,WAELxY,EAAKyY,sBAAwBrrB,EAAE,kDAC/B4S,EAAK0Y,mBAAqBtrB,EAAE,+CAC5B4S,EAAK2Y,gBAAkBvrB,EAAE,0CAEzB4S,EAAK4Y,QAAQC,OAAO7Y,EAAKyY,uBACzBzY,EAAK4Y,QAAQC,OAAO7Y,EAAK0Y,oBACzB1Y,EAAK4Y,QAAQC,OAAO7Y,EAAK2Y,iBAEzB3Y,EAAK8Y,eAAiB,IAAIC,GAAkB,CAAEzG,SAAU7uB,KAAKE,QAAQq1B,qBAAsBnb,KAAM,UAAWob,OAAQjZ,EAAKsY,UACzHtY,EAAKkZ,YAAc,IAAIH,GAAkB,CAAEzG,SAAU7uB,KAAKE,QAAQw1B,kBAAmBtb,KAAM,OAAQob,OAAQjZ,EAAKsY,UAChHtY,EAAKoZ,gBAAkB,IAAIC,GAAkB,CAAE/G,SAAU7uB,KAAKE,QAAQ21B,kBAAoBtnB,GAAmBinB,OAAQjZ,EAAKsY,UAE1HtY,EAAKuZ,cACLvZ,EAAK0Y,mBACA3E,IAAI/T,EAAKyY,uBACT9F,GAAG,QAAS,+BAA+B,WACxC,IAAI6G,EAASpsB,EAAE3J,MACX2X,EAAOoe,EAAOxE,SAASnC,KAAKvlB,EAAMulB,KAAK,QACvC1hB,EAAWqoB,EAAOC,GAAG,uCACrBC,EAA8D,IAAtDF,EAAO7zB,QAAQ,4BAA4Bb,OACnD60B,EAAQve,EAAK5F,MAAM,KACnBokB,EAAYzoB,EAAWC,EAAiBX,EAE5C,IAAIuP,EAAKmB,QAAQyY,EAAW,CAAExe,KAAMue,EAAO7lB,KAAM4lB,EAAQ,OAAS,YAAlE,CAIA,IAAIG,EAAiB,CACjBrnB,KAAM,wBACNsnB,QAASH,EACTI,KAAML,EAAQ1Z,EAAKkZ,YAAYc,UAAYha,EAAK8Y,eAAekB,WAE/DC,EAAcP,EAAQ1Z,EAAKsN,WAAWlO,MAAQY,EAAKsN,WAAWnO,SAC9D+a,EAAavqB,EAAesqB,EAAaJ,GAE7C7Z,EAAKsN,WAAW/K,iBAAkB,EAE9BmX,EACA1Z,EAAKsN,WAAWrkB,KAAKixB,GAErBla,EAAKsN,WAAWrS,QAAQif,OAIhCla,EAAKrc,QAAQw2B,UACbna,EAAKsN,WAAWxN,QAGpBE,EAAKoa,QAEDpa,EAAKrc,QAAQuxB,aACblV,EAAKqa,2BAGT/sB,EAAMgtB,OAAOta,IAGjBgW,OAAQ,CACJzlB,EACAC,EACAC,EACAW,GAGJzN,QAAS,CACL+N,KAAM,cACNyoB,UAAU,EACVI,OAAQ,KACRC,YAAa,KACblD,aAAc,GACd0B,qBAAsB,KACtBG,kBAAmB,KACnBG,iBAAkB,KAClBjG,SAAU,CACNoH,eAAgB,yBAIxBvc,QAAS,WACL,IAAI8B,EAAOvc,KACXqK,EAAOiR,GAAGb,QAAQtY,KAAKoa,GAEnBA,EAAK0a,uBACLttB,EAAEG,QAAQsnB,IAAIjlB,EAASS,EAAI2P,EAAK0a,sBAChC1a,EAAK0a,qBAAuB,OAIpCN,MAAO,WACQ32B,KACN4C,QAAQwsB,KAAK,OAAQ,SAG9BwH,yBAA0B,WACtB,IAAIra,EAAOvc,KAEXuc,EAAK2a,WAAa,IAAI7tB,EAAoB,CAAElJ,SAAU,IACtDoc,EAAK2a,WAAWx1B,MAAM6a,EAAK3Z,QAAQ,IAEnC,IAAIu0B,EAAY5a,EAAK2a,WAAWx2B,MAE5By2B,GACAA,EAAUl0B,aAAa,WAAY,MAI3Cm0B,qBAAsB,SAASjC,GAC3B,IAAI5Y,EAAOvc,KACPq3B,EAAgBlC,EAAQn0B,iBACxB,6CAEAs2B,EAAiBD,EAAc,GAAUv2B,MAAMC,KAAKs2B,EAAc,GAAG3nB,UAAU5J,QAC/E,SAAUyxB,EAAKC,GAAQ,OAAQD,GAAwC,OAAjCC,EAAKC,aAAa,YAAuBD,EAAKC,aAAa,WAAa,KAC9G,GAFoC,GAIpCC,EAAgBvC,EAAQn0B,iBACxB,kCAEA22B,EAAiBxC,EAAQn0B,iBACzB,kCAEA42B,EAAkBzC,EAAQn0B,iBAAiB,0BAC3C+F,EAAYouB,EAAQh0B,cAAc,2BAEtC4F,EAAU9D,aAAa,eAAgBy0B,EAAcr2B,OAAO4J,YAC5DlE,EAAU9D,aAAa,eAAgBq0B,EAAcrsB,YAErD,IAAI4sB,EAAqBH,EAAc,GACnCI,EAA6BD,EAA0B/2B,MAAMC,KAAK82B,EAAmBnoB,UACpF/J,KAAI,SAAUpE,GAAM,OAAOA,EAAGk2B,aAAa,SAC3Cv2B,KAAK,KAF4C,GAGtD22B,EAAmB50B,aACf,YACE8D,EAAU0wB,aAAa,MAAS,IAAMK,GAG5CT,EAAcjyB,SAAQ,SAAUa,EAAK/B,GACjC,IAAI6zB,EAAgBxb,EAAKyb,aACrBl3B,MAAMC,KAAK62B,IACX,SAAUhyB,GACN,IAAIqyB,EAAUryB,EAAE6xB,aAAa,MAAM1lB,MAAM,KACzC,OAAOkmB,EAAQA,EAAQ52B,OAAS,MAAQ6C,EAAQ,GAAG+G,cAEvD,SAAUrF,GAAK,OAAOA,EAAE6xB,aAAa,SAGzCxxB,EAAIhD,aAAa,YAAa80B,EAAc72B,KAAK,SAGrD02B,EAAgBxyB,SAAQ,SAAU8yB,GAC9B,IAAID,EAAUC,EAAKT,aAAa,MAAM1lB,MAAM,KACxComB,GAAgBF,EAAQA,EAAQ52B,OAAS,GACzC+2B,EAAoB7b,EAAKyb,aACzBl3B,MAAMC,KAAK42B,IACX,SAAU/xB,GACN,IAAIqyB,EAAUryB,EAAE6xB,aAAa,MAAM1lB,MAAM,KACrCsmB,GAAsBJ,EAAQA,EAAQ52B,OAAS,GAC/Ci3B,GAAqB1yB,EAAE6xB,aAAa,WAOxC,OANsBU,IAAiBE,GAEnCC,EAAoB,GACpBD,EAAqBF,GACrBE,EAAqBC,EAAoB,GAAKH,KAItD,SAAUvyB,GAAK,OAAOA,EAAE6xB,aAAa,SAGzCS,EAAKj1B,aAAa,mBAAoBm1B,EAAkBl3B,KAAK,UAIrE82B,aAAc,SAASO,EAAKC,EAAWC,GACnC,OAAOF,EAAIzyB,QACP,SAAUyxB,EAAKC,GAAQ,OAAQgB,EAAUhB,GAAQD,EAAInwB,OAAQ,CAACqxB,EAAOjB,KAAUD,IAC/E,KAIR5C,YAAa,WACT,IAAIpY,EAAOvc,KACP6pB,EAAatN,EAAKrc,QAAQ2pB,WAE9BA,EAAa/oB,MAAM8vB,QAAQ/G,GAAc,CAAEzf,KAAMyf,GAAeA,EAE5DtN,EAAKsN,YAAc7pB,KAAK2uB,gBACxBpS,EAAKsN,WAAWmG,OAAO3jB,EAAQkQ,EAAKoS,iBACpBqB,OAAOzjB,EAAUgQ,EAAKmc,kBACtB1I,OAAO1jB,EAAOiQ,EAAKoc,gBAEnCpc,EAAKoS,gBAAkBpS,EAAKqS,QAAQnc,KAAK8J,GACzCA,EAAKmc,iBAAmBnc,EAAKqc,cAAcnmB,KAAK8J,GAChDA,EAAKoc,cAAgBpc,EAAKsc,OAAOpmB,KAAK8J,IAG1CA,EAAKsN,WAAahgB,EAAMO,KAAK0Q,kBAAkBrR,OAAOogB,GAC9BpX,KAAKpG,EAAQkQ,EAAKoS,iBAClBlc,KAAKlG,EAAUgQ,EAAKmc,kBACpBjmB,KAAKnG,EAAOiQ,EAAKoc,gBAG7CG,QAAS,WACL,IAliJAC,EADAC,EAmiJWh5B,KACNm1B,QAAQ,GAAG8D,MAAMC,YAAY,0BAA2BrvB,EAAMqI,OAAO,SApiJ1E8mB,EAAY,EAEZG,UAAYA,SAASC,iBACrBL,EAAMI,SAASC,cAAc,QAEzBH,MAAMI,QAAU,oEACpBN,EAAIO,UAAY,SAChBH,SAASI,KAAKC,YAAYT,GAE1BC,EAAYD,EAAIn0B,YAAcm0B,EAAIU,YAElCN,SAASI,KAAKG,YAAYX,IAGvBC,MAyhJPlD,YAAa,WACT,IAAIvZ,EAAOvc,KACP25B,EAAgBpd,EAAKyY,sBACrB4E,EAAard,EAAK0Y,mBAEtB1Y,EAAKuc,UACLvc,EAAK0a,qBAAuB1a,EAAKuc,QAAQrmB,KAAK8J,GAE9CA,EAAK2Y,gBAAgB7vB,QAAO,WACxBwE,EAAMnF,WAAWi1B,EAAe35B,KAAK0E,YACrCk1B,EAAW90B,UAAU9E,KAAK8E,cAG9B80B,EAAWnnB,KAAK,iBAAmB7F,EAAK,cAAgBA,EAAI2P,EAAKsd,aAAapnB,KAAK8J,IACnF5S,EAAEG,QAAQolB,GAAG/iB,EAASS,EAAI2P,EAAK0a,uBAGnC4C,aAAc,SAASnY,GACnB,IAAIA,EAAEpa,QAAN,CAIA,IAAIwyB,EAAQjwB,EAAMkwB,YAAYrY,GAC1B5c,EAAY9E,KAAKk1B,gBAAgBpwB,YAEjCg1B,IACApY,EAAErd,iBACFsF,EAAE+X,EAAE8N,eAAewK,IAAI,QAAUptB,GAAI,GAErC5M,KAAKi1B,mBAAmBnwB,UAAUA,GAAcg1B,GAChD95B,KAAKk1B,gBAAgBpwB,UAAUA,GAAcg1B,MAIrD/E,SAAU,WACN,IAAI+B,EAAS92B,KAAKE,QAAQ42B,OAE1B92B,KAAKm1B,QAAUn1B,KAAK4C,QAAQ8rB,SAAS,eACrC,IAAI3nB,EAAY4C,EAAG,4CAAkD3J,KAAY,QAAI,4DAAoEA,KAAKE,QAAQ0vB,SAAuB,eAAI,kBACjM5vB,KAAKm1B,QAAQC,OAAOruB,GAEhB+vB,GACA92B,KAAKm1B,QAAQ8E,IAAI,SAAUnD,IAInCoD,UAAW,SAASnG,GAChBlqB,EAAME,GAAGowB,SAASn6B,KAAKm1B,QAASpB,IAGpC8E,OAAQ,WACJ74B,KAAKk6B,WAAU,IAGnBtB,cAAe,WACX54B,KAAKk6B,WAAU,IAGnB7F,kBAAmB,WACf,IAAI9X,EAAOvc,KACXuc,EAAK4Y,QAAQ8E,IAAI,CACb,wBAAyBpwB,EAAMqI,OAAO,YAAaqK,EAAK0Y,mBAAmB3zB,KAAK,sBAAsB,GAAGsD,aACzG,qBAAsBiF,EAAMqI,OAAO,YAAaqK,EAAKyY,sBAAsB1zB,KAAK,sBAAsB,GAAG2D,iBAIjHmvB,iBAAkB,WACd,GAAKp0B,KAAKE,QAAQ62B,YAAlB,CAGA,IAAIqD,EAAep6B,KAAKk1B,gBAAgB5zB,KAAK,SACzC+4B,EAAcr6B,KAAKg1B,sBAAsBtlB,SAAS,SAClD4qB,EAAWt6B,KAAKi1B,mBAAmBvlB,SAAS,SAEhD0qB,EAAa9J,IAAI+J,GAAa/J,IAAIgK,GAAUh5B,KAAK,OAAOi5B,MAAMv6B,KAAKE,QAAQ62B,eAG/EnC,kBAAmB,WACf,IAAIf,EAAe7zB,KAAKE,QAAQ2zB,aAC5BA,GACAlqB,EAAEkqB,GAAc2G,yBAAyB,gBAAiBx6B,KAAK6pB,aAIvE4Q,kBAAmB,SAAS73B,GAGxB,OAFAA,EAAU+G,EAAE/G,GAEL5C,KAAK06B,SAAS93B,EAAQsB,QAAStB,EAAQ2uB,OAAO,MAAMrtB,UAG/Dw2B,SAAU,SAAS9iB,EAAa+M,GAC5B,IACIC,EACAxW,EAFAusB,EAAiB36B,KAAK21B,gBAI1B,OAAI/d,GAAe+iB,EAAeC,cAAgBhjB,EAAc,GAC5D+M,GAAYgW,EAAeE,WAAalW,EAAW,EAC5C,MAGXC,EAAYD,EAAWgW,EAAeC,aAAehjB,EAG9C,CACHkjB,aAHJ1sB,EAAWusB,EAAeI,KAAKnW,EAAY,EAAI,EAAIA,IAGzBkW,YACtBE,SAAU5sB,EAAS4sB,SACnB5sB,SAAUA,EAAShE,QAI3BwkB,QAAS,WACL,IAAIrS,EAAOvc,KAEP6pB,EAAatN,EAAKsN,WACtB,IAAItN,EAAKmB,QAAQ5Q,EAAa,CAAEqiB,OAAQ,WAAxC,CAIA,IAAI8L,EAAoBpxB,EAAMqxB,iBAAmBrxB,EAAMqxB,iBAAiB/tB,GAAK,KACzEguB,EAAyB5e,EAAK4Y,QAAQ7zB,KAAK,gBAAgB8tB,KAAK,MA0BpE,GAzBA7S,EAAK8Y,eAAe+F,UAAUvR,EAAW1J,eACzC5D,EAAKyY,sBAAsB/D,KAAK1U,EAAK8Y,eAAegG,SAEpD9e,EAAKkZ,YAAY2F,UAAUvR,EAAWzJ,YACtC7D,EAAK0Y,mBAAmBhE,KAAK1U,EAAKkZ,YAAY4F,SAE9C9e,EAAKoZ,gBAAgB2F,iBAAiB,CAClCC,kBAAmBhf,EAAK8Y,eAAemG,iBACvCC,eAAgBlf,EAAKkZ,YAAY+F,iBACjCE,oBAAqBnf,EAAK8Y,eAAesG,aACzCC,eAAgBrf,EAAKkZ,YAAYkG,aACjCvxB,KAAMyf,EAAWxJ,QAGrB9D,EAAK2Y,gBAAgBjE,KAAK1U,EAAKoZ,gBAAgB0F,SAG/C9e,EAAK6X,mBACL7X,EAAK8X,oBAEL9X,EAAK2d,WAAU,GAEf3d,EAAKmB,QAAQ3Q,GACbwP,EAAK6a,qBAAqB7a,EAAK4Y,QAAQ,IAElC5Y,EAAK2a,WAAV,CAIA,GAAIiE,GAA0B5e,EAAK3Z,QAAQtB,KAAM,IAAM65B,GAAyB95B,OAAS,EACrFkb,EAAK3Z,QAAQtB,KAAM,IAAM65B,GAAyB/L,KAAK,WAAY,SAChE,CACH,IAAI+H,EAAY5a,EAAK2a,WAAWx2B,MAE5By2B,GACAA,EAAUl0B,aAAa,WAAY,KAIvCg4B,GAAgE,GAA3CA,EAAkB92B,QAAQoY,EAAKsY,UACpDtY,EAAK2a,WAAWv0B,aAAa4Z,EAAK3Z,QAAQtB,KAAM,IAAM25B,GAAoB,SAKtFlxB,EAAG8xB,OAAOnI,IACV3pB,EAAG8xB,OAAOvH,IACVvqB,EAAG8xB,OAAOnH,IAEV,IAAIoH,GAAYzxB,EAAOc,OAAO,CAC1B+H,KAAM,SAAStQ,EAAS1C,GACpB,IACI67B,EACAC,EAFAzf,EAAOvc,KAIXqK,EAAOiR,GAAGpI,KAAK/Q,KAAKoa,EAAM3Z,EAAS1C,GAEnC2N,EAA2BhE,EAAMoyB,QAAQC,MAAM3f,EAAK3Z,SAAW,iBAAmB,kBAElF2Z,EAAKoY,cAELpY,EAAKqY,oBAELrY,EAAKwY,WACLxY,EAAK4f,gBAEL5f,EAAK8Y,eAAiB0G,EAAgB,IAAIK,GAC1C7f,EAAKkZ,YAAcuG,EAAa,IAAIK,GACpC9f,EAAKoZ,gBAAkB,IAAI2G,GAE3B/f,EAAKggB,aAELhgB,EAAKod,cACArJ,IAAI/T,EAAKqd,YACT1K,GAAG,QAAS,+BAA+B,WACxC,IAGIiH,EAHAJ,EAASpsB,EAAE3J,MACXw8B,EAAUT,EACV5M,EAAS,eAETxX,EAAOoe,EAAO3G,KAAKvlB,EAAMulB,KAAK,SAC9BqN,EAAY,CACZpsB,KAAM,UACNsH,KAAMhO,EAAE+yB,UAAU/kB,IAGlBoe,EAAOxE,SAASyE,GAAG,QACnBwG,EAAUR,EACV7M,EAAS,YACTsN,EAAUpsB,KAAO,QAGrB,IAAI3C,EAAWqoB,EAAOC,GAt9JR,+CAu9JVlP,EAAW0V,EAAQ1V,SAASnP,GAC5BglB,EAAU7V,EAASpZ,WAAa9D,EAEpCusB,EAAYzoB,EAAWC,EAAiBX,EACxCyvB,EAAUG,eAAiB9V,EAAS+V,YAAc/V,EAASpX,SAEvD6M,EAAKmB,QAAQyY,EAAWsG,KAI5BD,EAAQ1V,SAASnP,GAAMjK,UAAYA,EACnC7D,EAAME,GAAG9F,KAAK8xB,EAAO,CAAE9xB,KAAOyJ,EAAqCG,EAA1BD,KAEpCF,GAAYivB,EACbpgB,EAAKsN,WAAWsF,GAAQsN,EAAU9kB,MAElC4E,EAAKqS,cAIjBrS,EAAKuZ,cAEDvZ,EAAKrc,QAAQw2B,UACbna,EAAKsN,WAAWxN,QAGpBxS,EAAMgtB,OAAOta,IAGjBgW,OAAQ,CACJzlB,EACAC,EACAC,EACAW,GAGJzN,QAAS,CACL+N,KAAM,YACNyoB,UAAU,EACVoG,aAAa,EACbrN,YAAY,EACZH,UAAU,EACVmC,aAAa,EACbqF,OAAQ,KACRC,YAAa,IACblD,aAAc,GACd0B,qBAAsB,KACtBG,kBAAmB,KACnBG,iBAAkB,KAClBkH,kBAAmB,KACnBC,iBAAkB,KAClBpN,SAAU,CACNqN,cAAe,wBACfC,aAAc,0BACdC,UAAW,0BAInBZ,WAAY,WACR,IAAIa,EAAiBp9B,KAAKE,QAAQq1B,qBAC9B8H,EAAcr9B,KAAKE,QAAQw1B,kBAC3B4H,EAAet9B,KAAKE,QAAQ21B,iBAC5BkH,EAAoB/8B,KAAKE,QAAQ68B,kBACjCC,EAAmBh9B,KAAKE,QAAQ88B,iBAEpCh9B,KAAKq1B,eAAexG,SAAWhlB,EAAMglB,SAASuO,GAAkBtvB,EAAiB,CAAEyvB,eAAgBH,IACnGp9B,KAAK21B,gBAAgB2H,aAAezzB,EAAMglB,SAASyO,GAAgB/uB,GAAmB,CAAEgvB,eAAgBD,IACxGt9B,KAAK21B,gBAAgBoH,kBAAoBlzB,EAAMglB,SAASkO,GAAqB5uB,GAAoB,CAAEovB,eAAgBR,IACnH/8B,KAAK21B,gBAAgBqH,iBAAmBnzB,EAAMglB,SAASmO,GAAoB1uB,GAAmB,CAAEivB,eAAgBP,IAChHh9B,KAAKy1B,YAAY5G,SAAWhlB,EAAMglB,SAASwO,GAAevvB,EAAiB,CAAEyvB,eAAgBF,KAGjGzI,kBAAmB,WACf,IAAIf,EAAe7zB,KAAKE,QAAQ2zB,aAC5BA,GACAlqB,EAAEkqB,GAAc2J,uBAAuB,gBAAiBx9B,KAAK6pB,aAIrE4Q,kBAAmB,SAAS73B,GAGxB,OAFAA,EAAU+G,EAAE/G,GAEL5C,KAAK06B,SAAS93B,EAAQsB,QAAStB,EAAQ2uB,OAAO,MAAMrtB,UAG/Dw2B,SAAU,SAAS9iB,EAAa+M,GAC5B,IAGIC,EAHA+V,EAAiB36B,KAAK21B,gBACtB8H,EAAa9C,EAAevY,cAAcxK,GAAe,GACzD8lB,EAAU/C,EAAetY,WAAWsC,GAAY,GAGpD,OAAK8Y,GAAeC,GAIpB9Y,EAAa8Y,EAAQx5B,MAAQy2B,EAAejkB,UAAa+mB,EAAWv5B,MAE7D,CACH42B,YAAa2C,EAAWluB,MACxByrB,SAAU0C,EAAQnuB,MAClBZ,QAAS8uB,EAAW9uB,SAAW+uB,EAAQ/uB,QACvCP,SAAUpO,KAAK6pB,WAAW8T,OAAO/Y,KAT1B,MAafmL,cAAe,SAASlG,GACpB7pB,KAAKE,QAAQ2pB,WAAaA,EAE1B7pB,KAAK20B,cAED30B,KAAK49B,gBACL59B,KAAK49B,eAAe7N,cAAclG,GAGlC7pB,KAAK69B,YACL79B,KAAK69B,WAAW9N,cAAclG,GAG9B7pB,KAAK89B,eACL99B,KAAK89B,cAAc/N,cAAclG,GAGrC7pB,KAAK40B,oBAED50B,KAAKE,QAAQw2B,UACb7M,EAAWxN,SAInByX,WAAY,SAAS5zB,GACjBmK,EAAOiR,GAAGwY,WAAW3xB,KAAKnC,KAAME,GAEhCF,KAAKu8B,cAGT9hB,QAAS,WACLpQ,EAAOiR,GAAGb,QAAQtY,KAAKnC,MAEvB+9B,aAAa/9B,KAAKg+B,uBAGtBrJ,YAAa,WACT,IAAIpY,EAAOvc,KACP6pB,EAAatN,EAAKrc,QAAQ2pB,WAE9BA,EAAa/oB,MAAM8vB,QAAQ/G,GAAc,CAAEzf,KAAMyf,GAAeA,EAE5DtN,EAAKsN,YAAc7pB,KAAK2uB,gBACxBpS,EAAKsN,WAAWmG,OAAO3jB,EAAQkQ,EAAKoS,iBACpBqB,OAAOvjB,EAAY8P,EAAK0hB,oBACxBjO,OAAOzjB,EAAUgQ,EAAKmc,kBACtB1I,OAAO1jB,EAAOiQ,EAAKoc,gBAEnCpc,EAAKoS,gBAAkBpS,EAAKqS,QAAQnc,KAAK8J,GACzCA,EAAKmc,iBAAmBnc,EAAKqc,cAAcnmB,KAAK8J,GAChDA,EAAK0hB,mBAAqB1hB,EAAK2hB,YAAYzrB,KAAK8J,GAChDA,EAAKoc,cAAgBpc,EAAKsc,OAAOpmB,KAAK8J,IAG1CA,EAAKsN,WAAahgB,EAAMO,KAAKkW,gBAAgB7W,OAAOogB,GAC5BpX,KAAKpG,EAAQkQ,EAAKoS,iBAClBlc,KAAKlG,EAAUgQ,EAAKmc,kBACpBjmB,KAAKhG,EAAY8P,EAAK0hB,oBACtBxrB,KAAKnG,EAAOiQ,EAAKoc,gBAG7CE,OAAQ,WACJ74B,KAAKk6B,WAAU,IAGnBtB,cAAe,WACX54B,KAAKk6B,WAAU,IAGnBgE,YAAa,WACTl+B,KAAKq1B,eAAe8I,QACpBn+B,KAAKy1B,YAAY0I,SAGrBpJ,SAAU,WACN,IAAI+B,EAAS92B,KAAKE,QAAQ42B,OAE1B92B,KAAKm1B,QAAUn1B,KAAK4C,QAAQ8rB,SAAS,WAEjCoI,GACA92B,KAAKm1B,QAAQ8E,IAAI,SAAUnD,IAInCsH,eAAgB,WACZp+B,KAAKi9B,cAAgBtzB,EAAEgD,GAAK+hB,SAAS,8DAErC1uB,KAAK49B,eAAiB59B,KAAKq+B,qBAAqBr+B,KAAKi9B,cAAe,CAChEpN,QAAS,WACTD,SAAU,CACNE,MAAO9vB,KAAKE,QAAQ0vB,SAASqN,kBAKzCoB,qBAAsB,SAASz7B,EAAS1C,GACpC,IAAI2uB,EACAyP,EAAet+B,KAAKE,QAiBxB,OAfA2uB,EAAW,SAAU3hB,GACjB,IAAIgkB,EAAWhkB,EAAIgkB,SACfjjB,EAAOf,EAAIe,KAEf,MACE,kGAAyGpE,EAAQ,GAAI,SAAYoE,EAD5H,4DAGoCA,EAHpC,8DAv5JnB,SAAkBijB,EAAUhxB,EAASo+B,GACjC,IAAIhP,EAAWpvB,EAAQovB,SACnBG,EAAavvB,EAAQuvB,WACrBqN,EAAcwB,EAAaxB,YAC3B9sB,EAAS,GAab,OAXIsf,IACAtf,GAAUkhB,EAAY,+BAAoCrnB,EAAME,GAAG9F,KAAKitB,EAAW,OAAU,UAAa,KAG1GzB,GAAcH,KACdtf,GAAU,mDAAwDnG,EAAME,GAAG9F,KAAK,iBAAoB,WAEpG64B,IACA9sB,GAAU,gDAAqDnG,EAAME,GAAG9F,KAAK,KAAQ,WAGlF+L,EA44JWuuB,CAASrN,EAAUhxB,EAASo+B,GAN/B,kBAWJ,IAAIz0B,EAAME,GAAG0kB,mBAAmB7rB,EAAS+G,EAAEwB,OAAO,CACrD0e,WAAY7pB,KAAK6pB,WACjBgF,SAAUA,EACVG,cAAe,SAAU5kB,GAAQ,MAAQ,yBAA6BA,EAAO,WAC7E2kB,QAAS/uB,KAAKE,QAAQ48B,aACvB58B,KAGPs+B,oBAAqB,WACjBx+B,KAAK89B,cAAgB99B,KAAKq+B,qBAAqBr+B,KAAKk9B,aAAc,CAC9DhN,YAAalwB,KAAKm9B,UAClBtN,QAAS,UACTJ,WAAYzvB,KAAKE,QAAQuvB,WACzBH,SAAUtvB,KAAKE,QAAQovB,SACvBM,SAAU,CACNE,MAAO9vB,KAAKE,QAAQ0vB,SAASsN,aAC7BxN,UAAW1vB,KAAKE,QAAQ0vB,SAASF,aAIzC1vB,KAAK69B,WAAa79B,KAAKq+B,qBAAqBr+B,KAAKm9B,UAAW,CACxDjN,YAAalwB,KAAKk9B,aAClBrN,QAAS,OACTJ,WAAYzvB,KAAKE,QAAQuvB,WACzBH,SAAUtvB,KAAKE,QAAQovB,SACvBM,SAAU,CACNE,MAAO9vB,KAAKE,QAAQ0vB,SAASuN,UAC7BzN,UAAW1vB,KAAKE,QAAQ0vB,SAASF,cAK7CyM,cAAe,WACX,IAAI5f,EAAOvc,KACPy+B,EAAc90B,EAzrKP,4IA0rKP+0B,EAAgBD,EAAYn9B,KAAK,uBACjCq9B,EAAiBF,EAAYn9B,KAAK,kBAClCs9B,EAAcj1B,EAAEgD,GAAK+hB,SAAS,UAElCnS,EAAK6hB,iBACL7hB,EAAK2gB,aAAevzB,EAAEgD,GAAK+hB,SAAS,6DAEpCnS,EAAK4gB,UAAYxzB,EAAEgD,GAAK+hB,SAAS,0DACjCnS,EAAKod,cAAgBhwB,EAAE,sCACEk1B,KAAK,iCAE9BtiB,EAAKod,cAAcpI,SAAS0I,IAAI,gBAAiBpwB,EAAMoyB,QAAQjD,aAE/Dzc,EAAKqd,WAAajwB,EAAE,+BACpB4S,EAAKuiB,QAAUn1B,EAAE,kCAEjB+0B,EAActJ,OAAO7Y,EAAK0gB,eAC1ByB,EAActJ,OAAO7Y,EAAK4gB,WAC1BuB,EAActJ,OAAO7Y,EAAKqd,YAE1BgF,EAAYxJ,OAAO7Y,EAAKod,cAAcpI,UACtCqN,EAAYxJ,OAAO7Y,EAAKuiB,SAExBH,EAAevJ,OAAO7Y,EAAK2gB,cAC3ByB,EAAevJ,OAAOwJ,GAEtBriB,EAAK4Y,QAAQC,OAAOqJ,GAEpBliB,EAAKwiB,kBAAoB,IAAIl1B,EAAMm1B,IAAIC,KAAK1iB,EAAKod,cAAc,IAC/Dpd,EAAK2iB,eAAiB,IAAIr1B,EAAMm1B,IAAIC,KAAK1iB,EAAKqd,WAAW,IACzDrd,EAAK4iB,YAAc,IAAIt1B,EAAMm1B,IAAIC,KAAK1iB,EAAKuiB,QAAQ,IAEnDviB,EAAKiiB,uBAGTtE,UAAW,SAASnG,GAChBlqB,EAAME,GAAGowB,SAASn6B,KAAKm1B,QAASpB,IAGpC+E,QAAS,WACD94B,KAAK8+B,QAAQ,GAAGM,aAChBp/B,KAAKq/B,oBACLr/B,KAAKs/B,qBACLt/B,KAAKo0B,mBACLp0B,KAAKu/B,oBACLv/B,KAAKw/B,wBAIbA,oBAAqB,WACjB,IAAInF,EAAcr6B,KAAK25B,cAAcjqB,SAAS,SAEzC7F,EAAMoyB,QAAQwD,QAAQC,UAI3B3B,aAAa/9B,KAAKg+B,sBAElB3D,EAAYJ,IAAI,eAAgB,QAEhCj6B,KAAKg+B,qBAAuBt1B,YAAW,WACnC2xB,EAAYJ,IAAI,eAAgB,SAIxCoF,kBAAmB,WACf,IAEI9E,EAFAX,EAAa55B,KAAK45B,WAClB+F,EAAa/F,EAAWrI,OAAO,uBAAuBgJ,MAAM7tB,GAGhE6tB,EAAQvV,KAAKjS,IAAIxI,EAAWvK,KAAKi9B,eAAgB1yB,EAAWvK,KAAKm9B,YACjE5C,EAAQvV,KAAKjS,IAAI6mB,EAAWlqB,SAAS,SAAS6qB,QAASA,GAEvDoF,EAAWpF,MAAMA,IAGrB+E,mBAAoB,WAChB,IAAIM,EAAsB5/B,KAAKi9B,cAAcnG,OAAOpqB,GAAMoqB,SACtD+I,EAAqB7/B,KAAKk9B,aAAapG,OAAOpqB,GAAMoqB,SACpDgJ,EAAkB9/B,KAAKm9B,UAAUrG,OAAOpqB,GAAMqzB,cAC9CC,EAAgBhgC,KAAK25B,cAAc7C,OAAOpqB,GAAMqzB,cAEhDE,EAAUH,EAAkB9/B,KAAKm9B,UAAUrG,SAE3CoJ,EAAiBL,EAAqBD,EAAsBC,EAAqBD,EACjFO,EAAkBH,EAAgBF,EAAkBE,EAAgBF,EAExE9/B,KAAKi9B,cAAcnG,OAAOoJ,GAC1BlgC,KAAKk9B,aAAapG,OAAOoJ,GACzBlgC,KAAKm9B,UAAUrG,OAAOqJ,EAAkBF,GACxCjgC,KAAK25B,cAAc7C,OAAOqJ,IAG9B/L,iBAAkB,WACd,IAAIgG,EAAep6B,KAAK8+B,QAAQx9B,KAAK,SACjC+4B,EAAcr6B,KAAK25B,cAAcjqB,SAAS,SAI1C0wB,EAFYhG,EAAa1qB,SAAS,YAAYA,WAAWrO,OAE3BrB,KAAKE,QAAQ62B,YAC3CsJ,EAAWrb,KAAKsb,KAAMF,EAAkBpgC,KAAK8+B,QAAQvE,QAAW,KAEhE8F,EAAW,MACXA,EAAW,KAGfjG,EAAa9J,IAAI+J,GAAaJ,IAAI,QAASoG,EAAW,KAEtDrgC,KAAKugC,cAAclG,IAGvBkF,kBAAmB,WACf,IAAIhjB,EAAOvc,KACP8+B,EAAUviB,EAAKuiB,QACflF,EAAard,EAAKqd,WAClBmG,EAAcxjB,EAAK4Y,QAAQ4K,cAC3B/G,EAAYnvB,EAAMoyB,QAAQjD,YAC1BwH,EAAgB1B,EAAQ,GAAG75B,eAAiB65B,EAAQ,GAAG2B,aACvD3J,EAASva,EAAKrc,QAAQ42B,OAE1B,GAAIva,EAAK4Y,QAAQa,GAAG,YAAa,CAC7B,IAAK+J,IAAgBjJ,EAOjB,OANI0J,IACAxH,EAAY,GAGhB8F,EAAQhI,OAAO,aACf8C,EAAW9C,OAAOgI,EAAQhI,SAAWkC,GAIzC+G,GAAet1B,EAAY8R,EAAK2gB,eAChC6C,GAAet1B,EAAY8R,EAAKod,cAAcpI,YAEf,EAAZyH,IACf+G,EAA0B,EAAZ/G,EAAgB,EACzBwH,IACDT,GAAe/G,IAIvB8F,EAAQhI,OAAOiJ,GAEXS,IACAxH,EAAY,GAGhBY,EAAW9C,OAAOiJ,EAAc/G,KAIxCuH,cAAe,SAASlG,GACpB,IAAI9d,EAAOvc,KACPk4B,EAAOmC,EAAY3qB,SAAS,SAASA,WAAWhP,QAAQgP,WAAWhP,QAEnE6b,EAAKmkB,WAAa92B,IAClB2S,EAAKmkB,SAAWxI,EAAK9I,KAAK,YAG9B8I,EAAK9I,KAAK,UAAW,GAErB2O,aAAaxhB,EAAKokB,gBAElBpkB,EAAKokB,eAAiBj4B,YAAW,WAC7BwvB,EAAK9I,KAAK,UAAW7S,EAAKmkB,UAC1BnkB,EAAKmkB,SAAW92B,MAIxBg3B,cAAe,SAASvwB,GACpB,IAAIL,EAAS,GACT6Z,EAAa7pB,KAAK6pB,WAClBvZ,EAAWuZ,EAAWvZ,WACtBuwB,EAAavwB,EAASjP,OAAS,GAAMiP,EAAS,IAAMA,EAAS,GAAGvB,KAQpE,OANI8a,EAAW1Q,iBAAmB9I,IACI,IAA9BwZ,EAAWxZ,KAAQhP,QAAgBw/B,KACnC7wB,EAASM,GAIVN,GAGX4G,MAAO,WACH,MAAO,IAGXgY,QAAS,WACL,IAUIkS,EACAnrB,EAXA4G,EAAOvc,KACP6pB,EAAatN,EAAKsN,WAElBzP,EAAOyP,EAAWzP,OAClB5C,GAAW4C,EAAK5C,SAAW,IAAIzH,QAAU,GACzCvK,GAAQ4U,EAAK5U,MAAQ,IAAIuK,QAAU,GAEnCgsB,EAAgBxf,EAAK8Y,eACrB2G,EAAazf,EAAKkZ,YAKtB,IAAIlZ,EAAKmB,QAAQ5Q,EAAa,CAAEqiB,OAAQ,WAAxC,CA0BA,GAtBA4M,EAAczrB,SAAWiM,EAAKqkB,cA73Kf,WA83Kf5E,EAAW1rB,SAAWiM,EAAKqkB,cA/3Kf,QAi4KZrkB,EAAKwiB,kBAAkBgC,OAAOhF,EAAcV,MAAM7jB,IAClD+E,EAAK2iB,eAAe6B,OAAO/E,EAAWX,MAAM71B,IAE5Cs7B,EAAa,CACTna,QAASoV,EAAciF,SACvB1wB,SAAUyrB,EAAczrB,SACxBwW,SAAUiV,EAAcjV,UAG5BnR,EAAU,CACNgR,QAASqV,EAAWgF,SACpB1wB,SAAU0rB,EAAW1rB,SACrBwW,SAAUkV,EAAWlV,UAGzBvK,EAAK4iB,YAAY4B,OAAOxkB,EAAKoZ,gBAAgB0F,MAAMxR,EAAW8T,OAAQmD,EAAYnrB,IAElF4G,EAAKuc,UAEDvc,EAAK0kB,cACL1kB,EAAK0kB,cAAcC,qBAChB,CACH,IAAID,EAAgBp3B,EAAMo3B,cAAc1kB,EAAKuiB,SAEzCmC,GAAiBA,EAAcE,UAC/B5kB,EAAK0kB,cAAgBA,EAErBA,EAAcE,QAAQ1uB,KAAK,UAAU,SAASiP,GAC1C7X,EAAMnF,WAAW6X,EAAKod,eAAgBjY,EAAE0f,OAAOn4B,GAC/CsT,EAAKqd,WAAW90B,WAAW4c,EAAE0f,OAAOC,OAKhD9kB,EAAK2d,WAAU,GAEf3d,EAAKmB,QAAQ3Q,KAGjB+oB,YAAa,WACT,IAAIvZ,EAAOvc,KACP25B,EAAgBpd,EAAKod,cACrBC,EAAard,EAAKqd,WAEtBrd,EAAKuiB,QAAQ5P,GAAG,UAAU,WACtBrlB,EAAMnF,WAAWi1B,EAAe35B,KAAK0E,YACrCk1B,EAAW90B,UAAU9E,KAAK8E,cAG9B80B,EAAW1K,GAAG,iBAAmBtiB,EAAK,cAAgBA,EAAI2P,EAAKsd,aAAapnB,KAAK8J,KAGrFsd,aAAc,SAASnY,GACnB,IAAIA,EAAEpa,QAAN,CAIA,IAAIwyB,EAAQjwB,EAAMkwB,YAAYrY,GAC1B5c,EAAY9E,KAAK8+B,QAAQh6B,YAEzBg1B,IACApY,EAAErd,iBAEFsF,EAAE+X,EAAE8N,eAAettB,QAAQ,kBAAkB83B,IAAI,QAAUptB,GAAI,GAE/D5M,KAAK45B,WAAW90B,UAAUA,GAAcg1B,GACxC95B,KAAK8+B,QAAQh6B,UAAUA,GAAcg1B,QAK7Cl3B,GAAUiH,EAAMm1B,IAAIp8B,QACpB0+B,GAAWz3B,EAAMm1B,IAAI/N,KAErBsQ,GAAiB,SAASvtB,EAAUyS,GACrC,MAAO,CACFoW,YAAa,EACbntB,SAAU,EACV8xB,WAAY,EACZ7xB,QAAS,EACTW,SAAU,EACV0D,SAAUA,EACVwU,aAA4B,IAAd/B,IAIlB5W,GAAY,SAASN,EAAOrL,GAI5B,IAHA,IAAIyT,EAAO,GACPlI,EAAM,EAEHA,GAAOvL,EAAOuL,IACjBkI,EAAKxQ,KAAKoI,EAAMI,QAAQF,GAAKxB,MAGjC,OAAO0J,GAGPiP,GAAY,SAASrX,EAAOrL,GAI5B,IAHA,IAAI+J,EAAO,GACPwB,EAAM,EAEHA,GAAOvL,EAAOuL,IACjBxB,GAAQsB,EAAMI,QAAQF,GAAKxB,KAG/B,OAAOA,GAGP2nB,GAAmB1rB,EAAMiB,OAAO,CAChC+H,KAAM,SAAShT,GACXF,KAAK6uB,SAAWhlB,EAAMglB,SAAS3uB,EAAQ2uB,UACvC7uB,KAAKw1B,OAASt1B,EAAQs1B,OACtBx1B,KAAK+6B,KAAO,IAGhBO,iBAAkB,SAASp7B,GACvBF,KAAKoK,KAAOlK,EAAQkK,KACpBpK,KAAKu7B,kBAAoBr7B,EAAQq7B,kBACjCv7B,KAAKy7B,eAAiBv7B,EAAQu7B,eAC9Bz7B,KAAK07B,oBAAsBx7B,EAAQw7B,oBACnC17B,KAAK47B,eAAiB17B,EAAQ07B,eAC9B57B,KAAK+6B,KAAK15B,OAAS,GAGvBogC,eAAgB,SAAS5uB,GAGrB,IAFA,IAAIoe,EAAO,GAEF/sB,EAAQ,EAAGA,EAAQ2O,EAAO3O,IAC/B+sB,GAAQ,QAGZjxB,KAAKuF,MAAMjE,KAAK,YAAY8zB,OAAOnE,IAGvCyQ,eAAgB,SAASt3B,GAKrB,IAJA,IAEInE,EADAszB,EADOv5B,KACKuF,MAAMjE,KAAK,SAGlB4C,EAAQ,EAAGA,EAAQkG,EAAK/I,OAAQ6C,IACrC+B,EAAM0D,EAAG,cAAiB,GAAyB,gDACnD4vB,EAAKnE,OAAOnvB,GANLjG,KAOF2hC,aAAa17B,EAAKmE,EAAKlG,GAAQA,GAGxClE,KAAK66B,UAAYzwB,EAAK/I,QAG1BsgC,aAAc,SAASC,EAAOC,EAASld,GAEnC,IADA,IACSzgB,EAAQ,EAAGA,EAAQ29B,EAAQn8B,MAAMrE,OAAQ6C,IAAS,CACvD,IAAIg0B,EAAO2J,EAAQn8B,MAAMxB,GACzB,GAAIg0B,EAAM,CACN,IAAI4J,EAASn4B,EAAG,WAJb3J,KAIuC,OAAI,UAAY2kB,EAAW,GAAK,KAAOzgB,EAAQ,GAAK,YAAgB,GAA0B,6CACpIlE,KAAKy7B,eAAe9W,GAAUod,OAAS/hC,KAAKu7B,kBAAkBr3B,GAAO69B,QACrED,EAAOpT,SAAS,4BAEpBoT,EAAO1M,OARJp1B,KAQgB6uB,SAAS,CACxBzgB,SAAU8pB,EAAK9tB,KACf4wB,SAAU9C,EAAK8C,SACfF,YAAa5C,EAAK4C,eAEtB96B,KAAK+6B,KAAK5zB,KAAK+wB,GACf0J,EAAMxM,OAAO0M,MAKzBzG,MAAO,WACH,IAAIjxB,EAAO6B,GAAQjM,KAAKoK,MAAQ,IAAI8E,QAASlP,KAAKu7B,kBAAmBv7B,KAAKy7B,eAAgBz7B,KAAK07B,oBAAqB17B,KAAK47B,gBACrHrf,EAAOvc,KAEPuF,EAAQoE,EAAG,iBAAmB,GAA6B,8EAAgF,GAAsB,4DAQrK,OANA4S,EAAKhX,MAAQA,EACbgX,EAAKklB,eAAezhC,KAAKu7B,kBAAkBl6B,QAC3Ckb,EAAKmlB,eAAet3B,GACpBpK,KAAK66B,UAAYzwB,EAAK/I,OACtBrB,KAAK46B,aAAe56B,KAAKu7B,kBAAkBl6B,OAEpCkb,EAAKhX,SAIhB+vB,GAAmBprB,EAAMiB,OAAO,CAChC+H,KAAM,SAAShT,GACXF,KAAK+P,OAAS7P,EAAQ6P,OACtB/P,KAAKoa,KAAOla,EAAQka,KACpBpa,KAAKw1B,OAASt1B,EAAQs1B,OACtBx1B,KAAKgiC,eAAiBn4B,EAAMglB,SAAS5hB,GACjC/M,EAAQ2uB,WACR7uB,KAAK6uB,SAAWhlB,EAAMglB,SAAS3uB,EAAQ2uB,YAI/CuM,UAAW,SAASrrB,GAChB/P,KAAK+P,OAASA,GAGlB0xB,eAAgB,SAAS5uB,GAGrB,IAFA,IAAIoe,EAAO,GAEF/sB,EAAQ,EAAGA,EAAQ2O,EAAO3O,IAC/B+sB,GAAQ,QAGZjxB,KAAKuF,MAAMjE,KAAK,YAAY8zB,OAAOnE,IAGvCyQ,eAAgB,SAASO,GAKrB,IAJA,IAEIh8B,EADAszB,EADOv5B,KACKuF,MAAMjE,KAAK,SAGlB4C,EAAQ,EAAGA,EAAQ+9B,EAAiB5gC,OAAQ6C,IACjD+B,EAAM0D,EAAE,4DACR4vB,EAAKnE,OAAOnvB,GANLjG,KAOF2hC,aAAa17B,EAAKg8B,EAAiB/9B,GAAQA,IAIxDy9B,aAAc,SAASC,EAAOC,EAASld,GAKnC,IAJA,IACImd,EACA5J,EAFA3b,EAAOvc,KAIFkE,EAAQ,EAAGA,EAAQ29B,EAAQn8B,MAAMrE,OAAQ6C,KAC9Cg0B,EAAO2J,EAAQn8B,MAAMxB,OAEjB49B,EAASn4B,EAAE4S,EAAKylB,eAAe,CAC3B70B,GAAMoP,EAAW,OAAI,KAAoB,WAAbA,EAAKnC,KAAoB,KAAO,MAAQ,KAAOuK,EAAW,GAAK,KAAOzgB,EAAQ,GAC1GoJ,QAAS4qB,EAAK5xB,QACd+G,QAAS6qB,EAAKryB,QACdrD,IAAK01B,EAAKvgB,KAAKzW,KAAK,MAAQg3B,EAAK6J,MAAQ,WAAa,IACtDv0B,UAAY0qB,EAAKxoB,UAAYwoB,EAAKxoB,SAASrO,OAAU,KAAO,OAC5DkM,WAAY2qB,EAAKjkB,cAAgBikB,EAAK6J,MACtCr0B,SAAWwqB,EAAKxoB,UAAYwoB,EAAKxoB,SAASrO,OAAU,OAAS,QAC7D+L,YAAavD,EAAMqI,OAAO,yBAA0BgmB,EAAK6J,MAAQ,4BAA8B,GAAsB,IAAlB7J,EAAKlkB,SAAiB,2BAA6B,IACtJvG,KAAmB,WAAb8O,EAAKnC,KAAoB,eAAiB,gBAE7Cgb,OAAO7Y,EAAKsS,SAAWtS,EAAKsS,SAAS,CAAE9gB,OAAQmqB,IAAUA,EAAKlqB,SACrE4zB,EAAMxM,OAAO0M,KAKzBzG,MAAO,WACH,IAAI/E,EAAOtqB,GAAQhM,KAAK+P,QAAU,IAAIb,SAClCgzB,EAAwB,WAAbliC,KAAKoa,KAAoBtO,EAAUwqB,GAAQvqB,EAAOuqB,GAC7D6L,EAAaD,EAAS,GACtBE,EAAcF,EAAS,GACvBG,EAAUH,EAAS,GACnBI,EAAmBJ,EAAS,GAC5B3lB,EAAOvc,KACXuc,EAAKgmB,MAAQjM,EACb/Z,EAAKimB,SAAWH,EAChB9lB,EAAKkmB,aAAeL,EAEpB,IAAI78B,EAAQoE,EAAG,iBAAmB,GAA4B,8EAAgF,GAAsB,wDAMpK,OAJA4S,EAAKhX,MAAQA,EACbgX,EAAKklB,eAA4B,WAAbzhC,KAAKoa,KAAoBgoB,EAAY/gC,OAASihC,GAClE/lB,EAAKmlB,eAAeS,GAEb5lB,EAAKhX,OAGhBgxB,QAAS,WACL,OAAOv2B,KAAKuiC,OAGhB5G,WAAY,WACR,OAAO37B,KAAKwiC,UAGhBhH,eAAgB,WACZ,OAAOx7B,KAAKyiC,gBAIhBrG,GAAgBlyB,EAAMiB,OAAO,CAC7B+H,KAAM,WACFlT,KAAKsQ,SAAW,EAChBtQ,KAAK8mB,SAAW,IAGpBuU,MAAO,SAAStrB,GACZ,IAAI2yB,EAAQ1iC,KAAK2iC,OAAO5yB,GACpB6yB,EAAW5iC,KAAK6iC,YAEpB,MAAO,CACHjgC,GAAQ,QAAS,CAAE6xB,UAAWhmB,IAA2B,CAACm0B,EAAUF,MAI5EvE,MAAO,WACHn+B,KAAK8mB,SAAW,IAGpB+b,UAAW,WAKP,IAJA,IAAIxhC,EAASrB,KAAK8iC,aACdpzB,EAAW,GACXD,EAAM,EAEHA,EAAMpO,EAAQoO,IACjBC,EAASvI,KAAKvE,GAAQ,MAAO,OAGjC,OAAOA,GAAQ,WAAY,KAAM8M,IAGrCizB,OAAQ,SAAS5yB,GACb,IAAI3P,EAAO2P,EAAO,GAelB,OAbA/P,KAAK2F,IAAM,GACX3F,KAAKwF,KAAO,GACZxF,KAAKsP,UAAYlP,EAEjBJ,KAAKghC,SAAW,GAEZ5gC,GACAJ,KAAK+iC,WAAW3iC,EAAM,GACtBJ,KAAKgjC,cAELhjC,KAAKwF,KAAK2B,KAAKvE,GAAQ,KAAM,CAAE6xB,UAAWhmB,IAAwB,CAAE7L,GAAQ,KAAM,CAAE6xB,UAAWhmB,IAAuB,CAAE6yB,GAAS,eAG9H1+B,GAAQ,QAAS,CAAE6xB,UAAWhmB,IAAqBzO,KAAKwF,OAGnEw9B,WAAY,WAWR,IAVA,IAGI/8B,EAEAg9B,EACAC,EACAx9B,EACAwyB,EARA1yB,EAAOxF,KAAKwF,KACZsd,EAAatd,EAAKnE,OAClBkY,EAAS,EAQNA,EAASuJ,EAAYvJ,IAGxB,GAAoB,KAFpBtT,EAAMT,EAAK+T,IAEHjT,QASR,IAHA48B,EAAU,EACVD,GAHAv9B,EAAQO,EAAIyJ,UAGQrO,OAEb6hC,EAAUD,EAAaC,KAC1BhL,EAAOxyB,EAAMw9B,IAEJC,WACLjL,EAAK9I,KAAK9oB,QAAUL,EAAIK,UAMxC88B,UAAW,SAASn9B,GAKhB,IAJA,IAAIT,EAAOxF,KAAKwF,KACZnE,EAASmE,EAAKnE,OACdoO,EAAM,EAEHA,EAAMpO,GACLmE,EAAKiK,KAASxJ,EADDwJ,KAMrB,OAAOA,GAGXqzB,WAAY,WACR,IAAIp9B,EAAQ1F,KAAKwF,KAAK,GAAKxF,KAAKwF,KAAK,GAAGkK,SAAW,GAC/CrO,EAASqE,EAAMrE,OACfqV,EAAY,EACZjH,EAAM,EAEV,GAAIpO,EACA,KAAOoO,EAAMpO,EAAQoO,IACjBiH,GAAahR,EAAM+J,GAAK2f,KAAKvpB,SAAW,EAQhD,OAJK6Q,IACDA,EAAY1W,KAAKsQ,UAGdoG,GAGX2sB,KAAM,SAAS9zB,EAAOkX,EAAW+B,GAC7B,IAII8a,EACA5zB,EALA6Z,EAAWvpB,KAAKsP,UAAUK,QAAQ8W,GAAWxY,KAC7C+F,EAAWzE,EAAMI,QAAQ8W,GAAWzS,SACpCuvB,EAASha,EAAWvV,EACpBrO,EAAM3F,KAAK2F,IAIXM,EAAMN,EAAI49B,GAkCd,OAhCKt9B,GAuBDA,EAAIu9B,UAAW,EAEVv9B,EAAIuiB,cAAgBviB,EAAIuiB,eAAiBA,IAC1CviB,EAAIuiB,aAAeA,EACnBviB,EAAIw9B,UAAY,EAChBx9B,EAAIJ,QAAU,MA3BlBI,EAAMrD,GAAQ,KAAM,CAAE6xB,UAAWhmB,IAAwB,KAErD+Z,aAAeA,EACnBviB,EAAIw9B,UAAY,EAChBx9B,EAAIJ,QAAU,EACdI,EAAIK,QAAU,EAEdX,EAAI49B,GAAUt9B,GACdq9B,EAAY39B,EAAI4jB,GAAYxF,OAAO/P,GAAY,QAG3CtE,EAAW4zB,EAAU5zB,UAER,KAAuD,IAAjDA,EAAS,GAAG0f,KAAKqF,UAAUtwB,QAAQ,SAClD8B,EAAIu9B,UAAW,EAEfv9B,EAAIu9B,SAAWF,EAAUE,UAIjCxjC,KAAKwF,KAAK2gB,OAAOnmB,KAAKojC,UAAUE,GAAa,EAAG,EAAGr9B,IAWhDA,GAGX4V,UAAW,SAASvL,EAAUf,EAAOklB,GACjC,IAEI9lB,EAFAhJ,EAAM3F,KAAK2F,IACXM,EAAMN,EAAI+9B,WAGTz9B,IACDA,EAAMrD,GAAQ,KAAM,CAAE6xB,UAAWhmB,IAAwB,IACzD9I,EAAI+9B,WAAaz9B,EACjBjG,KAAKwF,KAAK2B,KAAKlB,IAGnB,IAAK,IAAIwJ,EAAM,EAAGpO,EAASiP,EAASjP,OAAQoO,EAAMpO,EAAQoO,IACtDd,EAAU2B,EAASb,GACnBxJ,EAAIyJ,SAASvI,KAAKnH,KAAK2jC,MAAOlP,GAAa,GAAK,CAACz0B,KAAK4jC,SAASj1B,EAASY,IAASZ,IAGrF,OAAOtN,GAGXuiC,SAAU,SAAS71B,EAAQwB,GACvB,OAAO+xB,GAASthC,KAAK6uB,SAAS,CAC1B9gB,OAAQA,EACRwB,MAAOA,KACP,IAGRo0B,MAAO,SAASlP,EAAW/kB,EAAU3B,GACjC,IAAImqB,EAAOt1B,GAAQ,KAAM,CAAE6xB,UAAWhmB,GAAqB,IAAMgmB,GAAa/kB,GAE9E,OADAwoB,EAAK7pB,MAAQN,EAAOC,SAAWD,EAAOE,KAC/BiqB,GAGX6K,WAAY,SAASxzB,EAAOkX,EAAW+B,GACnC,IAIIviB,EAAK49B,EAAUn0B,EAAUo0B,EACzB5L,EAAM6L,EAENpsB,EAGAmP,EAEAjhB,EAZA8J,EAAUJ,EAAMI,QAChB5B,EAAS4B,EAAQ8W,GACjBud,EAAar0B,EAAQ8W,EAAY,GAIjCwd,EAAe,GAGfx0B,EAAM,EAINg0B,EAAY,EACZS,EAAkB,EAEtB,IAAIn2B,EAAOY,QAAX,CAsBA,GAjBAgJ,EAAO9N,EAAM+F,UAAUC,GAAUN,EAAOkX,IACxCxgB,EAAMjG,KAAKqjC,KAAK9zB,EAAOkX,EAAW+B,GAGlCsb,GADAp0B,EAAW3B,EAAO2B,UACQrO,QAE1BylB,EAAW9mB,KAAK8mB,SAASnP,MAErB3X,KAAK8mB,SAASnP,GAAQmP,EAAWya,GAAexd,OAAOhW,EAAOiG,UAAWyS,GACzEK,EAASqd,aAAepgB,OAAO/jB,KAAKsP,UAAUK,QAAQ8W,GAAWzS,WAGrEhU,KAAKghC,SAAS75B,KAAK,CACfwQ,KAAMA,EACNpI,MAAOA,IAGPxB,EAAOkG,YAAa,EACM,IAAtB6S,EAASpZ,WACT+1B,EAAY3c,EAAS+V,YACrB52B,EAAIw9B,WAAaA,EAEjB3c,EAASpX,SAAW,EACpBo0B,EAAiB,GAGrB,IAAIM,EAAaz6B,EAAE,iBACnBy6B,EAAWhV,KAAKvlB,EAAMulB,KAAK,QAASzX,GAEpCssB,EAAa98B,KAAK0C,EAAMm1B,IAAI/N,KAAKpnB,EAAME,GAAG9F,KAAKmgC,EAAY,CAAEngC,KAAM6/B,EAAiBl2B,EAA0BC,MASlH,GANAo2B,EAAa98B,KAAKnH,KAAK4jC,SAAS71B,EAAQwB,IACxC2oB,EAAOl4B,KAAK2jC,MAAO19B,EAAIu9B,SAAW,WAAa,GAAKS,EAAcl2B,GAElE9H,EAAIyJ,SAASvI,KAAK+wB,GAClBjyB,EAAIJ,SAAW,EAEXi+B,EAAgB,CAIhB,IAHAC,EAAU/jC,KAAK2jC,MAAM,SAAU,CAAC3jC,KAAK4jC,SAAS71B,EAAQwB,IAASxB,GAC/D9H,EAAIyJ,SAASvI,KAAK48B,GAEXt0B,EAAMq0B,EAAgBr0B,IACzBo0B,EAAW7jC,KAAK+iC,WAAWrzB,EAASD,GAAMgX,EAAW1Y,GAGzDlI,EAAUg+B,EAASh+B,QACnB49B,EAAYI,EAASJ,UAErBvL,EAAK9I,KAAKvpB,QAAUA,EAEpBihB,EAASpX,SAAW7J,EACpBihB,EAASnX,QAAU,EAEnB1J,EAAIJ,SAAWA,EACfI,EAAIw9B,WAAaA,EACjBx9B,EAAIK,QAAUu9B,EAASv9B,QAAU,EAE7B09B,IACIA,EAAWr1B,QACX9I,EAAU7F,KAAK6b,UAAUmoB,EAAWt0B,SAAUH,EAAO,WAGrD1J,GADAg+B,EAAW7jC,KAAK+iC,WAAWxzB,EAAOkX,EAAY,IAC3B5gB,QAEnBI,EAAIw9B,WAAaI,EAASJ,UAC1BS,EAAkBL,EAASJ,WAG/BM,EAAQ3U,KAAKvpB,QAAUA,EACvBA,GAAW,EAEXihB,EAASnX,SAAW9J,EACpBI,EAAIJ,SAAWA,QAEZm+B,IACHA,EAAWr1B,QACX9I,EAAU7F,KAAK6b,UAAUmoB,EAAWt0B,SAAUH,IAG9C1J,GADAg+B,EAAW7jC,KAAK+iC,WAAWxzB,EAAOkX,EAAY,IAC3B5gB,QAEnBI,EAAIw9B,WAAaI,EAASJ,UAC1BS,EAAkBL,EAASJ,WAG/B3c,EAASnX,QAAU9J,EAEfA,EAAU,IACVqyB,EAAK9I,KAAKvpB,QAAUA,EACpBI,EAAIJ,SAAWA,EAAU,IAgBjC,OAZIihB,EAAS0a,WAAc1a,EAASnX,QAAUu0B,IAC1Cpd,EAAS0a,WAAa1a,EAASnX,QAAUu0B,GAG7Cx0B,EAAWoX,EAASpX,SAAW+zB,EAE3B3c,EAAS+V,YAAcntB,IACvBoX,EAAS+V,YAAcntB,IAG1Bq0B,GAAW7L,GAAMiL,UAAW,EAEtBl9B,EA9GHjG,KAAK6b,UAAU9N,EAAO2B,SAAUH,MAkHxC8sB,GAAanyB,EAAMiB,OAAO,CAC1B+H,KAAM,WACFlT,KAAK8mB,SAAW,IAGpBuU,MAAO,SAAStrB,GACZ,IAAI2yB,EAAQ1iC,KAAK2iC,OAAO5yB,GACpB6yB,EAAW5iC,KAAK6iC,YAEpB,MAAO,CACHjgC,GAAQ,QAAS,CAAE6xB,UAAWhmB,IAAqB,CAACm0B,EAAUF,MAItEvE,MAAO,WACHn+B,KAAK8mB,SAAW,IAGpBgc,WAAY,WAOR,IANA,IAAIpzB,EAAW1P,KAAKwF,KAAK,GAAGkK,SACxBrO,EAAS,EACToO,EAAM,EAENyoB,EAAOxoB,EAASD,GAEbyoB,GACH72B,GAAW62B,EAAK9I,KAAKvpB,SAAW,EAChCqyB,EAAOxoB,IAAWD,GAGtB,OAAOpO,GAGXwhC,UAAW,WAKP,IAJA,IAAIxhC,EAASrB,KAAK8iC,aACdpzB,EAAW,GACXD,EAAM,EAEHA,EAAMpO,EAAQoO,IACjBC,EAASvI,KAAKvE,GAAQ,MAAO,OAGjC,OAAOA,GAAQ,WAAY,KAAM8M,IAGrCizB,OAAQ,SAAS5yB,GACb,IAAI3P,EAAO2P,EAAO,GAelB,OAbA/P,KAAKsP,UAAYlP,EACjBJ,KAAKwF,KAAO,GACZxF,KAAK2F,IAAM,GAEX3F,KAAKghC,SAAW,GAEZ5gC,GACAJ,KAAK+iC,WAAW3iC,EAAM,GACtBJ,KAAKgjC,cAELhjC,KAAKwF,KAAK2B,KAAKvE,GAAQ,KAAM,CAAE6xB,UAAWhmB,IAAwB,CAAE7L,GAAQ,KAAM,CAAE6xB,UAAWhmB,IAAyB,CAAE6yB,GAAS,eAGhI1+B,GAAQ,QAAS,CAAE6xB,UAAWhmB,IAAqBzO,KAAKwF,OAGnEw9B,WAAY,WAgBR,IAfA,IASI/8B,EACAiyB,EACAmM,EAEAC,EAbA9+B,EAAOxF,KAAKwF,KACZsd,EAAatd,EAAKnE,OAClBkY,EAAS,EAET5J,EAAU3P,KAAKsP,UAAUK,QACzB40B,EAAkB50B,EAAQ,GAAG1B,KAC7Bma,EAAgBzY,EAAQtO,OACxBolB,EAAY,EAKZ9gB,EAAM3F,KAAK2F,IAGR4T,EAASuJ,EAAYvJ,IAGxB,IAFAtT,EAAMT,EAAK+T,GAENkN,EAAY,EAAGA,EAAY2B,EAAe3B,IAC3C4d,EAAarkC,KAAK2P,EAAQ8W,GAAWxY,OACrCiqB,EAAOjyB,EAAIJ,QAAQ,MAAQ4gB,KAEfyR,EAAKryB,QAAUw+B,IACvBnM,EAAK9I,KAAKvpB,QAAWw+B,EAAanM,EAAKryB,QAAW,GAK9DI,EAAMN,EAAI4+B,GACVD,EAAS3+B,EAAI4+B,EAAkB,OAE3Bt+B,IACAA,EAAIyJ,SAAS,GAAG0f,KAAKqF,UAAYhmB,GAAwB,YAGzD61B,IACAA,EAAO50B,SAAS,GAAG0f,KAAKqF,WAAa,YAAchmB,KAI3D40B,KAAM,SAAS3zB,GACX,IAAIzJ,EAAMrD,GAAQ,KAAM,CAAE6xB,UAAWhmB,IAAwBiB,GAM7D,OALAzJ,EAAIK,QAAU,EACdL,EAAIJ,QAAU,GAEd7F,KAAKwF,KAAK2B,KAAKlB,GAERA,GAGX29B,SAAU,SAAS71B,EAAQwB,GACvB,OAAO+xB,GAASthC,KAAK6uB,SAAS,CAC1B9gB,OAAQA,EACRwB,MAAOA,KACP,IAGRo0B,MAAO,SAASlP,EAAW/kB,EAAU3B,GACjC,IAAImqB,EAAOt1B,GAAQ,KAAM,CAAE6xB,UAAWhmB,GAAwB,IAAMgmB,GAAa/kB,GAEjF,OADAwoB,EAAK7pB,MAAQN,EAAOC,SAAWD,EAAOE,KAC/BiqB,GAGX6K,WAAY,SAASxzB,EAAOkX,GACxB,IACI9O,EAiBAugB,EAAM6L,EACNF,EAAUS,EACVxd,EACA2N,EAGAhlB,EAxBA9J,EAAM3F,KAAK2F,IAGXgK,EAAUJ,EAAMI,QAChB5B,EAAS4B,EAAQ8W,GACjBud,EAAar0B,EAAQ8W,EAAY,GAEjC/W,EAAW3B,EAAO2B,SAClBo0B,EAAiBp0B,EAASrO,OAE1B2S,EAAW+P,OAAOhW,EAAOiG,UACzBuV,EAAWvpB,KAAKsP,UAAUK,QAAQ8W,GAAWxY,KAC7Cu2B,EAAY30B,GAAUN,EAAOkX,EAAY,GAAGvlB,KAAK,IACjDijC,EAAepgB,OAAO/jB,KAAKsP,UAAUK,QAAQ8W,GAAWzS,UACxDE,EAAaswB,GAAaL,IAAiBnwB,EAAW,GAAMjG,EAAOmG,YAAc,IACjFjO,EAAMN,EAAIuO,EAAa,QAAUvO,EAAIuO,GACrCrO,EAAUmO,EAAW,EAMrBiwB,EAAe,GAUnB,IANKh+B,GAAOA,EAAIw+B,SACZx+B,EAAMjG,KAAKqjC,OAEXp9B,EAAIw+B,UAAW,EAGf12B,EAAOY,QAAS,CAMhB,IALA8lB,EAAYxuB,EAAI89B,QAAU,gBAAkB,GAC5C99B,EAAIyJ,SAASvI,KAAKnH,KAAK2jC,MAAMlP,EAAW,CAAEz0B,KAAK4jC,SAASl0B,EAAS,GAAIH,IAAUG,EAAS,KAExFzJ,EAAIK,QAAUw9B,EAETr0B,EAAM,EAAGA,EAAMq0B,EAAgBr0B,IAChCzP,KAAKqjC,KAAK,CAAErjC,KAAK2jC,MAAMlP,EAAW,CAAEz0B,KAAK4jC,SAASl0B,EAASD,GAAMF,IAAUG,EAASD,MAGxF,OAAOxJ,EAkBX,GAfAN,EAAI6+B,EAAYz2B,EAAOE,MAAQhI,EAE/B0R,EAAO9N,EAAM+F,UAAUC,GAAUN,EAAOkX,KAExCK,EAAW9mB,KAAK8mB,SAASnP,MAErB3X,KAAK8mB,SAASnP,GAAQmP,EAAWya,GAAevtB,EAAUyS,GAC1DK,EAASqd,aAAeA,GAG5BnkC,KAAKghC,SAAS75B,KAAK,CACfwQ,KAAMA,EACNpI,MAAOA,IAGPxB,EAAOkG,YAAa,EACM,IAAtB6S,EAASpZ,WACTo2B,EAAiB,EACjBhd,EAASpX,SAAW,GAGxB,IAAI00B,EAAaz6B,EAAE,iBACnBy6B,EAAWhV,KAAKvlB,EAAMulB,KAAK,QAASzX,GAEpCssB,EAAa98B,KAAK0C,EAAMm1B,IAAI/N,KAAKpnB,EAAME,GAAG9F,KAAKmgC,EAAY,CAAEngC,KAAM6/B,EAAiBl2B,EAA0BC,MAgBlH,GAbAo2B,EAAa98B,KAAKnH,KAAK4jC,SAAS71B,EAAQwB,IAExCklB,EAAYxuB,EAAI89B,UAAYD,EAAiB,gBAAkB,IAC/D5L,EAAOl4B,KAAK2jC,MAAMlP,EAAWwP,EAAcl2B,IACtClI,QAAUA,EAEfI,EAAIyJ,SAASvI,KAAK+wB,GAClBjyB,EAAIJ,QAAQ,MAAQ4gB,GAAayR,IAE5Bl4B,KAAKupB,IAAavpB,KAAKupB,GAAY1jB,KACpC7F,KAAKupB,GAAY1jB,GAGjBi+B,EAAgB,CAIhB,IAHA79B,EAAI89B,SAAU,EACd99B,EAAIw+B,UAAW,EAEVh1B,EAAM,EAAGA,EAAMq0B,EAAgBr0B,IAG5BxJ,KAFJ49B,EAAW7jC,KAAK+iC,WAAWrzB,EAASD,GAAMgX,MAGtCxgB,EAAIK,SAAWu9B,EAASv9B,SAI5BL,EAAIK,QAAU,IACd4xB,EAAK9I,KAAK9oB,QAAUL,EAAIK,SAG5BwgB,EAASpX,SAAWzJ,EAAIK,SAExBy9B,EAAU/jC,KAAK2jC,MAAM,gBAAiB,CAAC3jC,KAAK4jC,SAAS71B,EAAQwB,IAASxB,IAC9DlI,QAAUA,GAElBy+B,EAAStkC,KAAKqjC,KAAK,CAAEU,KACdl+B,QAAQ,MAAQ4gB,GAAasd,EACpCO,EAAOP,SAAU,EAEjBp+B,EAAI6+B,EAAYz2B,EAAOE,KAAO,OAASq2B,EAEnCN,IACAH,EAAW7jC,KAAK+iC,WAAWxzB,EAAOkX,EAAY,GAC9Csd,EAAQ3U,KAAK9oB,QAAUu9B,EAASv9B,SAGpCL,EAAIK,SAAWg+B,EAAOh+B,QAEtBwgB,EAASnX,QAAU20B,EAAOh+B,aAEnB09B,IACP/9B,EAAIw+B,UAAW,EACfzkC,KAAK+iC,WAAWxzB,EAAOkX,EAAY,IAElCsd,GAAW7L,GAAM9I,KAAK9oB,QAAUL,EAAIK,QAErCwgB,EAASnX,QAAU1J,EAAIK,SAW3B,OARIwgB,EAAS+V,YAAc/V,EAASpX,WAChCoX,EAAS+V,YAAc/V,EAASpX,UAGhCoX,EAAS0a,WAAa1a,EAASnX,UAC/BmX,EAAS0a,WAAa1a,EAASnX,SAG5B1J,KAIXq2B,GAAiBpyB,EAAMiB,OAAO,CAC9B+H,KAAM,WACFlT,KAAK8gC,WAAa,GAClB9gC,KAAK2V,QAAU,IAGnB0lB,MAAO,SAASjxB,EAAM02B,EAAYnrB,GAC9B,IAAIzR,EAAQ48B,EAAWna,QAAQ,GAC3BG,EAAWga,EAAWha,SAAS5iB,EAAQA,EAAMyT,KAAO/N,GAExD5J,KAAK8gC,WAAaA,EAClB9gC,KAAK2V,QAAUA,EAEf3V,KAAKoK,KAAOA,EAEZpK,KAAK0W,UAAYoQ,EAAWA,EAAS+V,YAAc/V,EAAS0a,WAAaV,EAAWxwB,SAASjP,QAAU,EAElGrB,KAAK0W,YACN1W,KAAK0W,UAAY,GAGrB,IAAIgsB,EAAQ1iC,KAAK2iC,SACbC,EAAW5iC,KAAK6iC,YAEpB,MAAO,CACHjgC,GAAQ,QAAS,CAAE6xB,UAAWhmB,IAA4B,CAACm0B,EAAUF,MAI7EG,UAAW,WACP,IAAIxhC,EAASrB,KAAK8gC,WAAWxwB,SAASjP,QAAU,EAC5CqO,EAAW,GACXD,EAAM,EAMV,IAJIzP,KAAKwF,KAAK,KACVnE,EAASrB,KAAKwF,KAAK,GAAGkK,SAASrO,QAG5BoO,EAAMpO,EAAQoO,IACjBC,EAASvI,KAAKvE,GAAQ,MAAO,OAGjC,OAAOA,GAAQ,WAAY,KAAM8M,IAGrCizB,OAAQ,WAYJ,OAXA3iC,KAAKwF,KAAO,GAERxF,KAAKoK,KAAK,IACVpK,KAAKoiB,cAAgBpiB,KAAKghC,SAAShhC,KAAK8gC,WAAY9gC,KAAK0W,WACzD1W,KAAKqiB,WAAariB,KAAKghC,SAAShhC,KAAK2V,QAASqP,KAAKsb,KAAKtgC,KAAKoK,KAAK/I,OAASrB,KAAK0W,YAEhF1W,KAAK+iC,cAEL/iC,KAAKwF,KAAK2B,KAAKvE,GAAQ,KAAM,CAAE6xB,UAAWhmB,IAAwB,CAAE7L,GAAQ,KAAM,CAAE6xB,UAAWhmB,IAAyB,CAAE6yB,GAAS,eAGhI1+B,GAAQ,QAAS,CAAE6xB,UAAWhmB,IAAqBzO,KAAKwF,OAGnEw7B,SAAU,SAAS0D,EAAU3C,GACzB,IACI4C,EAMA/jC,EAMAiT,EAGAnE,EACAk1B,EAjBA50B,EAAS,GAET2W,EAAU+d,EAAS/d,QACnBG,EAAW4d,EAAS5d,SACpBxW,EAAWo0B,EAASp0B,SACpBgT,EAAiBhT,EAASjP,QAAU,EAGpC8hB,EAAU,EACV0hB,EAAa,EAEbp1B,EAAM,EACNpO,EAASslB,EAAQtlB,OAOrB,IAAKA,EAAQ,CACT,IAAKwS,EAAa,EAAGA,EAAayP,EAAgBzP,IAC9C7D,EAAO6D,GAAc,CACjB3P,MAAO2P,EACPlF,QAAS2B,EAASuD,GAClBtE,MAAO,MAIf,OAAOS,EAGX,KAAOP,EAAMpO,EAAQoO,IAAO,CAkBxB,GAdAm1B,EAAe,GADfl1B,GADA9O,EAAUkmB,GADV6d,EAAiBhe,EAAQlX,IACSkI,OACfjI,SAAW9O,EAAQ+O,WAIlCD,GAAY4T,IAGS,IAArB1iB,EAAQ8M,UAAsB9M,EAAQ8O,WAAa9O,EAAQi8B,cAC3D+H,EAAehkC,EAAQi8B,aAGvBj8B,EAAQ4nB,cAAgB5nB,EAAQoT,WAAapT,EAAQujC,eACrDz0B,GAAY,GAGZA,GAAY,EAAG,CACf,IAAKmE,EAAa,EAAGA,EAAayP,EAAgBzP,IACtCnE,EAAWmE,EACdjT,EAAQ8O,UACAm1B,EAGb70B,EAAON,EAAWm1B,EAAahxB,GAAc,CACzCnE,SAAUA,EACVxL,MAAOif,EACPxU,QAAS2B,EAASuD,GAClBtE,MAAOo1B,EAAep1B,OAE1B4T,GAAW,EAGf,KAAOnT,EAAO60B,KAAgBj7B,GAC1Bi7B,GAAc,EAItB,GAAIA,IAAe9C,EACf,MAGJ5e,GAAWyhB,EAGf,OAAO50B,GAGX+yB,WAAY,WAKR,IAJA,IAAI1gB,EAAariB,KAAKqiB,WAClBhhB,EAASghB,EAAWhhB,OACpBoO,EAAM,EAEHA,EAAMpO,EAAQoO,IAAO,CACxB,IAAIkV,EAAWtC,EAAW5S,GACtBkV,GACA3kB,KAAKwF,KAAK2B,KAAKnH,KAAK8kC,UAAUngB,MAK1CmgB,UAAW,SAASpH,GAYhB,IAXA,IAGID,EAIAsH,EACA7M,EAAM8M,EACN5V,EAAMhhB,EAAUO,EAThBs2B,EAAWvH,EAAQx5B,MAAQlE,KAAK0W,UAChC0L,EAAgBpiB,KAAKoiB,cACrB/gB,EAAS+gB,EAAc/gB,OAEvBqE,EAAQ,GACR+J,EAAM,EAMHA,EAAMpO,EAAQoO,KACjBguB,EAAarb,EAAc3S,MAER7F,IAInBwlB,EAAO,CAAEqF,UAAWhmB,IAChBgvB,EAAW/tB,WACX0f,EAAKqF,WAAa,UAGtBuQ,EAAc,GACd52B,EAAWpO,KAAKoK,KAAK66B,EAAWxH,EAAWv5B,OAC3CyK,EAAU8uB,EAAW9uB,SAAW+uB,EAAQ/uB,QAExCo2B,EAAe,CACXjK,YAAa2C,EAAWluB,MACxByrB,SAAU0C,EAAQnuB,MAClBZ,QAASA,EACTP,SAAUA,GAGS,KAAnBA,EAASC,OAAgBM,GAAWA,EAAQI,OACvB,WAAjBJ,EAAQI,KACRi2B,EAAchlC,KAAK+8B,kBAAkBgI,GACb,UAAjBp2B,EAAQI,OACfi2B,EAAchlC,KAAKg9B,iBAAiB+H,KAIvCC,IACDA,EAAchlC,KAAKs9B,aAAayH,KAGpC7M,EAAOt1B,GAAQ,KAAMwsB,EAAM,CAAEkS,GAAS0D,MACjC32B,MAAQD,EAASC,MACtB3I,EAAMyB,KAAK+wB,IAQf,OALA9I,EAAO,CAAEqF,UAAWhmB,IAChBivB,EAAQhuB,WACR0f,EAAKqF,WAAa,kBAGf7xB,GAAQ,KAAMwsB,EAAM1pB,MAInCqE,EAAG8xB,OAAOC,IAEVjyB,EAAMq7B,mBAAqBr7B,EAAMK,MAAMiB,OAAO,CAC1C+H,KAAM,SAAShT,GACXF,KAAKE,QAAUA,EAEfF,KAAKmlC,OAASjlC,EAAQilC,OACtBnlC,KAAK6pB,WAAa7pB,KAAKmlC,OAAOtb,YAGlCnO,SAAU,WACN,IAQIjM,EARA21B,EAAoBplC,KAAKmlC,OAAOpG,kBAAkBrvB,SAAS,GAC3D21B,EAAiBrlC,KAAKmlC,OAAOjG,eAAexvB,SAAS,GAErD41B,EAAqBF,EAAkB11B,SAAS,GAAGA,SAASrO,OAC5DkkC,EAAkBF,EAAe31B,SAAS,GAAGA,SAASrO,OAEtDk5B,EAAQv6B,KAAKmlC,OAAOjlC,QAAQ62B,YAC5B/mB,EAAS,GAGb,GAAIu1B,GAAmBvlC,KAAK6pB,WAAWzf,OAAO,GAC1C,IAAKqF,EAAM,EAAGA,EAAM81B,EAAiB91B,IACjCO,EAAO7I,KAAK,CACRq+B,WAAW,IAKvB,IAAK/1B,EAAM,EAAGA,EAAM61B,EAAoB71B,IACpCO,EAAO7I,KAAK,CACRq+B,WAAW,EACXjL,MAAOA,IAIf,OAAOvqB,GAGXy1B,OAAQ,SAASjgC,EAAMuJ,EAAMuN,GAUzB,IATA,IAKI2mB,EACAh9B,EAAKP,EACLgL,EAAGwnB,EAPHloB,EAAS,GAET9I,EAAI,EACJ7F,EAASmE,EAAKnE,OAMX6F,EAAI7F,EAAQ6F,IAAK,CAKpB,IAJAjB,EAAM,GAENg9B,GADAv9B,EAAQF,EAAK0B,GAAGwI,UACIrO,OAEfqP,EAAI,EAAGA,EAAIuyB,EAAavyB,IACzBwnB,EAAOxyB,EAAMgL,GAEbzK,EAAIkB,KAAK,CACLu+B,WAAY,UACZC,MAAO,OACPt3B,MAAO6pB,EAAK7pB,MACZxI,QAASqyB,EAAK9I,KAAKvpB,SAAW,EAC9BS,QAAS4xB,EAAK9I,KAAK9oB,SAAW,IAIlCgW,GACAA,EAASrW,EAAKiB,GAGlB8I,EAAO7I,KAAK,CACRzB,MAAOO,EACP8I,KAAMA,IAId,OAAOiB,GAGX2L,MAAO,WACH,IAAIypB,EAAoBplC,KAAKmlC,OAAOpG,kBAAkBrvB,SAAS,GAC3D21B,EAAiBrlC,KAAKmlC,OAAOjG,eAAexvB,SAAS,GAErD41B,EAAqBF,EAAkB11B,SAAS,GAAGA,SAASrO,OAC5DkkC,EAAkBF,EAAe31B,SAAS,GAAGA,SAASrO,OAEtD4gC,EAAmBmD,EAAkB11B,SAAS,GAAGA,SACjD2nB,EAAgBgO,EAAe31B,SAAS,GAAGA,SAC3Ck2B,EAAc5lC,KAAKmlC,OAAOhG,YAAYzvB,SAAS,GAAGA,SAAS,GAAGA,SAE9Dm2B,EAAa7lC,KAAKylC,OAAOxD,EAAkB,UAE3CsD,GACAM,EAAW,GAAGngC,MAAMygB,OAAO,EAAG,EAAG,CAC7Buf,WAAY,UACZC,MAAO,OACPt3B,MAAO,GACPxI,QAAS0/B,EACTj/B,QAAS27B,EAAiB5gC,SAIlC,IAuBIykC,EAAU9lC,KAAKylC,OAAOpO,EAAe,QAvBtB,SAASpxB,EAAK/B,GAK7B,IAJA,IACIg0B,EAAM7pB,EADNqC,EAAI,EAEJhL,EAAQkgC,EAAY1hC,GAAOwL,SAExBgB,EAAI40B,EAAoB50B,IAC3BwnB,EAAOxyB,EAAMgL,GACbrC,EAAQ0V,OAAOmU,EAAK7pB,OAEhBqD,MAAMrD,KACNA,EAAQ6pB,EAAK7pB,OAGjBpI,EAAIkB,KAAK,CACLu+B,WAAY,UACZC,MAAO,OACPt3B,MAAOA,EACPxI,QAAS,EACTS,QAAS,OAOrB,OAAOu/B,EAAWz+B,OAAO0+B,IAG7BC,YAAa,WACT,IAAIX,EAAoBplC,KAAKmlC,OAAOpG,kBAAkBrvB,SAAS,GAM/D,MAAO,CACHs2B,SANiBhmC,KAAKmlC,OAAOjG,eAAexvB,SAAS,GAEpBA,SAAS,GAAGA,SAASrO,OAKtD4kC,SAJmBb,EAAkB11B,SAAS,GAAGA,SAItBrO,SAInC6kC,SAAU,WACN,IAAIjnB,EAmBJ,OAPIjf,KAAK6pB,WAAW8T,OAAO,IACvB1e,EAAUtV,EAAEmU,YACJa,UAERM,EAAUjf,KAAK6pB,WAAWxN,QAGvB4C,EAAQ2M,KAlBC,WACR,MAAO,CACHua,OAAQ,CAAE,CACN3uB,QAASxX,KAAK0b,WACdlW,KAAMxF,KAAK2b,QACXyqB,WAAYpmC,KAAK+lC,cACjBptB,OAAQ,SAYMlG,KAAKzS,UAI3C,IAAIqmC,GAAkB,CAClBl7B,OAAQ,SAASm7B,GACdA,EAAM/T,OAAOprB,KAAK,eAClBm/B,EAAMpmC,QAAQqmC,MAAQ58B,EAAEwB,OAAOm7B,EAAMpmC,QAAQqmC,MAAOvmC,KAAKE,SACzDomC,EAAME,YAAcxmC,KAAKwmC,aAE5BtmC,QAAS,CACLumC,SAAU,GACVhX,YAAY,EACZiX,SAAU,eAEdF,YAAa,WACT,IAAID,EAAQvmC,KAAKE,QAAQqmC,OAAS,GAEnB,IAAI18B,EAAMq7B,mBAAmB,CACxCC,OAAQnlC,OAkBHkmC,WAAWta,KAfJ,SAAS+a,GAChB3mC,KAAK0d,QAAQ,cAAe,CAAEwoB,SAAUS,KAC1B,IAAI98B,EAAM+8B,MAAMC,SAASF,GAE/BG,iBAAiBlb,MAAK,SAASmb,GACpCl9B,EAAMm9B,OAAO,CACTD,QAASA,EACTL,SAAUC,EAAKD,UAAYH,EAAMG,SACjCD,SAAUF,EAAME,SAChBQ,WAAYV,EAAMU,iBAMCx0B,KAAKzS,SAIhD6J,EAAMw8B,gBAAkBA,GAEpBx8B,EAAM+8B,OAAS/8B,EAAM+8B,MAAMC,UAC3BR,GAAgBl7B,OAAO2wB,GAAUr6B,WAGjCoI,EAAMq9B,WACNr9B,EAAMq9B,SAAS/7B,OAAO2wB,GAAUr6B,WAEhCq6B,GAAUxgB,GAAG6rB,SAAW,WACpB,OAAOnnC,KAAKonC,eAAe,CACvB7M,MAAOv6B,KAAKm1B,QAAQoF,SACrB,CACC8M,WAAYrnC,KAAKE,QAAQonC,IAAID,eAKrCx9B,EAAMq9B,WACNr9B,EAAMq9B,SAAS/7B,OAAOupB,GAAYjzB,WAElCizB,GAAYpZ,GAAG6rB,SAAW,WACtB,OAAOnnC,KAAKonC,eAAe,CACvB7M,MAAOv6B,KAAKm1B,QAAQoF,SACrB,CACC8M,WAAYrnC,KAAKE,QAAQonC,IAAID,eAhxN7C,CAqxNGv9B,OAAOD,MAAM09B,QACF19B","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('kendo.pivot.common.js'), require('kendo.dom.js'), require('kendo.data.js'), require('kendo.icons.js')) :\n typeof define === 'function' && define.amd ? define(['kendo.pivot.common', 'kendo.dom', 'kendo.data', 'kendo.icons'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.kendopivotgrid = global.kendopivotgrid || {}, global.kendopivotgrid.js = factory()));\n})(this, (function () {\n var Navigation = function Navigation(options) {\n this.tabIndex = 0;\n this.root = null;\n this.eventHandlers = {};\n this.update = function () { };\n this.tabIndex = options.tabIndex;\n };\n\n var prototypeAccessors = { elements: { configurable: true },first: { configurable: true },last: { configurable: true },current: { configurable: true } };\n prototypeAccessors.elements.get = function () {\n return this.root ? Array.from(this.root.querySelectorAll(this.selectors.join(','))) : [];\n };\n prototypeAccessors.first.get = function () {\n return (this.root && this.root.querySelector(this.selectors.join(','))) || null;\n };\n prototypeAccessors.last.get = function () {\n var all = this.elements;\n return all[all.length - 1] || null;\n };\n prototypeAccessors.current.get = function () {\n return this.elements.find(function (el) { return el.matches(':focus'); });\n };\n Navigation.prototype.start = function start (root) {\n var this$1$1 = this;\n\n this.root = root;\n var loop = function ( eventType ) {\n if (this$1$1.mouseEvents[eventType]) {\n this$1$1.eventHandlers[eventType] = (function (ev) {\n var target = ev.target instanceof Element && ev.target.closest(this$1$1.selectors.join(','));\n if (target) {\n this$1$1.mouseEvents[eventType].call(undefined, target, this$1$1, ev);\n }\n });\n root.addEventListener(eventType, this$1$1.eventHandlers[eventType]);\n }\n };\n\n for (var eventType in this$1$1.mouseEvents) loop( eventType );\n var loop$1 = function ( eventType ) {\n if (this$1$1.keyboardEvents[eventType$1]) {\n this$1$1.eventHandlers[eventType$1] = (function (ev) {\n var target = ev.target instanceof Element && ev.target.closest(this$1$1.selectors.join(','));\n var key = ev.key === ' ' ? 'Space' : ev.key;\n if (target && this$1$1.keyboardEvents[eventType$1][key]) {\n this$1$1.keyboardEvents[eventType$1][key].call(undefined, target, this$1$1, ev);\n }\n });\n root.addEventListener(eventType$1, this$1$1.eventHandlers[eventType$1]);\n }\n };\n\n for (var eventType$1 in this$1$1.keyboardEvents) loop$1( eventType );\n };\n Navigation.prototype.stop = function stop () {\n if (this.root) {\n for (var eventType in this.eventHandlers) {\n if (this.eventHandlers[eventType]) {\n this.root.removeEventListener(eventType, this.eventHandlers[eventType]);\n }\n }\n }\n this.root = null;\n };\n Navigation.prototype.focusElement = function focusElement (element, previous) {\n if (element) {\n if (previous) {\n previous.removeAttribute('tabindex');\n previous.classList.remove('k-focus');\n }\n element.setAttribute('tabindex', String(this.tabIndex));\n element.focus({ preventScroll: true });\n }\n };\n\n Object.defineProperties( Navigation.prototype, prototypeAccessors );\n\n var scrollableValuesSel = '.k-pivotgrid .k-pivotgrid-values';\n var scrollableColumnHeaderSel = '.k-pivotgrid .k-pivotgrid-column-headers';\n var scrollableRowHeaderSel = '.k-pivotgrid .k-pivotgrid-row-headers';\n var emptyCellSel = '.k-pivotgrid > .k-pivotgrid-empty-cell';\n var tableSel = 'table.k-pivotgrid-table';\n var cellSel = '.k-pivotgrid-cell';\n var scrollables = [scrollableValuesSel, scrollableColumnHeaderSel, scrollableRowHeaderSel].join(',');\n var selectors$1 = [\n emptyCellSel,\n [scrollableColumnHeaderSel, tableSel, cellSel].join(' '),\n [scrollableRowHeaderSel, tableSel, cellSel].join(' '),\n [scrollableValuesSel, tableSel, cellSel].join(' ')\n ];\n var onEnter = function (target, nav, ev) {\n var icon = target.querySelector('.k-icon, .k-svg-icon');\n if (icon) {\n var index = nav.elements.indexOf(target);\n nav.update = function () {\n nav.focusElement(nav.elements[index], null);\n nav.update = function () { };\n };\n icon.click();\n ev.preventDefault();\n }\n };\n var tryScrollLeft = function (target, scrollable, elToScroll) {\n if (target.offsetLeft < scrollable.scrollLeft) {\n elToScroll.scrollLeft = target.offsetLeft;\n }\n };\n var tryScrollRight = function (target, scrollable, elToScroll) {\n if (target.offsetLeft + target.offsetWidth > scrollable.scrollLeft + scrollable.offsetWidth &&\n target.offsetWidth < scrollable.offsetWidth) {\n elToScroll.scrollLeft = target.offsetLeft + target.offsetWidth - scrollable.offsetWidth;\n }\n };\n var tryScrollUp = function (target, scrollable, elToScroll) {\n if (scrollable.scrollTop && target.offsetTop < scrollable.scrollTop) {\n elToScroll.scrollTop = target.offsetTop;\n }\n };\n var tryScrollDown = function (target, scrollable, elToScroll) {\n if (target.offsetTop + target.offsetHeight > scrollable.scrollTop + scrollable.offsetHeight &&\n target.offsetHeight < scrollable.offsetHeight) {\n elToScroll.scrollTop = target.offsetTop + target.offsetHeight - scrollable.offsetHeight;\n }\n };\n var scrollTo = function (target, root, scrollFunc) {\n var elToScroll = root.querySelector(scrollableValuesSel);\n var scrollable = target && target.closest(scrollables);\n if (!elToScroll || !scrollable || !target) {\n return;\n }\n scrollFunc.forEach(function (scroll) { return scroll(target, scrollable, elToScroll); });\n };\n var tableMap = function (table) {\n var rows = Array.from(table.rows);\n var colsCount = Array.from((rows && rows[0] && rows[0].cells) || [])\n .map(function (c) { return c.colSpan; })\n .reduce(function (prev, cur) { return prev + cur; }, 0);\n var map = rows.map(function () { return new Array(colsCount); });\n rows.forEach(function (row, r) {\n var curColSpan = 0;\n Array.from(row.cells).forEach(function (c) {\n for (var colSp = 0; colSp < c.colSpan; colSp++) {\n for (var rowSp = 0; rowSp < c.rowSpan; rowSp++) {\n var ind = map[r + rowSp].findIndex(function (val, curInd) { return curInd >= curColSpan && !val; });\n map[r + rowSp][ind] = c;\n }\n curColSpan++;\n }\n });\n });\n return map;\n };\n var navigationMap = function (root) {\n var columnHeader = tableMap(root.querySelector([scrollableColumnHeaderSel, tableSel].join(' ')));\n var rowHeader = tableMap(root.querySelector([scrollableRowHeaderSel, tableSel].join(' ')));\n var values = tableMap(root.querySelector([scrollableValuesSel, tableSel].join(' ')));\n var emptyCell = root.querySelector(emptyCellSel);\n var emptyCellRow = new Array(rowHeader[0].length).fill(emptyCell);\n var map = [];\n for (var i = 0; i < columnHeader.length; i++) {\n map.push(emptyCellRow.concat(columnHeader[i]));\n }\n for (var i$1 = 0; i$1 < rowHeader.length; i$1++) {\n map.push(rowHeader[i$1].concat(values[i$1]));\n }\n return map;\n };\n var getTargetPos = function (map, target) {\n for (var r = 0; r < map.length; r++) {\n for (var c = 0; c < map[r].length; c++) {\n if (map[r][c] === target) {\n return [r, c];\n }\n }\n }\n return [-1, -1];\n };\n var ctrlKey = function (ev) { return ev.ctrlKey || ev.metaKey; };\n var cellAt = function (root, target, pos) {\n var map = navigationMap(root);\n var targetPos = getTargetPos(map, target);\n var nextPos = [targetPos[0] + pos[0], targetPos[1] + pos[1]];\n var next = map[nextPos[0]] && map[nextPos[0]][nextPos[1]];\n while (next && next === target) {\n nextPos = [nextPos[0] + pos[0], nextPos[1] + pos[1]];\n next = map[nextPos[0]] && map[nextPos[0]][nextPos[1]];\n }\n return next;\n };\n var keyboardEvents$1 = {\n keydown: {\n ArrowLeft: function (target, nav, ev) {\n ev.preventDefault();\n var next = cellAt(nav.root, target, [0, -1]);\n nav.focusElement(next, target);\n scrollTo(next, nav.root, [tryScrollRight, tryScrollLeft, tryScrollDown, tryScrollUp]);\n },\n ArrowRight: function (target, nav, ev) {\n ev.preventDefault();\n var next = cellAt(nav.root, target, [0, 1]);\n nav.focusElement(next, target);\n scrollTo(next, nav.root, [tryScrollLeft, tryScrollRight, tryScrollDown, tryScrollUp]);\n },\n ArrowUp: function (target, nav, ev) {\n ev.preventDefault();\n var next = cellAt(nav.root, target, [-1, 0]);\n nav.focusElement(next, target);\n scrollTo(next, nav.root, [tryScrollRight, tryScrollLeft, tryScrollDown, tryScrollUp]);\n },\n ArrowDown: function (target, nav, ev) {\n ev.preventDefault();\n var next = cellAt(nav.root, target, [1, 0]);\n nav.focusElement(next, target);\n scrollTo(next, nav.root, [tryScrollRight, tryScrollLeft, tryScrollUp, tryScrollDown]);\n },\n o: function (_target, nav, _ev) {\n if (!nav.root) {\n return;\n }\n // FIX: ADDED manually to fix an issue where depending on the order of the config element and button\n // you either can open the configurator with Ctrl+O, or you can close the configurator with ESC\n var next = nav.root.nextElementSibling;\n if (!(next && next instanceof HTMLElement)) {\n return;\n }\n\n if (!next.matches('div.k-pivotgrid-configurator-button')) {\n next = next.nextElementSibling;\n }\n\n if (next && next instanceof HTMLElement && next.matches('div.k-pivotgrid-configurator-button')) {\n if (!nav.root.parentNode || nav.root.parentNode.querySelector(\".k-pivotgrid-configurator.k-hidden\")) {\n next.click();\n }\n\n setTimeout(function () {\n if (nav.root.parentNode) {\n var confHeader = nav.root.parentNode.querySelector('.k-pivotgrid-configurator-content .k-form-field .k-fields-list-wrapper .k-treeview');\n if (confHeader instanceof HTMLElement) {\n confHeader.setAttribute('tabindex', String(nav.tabIndex));\n confHeader.focus();\n }\n }\n }, 0);\n }\n },\n Enter: onEnter,\n Space: onEnter,\n Home: function (target, nav, ev) {\n var map = navigationMap(nav.root);\n var ctrl = ctrlKey(ev);\n var row = ctrl ? map[0] : (map.find(function (ro) { return Boolean(ro.find(function (x) { return x === target; })); }) || []);\n var next = row[0];\n if (next) {\n nav.focusElement(next, target);\n scrollTo(next, nav.root, [tryScrollRight, tryScrollLeft, tryScrollDown, tryScrollUp]);\n ev.preventDefault();\n }\n },\n End: function (target, nav, ev) {\n var map = navigationMap(nav.root);\n var ctrl = ctrlKey(ev);\n var row = ctrl ? map[map.length - 1] : (map.find(function (ro) { return Boolean(ro.find(function (x) { return x === target; })); }) || []);\n var next = row && row[row.length - 1] || null;\n if (next) {\n nav.focusElement(next, target);\n scrollTo(next, nav.root, [tryScrollLeft, tryScrollRight, tryScrollUp, tryScrollDown]);\n ev.preventDefault();\n }\n }\n }\n };\n var mouseEvents$1 = {\n click: function (target, nav) {\n if (target && target instanceof HTMLElement) {\n var prev = nav.elements.find(function (c) { return c.hasAttribute('tabindex'); }) || null;\n nav.focusElement(target, prev);\n }\n }\n };\n /**\n * The PivotGrid keyboard navigation functionality.\n *\n * Usage:\n *\n * On Initialize\n * const navigation = new PivotGridNavigation({ tabindex: 0 });\n *\n * Turn on\n * navigation.start(rootDomElement);\n *\n * On After Update\n * navigation.update();\n *\n * On Destroy / Turn off\n * navigation.stop();\n */\n var PivotGridNavigation = /*@__PURE__*/(function (Navigation) {\n function PivotGridNavigation() {\n Navigation.apply(this, arguments);\n this.selectors = selectors$1;\n this.mouseEvents = mouseEvents$1;\n this.keyboardEvents = keyboardEvents$1;\n }\n\n if ( Navigation ) PivotGridNavigation.__proto__ = Navigation;\n PivotGridNavigation.prototype = Object.create( Navigation && Navigation.prototype );\n PivotGridNavigation.prototype.constructor = PivotGridNavigation;\n\n return PivotGridNavigation;\n }(Navigation));\n\n var selectors = [\n '.k-pivotgrid-configurator-content .k-form-field .k-fields-list-wrapper .k-treeview',\n '.k-pivotgrid-configurator-content .k-chip',\n '.k-pivotgrid-configurator-actions button'\n ];\n var onEscape = function (_target, nav, ev) {\n if (ev.target instanceof HTMLElement) {\n if (nav.root) {\n var pivot = nav.root.previousElementSibling;\n var confButton = nav.root.nextElementSibling;\n var pivotCell = Array.from(pivot instanceof HTMLElement ? pivot.querySelectorAll('[tabindex]') : []).find(function (c) { return c.tabIndex >= 0; });\n if (pivotCell instanceof HTMLElement) {\n pivotCell.focus();\n if (confButton instanceof HTMLElement) {\n confButton.click();\n }\n }\n }\n }\n };\n var navigate = function (target, nav, ev, dir) {\n ev.preventDefault();\n var all = nav.elements;\n var index = all.indexOf(target) + dir;\n if (index < 0) {\n index = all.length - 1;\n }\n nav.focusElement(all[index % all.length], target);\n };\n var onDelete = function (target, nav, ev) {\n if (ev.target instanceof HTMLElement) {\n var deleteButton = ev.target.querySelector('.k-icon.k-i-x-circle, .k-svg-icon.k-svg-i-x-circle');\n if (deleteButton instanceof HTMLElement) {\n ev.preventDefault();\n navigate(target, nav, ev, -1);\n }\n }\n };\n var keyboardEvents = {\n keydown: {\n Tab: function (target, nav, ev) {\n navigate(target, nav, ev, ev.shiftKey ? -1 : 1);\n },\n Escape: onEscape,\n Delete: onDelete,\n Backspace: onDelete\n }\n };\n var mouseEvents = {\n click: function (target, nav) {\n if (target && target instanceof HTMLElement) {\n var prev = nav.elements.find(function (c) { return c.hasAttribute('tabindex'); }) || null;\n nav.focusElement(target, prev);\n }\n }\n };\n /**\n * The PivotGrid Configurator keyboard navigation functionality.\n *\n * Usage:\n *\n * On Initialize\n * const navigation = new ConfiguratorNavigation({ tabindex: 0 });\n *\n * Turn on\n * navigation.start(rootDomElement);\n *\n * On After Update\n * navigation.update();\n *\n * On Destroy / Turn off\n * navigation.stop();\n */\n var ConfiguratorNavigation = /*@__PURE__*/(function (Navigation) {\n function ConfiguratorNavigation() {\n Navigation.apply(this, arguments);\n this.selectors = selectors;\n this.mouseEvents = mouseEvents;\n this.keyboardEvents = keyboardEvents;\n }\n\n if ( Navigation ) ConfiguratorNavigation.__proto__ = Navigation;\n ConfiguratorNavigation.prototype = Object.create( Navigation && Navigation.prototype );\n ConfiguratorNavigation.prototype.constructor = ConfiguratorNavigation;\n\n return ConfiguratorNavigation;\n }(Navigation));\n\n var __meta__ = {\n id: \"pivotgrid\",\n name: \"PivotGrid\",\n category: \"web\",\n description: \"The PivotGrid widget is a data summarization tool.\",\n depends: [ \"dom\", \"data\", \"data.xml\", \"sortable\", \"pivot.common\", \"icons\" ],\n features: [{\n id: \"pivotgrid-configurator\",\n name: \"Configurator\",\n description: \"The PivotConfigurator widget allows the user to select data slices displayed in PivotGrid\",\n depends: [ \"pivot.configurator\" ]\n }, {\n id: \"pivotgrid-filtering\",\n name: \"Filtering\",\n description: \"Support for filtering\",\n depends: [ \"pivot.fieldmenu\" ]\n }, {\n id: \"pivotgrid-excel-export\",\n name: \"Excel export\",\n description: \"Export pivot grid data as Excel spreadsheet\",\n depends: [ \"ooxml\" ]\n }, {\n id: \"pivotgrid-pdf-export\",\n name: \"PDF export\",\n description: \"Export pivot grid data as PDF\",\n depends: [ \"pdf\", \"drawing\" ]\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\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n ui = kendo.ui,\n encode = kendo.htmlEncode,\n Class = kendo.Class,\n Comparer = kendo.data.Comparer,\n Widget = ui.Widget,\n DataSource = kendo.data.DataSource,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n common = window.kendo.pivotgrid.common,\n fetchDiscover = common.fetchDiscover,\n normalizeFilter = kendo.data.Query.normalizeFilter,\n normalizeSort = kendo.data.Query.normalizeSort,\n toString = {}.toString,\n identity = function(o) { return o; },\n map = $.map,\n extend = $.extend,\n keys = kendo.keys,\n isFunction = kendo.isFunction,\n fetchData = common.fetchData,\n createLocalDataState = common.createLocalDataState,\n createDataTree = common.createDataTree,\n sumAggregate = common.sumAggregate,\n averageAggregate = common.averageAggregate,\n minAggregate = common.minAggregate,\n maxAggregate = common.maxAggregate,\n createDataState = common.createDataState,\n toColumns = common.toColumns,\n toRows = common.toRows,\n toTree = common.toTree,\n toData = common.toData,\n headersReducer = common.headersReducer,\n RESIZE = \"resize\",\n READ = \"read\",\n CHANGE = \"change\",\n ERROR = \"error\",\n REQUESTSTART = \"requestStart\",\n PROGRESS = \"progress\",\n REQUESTEND = \"requestEnd\",\n MEASURES = \"Measures\",\n STATERESET = \"stateReset\",\n AUTO = \"auto\",\n DIV = \"
\",\n NS = \".kendoPivotGrid\",\n ROW_TOTAL_KEY = \"__row_total__\",\n DATABINDING = \"dataBinding\",\n DATABOUND = \"dataBound\",\n EXPANDMEMBER = \"expandMember\",\n HEADERTEMPLATE = function (ref) {\n var id = ref.id;\n var key = ref.key;\n var headerClass = ref.headerClass;\n var colspan = ref.colspan;\n var rowspan = ref.rowspan;\n var expandable = ref.expandable;\n var iconClass = ref.iconClass;\n var role = ref.role;\n var expanded = ref.expanded;\n\n return \"\" +\n \"\" + (expandable ? kendo.ui.icon($(''), { icon: (\"chevron-\" + (encode(iconClass))) }) : '') +\n '';\n },\n COLLAPSEMEMBER = \"collapseMember\",\n STATE_EXPANDED_ICONNAME = \"caret-alt-down\",\n STATE_EXPANDED_SELECTOR = \".k-i-\" + STATE_EXPANDED_ICONNAME + \",.k-svg-i-\" + STATE_EXPANDED_ICONNAME,\n STATE_COLLAPSED_ICONNAME = \"caret-alt-right\",\n HEADER_TEMPLATE = function (ref) {\n var member = ref.member;\n\n return (\"\" + (encode(member.caption || member.name)) + \"\");\n },\n PIVOTGRID_TREND_ICONS_MAP = {\n \"kpi-trend-decrease\": \"caret-alt-down\",\n \"kpi-trend-increase\": \"caret-alt-up\",\n \"kpi-trend-equal\": \"minus\",\n },\n KPISTATUS_TEMPLATE = function (ref) {\n var dataItem = ref.dataItem;\n\n return kendo.ui.icon($((\"\")), { icon: (\"kpi-status-\" + (dataItem.value > 0 ? \"open\" : dataItem.value < 0 ? \"deny\" : \"hold\")) });\n },\n KPITREND_TEMPLATE = function (ref) {\n var dataItem = ref.dataItem;\n\n return kendo.ui.icon($((\"\")), { icon: PIVOTGRID_TREND_ICONS_MAP[(\"kpi-trend-\" + (dataItem.value > 0 ? \"increase\" : dataItem.value < 0 ? \"decrease\" : \"equal\"))] });\n },\n DATACELL_TEMPLATE = function (ref) {\n var dataItem = ref.dataItem;\n\n return (\"\" + (dataItem ? encode(dataItem.fmtValue || dataItem.value) || \" \" : \" \"));\n },\n LAYOUT_TABLE = '' +\n '' +\n '' +\n '' +\n '' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
';\n var AXIS_ROWS = \"rows\";\n var AXIS_COLUMNS = \"columns\";\n\n var tableStyles = {\n tableRow: \"k-table-row\",\n header: \"k-header k-table-th\",\n headerTable: \"k-grid-header-table k-table k-table-md\",\n table: \"k-table k-table-md\",\n contentTable: \"k-grid-table k-table k-table-md\",\n tbody: \"k-table-tbody\",\n tableCell: \"k-table-td\"\n };\n\n function normalizeMeasures(measure) {\n var descriptor = typeof measure === \"string\" ? [{ name: measure }] : measure;\n var descriptors = toString.call(descriptor) === \"[object Array]\" ? descriptor : (descriptor !== undefined$1 ? [descriptor] : []);\n\n return map(descriptors, function(d) {\n if (typeof d === \"string\") {\n return { name: d };\n }\n return $.extend(true, d, { name: d.name, type: d.type });\n });\n }\n\n function normalizeMembers(member) {\n var descriptor = typeof member === \"string\" ? [{ name: [member], expand: false }] : member;\n var descriptors = toString.call(descriptor) === \"[object Array]\" ? descriptor : (descriptor !== undefined$1 ? [descriptor] : []);\n\n return map(descriptors, function(d) {\n if (typeof d === \"string\") {\n return { name: [d], expand: false };\n }\n return { name: (toString.call(d.name) === \"[object Array]\" ? d.name.slice() : [d.name]), expand: d.expand };\n });\n }\n\n function normalizeName(name) {\n if (name.indexOf(\" \") !== -1) {\n name = '[\"' + name + '\"]';\n }\n\n return name;\n }\n\n function accumulateMembers(accumulator, rootTuple, tuple, level) {\n var idx, length;\n var children;\n var member;\n\n if (!tuple) {\n tuple = rootTuple;\n }\n\n if (!level) {\n level = 0;\n }\n\n member = tuple.members[level];\n\n if (!member || member.measure) { //return if no member or measure\n return;\n }\n\n children = member.children;\n length = children.length;\n\n if (tuple === rootTuple) {\n accumulator[kendo.stringify([member.name])] = !!length;\n } else if (length) {\n accumulator[kendo.stringify(buildPath(tuple, level))] = true;\n }\n\n if (length) {\n for (idx = 0; idx < length; idx++) {\n accumulateMembers(accumulator, rootTuple, children[idx], level);\n }\n }\n\n accumulateMembers(accumulator, rootTuple, tuple, level + 1);\n }\n\n function descriptorsForAxes(tuples) {\n var result = {};\n\n if (tuples.length) {\n accumulateMembers(result, tuples[0]);\n }\n\n var descriptors = [];\n for (var k in result) {\n descriptors.push({ name: JSON.parse(k), expand: result[k] });\n }\n\n return descriptors;\n }\n\n function addMissingPathMembers(members, axis) {\n var tuples = axis.tuples || [];\n var firstTuple = tuples[0];\n\n if (firstTuple && members.length < firstTuple.members.length) {\n var tupleMembers = firstTuple.members;\n\n for (var idx = 0; idx < tupleMembers.length; idx++) {\n if (tupleMembers[idx].measure) {\n continue;\n }\n\n var found = false;\n for (var j = 0; j < members.length; j++) {\n if (getName(members[j]).indexOf(tupleMembers[idx].hierarchy) === 0) {\n found = true;\n break;\n }\n }\n\n if (!found) {\n members.push({ name: [tupleMembers[idx].name], expand: false }); //calling normalize here to make name from string to array\n }\n }\n }\n }\n\n function tupleToDescriptors(tuple) {\n var result = [];\n var members = tuple.members;\n\n for (var idx = 0; idx < members.length; idx++) {\n if (members[idx].measure) {\n continue;\n }\n\n //make tuple name an array\n result.push({ name: [members[idx].name], expand: members[idx].children.length > 0 });\n }\n\n return result;\n }\n\n function descriptorsForMembers(axis, members, measures) {\n axis = axis || {};\n\n addMissingPathMembers(members, axis);\n\n if (measures.length > 1) {\n members.push({\n name: MEASURES,\n measure: true,\n children: normalizeMembers(measures)\n });\n }\n\n var tupletoSearch = {\n members: members\n };\n\n if (axis.tuples) {\n var result = findExistingTuple(axis.tuples, tupletoSearch);\n if (result.tuple) {\n members = tupleToDescriptors(result.tuple);\n }\n }\n\n return members;\n }\n\n function createAggregateGetter(m) {\n var measureGetter = kendo.getter(m.field, true);\n return function(aggregatorContext, state) {\n return m.aggregate(measureGetter(aggregatorContext.dataItem), state, aggregatorContext);\n };\n }\n\n function isNumber(val) {\n return typeof val === \"number\" && !isNaN(val);\n }\n\n function isDate(val) {\n return val && val.getTime;\n }\n\n function getScollWidth() {\n var scrollbar = 0;\n var div;\n if (document && document.createElement) {\n div = document.createElement('div');\n\n div.style.cssText = 'overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block';\n div.innerHTML = ' ';\n document.body.appendChild(div);\n\n scrollbar = div.offsetWidth - div.scrollWidth;\n\n document.body.removeChild(div);\n }\n\n return scrollbar;\n }\n\n function flattenSortDescriptors(descriptors) {\n var result = [];\n for (var i = 0; i < descriptors.length; i++) {\n result.push({\n dir: descriptors[i].dir,\n field: descriptors[i].field.split(\".\").pop()\n });\n }\n return result;\n }\n\n function createLocalMeasure(field, key, format) {\n var formatFunc = function(value) { return kendo.format(this.format, value); };\n var measureMap = {\n \"Sum\": sumAggregate,\n \"Average\": averageAggregate,\n \"Min\": minAggregate,\n \"Max\": maxAggregate,\n };\n var valueFunc = function(item) { return item[this.field]; };\n var measure = {\n value: valueFunc.bind({ field: field }),\n aggregate: measureMap[key],\n caption: key,\n uniqueName: key,\n type: 2,\n name: [key]\n };\n if (format) {\n measure.aggregate.format = formatFunc.bind({ format: format });\n }\n\n return measure;\n }\n\n function getIcons(sortIcon, options, pivotOptions) {\n var sortable = options.sortable,\n filterable = options.filterable,\n reorderable = pivotOptions.reorderable,\n result = \"\";\n\n if (sortable) {\n result += sortIcon ? (\"\" + (kendo.ui.icon(sortIcon + \"-sm\")) + \"\") : '';\n }\n\n if (filterable || sortable) {\n result += \"\" + (kendo.ui.icon(\"more-vertical\")) + \"\";\n }\n if (reorderable) {\n result += \"\" + (kendo.ui.icon(\"x\")) + \"\";\n }\n\n return result;\n }\n\n var functions = {\n sum: function(value, state) {\n var accumulator = state.accumulator;\n\n if (!isNumber(accumulator)) {\n accumulator = value;\n } else if (isNumber(value)) {\n accumulator += value;\n }\n\n return accumulator;\n },\n count: function(value, state) {\n return (state.accumulator || 0) + 1;\n },\n average: {\n aggregate: function(value, state) {\n var accumulator = state.accumulator;\n\n if (state.count === undefined$1) {\n state.count = 0;\n }\n\n if (!isNumber(accumulator)) {\n accumulator = value;\n } else if (isNumber(value)) {\n accumulator += value;\n }\n\n if (isNumber(value)) {\n state.count++;\n }\n\n return accumulator;\n },\n result: function(state) {\n var accumulator = state.accumulator;\n\n if (isNumber(accumulator)) {\n accumulator = accumulator / state.count;\n }\n\n return accumulator;\n }\n },\n max: function(value, state) {\n var accumulator = state.accumulator;\n\n if (!isNumber(accumulator) && !isDate(accumulator)) {\n accumulator = value;\n }\n\n if (accumulator < value && (isNumber(value) || isDate(value))) {\n accumulator = value;\n }\n return accumulator;\n },\n min: function(value, state) {\n var accumulator = state.accumulator;\n\n if (!isNumber(accumulator) && !isDate(accumulator)) {\n accumulator = value;\n }\n\n if (accumulator > value && (isNumber(value) || isDate(value))) {\n accumulator = value;\n }\n return accumulator;\n }\n };\n\n var PivotCubeBuilder = Class.extend({\n init: function(options) {\n this.options = extend({}, this.options, options);\n this.dimensions = this._normalizeDescriptors(\"field\", this.options.dimensions);\n this.measures = this._normalizeDescriptors(\"name\", this.options.measures);\n },\n\n _normalizeDescriptors: function(keyField, descriptors) {\n descriptors = descriptors || {};\n var fields = {};\n var field;\n\n if (toString.call(descriptors) === \"[object Array]\") {\n for (var idx = 0, length = descriptors.length; idx < length; idx++) {\n field = descriptors[idx];\n if (typeof field === \"string\") {\n fields[field] = {};\n } else if (field[keyField]) {\n fields[field[keyField]] = field;\n }\n }\n descriptors = fields;\n }\n\n return descriptors;\n },\n\n _rootTuples: function(rootNames, measureAggregators) {\n var aggregatorsLength = measureAggregators.length || 1;\n var dimensionsSchema = this.dimensions || [];\n var root, name, parts;\n var measureIdx = 0;\n var idx;\n\n var rootNamesLength = rootNames.length;\n var result = [];\n var keys = [];\n\n if (rootNamesLength || measureAggregators.length) {\n for (measureIdx = 0; measureIdx < aggregatorsLength; measureIdx++) {\n\n root = { members: [] };\n\n for (idx = 0; idx < rootNamesLength; idx++) {\n name = rootNames[idx];\n parts = name.split(\"&\");\n\n root.members[root.members.length] = {\n children: [],\n caption: (dimensionsSchema[name] || {}).caption || \"All\",\n name: name,\n levelName: name,\n levelNum: \"0\",\n hasChildren: true,\n parentName: parts.length > 1 ? parts[0] : undefined$1,\n hierarchy: name\n };\n }\n\n if (aggregatorsLength > 1) {\n root.members[root.members.length] = {\n children: [],\n caption: (measureAggregators[measureIdx]).caption,\n name: measureAggregators[measureIdx].descriptor.name,\n levelName: \"MEASURES\",\n levelNum: \"0\",\n hasChildren: false,\n parentName: undefined$1,\n hierarchy: \"MEASURES\"\n };\n }\n\n result[result.length] = root;\n }\n\n keys.push(ROW_TOTAL_KEY);\n }\n\n return {\n keys: keys,\n tuples: result\n };\n },\n\n _sortMap: function(map, sortDescriptors) {\n var sortedMaps = [];\n var sortTree = [];\n var flattenTree = [];\n var mapItem;\n var key;\n\n for (key in map) {\n if (!map[key].directParentName) {\n sortTree.push($.extend({}, { name: key, parentName: map[key].parentName }));\n }\n }\n\n //if there are no root this means that something is expanding\n //and we should only sort that part of the tree\n if (!sortTree.length) {\n for (key in map) {\n sortTree.push($.extend({}, { name: key, parentName: map[key].parentName }));\n }\n }\n\n fillSortTree(sortTree, map);\n\n // fill tree recursive\n for (var i = 0; i < sortDescriptors.length; i++) {\n sortItemsTree(sortDescriptors[i].field.split(\".\").pop(), sortTree, Comparer.create({ field: \"name\", dir: sortDescriptors[i].dir }));\n }\n\n flattenTree = flatColumns(sortTree);\n\n //we need to flatten the structure so the tuples can build correctly\n for (var j = 0; j < flattenTree.length; j++) {\n mapItem = map[flattenTree[j].name];\n mapItem.index = j;\n sortedMaps[j] = mapItem;\n }\n\n return sortedMaps;\n },\n\n _expandedTuples: function(map, expanded, measureAggregators, sortDescriptors) {\n var aggregatorsLength = measureAggregators.length || 1;\n var dimensionsSchema = this.dimensions || [];\n var measureIdx;\n var tuple;\n\n var key;\n var mapItem;\n var current;\n var currentKeys;\n var accumulator = [];\n var accumulatorKeys = [];\n var memberInfo;\n\n var expandedNames;\n var parts;\n var name;\n var idx;\n\n if (sortDescriptors && sortDescriptors.length && !$.isEmptyObject(map)) {\n map = this._sortMap(map, sortDescriptors);\n }\n\n for (key in map) {\n mapItem = map[key];\n memberInfo = this._findExpandedMember(expanded, mapItem.uniquePath);\n\n current = accumulator[memberInfo.index] || [];\n currentKeys = accumulatorKeys[memberInfo.index] || [];\n\n expandedNames = memberInfo.member.names;\n\n for (measureIdx = 0; measureIdx < aggregatorsLength; measureIdx++) {\n tuple = { members: [] };\n for (idx = 0; idx < expandedNames.length; idx++) {\n if (idx === memberInfo.member.expandedIdx) {\n tuple.members[tuple.members.length] = {\n children: [],\n caption: mapItem.value,\n name: mapItem.name,\n hasChildren: false,\n levelNum: 1,\n levelName: mapItem.parentName + mapItem.name,\n parentName: mapItem.parentName,\n hierarchy: mapItem.parentName + mapItem.name\n };\n\n if (measureIdx === 0) {\n currentKeys.push(buildPath(tuple, idx).join(\"\"));\n }\n } else {\n name = expandedNames[idx];\n parts = name.split(\"&\");\n tuple.members[tuple.members.length] = {\n children: [],\n caption: (dimensionsSchema[name] || {}).caption || \"All\",\n name: name,\n levelName: name,\n levelNum: \"0\",\n hasChildren: true,\n parentName: parts.length > 1 ? parts[0] : undefined$1,\n hierarchy: name\n };\n }\n }\n\n if (aggregatorsLength > 1) {\n tuple.members[tuple.members.length] = {\n children: [],\n caption: measureAggregators[measureIdx].caption,\n name: measureAggregators[measureIdx].descriptor.name,\n levelName: \"MEASURES\",\n levelNum: \"0\",\n hasChildren: true,\n parentName: undefined$1,\n hierarchy: \"MEASURES\"\n };\n }\n\n current[current.length] = tuple;\n }\n\n accumulator[memberInfo.index] = current;\n accumulatorKeys[memberInfo.index] = currentKeys;\n }\n\n return {\n keys: accumulatorKeys,\n tuples: accumulator\n };\n },\n\n _findExpandedMember: function(members, parentName) {\n for (var idx = 0; idx < members.length; idx++) {\n if (members[idx].uniquePath === parentName) {\n return {\n member: members[idx],\n index: idx\n };\n }\n }\n },\n\n _asTuples: function(map, descriptor, measureAggregators, sortDescriptors) {\n measureAggregators = measureAggregators || [];\n\n var rootInfo = this._rootTuples(descriptor.root, measureAggregators);\n var expandedInfo = this._expandedTuples(map, descriptor.expanded, measureAggregators, sortDescriptors);\n\n return {\n keys: [].concat.apply(rootInfo.keys, expandedInfo.keys),\n tuples: [].concat.apply(rootInfo.tuples, expandedInfo.tuples)\n };\n },\n\n _measuresInfo: function(measures, rowAxis) {\n var idx = 0;\n var length = measures && measures.length;\n\n var aggregateNames = [];\n var resultFuncs = {};\n var formats = {};\n\n var descriptors = (this.measures || {});\n var measure;\n var name;\n\n for (; idx < length; idx++) {\n name = measures[idx].descriptor.name;\n measure = descriptors[name] || {};\n\n aggregateNames.push(name);\n\n if (measure.result) {\n resultFuncs[name] = measure.result;\n }\n\n if (measure.format) {\n formats[name] = measure.format;\n }\n }\n\n return {\n names: aggregateNames,\n formats: formats,\n resultFuncs: resultFuncs,\n rowAxis: rowAxis\n };\n },\n\n _toDataArray: function(map, measuresInfo, rowKeys, columnKeys) {\n var result = [];\n\n var aggregates;\n var name, i, j, k, n;\n var row, column, columnKey;\n\n var rowMeasureNamesLength = 1;\n var rowMeasureNames = [];\n var columnMeasureNames;\n\n var rowLength = rowKeys.length || 1;\n var columnLength = columnKeys.length || 1;\n\n if (measuresInfo.rowAxis) {\n rowMeasureNames = measuresInfo.names;\n rowMeasureNamesLength = rowMeasureNames.length;\n } else {\n columnMeasureNames = measuresInfo.names;\n }\n\n for (i = 0; i < rowLength; i++) {\n row = map[rowKeys[i] || ROW_TOTAL_KEY];\n\n for (n = 0; n < rowMeasureNamesLength; n++) {\n if (measuresInfo.rowAxis) {\n columnMeasureNames = [rowMeasureNames[n]];\n }\n\n for (j = 0; j < columnLength; j++) {\n columnKey = columnKeys[j] || ROW_TOTAL_KEY;\n column = row.items[columnKey];\n\n if (columnKey === ROW_TOTAL_KEY) {\n aggregates = row.aggregates;\n } else {\n aggregates = column ? column.aggregates : {};\n }\n\n for (k = 0; k < columnMeasureNames.length; k++) {\n name = columnMeasureNames[k];\n this._addData(result, aggregates[name], measuresInfo.formats[name], measuresInfo.resultFuncs[name]);\n }\n }\n }\n }\n\n return result;\n },\n\n _addData: function(result, value, format, resultFunc) {\n var fmtValue = \"\";\n var ordinal;\n\n if (value) {\n value = resultFunc ? resultFunc(value) : value.accumulator;\n fmtValue = format ? kendo.format(format, value) : value;\n }\n\n ordinal = result.length;\n\n result[ordinal] = {\n ordinal: ordinal,\n value: value || \"\",\n fmtValue: fmtValue\n };\n },\n\n _matchDescriptors: function(dataItem, descriptor, getters) {\n var parts;\n var parentField;\n var expectedValue;\n\n var names = descriptor.names;\n var idx = descriptor.expandedIdx;\n var value;\n\n while (idx > 0) {\n parts = names[--idx].split(\"&\");\n if (parts.length > 1) {\n parentField = parts[0];\n expectedValue = parts[1];\n\n value = getters[parentField](dataItem);\n value = (value !== undefined$1 && value !== null) ? value.toString() : value;\n\n if (value != expectedValue) {\n return false;\n }\n }\n }\n return true;\n },\n\n _calculateAggregate: function(measureAggregators, aggregatorContext, totalItem) {\n var result = {};\n var state;\n var name;\n\n for (var measureIdx = 0; measureIdx < measureAggregators.length; measureIdx++) {\n name = measureAggregators[measureIdx].descriptor.name;\n state = totalItem.aggregates[name] || { };\n state.accumulator = measureAggregators[measureIdx].aggregator(aggregatorContext, state);\n result[name] = state;\n }\n\n return result;\n },\n\n _processColumns: function(measureAggregators, descriptors, getters, columns, aggregatorContext, rowTotal, state, updateColumn) {\n var value;\n var descriptor;\n var column;\n var totalItem;\n var key, name, parentName, path;\n var dataItem = aggregatorContext.dataItem;\n var idx = 0;\n\n for (; idx < descriptors.length; idx++) {\n descriptor = descriptors[idx];\n\n //checks whether the dataItem is relevant to the descriptors\n if (!this._matchDescriptors(dataItem, descriptor, getters)) {\n continue;\n }\n\n path = descriptor.names.slice(0, descriptor.expandedIdx).join(\"\");\n name = descriptor.names[descriptor.expandedIdx];\n\n\n value = getters[name](dataItem);\n value = (value !== undefined$1 && value !== null) ? value.toString() : value;\n\n parentName = name;\n name = name + \"&\" + value;\n key = path + name;\n\n column = columns[key] || {\n index: state.columnIndex,\n parentName: parentName,\n name: name,\n directParentName: path.indexOf(\"&\") !== -1 ? path : \"\",\n uniquePath: path + parentName,\n childrenMap: {},\n value: value\n };\n\n if (path && columns[path] && !columns[path].childrenMap[path + parentName + \"&\" + value]) {\n columns[path].childrenMap[path + parentName + \"&\" + value] = true;\n }\n\n totalItem = rowTotal.items[key] || {\n aggregates: {}\n };\n\n rowTotal.items[key] = {\n index: column.index,\n aggregates: this._calculateAggregate(measureAggregators, aggregatorContext, totalItem)\n };\n\n if (updateColumn) {\n if (!columns[key]) {\n state.columnIndex++;\n }\n columns[key] = column;\n }\n }\n },\n\n _measureAggregators: function(options) {\n var measureDescriptors = options.measures || [];\n var measures = this.measures || {};\n var aggregators = [];\n var descriptor, measure, idx, length;\n var defaultAggregate, aggregate;\n\n if (measureDescriptors.length) {\n for (idx = 0, length = measureDescriptors.length; idx < length; idx++) {\n descriptor = measureDescriptors[idx];\n measure = measures[descriptor.name];\n defaultAggregate = null;\n\n if (measure) {\n aggregate = measure.aggregate;\n if (typeof aggregate === \"string\") {\n defaultAggregate = functions[aggregate.toLowerCase()];\n\n if (!defaultAggregate) {\n throw new Error(\"There is no such aggregate function\");\n }\n\n measure.aggregate = defaultAggregate.aggregate || defaultAggregate;\n measure.result = defaultAggregate.result;\n }\n\n\n aggregators.push({\n descriptor: descriptor,\n caption: measure.caption,\n result: measure.result,\n aggregator: createAggregateGetter(measure)\n });\n }\n }\n } else {\n aggregators.push({\n descriptor: { name: \"default\" },\n caption: \"default\",\n aggregator: function() { return 1; }\n });\n }\n\n return aggregators;\n },\n\n _buildGetters: function(names) {\n var result = {};\n var parts;\n var name;\n\n for (var idx = 0; idx < names.length; idx++) {\n name = names[idx];\n parts = name.split(\"&\");\n\n if (parts.length > 1) {\n result[parts[0]] = kendo.getter(parts[0], true);\n } else {\n result[name] = kendo.getter(normalizeName(name), true);\n }\n }\n\n return result;\n },\n\n _parseDescriptors: function(descriptors) {\n var parsedDescriptors = parseDescriptors(descriptors);\n var rootNames = getRootNames(parsedDescriptors.root);\n var expanded = parsedDescriptors.expanded;\n var result = [];\n\n for (var idx = 0; idx < expanded.length; idx++) {\n result.push(mapNames(expanded[idx].name, rootNames));\n }\n\n return {\n root: rootNames,\n expanded: result\n };\n },\n\n _filter: function(data, filter) {\n if (!filter) {\n return data;\n }\n\n var expr;\n var idx = 0;\n var filters = filter.filters;\n\n for (; idx < filters.length; idx++) {\n expr = filters[idx];\n\n if (expr.operator === \"in\") {\n filters[idx] = this._normalizeFilter(expr);\n }\n }\n\n return new kendo.data.Query(data).filter(filter).data;\n },\n\n _normalizeFilter: function(filter) {\n var value = filter.value.split(\",\");\n var result = [];\n\n if (!value.length) {\n return value;\n }\n\n for (var idx = 0; idx < value.length; idx++) {\n result.push({\n field: filter.field,\n operator: \"eq\",\n value: value[idx]\n });\n }\n\n return {\n logic: \"or\",\n filters: result\n };\n },\n\n process: function(data, options) {\n data = data || [];\n options = options || {};\n\n data = this._filter(data, options.filter);\n\n var measures = options.measures || [];\n\n var measuresRowAxis = options.measuresAxis === \"rows\";\n\n var columnDescriptors = options.columns || [];\n var rowDescriptors = options.rows || [];\n\n if (!columnDescriptors.length && rowDescriptors.length && (!measures.length || (measures.length && measuresRowAxis))) {\n columnDescriptors = rowDescriptors;\n rowDescriptors = [];\n measuresRowAxis = false;\n }\n\n if (!columnDescriptors.length && !rowDescriptors.length) {\n measuresRowAxis = false;\n }\n\n if (!columnDescriptors.length && measures.length) {\n columnDescriptors = normalizeMembers(options.measures);\n }\n\n columnDescriptors = this._parseDescriptors(columnDescriptors);\n rowDescriptors = this._parseDescriptors(rowDescriptors);\n\n var aggregatedData = {};\n var columns = {};\n var rows = {};\n\n var rowValue;\n var state = { columnIndex: 0 };\n\n var measureAggregators = this._measureAggregators(options);\n\n var columnGetters = this._buildGetters(columnDescriptors.root);\n var rowGetters = this._buildGetters(rowDescriptors.root);\n\n var processed = false;\n\n var expandedColumns = columnDescriptors.expanded;\n var expandedRows = rowDescriptors.expanded;\n\n var dataItem;\n var aggregatorContext;\n var hasExpandedRows = expandedRows.length !== 0;\n\n var rowIdx, rowDescriptor, rowName, rowTotal;\n var key, path, parentName, value;\n var columnsInfo, rowsInfo;\n var length = data.length;\n var idx = 0;\n\n if (columnDescriptors.root.length || rowDescriptors.root.length) {\n processed = true;\n\n for (idx = 0; idx < length; idx++) {\n dataItem = data[idx];\n\n aggregatorContext = {\n dataItem: dataItem,\n index: idx\n };\n\n rowTotal = aggregatedData[ROW_TOTAL_KEY] || {\n items: {},\n aggregates: {}\n };\n\n this._processColumns(measureAggregators, expandedColumns, columnGetters, columns, aggregatorContext, rowTotal, state, !hasExpandedRows);\n\n rowTotal.aggregates = this._calculateAggregate(measureAggregators, aggregatorContext, rowTotal);\n aggregatedData[ROW_TOTAL_KEY] = rowTotal;\n\n for (rowIdx = 0; rowIdx < expandedRows.length; rowIdx++) {\n rowDescriptor = expandedRows[rowIdx];\n\n if (!this._matchDescriptors(dataItem, rowDescriptor, rowGetters)) {\n this._processColumns(measureAggregators, expandedColumns, columnGetters, columns, aggregatorContext, { items: {}, aggregates: {} }, state, true);\n continue;\n }\n\n path = rowDescriptor.names.slice(0, rowDescriptor.expandedIdx).join(\"\");\n rowName = rowDescriptor.names[rowDescriptor.expandedIdx];\n\n parentName = rowName;\n\n rowValue = rowGetters[rowName](dataItem);\n rowValue = rowValue !== undefined$1 ? rowValue.toString() : rowValue;\n\n rowName = rowName + \"&\" + rowValue;\n key = path + rowName;\n\n rows[key] = {\n uniquePath: path + parentName,\n parentName: parentName,\n name: rowName,\n value: rowValue\n };\n\n value = aggregatedData[key] || {\n items: {},\n aggregates: {}\n };\n\n this._processColumns(measureAggregators, expandedColumns, columnGetters, columns, aggregatorContext, value, state, true);\n\n value.aggregates = this._calculateAggregate(measureAggregators, aggregatorContext, value);\n aggregatedData[key] = value;\n }\n }\n }\n\n if (processed && length) {\n if (measureAggregators.length > 1 && (!options.columns || !options.columns.length)) {\n columnDescriptors = {\n root: [],\n expanded: []\n };\n }\n\n columnsInfo = this._asTuples(columns, columnDescriptors, measuresRowAxis ? [] : measureAggregators, options.sort ? options.sort : []);\n rowsInfo = this._asTuples(rows, rowDescriptors, measuresRowAxis ? measureAggregators : [], options.sort ? options.sort : []);\n\n columns = columnsInfo.tuples;\n rows = rowsInfo.tuples;\n\n aggregatedData = this._toDataArray(aggregatedData, this._measuresInfo(measureAggregators, measuresRowAxis), rowsInfo.keys, columnsInfo.keys);\n } else {\n aggregatedData = columns = rows = [];\n }\n\n return {\n axes: {\n columns: { tuples: columns },\n rows: { tuples: rows }\n },\n data: aggregatedData\n };\n }\n });\n\n var PivotTransport = Class.extend({\n init: function(options, transport) {\n this.transport = transport;\n this.options = transport.options || {};\n\n if (!this.transport.discover) {\n if (isFunction(options.discover)) {\n this.discover = options.discover;\n }\n }\n },\n read: function(options) {\n return this.transport.read(options);\n },\n update: function(options) {\n return this.transport.update(options);\n },\n create: function(options) {\n return this.transport.create(options);\n },\n destroy: function(options) {\n return this.transport.destroy(options);\n },\n discover: function(options) {\n if (this.transport.discover) {\n return this.transport.discover(options);\n }\n options.success({});\n },\n catalog: function(val) {\n var options = this.options || {};\n\n if (val === undefined$1) {\n return (options.connection || {}).catalog;\n\n }\n\n var connection = options.connection || {};\n connection.catalog = val;\n\n this.options.connection = connection;\n $.extend(this.transport.options, { connection: connection });\n },\n cube: function(val) {\n var options = this.options || {};\n\n if (val === undefined$1) {\n return (options.connection || {}).cube;\n }\n\n var connection = options.connection || {};\n connection.cube = val;\n\n this.options.connection = connection;\n extend(true, this.transport.options, { connection: connection });\n }\n });\n\n var PivotDataSourceV2 = DataSource.extend({\n init: function(options) {\n\n var cube = ((options || {}).schema || {}).cube;\n\n var schema = {\n axes: identity,\n cubes: identity,\n catalogs: identity,\n measures: identity,\n dimensions: identity,\n hierarchies: identity,\n levels: identity,\n members: identity\n };\n\n if (cube) {\n this.cubeSchema = $.extend(schema, this._cubeSchema(cube));\n }\n\n DataSource.fn.init.call(this, extend(true, {}, {\n //schema: schema\n }, options));\n\n var transportOptions = this.options.transport || {};\n if ((this.options.type || \"xmla\").toLowerCase() === \"xmla\") {\n this._online = true;\n this.transport = new XmlaTransportV2(transportOptions);\n }\n\n this._columns = normalizeMembers(this.options.columns);\n this._rows = normalizeMembers(this.options.rows);\n\n var measures = this.cubeSchema ? this.cubeSchema.measures() : this.options.measures || [];\n\n if (toString.call(measures) === \"[object Object]\") {\n this._measuresAxis = measures.axis || \"columns\";\n measures = measures.values || [];\n }\n\n this._measures = normalizeMeasures(measures);\n },\n\n options: {\n serverSorting: true,\n serverPaging: true,\n serverFiltering: true,\n serverGrouping: true,\n serverAggregates: true\n },\n\n axes: function() {\n return {\n columns: normalizeAxis(this.columns()),\n rows: normalizeAxis(this.rows())\n };\n },\n\n catalog: function(val) {\n if (val === undefined$1) {\n return this.transport.catalog();\n }\n\n this.transport.catalog(val);\n this._mergeState({});// clears current state\n this.read();\n },\n\n cube: function(val) {\n if (val === undefined$1) {\n return this.transport.cube();\n }\n\n this.transport.cube(val);\n this._mergeState({});// clears current state\n this.read();\n },\n\n measuresAxis: function() {\n return this._measuresAxis || \"columns\";\n },\n\n fetch: function(callback) {\n var that = this;\n if (this._data === undefined$1 || this._data.length === 0) {\n var fn = function() {\n if (isFunction(callback)) {\n callback.call(that);\n }\n };\n\n return this._query().done(fn);\n }\n },\n\n _createSettings: function(axes) {\n var settings = [];\n var key;\n var dimensions = this.cubeSchema.dimensionsSettings();\n var displayValueFunc = function(item) { return item[this.key]; };\n var sortValueFunc = function(value) { return value; };\n for (var i = 0; i < axes.length; i++) {\n key = axes[i].name[0];\n settings.push({\n key: key,\n displayValue: displayValueFunc.bind({ key: key }),\n sortValue: sortValueFunc,\n caption: (dimensions[key] || {}).caption || key\n });\n }\n return settings;\n },\n\n _cubeSchema: function(cube) {\n return {\n dimensionsSettings: function() {\n return cube.dimensions;\n },\n dimensions: function() {\n var result = [];\n var dimensions = cube.dimensions;\n\n for (var key in dimensions) {\n result.push({\n name: key,\n caption: dimensions[key].caption || key,\n uniqueName: key,\n defaultHierarchy: key,\n type: 1\n });\n }\n\n if (cube.measures) {\n result.push({\n name: MEASURES,\n caption: MEASURES,\n uniqueName: MEASURES,\n type: 2\n });\n }\n\n return result;\n },\n restoreMeasure: function(measures, measure) {\n for (var i = 0; i < measures.length; i++) {\n if (!measures[i].aggregate) {\n measures[i].aggregate = measure.aggregate;\n measures[i].value = measure.value;\n measures[i].caption = measure.caption;\n measures[i].uniqueName = measure.uniqueName;\n measures[i].type = 2;\n }\n }\n },\n measures: function() {\n var result = [];\n var measures = cube.measures;\n\n for (var key in measures) {\n result.push(createLocalMeasure(measures[key].field, key, measures[key].format));\n }\n\n return result;\n },\n memberType: function(name) {\n var getter = kendo.getter(normalizeName(name), true);\n var data = this.options.data || this._pristineData || [];\n if (!data.length) {\n return null;\n }\n\n return typeof getter(data[0]);\n }.bind(this),\n members: function(name) {\n var data = this.options.data || this._pristineData || [];\n var result = [];\n var distinct = {};\n var getter;\n var value;\n var idx = 0;\n\n if (name.indexOf(\"[(ALL)]\") !== -1) {\n return [\n {\n caption: cube.dimensions[name.split(\".\")[0]].caption || name,\n levelUniqueName: name,\n name: name,\n childrenCardinality: 1,\n uniqueName: name\n }\n ];\n }\n\n getter = kendo.getter(normalizeName(name), true);\n\n for (; idx < data.length; idx++) {\n value = getter(data[idx]);\n if ((value || value === 0 || value === false) && !distinct[value]) {\n distinct[value] = true;\n\n result.push({\n caption: value + \"\",\n name: value + \"\",\n childrenCardinality: 0,\n uniqueName: value\n });\n }\n }\n\n return result;\n }.bind(this)\n };\n },\n\n read: function(data) {\n var that = this;\n var isPrevented = that.trigger(REQUESTSTART, { type: READ });\n var params = that._params(data);\n var deferred = $.Deferred();\n if (!isPrevented) {\n that.trigger(PROGRESS);\n\n if (that.options.data) {\n\n var originalData = (this.reader.data(this.options.data) || []).slice(0);\n if (originalData && !this._pristineData) {\n this._pristineData = originalData;\n }\n var columnSettings = that._createSettings(params.columnAxes);\n var rowSettings = that._createSettings(params.rowAxes);\n var measures = that.measures();\n var dataTree = createDataTree(that.options.data, rowSettings, columnSettings, measures, { dataField: \"aggregate\", columnsData: \"columns\" }, that.filter() || []);\n\n var stateArgs = {\n dataTree: dataTree,\n columnSettings: columnSettings,\n rowSettings: rowSettings,\n columnAxes: params.columnAxes,\n rowAxes: params.rowAxes,\n measures: measures.map(function(item) { return item; }).reverse(),\n fields: { dataField: \"aggregate\", columnsData: \"columns\" },\n sort: flattenSortDescriptors(params.sort || [])\n };\n\n that._saveState(createLocalDataState(stateArgs));\n that.trigger(CHANGE);\n deferred.resolve();\n } else {\n that.transport.read({\n data: params,\n success: function(newDataState) {\n that._saveState(newDataState);\n that.trigger(REQUESTEND, { response: newDataState, type: READ });\n that.trigger(CHANGE);\n if (that._preventRefresh) {\n that._preventRefresh = false;\n }\n deferred.resolve();\n },\n error: function(err) {\n that.trigger(ERROR, { error: err });\n }\n });\n }\n }\n return deferred.promise();\n },\n\n _params: function(data) {\n var that = this;\n var options = DataSource.fn._params.call(that, data);\n\n options = extend({\n columnAxes: JSON.parse(JSON.stringify(that._columns)),\n rowAxes: JSON.parse(JSON.stringify(that._rows)),\n measuresAxis: that.measuresAxis(),\n measureAxes: that._measures\n }, options);\n\n if ((this.options.type || \"\").toLowerCase() === \"xmla\") {\n options.connection = that.options.transport.connection;\n }\n\n if (options.filter) {\n options.filter = normalizeFilter(options.filter);\n options.filter = (options.filter || {}).filters;\n }\n\n if (options.sort) {\n options.sort = normalizeSort(options.sort);\n }\n\n return options;\n },\n\n discover: function(options) {\n var that = this,\n transport = that.transport;\n\n if (transport.discover) {\n return transport.discover(options);\n }\n },\n\n schemaMeasures: function() {\n var that = this;\n return that.discover(\n {\n command: \"schemaMeasures\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }\n }, function(response) {\n return response;\n });\n },\n\n schemaKPIs: function() {\n var that = this;\n\n return that.discover(\n {\n command: \"schemaKPIs\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }\n }, function(response) {\n return response;\n });\n },\n\n schemaDimensions: function() {\n var that = this;\n\n return that.discover(\n {\n command: \"schemaDimensions\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }\n }, function(response) {\n return response;\n });\n },\n\n schemaHierarchies: function(dimensionName) {\n var that = this;\n\n return that.discover({\n command: \"schemaHierarchies\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube(),\n dimensionUniqueName: dimensionName\n }\n }, function(response) {\n return response;\n });\n },\n\n schemaLevels: function(hierarchyName) {\n var that = this;\n\n return that.discover({\n command: \"schemaLevels\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube(),\n hierarchyUniqueName: hierarchyName\n }\n }, function(response) {\n return response;\n });\n },\n\n schemaCubes: function() {\n var that = this;\n\n return that.discover({\n command: \"schemaCubes\",\n restrictions: {\n catalogName: that.transport.catalog()\n }\n }, function(response) {\n return response;\n });\n },\n\n schemaCatalogs: function() {\n var that = this;\n\n return that.discover({\n command: \"schemaCatalogs\"\n }, function(response) {\n return response;\n });\n },\n\n schemaMembers: function(restrictions) {\n var that = this;\n\n return that.discover({\n command: \"schemaMembers\",\n restrictions: extend({\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }, restrictions)\n }, function(response) {\n return response;\n });\n },\n\n _saveState: function(state) {\n var that = this;\n\n that._columnTuples = state.columns;\n that._rowTuples = state.rows;\n that._view = that._data = state.data;\n },\n\n columns: function(val) {\n if (val === undefined$1) {\n return this._columns;\n }\n\n this._columns = normalizeMembers(val);\n this.read();\n },\n\n rows: function(val) {\n if (val === undefined$1) {\n return this._rows;\n }\n\n this._rows = normalizeMembers(val);\n\n this.read();\n },\n\n measures: function(val) {\n if (val === undefined$1) {\n return this._measures;\n }\n\n this._measures = normalizeMeasures(val);\n\n this.read();\n },\n\n _mergeState: function(options) {\n options = DataSource.fn._mergeState.call(this, options);\n\n return options;\n },\n\n _query: function(options) {\n var that = this;\n var params = extend({}, {\n sort: that.sort(),\n measuresAxis: that.measuresAxis(),\n filter: that.filter()\n }, options);\n this._mergeState(params);\n\n return this.read();\n },\n });\n\n var PivotDataSource = DataSource.extend({\n init: function(options) {\n var cube = ((options || {}).schema || {}).cube;\n var measuresAxis = \"columns\";\n var measures;\n\n var schema = {\n axes: identity,\n cubes: identity,\n catalogs: identity,\n measures: identity,\n dimensions: identity,\n hierarchies: identity,\n levels: identity,\n members: identity\n };\n\n if (cube) {\n schema = $.extend(schema, this._cubeSchema(cube));\n this.cubeBuilder = new PivotCubeBuilder(cube);\n }\n\n DataSource.fn.init.call(this, extend(true, {}, {\n schema: schema\n }, options));\n\n this.transport = new PivotTransport(this.options.transport || {}, this.transport);\n\n this._columns = normalizeMembers(this.options.columns);\n this._rows = normalizeMembers(this.options.rows);\n\n measures = this.options.measures || [];\n\n if (toString.call(measures) === \"[object Object]\") {\n measuresAxis = measures.axis || \"columns\";\n measures = measures.values || [];\n }\n\n this._measures = normalizeMeasures(measures);\n this._measuresAxis = measuresAxis;\n\n this._skipNormalize = 0;\n this._axes = {};\n },\n\n _cubeSchema: function(cube) {\n return {\n dimensions: function() {\n var result = [];\n var dimensions = cube.dimensions;\n\n for (var key in dimensions) {\n result.push({\n name: key,\n caption: dimensions[key].caption || key,\n uniqueName: key,\n defaultHierarchy: key,\n type: 1\n });\n }\n\n if (cube.measures) {\n result.push({\n name: MEASURES,\n caption: MEASURES,\n uniqueName: MEASURES,\n type: 2\n });\n }\n\n return result;\n },\n hierarchies: function() {\n return [];\n },\n measures: function() {\n var result = [];\n var measures = cube.measures;\n\n for (var key in measures) {\n result.push({\n name: key,\n caption: key,\n uniqueName: key,\n aggregator: key\n });\n }\n\n return result;\n },\n members: function(response, restrictions) {\n var name = restrictions.levelUniqueName || restrictions.memberUniqueName;\n var schemaData = this.options.schema.data;\n var dataGetter = isFunction(schemaData) ? schemaData : kendo.getter(schemaData, true);\n var data = (this.options.data && dataGetter(this.options.data)) || this._rawData || [];\n var result = [];\n var getter;\n var value;\n var idx = 0;\n var distinct = {};\n\n if (name) {\n name = name.split(\".\")[0];\n }\n\n if (!restrictions.treeOp) {\n result.push({\n caption: cube.dimensions[name].caption || name,\n childrenCardinality: \"1\",\n dimensionUniqueName: name,\n hierarchyUniqueName: name,\n levelUniqueName: name,\n name: name,\n uniqueName: name\n });\n\n return result;\n }\n\n getter = kendo.getter(normalizeName(name), true);\n\n for (; idx < data.length; idx++) {\n value = getter(data[idx]);\n if ((value || value === 0) && !distinct[value]) {\n distinct[value] = true;\n\n result.push({\n caption: value,\n childrenCardinality: \"0\",\n dimensionUniqueName: name,\n hierarchyUniqueName: name,\n levelUniqueName: name,\n name: value,\n uniqueName: value\n });\n }\n }\n\n return result;\n }.bind(this)\n };\n },\n\n options: {\n serverSorting: true,\n serverPaging: true,\n serverFiltering: true,\n serverGrouping: true,\n serverAggregates: true\n },\n\n catalog: function(val) {\n if (val === undefined$1) {\n return this.transport.catalog();\n }\n\n this.transport.catalog(val);\n this._mergeState({});// clears current state\n this._axes = {};\n this.data([]);\n },\n\n cube: function(val) {\n if (val === undefined$1) {\n return this.transport.cube();\n }\n\n this.transport.cube(val);\n this._axes = {};\n this._mergeState({});// clears current state\n this.data([]);\n },\n\n axes: function() {\n return this._axes;\n },\n\n columns: function(val) {\n if (val === undefined$1) {\n return this._columns;\n }\n\n this._skipNormalize += 1;\n this._clearAxesData = true;\n\n this._columns = normalizeMembers(val);\n this.query({\n columns: val,\n rows: this.rowsAxisDescriptors(),\n measures: this.measures(),\n sort: this.sort(),\n filter: this.filter()\n });\n },\n\n rows: function(val) {\n if (val === undefined$1) {\n return this._rows;\n }\n\n this._skipNormalize += 1;\n this._clearAxesData = true;\n\n this._rows = normalizeMembers(val);\n\n this.query({\n columns: this.columnsAxisDescriptors(),\n rows: val,\n measures: this.measures(),\n sort: this.sort(),\n filter: this.filter()\n });\n },\n\n measures: function(val) {\n if (val === undefined$1) {\n return this._measures;\n }\n\n this._skipNormalize += 1;\n this._clearAxesData = true;\n\n this.query({\n columns: this.columnsAxisDescriptors(),\n rows: this.rowsAxisDescriptors(),\n measures: normalizeMeasures(val),\n sort: this.sort(),\n filter: this.filter()\n });\n },\n\n measuresAxis: function() {\n return this._measuresAxis || \"columns\";\n },\n\n _expandPath: function(path, axis) {\n var origin = axis === \"columns\" ? \"columns\" : \"rows\";\n var other = axis === \"columns\" ? \"rows\" : \"columns\";\n\n var members = normalizeMembers(path);\n var memberToExpand = getName(members[members.length - 1]);\n\n this._lastExpanded = origin;\n\n members = descriptorsForMembers(this.axes()[origin], members, this.measures());\n\n for (var idx = 0; idx < members.length; idx++) {\n var memberName = getName(members[idx]);\n\n if (memberName === memberToExpand) {\n if (members[idx].expand) {\n return;\n }\n members[idx].expand = true;\n } else {\n members[idx].expand = false;\n }\n }\n\n var descriptors = {};\n descriptors[origin] = members;\n descriptors[other] = this._descriptorsForAxis(other);\n\n this._query(descriptors);\n },\n\n _descriptorsForAxis: function(axis) {\n var axes = this.axes();\n var descriptors = this[axis]() || [];\n\n if (axes && axes[axis] && axes[axis].tuples && axes[axis].tuples[0]) {\n descriptors = descriptorsForAxes(axes[axis].tuples || []);\n }\n return descriptors;\n },\n\n columnsAxisDescriptors: function() {\n return this._descriptorsForAxis(\"columns\");\n },\n\n rowsAxisDescriptors: function() {\n return this._descriptorsForAxis(\"rows\");\n },\n\n _process: function(data, e) {\n this._view = data;\n\n e = e || {};\n e.items = e.items || this._view;\n\n this.trigger(CHANGE, e);\n },\n\n _query: function(options) {\n var that = this;\n\n if (!options) {\n this._skipNormalize += 1;\n this._clearAxesData = true;\n }\n\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 columns: this.columnsAxisDescriptors(),\n rows: this.rowsAxisDescriptors(),\n measures: this.measures()\n }, options));\n },\n\n query: function(options) {\n var state = this._mergeState(options);\n\n if (this._data.length && this.cubeBuilder) {\n this._params(state);\n this._updateLocalData(this._pristineData);\n\n return $.Deferred().resolve().promise();\n }\n\n return this.read(state);\n },\n\n _mergeState: function(options) {\n options = DataSource.fn._mergeState.call(this, options);\n\n if (options !== undefined$1) {\n this._measures = normalizeMeasures(options.measures);\n\n if (options.columns) {\n options.columns = normalizeMembers(options.columns);\n } else if (!options.columns) {\n this._columns = [];\n }\n\n if (options.rows) {\n options.rows = normalizeMembers(options.rows);\n } else if (!options.rows) {\n this._rows = [];\n }\n }\n return options;\n },\n\n filter: function(val) {\n if (val === undefined$1) {\n return this._filter;\n }\n\n this._skipNormalize += 1;\n this._clearAxesData = true;\n this._query({ filter: val, page: 1 });\n },\n\n expandColumn: function(path) {\n this._expandPath(path, \"columns\");\n },\n\n expandRow: function(path) {\n this._expandPath(path, \"rows\");\n },\n\n success: function(data) {\n var originalData;\n if (this.cubeBuilder) {\n originalData = (this.reader.data(data) || []).slice(0);\n }\n DataSource.fn.success.call(this, data);\n if (originalData) {\n this._pristineData = originalData;\n }\n },\n\n _processResult: function(data, axes) {\n if (this.cubeBuilder) {\n var processedData = this.cubeBuilder.process(data, this._requestData);\n\n data = processedData.data;\n axes = processedData.axes;\n }\n\n var columnIndexes, rowIndexes;\n var tuples, resultAxis, measures, axisToSkip;\n var columnDescriptors = this.columns();\n var rowDescriptors = this.rows();\n var hasColumnTuples = axes.columns && axes.columns.tuples;\n\n if (!columnDescriptors.length && rowDescriptors.length && hasColumnTuples && (this._rowMeasures().length || !this.measures().length)) {\n axes = {\n columns: {},\n rows: axes.columns\n };\n }\n\n if (!columnDescriptors.length && !rowDescriptors.length && this.measuresAxis() === \"rows\" && hasColumnTuples) {\n axes = {\n columns: {},\n rows: axes.columns\n };\n }\n\n this._axes = {\n columns: normalizeAxis(this._axes.columns),\n rows: normalizeAxis(this._axes.rows)\n };\n\n axes = {\n columns: normalizeAxis(axes.columns),\n rows: normalizeAxis(axes.rows)\n };\n\n columnIndexes = this._normalizeTuples(axes.columns.tuples, this._axes.columns.tuples, columnDescriptors, this._columnMeasures());\n rowIndexes = this._normalizeTuples(axes.rows.tuples, this._axes.rows.tuples, rowDescriptors, this._rowMeasures());\n\n if (this._skipNormalize > 0) {\n this._skipNormalize -= 1;\n }\n\n if (!this.cubeBuilder) {\n data = this._normalizeData({\n columnsLength: axes.columns.tuples.length,\n rowsLength: axes.rows.tuples.length,\n columnIndexes: columnIndexes,\n rowIndexes: rowIndexes,\n data: data\n });\n }\n\n if (this._lastExpanded == \"rows\") {\n tuples = axes.columns.tuples;\n measures = this._columnMeasures();\n resultAxis = validateAxis(axes.columns, this._axes.columns, measures);\n\n if (resultAxis) {\n axisToSkip = \"columns\";\n axes.columns = resultAxis;\n adjustDataByColumn(tuples, resultAxis.tuples, axes.rows.tuples.length, measures, data);\n if (!this.cubeBuilder) {\n data = this._normalizeData({\n columnsLength: membersCount(axes.columns.tuples, measures),\n rowsLength: axes.rows.tuples.length,\n data: data\n });\n }\n }\n } else if (this._lastExpanded == \"columns\") {\n tuples = axes.rows.tuples;\n measures = this._rowMeasures();\n resultAxis = validateAxis(axes.rows, this._axes.rows, measures);\n\n if (resultAxis) {\n axisToSkip = \"rows\";\n axes.rows = resultAxis;\n adjustDataByRow(tuples, resultAxis.tuples, axes.columns.tuples.length, measures, data);\n\n if (!this.cubeBuilder) {\n data = this._normalizeData({\n columnsLength: membersCount(axes.rows.tuples, measures),\n rowsLength: axes.columns.tuples.length,\n data: data\n });\n }\n }\n }\n\n this._lastExpanded = null;\n\n var result = this._mergeAxes(axes, data, axisToSkip);\n this._axes = result.axes;\n\n return result.data;\n },\n\n _readData: function(data) {\n var axes = this.reader.axes(data);\n var newData = this.reader.data(data);\n\n if (this.cubeBuilder) {\n this._rawData = newData;\n }\n\n return this._processResult(newData, axes);\n },\n\n _createTuple: function(tuple, measure, buildRoot) {\n var members = tuple.members;\n var length = members.length;\n var root = { members: [] };\n var levelName, levelNum;\n var name, parentName;\n var hasChildren;\n var hierarchy;\n var caption;\n var member;\n var idx = 0;\n\n if (measure) {\n length -= 1;\n }\n\n for (; idx < length; idx++) {\n member = members[idx];\n levelNum = Number(member.levelNum);\n\n name = member.name;\n parentName = member.parentName;\n caption = member.caption || name;\n hasChildren = member.hasChildren;\n hierarchy = member.hierarchy;\n levelName = member.levelName;\n\n if (buildRoot) {\n caption = \"All\";\n if (levelNum === 0) {\n parentName = member.name;\n } else {\n levelNum -= 1;\n }\n\n hasChildren = true;\n name = hierarchy = levelName = parentName;\n }\n\n root.members.push({\n name: name,\n children: [],\n caption: caption,\n levelName: levelName,\n levelNum: levelNum.toString(),\n hasChildren: hasChildren,\n hierarchy: hierarchy,\n parentName: !buildRoot ? parentName : \"\"\n });\n }\n\n if (measure) {\n root.members.push({\n name: measure.name,\n children: []\n });\n }\n\n return root;\n },\n\n _hasRoot: function(target, source, descriptors) {\n if (source.length) {\n return findExistingTuple(source, target).tuple;\n }\n\n var members = target.members;\n var member;\n var descriptor;\n\n var isRoot = true;\n var levelNum;\n\n for (var idx = 0, length = members.length; idx < length; idx++) {\n member = members[idx];\n levelNum = Number(member.levelNum) || 0;\n descriptor = descriptors[idx];\n\n if (!(levelNum === 0 || (descriptor && member.name === getName(descriptor)))) {\n isRoot = false;\n break;\n }\n }\n\n return isRoot;\n },\n\n _mergeAxes: function(sourceAxes, data, axisToSkip) {\n var columnMeasures = this._columnMeasures();\n var rowMeasures = this._rowMeasures();\n var axes = this.axes();\n var startIndex, tuples;\n\n var oldRowsLength = membersCount(axes.rows.tuples, rowMeasures);\n var newRowsLength = sourceAxes.rows.tuples.length;\n\n var oldColumnsLength = membersCount(axes.columns.tuples, columnMeasures);\n var newColumnsLength = sourceAxes.columns.tuples.length;\n\n if (axisToSkip == \"columns\") {\n newColumnsLength = oldColumnsLength;\n tuples = sourceAxes.columns.tuples;\n } else {\n tuples = parseSource(sourceAxes.columns.tuples, columnMeasures);\n data = prepareDataOnColumns(tuples, data);\n }\n\n var mergedColumns = mergeTuples(axes.columns.tuples, tuples, columnMeasures);\n\n if (axisToSkip == \"rows\") {\n newRowsLength = membersCount(sourceAxes.rows.tuples, rowMeasures);\n tuples = sourceAxes.rows.tuples;\n } else {\n tuples = parseSource(sourceAxes.rows.tuples, rowMeasures);\n data = prepareDataOnRows(tuples, data);\n }\n var mergedRows = mergeTuples(axes.rows.tuples, tuples, rowMeasures);\n\n axes.columns.tuples = mergedColumns.tuples;\n axes.rows.tuples = mergedRows.tuples;\n\n if (oldColumnsLength !== membersCount(axes.columns.tuples, columnMeasures)) {\n //columns are expanded\n startIndex = mergedColumns.index + findDataIndex(mergedColumns.parsedRoot, mergedColumns.memberIndex, columnMeasures);\n var offset = oldColumnsLength + newColumnsLength;\n data = this._mergeColumnData(data, startIndex, newRowsLength, newColumnsLength, offset);\n } else if (oldRowsLength !== membersCount(axes.rows.tuples, rowMeasures)) {\n //rows are expanded\n startIndex = mergedRows.index + findDataIndex(mergedRows.parsedRoot, mergedRows.memberIndex, rowMeasures);\n data = this._mergeRowData(data, startIndex, newRowsLength, newColumnsLength);\n }\n\n if (axes.columns.tuples.length === 0 && axes.rows.tuples.length === 0) {\n data = [];\n }\n\n return {\n axes: axes,\n data: data\n };\n },\n\n _mergeColumnData: function(newData, columnIndex, rowsLength, columnsLength, offset) {\n var data = this.data().toJSON();\n var rowIndex, index, drop = 0, toAdd;\n var columnMeasures = Math.max(this._columnMeasures().length, 1);\n\n rowsLength = Math.max(rowsLength, 1);\n\n if (data.length > 0) {\n //if there is already data, drop the first new data item\n drop = columnMeasures;\n offset -= columnMeasures;\n }\n\n for (rowIndex = 0; rowIndex < rowsLength; rowIndex++) {\n index = columnIndex + (rowIndex * offset);\n toAdd = newData.splice(0, columnsLength);\n toAdd.splice(0, drop);\n [].splice.apply(data, [index, 0].concat(toAdd));\n }\n\n return data;\n },\n\n _mergeRowData: function(newData, rowIndex, rowsLength, columnsLength) {\n var data = this.data().toJSON();\n var idx, dataIndex, toAdd;\n var rowMeasures = Math.max(this._rowMeasures().length, 1);\n\n columnsLength = Math.max(columnsLength, 1);\n if (data.length > 0) {\n //if there is already data, drop the first new data item\n rowsLength -= rowMeasures;\n newData.splice(0, columnsLength * rowMeasures);\n }\n\n for (idx = 0; idx < rowsLength; idx++) {\n toAdd = newData.splice(0, columnsLength);\n dataIndex = (rowIndex * columnsLength) + (idx * columnsLength);\n [].splice.apply(data, [dataIndex, 0].concat(toAdd));\n }\n\n return data;\n },\n\n _columnMeasures: function() {\n var measures = this.measures();\n var columnMeasures = [];\n\n if (this.measuresAxis() === \"columns\") {\n if (this.columns().length === 0) {\n columnMeasures = measures;\n } else if (measures.length > 1) {\n columnMeasures = measures;\n }\n }\n\n return columnMeasures;\n },\n\n _rowMeasures: function() {\n var measures = this.measures();\n var rowMeasures = [];\n\n if (this.measuresAxis() === \"rows\") {\n if (this.rows().length === 0) {\n rowMeasures = measures;\n } else if (measures.length > 1) {\n rowMeasures = measures;\n }\n }\n\n return rowMeasures;\n },\n\n _updateLocalData: function(data, state) {\n if (this.cubeBuilder) {\n if (state) {\n this._requestData = state;\n }\n data = this._processResult(data);\n }\n\n this._data = this._observe(data);\n\n this._ranges = [];\n this._addRange(this._data);\n\n this._total = this._data.length;\n this._pristineTotal = this._total;\n this._process(this._data);\n },\n\n data: function(value) {\n var that = this;\n if (value !== undefined$1) {\n this._pristineData = value.slice(0);\n this._updateLocalData(value, {\n columns: this.columns(),\n rows: this.rows(),\n measures: this.measures()\n });\n } else {\n return that._data;\n }\n },\n\n _normalizeTuples: function(tuples, source, descriptors, measures) {\n var length = measures.length || 1;\n var idx = 0;\n\n var roots = [];\n var indexes = {};\n var measureIdx = 0;\n var tuple, memberIdx, last;\n\n if (!tuples.length) {\n return;\n }\n\n if (this._skipNormalize <= 0 && !this._hasRoot(tuples[0], source, descriptors)) {\n this._skipNormalize = 0;\n for (; idx < length; idx++) {\n roots.push(this._createTuple(tuples[0], measures[idx], true));\n indexes[idx] = idx;\n }\n\n tuples.splice.apply(tuples, [0, tuples.length].concat(roots).concat(tuples));\n idx = length;\n }\n\n if (measures.length) {\n last = tuple = tuples[idx];\n memberIdx = tuple.members.length - 1;\n\n while (tuple) {\n if (measureIdx >= length) {\n measureIdx = 0;\n }\n\n if (tuple.members[memberIdx].name !== measures[measureIdx].name) {\n tuples.splice(idx, 0, this._createTuple(tuple, measures[measureIdx]));\n indexes[idx] = idx;\n }\n\n idx += 1;\n measureIdx += 1;\n tuple = tuples[idx];\n\n if (length > measureIdx && (!tuple || tupleName(last, memberIdx - 1) !== tupleName(tuple, memberIdx - 1))) {\n for (; measureIdx < length; measureIdx++) {\n tuples.splice(idx, 0, this._createTuple(last, measures[measureIdx]));\n indexes[idx] = idx;\n idx += 1;\n }\n tuple = tuples[idx];\n }\n last = tuple;\n }\n }\n\n return indexes;\n },\n\n _addMissingDataItems: function(result, metadata) {\n while (metadata.rowIndexes[parseInt(result.length / metadata.columnsLength, 10)] !== undefined$1) {\n for (var idx = 0; idx < metadata.columnsLength; idx++) {\n result = addEmptyDataItem(result);\n }\n }\n\n while (metadata.columnIndexes[result.length % metadata.columnsLength] !== undefined$1) {\n result = addEmptyDataItem(result);\n }\n\n return result;\n },\n\n _normalizeOrdinals: function(result, dataItem, metadata) {\n var lastOrdinal = metadata.lastOrdinal;\n\n if (!dataItem) {\n return addEmptyDataItem(result);\n }\n\n if ((dataItem.ordinal - lastOrdinal) > 1) {\n lastOrdinal += 1;\n\n while (lastOrdinal < dataItem.ordinal && result.length < metadata.length) {\n result = this._addMissingDataItems(addEmptyDataItem(result), metadata);\n lastOrdinal += 1;\n }\n }\n\n dataItem.ordinal = result.length;\n result[result.length] = dataItem;\n\n return result;\n },\n\n _normalizeData: function(options) {\n var data = options.data;\n var dataIdx = 0;\n var dataItem;\n var result = [];\n var lastOrdinal;\n var length;\n\n options.lastOrdinal = 0;\n options.columnIndexes = options.columnIndexes || {};\n options.rowIndexes = options.rowIndexes || {};\n options.columnsLength = options.columnsLength || 1;\n options.rowsLength = options.rowsLength || 1;\n options.length = options.columnsLength * options.rowsLength;\n length = options.length;\n\n if (data.length === length) {\n return data;\n }\n\n while (result.length < length) {\n dataItem = data[dataIdx++];\n if (dataItem) {\n lastOrdinal = dataItem.ordinal;\n }\n\n result = this._normalizeOrdinals(this._addMissingDataItems(result, options), dataItem, options);\n\n options.lastOrdinal = lastOrdinal;\n }\n\n return result;\n },\n\n discover: function(options, converter) {\n var that = this,\n transport = that.transport;\n\n return $.Deferred(function(deferred) {\n transport.discover(extend({\n success: function(response) {\n response = that.reader.parse(response);\n\n if (that._handleCustomErrors(response)) {\n return;\n }\n\n if (converter) {\n response = converter(response);\n }\n deferred.resolve(response);\n },\n error: function(response, status, error) {\n deferred.reject(response);\n that.error(response, status, error);\n }\n }, options));\n }).promise().done(function() {\n that.trigger(\"schemaChange\");\n });\n },\n\n schemaMeasures: function() {\n var that = this;\n\n return that.discover({\n data: {\n command: \"schemaMeasures\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }\n }\n }, function(response) {\n return that.reader.measures(response);\n });\n },\n\n schemaKPIs: function() {\n var that = this;\n\n return that.discover({\n data: {\n command: \"schemaKPIs\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }\n }\n }, function(response) {\n return that.reader.kpis(response);\n });\n },\n\n schemaDimensions: function() {\n var that = this;\n\n return that.discover({\n data: {\n command: \"schemaDimensions\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }\n }\n }, function(response) {\n return that.reader.dimensions(response);\n });\n },\n\n schemaHierarchies: function(dimensionName) {\n var that = this;\n\n return that.discover({\n data: {\n command: \"schemaHierarchies\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube(),\n dimensionUniqueName: dimensionName\n }\n }\n }, function(response) {\n return that.reader.hierarchies(response);\n });\n },\n\n schemaLevels: function(hierarchyName) {\n var that = this;\n\n return that.discover({\n data: {\n command: \"schemaLevels\",\n restrictions: {\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube(),\n hierarchyUniqueName: hierarchyName\n }\n }\n }, function(response) {\n return that.reader.levels(response);\n });\n },\n\n schemaCubes: function() {\n var that = this;\n\n return that.discover({\n data: {\n command: \"schemaCubes\",\n restrictions: {\n catalogName: that.transport.catalog()\n }\n }\n }, function(response) {\n return that.reader.cubes(response);\n });\n },\n\n schemaCatalogs: function() {\n var that = this;\n\n return that.discover({\n data: {\n command: \"schemaCatalogs\"\n }\n }, function(response) {\n return that.reader.catalogs(response);\n });\n },\n\n schemaMembers: function(restrictions) {\n var that = this;\n var success = (function(restrictions) {\n return function(response) {\n return that.reader.members(response, restrictions);\n };\n }(restrictions));\n\n return that.discover({\n data: {\n command: \"schemaMembers\",\n restrictions: extend({\n catalogName: that.transport.catalog(),\n cubeName: that.transport.cube()\n }, restrictions)\n }\n }, success);\n },\n\n _params: function(data) {\n if (this._clearAxesData) {\n this._axes = {};\n this._data = this._observe([]);\n this._clearAxesData = false;\n this.trigger(STATERESET);\n }\n\n var options = DataSource.fn._params.call(this, data);\n\n options = extend({\n measures: this.measures(),\n measuresAxis: this.measuresAxis(),\n columns: this.columns(),\n rows: this.rows()\n }, options);\n\n if (this.cubeBuilder) {\n this._requestData = options;\n }\n\n return options;\n }\n });\n\n function flatColumns(columns) {\n var result = [];\n for (var idx = 0; idx < columns.length; idx++) {\n result.push(columns[idx]);\n if (columns[idx].children) {\n result = result.concat(flatColumns(columns[idx].children));\n }\n }\n\n return result;\n }\n\n function sortItemsTree(field, items, sortFunction) {\n for (var i = 0; i < items.length; i++) {\n if (items[i].children && items[i].children.length) {\n sortItemsTree(field, items[i].children, sortFunction);\n }\n }\n if (items[0].parentName != field) {\n return;\n }\n items = items.sort(sortFunction);\n }\n\n function fillSortTree(items, map) {\n for (var i = 0; i < items.length; i++) {\n var currentItem = map[items[i].name];\n\n if (!$.isEmptyObject(currentItem.childrenMap)) {\n items[i].children = [];\n for (var name in currentItem.childrenMap) {\n items[i].children.push($.extend({}, { name: name, parentName: map[name].parentName }));\n }\n\n fillSortTree(items[i].children, map);\n }\n }\n }\n\n function addEmptyDataItem(result) {\n result[result.length] = { value: \"\", fmtValue: \"\", ordinal: result.length };\n return result;\n }\n\n function validateAxis(newAxis, axis, measures) {\n if (newAxis.tuples.length < membersCount(axis.tuples, measures)) {\n\n return axis;\n }\n\n return;\n }\n\n function adjustDataByColumn(sourceTuples, targetTuples, rowsLength, measures, data) {\n var columnIdx, rowIdx, dataIdx;\n var columnsLength = sourceTuples.length;\n var targetColumnsLength = membersCount(targetTuples, measures);\n var measuresLength = measures.length || 1;\n\n for (rowIdx = 0; rowIdx < rowsLength; rowIdx++) {\n for (columnIdx = 0; columnIdx < columnsLength; columnIdx++) {\n dataIdx = tupleIndex(sourceTuples[columnIdx], targetTuples) * measuresLength;\n dataIdx += columnIdx % measuresLength;\n\n data[rowIdx * columnsLength + columnIdx].ordinal = rowIdx * targetColumnsLength + dataIdx;\n }\n }\n }\n\n function adjustDataByRow(sourceTuples, targetTuples, columnsLength, measures, data) {\n var columnIdx, rowIdx, dataIdx;\n var rowsLength = sourceTuples.length;\n var measuresLength = measures.length || 1;\n\n for (rowIdx = 0; rowIdx < rowsLength; rowIdx++) {\n dataIdx = tupleIndex(sourceTuples[rowIdx], targetTuples);\n dataIdx *= measuresLength;\n dataIdx += rowIdx % measuresLength;\n\n for (columnIdx = 0; columnIdx < columnsLength; columnIdx++) {\n data[rowIdx * columnsLength + columnIdx].ordinal = dataIdx * columnsLength + columnIdx;\n }\n }\n }\n\n function tupleIndex(tuple, collection) {\n return findExistingTuple(collection, tuple).index;\n }\n\n function membersCount(tuples, measures) {\n if (!tuples.length) {\n return 0;\n }\n\n var queue = tuples.slice();\n var current = queue.shift();\n var result = 1;\n\n while (current) {\n if (current.members) {\n [].push.apply(queue, current.members);\n } else if (current.children) {\n if (!current.measure) {\n result += current.children.length;\n }\n [].push.apply(queue, current.children);\n }\n\n current = queue.shift();\n }\n\n if (measures.length) {\n result = result * measures.length;\n }\n\n return result;\n }\n\n function normalizeAxis(axis) {\n if (!axis) {\n axis = {\n tuples: []\n };\n }\n\n if (!axis.tuples) {\n axis.tuples = [];\n }\n\n return axis;\n }\n\n function findDataIndex(tuple, memberIndex, measures) {\n if (!tuple) {\n return 0;\n }\n\n var measuresLength = Math.max(measures.length, 1);\n var tuples = tuple.members.slice(0, memberIndex);\n var current = tuples.shift();\n\n //the initial value is equal to the total number of measures\n //as the measures member is not extracted from the members of the starting tuple\n //but should be calculated in the final result\n var counter = measuresLength;\n\n while (current) {\n if (current.name === MEASURES) {\n //subtract 1 as the measures member has been already counted as a single standard member\n //but we are interested in the total number of measures instead\n counter += (measuresLength - 1);\n } else if (current.children) {\n //is member\n [].push.apply(tuples, current.children);\n } else {\n //is tuple\n counter ++;\n [].push.apply(tuples, current.members);\n }\n\n current = tuples.shift();\n }\n\n return counter;\n }\n\n function mergeTuples(target, source, measures) {\n if (!source[0]) {\n return {\n parsedRoot: null,\n tuples: target,\n memberIndex: 0,\n index: 0\n };\n }\n\n var result = findExistingTuple(target, source[0]);\n\n if (!result.tuple) {\n return {\n parsedRoot: null,\n tuples: source,\n memberIndex: 0,\n index: 0\n };\n }\n\n var targetMembers = result.tuple.members;\n var sourceMembers = source[0].members;\n var memberIndex = -1;\n\n if (targetMembers.length !== sourceMembers.length) {\n return {\n parsedRoot: null,\n tuples: source,\n memberIndex: 0,\n index: 0\n };\n }\n\n for (var idx = 0, length = targetMembers.length; idx < length; idx++) {\n if (!targetMembers[idx].measure && sourceMembers[idx].children[0]) {\n if (memberIndex == -1 && sourceMembers[idx].children.length) {\n memberIndex = idx;\n }\n\n targetMembers[idx].children = sourceMembers[idx].children;\n }\n }\n\n measures = Math.max(measures.length, 1);\n\n return {\n parsedRoot: result.tuple,\n index: result.index * measures,\n memberIndex: memberIndex,\n tuples: target\n };\n }\n\n function equalTuples(first, second) {\n var equal = true;\n var idx, length;\n\n first = first.members;\n second = second.members;\n\n for (idx = 0, length = first.length; idx < length; idx++) {\n if (first[idx].measure || second[idx].measure) {\n continue;\n }\n\n equal = equal && (getName(first[idx]) === getName(second[idx]));\n }\n\n return equal;\n }\n\n function findExistingTuple(tuples, toFind) {\n var idx, length, tuple, found, counter = 0;\n var memberIndex, membersLength, member;\n\n for (idx = 0, length = tuples.length; idx < length; idx++) {\n tuple = tuples[idx];\n if (equalTuples(tuple, toFind)) {\n return {\n tuple: tuple,\n index: counter\n };\n }\n\n counter ++;\n\n for (memberIndex = 0, membersLength = tuple.members.length; memberIndex < membersLength; memberIndex++) {\n member = tuple.members[memberIndex];\n if (member.measure) {\n //counter += member.children.length;\n continue;\n }\n found = findExistingTuple(member.children, toFind);\n counter += found.index;\n if (found.tuple) {\n return {\n tuple: found.tuple,\n index: counter\n };\n }\n }\n }\n\n return {\n index: counter\n };\n }\n\n function addMembers(members, map) {\n var member, i, len, path = \"\";\n for (i = 0, len = members.length; i < len; i++) {\n member = members[i];\n path += member.name;\n if (!map[path]) {\n map[path] = member;\n }\n }\n }\n\n\n function findParentMember(tuple, map) {\n var members = tuple.members;\n var i, len, member, path = \"\";\n var parentPath = \"\";\n var parentMember;\n\n for (i = 0, len = members.length; i < len; i++) {\n member = members[i];\n if (parentMember) {\n if (map[path + member.name]) {\n path += member.name;\n parentMember = map[path];\n continue;\n } else if (map[path + member.parentName]) {\n return map[path + member.parentName];\n } else if (map[parentPath + member.parentName]) {\n return map[parentPath + member.parentName];\n } else {\n return map[parentPath];\n }\n }\n\n path += member.name;\n parentMember = map[member.parentName];\n\n if (!parentMember) {\n parentMember = map[path];\n if (!parentMember) {\n return null;\n }\n }\n\n if (parentMember) {\n parentPath += parentMember.name;\n }\n }\n\n return parentMember;\n }\n\n function measurePosition(tuple, measures) {\n if (measures.length === 0) {\n return -1;\n }\n\n var measure = measures[0];\n var members = tuple.members;\n for (var idx = 0, len = members.length; idx < len; idx ++) {\n if (members[idx].name == measure.name) {\n return idx;\n }\n }\n }\n\n function normalizeTupleMeasures(tuple, index) {\n if (index < 0) {\n return;\n }\n var member = {\n name: MEASURES,\n measure: true,\n children: [\n $.extend({ members: [], dataIndex: tuple.dataIndex }, tuple.members[index])\n ]\n };\n tuple.members.splice(index, 1, member);\n tuple.dataIndex = undefined$1;\n }\n\n function parseSource(tuples, measures) {\n if (tuples.length < 1) {\n return [];\n }\n var result = [];\n var map = { };\n var measureIndex = measurePosition(tuples[0], measures);\n\n for (var i = 0; i < tuples.length; i++) {\n var tuple = tuples[i];\n\n //keep the old data index of the tuple\n tuple.dataIndex = i;\n\n normalizeTupleMeasures(tuple, measureIndex);\n var parentMember = findParentMember(tuple, map);\n\n if (parentMember) {\n if (measureIndex < 0 || !parentMember.measure) {\n parentMember.children.push(tuple);\n } else {\n parentMember.children.push(tuple.members[measureIndex].children[0]);\n }\n } else {\n result.push(tuple);\n }\n\n addMembers(tuple.members, map);\n }\n\n return result;\n }\n\n function prepareDataOnRows(tuples, data) {\n if (!tuples || !tuples.length) {\n return data;\n }\n\n var result = [];\n var indices = buildDataIndices(tuples);\n var rowsLength = indices.length;\n var columnsLength = Math.max(data.length / rowsLength, 1);\n var rowIndex, columnIndex, targetIndex, sourceIndex;\n var calcIndex;\n\n for (rowIndex = 0; rowIndex < rowsLength; rowIndex++) {\n targetIndex = columnsLength * rowIndex;\n sourceIndex = columnsLength * indices[rowIndex];\n for (columnIndex = 0; columnIndex < columnsLength; columnIndex++) {\n calcIndex = parseInt(sourceIndex + columnIndex, 10);\n result[parseInt(targetIndex + columnIndex, 10)] = data[calcIndex] || { value: \"\", fmtValue: \"\", ordinal: calcIndex };\n }\n }\n\n return result;\n }\n\n function prepareDataOnColumns(tuples, data) {\n if (!tuples || !tuples.length) {\n return data;\n }\n\n var result = [];\n var indices = buildDataIndices(tuples);\n var columnsLength = indices.length;\n var rowsLength = Math.max(data.length / columnsLength, 1);\n var columnIndex, rowIndex, dataIndex, calcIndex;\n\n for (rowIndex = 0; rowIndex < rowsLength; rowIndex++) {\n dataIndex = columnsLength * rowIndex;\n for (columnIndex = 0; columnIndex < columnsLength; columnIndex++) {\n calcIndex = indices[columnIndex] + dataIndex;\n result[dataIndex + columnIndex] = data[calcIndex] || { value: \"\", fmtValue: \"\", ordinal: calcIndex };\n }\n }\n\n return result;\n }\n\n function buildDataIndices(tuples) {\n tuples = tuples.slice();\n var result = [];\n var tuple = tuples.shift();\n var idx, length, spliceIndex, children, member;\n\n while (tuple) {\n //required for multiple measures\n if (tuple.dataIndex !== undefined$1) {\n result.push(tuple.dataIndex);\n }\n\n spliceIndex = 0;\n for (idx = 0, length = tuple.members.length; idx < length; idx++) {\n member = tuple.members[idx];\n children = member.children;\n if (member.measure) {\n [].splice.apply(tuples, [0, 0].concat(children));\n } else {\n [].splice.apply(tuples, [spliceIndex, 0].concat(children));\n }\n spliceIndex += children.length;\n }\n\n tuple = tuples.shift();\n }\n\n return result;\n }\n\n PivotDataSourceV2.create = function(options) {\n options = options && options.push ? { data: options } : options;\n\n var dataSource = options || {},\n data = dataSource.data;\n\n dataSource.data = data;\n\n if (!(dataSource instanceof PivotDataSourceV2) && dataSource instanceof kendo.data.DataSource) {\n throw new Error(\"Incorrect DataSource type. Only PivotDataSource instances are supported\");\n }\n\n return dataSource instanceof PivotDataSourceV2 ? dataSource : new PivotDataSourceV2(dataSource);\n };\n\n PivotDataSource.create = function(options) {\n options = options && options.push ? { data: options } : options;\n\n var dataSource = options || {},\n data = dataSource.data;\n\n dataSource.data = data;\n\n if (!(dataSource instanceof PivotDataSource) && dataSource instanceof kendo.data.DataSource) {\n throw new Error(\"Incorrect DataSource type. Only PivotDataSource instances are supported\");\n }\n\n return dataSource instanceof PivotDataSource ? dataSource : new PivotDataSource(dataSource);\n };\n\n function baseHierarchyPath(memberName) {\n var parts = memberName.split(\".\");\n if (parts.length > 2) {\n return parts[0] + \".\" + parts[1];\n }\n return memberName;\n }\n\n function expandMemberDescriptor(names, sort) {\n var idx = names.length - 1;\n var name = names[idx];\n var sortDescriptor;\n\n sortDescriptor = sortDescriptorForMember(sort, name);\n\n if (sortDescriptor && sortDescriptor.dir) {\n name = \"ORDER(\" + name + \".Children,\" + sortDescriptor.field + \".CurrentMember.MEMBER_CAPTION,\" + sortDescriptor.dir + \")\";\n } else {\n name += \".Children\";\n }\n\n names[idx] = name;\n\n return names;\n }\n\n function sortDescriptorForMember(sort, member) {\n for (var idx = 0, length = sort.length; idx < length; idx++) {\n if (member.indexOf(sort[idx].field) === 0) {\n return sort[idx];\n }\n }\n return null;\n }\n\n function crossJoin(names) {\n var result = \"CROSSJOIN({\";\n var r;\n\n if (names.length > 2) {\n r = names.pop();\n result += crossJoin(names);\n } else {\n result += names.shift();\n r = names.pop();\n }\n\n result += \"},{\";\n result += r;\n result += \"})\";\n return result;\n }\n\n function crossJoinCommand(members, measures) {\n var tmp = members.slice(0);\n\n if (measures.length > 1) {\n tmp.push(\"{\" + measureNames(measures).join(\",\") + \"}\");\n }\n\n return crossJoin(tmp);\n }\n\n function measureNames(measures) {\n var idx = 0;\n var length = measures.length;\n var result = [];\n var measure;\n\n for (; idx < length; idx++) {\n measure = measures[idx];\n result.push(measure.name !== undefined$1 ? measure.name : measure);\n }\n\n return result;\n }\n\n function indexOf(name, items) {\n var idx, length, index = -1;\n\n for (idx = 0, length = items.length; idx < length; idx++) {\n if (getName(items[idx]) === name) {\n index = idx;\n break;\n }\n }\n return index;\n }\n\n function getName(name) {\n name = name.name || name;\n\n if (toString.call(name) === \"[object Array]\") {\n name = name[name.length - 1];\n }\n\n return name;\n }\n\n function getRootNames(members) {\n var length = members.length;\n var names = [];\n var idx = 0;\n\n for (; idx < length; idx++) {\n names.push(members[idx].name[0]);\n }\n\n return names;\n }\n\n function mapNames(names, rootNames) {\n var name;\n var rootName;\n\n var j;\n var idx = 0;\n var length = names.length;\n var rootLength = rootNames.length;\n\n rootNames = rootNames.slice(0);\n\n for (; idx < length; idx++) {\n name = names[idx];\n\n for (j = 0; j < rootLength; j++) {\n rootName = baseHierarchyPath(rootNames[j]);\n\n if (name.indexOf(rootName) !== -1) {\n rootNames[j] = name;\n break;\n }\n }\n }\n\n return {\n names: rootNames,\n expandedIdx: j,\n uniquePath: rootNames.slice(0, j + 1).join(\"\")\n };\n }\n\n function parseDescriptors(members) {\n var expanded = [];\n var child = [];\n var root = [];\n var member;\n\n var j, l;\n var idx = 0;\n var length = members.length;\n\n var name;\n var hierarchyName;\n\n var found;\n\n for (; idx < length; idx++) {\n member = members[idx];\n name = member.name;\n found = false;\n\n if (toString.call(name) !== \"[object Array]\") {\n member.name = name = [name];\n }\n\n if (name.length > 1) {\n child.push(member);\n } else {\n hierarchyName = baseHierarchyPath(name[0]);\n\n for (j = 0, l = root.length; j < l; j++) {\n if (root[j].name[0].indexOf(hierarchyName) === 0) {\n found = true;\n break;\n }\n }\n\n if (!found) {\n root.push(member);\n }\n\n if (member.expand) {\n expanded.push(member);\n }\n }\n }\n\n expanded = expanded.concat(child);\n\n return {\n root: root,\n expanded: expanded\n };\n }\n\n function serializeMembers(members, measures, sort) {\n var command = \"\";\n\n members = members || [];\n\n var expanded = parseDescriptors(members);\n var root = expanded.root;\n\n var rootNames = getRootNames(root);\n var crossJoinCommands = [];\n\n expanded = expanded.expanded;\n\n var length = expanded.length;\n var idx = 0;\n\n var memberName;\n var names = [];\n\n if (rootNames.length > 1 || measures.length > 1) {\n crossJoinCommands.push(crossJoinCommand(rootNames, measures));\n\n for (; idx < length; idx++) {\n memberName = expandMemberDescriptor(expanded[idx].name, sort);\n names = mapNames(memberName, rootNames).names;\n\n crossJoinCommands.push(crossJoinCommand(names, measures));\n }\n\n command += crossJoinCommands.join(\",\");\n } else {\n for (; idx < length; idx++) {\n memberName = expandMemberDescriptor(expanded[idx].name, sort);\n names.push(memberName[0]); //check if this is ok\n }\n\n command += rootNames.concat(names).join(\",\");\n }\n\n return command;\n }\n\n var filterFunctionFormats = {\n contains: \", InStr({0}.CurrentMember.MEMBER_CAPTION,\\\"{1}\\\") > 0\",\n doesnotcontain: \", InStr({0}.CurrentMember.MEMBER_CAPTION,\\\"{1}\\\")\",\n startswith: \", Left({0}.CurrentMember.MEMBER_CAPTION,Len(\\\"{1}\\\"))=\\\"{1}\\\"\",\n endswith: \", Right({0}.CurrentMember.MEMBER_CAPTION,Len(\\\"{1}\\\"))=\\\"{1}\\\"\",\n eq: \", {0}.CurrentMember.MEMBER_CAPTION = \\\"{1}\\\"\",\n neq: \", {0}.CurrentMember.MEMBER_CAPTION = \\\"{1}\\\"\"\n };\n\n function serializeExpression(expression) {\n var command = \"\";\n var value = expression.value;\n var field = expression.field;\n var operator = expression.operator;\n\n if (operator == \"in\") {\n command += \"{\";\n command += value;\n command += \"}\";\n } else {\n command += operator == \"neq\" || operator == \"doesnotcontain\" ? \"-\" : \"\";\n command += \"Filter(\";\n command += field + \".MEMBERS\";\n command += kendo.format(filterFunctionFormats[operator], field, value);\n command += \")\";\n }\n\n return command;\n }\n\n function serializeFilters(filter, cube) {\n var command = \"\", current;\n var filters = filter.filters;\n var length = filters.length;\n var idx;\n\n for (idx = length - 1; idx >= 0; idx--) {\n\n current = \"SELECT (\";\n current += serializeExpression(filters[idx]);\n current += \") ON 0\";\n\n if (idx == length - 1) {\n current += \" FROM [\" + cube + \"]\";\n command = current;\n } else {\n command = current + \" FROM ( \" + command + \" )\";\n }\n }\n\n return command;\n }\n\n function serializeOptions(parentTagName, options, capitalize) {\n var result = \"\";\n\n if (options) {\n result += \"<\" + parentTagName + \">\";\n var value;\n for (var key in options) {\n value = options[key];\n if (capitalize) {\n key = key.replace(/([A-Z]+(?=$|[A-Z][a-z])|[A-Z]?[a-z]+)/g, \"$1_\").toUpperCase().replace(/_$/, \"\");\n }\n result += \"<\" + key + \">\" + value + \"\";\n }\n result += \"\";\n } else {\n result += \"<\" + parentTagName + \"/>\";\n }\n return result;\n }\n\n var xmlaDiscoverCommands = {\n schemaCubes: \"MDSCHEMA_CUBES\",\n schemaCatalogs: \"DBSCHEMA_CATALOGS\",\n schemaMeasures: \"MDSCHEMA_MEASURES\",\n schemaDimensions: \"MDSCHEMA_DIMENSIONS\",\n schemaHierarchies: \"MDSCHEMA_HIERARCHIES\",\n schemaLevels: \"MDSCHEMA_LEVELS\",\n schemaMembers: \"MDSCHEMA_MEMBERS\",\n schemaKPIs: \"MDSCHEMA_KPIS\"\n };\n\n var convertersMap = {\n read: function(options) {\n var command = '
';\n\n command += \"SELECT NON EMPTY {\";\n\n var columns = options.columns || [];\n var rows = options.rows || [];\n\n var measures = options.measures || [];\n var measuresRowAxis = options.measuresAxis === \"rows\";\n var sort = options.sort || [];\n\n if (!columns.length && rows.length && (!measures.length || (measures.length && measuresRowAxis))) {\n columns = rows;\n rows = [];\n measuresRowAxis = false;\n }\n\n if (!columns.length && !rows.length) {\n measuresRowAxis = false;\n }\n\n if (columns.length) {\n command += serializeMembers(columns, !measuresRowAxis ? measures : [], sort);\n } else if (measures.length && !measuresRowAxis) {\n command += measureNames(measures).join(\",\");\n }\n\n command += \"} DIMENSION PROPERTIES CHILDREN_CARDINALITY, PARENT_UNIQUE_NAME ON COLUMNS\";\n\n if (rows.length || (measuresRowAxis && measures.length > 1)) {\n command += \", NON EMPTY {\";\n\n if (rows.length) {\n command += serializeMembers(rows, measuresRowAxis ? measures : [], sort);\n } else {\n command += measureNames(measures).join(\",\");\n }\n\n command += \"} DIMENSION PROPERTIES CHILDREN_CARDINALITY, PARENT_UNIQUE_NAME ON ROWS\";\n }\n\n if (options.filter) {\n command += \" FROM \";\n command += \"(\";\n command += serializeFilters(options.filter, options.connection.cube);\n command += \")\";\n } else {\n command += \" FROM [\" + options.connection.cube + \"]\";\n }\n\n if (measures.length == 1 && columns.length) {\n command += \" WHERE (\" + measureNames(measures).join(\",\") + \")\";\n }\n\n command += '' + options.connection.catalog + 'Multidimensional';\n return command.replace(/\\&/g, \"&\");\n },\n discover: function(options) {\n options = options || {};\n\n var command = '
';\n command += \"\" + (xmlaDiscoverCommands[options.command] || options.command) + \"\";\n\n command += \"\" + serializeOptions(\"RestrictionList\", options.restrictions, true) + \"\";\n\n if (options.connection && options.connection.catalog) {\n options.properties = $.extend({}, {\n Catalog: options.connection.catalog\n }, options.properties);\n }\n\n command += \"\" + serializeOptions(\"PropertyList\", options.properties) + \"\";\n\n command += '';\n return command;\n }\n };\n\n var XmlaTransport = kendo.data.RemoteTransport.extend({\n init: function(options) {\n var originalOptions = options;\n\n options = this.options = extend(true, {}, this.options, options);\n\n kendo.data.RemoteTransport.call(this, options);\n\n if (isFunction(originalOptions.discover)) {\n this.discover = originalOptions.discover;\n } else if (typeof originalOptions.discover === \"string\") {\n this.options.discover = {\n url: originalOptions.discover\n };\n } else if (!originalOptions.discover) {\n this.options.discover = this.options.read;\n }\n },\n setup: function(options, type) {\n options.data = options.data || {};\n $.extend(true, options.data, { connection: this.options.connection });\n\n return kendo.data.RemoteTransport.fn.setup.call(this, options, type);\n },\n options: {\n read: {\n dataType: \"text\",\n contentType: \"text/xml\",\n type: \"POST\"\n },\n discover: {\n dataType: \"text\",\n contentType: \"text/xml\",\n type: \"POST\"\n },\n parameterMap: function(options, type) {\n return convertersMap[type](options,type);\n }\n },\n\n discover: function(options) {\n return $.ajax(this.setup(options, \"discover\"));\n }\n });\n\n var XmlaTransportV2 = Class.extend({\n init: function(options) {\n options = this.options = extend(true, {}, this.options, options);\n },\n setup: function(options) {\n return $.extend(true, options || {}, { connection: this.options.connection });\n },\n read: function(options) {\n var that = this,\n success,\n error;\n\n var fetchOptions = that.setup(options.data, READ);\n\n success = options.success || $.noop;\n error = options.error || $.noop;\n\n if (options.parameterMap) {\n fetchOptions = that.parameterMap(fetchOptions, READ);\n }\n\n fetchData({ url: that.options.read }, fetchOptions)\n .then(createDataState)\n .then(function(newDataState) {\n success(newDataState);\n })\n .catch(function(err) { error(err); });\n },\n\n catalog: function(val) {\n var options = this.options || {};\n\n if (val === undefined$1) {\n return (options.connection || {}).catalog;\n\n }\n\n var connection = options.connection || {};\n connection.catalog = val;\n\n this.options.connection = connection;\n $.extend(this.transport.options, { connection: connection });\n },\n cube: function(val) {\n var options = this.options || {};\n\n if (val === undefined$1) {\n return (options.connection || {}).cube;\n }\n\n var connection = options.connection || {};\n connection.cube = val;\n\n this.options.connection = connection;\n extend(true, this.transport.options, { connection: connection });\n },\n\n discover: function(options) {\n return fetchDiscover({ url: this.options.read }, options);\n }\n });\n\n function asArray(object) {\n if (object == null) {\n return [];\n }\n\n var type = toString.call(object);\n if (type !== \"[object Array]\") {\n return [object];\n }\n\n return object;\n }\n\n function translateAxis(axis) {\n var result = { tuples: [] };\n var tuples = asArray(kendo.getter(\"Tuples.Tuple\", true)(axis));\n var captionGetter = kendo.getter(\"Caption['#text']\");\n var unameGetter = kendo.getter(\"UName['#text']\");\n var levelNameGetter = kendo.getter(\"LName['#text']\");\n var levelNumGetter = kendo.getter(\"LNum['#text']\");\n var childrenGetter = kendo.getter(\"CHILDREN_CARDINALITY['#text']\", true);\n var hierarchyGetter = kendo.getter(\"['@Hierarchy']\");\n var parentNameGetter = kendo.getter(\"PARENT_UNIQUE_NAME['#text']\", true);\n\n for (var idx = 0; idx < tuples.length; idx++) {\n var members = [];\n var member = asArray(tuples[idx].Member);\n for (var memberIdx = 0; memberIdx < member.length; memberIdx++) {\n members.push({\n children: [],\n caption: captionGetter(member[memberIdx]),\n name: unameGetter(member[memberIdx]),\n levelName: levelNameGetter(member[memberIdx]),\n levelNum: levelNumGetter(member[memberIdx]),\n hasChildren: parseInt(childrenGetter(member[memberIdx]), 10) > 0,\n parentName: parentNameGetter(member[memberIdx]),\n hierarchy: hierarchyGetter(member[memberIdx])\n });\n }\n\n result.tuples.push({ members: members });\n }\n return result;\n }\n\n var schemaDataReaderMap = {\n cubes: {\n name: kendo.getter(\"CUBE_NAME['#text']\", true),\n caption: kendo.getter(\"CUBE_CAPTION['#text']\", true),\n description: kendo.getter(\"DESCRIPTION['#text']\", true),\n type: kendo.getter(\"CUBE_TYPE['#text']\", true)\n },\n catalogs: {\n name: kendo.getter(\"CATALOG_NAME['#text']\", true),\n description: kendo.getter(\"DESCRIPTION['#text']\", true)\n },\n measures: {\n name: kendo.getter(\"MEASURE_NAME['#text']\", true),\n caption: kendo.getter(\"MEASURE_CAPTION['#text']\", true),\n uniqueName: kendo.getter(\"MEASURE_UNIQUE_NAME['#text']\", true),\n description: kendo.getter(\"DESCRIPTION['#text']\", true),\n aggregator: kendo.getter(\"MEASURE_AGGREGATOR['#text']\", true),\n groupName: kendo.getter(\"MEASUREGROUP_NAME['#text']\", true),\n displayFolder: kendo.getter(\"MEASURE_DISPLAY_FOLDER['#text']\", true),\n defaultFormat: kendo.getter(\"DEFAULT_FORMAT_STRING['#text']\", true)\n },\n kpis: {\n name: kendo.getter(\"KPI_NAME['#text']\", true),\n caption: kendo.getter(\"KPI_CAPTION['#text']\", true),\n value: kendo.getter(\"KPI_VALUE['#text']\", true),\n goal: kendo.getter(\"KPI_GOAL['#text']\", true),\n status: kendo.getter(\"KPI_STATUS['#text']\", true),\n trend: kendo.getter(\"KPI_TREND['#text']\", true),\n statusGraphic: kendo.getter(\"KPI_STATUS_GRAPHIC['#text']\", true),\n trendGraphic: kendo.getter(\"KPI_TREND_GRAPHIC['#text']\", true),\n description: kendo.getter(\"KPI_DESCRIPTION['#text']\", true),\n groupName: kendo.getter(\"MEASUREGROUP_NAME['#text']\", true)\n },\n dimensions: {\n name: kendo.getter(\"DIMENSION_NAME['#text']\", true),\n caption: kendo.getter(\"DIMENSION_CAPTION['#text']\", true),\n description: kendo.getter(\"DESCRIPTION['#text']\", true),\n uniqueName: kendo.getter(\"DIMENSION_UNIQUE_NAME['#text']\", true),\n defaultHierarchy: kendo.getter(\"DEFAULT_HIERARCHY['#text']\", true),\n type: kendo.getter(\"DIMENSION_TYPE['#text']\", true)\n //unknown = 0; time = 1; measure = 2; other = 3; quantitative = 5; accounts = 6; customers = 7; products = 8; scenario = 9; utility = 10; currency = 11; rates = 12; channel = 13; promotion = 14; organization = 15; billOfMaterials = 16; geography = 17;\n\n },\n hierarchies: {\n name: kendo.getter(\"HIERARCHY_NAME['#text']\", true),\n caption: kendo.getter(\"HIERARCHY_CAPTION['#text']\", true),\n description: kendo.getter(\"DESCRIPTION['#text']\", true),\n uniqueName: kendo.getter(\"HIERARCHY_UNIQUE_NAME['#text']\", true),\n dimensionUniqueName: kendo.getter(\"DIMENSION_UNIQUE_NAME['#text']\", true),\n displayFolder: kendo.getter(\"HIERARCHY_DISPLAY_FOLDER['#text']\", true),\n origin: kendo.getter(\"HIERARCHY_ORIGIN['#text']\", true),\n defaultMember: kendo.getter(\"DEFAULT_MEMBER['#text']\", true)\n },\n levels: {\n name: kendo.getter(\"LEVEL_NAME['#text']\", true),\n caption: kendo.getter(\"LEVEL_CAPTION['#text']\", true),\n description: kendo.getter(\"DESCRIPTION['#text']\", true),\n uniqueName: kendo.getter(\"LEVEL_UNIQUE_NAME['#text']\", true),\n dimensionUniqueName: kendo.getter(\"DIMENSION_UNIQUE_NAME['#text']\", true),\n displayFolder: kendo.getter(\"LEVEL_DISPLAY_FOLDER['#text']\", true),\n orderingProperty: kendo.getter(\"LEVEL_ORDERING_PROPERTY['#text']\", true),\n origin: kendo.getter(\"LEVEL_ORIGIN['#text']\", true),\n hierarchyUniqueName: kendo.getter(\"HIERARCHY_UNIQUE_NAME['#text']\", true)\n },\n members: {\n name: kendo.getter(\"MEMBER_NAME['#text']\", true),\n caption: kendo.getter(\"MEMBER_CAPTION['#text']\", true),\n uniqueName: kendo.getter(\"MEMBER_UNIQUE_NAME['#text']\", true),\n dimensionUniqueName: kendo.getter(\"DIMENSION_UNIQUE_NAME['#text']\", true),\n hierarchyUniqueName: kendo.getter(\"HIERARCHY_UNIQUE_NAME['#text']\", true),\n levelUniqueName: kendo.getter(\"LEVEL_UNIQUE_NAME['#text']\", true),\n childrenCardinality: kendo.getter(\"CHILDREN_CARDINALITY['#text']\", true)\n }\n };\n\n var xmlaReaderMethods = [\"axes\", \"catalogs\", \"cubes\", \"dimensions\", \"hierarchies\", \"levels\", \"measures\"];\n\n var XmlaDataReader = kendo.data.XmlDataReader.extend({\n init: function(options) {\n kendo.data.XmlDataReader.call(this, options);\n\n this._extend(options);\n },\n _extend: function(options) {\n var idx = 0;\n var length = xmlaReaderMethods.length;\n var methodName;\n var option;\n\n for (; idx < length; idx++) {\n methodName = xmlaReaderMethods[idx];\n option = options[methodName];\n\n if (option && option !== identity) {\n this[methodName] = option;\n }\n }\n },\n parse: function(xml) {\n var result = kendo.data.XmlDataReader.fn.parse(xml.replace(/<(\\/?)(\\w|-)+:/g, \"<$1\"));\n return kendo.getter(\"['Envelope']['Body']\", true)(result);\n },\n errors: function(root) {\n var fault = kendo.getter(\"['Fault']\", true)(root);\n if (fault) {\n return [{\n faultstring: kendo.getter(\"faultstring['#text']\", true)(fault),\n faultcode: kendo.getter(\"faultcode['#text']\", true)(fault)\n }];\n }\n return null;\n },\n axes: function(root) {\n root = kendo.getter(\"ExecuteResponse[\\\"return\\\"].root\", true)(root);\n\n var axes = asArray(kendo.getter(\"Axes.Axis\", true)(root));\n var axis;\n\n var result = {\n columns: {},\n rows: {}\n };\n\n for (var idx = 0; idx < axes.length; idx++) {\n axis = axes[idx];\n\n if (axis[\"@name\"].toLowerCase() !== \"sliceraxis\") {\n if (!result.columns.tuples) {\n result.columns = translateAxis(axis);\n } else {\n result.rows = translateAxis(axis);\n }\n }\n }\n\n return result;\n },\n data: function(root) {\n root = kendo.getter(\"ExecuteResponse[\\\"return\\\"].root\", true)(root);\n\n var cells = asArray(kendo.getter(\"CellData.Cell\", true)(root));\n\n var result = [];\n var ordinalGetter = kendo.getter(\"['@CellOrdinal']\");\n var valueGetter = kendo.getter(\"Value['#text']\");\n var fmtValueGetter = kendo.getter(\"FmtValue['#text']\");\n\n for (var idx = 0; idx < cells.length; idx++) {\n result.push({\n value: valueGetter(cells[idx]),\n fmtValue: fmtValueGetter(cells[idx]),\n ordinal: parseInt(ordinalGetter(cells[idx]), 10)\n });\n }\n\n return result;\n },\n _mapSchema: function(root, getters) {\n root = kendo.getter(\"DiscoverResponse[\\\"return\\\"].root\", true)(root);\n var rows = asArray(kendo.getter(\"row\", true)(root));\n\n var result = [];\n\n for (var idx = 0; idx < rows.length; idx++) {\n var obj = {};\n for (var key in getters) {\n obj[key] = getters[key](rows[idx]);\n }\n result.push(obj);\n }\n\n return result;\n },\n measures: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.measures);\n },\n kpis: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.kpis);\n },\n hierarchies: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.hierarchies);\n },\n levels: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.levels);\n },\n dimensions: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.dimensions);\n },\n cubes: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.cubes);\n },\n catalogs: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.catalogs);\n },\n members: function(root) {\n return this._mapSchema(root, schemaDataReaderMap.members);\n }\n });\n\n extend(true, kendo.data, {\n PivotDataSource: PivotDataSource,\n PivotDataSourceV2: PivotDataSourceV2,\n XmlaTransport: XmlaTransport,\n XmlaDataReader: XmlaDataReader,\n PivotCubeBuilder: PivotCubeBuilder,\n transports: {\n xmla: XmlaTransport\n },\n readers: {\n xmla: XmlaDataReader\n }\n });\n\n var sortExpr = function(expressions, name) {\n if (!expressions) {\n return null;\n }\n\n for (var idx = 0, length = expressions.length; idx < length; idx++) {\n if (expressions[idx].field === name) {\n return expressions[idx];\n }\n }\n\n return null;\n };\n\n var removeExpr = function(expressions, name) {\n var result = [];\n\n for (var idx = 0, length = expressions.length; idx < length; idx++) {\n if (expressions[idx].field !== name) {\n result.push(expressions[idx]);\n }\n }\n\n return result;\n };\n\n kendo.ui.PivotSettingTarget = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n that.element.addClass(\"k-pivot-setting\");\n\n that.dataSource = kendo.data.PivotDataSource.create(options.dataSource);\n\n that._refreshHandler = that.refresh.bind(that);\n that.dataSource.first(CHANGE, that._refreshHandler);\n\n if (!options.template) {\n var actions = '';\n\n if (that.options.enabled) {\n actions = \"\" + (kendo.ui.icon(\"x\")) + \"\";\n }\n\n that.options.template = function (data) { return ''\n + \"\"\n + ''\n + \"\" + (data.name || data) + \"\"\n + ''\n + '' + actions + ''\n + ''; };\n }\n\n that.template = kendo.template(that.options.template);\n that.emptyTemplate = kendo.template(that.options.emptyTemplate);\n\n that._sortable();\n\n that.element.on(\"click\" + NS, '.k-chip, .k-button' , function(e) {\n var target = $(e.target).closest(\":not(path,svg)\");\n var action = target.closest('.k-chip-action');\n var name = target.closest(\"[\" + kendo.attr(\"name\") + \"]\")\n .attr(kendo.attr(\"name\"));\n\n if (!name) {\n return;\n }\n\n if (action.hasClass(\"k-setting-delete\")) {\n that.remove(name);\n return;\n }\n\n if (target.closest('.k-chip-actions').length > 0) {\n return;\n }\n\n if (that.options.sortable) {\n var sortDirection = $(e.currentTarget).closest(\":not(path,svg)\").find('.k-i-sort-asc-small,.k-svg-i-sort-asc-small').length ? 'desc' : 'asc';\n\n that.sort({\n field: name,\n dir: sortDirection\n });\n }\n });\n\n if (options.filterable || options.sortable) {\n that.fieldMenu = new ui.PivotFieldMenu(that.element, {\n messages: that.options.messages.fieldMenu,\n filter: \".k-setting-fieldmenu\",\n filterable: options.filterable,\n sortable: options.sortable,\n dataSource: that.dataSource\n });\n }\n\n that.refresh();\n },\n\n options: {\n name: \"PivotSettingTarget\",\n template: null,\n filterable: false,\n sortable: false,\n emptyTemplate: function (data) { return (\"
\" + data + \"
\"); },\n setting: \"columns\",\n enabled: true,\n messages: {\n empty: \"Drop Fields Here\"\n }\n },\n setDataSource: function(dataSource) {\n this.dataSource.unbind(CHANGE, this._refreshHandler);\n this.dataSource = this.options.dataSource = dataSource;\n\n if (this.fieldMenu) {\n this.fieldMenu.setDataSource(dataSource);\n }\n dataSource.first(CHANGE, this._refreshHandler);\n\n this.refresh();\n },\n\n _sortable: function() {\n var that = this;\n\n if (that.options.enabled) {\n this.sortable = this.element.kendoSortable({\n connectWith: this.options.connectWith,\n hint: that.options.hint,\n filter: \">*:not(.k-empty)\",\n cursor: \"move\",\n start: function(e) {\n e.item.trigger(\"focus\").trigger(\"blur\");\n },\n change: function(e) {\n var name = e.item.attr(kendo.attr(\"name\"));\n\n if (e.action == \"receive\") {\n that.add(name);\n } else if (e.action == \"remove\") {\n that.remove(name);\n } else if (e.action == \"sort\") {\n that.move(name, e.newIndex);\n }\n }\n }).data(\"kendoSortable\");\n }\n },\n\n _isKPI: function(data) {\n return data.type === \"kpi\" || data.measure;\n },\n\n validate: function(data) {\n var isMeasure = (data.type == 2 || \"aggregator\" in data || this._isKPI(data));\n\n if (isMeasure) {\n return this.options.setting === \"measures\";\n }\n\n if (this.options.setting === \"measures\") {\n return isMeasure;\n }\n\n var items = this.dataSource[this.options.setting]();\n var name = data.defaultHierarchy || data.uniqueName;\n if (indexOf(name, items) > -1) {\n return false;\n }\n\n items = this.dataSource[this.options.setting === \"columns\" ? \"rows\" : \"columns\"]();\n if (indexOf(name, items) > -1) {\n return false;\n }\n\n return true;\n },\n\n add: function(name) {\n var items = this.dataSource[this.options.setting]();\n var i, l;\n\n name = Array.isArray(name) ? name.slice(0) : [name];\n\n for (i = 0, l = name.length; i < l; i++) {\n if (indexOf(name[i], items) !== -1) {\n name.splice(i, 1);\n i -= 1;\n l -= 1;\n }\n }\n\n if (name.length) {\n items = items.concat(name);\n this.dataSource[this.options.setting](items);\n }\n },\n\n move: function(name, index) {\n var items = this.dataSource[this.options.setting]();\n var idx = indexOf(name, items);\n\n if (idx > -1) {\n name = items.splice(idx, 1)[0];\n\n items.splice(index, 0, name);\n\n this.dataSource[this.options.setting](items);\n }\n },\n\n remove: function(name) {\n var items = this.dataSource[this.options.setting]();\n var idx = indexOf(name, items);\n var sortExpressions = this.dataSource.sort();\n var filter = this.dataSource.filter();\n\n if (idx > -1) {\n if (filter) {\n filter.filters = removeExpr(filter.filters, name);\n this.dataSource._filter.filters = filter.filters;\n if (!filter.filters.length) {\n this.dataSource._filter = null;\n }\n }\n if (sortExpressions) {\n sortExpressions = removeExpr(sortExpressions, name);\n this.dataSource._sort = sortExpressions;\n }\n items.splice(idx, 1);\n this.dataSource[this.options.setting](items);\n }\n },\n\n sort: function(expr) {\n var sortable = this.options.sortable;\n var allowUnsort = sortable === true || sortable.allowUnsort;\n var skipExpr = allowUnsort && expr.dir === \"asc\";\n\n var expressions = (this.dataSource.sort() || []);\n var result = removeExpr(expressions, expr.field);\n\n if (skipExpr && expressions.length !== result.length) {\n expr = null;\n }\n\n if (expr) {\n result.push(expr);\n }\n\n this.dataSource.sort(result);\n },\n\n refresh: function() {\n var html = \"\";\n var items = this.dataSource[this.options.setting]();\n var length = items.length;\n var idx = 0;\n var item;\n\n if (length) {\n for (; idx < length; idx++) {\n item = items[idx];\n item = item.name === undefined$1 ? { name: item } : item;\n\n html += this.template(extend({ sortIcon: this._sortIcon(item.name) }, item));\n }\n } else {\n html = this.emptyTemplate(this.options.messages.empty);\n }\n\n this.element.html(html);\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n\n this.dataSource.unbind(CHANGE, this._refreshHandler);\n this.element.off(NS);\n\n if (this.sortable) {\n this.sortable.destroy();\n }\n\n if (this.fieldMenu) {\n this.fieldMenu.destroy();\n }\n\n this.element = null;\n this._refreshHandler = null;\n },\n\n _sortIcon: function(name) {\n var expressions = this.dataSource.sort();\n var expr = sortExpr(expressions, getName(name));\n var icon = \"\";\n\n if (expr) {\n icon = \"sort-\" + expr.dir;\n }\n\n return icon;\n }\n });\n\n kendo.ui.PivotSettingTargetV2 = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n that.dataSource = kendo.data.PivotDataSourceV2.create(options.dataSource);\n\n that._refreshHandler = that.refresh.bind(that);\n that.dataSource.first(CHANGE, that._refreshHandler);\n\n that.template = kendo.template(that.options.template);\n\n that._sortable();\n\n that.element.on(\"click\" + NS, \".k-i-x-circle,.k-svg-i-x-circle\", function(e) {\n var target = $(e.target).closest(\":not(path,svg)\");\n var parent = target.closest(\".k-chip\");\n var name = parent.find(\".k-chip-label\").text();\n\n if (!name) {\n return;\n }\n\n that.remove(name);\n parent.remove();\n that.trigger(\"remove\", { name: name });\n });\n\n if (that.options.navigatable) {\n that.element.on(\"keydown\" + NS, \".k-chip\", function(ev) {\n var chip = $(ev.target),\n key = ev.keyCode,\n name = chip.find(\".k-chip-label\").text();\n\n if (key === keys.DELETE || key === keys.BACKSPACE) {\n var targetIndex = that.options.configuratorNavigation ? that.options.configuratorNavigation.elements.indexOf(chip[0]) : -1;\n chip.find(\".k-i-x-circle,.k-svg-i-x-circle\").trigger(\"click\");\n if (!that.options.configuratorNavigation) {\n return;\n }\n\n that.options.configuratorNavigation.focusElement(\n that.options.configuratorNavigation.elements[targetIndex - 1]\n );\n } else if (key === keys.DOWN && ev.altKey) {\n chip.find(\".k-i-more-vertical,.k-svg-i-more-vertical\").trigger(\"click\");\n } else if (ev.ctrlKey && ev.shiftKey) {\n if (key == keys.LEFT) {\n that.move(name, Math.max(0, chip.index() - 1));\n\n if (!that.options.configuratorNavigation) {\n return;\n }\n\n that.options.configuratorNavigation.focusElement(\n that.element.find(\".k-chip .k-chip-label\")\n .filter(function (ind, el) { return $(el).text() == name; })\n .closest(\".k-chip\")[0]\n );\n } else if (key == keys.RIGHT) {\n that.move(name, Math.min(chip.index() + 1, chip.parent().find(\"> .k-chip\").length - 1));\n\n if (!that.options.configuratorNavigation) {\n return;\n }\n\n that.options.configuratorNavigation.focusElement(\n that.element.find(\".k-chip .k-chip-label\")\n .filter(function (ind, el) { return $(el).text() == name; })\n .closest(\".k-chip\")[0]\n );\n } else if ((key == keys.UP && that.options.setting == \"rows\") ||\n (key == keys.DOWN && that.options.setting == \"columns\")) {\n\n var otherTarget = that.sortable.options.connectWith.data(\"kendoPivotSettingTargetV2\");\n if (!otherTarget) {\n return;\n }\n\n that.remove(name);\n otherTarget.add(name);\n if (!that.options.configuratorNavigation) {\n return;\n }\n\n that.options.configuratorNavigation.focusElement(\n otherTarget.element.find(\".k-chip\").last()[0]\n );\n }\n }\n });\n }\n\n if (options.filterable || options.sortable) {\n that.fieldMenu = new ui.PivotFieldMenuV2(that.element, {\n messages: that.options.messages.fieldMenu,\n filterable: options.filterable,\n filter: \".k-i-more-vertical,.k-svg-i-more-vertical\",\n sortable: options.sortable,\n dataSource: that.dataSource\n });\n }\n\n that.refresh();\n },\n\n events: [\"remove\"],\n\n options: {\n name: \"PivotSettingTargetV2\",\n template: null,\n filterable: false,\n sortable: false,\n setting: \"columns\",\n enabled: true,\n messages: {\n empty: \"Drop Fields Here\"\n }\n },\n setDataSource: function(dataSource) {\n this.dataSource.unbind(CHANGE, this._refreshHandler);\n this.dataSource = this.options.dataSource = dataSource;\n\n if (this.fieldMenu) {\n this.fieldMenu.setDataSource(dataSource);\n }\n dataSource.first(CHANGE, this._refreshHandler);\n\n this.refresh();\n },\n\n _applyState: function() {\n if (this._sortState !== undefined$1) {\n this.dataSource._sort = this._sortState;\n this._sortState = undefined$1;\n }\n\n if (this._stateFilter !== undefined$1) {\n this.dataSource._filter = this._stateFilter;\n this._stateFilter = undefined$1;\n }\n\n this.dataSource[\"_\" + this.options.setting] = this.options.setting === \"measures\" ? normalizeMeasures(this._savedState) : normalizeMembers(this._savedState);\n },\n\n _cancelChanges: function() {\n this._sortState = undefined$1;\n this._stateFilter = undefined$1;\n this._savedState = kendo.deepExtend([], this._initialState);\n this._redraw();\n },\n\n _state: function(newState, modifyInit) {\n var that = this;\n\n if (!newState) {\n return that._savedState || [];\n } else {\n if (!that._savedState || modifyInit) {\n that._initialState = kendo.deepExtend([], newState);\n }\n that._savedState = kendo.deepExtend([], newState);\n }\n },\n\n _sortable: function() {\n var that = this;\n\n this.sortable = this.element.kendoSortable({\n connectWith: this.options.connectWith,\n hint: that.options.hint,\n filter: \">*:not(.k-empty)\",\n cursor: \"move\",\n start: function(e) {\n e.item.focus().blur();\n },\n change: function(e) {\n var name = e.item.find(\".k-chip-label\").text();\n\n if (e.action == \"receive\") {\n that.add(name);\n } else if (e.action == \"remove\") {\n that.remove(name);\n } else if (e.action == \"sort\") {\n that.move(name, e.newIndex);\n }\n }\n }).data(\"kendoSortable\");\n },\n\n add: function(name) {\n var items = this._state();\n var i, l;\n\n name = Array.isArray(name) ? name.slice(0) : [name];\n\n for (i = 0, l = name.length; i < l; i++) {\n if (indexOf(name[i], items) !== -1) {\n name.splice(i, 1);\n i -= 1;\n l -= 1;\n }\n }\n\n if (name.length) {\n items = items.concat(name);\n this._state(items);\n this._redraw();\n }\n },\n\n move: function(name, index) {\n var items = this._state();\n var idx = indexOf(name, items);\n\n if (idx > -1) {\n name = items.splice(idx, 1)[0];\n\n items.splice(index, 0, name);\n\n this._state(items);\n this._redraw();\n }\n },\n\n remove: function(name) {\n var items = this._state();\n var idx = indexOf(name, items);\n var sortExpressions = this.dataSource.sort();\n var filter = this.dataSource.filter();\n\n if (idx > -1) {\n if (filter) {\n filter.filters = removeExpr(filter.filters, name);\n this._savedFilter = this.dataSource._filter;\n this._savedFilter.filters = filter.filters;\n if (!filter.filters.length) {\n this._savedFilter = null;\n }\n }\n if (sortExpressions) {\n sortExpressions = removeExpr(sortExpressions, name);\n this._sortState = sortExpressions;\n }\n items.splice(idx, 1);\n this._state(items);\n this._redraw();\n }\n },\n\n _emptyState: function(enable) {\n var that = this;\n if (enable) {\n that.element.html(this.options.messages.empty)\n .addClass(\"k-settings-description\")\n .removeClass(\"k-chip-list\");\n } else {\n that.element\n .removeClass(\"k-settings-description\")\n .addClass(\"k-chip-list\");\n }\n },\n\n _redraw: function() {\n var items = this._state() || [];\n this._emptyState(!items.length);\n if (items.length) {\n this.element.html(this._targetsHTML(items));\n }\n },\n\n _targetsHTML: function(items) {\n var item;\n var html = \"\";\n var idx = 0;\n var options = this.options;\n var enabled = false;\n\n if (this.options.setting != \"measures\") {\n enabled = options.filterable || options.sortable;\n }\n\n if (items.length) {\n for (; idx < items.length; idx++) {\n item = items[idx];\n item = item.name === undefined$1 ? { name: item } : item;\n\n html += this.template({ name: item.name, menuenabled: enabled });\n }\n }\n return html;\n },\n\n refresh: function() {\n if (this.dataSource._preventRefresh) {\n return;\n }\n var items = this.dataSource[this.options.setting]();\n this._state(items, true);\n this._emptyState(!this._state().length);\n if (items.length) {\n this.element.html(this._targetsHTML(items));\n }\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n\n this.dataSource.unbind(CHANGE, this._refreshHandler);\n this.element.off(NS);\n\n if (this.sortable) {\n this.sortable.destroy();\n }\n\n if (this.fieldMenu) {\n this.fieldMenu.destroy();\n }\n\n this.element = null;\n this._refreshHandler = null;\n }\n });\n\n var PivotConfiguratorButton = Widget.extend({\n init: function(element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n that.element = $(element);\n\n that._element();\n that._attachEvents();\n },\n\n options: {\n name: \"PivotConfiguratorButton\",\n text: \"Change settings\",\n configurator: \"\"\n },\n\n destroy: function() {\n this.element.off(NS);\n },\n\n setOptions: function(options) {\n var that = this;\n kendo.deepExtend(that.options, options);\n this.init(this.element, this.options);\n },\n\n toggle: function() {\n var attr = kendo.attr(\"role\");\n var pivotEl = this.element\n .closest(\"[\" + attr + \"=pivotcontainer]\")\n .find(\"[\" + attr + \"=pivotgridv2]\");\n var pivot;\n\n $(\"#\" + this.options.configurator).toggleClass(\"k-hidden\");\n\n if (pivotEl.length) {\n pivot = pivotEl.getKendoPivotGridV2();\n pivot._setContentWidth();\n pivot._updateDimensions();\n }\n },\n\n _attachEvents: function() {\n this.element.on(\"click\" + NS, this.toggle.bind(this));\n },\n\n _element: function() {\n var options = this.options;\n this.element.addClass(\"k-pivotgrid-configurator-button\");\n this.element.html(kendo.format(\"{0}\",options.text));\n }\n });\n\n var PivotContainer = Widget.extend({\n init: function(element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n that.element = $(element);\n that.options = options;\n\n\n that._addClasses();\n },\n\n options: {\n name: \"PivotContainer\",\n configuratorPosition: \"left\"\n },\n\n setOptions: function(options) {\n var that = this;\n kendo.deepExtend(that.options, options);\n this.init(this.element, this.options);\n },\n\n _addClasses: function() {\n var options = this.options;\n var className;\n this.element.removeClass(\"k-flex-row k-flex-row-reverse k-flex-column k-flex-column-reverse\");\n\n switch (options.configuratorPosition) {\n case \"right\":\n className = \"k-flex-row\";\n break;\n case \"left\":\n className = \"k-flex-row-reverse\";\n break;\n case \"bottom\":\n className = \"k-flex-column\";\n break;\n case \"top\":\n className = \"k-flex-column-reverse\";\n break;\n default:\n className = \"k-flex-row\";\n }\n\n this.element\n .addClass(\"k-d-flex k-pos-relative\")\n .addClass(className);\n }\n });\n\n var PivotGridV2 = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n that._dataSource();\n\n that._bindConfigurator();\n\n that._ariaId = that.element.attr(\"id\") || kendo.guid();\n that._wrapper();\n\n that._columnHeadersWrapper = $('
');\n that._rowHeadersWrapper = $('
');\n that._contentWrapper = $('
');\n\n that.wrapper.append(that._columnHeadersWrapper);\n that.wrapper.append(that._rowHeadersWrapper);\n that.wrapper.append(that._contentWrapper);\n\n that._columnBuilder = new ColumnRowBuilder( { template: this.options.columnHeaderTemplate, axes: \"columns\", ariaId: that._ariaId });\n that._rowBuilder = new ColumnRowBuilder( { template: this.options.rowHeaderTemplate, axes: \"rows\", ariaId: that._ariaId });\n that._contentBuilder = new ContentBuilderV2( { template: this.options.dataCellTemplate || DATACELL_TEMPLATE, ariaId: that._ariaId });\n\n that._scrollable();\n that._rowHeadersWrapper\n .add(that._columnHeadersWrapper)\n .on(\"click\", \"span.k-icon,span.k-svg-icon\", function() {\n var button = $(this);\n var path = button.parent().attr(kendo.attr(\"key\"));\n var expanded = button.is(\".k-i-chevron-up,.k-svg-i-chevron-up\");\n var isRow = button.closest(\".k-pivotgrid-row-headers\").length !== 0;\n var paths = path.split(\",\");\n var eventName = expanded ? COLLAPSEMEMBER : EXPANDMEMBER;\n\n if (that.trigger(eventName, { path: paths, axis: isRow ? \"rows\" : \"columns\" })) {\n return;\n }\n\n var reducerPayLoad = {\n type: \"HEADERS_ACTION_TOGGLE\",\n payload: paths,\n tree: isRow ? that._rowBuilder.getTree() : that._columnBuilder.getTree()\n };\n var currentAxes = isRow ? that.dataSource._rows : that.dataSource._columns;\n var newHeaders = headersReducer(currentAxes, reducerPayLoad);\n\n that.dataSource._preventRefresh = true;\n\n if (isRow) {\n that.dataSource.rows(newHeaders);\n } else {\n that.dataSource.columns(newHeaders);\n }\n });\n\n if (that.options.autoBind) {\n that.dataSource.fetch();\n }\n\n that._aria();\n\n if (that.options.navigatable) {\n that._initPivotGridNavigation();\n }\n\n kendo.notify(that);\n },\n\n events: [\n DATABINDING,\n DATABOUND,\n EXPANDMEMBER,\n COLLAPSEMEMBER\n ],\n\n options: {\n name: \"PivotGridV2\",\n autoBind: true,\n height: null,\n columnWidth: null,\n configurator: \"\",\n columnHeaderTemplate: null,\n rowHeaderTemplate: null,\n dataCellTemplate: null,\n messages: {\n emptyCellLabel: \"PivotGrid Empty Cell\"\n }\n },\n\n destroy: function() {\n var that = this;\n Widget.fn.destroy.call(that);\n\n if (that._windowResizeHandler) {\n $(window).off(RESIZE + NS, that._windowResizeHandler);\n that._windowResizeHandler = null;\n }\n },\n\n _aria: function() {\n var that = this;\n that.element.attr(\"role\", \"grid\");\n },\n\n _initPivotGridNavigation: function() {\n var that = this;\n\n that.navigation = new PivotGridNavigation({ tabIndex: 0 });\n that.navigation.start(that.element[0]);\n\n var firstCell = that.navigation.first;\n\n if (firstCell) {\n firstCell.setAttribute('tabindex', '0');\n }\n },\n\n _matchAriaAttributes: function(wrapper) {\n var that = this;\n var rowHeaderRows = wrapper.querySelectorAll(\n \".k-pivotgrid-row-headers .k-pivotgrid-row\"\n );\n var rowHeaderCols = !rowHeaderRows[0] ? [] : Array.from(rowHeaderRows[0].children).reduce(\n function (acc, curr) { return (acc += curr.getAttribute(\"colspan\") !== null ? +curr.getAttribute(\"colspan\") : 1); },\n 0\n );\n var colHeaderRows = wrapper.querySelectorAll(\n \".k-pivotgrid-column-headers tr\"\n );\n var colHeaderCells = wrapper.querySelectorAll(\n \".k-pivotgrid-column-headers th\"\n );\n var valueTableCells = wrapper.querySelectorAll(\".k-pivotgrid-values td\");\n var emptyCell = wrapper.querySelector(\".k-pivotgrid-empty-cell\");\n\n emptyCell.setAttribute(\"aria-rowspan\", colHeaderRows.length.toString());\n emptyCell.setAttribute(\"aria-colspan\", rowHeaderCols.toString());\n\n var firstColHeadersRow = colHeaderRows[0];\n var firstColHeaderRowCellsIds = !firstColHeadersRow ? [] : Array.from(firstColHeadersRow.children)\n .map(function (el) { return el.getAttribute(\"id\"); })\n .join(\" \");\n firstColHeadersRow.setAttribute(\n \"aria-owns\",\n ((emptyCell.getAttribute(\"id\")) + \" \" + firstColHeaderRowCellsIds)\n );\n\n rowHeaderRows.forEach(function (row, index) {\n var valueCellsIds = that.filterAndMap(\n Array.from(valueTableCells),\n function (c) {\n var idParts = c.getAttribute(\"id\").split(\"-\");\n return idParts[idParts.length - 2] === (index + 1).toString();\n },\n function (c) { return c.getAttribute(\"id\"); }\n );\n\n row.setAttribute(\"aria-owns\", valueCellsIds.join(\" \"));\n });\n\n valueTableCells.forEach(function (cell) {\n var idParts = cell.getAttribute(\"id\").split(\"-\");\n var cellColIndex = +idParts[idParts.length - 1];\n var colHeaderCellsIds = that.filterAndMap(\n Array.from(colHeaderCells),\n function (c) {\n var idParts = c.getAttribute(\"id\").split(\"-\");\n var headerCellColIndex = +idParts[idParts.length - 1];\n var headerCellColspan = +c.getAttribute(\"colspan\");\n var colIndexIsEqual = cellColIndex === headerCellColIndex;\n var cellColIndexIsWithinHeaderCellRange =\n headerCellColspan > 1 &&\n headerCellColIndex < cellColIndex &&\n headerCellColIndex + headerCellColspan - 1 >= cellColIndex;\n\n return colIndexIsEqual || cellColIndexIsWithinHeaderCellRange;\n },\n function (c) { return c.getAttribute(\"id\"); }\n );\n\n cell.setAttribute(\"aria-describedby\", colHeaderCellsIds.join(\" \"));\n });\n },\n\n filterAndMap: function(arr, predicate, mapper) {\n return arr.reduce(\n function (acc, curr) { return (predicate(curr) ? acc.concat( [mapper(curr)]) : acc); },\n []\n );\n },\n\n _dataSource: function() {\n var that = this;\n var dataSource = that.options.dataSource;\n\n dataSource = Array.isArray(dataSource) ? { data: dataSource } : dataSource;\n\n if (that.dataSource && this._refreshHandler) {\n that.dataSource.unbind(CHANGE, that._refreshHandler)\n .unbind(PROGRESS, that._progressHandler)\n .unbind(ERROR, that._errorHandler);\n } else {\n that._refreshHandler = that.refresh.bind(that);\n that._progressHandler = that._requestStart.bind(that);\n that._errorHandler = that._error.bind(that);\n }\n\n that.dataSource = kendo.data.PivotDataSourceV2.create(dataSource)\n .bind(CHANGE, that._refreshHandler)\n .bind(PROGRESS, that._progressHandler)\n .bind(ERROR, that._errorHandler);\n },\n\n _resize: function() {\n var that = this;\n that.wrapper[0].style.setProperty('--kendo-scrollbar-width', kendo.format(\"{0}px\", getScollWidth()));\n },\n\n _scrollable: function() {\n var that = this;\n var columnsHeader = that._columnHeadersWrapper;\n var rowsHeader = that._rowHeadersWrapper;\n\n that._resize();\n that._windowResizeHandler = that._resize.bind(that);\n\n that._contentWrapper.scroll(function() {\n kendo.scrollLeft(columnsHeader, this.scrollLeft);\n rowsHeader.scrollTop(this.scrollTop);\n });\n\n rowsHeader.bind(\"DOMMouseScroll\" + NS + \" mousewheel\" + NS, that._wheelScroll.bind(that));\n $(window).on(RESIZE + NS, that._windowResizeHandler);\n },\n\n _wheelScroll: function(e) {\n if (e.ctrlKey) {\n return;\n }\n\n var delta = kendo.wheelDeltaY(e);\n var scrollTop = this._contentWrapper.scrollTop();\n\n if (delta) {\n e.preventDefault();\n $(e.currentTarget).one(\"wheel\" + NS, false);\n\n this._rowHeadersWrapper.scrollTop(scrollTop + (-delta));\n this._contentWrapper.scrollTop(scrollTop + (-delta));\n }\n },\n\n _wrapper: function() {\n var height = this.options.height;\n\n this.wrapper = this.element.addClass(\"k-pivotgrid\");\n var emptyCell = $((\"\" + (this.options.messages.emptyCellLabel) + \"\"));\n this.wrapper.append(emptyCell);\n\n if (height) {\n this.wrapper.css(\"height\", height);\n }\n },\n\n _progress: function(toggle) {\n kendo.ui.progress(this.wrapper, toggle);\n },\n\n _error: function() {\n this._progress(false);\n },\n\n _requestStart: function() {\n this._progress(true);\n },\n\n _updateDimensions: function() {\n var that = this;\n that.wrapper.css({\n \"grid-template-columns\": kendo.format(\"{0}px 1fr\", that._rowHeadersWrapper.find(\".k-pivotgrid-table\")[0].offsetWidth),\n \"grid-template-rows\": kendo.format(\"{0}px 1fr\", that._columnHeadersWrapper.find(\".k-pivotgrid-table\")[0].offsetHeight),\n });\n },\n\n _setContentWidth: function() {\n if (!this.options.columnWidth) {\n return;\n }\n var contentTable = this._contentWrapper.find(\"table\");\n var columnTable = this._columnHeadersWrapper.children(\"table\");\n var rowTable = this._rowHeadersWrapper.children(\"table\");\n\n contentTable.add(columnTable).add(rowTable).find(\"col\").width(this.options.columnWidth);\n },\n\n _bindConfigurator: function() {\n var configurator = this.options.configurator;\n if (configurator) {\n $(configurator).kendoPivotConfiguratorV2(\"setDataSource\", this.dataSource);\n }\n },\n\n cellInfoByElement: function(element) {\n element = $(element);\n\n return this.cellInfo(element.index(), element.parent(\"tr\").index());\n },\n\n cellInfo: function(columnIndex, rowIndex) {\n var contentBuilder = this._contentBuilder;\n var dataIndex;\n var dataItem;\n\n if (columnIndex >= contentBuilder.columnsCount || columnIndex < 0 ||\n rowIndex >= contentBuilder.rowsCount || rowIndex < 0) {\n return null;\n }\n\n dataIndex = rowIndex * contentBuilder.columnsCount + columnIndex;\n dataItem = contentBuilder.hash[dataIndex < 0 ? 0 : dataIndex];\n\n return {\n columnTuple: dataItem.columnTuple,\n rowTuple: dataItem.rowTuple,\n dataItem: dataItem.data\n };\n },\n\n refresh: function() {\n var that = this;\n\n var dataSource = that.dataSource;\n if (that.trigger(DATABINDING, { action: \"rebind\" } )) {\n return;\n }\n\n var lastFocusedCellID = kendo._activeElement() ? kendo._activeElement().id : null;\n var lastCellIdWithTabIndex = that.wrapper.find(\"[tabindex=0]\").attr(\"id\");\n that._columnBuilder.setTuples(dataSource._columnTuples);\n that._columnHeadersWrapper.html(that._columnBuilder.build());\n\n that._rowBuilder.setTuples(dataSource._rowTuples);\n that._rowHeadersWrapper.html(that._rowBuilder.build());\n\n that._contentBuilder.setRowColumnInfo({\n columnHeaderLeafs: that._columnBuilder.getHeaderLeafs(),\n rowHeaderLeafs: that._rowBuilder.getHeaderLeafs(),\n columnHeaderBreadth: that._columnBuilder.getBreadth(),\n rowHeaderDepth: that._rowBuilder.getBreadth(),\n data: dataSource._view\n });\n\n that._contentWrapper.html(that._contentBuilder.build());\n\n\n that._setContentWidth();\n that._updateDimensions();\n\n that._progress(false);\n\n that.trigger(DATABOUND);\n that._matchAriaAttributes(that.wrapper[0]);\n\n if (!that.navigation) {\n return;\n }\n\n if (lastCellIdWithTabIndex && that.element.find((\"#\" + lastCellIdWithTabIndex)).length > 0) {\n that.element.find((\"#\" + lastCellIdWithTabIndex)).attr('tabindex', '0');\n } else {\n var firstCell = that.navigation.first;\n\n if (firstCell) {\n firstCell.setAttribute('tabindex', '0');\n }\n }\n\n if (lastFocusedCellID && lastFocusedCellID.indexOf(that._ariaId) == 0) {\n that.navigation.focusElement(that.element.find((\"#\" + lastFocusedCellID))[0]);\n }\n }\n });\n\n ui.plugin(PivotConfiguratorButton);\n ui.plugin(PivotContainer);\n ui.plugin(PivotGridV2);\n\n var PivotGrid = Widget.extend({\n init: function(element, options) {\n var that = this;\n var columnBuilder;\n var rowBuilder;\n\n Widget.fn.init.call(that, element, options);\n\n STATE_COLLAPSED_ICONNAME = kendo.support.isRtl(that.element) ? \"caret-alt-left\" : \"caret-alt-right\";\n\n that._dataSource();\n\n that._bindConfigurator();\n\n that._wrapper();\n that._createLayout();\n\n that._columnBuilder = columnBuilder = new ColumnBuilder();\n that._rowBuilder = rowBuilder = new RowBuilder();\n that._contentBuilder = new ContentBuilder();\n\n that._templates();\n\n that.columnsHeader\n .add(that.rowsHeader)\n .on(\"click\", \"span.k-icon,span.k-svg-icon\", function() {\n var button = $(this);\n var builder = columnBuilder;\n var action = \"expandColumn\";\n var eventName;\n var path = button.attr(kendo.attr(\"path\"));\n var eventArgs = {\n axis: \"columns\",\n path: $.parseJSON(path)\n };\n\n if (button.parent().is(\"td\")) {\n builder = rowBuilder;\n action = \"expandRow\";\n eventArgs.axis = \"rows\";\n }\n\n var expanded = button.is(STATE_EXPANDED_SELECTOR);\n var metadata = builder.metadata[path];\n var request = metadata.expanded === undefined$1;\n\n eventName = expanded ? COLLAPSEMEMBER : EXPANDMEMBER;\n eventArgs.childrenLoaded = metadata.maxChildren > metadata.children;\n\n if (that.trigger(eventName, eventArgs)) {\n return;\n }\n\n builder.metadata[path].expanded = !expanded;\n kendo.ui.icon(button,{ icon: !expanded ? STATE_EXPANDED_ICONNAME : STATE_COLLAPSED_ICONNAME });\n\n if (!expanded && request) {\n that.dataSource[action](eventArgs.path);\n } else {\n that.refresh();\n }\n });\n\n that._scrollable();\n\n if (that.options.autoBind) {\n that.dataSource.fetch();\n }\n\n kendo.notify(that);\n },\n\n events: [\n DATABINDING,\n DATABOUND,\n EXPANDMEMBER,\n COLLAPSEMEMBER\n ],\n\n options: {\n name: \"PivotGrid\",\n autoBind: true,\n reorderable: true,\n filterable: false,\n sortable: false,\n navigatable: false,\n height: null,\n columnWidth: 100,\n configurator: \"\",\n columnHeaderTemplate: null,\n rowHeaderTemplate: null,\n dataCellTemplate: null,\n kpiStatusTemplate: null,\n kpiTrendTemplate: null,\n messages: {\n measureFields: \"Drop Data Fields Here\",\n columnFields: \"Drop Column Fields Here\",\n rowFields: \"Drop Rows Fields Here\"\n }\n },\n\n _templates: function() {\n var columnTemplate = this.options.columnHeaderTemplate;\n var rowTemplate = this.options.rowHeaderTemplate;\n var dataTemplate = this.options.dataCellTemplate;\n var kpiStatusTemplate = this.options.kpiStatusTemplate;\n var kpiTrendTemplate = this.options.kpiTrendTemplate;\n\n this._columnBuilder.template = kendo.template(columnTemplate || HEADER_TEMPLATE, { useWithBlock: !!columnTemplate });\n this._contentBuilder.dataTemplate = kendo.template(dataTemplate || DATACELL_TEMPLATE, { useWithBlock: !!dataTemplate });\n this._contentBuilder.kpiStatusTemplate = kendo.template(kpiStatusTemplate || KPISTATUS_TEMPLATE, { useWithBlock: !!kpiStatusTemplate });\n this._contentBuilder.kpiTrendTemplate = kendo.template(kpiTrendTemplate || KPITREND_TEMPLATE, { useWithBlock: !!kpiTrendTemplate });\n this._rowBuilder.template = kendo.template(rowTemplate || HEADER_TEMPLATE, { useWithBlock: !!rowTemplate });\n },\n\n _bindConfigurator: function() {\n var configurator = this.options.configurator;\n if (configurator) {\n $(configurator).kendoPivotConfigurator(\"setDataSource\", this.dataSource);\n }\n },\n\n cellInfoByElement: function(element) {\n element = $(element);\n\n return this.cellInfo(element.index(), element.parent(\"tr\").index());\n },\n\n cellInfo: function(columnIndex, rowIndex) {\n var contentBuilder = this._contentBuilder;\n var columnInfo = contentBuilder.columnIndexes[columnIndex || 0];\n var rowInfo = contentBuilder.rowIndexes[rowIndex || 0];\n var dataIndex;\n\n if (!columnInfo || !rowInfo) {\n return null;\n }\n\n dataIndex = (rowInfo.index * contentBuilder.rowLength) + columnInfo.index;\n\n return {\n columnTuple: columnInfo.tuple,\n rowTuple: rowInfo.tuple,\n measure: columnInfo.measure || rowInfo.measure,\n dataItem: this.dataSource.view()[dataIndex]\n };\n },\n\n setDataSource: function(dataSource) {\n this.options.dataSource = dataSource;\n\n this._dataSource();\n\n if (this.measuresTarget) {\n this.measuresTarget.setDataSource(dataSource);\n }\n\n if (this.rowsTarget) {\n this.rowsTarget.setDataSource(dataSource);\n }\n\n if (this.columnsTarget) {\n this.columnsTarget.setDataSource(dataSource);\n }\n\n this._bindConfigurator();\n\n if (this.options.autoBind) {\n dataSource.fetch();\n }\n },\n\n setOptions: function(options) {\n Widget.fn.setOptions.call(this, options);\n\n this._templates();\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n\n clearTimeout(this._headerReflowTimeout);\n },\n\n _dataSource: function() {\n var that = this;\n var dataSource = that.options.dataSource;\n\n dataSource = Array.isArray(dataSource) ? { data: dataSource } : dataSource;\n\n if (that.dataSource && this._refreshHandler) {\n that.dataSource.unbind(CHANGE, that._refreshHandler)\n .unbind(STATERESET, that._stateResetHandler)\n .unbind(PROGRESS, that._progressHandler)\n .unbind(ERROR, that._errorHandler);\n } else {\n that._refreshHandler = that.refresh.bind(that);\n that._progressHandler = that._requestStart.bind(that);\n that._stateResetHandler = that._stateReset.bind(that);\n that._errorHandler = that._error.bind(that);\n }\n\n that.dataSource = kendo.data.PivotDataSource.create(dataSource)\n .bind(CHANGE, that._refreshHandler)\n .bind(PROGRESS, that._progressHandler)\n .bind(STATERESET, that._stateResetHandler)\n .bind(ERROR, that._errorHandler);\n },\n\n _error: function() {\n this._progress(false);\n },\n\n _requestStart: function() {\n this._progress(true);\n },\n\n _stateReset: function() {\n this._columnBuilder.reset();\n this._rowBuilder.reset();\n },\n\n _wrapper: function() {\n var height = this.options.height;\n\n this.wrapper = this.element.addClass(\"k-pivot\");\n\n if (height) {\n this.wrapper.css(\"height\", height);\n }\n },\n\n _measureFields: function() {\n this.measureFields = $(DIV).addClass(\"k-pivot-toolbar k-toolbar k-toolbar-md k-settings-measures\");\n\n this.measuresTarget = this._createSettingTarget(this.measureFields, {\n setting: \"measures\",\n messages: {\n empty: this.options.messages.measureFields\n }\n });\n },\n\n _createSettingTarget: function(element, options) {\n var template,\n pivotOptions = this.options;\n\n template = function (ref) {\n var sortIcon = ref.sortIcon;\n var name = ref.name;\n\n return ''\n + \"\"\n + ''\n + \"\" + name + \"\"\n + ''\n + ''\n + getIcons(sortIcon, options, pivotOptions)\n + ''\n + '';\n };\n\n return new kendo.ui.PivotSettingTarget(element, $.extend({\n dataSource: this.dataSource,\n template: template,\n emptyTemplate: function (data) { return (\"\" + data + \"\"); },\n enabled: this.options.reorderable\n }, options));\n },\n\n _initSettingTargets: function() {\n this.columnsTarget = this._createSettingTarget(this.columnFields, {\n connectWith: this.rowFields,\n setting: \"columns\",\n filterable: this.options.filterable,\n sortable: this.options.sortable,\n messages: {\n empty: this.options.messages.columnFields,\n fieldMenu: this.options.messages.fieldMenu\n }\n });\n\n this.rowsTarget = this._createSettingTarget(this.rowFields, {\n connectWith: this.columnFields,\n setting: \"rows\",\n filterable: this.options.filterable,\n sortable: this.options.sortable,\n messages: {\n empty: this.options.messages.rowFields,\n fieldMenu: this.options.messages.fieldMenu\n }\n });\n },\n\n _createLayout: function() {\n var that = this;\n var layoutTable = $(LAYOUT_TABLE);\n var leftContainer = layoutTable.find(\".k-pivot-rowheaders\");\n var rightContainer = layoutTable.find(\".k-pivot-table\");\n var gridWrapper = $(DIV).addClass(\"k-grid\");\n\n that._measureFields();\n that.columnFields = $(DIV).addClass(\"k-pivot-toolbar k-toolbar k-toolbar-md k-settings-columns\");\n\n that.rowFields = $(DIV).addClass(\"k-pivot-toolbar k-toolbar k-toolbar-md k-settings-rows\");\n that.columnsHeader = $('
')\n .wrap('
');\n\n that.columnsHeader.parent().css(\"padding-right\", kendo.support.scrollbar());\n\n that.rowsHeader = $('
');\n that.content = $('
');\n\n leftContainer.append(that.measureFields);\n leftContainer.append(that.rowFields);\n leftContainer.append(that.rowsHeader);\n\n gridWrapper.append(that.columnsHeader.parent());\n gridWrapper.append(that.content);\n\n rightContainer.append(that.columnFields);\n rightContainer.append(gridWrapper);\n\n that.wrapper.append(layoutTable);\n\n that.columnsHeaderTree = new kendo.dom.Tree(that.columnsHeader[0]);\n that.rowsHeaderTree = new kendo.dom.Tree(that.rowsHeader[0]);\n that.contentTree = new kendo.dom.Tree(that.content[0]);\n\n that._initSettingTargets();\n },\n\n _progress: function(toggle) {\n kendo.ui.progress(this.wrapper, toggle);\n },\n\n _resize: function() {\n if (this.content[0].firstChild) {\n this._setSectionsWidth();\n this._setSectionsHeight();\n this._setContentWidth();\n this._setContentHeight();\n this._columnHeaderReflow();\n }\n },\n\n _columnHeaderReflow: function() {\n var columnTable = this.columnsHeader.children(\"table\");\n\n if (!kendo.support.browser.mozilla) {\n return;\n }\n\n clearTimeout(this._headerReflowTimeout);\n\n columnTable.css(\"table-layout\", \"auto\");\n\n this._headerReflowTimeout = setTimeout(function() {\n columnTable.css(\"table-layout\", \"\");\n });\n },\n\n _setSectionsWidth: function() {\n var rowsHeader = this.rowsHeader;\n var leftColumn = rowsHeader.parent(\".k-pivot-rowheaders\").width(AUTO);\n var width;\n\n width = Math.max(outerWidth(this.measureFields), outerWidth(this.rowFields));\n width = Math.max(rowsHeader.children(\"table\").width(), width);\n\n leftColumn.width(width);\n },\n\n _setSectionsHeight: function() {\n var measureFieldsHeight = this.measureFields.height(AUTO).height();\n var columnFieldsHeight = this.columnFields.height(AUTO).height();\n var rowFieldsHeight = this.rowFields.height(AUTO).innerHeight();\n var columnsHeight = this.columnsHeader.height(AUTO).innerHeight();\n\n var padding = rowFieldsHeight - this.rowFields.height();\n\n var firstRowHeight = columnFieldsHeight > measureFieldsHeight ? columnFieldsHeight : measureFieldsHeight;\n var secondRowHeight = columnsHeight > rowFieldsHeight ? columnsHeight : rowFieldsHeight;\n\n this.measureFields.height(firstRowHeight);\n this.columnFields.height(firstRowHeight);\n this.rowFields.height(secondRowHeight - padding);\n this.columnsHeader.height(secondRowHeight);\n },\n\n _setContentWidth: function() {\n var contentTable = this.content.find(\"table\");\n var columnTable = this.columnsHeader.children(\"table\");\n\n var rowLength = contentTable.children(\"colgroup\").children().length;\n\n var calculatedWidth = rowLength * this.options.columnWidth;\n var minWidth = Math.ceil((calculatedWidth / this.content.width()) * 100);\n\n if (minWidth < 100) {\n minWidth = 100;\n }\n\n contentTable.add(columnTable).css(\"width\", minWidth + \"%\");\n\n this._resetColspan(columnTable);\n },\n\n _setContentHeight: function() {\n var that = this;\n var content = that.content;\n var rowsHeader = that.rowsHeader;\n var innerHeight = that.wrapper.innerHeight();\n var scrollbar = kendo.support.scrollbar();\n var skipScrollbar = content[0].offsetHeight === content[0].clientHeight;\n var height = that.options.height;\n\n if (that.wrapper.is(\":visible\")) {\n if (!innerHeight || !height) {\n if (skipScrollbar) {\n scrollbar = 0;\n }\n\n content.height(\"auto\");\n rowsHeader.height(content.height() - scrollbar);\n return;\n }\n\n innerHeight -= outerHeight(that.columnFields);\n innerHeight -= outerHeight(that.columnsHeader.parent());\n\n if (innerHeight <= scrollbar * 2) { // do not set height if proper scrollbar cannot be displayed\n innerHeight = scrollbar * 2 + 1;\n if (!skipScrollbar) {\n innerHeight += scrollbar;\n }\n }\n\n content.height(innerHeight);\n\n if (skipScrollbar) {\n scrollbar = 0;\n }\n\n rowsHeader.height(innerHeight - scrollbar);\n }\n },\n\n _resetColspan: function(columnTable) {\n var that = this;\n var cell = columnTable.children(\"tbody\").children().first().children().first();\n\n if (that._colspan === undefined$1) {\n that._colspan = cell.attr(\"colspan\");\n }\n\n cell.attr(\"colspan\", 1);\n\n clearTimeout(that._layoutTimeout);\n\n that._layoutTimeout = setTimeout(function() {\n cell.attr(\"colspan\", that._colspan);\n that._colspan = undefined$1;\n });\n },\n\n _axisMeasures: function(axis) {\n var result = [];\n var dataSource = this.dataSource;\n var measures = dataSource.measures();\n var hasMeasure = measures.length > 1 || (measures[0] && measures[0].type);\n\n if (dataSource.measuresAxis() === axis) {\n if (dataSource[axis]().length === 0 || hasMeasure) {\n result = measures;\n }\n }\n\n return result;\n },\n\n items: function() {\n return [];\n },\n\n refresh: function() {\n var that = this;\n var dataSource = that.dataSource;\n\n var axes = dataSource.axes();\n var columns = (axes.columns || {}).tuples || [];\n var rows = (axes.rows || {}).tuples || [];\n\n var columnBuilder = that._columnBuilder;\n var rowBuilder = that._rowBuilder;\n\n var columnAxis = {};\n var rowAxis = {};\n\n if (that.trigger(DATABINDING, { action: \"rebind\" } )) {\n return;\n }\n\n columnBuilder.measures = that._axisMeasures(AXIS_COLUMNS);\n rowBuilder.measures = that._axisMeasures(AXIS_ROWS);\n\n that.columnsHeaderTree.render(columnBuilder.build(columns));\n that.rowsHeaderTree.render(rowBuilder.build(rows));\n\n columnAxis = {\n indexes: columnBuilder._indexes,\n measures: columnBuilder.measures,\n metadata: columnBuilder.metadata\n };\n\n rowAxis = {\n indexes: rowBuilder._indexes,\n measures: rowBuilder.measures,\n metadata: rowBuilder.metadata\n };\n\n that.contentTree.render(that._contentBuilder.build(dataSource.view(), columnAxis, rowAxis));\n\n that._resize();\n\n if (that.touchScroller) {\n that.touchScroller.contentResized();\n } else {\n var touchScroller = kendo.touchScroller(that.content);\n\n if (touchScroller && touchScroller.movable) {\n that.touchScroller = touchScroller;\n\n touchScroller.movable.bind(\"change\", function(e) {\n kendo.scrollLeft(that.columnsHeader, -e.sender.x);\n that.rowsHeader.scrollTop(-e.sender.y);\n });\n }\n }\n\n that._progress(false);\n\n that.trigger(DATABOUND);\n },\n\n _scrollable: function() {\n var that = this;\n var columnsHeader = that.columnsHeader;\n var rowsHeader = that.rowsHeader;\n\n that.content.on(\"scroll\", function() {\n kendo.scrollLeft(columnsHeader, this.scrollLeft);\n rowsHeader.scrollTop(this.scrollTop);\n });\n\n rowsHeader.on(\"DOMMouseScroll\" + NS + \" mousewheel\" + NS, that._wheelScroll.bind(that));\n },\n\n _wheelScroll: function(e) {\n if (e.ctrlKey) {\n return;\n }\n\n var delta = kendo.wheelDeltaY(e);\n var scrollTop = this.content.scrollTop();\n\n if (delta) {\n e.preventDefault();\n //In Firefox DOMMouseScroll event cannot be canceled\n $(e.currentTarget).closest(\":not(path,svg)\").one(\"wheel\" + NS, false);\n\n this.rowsHeader.scrollTop(scrollTop + (-delta));\n this.content.scrollTop(scrollTop + (-delta));\n }\n }\n });\n\n var element = kendo.dom.element;\n var htmlNode = kendo.dom.html;\n\n var createMetadata = function(levelNum, memberIdx) {\n return {\n maxChildren: 0,\n children: 0,\n maxMembers: 0,\n members: 0,\n measures: 1,\n levelNum: levelNum,\n parentMember: memberIdx !== 0\n };\n };\n\n var buildPath = function(tuple, index) {\n var path = [];\n var idx = 0;\n\n for (; idx <= index; idx++) {\n path.push(tuple.members[idx].name);\n }\n\n return path;\n };\n\n var tupleName = function(tuple, index) {\n var name = \"\";\n var idx = 0;\n\n for (; idx <= index; idx++) {\n name += tuple.members[idx].name;\n }\n\n return name;\n };\n\n var ContentBuilderV2 = Class.extend({\n init: function(options) {\n this.template = kendo.template(options.template);\n this.ariaId = options.ariaId;\n this.hash = [];\n },\n\n setRowColumnInfo: function(options) {\n this.data = options.data;\n this.columnHeaderLeafs = options.columnHeaderLeafs;\n this.rowHeaderLeafs = options.rowHeaderLeafs;\n this.columnHeaderBreadth = options.columnHeaderBreadth;\n this.rowHeaderDepth = options.rowHeaderDepth;\n this.hash.length = 0;\n },\n\n addColElements: function(count) {\n var html = \"\";\n\n for (var index = 0; index < count; index++) {\n html += \"\";\n }\n\n this.table.find(\"colgroup\").append(html);\n },\n\n addRowElements: function(data) {\n var that = this;\n var body = that.table.find(\"tbody\");\n var row;\n\n for (var index = 0; index < data.length; index++) {\n row = $((\"\"));\n body.append(row);\n that.addColumCell(row, data[index], index);\n }\n\n this.rowsCount = data.length;\n },\n\n addColumCell: function(rowEl, rowItem, rowIndex) {\n var that = this;\n for (var index = 0; index < rowItem.cells.length; index++) {\n var cell = rowItem.cells[index];\n if (cell) {\n var cellEl = $((\"\"));\n if (this.rowHeaderLeafs[rowIndex].total || this.columnHeaderLeafs[index].total) {\n cellEl.addClass(\"k-pivotgrid-header-total\");\n }\n cellEl.append(that.template({\n dataItem: cell.data,\n rowTuple: cell.rowTuple,\n columnTuple: cell.columnTuple\n }));\n this.hash.push(cell);\n rowEl.append(cellEl);\n }\n }\n },\n\n build: function() {\n var data = toData((this.data || []).slice(), this.columnHeaderLeafs, this.rowHeaderLeafs, this.columnHeaderBreadth, this.rowHeaderDepth);\n var that = this;\n\n var table = $((\"\"));\n\n that.table = table;\n that.addColElements(this.columnHeaderLeafs.length);\n that.addRowElements(data);\n this.rowsCount = data.length;\n this.columnsCount = this.columnHeaderLeafs.length;\n\n return that.table;\n }\n });\n\n var ColumnRowBuilder = Class.extend({\n init: function(options) {\n this.tuples = options.tuples;\n this.axes = options.axes;\n this.ariaId = options.ariaId;\n this.headerTemplate = kendo.template(HEADERTEMPLATE);\n if (options.template) {\n this.template = kendo.template(options.template);\n }\n },\n\n setTuples: function(tuples) {\n this.tuples = tuples;\n },\n\n addColElements: function(count) {\n var html = \"\";\n\n for (var index = 0; index < count; index++) {\n html += \"\";\n }\n\n this.table.find(\"colgroup\").append(html);\n },\n\n addRowElements: function(columnHeaderRows) {\n var that = this;\n var body = that.table.find(\"tbody\");\n var row;\n\n for (var index = 0; index < columnHeaderRows.length; index++) {\n row = $('');\n body.append(row);\n that.addColumCell(row, columnHeaderRows[index], index);\n }\n },\n\n addColumCell: function(rowEl, rowItem, rowIndex) {\n var that = this;\n var cellEl;\n var cell;\n\n for (var index = 0; index < rowItem.cells.length; index++) {\n cell = rowItem.cells[index];\n if (cell) {\n cellEl = $(that.headerTemplate({\n id: ((that.ariaId) + \"-\" + (that.axes == \"columns\" ? \"ch\" : \"rh\") + \"-\" + (rowIndex + 1) + \"-\" + (index + 1)),\n rowspan: cell.rowSpan,\n colspan: cell.colSpan,\n key: cell.path.join(\",\") + (cell.total ? '|[TOTAL]' : ''),\n iconClass: (cell.children && cell.children.length) ? \"up\" : \"down\",\n expandable: cell.hasChildren && !cell.total,\n expanded: (cell.children && cell.children.length) ? \"true\" : \"false\",\n headerClass: kendo.format(\"k-pivotgrid-cell{0}{1}\", cell.total ? \" k-pivotgrid-header-total\" : \"\", cell.levelNum === 0 ? \" k-pivotgrid-header-root\" : \"\"),\n role: that.axes == \"columns\" ? \"columnheader\" : \"rowheader\"\n }));\n cellEl.append(that.template ? that.template({ member: cell }) : cell.caption);\n rowEl.append(cellEl);\n }\n }\n },\n\n build: function() {\n var tree = toTree((this.tuples || []).slice());\n var treeData = this.axes == \"columns\" ? toColumns(tree) : toRows(tree);\n var headerRows = treeData[0];\n var headerLeafs = treeData[1];\n var breadth = treeData[2];\n var rowHeaderBreadth = treeData[3];\n var that = this;\n that._tree = tree;\n that._breadth = breadth;\n that._headerLeafs = headerLeafs;\n\n var table = $((\"\"));\n\n that.table = table;\n that.addColElements(this.axes == \"columns\" ? headerLeafs.length : rowHeaderBreadth);\n that.addRowElements(headerRows);\n\n return that.table;\n },\n\n getTree: function() {\n return this._tree;\n },\n\n getBreadth: function() {\n return this._breadth;\n },\n\n getHeaderLeafs: function() {\n return this._headerLeafs;\n }\n });\n\n var ColumnBuilder = Class.extend({\n init: function() {\n this.measures = 1;\n this.metadata = {};\n },\n\n build: function(tuples) {\n var tbody = this._tbody(tuples);\n var colgroup = this._colGroup();\n\n return [\n element(\"table\", { className: tableStyles.headerTable }, [colgroup, tbody])\n ];\n },\n\n reset: function() {\n this.metadata = {};\n },\n\n _colGroup: function() {\n var length = this._rowLength();\n var children = [];\n var idx = 0;\n\n for (; idx < length; idx++) {\n children.push(element(\"col\", null));\n }\n\n return element(\"colgroup\", null, children);\n },\n\n _tbody: function(tuples) {\n var root = tuples[0];\n\n this.map = {};\n this.rows = [];\n this.rootTuple = root;\n\n this._indexes = [];\n\n if (root) {\n this._buildRows(root, 0);\n this._normalize();\n } else {\n this.rows.push(element(\"tr\", { className: tableStyles.tableRow }, [ element(\"th\", { className: tableStyles.header } , [ htmlNode(\" \") ]) ]));\n }\n\n return element(\"tbody\", { className: tableStyles.tbody }, this.rows);\n },\n\n _normalize: function() {\n var rows = this.rows;\n var rowsLength = rows.length;\n var rowIdx = 0;\n var row;\n\n var cellsLength;\n var cellIdx;\n var cells;\n var cell;\n\n for (; rowIdx < rowsLength; rowIdx++) {\n row = rows[rowIdx];\n\n if (row.rowSpan === 1) {\n continue;\n }\n\n cells = row.children;\n\n cellIdx = 0;\n cellsLength = cells.length;\n\n for (; cellIdx < cellsLength; cellIdx++) {\n cell = cells[cellIdx];\n\n if (cell.tupleAll) {\n cell.attr.rowSpan = row.rowSpan;\n }\n }\n }\n },\n\n _rowIndex: function(row) {\n var rows = this.rows;\n var length = rows.length;\n var idx = 0;\n\n for (; idx < length; idx++) {\n if (rows[idx] === row) {\n break;\n }\n }\n\n return idx;\n },\n\n _rowLength: function() {\n var cells = this.rows[0] ? this.rows[0].children : [];\n var length = cells.length;\n var rowLength = 0;\n var idx = 0;\n\n if (length) {\n for (; idx < length; idx++) {\n rowLength += cells[idx].attr.colSpan || 1;\n }\n }\n\n if (!rowLength) {\n rowLength = this.measures;\n }\n\n return rowLength;\n },\n\n _row: function(tuple, memberIdx, parentMember) {\n var rootName = this.rootTuple.members[memberIdx].name;\n var levelNum = tuple.members[memberIdx].levelNum;\n var rowKey = rootName + levelNum;\n var map = this.map;\n var parentRow;\n var children;\n\n var row = map[rowKey];\n\n if (!row) {\n row = element(\"tr\", { className: tableStyles.tableRow }, []);\n\n row.parentMember = parentMember;\n row.collapsed = 0;\n row.colSpan = 0;\n row.rowSpan = 1;\n\n map[rowKey] = row;\n parentRow = map[rootName + (Number(levelNum) - 1)];\n\n if (parentRow) {\n children = parentRow.children;\n\n if (children[1] && children[1].attr.className.indexOf(\"k-alt\") === -1) {\n row.notFirst = true;\n } else {\n row.notFirst = parentRow.notFirst;\n }\n }\n\n this.rows.splice(this._rowIndex(parentRow) + 1, 0, row);\n } else {\n row.notFirst = false;\n\n if (!row.parentMember || row.parentMember !== parentMember) {\n row.parentMember = parentMember;\n row.collapsed = 0;\n row.colSpan = 0;\n }\n }\n\n return row;\n },\n\n _measures: function(measures, tuple, className) {\n var map = this.map;\n var row = map.measureRow;\n var measure;\n\n if (!row) {\n row = element(\"tr\", { className: tableStyles.tableRow }, []);\n map.measureRow = row;\n this.rows.push(row);\n }\n\n for (var idx = 0, length = measures.length; idx < length; idx++) {\n measure = measures[idx];\n row.children.push(this._cell((className || \"\"), [this._content(measure, tuple)], measure));\n }\n\n return length;\n },\n\n _content: function(member, tuple) {\n return htmlNode(this.template({\n member: member,\n tuple: tuple\n }), true);\n },\n\n _cell: function(className, children, member) {\n var cell = element(\"th\", { className: tableStyles.header + \" \" + className }, children);\n cell.value = member.caption || member.name;\n return cell;\n },\n\n _buildRows: function(tuple, memberIdx, parentMember) {\n var members = tuple.members;\n var member = members[memberIdx];\n var nextMember = members[memberIdx + 1];\n\n var row, childRow, children, childrenLength;\n var cell, allCell, cellAttr;\n var cellChildren = [];\n var path;\n\n var idx = 0;\n var metadata;\n\n var colSpan;\n var collapsed = 0;\n var memberCollapsed = 0;\n\n if (member.measure) {\n this._measures(member.children, tuple);\n return;\n }\n\n path = kendo.stringify(buildPath(tuple, memberIdx));\n row = this._row(tuple, memberIdx, parentMember);\n\n children = member.children;\n childrenLength = children.length;\n\n metadata = this.metadata[path];\n if (!metadata) {\n this.metadata[path] = metadata = createMetadata(Number(member.levelNum), memberIdx);\n metadata.rootLevelNum = Number(this.rootTuple.members[memberIdx].levelNum);\n }\n\n this._indexes.push({\n path: path,\n tuple: tuple\n });\n\n if (member.hasChildren) {\n if (metadata.expanded === false) {\n collapsed = metadata.maxChildren;\n row.collapsed += collapsed;\n\n metadata.children = 0;\n childrenLength = 0;\n }\n\n var cellIconEl = $(\"\");\n cellIconEl.attr(kendo.attr(\"path\"), path);\n\n cellChildren.push(kendo.dom.html(kendo.ui.icon(cellIconEl, { icon: childrenLength ? STATE_EXPANDED_ICONNAME : STATE_COLLAPSED_ICONNAME })));\n }\n\n cellChildren.push(this._content(member, tuple));\n cell = this._cell((row.notFirst ? \" k-first\" : \"\"), cellChildren, member);\n\n row.children.push(cell);\n row.colSpan += 1;\n\n if (childrenLength) {\n allCell = this._cell(\" k-alt\", [this._content(member, tuple)], member);\n row.children.push(allCell);\n\n for (; idx < childrenLength; idx++) {\n childRow = this._buildRows(children[idx], memberIdx, member);\n }\n\n colSpan = childRow.colSpan;\n collapsed = childRow.collapsed;\n\n cell.attr.colSpan = colSpan;\n\n metadata.children = colSpan;\n metadata.members = 1;\n\n row.colSpan += colSpan;\n row.collapsed += collapsed;\n row.rowSpan = childRow.rowSpan + 1;\n\n if (nextMember) {\n if (nextMember.measure) {\n colSpan = this._measures(nextMember.children, tuple, \" k-alt\");\n } else {\n childRow = this._buildRows(tuple, memberIdx + 1);\n colSpan = childRow.colSpan;\n\n row.collapsed += childRow.collapsed;\n memberCollapsed = childRow.collapsed;\n }\n\n allCell.attr.colSpan = colSpan;\n colSpan -= 1;\n\n metadata.members += colSpan;\n row.colSpan += colSpan;\n }\n } else if (nextMember) {\n if (nextMember.measure) {\n colSpan = this._measures(nextMember.children, tuple);\n } else {\n childRow = this._buildRows(tuple, memberIdx + 1);\n colSpan = childRow.colSpan;\n\n row.collapsed += childRow.collapsed;\n memberCollapsed = childRow.collapsed;\n }\n\n metadata.members = colSpan;\n\n if (colSpan > 1) {\n cell.attr.colSpan = colSpan;\n row.colSpan += colSpan - 1;\n }\n }\n\n if (metadata.maxMembers < (metadata.members + memberCollapsed)) {\n metadata.maxMembers = metadata.members + memberCollapsed;\n }\n\n children = metadata.children + collapsed;\n\n if (metadata.maxChildren < children) {\n metadata.maxChildren = children;\n }\n\n (allCell || cell).tupleAll = true;\n\n return row;\n }\n });\n\n var RowBuilder = Class.extend({\n init: function() {\n this.metadata = {};\n },\n\n build: function(tuples) {\n var tbody = this._tbody(tuples);\n var colgroup = this._colGroup();\n\n return [\n element(\"table\", { className: tableStyles.table }, [colgroup, tbody])\n ];\n },\n\n reset: function() {\n this.metadata = {};\n },\n\n _rowLength: function() {\n var children = this.rows[0].children;\n var length = 0;\n var idx = 0;\n\n var cell = children[idx];\n\n while (cell) {\n length += (cell.attr.colSpan || 1);\n cell = children[++idx];\n }\n\n return length;\n },\n\n _colGroup: function() {\n var length = this._rowLength();\n var children = [];\n var idx = 0;\n\n for (; idx < length; idx++) {\n children.push(element(\"col\", null));\n }\n\n return element(\"colgroup\", null, children);\n },\n\n _tbody: function(tuples) {\n var root = tuples[0];\n\n this.rootTuple = root;\n this.rows = [];\n this.map = {};\n\n this._indexes = [];\n\n if (root) {\n this._buildRows(root, 0);\n this._normalize();\n } else {\n this.rows.push(element(\"tr\", { className: tableStyles.tableRow }, [ element(\"td\", { className: tableStyles.tableCell }, [ htmlNode(\" \") ]) ]));\n }\n\n return element(\"tbody\", { className: tableStyles.tbody }, this.rows);\n },\n\n _normalize: function() {\n var rows = this.rows;\n var rowsLength = rows.length;\n var rowIdx = 0;\n\n var members = this.rootTuple.members;\n var firstMemberName = members[0].name;\n var membersLength = members.length;\n var memberIdx = 0;\n\n var row;\n var cell;\n var maxcolSpan;\n var map = this.map;\n var allRow;\n\n for (; rowIdx < rowsLength; rowIdx++) {\n row = rows[rowIdx];\n\n for (memberIdx = 0; memberIdx < membersLength; memberIdx++) {\n maxcolSpan = this[members[memberIdx].name];\n cell = row.colSpan[\"dim\" + memberIdx];\n\n if (cell && cell.colSpan < maxcolSpan) {\n cell.attr.colSpan = (maxcolSpan - cell.colSpan) + 1;\n }\n }\n }\n\n row = map[firstMemberName];\n allRow = map[firstMemberName + \"all\"];\n\n if (row) {\n row.children[0].attr.className = tableStyles.tableCell + \" k-first\";\n }\n\n if (allRow) {\n allRow.children[0].attr.className += \" k-first \" + tableStyles.tableCell;\n }\n },\n\n _row: function(children) {\n var row = element(\"tr\", { className: tableStyles.tableRow }, children);\n row.rowSpan = 1;\n row.colSpan = {};\n\n this.rows.push(row);\n\n return row;\n },\n\n _content: function(member, tuple) {\n return htmlNode(this.template({\n member: member,\n tuple: tuple\n }), true);\n },\n\n _cell: function(className, children, member) {\n var cell = element(\"td\", { className: tableStyles.tableCell + \" \" + className }, children);\n cell.value = member.caption || member.name;\n return cell;\n },\n\n _buildRows: function(tuple, memberIdx) {\n var map = this.map;\n var path;\n\n var members = tuple.members;\n var member = members[memberIdx];\n var nextMember = members[memberIdx + 1];\n\n var children = member.children;\n var childrenLength = children.length;\n\n var levelNum = Number(member.levelNum);\n var rootName = this.rootTuple.members[memberIdx].name;\n var tuplePath = buildPath(tuple, memberIdx - 1).join(\"\");\n var rootLevelNum = Number(this.rootTuple.members[memberIdx].levelNum);\n var parentName = tuplePath + (rootLevelNum === levelNum ? \"\" : (member.parentName || \"\"));\n var row = map[parentName + \"all\"] || map[parentName];\n var colSpan = levelNum + 1;\n\n var cell, allCell;\n var childRow, allRow;\n var metadata;\n var className;\n var cellChildren = [];\n var expandIconAttr;\n var idx;\n\n if (!row || row.hasChild) {\n row = this._row();\n } else {\n row.hasChild = true;\n }\n\n if (member.measure) {\n className = row.allCell ? \"k-grid-footer\" : \"\";\n row.children.push(this._cell(className, [ this._content(children[0], tuple) ], children[0]));\n\n row.rowSpan = childrenLength;\n\n for (idx = 1; idx < childrenLength; idx++) {\n this._row([ this._cell(className, [ this._content(children[idx], tuple) ], children[idx]) ]);\n }\n\n return row;\n }\n\n map[tuplePath + member.name] = row;\n\n path = kendo.stringify(buildPath(tuple, memberIdx));\n\n metadata = this.metadata[path];\n if (!metadata) {\n this.metadata[path] = metadata = createMetadata(levelNum, memberIdx);\n metadata.rootLevelNum = rootLevelNum;\n }\n\n this._indexes.push({\n path: path,\n tuple: tuple\n });\n\n if (member.hasChildren) {\n if (metadata.expanded === false) {\n childrenLength = 0;\n metadata.children = 0;\n }\n\n var cellIconEl = $(\"\");\n cellIconEl.attr(kendo.attr(\"path\"), path);\n\n cellChildren.push(kendo.dom.html(kendo.ui.icon(cellIconEl, { icon: childrenLength ? STATE_EXPANDED_ICONNAME : STATE_COLLAPSED_ICONNAME })));\n }\n\n cellChildren.push(this._content(member, tuple));\n\n className = row.allCell && !childrenLength ? \"k-grid-footer\" : \"\";\n cell = this._cell(className, cellChildren, member);\n cell.colSpan = colSpan;\n\n row.children.push(cell);\n row.colSpan[\"dim\" + memberIdx] = cell;\n\n if (!this[rootName] || this[rootName] < colSpan) {\n this[rootName] = colSpan;\n }\n\n if (childrenLength) {\n row.allCell = false;\n row.hasChild = false;\n\n for (idx = 0; idx < childrenLength; idx++) {\n childRow = this._buildRows(children[idx], memberIdx);\n\n if (row !== childRow) {\n row.rowSpan += childRow.rowSpan;\n }\n }\n\n if (row.rowSpan > 1) {\n cell.attr.rowSpan = row.rowSpan;\n }\n\n metadata.children = row.rowSpan;\n\n allCell = this._cell(\"k-grid-footer\", [this._content(member, tuple)], member);\n allCell.colSpan = colSpan;\n\n allRow = this._row([ allCell ]);\n allRow.colSpan[\"dim\" + memberIdx] = allCell;\n allRow.allCell = true;\n\n map[tuplePath + member.name + \"all\"] = allRow;\n\n if (nextMember) {\n childRow = this._buildRows(tuple, memberIdx + 1);\n allCell.attr.rowSpan = childRow.rowSpan;\n }\n\n row.rowSpan += allRow.rowSpan;\n\n metadata.members = allRow.rowSpan;\n\n } else if (nextMember) {\n row.hasChild = false;\n this._buildRows(tuple, memberIdx + 1);\n\n (allCell || cell).attr.rowSpan = row.rowSpan;\n\n metadata.members = row.rowSpan;\n }\n\n if (metadata.maxChildren < metadata.children) {\n metadata.maxChildren = metadata.children;\n }\n\n if (metadata.maxMembers < metadata.members) {\n metadata.maxMembers = metadata.members;\n }\n\n return row;\n }\n });\n\n var ContentBuilder = Class.extend({\n init: function() {\n this.columnAxis = {};\n this.rowAxis = {};\n },\n\n build: function(data, columnAxis, rowAxis) {\n var index = columnAxis.indexes[0];\n var metadata = columnAxis.metadata[index ? index.path : undefined$1];\n\n this.columnAxis = columnAxis;\n this.rowAxis = rowAxis;\n\n this.data = data;\n\n this.rowLength = metadata ? metadata.maxChildren + metadata.maxMembers : columnAxis.measures.length || 1;\n\n if (!this.rowLength) {\n this.rowLength = 1;\n }\n\n var tbody = this._tbody();\n var colgroup = this._colGroup();\n\n return [\n element(\"table\", { className: tableStyles.contentTable }, [colgroup, tbody])\n ];\n },\n\n _colGroup: function() {\n var length = this.columnAxis.measures.length || 1;\n var children = [];\n var idx = 0;\n\n if (this.rows[0]) {\n length = this.rows[0].children.length;\n }\n\n for (; idx < length; idx++) {\n children.push(element(\"col\", null));\n }\n\n return element(\"colgroup\", null, children);\n },\n\n _tbody: function() {\n this.rows = [];\n\n if (this.data[0]) {\n this.columnIndexes = this._indexes(this.columnAxis, this.rowLength);\n this.rowIndexes = this._indexes(this.rowAxis, Math.ceil(this.data.length / this.rowLength));\n\n this._buildRows();\n } else {\n this.rows.push(element(\"tr\", { className: tableStyles.tableRow }, [ element(\"td\", { className: tableStyles.tableCell }, [ htmlNode(\" \") ]) ]));\n }\n\n return element(\"tbody\", { className: tableStyles.tbody }, this.rows);\n },\n\n _indexes: function(axisInfo, total) {\n var result = [];\n var axisInfoMember;\n var indexes = axisInfo.indexes;\n var metadata = axisInfo.metadata;\n var measures = axisInfo.measures;\n var measuresLength = measures.length || 1;\n\n var current;\n var dataIdx = 0;\n var firstEmpty = 0;\n\n var idx = 0;\n var length = indexes.length;\n var measureIdx;\n var index;\n\n var children;\n var skipChildren;\n\n if (!length) {\n for (measureIdx = 0; measureIdx < measuresLength; measureIdx++) {\n result[measureIdx] = {\n index: measureIdx,\n measure: measures[measureIdx],\n tuple: null\n };\n }\n\n return result;\n }\n\n for (; idx < length; idx++) {\n axisInfoMember = indexes[idx];\n current = metadata[axisInfoMember.path];\n children = current.children + current.members;\n skipChildren = 0;\n\n if (children) {\n children -= measuresLength;\n }\n\n if (current.expanded === false && current.children !== current.maxChildren) {\n skipChildren = current.maxChildren;\n }\n\n if (current.parentMember && current.levelNum === current.rootLevelNum) {\n children = -1;\n }\n\n if (children > -1) {\n for (measureIdx = 0; measureIdx < measuresLength; measureIdx++) {\n index = children + measureIdx;\n if (!current.children) {\n index += firstEmpty;\n }\n\n result[children + firstEmpty + measureIdx] = {\n children: children,\n index: dataIdx,\n measure: measures[measureIdx],\n tuple: axisInfoMember.tuple\n };\n dataIdx += 1;\n }\n\n while (result[firstEmpty] !== undefined$1) {\n firstEmpty += 1;\n }\n }\n\n if (firstEmpty === total) {\n break;\n }\n\n dataIdx += skipChildren;\n }\n\n return result;\n },\n\n _buildRows: function() {\n var rowIndexes = this.rowIndexes;\n var length = rowIndexes.length;\n var idx = 0;\n\n for (; idx < length; idx++) {\n var rowIndex = rowIndexes[idx];\n if (rowIndex) {\n this.rows.push(this._buildRow(rowIndex));\n }\n }\n },\n\n _buildRow: function(rowInfo) {\n var startIdx = rowInfo.index * this.rowLength;\n var columnIndexes = this.columnIndexes;\n var length = columnIndexes.length;\n var columnInfo;\n var cells = [];\n var idx = 0;\n\n var templateInfo;\n var cell, cellContent;\n var attr, dataItem, measure;\n\n for (; idx < length; idx++) {\n columnInfo = columnIndexes[idx];\n\n if (columnInfo === undefined$1) {\n continue;\n }\n\n attr = { className: tableStyles.tableCell };\n if (columnInfo.children) {\n attr.className += \" k-alt\";\n }\n\n cellContent = \"\";\n dataItem = this.data[startIdx + columnInfo.index];\n measure = columnInfo.measure || rowInfo.measure;\n\n templateInfo = {\n columnTuple: columnInfo.tuple,\n rowTuple: rowInfo.tuple,\n measure: measure,\n dataItem: dataItem\n };\n\n if (dataItem.value !== \"\" && measure && measure.type) {\n if (measure.type === \"status\") {\n cellContent = this.kpiStatusTemplate(templateInfo);\n } else if (measure.type === \"trend\") {\n cellContent = this.kpiTrendTemplate(templateInfo);\n }\n }\n\n if (!cellContent) {\n cellContent = this.dataTemplate(templateInfo);\n }\n\n cell = element(\"td\", attr, [ htmlNode(cellContent) ]);\n cell.value = dataItem.value;\n cells.push(cell);\n }\n\n attr = { className: tableStyles.tableRow };\n if (rowInfo.children) {\n attr.className += \" k-grid-footer\";\n }\n\n return element(\"tr\", attr, cells);\n }\n });\n\n ui.plugin(PivotGrid);\n\n kendo.PivotExcelExporter = kendo.Class.extend({\n init: function(options) {\n this.options = options;\n\n this.widget = options.widget;\n this.dataSource = this.widget.dataSource;\n },\n\n _columns: function() {\n var columnHeaderTable = this.widget.columnsHeaderTree.children[0];\n var rowHeaderTable = this.widget.rowsHeaderTree.children[0];\n\n var columnHeaderLength = columnHeaderTable.children[0].children.length;\n var rowHeaderLength = rowHeaderTable.children[0].children.length;\n\n var width = this.widget.options.columnWidth;\n var result = [];\n var idx;\n\n if (rowHeaderLength && this.dataSource.data()[0]) {\n for (idx = 0; idx < rowHeaderLength; idx++) {\n result.push({\n autoWidth: true\n });\n }\n }\n\n for (idx = 0; idx < columnHeaderLength; idx++) {\n result.push({\n autoWidth: false,\n width: width\n });\n }\n\n return result;\n },\n\n _cells: function(rows, type, callback) {\n var result = [];\n\n var i = 0;\n var length = rows.length;\n\n var cellsLength;\n var row, cells;\n var j, cell;\n\n for (; i < length; i++) {\n row = [];\n cells = rows[i].children;\n cellsLength = cells.length;\n\n for (j = 0; j < cellsLength; j++) {\n cell = cells[j];\n\n row.push({\n background: \"#7a7a7a\",\n color: \"#fff\",\n value: cell.value,\n colSpan: cell.attr.colSpan || 1,\n rowSpan: cell.attr.rowSpan || 1\n });\n }\n\n if (callback) {\n callback(row, i);\n }\n\n result.push({\n cells: row,\n type: type\n });\n }\n\n return result;\n },\n\n _rows: function() {\n var columnHeaderTable = this.widget.columnsHeaderTree.children[0];\n var rowHeaderTable = this.widget.rowsHeaderTree.children[0];\n\n var columnHeaderLength = columnHeaderTable.children[0].children.length;\n var rowHeaderLength = rowHeaderTable.children[0].children.length;\n\n var columnHeaderRows = columnHeaderTable.children[1].children;\n var rowHeaderRows = rowHeaderTable.children[1].children;\n var contentRows = this.widget.contentTree.children[0].children[1].children;\n\n var columnRows = this._cells(columnHeaderRows, \"header\");\n\n if (rowHeaderLength) {\n columnRows[0].cells.splice(0, 0, {\n background: \"#7a7a7a\",\n color: \"#fff\",\n value: \"\",\n colSpan: rowHeaderLength,\n rowSpan: columnHeaderRows.length\n });\n }\n\n var dataCallback = function(row, index) {\n var j = 0;\n var cell, value;\n var cells = contentRows[index].children;\n\n for (; j < columnHeaderLength; j++) {\n cell = cells[j];\n value = Number(cell.value);\n\n if (isNaN(value)) {\n value = cell.value;\n }\n\n row.push({\n background: \"#dfdfdf\",\n color: \"#333\",\n value: value,\n colSpan: 1,\n rowSpan: 1\n });\n }\n };\n\n var rowRows = this._cells(rowHeaderRows, \"data\", dataCallback);\n\n return columnRows.concat(rowRows);\n },\n\n _freezePane: function() {\n var columnHeaderTable = this.widget.columnsHeaderTree.children[0];\n var rowHeaderTable = this.widget.rowsHeaderTree.children[0];\n\n var rowHeaderLength = rowHeaderTable.children[0].children.length;\n var columnHeaderRows = columnHeaderTable.children[1].children;\n\n return {\n colSplit: rowHeaderLength,\n rowSplit: columnHeaderRows.length\n };\n },\n\n workbook: function() {\n var promise,\n resolveFn = function() {\n return {\n sheets: [ {\n columns: this._columns(),\n rows: this._rows(),\n freezePane: this._freezePane(),\n filter: null\n } ]\n };\n };\n\n if (this.dataSource.view()[0]) {\n promise = $.Deferred();\n promise.resolve();\n } else {\n promise = this.dataSource.fetch();\n }\n\n return promise.then(resolveFn.bind(this));\n }\n });\n\n var PivotExcelMixin = {\n extend: function(proto) {\n proto.events.push(\"excelExport\");\n proto.options.excel = $.extend(proto.options.excel, this.options);\n proto.saveAsExcel = this.saveAsExcel;\n },\n options: {\n proxyURL: \"\",\n filterable: false,\n fileName: \"Export.xlsx\"\n },\n saveAsExcel: function() {\n var excel = this.options.excel || {};\n\n var exporter = new kendo.PivotExcelExporter({\n widget: this\n });\n\n var resolveFn = function(book) {\n if (!this.trigger(\"excelExport\", { workbook: book })) {\n var workbook = new kendo.ooxml.Workbook(book);\n\n workbook.toDataURLAsync().then(function(dataURI) {\n kendo.saveAs({\n dataURI: dataURI,\n fileName: book.fileName || excel.fileName,\n proxyURL: excel.proxyURL,\n forceProxy: excel.forceProxy\n });\n });\n }\n };\n\n exporter.workbook().then(resolveFn.bind(this));\n }\n };\n\n kendo.PivotExcelMixin = PivotExcelMixin;\n\n if (kendo.ooxml && kendo.ooxml.Workbook) {\n PivotExcelMixin.extend(PivotGrid.prototype);\n }\n\n if (kendo.PDFMixin) {\n kendo.PDFMixin.extend(PivotGrid.prototype);\n\n PivotGrid.fn._drawPDF = function() {\n return this._drawPDFShadow({\n width: this.wrapper.width()\n }, {\n avoidLinks: this.options.pdf.avoidLinks\n });\n };\n }\n\n if (kendo.PDFMixin) {\n kendo.PDFMixin.extend(PivotGridV2.prototype);\n\n PivotGridV2.fn._drawPDF = function() {\n return this._drawPDFShadow({\n width: this.wrapper.width()\n }, {\n avoidLinks: this.options.pdf.avoidLinks\n });\n };\n }\n\n })(window.kendo.jQuery);\n var kendo$1 = kendo;\n\n return kendo$1;\n\n}));\n"]}