{"version":3,"sources":["../node_modules/utf8/utf8.js","../node_modules/base64-js/index.js","../node_modules/ieee754/index.js","../node_modules/isarray/index.js","../node_modules/buffer/index.js","../node_modules/iobuffer/IOBuffer.js","../node_modules/netcdfjs/src/utils.js","../node_modules/netcdfjs/src/types.js","../node_modules/netcdfjs/src/data.js","../node_modules/netcdfjs/src/header.js","../node_modules/netcdfjs/src/index.js","../node_modules/deepmerge/dist/es.js","../node_modules/moment/moment.js","../node_modules/chrono-node/src/result.js","../node_modules/chrono-node/src/parsers/EN/ENISOFormatParser.js","../node_modules/chrono-node/src/utils/EN.js","../node_modules/chrono-node/src/parsers/EN/ENDeadlineFormatParser.js","../node_modules/chrono-node/src/parsers/EN/ENRelativeDateFormatParser.js","../node_modules/chrono-node/src/parsers/EN/ENMonthNameLittleEndianParser.js","../node_modules/chrono-node/src/parsers/EN/ENMonthNameMiddleEndianParser.js","../node_modules/chrono-node/src/parsers/EN/ENMonthNameParser.js","../node_modules/chrono-node/src/parsers/EN/ENSlashDateFormatParser.js","../node_modules/chrono-node/src/parsers/EN/ENSlashDateFormatStartWithYearParser.js","../node_modules/chrono-node/src/parsers/EN/ENSlashMonthFormatParser.js","../node_modules/chrono-node/src/parsers/EN/ENTimeAgoFormatParser.js","../node_modules/chrono-node/src/parsers/EN/ENTimeExpressionParser.js","../node_modules/chrono-node/src/parsers/EN/ENTimeFromNowFormatParser.js","../node_modules/chrono-node/src/parsers/EN/ENWeekdayParser.js","../node_modules/chrono-node/src/parsers/EN/ENCasualDateParser.js","../node_modules/chrono-node/src/parsers/EN/ENCasualTimeParser.js","../node_modules/chrono-node/src/utils/JP.js","../node_modules/chrono-node/src/parsers/JP/JPStandardParser.js","../node_modules/chrono-node/src/parsers/JP/JPCasualDateParser.js","../node_modules/chrono-node/src/parsers/ES/ESCasualDateParser.js","../node_modules/chrono-node/src/parsers/ES/ESDeadlineFormatParser.js","../node_modules/chrono-node/src/parsers/ES/ESTimeAgoFormatParser.js","../node_modules/chrono-node/src/parsers/ES/ESTimeExpressionParser.js","../node_modules/chrono-node/src/parsers/ES/ESWeekdayParser.js","../node_modules/chrono-node/src/utils/ES.js","../node_modules/chrono-node/src/parsers/ES/ESMonthNameLittleEndianParser.js","../node_modules/chrono-node/src/parsers/ES/ESSlashDateFormatParser.js","../node_modules/chrono-node/src/parsers/FR/FRCasualDateParser.js","../node_modules/chrono-node/src/utils/FR.js","../node_modules/chrono-node/src/parsers/FR/FRDeadlineFormatParser.js","../node_modules/chrono-node/src/parsers/FR/FRMonthNameLittleEndianParser.js","../node_modules/chrono-node/src/parsers/FR/FRSlashDateFormatParser.js","../node_modules/chrono-node/src/parsers/FR/FRTimeAgoFormatParser.js","../node_modules/chrono-node/src/parsers/FR/FRTimeExpressionParser.js","../node_modules/chrono-node/src/parsers/FR/FRWeekdayParser.js","../node_modules/moment/locale/fr.js","../node_modules/chrono-node/src/parsers/FR/FRRelativeDateFormatParser.js","../node_modules/chrono-node/src/utils/ZH-Hant.js","../node_modules/chrono-node/src/parsers/ZH-Hant/ZHHantDateParser.js","../node_modules/chrono-node/src/parsers/ZH-Hant/ZHHantWeekdayParser.js","../node_modules/chrono-node/src/parsers/ZH-Hant/ZHHantTimeExpressionParser.js","../node_modules/chrono-node/src/parsers/ZH-Hant/ZHHantCasualDateParser.js","../node_modules/chrono-node/src/parsers/ZH-Hant/ZHHantDeadlineFormatParser.js","../node_modules/chrono-node/src/utils/DE.js","../node_modules/chrono-node/src/parsers/DE/DEDeadlineFormatParser.js","../node_modules/chrono-node/src/parsers/DE/DEMonthNameLittleEndianParser.js","../node_modules/chrono-node/src/parsers/DE/DEMonthNameParser.js","../node_modules/chrono-node/src/parsers/DE/DESlashDateFormatParser.js","../node_modules/chrono-node/src/parsers/DE/DETimeAgoFormatParser.js","../node_modules/chrono-node/src/parsers/DE/DETimeExpressionParser.js","../node_modules/chrono-node/src/parsers/DE/DEWeekdayParser.js","../node_modules/chrono-node/src/parsers/DE/DECasualDateParser.js","../node_modules/chrono-node/src/parsers/parser.js","../node_modules/chrono-node/src/refiners/OverlapRemovalRefiner.js","../node_modules/chrono-node/src/refiners/ExtractTimezoneOffsetRefiner.js","../node_modules/chrono-node/src/refiners/ExtractTimezoneAbbrRefiner.js","../node_modules/chrono-node/src/refiners/ForwardDateRefiner.js","../node_modules/chrono-node/src/refiners/UnlikelyFormatFilter.js","../node_modules/chrono-node/src/refiners/EN/ENMergeDateTimeRefiner.js","../node_modules/chrono-node/src/refiners/EN/ENMergeDateRangeRefiner.js","../node_modules/chrono-node/src/refiners/EN/ENPrioritizeSpecificDateRefiner.js","../node_modules/chrono-node/src/refiners/JP/JPMergeDateRangeRefiner.js","../node_modules/chrono-node/src/refiners/FR/FRMergeDateRangeRefiner.js","../node_modules/chrono-node/src/refiners/FR/FRMergeDateTimeRefiner.js","../node_modules/chrono-node/src/refiners/DE/DEMergeDateRangeRefiner.js","../node_modules/chrono-node/src/refiners/DE/DEMergeDateTimeRefiner.js","../node_modules/chrono-node/src/refiners/refiner.js","../node_modules/chrono-node/src/options.js","../node_modules/chrono-node/src/chrono.js","../node_modules/events/events.js","../node_modules/inherits/inherits_browser.js","../node_modules/process/browser.js","../node_modules/process-nextick-args/index.js","../node_modules/readable-stream/lib/internal/streams/stream.js","../node_modules/safe-buffer/index.js","../node_modules/core-util-is/lib/util.js","../node_modules/readable-stream/lib/internal/streams/BufferList.js","../node_modules/readable-stream/lib/internal/streams/destroy.js","../node_modules/util-deprecate/browser.js","../node_modules/readable-stream/lib/_stream_writable.js","../node_modules/readable-stream/lib/_stream_duplex.js","../node_modules/string_decoder/lib/string_decoder.js","../node_modules/readable-stream/lib/_stream_readable.js","../node_modules/readable-stream/lib/_stream_transform.js","../node_modules/readable-stream/lib/_stream_passthrough.js","../node_modules/readable-stream/readable-browser.js","../node_modules/readable-stream/writable-browser.js","../node_modules/readable-stream/duplex-browser.js","../node_modules/readable-stream/transform.js","../node_modules/readable-stream/passthrough.js","../node_modules/stream-browserify/index.js","../node_modules/papaparse/papaparse.js","../node_modules/node-fetch/browser.js","erddap.js"],"names":["deepmerge_1","isMergeableObject","value","isNonNullObject","isSpecial","stringValue","Object","prototype","toString","call","isReactElement","canUseSymbol","Symbol","for","REACT_ELEMENT_TYPE","$$typeof","emptyTarget","val","Array","isArray","cloneUnlessOtherwiseSpecified","options","clone","deepmerge","defaultArrayMerge","target","source","concat","map","element","mergeObject","destination","keys","forEach","key","arrayMerge","sourceIsArray","all","array","Error","reduce","prev","next","EventEmitter","_events","_maxListeners","undefined","isFunction","arg","isNumber","isObject","isUndefined","module","exports","defaultMaxListeners","setMaxListeners","n","isNaN","TypeError","emit","type","er","handler","len","args","i","listeners","error","length","arguments","err","context","slice","apply","addListener","listener","m","newListener","push","warned","console","trace","on","once","fired","g","removeListener","list","position","splice","removeAllListeners","ret","listenerCount","evlistener","emitter","cachedSetTimeout","cachedClearTimeout","process","defaultSetTimout","defaultClearTimeout","runTimeout","fun","setTimeout","e","runClearTimeout","marker","clearTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","run","Item","noop","nextTick","title","browser","env","argv","version","versions","off","prependListener","prependOnceListener","name","binding","cwd","chdir","dir","umask","self","fetch","default","bind","Headers","Request","Response","NetCDFReader","require","merge","chrono","moment","Papa","TIME_CLOSEST_PLACEHOLDER","time_encoder","istabledap","Date","toISOString2","parseDate","isValid","toDate","log","pad","number","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","parse_floats","parts","err_msg","expected_length","results","p","parseFloat","parse_point","split","lat","lon","parse_bbox","min","max","griddap_url","dataset","wanted","extents","extension","data_wanted","dimensions","field","j","stride","param_encoder","constraint","accepts","constrained_value","obj","local_accepts","point","lon_dimension","lat_dimension","bbox","geospatial_lon_min","Math","geospatial_lon_max","geospatial_lat_min","geospatial_lat_max","time_dimension","when","erddap_params","constraints","param","dimension","join","url","base_url","id","startsWith","tabledap_url","argstr","eq","component","encodeURIComponent","Erddap","_datasets","search","query","search_url","then","response","ok","text","csv","parse","header","data","Dataset","erddap","dataset_id","_dimensions","_summary","_fetchMetadata","summary","json","table","rows","row","info","_fieldnames","x","dimvar","etype","evalue","v","attribute","axisType","_meta","fetchMetadata","fetchExtents","_fetchExtents","metadata","NC_GLOBAL","generateUrl","DatasetDelegate","_generateUrl","variables","urlfn","tabledap","indexOf","_resolve_griddap_time_closest","fetchLocationDimensions","useCached","_locationDimensions","arrayBuffer","buffer","reader","lats","getDataVariable","lons","fetchTimeDimension","_timeDimension","time_url","times","filter","t","now","closest","time","re","RegExp","replace","fetchJSON","constrain","_designate","_constraints","JSON","stringify","_variables","_constrain","constructor","String","delegate","lines","vars","line","trim","a","o","vectors","ux","uy","Vectors","grid","default_time","flatten","params","nullx","missing_value","nully","xvel","yvel","fetchGrib2","atime","alat","alon","itime","date","setTime","u","ilat","unshift","dx","abs","lo1","lo2","nx","dy","la1","la2","ny"],"mappings":";;;AAoPA,IAAA,EAAA,EAAA,UAAA,IAnPA,SAAA,GAGA,IAAA,EAAA,iBAAA,SAAA,QAGA,EAAA,iBAAA,QAAA,QACA,OAAA,SAAA,GAAA,OAIA,EAAA,iBAAA,GAAA,EACA,EAAA,SAAA,GAAA,EAAA,SAAA,IACA,EAAA,GAKA,IAiLA,EACA,EACA,EAnLA,EAAA,OAAA,aAGA,SAAA,EAAA,GAMA,IALA,IAGA,EACA,EAJA,EAAA,GACA,EAAA,EACA,EAAA,EAAA,OAGA,EAAA,IACA,EAAA,EAAA,WAAA,OACA,OAAA,GAAA,OAAA,EAAA,EAGA,QAAA,OADA,EAAA,EAAA,WAAA,OAEA,EAAA,OAAA,KAAA,IAAA,KAAA,KAAA,GAAA,QAIA,EAAA,KAAA,GACA,KAGA,EAAA,KAAA,GAGA,OAAA,EAqBA,SAAA,EAAA,GACA,GAAA,GAAA,OAAA,GAAA,MACA,MAAA,MACA,oBAAA,EAAA,SAAA,IAAA,cACA,0BAMA,SAAA,EAAA,EAAA,GACA,OAAA,EAAA,GAAA,EAAA,GAAA,KAGA,SAAA,EAAA,GACA,GAAA,IAAA,WAAA,GACA,OAAA,EAAA,GAEA,IAAA,EAAA,GAeA,OAdA,IAAA,WAAA,GACA,EAAA,EAAA,GAAA,EAAA,GAAA,KAEA,IAAA,WAAA,IACA,EAAA,GACA,EAAA,EAAA,GAAA,GAAA,GAAA,KACA,GAAA,EAAA,EAAA,IAEA,IAAA,WAAA,KACA,EAAA,EAAA,GAAA,GAAA,EAAA,KACA,GAAA,EAAA,EAAA,IACA,GAAA,EAAA,EAAA,IAEA,GAAA,EAAA,GAAA,EAAA,KAmBA,SAAA,IACA,GAAA,GAAA,EACA,MAAA,MAAA,sBAGA,IAAA,EAAA,IAAA,EAAA,GAGA,GAFA,IAEA,MAAA,IAAA,GACA,OAAA,GAAA,EAIA,MAAA,MAAA,6BAGA,SAAA,IACA,IAAA,EAIA,EAEA,GAAA,EAAA,EACA,MAAA,MAAA,sBAGA,GAAA,GAAA,EACA,OAAA,EAQA,GAJA,EAAA,IAAA,EAAA,GACA,IAGA,IAAA,IAAA,GACA,OAAA,EAIA,GAAA,MAAA,IAAA,GAAA,CAGA,IADA,GAAA,GAAA,IAAA,EADA,MAEA,IACA,OAAA,EAEA,MAAA,MAAA,6BAKA,GAAA,MAAA,IAAA,GAAA,CAIA,IADA,GAAA,GAAA,IAAA,GAFA,KAEA,EADA,MAEA,KAEA,OADA,EAAA,GACA,EAEA,MAAA,MAAA,6BAKA,GAAA,MAAA,IAAA,KAIA,GAAA,EAAA,IAAA,GAHA,KAGA,GAFA,KAGA,EAFA,MAGA,OAAA,GAAA,QACA,OAAA,EAIA,MAAA,MAAA,0BAoBA,IAAA,EAAA,CACA,QAAA,QACA,OAjHA,SAAA,GAMA,IALA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,OACA,GAAA,EAEA,EAAA,KACA,EAAA,GAEA,GAAA,EADA,EAAA,IAGA,OAAA,GAwGA,OAjBA,SAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,OACA,EAAA,EAGA,IAFA,IACA,EADA,EAAA,IAEA,KAAA,EAAA,MACA,EAAA,KAAA,GAEA,OA/JA,SAAA,GAKA,IAJA,IAEA,EAFA,EAAA,EAAA,OACA,GAAA,EAEA,EAAA,KACA,EAAA,IACA,EAAA,EAAA,IACA,QAEA,GAAA,GADA,GAAA,SACA,GAAA,KAAA,OACA,EAAA,MAAA,KAAA,GAEA,GAAA,EAAA,GAEA,OAAA,EAiJA,CAAA,KAaA,GACA,mBAAA,GACA,iBAAA,EAAA,KACA,EAAA,IAEA,EAAA,WACA,OAAA,SAEA,GAAA,IAAA,EAAA,SACA,GAAA,EACA,EAAA,QAAA,MACA,CACA,IACA,EADA,GACA,eACA,IAAA,IAAA,KAAA,EACA,EAAA,KAAA,EAAA,KAAA,EAAA,GAAA,EAAA,SAIA,EAAA,KAAA,EA/OA,CAkPA;;ACnPA,aAEA,QAAA,WAAA,EACA,QAAA,YAAA,EACA,QAAA,cAAA,EAOA,IALA,IAAA,EAAA,GACA,EAAA,GACA,EAAA,oBAAA,WAAA,WAAA,MAEA,EAAA,mEACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EACA,EAAA,GAAA,EAAA,GACA,EAAA,EAAA,WAAA,IAAA,EAQA,SAAA,EAAA,GACA,IAAA,EAAA,EAAA,OAEA,GAAA,EAAA,EAAA,EACA,MAAA,IAAA,MAAA,kDAKA,IAAA,EAAA,EAAA,QAAA,KAOA,OANA,IAAA,IAAA,EAAA,GAMA,CAAA,EAJA,IAAA,EACA,EACA,EAAA,EAAA,GAMA,SAAA,EAAA,GACA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,OAAA,GAAA,EAAA,GAAA,EAAA,EAGA,SAAA,EAAA,EAAA,EAAA,GACA,OAAA,GAAA,EAAA,GAAA,EAAA,EAGA,SAAA,EAAA,GAeA,IAdA,IAAA,EACA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GAEA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,IAEA,EAAA,EAGA,EAAA,EAAA,EACA,EAAA,EACA,EAEA,EAAA,EAAA,EAAA,EAAA,GAAA,EACA,EACA,EAAA,EAAA,WAAA,KAAA,GACA,EAAA,EAAA,WAAA,EAAA,KAAA,GACA,EAAA,EAAA,WAAA,EAAA,KAAA,EACA,EAAA,EAAA,WAAA,EAAA,IACA,EAAA,KAAA,GAAA,GAAA,IACA,EAAA,KAAA,GAAA,EAAA,IACA,EAAA,KAAA,IAAA,EAmBA,OAhBA,IAAA,IACA,EACA,EAAA,EAAA,WAAA,KAAA,EACA,EAAA,EAAA,WAAA,EAAA,KAAA,EACA,EAAA,KAAA,IAAA,GAGA,IAAA,IACA,EACA,EAAA,EAAA,WAAA,KAAA,GACA,EAAA,EAAA,WAAA,EAAA,KAAA,EACA,EAAA,EAAA,WAAA,EAAA,KAAA,EACA,EAAA,KAAA,GAAA,EAAA,IACA,EAAA,KAAA,IAAA,GAGA,EAGA,SAAA,EAAA,GACA,OAAA,EAAA,GAAA,GAAA,IACA,EAAA,GAAA,GAAA,IACA,EAAA,GAAA,EAAA,IACA,EAAA,GAAA,GAGA,SAAA,EAAA,EAAA,EAAA,GAGA,IAFA,IAAA,EACA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,GAAA,EACA,GACA,EAAA,IAAA,GAAA,WACA,EAAA,EAAA,IAAA,EAAA,QACA,IAAA,EAAA,EAAA,IACA,EAAA,KAAA,EAAA,IAEA,OAAA,EAAA,KAAA,IAGA,SAAA,EAAA,GAQA,IAPA,IAAA,EACA,EAAA,EAAA,OACA,EAAA,EAAA,EACA,EAAA,GAIA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAHA,MAIA,EAAA,KAAA,EACA,EAAA,EAAA,EALA,MAKA,EAAA,EAAA,EALA,QA2BA,OAjBA,IAAA,GACA,EAAA,EAAA,EAAA,GACA,EAAA,KACA,EAAA,GAAA,GACA,EAAA,GAAA,EAAA,IACA,OAEA,IAAA,IACA,GAAA,EAAA,EAAA,IAAA,GAAA,EAAA,EAAA,GACA,EAAA,KACA,EAAA,GAAA,IACA,EAAA,GAAA,EAAA,IACA,EAAA,GAAA,EAAA,IACA,MAIA,EAAA,KAAA,IAnIA,EAAA,IAAA,WAAA,IAAA,GACA,EAAA,IAAA,WAAA,IAAA;;ACnBA,QAAA,KAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,EACA,GAAA,GAAA,GAAA,EACA,EAAA,GAAA,EACA,GAAA,EACA,EAAA,EAAA,EAAA,EAAA,EACA,EAAA,GAAA,EAAA,EACA,EAAA,EAAA,EAAA,GAOA,IALA,GAAA,EAEA,EAAA,GAAA,IAAA,GAAA,EACA,KAAA,EACA,GAAA,EACA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,EAAA,GAAA,GAAA,EAAA,GAAA,GAKA,IAHA,EAAA,GAAA,IAAA,GAAA,EACA,KAAA,EACA,GAAA,EACA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,EAAA,GAAA,GAAA,EAAA,GAAA,GAEA,GAAA,IAAA,EACA,EAAA,EAAA,MACA,CAAA,GAAA,IAAA,EACA,OAAA,EAAA,IAAA,EAAA,GAAA,GAAA,EAAA,GAEA,GAAA,KAAA,IAAA,EAAA,GACA,GAAA,EAEA,OAAA,GAAA,EAAA,GAAA,EAAA,KAAA,IAAA,EAAA,EAAA,IAGA,QAAA,MAAA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,EACA,GAAA,GAAA,GAAA,EACA,EAAA,GAAA,EACA,EAAA,KAAA,EAAA,KAAA,IAAA,GAAA,IAAA,KAAA,IAAA,GAAA,IAAA,EACA,EAAA,EAAA,EAAA,EAAA,EACA,EAAA,EAAA,GAAA,EACA,EAAA,EAAA,GAAA,IAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAmCA,IAjCA,EAAA,KAAA,IAAA,GAEA,MAAA,IAAA,IAAA,EAAA,GACA,EAAA,MAAA,GAAA,EAAA,EACA,EAAA,IAEA,EAAA,KAAA,MAAA,KAAA,IAAA,GAAA,KAAA,KACA,GAAA,EAAA,KAAA,IAAA,GAAA,IAAA,IACA,IACA,GAAA,IAGA,GADA,EAAA,GAAA,EACA,EAAA,EAEA,EAAA,KAAA,IAAA,EAAA,EAAA,IAEA,GAAA,IACA,IACA,GAAA,GAGA,EAAA,GAAA,GACA,EAAA,EACA,EAAA,GACA,EAAA,GAAA,GACA,GAAA,EAAA,EAAA,GAAA,KAAA,IAAA,EAAA,GACA,GAAA,IAEA,EAAA,EAAA,KAAA,IAAA,EAAA,EAAA,GAAA,KAAA,IAAA,EAAA,GACA,EAAA,IAIA,GAAA,EAAA,EAAA,EAAA,GAAA,IAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,GAIA,IAFA,EAAA,GAAA,EAAA,EACA,GAAA,EACA,EAAA,EAAA,EAAA,EAAA,GAAA,IAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,GAEA,EAAA,EAAA,EAAA,IAAA,IAAA;;AClFA,IAAA,EAAA,GAAA,SAEA,OAAA,QAAA,MAAA,SAAA,SAAA,GACA,MAAA,kBAAA,EAAA,KAAA;;;;AC0vDA,IAAA,EAAA,UAAA,GAnvDA,EAAA,QAAA,aACA,EAAA,QAAA,WACA,EAAA,QAAA,WAuCA,SAAA,IACA,IACA,IAAA,EAAA,IAAA,WAAA,GAEA,OADA,EAAA,UAAA,CAAA,UAAA,WAAA,UAAA,IAAA,WAAA,OAAA,KACA,KAAA,EAAA,OACA,mBAAA,EAAA,UACA,IAAA,EAAA,SAAA,EAAA,GAAA,WACA,MAAA,GACA,OAAA,GAIA,SAAA,IACA,OAAA,EAAA,oBACA,WACA,WAGA,SAAA,EAAA,EAAA,GACA,GAAA,IAAA,EACA,MAAA,IAAA,WAAA,8BAcA,OAZA,EAAA,qBAEA,EAAA,IAAA,WAAA,IACA,UAAA,EAAA,WAGA,OAAA,IACA,EAAA,IAAA,EAAA,IAEA,EAAA,OAAA,GAGA,EAaA,SAAA,EAAA,EAAA,EAAA,GACA,KAAA,EAAA,qBAAA,gBAAA,GACA,OAAA,IAAA,EAAA,EAAA,EAAA,GAIA,GAAA,iBAAA,EAAA,CACA,GAAA,iBAAA,EACA,MAAA,IAAA,MACA,qEAGA,OAAA,EAAA,KAAA,GAEA,OAAA,EAAA,KAAA,EAAA,EAAA,GAWA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,GAAA,iBAAA,EACA,MAAA,IAAA,UAAA,yCAGA,MAAA,oBAAA,aAAA,aAAA,YACA,EAAA,EAAA,EAAA,EAAA,GAGA,iBAAA,EACA,EAAA,EAAA,EAAA,GAGA,EAAA,EAAA,GA4BA,SAAA,EAAA,GACA,GAAA,iBAAA,EACA,MAAA,IAAA,UAAA,oCACA,GAAA,EAAA,EACA,MAAA,IAAA,WAAA,wCAIA,SAAA,EAAA,EAAA,EAAA,EAAA,GAEA,OADA,EAAA,GACA,GAAA,EACA,EAAA,EAAA,QAEA,IAAA,EAIA,iBAAA,EACA,EAAA,EAAA,GAAA,KAAA,EAAA,GACA,EAAA,EAAA,GAAA,KAAA,GAEA,EAAA,EAAA,GAWA,SAAA,EAAA,EAAA,GAGA,GAFA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,KACA,EAAA,oBACA,IAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EACA,EAAA,GAAA,EAGA,OAAA,EAgBA,SAAA,EAAA,EAAA,EAAA,GAKA,GAJA,iBAAA,GAAA,KAAA,IACA,EAAA,SAGA,EAAA,WAAA,GACA,MAAA,IAAA,UAAA,8CAGA,IAAA,EAAA,EAAA,EAAA,EAAA,GAGA,GAFA,EAAA,EAAA,EAAA,IAEA,MAAA,EAAA,GASA,OAPA,IAAA,IAIA,EAAA,EAAA,MAAA,EAAA,IAGA,EAGA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QACA,EAAA,EAAA,EAAA,GACA,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,GAAA,EACA,EAAA,GAAA,IAAA,EAAA,GAEA,OAAA,EAGA,SAAA,EAAA,EAAA,EAAA,EAAA,GAGA,GAFA,EAAA,WAEA,EAAA,GAAA,EAAA,WAAA,EACA,MAAA,IAAA,WAAA,6BAGA,GAAA,EAAA,WAAA,GAAA,GAAA,GACA,MAAA,IAAA,WAAA,6BAmBA,OAfA,OADA,IAAA,QAAA,IAAA,EACA,IAAA,WAAA,QACA,IAAA,EACA,IAAA,WAAA,EAAA,GAEA,IAAA,WAAA,EAAA,EAAA,GAGA,EAAA,qBAEA,EAAA,GACA,UAAA,EAAA,UAGA,EAAA,EAAA,EAAA,GAEA,EAGA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,SAAA,GAAA,CACA,IAAA,EAAA,EAAA,EAAA,EAAA,QAGA,OAAA,KAFA,EAAA,EAAA,EAAA,IAEA,OACA,GAGA,EAAA,KAAA,EAAA,EAAA,EAAA,GACA,GAGA,GAAA,EAAA,CACA,GAAA,oBAAA,aACA,EAAA,kBAAA,aAAA,WAAA,EACA,MAAA,iBAAA,EAAA,QAAA,EAAA,EAAA,QACA,EAAA,EAAA,GAEA,EAAA,EAAA,GAGA,GAAA,WAAA,EAAA,MAAA,EAAA,EAAA,MACA,OAAA,EAAA,EAAA,EAAA,MAIA,MAAA,IAAA,UAAA,sFAGA,SAAA,EAAA,GAGA,GAAA,GAAA,IACA,MAAA,IAAA,WAAA,0DACA,IAAA,SAAA,IAAA,UAEA,OAAA,EAAA,EAGA,SAAA,EAAA,GAIA,OAHA,GAAA,IACA,EAAA,GAEA,EAAA,OAAA,GA+EA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,SAAA,GACA,OAAA,EAAA,OAEA,GAAA,oBAAA,aAAA,mBAAA,YAAA,SACA,YAAA,OAAA,IAAA,aAAA,aACA,OAAA,EAAA,WAEA,iBAAA,IACA,EAAA,GAAA,GAGA,IAAA,EAAA,EAAA,OACA,GAAA,IAAA,EAAA,OAAA,EAIA,IADA,IAAA,GAAA,IAEA,OAAA,GACA,IAAA,QACA,IAAA,SACA,IAAA,SACA,OAAA,EACA,IAAA,OACA,IAAA,QACA,UAAA,EACA,OAAA,EAAA,GAAA,OACA,IAAA,OACA,IAAA,QACA,IAAA,UACA,IAAA,WACA,OAAA,EAAA,EACA,IAAA,MACA,OAAA,IAAA,EACA,IAAA,SACA,OAAA,EAAA,GAAA,OACA,QACA,GAAA,EAAA,OAAA,EAAA,GAAA,OACA,GAAA,GAAA,GAAA,cACA,GAAA,GAMA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,GAAA,EAcA,SALA,IAAA,GAAA,EAAA,KACA,EAAA,GAIA,EAAA,KAAA,OACA,MAAA,GAOA,SAJA,IAAA,GAAA,EAAA,KAAA,UACA,EAAA,KAAA,QAGA,GAAA,EACA,MAAA,GAOA,IAHA,KAAA,KACA,KAAA,GAGA,MAAA,GAKA,IAFA,IAAA,EAAA,UAGA,OAAA,GACA,IAAA,MACA,OAAA,EAAA,KAAA,EAAA,GAEA,IAAA,OACA,IAAA,QACA,OAAA,EAAA,KAAA,EAAA,GAEA,IAAA,QACA,OAAA,EAAA,KAAA,EAAA,GAEA,IAAA,SACA,IAAA,SACA,OAAA,EAAA,KAAA,EAAA,GAEA,IAAA,SACA,OAAA,EAAA,KAAA,EAAA,GAEA,IAAA,OACA,IAAA,QACA,IAAA,UACA,IAAA,WACA,OAAA,EAAA,KAAA,EAAA,GAEA,QACA,GAAA,EAAA,MAAA,IAAA,UAAA,qBAAA,GACA,GAAA,EAAA,IAAA,cACA,GAAA,GASA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,GACA,EAAA,GAAA,EAmIA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAEA,GAAA,IAAA,EAAA,OAAA,OAAA,EAmBA,GAhBA,iBAAA,GACA,EAAA,EACA,EAAA,GACA,EAAA,WACA,EAAA,WACA,GAAA,aACA,GAAA,YAEA,GAAA,EACA,MAAA,KAEA,EAAA,EAAA,EAAA,EAAA,OAAA,GAIA,EAAA,IAAA,EAAA,EAAA,OAAA,GACA,GAAA,EAAA,OAAA,CACA,GAAA,EAAA,OAAA,EACA,EAAA,EAAA,OAAA,OACA,GAAA,EAAA,EAAA,CACA,IAAA,EACA,OAAA,EADA,EAAA,EAUA,GALA,iBAAA,IACA,EAAA,EAAA,KAAA,EAAA,IAIA,EAAA,SAAA,GAEA,OAAA,IAAA,EAAA,QACA,EAEA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,GAAA,iBAAA,EAEA,OADA,GAAA,IACA,EAAA,qBACA,mBAAA,WAAA,UAAA,QACA,EACA,WAAA,UAAA,QAAA,KAAA,EAAA,EAAA,GAEA,WAAA,UAAA,YAAA,KAAA,EAAA,EAAA,GAGA,EAAA,EAAA,CAAA,GAAA,EAAA,EAAA,GAGA,MAAA,IAAA,UAAA,wCAGA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,IA0BA,EA1BA,EAAA,EACA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,QAAA,IAAA,IAEA,UADA,EAAA,OAAA,GAAA,gBACA,UAAA,GACA,YAAA,GAAA,aAAA,GAAA,CACA,GAAA,EAAA,OAAA,GAAA,EAAA,OAAA,EACA,OAAA,EAEA,EAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,EAIA,SAAA,EAAA,EAAA,GACA,OAAA,IAAA,EACA,EAAA,GAEA,EAAA,aAAA,EAAA,GAKA,GAAA,EAAA,CACA,IAAA,GAAA,EACA,IAAA,EAAA,EAAA,EAAA,EAAA,IACA,GAAA,EAAA,EAAA,KAAA,EAAA,GAAA,IAAA,EAAA,EAAA,EAAA,IAEA,IADA,IAAA,IAAA,EAAA,GACA,EAAA,EAAA,IAAA,EAAA,OAAA,EAAA,OAEA,IAAA,IAAA,GAAA,EAAA,GACA,GAAA,OAKA,IADA,EAAA,EAAA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,GAAA,EAAA,IAAA,CAEA,IADA,IAAA,GAAA,EACA,EAAA,EAAA,EAAA,EAAA,IACA,GAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,GAAA,CACA,GAAA,EACA,MAGA,GAAA,EAAA,OAAA,EAIA,OAAA,EAeA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,OAAA,IAAA,EACA,IAAA,EAAA,EAAA,OAAA,EACA,GAGA,EAAA,OAAA,IACA,IACA,EAAA,GAJA,EAAA,EASA,IAAA,EAAA,EAAA,OACA,GAAA,EAAA,GAAA,EAAA,MAAA,IAAA,UAAA,sBAEA,EAAA,EAAA,IACA,EAAA,EAAA,GAEA,IAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,CACA,IAAA,EAAA,SAAA,EAAA,OAAA,EAAA,EAAA,GAAA,IACA,GAAA,MAAA,GAAA,OAAA,EACA,EAAA,EAAA,GAAA,EAEA,OAAA,EAGA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,OAAA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,EAAA,GAGA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,OAAA,EAAA,EAAA,GAAA,EAAA,EAAA,GAGA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,OAAA,EAAA,EAAA,EAAA,EAAA,GAGA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,OAAA,EAAA,EAAA,GAAA,EAAA,EAAA,GAGA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,OAAA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,EAAA,GAkFA,SAAA,EAAA,EAAA,EAAA,GACA,OAAA,IAAA,GAAA,IAAA,EAAA,OACA,EAAA,cAAA,GAEA,EAAA,cAAA,EAAA,MAAA,EAAA,IAIA,SAAA,EAAA,EAAA,EAAA,GACA,EAAA,KAAA,IAAA,EAAA,OAAA,GAIA,IAHA,IAAA,EAAA,GAEA,EAAA,EACA,EAAA,GAAA,CACA,IAQA,EAAA,EAAA,EAAA,EARA,EAAA,EAAA,GACA,EAAA,KACA,EAAA,EAAA,IAAA,EACA,EAAA,IAAA,EACA,EAAA,IAAA,EACA,EAEA,GAAA,EAAA,GAAA,EAGA,OAAA,GACA,KAAA,EACA,EAAA,MACA,EAAA,GAEA,MACA,KAAA,EAEA,MAAA,KADA,EAAA,EAAA,EAAA,OAEA,GAAA,GAAA,IAAA,EAAA,GAAA,GACA,MACA,EAAA,GAGA,MACA,KAAA,EACA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,GACA,MAAA,IAAA,IAAA,MAAA,IAAA,KACA,GAAA,GAAA,IAAA,IAAA,GAAA,IAAA,EAAA,GAAA,GACA,OAAA,EAAA,OAAA,EAAA,SACA,EAAA,GAGA,MACA,KAAA,EACA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,GACA,MAAA,IAAA,IAAA,MAAA,IAAA,IAAA,MAAA,IAAA,KACA,GAAA,GAAA,IAAA,IAAA,GAAA,IAAA,IAAA,GAAA,IAAA,EAAA,GAAA,GACA,OAAA,EAAA,UACA,EAAA,GAMA,OAAA,GAGA,EAAA,MACA,EAAA,GACA,EAAA,QAEA,GAAA,MACA,EAAA,KAAA,IAAA,GAAA,KAAA,OACA,EAAA,MAAA,KAAA,GAGA,EAAA,KAAA,GACA,GAAA,EAGA,OAAA,EAAA,GA98BA,QAAA,OAAA,EACA,QAAA,WAAA,EACA,QAAA,kBAAA,GA0BA,EAAA,yBAAA,IAAA,EAAA,oBACA,EAAA,oBACA,IAKA,QAAA,WAAA,IAkEA,EAAA,SAAA,KAGA,EAAA,SAAA,SAAA,GAEA,OADA,EAAA,UAAA,EAAA,UACA,GA2BA,EAAA,KAAA,SAAA,EAAA,EAAA,GACA,OAAA,EAAA,KAAA,EAAA,EAAA,IAGA,EAAA,sBACA,EAAA,UAAA,UAAA,WAAA,UACA,EAAA,UAAA,WACA,oBAAA,QAAA,OAAA,SACA,EAAA,OAAA,WAAA,GAEA,OAAA,eAAA,EAAA,OAAA,QAAA,CACA,MAAA,KACA,cAAA,KAiCA,EAAA,MAAA,SAAA,EAAA,EAAA,GACA,OAAA,EAAA,KAAA,EAAA,EAAA,IAiBA,EAAA,YAAA,SAAA,GACA,OAAA,EAAA,KAAA,IAKA,EAAA,gBAAA,SAAA,GACA,OAAA,EAAA,KAAA,IAiHA,EAAA,SAAA,SAAA,GACA,QAAA,MAAA,IAAA,EAAA,YAGA,EAAA,QAAA,SAAA,EAAA,GACA,IAAA,EAAA,SAAA,KAAA,EAAA,SAAA,GACA,MAAA,IAAA,UAAA,6BAGA,GAAA,IAAA,EAAA,OAAA,EAKA,IAHA,IAAA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,EAAA,EAAA,KAAA,IAAA,EAAA,GAAA,EAAA,IAAA,EACA,GAAA,EAAA,KAAA,EAAA,GAAA,CACA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,MAIA,OAAA,EAAA,GAAA,EACA,EAAA,EAAA,EACA,GAGA,EAAA,WAAA,SAAA,GACA,OAAA,OAAA,GAAA,eACA,IAAA,MACA,IAAA,OACA,IAAA,QACA,IAAA,QACA,IAAA,SACA,IAAA,SACA,IAAA,SACA,IAAA,OACA,IAAA,QACA,IAAA,UACA,IAAA,WACA,OAAA,EACA,QACA,OAAA,IAIA,EAAA,OAAA,SAAA,EAAA,GACA,IAAA,EAAA,GACA,MAAA,IAAA,UAAA,+CAGA,GAAA,IAAA,EAAA,OACA,OAAA,EAAA,MAAA,GAGA,IAAA,EACA,QAAA,IAAA,EAEA,IADA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,SAAA,EACA,GAAA,EAAA,GAAA,OAIA,IAAA,EAAA,EAAA,YAAA,GACA,EAAA,EACA,IAAA,EAAA,EAAA,EAAA,EAAA,SAAA,EAAA,CACA,IAAA,EAAA,EAAA,GACA,IAAA,EAAA,SAAA,GACA,MAAA,IAAA,UAAA,+CAEA,EAAA,KAAA,EAAA,GACA,GAAA,EAAA,OAEA,OAAA,GA8CA,EAAA,WAAA,EA0EA,EAAA,UAAA,WAAA,EAQA,EAAA,UAAA,OAAA,WACA,IAAA,EAAA,KAAA,OACA,GAAA,EAAA,GAAA,EACA,MAAA,IAAA,WAAA,6CAEA,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,GAAA,EACA,EAAA,KAAA,EAAA,EAAA,GAEA,OAAA,MAGA,EAAA,UAAA,OAAA,WACA,IAAA,EAAA,KAAA,OACA,GAAA,EAAA,GAAA,EACA,MAAA,IAAA,WAAA,6CAEA,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,GAAA,EACA,EAAA,KAAA,EAAA,EAAA,GACA,EAAA,KAAA,EAAA,EAAA,EAAA,GAEA,OAAA,MAGA,EAAA,UAAA,OAAA,WACA,IAAA,EAAA,KAAA,OACA,GAAA,EAAA,GAAA,EACA,MAAA,IAAA,WAAA,6CAEA,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,GAAA,EACA,EAAA,KAAA,EAAA,EAAA,GACA,EAAA,KAAA,EAAA,EAAA,EAAA,GACA,EAAA,KAAA,EAAA,EAAA,EAAA,GACA,EAAA,KAAA,EAAA,EAAA,EAAA,GAEA,OAAA,MAGA,EAAA,UAAA,SAAA,WACA,IAAA,EAAA,EAAA,KAAA,OACA,OAAA,IAAA,EAAA,GACA,IAAA,UAAA,OAAA,EAAA,KAAA,EAAA,GACA,EAAA,MAAA,KAAA,YAGA,EAAA,UAAA,OAAA,SAAA,GACA,IAAA,EAAA,SAAA,GAAA,MAAA,IAAA,UAAA,6BACA,OAAA,OAAA,GACA,IAAA,EAAA,QAAA,KAAA,IAGA,EAAA,UAAA,QAAA,WACA,IAAA,EAAA,GACA,EAAA,QAAA,kBAKA,OAJA,KAAA,OAAA,IACA,EAAA,KAAA,SAAA,MAAA,EAAA,GAAA,MAAA,SAAA,KAAA,KACA,KAAA,OAAA,IAAA,GAAA,UAEA,WAAA,EAAA,KAGA,EAAA,UAAA,QAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,SAAA,GACA,MAAA,IAAA,UAAA,6BAgBA,QAbA,IAAA,IACA,EAAA,QAEA,IAAA,IACA,EAAA,EAAA,EAAA,OAAA,QAEA,IAAA,IACA,EAAA,QAEA,IAAA,IACA,EAAA,KAAA,QAGA,EAAA,GAAA,EAAA,EAAA,QAAA,EAAA,GAAA,EAAA,KAAA,OACA,MAAA,IAAA,WAAA,sBAGA,GAAA,GAAA,GAAA,GAAA,EACA,OAAA,EAEA,GAAA,GAAA,EACA,OAAA,EAEA,GAAA,GAAA,EACA,OAAA,EAQA,GAAA,OAAA,EAAA,OAAA,EASA,IAPA,IAAA,GAJA,KAAA,IADA,KAAA,GAMA,GAPA,KAAA,IADA,KAAA,GASA,EAAA,KAAA,IAAA,EAAA,GAEA,EAAA,KAAA,MAAA,EAAA,GACA,EAAA,EAAA,MAAA,EAAA,GAEA,EAAA,EAAA,EAAA,IAAA,EACA,GAAA,EAAA,KAAA,EAAA,GAAA,CACA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,MAIA,OAAA,EAAA,GAAA,EACA,EAAA,EAAA,EACA,GA6HA,EAAA,UAAA,SAAA,SAAA,EAAA,EAAA,GACA,OAAA,IAAA,KAAA,QAAA,EAAA,EAAA,IAGA,EAAA,UAAA,QAAA,SAAA,EAAA,EAAA,GACA,OAAA,EAAA,KAAA,EAAA,EAAA,GAAA,IAGA,EAAA,UAAA,YAAA,SAAA,EAAA,EAAA,GACA,OAAA,EAAA,KAAA,EAAA,EAAA,GAAA,IAkDA,EAAA,UAAA,MAAA,SAAA,EAAA,EAAA,EAAA,GAEA,QAAA,IAAA,EACA,EAAA,OACA,EAAA,KAAA,OACA,EAAA,OAEA,QAAA,IAAA,GAAA,iBAAA,EACA,EAAA,EACA,EAAA,KAAA,OACA,EAAA,MAEA,CAAA,IAAA,SAAA,GAWA,MAAA,IAAA,MACA,2EAXA,GAAA,EACA,SAAA,IACA,GAAA,OACA,IAAA,IAAA,EAAA,UAEA,EAAA,EACA,OAAA,GASA,IAAA,EAAA,KAAA,OAAA,EAGA,SAFA,IAAA,GAAA,EAAA,KAAA,EAAA,GAEA,EAAA,OAAA,IAAA,EAAA,GAAA,EAAA,IAAA,EAAA,KAAA,OACA,MAAA,IAAA,WAAA,0CAGA,IAAA,EAAA,QAGA,IADA,IAAA,GAAA,IAEA,OAAA,GACA,IAAA,MACA,OAAA,EAAA,KAAA,EAAA,EAAA,GAEA,IAAA,OACA,IAAA,QACA,OAAA,EAAA,KAAA,EAAA,EAAA,GAEA,IAAA,QACA,OAAA,EAAA,KAAA,EAAA,EAAA,GAEA,IAAA,SACA,IAAA,SACA,OAAA,EAAA,KAAA,EAAA,EAAA,GAEA,IAAA,SAEA,OAAA,EAAA,KAAA,EAAA,EAAA,GAEA,IAAA,OACA,IAAA,QACA,IAAA,UACA,IAAA,WACA,OAAA,EAAA,KAAA,EAAA,EAAA,GAEA,QACA,GAAA,EAAA,MAAA,IAAA,UAAA,qBAAA,GACA,GAAA,GAAA,GAAA,cACA,GAAA,IAKA,EAAA,UAAA,OAAA,WACA,MAAA,CACA,KAAA,SACA,KAAA,MAAA,UAAA,MAAA,KAAA,KAAA,MAAA,KAAA,KAwFA,IAAA,EAAA,KAEA,SAAA,EAAA,GACA,IAAA,EAAA,EAAA,OACA,GAAA,GAAA,EACA,OAAA,OAAA,aAAA,MAAA,OAAA,GAMA,IAFA,IAAA,EAAA,GACA,EAAA,EACA,EAAA,GACA,GAAA,OAAA,aAAA,MACA,OACA,EAAA,MAAA,EAAA,GAAA,IAGA,OAAA,EAGA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,GACA,EAAA,KAAA,IAAA,EAAA,OAAA,GAEA,IAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EACA,GAAA,OAAA,aAAA,IAAA,EAAA,IAEA,OAAA,EAGA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,GACA,EAAA,KAAA,IAAA,EAAA,OAAA,GAEA,IAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EACA,GAAA,OAAA,aAAA,EAAA,IAEA,OAAA,EAGA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,SAEA,GAAA,EAAA,KAAA,EAAA,KACA,GAAA,EAAA,GAAA,EAAA,KAAA,EAAA,GAGA,IADA,IAAA,EAAA,GACA,EAAA,EAAA,EAAA,IAAA,EACA,GAAA,EAAA,EAAA,IAEA,OAAA,EAGA,SAAA,EAAA,EAAA,EAAA,GAGA,IAFA,IAAA,EAAA,EAAA,MAAA,EAAA,GACA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EACA,GAAA,OAAA,aAAA,EAAA,GAAA,IAAA,EAAA,EAAA,IAEA,OAAA,EA0CA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,EAAA,GAAA,GAAA,EAAA,EAAA,MAAA,IAAA,WAAA,sBACA,GAAA,EAAA,EAAA,EAAA,MAAA,IAAA,WAAA,yCA+JA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,SAAA,GAAA,MAAA,IAAA,UAAA,+CACA,GAAA,EAAA,GAAA,EAAA,EAAA,MAAA,IAAA,WAAA,qCACA,GAAA,EAAA,EAAA,EAAA,OAAA,MAAA,IAAA,WAAA,sBAkDA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,IAAA,EAAA,MAAA,EAAA,GACA,IAAA,IAAA,EAAA,EAAA,EAAA,KAAA,IAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAAA,EACA,EAAA,EAAA,IAAA,EAAA,KAAA,GAAA,EAAA,EAAA,EAAA,MACA,GAAA,EAAA,EAAA,EAAA,GA8BA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,IAAA,EAAA,WAAA,EAAA,GACA,IAAA,IAAA,EAAA,EAAA,EAAA,KAAA,IAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAAA,EACA,EAAA,EAAA,GAAA,IAAA,GAAA,EAAA,EAAA,EAAA,GAAA,IAmJA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,GAAA,EAAA,EAAA,EAAA,OAAA,MAAA,IAAA,WAAA,sBACA,GAAA,EAAA,EAAA,MAAA,IAAA,WAAA,sBAGA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAKA,OAJA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,uBAAA,uBAEA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GACA,EAAA,EAWA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAKA,OAJA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,wBAAA,wBAEA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GACA,EAAA,EA/cA,EAAA,UAAA,MAAA,SAAA,EAAA,GACA,IAoBA,EApBA,EAAA,KAAA,OAqBA,IApBA,IAAA,GAGA,GACA,GAAA,GACA,IAAA,EAAA,GACA,EAAA,IACA,EAAA,IANA,OAAA,IAAA,EAAA,IAAA,GASA,GACA,GAAA,GACA,IAAA,EAAA,GACA,EAAA,IACA,EAAA,GAGA,EAAA,IAAA,EAAA,GAGA,EAAA,qBACA,EAAA,KAAA,SAAA,EAAA,IACA,UAAA,EAAA,cACA,CACA,IAAA,EAAA,EAAA,EACA,EAAA,IAAA,EAAA,OAAA,GACA,IAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EACA,EAAA,GAAA,KAAA,EAAA,GAIA,OAAA,GAWA,EAAA,UAAA,WAAA,SAAA,EAAA,EAAA,GACA,GAAA,EACA,GAAA,EACA,GAAA,EAAA,EAAA,EAAA,KAAA,QAKA,IAHA,IAAA,EAAA,KAAA,GACA,EAAA,EACA,EAAA,IACA,EAAA,IAAA,GAAA,MACA,GAAA,KAAA,EAAA,GAAA,EAGA,OAAA,GAGA,EAAA,UAAA,WAAA,SAAA,EAAA,EAAA,GACA,GAAA,EACA,GAAA,EACA,GACA,EAAA,EAAA,EAAA,KAAA,QAKA,IAFA,IAAA,EAAA,KAAA,IAAA,GACA,EAAA,EACA,EAAA,IAAA,GAAA,MACA,GAAA,KAAA,IAAA,GAAA,EAGA,OAAA,GAGA,EAAA,UAAA,UAAA,SAAA,EAAA,GAEA,OADA,GAAA,EAAA,EAAA,EAAA,KAAA,QACA,KAAA,IAGA,EAAA,UAAA,aAAA,SAAA,EAAA,GAEA,OADA,GAAA,EAAA,EAAA,EAAA,KAAA,QACA,KAAA,GAAA,KAAA,EAAA,IAAA,GAGA,EAAA,UAAA,aAAA,SAAA,EAAA,GAEA,OADA,GAAA,EAAA,EAAA,EAAA,KAAA,QACA,KAAA,IAAA,EAAA,KAAA,EAAA,IAGA,EAAA,UAAA,aAAA,SAAA,EAAA,GAGA,OAFA,GAAA,EAAA,EAAA,EAAA,KAAA,SAEA,KAAA,GACA,KAAA,EAAA,IAAA,EACA,KAAA,EAAA,IAAA,IACA,SAAA,KAAA,EAAA,IAGA,EAAA,UAAA,aAAA,SAAA,EAAA,GAGA,OAFA,GAAA,EAAA,EAAA,EAAA,KAAA,QAEA,SAAA,KAAA,IACA,KAAA,EAAA,IAAA,GACA,KAAA,EAAA,IAAA,EACA,KAAA,EAAA,KAGA,EAAA,UAAA,UAAA,SAAA,EAAA,EAAA,GACA,GAAA,EACA,GAAA,EACA,GAAA,EAAA,EAAA,EAAA,KAAA,QAKA,IAHA,IAAA,EAAA,KAAA,GACA,EAAA,EACA,EAAA,IACA,EAAA,IAAA,GAAA,MACA,GAAA,KAAA,EAAA,GAAA,EAMA,OAFA,IAFA,GAAA,OAEA,GAAA,KAAA,IAAA,EAAA,EAAA,IAEA,GAGA,EAAA,UAAA,UAAA,SAAA,EAAA,EAAA,GACA,GAAA,EACA,GAAA,EACA,GAAA,EAAA,EAAA,EAAA,KAAA,QAKA,IAHA,IAAA,EAAA,EACA,EAAA,EACA,EAAA,KAAA,IAAA,GACA,EAAA,IAAA,GAAA,MACA,GAAA,KAAA,IAAA,GAAA,EAMA,OAFA,IAFA,GAAA,OAEA,GAAA,KAAA,IAAA,EAAA,EAAA,IAEA,GAGA,EAAA,UAAA,SAAA,SAAA,EAAA,GAEA,OADA,GAAA,EAAA,EAAA,EAAA,KAAA,QACA,IAAA,KAAA,IACA,GAAA,IAAA,KAAA,GAAA,GADA,KAAA,IAIA,EAAA,UAAA,YAAA,SAAA,EAAA,GACA,GAAA,EAAA,EAAA,EAAA,KAAA,QACA,IAAA,EAAA,KAAA,GAAA,KAAA,EAAA,IAAA,EACA,OAAA,MAAA,EAAA,WAAA,EAAA,GAGA,EAAA,UAAA,YAAA,SAAA,EAAA,GACA,GAAA,EAAA,EAAA,EAAA,KAAA,QACA,IAAA,EAAA,KAAA,EAAA,GAAA,KAAA,IAAA,EACA,OAAA,MAAA,EAAA,WAAA,EAAA,GAGA,EAAA,UAAA,YAAA,SAAA,EAAA,GAGA,OAFA,GAAA,EAAA,EAAA,EAAA,KAAA,QAEA,KAAA,GACA,KAAA,EAAA,IAAA,EACA,KAAA,EAAA,IAAA,GACA,KAAA,EAAA,IAAA,IAGA,EAAA,UAAA,YAAA,SAAA,EAAA,GAGA,OAFA,GAAA,EAAA,EAAA,EAAA,KAAA,QAEA,KAAA,IAAA,GACA,KAAA,EAAA,IAAA,GACA,KAAA,EAAA,IAAA,EACA,KAAA,EAAA,IAGA,EAAA,UAAA,YAAA,SAAA,EAAA,GAEA,OADA,GAAA,EAAA,EAAA,EAAA,KAAA,QACA,EAAA,KAAA,KAAA,GAAA,EAAA,GAAA,IAGA,EAAA,UAAA,YAAA,SAAA,EAAA,GAEA,OADA,GAAA,EAAA,EAAA,EAAA,KAAA,QACA,EAAA,KAAA,KAAA,GAAA,EAAA,GAAA,IAGA,EAAA,UAAA,aAAA,SAAA,EAAA,GAEA,OADA,GAAA,EAAA,EAAA,EAAA,KAAA,QACA,EAAA,KAAA,KAAA,GAAA,EAAA,GAAA,IAGA,EAAA,UAAA,aAAA,SAAA,EAAA,GAEA,OADA,GAAA,EAAA,EAAA,EAAA,KAAA,QACA,EAAA,KAAA,KAAA,GAAA,EAAA,GAAA,IASA,EAAA,UAAA,YAAA,SAAA,EAAA,EAAA,EAAA,IACA,GAAA,EACA,GAAA,EACA,GAAA,EACA,IAEA,EAAA,KAAA,EAAA,EAAA,EADA,KAAA,IAAA,EAAA,EAAA,GAAA,EACA,GAGA,IAAA,EAAA,EACA,EAAA,EAEA,IADA,KAAA,GAAA,IAAA,IACA,EAAA,IAAA,GAAA,MACA,KAAA,EAAA,GAAA,EAAA,EAAA,IAGA,OAAA,EAAA,GAGA,EAAA,UAAA,YAAA,SAAA,EAAA,EAAA,EAAA,IACA,GAAA,EACA,GAAA,EACA,GAAA,EACA,IAEA,EAAA,KAAA,EAAA,EAAA,EADA,KAAA,IAAA,EAAA,EAAA,GAAA,EACA,GAGA,IAAA,EAAA,EAAA,EACA,EAAA,EAEA,IADA,KAAA,EAAA,GAAA,IAAA,IACA,GAAA,IAAA,GAAA,MACA,KAAA,EAAA,GAAA,EAAA,EAAA,IAGA,OAAA,EAAA,GAGA,EAAA,UAAA,WAAA,SAAA,EAAA,EAAA,GAMA,OALA,GAAA,EACA,GAAA,EACA,GAAA,EAAA,KAAA,EAAA,EAAA,EAAA,IAAA,GACA,EAAA,sBAAA,EAAA,KAAA,MAAA,IACA,KAAA,GAAA,IAAA,EACA,EAAA,GAWA,EAAA,UAAA,cAAA,SAAA,EAAA,EAAA,GAUA,OATA,GAAA,EACA,GAAA,EACA,GAAA,EAAA,KAAA,EAAA,EAAA,EAAA,MAAA,GACA,EAAA,qBACA,KAAA,GAAA,IAAA,EACA,KAAA,EAAA,GAAA,IAAA,GAEA,EAAA,KAAA,EAAA,GAAA,GAEA,EAAA,GAGA,EAAA,UAAA,cAAA,SAAA,EAAA,EAAA,GAUA,OATA,GAAA,EACA,GAAA,EACA,GAAA,EAAA,KAAA,EAAA,EAAA,EAAA,MAAA,GACA,EAAA,qBACA,KAAA,GAAA,IAAA,EACA,KAAA,EAAA,GAAA,IAAA,GAEA,EAAA,KAAA,EAAA,GAAA,GAEA,EAAA,GAUA,EAAA,UAAA,cAAA,SAAA,EAAA,EAAA,GAYA,OAXA,GAAA,EACA,GAAA,EACA,GAAA,EAAA,KAAA,EAAA,EAAA,EAAA,WAAA,GACA,EAAA,qBACA,KAAA,EAAA,GAAA,IAAA,GACA,KAAA,EAAA,GAAA,IAAA,GACA,KAAA,EAAA,GAAA,IAAA,EACA,KAAA,GAAA,IAAA,GAEA,EAAA,KAAA,EAAA,GAAA,GAEA,EAAA,GAGA,EAAA,UAAA,cAAA,SAAA,EAAA,EAAA,GAYA,OAXA,GAAA,EACA,GAAA,EACA,GAAA,EAAA,KAAA,EAAA,EAAA,EAAA,WAAA,GACA,EAAA,qBACA,KAAA,GAAA,IAAA,GACA,KAAA,EAAA,GAAA,IAAA,GACA,KAAA,EAAA,GAAA,IAAA,EACA,KAAA,EAAA,GAAA,IAAA,GAEA,EAAA,KAAA,EAAA,GAAA,GAEA,EAAA,GAGA,EAAA,UAAA,WAAA,SAAA,EAAA,EAAA,EAAA,GAGA,GAFA,GAAA,EACA,GAAA,GACA,EAAA,CACA,IAAA,EAAA,KAAA,IAAA,EAAA,EAAA,EAAA,GAEA,EAAA,KAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GAGA,IAAA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,IADA,KAAA,GAAA,IAAA,IACA,EAAA,IAAA,GAAA,MACA,EAAA,GAAA,IAAA,GAAA,IAAA,KAAA,EAAA,EAAA,KACA,EAAA,GAEA,KAAA,EAAA,IAAA,EAAA,GAAA,GAAA,EAAA,IAGA,OAAA,EAAA,GAGA,EAAA,UAAA,WAAA,SAAA,EAAA,EAAA,EAAA,GAGA,GAFA,GAAA,EACA,GAAA,GACA,EAAA,CACA,IAAA,EAAA,KAAA,IAAA,EAAA,EAAA,EAAA,GAEA,EAAA,KAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GAGA,IAAA,EAAA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,IADA,KAAA,EAAA,GAAA,IAAA,IACA,GAAA,IAAA,GAAA,MACA,EAAA,GAAA,IAAA,GAAA,IAAA,KAAA,EAAA,EAAA,KACA,EAAA,GAEA,KAAA,EAAA,IAAA,EAAA,GAAA,GAAA,EAAA,IAGA,OAAA,EAAA,GAGA,EAAA,UAAA,UAAA,SAAA,EAAA,EAAA,GAOA,OANA,GAAA,EACA,GAAA,EACA,GAAA,EAAA,KAAA,EAAA,EAAA,EAAA,KAAA,KACA,EAAA,sBAAA,EAAA,KAAA,MAAA,IACA,EAAA,IAAA,EAAA,IAAA,EAAA,GACA,KAAA,GAAA,IAAA,EACA,EAAA,GAGA,EAAA,UAAA,aAAA,SAAA,EAAA,EAAA,GAUA,OATA,GAAA,EACA,GAAA,EACA,GAAA,EAAA,KAAA,EAAA,EAAA,EAAA,OAAA,OACA,EAAA,qBACA,KAAA,GAAA,IAAA,EACA,KAAA,EAAA,GAAA,IAAA,GAEA,EAAA,KAAA,EAAA,GAAA,GAEA,EAAA,GAGA,EAAA,UAAA,aAAA,SAAA,EAAA,EAAA,GAUA,OATA,GAAA,EACA,GAAA,EACA,GAAA,EAAA,KAAA,EAAA,EAAA,EAAA,OAAA,OACA,EAAA,qBACA,KAAA,GAAA,IAAA,EACA,KAAA,EAAA,GAAA,IAAA,GAEA,EAAA,KAAA,EAAA,GAAA,GAEA,EAAA,GAGA,EAAA,UAAA,aAAA,SAAA,EAAA,EAAA,GAYA,OAXA,GAAA,EACA,GAAA,EACA,GAAA,EAAA,KAAA,EAAA,EAAA,EAAA,YAAA,YACA,EAAA,qBACA,KAAA,GAAA,IAAA,EACA,KAAA,EAAA,GAAA,IAAA,EACA,KAAA,EAAA,GAAA,IAAA,GACA,KAAA,EAAA,GAAA,IAAA,IAEA,EAAA,KAAA,EAAA,GAAA,GAEA,EAAA,GAGA,EAAA,UAAA,aAAA,SAAA,EAAA,EAAA,GAaA,OAZA,GAAA,EACA,GAAA,EACA,GAAA,EAAA,KAAA,EAAA,EAAA,EAAA,YAAA,YACA,EAAA,IAAA,EAAA,WAAA,EAAA,GACA,EAAA,qBACA,KAAA,GAAA,IAAA,GACA,KAAA,EAAA,GAAA,IAAA,GACA,KAAA,EAAA,GAAA,IAAA,EACA,KAAA,EAAA,GAAA,IAAA,GAEA,EAAA,KAAA,EAAA,GAAA,GAEA,EAAA,GAgBA,EAAA,UAAA,aAAA,SAAA,EAAA,EAAA,GACA,OAAA,EAAA,KAAA,EAAA,GAAA,EAAA,IAGA,EAAA,UAAA,aAAA,SAAA,EAAA,EAAA,GACA,OAAA,EAAA,KAAA,EAAA,GAAA,EAAA,IAWA,EAAA,UAAA,cAAA,SAAA,EAAA,EAAA,GACA,OAAA,EAAA,KAAA,EAAA,GAAA,EAAA,IAGA,EAAA,UAAA,cAAA,SAAA,EAAA,EAAA,GACA,OAAA,EAAA,KAAA,EAAA,GAAA,EAAA,IAIA,EAAA,UAAA,KAAA,SAAA,EAAA,EAAA,EAAA,GAQA,GAPA,IAAA,EAAA,GACA,GAAA,IAAA,IAAA,EAAA,KAAA,QACA,GAAA,EAAA,SAAA,EAAA,EAAA,QACA,IAAA,EAAA,GACA,EAAA,GAAA,EAAA,IAAA,EAAA,GAGA,IAAA,EAAA,OAAA,EACA,GAAA,IAAA,EAAA,QAAA,IAAA,KAAA,OAAA,OAAA,EAGA,GAAA,EAAA,EACA,MAAA,IAAA,WAAA,6BAEA,GAAA,EAAA,GAAA,GAAA,KAAA,OAAA,MAAA,IAAA,WAAA,6BACA,GAAA,EAAA,EAAA,MAAA,IAAA,WAAA,2BAGA,EAAA,KAAA,SAAA,EAAA,KAAA,QACA,EAAA,OAAA,EAAA,EAAA,IACA,EAAA,EAAA,OAAA,EAAA,GAGA,IACA,EADA,EAAA,EAAA,EAGA,GAAA,OAAA,GAAA,EAAA,GAAA,EAAA,EAEA,IAAA,EAAA,EAAA,EAAA,GAAA,IAAA,EACA,EAAA,EAAA,GAAA,KAAA,EAAA,QAEA,GAAA,EAAA,MAAA,EAAA,oBAEA,IAAA,EAAA,EAAA,EAAA,IAAA,EACA,EAAA,EAAA,GAAA,KAAA,EAAA,QAGA,WAAA,UAAA,IAAA,KACA,EACA,KAAA,SAAA,EAAA,EAAA,GACA,GAIA,OAAA,GAOA,EAAA,UAAA,KAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GAAA,iBAAA,EAAA,CASA,GARA,iBAAA,GACA,EAAA,EACA,EAAA,EACA,EAAA,KAAA,QACA,iBAAA,IACA,EAAA,EACA,EAAA,KAAA,QAEA,IAAA,EAAA,OAAA,CACA,IAAA,EAAA,EAAA,WAAA,GACA,EAAA,MACA,EAAA,GAGA,QAAA,IAAA,GAAA,iBAAA,EACA,MAAA,IAAA,UAAA,6BAEA,GAAA,iBAAA,IAAA,EAAA,WAAA,GACA,MAAA,IAAA,UAAA,qBAAA,OAEA,iBAAA,IACA,GAAA,KAIA,GAAA,EAAA,GAAA,KAAA,OAAA,GAAA,KAAA,OAAA,EACA,MAAA,IAAA,WAAA,sBAGA,GAAA,GAAA,EACA,OAAA,KAQA,IAAA,EACA,GANA,KAAA,EACA,OAAA,IAAA,EAAA,KAAA,OAAA,IAAA,EAEA,IAAA,EAAA,GAGA,iBAAA,EACA,IAAA,EAAA,EAAA,EAAA,IAAA,EACA,KAAA,GAAA,MAEA,CACA,IAAA,EAAA,EAAA,SAAA,GACA,EACA,EAAA,IAAA,EAAA,EAAA,GAAA,YACA,EAAA,EAAA,OACA,IAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EACA,KAAA,EAAA,GAAA,EAAA,EAAA,GAIA,OAAA,MAMA,IAAA,EAAA,qBAEA,SAAA,EAAA,GAIA,IAFA,EAAA,EAAA,GAAA,QAAA,EAAA,KAEA,OAAA,EAAA,MAAA,GAEA,KAAA,EAAA,OAAA,GAAA,GACA,GAAA,IAEA,OAAA,EAGA,SAAA,EAAA,GACA,OAAA,EAAA,KAAA,EAAA,OACA,EAAA,QAAA,aAAA,IAGA,SAAA,EAAA,GACA,OAAA,EAAA,GAAA,IAAA,EAAA,SAAA,IACA,EAAA,SAAA,IAGA,SAAA,EAAA,EAAA,GAEA,IAAA,EADA,EAAA,GAAA,EAAA,EAMA,IAJA,IAAA,EAAA,EAAA,OACA,EAAA,KACA,EAAA,GAEA,EAAA,EAAA,EAAA,IAAA,EAAA,CAIA,IAHA,EAAA,EAAA,WAAA,IAGA,OAAA,EAAA,MAAA,CAEA,IAAA,EAAA,CAEA,GAAA,EAAA,MAAA,EAEA,GAAA,IAAA,GAAA,EAAA,KAAA,IAAA,IAAA,KACA,SACA,GAAA,EAAA,IAAA,EAAA,EAEA,GAAA,IAAA,GAAA,EAAA,KAAA,IAAA,IAAA,KACA,SAIA,EAAA,EAEA,SAIA,GAAA,EAAA,MAAA,EACA,GAAA,IAAA,GAAA,EAAA,KAAA,IAAA,IAAA,KACA,EAAA,EACA,SAIA,EAAA,OAAA,EAAA,OAAA,GAAA,EAAA,YACA,IAEA,GAAA,IAAA,GAAA,EAAA,KAAA,IAAA,IAAA,KAMA,GAHA,EAAA,KAGA,EAAA,IAAA,CACA,IAAA,GAAA,GAAA,EAAA,MACA,EAAA,KAAA,QACA,GAAA,EAAA,KAAA,CACA,IAAA,GAAA,GAAA,EAAA,MACA,EAAA,KACA,GAAA,EAAA,IACA,GAAA,EAAA,UAEA,GAAA,EAAA,MAAA,CACA,IAAA,GAAA,GAAA,EAAA,MACA,EAAA,KACA,GAAA,GAAA,IACA,GAAA,EAAA,GAAA,IACA,GAAA,EAAA,SAEA,CAAA,KAAA,EAAA,SASA,MAAA,IAAA,MAAA,sBARA,IAAA,GAAA,GAAA,EAAA,MACA,EAAA,KACA,GAAA,GAAA,IACA,GAAA,GAAA,GAAA,IACA,GAAA,EAAA,GAAA,IACA,GAAA,EAAA,MAOA,OAAA,EAGA,SAAA,EAAA,GAEA,IADA,IAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,SAAA,EAEA,EAAA,KAAA,IAAA,EAAA,WAAA,IAEA,OAAA,EAGA,SAAA,EAAA,EAAA,GAGA,IAFA,IAAA,EAAA,EAAA,EACA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,WACA,GAAA,GAAA,KADA,EAIA,GADA,EAAA,EAAA,WAAA,KACA,EACA,EAAA,EAAA,IACA,EAAA,KAAA,GACA,EAAA,KAAA,GAGA,OAAA,EAGA,SAAA,EAAA,GACA,OAAA,EAAA,YAAA,EAAA,IAGA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,IAAA,IAAA,EAAA,EAAA,EAAA,KACA,EAAA,GAAA,EAAA,QAAA,GAAA,EAAA,UADA,EAEA,EAAA,EAAA,GAAA,EAAA,GAEA,OAAA,EAGA,SAAA,EAAA,GACA,OAAA,GAAA;;;AC/tCA,IAAA,EAAA,QAAA,UAAA,OA1hBA,MAAA,EAAA,QAAA,QAEA,EAAA,KACA,EAAA,GAmBA,MAAA,EACA,YAAA,EAAA,GACA,EAAA,GAAA,GACA,IAAA,GAAA,OACA,IAAA,IACA,EAAA,GAEA,iBAAA,EACA,EAAA,IAAA,YAAA,IAEA,GAAA,EACA,KAAA,iBAAA,EAAA,YAGA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EACA,IAAA,EAAA,EAAA,WAAA,EACA,EAAA,EACA,EAAA,SACA,EAAA,aAAA,EAAA,OAAA,aACA,EAAA,EAAA,WAAA,GAEA,EAAA,EAAA,QAGA,KAAA,iBADA,EACA,EAEA,EAEA,KAAA,OAAA,EACA,KAAA,OAAA,EACA,KAAA,WAAA,EACA,KAAA,WAAA,EACA,KAAA,OAAA,EACA,KAAA,cAAA,EACA,KAAA,MAAA,IAAA,SAAA,KAAA,OAAA,EAAA,GACA,KAAA,MAAA,EACA,KAAA,OAAA,GAQA,UAAA,GAEA,YADA,IAAA,IAAA,EAAA,GACA,KAAA,OAAA,GAAA,KAAA,OAOA,iBACA,OAAA,KAAA,aAOA,kBAEA,OADA,KAAA,cAAA,EACA,KAOA,cACA,OAAA,KAAA,aAOA,eAEA,OADA,KAAA,cAAA,EACA,KAQA,KAAA,GAGA,YAFA,IAAA,IAAA,EAAA,GACA,KAAA,QAAA,EACA,KAQA,KAAA,GAEA,OADA,KAAA,OAAA,EACA,KAQA,OAEA,OADA,KAAA,MAAA,KAAA,OACA,KAQA,QAEA,OADA,KAAA,OAAA,KAAA,MACA,KAQA,WAEA,OADA,KAAA,OAAA,KAAA,KAAA,QACA,KAQA,UACA,MAAA,EAAA,KAAA,OAAA,MACA,QAAA,IAAA,EAAA,MAAA,IAAA,MAAA,oBAEA,OADA,KAAA,KAAA,GACA,KAOA,SAEA,OADA,KAAA,OAAA,EACA,KAUA,gBAAA,GAEA,QADA,IAAA,IAAA,EAAA,IACA,KAAA,UAAA,GAAA,CACA,MACA,EAAA,GADA,KAAA,OAAA,GAEA,EAAA,IAAA,WAAA,GACA,EAAA,IAAA,IAAA,WAAA,KAAA,SACA,KAAA,OAAA,EAAA,OACA,KAAA,OAAA,KAAA,WAAA,EACA,KAAA,MAAA,IAAA,SAAA,KAAA,QAEA,OAAA,KAQA,cACA,OAAA,IAAA,KAAA,YAOA,WACA,OAAA,KAAA,MAAA,QAAA,KAAA,UAOA,YACA,OAAA,KAAA,MAAA,SAAA,KAAA,UAOA,WACA,OAAA,KAAA,YAQA,UAAA,QACA,IAAA,IAAA,EAAA,GAEA,IADA,IAAA,EAAA,IAAA,WAAA,GACA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,KAAA,WAEA,OAAA,EAOA,YACA,IAAA,EAAA,KAAA,MAAA,SAAA,KAAA,OAAA,KAAA,cAEA,OADA,KAAA,QAAA,EACA,EAOA,aACA,IAAA,EAAA,KAAA,MAAA,UAAA,KAAA,OAAA,KAAA,cAEA,OADA,KAAA,QAAA,EACA,EAOA,YACA,IAAA,EAAA,KAAA,MAAA,SAAA,KAAA,OAAA,KAAA,cAEA,OADA,KAAA,QAAA,EACA,EAOA,aACA,IAAA,EAAA,KAAA,MAAA,UAAA,KAAA,OAAA,KAAA,cAEA,OADA,KAAA,QAAA,EACA,EAOA,cACA,IAAA,EAAA,KAAA,MAAA,WAAA,KAAA,OAAA,KAAA,cAEA,OADA,KAAA,QAAA,EACA,EAOA,cACA,IAAA,EAAA,KAAA,MAAA,WAAA,KAAA,OAAA,KAAA,cAEA,OADA,KAAA,QAAA,EACA,EAOA,WACA,OAAA,OAAA,aAAA,KAAA,YAQA,UAAA,QACA,IAAA,IAAA,EAAA,GACA,EAAA,OAAA,EACA,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,KAAA,WAEA,OAAA,EAAA,KAAA,IAQA,SAAA,QACA,IAAA,IAAA,EAAA,GACA,MAAA,EAAA,KAAA,UAAA,GACA,OAAA,EAAA,OAAA,GAQA,aAAA,GAEA,OADA,KAAA,WAAA,EAAA,IAAA,GACA,KAQA,UAAA,GAIA,OAHA,KAAA,gBAAA,GACA,KAAA,MAAA,QAAA,KAAA,SAAA,GACA,KAAA,yBACA,KAQA,WAAA,GAIA,OAHA,KAAA,gBAAA,GACA,KAAA,MAAA,SAAA,KAAA,SAAA,GACA,KAAA,yBACA,KAQA,UAAA,GACA,OAAA,KAAA,WAAA,GAQA,WAAA,GACA,KAAA,gBAAA,EAAA,QACA,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,KAAA,MAAA,SAAA,KAAA,SAAA,EAAA,IAGA,OADA,KAAA,yBACA,KAQA,WAAA,GAKA,OAJA,KAAA,gBAAA,GACA,KAAA,MAAA,SAAA,KAAA,OAAA,EAAA,KAAA,cACA,KAAA,QAAA,EACA,KAAA,yBACA,KAQA,YAAA,GAKA,OAJA,KAAA,gBAAA,GACA,KAAA,MAAA,UAAA,KAAA,OAAA,EAAA,KAAA,cACA,KAAA,QAAA,EACA,KAAA,yBACA,KAQA,WAAA,GAKA,OAJA,KAAA,gBAAA,GACA,KAAA,MAAA,SAAA,KAAA,OAAA,EAAA,KAAA,cACA,KAAA,QAAA,EACA,KAAA,yBACA,KAQA,YAAA,GAKA,OAJA,KAAA,gBAAA,GACA,KAAA,MAAA,UAAA,KAAA,OAAA,EAAA,KAAA,cACA,KAAA,QAAA,EACA,KAAA,yBACA,KAQA,aAAA,GAKA,OAJA,KAAA,gBAAA,GACA,KAAA,MAAA,WAAA,KAAA,OAAA,EAAA,KAAA,cACA,KAAA,QAAA,EACA,KAAA,yBACA,KAQA,aAAA,GAKA,OAJA,KAAA,gBAAA,GACA,KAAA,MAAA,WAAA,KAAA,OAAA,EAAA,KAAA,cACA,KAAA,QAAA,EACA,KAAA,yBACA,KAQA,UAAA,GACA,OAAA,KAAA,WAAA,EAAA,WAAA,IAQA,WAAA,GACA,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,KAAA,WAAA,EAAA,WAAA,IAEA,OAAA,KAQA,UAAA,GACA,MAAA,EAAA,EAAA,OAAA,GACA,OAAA,KAAA,WAAA,GASA,UACA,OAAA,IAAA,WAAA,KAAA,OAAA,KAAA,WAAA,KAAA,kBAOA,YACA,YAAA,IAAA,EACA,EAAA,KAAA,KAAA,WAEA,KAAA,UAQA,yBACA,KAAA,OAAA,KAAA,mBACA,KAAA,iBAAA,KAAA,SAKA,OAAA,QAAA;;AC3hBA,aAQA,SAAA,EAAA,EAAA,GACA,GAAA,EACA,MAAA,IAAA,UAAA,iCAAA,GASA,SAAA,EAAA,GACA,EAAA,OAAA,GAAA,GACA,EAAA,KAAA,EAAA,EAAA,OAAA,GAWA,SAAA,EAAA,GAEA,IAAA,EAAA,EAAA,aACA,EAAA,EAAA,UAAA,GAOA,OADA,EAAA,GACA,EAGA,OAAA,QAAA,UAAA,EACA,OAAA,QAAA,QAAA,EACA,OAAA,QAAA,SAAA;;AC/CA,aAEA,MAAA,EAAA,QAAA,WAAA,UAEA,EAAA,CACA,KAAA,EACA,KAAA,EACA,MAAA,EACA,IAAA,EACA,MAAA,EACA,OAAA,GASA,SAAA,EAAA,GACA,OAAA,OAAA,IACA,KAAA,EAAA,KACA,MAAA,OACA,KAAA,EAAA,KACA,MAAA,OACA,KAAA,EAAA,MACA,MAAA,QACA,KAAA,EAAA,IACA,MAAA,MACA,KAAA,EAAA,MACA,MAAA,QACA,KAAA,EAAA,OACA,MAAA,SAEA,QACA,MAAA,aAUA,SAAA,EAAA,GACA,OAAA,OAAA,IACA,KAAA,EAAA,KAEA,KAAA,EAAA,KACA,OAAA,EACA,KAAA,EAAA,MACA,OAAA,EACA,KAAA,EAAA,IAEA,KAAA,EAAA,MACA,OAAA,EACA,KAAA,EAAA,OACA,OAAA,EAEA,QACA,OAAA,GAUA,SAAA,EAAA,GACA,OAAA,OAAA,IACA,IAAA,OACA,OAAA,EAAA,KACA,IAAA,OACA,OAAA,EAAA,KACA,IAAA,QACA,OAAA,EAAA,MACA,IAAA,MACA,OAAA,EAAA,IACA,IAAA,QACA,OAAA,EAAA,MACA,IAAA,SACA,OAAA,EAAA,OAEA,QACA,OAAA,GAWA,SAAA,EAAA,EAAA,GACA,GAAA,IAAA,EAAA,CAEA,IADA,IAAA,EAAA,IAAA,MAAA,GACA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,IAEA,OAAA,EAEA,OAAA,IAYA,SAAA,EAAA,EAAA,EAAA,GACA,OAAA,GACA,KAAA,EAAA,KACA,OAAA,EAAA,UAAA,GACA,KAAA,EAAA,KACA,OAAA,EAAA,EAAA,UAAA,IACA,KAAA,EAAA,MACA,OAAA,EAAA,EAAA,EAAA,UAAA,KAAA,IACA,KAAA,EAAA,IACA,OAAA,EAAA,EAAA,EAAA,UAAA,KAAA,IACA,KAAA,EAAA,MACA,OAAA,EAAA,EAAA,EAAA,YAAA,KAAA,IACA,KAAA,EAAA,OACA,OAAA,EAAA,EAAA,EAAA,YAAA,KAAA,IAEA,QAEA,YADA,GAAA,EAAA,kBAAA,IAWA,SAAA,EAAA,GACA,OAAA,IAAA,EAAA,WAAA,EAAA,OAAA,GACA,EAAA,UAAA,EAAA,EAAA,OAAA,GAEA,EAGA,OAAA,QAAA,EACA,OAAA,QAAA,QAAA,EACA,OAAA,QAAA,UAAA,EACA,OAAA,QAAA,QAAA,EACA,OAAA,QAAA,SAAA;;AC5JA,aAEA,MAAA,EAAA,QAAA,WAWA,SAAA,EAAA,EAAA,GAEA,MAAA,EAAA,EAAA,QAAA,EAAA,MAOA,IAJA,IAAA,EAAA,EAAA,KAAA,EAAA,UAAA,GAGA,EAAA,IAAA,MAAA,GACA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,EAAA,SAAA,EAAA,EAAA,GAGA,OAAA,EAWA,SAAA,EAAA,EAAA,EAAA,GAEA,MAAA,EAAA,EAAA,QAAA,EAAA,MACA,EAAA,EAAA,KAAA,EAAA,KAAA,EAAA,UAAA,GAAA,EAIA,IAAA,EAAA,EAAA,OAGA,EAAA,IAAA,MAAA,GACA,MAAA,EAAA,EAAA,WAEA,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,IAAA,CACA,IAAA,EAAA,EAAA,OACA,EAAA,GAAA,EAAA,SAAA,EAAA,EAAA,GACA,EAAA,KAAA,EAAA,GAGA,OAAA,EAGA,OAAA,QAAA,UAAA,EACA,OAAA,QAAA,OAAA;;AC5DA,aAEA,MAAA,EAAA,QAAA,WACA,EAAA,QAAA,WAGA,EAAA,EACA,EAAA,GACA,EAAA,GACA,EAAA,GAYA,SAAA,EAAA,GAGA,IAAA,EAAA,CAAA,gBAAA,CAAA,OAAA,EAAA,eAGA,EAAA,EAAA,GACA,EAAA,gBAAA,GAAA,EAAA,SACA,EAAA,gBAAA,KAAA,EAAA,WACA,EAAA,WAAA,EAAA,WAGA,EAAA,iBAAA,EAAA,GAGA,IAAA,EAAA,EAAA,EAAA,EAAA,UAIA,OAHA,EAAA,UAAA,EAAA,UACA,EAAA,gBAAA,WAAA,EAAA,WAEA,EAWA,SAAA,EAAA,GACA,IAAA,EAAA,EACA,MAAA,EAAA,EAAA,aACA,GAAA,IAAA,EAEA,OADA,EAAA,UAAA,EAAA,eAAA,EAAA,0CACA,GACA,CACA,EAAA,UAAA,IAAA,EAAA,oCAGA,MAAA,EAAA,EAAA,aAEA,IADA,IAAA,EAAA,IAAA,MAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAAA,CAEA,IAAA,EAAA,EAAA,SAAA,GAGA,MAAA,EAAA,EAAA,aACA,IAAA,IACA,EAAA,EACA,EAAA,GAGA,EAAA,GAAA,CACA,KAAA,EACA,KAAA,IAIA,MAAA,CACA,WAAA,EACA,SAAA,EACA,WAAA,GAaA,SAAA,EAAA,GACA,MAAA,EAAA,EAAA,aACA,GAAA,IAAA,EAEA,OADA,EAAA,UAAA,EAAA,eAAA,EAAA,0CACA,GACA,CACA,EAAA,UAAA,IAAA,EAAA,oCAGA,MAAA,EAAA,EAAA,aAEA,IADA,IAAA,EAAA,IAAA,MAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAAA,CAEA,IAAA,EAAA,EAAA,SAAA,GAGA,EAAA,EAAA,aACA,EAAA,UAAA,EAAA,GAAA,EAAA,EAAA,kBAAA,GAGA,IAAA,EAAA,EAAA,aACA,EAAA,EAAA,SAAA,EAAA,EAAA,GAGA,EAAA,QAAA,GAEA,EAAA,GAAA,CACA,KAAA,EACA,KAAA,EAAA,QAAA,GACA,MAAA,IAIA,OAAA,EAiBA,SAAA,EAAA,EAAA,GACA,MAAA,EAAA,EAAA,aACA,IAAA,EAAA,EACA,GAAA,IAAA,EAEA,OADA,EAAA,UAAA,EAAA,eAAA,EAAA,yCACA,GACA,CACA,EAAA,UAAA,IAAA,EAAA,mCAGA,MAAA,EAAA,EAAA,aAEA,IADA,IAAA,EAAA,IAAA,MAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAAA,CAEA,IAAA,EAAA,EAAA,SAAA,GAGA,MAAA,EAAA,EAAA,aAIA,IADA,IAAA,EAAA,IAAA,MAAA,GACA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,EAAA,aAIA,IAAA,EAAA,EAAA,GAGA,EAAA,EAAA,aACA,EAAA,UAAA,EAAA,GAAA,EAAA,EAAA,kBAAA,GAKA,MAAA,EAAA,EAAA,aAIA,EAAA,EAAA,aAGA,EAAA,KAAA,IACA,GAAA,GAGA,EAAA,GAAA,CACA,KAAA,EACA,WAAA,EACA,WAAA,EACA,KAAA,EAAA,QAAA,GACA,KAAA,EACA,OAAA,EACA,OAAA,EAAA,KAAA,IAKA,MAAA,CACA,UAAA,EACA,WAAA,GAIA,OAAA,QAAA;;AClNA,aAEA,MAAA,EAAA,QAAA,YACA,EAAA,QAAA,WACA,EAAA,QAAA,UACA,EAAA,QAAA,YAQA,MAAA,EACA,YAAA,GACA,MAAA,EAAA,IAAA,EAAA,GACA,EAAA,eAGA,EAAA,UAAA,QAAA,EAAA,UAAA,GAAA,yBAGA,MAAA,EAAA,EAAA,WACA,EAAA,UAAA,IAAA,EAAA,0CACA,EAAA,UAAA,IAAA,EAAA,mBAGA,KAAA,OAAA,EAAA,GACA,KAAA,OAAA,QAAA,EACA,KAAA,OAAA,EAMA,cACA,OAAA,IAAA,KAAA,OAAA,QACA,iBAEA,uBAWA,sBACA,OAAA,KAAA,OAAA,gBAQA,iBACA,OAAA,KAAA,OAAA,WASA,uBACA,OAAA,KAAA,OAAA,iBAaA,gBACA,OAAA,KAAA,OAAA,UAQA,gBAAA,GACA,IAAA,EAgBA,OAbA,EAFA,iBAAA,EAEA,KAAA,OAAA,UAAA,KAAA,SAAA,GACA,OAAA,EAAA,OAAA,IAGA,EAIA,EAAA,eAAA,IAAA,EAAA,sBAGA,KAAA,OAAA,KAAA,EAAA,QAEA,EAAA,OAEA,EAAA,OAAA,KAAA,OAAA,EAAA,KAAA,OAAA,iBAGA,EAAA,UAAA,KAAA,OAAA,IAKA,OAAA,QAAA;;AC/BeA,aAAAA,OAAAA,eAAAA,QAAAA,aAAAA,CAAAA,OAAAA,IAAAA,QAAAA,aAAAA,EAxFf,IAAIC,EAAoB,SAA2BC,GAC3CC,OAAAA,EAAgBD,KAClBE,EAAUF,IAGhB,SAASC,EAAgBD,GACjB,QAAEA,GAA0B,iBAAVA,EAG1B,SAASE,EAAUF,GACdG,IAAAA,EAAcC,OAAOC,UAAUC,SAASC,KAAKP,GAE1CG,MAAgB,oBAAhBA,GACa,kBAAhBA,GACAK,EAAeR,GAIpB,IAAIS,EAAiC,mBAAXC,QAAyBA,OAAOC,IACtDC,EAAqBH,EAAeC,OAAOC,IAAI,iBAAmB,MAEtE,SAASH,EAAeR,GAChBA,OAAAA,EAAMa,WAAaD,EAG3B,SAASE,EAAYC,GACbC,OAAAA,MAAMC,QAAQF,GAAO,GAAK,GAGlC,SAASG,EAA8BlB,EAAOmB,GACrCA,OAAkB,IAAlBA,EAAQC,OAAmBD,EAAQpB,kBAAkBC,GAC1DqB,EAAUP,EAAYd,GAAQA,EAAOmB,GACrCnB,EAGJ,SAASsB,EAAkBC,EAAQC,EAAQL,GACnCI,OAAAA,EAAOE,OAAOD,GAAQE,IAAI,SAASC,GAClCT,OAAAA,EAA8BS,EAASR,KAIhD,SAASS,EAAYL,EAAQC,EAAQL,GAChCU,IAAAA,EAAc,GAaXA,OAZHV,EAAQpB,kBAAkBwB,IAC7BnB,OAAO0B,KAAKP,GAAQQ,QAAQ,SAASC,GACpCH,EAAYG,GAAOd,EAA8BK,EAAOS,GAAMb,KAGhEf,OAAO0B,KAAKN,GAAQO,QAAQ,SAASC,GAC/Bb,EAAQpB,kBAAkByB,EAAOQ,KAAUT,EAAOS,GAGtDH,EAAYG,GAAOX,EAAUE,EAAOS,GAAMR,EAAOQ,GAAMb,GAFvDU,EAAYG,GAAOd,EAA8BM,EAAOQ,GAAMb,KAKzDU,EAGR,SAASR,EAAUE,EAAQC,EAAQL,IAClCA,EAAUA,GAAW,IACbc,WAAad,EAAQc,YAAcX,EAC3CH,EAAQpB,kBAAoBoB,EAAQpB,mBAAqBA,EAErDmC,IAAAA,EAAgBlB,MAAMC,QAAQO,GAI9B,OAF4BU,IADZlB,MAAMC,QAAQM,GAKvBW,EACHf,EAAQc,WAAWV,EAAQC,EAAQL,GAEnCS,EAAYL,EAAQC,EAAQL,GAJ5BD,EAA8BM,EAAQL,GAQ/CE,EAAUc,IAAM,SAAsBC,EAAOjB,GACxC,IAACH,MAAMC,QAAQmB,GACZ,MAAA,IAAIC,MAAM,qCAGVD,OAAAA,EAAME,OAAO,SAASC,EAAMC,GAC3BnB,OAAAA,EAAUkB,EAAMC,EAAMrB,IAC3B,KAGJ,IAAIrB,EAAcuB,EAEHvB,EAAAA,EAAAA,QAAAA,QAAAA;;;;ACk0If,IAAA,EAAA,EAAA,UAAA,IAx5IA,SAAA,EAAA,GACA,iBAAA,SAAA,oBAAA,OAAA,OAAA,QAAA,IACA,mBAAA,GAAA,EAAA,IAAA,EAAA,GACA,EAAA,OAAA,IAHA,CAIA,KAAA,WAAA,aAEA,IAAA,EA6GA,EA3GA,SAAA,IACA,OAAA,EAAA,MAAA,KAAA,WASA,SAAA,EAAA,GACA,OAAA,aAAA,OAAA,mBAAA,OAAA,UAAA,SAAA,KAAA,GAGA,SAAA,EAAA,GAGA,OAAA,MAAA,GAAA,oBAAA,OAAA,UAAA,SAAA,KAAA,GAiBA,SAAA,EAAA,GACA,YAAA,IAAA,EAGA,SAAA,EAAA,GACA,MAAA,iBAAA,GAAA,oBAAA,OAAA,UAAA,SAAA,KAAA,GAGA,SAAA,EAAA,GACA,OAAA,aAAA,MAAA,kBAAA,OAAA,UAAA,SAAA,KAAA,GAGA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,EAAA,EAAA,SAAA,EACA,EAAA,KAAA,EAAA,EAAA,GAAA,IAEA,OAAA,EAGA,SAAA,EAAA,EAAA,GACA,OAAA,OAAA,UAAA,eAAA,KAAA,EAAA,GAGA,SAAA,EAAA,EAAA,GACA,IAAA,IAAA,KAAA,EACA,EAAA,EAAA,KACA,EAAA,GAAA,EAAA,IAYA,OARA,EAAA,EAAA,cACA,EAAA,SAAA,EAAA,UAGA,EAAA,EAAA,aACA,EAAA,QAAA,EAAA,SAGA,EAGA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,OAAA,GAAA,EAAA,EAAA,EAAA,GAAA,GAAA,MAuBA,SAAA,EAAA,GAIA,OAHA,MAAA,EAAA,MACA,EAAA,IApBA,CACA,OAAA,EACA,aAAA,GACA,YAAA,GACA,UAAA,EACA,cAAA,EACA,WAAA,EACA,aAAA,KACA,eAAA,EACA,iBAAA,EACA,KAAA,EACA,gBAAA,GACA,SAAA,KACA,SAAA,EACA,iBAAA,IAQA,EAAA,IAqBA,SAAA,EAAA,GACA,GAAA,MAAA,EAAA,SAAA,CACA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,KAAA,EAAA,gBAAA,SAAA,GACA,OAAA,MAAA,IAEA,GAAA,MAAA,EAAA,GAAA,YACA,EAAA,SAAA,IACA,EAAA,QACA,EAAA,eACA,EAAA,iBACA,EAAA,kBACA,EAAA,YACA,EAAA,gBACA,EAAA,mBACA,EAAA,UAAA,EAAA,UAAA,GASA,GAPA,EAAA,UACA,EAAA,GACA,IAAA,EAAA,eACA,IAAA,EAAA,aAAA,aACA,IAAA,EAAA,SAGA,MAAA,OAAA,UAAA,OAAA,SAAA,GAIA,OAAA,EAHA,EAAA,SAAA,EAMA,OAAA,EAAA,SAGA,SAAA,EAAA,GACA,IAAA,EAAA,EAAA,KAQA,OAPA,MAAA,EACA,EAAA,EAAA,GAAA,GAGA,EAAA,GAAA,iBAAA,EAGA,EA3DA,EADA,MAAA,UAAA,KACA,MAAA,UAAA,KAEA,SAAA,GAIA,IAHA,IAAA,EAAA,OAAA,MACA,EAAA,EAAA,SAAA,EAEA,EAAA,EAAA,EAAA,EAAA,IACA,GAAA,KAAA,GAAA,EAAA,KAAA,KAAA,EAAA,GAAA,EAAA,GACA,OAAA,EAIA,OAAA,GAoDA,IAAA,EAAA,EAAA,iBAAA,GAEA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,EAiCA,GA/BA,EAAA,EAAA,oBACA,EAAA,iBAAA,EAAA,kBAEA,EAAA,EAAA,MACA,EAAA,GAAA,EAAA,IAEA,EAAA,EAAA,MACA,EAAA,GAAA,EAAA,IAEA,EAAA,EAAA,MACA,EAAA,GAAA,EAAA,IAEA,EAAA,EAAA,WACA,EAAA,QAAA,EAAA,SAEA,EAAA,EAAA,QACA,EAAA,KAAA,EAAA,MAEA,EAAA,EAAA,UACA,EAAA,OAAA,EAAA,QAEA,EAAA,EAAA,WACA,EAAA,QAAA,EAAA,SAEA,EAAA,EAAA,OACA,EAAA,IAAA,EAAA,IAEA,EAAA,EAAA,WACA,EAAA,QAAA,EAAA,SAGA,EAAA,OAAA,EACA,IAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IAGA,EADA,EAAA,EADA,EAAA,EAAA,OAGA,EAAA,GAAA,GAKA,OAAA,EAGA,IAAA,GAAA,EAGA,SAAA,EAAA,GACA,EAAA,KAAA,GACA,KAAA,GAAA,IAAA,KAAA,MAAA,EAAA,GAAA,EAAA,GAAA,UAAA,KACA,KAAA,YACA,KAAA,GAAA,IAAA,KAAA,OAIA,IAAA,IACA,GAAA,EACA,EAAA,aAAA,MACA,GAAA,GAIA,SAAA,EAAA,GACA,OAAA,aAAA,GAAA,MAAA,GAAA,MAAA,EAAA,iBAGA,SAAA,EAAA,GACA,OAAA,EAAA,EAEA,KAAA,KAAA,IAAA,EAEA,KAAA,MAAA,GAIA,SAAA,EAAA,GACA,IAAA,GAAA,EACA,EAAA,EAMA,OAJA,IAAA,GAAA,SAAA,KACA,EAAA,EAAA,IAGA,EAIA,SAAA,EAAA,EAAA,EAAA,GACA,IAGA,EAHA,EAAA,KAAA,IAAA,EAAA,OAAA,EAAA,QACA,EAAA,KAAA,IAAA,EAAA,OAAA,EAAA,QACA,EAAA,EAEA,IAAA,EAAA,EAAA,EAAA,EAAA,KACA,GAAA,EAAA,KAAA,EAAA,KACA,GAAA,EAAA,EAAA,MAAA,EAAA,EAAA,MACA,IAGA,OAAA,EAAA,EAGA,SAAA,EAAA,IACA,IAAA,EAAA,6BACA,oBAAA,SAAA,QAAA,MACA,QAAA,KAAA,wBAAA,GAIA,SAAA,EAAA,EAAA,GACA,IAAA,GAAA,EAEA,OAAA,EAAA,WAIA,GAHA,MAAA,EAAA,oBACA,EAAA,mBAAA,KAAA,GAEA,EAAA,CAGA,IAFA,IACA,EADA,EAAA,GAEA,EAAA,EAAA,EAAA,UAAA,OAAA,IAAA,CAEA,GADA,EAAA,GACA,iBAAA,UAAA,GAAA,CAEA,IAAA,IAAA,KADA,GAAA,MAAA,EAAA,KACA,UAAA,GACA,GAAA,EAAA,KAAA,UAAA,GAAA,GAAA,KAEA,EAAA,EAAA,MAAA,GAAA,QAEA,EAAA,UAAA,GAEA,EAAA,KAAA,GAEA,EAAA,EAAA,gBAAA,MAAA,UAAA,MAAA,KAAA,GAAA,KAAA,IAAA,MAAA,IAAA,OAAA,OACA,GAAA,EAEA,OAAA,EAAA,MAAA,KAAA,YACA,GAGA,IAsEA,EAtEA,EAAA,GAEA,SAAA,EAAA,EAAA,GACA,MAAA,EAAA,oBACA,EAAA,mBAAA,EAAA,GAEA,EAAA,KACA,EAAA,GACA,EAAA,IAAA,GAOA,SAAA,EAAA,GACA,OAAA,aAAA,UAAA,sBAAA,OAAA,UAAA,SAAA,KAAA,GAsBA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,EAAA,GAAA,GACA,IAAA,KAAA,EACA,EAAA,EAAA,KACA,EAAA,EAAA,KAAA,EAAA,EAAA,KACA,EAAA,GAAA,GACA,EAAA,EAAA,GAAA,EAAA,IACA,EAAA,EAAA,GAAA,EAAA,KACA,MAAA,EAAA,GACA,EAAA,GAAA,EAAA,UAEA,EAAA,IAIA,IAAA,KAAA,EACA,EAAA,EAAA,KACA,EAAA,EAAA,IACA,EAAA,EAAA,MAEA,EAAA,GAAA,EAAA,GAAA,EAAA,KAGA,OAAA,EAGA,SAAA,EAAA,GACA,MAAA,GACA,KAAA,IAAA,GAtDA,EAAA,6BAAA,EACA,EAAA,mBAAA,KA4DA,EADA,OAAA,KACA,OAAA,KAEA,SAAA,GACA,IAAA,EAAA,EAAA,GACA,IAAA,KAAA,EACA,EAAA,EAAA,IACA,EAAA,KAAA,GAGA,OAAA,GAoFA,IAAA,EAAA,GAEA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,cACA,EAAA,GAAA,EAAA,EAAA,KAAA,EAAA,GAAA,EAGA,SAAA,EAAA,GACA,MAAA,iBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAGA,SAAA,EAAA,GACA,IACA,EACA,EAFA,EAAA,GAIA,IAAA,KAAA,EACA,EAAA,EAAA,KACA,EAAA,EAAA,MAEA,EAAA,GAAA,EAAA,IAKA,OAAA,EAGA,IAAA,EAAA,GAEA,SAAA,EAAA,EAAA,GACA,EAAA,GAAA,EAcA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,GAAA,KAAA,IAAA,GACA,EAAA,EAAA,EAAA,OAEA,OADA,GAAA,EACA,EAAA,IAAA,GAAA,KACA,KAAA,IAAA,GAAA,KAAA,IAAA,EAAA,IAAA,WAAA,OAAA,GAAA,EAGA,IAAA,EAAA,uLAEA,EAAA,6CAEA,EAAA,GAEA,EAAA,GAMA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EACA,iBAAA,IACA,EAAA,WACA,OAAA,KAAA,OAGA,IACA,EAAA,GAAA,GAEA,IACA,EAAA,EAAA,IAAA,WACA,OAAA,EAAA,EAAA,MAAA,KAAA,WAAA,EAAA,GAAA,EAAA,MAGA,IACA,EAAA,GAAA,WACA,OAAA,KAAA,aAAA,QAAA,EAAA,MAAA,KAAA,WAAA,KAiCA,SAAA,EAAA,EAAA,GACA,OAAA,EAAA,WAIA,EAAA,EAAA,EAAA,EAAA,cACA,EAAA,GAAA,EAAA,IA3BA,SAAA,GACA,IAAA,EAAA,EARA,EAQA,EAAA,EAAA,MAAA,GAEA,IAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IACA,EAAA,EAAA,IACA,EAAA,GAAA,EAAA,EAAA,IAEA,EAAA,IAdA,EAcA,EAAA,IAbA,MAAA,YACA,EAAA,QAAA,WAAA,IAEA,EAAA,QAAA,MAAA,IAcA,OAAA,SAAA,GACA,IAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,EAAA,EAAA,IACA,GAAA,EAAA,EAAA,IAAA,EAAA,GAAA,KAAA,EAAA,GAAA,EAAA,GAEA,OAAA,GAWA,CAAA,GAEA,EAAA,GAAA,IANA,EAAA,aAAA,cASA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAEA,SAAA,EAAA,GACA,OAAA,EAAA,eAAA,IAAA,EAIA,IADA,EAAA,UAAA,EACA,GAAA,GAAA,EAAA,KAAA,IACA,EAAA,EAAA,QAAA,EAAA,GACA,EAAA,UAAA,EACA,GAAA,EAGA,OAAA,EAGA,IAAA,EAAA,KACA,EAAA,OACA,EAAA,QACA,EAAA,QACA,EAAA,aACA,EAAA,QACA,EAAA,YACA,EAAA,gBACA,EAAA,UACA,GAAA,UACA,GAAA,eAEA,GAAA,MACA,GAAA,WAEA,GAAA,qBACA,GAAA,0BAMA,GAAA,wJAEA,GAAA,GAEA,SAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,GAAA,EAAA,SAAA,EAAA,GACA,OAAA,GAAA,EAAA,EAAA,GAIA,SAAA,GAAA,EAAA,GACA,OAAA,EAAA,GAAA,GAIA,GAAA,GAAA,EAAA,QAAA,EAAA,SAHA,IAAA,OAQA,GARA,EAQA,QAAA,KAAA,IAAA,QAAA,sCAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,OAAA,GAAA,GAAA,GAAA,MAIA,SAAA,GAAA,GACA,OAAA,EAAA,QAAA,yBAAA,QAGA,IAAA,GAAA,GAEA,SAAA,GAAA,EAAA,GACA,IAAA,EAAA,EAAA,EASA,IARA,iBAAA,IACA,EAAA,CAAA,IAEA,EAAA,KACA,EAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,KAGA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,IAAA,EAIA,SAAA,GAAA,EAAA,GACA,GAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,GAAA,EAAA,KAIA,SAAA,GAAA,EAAA,EAAA,GACA,MAAA,GAAA,EAAA,GAAA,IACA,GAAA,GAAA,EAAA,EAAA,GAAA,EAAA,GAIA,IAAA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,EA8CA,SAAA,GAAA,GACA,OAAA,GAAA,GAAA,IAAA,IAGA,SAAA,GAAA,GACA,OAAA,EAAA,GAAA,GAAA,EAAA,KAAA,GAAA,EAAA,KAAA,EA/CA,EAAA,IAAA,EAAA,EAAA,WACA,IAAA,EAAA,KAAA,OACA,OAAA,GAAA,KAAA,GAAA,EAAA,IAAA,IAGA,EAAA,EAAA,CAAA,KAAA,GAAA,EAAA,WACA,OAAA,KAAA,OAAA,MAGA,EAAA,EAAA,CAAA,OAAA,GAAA,EAAA,QACA,EAAA,EAAA,CAAA,QAAA,GAAA,EAAA,QACA,EAAA,EAAA,CAAA,SAAA,GAAA,GAAA,EAAA,QAIA,EAAA,OAAA,KAIA,EAAA,OAAA,GAIA,GAAA,IAAA,IACA,GAAA,KAAA,EAAA,GACA,GAAA,OAAA,GAAA,GACA,GAAA,QAAA,GAAA,GACA,GAAA,SAAA,GAAA,GAEA,GAAA,CAAA,QAAA,UAAA,IACA,GAAA,OAAA,SAAA,EAAA,GACA,EAAA,IAAA,IAAA,EAAA,OAAA,EAAA,kBAAA,GAAA,EAAA,KAEA,GAAA,KAAA,SAAA,EAAA,GACA,EAAA,IAAA,EAAA,kBAAA,KAEA,GAAA,IAAA,SAAA,EAAA,GACA,EAAA,IAAA,SAAA,EAAA,MAeA,EAAA,kBAAA,SAAA,GACA,OAAA,EAAA,IAAA,EAAA,GAAA,GAAA,KAAA,MAKA,IAiEA,GAjEA,GAAA,GAAA,YAAA,GAMA,SAAA,GAAA,EAAA,GACA,OAAA,SAAA,GACA,OAAA,MAAA,GACA,GAAA,KAAA,EAAA,GACA,EAAA,aAAA,KAAA,GACA,MAEA,GAAA,KAAA,IAKA,SAAA,GAAA,EAAA,GACA,OAAA,EAAA,UACA,EAAA,GAAA,OAAA,EAAA,OAAA,MAAA,IAAA,KAAA,IAGA,SAAA,GAAA,EAAA,EAAA,GACA,EAAA,YAAA,MAAA,KACA,aAAA,GAAA,GAAA,EAAA,SAAA,IAAA,EAAA,SAAA,KAAA,EAAA,OACA,EAAA,GAAA,OAAA,EAAA,OAAA,MAAA,IAAA,GAAA,EAAA,EAAA,QAAA,GAAA,EAAA,EAAA,UAGA,EAAA,GAAA,OAAA,EAAA,OAAA,MAAA,IAAA,GAAA,IAqDA,SAAA,GAAA,EAAA,GACA,GAAA,MAAA,IAAA,MAAA,GACA,OAAA,IAEA,IAzBA,EAyBA,GAAA,GAzBA,EAyBA,IAxBA,GAAA,EA0BA,OADA,IAAA,EAAA,GAAA,GACA,IAAA,EAAA,GAAA,GAAA,GAAA,GAAA,GAAA,EAAA,EAAA,EApBA,GADA,MAAA,UAAA,QACA,MAAA,UAAA,QAEA,SAAA,GAEA,IAAA,EACA,IAAA,EAAA,EAAA,EAAA,KAAA,SAAA,EACA,GAAA,KAAA,KAAA,EACA,OAAA,EAGA,OAAA,GAeA,EAAA,IAAA,CAAA,KAAA,GAAA,KAAA,WACA,OAAA,KAAA,QAAA,IAGA,EAAA,MAAA,EAAA,EAAA,SAAA,GACA,OAAA,KAAA,aAAA,YAAA,KAAA,KAGA,EAAA,OAAA,EAAA,EAAA,SAAA,GACA,OAAA,KAAA,aAAA,OAAA,KAAA,KAKA,EAAA,QAAA,KAIA,EAAA,QAAA,GAIA,GAAA,IAAA,GACA,GAAA,KAAA,EAAA,GACA,GAAA,MAAA,SAAA,EAAA,GACA,OAAA,EAAA,iBAAA,KAEA,GAAA,OAAA,SAAA,EAAA,GACA,OAAA,EAAA,YAAA,KAGA,GAAA,CAAA,IAAA,MAAA,SAAA,EAAA,GACA,EAAA,IAAA,EAAA,GAAA,IAGA,GAAA,CAAA,MAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,QAAA,YAAA,EAAA,EAAA,EAAA,SAEA,MAAA,EACA,EAAA,IAAA,EAEA,EAAA,GAAA,aAAA,IAMA,IAAA,GAAA,gCACA,GAAA,wFAAA,MAAA,KAUA,IAAA,GAAA,kDAAA,MAAA,KA2FA,SAAA,GAAA,EAAA,GACA,IAAA,EAEA,IAAA,EAAA,UAEA,OAAA,EAGA,GAAA,iBAAA,EACA,GAAA,QAAA,KAAA,GACA,EAAA,EAAA,QAIA,IAAA,EAFA,EAAA,EAAA,aAAA,YAAA,IAGA,OAAA,EAOA,OAFA,EAAA,KAAA,IAAA,EAAA,OAAA,GAAA,EAAA,OAAA,IACA,EAAA,GAAA,OAAA,EAAA,OAAA,MAAA,IAAA,SAAA,EAAA,GACA,EAGA,SAAA,GAAA,GACA,OAAA,MAAA,GACA,GAAA,KAAA,GACA,EAAA,aAAA,MAAA,GACA,MAEA,GAAA,KAAA,SAQA,IAAA,GAAA,GAoBA,IAAA,GAAA,GAoBA,SAAA,KACA,SAAA,EAAA,EAAA,GACA,OAAA,EAAA,OAAA,EAAA,OAGA,IACA,EAAA,EADA,EAAA,GAAA,EAAA,GAAA,EAAA,GAEA,IAAA,EAAA,EAAA,EAAA,GAAA,IAEA,EAAA,EAAA,CAAA,IAAA,IACA,EAAA,KAAA,KAAA,YAAA,EAAA,KACA,EAAA,KAAA,KAAA,OAAA,EAAA,KACA,EAAA,KAAA,KAAA,OAAA,EAAA,KACA,EAAA,KAAA,KAAA,YAAA,EAAA,KAOA,IAHA,EAAA,KAAA,GACA,EAAA,KAAA,GACA,EAAA,KAAA,GACA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,GAAA,GAAA,EAAA,IACA,EAAA,GAAA,GAAA,EAAA,IAEA,IAAA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,GAAA,GAAA,EAAA,IAGA,KAAA,aAAA,IAAA,OAAA,KAAA,EAAA,KAAA,KAAA,IAAA,KACA,KAAA,kBAAA,KAAA,aACA,KAAA,mBAAA,IAAA,OAAA,KAAA,EAAA,KAAA,KAAA,IAAA,KACA,KAAA,wBAAA,IAAA,OAAA,KAAA,EAAA,KAAA,KAAA,IAAA,KAeA,SAAA,GAAA,GACA,IAAA,EAAA,IAAA,KAAA,KAAA,IAAA,MAAA,KAAA,YAMA,OAHA,EAAA,KAAA,GAAA,GAAA,SAAA,EAAA,mBACA,EAAA,eAAA,GAEA,EAIA,SAAA,GAAA,EAAA,EAAA,GACA,IACA,EAAA,EAAA,EAAA,EAIA,SAFA,EAAA,GAAA,EAAA,EAAA,GAAA,YAAA,GAAA,GAEA,EAAA,EAIA,SAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,IAGA,EAAA,EADA,EAAA,EAAA,GAAA,EAAA,IAFA,EAAA,EAAA,GAAA,EACA,GAAA,EAAA,EAAA,GAeA,OAXA,GAAA,EAEA,EAAA,GADA,EAAA,EAAA,GACA,EACA,EAAA,GAAA,IACA,EAAA,EAAA,EACA,EAAA,EAAA,GAAA,KAEA,EAAA,EACA,EAAA,GAGA,CACA,KAAA,EACA,UAAA,GAIA,SAAA,GAAA,EAAA,EAAA,GACA,IAEA,EAAA,EAFA,EAAA,GAAA,EAAA,OAAA,EAAA,GACA,EAAA,KAAA,OAAA,EAAA,YAAA,EAAA,GAAA,GAAA,EAcA,OAXA,EAAA,EAEA,EAAA,EAAA,GADA,EAAA,EAAA,OAAA,EACA,EAAA,GACA,EAAA,GAAA,EAAA,OAAA,EAAA,IACA,EAAA,EAAA,GAAA,EAAA,OAAA,EAAA,GACA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,OACA,EAAA,GAGA,CACA,KAAA,EACA,KAAA,GAIA,SAAA,GAAA,EAAA,EAAA,GACA,IAAA,EAAA,GAAA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,EAAA,EAAA,GACA,OAAA,GAAA,GAAA,EAAA,GAAA,EAKA,EAAA,IAAA,CAAA,KAAA,GAAA,KAAA,QACA,EAAA,IAAA,CAAA,KAAA,GAAA,KAAA,WAIA,EAAA,OAAA,KACA,EAAA,UAAA,KAIA,EAAA,OAAA,GACA,EAAA,UAAA,GAIA,GAAA,IAAA,GACA,GAAA,KAAA,EAAA,GACA,GAAA,IAAA,GACA,GAAA,KAAA,EAAA,GAEA,GAAA,CAAA,IAAA,KAAA,IAAA,MAAA,SAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,KAsCA,EAAA,IAAA,EAAA,KAAA,OAEA,EAAA,KAAA,EAAA,EAAA,SAAA,GACA,OAAA,KAAA,aAAA,YAAA,KAAA,KAGA,EAAA,MAAA,EAAA,EAAA,SAAA,GACA,OAAA,KAAA,aAAA,cAAA,KAAA,KAGA,EAAA,OAAA,EAAA,EAAA,SAAA,GACA,OAAA,KAAA,aAAA,SAAA,KAAA,KAGA,EAAA,IAAA,EAAA,EAAA,WACA,EAAA,IAAA,EAAA,EAAA,cAIA,EAAA,MAAA,KACA,EAAA,UAAA,KACA,EAAA,aAAA,KAGA,EAAA,MAAA,IACA,EAAA,UAAA,IACA,EAAA,aAAA,IAIA,GAAA,IAAA,GACA,GAAA,IAAA,GACA,GAAA,IAAA,GACA,GAAA,KAAA,SAAA,EAAA,GACA,OAAA,EAAA,iBAAA,KAEA,GAAA,MAAA,SAAA,EAAA,GACA,OAAA,EAAA,mBAAA,KAEA,GAAA,OAAA,SAAA,EAAA,GACA,OAAA,EAAA,cAAA,KAGA,GAAA,CAAA,KAAA,MAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,QAAA,cAAA,EAAA,EAAA,EAAA,SAEA,MAAA,EACA,EAAA,EAAA,EAEA,EAAA,GAAA,eAAA,IAIA,GAAA,CAAA,IAAA,IAAA,KAAA,SAAA,EAAA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,KA+BA,IAAA,GAAA,2DAAA,MAAA,KAUA,IAAA,GAAA,8BAAA,MAAA,KAKA,IAAA,GAAA,uBAAA,MAAA,KAqJA,IAAA,GAAA,GAoBA,IAAA,GAAA,GAoBA,IAAA,GAAA,GAqBA,SAAA,KACA,SAAA,EAAA,EAAA,GACA,OAAA,EAAA,OAAA,EAAA,OAGA,IACA,EAAA,EAAA,EAAA,EAAA,EADA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,GAEA,IAAA,EAAA,EAAA,EAAA,EAAA,IAEA,EAAA,EAAA,CAAA,IAAA,IAAA,IAAA,GACA,EAAA,KAAA,YAAA,EAAA,IACA,EAAA,KAAA,cAAA,EAAA,IACA,EAAA,KAAA,SAAA,EAAA,IACA,EAAA,KAAA,GACA,EAAA,KAAA,GACA,EAAA,KAAA,GACA,EAAA,KAAA,GACA,EAAA,KAAA,GACA,EAAA,KAAA,GAQA,IAJA,EAAA,KAAA,GACA,EAAA,KAAA,GACA,EAAA,KAAA,GACA,EAAA,KAAA,GACA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,EAAA,IACA,EAAA,GAAA,GAAA,EAAA,IACA,EAAA,GAAA,GAAA,EAAA,IAGA,KAAA,eAAA,IAAA,OAAA,KAAA,EAAA,KAAA,KAAA,IAAA,KACA,KAAA,oBAAA,KAAA,eACA,KAAA,kBAAA,KAAA,eAEA,KAAA,qBAAA,IAAA,OAAA,KAAA,EAAA,KAAA,KAAA,IAAA,KACA,KAAA,0BAAA,IAAA,OAAA,KAAA,EAAA,KAAA,KAAA,IAAA,KACA,KAAA,wBAAA,IAAA,OAAA,KAAA,EAAA,KAAA,KAAA,IAAA,KAKA,SAAA,KACA,OAAA,KAAA,QAAA,IAAA,GA6BA,SAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,WACA,OAAA,KAAA,aAAA,SAAA,KAAA,QAAA,KAAA,UAAA,KAgBA,SAAA,GAAA,EAAA,GACA,OAAA,EAAA,eAzCA,EAAA,IAAA,CAAA,KAAA,GAAA,EAAA,QACA,EAAA,IAAA,CAAA,KAAA,GAAA,EAAA,IACA,EAAA,IAAA,CAAA,KAAA,GAAA,EANA,WACA,OAAA,KAAA,SAAA,KAOA,EAAA,MAAA,EAAA,EAAA,WACA,MAAA,GAAA,GAAA,MAAA,MAAA,EAAA,KAAA,UAAA,KAGA,EAAA,QAAA,EAAA,EAAA,WACA,MAAA,GAAA,GAAA,MAAA,MAAA,EAAA,KAAA,UAAA,GACA,EAAA,KAAA,UAAA,KAGA,EAAA,MAAA,EAAA,EAAA,WACA,MAAA,GAAA,KAAA,QAAA,EAAA,KAAA,UAAA,KAGA,EAAA,QAAA,EAAA,EAAA,WACA,MAAA,GAAA,KAAA,QAAA,EAAA,KAAA,UAAA,GACA,EAAA,KAAA,UAAA,KASA,GAAA,KAAA,GACA,GAAA,KAAA,GAIA,EAAA,OAAA,KAGA,EAAA,OAAA,IAQA,GAAA,IAAA,IACA,GAAA,IAAA,IACA,GAAA,IAAA,GACA,GAAA,IAAA,GACA,GAAA,IAAA,GACA,GAAA,KAAA,EAAA,GACA,GAAA,KAAA,EAAA,GACA,GAAA,KAAA,EAAA,GAEA,GAAA,MAAA,GACA,GAAA,QAAA,GACA,GAAA,MAAA,GACA,GAAA,QAAA,GAEA,GAAA,CAAA,IAAA,MAAA,IACA,GAAA,CAAA,IAAA,MAAA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,GACA,EAAA,IAAA,KAAA,EAAA,EAAA,IAEA,GAAA,CAAA,IAAA,KAAA,SAAA,EAAA,EAAA,GACA,EAAA,MAAA,EAAA,QAAA,KAAA,GACA,EAAA,UAAA,IAEA,GAAA,CAAA,IAAA,MAAA,SAAA,EAAA,EAAA,GACA,EAAA,IAAA,EAAA,GACA,EAAA,GAAA,SAAA,IAEA,GAAA,MAAA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,OAAA,EACA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,IACA,EAAA,IAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,SAAA,IAEA,GAAA,QAAA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,OAAA,EACA,EAAA,EAAA,OAAA,EACA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,IACA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,IACA,EAAA,IAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,SAAA,IAEA,GAAA,MAAA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,OAAA,EACA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,IACA,EAAA,IAAA,EAAA,EAAA,OAAA,MAEA,GAAA,QAAA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,OAAA,EACA,EAAA,EAAA,OAAA,EACA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,IACA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,IACA,EAAA,IAAA,EAAA,EAAA,OAAA,MA2BA,IAyBA,GAzBA,GAAA,GAAA,SAAA,GAEA,GAAA,CACA,SAh1CA,CACA,QAAA,gBACA,QAAA,mBACA,SAAA,eACA,QAAA,oBACA,SAAA,sBACA,SAAA,KA20CA,eAn0CA,CACA,IAAA,YACA,GAAA,SACA,EAAA,aACA,GAAA,eACA,IAAA,sBACA,KAAA,6BA8zCA,YA5yCA,eA6yCA,QAvyCA,KAwyCA,uBAvyCA,UAwyCA,aAlyCA,CACA,OAAA,QACA,KAAA,SACA,EAAA,gBACA,GAAA,aACA,EAAA,WACA,GAAA,aACA,EAAA,UACA,GAAA,WACA,EAAA,QACA,GAAA,UACA,EAAA,UACA,GAAA,YACA,EAAA,SACA,GAAA,YAsxCA,OAAA,GACA,YAAA,GAEA,KA3gBA,CACA,IAAA,EACA,IAAA,GA2gBA,SAAA,GACA,YAAA,GACA,cAAA,GAEA,cAnCA,iBAuCA,GAAA,GACA,GAAA,GAGA,SAAA,GAAA,GACA,OAAA,EAAA,EAAA,cAAA,QAAA,IAAA,KAAA,EA8BA,SAAA,GAAA,GACA,IAAA,EAAA,KAEA,IAAA,GAAA,IAAA,oBAAA,QACA,QAAA,OAAA,QACA,IACA,EAAA,GAAA,MACA,QACA,YAAA,GACA,GAAA,GACA,MAAA,IAEA,OAAA,GAAA,GAMA,SAAA,GAAA,EAAA,GACA,IAAA,EAqBA,OApBA,KAEA,EADA,EAAA,GACA,GAAA,GAGA,GAAA,EAAA,IAKA,GAAA,EAGA,oBAAA,SAAA,QAAA,MAEA,QAAA,KAAA,UAAA,EAAA,2CAKA,GAAA,MAGA,SAAA,GAAA,EAAA,GACA,GAAA,OAAA,EAAA,CACA,IAAA,EAAA,EAAA,GAEA,GADA,EAAA,KAAA,EACA,MAAA,GAAA,GACA,EAAA,uBACA,2OAIA,EAAA,GAAA,GAAA,aACA,GAAA,MAAA,EAAA,aACA,GAAA,MAAA,GAAA,EAAA,cACA,EAAA,GAAA,EAAA,cAAA,YACA,CAEA,GAAA,OADA,EAAA,GAAA,EAAA,eAWA,OAPA,GAAA,EAAA,gBACA,GAAA,EAAA,cAAA,IAEA,GAAA,EAAA,cAAA,KAAA,CACA,KAAA,EACA,OAAA,IAEA,KATA,EAAA,EAAA,QA2BA,OAdA,GAAA,GAAA,IAAA,EAAA,EAAA,EAAA,IAEA,GAAA,IACA,GAAA,GAAA,QAAA,SAAA,GACA,GAAA,EAAA,KAAA,EAAA,UAOA,GAAA,GAGA,GAAA,GAIA,cADA,GAAA,GACA,KAiCA,SAAA,GAAA,GACA,IAAA,EAMA,GAJA,GAAA,EAAA,SAAA,EAAA,QAAA,QACA,EAAA,EAAA,QAAA,QAGA,EACA,OAAA,GAGA,IAAA,EAAA,GAAA,CAGA,GADA,EAAA,GAAA,GAEA,OAAA,EAEA,EAAA,CAAA,GAGA,OAxKA,SAAA,GAGA,IAFA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAEA,EAAA,EAAA,QAAA,CAKA,IAHA,GADA,EAAA,GAAA,EAAA,IAAA,MAAA,MACA,OAEA,GADA,EAAA,GAAA,EAAA,EAAA,KACA,EAAA,MAAA,KAAA,KACA,EAAA,GAAA,CAEA,GADA,EAAA,GAAA,EAAA,MAAA,EAAA,GAAA,KAAA,MAEA,OAAA,EAEA,GAAA,GAAA,EAAA,QAAA,GAAA,EAAA,EAAA,GAAA,IAAA,EAAA,EAEA,MAEA,IAEA,IAEA,OAAA,GAmJA,CAAA,GAOA,SAAA,GAAA,GACA,IAAA,EACA,EAAA,EAAA,GAyBA,OAvBA,IAAA,IAAA,EAAA,GAAA,WACA,EACA,EAAA,IAAA,GAAA,EAAA,IAAA,GAAA,GACA,EAAA,IAAA,GAAA,EAAA,IAAA,GAAA,EAAA,IAAA,EAAA,KAAA,GACA,EAAA,IAAA,GAAA,EAAA,IAAA,IAAA,KAAA,EAAA,MAAA,IAAA,EAAA,KAAA,IAAA,EAAA,KAAA,IAAA,EAAA,KAAA,GACA,EAAA,IAAA,GAAA,EAAA,IAAA,GAAA,GACA,EAAA,IAAA,GAAA,EAAA,IAAA,GAAA,GACA,EAAA,IAAA,GAAA,EAAA,IAAA,IAAA,IACA,EAEA,EAAA,GAAA,qBAAA,EAAA,IAAA,EAAA,MACA,EAAA,IAEA,EAAA,GAAA,iBAAA,IAAA,IACA,EAAA,IAEA,EAAA,GAAA,mBAAA,IAAA,IACA,EAAA,IAGA,EAAA,GAAA,SAAA,GAGA,EAIA,SAAA,GAAA,EAAA,EAAA,GACA,OAAA,MAAA,EACA,EAEA,MAAA,EACA,EAEA,EAgBA,SAAA,GAAA,GACA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,GAAA,CA6BA,IAzBA,EApBA,SAAA,GAEA,IAAA,EAAA,IAAA,KAAA,EAAA,OACA,OAAA,EAAA,QACA,CAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,cAEA,CAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAcA,CAAA,GAGA,EAAA,IAAA,MAAA,EAAA,GAAA,KAAA,MAAA,EAAA,GAAA,KA2DA,SAAA,GACA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAGA,GAAA,OADA,EAAA,EAAA,IACA,IAAA,MAAA,EAAA,GAAA,MAAA,EAAA,EACA,EAAA,EACA,EAAA,EAMA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,GAAA,KAAA,EAAA,GAAA,MACA,EAAA,GAAA,EAAA,EAAA,KACA,EAAA,GAAA,EAAA,EAAA,IACA,GAAA,EAAA,KACA,GAAA,OAEA,CACA,EAAA,EAAA,QAAA,MAAA,IACA,EAAA,EAAA,QAAA,MAAA,IAEA,IAAA,EAAA,GAAA,KAAA,EAAA,GAEA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,EAAA,MAGA,EAAA,GAAA,EAAA,EAAA,EAAA,MAEA,MAAA,EAAA,IAEA,EAAA,EAAA,GACA,GAAA,EAAA,KACA,GAAA,GAEA,MAAA,EAAA,GAEA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,GAAA,EAAA,EAAA,KACA,GAAA,IAIA,EAAA,EAGA,EAAA,GAAA,EAAA,GAAA,EAAA,EAAA,GACA,EAAA,GAAA,gBAAA,EACA,MAAA,EACA,EAAA,GAAA,kBAAA,GAEA,EAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,GAAA,IAAA,EAAA,KACA,EAAA,WAAA,EAAA,WA/GA,CAAA,GAIA,MAAA,EAAA,aACA,EAAA,GAAA,EAAA,GAAA,IAAA,EAAA,MAEA,EAAA,WAAA,GAAA,IAAA,IAAA,EAAA,cACA,EAAA,GAAA,oBAAA,GAGA,EAAA,GAAA,EAAA,EAAA,EAAA,YACA,EAAA,GAAA,IAAA,EAAA,cACA,EAAA,GAAA,IAAA,EAAA,cAQA,EAAA,EAAA,EAAA,GAAA,MAAA,EAAA,GAAA,KAAA,EACA,EAAA,GAAA,GAAA,EAAA,GAAA,EAAA,GAIA,KAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,EAAA,GAAA,MAAA,EAAA,GAAA,GAAA,IAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GAIA,KAAA,EAAA,GAAA,KACA,IAAA,EAAA,GAAA,KACA,IAAA,EAAA,GAAA,KACA,IAAA,EAAA,GAAA,MACA,EAAA,UAAA,EACA,EAAA,GAAA,IAAA,GAGA,EAAA,IAAA,EAAA,QAAA,GA76BA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAGA,IAAA,EAAA,IAAA,KAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAMA,OAHA,EAAA,KAAA,GAAA,GAAA,SAAA,EAAA,gBACA,EAAA,YAAA,GAEA,IAo6BA,MAAA,KAAA,GACA,EAAA,EAAA,QAAA,EAAA,GAAA,YAAA,EAAA,GAAA,SAIA,MAAA,EAAA,MACA,EAAA,GAAA,cAAA,EAAA,GAAA,gBAAA,EAAA,MAGA,EAAA,WACA,EAAA,GAAA,IAAA,IAIA,EAAA,SAAA,IAAA,EAAA,GAAA,GAAA,EAAA,GAAA,IAAA,IACA,EAAA,GAAA,iBAAA,IA+DA,IAAA,GAAA,mJACA,GAAA,8IAEA,GAAA,wBAEA,GAAA,CACA,CAAA,eAAA,uBACA,CAAA,aAAA,mBACA,CAAA,eAAA,kBACA,CAAA,aAAA,eAAA,GACA,CAAA,WAAA,eACA,CAAA,UAAA,cAAA,GACA,CAAA,aAAA,cACA,CAAA,WAAA,SAEA,CAAA,aAAA,eACA,CAAA,YAAA,eAAA,GACA,CAAA,UAAA,UAIA,GAAA,CACA,CAAA,gBAAA,uBACA,CAAA,gBAAA,sBACA,CAAA,WAAA,kBACA,CAAA,QAAA,aACA,CAAA,cAAA,qBACA,CAAA,cAAA,oBACA,CAAA,SAAA,gBACA,CAAA,OAAA,YACA,CAAA,KAAA,SAGA,GAAA,sBAGA,SAAA,GAAA,GACA,IAAA,EAAA,EAGA,EAAA,EAAA,EAAA,EAFA,EAAA,EAAA,GACA,EAAA,GAAA,KAAA,IAAA,GAAA,KAAA,GAGA,GAAA,EAAA,CAGA,IAFA,EAAA,GAAA,KAAA,EAEA,EAAA,EAAA,EAAA,GAAA,OAAA,EAAA,EAAA,IACA,GAAA,GAAA,GAAA,GAAA,KAAA,EAAA,IAAA,CACA,EAAA,GAAA,GAAA,GACA,GAAA,IAAA,GAAA,GAAA,GACA,MAGA,GAAA,MAAA,EAEA,YADA,EAAA,UAAA,GAGA,GAAA,EAAA,GAAA,CACA,IAAA,EAAA,EAAA,EAAA,GAAA,OAAA,EAAA,EAAA,IACA,GAAA,GAAA,GAAA,GAAA,KAAA,EAAA,IAAA,CAEA,GAAA,EAAA,IAAA,KAAA,GAAA,GAAA,GACA,MAGA,GAAA,MAAA,EAEA,YADA,EAAA,UAAA,GAIA,IAAA,GAAA,MAAA,EAEA,YADA,EAAA,UAAA,GAGA,GAAA,EAAA,GAAA,CACA,IAAA,GAAA,KAAA,EAAA,IAIA,YADA,EAAA,UAAA,GAFA,EAAA,IAMA,EAAA,GAAA,GAAA,GAAA,KAAA,GAAA,IACA,GAAA,QAEA,EAAA,UAAA,EAKA,IAAA,GAAA,0LAEA,SAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,CAeA,SAAA,GACA,IAAA,EAAA,SAAA,EAAA,IACA,GAAA,GAAA,GACA,OAAA,IAAA,EACA,GAAA,GAAA,IACA,OAAA,KAAA,EAEA,OAAA,EArBA,CAAA,GACA,GAAA,QAAA,GACA,SAAA,EAAA,IACA,SAAA,EAAA,IACA,SAAA,EAAA,KAOA,OAJA,GACA,EAAA,KAAA,SAAA,EAAA,KAGA,EAgCA,IAAA,GAAA,CACA,GAAA,EACA,IAAA,EACA,KAAA,IACA,KAAA,IACA,KAAA,IACA,KAAA,IACA,KAAA,IACA,KAAA,IACA,KAAA,IACA,KAAA,KAiBA,SAAA,GAAA,GACA,IAAA,EAAA,GAAA,KAAA,EAAA,GA7CA,QAAA,oBAAA,KAAA,QAAA,WAAA,KAAA,QAAA,SAAA,IAAA,QAAA,SAAA,KA8CA,GAAA,EAAA,CACA,IAAA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,IACA,IA7CA,SAAA,EAAA,EAAA,GACA,OAAA,GAEA,GAAA,QAAA,KACA,IAAA,KAAA,EAAA,GAAA,EAAA,GAAA,EAAA,IAAA,WAEA,EAAA,GAAA,iBAAA,EACA,EAAA,UAAA,GACA,GAqCA,CAAA,EAAA,GAAA,EAAA,GACA,OAGA,EAAA,GAAA,EACA,EAAA,KAvBA,SAAA,EAAA,EAAA,GACA,GAAA,EACA,OAAA,GAAA,GACA,GAAA,EAEA,OAAA,EAEA,IAAA,EAAA,SAAA,EAAA,IACA,EAAA,EAAA,IACA,OADA,EAAA,GAAA,IACA,GAAA,EAcA,CAAA,EAAA,GAAA,EAAA,GAAA,EAAA,KAEA,EAAA,GAAA,GAAA,MAAA,KAAA,EAAA,IACA,EAAA,GAAA,cAAA,EAAA,GAAA,gBAAA,EAAA,MAEA,EAAA,GAAA,SAAA,OAEA,EAAA,UAAA,EAgDA,SAAA,GAAA,GAEA,GAAA,EAAA,KAAA,EAAA,SAIA,GAAA,EAAA,KAAA,EAAA,SAAA,CAIA,EAAA,GAAA,GACA,EAAA,GAAA,OAAA,EAGA,IACA,EAAA,EAAA,EAAA,EAAA,EADA,EAAA,GAAA,EAAA,GAEA,EAAA,EAAA,OACA,EAAA,EAIA,IAFA,EAAA,EAAA,EAAA,GAAA,EAAA,SAAA,MAAA,IAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,IACA,GAAA,EAAA,MAAA,GAAA,EAAA,KAAA,IAAA,OAIA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,KACA,OAAA,GACA,EAAA,GAAA,YAAA,KAAA,GAEA,EAAA,EAAA,MAAA,EAAA,QAAA,GAAA,EAAA,QACA,GAAA,EAAA,QAGA,EAAA,IACA,EACA,EAAA,GAAA,OAAA,EAGA,EAAA,GAAA,aAAA,KAAA,GAEA,GAAA,EAAA,EAAA,IAEA,EAAA,UAAA,GACA,EAAA,GAAA,aAAA,KAAA,GAKA,EAAA,GAAA,cAAA,EAAA,EACA,EAAA,OAAA,GACA,EAAA,GAAA,YAAA,KAAA,GAIA,EAAA,GAAA,KAAA,KACA,IAAA,EAAA,GAAA,SACA,EAAA,GAAA,IAAA,IACA,EAAA,GAAA,aAAA,GAGA,EAAA,GAAA,gBAAA,EAAA,GAAA,MAAA,GACA,EAAA,GAAA,SAAA,EAAA,UAEA,EAAA,GAAA,IAOA,SAAA,EAAA,EAAA,GACA,IAAA,EAEA,GAAA,MAAA,EAEA,OAAA,EAEA,OAAA,MAAA,EAAA,aACA,EAAA,aAAA,EAAA,GACA,MAAA,EAAA,OAEA,EAAA,EAAA,KAAA,KACA,EAAA,KACA,GAAA,IAEA,GAAA,KAAA,IACA,EAAA,GAEA,GAGA,EA5BA,CAAA,EAAA,QAAA,EAAA,GAAA,IAAA,EAAA,WAEA,GAAA,GACA,GAAA,QA7DA,GAAA,QAJA,GAAA,GAmKA,SAAA,GAAA,GACA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,GAIA,OAFA,EAAA,QAAA,EAAA,SAAA,GAAA,EAAA,IAEA,OAAA,QAAA,IAAA,GAAA,KAAA,EACA,EAAA,CAAA,WAAA,KAGA,iBAAA,IACA,EAAA,GAAA,EAAA,EAAA,QAAA,SAAA,IAGA,EAAA,GACA,IAAA,EAAA,GAAA,KACA,EAAA,GACA,EAAA,GAAA,EACA,EAAA,GAtFA,SAAA,GACA,IAAA,EACA,EAEA,EACA,EACA,EAEA,GAAA,IAAA,EAAA,GAAA,OAGA,OAFA,EAAA,GAAA,eAAA,OACA,EAAA,GAAA,IAAA,KAAA,MAIA,IAAA,EAAA,EAAA,EAAA,EAAA,GAAA,OAAA,IACA,EAAA,EACA,EAAA,EAAA,GAAA,GACA,MAAA,EAAA,UACA,EAAA,QAAA,EAAA,SAEA,EAAA,GAAA,EAAA,GAAA,GACA,GAAA,GAEA,EAAA,KAKA,GAAA,EAAA,GAAA,cAGA,GAAA,GAAA,EAAA,GAAA,aAAA,OAEA,EAAA,GAAA,MAAA,GAEA,MAAA,GAAA,EAAA,KACA,EAAA,EACA,EAAA,IAIA,EAAA,EAAA,GAAA,GA8CA,CAAA,GACA,EACA,GAAA,GAYA,SAAA,GACA,IAAA,EAAA,EAAA,GACA,EAAA,GACA,EAAA,GAAA,IAAA,KAAA,EAAA,OACA,EAAA,GACA,EAAA,GAAA,IAAA,KAAA,EAAA,WACA,iBAAA,EAxPA,SAAA,GACA,IAAA,EAAA,GAAA,KAAA,EAAA,IAEA,OAAA,GAKA,GAAA,IACA,IAAA,EAAA,kBACA,EAAA,SAKA,GAAA,IACA,IAAA,EAAA,kBACA,EAAA,SAMA,EAAA,wBAAA,MAnBA,EAAA,GAAA,IAAA,MAAA,EAAA,IAqPA,CAAA,GACA,EAAA,IACA,EAAA,GAAA,EAAA,EAAA,MAAA,GAAA,SAAA,GACA,OAAA,SAAA,EAAA,MAEA,GAAA,IACA,EAAA,GAtEA,SAAA,GACA,IAAA,EAAA,GAAA,CAIA,IAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,EAAA,CAAA,EAAA,KAAA,EAAA,MAAA,EAAA,KAAA,EAAA,KAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,aAAA,SAAA,GACA,OAAA,GAAA,SAAA,EAAA,MAGA,GAAA,IA6DA,CAAA,GACA,EAAA,GAEA,EAAA,GAAA,IAAA,KAAA,GAEA,EAAA,wBAAA,GA7BA,CAAA,GAGA,EAAA,KACA,EAAA,GAAA,MAGA,IA0BA,SAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,IAnEA,EAmEA,EAAA,GAoBA,OAlBA,IAAA,IAAA,IAAA,IACA,EAAA,EACA,OAAA,IAGA,EAAA,IA3hFA,SAAA,GACA,GAAA,OAAA,oBACA,OAAA,IAAA,OAAA,oBAAA,GAAA,OAEA,IAAA,EACA,IAAA,KAAA,EACA,GAAA,EAAA,eAAA,GACA,OAAA,EAGA,OAAA,EAihFA,CAAA,IACA,EAAA,IAAA,IAAA,EAAA,UACA,OAAA,GAIA,EAAA,kBAAA,EACA,EAAA,QAAA,EAAA,OAAA,EACA,EAAA,GAAA,EACA,EAAA,GAAA,EACA,EAAA,GAAA,EACA,EAAA,QAAA,GArFA,EAAA,IAAA,EAAA,GAAA,GAuFA,MAtFA,WAEA,EAAA,IAAA,EAAA,KACA,EAAA,cAAA,GAGA,EAmFA,SAAA,GAAA,EAAA,EAAA,EAAA,GACA,OAAA,GAAA,EAAA,EAAA,EAAA,GAAA,GAxQA,EAAA,wBAAA,EACA,iVAIA,SAAA,GACA,EAAA,GAAA,IAAA,KAAA,EAAA,IAAA,EAAA,QAAA,OAAA,OAKA,EAAA,SAAA,aAGA,EAAA,SAAA,aA6PA,IAAA,GAAA,EACA,qGACA,WACA,IAAA,EAAA,GAAA,MAAA,KAAA,WACA,OAAA,KAAA,WAAA,EAAA,UACA,EAAA,KAAA,KAAA,EAEA,MAKA,GAAA,EACA,qGACA,WACA,IAAA,EAAA,GAAA,MAAA,KAAA,WACA,OAAA,KAAA,WAAA,EAAA,UACA,EAAA,KAAA,KAAA,EAEA,MAUA,SAAA,GAAA,EAAA,GACA,IAAA,EAAA,EAIA,GAHA,IAAA,EAAA,QAAA,EAAA,EAAA,MACA,EAAA,EAAA,KAEA,EAAA,OACA,OAAA,KAGA,IADA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,SAAA,EACA,EAAA,GAAA,YAAA,EAAA,GAAA,GAAA,KACA,EAAA,EAAA,IAGA,OAAA,EAgBA,IAIA,GAAA,CAAA,OAAA,UAAA,QAAA,OAAA,MAAA,OAAA,SAAA,SAAA,eAgCA,SAAA,GAAA,GACA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,MAAA,EACA,EAAA,EAAA,SAAA,EACA,EAAA,EAAA,OAAA,EACA,EAAA,EAAA,MAAA,EACA,EAAA,EAAA,KAAA,EACA,EAAA,EAAA,MAAA,EACA,EAAA,EAAA,QAAA,EACA,EAAA,EAAA,QAAA,EACA,EAAA,EAAA,aAAA,EAEA,KAAA,SA1CA,SAAA,GACA,IAAA,IAAA,KAAA,EACA,IAAA,IAAA,GAAA,KAAA,GAAA,IAAA,MAAA,EAAA,IAAA,MAAA,EAAA,IACA,OAAA,EAKA,IADA,IAAA,GAAA,EACA,EAAA,EAAA,EAAA,GAAA,SAAA,EACA,GAAA,EAAA,GAAA,IAAA,CACA,GAAA,EACA,OAAA,EAEA,WAAA,EAAA,GAAA,OAAA,EAAA,EAAA,GAAA,OACA,GAAA,GAKA,OAAA,EAuBA,CAAA,GAGA,KAAA,eAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EAAA,GAAA,GAGA,KAAA,OAAA,EACA,EAAA,EAIA,KAAA,SAAA,EACA,EAAA,EACA,GAAA,EAEA,KAAA,MAAA,GAEA,KAAA,QAAA,KAEA,KAAA,UAGA,SAAA,GAAA,GACA,OAAA,aAAA,GAGA,SAAA,GAAA,GACA,OAAA,EAAA,GACA,EAAA,KAAA,OAAA,EAAA,GAEA,KAAA,MAAA,GAMA,SAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,WACA,IAAA,EAAA,KAAA,YACA,EAAA,IAKA,OAJA,EAAA,IACA,GAAA,EACA,EAAA,KAEA,EAAA,KAAA,EAAA,IAAA,GAAA,EAAA,IAAA,EAAA,GAAA,KAIA,GAAA,IAAA,KACA,GAAA,KAAA,IAIA,GAAA,IAAA,IACA,GAAA,KAAA,IACA,GAAA,CAAA,IAAA,MAAA,SAAA,EAAA,EAAA,GACA,EAAA,SAAA,EACA,EAAA,KAAA,GAAA,GAAA,KAQA,IAAA,GAAA,kBAEA,SAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,IAAA,MAAA,GAEA,GAAA,OAAA,EACA,OAAA,KAGA,IACA,IADA,EAAA,EAAA,OAAA,IAAA,IACA,IAAA,MAAA,KAAA,CAAA,IAAA,EAAA,GACA,EAAA,GAAA,EAAA,GAAA,EAAA,EAAA,IAEA,OAAA,IAAA,EACA,EACA,MAAA,EAAA,GAAA,GAAA,EAIA,SAAA,GAAA,EAAA,GACA,IAAA,EAAA,EACA,OAAA,EAAA,QACA,EAAA,EAAA,QACA,GAAA,EAAA,IAAA,EAAA,GAAA,EAAA,UAAA,GAAA,GAAA,WAAA,EAAA,UAEA,EAAA,GAAA,QAAA,EAAA,GAAA,UAAA,GACA,EAAA,aAAA,GAAA,GACA,GAEA,GAAA,GAAA,QAIA,SAAA,GAAA,GAGA,OAAA,IAAA,KAAA,MAAA,EAAA,GAAA,oBAAA,IAqJA,SAAA,KACA,QAAA,KAAA,YAAA,KAAA,QAAA,IAAA,KAAA,SA/IA,EAAA,aAAA,aAmJA,IAAA,GAAA,2DAKA,GAAA,sKAEA,SAAA,GAAA,EAAA,GACA,IAGA,EACA,EACA,EALA,EAAA,EAEA,EAAA,KAuDA,OAlDA,GAAA,GACA,EAAA,CACA,GAAA,EAAA,cACA,EAAA,EAAA,MACA,EAAA,EAAA,SAEA,EAAA,IACA,EAAA,GACA,EACA,EAAA,GAAA,EAEA,EAAA,aAAA,IAEA,EAAA,GAAA,KAAA,KACA,EAAA,MAAA,EAAA,IAAA,EAAA,EACA,EAAA,CACA,EAAA,EACA,EAAA,EAAA,EAAA,KAAA,EACA,EAAA,EAAA,EAAA,KAAA,EACA,EAAA,EAAA,EAAA,KAAA,EACA,EAAA,EAAA,EAAA,KAAA,EACA,GAAA,EAAA,GAAA,IAAA,EAAA,MAAA,KAEA,EAAA,GAAA,KAAA,KACA,EAAA,MAAA,EAAA,IAAA,GAAA,EAAA,GAAA,GACA,EAAA,CACA,EAAA,GAAA,EAAA,GAAA,GACA,EAAA,GAAA,EAAA,GAAA,GACA,EAAA,GAAA,EAAA,GAAA,GACA,EAAA,GAAA,EAAA,GAAA,GACA,EAAA,GAAA,EAAA,GAAA,GACA,EAAA,GAAA,EAAA,GAAA,GACA,EAAA,GAAA,EAAA,GAAA,KAEA,MAAA,EACA,EAAA,GACA,iBAAA,IAAA,SAAA,GAAA,OAAA,KACA,EA0CA,SAAA,EAAA,GACA,IAAA,EACA,IAAA,EAAA,YAAA,EAAA,UACA,MAAA,CAAA,aAAA,EAAA,OAAA,GAGA,EAAA,GAAA,EAAA,GACA,EAAA,SAAA,GACA,EAAA,GAAA,EAAA,KAEA,EAAA,GAAA,EAAA,IACA,cAAA,EAAA,aACA,EAAA,QAAA,EAAA,QAGA,OAAA,EAzDA,CAAA,GAAA,EAAA,MAAA,GAAA,EAAA,MAEA,EAAA,IACA,GAAA,EAAA,aACA,EAAA,EAAA,EAAA,QAGA,EAAA,IAAA,GAAA,GAEA,GAAA,IAAA,EAAA,EAAA,aACA,EAAA,QAAA,EAAA,SAGA,EAMA,SAAA,GAAA,EAAA,GAIA,IAAA,EAAA,GAAA,WAAA,EAAA,QAAA,IAAA,MAEA,OAAA,MAAA,GAAA,EAAA,GAAA,EAGA,SAAA,GAAA,EAAA,GACA,IAAA,EAAA,CAAA,aAAA,EAAA,OAAA,GAUA,OARA,EAAA,OAAA,EAAA,QAAA,EAAA,QACA,IAAA,EAAA,OAAA,EAAA,QACA,EAAA,QAAA,IAAA,EAAA,OAAA,KAAA,QAAA,MACA,EAAA,OAGA,EAAA,cAAA,GAAA,EAAA,QAAA,IAAA,EAAA,OAAA,KAEA,EAsBA,SAAA,GAAA,EAAA,GACA,OAAA,SAAA,EAAA,GACA,IAAA,EAWA,OATA,OAAA,GAAA,OAAA,KACA,EAAA,EAAA,YAAA,EAAA,uDAAA,EAAA,kGAEA,EAAA,EAAA,EAAA,EAAA,EAAA,GAKA,GAAA,KADA,GADA,EAAA,iBAAA,GAAA,EAAA,EACA,GACA,GACA,MAIA,SAAA,GAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,cACA,EAAA,GAAA,EAAA,OACA,EAAA,GAAA,EAAA,SAEA,EAAA,YAKA,EAAA,MAAA,GAAA,EAEA,GACA,GAAA,EAAA,GAAA,EAAA,SAAA,EAAA,GAEA,GACA,GAAA,EAAA,OAAA,GAAA,EAAA,QAAA,EAAA,GAEA,GACA,EAAA,GAAA,QAAA,EAAA,GAAA,UAAA,EAAA,GAEA,GACA,EAAA,aAAA,EAAA,GAAA,IApFA,GAAA,GAAA,GAAA,UACA,GAAA,QAvVA,WACA,OAAA,GAAA,MA6aA,IAAA,GAAA,GAAA,EAAA,OACA,GAAA,IAAA,EAAA,YAqHA,SAAA,GAAA,EAAA,GAEA,IAAA,EAAA,IAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAEA,EAAA,EAAA,QAAA,IAAA,EAAA,UAcA,QAAA,GAXA,EAAA,EAAA,GAGA,EAAA,IAAA,EAFA,EAAA,QAAA,IAAA,EAAA,EAAA,YAMA,EAAA,IAFA,EAAA,QAAA,IAAA,EAAA,EAAA,UAEA,MAIA,EA6FA,SAAA,GAAA,GACA,IAAA,EAEA,YAAA,IAAA,EACA,KAAA,QAAA,OAGA,OADA,EAAA,GAAA,MAEA,KAAA,QAAA,GAEA,MApGA,EAAA,cAAA,uBACA,EAAA,iBAAA,yBAuGA,IAAA,GAAA,EACA,kJACA,SAAA,GACA,YAAA,IAAA,EACA,KAAA,aAEA,KAAA,OAAA,KAKA,SAAA,KACA,OAAA,KAAA,QAgIA,SAAA,GAAA,EAAA,GACA,EAAA,EAAA,CAAA,EAAA,EAAA,QAAA,EAAA,GA+DA,SAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,IAAA,EACA,OAAA,MAAA,EACA,GAAA,KAAA,EAAA,GAAA,MAGA,GADA,EAAA,GAAA,EAAA,EAAA,MAEA,EAAA,GAMA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,KAAA,EAAA,EAAA,WAKA,OAHA,KAAA,KAAA,EAAA,kBACA,KAAA,MAAA,EAAA,eACA,KAAA,KAAA,EAAA,cACA,MAXA,KAAA,KAAA,EAAA,EAAA,EAAA,EAAA,IAjFA,EAAA,EAAA,CAAA,KAAA,GAAA,EAAA,WACA,OAAA,KAAA,WAAA,MAGA,EAAA,EAAA,CAAA,KAAA,GAAA,EAAA,WACA,OAAA,KAAA,cAAA,MAOA,GAAA,OAAA,YACA,GAAA,QAAA,YACA,GAAA,OAAA,eACA,GAAA,QAAA,eAIA,EAAA,WAAA,MACA,EAAA,cAAA,MAIA,EAAA,WAAA,GACA,EAAA,cAAA,GAKA,GAAA,IAAA,IACA,GAAA,IAAA,IACA,GAAA,KAAA,EAAA,GACA,GAAA,KAAA,EAAA,GACA,GAAA,OAAA,GAAA,GACA,GAAA,OAAA,GAAA,GACA,GAAA,QAAA,GAAA,GACA,GAAA,QAAA,GAAA,GAEA,GAAA,CAAA,OAAA,QAAA,OAAA,SAAA,SAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,KAGA,GAAA,CAAA,KAAA,MAAA,SAAA,EAAA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,kBAAA,KAqDA,EAAA,IAAA,EAAA,KAAA,WAIA,EAAA,UAAA,KAIA,EAAA,UAAA,GAIA,GAAA,IAAA,GACA,GAAA,IAAA,SAAA,EAAA,GACA,EAAA,IAAA,GAAA,EAAA,GAAA,KAWA,EAAA,IAAA,CAAA,KAAA,GAAA,KAAA,QAIA,EAAA,OAAA,KAGA,EAAA,OAAA,GAIA,GAAA,IAAA,GACA,GAAA,KAAA,EAAA,GACA,GAAA,KAAA,SAAA,EAAA,GAEA,OAAA,EACA,EAAA,yBAAA,EAAA,cACA,EAAA,iCAGA,GAAA,CAAA,IAAA,MAAA,IACA,GAAA,KAAA,SAAA,EAAA,GACA,EAAA,IAAA,EAAA,EAAA,MAAA,GAAA,MAKA,IAAA,GAAA,GAAA,QAAA,GAIA,EAAA,MAAA,CAAA,OAAA,GAAA,OAAA,aAIA,EAAA,YAAA,OAGA,EAAA,YAAA,GAIA,GAAA,MAAA,GACA,GAAA,OAAA,GACA,GAAA,CAAA,MAAA,QAAA,SAAA,EAAA,EAAA,GACA,EAAA,WAAA,EAAA,KAcA,EAAA,IAAA,CAAA,KAAA,GAAA,EAAA,UAIA,EAAA,SAAA,KAIA,EAAA,SAAA,IAIA,GAAA,IAAA,GACA,GAAA,KAAA,EAAA,GACA,GAAA,CAAA,IAAA,MAAA,IAIA,IAAA,GAAA,GAAA,WAAA,GAIA,EAAA,IAAA,CAAA,KAAA,GAAA,EAAA,UAIA,EAAA,SAAA,KAIA,EAAA,SAAA,IAIA,GAAA,IAAA,GACA,GAAA,KAAA,EAAA,GACA,GAAA,CAAA,IAAA,MAAA,IAIA,IA+CA,GA/CA,GAAA,GAAA,WAAA,GAgDA,IA5CA,EAAA,IAAA,EAAA,EAAA,WACA,SAAA,KAAA,cAAA,OAGA,EAAA,EAAA,CAAA,KAAA,GAAA,EAAA,WACA,SAAA,KAAA,cAAA,MAGA,EAAA,EAAA,CAAA,MAAA,GAAA,EAAA,eACA,EAAA,EAAA,CAAA,OAAA,GAAA,EAAA,WACA,OAAA,GAAA,KAAA,gBAEA,EAAA,EAAA,CAAA,QAAA,GAAA,EAAA,WACA,OAAA,IAAA,KAAA,gBAEA,EAAA,EAAA,CAAA,SAAA,GAAA,EAAA,WACA,OAAA,IAAA,KAAA,gBAEA,EAAA,EAAA,CAAA,UAAA,GAAA,EAAA,WACA,OAAA,IAAA,KAAA,gBAEA,EAAA,EAAA,CAAA,WAAA,GAAA,EAAA,WACA,OAAA,IAAA,KAAA,gBAEA,EAAA,EAAA,CAAA,YAAA,GAAA,EAAA,WACA,OAAA,IAAA,KAAA,gBAMA,EAAA,cAAA,MAIA,EAAA,cAAA,IAIA,GAAA,IAAA,EAAA,GACA,GAAA,KAAA,EAAA,GACA,GAAA,MAAA,EAAA,GAGA,GAAA,OAAA,GAAA,QAAA,EAAA,IAAA,IACA,GAAA,GAAA,IAGA,SAAA,GAAA,EAAA,GACA,EAAA,IAAA,EAAA,KAAA,KAAA,IAGA,IAAA,GAAA,IAAA,GAAA,QAAA,EAAA,IAAA,IACA,GAAA,GAAA,IAIA,IAAA,GAAA,GAAA,gBAAA,GAIA,EAAA,IAAA,EAAA,EAAA,YACA,EAAA,KAAA,EAAA,EAAA,YAYA,IAAA,GAAA,EAAA,UAsFA,SAAA,GAAA,GACA,OAAA,EArFA,GAAA,IAAA,GACA,GAAA,SAxpBA,SAAA,EAAA,GAGA,IAAA,EAAA,GAAA,KACA,EAAA,GAAA,EAAA,MAAA,QAAA,OACA,EAAA,EAAA,eAAA,KAAA,IAAA,WAEA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,GAAA,KAAA,KAAA,GAAA,EAAA,IAEA,OAAA,KAAA,OAAA,GAAA,KAAA,aAAA,SAAA,EAAA,KAAA,GAAA,MAgpBA,GAAA,MA7oBA,WACA,OAAA,IAAA,EAAA,OA6oBA,GAAA,KAnlBA,SAAA,EAAA,EAAA,GACA,IAAA,EACA,EACA,EAEA,IAAA,KAAA,UACA,OAAA,IAKA,KAFA,EAAA,GAAA,EAAA,OAEA,UACA,OAAA,IAOA,OAJA,EAAA,KAAA,EAAA,YAAA,KAAA,aAEA,EAAA,EAAA,IAGA,IAAA,OAAA,EAAA,GAAA,KAAA,GAAA,GAAA,MACA,IAAA,QAAA,EAAA,GAAA,KAAA,GAAA,MACA,IAAA,UAAA,EAAA,GAAA,KAAA,GAAA,EAAA,MACA,IAAA,SAAA,GAAA,KAAA,GAAA,IAAA,MACA,IAAA,SAAA,GAAA,KAAA,GAAA,IAAA,MACA,IAAA,OAAA,GAAA,KAAA,GAAA,KAAA,MACA,IAAA,MAAA,GAAA,KAAA,EAAA,GAAA,MAAA,MACA,IAAA,OAAA,GAAA,KAAA,EAAA,GAAA,OAAA,MACA,QAAA,EAAA,KAAA,EAGA,OAAA,EAAA,EAAA,EAAA,IAqjBA,GAAA,MA1XA,SAAA,GAEA,YAAA,KADA,EAAA,EAAA,KACA,gBAAA,EACA,MAIA,SAAA,IACA,EAAA,OAGA,KAAA,QAAA,GAAA,IAAA,EAAA,YAAA,EAAA,OAAA,GAAA,SAAA,EAAA,QAgXA,GAAA,OA3eA,SAAA,GACA,IACA,EAAA,KAAA,QAAA,EAAA,iBAAA,EAAA,eAEA,IAAA,EAAA,EAAA,KAAA,GACA,OAAA,KAAA,aAAA,WAAA,IAueA,GAAA,KApeA,SAAA,EAAA,GACA,OAAA,KAAA,YACA,EAAA,IAAA,EAAA,WACA,GAAA,GAAA,WACA,GAAA,CAAA,GAAA,KAAA,KAAA,IAAA,OAAA,KAAA,UAAA,UAAA,GAEA,KAAA,aAAA,eA+dA,GAAA,QA3dA,SAAA,GACA,OAAA,KAAA,KAAA,KAAA,IA2dA,GAAA,GAxdA,SAAA,EAAA,GACA,OAAA,KAAA,YACA,EAAA,IAAA,EAAA,WACA,GAAA,GAAA,WACA,GAAA,CAAA,KAAA,KAAA,GAAA,IAAA,OAAA,KAAA,UAAA,UAAA,GAEA,KAAA,aAAA,eAmdA,GAAA,MA/cA,SAAA,GACA,OAAA,KAAA,GAAA,KAAA,IA+cA,GAAA,IA98FA,SAAA,GAEA,OAAA,EAAA,KADA,EAAA,EAAA,KAEA,KAAA,KAEA,MA08FA,GAAA,UAxUA,WACA,OAAA,EAAA,MAAA,UAwUA,GAAA,QAnpBA,SAAA,EAAA,GACA,IAAA,EAAA,EAAA,GAAA,EAAA,GAAA,GACA,SAAA,KAAA,YAAA,EAAA,aAIA,iBADA,EAAA,EAAA,EAAA,GAAA,cAAA,IAEA,KAAA,UAAA,EAAA,UAEA,EAAA,UAAA,KAAA,QAAA,QAAA,GAAA,YA2oBA,GAAA,SAvoBA,SAAA,EAAA,GACA,IAAA,EAAA,EAAA,GAAA,EAAA,GAAA,GACA,SAAA,KAAA,YAAA,EAAA,aAIA,iBADA,EAAA,EAAA,EAAA,GAAA,cAAA,IAEA,KAAA,UAAA,EAAA,UAEA,KAAA,QAAA,MAAA,GAAA,UAAA,EAAA,YA+nBA,GAAA,UA3nBA,SAAA,EAAA,EAAA,EAAA,GAEA,OAAA,OADA,EAAA,GAAA,MACA,GAAA,KAAA,QAAA,EAAA,IAAA,KAAA,SAAA,EAAA,MACA,MAAA,EAAA,GAAA,KAAA,SAAA,EAAA,IAAA,KAAA,QAAA,EAAA,KAynBA,GAAA,OAtnBA,SAAA,EAAA,GACA,IACA,EADA,EAAA,EAAA,GAAA,EAAA,GAAA,GAEA,SAAA,KAAA,YAAA,EAAA,aAIA,iBADA,EAAA,EAAA,GAAA,gBAEA,KAAA,YAAA,EAAA,WAEA,EAAA,EAAA,UACA,KAAA,QAAA,QAAA,GAAA,WAAA,GAAA,GAAA,KAAA,QAAA,MAAA,GAAA,aA4mBA,GAAA,cAxmBA,SAAA,EAAA,GACA,OAAA,KAAA,OAAA,EAAA,IAAA,KAAA,QAAA,EAAA,IAwmBA,GAAA,eArmBA,SAAA,EAAA,GACA,OAAA,KAAA,OAAA,EAAA,IAAA,KAAA,SAAA,EAAA,IAqmBA,GAAA,QAvVA,WACA,OAAA,EAAA,OAuVA,GAAA,KAAA,GACA,GAAA,OAAA,GACA,GAAA,WAAA,GACA,GAAA,IAAA,GACA,GAAA,IAAA,GACA,GAAA,aAzVA,WACA,OAAA,EAAA,GAAA,EAAA,QAyVA,GAAA,IAp9FA,SAAA,EAAA,GACA,GAAA,iBAAA,EAGA,IADA,IAAA,EApTA,SAAA,GACA,IAAA,EAAA,GACA,IAAA,IAAA,KAAA,EACA,EAAA,KAAA,CAAA,KAAA,EAAA,SAAA,EAAA,KAKA,OAHA,EAAA,KAAA,SAAA,EAAA,GACA,OAAA,EAAA,SAAA,EAAA,WAEA,EA4SA,CADA,EAAA,EAAA,IAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,KAAA,EAAA,GAAA,MAAA,EAAA,EAAA,GAAA,YAIA,GAAA,EAAA,KADA,EAAA,EAAA,KAEA,OAAA,KAAA,GAAA,GAGA,OAAA,MAw8FA,GAAA,QA5bA,SAAA,GAIA,OAHA,EAAA,EAAA,IAIA,IAAA,OACA,KAAA,MAAA,GAEA,IAAA,UACA,IAAA,QACA,KAAA,KAAA,GAEA,IAAA,OACA,IAAA,UACA,IAAA,MACA,IAAA,OACA,KAAA,MAAA,GAEA,IAAA,OACA,KAAA,QAAA,GAEA,IAAA,SACA,KAAA,QAAA,GAEA,IAAA,SACA,KAAA,aAAA,GAgBA,MAZA,SAAA,GACA,KAAA,QAAA,GAEA,YAAA,GACA,KAAA,WAAA,GAIA,YAAA,GACA,KAAA,MAAA,EAAA,KAAA,MAAA,KAAA,QAAA,IAGA,MAoZA,GAAA,SAAA,GACA,GAAA,QAxXA,WACA,IAAA,EAAA,KACA,MAAA,CAAA,EAAA,OAAA,EAAA,QAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAuXA,GAAA,SApXA,WACA,IAAA,EAAA,KACA,MAAA,CACA,MAAA,EAAA,OACA,OAAA,EAAA,QACA,KAAA,EAAA,OACA,MAAA,EAAA,QACA,QAAA,EAAA,UACA,QAAA,EAAA,UACA,aAAA,EAAA,iBA4WA,GAAA,OA9XA,WACA,OAAA,IAAA,KAAA,KAAA,YA8XA,GAAA,YAjjBA,SAAA,GACA,IAAA,KAAA,UACA,OAAA,KAEA,IAAA,GAAA,IAAA,EACA,EAAA,EAAA,KAAA,QAAA,MAAA,KACA,OAAA,EAAA,OAAA,GAAA,EAAA,OAAA,KACA,EAAA,EAAA,EAAA,iCAAA,gCAEA,EAAA,KAAA,UAAA,aAEA,EACA,KAAA,SAAA,cAEA,IAAA,KAAA,KAAA,UAAA,GAAA,KAAA,YAAA,KAAA,cAAA,QAAA,IAAA,EAAA,EAAA,MAGA,EAAA,EAAA,EAAA,+BAAA,+BAiiBA,GAAA,QAxhBA,WACA,IAAA,KAAA,UACA,MAAA,qBAAA,KAAA,GAAA,OAEA,IAAA,EAAA,SACA,EAAA,GACA,KAAA,YACA,EAAA,IAAA,KAAA,YAAA,aAAA,mBACA,EAAA,KAEA,IAAA,EAAA,IAAA,EAAA,MACA,EAAA,GAAA,KAAA,QAAA,KAAA,QAAA,KAAA,OAAA,SAEA,EAAA,EAAA,OAEA,OAAA,KAAA,OAAA,EAAA,EAHA,wBAGA,IA0gBA,GAAA,OA3WA,WAEA,OAAA,KAAA,UAAA,KAAA,cAAA,MA0WA,GAAA,SAxjBA,WACA,OAAA,KAAA,QAAA,OAAA,MAAA,OAAA,qCAwjBA,GAAA,KAvYA,WACA,OAAA,KAAA,MAAA,KAAA,UAAA,MAuYA,GAAA,QA5YA,WACA,OAAA,KAAA,GAAA,UAAA,KAAA,KAAA,SAAA,IA4YA,GAAA,aA9VA,WACA,MAAA,CACA,MAAA,KAAA,GACA,OAAA,KAAA,GACA,OAAA,KAAA,QACA,MAAA,KAAA,OACA,OAAA,KAAA,UAyVA,GAAA,KAAA,GACA,GAAA,WA7gGA,WACA,OAAA,GAAA,KAAA,SA6gGA,GAAA,SApSA,SAAA,GACA,OAAA,GAAA,KAAA,KACA,EACA,KAAA,OACA,KAAA,UACA,KAAA,aAAA,MAAA,IACA,KAAA,aAAA,MAAA,MA+RA,GAAA,YA5RA,SAAA,GACA,OAAA,GAAA,KAAA,KACA,EAAA,KAAA,UAAA,KAAA,aAAA,EAAA,IA2RA,GAAA,QAAA,GAAA,SAnOA,SAAA,GACA,OAAA,MAAA,EAAA,KAAA,MAAA,KAAA,QAAA,GAAA,GAAA,KAAA,MAAA,GAAA,EAAA,GAAA,KAAA,QAAA,IAmOA,GAAA,MAAA,GACA,GAAA,YA/vFA,WACA,OAAA,GAAA,KAAA,OAAA,KAAA,UA+vFA,GAAA,KAAA,GAAA,MA7iFA,SAAA,GACA,IAAA,EAAA,KAAA,aAAA,KAAA,MACA,OAAA,MAAA,EAAA,EAAA,KAAA,IAAA,GAAA,EAAA,GAAA,MA4iFA,GAAA,QAAA,GAAA,SAziFA,SAAA,GACA,IAAA,EAAA,GAAA,KAAA,EAAA,GAAA,KACA,OAAA,MAAA,EAAA,EAAA,KAAA,IAAA,GAAA,EAAA,GAAA,MAwiFA,GAAA,YAzRA,WACA,IAAA,EAAA,KAAA,aAAA,MACA,OAAA,GAAA,KAAA,OAAA,EAAA,IAAA,EAAA,MAwRA,GAAA,eA9RA,WACA,OAAA,GAAA,KAAA,OAAA,EAAA,IA8RA,GAAA,KAAA,GACA,GAAA,IAAA,GAAA,KAn1EA,SAAA,GACA,IAAA,KAAA,UACA,OAAA,MAAA,EAAA,KAAA,IAEA,IAAA,EAAA,KAAA,OAAA,KAAA,GAAA,YAAA,KAAA,GAAA,SACA,OAAA,MAAA,GACA,EA9JA,SAAA,EAAA,GACA,MAAA,iBAAA,EACA,EAGA,MAAA,GAKA,iBADA,EAAA,EAAA,cAAA,IAEA,EAGA,KARA,SAAA,EAAA,IAwJA,CAAA,EAAA,KAAA,cACA,KAAA,IAAA,EAAA,EAAA,MAEA,GA20EA,GAAA,QAv0EA,SAAA,GACA,IAAA,KAAA,UACA,OAAA,MAAA,EAAA,KAAA,IAEA,IAAA,GAAA,KAAA,MAAA,EAAA,KAAA,aAAA,MAAA,KAAA,EACA,OAAA,MAAA,EAAA,EAAA,KAAA,IAAA,EAAA,EAAA,MAm0EA,GAAA,WAh0EA,SAAA,GACA,IAAA,KAAA,UACA,OAAA,MAAA,EAAA,KAAA,IAOA,GAAA,MAAA,EAAA,CACA,IAAA,EAtKA,SAAA,EAAA,GACA,MAAA,iBAAA,EACA,EAAA,cAAA,GAAA,GAAA,EAEA,MAAA,GAAA,KAAA,EAkKA,CAAA,EAAA,KAAA,cACA,OAAA,KAAA,IAAA,KAAA,MAAA,EAAA,EAAA,EAAA,GAEA,OAAA,KAAA,OAAA,GAozEA,GAAA,UApLA,SAAA,GACA,IAAA,EAAA,KAAA,OAAA,KAAA,QAAA,QAAA,OAAA,KAAA,QAAA,QAAA,SAAA,OAAA,EACA,OAAA,MAAA,EAAA,EAAA,KAAA,IAAA,EAAA,EAAA,MAmLA,GAAA,KAAA,GAAA,MAAA,GACA,GAAA,OAAA,GAAA,QAAA,GACA,GAAA,OAAA,GAAA,QAAA,GACA,GAAA,YAAA,GAAA,aAAA,GACA,GAAA,UA//BA,SAAA,EAAA,EAAA,GACA,IACA,EADA,EAAA,KAAA,SAAA,EAEA,IAAA,KAAA,UACA,OAAA,MAAA,EAAA,KAAA,IAEA,GAAA,MAAA,EAAA,CACA,GAAA,iBAAA,GAEA,GAAA,QADA,EAAA,GAAA,GAAA,IAEA,OAAA,UAEA,KAAA,IAAA,GAAA,KAAA,IACA,GAAA,IAmBA,OAjBA,KAAA,QAAA,IACA,EAAA,GAAA,OAEA,KAAA,QAAA,EACA,KAAA,QAAA,EACA,MAAA,GACA,KAAA,IAAA,EAAA,KAEA,IAAA,KACA,GAAA,KAAA,kBACA,GAAA,KAAA,GAAA,EAAA,EAAA,KAAA,GAAA,GACA,KAAA,oBACA,KAAA,mBAAA,EACA,EAAA,aAAA,MAAA,GACA,KAAA,kBAAA,OAGA,KAEA,OAAA,KAAA,OAAA,EAAA,GAAA,OA89BA,GAAA,IA58BA,SAAA,GACA,OAAA,KAAA,UAAA,EAAA,IA48BA,GAAA,MAz8BA,SAAA,GASA,OARA,KAAA,SACA,KAAA,UAAA,EAAA,GACA,KAAA,QAAA,EAEA,GACA,KAAA,SAAA,GAAA,MAAA,MAGA,MAi8BA,GAAA,UA97BA,WACA,GAAA,MAAA,KAAA,KACA,KAAA,UAAA,KAAA,MAAA,GAAA,QACA,GAAA,iBAAA,KAAA,GAAA,CACA,IAAA,EAAA,GAAA,GAAA,KAAA,IACA,MAAA,EACA,KAAA,UAAA,GAGA,KAAA,UAAA,GAAA,GAGA,OAAA,MAm7BA,GAAA,qBAh7BA,SAAA,GACA,QAAA,KAAA,YAGA,EAAA,EAAA,GAAA,GAAA,YAAA,GAEA,KAAA,YAAA,GAAA,IAAA,IA26BA,GAAA,MAx6BA,WACA,OACA,KAAA,YAAA,KAAA,QAAA,MAAA,GAAA,aACA,KAAA,YAAA,KAAA,QAAA,MAAA,GAAA,aAs6BA,GAAA,QA74BA,WACA,QAAA,KAAA,YAAA,KAAA,QA64BA,GAAA,YA14BA,WACA,QAAA,KAAA,WAAA,KAAA,QA04BA,GAAA,MAAA,GACA,GAAA,MAAA,GACA,GAAA,SA9EA,WACA,OAAA,KAAA,OAAA,MAAA,IA8EA,GAAA,SA3EA,WACA,OAAA,KAAA,OAAA,6BAAA,IA2EA,GAAA,MAAA,EAAA,kDAAA,IACA,GAAA,OAAA,EAAA,mDAAA,IACA,GAAA,MAAA,EAAA,iDAAA,IACA,GAAA,KAAA,EAAA,2GAx+BA,SAAA,EAAA,GACA,OAAA,MAAA,GACA,iBAAA,IACA,GAAA,GAGA,KAAA,UAAA,EAAA,GAEA,OAEA,KAAA,cA+9BA,GAAA,aAAA,EAAA,0GA56BA,WACA,IAAA,EAAA,KAAA,eACA,OAAA,KAAA,cAGA,IAAA,EAAA,GAKA,GAHA,EAAA,EAAA,OACA,EAAA,GAAA,IAEA,GAAA,CACA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,GAAA,EAAA,IACA,KAAA,cAAA,KAAA,WACA,EAAA,EAAA,GAAA,EAAA,WAAA,OAEA,KAAA,eAAA,EAGA,OAAA,KAAA,gBAw6BA,IAAA,GAAA,EAAA,UAiCA,SAAA,GAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,KACA,EAAA,IAAA,IAAA,EAAA,GACA,OAAA,EAAA,GAAA,EAAA,GAGA,SAAA,GAAA,EAAA,EAAA,GAQA,GAPA,EAAA,KACA,EAAA,EACA,OAAA,GAGA,EAAA,GAAA,GAEA,MAAA,EACA,OAAA,GAAA,EAAA,EAAA,EAAA,SAGA,IAAA,EACA,EAAA,GACA,IAAA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,GAAA,GAAA,EAAA,EAAA,EAAA,SAEA,OAAA,EAWA,SAAA,GAAA,EAAA,EAAA,EAAA,GACA,kBAAA,GACA,EAAA,KACA,EAAA,EACA,OAAA,GAGA,EAAA,GAAA,KAGA,EADA,EAAA,EAEA,GAAA,EAEA,EAAA,KACA,EAAA,EACA,OAAA,GAGA,EAAA,GAAA,IAGA,IAOA,EAPA,EAAA,KACA,EAAA,EAAA,EAAA,MAAA,IAAA,EAEA,GAAA,MAAA,EACA,OAAA,GAAA,GAAA,EAAA,GAAA,EAAA,EAAA,OAIA,IAAA,EAAA,GACA,IAAA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,GAAA,EAAA,GAAA,EAAA,EAAA,OAEA,OAAA,EAlGA,GAAA,SA/6GA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,KAAA,UAAA,IAAA,KAAA,UAAA,SACA,OAAA,EAAA,GAAA,EAAA,KAAA,EAAA,GAAA,GA86GA,GAAA,eAl6GA,SAAA,GACA,IAAA,EAAA,KAAA,gBAAA,GACA,EAAA,KAAA,gBAAA,EAAA,eAEA,OAAA,IAAA,EACA,GAGA,KAAA,gBAAA,GAAA,EAAA,QAAA,mBAAA,SAAA,GACA,OAAA,EAAA,MAAA,KAGA,KAAA,gBAAA,KAu5GA,GAAA,YAl5GA,WACA,OAAA,KAAA,cAk5GA,GAAA,QA54GA,SAAA,GACA,OAAA,KAAA,SAAA,QAAA,KAAA,IA44GA,GAAA,SAAA,GACA,GAAA,WAAA,GACA,GAAA,aA13GA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,KAAA,cAAA,GACA,OAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,QAAA,MAAA,IAu3GA,GAAA,WAp3GA,SAAA,EAAA,GACA,IAAA,EAAA,KAAA,cAAA,EAAA,EAAA,SAAA,QACA,OAAA,EAAA,GAAA,EAAA,GAAA,EAAA,QAAA,MAAA,IAm3GA,GAAA,IAngHA,SAAA,GACA,IAAA,EAAA,EACA,IAAA,KAAA,EAEA,EADA,EAAA,EAAA,IAEA,KAAA,GAAA,EAEA,KAAA,IAAA,GAAA,EAGA,KAAA,QAAA,EAIA,KAAA,+BAAA,IAAA,QACA,KAAA,wBAAA,QAAA,KAAA,cAAA,QACA,IAAA,UAAA,SAq/GA,GAAA,OA97FA,SAAA,EAAA,GACA,OAAA,EAIA,EAAA,KAAA,SAAA,KAAA,QAAA,EAAA,SACA,KAAA,SAAA,KAAA,QAAA,UAAA,IAAA,KAAA,GAAA,SAAA,cAAA,EAAA,SAJA,EAAA,KAAA,SAAA,KAAA,QACA,KAAA,QAAA,YA47FA,GAAA,YAr7FA,SAAA,EAAA,GACA,OAAA,EAIA,EAAA,KAAA,cAAA,KAAA,aAAA,EAAA,SACA,KAAA,aAAA,GAAA,KAAA,GAAA,SAAA,cAAA,EAAA,SAJA,EAAA,KAAA,cAAA,KAAA,aACA,KAAA,aAAA,YAm7FA,GAAA,YAp4FA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,EAEA,GAAA,KAAA,kBACA,OA7CA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,oBACA,IAAA,KAAA,aAKA,IAHA,KAAA,aAAA,GACA,KAAA,iBAAA,GACA,KAAA,kBAAA,GACA,EAAA,EAAA,EAAA,KAAA,EACA,EAAA,EAAA,CAAA,IAAA,IACA,KAAA,kBAAA,GAAA,KAAA,YAAA,EAAA,IAAA,oBACA,KAAA,iBAAA,GAAA,KAAA,OAAA,EAAA,IAAA,oBAIA,OAAA,EACA,QAAA,GAEA,KADA,EAAA,GAAA,KAAA,KAAA,kBAAA,IACA,EAAA,MAGA,KADA,EAAA,GAAA,KAAA,KAAA,iBAAA,IACA,EAAA,KAGA,QAAA,GAEA,KADA,EAAA,GAAA,KAAA,KAAA,kBAAA,IAEA,GAGA,KADA,EAAA,GAAA,KAAA,KAAA,iBAAA,IACA,EAAA,MAGA,KADA,EAAA,GAAA,KAAA,KAAA,iBAAA,IAEA,GAGA,KADA,EAAA,GAAA,KAAA,KAAA,kBAAA,IACA,EAAA,MASA,KAAA,KAAA,EAAA,EAAA,GAYA,IATA,KAAA,eACA,KAAA,aAAA,GACA,KAAA,iBAAA,GACA,KAAA,kBAAA,IAMA,EAAA,EAAA,EAAA,GAAA,IAAA,CAYA,GAVA,EAAA,EAAA,CAAA,IAAA,IACA,IAAA,KAAA,iBAAA,KACA,KAAA,iBAAA,GAAA,IAAA,OAAA,IAAA,KAAA,OAAA,EAAA,IAAA,QAAA,IAAA,IAAA,IAAA,KACA,KAAA,kBAAA,GAAA,IAAA,OAAA,IAAA,KAAA,YAAA,EAAA,IAAA,QAAA,IAAA,IAAA,IAAA,MAEA,GAAA,KAAA,aAAA,KACA,EAAA,IAAA,KAAA,OAAA,EAAA,IAAA,KAAA,KAAA,YAAA,EAAA,IACA,KAAA,aAAA,GAAA,IAAA,OAAA,EAAA,QAAA,IAAA,IAAA,MAGA,GAAA,SAAA,GAAA,KAAA,iBAAA,GAAA,KAAA,GACA,OAAA,EACA,GAAA,GAAA,QAAA,GAAA,KAAA,kBAAA,GAAA,KAAA,GACA,OAAA,EACA,IAAA,GAAA,KAAA,aAAA,GAAA,KAAA,GACA,OAAA,IAo2FA,GAAA,YAjyFA,SAAA,GACA,OAAA,KAAA,mBACA,EAAA,KAAA,iBACA,GAAA,KAAA,MAEA,EACA,KAAA,mBAEA,KAAA,eAGA,EAAA,KAAA,kBACA,KAAA,aAAA,IAEA,KAAA,oBAAA,EACA,KAAA,mBAAA,KAAA,eAmxFA,GAAA,iBAtzFA,SAAA,GACA,OAAA,KAAA,mBACA,EAAA,KAAA,iBACA,GAAA,KAAA,MAEA,EACA,KAAA,wBAEA,KAAA,oBAGA,EAAA,KAAA,uBACA,KAAA,kBAAA,IAEA,KAAA,yBAAA,EACA,KAAA,wBAAA,KAAA,oBAwyFA,GAAA,KA5nFA,SAAA,GACA,OAAA,GAAA,EAAA,KAAA,MAAA,IAAA,KAAA,MAAA,KAAA,MA4nFA,GAAA,eAhnFA,WACA,OAAA,KAAA,MAAA,KAgnFA,GAAA,eArnFA,WACA,OAAA,KAAA,MAAA,KAsnFA,GAAA,SA3gFA,SAAA,EAAA,GACA,OAAA,EAIA,EAAA,KAAA,WAAA,KAAA,UAAA,EAAA,OACA,KAAA,UAAA,KAAA,UAAA,SAAA,KAAA,GAAA,SAAA,cAAA,EAAA,OAJA,EAAA,KAAA,WAAA,KAAA,UACA,KAAA,UAAA,YAygFA,GAAA,YA7/EA,SAAA,GACA,OAAA,EAAA,KAAA,aAAA,EAAA,OAAA,KAAA,cA6/EA,GAAA,cAngFA,SAAA,GACA,OAAA,EAAA,KAAA,eAAA,EAAA,OAAA,KAAA,gBAmgFA,GAAA,cA37EA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,EAEA,GAAA,KAAA,oBACA,OApEA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,oBACA,IAAA,KAAA,eAKA,IAJA,KAAA,eAAA,GACA,KAAA,oBAAA,GACA,KAAA,kBAAA,GAEA,EAAA,EAAA,EAAA,IAAA,EACA,EAAA,EAAA,CAAA,IAAA,IAAA,IAAA,GACA,KAAA,kBAAA,GAAA,KAAA,YAAA,EAAA,IAAA,oBACA,KAAA,oBAAA,GAAA,KAAA,cAAA,EAAA,IAAA,oBACA,KAAA,eAAA,GAAA,KAAA,SAAA,EAAA,IAAA,oBAIA,OAAA,EACA,SAAA,GAEA,KADA,EAAA,GAAA,KAAA,KAAA,eAAA,IACA,EAAA,KACA,QAAA,GAEA,KADA,EAAA,GAAA,KAAA,KAAA,oBAAA,IACA,EAAA,MAGA,KADA,EAAA,GAAA,KAAA,KAAA,kBAAA,IACA,EAAA,KAGA,SAAA,GAEA,KADA,EAAA,GAAA,KAAA,KAAA,eAAA,IAEA,GAGA,KADA,EAAA,GAAA,KAAA,KAAA,oBAAA,IAEA,GAGA,KADA,EAAA,GAAA,KAAA,KAAA,kBAAA,IACA,EAAA,KACA,QAAA,GAEA,KADA,EAAA,GAAA,KAAA,KAAA,oBAAA,IAEA,GAGA,KADA,EAAA,GAAA,KAAA,KAAA,eAAA,IAEA,GAGA,KADA,EAAA,GAAA,KAAA,KAAA,kBAAA,IACA,EAAA,MAGA,KADA,EAAA,GAAA,KAAA,KAAA,kBAAA,IAEA,GAGA,KADA,EAAA,GAAA,KAAA,KAAA,eAAA,IAEA,GAGA,KADA,EAAA,GAAA,KAAA,KAAA,oBAAA,IACA,EAAA,MASA,KAAA,KAAA,EAAA,EAAA,GAUA,IAPA,KAAA,iBACA,KAAA,eAAA,GACA,KAAA,kBAAA,GACA,KAAA,oBAAA,GACA,KAAA,mBAAA,IAGA,EAAA,EAAA,EAAA,EAAA,IAAA,CAcA,GAXA,EAAA,EAAA,CAAA,IAAA,IAAA,IAAA,GACA,IAAA,KAAA,mBAAA,KACA,KAAA,mBAAA,GAAA,IAAA,OAAA,IAAA,KAAA,SAAA,EAAA,IAAA,QAAA,IAAA,QAAA,IAAA,KACA,KAAA,oBAAA,GAAA,IAAA,OAAA,IAAA,KAAA,cAAA,EAAA,IAAA,QAAA,IAAA,QAAA,IAAA,KACA,KAAA,kBAAA,GAAA,IAAA,OAAA,IAAA,KAAA,YAAA,EAAA,IAAA,QAAA,IAAA,QAAA,IAAA,MAEA,KAAA,eAAA,KACA,EAAA,IAAA,KAAA,SAAA,EAAA,IAAA,KAAA,KAAA,cAAA,EAAA,IAAA,KAAA,KAAA,YAAA,EAAA,IACA,KAAA,eAAA,GAAA,IAAA,OAAA,EAAA,QAAA,IAAA,IAAA,MAGA,GAAA,SAAA,GAAA,KAAA,mBAAA,GAAA,KAAA,GACA,OAAA,EACA,GAAA,GAAA,QAAA,GAAA,KAAA,oBAAA,GAAA,KAAA,GACA,OAAA,EACA,GAAA,GAAA,OAAA,GAAA,KAAA,kBAAA,GAAA,KAAA,GACA,OAAA,EACA,IAAA,GAAA,KAAA,eAAA,GAAA,KAAA,GACA,OAAA,IA05EA,GAAA,cA52EA,SAAA,GACA,OAAA,KAAA,qBACA,EAAA,KAAA,mBACA,GAAA,KAAA,MAEA,EACA,KAAA,qBAEA,KAAA,iBAGA,EAAA,KAAA,oBACA,KAAA,eAAA,IAEA,KAAA,sBAAA,EACA,KAAA,qBAAA,KAAA,iBA81EA,GAAA,mBAz1EA,SAAA,GACA,OAAA,KAAA,qBACA,EAAA,KAAA,mBACA,GAAA,KAAA,MAEA,EACA,KAAA,0BAEA,KAAA,sBAGA,EAAA,KAAA,yBACA,KAAA,oBAAA,IAEA,KAAA,2BAAA,EACA,KAAA,0BAAA,KAAA,sBA20EA,GAAA,iBAt0EA,SAAA,GACA,OAAA,KAAA,qBACA,EAAA,KAAA,mBACA,GAAA,KAAA,MAEA,EACA,KAAA,wBAEA,KAAA,oBAGA,EAAA,KAAA,uBACA,KAAA,kBAAA,IAEA,KAAA,yBAAA,EACA,KAAA,wBAAA,KAAA,oBAyzEA,GAAA,KA7pEA,SAAA,GAGA,MAAA,OAAA,EAAA,IAAA,cAAA,OAAA,IA2pEA,GAAA,SAvpEA,SAAA,EAAA,EAAA,GACA,OAAA,EAAA,GACA,EAAA,KAAA,KAEA,EAAA,KAAA,MA+uEA,GAAA,KAAA,CACA,uBAAA,uBACA,QAAA,SAAA,GACA,IAAA,EAAA,EAAA,GAKA,OAAA,GAJA,IAAA,EAAA,EAAA,IAAA,IAAA,KACA,IAAA,EAAA,KACA,IAAA,EAAA,KACA,IAAA,EAAA,KAAA,SAOA,EAAA,KAAA,EAAA,wDAAA,IACA,EAAA,SAAA,EAAA,gEAAA,IAEA,IAAA,GAAA,KAAA,IAmBA,SAAA,GAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,GAAA,EAAA,GAMA,OAJA,EAAA,eAAA,EAAA,EAAA,cACA,EAAA,OAAA,EAAA,EAAA,MACA,EAAA,SAAA,EAAA,EAAA,QAEA,EAAA,UAaA,SAAA,GAAA,GACA,OAAA,EAAA,EACA,KAAA,MAAA,GAEA,KAAA,KAAA,GAmDA,SAAA,GAAA,GAGA,OAAA,KAAA,EAAA,OAGA,SAAA,GAAA,GAEA,OAAA,OAAA,EAAA,KA8CA,SAAA,GAAA,GACA,OAAA,WACA,OAAA,KAAA,GAAA,IAIA,IAAA,GAAA,GAAA,MACA,GAAA,GAAA,KACA,GAAA,GAAA,KACA,GAAA,GAAA,KACA,GAAA,GAAA,KACA,GAAA,GAAA,KACA,GAAA,GAAA,KACA,GAAA,GAAA,KAWA,SAAA,GAAA,GACA,OAAA,WACA,OAAA,KAAA,UAAA,KAAA,MAAA,GAAA,KAIA,IAAA,GAAA,GAAA,gBACA,GAAA,GAAA,WACA,GAAA,GAAA,WACA,GAAA,GAAA,SACA,GAAA,GAAA,QACA,GAAA,GAAA,UACA,GAAA,GAAA,SAMA,IAAA,GAAA,KAAA,MACA,GAAA,CACA,GAAA,GACA,EAAA,GACA,EAAA,GACA,EAAA,GACA,EAAA,GACA,EAAA,IA6EA,IAAA,GAAA,KAAA,IAEA,SAAA,GAAA,GACA,OAAA,EAAA,IAAA,EAAA,KAAA,EAGA,SAAA,KAQA,IAAA,KAAA,UACA,OAAA,KAAA,aAAA,cAGA,IAGA,EAAA,EAHA,EAAA,GAAA,KAAA,eAAA,IACA,EAAA,GAAA,KAAA,OACA,EAAA,GAAA,KAAA,SAIA,EAAA,EAAA,EAAA,IACA,EAAA,EAAA,EAAA,IACA,GAAA,GACA,GAAA,GAQA,IAAA,EALA,EAAA,EAAA,IAMA,EALA,GAAA,GAMA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,QAAA,GAAA,QAAA,SAAA,IAAA,GACA,EAAA,KAAA,YAEA,IAAA,EAGA,MAAA,MAGA,IAAA,EAAA,EAAA,EAAA,IAAA,GACA,EAAA,GAAA,KAAA,WAAA,GAAA,GAAA,IAAA,GACA,EAAA,GAAA,KAAA,SAAA,GAAA,GAAA,IAAA,GACA,EAAA,GAAA,KAAA,iBAAA,GAAA,GAAA,IAAA,GAEA,OAAA,EAAA,KACA,EAAA,EAAA,EAAA,IAAA,KACA,EAAA,EAAA,EAAA,IAAA,KACA,EAAA,EAAA,EAAA,IAAA,KACA,GAAA,GAAA,EAAA,IAAA,KACA,EAAA,EAAA,EAAA,IAAA,KACA,EAAA,EAAA,EAAA,IAAA,KACA,EAAA,EAAA,EAAA,IAAA,IAGA,IAAA,GAAA,GAAA,UAuGA,OArGA,GAAA,QA9oDA,WACA,OAAA,KAAA,UA8oDA,GAAA,IAnVA,WACA,IAAA,EAAA,KAAA,MAaA,OAXA,KAAA,cAAA,GAAA,KAAA,eACA,KAAA,MAAA,GAAA,KAAA,OACA,KAAA,QAAA,GAAA,KAAA,SAEA,EAAA,aAAA,GAAA,EAAA,cACA,EAAA,QAAA,GAAA,EAAA,SACA,EAAA,QAAA,GAAA,EAAA,SACA,EAAA,MAAA,GAAA,EAAA,OACA,EAAA,OAAA,GAAA,EAAA,QACA,EAAA,MAAA,GAAA,EAAA,OAEA,MAsUA,GAAA,IAxTA,SAAA,EAAA,GACA,OAAA,GAAA,KAAA,EAAA,EAAA,IAwTA,GAAA,SApTA,SAAA,EAAA,GACA,OAAA,GAAA,KAAA,EAAA,GAAA,IAoTA,GAAA,GA/OA,SAAA,GACA,IAAA,KAAA,UACA,OAAA,IAEA,IAAA,EACA,EACA,EAAA,KAAA,cAIA,GAAA,WAFA,EAAA,EAAA,KAEA,SAAA,EAGA,OAFA,EAAA,KAAA,MAAA,EAAA,MACA,EAAA,KAAA,QAAA,GAAA,GACA,UAAA,EAAA,EAAA,EAAA,GAIA,OADA,EAAA,KAAA,MAAA,KAAA,MAAA,GAAA,KAAA,UACA,GACA,IAAA,OAAA,OAAA,EAAA,EAAA,EAAA,OACA,IAAA,MAAA,OAAA,EAAA,EAAA,MACA,IAAA,OAAA,OAAA,GAAA,EAAA,EAAA,KACA,IAAA,SAAA,OAAA,KAAA,EAAA,EAAA,IACA,IAAA,SAAA,OAAA,MAAA,EAAA,EAAA,IAEA,IAAA,cAAA,OAAA,KAAA,MAAA,MAAA,GAAA,EACA,QAAA,MAAA,IAAA,MAAA,gBAAA,KAuNA,GAAA,eAAA,GACA,GAAA,UAAA,GACA,GAAA,UAAA,GACA,GAAA,QAAA,GACA,GAAA,OAAA,GACA,GAAA,QAAA,GACA,GAAA,SAAA,GACA,GAAA,QAAA,GACA,GAAA,QAzNA,WACA,OAAA,KAAA,UAIA,KAAA,cACA,MAAA,KAAA,MACA,KAAA,QAAA,GAAA,OACA,QAAA,EAAA,KAAA,QAAA,IANA,KAwNA,GAAA,QAnTA,WACA,IAIA,EAAA,EAAA,EAAA,EAAA,EAJA,EAAA,KAAA,cACA,EAAA,KAAA,MACA,EAAA,KAAA,QACA,EAAA,KAAA,MAwCA,OAnCA,GAAA,GAAA,GAAA,GAAA,GAAA,GACA,GAAA,GAAA,GAAA,GAAA,GAAA,IACA,GAAA,MAAA,GAAA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,GAKA,EAAA,aAAA,EAAA,IAEA,EAAA,EAAA,EAAA,KACA,EAAA,QAAA,EAAA,GAEA,EAAA,EAAA,EAAA,IACA,EAAA,QAAA,EAAA,GAEA,EAAA,EAAA,EAAA,IACA,EAAA,MAAA,EAAA,GAEA,GAAA,EAAA,EAAA,IAIA,GADA,EAAA,EAAA,GAAA,IAEA,GAAA,GAAA,GAAA,IAGA,EAAA,EAAA,EAAA,IACA,GAAA,GAEA,EAAA,KAAA,EACA,EAAA,OAAA,EACA,EAAA,MAAA,EAEA,MAwQA,GAAA,MAhMA,WACA,OAAA,GAAA,OAgMA,GAAA,IA7LA,SAAA,GAEA,OADA,EAAA,EAAA,GACA,KAAA,UAAA,KAAA,EAAA,OAAA,KA4LA,GAAA,aAAA,GACA,GAAA,QAAA,GACA,GAAA,QAAA,GACA,GAAA,MAAA,GACA,GAAA,KAAA,GACA,GAAA,MAhLA,WACA,OAAA,EAAA,KAAA,OAAA,IAgLA,GAAA,OAAA,GACA,GAAA,MAAA,GACA,GAAA,SA1GA,SAAA,GACA,IAAA,KAAA,UACA,OAAA,KAAA,aAAA,cAGA,IAAA,EAAA,KAAA,aACA,EA5DA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,GAAA,GAAA,MACA,EAAA,GAAA,EAAA,GAAA,MACA,EAAA,GAAA,EAAA,GAAA,MACA,EAAA,GAAA,EAAA,GAAA,MACA,EAAA,GAAA,EAAA,GAAA,MACA,EAAA,GAAA,EAAA,GAAA,MACA,EAAA,GAAA,EAAA,GAAA,MAEA,EAAA,GAAA,GAAA,IAAA,CAAA,IAAA,IACA,EAAA,GAAA,GAAA,CAAA,KAAA,IACA,GAAA,GAAA,CAAA,MACA,EAAA,GAAA,GAAA,CAAA,KAAA,IACA,GAAA,GAAA,CAAA,MACA,EAAA,GAAA,GAAA,CAAA,KAAA,IACA,GAAA,GAAA,CAAA,MACA,EAAA,GAAA,GAAA,CAAA,KAAA,IACA,GAAA,GAAA,CAAA,MACA,EAAA,GAAA,GAAA,CAAA,KAAA,IACA,GAAA,GAAA,CAAA,MAAA,CAAA,KAAA,GAKA,OAHA,EAAA,GAAA,EACA,EAAA,IAAA,EAAA,EACA,EAAA,GAAA,EA3BA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,OAAA,EAAA,aAAA,GAAA,IAAA,EAAA,EAAA,IA2BA,MAAA,KAAA,GAoCA,CAAA,MAAA,EAAA,GAMA,OAJA,IACA,EAAA,EAAA,YAAA,KAAA,IAGA,EAAA,WAAA,IA+FA,GAAA,YAAA,GACA,GAAA,SAAA,GACA,GAAA,OAAA,GACA,GAAA,OAAA,GACA,GAAA,WAAA,GAEA,GAAA,YAAA,EAAA,sFAAA,IACA,GAAA,KAAA,GAMA,EAAA,IAAA,EAAA,EAAA,QACA,EAAA,IAAA,EAAA,EAAA,WAIA,GAAA,IAAA,IACA,GAAA,IAltHA,wBAmtHA,GAAA,IAAA,SAAA,EAAA,EAAA,GACA,EAAA,GAAA,IAAA,KAAA,IAAA,WAAA,EAAA,OAEA,GAAA,IAAA,SAAA,EAAA,EAAA,GACA,EAAA,GAAA,IAAA,KAAA,EAAA,MAMA,EAAA,QAAA,SAz1IA,EA21IA,GAEA,EAAA,GAAA,GACA,EAAA,IAnvDA,WAGA,OAAA,GAAA,WAFA,GAAA,MAAA,KAAA,UAAA,KAmvDA,EAAA,IA9uDA,WAGA,OAAA,GAAA,UAFA,GAAA,MAAA,KAAA,UAAA,KA8uDA,EAAA,IAzuDA,WACA,OAAA,KAAA,IAAA,KAAA,OAAA,IAAA,MAyuDA,EAAA,IAAA,EACA,EAAA,KA7iBA,SAAA,GACA,OAAA,GAAA,IAAA,IA6iBA,EAAA,OA3bA,SAAA,EAAA,GACA,OAAA,GAAA,EAAA,EAAA,WA2bA,EAAA,OAAA,EACA,EAAA,OAAA,GACA,EAAA,QAAA,EACA,EAAA,SAAA,GACA,EAAA,SAAA,EACA,EAAA,SAzbA,SAAA,EAAA,EAAA,GACA,OAAA,GAAA,EAAA,EAAA,EAAA,aAybA,EAAA,UAjjBA,WACA,OAAA,GAAA,MAAA,KAAA,WAAA,aAijBA,EAAA,WAAA,GACA,EAAA,WAAA,GACA,EAAA,YAjcA,SAAA,EAAA,GACA,OAAA,GAAA,EAAA,EAAA,gBAicA,EAAA,YAtbA,SAAA,EAAA,EAAA,GACA,OAAA,GAAA,EAAA,EAAA,EAAA,gBAsbA,EAAA,aAAA,GACA,EAAA,aA//EA,SAAA,EAAA,GACA,GAAA,MAAA,EAAA,CACA,IAAA,EAAA,EAAA,EAAA,GAGA,OADA,EAAA,GAAA,MAEA,EAAA,EAAA,UAGA,EAAA,IAAA,EADA,EAAA,EAAA,EAAA,KAEA,aAAA,GAAA,GACA,GAAA,GAAA,EAGA,GAAA,QAGA,MAAA,GAAA,KACA,MAAA,GAAA,GAAA,aACA,GAAA,GAAA,GAAA,GAAA,aACA,MAAA,GAAA,WACA,GAAA,IAIA,OAAA,GAAA,IAu+EA,EAAA,QA58EA,WACA,OAAA,EAAA,KA48EA,EAAA,cA9bA,SAAA,EAAA,EAAA,GACA,OAAA,GAAA,EAAA,EAAA,EAAA,kBA8bA,EAAA,eAAA,EACA,EAAA,qBA9LA,SAAA,GACA,YAAA,IAAA,EACA,GAEA,mBAAA,IACA,GAAA,GACA,IAyLA,EAAA,sBAnLA,SAAA,EAAA,GACA,YAAA,IAAA,GAAA,UAGA,IAAA,EACA,GAAA,IAEA,GAAA,GAAA,EACA,MAAA,IACA,GAAA,GAAA,EAAA,IAEA,KAyKA,EAAA,eA9yCA,SAAA,EAAA,GACA,IAAA,EAAA,EAAA,KAAA,EAAA,QAAA,GACA,OAAA,GAAA,EAAA,WACA,GAAA,EAAA,WACA,EAAA,EAAA,UACA,EAAA,EAAA,UACA,EAAA,EAAA,UACA,EAAA,EAAA,WAAA,YAwyCA,EAAA,UAAA,GAGA,EAAA,UAAA,CACA,eAAA,mBACA,uBAAA,sBACA,kBAAA,0BACA,KAAA,aACA,KAAA,QACA,aAAA,WACA,QAAA,eACA,KAAA,aACA,MAAA,WAGA;;ACv5IA,IAAA,EAAA,QAAA,UAEA,SAAA,EAAA,GACA,EAAA,GAAA,GAEA,KAAA,IAAA,EAAA,IACA,KAAA,MAAA,EAAA,MACA,KAAA,KAAA,EAAA,KACA,KAAA,KAAA,EAAA,MAAA,GAEA,KAAA,MAAA,IAAA,EAAA,EAAA,MAAA,EAAA,KACA,EAAA,MACA,KAAA,IAAA,IAAA,EAAA,EAAA,IAAA,EAAA,MAkBA,SAAA,EAAA,EAAA,GAKA,GAHA,KAAA,YAAA,GACA,KAAA,cAAA,GAEA,EACA,IAAA,OAAA,EACA,KAAA,YAAA,KAAA,EAAA,KAIA,IACA,EAAA,EAAA,GACA,KAAA,MAAA,MAAA,EAAA,QACA,KAAA,MAAA,QAAA,EAAA,QAAA,GACA,KAAA,MAAA,OAAA,EAAA,SAIA,KAAA,MAAA,OAAA,IACA,KAAA,MAAA,SAAA,GACA,KAAA,MAAA,SAAA,GACA,KAAA,MAAA,cAAA,GApCA,EAAA,UAAA,MAAA,WACA,IAAA,EAAA,IAAA,EAAA,MACA,EAAA,KAAA,KAAA,MAAA,KAAA,UAAA,KAAA,OACA,EAAA,MAAA,KAAA,MAAA,QACA,KAAA,MACA,EAAA,IAAA,KAAA,IAAA,UAIA,EAAA,UAAA,iBAAA,WACA,OAAA,KAAA,MAAA,oBAAA,KAAA,KAAA,KAAA,IAAA,mBA6BA,EAAA,UAAA,MAAA,WACA,IAAA,EAAA,IAAA,EAGA,OAFA,EAAA,YAAA,KAAA,MAAA,KAAA,UAAA,KAAA,cACA,EAAA,cAAA,KAAA,MAAA,KAAA,UAAA,KAAA,gBACA,GAGA,EAAA,UAAA,IAAA,SAAA,EAAA,GACA,OAAA,KAAA,KAAA,YAAA,KAAA,YAAA,GACA,KAAA,KAAA,cAAA,KAAA,cAAA,QAAA,GAGA,EAAA,UAAA,OAAA,SAAA,EAAA,GACA,KAAA,YAAA,GAAA,SACA,KAAA,cAAA,IAGA,EAAA,UAAA,MAAA,SAAA,EAAA,GACA,KAAA,KAAA,cACA,KAAA,cAAA,GAAA,IAGA,EAAA,UAAA,UAAA,SAAA,GACA,OAAA,KAAA,KAAA,aAGA,EAAA,UAAA,eAAA,WACA,IAAA,EAAA,KAAA,SAKA,OAJA,KAAA,UAAA,mBACA,EAAA,UAAA,KAAA,IAAA,mBAGA,EAAA,IAAA,SAAA,KAAA,IAAA,UACA,EAAA,IAAA,UAAA,KAAA,IAAA,SAAA,IACA,EAAA,IAAA,SAAA,KAAA,IAAA,SACA,EAAA,IAAA,SAAA,KAAA,IAAA,SACA,EAAA,IAAA,WAAA,KAAA,IAAA,cAKA,EAAA,UAAA,KAAA,WAEA,OADA,KAAA,SACA,UAGA,EAAA,UAAA,OAAA,WACA,IAAA,EAAA,IAEA,EAAA,IAAA,OAAA,KAAA,IAAA,SACA,EAAA,IAAA,QAAA,KAAA,IAAA,SAAA,GACA,EAAA,IAAA,OAAA,KAAA,IAAA,QACA,EAAA,IAAA,OAAA,KAAA,IAAA,SACA,EAAA,IAAA,SAAA,KAAA,IAAA,WACA,EAAA,IAAA,SAAA,KAAA,IAAA,WACA,EAAA,IAAA,cAAA,KAAA,IAAA,gBAGA,IAAA,EAAA,EAAA,YAIA,GAHA,KAAA,UAAA,kBACA,KAAA,IAAA,kBAAA,GAEA,EAGA,OAFA,EAAA,KAAA,EAAA,WAEA,GAKA,QAAA,iBAAA,EACA,QAAA,aAAA;;ACrHA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,IAAA,OAAA,4JAOA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,GAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAAA,IACA,EAAA,EAAA,MAAA,EAAA,GAAA,OAEA,EAAA,IAAA,EAAA,CACA,KAAA,EACA,MAAA,EACA,IAAA,IAOA,GAJA,EAAA,MAAA,OAAA,OAAA,SAAA,EAAA,KACA,EAAA,MAAA,OAAA,QAAA,SAAA,EAAA,KACA,EAAA,MAAA,OAAA,MAAA,SAAA,EAAA,KAEA,EAAA,EAAA,MAAA,IAAA,UAAA,IAAA,EAAA,EAAA,MAAA,IAAA,UAAA,GACA,EAAA,EAAA,MAAA,IAAA,QAAA,IAAA,EAAA,EAAA,MAAA,IAAA,QAAA,EACA,OAAA,KAGA,GAAA,MAAA,EAAA,GAmBA,GAjBA,EAAA,MAAA,OAAA,OACA,SAAA,EAAA,KACA,EAAA,MAAA,OAAA,SACA,SAAA,EAAA,KAEA,MAAA,EAAA,IAEA,EAAA,MAAA,OAAA,SACA,SAAA,EAAA,KAGA,MAAA,EAAA,IAEA,EAAA,MAAA,OAAA,cACA,SAAA,EAAA,KAGA,MAAA,EAAA,GAEA,EAAA,MAAA,OAAA,iBAAA,OACA,CAEA,IAAA,EAAA,EACA,EAAA,SAAA,EAAA,IACA,MAAA,EAAA,KACA,EAAA,SAAA,EAAA,KAEA,IAAA,EAAA,GAAA,EACA,EAAA,EACA,GAAA,EAEA,GAAA,EAGA,EAAA,MAAA,OAAA,iBAAA,GAKA,OADA,EAAA,KAAA,mBAAA,EACA;;AClGA,QAAA,eAAA,CACA,OAAA,EACA,IAAA,EACA,OAAA,EACA,IAAA,EACA,QAAA,EACA,IAAA,EACA,UAAA,EACA,IAAA,EACA,SAAA,EACA,KAAA,EACA,IAAA,EACA,OAAA,EACA,IAAA,EACA,SAAA,EACA,IAAA,GAGA,QAAA,aAAA,CACA,QAAA,EACA,IAAA,EACA,OAAA,EACA,SAAA,EACA,IAAA,EACA,OAAA,EACA,MAAA,EACA,IAAA,EACA,OAAA,EACA,MAAA,EACA,IAAA,EACA,OAAA,EACA,IAAA,EACA,KAAA,EACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,IAAA,EACA,OAAA,EACA,OAAA,EACA,IAAA,EACA,OAAA,EACA,UAAA,EACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,QAAA,GACA,IAAA,GACA,OAAA,GACA,SAAA,GACA,IAAA,GACA,OAAA,GACA,SAAA,GACA,IAAA,GACA,OAAA,IAGA,QAAA,cAAA,CACA,IAAA,EACA,IAAA,EACA,MAAA,EACA,KAAA,EACA,KAAA,EACA,IAAA,EACA,MAAA,EACA,MAAA,EACA,KAAA,EACA,IAAA,GACA,OAAA,GACA,OAAA,IAEA,QAAA,sBAAA,MAAA,OAAA,KAAA,QAAA,eAAA,KAAA,KAAA,IAEA,QAAA,cAAA,CACA,MAAA,EACA,OAAA,EACA,MAAA,EACA,OAAA,EACA,MAAA,EACA,MAAA,EACA,QAAA,EACA,OAAA,EACA,MAAA,EACA,MAAA,GACA,SAAA,GACA,QAAA,GACA,WAAA,GACA,WAAA,GACA,UAAA,GACA,UAAA,GACA,YAAA,GACA,WAAA,GACA,WAAA,GACA,UAAA,GACA,eAAA,GACA,gBAAA,GACA,eAAA,GACA,gBAAA,GACA,eAAA,GACA,eAAA,GACA,iBAAA,GACA,gBAAA,GACA,eAAA,GACA,UAAA,GACA,eAAA,IAEA,QAAA,sBAAA,MAAA,OAAA,KAAA,QAAA,eAAA,KAAA,KAAA,QAAA,KAAA,QAAA;;ACrGA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,kBAEA,EAAA,IAAA,OAAA,0BAEA,EAAA,sBAAA,wHAEA,KAGA,EAAA,IAAA,OAAA,0BAEA,EAAA,sBAAA,gEAEA,KAGA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WACA,OAAA,KAAA,eAAA,EAAA,GAGA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,GACA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAEA,IAAA,EAAA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,IAGA,EAAA,EAAA,GAAA,cAEA,OADA,IAAA,EAAA,cAAA,GACA,EAAA,cAAA,GACA,MAAA,GAAA,OAAA,EACA,EACA,EAAA,MAAA,QACA,EACA,EAAA,MAAA,SACA,GAEA,SAAA,GAGA,IAAA,EAAA,EAAA,GACA,OAAA,EAAA,GAAA,MAAA,yBAEA,EAAA,GAAA,MAAA,QACA,EAAA,IAAA,EAAA,KACA,EAAA,GAAA,MAAA,SACA,EAAA,IAAA,EAAA,EAAA,KACA,EAAA,GAAA,MAAA,UACA,EAAA,IAAA,EAAA,SACA,EAAA,GAAA,MAAA,UACA,EAAA,IAAA,EAAA,QAGA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,IAGA,EAAA,GAAA,MAAA,SAEA,EAAA,IAAA,EAAA,QAEA,EAAA,GAAA,MAAA,QAEA,EAAA,IAAA,EAAA,UAEA,EAAA,GAAA,MAAA,YAEA,EAAA,IAAA,EAAA,UAGA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,KAAA,wBAAA,EACA;;AC1FA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,kBAEA,EAAA,IAAA,OAAA,+BAEA,EAAA,sBAAA,iHAEA,KAGA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,EAAA,GAAA,cAAA,MAAA,SAAA,GAAA,EACA,EAAA,GACA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAEA,IAAA,EAAA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,IAEA,EAAA,KAAA,4BAAA,EAEA,IAAA,OAAA,IAAA,EAAA,GAAA,GAAA,EAAA,GAAA,cAEA,OADA,IAAA,EAAA,cAAA,GACA,EAAA,cAAA,GACA,KAAA,EACA,EACA,EAAA,MAAA,QACA,EACA,EAAA,MAAA,SACA,GAEA,SAAA,GAGA,GAAA,EAEA,IAAA,EAAA,EAAA,GACA,OAAA,EAAA,GAAA,MAAA,yBAEA,EAAA,GAAA,MAAA,SACA,EAAA,IAAA,EAAA,KACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,MAAA,EAAA,SACA,EAAA,GAAA,MAAA,UACA,EAAA,IAAA,EAAA,EAAA,KAGA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,SACA,EAAA,GAAA,MAAA,WACA,EAAA,IAAA,EAAA,SAEA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,IACA,EAAA,GAAA,MAAA,WACA,EAAA,IAAA,EAAA,QAEA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,SAGA,IAGA,EAAA,GAAA,MAAA,UAEA,EAAA,IAAA,EAAA,QACA,EAAA,MAAA,MAAA,SAAA,EAAA,UACA,EAAA,MAAA,MAAA,SAAA,EAAA,WAEA,EAAA,GAAA,MAAA,SAEA,EAAA,IAAA,EAAA,UACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,MAAA,MAAA,SAAA,EAAA,WAEA,EAAA,GAAA,MAAA,aAEA,EAAA,IAAA,EAAA,UACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,MAAA,OAAA,SAAA,EAAA,WAGA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA;;ACzGA,IAAA,EAAA,QAAA,UAEA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,kBAEA,EAAA,IAAA,OAAA,yJAGA,EAAA,sBAAA,kFAGA,EAAA,sBAAA,+RASA,KAGA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,IAAA,EAAA,CACA,KAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,MAAA,EAAA,MAAA,EAAA,GAAA,OACA,IAAA,IAGA,EAAA,EAAA,GACA,EAAA,EAAA,aAAA,EAAA,eAEA,IAAA,EAAA,EAAA,GACA,SAAA,EAAA,IACA,EAAA,cAAA,EAAA,GAAA,OAAA,QAAA,IAAA,KAAA,eAEA,EAAA,KACA,GAAA,EAAA,GAIA,GAHA,EAAA,EAAA,GACA,EAAA,SAAA,GAEA,EAAA,GAEA,MAAA,KAAA,EAAA,IAEA,GAAA,IACA,MAAA,KAAA,EAAA,MAEA,GAAA,OAGA,CAAA,GAAA,EAAA,GAGA,OAAA,KAEA,EAAA,MAEA,GAAA,KAIA,GAAA,EACA,EAAA,MAAA,OAAA,MAAA,GACA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,OACA,CAGA,IAAA,EAAA,EAAA,GACA,EAAA,MAAA,EAAA,GACA,EAAA,KAAA,GACA,EAAA,KAAA,EAAA,GAAA,QAEA,IAAA,EAAA,EAAA,QAAA,IAAA,EAAA,KACA,EAAA,EAAA,QAAA,KAAA,EAAA,KACA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,KACA,EAAA,EAEA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,OACA,EAAA,GAGA,EAAA,MAAA,OAAA,MAAA,GACA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QAIA,GAAA,EAAA,GAAA,CACA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,eAAA,EAAA,eACA,EAAA,MAAA,OAAA,UAAA,GAIA,GAAA,EAAA,GAAA,CACA,IAAA,EAAA,EAAA,GACA,SAAA,EAAA,IACA,EAAA,cAAA,EAAA,GAAA,OAAA,QAAA,IAAA,KAAA,eAEA,EAAA,IAAA,EAAA,MAAA,QACA,EAAA,IAAA,OAAA,MAAA,GAIA,OADA,EAAA,KAAA,+BAAA,EACA;;AChHA,IAAA,EAAA,QAAA,UAEA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,kBAEA,EAAA,IAAA,OAAA,mYAOA,EAAA,sBAAA,wDAGA,EAAA,sBAAA,6GAMA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,GACA,EAAA,GAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,IAAA,EAAA,CACA,KAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,MAAA,EAAA,MAAA,EAAA,GAAA,OACA,IAAA,IAIA,EAAA,EAAA,GACA,EAAA,EAAA,aAAA,EAAA,eACA,IAAA,EAAA,EAAA,GACA,SAAA,EAAA,IACA,EAAA,cAAA,EAAA,GAAA,OAAA,QAAA,IAAA,KAAA,eAEA,EAAA,KACA,GAAA,EAAA,IAAA,EAAA,GAAA,CACA,EAAA,EAAA,IAAA,EAAA,GACA,EAAA,SAAA,GAEA,IAAA,EAAA,EAAA,IAAA,EAAA,GACA,EACA,MAAA,KAAA,GAEA,GAAA,IACA,MAAA,KAAA,KAEA,GAAA,GAEA,EAAA,MAEA,GAAA,KAIA,GAAA,EACA,EAAA,MAAA,OAAA,MAAA,GACA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,OACA,CAGA,IAAA,EAAA,EAAA,GACA,EAAA,MAAA,EAAA,GACA,EAAA,KAAA,GAEA,IAAA,EAAA,EAAA,QAAA,IAAA,EAAA,KACA,EAAA,EAAA,QAAA,KAAA,EAAA,KACA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,KACA,EAAA,EAEA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,OACA,EAAA,GAGA,EAAA,MAAA,OAAA,MAAA,GACA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QAIA,GAAA,EAAA,GAAA,CACA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,eAAA,EAAA,eACA,EAAA,MAAA,OAAA,UAAA,GAIA,GAAA,EAAA,GAAA,CACA,IAAA,EAAA,EAAA,GACA,EAAA,SAAA,EAAA,IACA,EAAA,cAAA,EAAA,GAAA,QAAA,IAAA,KAAA,OAAA,eAEA,EAAA,IAAA,EAAA,MAAA,QACA,EAAA,IAAA,OAAA,MAAA,GAIA,OADA,EAAA,KAAA,+BAAA,EACA;;AC5HA,IAAA,EAAA,QAAA,UAEA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,kBAEA,EAAA,IAAA,OAAA,+RAMA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,IAAA,EAAA,CACA,KAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,MAAA,EAAA,MAAA,EAAA,GAAA,OACA,IAAA,IAIA,EAAA,EAAA,GACA,EAAA,EAAA,aAAA,EAAA,eAEA,IAEA,EAAA,KAoBA,GAnBA,EAAA,KACA,EAAA,EAAA,GACA,EAAA,SAAA,GAEA,EAAA,GACA,EAAA,GAAA,MAAA,MAEA,GAAA,IACA,EAAA,GAAA,MAAA,QAEA,GAAA,GAGA,EAAA,MAEA,GAAA,MAIA,EACA,EAAA,MAAA,MAAA,MAvBA,GAwBA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,OACA,CAGA,IAAA,EAAA,EAAA,GACA,EAAA,MAAA,EAAA,GACA,EAAA,KA/BA,GAiCA,IAAA,EAAA,EAAA,QAAA,IAAA,EAAA,KACA,EAAA,EAAA,QAAA,KAAA,EAAA,KACA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,KACA,EAAA,EAEA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,OACA,EAAA,GAGA,EAAA,MAAA,MAAA,MA1CA,GA2CA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QAIA,OADA,EAAA,KAAA,mBAAA,EACA;;AC9EA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,IAAA,OAAA,kNAWA,KAEA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,IAAA,EACA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,SAAA,EAAA,IAAA,GAGA,EAAA,EACA,EAAA,EAEA,EAAA,EAGA,EAAA,EACA,EAAA,EAEA,EAAA,EAEA,QAAA,OAAA,SAAA,GACA,EAAA,MAAA,KAAA,WAEA,IAAA,GADA,EAAA,GAAA,IACA,aACA,EAAA,EAAA,EAAA,EACA,EAAA,EAAA,EAAA,EAEA,KAAA,QAAA,WAAA,OAAA,GACA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GAAA,KAAA,EAAA,IAAA,KAAA,EAAA,GAAA,CAQA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OAIA,GAHA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAGA,IAAA,EAAA,CACA,KAAA,EACA,MAAA,EACA,IAAA,KAGA,IAAA,EAAA,MAAA,cACA,EAAA,MAAA,4BAIA,EAAA,MAAA,EAAA,GAAA,QAAA,KAAA,IAAA,CAEA,IACA,EAAA,EAAA,IAAA,EAAA,GAAA,OAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GAMA,GAJA,EAAA,SAAA,GACA,EAAA,SAAA,GACA,EAAA,SAAA,IAEA,EAAA,GAAA,EAAA,KACA,EAAA,GAAA,CAGA,KAAA,GAAA,GAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAQA,OAAA,KANA,IAAA,EAAA,EACA,EAAA,EACA,EAAA,EAQA,OAAA,EAAA,GAAA,EAAA,GAAA,MAEA,EAAA,MAEA,GADA,EAAA,GACA,KAEA,KAIA,EAAA,MAAA,OAAA,MAAA,GACA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,GAGA,EAAA,IACA,EAAA,MAAA,OAAA,UAAA,EAAA,EAAA,GAAA,gBAGA,EAAA,KAAA,yBAAA,EACA,SAlEA,EAAA,OAAA,EAAA,GAAA;;ACrDA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,IAAA,OAAA,2EAEA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAAA,IACA,EAAA,EAAA,MAAA,EAAA,GAAA,OAEA,EAAA,IAAA,EAAA,CACA,KAAA,EACA,MAAA,EACA,IAAA,IAOA,OAJA,EAAA,MAAA,OAAA,OAAA,SAAA,EAAA,KACA,EAAA,MAAA,OAAA,QAAA,SAAA,EAAA,KACA,EAAA,MAAA,OAAA,MAAA,SAAA,EAAA,KAEA,EAAA,EAAA,MAAA,IAAA,UAAA,IAAA,EAAA,EAAA,MAAA,IAAA,UAAA,GACA,EAAA,EAAA,MAAA,IAAA,QAAA,IAAA,EAAA,EAAA,MAAA,IAAA,QAAA,EACA,MAGA,EAAA,KAAA,oBAAA,EACA;;ACxCA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,IAAA,OAAA,uEAEA,KAEA,EAAA,EACA,EAAA,EAEA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,SAAA,GACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GACA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OAGA,GAFA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAAA,EAAA,EAAA,GAAA,SAAA,OAEA,IAAA,EAAA,CACA,KAAA,EACA,MAAA,EACA,IAAA,KAIA,EAAA,EAAA,GACA,EAAA,EAAA,GAWA,OARA,EAAA,SAAA,GACA,EAAA,SAAA,GAEA,EAAA,MAAA,MAAA,MALA,GAMA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,GAEA,EAAA,KAAA,0BAAA,EACA;;AC1CA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,kBAEA,EACA,IAAA,EAAA,sBAAA,oHAGA,EACA,uDAGA,EAAA,IAAA,OAAA,EAAA,KACA,EAAA,IAAA,OAAA,6BAGA,EAAA,yCACA,KAEA,EAAA,IAAA,OAAA,6BAGA,EAAA,sBACA,KAEA,QAAA,OAAA,WAgEA,SAAA,EAAA,EAAA,GAEA,IAAA,EAAA,EAAA,GAAA,cA6BA,OA3BA,OADA,IAAA,EAAA,cAAA,GACA,EAAA,cAAA,GACA,MAAA,GAAA,OAAA,EACA,EACA,EAAA,MAAA,OACA,EACA,EAAA,MAAA,QACA,GAEA,SAAA,GAGA,EAAA,GAAA,MAAA,SACA,EAAA,KAAA,EACA,EAAA,GAAA,MAAA,QACA,EAAA,OAAA,EACA,EAAA,GAAA,MAAA,QACA,EAAA,OAAA,EACA,EAAA,GAAA,MAAA,SACA,EAAA,KAAA,EACA,EAAA,GAAA,MAAA,QACA,EAAA,EAAA,EACA,EAAA,GAAA,MAAA,UACA,EAAA,MAAA,EACA,EAAA,GAAA,MAAA,WACA,EAAA,KAAA,GAGA,EA9FA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WACA,OAAA,KAAA,eAAA,EAAA,GAGA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GAAA,EAAA,MAAA,GAAA,EAAA,EAAA,MAAA,GAAA,MAAA,MAAA,OAAA,KAEA,EAAA,EAAA,GACA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,MAAA,EAAA,MAAA,EAAA,GAAA,OAEA,IAAA,EAAA,IAAA,EAAA,CACA,MAAA,MACA,KAAA,EACA,IAAA,IAGA,EA+BA,SAAA,GACA,IAAA,EAAA,GACA,EAAA,EACA,EAAA,EAAA,KAAA,GACA,KAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,UAAA,EAAA,GAAA,QACA,EAAA,EAAA,KAAA,GAEA,OAAA,EAxCA,CAAA,EAAA,IACA,EAAA,EAAA,GAEA,IAAA,IAAA,KAAA,EACA,EAAA,KAAA,EAAA,GAAA,GAwBA,OArBA,EAAA,KAAA,GAAA,EAAA,OAAA,GAAA,EAAA,OAAA,KACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,KAAA,uBAAA,GAGA,EAAA,EAAA,GAAA,EAAA,MAAA,GAAA,EAAA,KAAA,GACA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,UAEA,EAAA,KAAA,GACA,EAAA,MAAA,MAAA,UAAA,EAAA,OAGA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,SAGA;;AC5EA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,gBAAA,iBAEA,EAAA,IAAA,OAAA,4JAUA,KAGA,EAAA,IAAA,OAAA,uJAUA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAGA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAGA,GAAA,EAAA,MAAA,GAAA,EAAA,EAAA,MAAA,GAAA,MAAA,MAAA,OAAA,KACA,IAAA,EAAA,EAAA,GACA,EAAA,IAAA,EACA,EAAA,IAAA,EACA,EAAA,MAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,KAAA,EAAA,GAAA,UAAA,EAAA,GAAA,QACA,EAAA,KAAA,wBAAA,EAEA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QAEA,IAAA,EAAA,EACA,EAAA,EACA,GAAA,EAGA,GAAA,MAAA,EAAA,GAAA,CAEA,IADA,EAAA,SAAA,EAAA,MACA,GAAA,OAAA,KAEA,EAAA,MAAA,OAAA,SAAA,GAsBA,GAlBA,QAAA,EAAA,GAAA,eACA,EAAA,EACA,EAAA,IACA,YAAA,EAAA,GAAA,eACA,EAAA,EACA,EAAA,GAEA,EAAA,SAAA,EAAA,IAIA,MAAA,EAAA,GACA,EAAA,SAAA,EAAA,IACA,EAAA,MACA,EAAA,EAAA,IACA,EAAA,SAAA,EAAA,MAGA,GAAA,GACA,OAAA,KAGA,GAAA,EAAA,GACA,OAAA,KAOA,GALA,GAAA,KACA,EAAA,GAIA,MAAA,EAAA,GAAA,CACA,GAAA,EAAA,GAAA,OAAA,KAEA,MADA,EAAA,EAAA,GAAA,GAAA,iBAEA,EAAA,EACA,IAAA,IAAA,EAAA,IAGA,KAAA,IACA,EAAA,EACA,IAAA,IAAA,GAAA,KAqBA,GAjBA,EAAA,MAAA,OAAA,OAAA,GACA,EAAA,MAAA,OAAA,SAAA,GAEA,GAAA,EACA,EAAA,MAAA,OAAA,WAAA,GAEA,EAAA,GACA,EAAA,MAAA,MAAA,WAAA,GAEA,EAAA,MAAA,MAAA,WAAA,KAOA,EAAA,EAAA,KAAA,EAAA,UAAA,EAAA,MAAA,EAAA,KAAA,UAGA,OAAA,EAAA,KAAA,MAAA,SACA,KAEA,EAMA,GAAA,EAAA,GAAA,MAAA,0BACA,OAAA,EAGA,MAAA,EAAA,MACA,EAAA,IAAA,IAAA,EAAA,KAAA,EAAA,MAAA,SAGA,EAAA,EACA,EAAA,EACA,GAAA,EAGA,GAAA,MAAA,EAAA,GAAA,CACA,IAAA,EACA,IADA,EAAA,SAAA,EAAA,MACA,GAAA,OAAA,KAEA,EAAA,IAAA,OAAA,SAAA,GAMA,GAHA,EAAA,SAAA,EAAA,IAGA,MAAA,EAAA,IAGA,IADA,EAAA,SAAA,EAAA,MACA,GAAA,OAAA,OAEA,EAAA,MAEA,EAAA,EAAA,IACA,EAAA,SAAA,EAAA,MAGA,GAAA,GAAA,GACA,OAAA,KAGA,GAAA,EAAA,GACA,OAAA,KAOA,GALA,GAAA,KACA,EAAA,GAIA,MAAA,EAAA,GAAA,CAEA,GAAA,EAAA,GAAA,OAAA,KAEA,IAAA,EACA,MADA,EAAA,EAAA,GAAA,GAAA,iBAEA,EAAA,EACA,IAAA,IACA,EAAA,EACA,EAAA,IAAA,UAAA,QACA,EAAA,IAAA,MAAA,MAAA,EAAA,IAAA,IAAA,OAAA,KAKA,KAAA,IACA,EAAA,EACA,IAAA,IAAA,GAAA,KAGA,EAAA,MAAA,UAAA,cACA,GAAA,GAEA,EAAA,MAAA,MAAA,WAAA,GAEA,IAAA,EAAA,MAAA,IAAA,SACA,EAAA,MAAA,OAAA,OAAA,KAKA,EAAA,MAAA,MAAA,WAAA,GAEA,IAAA,EAAA,MAAA,IAAA,SACA,EAAA,MAAA,OAAA,OAAA,EAAA,MAAA,IAAA,QAAA,OAMA,EAAA,KAAA,EAAA,KAAA,EAAA,GACA,EAAA,IAAA,OAAA,OAAA,GACA,EAAA,IAAA,OAAA,SAAA,GACA,GAAA,GACA,EAAA,IAAA,OAAA,WAAA,GAEA,EAAA,MAAA,UAAA,aAAA,GAAA,EAAA,MAAA,IAAA,aACA,EAAA,MAAA,IAAA,QAAA,EAEA,EAAA,IAAA,MAAA,WAAA,GAEA,EAAA,IACA,EAAA,IAAA,MAAA,WAAA,GAQA,OAJA,EAAA,IAAA,OAAA,UAAA,EAAA,MAAA,OAAA,WACA,EAAA,IAAA,MAAA,MAAA,EAAA,IAAA,IAAA,OAAA,GAGA;;ACnPA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,kBAEA,EAAA,IAAA,OAAA,0BAGA,EAAA,sBAAA,+JAEA,KAEA,EAAA,IAAA,OAAA,kGAKA,KAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WACA,OAAA,KAAA,eAAA,EAAA,GAGA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GAAA,EAAA,MAAA,GAAA,EAAA,EAAA,MAAA,GAAA,MAAA,MACA,OAAA,KAGA,EAAA,EAAA,GACA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,MAAA,EAAA,MAAA,EAAA,GAAA,OAEA,IAAA,EAAA,IAAA,EAAA,CACA,MAAA,MACA,KAAA,EACA,IAAA,IAGA,EAAA,EAAA,GAAA,cAEA,OADA,IAAA,EAAA,cAAA,GACA,EAAA,cAAA,GACA,MAAA,GAAA,OAAA,EACA,EACA,EAAA,MAAA,OACA,EACA,EAAA,MAAA,QACA,GAEA,SAAA,GAGA,IAAA,EAAA,EAAA,GAEA,OAAA,EAAA,GAAA,MAAA,qBACA,EAAA,GAAA,MAAA,SAEA,EAAA,KAAA,EAAA,QAEA,EAAA,GAAA,MAAA,QAEA,EAAA,KAAA,EAAA,UAEA,EAAA,GAAA,MAAA,YAEA,EAAA,KAAA,EAAA,UAGA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,KAAA,2BAAA,EACA,GAGA,EAAA,GAAA,MAAA,UACA,EAAA,KAAA,EAAA,QAEA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,MAAA,UAAA,EAAA,OACA,IAGA,EAAA,GAAA,MAAA,SACA,EAAA,KAAA,EAAA,KAGA,EAAA,GAAA,MAAA,WACA,EAAA,KAAA,EAAA,SAGA,EAAA,GAAA,MAAA,UAEA,EAAA,KAAA,EAAA,QAGA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA;;AC/GA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACA,SAAA,EAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,SAAA,EAAA,IAAA,GAEA,EAAA,IAAA,OAAA,6EAIA,OAAA,KAAA,GAAA,KAAA,KAAA,2EAGA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EAGA,QAAA,sBAAA,SAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,EAAA,GACA,GAAA,EACA,EAAA,EAAA,MA+BA,MA7BA,QAAA,GAAA,QAAA,GACA,EAAA,IAAA,EAAA,GACA,GAAA,GACA,QAAA,GACA,EAAA,IAAA,EAAA,GACA,GAAA,GACA,QAAA,EACA,EAAA,IAAA,GAEA,KAAA,IAAA,EAAA,EAAA,GAAA,KAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,GACA,KAAA,IAAA,EAAA,EAAA,GAAA,KAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,GAEA,EAAA,IAAA,GAIA,EAAA,MAAA,OAAA,UAAA,GACA,GACA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,UAEA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,SAGA,GAIA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OAEA,GADA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,KAGA,EAAA,EAAA,GAAA,cACA,EAAA,EAAA,GACA,QAAA,IAAA,EACA,OAAA,KAGA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,GAAA,EAOA,OALA,GADA,EAAA,GAAA,IACA,cAEA,QAAA,sBAAA,EAAA,EAAA,EAAA,GACA,EAAA,KAAA,iBAAA,EAEA;;ACxFA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,uGAEA,QAAA,OAAA,WAEA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAAA,IACA,EAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,IAGA,EAAA,EAAA,GACA,EAAA,EAAA,QACA,EAAA,EAAA,cAsCA,MApCA,WAAA,GAEA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,IAEA,iBAAA,KAAA,GAGA,EAAA,OAAA,GACA,EAAA,IAAA,EAAA,OAGA,aAAA,KAAA,GAEA,EAAA,KAAA,EAAA,OAEA,EAAA,MAAA,iBAEA,EAAA,MAAA,MAAA,OAAA,GACA,EAAA,OAAA,GACA,EAAA,KAAA,EAAA,QAGA,EAAA,MAAA,SAEA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,MAAA,OAAA,cAAA,EAAA,gBAIA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,KAAA,oBAAA,EACA;;AC9DA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,sDAEA,EAAA,EAEA,QAAA,OAAA,WAEA,EAAA,MAAA,KAAA,WAGA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAAA,IACA,EAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,IAuBA,OApBA,EAAA,KAAA,EAAA,GAEA,aAAA,EAAA,GAEA,EAAA,MAAA,MAAA,OAAA,EAAA,UAAA,EAAA,UAAA,IAEA,WAAA,EAAA,GAEA,EAAA,MAAA,MAAA,OAAA,EAAA,QAAA,EAAA,QAAA,IAEA,WAAA,EAAA,GAEA,EAAA,MAAA,MAAA,OAAA,EAAA,QAAA,EAAA,QAAA,GAEA,QAAA,EAAA,IAEA,EAAA,MAAA,MAAA,OAAA,EAAA,KAAA,EAAA,KAAA,IAGA,EAAA,KAAA,oBAAA,EACA;;ACtCA,QAAA,UAAA,SAAA,EAAA,GAMA,SAAA,EAAA,GACA,OAAA,EAAA,EAAA,WAAA,GAAA,OAGA,OARA,SAAA,GACA,OAAA,EAAA,GAAA,QAAA,UAAA,KAAA,QAAA,UAAA,KAAA,QAAA,UAAA,KAAA,QAAA,UAAA,KAAA,QAAA,iHAAA,IAHA,CAWA,OAAA,OAAA,cAWA,QAAA,UAAA,SAAA,EAAA,GAMA,SAAA,EAAA,GACA,OAAA,EAAA,EAAA,WAAA,GAAA,OAGA,OARA,SAAA,GACA,OAAA,EAAA,GAAA,QAAA,UAAA,KAAA,QAAA,UAAA,KAAA,QAAA,UAAA,KAAA,QAAA,UAAA,KAAA,QAAA,sCAAA,IAHA,CAWA,OAAA,OAAA;;ACxCA,IAAA,EAAA,QAAA,UAEA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,QAAA,kBACA,EAAA,6EAEA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,EAAA,GACA,EAAA,IAAA,EAAA,CACA,KAAA,EAAA,GACA,MAAA,EAAA,MACA,IAAA,IAGA,EAAA,EAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,SAAA,GAEA,IAAA,EAAA,EAAA,GASA,GARA,EAAA,EAAA,UAAA,GACA,EAAA,SAAA,GAEA,EAAA,IAAA,OAAA,GACA,EAAA,IAAA,QAAA,EAAA,GACA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GAEA,EAAA,GAiBA,GAAA,EAAA,GAAA,MAAA,MAEA,EAAA,MAAA,OAAA,OAAA,EAAA,YAEA,CACA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,SAAA,GAEA,MAAA,EAAA,GACA,GAAA,KACA,MAAA,EAAA,KACA,GAAA,MAGA,EAAA,MAAA,OAAA,OAAA,OAhCA,CAGA,EAAA,KAAA,EAAA,GAAA,QACA,IAAA,EAAA,EAAA,QAAA,IAAA,EAAA,KACA,EAAA,EAAA,QAAA,KAAA,EAAA,KACA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,KACA,EAAA,EAEA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,OACA,EAAA,GAGA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QAsBA,OADA,EAAA,KAAA,kBAAA,EACA;;AC9EA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,2BAEA,QAAA,OAAA,WAEA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,EAAA,MAEA,GADA,EAAA,EAAA,GACA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,KAGA,EAAA,EAAA,GACA,EAAA,EAAA,QA4BA,MA1BA,MAAA,GAAA,MAAA,GAAA,MAAA,GAEA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,IAEA,MAAA,EAGA,EAAA,OAAA,GACA,EAAA,IAAA,EAAA,OAGA,MAAA,EAEA,EAAA,KAAA,EAAA,OAEA,EAAA,MAAA,QAEA,EAAA,MAAA,MAAA,OAAA,GACA,EAAA,MAAA,MAAA,WAAA,IAGA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,KAAA,oBAAA,EACA;;ACnDA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAkBA,EAAA,4HAEA,QAAA,OAAA,WAEA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAAA,IACA,EAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,IAGA,EAAA,EAAA,GACA,EAAA,EAAA,QACA,EAAA,EAAA,cAAA,QAAA,OAAA,KAEA,GAAA,UAAA,EAGA,EAAA,OAAA,GACA,EAAA,IAAA,EAAA,YAGA,GAAA,QAAA,EAEA,EAAA,KAAA,EAAA,YAEA,GAAA,UAAA,EAEA,EAAA,MAAA,MAAA,OAAA,GACA,EAAA,OAAA,GACA,EAAA,KAAA,EAAA,YAGA,GAAA,EAAA,MAAA,QAAA,CAGA,UADA,EAAA,EAAA,GAAA,eAGA,EAAA,MAAA,MAAA,OAAA,IAEA,UAAA,EAEA,EAAA,MAAA,MAAA,OAAA,GAEA,SAAA,IAGA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,SAGA,GAAA,EAAA,MAAA,YAAA,CAEA,IAWA,EAXA,EAAA,EAAA,GAAA,cACA,SAAA,EAEA,EAAA,KAAA,EAAA,OAEA,WAAA,GAEA,EAAA,IAAA,EAAA,OAKA,UADA,EAAA,EAAA,GAAA,eAGA,EAAA,MAAA,MAAA,OAAA,IAEA,UAAA,EAEA,EAAA,MAAA,MAAA,OAAA,GAEA,SAAA,IAGA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,SAIA,EAAA,MAAA,WAEA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,MAAA,SAAA,EAAA,UACA,EAAA,MAAA,MAAA,SAAA,EAAA,UACA,EAAA,MAAA,MAAA,cAAA,EAAA,gBAQA,OAJA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,KAAA,oBAAA,EACA;;ACzHA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,+FAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,GACA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAEA,IAAA,EAAA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,IAGA,EAAA,SAAA,EAAA,IACA,MAAA,KAEA,EADA,EAAA,GAAA,MAAA,QACA,GAEA,GAIA,IAAA,EAAA,EAAA,GACA,OAAA,EAAA,GAAA,MAAA,WACA,EAAA,IAAA,EAAA,KAEA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,IAIA,EAAA,GAAA,MAAA,QAEA,EAAA,IAAA,EAAA,QAEA,EAAA,GAAA,MAAA,WAEA,EAAA,IAAA,EAAA,UAGA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,KAAA,wBAAA,EACA;;AC1DA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,wGAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WACA,OAAA,GAGA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GAAA,EAAA,MAAA,GAAA,EAAA,EAAA,MAAA,GAAA,MAAA,MAAA,OAAA,KAEA,EAAA,EAAA,GACA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,MAAA,EAAA,MAAA,EAAA,GAAA,OAEA,IAAA,EAAA,IAAA,EAAA,CACA,MAAA,MACA,KAAA,EACA,IAAA,IAGA,EAAA,SAAA,EAAA,IACA,MAAA,KAEA,EADA,EAAA,GAAA,MAAA,QACA,GAEA,GAIA,IAAA,EAAA,EAAA,GAEA,OAAA,EAAA,GAAA,MAAA,SAAA,EAAA,GAAA,MAAA,WACA,EAAA,GAAA,MAAA,QAEA,EAAA,KAAA,EAAA,QAEA,EAAA,GAAA,MAAA,WAEA,EAAA,KAAA,EAAA,UAGA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,KAAA,uBAAA,EACA,GAGA,EAAA,GAAA,MAAA,WACA,EAAA,KAAA,EAAA,QAEA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,MAAA,UAAA,EAAA,OACA,IAGA,EAAA,GAAA,MAAA,WACA,EAAA,KAAA,EAAA,KAGA,EAAA,GAAA,MAAA,QACA,EAAA,KAAA,EAAA,SAGA,EAAA,GAAA,MAAA,QAEA,EAAA,KAAA,EAAA,QAGA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA;;ACnFA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,gBAAA,iBAEA,EAAA,IAAA,OAAA,gLAUA,KAGA,EAAA,IAAA,OAAA,gKAUA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAGA,GAAA,EAAA,MAAA,GAAA,EAAA,EAAA,MAAA,GAAA,MAAA,MAAA,OAAA,KACA,IAAA,EAAA,EAAA,GACA,EAAA,IAAA,EACA,EAAA,IAAA,EACA,EAAA,MAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,KAAA,EAAA,GAAA,UAAA,EAAA,GAAA,QACA,EAAA,KAAA,wBAAA,EAEA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QAEA,IAAA,EAAA,EACA,EAAA,EACA,GAAA,EAGA,GAAA,MAAA,EAAA,GAAA,CAEA,IADA,EAAA,SAAA,EAAA,MACA,GAAA,OAAA,KAEA,EAAA,MAAA,OAAA,SAAA,GAsBA,GAlBA,EAAA,GAAA,cAAA,MAAA,WACA,EAAA,EACA,EAAA,IACA,cAAA,EAAA,GAAA,eACA,EAAA,EACA,EAAA,GAEA,EAAA,SAAA,EAAA,IAIA,MAAA,EAAA,GACA,EAAA,SAAA,EAAA,IACA,EAAA,MACA,EAAA,EAAA,IACA,EAAA,SAAA,EAAA,MAGA,GAAA,GACA,OAAA,KAGA,GAAA,EAAA,GACA,OAAA,KAOA,GALA,GAAA,KACA,EAAA,GAIA,MAAA,EAAA,GAAA,CACA,GAAA,EAAA,GAAA,OAAA,KACA,IAAA,EAAA,EAAA,GAAA,GAAA,cACA,KAAA,IACA,EAAA,EACA,IAAA,IAAA,EAAA,IAGA,KAAA,IACA,EAAA,EACA,IAAA,IAAA,GAAA,KAaA,GAVA,EAAA,MAAA,OAAA,OAAA,GACA,EAAA,MAAA,OAAA,SAAA,GACA,GAAA,GACA,EAAA,MAAA,OAAA,WAAA,KAMA,EAAA,EAAA,KAAA,EAAA,UAAA,EAAA,MAAA,EAAA,KAAA,UAGA,OAAA,EAAA,KAAA,MAAA,SACA,KAEA,EAMA,GAAA,EAAA,GAAA,MAAA,0BACA,OAAA,EAGA,MAAA,EAAA,MACA,EAAA,IAAA,IAAA,EAAA,KAAA,EAAA,MAAA,SAGA,EAAA,EACA,EAAA,EACA,GAAA,EAGA,GAAA,MAAA,EAAA,GAAA,CACA,IAAA,EACA,IADA,EAAA,SAAA,EAAA,MACA,GAAA,OAAA,KAEA,EAAA,IAAA,OAAA,SAAA,GAMA,GAHA,EAAA,SAAA,EAAA,IAGA,MAAA,EAAA,IAGA,IADA,EAAA,SAAA,EAAA,MACA,GAAA,OAAA,OAEA,EAAA,MAEA,EAAA,EAAA,IACA,EAAA,SAAA,EAAA,MAGA,GAAA,GAAA,GACA,OAAA,KAGA,GAAA,EAAA,GACA,OAAA,KAOA,GALA,GAAA,KACA,EAAA,GAIA,MAAA,EAAA,GAAA,CAEA,GAAA,EAAA,GAAA,OAAA,KAEA,KAAA,EAAA,GAAA,GAAA,gBACA,EAAA,EACA,IAAA,IACA,EAAA,EACA,EAAA,IAAA,UAAA,QACA,EAAA,IAAA,MAAA,MAAA,EAAA,IAAA,IAAA,OAAA,KAKA,KAAA,EAAA,GAAA,GAAA,gBACA,EAAA,EACA,IAAA,IAAA,GAAA,KAGA,EAAA,MAAA,UAAA,cACA,GAAA,GAEA,EAAA,MAAA,MAAA,WAAA,GAEA,IAAA,EAAA,MAAA,IAAA,SACA,EAAA,MAAA,OAAA,OAAA,KAKA,EAAA,MAAA,MAAA,WAAA,GAEA,IAAA,EAAA,MAAA,IAAA,SACA,EAAA,MAAA,OAAA,OAAA,EAAA,MAAA,IAAA,QAAA,WAKA,GAAA,KACA,EAAA,GAcA,OAXA,EAAA,KAAA,EAAA,KAAA,EAAA,GACA,EAAA,IAAA,OAAA,OAAA,GACA,EAAA,IAAA,OAAA,SAAA,GACA,GAAA,GACA,EAAA,IAAA,OAAA,WAAA,GAGA,EAAA,IAAA,OAAA,UAAA,EAAA,MAAA,OAAA,WACA,EAAA,IAAA,MAAA,MAAA,EAAA,IAAA,IAAA,OAAA,GAGA;;ACxOA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,yBAAA,sBAEA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,UAAA,EAAA,YAAA,EAAA,IAAA,EACA,OAAA,EAAA,IAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,GAEA,EAAA,IAAA,OAAA,oEAGA,OAAA,KAAA,GAAA,KAAA,KAAA,8EAGA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OAEA,GADA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,KAGA,EAAA,EAAA,GAAA,cACA,EAAA,EAAA,GACA,QAAA,IAAA,EAAA,OAAA,KAEA,IAAA,EAAA,KACA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,CACA,IAAA,EAAA,GAAA,EAGA,WAFA,EAAA,EAAA,eAGA,EAAA,OAEA,WAAA,GAAA,WAAA,EACA,EAAA,OAEA,QAAA,IACA,EAAA,QAMA,OAFA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,KAAA,iBAAA,EACA;;AC9DA,QAAA,eAAA,CACA,QAAA,EACA,IAAA,EACA,MAAA,EACA,IAAA,EACA,OAAA,EACA,IAAA,EACA,YAAA,EACA,UAAA,EACA,IAAA,EACA,OAAA,EACA,IAAA,EACA,QAAA,EACA,IAAA,EACA,SAAA,EACA,OAAA,EACA,IAAA,GAEA,QAAA,aAAA,CACA,MAAA,EACA,IAAA,EACA,OAAA,EACA,QAAA,EACA,IAAA,EACA,OAAA,EACA,MAAA,EACA,IAAA,EACA,OAAA,EACA,MAAA,EACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,IAAA,EACA,OAAA,EACA,MAAA,EACA,IAAA,EACA,OAAA,EACA,MAAA,EACA,IAAA,EACA,OAAA,EACA,OAAA,EACA,IAAA,EACA,OAAA,EACA,WAAA,EACA,IAAA,EACA,KAAA,EACA,OAAA,EACA,QAAA,EACA,QAAA,GACA,IAAA,GACA,OAAA,GACA,UAAA,GACA,IAAA,GACA,OAAA,GACA,UAAA,GACA,IAAA,GACA,OAAA;;ACnDA,IAAA,EAAA,QAAA,UAEA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,QAAA,kBAEA,EAAA,EAAA,eAEA,EAAA,IAAA,OAAA,2gBAMA,KAGA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,IAAA,EAAA,CACA,KAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,MAAA,EAAA,MAAA,EAAA,GAAA,OACA,IAAA,IAGA,EAAA,EAAA,GACA,EAAA,EAAA,aAAA,EAAA,eAEA,IAAA,EAAA,EAAA,GACA,EAAA,SAAA,GAEA,IAAA,EAAA,KAgBA,GAfA,EAAA,KACA,EAAA,EAAA,GACA,EAAA,SAAA,GAEA,EAAA,GACA,eAAA,KAAA,EAAA,MAEA,GAAA,GAEA,EAAA,MAEA,GAAA,MAIA,EACA,EAAA,MAAA,OAAA,MAAA,GACA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,OACA,CAGA,IAAA,EAAA,EAAA,GACA,EAAA,MAAA,EAAA,GACA,EAAA,KAAA,GACA,EAAA,KAAA,EAAA,GAAA,QAEA,IAAA,EAAA,EAAA,QAAA,IAAA,EAAA,KACA,EAAA,EAAA,QAAA,KAAA,EAAA,KACA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,KACA,EAAA,EAEA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,OACA,EAAA,GAGA,EAAA,MAAA,OAAA,MAAA,GACA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QAIA,GAAA,EAAA,GAAA,CACA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,eAAA,EAAA,eACA,EAAA,MAAA,OAAA,UAAA,GAUA,OANA,EAAA,KACA,EAAA,IAAA,EAAA,MAAA,QACA,EAAA,IAAA,OAAA,MAAA,SAAA,EAAA,MAGA,EAAA,KAAA,+BAAA,EACA;;ACnGA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,IAAA,OAAA,gOAUA,KAEA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,UAAA,EAAA,YAAA,EAAA,IAAA,EACA,OAAA,EAAA,IAAA,EAAA,QAAA,EAAA,KAAA,EAAA,SAAA,EAAA,OAAA,EAAA,IAAA,GAGA,EAAA,EACA,EAAA,EAGA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,SAAA,GACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GACA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GAAA,KAAA,EAAA,IAAA,KAAA,EAAA,GAAA,CAQA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OAIA,GAHA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAGA,IAAA,EAAA,CACA,KAAA,EACA,MAAA,EACA,IAAA,KAGA,IAAA,EAAA,MAAA,cACA,EAAA,MAAA,4BAIA,EAAA,MAAA,EAAA,GAAA,QAAA,KAAA,IAAA,CAEA,IACA,EAAA,EAAA,IAAA,EAAA,GAAA,OAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GAMA,GAJA,EAAA,SAAA,GACA,EAAA,SAAA,GACA,EAAA,SAAA,IAEA,EAAA,GAAA,EAAA,KACA,EAAA,GAAA,CAGA,KAAA,GAAA,GAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAQA,OAAA,KANA,IAAA,EAAA,EACA,EAAA,EACA,EAAA,EAQA,OAAA,EAAA,GAAA,EAAA,GAAA,MAEA,EAAA,MAEA,GADA,EAAA,GACA,KAEA,KAIA,EAAA,MAAA,OAAA,MAAA,GACA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,GAGA,EAAA,IACA,EAAA,MAAA,OAAA,UAAA,EAAA,EAAA,GAAA,gBAGA,EAAA,KAAA,yBAAA,EACA,SAlEA,EAAA,OAAA,EAAA,GAAA;;ACxCA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,mKAEA,QAAA,OAAA,WAEA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAAA,IACA,EAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,IAGA,EAAA,EAAA,GACA,EAAA,EAAA,QACA,EAAA,EAAA,cAkDA,OAhDA,EAAA,MAAA,WAEA,EAAA,OAAA,GACA,EAAA,IAAA,EAAA,OAIA,EAAA,MAAA,SACA,EAAA,KAAA,EAAA,OAGA,EAAA,MAAA,iBAEA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,IAEA,EAAA,MAAA,gBAEA,EAAA,MAAA,MAAA,OAAA,GACA,EAAA,OAAA,GACA,EAAA,KAAA,EAAA,QAGA,EAAA,MAAA,sBAEA,EAAA,MAAA,MAAA,OAAA,IAEA,EAAA,MAAA,UAEA,EAAA,MAAA,MAAA,OAAA,IAEA,EAAA,MAAA,SAEA,EAAA,MAAA,MAAA,OAAA,GAEA,EAAA,MAAA,gBAEA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,MAAA,SAAA,EAAA,UACA,EAAA,MAAA,MAAA,SAAA,EAAA,UACA,EAAA,MAAA,MAAA,cAAA,EAAA,gBAIA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,KAAA,oBAAA,EACA;;AC/EA,QAAA,eAAA,CACA,SAAA,EACA,IAAA,EACA,MAAA,EACA,IAAA,EACA,MAAA,EACA,IAAA,EACA,SAAA,EACA,IAAA,EACA,MAAA,EACA,IAAA,EACA,SAAA,EACA,IAAA,EACA,OAAA,EACA,IAAA,GAGA,QAAA,aAAA,CACA,QAAA,EACA,IAAA,EACA,OAAA,EACA,UAAA,EACA,MAAA,EACA,OAAA,EACA,QAAA,EACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,IAAA,EACA,OAAA,EACA,MAAA,EACA,IAAA,EACA,OAAA,EACA,IAAA,EACA,KAAA,EACA,IAAA,EACA,QAAA,EACA,IAAA,EACA,OAAA,EACA,OAAA,EACA,KAAA,EACA,UAAA,EACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,QAAA,GACA,IAAA,GACA,OAAA,GACA,SAAA,GACA,IAAA,GACA,OAAA,GACA,WAAA,GACA,SAAA,GACA,IAAA,GACA,OAAA,IAGA,QAAA,sBAAA,yEACA,QAAA,cAAA,CACA,GAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,IAAA,EACA,KAAA,EACA,KAAA,EACA,KAAA,EACA,IAAA,GACA,KAAA,GACA,MAAA,GACA,OAAA;;ACnEA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,kBAEA,EAAA,IAAA,OAAA,wBAEA,EAAA,sBAAA,mIAEA,KAGA,EAAA,IAAA,OAAA,wBAEA,EAAA,sBAAA,mEAEA,KAGA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WACA,OAAA,KAAA,eAAA,EAAA,GAGA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,GACA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAEA,IAAA,EAAA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,IAGA,EAAA,EAAA,GAEA,OADA,IAAA,EAAA,cAAA,GACA,EAAA,cAAA,GACA,OAAA,GAAA,QAAA,EACA,EACA,EAAA,MAAA,cACA,EACA,EAAA,MAAA,WACA,GAEA,SAAA,GAGA,IAAA,EAAA,EAAA,GACA,OAAA,EAAA,GAAA,MAAA,6BAEA,EAAA,GAAA,MAAA,QACA,EAAA,IAAA,EAAA,KACA,EAAA,GAAA,MAAA,YACA,EAAA,IAAA,EAAA,EAAA,KACA,EAAA,GAAA,MAAA,SACA,EAAA,IAAA,EAAA,SACA,EAAA,GAAA,MAAA,WACA,EAAA,IAAA,EAAA,QAGA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,IAGA,EAAA,GAAA,MAAA,UAEA,EAAA,IAAA,EAAA,QAEA,EAAA,GAAA,MAAA,QAEA,EAAA,IAAA,EAAA,WAEA,EAAA,GAAA,MAAA,cAEA,EAAA,IAAA,EAAA,UAGA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,KAAA,wBAAA,EACA;;AC1FA,IAAA,EAAA,QAAA,UAEA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,QAAA,kBAEA,EAAA,EAAA,eAEA,EAAA,IAAA,OAAA,+cAMA,KAGA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,IAAA,EAAA,CACA,KAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,MAAA,EAAA,MAAA,EAAA,GAAA,OACA,IAAA,IAGA,EAAA,EAAA,GACA,EAAA,EAAA,aAAA,EAAA,eAEA,IAAA,EAAA,EAAA,GACA,EAAA,SAAA,GAEA,IAAA,EAAA,KAgBA,GAfA,EAAA,KACA,EAAA,EAAA,GACA,EAAA,SAAA,GAEA,EAAA,GACA,KAAA,KAAA,EAAA,MAEA,GAAA,GAEA,EAAA,MAEA,GAAA,MAIA,EACA,EAAA,MAAA,OAAA,MAAA,GACA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,OACA,CAGA,IAAA,EAAA,EAAA,GACA,EAAA,MAAA,EAAA,GACA,EAAA,KAAA,GACA,EAAA,KAAA,EAAA,GAAA,QAEA,IAAA,EAAA,EAAA,QAAA,IAAA,EAAA,KACA,EAAA,EAAA,QAAA,KAAA,EAAA,KACA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,KACA,EAAA,EAEA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,OACA,EAAA,GAGA,EAAA,MAAA,OAAA,MAAA,GACA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QAIA,GAAA,EAAA,GAAA,CACA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,eAAA,EAAA,eACA,EAAA,MAAA,OAAA,UAAA,GAUA,OANA,EAAA,KACA,EAAA,IAAA,EAAA,MAAA,QACA,EAAA,IAAA,OAAA,MAAA,SAAA,EAAA,MAGA,EAAA,KAAA,+BAAA,EACA;;ACnGA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,IAAA,OAAA,4NAUA,KAEA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,SAAA,EAAA,IAAA,EACA,MAAA,EAAA,IAAA,EAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,GAGA,EAAA,EACA,EAAA,EAGA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,SAAA,GACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GACA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GAAA,KAAA,EAAA,IAAA,KAAA,EAAA,GAAA,CAQA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OAIA,GAHA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAGA,IAAA,EAAA,CACA,KAAA,EACA,MAAA,EACA,IAAA,KAGA,IAAA,EAAA,MAAA,cACA,EAAA,MAAA,4BAIA,EAAA,MAAA,EAAA,GAAA,QAAA,KAAA,IAAA,CAEA,IACA,EAAA,EAAA,IAAA,EAAA,GAAA,OAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GAMA,GAJA,EAAA,SAAA,GACA,EAAA,SAAA,GACA,EAAA,SAAA,IAEA,EAAA,GAAA,EAAA,KACA,EAAA,GAAA,CAEA,KAAA,GAAA,GAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAQA,OAAA,KANA,IAAA,EAAA,EACA,EAAA,EACA,EAAA,EAQA,OAAA,EAAA,GAAA,EAAA,GAAA,MAEA,EAAA,MAEA,GADA,EAAA,GACA,KAEA,KAIA,EAAA,MAAA,OAAA,MAAA,GACA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,GAGA,EAAA,IACA,EAAA,MAAA,OAAA,UAAA,EAAA,EAAA,GAAA,gBAGA,EAAA,KAAA,yBAAA,EACA,SAjEA,EAAA,OAAA,EAAA,GAAA;;ACxCA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,oGAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WACA,OAAA,GAGA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GAAA,EAAA,MAAA,GAAA,EAAA,EAAA,MAAA,GAAA,MAAA,MAAA,OAAA,KAEA,EAAA,EAAA,GACA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,MAAA,EAAA,MAAA,EAAA,GAAA,OAEA,IAAA,EAAA,IAAA,EAAA,CACA,MAAA,MACA,KAAA,EACA,IAAA,IAEA,EAAA,KAAA,uBAAA,EAEA,IAAA,EAAA,SAAA,EAAA,IACA,MAAA,KAEA,EADA,EAAA,GAAA,MAAA,QACA,GAEA,GAIA,IAAA,EAAA,EAAA,GAEA,OAAA,EAAA,GAAA,MAAA,UAAA,EAAA,GAAA,MAAA,WACA,EAAA,GAAA,MAAA,SAEA,EAAA,KAAA,EAAA,QAEA,EAAA,GAAA,MAAA,WAEA,EAAA,KAAA,EAAA,UAGA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,SAAA,EAAA,UAEA,GAGA,EAAA,GAAA,MAAA,YACA,EAAA,KAAA,EAAA,QAEA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,MAAA,UAAA,EAAA,OACA,IAGA,EAAA,GAAA,MAAA,SACA,EAAA,KAAA,EAAA,KAGA,EAAA,GAAA,MAAA,SACA,EAAA,KAAA,EAAA,SAGA,EAAA,GAAA,MAAA,iBAEA,EAAA,KAAA,EAAA,QAGA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA;;ACpFA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,gBAAA,iBAEA,EAAA,IAAA,OAAA,8KAUA,KAGA,EAAA,IAAA,OAAA,+KAUA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAGA,GAAA,EAAA,MAAA,GAAA,EAAA,EAAA,MAAA,GAAA,MAAA,MAAA,OAAA,KACA,IAAA,EAAA,EAAA,GACA,EAAA,IAAA,EACA,EAAA,IAAA,EACA,EAAA,MAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,KAAA,EAAA,GAAA,UAAA,EAAA,GAAA,QACA,EAAA,KAAA,wBAAA,EAEA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QAEA,IAAA,EAAA,EACA,EAAA,EACA,GAAA,EAGA,GAAA,MAAA,EAAA,GAAA,CAEA,IADA,EAAA,SAAA,EAAA,MACA,GAAA,OAAA,KAEA,EAAA,MAAA,OAAA,SAAA,GAsBA,GAlBA,QAAA,EAAA,GAAA,eACA,EAAA,EACA,EAAA,IACA,UAAA,EAAA,GAAA,eACA,EAAA,EACA,EAAA,GAEA,EAAA,SAAA,EAAA,IAIA,MAAA,EAAA,GACA,EAAA,SAAA,EAAA,IACA,EAAA,MACA,EAAA,EAAA,IACA,EAAA,SAAA,EAAA,MAGA,GAAA,GACA,OAAA,KAGA,GAAA,EAAA,GACA,OAAA,KAOA,GALA,GAAA,KACA,EAAA,GAIA,MAAA,EAAA,GAAA,CACA,GAAA,EAAA,GAAA,OAAA,KACA,IAAA,EAAA,EAAA,GAAA,GAAA,cACA,KAAA,IACA,EAAA,EACA,IAAA,IAAA,EAAA,IAGA,KAAA,IACA,EAAA,EACA,IAAA,IAAA,GAAA,KAaA,GAVA,EAAA,MAAA,OAAA,OAAA,GACA,EAAA,MAAA,OAAA,SAAA,GACA,GAAA,GACA,EAAA,MAAA,OAAA,WAAA,KAMA,EAAA,EAAA,KAAA,EAAA,UAAA,EAAA,MAAA,EAAA,KAAA,UAGA,OAAA,EAAA,KAAA,MAAA,SACA,KAEA,EAMA,GAAA,EAAA,GAAA,MAAA,0BACA,OAAA,EAGA,MAAA,EAAA,MACA,EAAA,IAAA,IAAA,EAAA,KAAA,EAAA,MAAA,SAGA,EAAA,EACA,EAAA,EACA,GAAA,EAGA,GAAA,MAAA,EAAA,GAAA,CACA,IAAA,EACA,IADA,EAAA,SAAA,EAAA,MACA,GAAA,OAAA,KAEA,EAAA,IAAA,OAAA,SAAA,GAMA,GAHA,EAAA,SAAA,EAAA,IAGA,MAAA,EAAA,IAGA,IADA,EAAA,SAAA,EAAA,MACA,GAAA,OAAA,OAEA,EAAA,MAEA,EAAA,EAAA,IACA,EAAA,SAAA,EAAA,MAGA,GAAA,GAAA,GACA,OAAA,KAGA,GAAA,EAAA,GACA,OAAA,KAOA,GALA,GAAA,KACA,EAAA,GAIA,MAAA,EAAA,GAAA,CAEA,GAAA,EAAA,GAAA,OAAA,KAEA,KAAA,EAAA,GAAA,GAAA,gBACA,EAAA,EACA,IAAA,IACA,EAAA,EACA,EAAA,IAAA,UAAA,QACA,EAAA,IAAA,MAAA,MAAA,EAAA,IAAA,IAAA,OAAA,KAKA,KAAA,EAAA,GAAA,GAAA,gBACA,EAAA,EACA,IAAA,IAAA,GAAA,KAGA,EAAA,MAAA,UAAA,cACA,GAAA,GAEA,EAAA,MAAA,MAAA,WAAA,GAEA,IAAA,EAAA,MAAA,IAAA,SACA,EAAA,MAAA,OAAA,OAAA,KAKA,EAAA,MAAA,MAAA,WAAA,GAEA,IAAA,EAAA,MAAA,IAAA,SACA,EAAA,MAAA,OAAA,OAAA,EAAA,MAAA,IAAA,QAAA,WAKA,GAAA,KACA,EAAA,GAcA,OAXA,EAAA,KAAA,EAAA,KAAA,EAAA,GACA,EAAA,IAAA,OAAA,OAAA,GACA,EAAA,IAAA,OAAA,SAAA,GACA,GAAA,GACA,EAAA,IAAA,OAAA,WAAA,GAGA,EAAA,IAAA,OAAA,UAAA,EAAA,MAAA,OAAA,WACA,EAAA,IAAA,MAAA,MAAA,EAAA,IAAA,IAAA,OAAA,GAGA;;ACxOA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,yBAAA,sBAEA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,SAAA,EAAA,IAAA,EACA,MAAA,EAAA,IAAA,EAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,GAEA,EAAA,IAAA,OAAA,gDAGA,OAAA,KAAA,GAAA,KAAA,KAAA,oEAGA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OAEA,GADA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,KAGA,EAAA,EAAA,GAAA,cACA,EAAA,EAAA,GACA,QAAA,IAAA,EAAA,OAAA,KAEA,IAAA,EAAA,KACA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,CACA,IAAA,EAAA,GAAA,EAGA,YAFA,EAAA,EAAA,eAGA,EAAA,OACA,YAAA,EACA,EAAA,OACA,MAAA,IACA,EAAA,QAMA,OAFA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,KAAA,iBAAA,EACA;;;;ACsBA,IAAA,EAAA,EAAA,UAAA,IAhFA,SAAA,EAAA,GACA,iBAAA,SAAA,oBAAA,QACA,mBAAA,QAAA,EAAA,QAAA,cACA,mBAAA,GAAA,EAAA,IAAA,EAAA,CAAA,aAAA,GACA,EAAA,EAAA,QAJA,CAKA,KAAA,SAAA,GAAA,aAwEA,OArEA,EAAA,aAAA,KAAA,CACA,OAAA,uFAAA,MAAA,KACA,YAAA,iEAAA,MAAA,KACA,kBAAA,EACA,SAAA,sDAAA,MAAA,KACA,cAAA,qCAAA,MAAA,KACA,YAAA,uBAAA,MAAA,KACA,oBAAA,EACA,eAAA,CACA,GAAA,QACA,IAAA,WACA,EAAA,aACA,GAAA,cACA,IAAA,oBACA,KAAA,0BAEA,SAAA,CACA,QAAA,qBACA,QAAA,gBACA,SAAA,cACA,QAAA,cACA,SAAA,sBACA,SAAA,KAEA,aAAA,CACA,OAAA,UACA,KAAA,YACA,EAAA,oBACA,GAAA,cACA,EAAA,aACA,GAAA,aACA,EAAA,YACA,GAAA,YACA,EAAA,UACA,GAAA,WACA,EAAA,UACA,GAAA,UACA,EAAA,QACA,GAAA,UAEA,uBAAA,eACA,QAAA,SAAA,EAAA,GACA,OAAA,GAIA,IAAA,IACA,OAAA,GAAA,IAAA,EAAA,KAAA,IAGA,QACA,IAAA,IACA,IAAA,IACA,IAAA,MACA,IAAA,IACA,OAAA,GAAA,IAAA,EAAA,KAAA,KAGA,IAAA,IACA,IAAA,IACA,OAAA,GAAA,IAAA,EAAA,KAAA,OAGA,KAAA,CACA,IAAA,EACA,IAAA;;ACtEA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,kBAKA,EAAA,EAAA,SACA,QAAA,oBACA,EAAA,OAAA,GAEA,IAAA,EAAA,IAAA,OAAA,qCAEA,EAAA,sBAAA,4PAIA,KAGA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,GACA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAGA,IAAA,OAAA,IAAA,EAAA,GAAA,IAAA,EAAA,GAEA,OADA,IAAA,EAAA,cAAA,GACA,EAAA,cAAA,GAEA,SAAA,GAIA,IAAA,OAAA,IAAA,EAAA,QACA,IAAA,EAAA,GAAA,GAAA,EAAA,GAAA,cACA,EAAA,GAAA,cACA,GAAA,EAAA,CAKA,IAOA,EAPA,EAAA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,IAKA,OAHA,EAAA,KAAA,4BAAA,GAGA,GACA,IAAA,eAAA,KAAA,GACA,IAAA,YAAA,KAAA,GACA,EAAA,EACA,MACA,IAAA,iBAAA,KAAA,GACA,IAAA,eAAA,KAAA,GACA,IAAA,oBAAA,KAAA,GACA,GAAA,EAIA,IAAA,EAAA,EAAA,EAEA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,OAAA,MACA,EAAA,OAAA,MACA,IACA,EADA,EAAA,EAAA,GAEA,QAAA,GACA,IAAA,YAAA,KAAA,GACA,EAAA,IAAA,EAAA,KACA,EAAA,IAAA,EAAA,KACA,EAAA,SACA,MACA,IAAA,gBAAA,KAAA,GACA,EAAA,IAAA,EAAA,KACA,EAAA,IAAA,EAAA,KACA,EAAA,SACA,MACA,IAAA,UAAA,KAAA,GACA,EAAA,IAAA,EAAA,KACA,EAAA,IAAA,EAAA,KACA,EAAA,OACA,MACA,IAAA,SAAA,KAAA,GACA,EAAA,IAAA,EAAA,KACA,EAAA,IAAA,EAAA,KACA,EAAA,MACA,MACA,IAAA,YAAA,KAAA,GACA,EAAA,IAAA,EAAA,KACA,EAAA,IAAA,EAAA,KACA,EAAA,OACA,MACA,IAAA,QAAA,KAAA,GACA,EAAA,IAAA,EAAA,KACA,EAAA,IAAA,EAAA,KACA,EAAA,QACA,MACA,IAAA,cAAA,KAAA,GACA,EAAA,IAAA,EAAA,KACA,EAAA,IAAA,EAAA,KACA,EAAA,UACA,MACA,IAAA,UAAA,KAAA,GACA,EAAA,IAAA,EAAA,KACA,EAAA,IAAA,EAAA,KACA,EAAA,OAKA,GAAA,EAAA,EAAA,CACA,IAAA,EAAA,EACA,EAAA,EACA,EAAA,EAwBA,OApBA,EAAA,QAAA,GACA,EAAA,MAAA,GAGA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,cAAA,EAAA,eAEA,EAAA,IAAA,EAAA,MAAA,QACA,EAAA,IAAA,OAAA,OAAA,EAAA,QACA,EAAA,IAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,IAAA,OAAA,MAAA,EAAA,QACA,EAAA,IAAA,OAAA,SAAA,EAAA,UACA,EAAA,IAAA,OAAA,SAAA,EAAA,UACA,EAAA,IAAA,OAAA,OAAA,EAAA,QACA,EAAA,IAAA,OAAA,cAAA,EAAA,eACA;;AC7JA,IAAA,EAAA,CACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,GACA,IAAA,GACA,IAAA,IAGA,EAAA,CACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,GAGA,QAAA,OAAA,EACA,QAAA,eAAA,EAEA,QAAA,iBAAA,SAAA,GAEA,IADA,IAAA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,IAAA,EAAA,EAAA,GACA,MAAA,EACA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,GAEA,GAAA,EAAA,GAGA,OAAA,GAGA,QAAA,eAAA,SAAA,GAEA,IADA,IAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,IAAA,EAAA,EAAA,GACA,GAAA,EAAA,GAEA,OAAA,SAAA;;AC7CA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,QAAA,0BAEA,EAAA,IAAA,OACA,cAAA,OAAA,KAAA,EAAA,QAAA,KAAA,IAAA,kDAIA,OAAA,KAAA,EAAA,QAAA,KAAA,IAAA,0CAIA,OAAA,KAAA,EAAA,QAAA,KAAA,IAAA,4BAKA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WAEA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WACA,OAAA,GAGA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,GACA,EAAA,IAAA,EAAA,CACA,KAAA,EAAA,GACA,MAAA,EAAA,MACA,IAAA,IAIA,EAAA,SAAA,EAAA,IAKA,GAJA,MAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,KACA,EAAA,MAAA,OAAA,QAAA,GAGA,EAAA,GAAA,CACA,IAAA,EAAA,SAAA,EAAA,IACA,MAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,KACA,EAAA,MAAA,OAAA,MAAA,QAEA,EAAA,MAAA,MAAA,MAAA,EAAA,QAIA,GAAA,EAAA,GAAA,CACA,IAAA,EAAA,SAAA,EAAA,IACA,MAAA,KAAA,EAAA,EAAA,eAAA,EAAA,KACA,EAAA,MAAA,OAAA,OAAA,QAEA,EAAA,MAAA,MAAA,OAAA,EAAA,QAIA,OADA,EAAA,KAAA,kBAAA,EACA;;AChEA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,yBAAA,sBAEA,EAAA,QAAA,0BAEA,EAAA,IAAA,OACA,+BAGA,OAAA,KAAA,EAAA,gBAAA,KAAA,KAAA,KAGA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WAEA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WACA,OAAA,GAGA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,MACA,EAAA,EAAA,GACA,IAAA,EAAA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,IAGA,EAAA,EAAA,GACA,EAAA,EAAA,eAAA,GACA,QAAA,IAAA,EAAA,OAAA,KAEA,IAAA,EAAA,KACA,EAAA,EAAA,GAYA,MAVA,KAAA,EACA,EAAA,OACA,KAAA,EACA,EAAA,OACA,KAAA,GAAA,KAAA,GAAA,KAAA,IACA,EAAA,QAGA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,KAAA,qBAAA,EACA;;ACnDA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,gBAAA,iBAEA,EAAA,QAAA,0BAEA,EAAA,6OASA,OAAA,KAAA,EAAA,QAAA,KAAA,IAAA,8CAEA,OAAA,KAAA,EAAA,QAAA,KAAA,IAAA,wCAEA,OAAA,KAAA,EAAA,QAAA,KAAA,IAAA,kDAGA,EAAA,sQASA,OAAA,KAAA,EAAA,QAAA,KAAA,IAAA,8CAEA,OAAA,KAAA,EAAA,QAAA,KAAA,IAAA,wCAEA,OAAA,KAAA,EAAA,QAAA,KAAA,IAAA,kDAGA,EAAA,IAAA,OAAA,EAAA,KACA,EAAA,IAAA,OAAA,EAAA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WAEA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WACA,OAAA,GAGA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAGA,GAAA,EAAA,MAAA,GAAA,EAAA,EAAA,MAAA,GAAA,MAAA,MAAA,OAAA,KACA,IAAA,EAAA,EAAA,GACA,EAAA,IAAA,EACA,EAAA,IAAA,EACA,EAAA,MAAA,EAAA,MACA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,wBAAA,EAEA,IAAA,EAAA,EAAA,QAGA,GAAA,EAAA,GAEA,MADA,EAAA,EAAA,KACA,KAAA,EAEA,EAAA,OAAA,GACA,EAAA,IAAA,EAAA,OAEA,KAAA,GAAA,KAAA,GAAA,KAAA,GACA,EAAA,KAAA,EAAA,OAEA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,aACA,GAAA,EAAA,GAAA,CAEA,MADA,EAAA,EAAA,KACA,KAAA,EACA,EAAA,IAAA,EAAA,OACA,KAAA,GAAA,KAAA,GAAA,KAAA,GACA,EAAA,KAAA,EAAA,OAEA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,aAEA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QAGA,IAAA,EAAA,EACA,EAAA,EACA,GAAA,EAGA,GAAA,EAAA,GAAA,CACA,IAAA,EAAA,SAAA,EAAA,IAIA,GAHA,MAAA,KACA,EAAA,EAAA,iBAAA,EAAA,KAEA,GAAA,GAAA,OAAA,KACA,EAAA,MAAA,OAAA,SAAA,GAyBA,GAtBA,EAAA,SAAA,EAAA,IACA,MAAA,KACA,EAAA,EAAA,iBAAA,EAAA,KAIA,EAAA,GACA,KAAA,EAAA,GACA,EAAA,GACA,KAAA,EAAA,IAAA,KAAA,EAAA,GACA,EAAA,GAEA,EAAA,SAAA,EAAA,IACA,MAAA,KACA,EAAA,EAAA,iBAAA,EAAA,MAGA,EAAA,MACA,EAAA,EAAA,IACA,EAAA,SAAA,EAAA,MAGA,GAAA,GACA,OAAA,KAGA,GAAA,EAAA,GACA,OAAA,KAOA,GALA,GAAA,KACA,EAAA,GAIA,EAAA,GAAA,CACA,GAAA,EAAA,GAAA,OAAA,KAEA,MADA,EAAA,EAAA,GAAA,GAAA,iBAEA,EAAA,EACA,IAAA,IAAA,EAAA,IAGA,KAAA,IACA,EAAA,EACA,IAAA,IAAA,GAAA,UAEA,GAAA,EAAA,GAAA,CAGA,MADA,EADA,EAAA,GACA,KACA,KAAA,GACA,EAAA,EACA,IAAA,IAAA,EAAA,IACA,KAAA,IACA,EAAA,EACA,IAAA,IAAA,GAAA,UAEA,GAAA,EAAA,GAAA,CAGA,MADA,EADA,EAAA,GACA,KACA,KAAA,GAAA,KAAA,GAAA,KAAA,GACA,EAAA,EACA,IAAA,IAAA,EAAA,IACA,KAAA,GAAA,KAAA,GAAA,KAAA,IACA,EAAA,EACA,IAAA,IAAA,GAAA,UAEA,GAAA,EAAA,GAAA,CAGA,MADA,EADA,EAAA,GACA,KACA,KAAA,GAAA,KAAA,GAAA,KAAA,GACA,EAAA,EACA,IAAA,IAAA,EAAA,IACA,KAAA,GAAA,KAAA,GAAA,KAAA,IACA,EAAA,EACA,IAAA,IAAA,GAAA,KAsBA,GAlBA,EAAA,MAAA,OAAA,OAAA,GACA,EAAA,MAAA,OAAA,SAAA,GAEA,GAAA,EACA,EAAA,MAAA,OAAA,WAAA,GAEA,EAAA,GACA,EAAA,MAAA,MAAA,WAAA,GAEA,EAAA,MAAA,MAAA,WAAA,KAQA,EAAA,EAAA,KAAA,EAAA,UAAA,EAAA,MAAA,EAAA,KAAA,UAGA,OAAA,EAAA,KAAA,MAAA,SACA,KAEA,EAGA,IAKA,EALA,EAAA,EAAA,QAIA,GAHA,EAAA,IAAA,IAAA,EAAA,KAAA,MAGA,EAAA,GAEA,MADA,EAAA,EAAA,KACA,KAAA,EAEA,EAAA,OAAA,GACA,EAAA,IAAA,EAAA,OAEA,KAAA,GAAA,KAAA,GAAA,KAAA,GACA,EAAA,KAAA,EAAA,OAEA,EAAA,IAAA,OAAA,MAAA,EAAA,QACA,EAAA,IAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,IAAA,OAAA,OAAA,EAAA,aACA,GAAA,EAAA,GAAA,CACA,IAAA,EACA,MADA,EAAA,EAAA,KACA,KAAA,EACA,EAAA,IAAA,EAAA,OACA,KAAA,GAAA,KAAA,GAAA,KAAA,GACA,EAAA,KAAA,EAAA,OAEA,EAAA,IAAA,OAAA,MAAA,EAAA,QACA,EAAA,IAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,IAAA,OAAA,OAAA,EAAA,aAEA,EAAA,IAAA,MAAA,MAAA,EAAA,QACA,EAAA,IAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,IAAA,MAAA,OAAA,EAAA,QAQA,GALA,EAAA,EACA,EAAA,EACA,GAAA,EAGA,EAAA,GAAA,CACA,EAAA,SAAA,EAAA,IAKA,GAJA,MAAA,KACA,EAAA,EAAA,iBAAA,EAAA,KAGA,GAAA,GAAA,OAAA,KACA,EAAA,IAAA,OAAA,SAAA,GAyBA,GAtBA,EAAA,SAAA,EAAA,IACA,MAAA,KACA,EAAA,EAAA,iBAAA,EAAA,KAIA,EAAA,GACA,KAAA,EAAA,GACA,EAAA,GACA,KAAA,EAAA,IAAA,KAAA,EAAA,GACA,EAAA,GAEA,EAAA,SAAA,EAAA,IACA,MAAA,KACA,EAAA,EAAA,iBAAA,EAAA,MAGA,EAAA,MACA,EAAA,EAAA,IACA,EAAA,SAAA,EAAA,MAGA,GAAA,GACA,OAAA,KAGA,GAAA,EAAA,GACA,OAAA,KAOA,GALA,GAAA,KACA,EAAA,GAIA,EAAA,GAAA,CACA,GAAA,EAAA,GAAA,OAAA,KACA,IAAA,EACA,MADA,EAAA,EAAA,GAAA,GAAA,iBAEA,EAAA,EACA,IAAA,IAAA,EAAA,IAGA,KAAA,IACA,EAAA,EACA,IAAA,IAAA,GAAA,KAGA,EAAA,MAAA,UAAA,cACA,GAAA,GAEA,EAAA,MAAA,MAAA,WAAA,GAEA,IAAA,EAAA,MAAA,IAAA,SACA,EAAA,MAAA,OAAA,OAAA,KAKA,EAAA,MAAA,MAAA,WAAA,GAEA,IAAA,EAAA,MAAA,IAAA,SACA,EAAA,MAAA,OAAA,OAAA,EAAA,MAAA,IAAA,QAAA,WAKA,GAAA,EAAA,GAAA,CACA,IACA,EACA,MADA,EADA,EAAA,GACA,KACA,KAAA,GACA,EAAA,EACA,IAAA,IAAA,EAAA,IACA,KAAA,IACA,EAAA,EACA,IAAA,IAAA,GAAA,UAEA,GAAA,EAAA,GAAA,CACA,IACA,EACA,MADA,EADA,EAAA,GACA,KACA,KAAA,GAAA,KAAA,GAAA,KAAA,GACA,EAAA,EACA,IAAA,IAAA,EAAA,IACA,KAAA,GAAA,KAAA,GAAA,KAAA,IACA,EAAA,EACA,IAAA,IAAA,GAAA,UAEA,GAAA,EAAA,GAAA,CACA,IACA,EACA,MADA,EADA,EAAA,GACA,KACA,KAAA,GAAA,KAAA,GAAA,KAAA,GACA,EAAA,EACA,IAAA,IAAA,EAAA,IACA,KAAA,GAAA,KAAA,GAAA,KAAA,IACA,EAAA,EACA,IAAA,IAAA,GAAA,MAIA,EAAA,KAAA,EAAA,KAAA,EAAA,GACA,EAAA,IAAA,OAAA,OAAA,GACA,EAAA,IAAA,OAAA,SAAA,GACA,GAAA,GACA,EAAA,IAAA,OAAA,WAAA,GAEA,EAAA,MAAA,UAAA,aAAA,GAAA,EAAA,MAAA,IAAA,aACA,EAAA,MAAA,IAAA,QAAA,EAEA,EAAA,IAAA,MAAA,WAAA,GAEA,EAAA,IACA,EAAA,IAAA,MAAA,WAAA,GAQA,OAJA,EAAA,IAAA,OAAA,UAAA,EAAA,MAAA,OAAA,WACA,EAAA,IAAA,MAAA,MAAA,EAAA,IAAA,IAAA,OAAA,GAGA;;ACnYA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,IAAA,OACA,2NAKA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WAEA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WACA,OAAA,GAGA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,MACA,EAAA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,IAGA,EAAA,EAAA,GACA,EAAA,EAAA,QAEA,GAAA,EAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,MAAA,SAAA,EAAA,UACA,EAAA,MAAA,MAAA,SAAA,EAAA,UACA,EAAA,MAAA,MAAA,cAAA,EAAA,oBACA,GAAA,EAAA,GAAA,CACA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,GAEA,KAAA,GAAA,KAAA,EAEA,EAAA,OAAA,GACA,EAAA,IAAA,EAAA,OAEA,KAAA,GAAA,KAAA,GAAA,KAAA,GACA,EAAA,KAAA,EAAA,OAGA,KAAA,GAAA,KAAA,EACA,EAAA,MAAA,MAAA,OAAA,GACA,KAAA,IACA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,SAGA,GAAA,EAAA,GAAA,CACA,IACA,EADA,EAAA,GACA,GACA,KAAA,GAAA,KAAA,GAAA,KAAA,EACA,EAAA,MAAA,MAAA,OAAA,GACA,KAAA,GAAA,KAAA,GACA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,IACA,KAAA,GACA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,IACA,KAAA,GAAA,KAAA,GACA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,IACA,KAAA,GACA,EAAA,MAAA,MAAA,OAAA,QAGA,GAAA,EAAA,GAAA,CACA,IAAA,EAAA,EAAA,GAEA,KAAA,GAAA,KAAA,EAEA,EAAA,OAAA,GACA,EAAA,IAAA,EAAA,OAEA,KAAA,GAAA,KAAA,GAAA,KAAA,GACA,EAAA,KAAA,EAAA,OAIA,IAAA,EAAA,EAAA,GACA,GAAA,EAAA,CACA,IAAA,EAAA,EAAA,GACA,KAAA,GAAA,KAAA,GAAA,KAAA,EACA,EAAA,MAAA,MAAA,OAAA,GACA,KAAA,GAAA,KAAA,GACA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,IACA,KAAA,GACA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,IACA,KAAA,GAAA,KAAA,GACA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,IACA,KAAA,GACA,EAAA,MAAA,MAAA,OAAA,IASA,OAJA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,KAAA,wBAAA,EACA;;ACvHA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,QAAA,0BAEA,EAAA,IAAA,OACA,UAAA,OAAA,KAAA,EAAA,QAAA,KAAA,IAAA,4EAGA,KAGA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WAEA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WACA,OAAA,GAGA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,MACA,EAAA,EAAA,GAEA,IAAA,EAAA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,IAGA,EAAA,SAAA,EAAA,IAKA,GAJA,MAAA,KACA,EAAA,EAAA,iBAAA,EAAA,KAGA,MAAA,GAAA,CACA,IAAA,EAAA,EAAA,GACA,GAAA,MAAA,EACA,EAAA,MACA,CAAA,GAAA,MAAA,EAKA,OAAA,KAJA,EAAA,IAQA,IAAA,EAAA,EAAA,GAEA,EADA,EAAA,GACA,GAEA,OAAA,EAAA,MAAA,aACA,KAAA,GAAA,KAAA,EACA,EAAA,IAAA,EAAA,KACA,KAAA,GAAA,KAAA,EACA,EAAA,IAAA,EAAA,EAAA,KACA,KAAA,EACA,EAAA,IAAA,EAAA,SACA,KAAA,GACA,EAAA,IAAA,EAAA,QAGA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,IAGA,KAAA,EACA,EAAA,IAAA,EAAA,UACA,KAAA,EACA,EAAA,IAAA,EAAA,UACA,KAAA,GAAA,KAAA,GACA,EAAA,IAAA,EAAA,QAGA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,KAAA,4BAAA,EACA;;AC7FA,QAAA,eAAA,CACA,QAAA,EACA,GAAA,EACA,OAAA,EACA,GAAA,EACA,SAAA,EACA,GAAA,EACA,SAAA,EACA,GAAA,EACA,WAAA,EACA,GAAA,EACA,QAAA,EACA,GAAA,EACA,QAAA,EACA,GAAA,GAGA,QAAA,aAAA,CACA,OAAA,EACA,IAAA,EACA,OAAA,EACA,QAAA,EACA,IAAA,EACA,OAAA,EACA,OAAA,EACA,MAAA,EACA,MAAA,EACA,OAAA,EACA,IAAA,EACA,OAAA,EACA,MAAA,EACA,IAAA,EACA,OAAA,EACA,IAAA,EACA,KAAA,EACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,IAAA,EACA,OAAA,EACA,OAAA,EACA,IAAA,EACA,OAAA,EACA,UAAA,EACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,QAAA,GACA,IAAA,GACA,OAAA,GACA,SAAA,GACA,IAAA,GACA,OAAA,GACA,SAAA,GACA,IAAA,GACA,OAAA,IAGA,QAAA,sBAAA,kFACA,QAAA,cAAA,CACA,KAAA,EACA,KAAA,EACA,KAAA,EACA,KAAA,EACA,OAAA,EACA,MAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,KAAA,EACA,KAAA,GACA,IAAA,GACA,QAAA,GACA,OAAA;;ACrEA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,kBAEA,EAAA,IAAA,OAAA,wBAEA,EAAA,sBAAA,8IAEA,KAGA,EAAA,IAAA,OAAA,wBAEA,EAAA,sBAAA,iFAEA,KAGA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WACA,OAAA,KAAA,eAAA,EAAA,GAGA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,GACA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAEA,IAAA,EAAA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,IAGA,EAAA,EAAA,GAAA,cAEA,OADA,IAAA,EAAA,cAAA,GACA,EAAA,cAAA,GACA,UAAA,GAAA,UAAA,EACA,EACA,YAAA,EACA,EACA,SAAA,KAAA,GACA,GAEA,SAAA,GAGA,IAAA,EAAA,EAAA,GACA,MAAA,wBAAA,KAAA,EAAA,KAEA,OAAA,KAAA,EAAA,IACA,EAAA,IAAA,EAAA,KACA,SAAA,KAAA,EAAA,IACA,EAAA,IAAA,EAAA,EAAA,KACA,SAAA,KAAA,EAAA,IACA,EAAA,IAAA,EAAA,SACA,QAAA,KAAA,EAAA,KACA,EAAA,IAAA,EAAA,QAGA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,IAGA,UAAA,KAAA,EAAA,IAEA,EAAA,IAAA,EAAA,QAEA,OAAA,KAAA,EAAA,IAEA,EAAA,IAAA,EAAA,UAEA,WAAA,KAAA,EAAA,KAEA,EAAA,IAAA,EAAA,UAGA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,KAAA,wBAAA,EACA;;AC1FA,IAAA,EAAA,QAAA,UAEA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,kBAEA,EAAA,IAAA,OAAA,gfAWA,KAGA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,IAAA,EAAA,CACA,KAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,MAAA,EAAA,MAAA,EAAA,GAAA,OACA,IAAA,IAGA,EAAA,EAAA,GACA,EAAA,EAAA,aAAA,EAAA,eAEA,IAAA,EAAA,EAAA,GACA,EAAA,SAAA,GAEA,IAAA,EAAA,KAgBA,GAfA,EAAA,KACA,EAAA,EAAA,GACA,EAAA,SAAA,GAEA,EAAA,GACA,KAAA,KAAA,EAAA,MAEA,GAAA,GAEA,EAAA,MAEA,GAAA,MAIA,EACA,EAAA,MAAA,OAAA,MAAA,GACA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,OACA,CAGA,IAAA,EAAA,EAAA,GACA,EAAA,MAAA,EAAA,GACA,EAAA,KAAA,GACA,EAAA,KAAA,EAAA,GAAA,QAEA,IAAA,EAAA,EAAA,QAAA,IAAA,EAAA,KACA,EAAA,EAAA,QAAA,KAAA,EAAA,KACA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,KACA,EAAA,EAEA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,OACA,EAAA,GAGA,EAAA,MAAA,OAAA,MAAA,GACA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QAIA,GAAA,EAAA,GAAA,CACA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,eAAA,EAAA,eACA,EAAA,MAAA,OAAA,UAAA,GAUA,OANA,EAAA,KACA,EAAA,IAAA,EAAA,MAAA,QACA,EAAA,IAAA,OAAA,MAAA,SAAA,EAAA,MAGA,EAAA,KAAA,+BAAA,EACA;;AClGA,IAAA,EAAA,QAAA,UAEA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,kBAEA,EAAA,IAAA,OAAA,sVAMA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,IAAA,EAAA,CACA,KAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,MAAA,EAAA,MAAA,EAAA,GAAA,OACA,IAAA,IAIA,EAAA,EAAA,GACA,EAAA,EAAA,aAAA,EAAA,eAEA,IAEA,EAAA,KAiBA,IAhBA,EAAA,IAAA,EAAA,MACA,EAAA,EAAA,IAAA,EAAA,GACA,EAAA,SAAA,GAEA,EAAA,IAAA,EAAA,GACA,KAAA,KAAA,EAAA,IAAA,EAAA,MAEA,GAAA,GAGA,EAAA,MAEA,GAAA,MAIA,EACA,EAAA,MAAA,MAAA,MApBA,GAqBA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,OACA,CAGA,IAAA,EAAA,EAAA,GACA,EAAA,MAAA,EAAA,GACA,EAAA,KA5BA,GA8BA,IAAA,EAAA,EAAA,QAAA,IAAA,EAAA,KACA,EAAA,EAAA,QAAA,KAAA,EAAA,KACA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,KACA,EAAA,EAEA,KAAA,IAAA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,KAAA,EAAA,OACA,EAAA,GAGA,EAAA,MAAA,MAAA,MAvCA,GAwCA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QAIA,OADA,EAAA,KAAA,mBAAA,EACA;;ACpFA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,IAAA,OAAA,kPAYA,KAEA,EAAA,CACA,QAAA,EAAA,GAAA,EACA,OAAA,EAAA,GAAA,EACA,SAAA,EAAA,GAAA,EACA,SAAA,EAAA,GAAA,EACA,WAAA,EAAA,GAAA,EACA,QAAA,EAAA,GAAA,EACA,QAAA,EAAA,GAAA,GAIA,EAAA,EACA,EAAA,EAEA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,SAAA,GACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GACA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GAAA,KAAA,EAAA,IAAA,KAAA,EAAA,GAAA,CAQA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OAIA,GAHA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAGA,IAAA,EAAA,CACA,KAAA,EACA,MAAA,EACA,IAAA,KAGA,IAAA,EAAA,MAAA,cACA,EAAA,MAAA,4BAIA,EAAA,MAAA,EAAA,GAAA,QAAA,KAAA,IAAA,CAEA,IACA,EAAA,EAAA,IAAA,EAAA,GAAA,OAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GAMA,OAJA,EAAA,SAAA,GACA,EAAA,SAAA,GACA,EAAA,SAAA,GAEA,EAAA,GAAA,EAAA,GAAA,KACA,EAAA,GAAA,EAAA,GAAA,MAEA,EAAA,MAEA,GADA,EAAA,GACA,KAEA,KAIA,EAAA,MAAA,OAAA,MAAA,GACA,EAAA,MAAA,OAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,GAGA,EAAA,IACA,EAAA,MAAA,OAAA,UAAA,EAAA,EAAA,GAAA,gBAGA,EAAA,KAAA,yBAAA,EACA,SAnDA,EAAA,OAAA,EAAA,GAAA;;AChDA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,kBAEA,EAAA,IAAA,OAAA,kBAEA,EAAA,sBAAA,kJAEA,KAEA,EAAA,IAAA,OAAA,8FAIA,KAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WACA,OAAA,KAAA,eAAA,EAAA,GAGA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GAAA,EAAA,MAAA,GAAA,EAAA,EAAA,MAAA,GAAA,MAAA,MAAA,OAAA,KAEA,EAAA,EAAA,GACA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,MAAA,EAAA,MAAA,EAAA,GAAA,OAEA,IAAA,EAAA,IAAA,EAAA,CACA,MAAA,MACA,KAAA,EACA,IAAA,IAGA,EAAA,EAAA,GAAA,cAEA,OADA,IAAA,EAAA,cAAA,GACA,EAAA,cAAA,GACA,UAAA,GAAA,UAAA,EACA,EACA,YAAA,EACA,EACA,SAAA,KAAA,GACA,GAEA,SAAA,GAGA,IAAA,EAAA,EAAA,GAEA,MAAA,sBAAA,KAAA,EAAA,KACA,UAAA,KAAA,EAAA,IAEA,EAAA,KAAA,EAAA,QAEA,OAAA,KAAA,EAAA,IAEA,EAAA,KAAA,EAAA,UAEA,WAAA,KAAA,EAAA,KAEA,EAAA,KAAA,EAAA,UAGA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,MAAA,OAAA,SAAA,EAAA,UACA,EAAA,KAAA,uBAAA,EACA,GAGA,SAAA,KAAA,EAAA,KACA,EAAA,KAAA,EAAA,QAEA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,MAAA,UAAA,EAAA,OACA,IAGA,OAAA,KAAA,EAAA,KACA,EAAA,KAAA,EAAA,KAGA,SAAA,KAAA,EAAA,KACA,EAAA,KAAA,EAAA,SAGA,QAAA,KAAA,EAAA,KAEA,EAAA,KAAA,EAAA,QAGA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA;;ACvGA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aACA,EAAA,QAAA,gBAAA,iBAEA,EAAA,IAAA,OAAA,0MAWA,KAGA,EAAA,IAAA,OAAA,mLAUA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAGA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAGA,GAAA,EAAA,MAAA,GAAA,EAAA,EAAA,MAAA,GAAA,MAAA,MAAA,OAAA,KACA,IAAA,EAAA,EAAA,GACA,EAAA,IAAA,EACA,EAAA,IAAA,EACA,EAAA,MAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,KAAA,EAAA,GAAA,UAAA,EAAA,GAAA,QACA,EAAA,KAAA,wBAAA,EAEA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QAEA,IAAA,EAAA,EACA,EAAA,EACA,GAAA,EAGA,GAAA,MAAA,EAAA,GAAA,CAEA,IADA,EAAA,SAAA,EAAA,MACA,GAAA,OAAA,KAEA,EAAA,MAAA,OAAA,SAAA,GAsBA,GAlBA,YAAA,KAAA,EAAA,KACA,EAAA,EACA,EAAA,IACA,iBAAA,KAAA,EAAA,KACA,EAAA,EACA,EAAA,GAEA,EAAA,SAAA,EAAA,IAIA,MAAA,EAAA,GACA,EAAA,SAAA,EAAA,IACA,EAAA,MACA,EAAA,EAAA,IACA,EAAA,SAAA,EAAA,MAGA,GAAA,GACA,OAAA,KAGA,GAAA,EAAA,GACA,OAAA,KAOA,GALA,GAAA,KACA,EAAA,GAIA,MAAA,EAAA,GAAA,CACA,GAAA,EAAA,GAAA,OAAA,KAEA,aADA,EAAA,EAAA,GAAA,GAAA,gBACA,eAAA,GACA,EAAA,EACA,IAAA,IAAA,EAAA,KAEA,EAAA,EACA,IAAA,IAAA,GAAA,KAqBA,GAjBA,EAAA,MAAA,OAAA,OAAA,GACA,EAAA,MAAA,OAAA,SAAA,GAEA,GAAA,EACA,EAAA,MAAA,OAAA,WAAA,GAEA,EAAA,GACA,EAAA,MAAA,MAAA,WAAA,GAEA,EAAA,MAAA,MAAA,WAAA,KAOA,EAAA,EAAA,KAAA,EAAA,UAAA,EAAA,MAAA,EAAA,KAAA,UAGA,OAAA,EAAA,KAAA,MAAA,SACA,KAEA,EAMA,GAAA,EAAA,GAAA,MAAA,0BACA,OAAA,EAGA,MAAA,EAAA,MACA,EAAA,IAAA,IAAA,EAAA,KAAA,EAAA,MAAA,SAGA,EAAA,EACA,EAAA,EACA,GAAA,EAGA,GAAA,MAAA,EAAA,GAAA,CACA,IAAA,EACA,IADA,EAAA,SAAA,EAAA,MACA,GAAA,OAAA,KAEA,EAAA,IAAA,OAAA,SAAA,GAMA,GAHA,EAAA,SAAA,EAAA,IAGA,MAAA,EAAA,IAGA,IADA,EAAA,SAAA,EAAA,MACA,GAAA,OAAA,OAEA,EAAA,MAEA,EAAA,EAAA,IACA,EAAA,SAAA,EAAA,MAGA,GAAA,GAAA,GACA,OAAA,KAGA,GAAA,EAAA,GACA,OAAA,KAOA,GALA,GAAA,KACA,EAAA,GAIA,MAAA,EAAA,GAAA,CAEA,GAAA,EAAA,GAAA,OAAA,KAEA,IAAA,EACA,aADA,EAAA,EAAA,GAAA,GAAA,gBACA,eAAA,GACA,EAAA,EACA,IAAA,IACA,EAAA,EACA,EAAA,IAAA,UAAA,QACA,EAAA,IAAA,MAAA,MAAA,EAAA,IAAA,IAAA,OAAA,MAIA,EAAA,EACA,IAAA,IAAA,GAAA,KAGA,EAAA,MAAA,UAAA,cACA,GAAA,GAEA,EAAA,MAAA,MAAA,WAAA,GAEA,IAAA,EAAA,MAAA,IAAA,SACA,EAAA,MAAA,OAAA,OAAA,KAKA,EAAA,MAAA,MAAA,WAAA,GAEA,IAAA,EAAA,MAAA,IAAA,SACA,EAAA,MAAA,OAAA,OAAA,EAAA,MAAA,IAAA,QAAA,OAMA,EAAA,KAAA,EAAA,KAAA,EAAA,GACA,EAAA,IAAA,OAAA,OAAA,GACA,EAAA,IAAA,OAAA,SAAA,GACA,GAAA,GACA,EAAA,IAAA,OAAA,WAAA,GAEA,EAAA,MAAA,UAAA,aAAA,GAAA,EAAA,MAAA,IAAA,aACA,EAAA,MAAA,IAAA,QAAA,EAEA,EAAA,IAAA,MAAA,WAAA,GAEA,EAAA,IACA,EAAA,IAAA,MAAA,WAAA,GAQA,OAJA,EAAA,IAAA,OAAA,UAAA,EAAA,MAAA,OAAA,WACA,EAAA,IAAA,MAAA,MAAA,EAAA,IAAA,IAAA,OAAA,GAGA;;ACrPA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,CACA,QAAA,EAAA,GAAA,EACA,OAAA,EAAA,GAAA,EACA,SAAA,EAAA,GAAA,EACA,SAAA,EAAA,GAAA,EACA,WAAA,EAAA,GAAA,EACA,QAAA,EAAA,GAAA,EACA,QAAA,EAAA,GAAA,GAGA,EAAA,IAAA,OAAA,oGAIA,OAAA,KAAA,GAAA,KAAA,KAAA,oFAGA,KAEA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,OAAA,WACA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OAEA,GADA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QACA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,KAGA,EAAA,EAAA,GAAA,cACA,EAAA,EAAA,GACA,QAAA,IAAA,EAAA,OAAA,KAEA,IAAA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GAEA,EAAA,EAAA,MACA,EAAA,GAAA,EA6BA,OA3BA,GADA,EAAA,GAAA,IACA,cACA,SAAA,KAAA,GACA,EAAA,IAAA,EAAA,GACA,iBAAA,KAAA,GACA,EAAA,IAAA,EAAA,GACA,QAAA,KAAA,GACA,EAAA,kBAAA,EAAA,EACA,EAAA,IAAA,EAAA,GAEA,EAAA,IAAA,GAGA,EAAA,kBAAA,EAAA,EACA,EAAA,IAAA,EAAA,IACA,EAAA,kBAAA,KAAA,IAAA,EAAA,EAAA,GAAA,KAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,IACA,EAAA,kBAAA,KAAA,IAAA,EAAA,EAAA,GAAA,KAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,GAEA,EAAA,IAAA,GAIA,EAAA,MAAA,OAAA,UAAA,GACA,EAAA,MAAA,MAAA,MAAA,EAAA,QACA,EAAA,MAAA,MAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA;;AC9EA,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,aAAA,OACA,EAAA,QAAA,gBAAA,aAEA,EAAA,IAAA,OACA,iSAQA,KAEA,QAAA,OAAA,WAEA,EAAA,MAAA,KAAA,WAEA,KAAA,QAAA,WAAA,OAAA,GAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,QAAA,IACA,EAAA,EAAA,MAAA,EAAA,GAAA,OACA,EAAA,IAAA,EAAA,CACA,MAAA,EACA,KAAA,EACA,IAAA,IAGA,EAAA,EAAA,GACA,EAAA,EAAA,QACA,EAAA,EAAA,cAEA,0BAAA,KAAA,IAEA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,IACA,qBAAA,KAAA,GACA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,OACA,UAAA,KAAA,GAEA,EAAA,OAAA,GACA,EAAA,IAAA,EAAA,OAEA,WAAA,KAAA,GACA,EAAA,KAAA,EAAA,OACA,cAAA,KAAA,GACA,EAAA,KAAA,EAAA,OACA,iBAAA,KAAA,IACA,EAAA,MAAA,MAAA,OAAA,GACA,EAAA,OAAA,GACA,EAAA,KAAA,EAAA,QAEA,UAAA,IACA,EAAA,MAAA,MAAA,OAAA,EAAA,QACA,EAAA,MAAA,MAAA,SAAA,EAAA,UACA,EAAA,MAAA,MAAA,SAAA,EAAA,UACA,EAAA,MAAA,MAAA,cAAA,EAAA,gBAGA,IAAA,EAAA,EAAA,IAAA,EAAA,IAAA,EAAA,GACA,GAAA,EACA,OAAA,EAAA,eACA,IAAA,SACA,EAAA,MAAA,MAAA,OAAA,GACA,MACA,IAAA,YACA,EAAA,MAAA,MAAA,OAAA,GACA,MACA,IAAA,SACA,EAAA,MAAA,MAAA,OAAA,IACA,MACA,IAAA,aACA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,GACA,MACA,IAAA,QACA,EAAA,MAAA,MAAA,OAAA,IACA,EAAA,MAAA,MAAA,WAAA,GACA,MACA,IAAA,QACA,EAAA,MAAA,MAAA,OAAA,GASA,OAJA,EAAA,MAAA,OAAA,MAAA,EAAA,QACA,EAAA,MAAA,OAAA,QAAA,EAAA,QAAA,GACA,EAAA,MAAA,OAAA,OAAA,EAAA,QACA,EAAA,KAAA,oBAAA,EACA;;AC/FA,SAAA,EAAA,GAGA,IAAA,GADA,EAAA,GAAA,IACA,OAEA,KAAA,aAAA,WAAA,OAAA,GAAA,GAEA,KAAA,QAAA,WAAA,MAAA,MAEA,KAAA,QAAA,SAAA,EAAA,EAAA,EAAA,GAAA,OAAA,MAEA,KAAA,QAAA,SAAA,EAAA,EAAA,GAQA,IANA,IAAA,EAAA,GACA,EAAA,KAAA,UAEA,EAAA,EACA,EAAA,EAAA,KAAA,GAEA,GAAA,CAGA,EAAA,OAAA,EAAA,OAAA,EAAA,OAEA,IAAA,EAAA,KAAA,QAAA,EAAA,EAAA,EAAA,GACA,GAGA,EAAA,EAAA,UAAA,EAAA,MAAA,EAAA,KAAA,QAEA,KAAA,iBAAA,EAAA,oBACA,EAAA,KAAA,IAKA,EAAA,EAAA,UAAA,EAAA,MAAA,GAGA,EAAA,EAAA,KAAA,GASA,OANA,KAAA,UACA,KAAA,SAAA,QAAA,WACA,EAAA,QAAA,OAAA,EAAA,EAAA,WAIA,GAIA,QAAA,OAAA,EAEA,QAAA,kBAAA,QAAA,0BAAA,OACA,QAAA,uBAAA,QAAA,+BAAA,OACA,QAAA,2BAAA,QAAA,mCAAA,OACA,QAAA,8BAAA,QAAA,sCAAA,OACA,QAAA,8BAAA,QAAA,sCAAA,OACA,QAAA,kBAAA,QAAA,0BAAA,OACA,QAAA,wBAAA,QAAA,gCAAA,OACA,QAAA,qCAAA,QAAA,6CAAA,OACA,QAAA,yBAAA,QAAA,iCAAA,OACA,QAAA,sBAAA,QAAA,8BAAA,OACA,QAAA,uBAAA,QAAA,+BAAA,OACA,QAAA,0BAAA,QAAA,kCAAA,OACA,QAAA,gBAAA,QAAA,wBAAA,OACA,QAAA,mBAAA,QAAA,2BAAA,OACA,QAAA,mBAAA,QAAA,2BAAA,OAEA,QAAA,iBAAA,QAAA,yBAAA,OACA,QAAA,mBAAA,QAAA,2BAAA,OAEA,QAAA,mBAAA,QAAA,2BAAA,OACA,QAAA,uBAAA,QAAA,+BAAA,OACA,QAAA,sBAAA,QAAA,8BAAA,OACA,QAAA,uBAAA,QAAA,+BAAA,OACA,QAAA,gBAAA,QAAA,wBAAA,OACA,QAAA,8BAAA,QAAA,sCAAA,OACA,QAAA,wBAAA,QAAA,gCAAA,OAEA,QAAA,mBAAA,QAAA,2BAAA,OACA,QAAA,uBAAA,QAAA,+BAAA,OACA,QAAA,8BAAA,QAAA,sCAAA,OACA,QAAA,wBAAA,QAAA,gCAAA,OACA,QAAA,sBAAA,QAAA,8BAAA,OACA,QAAA,uBAAA,QAAA,+BAAA,OACA,QAAA,gBAAA,QAAA,wBAAA,OACA,QAAA,2BAAA,QAAA,mCAAA,OAEA,QAAA,iBAAA,QAAA,8BAAA,OACA,QAAA,oBAAA,QAAA,iCAAA,OACA,QAAA,2BAAA,QAAA,wCAAA,OACA,QAAA,uBAAA,QAAA,oCAAA,OACA,QAAA,2BAAA,QAAA,wCAAA,OAEA,QAAA,uBAAA,QAAA,+BAAA,OACA,QAAA,8BAAA,QAAA,sCAAA,OACA,QAAA,kBAAA,QAAA,0BAAA,OACA,QAAA,wBAAA,QAAA,gCAAA,OACA,QAAA,sBAAA,QAAA,8BAAA,OACA,QAAA,uBAAA,QAAA,+BAAA,OACA,QAAA,gBAAA,QAAA,wBAAA,OACA,QAAA,mBAAA,QAAA,2BAAA;;ACrGA,IAAA,EAAA,QAAA,aAAA,QAEA,QAAA,QAAA,WACA,EAAA,KAAA,MAGA,KAAA,OAAA,SAAA,EAAA,EAAA,GAEA,GAAA,EAAA,OAAA,EAAA,OAAA,EAKA,IAHA,IAAA,EAAA,GACA,EAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAEA,IAAA,EAAA,EAAA,GAGA,EAAA,MAAA,EAAA,MAAA,EAAA,KAAA,OAEA,EAAA,KAAA,OAAA,EAAA,KAAA,SACA,EAAA,IAIA,EAAA,KAAA,GACA,EAAA,GASA,OAJA,MAAA,GACA,EAAA,KAAA,GAGA;;ACnCA,IAAA,EAAA,QAAA,aAAA,QAGA,EAAA,IAAA,OAAA,+CAAA,KACA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,QAAA,QAAA,WACA,EAAA,KAAA,MAEA,KAAA,OAAA,SAAA,EAAA,EAAA,GA6BA,OA3BA,EAAA,QAAA,SAAA,GAEA,IAAA,EAAA,MAAA,UAAA,kBAAA,CAIA,IAAA,EAAA,EAAA,KAAA,EAAA,UAAA,EAAA,MAAA,EAAA,KAAA,SACA,GAAA,EAAA,CAIA,IAEA,EAAA,GAFA,SAAA,EAAA,IACA,SAAA,EAAA,IAEA,MAAA,EAAA,KACA,GAAA,GAGA,MAAA,EAAA,KACA,EAAA,IAAA,OAAA,iBAAA,GAGA,EAAA,MAAA,OAAA,iBAAA,GACA,EAAA,MAAA,EAAA,GACA,EAAA,KAAA,8BAAA,MAGA;;ACxCA,IAAA,EAAA,QAAA,aAAA,QAGA,EAAA,GACA,EAAA,IAAA,OAAA,qCAAA,KAEA,QAAA,QAAA,WACA,EAAA,KAAA,MAEA,KAAA,OAAA,SAAA,EAAA,EAAA,GA6BA,OA3BA,EAAA,QAAA,SAAA,GAEA,GAAA,EAAA,KAAA,wBAAA,EAAA,KAAA,wBAAA,EAAA,KAAA,wBAAA,EAAA,KAAA,uBAAA,CAIA,IAAA,EAAA,EAAA,KAAA,EAAA,UAAA,EAAA,MAAA,EAAA,KAAA,SACA,GAAA,EAAA,CACA,IAAA,EAAA,EAAA,GAAA,cACA,QAAA,IAAA,EAAA,GACA,OAGA,IAAA,EAAA,EAAA,GACA,EAAA,MAAA,UAAA,mBACA,EAAA,MAAA,OAAA,iBAAA,GAGA,MAAA,EAAA,KAAA,EAAA,IAAA,UAAA,mBACA,EAAA,IAAA,OAAA,iBAAA,GAGA,EAAA,MAAA,EAAA,GACA,EAAA,KAAA,4BAAA,MAIA,IAKA,EAAA,CAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,IAAA,IAAA,MAAA,IAAA,MAAA,IAAA,KAAA,IAAA,MAAA,IAAA,KAAA,IAAA,MAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,MAAA,EAAA,MAAA,GAAA,KAAA,IAAA,IAAA,IAAA,IAAA,IAAA,KAAA,IAAA,MAAA,IAAA,KAAA,IAAA,IAAA,GAAA,IAAA,IAAA,KAAA,IAAA,IAAA,IAAA,IAAA,IAAA,KAAA,IAAA,KAAA,IAAA,IAAA,GAAA,MAAA,IAAA,MAAA,IAAA,KAAA,IAAA,MAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,GAAA,IAAA,IAAA,KAAA,IAAA,KAAA,IAAA,OAAA,IAAA,MAAA,IAAA,IAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,IAAA,IAAA,KAAA,EAAA,KAAA,GAAA,KAAA,IAAA,IAAA,IAAA,KAAA,IAAA,IAAA,IAAA,MAAA,IAAA,KAAA,IAAA,KAAA,IAAA,MAAA,IAAA,MAAA,IAAA,IAAA,IAAA,KAAA,IAAA,KAAA,IAAA,IAAA,EAAA,IAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,MAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,MAAA,IAAA,KAAA,GAAA,KAAA,IAAA,IAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,KAAA,IAAA,MAAA,IAAA,KAAA,IAAA,KAAA,IAAA,IAAA,GAAA,IAAA,IAAA,IAAA,IAAA,MAAA,IAAA,KAAA,IAAA,IAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,MAAA,IAAA,KAAA,IAAA,MAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,IAAA,GAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,KAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,KAAA,GAAA,IAAA,IAAA,MAAA,IAAA,KAAA,IAAA,IAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,MAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,MAAA,IAAA,KAAA,IAAA,IAAA,IAAA,KAAA,IAAA,IAAA,IAAA,IAAA,IAAA,MAAA,IAAA,MAAA,IAAA,KAAA,IAAA,KAAA,IAAA,IA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","file":"erddap.map","sourceRoot":"..\\src","sourcesContent":["/*! https://mths.be/utf8js v2.1.2 by @mathias */\n;(function(root) {\n\n\t// Detect free variables `exports`\n\tvar freeExports = typeof exports == 'object' && exports;\n\n\t// Detect free variable `module`\n\tvar freeModule = typeof module == 'object' && module &&\n\t\tmodule.exports == freeExports && module;\n\n\t// Detect free variable `global`, from Node.js or Browserified code,\n\t// and use it as `root`\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {\n\t\troot = freeGlobal;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar stringFromCharCode = String.fromCharCode;\n\n\t// Taken from https://mths.be/punycode\n\tfunction ucs2decode(string) {\n\t\tvar output = [];\n\t\tvar counter = 0;\n\t\tvar length = string.length;\n\t\tvar value;\n\t\tvar extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t// Taken from https://mths.be/punycode\n\tfunction ucs2encode(array) {\n\t\tvar length = array.length;\n\t\tvar index = -1;\n\t\tvar value;\n\t\tvar output = '';\n\t\twhile (++index < length) {\n\t\t\tvalue = array[index];\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t}\n\t\treturn output;\n\t}\n\n\tfunction checkScalarValue(codePoint) {\n\t\tif (codePoint >= 0xD800 && codePoint <= 0xDFFF) {\n\t\t\tthrow Error(\n\t\t\t\t'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +\n\t\t\t\t' is not a scalar value'\n\t\t\t);\n\t\t}\n\t}\n\t/*--------------------------------------------------------------------------*/\n\n\tfunction createByte(codePoint, shift) {\n\t\treturn stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);\n\t}\n\n\tfunction encodeCodePoint(codePoint) {\n\t\tif ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence\n\t\t\treturn stringFromCharCode(codePoint);\n\t\t}\n\t\tvar symbol = '';\n\t\tif ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);\n\t\t}\n\t\telse if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence\n\t\t\tcheckScalarValue(codePoint);\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);\n\t\t\tsymbol += createByte(codePoint, 6);\n\t\t}\n\t\telse if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);\n\t\t\tsymbol += createByte(codePoint, 12);\n\t\t\tsymbol += createByte(codePoint, 6);\n\t\t}\n\t\tsymbol += stringFromCharCode((codePoint & 0x3F) | 0x80);\n\t\treturn symbol;\n\t}\n\n\tfunction utf8encode(string) {\n\t\tvar codePoints = ucs2decode(string);\n\t\tvar length = codePoints.length;\n\t\tvar index = -1;\n\t\tvar codePoint;\n\t\tvar byteString = '';\n\t\twhile (++index < length) {\n\t\t\tcodePoint = codePoints[index];\n\t\t\tbyteString += encodeCodePoint(codePoint);\n\t\t}\n\t\treturn byteString;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tfunction readContinuationByte() {\n\t\tif (byteIndex >= byteCount) {\n\t\t\tthrow Error('Invalid byte index');\n\t\t}\n\n\t\tvar continuationByte = byteArray[byteIndex] & 0xFF;\n\t\tbyteIndex++;\n\n\t\tif ((continuationByte & 0xC0) == 0x80) {\n\t\t\treturn continuationByte & 0x3F;\n\t\t}\n\n\t\t// If we end up here, it’s not a continuation byte\n\t\tthrow Error('Invalid continuation byte');\n\t}\n\n\tfunction decodeSymbol() {\n\t\tvar byte1;\n\t\tvar byte2;\n\t\tvar byte3;\n\t\tvar byte4;\n\t\tvar codePoint;\n\n\t\tif (byteIndex > byteCount) {\n\t\t\tthrow Error('Invalid byte index');\n\t\t}\n\n\t\tif (byteIndex == byteCount) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Read first byte\n\t\tbyte1 = byteArray[byteIndex] & 0xFF;\n\t\tbyteIndex++;\n\n\t\t// 1-byte sequence (no continuation bytes)\n\t\tif ((byte1 & 0x80) == 0) {\n\t\t\treturn byte1;\n\t\t}\n\n\t\t// 2-byte sequence\n\t\tif ((byte1 & 0xE0) == 0xC0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x1F) << 6) | byte2;\n\t\t\tif (codePoint >= 0x80) {\n\t\t\t\treturn codePoint;\n\t\t\t} else {\n\t\t\t\tthrow Error('Invalid continuation byte');\n\t\t\t}\n\t\t}\n\n\t\t// 3-byte sequence (may include unpaired surrogates)\n\t\tif ((byte1 & 0xF0) == 0xE0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tbyte3 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;\n\t\t\tif (codePoint >= 0x0800) {\n\t\t\t\tcheckScalarValue(codePoint);\n\t\t\t\treturn codePoint;\n\t\t\t} else {\n\t\t\t\tthrow Error('Invalid continuation byte');\n\t\t\t}\n\t\t}\n\n\t\t// 4-byte sequence\n\t\tif ((byte1 & 0xF8) == 0xF0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tbyte3 = readContinuationByte();\n\t\t\tbyte4 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |\n\t\t\t\t(byte3 << 0x06) | byte4;\n\t\t\tif (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {\n\t\t\t\treturn codePoint;\n\t\t\t}\n\t\t}\n\n\t\tthrow Error('Invalid UTF-8 detected');\n\t}\n\n\tvar byteArray;\n\tvar byteCount;\n\tvar byteIndex;\n\tfunction utf8decode(byteString) {\n\t\tbyteArray = ucs2decode(byteString);\n\t\tbyteCount = byteArray.length;\n\t\tbyteIndex = 0;\n\t\tvar codePoints = [];\n\t\tvar tmp;\n\t\twhile ((tmp = decodeSymbol()) !== false) {\n\t\t\tcodePoints.push(tmp);\n\t\t}\n\t\treturn ucs2encode(codePoints);\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar utf8 = {\n\t\t'version': '2.1.2',\n\t\t'encode': utf8encode,\n\t\t'decode': utf8decode\n\t};\n\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine(function() {\n\t\t\treturn utf8;\n\t\t});\n\t}\telse if (freeExports && !freeExports.nodeType) {\n\t\tif (freeModule) { // in Node.js or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = utf8;\n\t\t} else { // in Narwhal or RingoJS v0.7.0-\n\t\t\tvar object = {};\n\t\t\tvar hasOwnProperty = object.hasOwnProperty;\n\t\t\tfor (var key in utf8) {\n\t\t\t\thasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]);\n\t\t\t}\n\t\t}\n\t} else { // in Rhino or a web browser\n\t\troot.utf8 = utf8;\n\t}\n\n}(this));\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  for (var i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(\n      uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n    ))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n","exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42 && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n  if (kMaxLength() < length) {\n    throw new RangeError('Invalid typed array length')\n  }\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = new Uint8Array(length)\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    if (that === null) {\n      that = new Buffer(length)\n    }\n    that.length = length\n  }\n\n  return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n    return new Buffer(arg, encodingOrOffset, length)\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(this, arg)\n  }\n  return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n  arr.__proto__ = Buffer.prototype\n  return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    return fromArrayBuffer(that, value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(that, value, encodingOrOffset)\n  }\n\n  return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n  if (typeof Symbol !== 'undefined' && Symbol.species &&\n      Buffer[Symbol.species] === Buffer) {\n    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n    Object.defineProperty(Buffer, Symbol.species, {\n      value: null,\n      configurable: true\n    })\n  }\n}\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (that, size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(that, size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(that, size).fill(fill, encoding)\n      : createBuffer(that, size).fill(fill)\n  }\n  return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n  assertSize(size)\n  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < size; ++i) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  that = createBuffer(that, length)\n\n  var actual = that.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    that = that.slice(0, actual)\n  }\n\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  that = createBuffer(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n  array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  if (byteOffset === undefined && length === undefined) {\n    array = new Uint8Array(array)\n  } else if (length === undefined) {\n    array = new Uint8Array(array, byteOffset)\n  } else {\n    array = new Uint8Array(array, byteOffset, length)\n  }\n\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = array\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromArrayLike(that, array)\n  }\n  return that\n}\n\nfunction fromObject (that, obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    that = createBuffer(that, len)\n\n    if (that.length === 0) {\n      return that\n    }\n\n    obj.copy(that, 0, 0, len)\n    return that\n  }\n\n  if (obj) {\n    if ((typeof ArrayBuffer !== 'undefined' &&\n        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || isnan(obj.length)) {\n        return createBuffer(that, 0)\n      }\n      return fromArrayLike(that, obj)\n    }\n\n    if (obj.type === 'Buffer' && isArray(obj.data)) {\n      return fromArrayLike(that, obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength()` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (isNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (Buffer.TYPED_ARRAY_SUPPORT &&\n        typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = this.subarray(start, end)\n    newBuf.__proto__ = Buffer.prototype\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; ++i) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : utf8ToBytes(new Buffer(val, encoding).toString())\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction isnan (val) {\n  return val !== val // eslint-disable-line no-self-compare\n}\n","'use strict';\n\nconst utf8 = require('utf8');\n\nconst defaultByteLength = 1024 * 8;\nconst charArray = [];\n\n/**\n * IOBuffer\n * @constructor\n * @param {undefined|number|ArrayBuffer|TypedArray|IOBuffer|Buffer} data - The data to construct the IOBuffer with.\n *\n * If it's a number, it will initialize the buffer with the number as the buffer's length<br>\n * If it's undefined, it will initialize the buffer with a default length of 8 Kb<br>\n * If its an ArrayBuffer, a TypedArray, an IOBuffer instance,\n * or a Node.js Buffer, it will create a view over the underlying ArrayBuffer.\n * @param {object} [options]\n * @param {number} [options.offset=0] - Ignore the first n bytes of the ArrayBuffer\n * @property {ArrayBuffer} buffer - Reference to the internal ArrayBuffer object\n * @property {number} length - Byte length of the internal ArrayBuffer\n * @property {number} offset - The current offset of the buffer's pointer\n * @property {number} byteLength - Byte length of the internal ArrayBuffer\n * @property {number} byteOffset - Byte offset of the internal ArrayBuffer\n */\nclass IOBuffer {\n    constructor(data, options) {\n        options = options || {};\n        var dataIsGiven = false;\n        if (data === undefined) {\n            data = defaultByteLength;\n        }\n        if (typeof data === 'number') {\n            data = new ArrayBuffer(data);\n        } else {\n            dataIsGiven = true;\n            this._lastWrittenByte = data.byteLength;\n        }\n\n        const offset = options.offset ? options.offset >>> 0 : 0;\n        let byteLength = data.byteLength - offset;\n        let dvOffset = offset;\n        if (data.buffer) {\n            if (data.byteLength !== data.buffer.byteLength) {\n                dvOffset = data.byteOffset + offset;\n            }\n            data = data.buffer;\n        }\n        if (dataIsGiven) {\n            this._lastWrittenByte = byteLength;\n        } else {\n            this._lastWrittenByte = 0;\n        }\n        this.buffer = data;\n        this.length = byteLength;\n        this.byteLength = byteLength;\n        this.byteOffset = dvOffset;\n        this.offset = 0;\n        this.littleEndian = true;\n        this._data = new DataView(this.buffer, dvOffset, byteLength);\n        this._mark = 0;\n        this._marks = [];\n    }\n\n    /**\n     * Checks if the memory allocated to the buffer is sufficient to store more bytes after the offset\n     * @param {number} [byteLength=1] The needed memory in bytes\n     * @return {boolean} Returns true if there is sufficient space and false otherwise\n     */\n    available(byteLength) {\n        if (byteLength === undefined) byteLength = 1;\n        return (this.offset + byteLength) <= this.length;\n    }\n\n    /**\n     * Check if little-endian mode is used for reading and writing multi-byte values\n     * @return {boolean} Returns true if little-endian mode is used, false otherwise\n     */\n    isLittleEndian() {\n        return this.littleEndian;\n    }\n\n    /**\n     * Set little-endian mode for reading and writing multi-byte values\n     * @return {IOBuffer}\n     */\n    setLittleEndian() {\n        this.littleEndian = true;\n        return this;\n    }\n\n    /**\n     * Check if big-endian mode is used for reading and writing multi-byte values\n     * @return {boolean} Returns true if big-endian mode is used, false otherwise\n     */\n    isBigEndian() {\n        return !this.littleEndian;\n    }\n\n    /**\n     * Switches to big-endian mode for reading and writing multi-byte values\n     * @return {IOBuffer}\n     */\n    setBigEndian() {\n        this.littleEndian = false;\n        return this;\n    }\n\n    /**\n     * Move the pointer n bytes forward\n     * @param {number} n\n     * @return {IOBuffer}\n     */\n    skip(n) {\n        if (n === undefined) n = 1;\n        this.offset += n;\n        return this;\n    }\n\n    /**\n     * Move the pointer to the given offset\n     * @param {number} offset\n     * @return {IOBuffer}\n     */\n    seek(offset) {\n        this.offset = offset;\n        return this;\n    }\n\n    /**\n     * Store the current pointer offset.\n     * @see {@link IOBuffer#reset}\n     * @return {IOBuffer}\n     */\n    mark() {\n        this._mark = this.offset;\n        return this;\n    }\n\n    /**\n     * Move the pointer back to the last pointer offset set by mark\n     * @see {@link IOBuffer#mark}\n     * @return {IOBuffer}\n     */\n    reset() {\n        this.offset = this._mark;\n        return this;\n    }\n\n    /**\n     * Push the current pointer offset to the mark stack\n     * @see {@link IOBuffer#popMark}\n     * @return {IOBuffer}\n     */\n    pushMark() {\n        this._marks.push(this.offset);\n        return this;\n    }\n\n    /**\n     * Pop the last pointer offset from the mark stack, and set the current pointer offset to the popped value\n     * @see {@link IOBuffer#pushMark}\n     * @return {IOBuffer}\n     */\n    popMark() {\n        const offset = this._marks.pop();\n        if (offset === undefined) throw new Error('Mark stack empty');\n        this.seek(offset);\n        return this;\n    }\n\n    /**\n     * Move the pointer offset back to 0\n     * @return {IOBuffer}\n     */\n    rewind() {\n        this.offset = 0;\n        return this;\n    }\n\n    /**\n     * Make sure the buffer has sufficient memory to write a given byteLength at the current pointer offset\n     * If the buffer's memory is insufficient, this method will create a new buffer (a copy) with a length\n     * that is twice (byteLength + current offset)\n     * @param {number} [byteLength = 1]\n     * @return {IOBuffer}\n     */\n    ensureAvailable(byteLength) {\n        if (byteLength === undefined) byteLength = 1;\n        if (!this.available(byteLength)) {\n            const lengthNeeded = this.offset + byteLength;\n            const newLength = lengthNeeded * 2;\n            const newArray = new Uint8Array(newLength);\n            newArray.set(new Uint8Array(this.buffer));\n            this.buffer = newArray.buffer;\n            this.length = this.byteLength = newLength;\n            this._data = new DataView(this.buffer);\n        }\n        return this;\n    }\n\n    /**\n     * Read a byte and return false if the byte's value is 0, or true otherwise\n     * Moves pointer forward\n     * @return {boolean}\n     */\n    readBoolean() {\n        return this.readUint8() !== 0;\n    }\n\n    /**\n     * Read a signed 8-bit integer and move pointer forward\n     * @return {number}\n     */\n    readInt8() {\n        return this._data.getInt8(this.offset++);\n    }\n\n    /**\n     * Read an unsigned 8-bit integer and move pointer forward\n     * @return {number}\n     */\n    readUint8() {\n        return this._data.getUint8(this.offset++);\n    }\n\n    /**\n     * Alias for {@link IOBuffer#readUint8}\n     * @return {number}\n     */\n    readByte() {\n        return this.readUint8();\n    }\n\n    /**\n     * Read n bytes and move pointer forward.\n     * @param {number} n\n     * @return {Uint8Array}\n     */\n    readBytes(n) {\n        if (n === undefined) n = 1;\n        var bytes = new Uint8Array(n);\n        for (var i = 0; i < n; i++) {\n            bytes[i] = this.readByte();\n        }\n        return bytes;\n    }\n\n    /**\n     * Read a 16-bit signed integer and move pointer forward\n     * @return {number}\n     */\n    readInt16() {\n        var value = this._data.getInt16(this.offset, this.littleEndian);\n        this.offset += 2;\n        return value;\n    }\n\n    /**\n     * Read a 16-bit unsigned integer and move pointer forward\n     * @return {number}\n     */\n    readUint16() {\n        var value = this._data.getUint16(this.offset, this.littleEndian);\n        this.offset += 2;\n        return value;\n    }\n\n    /**\n     * Read a 32-bit signed integer and move pointer forward\n     * @return {number}\n     */\n    readInt32() {\n        var value = this._data.getInt32(this.offset, this.littleEndian);\n        this.offset += 4;\n        return value;\n    }\n\n    /**\n     * Read a 32-bit unsigned integer and move pointer forward\n     * @return {number}\n     */\n    readUint32() {\n        var value = this._data.getUint32(this.offset, this.littleEndian);\n        this.offset += 4;\n        return value;\n    }\n\n    /**\n     * Read a 32-bit floating number and move pointer forward\n     * @return {number}\n     */\n    readFloat32() {\n        var value = this._data.getFloat32(this.offset, this.littleEndian);\n        this.offset += 4;\n        return value;\n    }\n\n    /**\n     * Read a 64-bit floating number and move pointer forward\n     * @return {number}\n     */\n    readFloat64() {\n        var value = this._data.getFloat64(this.offset, this.littleEndian);\n        this.offset += 8;\n        return value;\n    }\n\n    /**\n     * Read 1-byte ascii character and move pointer forward\n     * @return {string}\n     */\n    readChar() {\n        return String.fromCharCode(this.readInt8());\n    }\n\n    /**\n     * Read n 1-byte ascii characters and move pointer forward\n     * @param {number} n\n     * @return {string}\n     */\n    readChars(n) {\n        if (n === undefined) n = 1;\n        charArray.length = n;\n        for (var i = 0; i < n; i++) {\n            charArray[i] = this.readChar();\n        }\n        return charArray.join('');\n    }\n\n    /**\n     * Read the next n bytes, return a UTF-8 decoded string and move pointer forward\n     * @param {number} n\n     * @return {string}\n     */\n    readUtf8(n) {\n        if (n === undefined) n = 1;\n        const bString = this.readChars(n);\n        return utf8.decode(bString);\n    }\n\n    /**\n     * Write 0xff if the passed value is truthy, 0x00 otherwise\n     * @param {any} value\n     * @return {IOBuffer}\n     */\n    writeBoolean(value) {\n        this.writeUint8(value ? 0xff : 0x00);\n        return this;\n    }\n\n    /**\n     * Write value as an 8-bit signed integer\n     * @param {number} value\n     * @return {IOBuffer}\n     */\n    writeInt8(value) {\n        this.ensureAvailable(1);\n        this._data.setInt8(this.offset++, value);\n        this._updateLastWrittenByte();\n        return this;\n    }\n\n    /**\n     * Write value as a 8-bit unsigned integer\n     * @param {number} value\n     * @return {IOBuffer}\n     */\n    writeUint8(value) {\n        this.ensureAvailable(1);\n        this._data.setUint8(this.offset++, value);\n        this._updateLastWrittenByte();\n        return this;\n    }\n\n    /**\n     * An alias for {@link IOBuffer#writeUint8}\n     * @param {number} value\n     * @return {IOBuffer}\n     */\n    writeByte(value) {\n        return this.writeUint8(value);\n    }\n\n    /**\n     * Write bytes\n     * @param {Array|Uint8Array} bytes\n     * @return {IOBuffer}\n     */\n    writeBytes(bytes) {\n        this.ensureAvailable(bytes.length);\n        for (var i = 0; i < bytes.length; i++) {\n            this._data.setUint8(this.offset++, bytes[i]);\n        }\n        this._updateLastWrittenByte();\n        return this;\n    }\n\n    /**\n     * Write value as an 16-bit signed integer\n     * @param {number} value\n     * @return {IOBuffer}\n     */\n    writeInt16(value) {\n        this.ensureAvailable(2);\n        this._data.setInt16(this.offset, value, this.littleEndian);\n        this.offset += 2;\n        this._updateLastWrittenByte();\n        return this;\n    }\n\n    /**\n     * Write value as a 16-bit unsigned integer\n     * @param {number} value\n     * @return {IOBuffer}\n     */\n    writeUint16(value) {\n        this.ensureAvailable(2);\n        this._data.setUint16(this.offset, value, this.littleEndian);\n        this.offset += 2;\n        this._updateLastWrittenByte();\n        return this;\n    }\n\n    /**\n     * Write a 32-bit signed integer at the current pointer offset\n     * @param {number} value\n     * @return {IOBuffer}\n     */\n    writeInt32(value) {\n        this.ensureAvailable(4);\n        this._data.setInt32(this.offset, value, this.littleEndian);\n        this.offset += 4;\n        this._updateLastWrittenByte();\n        return this;\n    }\n\n    /**\n     * Write a 32-bit unsigned integer at the current pointer offset\n     * @param {number} value - The value to set\n     * @return {IOBuffer}\n     */\n    writeUint32(value) {\n        this.ensureAvailable(4);\n        this._data.setUint32(this.offset, value, this.littleEndian);\n        this.offset += 4;\n        this._updateLastWrittenByte();\n        return this;\n    }\n\n    /**\n     * Write a 32-bit floating number at the current pointer offset\n     * @param {number} value - The value to set\n     * @return {IOBuffer}\n     */\n    writeFloat32(value) {\n        this.ensureAvailable(4);\n        this._data.setFloat32(this.offset, value, this.littleEndian);\n        this.offset += 4;\n        this._updateLastWrittenByte();\n        return this;\n    }\n\n    /**\n     * Write a 64-bit floating number at the current pointer offset\n     * @param {number} value\n     * @return {IOBuffer}\n     */\n    writeFloat64(value) {\n        this.ensureAvailable(8);\n        this._data.setFloat64(this.offset, value, this.littleEndian);\n        this.offset += 8;\n        this._updateLastWrittenByte();\n        return this;\n    }\n\n    /**\n     * Write the charCode of the passed string's first character to the current pointer offset\n     * @param {string} str - The character to set\n     * @return {IOBuffer}\n     */\n    writeChar(str) {\n        return this.writeUint8(str.charCodeAt(0));\n    }\n\n    /**\n     * Write the charCodes of the passed string's characters to the current pointer offset\n     * @param {string} str\n     * @return {IOBuffer}\n     */\n    writeChars(str) {\n        for (var i = 0; i < str.length; i++) {\n            this.writeUint8(str.charCodeAt(i));\n        }\n        return this;\n    }\n\n    /**\n     * UTF-8 encode and write the passed string to the current pointer offset\n     * @param {string} str\n     * @return {IOBuffer}\n     */\n    writeUtf8(str) {\n        const bString = utf8.encode(str);\n        return this.writeChars(bString);\n    }\n\n    /**\n     * Export a Uint8Array view of the internal buffer.\n     * The view starts at the byte offset and its length\n     * is calculated to stop at the last written byte or the original length.\n     * @return {Uint8Array}\n     */\n    toArray() {\n        return new Uint8Array(this.buffer, this.byteOffset, this._lastWrittenByte);\n    }\n\n    /**\n     * Same as {@link IOBuffer#toArray} but returns a Buffer if possible. Otherwise returns a Uint8Array.\n     * @return {Buffer|Uint8Array}\n     */\n    getBuffer() {\n        if (typeof Buffer !== 'undefined') {\n            return Buffer.from(this.toArray());\n        } else {\n            return this.toArray();\n        }\n    }\n\n    /**\n     * Update the last written byte offset\n     * @private\n     */\n    _updateLastWrittenByte() {\n        if (this.offset > this._lastWrittenByte) {\n            this._lastWrittenByte = this.offset;\n        }\n    }\n}\n\nmodule.exports = IOBuffer;\n","'use strict';\n\n/**\n * Throws a non-valid NetCDF exception if the statement it's true\n * @ignore\n * @param {boolean} statement - Throws if true\n * @param {string} reason - Reason to throw\n */\nfunction notNetcdf(statement, reason) {\n    if (statement) {\n        throw new TypeError('Not a valid NetCDF v3.x file: ' + reason);\n    }\n}\n\n/**\n * Moves 1, 2, or 3 bytes to next 4-byte boundary\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n */\nfunction padding(buffer) {\n    if ((buffer.offset % 4) !== 0) {\n        buffer.skip(4 - (buffer.offset % 4));\n    }\n}\n\n\n/**\n * Reads the name\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @return {string} - Name\n */\nfunction readName(buffer) {\n    // Read name\n    var nameLength = buffer.readUint32();\n    var name = buffer.readChars(nameLength);\n\n    // validate name\n    // TODO\n\n    // Apply padding\n    padding(buffer);\n    return name;\n}\n\nmodule.exports.notNetcdf = notNetcdf;\nmodule.exports.padding = padding;\nmodule.exports.readName = readName;\n","'use strict';\n\nconst notNetcdf = require('./utils').notNetcdf;\n\nconst types = {\n    BYTE: 1,\n    CHAR: 2,\n    SHORT: 3,\n    INT: 4,\n    FLOAT: 5,\n    DOUBLE: 6\n};\n\n/**\n * Parse a number into their respective type\n * @ignore\n * @param {number} type - integer that represents the type\n * @return {string} - parsed value of the type\n */\nfunction num2str(type) {\n    switch (Number(type)) {\n        case types.BYTE:\n            return 'byte';\n        case types.CHAR:\n            return 'char';\n        case types.SHORT:\n            return 'short';\n        case types.INT:\n            return 'int';\n        case types.FLOAT:\n            return 'float';\n        case types.DOUBLE:\n            return 'double';\n        /* istanbul ignore next */\n        default:\n            return 'undefined';\n    }\n}\n\n/**\n * Parse a number type identifier to his size in bytes\n * @ignore\n * @param {number} type - integer that represents the type\n * @return {number} -size of the type\n */\nfunction num2bytes(type) {\n    switch (Number(type)) {\n        case types.BYTE:\n            return 1;\n        case types.CHAR:\n            return 1;\n        case types.SHORT:\n            return 2;\n        case types.INT:\n            return 4;\n        case types.FLOAT:\n            return 4;\n        case types.DOUBLE:\n            return 8;\n        /* istanbul ignore next */\n        default:\n            return -1;\n    }\n}\n\n/**\n * Reverse search of num2str\n * @ignore\n * @param {string} type - string that represents the type\n * @return {number} - parsed value of the type\n */\nfunction str2num(type) {\n    switch (String(type)) {\n        case 'byte':\n            return types.BYTE;\n        case 'char':\n            return types.CHAR;\n        case 'short':\n            return types.SHORT;\n        case 'int':\n            return types.INT;\n        case 'float':\n            return types.FLOAT;\n        case 'double':\n            return types.DOUBLE;\n        /* istanbul ignore next */\n        default:\n            return -1;\n    }\n}\n\n/**\n * Auxiliary function to read numeric data\n * @ignore\n * @param {number} size - Size of the element to read\n * @param {function} bufferReader - Function to read next value\n * @return {Array<number>|number}\n */\nfunction readNumber(size, bufferReader) {\n    if (size !== 1) {\n        var numbers = new Array(size);\n        for (var i = 0; i < size; i++) {\n            numbers[i] = bufferReader();\n        }\n        return numbers;\n    } else {\n        return bufferReader();\n    }\n}\n\n/**\n * Given a type and a size reads the next element\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @param {number} type - Type of the data to read\n * @param {number} size - Size of the element to read\n * @return {string|Array<number>|number}\n */\nfunction readType(buffer, type, size) {\n    switch (type) {\n        case types.BYTE:\n            return buffer.readBytes(size);\n        case types.CHAR:\n            return trimNull(buffer.readChars(size));\n        case types.SHORT:\n            return readNumber(size, buffer.readInt16.bind(buffer));\n        case types.INT:\n            return readNumber(size, buffer.readInt32.bind(buffer));\n        case types.FLOAT:\n            return readNumber(size, buffer.readFloat32.bind(buffer));\n        case types.DOUBLE:\n            return readNumber(size, buffer.readFloat64.bind(buffer));\n        /* istanbul ignore next */\n        default:\n            notNetcdf(true, 'non valid type ' + type);\n            return undefined;\n    }\n}\n\n/**\n * Removes null terminate value\n * @ignore\n * @param {string} value - String to trim\n * @return {string} - Trimmed string\n */\nfunction trimNull(value) {\n    if (value.charCodeAt(value.length - 1) === 0) {\n        return value.substring(0, value.length - 1);\n    }\n    return value;\n}\n\nmodule.exports = types;\nmodule.exports.num2str = num2str;\nmodule.exports.num2bytes = num2bytes;\nmodule.exports.str2num = str2num;\nmodule.exports.readType = readType;\n","'use strict';\n\nconst types = require('./types');\n\n// const STREAMING = 4294967295;\n\n/**\n * Read data for the given non-record variable\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @param {object} variable - Variable metadata\n * @return {Array} - Data of the element\n */\nfunction nonRecord(buffer, variable) {\n    // variable type\n    const type = types.str2num(variable.type);\n\n    // size of the data\n    var size = variable.size / types.num2bytes(type);\n\n    // iterates over the data\n    var data = new Array(size);\n    for (var i = 0; i < size; i++) {\n        data[i] = types.readType(buffer, type, 1);\n    }\n\n    return data;\n}\n\n/**\n * Read data for the given record variable\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @param {object} variable - Variable metadata\n * @param {object} recordDimension - Record dimension metadata\n * @return {Array} - Data of the element\n */\nfunction record(buffer, variable, recordDimension) {\n    // variable type\n    const type = types.str2num(variable.type);\n    const width = variable.size ? variable.size / types.num2bytes(type) : 1;\n\n    // size of the data\n    // TODO streaming data\n    var size = recordDimension.length;\n\n    // iterates over the data\n    var data = new Array(size);\n    const step = recordDimension.recordStep;\n\n    for (var i = 0; i < size; i++) {\n        var currentOffset = buffer.offset;\n        data[i] = types.readType(buffer, type, width);\n        buffer.seek(currentOffset + step);\n    }\n\n    return data;\n}\n\nmodule.exports.nonRecord = nonRecord;\nmodule.exports.record = record;\n","'use strict';\n\nconst utils = require('./utils');\nconst types = require('./types');\n\n// Grammar constants\nconst ZERO = 0;\nconst NC_DIMENSION = 10;\nconst NC_VARIABLE = 11;\nconst NC_ATTRIBUTE = 12;\n\n/**\n * Read the header of the file\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @return {object} - Object with the fields:\n *  * `recordDimension`: Number with the length of record dimension\n *  * `dimensions`: List of dimensions\n *  * `globalAttributes`: List of global attributes\n *  * `variables`: List of variables\n */\nfunction header(buffer) {\n    // Length of record dimension\n    // sum of the varSize's of all the record variables.\n    var header = {recordDimension: {length: buffer.readUint32()}};\n\n    // List of dimensions\n    var dimList = dimensionsList(buffer);\n    header.recordDimension.id = dimList.recordId;\n    header.recordDimension.name = dimList.recordName;\n    header.dimensions = dimList.dimensions;\n\n    // List of global attributes\n    header.globalAttributes = attributesList(buffer);\n\n    // List of variables\n    var variables = variablesList(buffer, dimList.recordId);\n    header.variables = variables.variables;\n    header.recordDimension.recordStep = variables.recordStep;\n\n    return header;\n}\n\n/**\n * List of dimensions\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @return {object} - List of dimensions and record dimension with:\n *  * `name`: String with the name of the dimension\n *  * `size`: Number with the size of the dimension\n */\nfunction dimensionsList(buffer) {\n    var recordId, recordName;\n    const dimList = buffer.readUint32();\n    if (dimList === ZERO) {\n        utils.notNetcdf((buffer.readUint32() !== ZERO), 'wrong empty tag for list of dimensions');\n        return [];\n    } else {\n        utils.notNetcdf((dimList !== NC_DIMENSION), 'wrong tag for list of dimensions');\n\n        // Length of dimensions\n        const dimensionSize = buffer.readUint32();\n        var dimensions = new Array(dimensionSize);\n        for (var dim = 0; dim < dimensionSize; dim++) {\n            // Read name\n            var name = utils.readName(buffer);\n\n            // Read dimension size\n            const size = buffer.readUint32();\n            if (size === 0) {\n                recordId = dim;\n                recordName = name;\n            }\n\n            dimensions[dim] = {\n                name: name,\n                size: size\n            };\n        }\n    }\n    return {\n        dimensions: dimensions,\n        recordId: recordId,\n        recordName: recordName\n    };\n}\n\n/**\n * List of attributes\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @return {Array<object>} - List of attributes with:\n *  * `name`: String with the name of the attribute\n *  * `type`: String with the type of the attribute\n *  * `value`: A number or string with the value of the attribute\n */\nfunction attributesList(buffer) {\n    const gAttList = buffer.readUint32();\n    if (gAttList === ZERO) {\n        utils.notNetcdf((buffer.readUint32() !== ZERO), 'wrong empty tag for list of attributes');\n        return [];\n    } else {\n        utils.notNetcdf((gAttList !== NC_ATTRIBUTE), 'wrong tag for list of attributes');\n\n        // Length of attributes\n        const attributeSize = buffer.readUint32();\n        var attributes = new Array(attributeSize);\n        for (var gAtt = 0; gAtt < attributeSize; gAtt++) {\n            // Read name\n            var name = utils.readName(buffer);\n\n            // Read type\n            var type = buffer.readUint32();\n            utils.notNetcdf(((type < 1) || (type > 6)), 'non valid type ' + type);\n\n            // Read attribute\n            var size = buffer.readUint32();\n            var value = types.readType(buffer, type, size);\n\n            // Apply padding\n            utils.padding(buffer);\n\n            attributes[gAtt] = {\n                name: name,\n                type: types.num2str(type),\n                value: value\n            };\n        }\n    }\n    return attributes;\n}\n\n/**\n * List of variables\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n * @param {number} recordId - Id if the record dimension\n * @return {object} - Number of recordStep and list of variables with:\n *  * `name`: String with the name of the variable\n *  * `dimensions`: Array with the dimension IDs of the variable\n *  * `attributes`: Array with the attributes of the variable\n *  * `type`: String with the type of the variable\n *  * `size`: Number with the size of the variable\n *  * `offset`: Number with the offset where of the variable begins\n *  * `record`: True if is a record variable, false otherwise\n */\nfunction variablesList(buffer, recordId) {\n    const varList = buffer.readUint32();\n    var recordStep = 0;\n    if (varList === ZERO) {\n        utils.notNetcdf((buffer.readUint32() !== ZERO), 'wrong empty tag for list of variables');\n        return [];\n    } else {\n        utils.notNetcdf((varList !== NC_VARIABLE), 'wrong tag for list of variables');\n\n        // Length of variables\n        const variableSize = buffer.readUint32();\n        var variables = new Array(variableSize);\n        for (var v = 0; v < variableSize; v++) {\n            // Read name\n            var name = utils.readName(buffer);\n\n            // Read dimensionality of the variable\n            const dimensionality = buffer.readUint32();\n\n            // Index into the list of dimensions\n            var dimensionsIds = new Array(dimensionality);\n            for (var dim = 0; dim < dimensionality; dim++) {\n                dimensionsIds[dim] = buffer.readUint32();\n            }\n\n            // Read variables size\n            var attributes = attributesList(buffer);\n\n            // Read type\n            var type = buffer.readUint32();\n            utils.notNetcdf(((type < 1) && (type > 6)), 'non valid type ' + type);\n\n            // Read variable size\n            // The 32-bit varSize field is not large enough to contain the size of variables that require\n            // more than 2^32 - 4 bytes, so 2^32 - 1 is used in the varSize field for such variables.\n            const varSize = buffer.readUint32();\n\n            // Read offset\n            // TODO change it for supporting 64-bit\n            const offset = buffer.readUint32();\n\n            // Count amount of record variables\n            if (dimensionsIds[0] === recordId) {\n                recordStep += varSize;\n            }\n\n            variables[v] = {\n                name: name,\n                dimensions: dimensionsIds,\n                attributes: attributes,\n                type: types.num2str(type),\n                size: varSize,\n                offset: offset,\n                record: (dimensionsIds[0] === recordId)\n            };\n        }\n    }\n\n    return {\n        variables: variables,\n        recordStep: recordStep\n    };\n}\n\nmodule.exports = header;\n","'use strict';\n\nconst IOBuffer = require('iobuffer');\nconst utils = require('./utils');\nconst data = require('./data');\nconst readHeader = require('./header');\n\n/**\n * Reads a NetCDF v3.x file\n * https://www.unidata.ucar.edu/software/netcdf/docs/file_format_specifications.html\n * @param {ArrayBuffer} data - ArrayBuffer or any Typed Array (including Node.js' Buffer from v4) with the data\n * @constructor\n */\nclass NetCDFReader {\n    constructor(data) {\n        const buffer = new IOBuffer(data);\n        buffer.setBigEndian();\n\n        // Validate that it's a NetCDF file\n        utils.notNetcdf((buffer.readChars(3) !== 'CDF'), 'should start with CDF');\n\n        // Check the NetCDF format\n        const version = buffer.readByte();\n        utils.notNetcdf((version === 2), '64-bit offset format not supported yet');\n        utils.notNetcdf((version !== 1), 'unknown version');\n\n        // Read the header\n        this.header = readHeader(buffer);\n        this.header.version = version;\n        this.buffer = buffer;\n    }\n\n    /**\n     * @return {string} - Version for the NetCDF format\n     */\n    get version() {\n        if (this.header.version === 1) {\n            return 'classic format';\n        } else {\n            return '64-bit offset format';\n        }\n    }\n\n    /**\n     * @return {object} - Metadata for the record dimension\n     *  * `length`: Number of elements in the record dimension\n     *  * `id`: Id number in the list of dimensions for the record dimension\n     *  * `name`: String with the name of the record dimension\n     *  * `recordStep`: Number with the record variables step size\n     */\n    get recordDimension() {\n        return this.header.recordDimension;\n    }\n\n    /**\n     * @return {Array<object>} - List of dimensions with:\n     *  * `name`: String with the name of the dimension\n     *  * `size`: Number with the size of the dimension\n     */\n    get dimensions() {\n        return this.header.dimensions;\n    }\n\n    /**\n     * @return {Array<object>} - List of global attributes with:\n     *  * `name`: String with the name of the attribute\n     *  * `type`: String with the type of the attribute\n     *  * `value`: A number or string with the value of the attribute\n     */\n    get globalAttributes() {\n        return this.header.globalAttributes;\n    }\n\n    /**\n     * @return {Array<object>} - List of variables with:\n     *  * `name`: String with the name of the variable\n     *  * `dimensions`: Array with the dimension IDs of the variable\n     *  * `attributes`: Array with the attributes of the variable\n     *  * `type`: String with the type of the variable\n     *  * `size`: Number with the size of the variable\n     *  * `offset`: Number with the offset where of the variable begins\n     *  * `record`: True if is a record variable, false otherwise\n     */\n    get variables() {\n        return this.header.variables;\n    }\n\n    /**\n     * Retrieves the data for a given variable\n     * @param {string|object} variableName - Name of the variable to search or variable object\n     * @return {Array} - List with the variable values\n     */\n    getDataVariable(variableName) {\n        var variable;\n        if (typeof variableName === 'string') {\n            // search the variable\n            variable = this.header.variables.find(function (val) {\n                return val.name === variableName;\n            });\n        } else {\n            variable = variableName;\n        }\n\n        // throws if variable not found\n        utils.notNetcdf((variable === undefined), 'variable not found');\n\n        // go to the offset position\n        this.buffer.seek(variable.offset);\n\n        if (variable.record) {\n            // record variable case\n            return data.record(this.buffer, variable, this.header.recordDimension);\n        } else {\n            // non-record variable case\n            return data.nonRecord(this.buffer, variable);\n        }\n    }\n}\n\nmodule.exports = NetCDFReader;\n","var isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tObject.keys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tObject.keys(source).forEach(function(key) {\n\t\tif (!options.isMergeableObject(source[key]) || !target[key]) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = deepmerge(target[key], source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nexport default deepmerge_1;\n","//! moment.js\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\n    var hookCallback;\n\n    function hooks () {\n        return hookCallback.apply(null, arguments);\n    }\n\n    // This is done to register the method called with moment()\n    // without creating circular dependencies.\n    function setHookCallback (callback) {\n        hookCallback = callback;\n    }\n\n    function isArray(input) {\n        return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n    }\n\n    function isObject(input) {\n        // IE8 will treat undefined and null as object if it wasn't for\n        // input != null\n        return input != null && Object.prototype.toString.call(input) === '[object Object]';\n    }\n\n    function isObjectEmpty(obj) {\n        if (Object.getOwnPropertyNames) {\n            return (Object.getOwnPropertyNames(obj).length === 0);\n        } else {\n            var k;\n            for (k in obj) {\n                if (obj.hasOwnProperty(k)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n    }\n\n    function isUndefined(input) {\n        return input === void 0;\n    }\n\n    function isNumber(input) {\n        return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n    }\n\n    function isDate(input) {\n        return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n    }\n\n    function map(arr, fn) {\n        var res = [], i;\n        for (i = 0; i < arr.length; ++i) {\n            res.push(fn(arr[i], i));\n        }\n        return res;\n    }\n\n    function hasOwnProp(a, b) {\n        return Object.prototype.hasOwnProperty.call(a, b);\n    }\n\n    function extend(a, b) {\n        for (var i in b) {\n            if (hasOwnProp(b, i)) {\n                a[i] = b[i];\n            }\n        }\n\n        if (hasOwnProp(b, 'toString')) {\n            a.toString = b.toString;\n        }\n\n        if (hasOwnProp(b, 'valueOf')) {\n            a.valueOf = b.valueOf;\n        }\n\n        return a;\n    }\n\n    function createUTC (input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, true).utc();\n    }\n\n    function defaultParsingFlags() {\n        // We need to deep clone this object.\n        return {\n            empty           : false,\n            unusedTokens    : [],\n            unusedInput     : [],\n            overflow        : -2,\n            charsLeftOver   : 0,\n            nullInput       : false,\n            invalidMonth    : null,\n            invalidFormat   : false,\n            userInvalidated : false,\n            iso             : false,\n            parsedDateParts : [],\n            meridiem        : null,\n            rfc2822         : false,\n            weekdayMismatch : false\n        };\n    }\n\n    function getParsingFlags(m) {\n        if (m._pf == null) {\n            m._pf = defaultParsingFlags();\n        }\n        return m._pf;\n    }\n\n    var some;\n    if (Array.prototype.some) {\n        some = Array.prototype.some;\n    } else {\n        some = function (fun) {\n            var t = Object(this);\n            var len = t.length >>> 0;\n\n            for (var i = 0; i < len; i++) {\n                if (i in t && fun.call(this, t[i], i, t)) {\n                    return true;\n                }\n            }\n\n            return false;\n        };\n    }\n\n    function isValid(m) {\n        if (m._isValid == null) {\n            var flags = getParsingFlags(m);\n            var parsedParts = some.call(flags.parsedDateParts, function (i) {\n                return i != null;\n            });\n            var isNowValid = !isNaN(m._d.getTime()) &&\n                flags.overflow < 0 &&\n                !flags.empty &&\n                !flags.invalidMonth &&\n                !flags.invalidWeekday &&\n                !flags.weekdayMismatch &&\n                !flags.nullInput &&\n                !flags.invalidFormat &&\n                !flags.userInvalidated &&\n                (!flags.meridiem || (flags.meridiem && parsedParts));\n\n            if (m._strict) {\n                isNowValid = isNowValid &&\n                    flags.charsLeftOver === 0 &&\n                    flags.unusedTokens.length === 0 &&\n                    flags.bigHour === undefined;\n            }\n\n            if (Object.isFrozen == null || !Object.isFrozen(m)) {\n                m._isValid = isNowValid;\n            }\n            else {\n                return isNowValid;\n            }\n        }\n        return m._isValid;\n    }\n\n    function createInvalid (flags) {\n        var m = createUTC(NaN);\n        if (flags != null) {\n            extend(getParsingFlags(m), flags);\n        }\n        else {\n            getParsingFlags(m).userInvalidated = true;\n        }\n\n        return m;\n    }\n\n    // Plugins that add properties should also add the key here (null value),\n    // so we can properly clone ourselves.\n    var momentProperties = hooks.momentProperties = [];\n\n    function copyConfig(to, from) {\n        var i, prop, val;\n\n        if (!isUndefined(from._isAMomentObject)) {\n            to._isAMomentObject = from._isAMomentObject;\n        }\n        if (!isUndefined(from._i)) {\n            to._i = from._i;\n        }\n        if (!isUndefined(from._f)) {\n            to._f = from._f;\n        }\n        if (!isUndefined(from._l)) {\n            to._l = from._l;\n        }\n        if (!isUndefined(from._strict)) {\n            to._strict = from._strict;\n        }\n        if (!isUndefined(from._tzm)) {\n            to._tzm = from._tzm;\n        }\n        if (!isUndefined(from._isUTC)) {\n            to._isUTC = from._isUTC;\n        }\n        if (!isUndefined(from._offset)) {\n            to._offset = from._offset;\n        }\n        if (!isUndefined(from._pf)) {\n            to._pf = getParsingFlags(from);\n        }\n        if (!isUndefined(from._locale)) {\n            to._locale = from._locale;\n        }\n\n        if (momentProperties.length > 0) {\n            for (i = 0; i < momentProperties.length; i++) {\n                prop = momentProperties[i];\n                val = from[prop];\n                if (!isUndefined(val)) {\n                    to[prop] = val;\n                }\n            }\n        }\n\n        return to;\n    }\n\n    var updateInProgress = false;\n\n    // Moment prototype object\n    function Moment(config) {\n        copyConfig(this, config);\n        this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n        if (!this.isValid()) {\n            this._d = new Date(NaN);\n        }\n        // Prevent infinite loop in case updateOffset creates new moment\n        // objects.\n        if (updateInProgress === false) {\n            updateInProgress = true;\n            hooks.updateOffset(this);\n            updateInProgress = false;\n        }\n    }\n\n    function isMoment (obj) {\n        return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n    }\n\n    function absFloor (number) {\n        if (number < 0) {\n            // -0 -> 0\n            return Math.ceil(number) || 0;\n        } else {\n            return Math.floor(number);\n        }\n    }\n\n    function toInt(argumentForCoercion) {\n        var coercedNumber = +argumentForCoercion,\n            value = 0;\n\n        if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n            value = absFloor(coercedNumber);\n        }\n\n        return value;\n    }\n\n    // compare two arrays, return the number of differences\n    function compareArrays(array1, array2, dontConvert) {\n        var len = Math.min(array1.length, array2.length),\n            lengthDiff = Math.abs(array1.length - array2.length),\n            diffs = 0,\n            i;\n        for (i = 0; i < len; i++) {\n            if ((dontConvert && array1[i] !== array2[i]) ||\n                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n                diffs++;\n            }\n        }\n        return diffs + lengthDiff;\n    }\n\n    function warn(msg) {\n        if (hooks.suppressDeprecationWarnings === false &&\n                (typeof console !==  'undefined') && console.warn) {\n            console.warn('Deprecation warning: ' + msg);\n        }\n    }\n\n    function deprecate(msg, fn) {\n        var firstTime = true;\n\n        return extend(function () {\n            if (hooks.deprecationHandler != null) {\n                hooks.deprecationHandler(null, msg);\n            }\n            if (firstTime) {\n                var args = [];\n                var arg;\n                for (var i = 0; i < arguments.length; i++) {\n                    arg = '';\n                    if (typeof arguments[i] === 'object') {\n                        arg += '\\n[' + i + '] ';\n                        for (var key in arguments[0]) {\n                            arg += key + ': ' + arguments[0][key] + ', ';\n                        }\n                        arg = arg.slice(0, -2); // Remove trailing comma and space\n                    } else {\n                        arg = arguments[i];\n                    }\n                    args.push(arg);\n                }\n                warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n                firstTime = false;\n            }\n            return fn.apply(this, arguments);\n        }, fn);\n    }\n\n    var deprecations = {};\n\n    function deprecateSimple(name, msg) {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(name, msg);\n        }\n        if (!deprecations[name]) {\n            warn(msg);\n            deprecations[name] = true;\n        }\n    }\n\n    hooks.suppressDeprecationWarnings = false;\n    hooks.deprecationHandler = null;\n\n    function isFunction(input) {\n        return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n    }\n\n    function set (config) {\n        var prop, i;\n        for (i in config) {\n            prop = config[i];\n            if (isFunction(prop)) {\n                this[i] = prop;\n            } else {\n                this['_' + i] = prop;\n            }\n        }\n        this._config = config;\n        // Lenient ordinal parsing accepts just a number in addition to\n        // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n        // TODO: Remove \"ordinalParse\" fallback in next major release.\n        this._dayOfMonthOrdinalParseLenient = new RegExp(\n            (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n                '|' + (/\\d{1,2}/).source);\n    }\n\n    function mergeConfigs(parentConfig, childConfig) {\n        var res = extend({}, parentConfig), prop;\n        for (prop in childConfig) {\n            if (hasOwnProp(childConfig, prop)) {\n                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                    res[prop] = {};\n                    extend(res[prop], parentConfig[prop]);\n                    extend(res[prop], childConfig[prop]);\n                } else if (childConfig[prop] != null) {\n                    res[prop] = childConfig[prop];\n                } else {\n                    delete res[prop];\n                }\n            }\n        }\n        for (prop in parentConfig) {\n            if (hasOwnProp(parentConfig, prop) &&\n                    !hasOwnProp(childConfig, prop) &&\n                    isObject(parentConfig[prop])) {\n                // make sure changes to properties don't modify parent config\n                res[prop] = extend({}, res[prop]);\n            }\n        }\n        return res;\n    }\n\n    function Locale(config) {\n        if (config != null) {\n            this.set(config);\n        }\n    }\n\n    var keys;\n\n    if (Object.keys) {\n        keys = Object.keys;\n    } else {\n        keys = function (obj) {\n            var i, res = [];\n            for (i in obj) {\n                if (hasOwnProp(obj, i)) {\n                    res.push(i);\n                }\n            }\n            return res;\n        };\n    }\n\n    var defaultCalendar = {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    };\n\n    function calendar (key, mom, now) {\n        var output = this._calendar[key] || this._calendar['sameElse'];\n        return isFunction(output) ? output.call(mom, now) : output;\n    }\n\n    var defaultLongDateFormat = {\n        LTS  : 'h:mm:ss A',\n        LT   : 'h:mm A',\n        L    : 'MM/DD/YYYY',\n        LL   : 'MMMM D, YYYY',\n        LLL  : 'MMMM D, YYYY h:mm A',\n        LLLL : 'dddd, MMMM D, YYYY h:mm A'\n    };\n\n    function longDateFormat (key) {\n        var format = this._longDateFormat[key],\n            formatUpper = this._longDateFormat[key.toUpperCase()];\n\n        if (format || !formatUpper) {\n            return format;\n        }\n\n        this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n            return val.slice(1);\n        });\n\n        return this._longDateFormat[key];\n    }\n\n    var defaultInvalidDate = 'Invalid date';\n\n    function invalidDate () {\n        return this._invalidDate;\n    }\n\n    var defaultOrdinal = '%d';\n    var defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n    function ordinal (number) {\n        return this._ordinal.replace('%d', number);\n    }\n\n    var defaultRelativeTime = {\n        future : 'in %s',\n        past   : '%s ago',\n        s  : 'a few seconds',\n        ss : '%d seconds',\n        m  : 'a minute',\n        mm : '%d minutes',\n        h  : 'an hour',\n        hh : '%d hours',\n        d  : 'a day',\n        dd : '%d days',\n        M  : 'a month',\n        MM : '%d months',\n        y  : 'a year',\n        yy : '%d years'\n    };\n\n    function relativeTime (number, withoutSuffix, string, isFuture) {\n        var output = this._relativeTime[string];\n        return (isFunction(output)) ?\n            output(number, withoutSuffix, string, isFuture) :\n            output.replace(/%d/i, number);\n    }\n\n    function pastFuture (diff, output) {\n        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n        return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n    }\n\n    var aliases = {};\n\n    function addUnitAlias (unit, shorthand) {\n        var lowerCase = unit.toLowerCase();\n        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n    }\n\n    function normalizeUnits(units) {\n        return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n    }\n\n    function normalizeObjectUnits(inputObject) {\n        var normalizedInput = {},\n            normalizedProp,\n            prop;\n\n        for (prop in inputObject) {\n            if (hasOwnProp(inputObject, prop)) {\n                normalizedProp = normalizeUnits(prop);\n                if (normalizedProp) {\n                    normalizedInput[normalizedProp] = inputObject[prop];\n                }\n            }\n        }\n\n        return normalizedInput;\n    }\n\n    var priorities = {};\n\n    function addUnitPriority(unit, priority) {\n        priorities[unit] = priority;\n    }\n\n    function getPrioritizedUnits(unitsObj) {\n        var units = [];\n        for (var u in unitsObj) {\n            units.push({unit: u, priority: priorities[u]});\n        }\n        units.sort(function (a, b) {\n            return a.priority - b.priority;\n        });\n        return units;\n    }\n\n    function zeroFill(number, targetLength, forceSign) {\n        var absNumber = '' + Math.abs(number),\n            zerosToFill = targetLength - absNumber.length,\n            sign = number >= 0;\n        return (sign ? (forceSign ? '+' : '') : '-') +\n            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n    }\n\n    var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\n    var localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\n    var formatFunctions = {};\n\n    var formatTokenFunctions = {};\n\n    // token:    'M'\n    // padded:   ['MM', 2]\n    // ordinal:  'Mo'\n    // callback: function () { this.month() + 1 }\n    function addFormatToken (token, padded, ordinal, callback) {\n        var func = callback;\n        if (typeof callback === 'string') {\n            func = function () {\n                return this[callback]();\n            };\n        }\n        if (token) {\n            formatTokenFunctions[token] = func;\n        }\n        if (padded) {\n            formatTokenFunctions[padded[0]] = function () {\n                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n            };\n        }\n        if (ordinal) {\n            formatTokenFunctions[ordinal] = function () {\n                return this.localeData().ordinal(func.apply(this, arguments), token);\n            };\n        }\n    }\n\n    function removeFormattingTokens(input) {\n        if (input.match(/\\[[\\s\\S]/)) {\n            return input.replace(/^\\[|\\]$/g, '');\n        }\n        return input.replace(/\\\\/g, '');\n    }\n\n    function makeFormatFunction(format) {\n        var array = format.match(formattingTokens), i, length;\n\n        for (i = 0, length = array.length; i < length; i++) {\n            if (formatTokenFunctions[array[i]]) {\n                array[i] = formatTokenFunctions[array[i]];\n            } else {\n                array[i] = removeFormattingTokens(array[i]);\n            }\n        }\n\n        return function (mom) {\n            var output = '', i;\n            for (i = 0; i < length; i++) {\n                output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n            }\n            return output;\n        };\n    }\n\n    // format date using native date object\n    function formatMoment(m, format) {\n        if (!m.isValid()) {\n            return m.localeData().invalidDate();\n        }\n\n        format = expandFormat(format, m.localeData());\n        formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n        return formatFunctions[format](m);\n    }\n\n    function expandFormat(format, locale) {\n        var i = 5;\n\n        function replaceLongDateFormatTokens(input) {\n            return locale.longDateFormat(input) || input;\n        }\n\n        localFormattingTokens.lastIndex = 0;\n        while (i >= 0 && localFormattingTokens.test(format)) {\n            format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n            localFormattingTokens.lastIndex = 0;\n            i -= 1;\n        }\n\n        return format;\n    }\n\n    var match1         = /\\d/;            //       0 - 9\n    var match2         = /\\d\\d/;          //      00 - 99\n    var match3         = /\\d{3}/;         //     000 - 999\n    var match4         = /\\d{4}/;         //    0000 - 9999\n    var match6         = /[+-]?\\d{6}/;    // -999999 - 999999\n    var match1to2      = /\\d\\d?/;         //       0 - 99\n    var match3to4      = /\\d\\d\\d\\d?/;     //     999 - 9999\n    var match5to6      = /\\d\\d\\d\\d\\d\\d?/; //   99999 - 999999\n    var match1to3      = /\\d{1,3}/;       //       0 - 999\n    var match1to4      = /\\d{1,4}/;       //       0 - 9999\n    var match1to6      = /[+-]?\\d{1,6}/;  // -999999 - 999999\n\n    var matchUnsigned  = /\\d+/;           //       0 - inf\n    var matchSigned    = /[+-]?\\d+/;      //    -inf - inf\n\n    var matchOffset    = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\n    var matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\n    var matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n    // any word (or two) characters or numbers including two/three word month in arabic.\n    // includes scottish gaelic two word and hyphenated months\n    var matchWord = /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i;\n\n    var regexes = {};\n\n    function addRegexToken (token, regex, strictRegex) {\n        regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n            return (isStrict && strictRegex) ? strictRegex : regex;\n        };\n    }\n\n    function getParseRegexForToken (token, config) {\n        if (!hasOwnProp(regexes, token)) {\n            return new RegExp(unescapeFormat(token));\n        }\n\n        return regexes[token](config._strict, config._locale);\n    }\n\n    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n    function unescapeFormat(s) {\n        return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n            return p1 || p2 || p3 || p4;\n        }));\n    }\n\n    function regexEscape(s) {\n        return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n    }\n\n    var tokens = {};\n\n    function addParseToken (token, callback) {\n        var i, func = callback;\n        if (typeof token === 'string') {\n            token = [token];\n        }\n        if (isNumber(callback)) {\n            func = function (input, array) {\n                array[callback] = toInt(input);\n            };\n        }\n        for (i = 0; i < token.length; i++) {\n            tokens[token[i]] = func;\n        }\n    }\n\n    function addWeekParseToken (token, callback) {\n        addParseToken(token, function (input, array, config, token) {\n            config._w = config._w || {};\n            callback(input, config._w, config, token);\n        });\n    }\n\n    function addTimeToArrayFromToken(token, input, config) {\n        if (input != null && hasOwnProp(tokens, token)) {\n            tokens[token](input, config._a, config, token);\n        }\n    }\n\n    var YEAR = 0;\n    var MONTH = 1;\n    var DATE = 2;\n    var HOUR = 3;\n    var MINUTE = 4;\n    var SECOND = 5;\n    var MILLISECOND = 6;\n    var WEEK = 7;\n    var WEEKDAY = 8;\n\n    // FORMATTING\n\n    addFormatToken('Y', 0, 0, function () {\n        var y = this.year();\n        return y <= 9999 ? '' + y : '+' + y;\n    });\n\n    addFormatToken(0, ['YY', 2], 0, function () {\n        return this.year() % 100;\n    });\n\n    addFormatToken(0, ['YYYY',   4],       0, 'year');\n    addFormatToken(0, ['YYYYY',  5],       0, 'year');\n    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n    // ALIASES\n\n    addUnitAlias('year', 'y');\n\n    // PRIORITIES\n\n    addUnitPriority('year', 1);\n\n    // PARSING\n\n    addRegexToken('Y',      matchSigned);\n    addRegexToken('YY',     match1to2, match2);\n    addRegexToken('YYYY',   match1to4, match4);\n    addRegexToken('YYYYY',  match1to6, match6);\n    addRegexToken('YYYYYY', match1to6, match6);\n\n    addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n    addParseToken('YYYY', function (input, array) {\n        array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n    });\n    addParseToken('YY', function (input, array) {\n        array[YEAR] = hooks.parseTwoDigitYear(input);\n    });\n    addParseToken('Y', function (input, array) {\n        array[YEAR] = parseInt(input, 10);\n    });\n\n    // HELPERS\n\n    function daysInYear(year) {\n        return isLeapYear(year) ? 366 : 365;\n    }\n\n    function isLeapYear(year) {\n        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n    }\n\n    // HOOKS\n\n    hooks.parseTwoDigitYear = function (input) {\n        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n    };\n\n    // MOMENTS\n\n    var getSetYear = makeGetSet('FullYear', true);\n\n    function getIsLeapYear () {\n        return isLeapYear(this.year());\n    }\n\n    function makeGetSet (unit, keepTime) {\n        return function (value) {\n            if (value != null) {\n                set$1(this, unit, value);\n                hooks.updateOffset(this, keepTime);\n                return this;\n            } else {\n                return get(this, unit);\n            }\n        };\n    }\n\n    function get (mom, unit) {\n        return mom.isValid() ?\n            mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n    }\n\n    function set$1 (mom, unit, value) {\n        if (mom.isValid() && !isNaN(value)) {\n            if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {\n                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n            }\n            else {\n                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function stringGet (units) {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units]();\n        }\n        return this;\n    }\n\n\n    function stringSet (units, value) {\n        if (typeof units === 'object') {\n            units = normalizeObjectUnits(units);\n            var prioritized = getPrioritizedUnits(units);\n            for (var i = 0; i < prioritized.length; i++) {\n                this[prioritized[i].unit](units[prioritized[i].unit]);\n            }\n        } else {\n            units = normalizeUnits(units);\n            if (isFunction(this[units])) {\n                return this[units](value);\n            }\n        }\n        return this;\n    }\n\n    function mod(n, x) {\n        return ((n % x) + x) % x;\n    }\n\n    var indexOf;\n\n    if (Array.prototype.indexOf) {\n        indexOf = Array.prototype.indexOf;\n    } else {\n        indexOf = function (o) {\n            // I know\n            var i;\n            for (i = 0; i < this.length; ++i) {\n                if (this[i] === o) {\n                    return i;\n                }\n            }\n            return -1;\n        };\n    }\n\n    function daysInMonth(year, month) {\n        if (isNaN(year) || isNaN(month)) {\n            return NaN;\n        }\n        var modMonth = mod(month, 12);\n        year += (month - modMonth) / 12;\n        return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);\n    }\n\n    // FORMATTING\n\n    addFormatToken('M', ['MM', 2], 'Mo', function () {\n        return this.month() + 1;\n    });\n\n    addFormatToken('MMM', 0, 0, function (format) {\n        return this.localeData().monthsShort(this, format);\n    });\n\n    addFormatToken('MMMM', 0, 0, function (format) {\n        return this.localeData().months(this, format);\n    });\n\n    // ALIASES\n\n    addUnitAlias('month', 'M');\n\n    // PRIORITY\n\n    addUnitPriority('month', 8);\n\n    // PARSING\n\n    addRegexToken('M',    match1to2);\n    addRegexToken('MM',   match1to2, match2);\n    addRegexToken('MMM',  function (isStrict, locale) {\n        return locale.monthsShortRegex(isStrict);\n    });\n    addRegexToken('MMMM', function (isStrict, locale) {\n        return locale.monthsRegex(isStrict);\n    });\n\n    addParseToken(['M', 'MM'], function (input, array) {\n        array[MONTH] = toInt(input) - 1;\n    });\n\n    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n        var month = config._locale.monthsParse(input, token, config._strict);\n        // if we didn't find a month name, mark the date as invalid.\n        if (month != null) {\n            array[MONTH] = month;\n        } else {\n            getParsingFlags(config).invalidMonth = input;\n        }\n    });\n\n    // LOCALES\n\n    var MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\n    var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\n    function localeMonths (m, format) {\n        if (!m) {\n            return isArray(this._months) ? this._months :\n                this._months['standalone'];\n        }\n        return isArray(this._months) ? this._months[m.month()] :\n            this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n    }\n\n    var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\n    function localeMonthsShort (m, format) {\n        if (!m) {\n            return isArray(this._monthsShort) ? this._monthsShort :\n                this._monthsShort['standalone'];\n        }\n        return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n            this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n    }\n\n    function handleStrictParse(monthName, format, strict) {\n        var i, ii, mom, llc = monthName.toLocaleLowerCase();\n        if (!this._monthsParse) {\n            // this is not used\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n            for (i = 0; i < 12; ++i) {\n                mom = createUTC([2000, i]);\n                this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n            }\n        }\n\n        if (strict) {\n            if (format === 'MMM') {\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._longMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        } else {\n            if (format === 'MMM') {\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._longMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._longMonthsParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        }\n    }\n\n    function localeMonthsParse (monthName, format, strict) {\n        var i, mom, regex;\n\n        if (this._monthsParseExact) {\n            return handleStrictParse.call(this, monthName, format, strict);\n        }\n\n        if (!this._monthsParse) {\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n        }\n\n        // TODO: add sorting\n        // Sorting makes sure if one month (or abbr) is a prefix of another\n        // see sorting in computeMonthsParse\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, i]);\n            if (strict && !this._longMonthsParse[i]) {\n                this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n                this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n            }\n            if (!strict && !this._monthsParse[i]) {\n                regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n                return i;\n            } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n                return i;\n            } else if (!strict && this._monthsParse[i].test(monthName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function setMonth (mom, value) {\n        var dayOfMonth;\n\n        if (!mom.isValid()) {\n            // No op\n            return mom;\n        }\n\n        if (typeof value === 'string') {\n            if (/^\\d+$/.test(value)) {\n                value = toInt(value);\n            } else {\n                value = mom.localeData().monthsParse(value);\n                // TODO: Another silent failure?\n                if (!isNumber(value)) {\n                    return mom;\n                }\n            }\n        }\n\n        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n        return mom;\n    }\n\n    function getSetMonth (value) {\n        if (value != null) {\n            setMonth(this, value);\n            hooks.updateOffset(this, true);\n            return this;\n        } else {\n            return get(this, 'Month');\n        }\n    }\n\n    function getDaysInMonth () {\n        return daysInMonth(this.year(), this.month());\n    }\n\n    var defaultMonthsShortRegex = matchWord;\n    function monthsShortRegex (isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsShortStrictRegex;\n            } else {\n                return this._monthsShortRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_monthsShortRegex')) {\n                this._monthsShortRegex = defaultMonthsShortRegex;\n            }\n            return this._monthsShortStrictRegex && isStrict ?\n                this._monthsShortStrictRegex : this._monthsShortRegex;\n        }\n    }\n\n    var defaultMonthsRegex = matchWord;\n    function monthsRegex (isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsStrictRegex;\n            } else {\n                return this._monthsRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                this._monthsRegex = defaultMonthsRegex;\n            }\n            return this._monthsStrictRegex && isStrict ?\n                this._monthsStrictRegex : this._monthsRegex;\n        }\n    }\n\n    function computeMonthsParse () {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var shortPieces = [], longPieces = [], mixedPieces = [],\n            i, mom;\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, i]);\n            shortPieces.push(this.monthsShort(mom, ''));\n            longPieces.push(this.months(mom, ''));\n            mixedPieces.push(this.months(mom, ''));\n            mixedPieces.push(this.monthsShort(mom, ''));\n        }\n        // Sorting makes sure if one month (or abbr) is a prefix of another it\n        // will match the longer piece.\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n        for (i = 0; i < 12; i++) {\n            shortPieces[i] = regexEscape(shortPieces[i]);\n            longPieces[i] = regexEscape(longPieces[i]);\n        }\n        for (i = 0; i < 24; i++) {\n            mixedPieces[i] = regexEscape(mixedPieces[i]);\n        }\n\n        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._monthsShortRegex = this._monthsRegex;\n        this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n        this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n    }\n\n    function createDate (y, m, d, h, M, s, ms) {\n        // can't just apply() to create a date:\n        // https://stackoverflow.com/q/181348\n        var date = new Date(y, m, d, h, M, s, ms);\n\n        // the date constructor remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n            date.setFullYear(y);\n        }\n        return date;\n    }\n\n    function createUTCDate (y) {\n        var date = new Date(Date.UTC.apply(null, arguments));\n\n        // the Date.UTC function remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n            date.setUTCFullYear(y);\n        }\n        return date;\n    }\n\n    // start-of-first-week - start-of-year\n    function firstWeekOffset(year, dow, doy) {\n        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n            fwd = 7 + dow - doy,\n            // first-week day local weekday -- which local weekday is fwd\n            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n        return -fwdlw + fwd - 1;\n    }\n\n    // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n        var localWeekday = (7 + weekday - dow) % 7,\n            weekOffset = firstWeekOffset(year, dow, doy),\n            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n            resYear, resDayOfYear;\n\n        if (dayOfYear <= 0) {\n            resYear = year - 1;\n            resDayOfYear = daysInYear(resYear) + dayOfYear;\n        } else if (dayOfYear > daysInYear(year)) {\n            resYear = year + 1;\n            resDayOfYear = dayOfYear - daysInYear(year);\n        } else {\n            resYear = year;\n            resDayOfYear = dayOfYear;\n        }\n\n        return {\n            year: resYear,\n            dayOfYear: resDayOfYear\n        };\n    }\n\n    function weekOfYear(mom, dow, doy) {\n        var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n            resWeek, resYear;\n\n        if (week < 1) {\n            resYear = mom.year() - 1;\n            resWeek = week + weeksInYear(resYear, dow, doy);\n        } else if (week > weeksInYear(mom.year(), dow, doy)) {\n            resWeek = week - weeksInYear(mom.year(), dow, doy);\n            resYear = mom.year() + 1;\n        } else {\n            resYear = mom.year();\n            resWeek = week;\n        }\n\n        return {\n            week: resWeek,\n            year: resYear\n        };\n    }\n\n    function weeksInYear(year, dow, doy) {\n        var weekOffset = firstWeekOffset(year, dow, doy),\n            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n    }\n\n    // FORMATTING\n\n    addFormatToken('w', ['ww', 2], 'wo', 'week');\n    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n    // ALIASES\n\n    addUnitAlias('week', 'w');\n    addUnitAlias('isoWeek', 'W');\n\n    // PRIORITIES\n\n    addUnitPriority('week', 5);\n    addUnitPriority('isoWeek', 5);\n\n    // PARSING\n\n    addRegexToken('w',  match1to2);\n    addRegexToken('ww', match1to2, match2);\n    addRegexToken('W',  match1to2);\n    addRegexToken('WW', match1to2, match2);\n\n    addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n        week[token.substr(0, 1)] = toInt(input);\n    });\n\n    // HELPERS\n\n    // LOCALES\n\n    function localeWeek (mom) {\n        return weekOfYear(mom, this._week.dow, this._week.doy).week;\n    }\n\n    var defaultLocaleWeek = {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    };\n\n    function localeFirstDayOfWeek () {\n        return this._week.dow;\n    }\n\n    function localeFirstDayOfYear () {\n        return this._week.doy;\n    }\n\n    // MOMENTS\n\n    function getSetWeek (input) {\n        var week = this.localeData().week(this);\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    function getSetISOWeek (input) {\n        var week = weekOfYear(this, 1, 4).week;\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('d', 0, 'do', 'day');\n\n    addFormatToken('dd', 0, 0, function (format) {\n        return this.localeData().weekdaysMin(this, format);\n    });\n\n    addFormatToken('ddd', 0, 0, function (format) {\n        return this.localeData().weekdaysShort(this, format);\n    });\n\n    addFormatToken('dddd', 0, 0, function (format) {\n        return this.localeData().weekdays(this, format);\n    });\n\n    addFormatToken('e', 0, 0, 'weekday');\n    addFormatToken('E', 0, 0, 'isoWeekday');\n\n    // ALIASES\n\n    addUnitAlias('day', 'd');\n    addUnitAlias('weekday', 'e');\n    addUnitAlias('isoWeekday', 'E');\n\n    // PRIORITY\n    addUnitPriority('day', 11);\n    addUnitPriority('weekday', 11);\n    addUnitPriority('isoWeekday', 11);\n\n    // PARSING\n\n    addRegexToken('d',    match1to2);\n    addRegexToken('e',    match1to2);\n    addRegexToken('E',    match1to2);\n    addRegexToken('dd',   function (isStrict, locale) {\n        return locale.weekdaysMinRegex(isStrict);\n    });\n    addRegexToken('ddd',   function (isStrict, locale) {\n        return locale.weekdaysShortRegex(isStrict);\n    });\n    addRegexToken('dddd',   function (isStrict, locale) {\n        return locale.weekdaysRegex(isStrict);\n    });\n\n    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n        var weekday = config._locale.weekdaysParse(input, token, config._strict);\n        // if we didn't get a weekday name, mark the date as invalid\n        if (weekday != null) {\n            week.d = weekday;\n        } else {\n            getParsingFlags(config).invalidWeekday = input;\n        }\n    });\n\n    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n        week[token] = toInt(input);\n    });\n\n    // HELPERS\n\n    function parseWeekday(input, locale) {\n        if (typeof input !== 'string') {\n            return input;\n        }\n\n        if (!isNaN(input)) {\n            return parseInt(input, 10);\n        }\n\n        input = locale.weekdaysParse(input);\n        if (typeof input === 'number') {\n            return input;\n        }\n\n        return null;\n    }\n\n    function parseIsoWeekday(input, locale) {\n        if (typeof input === 'string') {\n            return locale.weekdaysParse(input) % 7 || 7;\n        }\n        return isNaN(input) ? null : input;\n    }\n\n    // LOCALES\n\n    var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\n    function localeWeekdays (m, format) {\n        if (!m) {\n            return isArray(this._weekdays) ? this._weekdays :\n                this._weekdays['standalone'];\n        }\n        return isArray(this._weekdays) ? this._weekdays[m.day()] :\n            this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n    }\n\n    var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\n    function localeWeekdaysShort (m) {\n        return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n    }\n\n    var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\n    function localeWeekdaysMin (m) {\n        return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n    }\n\n    function handleStrictParse$1(weekdayName, format, strict) {\n        var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._minWeekdaysParse = [];\n\n            for (i = 0; i < 7; ++i) {\n                mom = createUTC([2000, 1]).day(i);\n                this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n                this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n            }\n        }\n\n        if (strict) {\n            if (format === 'dddd') {\n                ii = indexOf.call(this._weekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else if (format === 'ddd') {\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        } else {\n            if (format === 'dddd') {\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else if (format === 'ddd') {\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        }\n    }\n\n    function localeWeekdaysParse (weekdayName, format, strict) {\n        var i, mom, regex;\n\n        if (this._weekdaysParseExact) {\n            return handleStrictParse$1.call(this, weekdayName, format, strict);\n        }\n\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._minWeekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._fullWeekdaysParse = [];\n        }\n\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n\n            mom = createUTC([2000, 1]).day(i);\n            if (strict && !this._fullWeekdaysParse[i]) {\n                this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\\\.?') + '$', 'i');\n                this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\\\.?') + '$', 'i');\n                this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\\\.?') + '$', 'i');\n            }\n            if (!this._weekdaysParse[i]) {\n                regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n                return i;\n            } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n                return i;\n            } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n                return i;\n            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function getSetDayOfWeek (input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n        if (input != null) {\n            input = parseWeekday(input, this.localeData());\n            return this.add(input - day, 'd');\n        } else {\n            return day;\n        }\n    }\n\n    function getSetLocaleDayOfWeek (input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n        return input == null ? weekday : this.add(input - weekday, 'd');\n    }\n\n    function getSetISODayOfWeek (input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n\n        // behaves the same as moment#day except\n        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n        // as a setter, sunday should belong to the previous week.\n\n        if (input != null) {\n            var weekday = parseIsoWeekday(input, this.localeData());\n            return this.day(this.day() % 7 ? weekday : weekday - 7);\n        } else {\n            return this.day() || 7;\n        }\n    }\n\n    var defaultWeekdaysRegex = matchWord;\n    function weekdaysRegex (isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysStrictRegex;\n            } else {\n                return this._weekdaysRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                this._weekdaysRegex = defaultWeekdaysRegex;\n            }\n            return this._weekdaysStrictRegex && isStrict ?\n                this._weekdaysStrictRegex : this._weekdaysRegex;\n        }\n    }\n\n    var defaultWeekdaysShortRegex = matchWord;\n    function weekdaysShortRegex (isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysShortStrictRegex;\n            } else {\n                return this._weekdaysShortRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n                this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n            }\n            return this._weekdaysShortStrictRegex && isStrict ?\n                this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n        }\n    }\n\n    var defaultWeekdaysMinRegex = matchWord;\n    function weekdaysMinRegex (isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysMinStrictRegex;\n            } else {\n                return this._weekdaysMinRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n                this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n            }\n            return this._weekdaysMinStrictRegex && isStrict ?\n                this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n        }\n    }\n\n\n    function computeWeekdaysParse () {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n            i, mom, minp, shortp, longp;\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, 1]).day(i);\n            minp = this.weekdaysMin(mom, '');\n            shortp = this.weekdaysShort(mom, '');\n            longp = this.weekdays(mom, '');\n            minPieces.push(minp);\n            shortPieces.push(shortp);\n            longPieces.push(longp);\n            mixedPieces.push(minp);\n            mixedPieces.push(shortp);\n            mixedPieces.push(longp);\n        }\n        // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n        // will match the longer piece.\n        minPieces.sort(cmpLenRev);\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n        for (i = 0; i < 7; i++) {\n            shortPieces[i] = regexEscape(shortPieces[i]);\n            longPieces[i] = regexEscape(longPieces[i]);\n            mixedPieces[i] = regexEscape(mixedPieces[i]);\n        }\n\n        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._weekdaysShortRegex = this._weekdaysRegex;\n        this._weekdaysMinRegex = this._weekdaysRegex;\n\n        this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n        this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n        this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n    }\n\n    // FORMATTING\n\n    function hFormat() {\n        return this.hours() % 12 || 12;\n    }\n\n    function kFormat() {\n        return this.hours() || 24;\n    }\n\n    addFormatToken('H', ['HH', 2], 0, 'hour');\n    addFormatToken('h', ['hh', 2], 0, hFormat);\n    addFormatToken('k', ['kk', 2], 0, kFormat);\n\n    addFormatToken('hmm', 0, 0, function () {\n        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('hmmss', 0, 0, function () {\n        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2);\n    });\n\n    addFormatToken('Hmm', 0, 0, function () {\n        return '' + this.hours() + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('Hmmss', 0, 0, function () {\n        return '' + this.hours() + zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2);\n    });\n\n    function meridiem (token, lowercase) {\n        addFormatToken(token, 0, 0, function () {\n            return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n        });\n    }\n\n    meridiem('a', true);\n    meridiem('A', false);\n\n    // ALIASES\n\n    addUnitAlias('hour', 'h');\n\n    // PRIORITY\n    addUnitPriority('hour', 13);\n\n    // PARSING\n\n    function matchMeridiem (isStrict, locale) {\n        return locale._meridiemParse;\n    }\n\n    addRegexToken('a',  matchMeridiem);\n    addRegexToken('A',  matchMeridiem);\n    addRegexToken('H',  match1to2);\n    addRegexToken('h',  match1to2);\n    addRegexToken('k',  match1to2);\n    addRegexToken('HH', match1to2, match2);\n    addRegexToken('hh', match1to2, match2);\n    addRegexToken('kk', match1to2, match2);\n\n    addRegexToken('hmm', match3to4);\n    addRegexToken('hmmss', match5to6);\n    addRegexToken('Hmm', match3to4);\n    addRegexToken('Hmmss', match5to6);\n\n    addParseToken(['H', 'HH'], HOUR);\n    addParseToken(['k', 'kk'], function (input, array, config) {\n        var kInput = toInt(input);\n        array[HOUR] = kInput === 24 ? 0 : kInput;\n    });\n    addParseToken(['a', 'A'], function (input, array, config) {\n        config._isPm = config._locale.isPM(input);\n        config._meridiem = input;\n    });\n    addParseToken(['h', 'hh'], function (input, array, config) {\n        array[HOUR] = toInt(input);\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmmss', function (input, array, config) {\n        var pos1 = input.length - 4;\n        var pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('Hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n    });\n    addParseToken('Hmmss', function (input, array, config) {\n        var pos1 = input.length - 4;\n        var pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n    });\n\n    // LOCALES\n\n    function localeIsPM (input) {\n        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n        // Using charAt should be more compatible.\n        return ((input + '').toLowerCase().charAt(0) === 'p');\n    }\n\n    var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\n    function localeMeridiem (hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'pm' : 'PM';\n        } else {\n            return isLower ? 'am' : 'AM';\n        }\n    }\n\n\n    // MOMENTS\n\n    // Setting the hour should keep the time, because the user explicitly\n    // specified which hour they want. So trying to maintain the same hour (in\n    // a new timezone) makes sense. Adding/subtracting hours does not follow\n    // this rule.\n    var getSetHour = makeGetSet('Hours', true);\n\n    var baseConfig = {\n        calendar: defaultCalendar,\n        longDateFormat: defaultLongDateFormat,\n        invalidDate: defaultInvalidDate,\n        ordinal: defaultOrdinal,\n        dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n        relativeTime: defaultRelativeTime,\n\n        months: defaultLocaleMonths,\n        monthsShort: defaultLocaleMonthsShort,\n\n        week: defaultLocaleWeek,\n\n        weekdays: defaultLocaleWeekdays,\n        weekdaysMin: defaultLocaleWeekdaysMin,\n        weekdaysShort: defaultLocaleWeekdaysShort,\n\n        meridiemParse: defaultLocaleMeridiemParse\n    };\n\n    // internal storage for locale config files\n    var locales = {};\n    var localeFamilies = {};\n    var globalLocale;\n\n    function normalizeLocale(key) {\n        return key ? key.toLowerCase().replace('_', '-') : key;\n    }\n\n    // pick the locale from the array\n    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n    function chooseLocale(names) {\n        var i = 0, j, next, locale, split;\n\n        while (i < names.length) {\n            split = normalizeLocale(names[i]).split('-');\n            j = split.length;\n            next = normalizeLocale(names[i + 1]);\n            next = next ? next.split('-') : null;\n            while (j > 0) {\n                locale = loadLocale(split.slice(0, j).join('-'));\n                if (locale) {\n                    return locale;\n                }\n                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n                    //the next array item is better than a shallower substring of this one\n                    break;\n                }\n                j--;\n            }\n            i++;\n        }\n        return globalLocale;\n    }\n\n    function loadLocale(name) {\n        var oldLocale = null;\n        // TODO: Find a better way to register and load all the locales in Node\n        if (!locales[name] && (typeof module !== 'undefined') &&\n                module && module.exports) {\n            try {\n                oldLocale = globalLocale._abbr;\n                var aliasedRequire = require;\n                aliasedRequire('./locale/' + name);\n                getSetGlobalLocale(oldLocale);\n            } catch (e) {}\n        }\n        return locales[name];\n    }\n\n    // This function will load locale and then set the global locale.  If\n    // no arguments are passed in, it will simply return the current global\n    // locale key.\n    function getSetGlobalLocale (key, values) {\n        var data;\n        if (key) {\n            if (isUndefined(values)) {\n                data = getLocale(key);\n            }\n            else {\n                data = defineLocale(key, values);\n            }\n\n            if (data) {\n                // moment.duration._locale = moment._locale = data;\n                globalLocale = data;\n            }\n            else {\n                if ((typeof console !==  'undefined') && console.warn) {\n                    //warn user if arguments are passed but the locale could not be set\n                    console.warn('Locale ' + key +  ' not found. Did you forget to load it?');\n                }\n            }\n        }\n\n        return globalLocale._abbr;\n    }\n\n    function defineLocale (name, config) {\n        if (config !== null) {\n            var locale, parentConfig = baseConfig;\n            config.abbr = name;\n            if (locales[name] != null) {\n                deprecateSimple('defineLocaleOverride',\n                        'use moment.updateLocale(localeName, config) to change ' +\n                        'an existing locale. moment.defineLocale(localeName, ' +\n                        'config) should only be used for creating a new locale ' +\n                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n                parentConfig = locales[name]._config;\n            } else if (config.parentLocale != null) {\n                if (locales[config.parentLocale] != null) {\n                    parentConfig = locales[config.parentLocale]._config;\n                } else {\n                    locale = loadLocale(config.parentLocale);\n                    if (locale != null) {\n                        parentConfig = locale._config;\n                    } else {\n                        if (!localeFamilies[config.parentLocale]) {\n                            localeFamilies[config.parentLocale] = [];\n                        }\n                        localeFamilies[config.parentLocale].push({\n                            name: name,\n                            config: config\n                        });\n                        return null;\n                    }\n                }\n            }\n            locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n            if (localeFamilies[name]) {\n                localeFamilies[name].forEach(function (x) {\n                    defineLocale(x.name, x.config);\n                });\n            }\n\n            // backwards compat for now: also set the locale\n            // make sure we set the locale AFTER all child locales have been\n            // created, so we won't end up with the child locale set.\n            getSetGlobalLocale(name);\n\n\n            return locales[name];\n        } else {\n            // useful for testing\n            delete locales[name];\n            return null;\n        }\n    }\n\n    function updateLocale(name, config) {\n        if (config != null) {\n            var locale, tmpLocale, parentConfig = baseConfig;\n            // MERGE\n            tmpLocale = loadLocale(name);\n            if (tmpLocale != null) {\n                parentConfig = tmpLocale._config;\n            }\n            config = mergeConfigs(parentConfig, config);\n            locale = new Locale(config);\n            locale.parentLocale = locales[name];\n            locales[name] = locale;\n\n            // backwards compat for now: also set the locale\n            getSetGlobalLocale(name);\n        } else {\n            // pass null for config to unupdate, useful for tests\n            if (locales[name] != null) {\n                if (locales[name].parentLocale != null) {\n                    locales[name] = locales[name].parentLocale;\n                } else if (locales[name] != null) {\n                    delete locales[name];\n                }\n            }\n        }\n        return locales[name];\n    }\n\n    // returns locale data\n    function getLocale (key) {\n        var locale;\n\n        if (key && key._locale && key._locale._abbr) {\n            key = key._locale._abbr;\n        }\n\n        if (!key) {\n            return globalLocale;\n        }\n\n        if (!isArray(key)) {\n            //short-circuit everything else\n            locale = loadLocale(key);\n            if (locale) {\n                return locale;\n            }\n            key = [key];\n        }\n\n        return chooseLocale(key);\n    }\n\n    function listLocales() {\n        return keys(locales);\n    }\n\n    function checkOverflow (m) {\n        var overflow;\n        var a = m._a;\n\n        if (a && getParsingFlags(m).overflow === -2) {\n            overflow =\n                a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :\n                a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n                a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n                a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :\n                a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :\n                a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n                -1;\n\n            if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n                overflow = DATE;\n            }\n            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n                overflow = WEEK;\n            }\n            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n                overflow = WEEKDAY;\n            }\n\n            getParsingFlags(m).overflow = overflow;\n        }\n\n        return m;\n    }\n\n    // Pick the first defined of two or three arguments.\n    function defaults(a, b, c) {\n        if (a != null) {\n            return a;\n        }\n        if (b != null) {\n            return b;\n        }\n        return c;\n    }\n\n    function currentDateArray(config) {\n        // hooks is actually the exported moment object\n        var nowValue = new Date(hooks.now());\n        if (config._useUTC) {\n            return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n        }\n        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n    }\n\n    // convert an array to a date.\n    // the array should mirror the parameters below\n    // note: all values past the year are optional and will default to the lowest possible value.\n    // [year, month, day , hour, minute, second, millisecond]\n    function configFromArray (config) {\n        var i, date, input = [], currentDate, expectedWeekday, yearToUse;\n\n        if (config._d) {\n            return;\n        }\n\n        currentDate = currentDateArray(config);\n\n        //compute day of the year from weeks and weekdays\n        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n            dayOfYearFromWeekInfo(config);\n        }\n\n        //if the day of the year is set, figure out what it is\n        if (config._dayOfYear != null) {\n            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n            if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n                getParsingFlags(config)._overflowDayOfYear = true;\n            }\n\n            date = createUTCDate(yearToUse, 0, config._dayOfYear);\n            config._a[MONTH] = date.getUTCMonth();\n            config._a[DATE] = date.getUTCDate();\n        }\n\n        // Default to current date.\n        // * if no year, month, day of month are given, default to today\n        // * if day of month is given, default month and year\n        // * if month is given, default only year\n        // * if year is given, don't default anything\n        for (i = 0; i < 3 && config._a[i] == null; ++i) {\n            config._a[i] = input[i] = currentDate[i];\n        }\n\n        // Zero out whatever was not defaulted, including time\n        for (; i < 7; i++) {\n            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n        }\n\n        // Check for 24:00:00.000\n        if (config._a[HOUR] === 24 &&\n                config._a[MINUTE] === 0 &&\n                config._a[SECOND] === 0 &&\n                config._a[MILLISECOND] === 0) {\n            config._nextDay = true;\n            config._a[HOUR] = 0;\n        }\n\n        config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n        expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();\n\n        // Apply timezone offset from input. The actual utcOffset can be changed\n        // with parseZone.\n        if (config._tzm != null) {\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n        }\n\n        if (config._nextDay) {\n            config._a[HOUR] = 24;\n        }\n\n        // check for mismatching day of week\n        if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n            getParsingFlags(config).weekdayMismatch = true;\n        }\n    }\n\n    function dayOfYearFromWeekInfo(config) {\n        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n        w = config._w;\n        if (w.GG != null || w.W != null || w.E != null) {\n            dow = 1;\n            doy = 4;\n\n            // TODO: We need to take the current isoWeekYear, but that depends on\n            // how we interpret now (local, utc, fixed offset). So create\n            // a now version of current config (take local/utc/offset flags, and\n            // create now).\n            weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n            week = defaults(w.W, 1);\n            weekday = defaults(w.E, 1);\n            if (weekday < 1 || weekday > 7) {\n                weekdayOverflow = true;\n            }\n        } else {\n            dow = config._locale._week.dow;\n            doy = config._locale._week.doy;\n\n            var curWeek = weekOfYear(createLocal(), dow, doy);\n\n            weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n            // Default to current week.\n            week = defaults(w.w, curWeek.week);\n\n            if (w.d != null) {\n                // weekday -- low day numbers are considered next week\n                weekday = w.d;\n                if (weekday < 0 || weekday > 6) {\n                    weekdayOverflow = true;\n                }\n            } else if (w.e != null) {\n                // local weekday -- counting starts from begining of week\n                weekday = w.e + dow;\n                if (w.e < 0 || w.e > 6) {\n                    weekdayOverflow = true;\n                }\n            } else {\n                // default to begining of week\n                weekday = dow;\n            }\n        }\n        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n            getParsingFlags(config)._overflowWeeks = true;\n        } else if (weekdayOverflow != null) {\n            getParsingFlags(config)._overflowWeekday = true;\n        } else {\n            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n            config._a[YEAR] = temp.year;\n            config._dayOfYear = temp.dayOfYear;\n        }\n    }\n\n    // iso 8601 regex\n    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n    var extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n    var basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\n    var tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\n    var isoDates = [\n        ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n        ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n        ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n        ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n        ['YYYY-DDD', /\\d{4}-\\d{3}/],\n        ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n        ['YYYYYYMMDD', /[+-]\\d{10}/],\n        ['YYYYMMDD', /\\d{8}/],\n        // YYYYMM is NOT allowed by the standard\n        ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n        ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n        ['YYYYDDD', /\\d{7}/]\n    ];\n\n    // iso time formats and regexes\n    var isoTimes = [\n        ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n        ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n        ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n        ['HH:mm', /\\d\\d:\\d\\d/],\n        ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n        ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n        ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n        ['HHmm', /\\d\\d\\d\\d/],\n        ['HH', /\\d\\d/]\n    ];\n\n    var aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n    // date from iso format\n    function configFromISO(config) {\n        var i, l,\n            string = config._i,\n            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n            allowTime, dateFormat, timeFormat, tzFormat;\n\n        if (match) {\n            getParsingFlags(config).iso = true;\n\n            for (i = 0, l = isoDates.length; i < l; i++) {\n                if (isoDates[i][1].exec(match[1])) {\n                    dateFormat = isoDates[i][0];\n                    allowTime = isoDates[i][2] !== false;\n                    break;\n                }\n            }\n            if (dateFormat == null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[3]) {\n                for (i = 0, l = isoTimes.length; i < l; i++) {\n                    if (isoTimes[i][1].exec(match[3])) {\n                        // match[2] should be 'T' or space\n                        timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                        break;\n                    }\n                }\n                if (timeFormat == null) {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            if (!allowTime && timeFormat != null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[4]) {\n                if (tzRegex.exec(match[4])) {\n                    tzFormat = 'Z';\n                } else {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n            configFromStringAndFormat(config);\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n    var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/;\n\n    function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n        var result = [\n            untruncateYear(yearStr),\n            defaultLocaleMonthsShort.indexOf(monthStr),\n            parseInt(dayStr, 10),\n            parseInt(hourStr, 10),\n            parseInt(minuteStr, 10)\n        ];\n\n        if (secondStr) {\n            result.push(parseInt(secondStr, 10));\n        }\n\n        return result;\n    }\n\n    function untruncateYear(yearStr) {\n        var year = parseInt(yearStr, 10);\n        if (year <= 49) {\n            return 2000 + year;\n        } else if (year <= 999) {\n            return 1900 + year;\n        }\n        return year;\n    }\n\n    function preprocessRFC2822(s) {\n        // Remove comments and folding whitespace and replace multiple-spaces with a single space\n        return s.replace(/\\([^)]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n    }\n\n    function checkWeekday(weekdayStr, parsedInput, config) {\n        if (weekdayStr) {\n            // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n            var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n                weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n            if (weekdayProvided !== weekdayActual) {\n                getParsingFlags(config).weekdayMismatch = true;\n                config._isValid = false;\n                return false;\n            }\n        }\n        return true;\n    }\n\n    var obsOffsets = {\n        UT: 0,\n        GMT: 0,\n        EDT: -4 * 60,\n        EST: -5 * 60,\n        CDT: -5 * 60,\n        CST: -6 * 60,\n        MDT: -6 * 60,\n        MST: -7 * 60,\n        PDT: -7 * 60,\n        PST: -8 * 60\n    };\n\n    function calculateOffset(obsOffset, militaryOffset, numOffset) {\n        if (obsOffset) {\n            return obsOffsets[obsOffset];\n        } else if (militaryOffset) {\n            // the only allowed military tz is Z\n            return 0;\n        } else {\n            var hm = parseInt(numOffset, 10);\n            var m = hm % 100, h = (hm - m) / 100;\n            return h * 60 + m;\n        }\n    }\n\n    // date and time from ref 2822 format\n    function configFromRFC2822(config) {\n        var match = rfc2822.exec(preprocessRFC2822(config._i));\n        if (match) {\n            var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\n            if (!checkWeekday(match[1], parsedArray, config)) {\n                return;\n            }\n\n            config._a = parsedArray;\n            config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n            config._d = createUTCDate.apply(null, config._a);\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n            getParsingFlags(config).rfc2822 = true;\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    // date from iso format or fallback\n    function configFromString(config) {\n        var matched = aspNetJsonRegex.exec(config._i);\n\n        if (matched !== null) {\n            config._d = new Date(+matched[1]);\n            return;\n        }\n\n        configFromISO(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n        } else {\n            return;\n        }\n\n        configFromRFC2822(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n        } else {\n            return;\n        }\n\n        // Final attempt, use Input Fallback\n        hooks.createFromInputFallback(config);\n    }\n\n    hooks.createFromInputFallback = deprecate(\n        'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n        'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n        'discouraged and will be removed in an upcoming major release. Please refer to ' +\n        'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n        function (config) {\n            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n        }\n    );\n\n    // constant that refers to the ISO standard\n    hooks.ISO_8601 = function () {};\n\n    // constant that refers to the RFC 2822 form\n    hooks.RFC_2822 = function () {};\n\n    // date from string and format string\n    function configFromStringAndFormat(config) {\n        // TODO: Move this to another part of the creation flow to prevent circular deps\n        if (config._f === hooks.ISO_8601) {\n            configFromISO(config);\n            return;\n        }\n        if (config._f === hooks.RFC_2822) {\n            configFromRFC2822(config);\n            return;\n        }\n        config._a = [];\n        getParsingFlags(config).empty = true;\n\n        // This array is used to make a Date, either with `new Date` or `Date.UTC`\n        var string = '' + config._i,\n            i, parsedInput, tokens, token, skipped,\n            stringLength = string.length,\n            totalParsedInputLength = 0;\n\n        tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n        for (i = 0; i < tokens.length; i++) {\n            token = tokens[i];\n            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n            // console.log('token', token, 'parsedInput', parsedInput,\n            //         'regex', getParseRegexForToken(token, config));\n            if (parsedInput) {\n                skipped = string.substr(0, string.indexOf(parsedInput));\n                if (skipped.length > 0) {\n                    getParsingFlags(config).unusedInput.push(skipped);\n                }\n                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n                totalParsedInputLength += parsedInput.length;\n            }\n            // don't parse if it's not a known token\n            if (formatTokenFunctions[token]) {\n                if (parsedInput) {\n                    getParsingFlags(config).empty = false;\n                }\n                else {\n                    getParsingFlags(config).unusedTokens.push(token);\n                }\n                addTimeToArrayFromToken(token, parsedInput, config);\n            }\n            else if (config._strict && !parsedInput) {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n        }\n\n        // add remaining unparsed input length to the string\n        getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n        if (string.length > 0) {\n            getParsingFlags(config).unusedInput.push(string);\n        }\n\n        // clear _12h flag if hour is <= 12\n        if (config._a[HOUR] <= 12 &&\n            getParsingFlags(config).bigHour === true &&\n            config._a[HOUR] > 0) {\n            getParsingFlags(config).bigHour = undefined;\n        }\n\n        getParsingFlags(config).parsedDateParts = config._a.slice(0);\n        getParsingFlags(config).meridiem = config._meridiem;\n        // handle meridiem\n        config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n        configFromArray(config);\n        checkOverflow(config);\n    }\n\n\n    function meridiemFixWrap (locale, hour, meridiem) {\n        var isPm;\n\n        if (meridiem == null) {\n            // nothing to do\n            return hour;\n        }\n        if (locale.meridiemHour != null) {\n            return locale.meridiemHour(hour, meridiem);\n        } else if (locale.isPM != null) {\n            // Fallback\n            isPm = locale.isPM(meridiem);\n            if (isPm && hour < 12) {\n                hour += 12;\n            }\n            if (!isPm && hour === 12) {\n                hour = 0;\n            }\n            return hour;\n        } else {\n            // this is not supposed to happen\n            return hour;\n        }\n    }\n\n    // date from string and array of format strings\n    function configFromStringAndArray(config) {\n        var tempConfig,\n            bestMoment,\n\n            scoreToBeat,\n            i,\n            currentScore;\n\n        if (config._f.length === 0) {\n            getParsingFlags(config).invalidFormat = true;\n            config._d = new Date(NaN);\n            return;\n        }\n\n        for (i = 0; i < config._f.length; i++) {\n            currentScore = 0;\n            tempConfig = copyConfig({}, config);\n            if (config._useUTC != null) {\n                tempConfig._useUTC = config._useUTC;\n            }\n            tempConfig._f = config._f[i];\n            configFromStringAndFormat(tempConfig);\n\n            if (!isValid(tempConfig)) {\n                continue;\n            }\n\n            // if there is any input that was not parsed add a penalty for that format\n            currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n            //or tokens\n            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n            getParsingFlags(tempConfig).score = currentScore;\n\n            if (scoreToBeat == null || currentScore < scoreToBeat) {\n                scoreToBeat = currentScore;\n                bestMoment = tempConfig;\n            }\n        }\n\n        extend(config, bestMoment || tempConfig);\n    }\n\n    function configFromObject(config) {\n        if (config._d) {\n            return;\n        }\n\n        var i = normalizeObjectUnits(config._i);\n        config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n            return obj && parseInt(obj, 10);\n        });\n\n        configFromArray(config);\n    }\n\n    function createFromConfig (config) {\n        var res = new Moment(checkOverflow(prepareConfig(config)));\n        if (res._nextDay) {\n            // Adding is smart enough around DST\n            res.add(1, 'd');\n            res._nextDay = undefined;\n        }\n\n        return res;\n    }\n\n    function prepareConfig (config) {\n        var input = config._i,\n            format = config._f;\n\n        config._locale = config._locale || getLocale(config._l);\n\n        if (input === null || (format === undefined && input === '')) {\n            return createInvalid({nullInput: true});\n        }\n\n        if (typeof input === 'string') {\n            config._i = input = config._locale.preparse(input);\n        }\n\n        if (isMoment(input)) {\n            return new Moment(checkOverflow(input));\n        } else if (isDate(input)) {\n            config._d = input;\n        } else if (isArray(format)) {\n            configFromStringAndArray(config);\n        } else if (format) {\n            configFromStringAndFormat(config);\n        }  else {\n            configFromInput(config);\n        }\n\n        if (!isValid(config)) {\n            config._d = null;\n        }\n\n        return config;\n    }\n\n    function configFromInput(config) {\n        var input = config._i;\n        if (isUndefined(input)) {\n            config._d = new Date(hooks.now());\n        } else if (isDate(input)) {\n            config._d = new Date(input.valueOf());\n        } else if (typeof input === 'string') {\n            configFromString(config);\n        } else if (isArray(input)) {\n            config._a = map(input.slice(0), function (obj) {\n                return parseInt(obj, 10);\n            });\n            configFromArray(config);\n        } else if (isObject(input)) {\n            configFromObject(config);\n        } else if (isNumber(input)) {\n            // from milliseconds\n            config._d = new Date(input);\n        } else {\n            hooks.createFromInputFallback(config);\n        }\n    }\n\n    function createLocalOrUTC (input, format, locale, strict, isUTC) {\n        var c = {};\n\n        if (locale === true || locale === false) {\n            strict = locale;\n            locale = undefined;\n        }\n\n        if ((isObject(input) && isObjectEmpty(input)) ||\n                (isArray(input) && input.length === 0)) {\n            input = undefined;\n        }\n        // object construction must be done this way.\n        // https://github.com/moment/moment/issues/1423\n        c._isAMomentObject = true;\n        c._useUTC = c._isUTC = isUTC;\n        c._l = locale;\n        c._i = input;\n        c._f = format;\n        c._strict = strict;\n\n        return createFromConfig(c);\n    }\n\n    function createLocal (input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, false);\n    }\n\n    var prototypeMin = deprecate(\n        'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n        function () {\n            var other = createLocal.apply(null, arguments);\n            if (this.isValid() && other.isValid()) {\n                return other < this ? this : other;\n            } else {\n                return createInvalid();\n            }\n        }\n    );\n\n    var prototypeMax = deprecate(\n        'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n        function () {\n            var other = createLocal.apply(null, arguments);\n            if (this.isValid() && other.isValid()) {\n                return other > this ? this : other;\n            } else {\n                return createInvalid();\n            }\n        }\n    );\n\n    // Pick a moment m from moments so that m[fn](other) is true for all\n    // other. This relies on the function fn to be transitive.\n    //\n    // moments should either be an array of moment objects or an array, whose\n    // first element is an array of moment objects.\n    function pickBy(fn, moments) {\n        var res, i;\n        if (moments.length === 1 && isArray(moments[0])) {\n            moments = moments[0];\n        }\n        if (!moments.length) {\n            return createLocal();\n        }\n        res = moments[0];\n        for (i = 1; i < moments.length; ++i) {\n            if (!moments[i].isValid() || moments[i][fn](res)) {\n                res = moments[i];\n            }\n        }\n        return res;\n    }\n\n    // TODO: Use [].sort instead?\n    function min () {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isBefore', args);\n    }\n\n    function max () {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isAfter', args);\n    }\n\n    var now = function () {\n        return Date.now ? Date.now() : +(new Date());\n    };\n\n    var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\n    function isDurationValid(m) {\n        for (var key in m) {\n            if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n                return false;\n            }\n        }\n\n        var unitHasDecimal = false;\n        for (var i = 0; i < ordering.length; ++i) {\n            if (m[ordering[i]]) {\n                if (unitHasDecimal) {\n                    return false; // only allow non-integers for smallest unit\n                }\n                if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n                    unitHasDecimal = true;\n                }\n            }\n        }\n\n        return true;\n    }\n\n    function isValid$1() {\n        return this._isValid;\n    }\n\n    function createInvalid$1() {\n        return createDuration(NaN);\n    }\n\n    function Duration (duration) {\n        var normalizedInput = normalizeObjectUnits(duration),\n            years = normalizedInput.year || 0,\n            quarters = normalizedInput.quarter || 0,\n            months = normalizedInput.month || 0,\n            weeks = normalizedInput.week || 0,\n            days = normalizedInput.day || 0,\n            hours = normalizedInput.hour || 0,\n            minutes = normalizedInput.minute || 0,\n            seconds = normalizedInput.second || 0,\n            milliseconds = normalizedInput.millisecond || 0;\n\n        this._isValid = isDurationValid(normalizedInput);\n\n        // representation for dateAddRemove\n        this._milliseconds = +milliseconds +\n            seconds * 1e3 + // 1000\n            minutes * 6e4 + // 1000 * 60\n            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n        // Because of dateAddRemove treats 24 hours as different from a\n        // day when working around DST, we need to store them separately\n        this._days = +days +\n            weeks * 7;\n        // It is impossible to translate months into days without knowing\n        // which months you are are talking about, so we have to store\n        // it separately.\n        this._months = +months +\n            quarters * 3 +\n            years * 12;\n\n        this._data = {};\n\n        this._locale = getLocale();\n\n        this._bubble();\n    }\n\n    function isDuration (obj) {\n        return obj instanceof Duration;\n    }\n\n    function absRound (number) {\n        if (number < 0) {\n            return Math.round(-1 * number) * -1;\n        } else {\n            return Math.round(number);\n        }\n    }\n\n    // FORMATTING\n\n    function offset (token, separator) {\n        addFormatToken(token, 0, 0, function () {\n            var offset = this.utcOffset();\n            var sign = '+';\n            if (offset < 0) {\n                offset = -offset;\n                sign = '-';\n            }\n            return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n        });\n    }\n\n    offset('Z', ':');\n    offset('ZZ', '');\n\n    // PARSING\n\n    addRegexToken('Z',  matchShortOffset);\n    addRegexToken('ZZ', matchShortOffset);\n    addParseToken(['Z', 'ZZ'], function (input, array, config) {\n        config._useUTC = true;\n        config._tzm = offsetFromString(matchShortOffset, input);\n    });\n\n    // HELPERS\n\n    // timezone chunker\n    // '+10:00' > ['10',  '00']\n    // '-1530'  > ['-15', '30']\n    var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n    function offsetFromString(matcher, string) {\n        var matches = (string || '').match(matcher);\n\n        if (matches === null) {\n            return null;\n        }\n\n        var chunk   = matches[matches.length - 1] || [];\n        var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n        var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n        return minutes === 0 ?\n          0 :\n          parts[0] === '+' ? minutes : -minutes;\n    }\n\n    // Return a moment from input, that is local/utc/zone equivalent to model.\n    function cloneWithOffset(input, model) {\n        var res, diff;\n        if (model._isUTC) {\n            res = model.clone();\n            diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n            // Use low-level api, because this fn is low-level api.\n            res._d.setTime(res._d.valueOf() + diff);\n            hooks.updateOffset(res, false);\n            return res;\n        } else {\n            return createLocal(input).local();\n        }\n    }\n\n    function getDateOffset (m) {\n        // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n        // https://github.com/moment/moment/pull/1871\n        return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n    }\n\n    // HOOKS\n\n    // This function will be called whenever a moment is mutated.\n    // It is intended to keep the offset in sync with the timezone.\n    hooks.updateOffset = function () {};\n\n    // MOMENTS\n\n    // keepLocalTime = true means only change the timezone, without\n    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n    // +0200, so we adjust the time as needed, to be valid.\n    //\n    // Keeping the time actually adds/subtracts (one hour)\n    // from the actual represented time. That is why we call updateOffset\n    // a second time. In case it wants us to change the offset again\n    // _changeInProgress == true case, then we have to adjust, because\n    // there is no such time in the given timezone.\n    function getSetOffset (input, keepLocalTime, keepMinutes) {\n        var offset = this._offset || 0,\n            localAdjust;\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        if (input != null) {\n            if (typeof input === 'string') {\n                input = offsetFromString(matchShortOffset, input);\n                if (input === null) {\n                    return this;\n                }\n            } else if (Math.abs(input) < 16 && !keepMinutes) {\n                input = input * 60;\n            }\n            if (!this._isUTC && keepLocalTime) {\n                localAdjust = getDateOffset(this);\n            }\n            this._offset = input;\n            this._isUTC = true;\n            if (localAdjust != null) {\n                this.add(localAdjust, 'm');\n            }\n            if (offset !== input) {\n                if (!keepLocalTime || this._changeInProgress) {\n                    addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n                } else if (!this._changeInProgress) {\n                    this._changeInProgress = true;\n                    hooks.updateOffset(this, true);\n                    this._changeInProgress = null;\n                }\n            }\n            return this;\n        } else {\n            return this._isUTC ? offset : getDateOffset(this);\n        }\n    }\n\n    function getSetZone (input, keepLocalTime) {\n        if (input != null) {\n            if (typeof input !== 'string') {\n                input = -input;\n            }\n\n            this.utcOffset(input, keepLocalTime);\n\n            return this;\n        } else {\n            return -this.utcOffset();\n        }\n    }\n\n    function setOffsetToUTC (keepLocalTime) {\n        return this.utcOffset(0, keepLocalTime);\n    }\n\n    function setOffsetToLocal (keepLocalTime) {\n        if (this._isUTC) {\n            this.utcOffset(0, keepLocalTime);\n            this._isUTC = false;\n\n            if (keepLocalTime) {\n                this.subtract(getDateOffset(this), 'm');\n            }\n        }\n        return this;\n    }\n\n    function setOffsetToParsedOffset () {\n        if (this._tzm != null) {\n            this.utcOffset(this._tzm, false, true);\n        } else if (typeof this._i === 'string') {\n            var tZone = offsetFromString(matchOffset, this._i);\n            if (tZone != null) {\n                this.utcOffset(tZone);\n            }\n            else {\n                this.utcOffset(0, true);\n            }\n        }\n        return this;\n    }\n\n    function hasAlignedHourOffset (input) {\n        if (!this.isValid()) {\n            return false;\n        }\n        input = input ? createLocal(input).utcOffset() : 0;\n\n        return (this.utcOffset() - input) % 60 === 0;\n    }\n\n    function isDaylightSavingTime () {\n        return (\n            this.utcOffset() > this.clone().month(0).utcOffset() ||\n            this.utcOffset() > this.clone().month(5).utcOffset()\n        );\n    }\n\n    function isDaylightSavingTimeShifted () {\n        if (!isUndefined(this._isDSTShifted)) {\n            return this._isDSTShifted;\n        }\n\n        var c = {};\n\n        copyConfig(c, this);\n        c = prepareConfig(c);\n\n        if (c._a) {\n            var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n            this._isDSTShifted = this.isValid() &&\n                compareArrays(c._a, other.toArray()) > 0;\n        } else {\n            this._isDSTShifted = false;\n        }\n\n        return this._isDSTShifted;\n    }\n\n    function isLocal () {\n        return this.isValid() ? !this._isUTC : false;\n    }\n\n    function isUtcOffset () {\n        return this.isValid() ? this._isUTC : false;\n    }\n\n    function isUtc () {\n        return this.isValid() ? this._isUTC && this._offset === 0 : false;\n    }\n\n    // ASP.NET json date format regex\n    var aspNetRegex = /^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n    // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n    // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n    // and further modified to allow for strings containing both week and day\n    var isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\n    function createDuration (input, key) {\n        var duration = input,\n            // matching against regexp is expensive, do it on demand\n            match = null,\n            sign,\n            ret,\n            diffRes;\n\n        if (isDuration(input)) {\n            duration = {\n                ms : input._milliseconds,\n                d  : input._days,\n                M  : input._months\n            };\n        } else if (isNumber(input)) {\n            duration = {};\n            if (key) {\n                duration[key] = input;\n            } else {\n                duration.milliseconds = input;\n            }\n        } else if (!!(match = aspNetRegex.exec(input))) {\n            sign = (match[1] === '-') ? -1 : 1;\n            duration = {\n                y  : 0,\n                d  : toInt(match[DATE])                         * sign,\n                h  : toInt(match[HOUR])                         * sign,\n                m  : toInt(match[MINUTE])                       * sign,\n                s  : toInt(match[SECOND])                       * sign,\n                ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n            };\n        } else if (!!(match = isoRegex.exec(input))) {\n            sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1;\n            duration = {\n                y : parseIso(match[2], sign),\n                M : parseIso(match[3], sign),\n                w : parseIso(match[4], sign),\n                d : parseIso(match[5], sign),\n                h : parseIso(match[6], sign),\n                m : parseIso(match[7], sign),\n                s : parseIso(match[8], sign)\n            };\n        } else if (duration == null) {// checks for null or undefined\n            duration = {};\n        } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n            diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n            duration = {};\n            duration.ms = diffRes.milliseconds;\n            duration.M = diffRes.months;\n        }\n\n        ret = new Duration(duration);\n\n        if (isDuration(input) && hasOwnProp(input, '_locale')) {\n            ret._locale = input._locale;\n        }\n\n        return ret;\n    }\n\n    createDuration.fn = Duration.prototype;\n    createDuration.invalid = createInvalid$1;\n\n    function parseIso (inp, sign) {\n        // We'd normally use ~~inp for this, but unfortunately it also\n        // converts floats to ints.\n        // inp may be undefined, so careful calling replace on it.\n        var res = inp && parseFloat(inp.replace(',', '.'));\n        // apply sign while we're at it\n        return (isNaN(res) ? 0 : res) * sign;\n    }\n\n    function positiveMomentsDifference(base, other) {\n        var res = {milliseconds: 0, months: 0};\n\n        res.months = other.month() - base.month() +\n            (other.year() - base.year()) * 12;\n        if (base.clone().add(res.months, 'M').isAfter(other)) {\n            --res.months;\n        }\n\n        res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n        return res;\n    }\n\n    function momentsDifference(base, other) {\n        var res;\n        if (!(base.isValid() && other.isValid())) {\n            return {milliseconds: 0, months: 0};\n        }\n\n        other = cloneWithOffset(other, base);\n        if (base.isBefore(other)) {\n            res = positiveMomentsDifference(base, other);\n        } else {\n            res = positiveMomentsDifference(other, base);\n            res.milliseconds = -res.milliseconds;\n            res.months = -res.months;\n        }\n\n        return res;\n    }\n\n    // TODO: remove 'name' arg after deprecation is removed\n    function createAdder(direction, name) {\n        return function (val, period) {\n            var dur, tmp;\n            //invert the arguments, but complain about it\n            if (period !== null && !isNaN(+period)) {\n                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n                'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n                tmp = val; val = period; period = tmp;\n            }\n\n            val = typeof val === 'string' ? +val : val;\n            dur = createDuration(val, period);\n            addSubtract(this, dur, direction);\n            return this;\n        };\n    }\n\n    function addSubtract (mom, duration, isAdding, updateOffset) {\n        var milliseconds = duration._milliseconds,\n            days = absRound(duration._days),\n            months = absRound(duration._months);\n\n        if (!mom.isValid()) {\n            // No op\n            return;\n        }\n\n        updateOffset = updateOffset == null ? true : updateOffset;\n\n        if (months) {\n            setMonth(mom, get(mom, 'Month') + months * isAdding);\n        }\n        if (days) {\n            set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n        }\n        if (milliseconds) {\n            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n        }\n        if (updateOffset) {\n            hooks.updateOffset(mom, days || months);\n        }\n    }\n\n    var add      = createAdder(1, 'add');\n    var subtract = createAdder(-1, 'subtract');\n\n    function getCalendarFormat(myMoment, now) {\n        var diff = myMoment.diff(now, 'days', true);\n        return diff < -6 ? 'sameElse' :\n                diff < -1 ? 'lastWeek' :\n                diff < 0 ? 'lastDay' :\n                diff < 1 ? 'sameDay' :\n                diff < 2 ? 'nextDay' :\n                diff < 7 ? 'nextWeek' : 'sameElse';\n    }\n\n    function calendar$1 (time, formats) {\n        // We want to compare the start of today, vs this.\n        // Getting start-of-today depends on whether we're local/utc/offset or not.\n        var now = time || createLocal(),\n            sod = cloneWithOffset(now, this).startOf('day'),\n            format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n        var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n        return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n    }\n\n    function clone () {\n        return new Moment(this);\n    }\n\n    function isAfter (input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n        if (units === 'millisecond') {\n            return this.valueOf() > localInput.valueOf();\n        } else {\n            return localInput.valueOf() < this.clone().startOf(units).valueOf();\n        }\n    }\n\n    function isBefore (input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n        if (units === 'millisecond') {\n            return this.valueOf() < localInput.valueOf();\n        } else {\n            return this.clone().endOf(units).valueOf() < localInput.valueOf();\n        }\n    }\n\n    function isBetween (from, to, units, inclusivity) {\n        inclusivity = inclusivity || '()';\n        return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n            (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n    }\n\n    function isSame (input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input),\n            inputMs;\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units || 'millisecond');\n        if (units === 'millisecond') {\n            return this.valueOf() === localInput.valueOf();\n        } else {\n            inputMs = localInput.valueOf();\n            return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n        }\n    }\n\n    function isSameOrAfter (input, units) {\n        return this.isSame(input, units) || this.isAfter(input,units);\n    }\n\n    function isSameOrBefore (input, units) {\n        return this.isSame(input, units) || this.isBefore(input,units);\n    }\n\n    function diff (input, units, asFloat) {\n        var that,\n            zoneDelta,\n            output;\n\n        if (!this.isValid()) {\n            return NaN;\n        }\n\n        that = cloneWithOffset(input, this);\n\n        if (!that.isValid()) {\n            return NaN;\n        }\n\n        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n        units = normalizeUnits(units);\n\n        switch (units) {\n            case 'year': output = monthDiff(this, that) / 12; break;\n            case 'month': output = monthDiff(this, that); break;\n            case 'quarter': output = monthDiff(this, that) / 3; break;\n            case 'second': output = (this - that) / 1e3; break; // 1000\n            case 'minute': output = (this - that) / 6e4; break; // 1000 * 60\n            case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60\n            case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst\n            case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst\n            default: output = this - that;\n        }\n\n        return asFloat ? output : absFloor(output);\n    }\n\n    function monthDiff (a, b) {\n        // difference in months\n        var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n            // b is in (anchor - 1 month, anchor + 1 month)\n            anchor = a.clone().add(wholeMonthDiff, 'months'),\n            anchor2, adjust;\n\n        if (b - anchor < 0) {\n            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor - anchor2);\n        } else {\n            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor2 - anchor);\n        }\n\n        //check for negative zero, return zero if negative zero\n        return -(wholeMonthDiff + adjust) || 0;\n    }\n\n    hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n    hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n    function toString () {\n        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n    }\n\n    function toISOString(keepOffset) {\n        if (!this.isValid()) {\n            return null;\n        }\n        var utc = keepOffset !== true;\n        var m = utc ? this.clone().utc() : this;\n        if (m.year() < 0 || m.year() > 9999) {\n            return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\n        }\n        if (isFunction(Date.prototype.toISOString)) {\n            // native implementation is ~50x faster, use it when we can\n            if (utc) {\n                return this.toDate().toISOString();\n            } else {\n                return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));\n            }\n        }\n        return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\n    }\n\n    /**\n     * Return a human readable representation of a moment that can\n     * also be evaluated to get a new moment which is the same\n     *\n     * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n     */\n    function inspect () {\n        if (!this.isValid()) {\n            return 'moment.invalid(/* ' + this._i + ' */)';\n        }\n        var func = 'moment';\n        var zone = '';\n        if (!this.isLocal()) {\n            func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n            zone = 'Z';\n        }\n        var prefix = '[' + func + '(\"]';\n        var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n        var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n        var suffix = zone + '[\")]';\n\n        return this.format(prefix + year + datetime + suffix);\n    }\n\n    function format (inputString) {\n        if (!inputString) {\n            inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n        }\n        var output = formatMoment(this, inputString);\n        return this.localeData().postformat(output);\n    }\n\n    function from (time, withoutSuffix) {\n        if (this.isValid() &&\n                ((isMoment(time) && time.isValid()) ||\n                 createLocal(time).isValid())) {\n            return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function fromNow (withoutSuffix) {\n        return this.from(createLocal(), withoutSuffix);\n    }\n\n    function to (time, withoutSuffix) {\n        if (this.isValid() &&\n                ((isMoment(time) && time.isValid()) ||\n                 createLocal(time).isValid())) {\n            return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function toNow (withoutSuffix) {\n        return this.to(createLocal(), withoutSuffix);\n    }\n\n    // If passed a locale key, it will set the locale for this\n    // instance.  Otherwise, it will return the locale configuration\n    // variables for this instance.\n    function locale (key) {\n        var newLocaleData;\n\n        if (key === undefined) {\n            return this._locale._abbr;\n        } else {\n            newLocaleData = getLocale(key);\n            if (newLocaleData != null) {\n                this._locale = newLocaleData;\n            }\n            return this;\n        }\n    }\n\n    var lang = deprecate(\n        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n        function (key) {\n            if (key === undefined) {\n                return this.localeData();\n            } else {\n                return this.locale(key);\n            }\n        }\n    );\n\n    function localeData () {\n        return this._locale;\n    }\n\n    function startOf (units) {\n        units = normalizeUnits(units);\n        // the following switch intentionally omits break keywords\n        // to utilize falling through the cases.\n        switch (units) {\n            case 'year':\n                this.month(0);\n                /* falls through */\n            case 'quarter':\n            case 'month':\n                this.date(1);\n                /* falls through */\n            case 'week':\n            case 'isoWeek':\n            case 'day':\n            case 'date':\n                this.hours(0);\n                /* falls through */\n            case 'hour':\n                this.minutes(0);\n                /* falls through */\n            case 'minute':\n                this.seconds(0);\n                /* falls through */\n            case 'second':\n                this.milliseconds(0);\n        }\n\n        // weeks are a special case\n        if (units === 'week') {\n            this.weekday(0);\n        }\n        if (units === 'isoWeek') {\n            this.isoWeekday(1);\n        }\n\n        // quarters are also special\n        if (units === 'quarter') {\n            this.month(Math.floor(this.month() / 3) * 3);\n        }\n\n        return this;\n    }\n\n    function endOf (units) {\n        units = normalizeUnits(units);\n        if (units === undefined || units === 'millisecond') {\n            return this;\n        }\n\n        // 'date' is an alias for 'day', so it should be considered as such.\n        if (units === 'date') {\n            units = 'day';\n        }\n\n        return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n    }\n\n    function valueOf () {\n        return this._d.valueOf() - ((this._offset || 0) * 60000);\n    }\n\n    function unix () {\n        return Math.floor(this.valueOf() / 1000);\n    }\n\n    function toDate () {\n        return new Date(this.valueOf());\n    }\n\n    function toArray () {\n        var m = this;\n        return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n    }\n\n    function toObject () {\n        var m = this;\n        return {\n            years: m.year(),\n            months: m.month(),\n            date: m.date(),\n            hours: m.hours(),\n            minutes: m.minutes(),\n            seconds: m.seconds(),\n            milliseconds: m.milliseconds()\n        };\n    }\n\n    function toJSON () {\n        // new Date(NaN).toJSON() === null\n        return this.isValid() ? this.toISOString() : null;\n    }\n\n    function isValid$2 () {\n        return isValid(this);\n    }\n\n    function parsingFlags () {\n        return extend({}, getParsingFlags(this));\n    }\n\n    function invalidAt () {\n        return getParsingFlags(this).overflow;\n    }\n\n    function creationData() {\n        return {\n            input: this._i,\n            format: this._f,\n            locale: this._locale,\n            isUTC: this._isUTC,\n            strict: this._strict\n        };\n    }\n\n    // FORMATTING\n\n    addFormatToken(0, ['gg', 2], 0, function () {\n        return this.weekYear() % 100;\n    });\n\n    addFormatToken(0, ['GG', 2], 0, function () {\n        return this.isoWeekYear() % 100;\n    });\n\n    function addWeekYearFormatToken (token, getter) {\n        addFormatToken(0, [token, token.length], 0, getter);\n    }\n\n    addWeekYearFormatToken('gggg',     'weekYear');\n    addWeekYearFormatToken('ggggg',    'weekYear');\n    addWeekYearFormatToken('GGGG',  'isoWeekYear');\n    addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n    // ALIASES\n\n    addUnitAlias('weekYear', 'gg');\n    addUnitAlias('isoWeekYear', 'GG');\n\n    // PRIORITY\n\n    addUnitPriority('weekYear', 1);\n    addUnitPriority('isoWeekYear', 1);\n\n\n    // PARSING\n\n    addRegexToken('G',      matchSigned);\n    addRegexToken('g',      matchSigned);\n    addRegexToken('GG',     match1to2, match2);\n    addRegexToken('gg',     match1to2, match2);\n    addRegexToken('GGGG',   match1to4, match4);\n    addRegexToken('gggg',   match1to4, match4);\n    addRegexToken('GGGGG',  match1to6, match6);\n    addRegexToken('ggggg',  match1to6, match6);\n\n    addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n        week[token.substr(0, 2)] = toInt(input);\n    });\n\n    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n        week[token] = hooks.parseTwoDigitYear(input);\n    });\n\n    // MOMENTS\n\n    function getSetWeekYear (input) {\n        return getSetWeekYearHelper.call(this,\n                input,\n                this.week(),\n                this.weekday(),\n                this.localeData()._week.dow,\n                this.localeData()._week.doy);\n    }\n\n    function getSetISOWeekYear (input) {\n        return getSetWeekYearHelper.call(this,\n                input, this.isoWeek(), this.isoWeekday(), 1, 4);\n    }\n\n    function getISOWeeksInYear () {\n        return weeksInYear(this.year(), 1, 4);\n    }\n\n    function getWeeksInYear () {\n        var weekInfo = this.localeData()._week;\n        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n    }\n\n    function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n        var weeksTarget;\n        if (input == null) {\n            return weekOfYear(this, dow, doy).year;\n        } else {\n            weeksTarget = weeksInYear(input, dow, doy);\n            if (week > weeksTarget) {\n                week = weeksTarget;\n            }\n            return setWeekAll.call(this, input, week, weekday, dow, doy);\n        }\n    }\n\n    function setWeekAll(weekYear, week, weekday, dow, doy) {\n        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n        this.year(date.getUTCFullYear());\n        this.month(date.getUTCMonth());\n        this.date(date.getUTCDate());\n        return this;\n    }\n\n    // FORMATTING\n\n    addFormatToken('Q', 0, 'Qo', 'quarter');\n\n    // ALIASES\n\n    addUnitAlias('quarter', 'Q');\n\n    // PRIORITY\n\n    addUnitPriority('quarter', 7);\n\n    // PARSING\n\n    addRegexToken('Q', match1);\n    addParseToken('Q', function (input, array) {\n        array[MONTH] = (toInt(input) - 1) * 3;\n    });\n\n    // MOMENTS\n\n    function getSetQuarter (input) {\n        return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n    }\n\n    // FORMATTING\n\n    addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n    // ALIASES\n\n    addUnitAlias('date', 'D');\n\n    // PRIORITY\n    addUnitPriority('date', 9);\n\n    // PARSING\n\n    addRegexToken('D',  match1to2);\n    addRegexToken('DD', match1to2, match2);\n    addRegexToken('Do', function (isStrict, locale) {\n        // TODO: Remove \"ordinalParse\" fallback in next major release.\n        return isStrict ?\n          (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n          locale._dayOfMonthOrdinalParseLenient;\n    });\n\n    addParseToken(['D', 'DD'], DATE);\n    addParseToken('Do', function (input, array) {\n        array[DATE] = toInt(input.match(match1to2)[0]);\n    });\n\n    // MOMENTS\n\n    var getSetDayOfMonth = makeGetSet('Date', true);\n\n    // FORMATTING\n\n    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n    // ALIASES\n\n    addUnitAlias('dayOfYear', 'DDD');\n\n    // PRIORITY\n    addUnitPriority('dayOfYear', 4);\n\n    // PARSING\n\n    addRegexToken('DDD',  match1to3);\n    addRegexToken('DDDD', match3);\n    addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n        config._dayOfYear = toInt(input);\n    });\n\n    // HELPERS\n\n    // MOMENTS\n\n    function getSetDayOfYear (input) {\n        var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n        return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('m', ['mm', 2], 0, 'minute');\n\n    // ALIASES\n\n    addUnitAlias('minute', 'm');\n\n    // PRIORITY\n\n    addUnitPriority('minute', 14);\n\n    // PARSING\n\n    addRegexToken('m',  match1to2);\n    addRegexToken('mm', match1to2, match2);\n    addParseToken(['m', 'mm'], MINUTE);\n\n    // MOMENTS\n\n    var getSetMinute = makeGetSet('Minutes', false);\n\n    // FORMATTING\n\n    addFormatToken('s', ['ss', 2], 0, 'second');\n\n    // ALIASES\n\n    addUnitAlias('second', 's');\n\n    // PRIORITY\n\n    addUnitPriority('second', 15);\n\n    // PARSING\n\n    addRegexToken('s',  match1to2);\n    addRegexToken('ss', match1to2, match2);\n    addParseToken(['s', 'ss'], SECOND);\n\n    // MOMENTS\n\n    var getSetSecond = makeGetSet('Seconds', false);\n\n    // FORMATTING\n\n    addFormatToken('S', 0, 0, function () {\n        return ~~(this.millisecond() / 100);\n    });\n\n    addFormatToken(0, ['SS', 2], 0, function () {\n        return ~~(this.millisecond() / 10);\n    });\n\n    addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n    addFormatToken(0, ['SSSS', 4], 0, function () {\n        return this.millisecond() * 10;\n    });\n    addFormatToken(0, ['SSSSS', 5], 0, function () {\n        return this.millisecond() * 100;\n    });\n    addFormatToken(0, ['SSSSSS', 6], 0, function () {\n        return this.millisecond() * 1000;\n    });\n    addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n        return this.millisecond() * 10000;\n    });\n    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n        return this.millisecond() * 100000;\n    });\n    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n        return this.millisecond() * 1000000;\n    });\n\n\n    // ALIASES\n\n    addUnitAlias('millisecond', 'ms');\n\n    // PRIORITY\n\n    addUnitPriority('millisecond', 16);\n\n    // PARSING\n\n    addRegexToken('S',    match1to3, match1);\n    addRegexToken('SS',   match1to3, match2);\n    addRegexToken('SSS',  match1to3, match3);\n\n    var token;\n    for (token = 'SSSS'; token.length <= 9; token += 'S') {\n        addRegexToken(token, matchUnsigned);\n    }\n\n    function parseMs(input, array) {\n        array[MILLISECOND] = toInt(('0.' + input) * 1000);\n    }\n\n    for (token = 'S'; token.length <= 9; token += 'S') {\n        addParseToken(token, parseMs);\n    }\n    // MOMENTS\n\n    var getSetMillisecond = makeGetSet('Milliseconds', false);\n\n    // FORMATTING\n\n    addFormatToken('z',  0, 0, 'zoneAbbr');\n    addFormatToken('zz', 0, 0, 'zoneName');\n\n    // MOMENTS\n\n    function getZoneAbbr () {\n        return this._isUTC ? 'UTC' : '';\n    }\n\n    function getZoneName () {\n        return this._isUTC ? 'Coordinated Universal Time' : '';\n    }\n\n    var proto = Moment.prototype;\n\n    proto.add               = add;\n    proto.calendar          = calendar$1;\n    proto.clone             = clone;\n    proto.diff              = diff;\n    proto.endOf             = endOf;\n    proto.format            = format;\n    proto.from              = from;\n    proto.fromNow           = fromNow;\n    proto.to                = to;\n    proto.toNow             = toNow;\n    proto.get               = stringGet;\n    proto.invalidAt         = invalidAt;\n    proto.isAfter           = isAfter;\n    proto.isBefore          = isBefore;\n    proto.isBetween         = isBetween;\n    proto.isSame            = isSame;\n    proto.isSameOrAfter     = isSameOrAfter;\n    proto.isSameOrBefore    = isSameOrBefore;\n    proto.isValid           = isValid$2;\n    proto.lang              = lang;\n    proto.locale            = locale;\n    proto.localeData        = localeData;\n    proto.max               = prototypeMax;\n    proto.min               = prototypeMin;\n    proto.parsingFlags      = parsingFlags;\n    proto.set               = stringSet;\n    proto.startOf           = startOf;\n    proto.subtract          = subtract;\n    proto.toArray           = toArray;\n    proto.toObject          = toObject;\n    proto.toDate            = toDate;\n    proto.toISOString       = toISOString;\n    proto.inspect           = inspect;\n    proto.toJSON            = toJSON;\n    proto.toString          = toString;\n    proto.unix              = unix;\n    proto.valueOf           = valueOf;\n    proto.creationData      = creationData;\n    proto.year       = getSetYear;\n    proto.isLeapYear = getIsLeapYear;\n    proto.weekYear    = getSetWeekYear;\n    proto.isoWeekYear = getSetISOWeekYear;\n    proto.quarter = proto.quarters = getSetQuarter;\n    proto.month       = getSetMonth;\n    proto.daysInMonth = getDaysInMonth;\n    proto.week           = proto.weeks        = getSetWeek;\n    proto.isoWeek        = proto.isoWeeks     = getSetISOWeek;\n    proto.weeksInYear    = getWeeksInYear;\n    proto.isoWeeksInYear = getISOWeeksInYear;\n    proto.date       = getSetDayOfMonth;\n    proto.day        = proto.days             = getSetDayOfWeek;\n    proto.weekday    = getSetLocaleDayOfWeek;\n    proto.isoWeekday = getSetISODayOfWeek;\n    proto.dayOfYear  = getSetDayOfYear;\n    proto.hour = proto.hours = getSetHour;\n    proto.minute = proto.minutes = getSetMinute;\n    proto.second = proto.seconds = getSetSecond;\n    proto.millisecond = proto.milliseconds = getSetMillisecond;\n    proto.utcOffset            = getSetOffset;\n    proto.utc                  = setOffsetToUTC;\n    proto.local                = setOffsetToLocal;\n    proto.parseZone            = setOffsetToParsedOffset;\n    proto.hasAlignedHourOffset = hasAlignedHourOffset;\n    proto.isDST                = isDaylightSavingTime;\n    proto.isLocal              = isLocal;\n    proto.isUtcOffset          = isUtcOffset;\n    proto.isUtc                = isUtc;\n    proto.isUTC                = isUtc;\n    proto.zoneAbbr = getZoneAbbr;\n    proto.zoneName = getZoneName;\n    proto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n    proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n    proto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n    proto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\n    proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\n    function createUnix (input) {\n        return createLocal(input * 1000);\n    }\n\n    function createInZone () {\n        return createLocal.apply(null, arguments).parseZone();\n    }\n\n    function preParsePostFormat (string) {\n        return string;\n    }\n\n    var proto$1 = Locale.prototype;\n\n    proto$1.calendar        = calendar;\n    proto$1.longDateFormat  = longDateFormat;\n    proto$1.invalidDate     = invalidDate;\n    proto$1.ordinal         = ordinal;\n    proto$1.preparse        = preParsePostFormat;\n    proto$1.postformat      = preParsePostFormat;\n    proto$1.relativeTime    = relativeTime;\n    proto$1.pastFuture      = pastFuture;\n    proto$1.set             = set;\n\n    proto$1.months            =        localeMonths;\n    proto$1.monthsShort       =        localeMonthsShort;\n    proto$1.monthsParse       =        localeMonthsParse;\n    proto$1.monthsRegex       = monthsRegex;\n    proto$1.monthsShortRegex  = monthsShortRegex;\n    proto$1.week = localeWeek;\n    proto$1.firstDayOfYear = localeFirstDayOfYear;\n    proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n    proto$1.weekdays       =        localeWeekdays;\n    proto$1.weekdaysMin    =        localeWeekdaysMin;\n    proto$1.weekdaysShort  =        localeWeekdaysShort;\n    proto$1.weekdaysParse  =        localeWeekdaysParse;\n\n    proto$1.weekdaysRegex       =        weekdaysRegex;\n    proto$1.weekdaysShortRegex  =        weekdaysShortRegex;\n    proto$1.weekdaysMinRegex    =        weekdaysMinRegex;\n\n    proto$1.isPM = localeIsPM;\n    proto$1.meridiem = localeMeridiem;\n\n    function get$1 (format, index, field, setter) {\n        var locale = getLocale();\n        var utc = createUTC().set(setter, index);\n        return locale[field](utc, format);\n    }\n\n    function listMonthsImpl (format, index, field) {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n\n        if (index != null) {\n            return get$1(format, index, field, 'month');\n        }\n\n        var i;\n        var out = [];\n        for (i = 0; i < 12; i++) {\n            out[i] = get$1(format, i, field, 'month');\n        }\n        return out;\n    }\n\n    // ()\n    // (5)\n    // (fmt, 5)\n    // (fmt)\n    // (true)\n    // (true, 5)\n    // (true, fmt, 5)\n    // (true, fmt)\n    function listWeekdaysImpl (localeSorted, format, index, field) {\n        if (typeof localeSorted === 'boolean') {\n            if (isNumber(format)) {\n                index = format;\n                format = undefined;\n            }\n\n            format = format || '';\n        } else {\n            format = localeSorted;\n            index = format;\n            localeSorted = false;\n\n            if (isNumber(format)) {\n                index = format;\n                format = undefined;\n            }\n\n            format = format || '';\n        }\n\n        var locale = getLocale(),\n            shift = localeSorted ? locale._week.dow : 0;\n\n        if (index != null) {\n            return get$1(format, (index + shift) % 7, field, 'day');\n        }\n\n        var i;\n        var out = [];\n        for (i = 0; i < 7; i++) {\n            out[i] = get$1(format, (i + shift) % 7, field, 'day');\n        }\n        return out;\n    }\n\n    function listMonths (format, index) {\n        return listMonthsImpl(format, index, 'months');\n    }\n\n    function listMonthsShort (format, index) {\n        return listMonthsImpl(format, index, 'monthsShort');\n    }\n\n    function listWeekdays (localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n    }\n\n    function listWeekdaysShort (localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n    }\n\n    function listWeekdaysMin (localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n    }\n\n    getSetGlobalLocale('en', {\n        dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n        ordinal : function (number) {\n            var b = number % 10,\n                output = (toInt(number % 100 / 10) === 1) ? 'th' :\n                (b === 1) ? 'st' :\n                (b === 2) ? 'nd' :\n                (b === 3) ? 'rd' : 'th';\n            return number + output;\n        }\n    });\n\n    // Side effect imports\n\n    hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\n    hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\n    var mathAbs = Math.abs;\n\n    function abs () {\n        var data           = this._data;\n\n        this._milliseconds = mathAbs(this._milliseconds);\n        this._days         = mathAbs(this._days);\n        this._months       = mathAbs(this._months);\n\n        data.milliseconds  = mathAbs(data.milliseconds);\n        data.seconds       = mathAbs(data.seconds);\n        data.minutes       = mathAbs(data.minutes);\n        data.hours         = mathAbs(data.hours);\n        data.months        = mathAbs(data.months);\n        data.years         = mathAbs(data.years);\n\n        return this;\n    }\n\n    function addSubtract$1 (duration, input, value, direction) {\n        var other = createDuration(input, value);\n\n        duration._milliseconds += direction * other._milliseconds;\n        duration._days         += direction * other._days;\n        duration._months       += direction * other._months;\n\n        return duration._bubble();\n    }\n\n    // supports only 2.0-style add(1, 's') or add(duration)\n    function add$1 (input, value) {\n        return addSubtract$1(this, input, value, 1);\n    }\n\n    // supports only 2.0-style subtract(1, 's') or subtract(duration)\n    function subtract$1 (input, value) {\n        return addSubtract$1(this, input, value, -1);\n    }\n\n    function absCeil (number) {\n        if (number < 0) {\n            return Math.floor(number);\n        } else {\n            return Math.ceil(number);\n        }\n    }\n\n    function bubble () {\n        var milliseconds = this._milliseconds;\n        var days         = this._days;\n        var months       = this._months;\n        var data         = this._data;\n        var seconds, minutes, hours, years, monthsFromDays;\n\n        // if we have a mix of positive and negative values, bubble down first\n        // check: https://github.com/moment/moment/issues/2166\n        if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n                (milliseconds <= 0 && days <= 0 && months <= 0))) {\n            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n            days = 0;\n            months = 0;\n        }\n\n        // The following code bubbles up values, see the tests for\n        // examples of what that means.\n        data.milliseconds = milliseconds % 1000;\n\n        seconds           = absFloor(milliseconds / 1000);\n        data.seconds      = seconds % 60;\n\n        minutes           = absFloor(seconds / 60);\n        data.minutes      = minutes % 60;\n\n        hours             = absFloor(minutes / 60);\n        data.hours        = hours % 24;\n\n        days += absFloor(hours / 24);\n\n        // convert days to months\n        monthsFromDays = absFloor(daysToMonths(days));\n        months += monthsFromDays;\n        days -= absCeil(monthsToDays(monthsFromDays));\n\n        // 12 months -> 1 year\n        years = absFloor(months / 12);\n        months %= 12;\n\n        data.days   = days;\n        data.months = months;\n        data.years  = years;\n\n        return this;\n    }\n\n    function daysToMonths (days) {\n        // 400 years have 146097 days (taking into account leap year rules)\n        // 400 years have 12 months === 4800\n        return days * 4800 / 146097;\n    }\n\n    function monthsToDays (months) {\n        // the reverse of daysToMonths\n        return months * 146097 / 4800;\n    }\n\n    function as (units) {\n        if (!this.isValid()) {\n            return NaN;\n        }\n        var days;\n        var months;\n        var milliseconds = this._milliseconds;\n\n        units = normalizeUnits(units);\n\n        if (units === 'month' || units === 'year') {\n            days   = this._days   + milliseconds / 864e5;\n            months = this._months + daysToMonths(days);\n            return units === 'month' ? months : months / 12;\n        } else {\n            // handle milliseconds separately because of floating point math errors (issue #1867)\n            days = this._days + Math.round(monthsToDays(this._months));\n            switch (units) {\n                case 'week'   : return days / 7     + milliseconds / 6048e5;\n                case 'day'    : return days         + milliseconds / 864e5;\n                case 'hour'   : return days * 24    + milliseconds / 36e5;\n                case 'minute' : return days * 1440  + milliseconds / 6e4;\n                case 'second' : return days * 86400 + milliseconds / 1000;\n                // Math.floor prevents floating point math errors here\n                case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n                default: throw new Error('Unknown unit ' + units);\n            }\n        }\n    }\n\n    // TODO: Use this.as('ms')?\n    function valueOf$1 () {\n        if (!this.isValid()) {\n            return NaN;\n        }\n        return (\n            this._milliseconds +\n            this._days * 864e5 +\n            (this._months % 12) * 2592e6 +\n            toInt(this._months / 12) * 31536e6\n        );\n    }\n\n    function makeAs (alias) {\n        return function () {\n            return this.as(alias);\n        };\n    }\n\n    var asMilliseconds = makeAs('ms');\n    var asSeconds      = makeAs('s');\n    var asMinutes      = makeAs('m');\n    var asHours        = makeAs('h');\n    var asDays         = makeAs('d');\n    var asWeeks        = makeAs('w');\n    var asMonths       = makeAs('M');\n    var asYears        = makeAs('y');\n\n    function clone$1 () {\n        return createDuration(this);\n    }\n\n    function get$2 (units) {\n        units = normalizeUnits(units);\n        return this.isValid() ? this[units + 's']() : NaN;\n    }\n\n    function makeGetter(name) {\n        return function () {\n            return this.isValid() ? this._data[name] : NaN;\n        };\n    }\n\n    var milliseconds = makeGetter('milliseconds');\n    var seconds      = makeGetter('seconds');\n    var minutes      = makeGetter('minutes');\n    var hours        = makeGetter('hours');\n    var days         = makeGetter('days');\n    var months       = makeGetter('months');\n    var years        = makeGetter('years');\n\n    function weeks () {\n        return absFloor(this.days() / 7);\n    }\n\n    var round = Math.round;\n    var thresholds = {\n        ss: 44,         // a few seconds to seconds\n        s : 45,         // seconds to minute\n        m : 45,         // minutes to hour\n        h : 22,         // hours to day\n        d : 26,         // days to month\n        M : 11          // months to year\n    };\n\n    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n    }\n\n    function relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n        var duration = createDuration(posNegDuration).abs();\n        var seconds  = round(duration.as('s'));\n        var minutes  = round(duration.as('m'));\n        var hours    = round(duration.as('h'));\n        var days     = round(duration.as('d'));\n        var months   = round(duration.as('M'));\n        var years    = round(duration.as('y'));\n\n        var a = seconds <= thresholds.ss && ['s', seconds]  ||\n                seconds < thresholds.s   && ['ss', seconds] ||\n                minutes <= 1             && ['m']           ||\n                minutes < thresholds.m   && ['mm', minutes] ||\n                hours   <= 1             && ['h']           ||\n                hours   < thresholds.h   && ['hh', hours]   ||\n                days    <= 1             && ['d']           ||\n                days    < thresholds.d   && ['dd', days]    ||\n                months  <= 1             && ['M']           ||\n                months  < thresholds.M   && ['MM', months]  ||\n                years   <= 1             && ['y']           || ['yy', years];\n\n        a[2] = withoutSuffix;\n        a[3] = +posNegDuration > 0;\n        a[4] = locale;\n        return substituteTimeAgo.apply(null, a);\n    }\n\n    // This function allows you to set the rounding function for relative time strings\n    function getSetRelativeTimeRounding (roundingFunction) {\n        if (roundingFunction === undefined) {\n            return round;\n        }\n        if (typeof(roundingFunction) === 'function') {\n            round = roundingFunction;\n            return true;\n        }\n        return false;\n    }\n\n    // This function allows you to set a threshold for relative time strings\n    function getSetRelativeTimeThreshold (threshold, limit) {\n        if (thresholds[threshold] === undefined) {\n            return false;\n        }\n        if (limit === undefined) {\n            return thresholds[threshold];\n        }\n        thresholds[threshold] = limit;\n        if (threshold === 's') {\n            thresholds.ss = limit - 1;\n        }\n        return true;\n    }\n\n    function humanize (withSuffix) {\n        if (!this.isValid()) {\n            return this.localeData().invalidDate();\n        }\n\n        var locale = this.localeData();\n        var output = relativeTime$1(this, !withSuffix, locale);\n\n        if (withSuffix) {\n            output = locale.pastFuture(+this, output);\n        }\n\n        return locale.postformat(output);\n    }\n\n    var abs$1 = Math.abs;\n\n    function sign(x) {\n        return ((x > 0) - (x < 0)) || +x;\n    }\n\n    function toISOString$1() {\n        // for ISO strings we do not use the normal bubbling rules:\n        //  * milliseconds bubble up until they become hours\n        //  * days do not bubble at all\n        //  * months bubble up until they become years\n        // This is because there is no context-free conversion between hours and days\n        // (think of clock changes)\n        // and also not between days and months (28-31 days per month)\n        if (!this.isValid()) {\n            return this.localeData().invalidDate();\n        }\n\n        var seconds = abs$1(this._milliseconds) / 1000;\n        var days         = abs$1(this._days);\n        var months       = abs$1(this._months);\n        var minutes, hours, years;\n\n        // 3600 seconds -> 60 minutes -> 1 hour\n        minutes           = absFloor(seconds / 60);\n        hours             = absFloor(minutes / 60);\n        seconds %= 60;\n        minutes %= 60;\n\n        // 12 months -> 1 year\n        years  = absFloor(months / 12);\n        months %= 12;\n\n\n        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n        var Y = years;\n        var M = months;\n        var D = days;\n        var h = hours;\n        var m = minutes;\n        var s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n        var total = this.asSeconds();\n\n        if (!total) {\n            // this is the same as C#'s (Noda) and python (isodate)...\n            // but not other JS (goog.date)\n            return 'P0D';\n        }\n\n        var totalSign = total < 0 ? '-' : '';\n        var ymSign = sign(this._months) !== sign(total) ? '-' : '';\n        var daysSign = sign(this._days) !== sign(total) ? '-' : '';\n        var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n        return totalSign + 'P' +\n            (Y ? ymSign + Y + 'Y' : '') +\n            (M ? ymSign + M + 'M' : '') +\n            (D ? daysSign + D + 'D' : '') +\n            ((h || m || s) ? 'T' : '') +\n            (h ? hmsSign + h + 'H' : '') +\n            (m ? hmsSign + m + 'M' : '') +\n            (s ? hmsSign + s + 'S' : '');\n    }\n\n    var proto$2 = Duration.prototype;\n\n    proto$2.isValid        = isValid$1;\n    proto$2.abs            = abs;\n    proto$2.add            = add$1;\n    proto$2.subtract       = subtract$1;\n    proto$2.as             = as;\n    proto$2.asMilliseconds = asMilliseconds;\n    proto$2.asSeconds      = asSeconds;\n    proto$2.asMinutes      = asMinutes;\n    proto$2.asHours        = asHours;\n    proto$2.asDays         = asDays;\n    proto$2.asWeeks        = asWeeks;\n    proto$2.asMonths       = asMonths;\n    proto$2.asYears        = asYears;\n    proto$2.valueOf        = valueOf$1;\n    proto$2._bubble        = bubble;\n    proto$2.clone          = clone$1;\n    proto$2.get            = get$2;\n    proto$2.milliseconds   = milliseconds;\n    proto$2.seconds        = seconds;\n    proto$2.minutes        = minutes;\n    proto$2.hours          = hours;\n    proto$2.days           = days;\n    proto$2.weeks          = weeks;\n    proto$2.months         = months;\n    proto$2.years          = years;\n    proto$2.humanize       = humanize;\n    proto$2.toISOString    = toISOString$1;\n    proto$2.toString       = toISOString$1;\n    proto$2.toJSON         = toISOString$1;\n    proto$2.locale         = locale;\n    proto$2.localeData     = localeData;\n\n    proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\n    proto$2.lang = lang;\n\n    // Side effect imports\n\n    // FORMATTING\n\n    addFormatToken('X', 0, 0, 'unix');\n    addFormatToken('x', 0, 0, 'valueOf');\n\n    // PARSING\n\n    addRegexToken('x', matchSigned);\n    addRegexToken('X', matchTimestamp);\n    addParseToken('X', function (input, array, config) {\n        config._d = new Date(parseFloat(input, 10) * 1000);\n    });\n    addParseToken('x', function (input, array, config) {\n        config._d = new Date(toInt(input));\n    });\n\n    // Side effect imports\n\n\n    hooks.version = '2.22.2';\n\n    setHookCallback(createLocal);\n\n    hooks.fn                    = proto;\n    hooks.min                   = min;\n    hooks.max                   = max;\n    hooks.now                   = now;\n    hooks.utc                   = createUTC;\n    hooks.unix                  = createUnix;\n    hooks.months                = listMonths;\n    hooks.isDate                = isDate;\n    hooks.locale                = getSetGlobalLocale;\n    hooks.invalid               = createInvalid;\n    hooks.duration              = createDuration;\n    hooks.isMoment              = isMoment;\n    hooks.weekdays              = listWeekdays;\n    hooks.parseZone             = createInZone;\n    hooks.localeData            = getLocale;\n    hooks.isDuration            = isDuration;\n    hooks.monthsShort           = listMonthsShort;\n    hooks.weekdaysMin           = listWeekdaysMin;\n    hooks.defineLocale          = defineLocale;\n    hooks.updateLocale          = updateLocale;\n    hooks.locales               = listLocales;\n    hooks.weekdaysShort         = listWeekdaysShort;\n    hooks.normalizeUnits        = normalizeUnits;\n    hooks.relativeTimeRounding  = getSetRelativeTimeRounding;\n    hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n    hooks.calendarFormat        = getCalendarFormat;\n    hooks.prototype             = proto;\n\n    // currently HTML5 input type only supports 24-hour formats\n    hooks.HTML5_FMT = {\n        DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',             // <input type=\"datetime-local\" />\n        DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',  // <input type=\"datetime-local\" step=\"1\" />\n        DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',   // <input type=\"datetime-local\" step=\"0.001\" />\n        DATE: 'YYYY-MM-DD',                             // <input type=\"date\" />\n        TIME: 'HH:mm',                                  // <input type=\"time\" />\n        TIME_SECONDS: 'HH:mm:ss',                       // <input type=\"time\" step=\"1\" />\n        TIME_MS: 'HH:mm:ss.SSS',                        // <input type=\"time\" step=\"0.001\" />\n        WEEK: 'YYYY-[W]WW',                             // <input type=\"week\" />\n        MONTH: 'YYYY-MM'                                // <input type=\"month\" />\n    };\n\n    return hooks;\n\n})));\n","var moment = require('moment');\n\nfunction ParsedResult(result){\n    result = result || {};\n\n    this.ref   = result.ref;\n    this.index = result.index;\n    this.text  = result.text;\n    this.tags  = result.tags || {};\n\n    this.start = new ParsedComponents(result.start, result.ref)\n    if(result.end){\n        this.end = new ParsedComponents(result.end, result.ref)\n    }\n}\n\nParsedResult.prototype.clone = function() {\n    var result = new ParsedResult(this);\n    result.tags = JSON.parse(JSON.stringify(this.tags));\n    result.start = this.start.clone();\n    if (this.end) {\n        result.end = this.end.clone();\n    }\n}\n\nParsedResult.prototype.hasPossibleDates = function() {\n    return this.start.isPossibleDate() && (!this.end || this.end.isPossibleDate());\n}\n\n\nfunction ParsedComponents (components, ref){\n\n    this.knownValues = {};\n    this.impliedValues = {};\n\n    if (components) {\n        for (key in components) {\n            this.knownValues[key] = components[key];\n        }\n    }\n\n    if (ref) {\n        ref = moment(ref);\n        this.imply('day', ref.date())\n        this.imply('month', ref.month() + 1)\n        this.imply('year', ref.year())\n    }\n    \n\n    this.imply('hour', 12);\n    this.imply('minute', 0);\n    this.imply('second', 0);\n    this.imply('millisecond', 0);\n}\n\nParsedComponents.prototype.clone = function () {\n    var component = new ParsedComponents();\n    component.knownValues = JSON.parse(JSON.stringify(this.knownValues));\n    component.impliedValues = JSON.parse(JSON.stringify(this.impliedValues));\n    return component;\n};\n\nParsedComponents.prototype.get = function(component, value) {\n    if (component in this.knownValues) return this.knownValues[component];\n    if (component in this.impliedValues) return this.impliedValues[component];\n};\n\nParsedComponents.prototype.assign = function(component, value) {\n    this.knownValues[component] = value;\n    delete this.impliedValues[component];\n};\n\nParsedComponents.prototype.imply = function(component, value) {\n    if (component in this.knownValues) return;\n    this.impliedValues[component] = value;\n};\n\nParsedComponents.prototype.isCertain = function(component) {\n    return component in this.knownValues;\n};\n\nParsedComponents.prototype.isPossibleDate = function() {\n    var dateMoment = this.moment();\n    if (this.isCertain('timezoneOffset')) {\n        dateMoment.utcOffset(this.get('timezoneOffset'))\n    }\n\n    if (dateMoment.get('year') != this.get('year')) return false;\n    if (dateMoment.get('month') != this.get('month')-1) return false;\n    if (dateMoment.get('date') != this.get('day')) return false;\n    if (dateMoment.get('hour') != this.get('hour')) return false;\n    if (dateMoment.get('minute') != this.get('minute')) return false;\n\n    return true;\n};\n\nParsedComponents.prototype.date = function() {\n    var dateMoment = this.moment();\n    return dateMoment.toDate();\n};\n\nParsedComponents.prototype.moment = function() {\n    var dateMoment = moment();\n\n    dateMoment.set('year', this.get('year'));\n    dateMoment.set('month', this.get('month')-1);\n    dateMoment.set('date', this.get('day'));\n    dateMoment.set('hour', this.get('hour'));\n    dateMoment.set('minute', this.get('minute'));\n    dateMoment.set('second', this.get('second'));\n    dateMoment.set('millisecond', this.get('millisecond'));\n\n    // Javascript Date Object return minus timezone offset\n    var currentTimezoneOffset = dateMoment.utcOffset();\n    var targetTimezoneOffset = this.isCertain('timezoneOffset') ? \n        this.get('timezoneOffset') : currentTimezoneOffset;\n\n    var adjustTimezoneOffset = targetTimezoneOffset - currentTimezoneOffset;\n    dateMoment.add(-adjustTimezoneOffset, 'minutes');\n\n    return dateMoment;\n};\n\n\n\nexports.ParsedComponents = ParsedComponents;\nexports.ParsedResult = ParsedResult;\n","/*\n    ISO 8601\n    http://www.w3.org/TR/NOTE-datetime\n    - YYYY-MM-DD\n    - YYYY-MM-DDThh:mmTZD\n    - YYYY-MM-DDThh:mm:ssTZD\n    - YYYY-MM-DDThh:mm:ss.sTZD \n    - TZD = (Z or +hh:mm or -hh:mm)\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' \n            + '([0-9]{4})\\\\-([0-9]{1,2})\\\\-([0-9]{1,2})'\n            + '(?:T' //..\n                + '([0-9]{1,2}):([0-9]{1,2})' // hh:mm\n                + '(?::([0-9]{1,2})(?:\\\\.(\\\\d{1,4}))?)?' // :ss.s\n                + '(?:Z|([+-]\\\\d{2}):?(\\\\d{2})?)?' // TZD (Z or ±hh:mm or ±hhmm or ±hh)\n            + ')?'  //..\n            + '(?=\\\\W|$)', 'i');\n\nvar YEAR_NUMBER_GROUP = 2;\nvar MONTH_NUMBER_GROUP = 3;\nvar DATE_NUMBER_GROUP  = 4;\nvar HOUR_NUMBER_GROUP  = 5;\nvar MINUTE_NUMBER_GROUP = 6;\nvar SECOND_NUMBER_GROUP = 7;\nvar MILLISECOND_NUMBER_GROUP = 8;\nvar TZD_HOUR_OFFSET_GROUP = 9;\nvar TZD_MINUTE_OFFSET_GROUP = 10;\n\nexports.Parser = function ENISOFormatParser(){\n    Parser.apply(this, arguments);\n    \n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n        \n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        })\n        \n        result.start.assign('year', parseInt(match[YEAR_NUMBER_GROUP]));\n        result.start.assign('month', parseInt(match[MONTH_NUMBER_GROUP]));\n        result.start.assign('day', parseInt(match[DATE_NUMBER_GROUP]));\n\n        if (moment(result.start.get('month')) > 12 || moment(result.start.get('month')) < 1 ||\n            moment(result.start.get('day')) > 31 || moment(result.start.get('day')) < 1) {\n            return null;\n        }\n\n        if (match[HOUR_NUMBER_GROUP] != null) {\n            \n            result.start.assign('hour',\n                    parseInt(match[HOUR_NUMBER_GROUP]));\n            result.start.assign('minute',\n                    parseInt(match[MINUTE_NUMBER_GROUP]));\n\n            if (match[SECOND_NUMBER_GROUP] != null) {\n\n                result.start.assign('second',\n                        parseInt(match[SECOND_NUMBER_GROUP]));\n            }\n\n            if (match[MILLISECOND_NUMBER_GROUP] != null) {\n\n                result.start.assign('millisecond',\n                        parseInt(match[MILLISECOND_NUMBER_GROUP]));\n            }\n\n            if (match[TZD_HOUR_OFFSET_GROUP] == null) {\n\n                result.start.assign('timezoneOffset', 0);\n            } else {\n\n                var minuteOffset = 0;\n                var hourOffset = parseInt(match[TZD_HOUR_OFFSET_GROUP]);\n                if (match[TZD_MINUTE_OFFSET_GROUP] != null)\n                    minuteOffset = parseInt(match[TZD_MINUTE_OFFSET_GROUP]);\n\n                var offset = hourOffset * 60;\n                if (offset < 0) {\n                    offset -= minuteOffset;\n                } else {\n                    offset += minuteOffset;\n                }\n\n                result.start.assign('timezoneOffset', offset);\n            }\n        }\n        \n        result.tags['ENISOFormatParser'] = true;\n        return result;\n    };\n\n}\n\n","exports.WEEKDAY_OFFSET = { \n    'sunday': 0, \n    'sun': 0, \n    'monday': 1, \n    'mon': 1,\n    'tuesday': 2, \n    'tue':2, \n    'wednesday': 3, \n    'wed': 3, \n    'thursday': 4, \n    'thur': 4, \n    'thu': 4,\n    'friday': 5, \n    'fri': 5,\n    'saturday': 6, \n    'sat': 6\n};\n    \nexports.MONTH_OFFSET = { \n    'january': 1,\n    'jan': 1,\n    'jan.': 1,\n    'february': 2,\n    'feb': 2,\n    'feb.': 2,\n    'march': 3,\n    'mar': 3,\n    'mar.': 3,\n    'april': 4,\n    'apr': 4,\n    'apr.': 4,\n    'may': 5,\n    'june': 6,\n    'jun': 6,\n    'jun.': 6,\n    'july': 7,\n    'jul': 7,\n    'jul.': 7,\n    'august': 8,\n    'aug': 8,\n    'aug.': 8,\n    'september': 9,\n    'sep': 9,\n    'sep.': 9,\n    'sept': 9,\n    'sept.': 9,\n    'october': 10,\n    'oct': 10,\n    'oct.': 10,\n    'november': 11,\n    'nov': 11,\n    'nov.': 11,\n    'december': 12,\n    'dec': 12,\n    'dec.': 12\n};\n\nexports.INTEGER_WORDS = {\n    'one' : 1,\n    'two' : 2,\n    'three' : 3,\n    'four' : 4,\n    'five' : 5,\n    'six' : 6,\n    'seven' : 7,\n    'eight' : 8,\n    'nine' : 9,\n    'ten' : 10,\n    'eleven' : 11,\n    'twelve' : 12\n};\nexports.INTEGER_WORDS_PATTERN = '(?:' + Object.keys(exports.INTEGER_WORDS).join('|') +')';\n\nexports.ORDINAL_WORDS = {\n    'first' : 1,\n    'second': 2,\n    'third': 3,\n    'fourth': 4,\n    'fifth': 5,\n    'sixth': 6,\n    'seventh': 7,\n    'eighth': 8,\n    'ninth': 9,\n    'tenth': 10,\n    'eleventh': 11,\n    'twelfth': 12,\n    'thirteenth': 13,\n    'fourteenth': 14,\n    'fifteenth': 15,\n    'sixteenth': 16,\n    'seventeenth': 17,\n    'eighteenth': 18,\n    'nineteenth': 19,\n    'twentieth': 20,\n    'twenty first': 21,\n    'twenty second': 22,\n    'twenty third': 23,\n    'twenty fourth': 24,\n    'twenty fifth': 25,\n    'twenty sixth': 26,\n    'twenty seventh': 27,\n    'twenty eighth': 28,\n    'twenty ninth': 29,\n    'thirtieth': 30,\n    'thirty first': 31\n};\nexports.ORDINAL_WORDS_PATTERN = '(?:' + Object.keys(exports.ORDINAL_WORDS).join('|').replace(/ /g, '[ -]') + ')';","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(within|in)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|an?(?:\\\\s*few)?|half(?:\\\\s*an?)?)\\\\s*' +\n    '(seconds?|min(?:ute)?s?|hours?|days?|weeks?|months?|years?)\\\\s*' +\n    '(?=\\\\W|$)', 'i'\n);\n\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\n    '(within|in)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|an?)\\\\s*' +\n    '(seconds?|minutes?|hours?|days?)\\\\s*' +\n    '(?=\\\\W|$)', 'i'\n);\n\nexports.Parser = function ENDeadlineFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt){\n\n        var index = match.index + match[1].length;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var num = match[3].toLowerCase();\n        if (util.INTEGER_WORDS[num] !== undefined) {\n            num = util.INTEGER_WORDS[num];\n        } else if (num === 'a' || num === 'an'){\n            num = 1;\n        } else if (num.match(/few/i)){\n            num = 3;\n        } else if (num.match(/half/i)) {\n            num = 0.5;\n        } else {\n            num = parseInt(num);\n        }\n\n        var date = moment(ref);\n        if (match[4].match(/day|week|month|year/i)) {\n\n            if (match[4].match(/day/i)) {\n                date.add(num, 'd');\n            } else if (match[4].match(/week/i)) {\n                date.add(num * 7, 'd');\n            } else if (match[4].match(/month/i)) {\n                date.add(num, 'month');\n            } else if (match[4].match(/year/i)) {\n                date.add(num, 'year');\n            }\n\n            result.start.assign('year', date.year());\n            result.start.assign('month', date.month() + 1);\n            result.start.assign('day', date.date());\n            return result;\n        }\n\n        if (match[4].match(/hour/i)) {\n\n            date.add(num, 'hour');\n\n        } else if (match[4].match(/min/i)) {\n\n            date.add(num, 'minute');\n\n        } else if (match[4].match(/second/i)) {\n\n            date.add(num, 'second');\n        }\n\n        result.start.imply('year', date.year());\n        result.start.imply('month', date.month() + 1);\n        result.start.imply('day', date.date());\n        result.start.assign('hour', date.hour());\n        result.start.assign('minute', date.minute());\n        result.start.assign('second', date.second());\n        result.tags['ENDeadlineFormatParser'] = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(next|last|past)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|few|half(?:\\\\s*an?)?)?\\\\s*' +\n    '(seconds?|min(?:ute)?s?|hours?|days?|weeks?|months?|years?)(?=\\\\s*)' +\n    '(?=\\\\W|$)', 'i'\n);\n\nvar MODIFIER_WORD_GROUP = 2;\nvar MULTIPLIER_WORD_GROUP = 3;\nvar RELATIVE_WORD_GROUP = 4;\n\nexports.Parser = function ENRelativeDateFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; };\n\n    this.extract = function(text, ref, match, opt){\n\n        var index = match.index + match[1].length;\n        var modifier = match[MODIFIER_WORD_GROUP].toLowerCase().match(/^next/) ? 1 : -1;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n        result.tags['ENRelativeDateFormatParser'] = true;\n\n        var num = match[MULTIPLIER_WORD_GROUP] === undefined ? '' : match[3].toLowerCase();\n        if (util.INTEGER_WORDS[num] !== undefined) {\n            num = util.INTEGER_WORDS[num];\n        } else if (num === ''){\n            num = 1;\n        } else if (num.match(/few/i)){\n            num = 3;\n        } else if (num.match(/half/i)) {\n            num = 0.5;\n        } else {\n            num = parseInt(num);\n        }\n\n        num *= modifier;\n\n        var date = moment(ref);\n        if (match[RELATIVE_WORD_GROUP].match(/day|week|month|year/i)) {\n\n            if (match[RELATIVE_WORD_GROUP].match(/day/i)) {\n                date.add(num, 'd');\n                result.start.assign('year', date.year());\n                result.start.assign('month', date.month() + 1);\n                result.start.assign('day', date.date());\n            } else if (match[RELATIVE_WORD_GROUP].match(/week/i)) {\n                date.add(num * 7, 'd');\n                // We don't know the exact date for next/last week so we imply\n                // them\n                result.start.imply('day', date.date());\n                result.start.imply('month', date.month() + 1);\n                result.start.imply('year', date.year());\n            } else if (match[RELATIVE_WORD_GROUP].match(/month/i)) {\n                date.add(num, 'month');\n                // We don't know the exact day for next/last month\n                result.start.imply('day', date.date());\n                result.start.assign('year', date.year());\n                result.start.assign('month', date.month() + 1);\n            } else if (match[RELATIVE_WORD_GROUP].match(/year/i)) {\n                date.add(num, 'year');\n                // We don't know the exact day for month on next/last year\n                result.start.imply('day', date.date());\n                result.start.imply('month', date.month() + 1);\n                result.start.assign('year', date.year());\n            }\n\n            return result;\n        }\n\n        if (match[RELATIVE_WORD_GROUP].match(/hour/i)) {\n\n            date.add(num, 'hour');\n            result.start.imply('minute', date.minute());\n            result.start.imply('second', date.second());\n\n        } else if (match[RELATIVE_WORD_GROUP].match(/min/i)) {\n\n            date.add(num, 'minute');\n            result.start.assign('minute', date.minute());\n            result.start.imply('second', date.second());\n\n        } else if (match[RELATIVE_WORD_GROUP].match(/second/i)) {\n\n            date.add(num, 'second');\n            result.start.assign('second', date.second());\n            result.start.assign('minute', date.minute());\n        }\n\n        result.start.assign('hour', date.hour());\n        result.start.assign('year', date.year());\n        result.start.assign('month', date.month() + 1);\n        result.start.assign('day', date.date());\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n        '(?:on\\\\s*?)?' +\n        '(?:(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sun|Mon|Tue|Wed|Thu|Fri|Sat)\\\\s*,?\\\\s*)?' +\n        '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN + ')' +\n        '(?:\\\\s*' +\n            '(?:to|\\\\-|\\\\–|until|through|till|\\\\s)\\\\s*' +\n            '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN + ')' +\n        ')?' + \n        '(?:-|\\/|\\\\s*(?:of)?\\\\s*)' +\n        '(Jan(?:uary|\\\\.)?|Feb(?:ruary|\\\\.)?|Mar(?:ch|\\\\.)?|Apr(?:il|\\\\.)?|May|Jun(?:e|\\\\.)?|Jul(?:y|\\\\.)?|Aug(?:ust|\\\\.)?|Sep(?:tember|\\\\.)?|Oct(?:ober|\\\\.)?|Nov(?:ember|\\\\.)?|Dec(?:ember|\\\\.)?)' +\n        '(?:' +\n            '(?:-|\\/|,?\\\\s*)' +\n            '([0-9]{1,4}(?![^\\\\s]\\\\d))' +\n            '(\\\\s*(?:BE|AD|BC))?' +\n        ')?' +\n        '(?=\\\\W|$)', 'i'\n    );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_NUM_GROUP = 4;\nvar DATE_TO_GROUP = 5;\nvar DATE_TO_NUM_GROUP = 6;\nvar MONTH_NAME_GROUP = 7;\nvar YEAR_GROUP = 8;\nvar YEAR_BE_GROUP = 9;\n\nexports.Parser = function ENMonthNameLittleEndianParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref\n        });\n\n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = match[DATE_NUM_GROUP] ?\n            parseInt(match[DATE_NUM_GROUP]):\n            util.ORDINAL_WORDS[match[DATE_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n        var year = null;\n        if (match[YEAR_GROUP]) {\n            year = match[YEAR_GROUP];\n            year = parseInt(year);\n\n            if(match[YEAR_BE_GROUP]){\n\n                if (/BE/i.test(match[YEAR_BE_GROUP])) {\n                    // Buddhist Era\n                    year = year - 543;\n                } else if (/BC/i.test(match[YEAR_BE_GROUP])) {\n                    // Before Christ\n                    year = -year;\n                }\n\n            } else if (year < 10) {\n\n                // require single digit years to always have BC/AD\n                return null;\n\n            } else if (year < 100){\n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n\n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n            refMoment.year(moment(ref).year());\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = lastYear;\n            }\n\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        // Weekday component\n        if (match[WEEKDAY_GROUP]) {\n            var weekday = match[WEEKDAY_GROUP];\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n            result.start.assign('weekday', weekday);\n        }\n\n        // Text can be 'range' value. Such as '12 - 13 January 2012'\n        if (match[DATE_TO_GROUP]) {\n            var endDate = match[DATE_TO_NUM_GROUP] ?\n                parseInt(match[DATE_TO_NUM_GROUP]):\n                util.ORDINAL_WORDS[match[DATE_TO_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n            result.end = result.start.clone();\n            result.end.assign('day', endDate);\n        }\n\n        result.tags['ENMonthNameLittleEndianParser'] = true;\n        return result;\n    };\n};\n","/*\n\n    The parser for parsing US's date format that begin with month's name.\n\n    EX.\n        - January 13\n        - January 13, 2012\n        - January 13 - 15, 2012\n        - Tuesday, January 13, 2012\n\n    Watch out for:\n        - January 12:00\n        - January 12.44\n        - January 1222344\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:' +\n        '(?:on\\\\s*?)?' +\n        '(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sun\\\\.?|Mon\\\\.?|Tue\\\\.?|Wed\\\\.?|Thu\\\\.?|Fri\\\\.?|Sat\\\\.?)' +\n    '\\\\s*,?\\\\s*)?' +\n    '(Jan\\\\.?|January|Feb\\\\.?|February|Mar\\\\.?|March|Apr\\\\.?|April|May\\\\.?|Jun\\\\.?|June|Jul\\\\.?|July|Aug\\\\.?|August|Sep\\\\.?|Sept\\\\.?|September|Oct\\\\.?|October|Nov\\\\.?|November|Dec\\\\.?|December)' +\n    '(?:-|\\/|\\\\s*,?\\\\s*)' +\n    '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN +')\\\\s*' +\n    '(?:' +\n        '(?:to|\\\\-)\\\\s*' +\n        '(([0-9]{1,2})(?:st|nd|rd|th)?| ' + util.ORDINAL_WORDS_PATTERN + ')\\\\s*' +\n    ')?' +\n    '(?:' +\n        '(?:-|\\/|\\\\s*,?\\\\s*)' +\n        '(?:([0-9]{4})\\\\s*(BE|AD|BC)?|([0-9]{1,4})\\\\s*(AD|BC))\\\\s*' +\n    ')?' +\n    '(?=\\\\W|$)(?!\\\\:\\\\d)', 'i');\n\nvar WEEKDAY_GROUP = 2;\nvar MONTH_NAME_GROUP = 3;\nvar DATE_GROUP = 4;\nvar DATE_NUM_GROUP = 5;\nvar DATE_TO_GROUP = 6;\nvar DATE_TO_NUM_GROUP = 7;\nvar YEAR_GROUP = 8;\nvar YEAR_BE_GROUP = 9;\nvar YEAR_GROUP2 = 10;\nvar YEAR_BE_GROUP2 = 11;\n\nexports.Parser = function ENMonthNameMiddleEndianParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n\n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n        var day = match[DATE_NUM_GROUP] ?\n            parseInt(match[DATE_NUM_GROUP]) :\n            util.ORDINAL_WORDS[match[DATE_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n        var year = null;\n        if (match[YEAR_GROUP] || match[YEAR_GROUP2]) {\n            year = match[YEAR_GROUP] || match[YEAR_GROUP2];\n            year = parseInt(year);\n\n            var yearBE = match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2];\n            if (yearBE) {\n                if (/BE/i.test(yearBE)) {\n                    // Buddhist Era\n                    year = year - 543;\n                } else if (/BC/i.test(yearBE)) {\n                    // Before Christ\n                    year = -year;\n                }\n            } else if (year < 100){\n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n\n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = lastYear;\n            }\n\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        // Weekday component\n        if (match[WEEKDAY_GROUP]) {\n            var weekday = match[WEEKDAY_GROUP];\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n            result.start.assign('weekday', weekday);\n        }\n\n        // Text can be 'range' value. Such as 'January 12 - 13, 2012'\n        if (match[DATE_TO_GROUP]) {\n            var endDate = match[DATE_TO_NUM_GROUP] ?\n                endDate = parseInt(match[DATE_TO_NUM_GROUP]) :\n                util.ORDINAL_WORDS[match[DATE_TO_GROUP].replace('-', ' ').trim().toLowerCase()];\n\n            result.end = result.start.clone();\n            result.end.assign('day', endDate);\n        }\n\n        result.tags['ENMonthNameMiddleEndianParser'] = true;\n        return result;\n    }\n};","/*\n    \n    The parser for parsing month name and year.\n    \n    EX. \n        - January\n        - January 2012\n        - January, 2012\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(^|\\\\D\\\\s+|[^\\\\w\\\\s])' +\n    '(Jan\\\\.?|January|Feb\\\\.?|February|Mar\\\\.?|March|Apr\\\\.?|April|May\\\\.?|Jun\\\\.?|June|Jul\\\\.?|July|Aug\\\\.?|August|Sep\\\\.?|Sept\\\\.?|September|Oct\\\\.?|October|Nov\\\\.?|November|Dec\\\\.?|December)' + \n    '\\\\s*' +\n    '(?:' +\n        '[,-]?\\\\s*([0-9]{4})(\\\\s*BE|AD|BC)?' +\n    ')?' +\n    '(?=[^\\\\s\\\\w]|\\\\s+[^0-9]|\\\\s+$|$)', 'i');\n\nvar MONTH_NAME_GROUP = 2;\nvar YEAR_GROUP = 3;\nvar YEAR_BE_GROUP = 4;\n\nexports.Parser = function ENMonthNameParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n        \n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = 1;\n\n        var year = null;\n        if (match[YEAR_GROUP]) {\n            year = match[YEAR_GROUP];\n            year = parseInt(year);\n\n            if(match[YEAR_BE_GROUP]){\n                if (match[YEAR_BE_GROUP].match(/BE/)) {\n                    // Buddhist Era\n                    year = year - 543;\n                } else if (match[YEAR_BE_GROUP].match(/BC/)) {\n                    // Before Christ\n                    year = -year;\n                }\n\n            } else if (year < 100){ \n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.imply('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n            \n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){  \n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){ \n                refMoment = lastYear;\n            }\n\n            result.start.imply('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        result.tags['ENMonthNameParser'] = true;\n        return result;\n    }\n}\n","/*\n    Date format with slash \"/\" (also \"-\" and \".\") between numbers\n    - Tuesday 11/3/2015 \n    - 11/3/2015\n    - 11/3\n\n    By default the paser us \"middle-endien\" format (US English),\n    then fallback to little-endian if failed.\n    - 11/3/2015 = November 3rd, 2015\n    - 23/4/2015 = April 23th, 2015\n\n    If \"littleEndian\" config is set, the parser will try the little-endian first. \n    - 11/3/2015 = March 11th, 2015\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:' +\n        '(?:on\\\\s*?)?' +\n        '((?:sun|mon|tues?|wed(?:nes)?|thu(?:rs?)?|fri|sat(?:ur)?)(?:day)?)' +\n        '\\\\s*\\\\,?\\\\s*' +\n    ')?' +\n    '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n    '(?:' +\n        '[\\\\/\\\\.\\\\-]' +\n        '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n    ')?' +\n    '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = { 'sunday': 0, 'sun': 0, 'monday': 1, 'mon': 1,'tuesday': 2, 'wednesday': 3, 'wed': 3,\n    'thursday': 4, 'thur': 4,'friday': 5, 'fri': 5,'saturday': 6, 'sat': 6,}\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\nvar WEEKDAY_GROUP = 2;\n\n\nvar FIRST_NUMBERS_GROUP = 3;\nvar SECOND_NUMBERS_GROUP = 4;\n\nvar YEAR_GROUP = 5;\n\nexports.Parser = function ENSlashDateFormatParser(config) {\n    Parser.apply(this, arguments);\n    config = config || {};\n    var littleEndian  = config.littleEndian;\n    var MONTH_GROUP = littleEndian ? SECOND_NUMBERS_GROUP : FIRST_NUMBERS_GROUP;\n    var DAY_GROUP = littleEndian ? FIRST_NUMBERS_GROUP : SECOND_NUMBERS_GROUP;\n\n    this.pattern = function () { return PATTERN; };\n    this.extract = function(text, ref, match, opt){\n\n        if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n            // Long skip, if there is some overlapping like:\n            // XX[/YY/ZZ]\n            // [XX/YY/]ZZ\n            match.index += match[0].length\n            return;\n        }\n\n        var index = match.index + match[OPENNING_GROUP].length;\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        });\n\n        if(text.match(/^\\d\\.\\d$/)) return;\n        if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n        // MM/dd -> OK\n        // MM.dd -> NG\n        if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n        var date = null;\n        var year = match[YEAR_GROUP] || moment(ref).year() + '';\n        var month = match[MONTH_GROUP];\n        var day   = match[DAY_GROUP];\n\n        month = parseInt(month);\n        day  = parseInt(day);\n        year = parseInt(year);\n\n        if(month < 1 || month > 12) {\n            if(month > 12) {\n                // dd/mm/yyyy date format if day looks like a month, and month\n                // looks like a day.\n                if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\n                    // unambiguous\n                    var tday = month;\n                    month = day;\n                    day = tday;\n                }\n                else {\n                    // both month and day are <= 12\n                    return null;\n                }\n            }\n        }\n        if(day < 1 || day > 31) return null;\n\n        if(year < 100){\n            if (year > 50) {\n                year = year + 1900;\n            } else {\n                year = year + 2000;\n            }\n        }\n\n        result.start.assign('day', day);\n        result.start.assign('month', month);\n        result.start.assign('year', year);\n\n        //Day of week\n        if(match[WEEKDAY_GROUP]) {\n            result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n        }\n\n        result.tags['ENSlashDateFormatParser'] = true;\n        return result;\n    };\n};\n","/*\n    Date format with slash \"/\" between numbers like ENSlashDateFormatParser,\n    but this parser expect year before month and date. \n    - YYYY/MM/DD\n    - YYYY-MM-DD\n    - YYYY.MM.DD\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' \n            + '([0-9]{4})[\\\\-\\\\.\\\\/]([0-9]{1,2})[\\\\-\\\\.\\\\/]([0-9]{1,2})'\n            + '(?=\\\\W|$)', 'i');\n\nvar YEAR_NUMBER_GROUP = 2;\nvar MONTH_NUMBER_GROUP = 3;\nvar DATE_NUMBER_GROUP  = 4;\n\nexports.Parser = function ENSlashDateFormatStartWithYearParser(){\n    Parser.apply(this, arguments);\n    \n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){\n\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        })\n        \n        result.start.assign('year', parseInt(match[YEAR_NUMBER_GROUP]));\n        result.start.assign('month', parseInt(match[MONTH_NUMBER_GROUP]));\n        result.start.assign('day', parseInt(match[DATE_NUMBER_GROUP]));\n\n        if (moment(result.start.get('month')) > 12 || moment(result.start.get('month')) < 1 ||\n            moment(result.start.get('day')) > 31 || moment(result.start.get('day')) < 1) {\n            return null;\n        }\n        \n        result.tags['ENDateFormatParser'] = true;\n        return result;\n    };\n}\n","/*\n    Month/Year date format with slash \"/\" (also \"-\" and \".\") between numbers \n    - 11/05\n    - 06/2005\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(^|[^\\\\d/]\\\\s+|[^\\\\w\\\\s])' +\n    '([0-9]|0[1-9]|1[012])/([0-9]{4})' + \n    '([^\\\\d/]|$)', 'i');\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 4;\n\nvar MONTH_GROUP = 2;\nvar YEAR_GROUP = 3;\n\nexports.Parser = function ENSlashMonthFormatParser(argument) {\n    Parser.apply(this, arguments);\n\n    this.pattern = function () { return PATTERN; };\n    this.extract = function(text, ref, match, opt){\n        \n        var index = match.index + match[OPENNING_GROUP].length;\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - (1 + match[ENDING_GROUP].length)).trim();\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        });\n\n        var date = null;\n        var year = match[YEAR_GROUP] ;\n        var month = match[MONTH_GROUP];\n        var day   = 1;\n        \n        month = parseInt(month);\n        year = parseInt(year);\n\n        result.start.imply('day', day);\n        result.start.assign('month', month);\n        result.start.assign('year', year);\n\n        result.tags['ENSlashMonthFormatParser'] = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar TIME_UNIT = \n    '(' + util.INTEGER_WORDS_PATTERN + '|[0-9]+|an?(?:\\\\s*few)?|half(?:\\\\s*an?)?)\\\\s*' +\n    '(sec(?:onds?)?|min(?:ute)?s?|hours?|weeks?|days?|months?|years?)\\\\s*';\n\nvar TIME_UNIT_STRICT = \n    '([0-9]+|an?)\\\\s*' +\n    '(seconds?|minutes?|hours?|days?)\\\\s*';\n\nvar PATTERN_TIME_UNIT = new RegExp(TIME_UNIT, 'i');\nvar PATTERN = new RegExp('' +\n    '(\\\\W|^)' +\n    '(?:within\\\\s*)?' +\n    '((?:' + TIME_UNIT + ')+)' +\n    '(?:ago|before|earlier)(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n    '(\\\\W|^)' +\n    '(?:within\\\\s*)?' +\n    '((?:' + TIME_UNIT_STRICT + ')+)' +\n    'ago(?=(?:\\\\W|$))', 'i');\n\nexports.Parser = function ENTimeAgoFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt){\n\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n        var text = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n        index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var fragments = extractDateTimeUnitFragments(match[2]);\n        var date = moment(ref);\n\n        for (var key in fragments) {\n            date.add(-fragments[key], key);\n        }\n\n        if (fragments['hour'] > 0 || fragments['minute'] > 0 || fragments['second'] > 0) {\n            result.start.assign('hour', date.hour());\n            result.start.assign('minute', date.minute());\n            result.start.assign('second', date.second());\n            result.tags['ENTimeAgoFormatParser'] = true;\n        } \n        \n        if (fragments['d'] > 0 || fragments['month'] > 0 || fragments['year'] > 0) {\n            result.start.assign('day', date.date());\n            result.start.assign('month', date.month() + 1);\n            result.start.assign('year', date.year());\n        } else {\n            if (fragments['week'] > 0) {\n                result.start.imply('weekday', date.day());\n            }\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n        }\n\n        return result;\n    };\n\n    function extractDateTimeUnitFragments(timeunitText) {\n        var fragments = {};\n        var remainingText = timeunitText;\n        var match = PATTERN_TIME_UNIT.exec(remainingText);\n        while (match) {\n            collectDateTimeFragment(match, fragments);\n            remainingText = remainingText.substring(match[0].length);\n            match = PATTERN_TIME_UNIT.exec(remainingText);\n        }\n        return fragments;\n    };\n\n    function collectDateTimeFragment(match, fragments) {\n\n        var num = match[1].toLowerCase() ;\n        if (util.INTEGER_WORDS[num] !== undefined) {\n            num = util.INTEGER_WORDS[num];\n        } else if(num === 'a' || num === 'an'){\n            num = 1;\n        } else if (num.match(/few/)) {\n            num = 3;\n        } else if (num.match(/half/)) {\n            num = 0.5;\n        } else {\n            num = parseInt(num);\n        }\n\n        if (match[2].match(/hour/i)) {\n            fragments['hour'] = num;\n        } else if (match[2].match(/min/i)) {\n            fragments['minute'] = num;\n        } else if (match[2].match(/sec/i)) {\n            fragments['second'] = num;\n        } else if (match[2].match(/week/i)) {\n            fragments['week'] = num;\n        } else if (match[2].match(/day/i)) {\n            fragments['d'] = num;\n        } else if (match[2].match(/month/i)) {\n            fragments['month'] = num;\n        } else if (match[2].match(/year/i)) {\n            fragments['year'] = num;\n        }\n\n        return fragments;\n    }\n\n}\n","/*\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN  = new RegExp(\"(^|\\\\s|T)\" +\n    \"(?:(?:at|from)\\\\s*)??\" + \n    \"(\\\\d{1,4}|noon|midnight)\" + \n    \"(?:\" + \n        \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" + \n        \"(?:\" + \n            \"(?:\\\\:|\\\\：)(\\\\d{2})\" + \n        \")?\" + \n    \")?\" + \n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" + \n    \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" + \n    \"(\\\\-|\\\\–|\\\\~|\\\\〜|to|\\\\?)\\\\s*\" + \n    \"(\\\\d{1,4})\" +\n    \"(?:\" + \n        \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" + \n        \"(?:\" + \n            \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" + \n        \")?\" + \n    \")?\" + \n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" + \n    \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP    = 2;\nvar MINUTE_GROUP  = 3;\nvar SECOND_GROUP  = 4;\nvar AM_PM_HOUR_GROUP = 5;\n\n\nexports.Parser = function ENTimeExpressionParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return FIRST_REG_PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n        \n        // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n        var refMoment = moment(ref);\n        var result = new ParsedResult();\n        result.ref = ref;\n        result.index = match.index + match[1].length;\n        result.text  = match[0].substring(match[1].length);\n        result.tags['ENTimeExpressionParser'] = true;\n\n        result.start.imply('day',   refMoment.date());\n        result.start.imply('month', refMoment.month()+1);\n        result.start.imply('year',  refMoment.year());\n        \n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){ \n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.start.assign('second', second);\n        }\n        \n        // ----- Hours\n        if (match[HOUR_GROUP].toLowerCase() == \"noon\"){\n            meridiem = 1; \n            hour = 12;\n        } else if (match[HOUR_GROUP].toLowerCase() == \"midnight\") {\n            meridiem = 0; \n            hour = 0;\n        } else {\n            hour = parseInt(match[HOUR_GROUP]);\n        }\n        \n        // ----- Minutes\n        if(match[MINUTE_GROUP] != null){ \n            minute = parseInt(match[MINUTE_GROUP]);\n        } else if(hour > 100) { \n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        } \n        \n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) { \n            meridiem = 1;\n        }\n\n        // ----- AM & PM  \n        if(match[AM_PM_HOUR_GROUP] != null) {\n            if(hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if(ampm == \"a\"){\n                meridiem = 0; \n                if(hour == 12) hour = 0;\n            }\n            \n            if(ampm == \"p\"){\n                meridiem = 1; \n                if(hour != 12) hour += 12;\n            }\n        } \n\n        result.start.assign('hour', hour);\n        result.start.assign('minute', minute);\n\n        if (meridiem >= 0) {\n            result.start.assign('meridiem', meridiem);\n        } else {\n            if (hour < 12) {\n                result.start.imply('meridiem', 0);\n            } else {\n                result.start.imply('meridiem', 1);\n            }\n        }\n        \n        // ==============================================================\n        //                  Extracting the 'to' chunk\n        // ==============================================================\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n        if (!match) {\n            // Not accept number only result\n            if (result.text.match(/^\\d+$/)) { \n                return null;\n            }\n            return result;\n        }\n\n\n\n        // Pattern \"YY.YY -XXXX\" is more like timezone offset\n        if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n            return result;\n        }\n\n        if(result.end == null){\n            result.end = new ParsedComponents(null, result.start.date());\n        }\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){ \n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.end.assign('second', second);\n        }\n\n        hour = parseInt(match[2]);\n        \n        // ----- Minute\n        if (match[MINUTE_GROUP]!= null) {\n            \n            minute = parseInt(match[MINUTE_GROUP]);\n            if(minute >= 60) return result;\n            \n        } else if (hour > 100) {\n\n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        }\n\n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) { \n            meridiem = 1;\n        }\n        \n        // ----- AM & PM \n        if (match[AM_PM_HOUR_GROUP] != null){\n\n            if (hour > 12) return null;\n\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if(ampm == \"a\"){\n                meridiem = 0; \n                if(hour == 12) {\n                    hour = 0;\n                    if (!result.end.isCertain('day')) {\n                        result.end.imply('day', result.end.get('day') + 1);\n                    }\n                }\n            }\n            \n            if(ampm == \"p\"){\n                meridiem = 1; \n                if(hour != 12) hour += 12;\n            }\n            \n            if (!result.start.isCertain('meridiem')) {\n                if (meridiem == 0) {\n                    \n                    result.start.imply('meridiem', 0);\n                    \n                    if (result.start.get('hour') == 12) {\n                        result.start.assign('hour', 0);\n                    }\n\n                } else {\n\n                    result.start.imply('meridiem', 1);\n                    \n                    if (result.start.get('hour') != 12) {\n                        result.start.assign('hour', result.start.get('hour') + 12); \n                    }\n                }\n            }\n        }\n\n        result.text = result.text + match[0];\n        result.end.assign('hour', hour);\n        result.end.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.end.assign('meridiem', meridiem);\n        } else {\n            var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n            if (startAtPM && result.start.get('hour') > hour) {\n                // 10pm - 1 (am)\n                result.end.imply('meridiem', 0);\n\n            } else if (hour > 12) {\n                result.end.imply('meridiem', 1);\n            }\n        }\n\n        if (result.end.date().getTime() < result.start.date().getTime()) {\n            result.end.imply('day', result.end.get('day') + 1)\n        }\n        \n        return result;\n    }\n}\n","/*\n    Allows future dates according to 'days from now'\n    eg:\n    90 days from now\n    90 days forward\n    90 days out\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('' +\n    '(\\\\W|^)' +\n    '(?:within\\\\s*)?' +\n    '(' + util.INTEGER_WORDS_PATTERN + '|[0-9]+|an?(?:\\\\s*few)?|half(?:\\\\s*an?)?)\\\\s*' +\n    '(seconds?|min(?:ute)?s?|hours?|weeks?|days?|months?|years?)\\\\s*' +\n    '(?:from now|henceforth|forward|out)(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n    '(\\\\W|^)' +\n    '(?:within\\\\s*)?' +\n    '([0-9]+|an?)\\\\s*' +\n    '(seconds?|minutes?|hours?|days?)\\\\s*' +\n    'from now(?=(?:\\\\W|$))', 'i');\n\nexports.Parser = function ENTimeFromNowFormatParser() {\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode() ? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) {\n            return null;\n        }\n\n        var text = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n        index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var num = match[2].toLowerCase() ;\n        if (util.INTEGER_WORDS[num] !== undefined) {\n            num = util.INTEGER_WORDS[num];\n        } else if(num === 'a' || num === 'an'){\n            num = 1;\n        } else if (num.match(/few/)) {\n            num = 3;\n        } else if (num.match(/half/)) {\n            num = 0.5;\n        } else {\n            num = parseInt(num);\n        }\n\n        var date = moment(ref);\n\n        if (match[3].match(/hour|min|second/i)) {\n            if (match[3].match(/hour/i)) {\n\n                date.add(+num, 'hour');\n\n            } else if (match[3].match(/min/i)) {\n\n                date.add(+num, 'minute');\n\n            } else if (match[3].match(/second/i)) {\n\n                date.add(+num, 'second');\n            }\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n            result.start.assign('hour', date.hour());\n            result.start.assign('minute', date.minute());\n            result.start.assign('second', date.second());\n            result.tags['ENTimeFromNowFormatParser'] = true;\n            return result;\n        }\n\n        if (match[3].match(/week/i)) {\n            date.add(+num, 'week');\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n            result.start.imply('weekday', date.day());\n            return result;\n        }\n\n        if (match[3].match(/day/i)) {\n            date.add(+num, 'd');\n        }\n\n        if (match[3].match(/month/i)) {\n            date.add(+num, 'month');\n        }\n\n        if (match[3].match(/year/i)) {\n\n            date.add(+num, 'year');\n        }\n\n        result.start.assign('day', date.date());\n        result.start.assign('month', date.month() + 1);\n        result.start.assign('year', date.year());\n        return result;\n\n    };\n}\n","/*\n\n\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar DAYS_OFFSET = { 'sunday': 0, 'sun': 0, 'monday': 1, 'mon': 1,'tuesday': 2, 'tues':2, 'tue':2, 'wednesday': 3, 'wed': 3,\n    'thursday': 4, 'thurs':4, 'thur': 4, 'thu': 4,'friday': 5, 'fri': 5,'saturday': 6, 'sat': 6};\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:(?:\\\\,|\\\\(|\\\\（)\\\\s*)?' +\n    '(?:on\\\\s*?)?' +\n    '(?:(this|last|past|next)\\\\s*)?' +\n    '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n    '(?:\\\\s*(?:\\\\,|\\\\)|\\\\）))?' +\n    '(?:\\\\s*(this|last|past|next)\\\\s*week)?' +\n    '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\n\nexports.updateParsedComponent = function updateParsedComponent(result, ref, offset, modifier) {\n\n    var startMoment = moment(ref);\n    var startMomentFixed = false;\n    var refOffset = startMoment.day();\n\n    if(modifier == 'last' || modifier == 'past') {\n        startMoment.day(offset - 7);\n        startMomentFixed = true;\n    } else if(modifier == 'next') {\n        startMoment.day(offset + 7);\n        startMomentFixed = true;\n    } else if(modifier == 'this') {\n        startMoment.day(offset);\n    } else {\n        if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) {\n            startMoment.day(offset - 7);\n        } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) {\n            startMoment.day(offset + 7);\n        } else {\n            startMoment.day(offset);\n        }\n    }\n\n    result.start.assign('weekday', offset);\n    if (startMomentFixed) {\n        result.start.assign('day', startMoment.date());\n        result.start.assign('month', startMoment.month() + 1);\n        result.start.assign('year', startMoment.year());\n    } else {\n        result.start.imply('day', startMoment.date());\n        result.start.imply('month', startMoment.month() + 1);\n        result.start.imply('year', startMoment.year());\n    }\n\n    return result;\n};\n\n\nexports.Parser = function ENWeekdayParser() {\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; };\n\n    this.extract = function(text, ref, match, opt){\n        var index = match.index + match[1].length;\n        var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n        var offset = DAYS_OFFSET[dayOfWeek];\n        if(offset === undefined) {\n            return null;\n        }\n\n        var prefix = match[PREFIX_GROUP];\n        var postfix = match[POSTFIX_GROUP];\n        var norm = prefix || postfix;\n        norm = norm || '';\n        norm = norm.toLowerCase();\n\n        exports.updateParsedComponent(result, ref, offset, norm);\n        result.tags['ENWeekdayParser'] = true;\n\n        return result;\n    }\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)(now|today|tonight|last\\s*night|(?:tomorrow|tmr|yesterday)\\s*|tomorrow|tmr|yesterday)(?=\\W|$)/i;\n\nexports.Parser = function ENCasualDateParser(){\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n        var lowerText = text.toLowerCase();\n\n        if(lowerText == 'tonight'){\n            // Normally means this coming midnight\n            result.start.imply('hour', 22);\n            result.start.imply('meridiem', 1);\n\n        } else if (/^tomorrow|^tmr/.test(lowerText)) {\n\n            // Check not \"Tomorrow\" on late night\n            if(refMoment.hour() > 1) {\n                startMoment.add(1, 'day');\n            }\n\n        } else if (/^yesterday/.test(lowerText)) {\n\n            startMoment.add(-1, 'day');\n\n        } else if(lowerText.match(/last\\s*night/)) {\n\n            result.start.imply('hour', 0);\n            if (refMoment.hour() > 6) {\n                startMoment.add(-1, 'day');\n            }\n\n        } else if (lowerText.match(\"now\")) {\n\n          result.start.assign('hour', refMoment.hour());\n          result.start.assign('minute', refMoment.minute());\n          result.start.assign('second', refMoment.second());\n          result.start.assign('millisecond', refMoment.millisecond());\n\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags['ENCasualDateParser'] = true;\n        return result;\n    }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)((this)?\\s*(morning|afternoon|evening|noon))/i;\n\nvar TIME_MATCH = 4;\n\nexports.Parser = function ENCasualTimeParser(){\n\n    Parser.apply(this, arguments);\n\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        if(!match[TIME_MATCH]) TIME_MATCH = 3;\n\n        if (match[TIME_MATCH] == \"afternoon\") {\n\n            result.start.imply('hour', opt['afternoon'] ? opt['afternoon'] : 15);\n\n        } else if (match[TIME_MATCH] == \"evening\") {\n\n            result.start.imply('hour', opt['evening'] ? opt['evening'] : 18);\n\n        } else if (match[TIME_MATCH] == \"morning\") {\n\n            result.start.imply('hour', opt['morning'] ? opt['morning'] : 6);\n\n        } else if (match[TIME_MATCH] == \"noon\") {\n\n            result.start.imply('hour', opt['noon'] ? opt['noon'] : 12);\n        }\n\n        result.tags['ENCasualTimeParser'] = true;\n        return result;\n    };\n};\n","\n\n/**\n * to-hankaku.js\n * convert to ascii code strings.\n *\n * @version 1.0.1\n * @author think49\n * @url https://gist.github.com/964592\n * @license http://www.opensource.org/licenses/mit-license.php (The MIT License)\n */\n \nexports.toHankaku = (function (String, fromCharCode) {\n \n    function toHankaku (string) {\n        return String(string).replace(/\\u2019/g, '\\u0027').replace(/\\u201D/g, '\\u0022').replace(/\\u3000/g, '\\u0020').replace(/\\uFFE5/g, '\\u00A5').replace(/[\\uFF01\\uFF03-\\uFF06\\uFF08\\uFF09\\uFF0C-\\uFF19\\uFF1C-\\uFF1F\\uFF21-\\uFF3B\\uFF3D\\uFF3F\\uFF41-\\uFF5B\\uFF5D\\uFF5E]/g, alphaNum);\n    }\n \n    function alphaNum (token) {\n        return fromCharCode(token.charCodeAt(0) - 65248);\n    }\n \n    return toHankaku;\n})(String, String.fromCharCode);\n\n/**\n * to-zenkaku.js\n * convert to multi byte strings.\n *\n * @version 1.0.2\n * @author think49\n * @url https://gist.github.com/964592\n * @license http://www.opensource.org/licenses/mit-license.php (The MIT License)\n */\nexports.toZenkaku = (function (String, fromCharCode) {\n \n    function toZenkaku (string) {\n        return String(string).replace(/\\u0020/g, '\\u3000').replace(/\\u0022/g, '\\u201D').replace(/\\u0027/g, '\\u2019').replace(/\\u00A5/g, '\\uFFE5').replace(/[!#-&(),-9\\u003C-?A-[\\u005D_a-{}~]/g, alphaNum);\n    }\n \n    function alphaNum (token) {\n        return fromCharCode(token.charCodeAt(0) + 65248);\n    }\n \n    return toZenkaku;\n})(String, String.fromCharCode);","/*\n    \n    \n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util  = require('../../utils/JP'); \nvar PATTERN = /(?:(同|((昭和|平成)?([0-9０-９]{2,4})))年\\s*)?([0-9０-９]{1,2})月\\s*([0-9０-９]{1,2})日/i;\n  \nvar YEAR_GROUP        = 2;\nvar ERA_GROUP         = 3;\nvar YEAR_NUMBER_GROUP = 4;\nvar MONTH_GROUP       = 5;\nvar DAY_GROUP         = 6;\n\nexports.Parser = function JPStandardParser(){\n    Parser.apply(this, arguments);\n    \n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n\n        var startMoment = moment(ref);\n        var result = new ParsedResult({\n            text: match[0],\n            index: match.index,\n            ref: ref,\n        });\n        \n        var month = match[MONTH_GROUP];\n        month = util.toHankaku(month);\n        month = parseInt(month);\n\n        var day = match[DAY_GROUP];\n        day = util.toHankaku(day);\n        day = parseInt(day);\n\n        startMoment.set('date', day);\n        startMoment.set('month', month - 1);\n        result.start.assign('day', startMoment.date());\n        result.start.assign('month', startMoment.month() + 1);\n            \n        if (!match[YEAR_GROUP]) {\n            \n            //Find the most appropriated year\n            startMoment.year(moment(ref).year());\n            var nextYear = startMoment.clone().add(1, 'y');\n            var lastYear = startMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(startMoment.diff(moment(ref))) ){  \n                startMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(startMoment.diff(moment(ref))) ){ \n                startMoment = lastYear;\n            }\n\n            result.start.assign('day', startMoment.date());\n            result.start.assign('month', startMoment.month() + 1);\n            result.start.imply('year', startMoment.year());\n\n        } else if (match[YEAR_GROUP].match('同年')) {\n\n            result.start.assign('year', startMoment.year());\n\n        } else {\n            var year = match[YEAR_NUMBER_GROUP];\n            year = util.toHankaku(year);\n            year = parseInt(year);\n\n            if (match[ERA_GROUP] == '平成') {\n                year += 1988;\n            } else if (match[ERA_GROUP] == '昭和') {\n                year += 1925;\n            }\n\n            result.start.assign('year', year);\n        }\n        \n\n        result.tags['JPStandardParser'] = true;\n        return result;\n    };\n\n}\n\n","/*\n    \n    \n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i;\n\nexports.Parser = function JPCasualDateParser(){\n    \n    Parser.apply(this, arguments);\n        \n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n        \n        var index = match.index;\n        var text = match[0];\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n\n        if(text == '今夜' || text == '今夕' || text == '今晩'){\n            // Normally means this coming midnight \n            result.start.imply('hour', 22);\n            result.start.imply('meridiem', 1);\n\n        } else if(text == '明日'){\n\n            // Check not \"Tomorrow\" on late night\n            if(refMoment.hour() > 4) {\n                startMoment.add(1, 'day');\n            }\n\n        } else if(text == '昨日') {\n\n            startMoment.add(-1, 'day');\n\n        } else if (text.match(\"今朝\")) {\n\n            result.start.imply('hour', 6);\n            result.start.imply('meridiem', 0);\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags['JPCasualDateParser'] = true;\n        return result;\n    }\n}\n\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\n/*\n  Valid patterns:\n  - esta mañana -> today in the morning\n  - esta tarde -> today in the afternoon/evening\n  - esta noche -> tonight\n  - ayer por la mañana -> yesterday in the morning\n  - ayer por la tarde -> yesterday in the afternoon/evening\n  - ayer por la noche -> yesterday at night\n  - mañana por la mañana -> tomorrow in the morning\n  - mañana por la tarde -> tomorrow in the afternoon/evening\n  - mañana por la noche -> tomorrow at night\n  - anoche -> tomorrow at night\n  - hoy -> today\n  - ayer -> yesterday\n  - mañana -> tomorrow\n */\nvar PATTERN = /(\\W|^)(ahora|esta\\s*(mañana|tarde|noche)|(ayer|mañana)\\s*por\\s*la\\s*(mañana|tarde|noche)|hoy|mañana|ayer|anoche)(?=\\W|$)/i;\n\nexports.Parser = function ESCasualDateParser(){\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n        var lowerText = text.toLowerCase().replace(/\\s+/g, ' ');\n\n        if(lowerText == 'mañana'){\n\n            // Check not \"Tomorrow\" on late night\n            if(refMoment.hour() > 1) {\n                startMoment.add(1, 'day');\n            }\n\n        } else if(lowerText == 'ayer') {\n\n            startMoment.add(-1, 'day');\n        }\n        else if(lowerText == 'anoche') {\n\n            result.start.imply('hour', 0);\n            if (refMoment.hour() > 6) {\n                startMoment.add(-1, 'day');\n            }\n\n        } else if (lowerText.match(\"esta\")) {\n\n            var secondMatch = match[3].toLowerCase();\n            if (secondMatch == \"tarde\") {\n\n                result.start.imply('hour', 18);\n\n            } else if (secondMatch == \"mañana\") {\n\n                result.start.imply('hour', 6);\n\n            } else if (secondMatch == \"noche\") {\n\n              // Normally means this coming midnight\n              result.start.imply('hour', 22);\n              result.start.imply('meridiem', 1);\n\n            }\n        } else if (lowerText.match(/por\\s*la/)) {\n\n            var firstMatch = match[4].toLowerCase();\n            if (firstMatch === 'ayer') {\n\n              startMoment.add(-1, 'day');\n\n            } else if (firstMatch === 'mañana') {\n\n              startMoment.add(1, 'day');\n\n            }\n\n            var secondMatch = match[5].toLowerCase();\n            if (secondMatch == \"tarde\") {\n\n                result.start.imply('hour', 18);\n\n            } else if (secondMatch == \"mañana\") {\n\n                result.start.imply('hour', 9);\n\n            } else if (secondMatch == \"noche\") {\n\n              // Normally means this coming midnight\n              result.start.imply('hour', 22);\n              result.start.imply('meridiem', 1);\n\n            }\n\n        } else if (lowerText.match(\"ahora\")) {\n\n          result.start.imply('hour', refMoment.hour());\n          result.start.imply('minute', refMoment.minute());\n          result.start.imply('second', refMoment.second());\n          result.start.imply('millisecond', refMoment.millisecond());\n\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags['ESCasualDateParser'] = true;\n        return result;\n    }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)(dentro\\s*de|en)\\s*([0-9]+|medi[oa]|una?)\\s*(minutos?|horas?|d[ií]as?)\\s*(?=(?:\\W|$))/i;\n\nexports.Parser = function ESDeadlineFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var index = match.index + match[1].length;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var num = parseInt(match[3]);\n        if (isNaN(num)) {\n          if (match[3].match(/medi/)) {\n            num = 0.5;\n          } else {\n            num = 1;\n          }\n        }\n\n        var date = moment(ref);\n        if (match[4].match(/d[ií]a/)) {\n            date.add(num, 'd');\n\n            result.start.assign('year', date.year());\n            result.start.assign('month', date.month() + 1);\n            result.start.assign('day', date.date());\n            return result;\n        }\n\n\n        if (match[4].match(/hora/)) {\n\n            date.add(num, 'hour');\n\n        } else if (match[4].match(/minuto/)) {\n\n            date.add(num, 'minute');\n        }\n\n        result.start.imply('year', date.year());\n        result.start.imply('month', date.month() + 1);\n        result.start.imply('day', date.date());\n        result.start.assign('hour', date.hour());\n        result.start.assign('minute', date.minute());\n        result.tags['ESDeadlineFormatParser'] = true;\n        return result;\n    };\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)hace\\s*([0-9]+|medi[oa]|una?)\\s*(minutos?|horas?|semanas?|d[ií]as?|mes(es)?|años?)(?=(?:\\W|$))/i;\n\nexports.Parser = function ESTimeAgoFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    }\n\n    this.extract = function(text, ref, match, opt){\n\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n        var text = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n        index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var num = parseInt(match[2]);\n        if (isNaN(num)) {\n          if (match[2].match(/medi/)) {\n            num = 0.5;\n          } else {\n            num = 1;\n          }\n        }\n\n        var date = moment(ref);\n\n        if (match[3].match(/hora/) || match[3].match(/minuto/)) {\n            if (match[3].match(/hora/)) {\n\n                date.add(-num, 'hour');\n\n            } else if (match[3].match(/minuto/)) {\n\n                date.add(-num, 'minute');\n            }\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n            result.start.assign('hour', date.hour());\n            result.start.assign('minute', date.minute());\n            result.tags['ESTimeAgoFormatParser'] = true;\n            return result;\n        }\n\n        if (match[3].match(/semana/)) {\n            date.add(-num, 'week');\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n            result.start.imply('weekday', date.day());\n            return result;\n        }\n\n        if (match[3].match(/d[ií]a/)) {\n            date.add(-num, 'd');\n        }\n\n        if (match[3].match(/mes/)) {\n            date.add(-num, 'month');\n        }\n\n        if (match[3].match(/año/)) {\n\n            date.add(-num, 'year');\n        }\n\n        result.start.assign('day', date.date());\n        result.start.assign('month', date.month() + 1);\n        result.start.assign('year', date.year());\n        return result;\n\n    };\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN  = new RegExp(\"(^|\\\\s|T)\" +\n    \"(?:(?:a las?|al?|desde|de)\\\\s*)?\" +\n    \"(\\\\d{1,4}|mediod[ií]a|medianoche)\" +\n    \"(?:\" +\n        \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" +\n        \"(?:\" +\n            \"(?:\\\\:|\\\\：)(\\\\d{2})\" +\n        \")?\" +\n    \")?\" +\n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\n    \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" +\n    \"(\\\\-|\\\\–|\\\\~|\\\\〜|a(?:\\s*las)?|\\\\?)\\\\s*\" +\n    \"(\\\\d{1,4})\" +\n    \"(?:\" +\n        \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" +\n        \"(?:\" +\n            \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" +\n        \")?\" +\n    \")?\" +\n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\n    \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP    = 2;\nvar MINUTE_GROUP  = 3;\nvar SECOND_GROUP  = 4;\nvar AM_PM_HOUR_GROUP = 5;\n\nexports.Parser = function ESTimeExpressionParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return FIRST_REG_PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n        var refMoment = moment(ref);\n        var result = new ParsedResult();\n        result.ref = ref;\n        result.index = match.index + match[1].length;\n        result.text  = match[0].substring(match[1].length);\n        result.tags['ESTimeExpressionParser'] = true;\n\n        result.start.imply('day',   refMoment.date());\n        result.start.imply('month', refMoment.month()+1);\n        result.start.imply('year',  refMoment.year());\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){\n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.start.assign('second', second);\n        }\n\n        // ----- Hours\n        if (match[HOUR_GROUP].toLowerCase().match(/mediod/)){\n            meridiem = 1;\n            hour = 12;\n        } else if (match[HOUR_GROUP].toLowerCase() == \"medianoche\") {\n            meridiem = 0;\n            hour = 0;\n        } else {\n            hour = parseInt(match[HOUR_GROUP]);\n        }\n\n        // ----- Minutes\n        if(match[MINUTE_GROUP] != null){\n            minute = parseInt(match[MINUTE_GROUP]);\n        } else if(hour > 100) {\n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        }\n\n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) {\n            meridiem = 1;\n        }\n\n        // ----- AM & PM\n        if(match[AM_PM_HOUR_GROUP] != null) {\n            if(hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if(ampm == \"a\"){\n                meridiem = 0;\n                if(hour == 12) hour = 0;\n            }\n\n            if(ampm == \"p\"){\n                meridiem = 1;\n                if(hour != 12) hour += 12;\n            }\n        }\n        result.start.assign('hour', hour);\n        result.start.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.start.assign('meridiem', meridiem);\n        }\n\n        // ==============================================================\n        //                  Extracting the 'to' chunk\n        // ==============================================================\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n        if (!match) {\n            // Not accept number only result\n            if (result.text.match(/^\\d+$/)) {\n                return null;\n            }\n            return result;\n        }\n\n\n\n        // Pattern \"YY.YY -XXXX\" is more like timezone offset\n        if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n            return result;\n        }\n\n        if(result.end == null){\n            result.end = new ParsedComponents(null, result.start.date());\n        }\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){\n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.end.assign('second', second);\n        }\n\n        hour = parseInt(match[2]);\n\n        // ----- Minute\n        if (match[MINUTE_GROUP]!= null) {\n\n            minute = parseInt(match[MINUTE_GROUP]);\n            if(minute >= 60) return result;\n\n        } else if (hour > 100) {\n\n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        }\n\n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) {\n            meridiem = 1;\n        }\n\n        // ----- AM & PM\n        if (match[AM_PM_HOUR_GROUP] != null){\n\n            if (hour > 12) return null;\n\n            if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"a\"){\n                meridiem = 0;\n                if(hour == 12) {\n                    hour = 0;\n                    if (!result.end.isCertain('day')) {\n                        result.end.imply('day', result.end.get('day') + 1);\n                    }\n                }\n            }\n\n            if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"p\"){\n                meridiem = 1;\n                if(hour != 12) hour += 12;\n            }\n\n            if (!result.start.isCertain('meridiem')) {\n                if (meridiem == 0) {\n\n                    result.start.imply('meridiem', 0);\n\n                    if (result.start.get('hour') == 12) {\n                        result.start.assign('hour', 0);\n                    }\n\n                } else {\n\n                    result.start.imply('meridiem', 1);\n\n                    if (result.start.get('hour') != 12) {\n                        result.start.assign('hour', result.start.get('hour') + 12);\n                    }\n                }\n            }\n\n        } else if(hour >= 12) {\n            meridiem = 1;\n        }\n\n        result.text = result.text + match[0];\n        result.end.assign('hour', hour);\n        result.end.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.end.assign('meridiem', meridiem);\n        }\n\n        if (result.end.date().getTime() < result.start.date().getTime()) {\n            result.end.imply('day', result.end.get('day') + 1)\n        }\n\n        return result;\n    }\n}\n","/*\n\n\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar updateParsedComponent = require('../EN/ENWeekdayParser').updateParsedComponent;\n\nvar DAYS_OFFSET = { 'domingo': 0, 'dom': 0, 'lunes': 1, 'lun': 1, 'martes': 2, 'mar':2, 'miercoles': 3, 'miércoles': 3, 'mie': 3,\n    'jueves': 4, 'jue': 4, 'viernes': 5, 'vier': 5, 'sabado': 6, 'sábado': 6, 'sab': 6,}\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:(?:\\\\,|\\\\(|\\\\（)\\\\s*)?' +\n    '(?:(este|pasado|pr[oó]ximo)\\\\s*)?' +\n    '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n    '(?:\\\\s*(?:\\\\,|\\\\)|\\\\）))?' +\n    '(?:\\\\s*(este|pasado|pr[óo]ximo)\\\\s*week)?' +\n    '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\nexports.Parser = function ESWeekdayParser() {\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n        var index = match.index + match[1].length;\n        var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n        var offset = DAYS_OFFSET[dayOfWeek];\n        if(offset === undefined) return null;\n\n        var modifier = null;\n        var prefix = match[PREFIX_GROUP];\n        var postfix = match[POSTFIX_GROUP];\n        if (prefix || postfix) {\n            var norm = prefix || postfix;\n            norm = norm.toLowerCase();\n\n            if(norm == 'pasado') {\n                modifier = 'this';\n            }\n            else if(norm == 'próximo' || norm == 'proximo') {\n                modifier = 'next';\n            }\n            else if(norm== 'este') {\n                modifier =  'this';\n            }\n        }\n\n        updateParsedComponent(result, ref, offset, modifier);\n        result.tags['ESWeekdayParser'] = true;\n        return result;\n    }\n}\n","exports.WEEKDAY_OFFSET = {\n    'domingo': 0,\n    'dom': 0,\n    'lunes': 1,\n    'lun': 1,\n    'martes': 2,\n    'mar':2,\n    'miércoles': 3,\n    'miercoles': 3,\n    'mie': 3,\n    'jueves': 4,\n    'jue': 4,\n    'viernes': 5,\n    'vie': 5,\n    'sábado': 6,\n    'sabado': 6,\n    'sab': 6,}\n\nexports.MONTH_OFFSET = {\n    'enero': 1,\n    'ene': 1,\n    'ene.': 1,\n    'febrero': 2,\n    'feb': 2,\n    'feb.': 2,\n    'marzo': 3,\n    'mar': 3,\n    'mar.': 3,\n    'abril': 4,\n    'abr': 4,\n    'abr.': 4,\n    'mayo': 5,\n    'may': 5,\n    'may.': 5,\n    'junio': 6,\n    'jun': 6,\n    'jun.': 6,\n    'julio': 7,\n    'jul': 7,\n    'jul.': 7,\n    'agosto': 8,\n    'ago': 8,\n    'ago.': 8,\n    'septiembre': 9,\n    'sep': 9,\n    'sept': 9,\n    'sep.': 9,\n    'sept.': 9,\n    'octubre': 10,\n    'oct': 10,\n    'oct.': 10,\n    'noviembre': 11,\n    'nov': 11,\n    'nov.': 11,\n    'diciembre': 12,\n    'dic': 12,\n    'dic.': 12,\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util  = require('../../utils/ES');\n\nvar DAYS_OFFSET = util.WEEKDAY_OFFSET;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n        '(?:(Domingo|Lunes|Martes|Miércoles|Miercoles|Jueves|Viernes|Sábado|Sabado|Dom|Lun|Mar|Mie|Jue|Vie|Sab)\\\\s*,?\\\\s*)?' +\n        '([0-9]{1,2})(?:º|ª|°)?' +\n        '(?:\\\\s*(?:desde|de|\\\\-|\\\\–|al?|hasta|\\\\s)\\\\s*([0-9]{1,2})(?:º|ª|°)?)?\\\\s*(?:de)?\\\\s*' +\n        '(Ene(?:ro|\\\\.)?|Feb(?:rero|\\\\.)?|Mar(?:zo|\\\\.)?|Abr(?:il|\\\\.)?|May(?:o|\\\\.)?|Jun(?:io|\\\\.)?|Jul(?:io|\\\\.)?|Ago(?:sto|\\\\.)?|Sep(?:tiembre|\\\\.)?|Oct(?:ubre|\\\\.)?|Nov(?:iembre|\\\\.)?|Dic(?:iembre|\\\\.)?)' +\n        '(?:\\\\s*(?:del?)?(\\\\s*[0-9]{1,4}(?![^\\\\s]\\\\d))(\\\\s*[ad]\\\\.?\\\\s*c\\\\.?|a\\\\.?\\\\s*d\\\\.?)?)?' +\n        '(?=\\\\W|$)', 'i'\n    );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_TO_GROUP = 4;\nvar MONTH_NAME_GROUP = 5;\nvar YEAR_GROUP = 6;\nvar YEAR_BE_GROUP = 7;\n\nexports.Parser = function ESMonthNameLittleEndianParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = match[DATE_GROUP];\n        day = parseInt(day);\n\n        var year = null;\n        if (match[YEAR_GROUP]) {\n            year = match[YEAR_GROUP];\n            year = parseInt(year);\n\n            if(match[YEAR_BE_GROUP]){\n                if (/a\\.?\\s*c\\.?/i.test(match[YEAR_BE_GROUP])) {\n                    // antes de Cristo\n                    year = -year;\n                }\n            } else if (year < 100){\n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n\n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n            refMoment.year(moment(ref).year());\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = lastYear;\n            }\n\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        // Weekday component\n        if (match[WEEKDAY_GROUP]) {\n            var weekday = match[WEEKDAY_GROUP];\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n            result.start.assign('weekday', weekday);\n        }\n\n        // Text can be 'range' value. Such as '12 - 13 January 2012'\n        if (match[DATE_TO_GROUP]) {\n            result.end = result.start.clone();\n            result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\n        }\n\n        result.tags['ESMonthNameLittleEndianParser'] = true;\n        return result;\n    };\n}","/*\n    Date format with slash \"/\" (also \"-\" and \".\") between numbers\n    - Martes 3/11/2015\n    - 3/11/2015\n    - 3/11\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:' +\n        '((?:domingo|dom|lunes|lun|martes|mar|mi[ée]rcoles|mie|jueves|jue|viernes|vie|s[áa]bado|sab))' +\n        '\\\\s*\\\\,?\\\\s*' +\n    ')?' +\n    '([0-1]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n    '(?:' +\n        '[\\\\/\\\\.\\\\-]' +\n        '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n    ')?' +\n    '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = { 'domingo': 0, 'dom': 0, 'lunes': 1, 'lun': 1, 'martes': 2, 'mar': 2, 'miercoles': 3, 'miércoles': 3, 'mie': 3,\n    'jueves': 4, 'jue': 4, 'viernes': 5, 'vier': 5, 'sábado': 6, 'sabado': 6, 'sab': 6,}\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\n// in Spanish we use day/month/year\nvar WEEKDAY_GROUP = 2;\nvar MONTH_GROUP = 4;\nvar DAY_GROUP = 3;\nvar YEAR_GROUP = 5;\n\nexports.Parser = function ESSlashDateFormatParser(argument) {\n    Parser.apply(this, arguments);\n\n    this.pattern = function () { return PATTERN; };\n    this.extract = function(text, ref, match, opt){\n\n        if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n            // Long skip, if there is some overlapping like:\n            // XX[/YY/ZZ]\n            // [XX/YY/]ZZ\n            match.index += match[0].length\n            return;\n        }\n\n        var index = match.index + match[OPENNING_GROUP].length;\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        });\n\n        if(text.match(/^\\d\\.\\d$/)) return;\n        if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n        // MM/dd -> OK\n        // MM.dd -> NG\n        if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n        var date = null;\n        var year = match[YEAR_GROUP] || moment(ref).year() + '';\n        var month = match[MONTH_GROUP];\n        var day   = match[DAY_GROUP];\n\n        month = parseInt(month);\n        day  = parseInt(day);\n        year = parseInt(year);\n\n        if(month < 1 || month > 12) {\n            if(month > 12) {\n                // dd/mm/yyyy date format if day looks like a month, and month\n                // looks like a day.\n                if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\n                    // unambiguous\n                    var tday = month;\n                    month = day;\n                    day = tday;\n                }\n                else {\n                    // both month and day are <= 12\n                    return null;\n                }\n            }\n        }\n        if(day < 1 || day > 31) return null;\n\n        if(year < 100){\n            if(year > 50){\n                year = year + 1900;\n            }else{\n                year = year + 2000;\n            }\n        }\n\n        result.start.assign('day', day);\n        result.start.assign('month', month);\n        result.start.assign('year', year);\n\n        //Day of week\n        if(match[WEEKDAY_GROUP]) {\n            result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n        }\n\n        result.tags['ESSlashDateFormatParser'] = true;\n        return result;\n    };\n};","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = /(\\W|^)(maintenant|aujourd'hui|ajd|cette\\s*nuit|la\\s*veille|(demain|hier)(\\s*(matin|soir|aprem|après-midi))?|ce\\s*(matin|soir)|cet\\s*(après-midi|aprem))(?=\\W|$)/i;\r\n\r\nexports.Parser = function FRCasualDateParser(){\r\n\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() { return PATTERN; }\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        var text = match[0].substr(match[1].length);\r\n        var index = match.index + match[1].length;\r\n        var result = new ParsedResult({\r\n            index: index,\r\n            text: text,\r\n            ref: ref,\r\n        });\r\n\r\n        var refMoment = moment(ref);\r\n        var startMoment = refMoment.clone();\r\n        var lowerText = text.toLowerCase();\r\n\r\n        if(lowerText.match(/demain/)){\r\n            // Check not \"Tomorrow\" on late night\r\n            if(refMoment.hour() > 1) {\r\n                startMoment.add(1, 'day');\r\n            }\r\n        } \r\n\r\n        if(lowerText.match(/hier/)) {\r\n            startMoment.add(-1, 'day');\r\n        }\r\n\r\n        if(lowerText.match(/cette\\s*nuit/)){\r\n            // Normally means this coming midnight\r\n            result.start.imply('hour', 22);\r\n            result.start.imply('meridiem', 1);\r\n\r\n        } else if(lowerText.match(/la\\s*veille/)) {\r\n\r\n            result.start.imply('hour', 0);\r\n            if (refMoment.hour() > 6) {\r\n                startMoment.add(-1, 'day');\r\n            }\r\n\r\n        } else if (lowerText.match(/(après-midi|aprem)/)) {\r\n\r\n            result.start.imply('hour', 14);\r\n\r\n        } else if (lowerText.match(/(soir)/)) {\r\n\r\n            result.start.imply('hour', 18);\r\n\r\n        } else if (lowerText.match(/matin/)) {\r\n\r\n            result.start.imply('hour', 8);\r\n\r\n        }  else if (lowerText.match(\"maintenant\")) {\r\n\r\n          result.start.imply('hour', refMoment.hour());\r\n          result.start.imply('minute', refMoment.minute());\r\n          result.start.imply('second', refMoment.second());\r\n          result.start.imply('millisecond', refMoment.millisecond());\r\n\r\n        }\r\n\r\n        result.start.assign('day', startMoment.date())\r\n        result.start.assign('month', startMoment.month() + 1)\r\n        result.start.assign('year', startMoment.year())\r\n        result.tags['FRCasualDateParser'] = true;\r\n        return result;\r\n    }\r\n}\r\n","exports.WEEKDAY_OFFSET = { \r\n    'dimanche': 0, \r\n    'dim': 0, \r\n    'lundi': 1, \r\n    'lun': 1,\r\n    'mardi': 2, \r\n    'mar':2, \r\n    'mercredi': 3, \r\n    'mer': 3, \r\n    'jeudi': 4, \r\n    'jeu': 4, \r\n    'vendredi': 5, \r\n    'ven': 5,\r\n    'samedi': 6, \r\n    'sam': 6\r\n};\r\n    \r\nexports.MONTH_OFFSET = { \r\n    'janvier': 1,\r\n    'jan': 1,\r\n    'jan.': 1,\r\n    'février': 2,\r\n    'fév': 2,\r\n    'fév.': 2,\r\n    'fevrier': 2,\r\n    'fev': 2,\r\n    'fev.': 2,\r\n    'mars': 3,\r\n    'mar': 3,\r\n    'mar.': 3,\r\n    'avril': 4,\r\n    'avr': 4,\r\n    'avr.': 4,\r\n    'mai': 5,\r\n    'juin': 6,\r\n    'jun': 6,\r\n    'juillet': 7,\r\n    'jul': 7,\r\n    'jul.': 7,\r\n    'août': 8,\r\n    'aout': 8,\r\n    'septembre': 9,\r\n    'sep': 9,\r\n    'sep.': 9,\r\n    'sept': 9,\r\n    'sept.': 9,\r\n    'octobre': 10,\r\n    'oct': 10,\r\n    'oct.': 10,\r\n    'novembre': 11,\r\n    'nov': 11,\r\n    'nov.': 11,\r\n    'décembre': 12,\r\n    'decembre': 12,\r\n    'dec': 12,\r\n    'dec.': 12\r\n};\r\n\r\nexports.INTEGER_WORDS_PATTERN = '(?:un|deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize)';\r\nexports.INTEGER_WORDS = {\r\n    'un' : 1,\r\n    'deux' : 2,\r\n    'trois' : 3,\r\n    'quatre' : 4,\r\n    'cinq' : 5,\r\n    'six' : 6,\r\n    'sept' : 7,\r\n    'huit' : 8,\r\n    'neuf' : 9,\r\n    'dix' : 10,\r\n    'onze' : 11,\r\n    'douze' : 12,\r\n    'treize' : 13,\r\n};\r\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar util  = require('../../utils/FR');\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n    '(dans|en)\\\\s*' +\r\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|une?|(?:\\\\s*quelques)?|demi(?:\\\\s*|-?)?)\\\\s*' +\r\n    '(secondes?|min(?:ute)?s?|heures?|jours?|semaines?|mois|années?)\\\\s*' +\r\n    '(?=\\\\W|$)', 'i'\r\n);\r\n\r\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\r\n    '(dans|en)\\\\s*' +\r\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|un?)\\\\s*' +\r\n    '(secondes?|minutes?|heures?|jours?)\\\\s*' +\r\n    '(?=\\\\W|$)', 'i'\r\n);\r\n\r\nexports.Parser = function FRDeadlineFormatParser(){\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() {\r\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\r\n    };\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        var index = match.index + match[1].length;\r\n        var text  = match[0];\r\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n\r\n        var result = new ParsedResult({\r\n            index: index,\r\n            text: text,\r\n            ref: ref\r\n        });\r\n\r\n        var num = match[3];\r\n        if (util.INTEGER_WORDS[num] !== undefined) {\r\n            num = util.INTEGER_WORDS[num];\r\n        } else if (num === 'un' || num === 'une'){\r\n            num = 1;\r\n        } else if (num.match(/quelques?/i)){\r\n            num = 3;\r\n        } else if (num.match(/demi-?/i)) {\r\n            num = 0.5;\r\n        } else {\r\n            num = parseInt(num);\r\n        }\r\n\r\n        var date = moment(ref);\r\n        if (match[4].match(/jour|semaine|mois|année/i)) {\r\n\r\n            if (match[4].match(/jour/)) {\r\n                date.add(num, 'd');\r\n            } else if (match[4].match(/semaine/i)) {\r\n                date.add(num * 7, 'd');\r\n            } else if (match[4].match(/mois/i)) {\r\n                date.add(num, 'month');\r\n            } else if (match[4].match(/année/i)) {\r\n                date.add(num, 'year');\r\n            }\r\n\r\n            result.start.assign('year', date.year());\r\n            result.start.assign('month', date.month() + 1);\r\n            result.start.assign('day', date.date());\r\n            return result;\r\n        }\r\n\r\n        if (match[4].match(/heure/i)) {\r\n\r\n            date.add(num, 'hour');\r\n\r\n        } else if (match[4].match(/min/i)) {\r\n\r\n            date.add(num, 'minutes');\r\n\r\n        } else if (match[4].match(/secondes/i)) {\r\n\r\n            date.add(num, 'second');\r\n        }\r\n\r\n        result.start.imply('year', date.year());\r\n        result.start.imply('month', date.month() + 1);\r\n        result.start.imply('day', date.date());\r\n        result.start.assign('hour', date.hour());\r\n        result.start.assign('minute', date.minute());\r\n        result.start.assign('second', date.second());\r\n        result.tags['FRDeadlineFormatParser'] = true;\r\n        return result;\r\n    };\r\n};\r\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\n\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar util  = require('../../utils/FR');\r\n\r\nvar DAYS_OFFSET = util.WEEKDAY_OFFSET;\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n        '(?:(Dimanche|Lundi|Mardi|mercredi|Jeudi|Vendredi|Samedi|Dim|Lun|Mar|Mer|Jeu|Ven|Sam)\\\\s*,?\\\\s*)?' +\r\n        '([0-9]{1,2}|1er)' +\r\n        '(?:\\\\s*(?:au|\\\\-|\\\\–|jusqu\\'au?|\\\\s)\\\\s*([0-9]{1,2})(?:er)?)?\\\\s*(?:de)?\\\\s*' +\r\n        '(Jan(?:vier|\\\\.)?|F[ée]v(?:rier|\\\\.)?|Mars|Avr(?:il|\\\\.)?|Mai|Juin|Juil(?:let|\\\\.)?|Ao[uû]t|Sept(?:embre|\\\\.)?|Oct(?:obre|\\\\.)?|Nov(?:embre|\\\\.)?|d[ée]c(?:embre|\\\\.)?)' +\r\n        '(?:\\\\s*(\\\\s*[0-9]{1,4}(?![^\\\\s]\\\\d))(?:\\\\s*(AC|[ap]\\\\.?\\\\s*c(?:h(?:r)?)?\\\\.?\\\\s*n\\\\.?))?)?' +\r\n        '(?=\\\\W|$)', 'i'\r\n    );\r\n\r\nvar WEEKDAY_GROUP = 2;\r\nvar DATE_GROUP = 3;\r\nvar DATE_TO_GROUP = 4;\r\nvar MONTH_NAME_GROUP = 5;\r\nvar YEAR_GROUP = 6;\r\nvar YEAR_BE_GROUP = 7;\r\n\r\nexports.Parser = function FRMonthNameLittleEndianParser(){\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() { return PATTERN; }\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        var result = new ParsedResult({\r\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\r\n            index: match.index + match[1].length,\r\n            ref: ref,\r\n        });\r\n\r\n        var month = match[MONTH_NAME_GROUP];\r\n        month = util.MONTH_OFFSET[month.toLowerCase()];\r\n\r\n        var day = match[DATE_GROUP];\r\n        day = parseInt(day);\r\n\r\n        var year = null;\r\n        if (match[YEAR_GROUP]) {\r\n            year = match[YEAR_GROUP];\r\n            year = parseInt(year);\r\n\r\n            if(match[YEAR_BE_GROUP]){\r\n                if (/a/i.test(match[YEAR_BE_GROUP])) {\r\n                    // Ante Christe natum\r\n                    year = -year;\r\n                }\r\n            } else if (year < 100){\r\n\r\n                year = year + 2000;\r\n            }\r\n        }\r\n\r\n        if(year){\r\n            result.start.assign('day', day);\r\n            result.start.assign('month', month);\r\n            result.start.assign('year', year);\r\n        } else {\r\n\r\n            // Find the most appropriated year\r\n            var refMoment = moment(ref);\r\n            refMoment.month(month - 1);\r\n            refMoment.date(day);\r\n            refMoment.year(moment(ref).year());\r\n\r\n            var nextYear = refMoment.clone().add(1, 'y');\r\n            var lastYear = refMoment.clone().add(-1, 'y');\r\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\r\n                refMoment = nextYear;\r\n            }\r\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\r\n                refMoment = lastYear;\r\n            }\r\n\r\n            result.start.assign('day', day);\r\n            result.start.assign('month', month);\r\n            result.start.imply('year', refMoment.year());\r\n        }\r\n\r\n        // Weekday component\r\n        if (match[WEEKDAY_GROUP]) {\r\n            var weekday = match[WEEKDAY_GROUP];\r\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\r\n            result.start.assign('weekday', weekday);\r\n        }\r\n\r\n        // Text can be 'range' value. Such as '12 - 13 janvier 2012'\r\n        if (match[DATE_TO_GROUP]) {\r\n            result.end = result.start.clone();\r\n            result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\r\n        }\r\n\r\n        result.tags['FRMonthNameLittleEndianParser'] = true;\r\n        return result;\r\n    };\r\n}\r\n","/*\r\n    Date format with slash \"/\" (also \"-\" and \".\") between numbers\r\n    - Martes 3/11/2015\r\n    - 3/11/2015\r\n    - 3/11\r\n*/\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n    '(?:' +\r\n        '((?:dimanche|dim|lundi|lun|mardi|mar|mercredi|mer|jeudi|jeu|vendredi|ven|samedi|sam|le))' +\r\n        '\\\\s*\\\\,?\\\\s*' +\r\n    ')?' +\r\n    '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\r\n    '(?:' +\r\n        '[\\\\/\\\\.\\\\-]' +\r\n        '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\r\n    ')?' +\r\n    '(\\\\W|$)', 'i');\r\n\r\nvar DAYS_OFFSET = { 'dimanche': 0, 'dim': 0, 'lundi': 1, 'lun': 1,'mardi': 2, 'mar':2, 'mercredi': 3, 'mer': 3,\r\n    'jeudi': 4, 'jeu':4, 'vendredi': 5, 'ven': 5,'samedi': 6, 'sam': 6};\r\n\r\n\r\nvar OPENNING_GROUP = 1;\r\nvar ENDING_GROUP = 6;\r\n\r\n// In French we use day/month/year\r\nvar WEEKDAY_GROUP = 2;\r\nvar DAY_GROUP = 3;\r\nvar MONTH_GROUP = 4;\r\nvar YEAR_GROUP = 5;\r\n\r\nexports.Parser = function FRSlashDateFormatParser(argument) {\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function () { return PATTERN; };\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\r\n            // Long skip, if there is some overlapping like:\r\n            // XX[/YY/ZZ]\r\n            // [XX/YY/]ZZ\r\n            match.index += match[0].length\r\n            return;\r\n        }\r\n\r\n        var index = match.index + match[OPENNING_GROUP].length;\r\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\r\n\r\n\r\n        var result = new ParsedResult({\r\n            text: text,\r\n            index: index,\r\n            ref: ref,\r\n        });\r\n\r\n        if(text.match(/^\\d\\.\\d$/)) return;\r\n        if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\r\n\r\n        // MM/dd -> OK\r\n        // MM.dd -> NG\r\n        if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\r\n\r\n        var date = null;\r\n        var year = match[YEAR_GROUP] || moment(ref).year() + '';\r\n        var month = match[MONTH_GROUP];\r\n        var day   = match[DAY_GROUP];\r\n\r\n        day  = parseInt(day);\r\n        month = parseInt(month);\r\n        year = parseInt(year);\r\n\r\n        if(month < 1 || month > 12) {\r\n            if(month > 12) {\r\n                // dd/mm/yyyy date format if day looks like a month, and month looks like a day.\r\n                if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\r\n                    // unambiguous\r\n                    var tday = month;\r\n                    month = day;\r\n                    day = tday;\r\n                }\r\n                else {\r\n                    // both month and day are <= 12\r\n                    return null;\r\n                }\r\n            }\r\n        }\r\n        if(day < 1 || day > 31) return null;\r\n\r\n        if(year < 100){\r\n            if(year > 50){\r\n                year = year + 1900;\r\n            }else{\r\n                year = year + 2000;\r\n            }\r\n        }\r\n\r\n        result.start.assign('day', day);\r\n        result.start.assign('month', month);\r\n        result.start.assign('year', year);\r\n\r\n        // Day of week\r\n        if(match[WEEKDAY_GROUP]) {\r\n            result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\r\n        }\r\n\r\n        result.tags['FRSlashDateFormatParser'] = true;\r\n        return result;\r\n    };\r\n};","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = /(\\W|^)il y a\\s*([0-9]+|une?)\\s*(minutes?|heures?|semaines?|jours?|mois|années?|ans?)(?=(?:\\W|$))/i;\r\n\r\nexports.Parser = function FRTimeAgoFormatParser(){\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() {\r\n        return PATTERN;\r\n    }\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\r\n\r\n        var text = match[0];\r\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n        index = match.index + match[1].length;\r\n\r\n        var result = new ParsedResult({\r\n            index: index,\r\n            text: text,\r\n            ref: ref,\r\n        });\r\n        result.tags['FRTimeAgoFormatParser'] = true;\r\n        \r\n        var num = parseInt(match[2]);\r\n        if (isNaN(num)) {\r\n          if (match[2].match(/demi/)) {\r\n            num = 0.5;\r\n          } else {\r\n            num = 1;\r\n          }\r\n        }\r\n\r\n        var date = moment(ref);\r\n\r\n        if (match[3].match(/heure/) || match[3].match(/minute/)) {\r\n            if (match[3].match(/heure/)) {\r\n\r\n                date.add(-num, 'hour');\r\n\r\n            } else if (match[3].match(/minute/)) {\r\n\r\n                date.add(-num, 'minute');\r\n            }\r\n\r\n            result.start.imply('day', date.date());\r\n            result.start.imply('month', date.month() + 1);\r\n            result.start.imply('year', date.year());\r\n            result.start.assign('hour', date.hour());\r\n            result.start.assign('minute', date.minute());\r\n\r\n            return result;\r\n        }\r\n\r\n        if (match[3].match(/semaine/)) {\r\n            date.add(-num, 'week');\r\n\r\n            result.start.imply('day', date.date());\r\n            result.start.imply('month', date.month() + 1);\r\n            result.start.imply('year', date.year());\r\n            result.start.imply('weekday', date.day());\r\n            return result;\r\n        }\r\n\r\n        if (match[3].match(/jour/)) {\r\n            date.add(-num, 'd');\r\n        }\r\n\r\n        if (match[3].match(/mois/)) {\r\n            date.add(-num, 'month');\r\n        }\r\n\r\n        if (match[3].match(/années?|ans?/)) {\r\n\r\n            date.add(-num, 'year');\r\n        }\r\n\r\n        result.start.assign('day', date.date());\r\n        result.start.assign('month', date.month() + 1);\r\n        result.start.assign('year', date.year());\r\n        return result;\r\n\r\n    };\r\n}\r\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar ParsedComponents = require('../../result').ParsedComponents;\r\n\r\nvar FIRST_REG_PATTERN  = new RegExp(\"(^|\\\\s|T)\" +\r\n    \"(?:(?:[àa])\\\\s*)?\" +\r\n    \"(\\\\d{1,2}(?:h)?|midi|minuit)\" +\r\n    \"(?:\" +\r\n        \"(?:\\\\.|\\\\:|\\\\：|h)(\\\\d{1,2})(?:m)?\" +\r\n        \"(?:\" +\r\n            \"(?:\\\\:|\\\\：|m)(\\\\d{0,2})(?:s)?\" +\r\n        \")?\" +\r\n    \")?\" +\r\n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\r\n    \"(?=\\\\W|$)\", 'i');\r\n\r\n\r\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" +\r\n    \"(\\\\-|\\\\–|\\\\~|\\\\〜|[àa]|\\\\?)\\\\s*\" +\r\n    \"(\\\\d{1,2}(?:h)?)\" +\r\n    \"(?:\" +\r\n        \"(?:\\\\.|\\\\:|\\\\：|h)(\\\\d{1,2})(?:m)?\" +\r\n        \"(?:\" +\r\n            \"(?:\\\\.|\\\\:|\\\\：|m)(\\\\d{1,2})(?:s)?\" +\r\n        \")?\" +\r\n    \")?\" +\r\n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\r\n    \"(?=\\\\W|$)\", 'i');\r\n\r\nvar HOUR_GROUP    = 2;\r\nvar MINUTE_GROUP  = 3;\r\nvar SECOND_GROUP  = 4;\r\nvar AM_PM_HOUR_GROUP = 5;\r\n\r\nexports.Parser = function FRTimeExpressionParser(){\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() { return FIRST_REG_PATTERN; }\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        // This pattern can be overlaped Ex. [12] AM, 1[2] AM\r\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\r\n        var refMoment = moment(ref);\r\n        var result = new ParsedResult();\r\n        result.ref = ref;\r\n        result.index = match.index + match[1].length;\r\n        result.text  = match[0].substring(match[1].length);\r\n        result.tags['FRTimeExpressionParser'] = true;\r\n\r\n        result.start.imply('day',   refMoment.date());\r\n        result.start.imply('month', refMoment.month()+1);\r\n        result.start.imply('year',  refMoment.year());\r\n\r\n        var hour = 0;\r\n        var minute = 0;\r\n        var meridiem = -1;\r\n\r\n        // ----- Second\r\n        if(match[SECOND_GROUP] != null){\r\n            var second = parseInt(match[SECOND_GROUP]);\r\n            if(second >= 60) return null;\r\n\r\n            result.start.assign('second', second);\r\n        }\r\n\r\n        // ----- Hours\r\n        if (match[HOUR_GROUP].toLowerCase() == \"midi\"){\r\n            meridiem = 1;\r\n            hour = 12;\r\n        } else if (match[HOUR_GROUP].toLowerCase() == \"minuit\") {\r\n            meridiem = 0;\r\n            hour = 0;\r\n        } else {\r\n            hour = parseInt(match[HOUR_GROUP]);\r\n        }\r\n\r\n        // ----- Minutes\r\n        if(match[MINUTE_GROUP] != null){\r\n            minute = parseInt(match[MINUTE_GROUP]);\r\n        } else if(hour > 100) {\r\n            minute = hour%100;\r\n            hour   = parseInt(hour/100);\r\n        }\r\n\r\n        if(minute >= 60) {\r\n            return null;\r\n        }\r\n\r\n        if(hour > 24) {\r\n            return null;\r\n        }\r\n        if (hour >= 12) {\r\n            meridiem = 1;\r\n        }\r\n\r\n        // ----- AM & PM\r\n        if(match[AM_PM_HOUR_GROUP] != null) {\r\n            if(hour > 12) return null;\r\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\r\n            if(ampm == \"a\"){\r\n                meridiem = 0;\r\n                if(hour == 12) hour = 0;\r\n            }\r\n\r\n            if(ampm == \"p\"){\r\n                meridiem = 1;\r\n                if(hour != 12) hour += 12;\r\n            }\r\n        }\r\n        result.start.assign('hour', hour);\r\n        result.start.assign('minute', minute);\r\n        if (meridiem >= 0) {\r\n            result.start.assign('meridiem', meridiem);\r\n        }\r\n\r\n        // ==============================================================\r\n        //                  Extracting the 'to' chunk\r\n        // ==============================================================\r\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\r\n        if (!match) {\r\n            // Not accept number only result\r\n            if (result.text.match(/^\\d+$/)) {\r\n                return null;\r\n            }\r\n            return result;\r\n        }\r\n\r\n\r\n\r\n        // Pattern \"YY.YY -XXXX\" is more like timezone offset\r\n        if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\r\n            return result;\r\n        }\r\n\r\n        if(result.end == null){\r\n            result.end = new ParsedComponents(null, result.start.date());\r\n        }\r\n\r\n        var hour = 0;\r\n        var minute = 0;\r\n        var meridiem = -1;\r\n\r\n        // ----- Second\r\n        if(match[SECOND_GROUP] != null){\r\n            var second = parseInt(match[SECOND_GROUP]);\r\n            if(second >= 60) return null;\r\n\r\n            result.end.assign('second', second);\r\n        }\r\n\r\n        hour = parseInt(match[2]);\r\n\r\n        // ----- Minute\r\n        if (match[MINUTE_GROUP]!= null) {\r\n\r\n            minute = parseInt(match[MINUTE_GROUP]);\r\n            if(minute >= 60) return result;\r\n\r\n        } else if (hour > 100) {\r\n\r\n            minute = hour%100;\r\n            hour   = parseInt(hour/100);\r\n        }\r\n\r\n        if(minute >= 60) {\r\n            return null;\r\n        }\r\n\r\n        if(hour > 24) {\r\n            return null;\r\n        }\r\n        if (hour >= 12) {\r\n            meridiem = 1;\r\n        }\r\n\r\n        // ----- AM & PM\r\n        if (match[AM_PM_HOUR_GROUP] != null){\r\n\r\n            if (hour > 12) return null;\r\n\r\n            if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"a\"){\r\n                meridiem = 0;\r\n                if(hour == 12) {\r\n                    hour = 0;\r\n                    if (!result.end.isCertain('day')) {\r\n                        result.end.imply('day', result.end.get('day') + 1);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"p\"){\r\n                meridiem = 1;\r\n                if(hour != 12) hour += 12;\r\n            }\r\n\r\n            if (!result.start.isCertain('meridiem')) {\r\n                if (meridiem == 0) {\r\n\r\n                    result.start.imply('meridiem', 0);\r\n\r\n                    if (result.start.get('hour') == 12) {\r\n                        result.start.assign('hour', 0);\r\n                    }\r\n\r\n                } else {\r\n\r\n                    result.start.imply('meridiem', 1);\r\n\r\n                    if (result.start.get('hour') != 12) {\r\n                        result.start.assign('hour', result.start.get('hour') + 12);\r\n                    }\r\n                }\r\n            }\r\n\r\n        } else if(hour >= 12) {\r\n            meridiem = 1;\r\n        }\r\n\r\n        result.text = result.text + match[0];\r\n        result.end.assign('hour', hour);\r\n        result.end.assign('minute', minute);\r\n        if (meridiem >= 0) {\r\n            result.end.assign('meridiem', meridiem);\r\n        }\r\n\r\n        if (result.end.date().getTime() < result.start.date().getTime()) {\r\n            result.end.imply('day', result.end.get('day') + 1)\r\n        }\r\n\r\n        return result;\r\n    }\r\n}\r\n","/*\r\n\r\n\r\n*/\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar updateParsedComponent = require('../EN/ENWeekdayParser').updateParsedComponent;\r\n\r\nvar DAYS_OFFSET = { 'dimanche': 0, 'dim': 0, 'lundi': 1, 'lun': 1,'mardi': 2, 'mar':2, 'mercredi': 3, 'mer': 3,\r\n    'jeudi': 4, 'jeu':4, 'vendredi': 5, 'ven': 5,'samedi': 6, 'sam': 6};\r\n\r\nvar PATTERN = new RegExp('(\\\\s|^)' +\r\n    '(?:(?:\\\\,|\\\\(|\\\\（)\\\\s*)?' +\r\n    '(?:(ce)\\\\s*)?' +\r\n    '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\r\n    '(?:\\\\s*(?:\\\\,|\\\\)|\\\\）))?' +\r\n    '(?:\\\\s*(dernier|prochain)\\\\s*)?' +\r\n    '(?=\\\\W|$)', 'i');\r\n\r\nvar PREFIX_GROUP = 2;\r\nvar WEEKDAY_GROUP = 3;\r\nvar POSTFIX_GROUP = 4;\r\n\r\nexports.Parser = function FRWeekdayParser() {\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() { return PATTERN; };\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n        var index = match.index + match[1].length;\r\n        var text = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n        var result = new ParsedResult({\r\n            index: index,\r\n            text: text,\r\n            ref: ref\r\n        });\r\n\r\n        var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\r\n        var offset = DAYS_OFFSET[dayOfWeek];\r\n        if(offset === undefined) return null;\r\n\r\n        var modifier = null;\r\n        var prefix = match[PREFIX_GROUP];\r\n        var postfix = match[POSTFIX_GROUP];\r\n        if (prefix || postfix) {\r\n            var norm = prefix || postfix;\r\n            norm = norm.toLowerCase();\r\n\r\n            if(norm == 'dernier') {\r\n                modifier = 'last';\r\n            } else if(norm == 'prochain') {\r\n                modifier = 'next';\r\n            } else if(norm== 'ce') {\r\n                modifier = 'this';\r\n            }\r\n        }\r\n\r\n        updateParsedComponent(result, ref, offset, modifier);\r\n        result.tags['FRWeekdayParser'] = true;\r\n        return result;\r\n    }\r\n};\r\n\r\n","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\n    var fr = moment.defineLocale('fr', {\n        months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),\n        monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),\n        monthsParseExact : true,\n        weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n        weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n        weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'),\n        weekdaysParseExact : true,\n        longDateFormat : {\n            LT : 'HH:mm',\n            LTS : 'HH:mm:ss',\n            L : 'DD/MM/YYYY',\n            LL : 'D MMMM YYYY',\n            LLL : 'D MMMM YYYY HH:mm',\n            LLLL : 'dddd D MMMM YYYY HH:mm'\n        },\n        calendar : {\n            sameDay : '[Aujourd’hui à] LT',\n            nextDay : '[Demain à] LT',\n            nextWeek : 'dddd [à] LT',\n            lastDay : '[Hier à] LT',\n            lastWeek : 'dddd [dernier à] LT',\n            sameElse : 'L'\n        },\n        relativeTime : {\n            future : 'dans %s',\n            past : 'il y a %s',\n            s : 'quelques secondes',\n            ss : '%d secondes',\n            m : 'une minute',\n            mm : '%d minutes',\n            h : 'une heure',\n            hh : '%d heures',\n            d : 'un jour',\n            dd : '%d jours',\n            M : 'un mois',\n            MM : '%d mois',\n            y : 'un an',\n            yy : '%d ans'\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(er|)/,\n        ordinal : function (number, period) {\n            switch (period) {\n                // TODO: Return 'e' when day of month > 1. Move this case inside\n                // block for masculine words below.\n                // See https://github.com/moment/moment/issues/3375\n                case 'D':\n                    return number + (number === 1 ? 'er' : '');\n\n                // Words with masculine grammatical gender: mois, trimestre, jour\n                default:\n                case 'M':\n                case 'Q':\n                case 'DDD':\n                case 'd':\n                    return number + (number === 1 ? 'er' : 'e');\n\n                // Words with feminine grammatical gender: semaine\n                case 'w':\n                case 'W':\n                    return number + (number === 1 ? 're' : 'e');\n            }\n        },\n        week : {\n            dow : 1, // Monday is the first day of the week.\n            doy : 4  // The week that contains Jan 4th is the first week of the year.\n        }\n    });\n\n    return fr;\n\n})));\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/FR');\n\n// Force load fr localization data from moment for the locale files to be linkded durning browserify.\n// NOTE: The function moment.defineLocale() also has a side effect that it change global locale\n//  We also need to save and restore the previous locale (see. moment.js, loadLocale)\nvar originalLocale = moment.locale();\nrequire('moment/locale/fr');\nmoment.locale(originalLocale);\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:les?|la|l\\'|du|des?)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|\\\\d+)?\\\\s*' +\n    '(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?)?\\\\s*' +\n    '(secondes?|min(?:ute)?s?|heures?|jours?|semaines?|mois|trimestres?|années?)\\\\s*' +\n    '(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?)?' +\n    '(?=\\\\W|$)', 'i'\n);\n\nvar MULTIPLIER_GROUP = 2;\nvar MODIFIER_1_GROUP = 3;\nvar RELATIVE_WORD_GROUP = 4;\nvar MODIFIER_2_GROUP = 5;\n\nexports.Parser = function FRRelativeDateFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; };\n\n    this.extract = function(text, ref, match, opt){\n        var index = match.index + match[1].length;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        // Multiplier\n        var multiplier = match[MULTIPLIER_GROUP] === undefined ? '1' : match[MULTIPLIER_GROUP];\n        if (util.INTEGER_WORDS[multiplier] !== undefined) {\n            multiplier = util.INTEGER_WORDS[multiplier];\n        } else {\n            multiplier = parseInt(multiplier);\n        }\n\n        // Modifier\n        var modifier = match[MODIFIER_1_GROUP] === undefined ?\n                    (match[MODIFIER_2_GROUP] === undefined ? '' : match[MODIFIER_2_GROUP].toLowerCase())\n                     : match[MODIFIER_1_GROUP].toLowerCase();\n        if(!modifier) {\n            // At least one modifier is mandatory to match this parser\n            return;\n        }\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n        result.tags['FRRelativeDateFormatParser'] = true;\n\n        var modifierFactor;\n        switch(true) {\n            case /prochaine?s?/.test(modifier):\n            case /suivants?/.test(modifier):\n                modifierFactor = 1;\n                break;\n            case /derni[eè]re?s?/.test(modifier):\n            case /pass[ée]e?s?/.test(modifier):\n            case /pr[ée]c[ée]dents?/.test(modifier):\n                modifierFactor = -1;\n                break;\n        }\n\n        var total = multiplier * modifierFactor;\n\n        var dateFrom = moment(ref),\n            dateTo = moment(ref);\n        dateFrom.locale('fr');\n        dateTo.locale('fr');\n        var relative = match[RELATIVE_WORD_GROUP];\n        var startOf;\n        switch(true) {\n            case /secondes?/.test(relative):\n                dateFrom.add(total, 's');\n                dateTo.add(modifierFactor, 's');\n                startOf = 'second';\n                break;\n            case /min(?:ute)?s?/.test(relative):\n                dateFrom.add(total, 'm');\n                dateTo.add(modifierFactor, 'm');\n                startOf = 'minute';\n                break;\n            case /heures?/.test(relative):\n                dateFrom.add(total, 'h');\n                dateTo.add(modifierFactor, 'h');\n                startOf = 'hour';\n                break;\n            case /jours?/.test(relative):\n                dateFrom.add(total, 'd');\n                dateTo.add(modifierFactor, 'd');\n                startOf = 'day';\n                break;\n            case /semaines?/.test(relative):\n                dateFrom.add(total, 'w');\n                dateTo.add(modifierFactor, 'w');\n                startOf = 'week';\n                break;\n            case /mois?/.test(relative):\n                dateFrom.add(total, 'M');\n                dateTo.add(modifierFactor, 'M');\n                startOf = 'month';\n                break;\n            case /trimestres?/.test(relative):\n                dateFrom.add(total, 'Q');\n                dateTo.add(modifierFactor, 'Q');\n                startOf = 'quarter';\n                break;\n            case /années?/.test(relative):\n                dateFrom.add(total, 'y');\n                dateTo.add(modifierFactor, 'y');\n                startOf = 'year';\n                break;\n        }\n\n        // if we go forward, switch the start and end dates\n        if(modifierFactor > 0) {\n            var dateTmp = dateFrom;\n            dateFrom = dateTo;\n            dateTo = dateTmp;\n        }\n\n        // Get start and end of dates\n        dateFrom.startOf(startOf);\n        dateTo.endOf(startOf);\n\n        // Assign results\n        result.start.assign('year', dateFrom.year());\n        result.start.assign('month', dateFrom.month() + 1);\n        result.start.assign('day', dateFrom.date());\n        result.start.assign('minute', dateFrom.minute());\n        result.start.assign('second', dateFrom.second());\n        result.start.assign('hour', dateFrom.hour());\n        result.start.assign('millisecond', dateFrom.millisecond());\n\n        result.end = result.start.clone();\n        result.end.assign('year', dateTo.year());\n        result.end.assign('month', dateTo.month() + 1);\n        result.end.assign('day', dateTo.date());\n        result.end.assign('minute', dateTo.minute());\n        result.end.assign('second', dateTo.second());\n        result.end.assign('hour', dateTo.hour());\n        result.end.assign('millisecond', dateTo.millisecond());\n        return result;\n    };\n};\n","var NUMBER ={\n  '零':0,\n  '一':1,\n  '二':2,\n  '兩':2,\n  '三':3,\n  '四':4,\n  '五':5,\n  '六':6,\n  '七':7,\n  '八':8,\n  '九':9,\n  '十':10,\n  '廿':20,\n  '卅':30,\n};\n\nvar WEEKDAY_OFFSET ={\n  '天':0,\n  '日':0,\n  '一':1,\n  '二':2,\n  '三':3,\n  '四':4,\n  '五':5,\n  '六':6,\n};\n\nexports.NUMBER = NUMBER;\nexports.WEEKDAY_OFFSET = WEEKDAY_OFFSET;\n\nexports.zhStringToNumber=function(text){\n  var number = 0;\n  for(var i=0; i<text.length ;i++){\n    var char = text[i];\n    if(char === '十'){\n      number = number=== 0 ? NUMBER[char] : (number * NUMBER[char]);\n    }else{\n      number += NUMBER[char];\n    }\n  }\n  return number;\n};\n\nexports.zhStringToYear=function(text){\n  var string = '';\n  for(var i=0; i<text.length ;i++){\n    var char = text[i];\n    string = string + NUMBER[char];\n  }\n  return parseInt(string);\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n    '(\\\\d{2,4}|[' + Object.keys(util.NUMBER).join('') + ']{2,4})?' +\n    '(?:\\\\s*)' +\n    '(?:年)?' +\n    '(?:[\\\\s|,|，]*)' +\n    '(\\\\d{1,2}|[' + Object.keys(util.NUMBER).join('') + ']{1,2})' +\n    '(?:\\\\s*)' +\n    '(?:月)' +\n    '(?:\\\\s*)' +\n    '(\\\\d{1,2}|[' + Object.keys(util.NUMBER).join('') + ']{1,2})?' +\n    '(?:\\\\s*)' +\n    '(?:日|號)?'\n);\n\nvar YEAR_GROUP = 1;\nvar MONTH_GROUP = 2;\nvar DAY_GROUP = 3;\n\nexports.Parser = function ZHHantDateParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n        var startMoment = moment(ref);\n        var result = new ParsedResult({\n            text: match[0],\n            index: match.index,\n            ref: ref,\n        });\n\n        //Month\n        var month = parseInt(match[MONTH_GROUP]);\n        if (isNaN(month)) month = util.zhStringToNumber(match[MONTH_GROUP]);\n        result.start.assign('month', month);\n\n        //Day\n        if (match[DAY_GROUP]) {\n            var day = parseInt(match[DAY_GROUP]);\n            if (isNaN(day)) day = util.zhStringToNumber(match[DAY_GROUP]);\n            result.start.assign('day', day);\n        } else {\n            result.start.imply('day', startMoment.date());\n        }\n\n        //Year\n        if (match[YEAR_GROUP]) {\n            var year = parseInt(match[YEAR_GROUP]);\n            if (isNaN(year)) year = util.zhStringToYear(match[YEAR_GROUP]);\n            result.start.assign('year', year);\n        } else {\n            result.start.imply('year', startMoment.year());\n        }\n\n        result.tags.ZHHantDateParser = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar updateParsedComponent = require('../EN/ENWeekdayParser').updateParsedComponent;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n    '(上|今|下|這|呢)?' +\n    '(?:個)?' +\n    '(?:星期|禮拜)' +\n    '(' + Object.keys(util.WEEKDAY_OFFSET).join('|') + ')'\n);\n\nvar PREFIX_GROUP = 1;\nvar WEEKDAY_GROUP = 2;\n\nexports.Parser = function ZHHantWeekdayParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n        var index = match.index;\n        text = match[0];\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var dayOfWeek = match[WEEKDAY_GROUP];\n        var offset = util.WEEKDAY_OFFSET[dayOfWeek];\n        if(offset === undefined) return null;\n\n        var modifier = null;\n        var prefix = match[PREFIX_GROUP];\n\n        if(prefix == '上') {\n            modifier = 'last';\n        } else if(prefix == '下') {\n            modifier = 'next';\n        } else if(prefix == '今' || prefix == '這' || prefix == '呢') {\n            modifier = 'this';\n        }\n\n        updateParsedComponent(result, ref, offset, modifier);\n        result.tags['ZHHantWeekdayParser'] = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar patternString1 = '(?:由|從|自)?' +\n    '(?:' +\n    '(今|明|聽|昨|尋|琴)(早|朝|晚)|' +\n    '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n    '(今|明|聽|昨|尋|琴)(?:日|天)' +\n    '(?:[\\\\s,，]*)' +\n    '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?' +\n    ')?' +\n    '(?:[\\\\s,，]*)' +\n    '(?:(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)(?:\\\\s*)(?:點|時|:|：)' +\n    '(?:\\\\s*)' +\n    '(\\\\d+|半|正|整|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:分|:|：)?' +\n    '(?:\\\\s*)' +\n    '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:秒)?)' +\n    '(?:\\\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?';\n\nvar patternString2 = '(?:\\\\s*(?:到|至|\\\\-|\\\\–|\\\\~|\\\\〜)\\\\s*)' +\n    '(?:' +\n    '(今|明|聽|昨|尋|琴)(早|朝|晚)|' +\n    '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n    '(今|明|聽|昨|尋|琴)(?:日|天)' +\n    '(?:[\\\\s,，]*)' +\n    '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?' +\n    ')?' +\n    '(?:[\\\\s,，]*)' +\n    '(?:(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)(?:\\\\s*)(?:點|時|:|：)' +\n    '(?:\\\\s*)' +\n    '(\\\\d+|半|正|整|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:分|:|：)?' +\n    '(?:\\\\s*)' +\n    '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:秒)?)' +\n    '(?:\\\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?';\n\nvar FIRST_REG_PATTERN = new RegExp(patternString1, 'i');\nvar SECOND_REG_PATTERN = new RegExp(patternString2, 'i');\n\nvar DAY_GROUP_1 = 1;\nvar ZH_AM_PM_HOUR_GROUP_1 = 2;\nvar ZH_AM_PM_HOUR_GROUP_2 = 3;\nvar DAY_GROUP_3 = 4;\nvar ZH_AM_PM_HOUR_GROUP_3 = 5;\nvar HOUR_GROUP = 6;\nvar MINUTE_GROUP = 7;\nvar SECOND_GROUP = 8;\nvar AM_PM_HOUR_GROUP = 9;\n\nexports.Parser = function ZHHantTimeExpressionParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return FIRST_REG_PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n\n        // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n        if (match.index > 0 && text[match.index - 1].match(/\\w/)) return null;\n        var refMoment = moment(ref);\n        var result = new ParsedResult();\n        result.ref = ref;\n        result.index = match.index;\n        result.text = match[0];\n        result.tags.ZHTimeExpressionParser = true;\n\n        var startMoment = refMoment.clone();\n\n        // ----- Day\n        if (match[DAY_GROUP_1]) {\n            var day1 = match[DAY_GROUP_1];\n            if (day1 == '明' || day1 == '聽') {\n              // Check not \"Tomorrow\" on late night\n              if(refMoment.hour() > 1) {\n                  startMoment.add(1, 'day');\n              }\n            } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n                startMoment.add(-1, 'day');\n            }\n            result.start.assign('day', startMoment.date());\n            result.start.assign('month', startMoment.month() + 1);\n            result.start.assign('year', startMoment.year());\n        } else if (match[DAY_GROUP_3]) {\n            var day3 = match[DAY_GROUP_3];\n            if (day3 == '明' || day3 == '聽') {\n                startMoment.add(1, 'day');\n            } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n                startMoment.add(-1, 'day');\n            }\n            result.start.assign('day', startMoment.date());\n            result.start.assign('month', startMoment.month() + 1);\n            result.start.assign('year', startMoment.year());\n        } else {\n            result.start.imply('day', startMoment.date());\n            result.start.imply('month', startMoment.month() + 1);\n            result.start.imply('year', startMoment.year());\n        }\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if (match[SECOND_GROUP]) {\n            var second = parseInt(match[SECOND_GROUP]);\n            if (isNaN(second)) {\n                second = util.zhStringToNumber(match[SECOND_GROUP]);\n            }\n            if (second >= 60) return null;\n            result.start.assign('second', second);\n        }\n\n        hour = parseInt(match[HOUR_GROUP]);\n        if (isNaN(hour)) {\n            hour = util.zhStringToNumber(match[HOUR_GROUP]);\n        }\n\n        // ----- Minutes\n        if (match[MINUTE_GROUP]) {\n            if (match[MINUTE_GROUP] == '半') {\n                minute = 30;\n            } else if (match[MINUTE_GROUP] == '正' || match[MINUTE_GROUP] == '整') {\n                minute = 0;\n            } else {\n                minute = parseInt(match[MINUTE_GROUP]);\n                if (isNaN(minute)) {\n                    minute = util.zhStringToNumber(match[MINUTE_GROUP]);\n                }\n            }\n        } else if (hour > 100) {\n            minute = hour % 100;\n            hour = parseInt(hour / 100);\n        }\n\n        if (minute >= 60) {\n            return null;\n        }\n\n        if (hour > 24) {\n            return null;\n        }\n        if (hour >= 12) {\n            meridiem = 1;\n        }\n\n        // ----- AM & PM\n        if (match[AM_PM_HOUR_GROUP]) {\n            if (hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if (ampm == \"a\") {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            }\n\n            if (ampm == \"p\") {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_1]) {\n            var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1];\n            var zhAMPM1 = zhAMPMString1[0];\n            if (zhAMPM1 == '朝' || zhAMPM1 == '早') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM1 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_2]) {\n            var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2];\n            var zhAMPM2 = zhAMPMString2[0];\n            if (zhAMPM2 == '上' || zhAMPM2 == '朝' || zhAMPM2 == '早' || zhAMPM2 == '凌') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM2 == '下' || zhAMPM2 == '晏' || zhAMPM2 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_3]) {\n            var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3];\n            var zhAMPM3 = zhAMPMString3[0];\n            if (zhAMPM3 == '上' || zhAMPM3 == '朝' || zhAMPM3 == '早' || zhAMPM3 == '凌') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM3 == '下' || zhAMPM3 == '晏' || zhAMPM3 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        }\n\n        result.start.assign('hour', hour);\n        result.start.assign('minute', minute);\n\n        if (meridiem >= 0) {\n            result.start.assign('meridiem', meridiem);\n        } else {\n            if (hour < 12) {\n                result.start.imply('meridiem', 0);\n            } else {\n                result.start.imply('meridiem', 1);\n            }\n        }\n\n        // ==============================================================\n        //                  Extracting the 'to' chunk\n        // ==============================================================\n\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n        if (!match) {\n            // Not accept number only result\n            if (result.text.match(/^\\d+$/)) {\n                return null;\n            }\n            return result;\n        }\n\n        var endMoment = startMoment.clone();\n        result.end = new ParsedComponents(null, null);\n\n        // ----- Day\n        if (match[DAY_GROUP_1]) {\n            var day1 = match[DAY_GROUP_1];\n            if (day1 == '明' || day1 == '聽') {\n              // Check not \"Tomorrow\" on late night\n              if(refMoment.hour() > 1) {\n                  endMoment.add(1, 'day');\n              }\n            } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n                endMoment.add(-1, 'day');\n            }\n            result.end.assign('day', endMoment.date());\n            result.end.assign('month', endMoment.month() + 1);\n            result.end.assign('year', endMoment.year());\n        } else if (match[DAY_GROUP_3]) {\n            var day3 = match[DAY_GROUP_3];\n            if (day3 == '明' || day3 == '聽') {\n                endMoment.add(1, 'day');\n            } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n                endMoment.add(-1, 'day');\n            }\n            result.end.assign('day', endMoment.date());\n            result.end.assign('month', endMoment.month() + 1);\n            result.end.assign('year', endMoment.year());\n        } else {\n            result.end.imply('day', endMoment.date());\n            result.end.imply('month', endMoment.month() + 1);\n            result.end.imply('year', endMoment.year());\n        }\n\n        hour = 0;\n        minute = 0;\n        meridiem = -1;\n\n        // ----- Second\n        if (match[SECOND_GROUP]) {\n            var second = parseInt(match[SECOND_GROUP]);\n            if (isNaN(second)) {\n                second = util.zhStringToNumber(match[SECOND_GROUP]);\n            }\n\n            if (second >= 60) return null;\n            result.end.assign('second', second);\n        }\n\n        hour = parseInt(match[HOUR_GROUP]);\n        if (isNaN(hour)) {\n            hour = util.zhStringToNumber(match[HOUR_GROUP]);\n        }\n\n        // ----- Minutes\n        if (match[MINUTE_GROUP]) {\n            if (match[MINUTE_GROUP] == '半') {\n                minute = 30;\n            } else if (match[MINUTE_GROUP] == '正' || match[MINUTE_GROUP] == '整') {\n                minute = 0;\n            } else {\n                minute = parseInt(match[MINUTE_GROUP]);\n                if (isNaN(minute)) {\n                    minute = util.zhStringToNumber(match[MINUTE_GROUP]);\n                }\n            }\n        } else if (hour > 100) {\n            minute = hour % 100;\n            hour = parseInt(hour / 100);\n        }\n\n        if (minute >= 60) {\n            return null;\n        }\n\n        if (hour > 24) {\n            return null;\n        }\n        if (hour >= 12) {\n            meridiem = 1;\n        }\n\n        // ----- AM & PM\n        if (match[AM_PM_HOUR_GROUP]) {\n            if (hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if (ampm == \"a\") {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            }\n\n            if (ampm == \"p\") {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n\n            if (!result.start.isCertain('meridiem')) {\n                if (meridiem == 0) {\n\n                    result.start.imply('meridiem', 0);\n\n                    if (result.start.get('hour') == 12) {\n                        result.start.assign('hour', 0);\n                    }\n\n                } else {\n\n                    result.start.imply('meridiem', 1);\n\n                    if (result.start.get('hour') != 12) {\n                        result.start.assign('hour', result.start.get('hour') + 12);\n                    }\n                }\n            }\n\n        } else if (match[ZH_AM_PM_HOUR_GROUP_1]) {\n            var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1];\n            var zhAMPM1 = zhAMPMString1[0];\n            if (zhAMPM1 == '朝' || zhAMPM1 == '早') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM1 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_2]) {\n            var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2];\n            var zhAMPM2 = zhAMPMString2[0];\n            if (zhAMPM2 == '上' || zhAMPM2 == '朝' || zhAMPM2 == '早' || zhAMPM2 == '凌') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM2 == '下' || zhAMPM2 == '晏' || zhAMPM2 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_3]) {\n            var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3];\n            var zhAMPM3 = zhAMPMString3[0];\n            if (zhAMPM3 == '上' || zhAMPM3 == '朝' || zhAMPM3 == '早' || zhAMPM3 == '凌') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM3 == '下' || zhAMPM3 == '晏' || zhAMPM3 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        }\n\n        result.text = result.text + match[0];\n        result.end.assign('hour', hour);\n        result.end.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.end.assign('meridiem', meridiem);\n        } else {\n            var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n            if (startAtPM && result.start.get('hour') > hour) {\n                // 10pm - 1 (am)\n                result.end.imply('meridiem', 0);\n\n            } else if (hour > 12) {\n                result.end.imply('meridiem', 1);\n            }\n        }\n\n        if (result.end.date().getTime() < result.start.date().getTime()) {\n            result.end.imply('day', result.end.get('day') + 1)\n        }\n\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp(\n    '(而家|立(?:刻|即)|即刻)|' +\n    '(今|明|聽|昨|尋|琴)(早|朝|晚)|' +\n    '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n    '(今|明|聽|昨|尋|琴)(?:日|天)' +\n    '(?:[\\\\s|,|，]*)' +\n    '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?', 'i');\n\nvar NOW_GROUP = 1;\nvar DAY_GROUP_1 = 2;\nvar TIME_GROUP_1 = 3;\nvar TIME_GROUP_2 = 4;\nvar DAY_GROUP_3 = 5;\nvar TIME_GROUP_3 = 6;\n\nexports.Parser = function ZHHantCasualDateParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n        text = match[0];\n        var index = match.index;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n\n        if (match[NOW_GROUP]) {\n            result.start.imply('hour', refMoment.hour());\n            result.start.imply('minute', refMoment.minute());\n            result.start.imply('second', refMoment.second());\n            result.start.imply('millisecond', refMoment.millisecond());\n        } else if (match[DAY_GROUP_1]) {\n            var day1 = match[DAY_GROUP_1];\n            var time1 = match[TIME_GROUP_1];\n\n            if (day1 == '明' || day1 == '聽') {\n              // Check not \"Tomorrow\" on late night\n              if(refMoment.hour() > 1) {\n                  startMoment.add(1, 'day');\n              }\n            } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n                startMoment.add(-1, 'day');\n            }\n\n            if (time1 == '早' || time1 == '朝') {\n                result.start.imply('hour', 6);\n            } else if (time1 == '晚') {\n                result.start.imply('hour', 22);\n                result.start.imply('meridiem', 1);\n            }\n\n        } else if (match[TIME_GROUP_2]) {\n            var timeString2 = match[TIME_GROUP_2];\n            var time2 = timeString2[0];\n            if (time2 == '早' || time2 == '朝' || time2 == '上') {\n                result.start.imply('hour', 6);\n            } else if (time2 == '下' || time2 == '晏') {\n                result.start.imply('hour', 15);\n                result.start.imply('meridiem', 1);\n            } else if (time2 == '中') {\n                result.start.imply('hour', 12);\n                result.start.imply('meridiem', 1);\n            } else if (time2 == '夜' || time2 == '晚') {\n                result.start.imply('hour', 22);\n                result.start.imply('meridiem', 1);\n            } else if (time2 == '凌') {\n                result.start.imply('hour', 0);\n            }\n\n        } else if (match[DAY_GROUP_3]) {\n            var day3 = match[DAY_GROUP_3];\n\n            if (day3 == '明' || day3 == '聽') {\n              // Check not \"Tomorrow\" on late night\n              if(refMoment.hour() > 1) {\n                  startMoment.add(1, 'day');\n              }\n            } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n                startMoment.add(-1, 'day');\n            }\n\n\n            var timeString3 = match[TIME_GROUP_3];\n            if (timeString3) {\n                var time3 = timeString3[0];\n                if (time3 == '早' || time3 == '朝' || time3 == '上') {\n                    result.start.imply('hour', 6);\n                } else if (time3 == '下' || time3 == '晏') {\n                    result.start.imply('hour', 15);\n                    result.start.imply('meridiem', 1);\n                } else if (time3 == '中') {\n                    result.start.imply('hour', 12);\n                    result.start.imply('meridiem', 1);\n                } else if (time3 == '夜' || time3 == '晚') {\n                    result.start.imply('hour', 22);\n                    result.start.imply('meridiem', 1);\n                } else if (time3 == '凌') {\n                    result.start.imply('hour', 0);\n                }\n            }\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags.ZHHantCasualDateParser = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n    '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+|半|幾)(?:\\\\s*)' +\n    '(?:個)?' +\n    '(秒(?:鐘)?|分鐘|小時|鐘|日|天|星期|禮拜|月|年)' +\n    '(?:(?:之|過)?後|(?:之)?內)', 'i'\n);\n\nvar NUMBER_GROUP = 1;\nvar UNIT_GROUP = 2;\n\nexports.Parser = function ZHHantCasualDateParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n      var index = match.index;\n      text  = match[0];\n\n      var result = new ParsedResult({\n          index: index,\n          text: text,\n          ref: ref\n      });\n\n      var number = parseInt(match[NUMBER_GROUP]);\n      if (isNaN(number)){\n        number = util.zhStringToNumber(match[NUMBER_GROUP]);\n      }\n\n      if (isNaN(number)){\n        var string = match[NUMBER_GROUP];\n        if (string === '幾'){\n          number = 3;\n        }else if(string === '半'){\n          number = 0.5;\n        }else{\n\n          //just in case\n          return null;\n        }\n      }\n\n      var date = moment(ref);\n      var unit = match[UNIT_GROUP];\n      var unitAbbr = unit[0];\n\n      if (unitAbbr.match(/[日天星禮月年]/)){\n        if(unitAbbr == '日' || unitAbbr == '天'){\n          date.add(number, 'd');\n        }else if(unitAbbr == '星' || unitAbbr == '禮'){\n          date.add(number * 7, 'd');\n        }else if(unitAbbr == '月'){\n          date.add(number, 'month');\n        }else if(unitAbbr == '年'){\n          date.add(number, 'year');\n        }\n\n        result.start.assign('year', date.year());\n        result.start.assign('month', date.month() + 1);\n        result.start.assign('day', date.date());\n        return result;\n      }\n\n      if(unitAbbr == '秒'){\n        date.add(number, 'second');\n      }else if(unitAbbr == '分'){\n        date.add(number, 'minute');\n      }else if(unitAbbr == '小' || unitAbbr == '鐘'){\n        date.add(number, 'hour');\n      }\n\n      result.start.imply('year', date.year());\n      result.start.imply('month', date.month() + 1);\n      result.start.imply('day', date.date());\n      result.start.assign('hour', date.hour());\n      result.start.assign('minute', date.minute());\n      result.start.assign('second', date.second());\n      result.tags.ZHHantDeadlineFormatParser = true;\n      return result;\n    };\n};\n","exports.WEEKDAY_OFFSET = { \n    'sonntag': 0, \n    'so': 0, \n    'montag': 1, \n    'mo': 1,\n    'dienstag': 2, \n    'di':2, \n    'mittwoch': 3, \n    'mi': 3, \n    'donnerstag': 4, \n    'do': 4, \n    'freitag': 5, \n    'fr': 5,\n    'samstag': 6, \n    'sa': 6\n};\n    \nexports.MONTH_OFFSET = { \n    'januar': 1,\n    'jan': 1,\n    'jan.': 1,\n    'februar': 2,\n    'feb': 2,\n    'feb.': 2,\n    'märz': 3,\n    'maerz': 3,\n    'mär': 3,\n    'mär.': 3,\n    'mrz': 3,\n    'mrz.': 3,\n    'april': 4,\n    'apr': 4,\n    'apr.': 4,\n    'mai': 5,\n    'juni': 6,\n    'jun': 6,\n    'jun.': 6,\n    'juli': 7,\n    'jul': 7,\n    'jul.': 7,\n    'august': 8,\n    'aug': 8,\n    'aug.': 8,\n    'september': 9,\n    'sep': 9,\n    'sep.': 9,\n    'sept': 9,\n    'sept.': 9,\n    'oktober': 10,\n    'okt': 10,\n    'okt.': 10,\n    'november': 11,\n    'nov': 11,\n    'nov.': 11,\n    'dezember': 12,\n    'dez': 12,\n    'dez.': 12\n};\n\nexports.INTEGER_WORDS_PATTERN = '(?:eins|zwei|drei|vier|fünf|fuenf|sechs|sieben|acht|neun|zehn|elf|zwölf|zwoelf)';\nexports.INTEGER_WORDS = {\n    'eins' : 1,\n    'zwei' : 2,\n    'drei' : 3,\n    'vier' : 4,\n    'fünf' : 5,\n    'fuenf': 5,\n    'sechs' : 6,\n    'sieben' : 7,\n    'acht' : 8,\n    'neun' : 9,\n    'zehn' : 10,\n    'elf' : 11,\n    'zwölf' : 12,\n    'zwoelf' : 12\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/DE');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(in|nach)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|einigen|eine[rm]\\\\s*halben|eine[rm])\\\\s*' +\n    '(sekunden?|min(?:ute)?n?|stunden?|tag(?:en)?|wochen?|monat(?:en)?|jahr(?:en)?)\\\\s*' +\n    '(?=\\\\W|$)', 'i'\n);\n\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\n    '(in|nach)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|eine(?:r|m)?)\\\\s*' +\n    '(sekunden?|minuten?|stunden?|tag(?:en)?)\\\\s*' +\n    '(?=\\\\W|$)', 'i'\n);\n\nexports.Parser = function DEDeadlineFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt){\n\n        var index = match.index + match[1].length;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var num = match[3].toLowerCase();\n        if (util.INTEGER_WORDS[num] !== undefined) {\n            num = util.INTEGER_WORDS[num];\n        } else if (num === 'einer' || num === 'einem') {\n            num = 1;\n        } else if (num === 'einigen') {\n            num = 3;\n        } else if (/halben/.test(num)) {\n            num = 0.5;\n        } else {\n            num = parseInt(num);\n        }\n\n        var date = moment(ref);\n        if (/tag|woche|monat|jahr/i.test(match[4])) {\n\n            if (/tag/i.test(match[4])) {\n                date.add(num, 'd');\n            } else if (/woche/i.test(match[4])) {\n                date.add(num * 7, 'd');\n            } else if (/monat/i.test(match[4])) {\n                date.add(num, 'month');\n            } else if (/jahr/i.test(match[4])) {\n                date.add(num, 'year');\n            }\n\n            result.start.assign('year', date.year());\n            result.start.assign('month', date.month() + 1);\n            result.start.assign('day', date.date());\n            return result;\n        }\n\n        if (/stunde/i.test(match[4])) {\n\n            date.add(num, 'hour');\n\n        } else if (/min/i.test(match[4])) {\n\n            date.add(num, 'minute');\n\n        } else if (/sekunde/i.test(match[4])) {\n\n            date.add(num, 'second');\n        }\n\n        result.start.imply('year', date.year());\n        result.start.imply('month', date.month() + 1);\n        result.start.imply('day', date.date());\n        result.start.assign('hour', date.hour());\n        result.start.assign('minute', date.minute());\n        result.start.assign('second', date.second());\n        result.tags['DEDeadlineFormatParser'] = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/DE');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n        '(?:am\\\\s*?)?' +\n        '(?:(Sonntag|Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag|So|Mo|Di|Mi|Do|Fr|Sa)\\\\s*,?\\\\s*)?' +\n        '(?:den\\\\s*)?' +\n        '([0-9]{1,2})\\\\.' +\n        '(?:\\\\s*(?:bis(?:\\\\s*(?:am|zum))?|\\\\-|\\\\–|\\\\s)\\\\s*([0-9]{1,2})\\\\.)?\\\\s*' +\n        '(Jan(?:uar|\\\\.)?|Feb(?:ruar|\\\\.)?|Mär(?:z|\\\\.)?|Maerz|Mrz\\\\.?|Apr(?:il|\\\\.)?|Mai|Jun(?:i|\\\\.)?|Jul(?:i|\\\\.)?|Aug(?:ust|\\\\.)?|Sep(?:t|t\\\\.|tember|\\\\.)?|Okt(?:ober|\\\\.)?|Nov(?:ember|\\\\.)?|Dez(?:ember|\\\\.)?)' +\n        '(?:' +\n            ',?\\\\s*([0-9]{1,4}(?![^\\\\s]\\\\d))' +\n            '(\\\\s*[vn]\\\\.?\\\\s*C(?:hr)?\\\\.?)?' +\n        ')?' +\n        '(?=\\\\W|$)', 'i'\n    );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_TO_GROUP = 4;\nvar MONTH_NAME_GROUP = 5;\nvar YEAR_GROUP = 6;\nvar YEAR_BE_GROUP = 7;\n\nexports.Parser = function DEMonthNameLittleEndianParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = match[DATE_GROUP];\n        day = parseInt(day);\n\n        var year = null;\n        if (match[YEAR_GROUP]) {\n            year = match[YEAR_GROUP];\n            year = parseInt(year);\n\n            if(match[YEAR_BE_GROUP]){\n                if (/v/i.test(match[YEAR_BE_GROUP])) {\n                    // v.Chr.\n                    year = -year;\n                }\n            } else if (year < 100){\n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n\n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n            refMoment.year(moment(ref).year());\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = lastYear;\n            }\n\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        // Weekday component\n        if (match[WEEKDAY_GROUP]) {\n            var weekday = match[WEEKDAY_GROUP];\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n            result.start.assign('weekday', weekday);\n        }\n\n        // Text can be 'range' value. Such as '12 - 13 January 2012'\n        if (match[DATE_TO_GROUP]) {\n            result.end = result.start.clone();\n            result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\n        }\n\n        result.tags['DEMonthNameLittleEndianParser'] = true;\n        return result;\n    };\n}\n","/*\n    \n    The parser for parsing month name and year.\n    \n    EX. \n        - Januar\n        - Januar 2012\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/DE');\n\nvar PATTERN = new RegExp('(^|\\\\D\\\\s+|[^\\\\w\\\\s])' +\n    '(Jan\\\\.?|Januar|Feb\\\\.?|Februar|Mär\\\\.?|M(?:ä|ae)rz|Mrz\\\\.?|Apr\\\\.?|April|Mai\\\\.?|Jun\\\\.?|Juni|Jul\\\\.?|Juli|Aug\\\\.?|August|Sep\\\\.?|Sept\\\\.?|September|Okt\\\\.?|Oktober|Nov\\\\.?|November|Dez\\\\.?|Dezember)' + \n    '\\\\s*' +\n    '(?:' +\n        ',?\\\\s*(?:([0-9]{4})(\\\\s*[vn]\\\\.?\\\\s*C(?:hr)?\\\\.?)?|([0-9]{1,4})\\\\s*([vn]\\\\.?\\\\s*C(?:hr)?\\\\.?))' +\n    ')?' +\n    '(?=[^\\\\s\\\\w]|$)', 'i');\n\nvar MONTH_NAME_GROUP = 2;\nvar YEAR_GROUP = 3;\nvar YEAR_BE_GROUP = 4;\nvar YEAR_GROUP2 = 5;\nvar YEAR_BE_GROUP2 = 6;\n\nexports.Parser = function ENMonthNameParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n        \n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = 1;\n\n        var year = null;\n        if (match[YEAR_GROUP] || match[YEAR_GROUP2]) {\n            year = match[YEAR_GROUP] || match[YEAR_GROUP2];\n            year = parseInt(year);\n\n            if (match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2]) {\n                if (/v/i.test(match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2])) {\n                    // v.Chr.\n                    year = -year;\n                }\n\n            } else if (year < 100){ \n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.imply('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n            \n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){  \n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){ \n                refMoment = lastYear;\n            }\n\n            result.start.imply('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        result.tags['DEMonthNameParser'] = true;\n        return result;\n    }\n}\n\n","/*\n    Date format with slash \"/\" (also \"-\" and \".\") between numbers\n    - Tuesday 11/3/2015\n    - 11/3/2015\n    - 11/3\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:' +\n        '(?:am\\\\s*?)?' +\n        '((?:sonntag|so|montag|mo|dienstag|di|mittwoch|mi|donnerstag|do|freitag|fr|samstag|sa))' +\n        '\\\\s*\\\\,?\\\\s*' +\n        '(?:den\\\\s*)?' +\n    ')?' +\n    '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n    '(?:' +\n        '[\\\\/\\\\.\\\\-]' +\n        '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n    ')?' +\n    '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = {\n    'sonntag': 0, 'so': 0,\n    'montag': 1, 'mo': 1,\n    'dienstag': 2, 'di': 2,\n    'mittwoch': 3, 'mi': 3,\n    'donnerstag': 4, 'do': 4,\n    'freitag': 5, 'fr': 5,\n    'samstag': 6, 'sa': 6\n};\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\nvar WEEKDAY_GROUP = 2;\nvar DAY_GROUP = 3;\nvar MONTH_GROUP = 4;\nvar YEAR_GROUP = 5;\n\nexports.Parser = function DESlashDateFormatParser(argument) {\n    Parser.apply(this, arguments);\n\n    this.pattern = function () { return PATTERN; };\n    this.extract = function(text, ref, match, opt){\n\n        if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n            // Long skip, if there is some overlapping like:\n            // XX[/YY/ZZ]\n            // [XX/YY/]ZZ\n            match.index += match[0].length\n            return;\n        }\n\n        var index = match.index + match[OPENNING_GROUP].length;\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        });\n\n        if(text.match(/^\\d\\.\\d$/)) return;\n        if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n        // MM/dd -> OK\n        // MM.dd -> NG\n        if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n        var date = null;\n        var year = match[YEAR_GROUP] || moment(ref).year() + '';\n        var month = match[MONTH_GROUP];\n        var day   = match[DAY_GROUP];\n\n        month = parseInt(month);\n        day  = parseInt(day);\n        year = parseInt(year);\n\n        if (month < 1 || month > 12) return null;\n        if(day < 1 || day > 31) return null;\n\n        if(year < 100){\n            if (year > 50) {\n                year = year + 1900;\n            } else {\n                year = year + 2000;\n            }\n        }\n\n        result.start.assign('day', day);\n        result.start.assign('month', month);\n        result.start.assign('year', year);\n\n        //Day of week\n        if(match[WEEKDAY_GROUP]) {\n            result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n        }\n\n        result.tags['DESlashDateFormatParser'] = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/DE');\n\nvar PATTERN = new RegExp('' +\n    '(\\\\W|^)vor\\\\s*' +\n    '(' + util.INTEGER_WORDS_PATTERN + '|[0-9]+|einigen|eine[rm]\\\\s*halben|eine[rm])\\\\s*' +\n    '(sekunden?|min(?:ute)?n?|stunden?|wochen?|tag(?:en)?|monat(?:en)?|jahr(?:en)?)\\\\s*' +\n    '(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n    '(\\\\W|^)vor\\\\s*' +\n    '([0-9]+|eine(?:r|m))\\\\s*' +\n    '(sekunden?|minuten?|stunden?|tag(?:en)?)' +\n    '(?=(?:\\\\W|$))', 'i');\n\nexports.Parser = function DETimeAgoFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt){\n\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n        var text = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n        index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var num = match[2].toLowerCase() ;\n        if (util.INTEGER_WORDS[num] !== undefined) {\n            num = util.INTEGER_WORDS[num];\n        } else if (num === 'einer' || num === 'einem') {\n            num = 1;\n        } else if (num === 'einigen') {\n            num = 3;\n        } else if (/halben/.test(num)) {\n            num = 0.5;\n        } else {\n            num = parseInt(num);\n        }\n\n        var date = moment(ref);\n\n        if (/stunde|min|sekunde/i.test(match[3])) {\n            if (/stunde/i.test(match[3])) {\n\n                date.add(-num, 'hour');\n\n            } else if (/min/i.test(match[3])) {\n\n                date.add(-num, 'minute');\n\n            } else if (/sekunde/i.test(match[3])) {\n\n                date.add(-num, 'second');\n            }\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n            result.start.assign('hour', date.hour());\n            result.start.assign('minute', date.minute());\n            result.start.assign('second', date.second());\n            result.tags['DETimeAgoFormatParser'] = true;\n            return result;\n        }\n\n        if (/woche/i.test(match[3])) {\n            date.add(-num, 'week');\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n            result.start.imply('weekday', date.day());\n            return result;\n        }\n\n        if (/tag/i.test(match[3])) {\n            date.add(-num, 'd');\n        }\n\n        if (/monat/i.test(match[3])) {\n            date.add(-num, 'month');\n        }\n\n        if (/jahr/i.test(match[3])) {\n\n            date.add(-num, 'year');\n        }\n\n        result.start.assign('day', date.date());\n        result.start.assign('month', date.month() + 1);\n        result.start.assign('year', date.year());\n        return result;\n\n    };\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN  = new RegExp(\"(^|\\\\s|T)\" +\n    \"(?:(?:um|von)\\\\s*)?\" + \n    \"(\\\\d{1,4}|mittags?|mitternachts?)\" + \n    \"(?:\" + \n        \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" + \n        \"(?:\" + \n            \"(?:\\\\:|\\\\：)(\\\\d{2})\" + \n        \")?\" + \n    \")?\" +\n    \"(?:\\\\s*uhr)?\" +\n    \"(?:\\\\s*(morgens|vormittags|mittags|nachmittags|abends|nachts))?\" + \n    \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" + \n    \"(\\\\-|\\\\–|\\\\~|\\\\〜|bis|\\\\?)\\\\s*\" + \n    \"(\\\\d{1,4})\" +\n    \"(?:\" + \n        \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" + \n        \"(?:\" + \n            \"(?:\\\\.|\\\\:|\\\\：)(\\\\d{1,2})\" + \n        \")?\" + \n    \")?\" + \n    \"(?:\\\\s*(morgens|vormittags|mittags|nachmittags|abends|nachts))?\" + \n    \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP    = 2;\nvar MINUTE_GROUP  = 3;\nvar SECOND_GROUP  = 4;\nvar AM_PM_HOUR_GROUP = 5;\n\n\nexports.Parser = function DETimeExpressionParser() {\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return FIRST_REG_PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n        \n        // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n        var refMoment = moment(ref);\n        var result = new ParsedResult();\n        result.ref = ref;\n        result.index = match.index + match[1].length;\n        result.text  = match[0].substring(match[1].length);\n        result.tags['DETimeExpressionParser'] = true;\n\n        result.start.imply('day',   refMoment.date());\n        result.start.imply('month', refMoment.month()+1);\n        result.start.imply('year',  refMoment.year());\n        \n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){ \n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.start.assign('second', second);\n        }\n        \n        // ----- Hours\n        if (/mittags?/i.test(match[HOUR_GROUP])) {\n            meridiem = 1; \n            hour = 12;\n        } else if (/mitternachts?/i.test(match[HOUR_GROUP])) {\n            meridiem = 0; \n            hour = 0;\n        } else {\n            hour = parseInt(match[HOUR_GROUP]);\n        }\n        \n        // ----- Minutes\n        if(match[MINUTE_GROUP] != null){ \n            minute = parseInt(match[MINUTE_GROUP]);\n        } else if(hour > 100) { \n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        } \n        \n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) { \n            meridiem = 1;\n        }\n\n        // ----- AM & PM  \n        if (match[AM_PM_HOUR_GROUP] != null) {\n            if (hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if (ampm === 'morgens' || ampm === 'vormittags') {\n                meridiem = 0; \n                if(hour == 12) hour = 0;\n            } else {\n                meridiem = 1; \n                if(hour != 12) hour += 12;\n            }\n        } \n\n        result.start.assign('hour', hour);\n        result.start.assign('minute', minute);\n\n        if (meridiem >= 0) {\n            result.start.assign('meridiem', meridiem);\n        } else {\n            if (hour < 12) {\n                result.start.imply('meridiem', 0);\n            } else {\n                result.start.imply('meridiem', 1);\n            }\n        }\n        \n        // ==============================================================\n        //                  Extracting the 'to' chunk\n        // ==============================================================\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n        if (!match) {\n            // Not accept number only result\n            if (result.text.match(/^\\d+$/)) { \n                return null;\n            }\n            return result;\n        }\n\n\n\n        // Pattern \"YY.YY -XXXX\" is more like timezone offset\n        if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n            return result;\n        }\n\n        if(result.end == null){\n            result.end = new ParsedComponents(null, result.start.date());\n        }\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){ \n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.end.assign('second', second);\n        }\n\n        hour = parseInt(match[2]);\n        \n        // ----- Minute\n        if (match[MINUTE_GROUP]!= null) {\n            \n            minute = parseInt(match[MINUTE_GROUP]);\n            if(minute >= 60) return result;\n            \n        } else if (hour > 100) {\n\n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        }\n\n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) { \n            meridiem = 1;\n        }\n        \n        // ----- AM & PM \n        if (match[AM_PM_HOUR_GROUP] != null) {\n\n            if (hour > 12) return null;\n\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if (ampm === 'morgens' || ampm === 'vormittags') {\n                meridiem = 0; \n                if(hour == 12) {\n                    hour = 0;\n                    if (!result.end.isCertain('day')) {\n                        result.end.imply('day', result.end.get('day') + 1);\n                    }\n                }\n            } else {\n                meridiem = 1; \n                if(hour != 12) hour += 12;\n            }\n            \n            if (!result.start.isCertain('meridiem')) {\n                if (meridiem == 0) {\n                    \n                    result.start.imply('meridiem', 0);\n                    \n                    if (result.start.get('hour') == 12) {\n                        result.start.assign('hour', 0);\n                    }\n\n                } else {\n\n                    result.start.imply('meridiem', 1);\n                    \n                    if (result.start.get('hour') != 12) {\n                        result.start.assign('hour', result.start.get('hour') + 12); \n                    }\n                }\n            }\n        }\n\n        result.text = result.text + match[0];\n        result.end.assign('hour', hour);\n        result.end.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.end.assign('meridiem', meridiem);\n        } else {\n            var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n            if (startAtPM && result.start.get('hour') > hour) {\n                // 10pm - 1 (am)\n                result.end.imply('meridiem', 0);\n\n            } else if (hour > 12) {\n                result.end.imply('meridiem', 1);\n            }\n        }\n\n        if (result.end.date().getTime() < result.start.date().getTime()) {\n            result.end.imply('day', result.end.get('day') + 1)\n        }\n        \n        return result;\n    }\n}\n","/*\n\n\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar DAYS_OFFSET = {\n    'sonntag': 0, 'so': 0,\n    'montag': 1, 'mo': 1,\n    'dienstag': 2, 'di': 2,\n    'mittwoch': 3, 'mi': 3,\n    'donnerstag': 4, 'do': 4,\n    'freitag': 5, 'fr': 5,\n    'samstag': 6, 'sa': 6\n};\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:(?:\\\\,|\\\\(|\\\\（)\\\\s*)?' +\n    '(?:a[mn]\\\\s*?)?' +\n    '(?:(diese[mn]|letzte[mn]|n(?:ä|ae)chste[mn])\\\\s*)?' +\n    '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n    '(?:\\\\s*(?:\\\\,|\\\\)|\\\\）))?' +\n    '(?:\\\\s*(diese|letzte|n(?:ä|ae)chste)\\\\s*woche)?' +\n    '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\nexports.Parser = function DEWeekdayParser() {\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; };\n\n    this.extract = function(text, ref, match, opt){\n        var index = match.index + match[1].length;\n        var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n        var offset = DAYS_OFFSET[dayOfWeek];\n        if(offset === undefined) return null;\n\n        var startMoment = moment(ref);\n        var prefix = match[PREFIX_GROUP];\n        var postfix = match[POSTFIX_GROUP];\n\n        var refOffset = startMoment.day();\n        var norm = prefix || postfix;\n        norm = norm || '';\n        norm = norm.toLowerCase();\n        if (/letzte/.test(norm)) {\n            startMoment.day(offset - 7);\n        } else if (/n(?:ä|ae)chste/.test(norm)) {\n            startMoment.day(offset + 7);\n        } else if (/diese/.test(norm)) {\n            if ( opt.forwardDatesOnly && refOffset > offset ) {\n                startMoment.day(offset + 7);\n            } else {\n                startMoment.day(offset);\n            }\n        } else {\n            if ( opt.forwardDatesOnly && refOffset > offset ) {\n                startMoment.day(offset + 7);\n            } else if (!opt.forwardDatesOnly && Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) {\n                startMoment.day(offset - 7);\n            } else if (!opt.forwardDatesOnly && Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) {\n                startMoment.day(offset + 7);\n            } else {\n                startMoment.day(offset);\n            }\n        }\n\n        result.start.assign('weekday', offset);\n        result.start.imply('day', startMoment.date());\n        result.start.imply('month', startMoment.month() + 1);\n        result.start.imply('year', startMoment.year());\n        return result;\n    }\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp(\n    '(\\\\W|^)(' +\n        'jetzt|' +\n        '(?:heute|diesen)\\\\s*(morgen|vormittag|mittag|nachmittag|abend)|' +\n        '(?:heute|diese)\\\\s*nacht|' +\n        'heute|' +\n        '(?:(?:ü|ue)ber)?morgen(?:\\\\s*(morgen|vormittag|mittag|nachmittag|abend|nacht))?|' +\n        '(?:vor)?gestern(?:\\\\s*(morgen|vormittag|mittag|nachmittag|abend|nacht))?|' +\n        'letzte\\\\s*nacht' +\n    ')(?=\\\\W|$)', 'i');\n\nexports.Parser = function DECasualDateParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt) {\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n        var lowerText = text.toLowerCase();\n\n        if (/(?:heute|diese)\\s*nacht/.test(lowerText)) {\n            // Normally means this coming midnight\n            result.start.imply('hour', 22);\n            result.start.imply('meridiem', 1);\n        } else if (/^(?:ü|ue)bermorgen/.test(lowerText)) {\n            startMoment.add(refMoment.hour() > 1 ? 2 : 1, 'day');\n        } else if (/^morgen/.test(lowerText)) {\n            // Check not \"Tomorrow\" on late night\n            if (refMoment.hour() > 1) {\n                startMoment.add(1, 'day');\n            }\n        } else if (/^gestern/.test(lowerText)) {\n            startMoment.add(-1, 'day');\n        } else if (/^vorgestern/.test(lowerText)) {\n            startMoment.add(-2, 'day');\n        } else if (/letzte\\s*nacht/.test(lowerText)) {\n            result.start.imply('hour', 0);\n            if (refMoment.hour() > 6) {\n                startMoment.add(-1, 'day');\n            }\n        } else if (lowerText === 'jetzt') {\n          result.start.imply('hour', refMoment.hour());\n          result.start.imply('minute', refMoment.minute());\n          result.start.imply('second', refMoment.second());\n          result.start.imply('millisecond', refMoment.millisecond());\n        }\n\n        var secondMatch = match[3] || match[4] || match[5];\n        if (secondMatch) {\n            switch (secondMatch.toLowerCase()) {\n                case 'morgen':\n                    result.start.imply('hour', 6);\n                    break;\n                case 'vormittag':\n                    result.start.imply('hour', 9);\n                    break;\n                case 'mittag':\n                    result.start.imply('hour', 12);\n                    break;\n                case 'nachmittag':\n                    result.start.imply('hour', 15);\n                    result.start.imply('meridiem', 1);\n                    break;\n                case 'abend':\n                    result.start.imply('hour', 18);\n                    result.start.imply('meridiem', 1);\n                    break;\n                case 'nacht':\n                    result.start.imply('hour', 0);\n                    break;\n            }\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags['DECasualDateParser'] = true;\n        return result;\n    }\n}\n","\nfunction Parser(config) {\n\n    config = config || {};\n    var strictMode = config.strict;\n\n    this.isStrictMode = function() { return (strictMode == true) };\n\n    this.pattern = function() { return /./i; }\n\n    this.extract = function(text, ref, match, opt){ return null; }\n\n    this.execute = function(text, ref, opt) {\n\n        var results = [];\n        var regex = this.pattern();\n\n        var remainingText = text;\n        var match = regex.exec(remainingText);\n\n        while (match) {\n\n            // Calculate match index on the full text;\n            match.index += text.length - remainingText.length;\n\n            var result = this.extract(text, ref, match, opt);\n            if (result) {\n\n                // If success, start from the end of the result\n                remainingText = text.substring(result.index + result.text.length);\n\n                if (!this.isStrictMode() || result.hasPossibleDates()) {\n                    results.push(result);\n                }\n\n            } else {\n                // If fail, move on by 1\n                remainingText = text.substring(match.index + 1);\n            }\n\n            match = regex.exec(remainingText);\n        }\n\n        if (this.refiners) {\n            this.refiners.forEach(function () {\n                results = refiner.refine(results, text, options);\n            });\n        }\n\n        return results;\n    }\n}\n\nexports.Parser = Parser;\n\nexports.ENISOFormatParser = require('./EN/ENISOFormatParser').Parser;\nexports.ENDeadlineFormatParser = require('./EN/ENDeadlineFormatParser').Parser;\nexports.ENRelativeDateFormatParser = require('./EN/ENRelativeDateFormatParser').Parser;\nexports.ENMonthNameLittleEndianParser = require('./EN/ENMonthNameLittleEndianParser').Parser;\nexports.ENMonthNameMiddleEndianParser = require('./EN/ENMonthNameMiddleEndianParser').Parser;\nexports.ENMonthNameParser = require('./EN/ENMonthNameParser').Parser;\nexports.ENSlashDateFormatParser = require('./EN/ENSlashDateFormatParser').Parser;\nexports.ENSlashDateFormatStartWithYearParser = require('./EN/ENSlashDateFormatStartWithYearParser').Parser;\nexports.ENSlashMonthFormatParser = require('./EN/ENSlashMonthFormatParser').Parser;\nexports.ENTimeAgoFormatParser = require('./EN/ENTimeAgoFormatParser').Parser;\nexports.ENTimeExpressionParser = require('./EN/ENTimeExpressionParser').Parser;\nexports.ENTimeFromNowFormatParser = require('./EN/ENTimeFromNowFormatParser').Parser;\nexports.ENWeekdayParser = require('./EN/ENWeekdayParser').Parser;\nexports.ENCasualDateParser = require('./EN/ENCasualDateParser').Parser;\nexports.ENCasualTimeParser = require('./EN/ENCasualTimeParser').Parser;\n\nexports.JPStandardParser = require('./JP/JPStandardParser').Parser;\nexports.JPCasualDateParser = require('./JP/JPCasualDateParser').Parser;\n\nexports.ESCasualDateParser = require('./ES/ESCasualDateParser').Parser;\nexports.ESDeadlineFormatParser = require('./ES/ESDeadlineFormatParser').Parser;\nexports.ESTimeAgoFormatParser = require('./ES/ESTimeAgoFormatParser').Parser;\nexports.ESTimeExpressionParser = require('./ES/ESTimeExpressionParser').Parser;\nexports.ESWeekdayParser = require('./ES/ESWeekdayParser').Parser;\nexports.ESMonthNameLittleEndianParser = require('./ES/ESMonthNameLittleEndianParser').Parser;\nexports.ESSlashDateFormatParser = require('./ES/ESSlashDateFormatParser').Parser;\n\nexports.FRCasualDateParser = require('./FR/FRCasualDateParser').Parser;\nexports.FRDeadlineFormatParser = require('./FR/FRDeadlineFormatParser').Parser;\nexports.FRMonthNameLittleEndianParser = require('./FR/FRMonthNameLittleEndianParser').Parser;\nexports.FRSlashDateFormatParser = require('./FR/FRSlashDateFormatParser').Parser;\nexports.FRTimeAgoFormatParser = require('./FR/FRTimeAgoFormatParser').Parser;\nexports.FRTimeExpressionParser = require('./FR/FRTimeExpressionParser').Parser;\nexports.FRWeekdayParser = require('./FR/FRWeekdayParser').Parser;\nexports.FRRelativeDateFormatParser = require('./FR/FRRelativeDateFormatParser').Parser;\n\nexports.ZHHantDateParser = require('./ZH-Hant/ZHHantDateParser').Parser;\nexports.ZHHantWeekdayParser = require('./ZH-Hant/ZHHantWeekdayParser').Parser;\nexports.ZHHantTimeExpressionParser = require('./ZH-Hant/ZHHantTimeExpressionParser').Parser;\nexports.ZHHantCasualDateParser = require('./ZH-Hant/ZHHantCasualDateParser').Parser;\nexports.ZHHantDeadlineFormatParser = require('./ZH-Hant/ZHHantDeadlineFormatParser').Parser;\n\nexports.DEDeadlineFormatParser = require('./DE/DEDeadlineFormatParser').Parser;\nexports.DEMonthNameLittleEndianParser = require('./DE/DEMonthNameLittleEndianParser').Parser;\nexports.DEMonthNameParser = require('./DE/DEMonthNameParser').Parser;\nexports.DESlashDateFormatParser = require('./DE/DESlashDateFormatParser').Parser;\nexports.DETimeAgoFormatParser = require('./DE/DETimeAgoFormatParser').Parser;\nexports.DETimeExpressionParser = require('./DE/DETimeExpressionParser').Parser;\nexports.DEWeekdayParser = require('./DE/DEWeekdayParser').Parser;\nexports.DECasualDateParser = require('./DE/DECasualDateParser').Parser;\n","/*\n  \n*/\nvar Refiner = require('./refiner').Refiner;\n\nexports.Refiner = function OverlapRemovalRefiner() {\n\tRefiner.call(this);\n\t\n\n\tthis.refine = function(text, results, opt) { \n\n        if (results.length < 2) return results;\n        \n        var filteredResults = [];\n        var prevResult = results[0];\n        \n        for (var i=1; i<results.length; i++){\n            \n            var result = results[i];\n            \n            // If overlap, compare the length and discard the shorter one\n            if (result.index < prevResult.index + prevResult.text.length) {\n\n                if (result.text.length > prevResult.text.length){\n                    prevResult = result;\n                }\n                \n            } else {\n                filteredResults.push(prevResult);\n                prevResult = result;\n            }\n        }\n        \n        // The last one\n        if (prevResult != null) {\n            filteredResults.push(prevResult);\n        }\n\n        return filteredResults;\n    }\n}","/*\n  \n*/\nvar Refiner = require('./refiner').Refiner;\n\n\nvar TIMEZONE_OFFSET_PATTERN = new RegExp(\"^\\\\s*(GMT|UTC)?(\\\\+|\\\\-)(\\\\d{1,2}):?(\\\\d{2})\", 'i');\nvar TIMEZONE_OFFSET_SIGN_GROUP = 2;\nvar TIMEZONE_OFFSET_HOUR_OFFSET_GROUP = 3;\nvar TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP = 4;\n\nexports.Refiner = function ExtractTimezoneOffsetRefiner() {\n    Refiner.call(this);\n\n    this.refine = function(text, results, opt) {\n\n        results.forEach(function(result) {\n\n            if (result.start.isCertain('timezoneOffset')) {\n                return;\n            }\n\n            var match = TIMEZONE_OFFSET_PATTERN.exec(text.substring(result.index + result.text.length));\n            if (!match) {\n                return;\n            }\n\n            var hourOffset = parseInt(match[TIMEZONE_OFFSET_HOUR_OFFSET_GROUP]);\n            var minuteOffset = parseInt(match[TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP]);\n            var timezoneOffset = hourOffset * 60 + minuteOffset;\n            if (match[TIMEZONE_OFFSET_SIGN_GROUP] === '-') {\n                timezoneOffset = -timezoneOffset;\n            }\n\n            if (result.end != null) {\n                result.end.assign('timezoneOffset', timezoneOffset);\n            }\n\n            result.start.assign('timezoneOffset', timezoneOffset);\n            result.text += match[0];\n            result.tags['ExtractTimezoneOffsetRefiner'] = true;\n        });\n\n        return results;\n    }\n}\n","/*\n\n*/\nvar Refiner = require('./refiner').Refiner;\n\n// Map ABBR -> Offset in minute\nvar TIMEZONE_ABBR_MAP = {};\nvar TIMEZONE_NAME_PATTERN = new RegExp(\"^\\\\s*\\\\(?([A-Z]{2,4})\\\\)?(?=\\\\W|$)\", 'i');\n\nexports.Refiner = function ExtractTimezoneAbbrRefiner() {\n\tRefiner.call(this);\n\n\tthis.refine = function(text, results, opt) {\n\n\t\tresults.forEach(function(result) {\n\n            if (!result.tags['ENTimeExpressionParser'] && !result.tags['ZHTimeExpressionParser'] && !result.tags['FRTimeExpressionParser'] && !result.tags['DETimeExpressionParser']) {\n                return;\n            }\n\n            var match = TIMEZONE_NAME_PATTERN.exec(text.substring(result.index + result.text.length));\n            if (match) {\n                var timezoneAbbr = match[1].toUpperCase();\n                if (TIMEZONE_ABBR_MAP[timezoneAbbr] === undefined) {\n                    return;\n                }\n\n                var timezoneOffset = TIMEZONE_ABBR_MAP[timezoneAbbr];\n                if (!result.start.isCertain('timezoneOffset')) {\n                    result.start.assign('timezoneOffset', timezoneOffset);\n                }\n\n                if (result.end != null && !result.end.isCertain('timezoneOffset')) {\n                    result.end.assign('timezoneOffset', timezoneOffset);\n                }\n\n                result.text += match[0];\n                result.tags['ExtractTimezoneAbbrRefiner'] = true;\n            }\n\t\t});\n\n        return results;\n\t}\n}\n\n// TODO: Move this to some configuration\nTIMEZONE_ABBR_MAP = {\"ACDT\":630,\"ACST\":570,\"ADT\":-180,\"AEDT\":660,\"AEST\":600,\"AFT\":270,\"AKDT\":-480,\"AKST\":-540,\"ALMT\":360,\"AMST\":-180,\"AMT\":-240,\"ANAST\":720,\"ANAT\":720,\"AQTT\":300,\"ART\":-180,\"AST\":-240,\"AWDT\":540,\"AWST\":480,\"AZOST\":0,\"AZOT\":-60,\"AZST\":300,\"AZT\":240,\"BNT\":480,\"BOT\":-240,\"BRST\":-120,\"BRT\":-180,\"BST\":60,\"BTT\":360,\"CAST\":480,\"CAT\":120,\"CCT\":390,\"CDT\":-300,\"CEST\":120,\"CET\":60,\"CHADT\":825,\"CHAST\":765,\"CKT\":-600,\"CLST\":-180,\"CLT\":-240,\"COT\":-300,\"CST\":-360,\"CVT\":-60,\"CXT\":420,\"ChST\":600,\"DAVT\":420,\"EASST\":-300,\"EAST\":-360,\"EAT\":180,\"ECT\":-300,\"EDT\":-240,\"EEST\":180,\"EET\":120,\"EGST\":0,\"EGT\":-60,\"EST\":-300,\"ET\":-300,\"FJST\":780,\"FJT\":720,\"FKST\":-180,\"FKT\":-240,\"FNT\":-120,\"GALT\":-360,\"GAMT\":-540,\"GET\":240,\"GFT\":-180,\"GILT\":720,\"GMT\":0,\"GST\":240,\"GYT\":-240,\"HAA\":-180,\"HAC\":-300,\"HADT\":-540,\"HAE\":-240,\"HAP\":-420,\"HAR\":-360,\"HAST\":-600,\"HAT\":-90,\"HAY\":-480,\"HKT\":480,\"HLV\":-210,\"HNA\":-240,\"HNC\":-360,\"HNE\":-300,\"HNP\":-480,\"HNR\":-420,\"HNT\":-150,\"HNY\":-540,\"HOVT\":420,\"ICT\":420,\"IDT\":180,\"IOT\":360,\"IRDT\":270,\"IRKST\":540,\"IRKT\":540,\"IRST\":210,\"IST\":60,\"JST\":540,\"KGT\":360,\"KRAST\":480,\"KRAT\":480,\"KST\":540,\"KUYT\":240,\"LHDT\":660,\"LHST\":630,\"LINT\":840,\"MAGST\":720,\"MAGT\":720,\"MART\":-510,\"MAWT\":300,\"MDT\":-360,\"MESZ\":120,\"MEZ\":60,\"MHT\":720,\"MMT\":390,\"MSD\":240,\"MSK\":240,\"MST\":-420,\"MUT\":240,\"MVT\":300,\"MYT\":480,\"NCT\":660,\"NDT\":-90,\"NFT\":690,\"NOVST\":420,\"NOVT\":360,\"NPT\":345,\"NST\":-150,\"NUT\":-660,\"NZDT\":780,\"NZST\":720,\"OMSST\":420,\"OMST\":420,\"PDT\":-420,\"PET\":-300,\"PETST\":720,\"PETT\":720,\"PGT\":600,\"PHOT\":780,\"PHT\":480,\"PKT\":300,\"PMDT\":-120,\"PMST\":-180,\"PONT\":660,\"PST\":-480,\"PT\":-480,\"PWT\":540,\"PYST\":-180,\"PYT\":-240,\"RET\":240,\"SAMT\":240,\"SAST\":120,\"SBT\":660,\"SCT\":240,\"SGT\":480,\"SRT\":-180,\"SST\":-660,\"TAHT\":-600,\"TFT\":300,\"TJT\":300,\"TKT\":780,\"TLT\":540,\"TMT\":300,\"TVT\":720,\"ULAT\":480,\"UTC\":0,\"UYST\":-120,\"UYT\":-180,\"UZT\":300,\"VET\":-210,\"VLAST\":660,\"VLAT\":660,\"VUT\":660,\"WAST\":120,\"WAT\":60,\"WEST\":60,\"WESZ\":60,\"WET\":0,\"WEZ\":0,\"WFT\":720,\"WGST\":-120,\"WGT\":-180,\"WIB\":420,\"WIT\":540,\"WITA\":480,\"WST\":780,\"WT\":0,\"YAKST\":600,\"YAKT\":600,\"YAPT\":600,\"YEKST\":360,\"YEKT\":360}\n","/*\n    Enforce 'forwardDate' option to on the results. When there are missing component,\n    e.g. \"March 12-13 (without year)\" or \"Thursday\", the refiner will try to adjust the result\n    into the future instead of the past.\n*/\nvar moment = require('moment');\nvar Refiner = require('./refiner').Refiner;\n\nexports.Refiner = function ForwardDateRefiner() {\n    Refiner.call(this);\n\n    this.refine = function(text, results, opt) {\n\n        if (!opt['forwardDate'] && !opt['forwardDatesOnly']) {\n            return results;\n        }\n\n        results.forEach(function(result) {\n\n            var refMoment = moment(result.ref);\n\n            if (result.start.isCertain('day') && result.start.isCertain('month') &&\n                !result.start.isCertain('year') &&\n                refMoment.isAfter(result.start.moment())\n            ) {\n                // Adjust year into the future\n                for (var i=0; i < 3 && refMoment.isAfter(result.start.moment()); i++) {\n                    result.start.imply('year', result.start.get('year') + 1);\n\n                    if (result.end && !result.end.isCertain('year')) {\n                        result.end.imply('year', result.end.get('year') + 1);\n                    }\n                }\n\n                result.tags['ExtractTimezoneOffsetRefiner'] = true;\n            }\n\n            if (!result.start.isCertain('day') && !result.start.isCertain('month') && !result.start.isCertain('year') &&\n                result.start.isCertain('weekday') &&\n                refMoment.isAfter(result.start.moment())\n            ) {\n                // Adjust date to the coming week\n                if (refMoment.day() > result.start.get('weekday')) {\n                    refMoment.day(result.start.get('weekday') + 7);\n                } else {\n                    refMoment.day(result.start.get('weekday'));\n                }\n\n                result.start.imply('day', refMoment.date());\n                result.start.imply('month', refMoment.month() + 1);\n                result.start.imply('year', refMoment.year());\n                result.tags['ExtractTimezoneOffsetRefiner'] = true;\n            }\n        });\n\n        return results;\n    }\n};\n","/*\n  \n*/\nvar Filter = require('./refiner').Filter;\n\nexports.Refiner = function UnlikelyFormatFilter() {\n    Filter.call(this);\n    \n\n    this.isValid = function(text, result, opt) { \n\n        if (result.text.replace(' ','').match(/^\\d*(\\.\\d*)?$/)) {\n            return false;\n        }\n\n        return true; \n    }\n}","/*\n    \n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\nvar PATTERN = new RegExp(\"^\\\\s*(T|at|after|before|on|of|,|-)?\\\\s*$\");\n\nvar isDateOnly = exports.isDateOnly = function(result) {\n    return !result.start.isCertain('hour');\n}\n    \nvar isTimeOnly = exports.isTimeOnly = function(result) {\n    return !result.start.isCertain('month') && !result.start.isCertain('weekday');\n}\n\nvar isAbleToMerge = exports.isAbleToMerge = function(text, prevResult, curResult) {\n    var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\n    return textBetween.match(PATTERN);\n}\n\nvar mergeDateTimeComponent = exports.mergeDateTimeComponent = function(dateComponent, timeComponent) {\n    var dateTimeComponent = dateComponent.clone();\n\n    if (timeComponent.isCertain('hour')) {\n        dateTimeComponent.assign('hour', timeComponent.get('hour'));\n        dateTimeComponent.assign('minute', timeComponent.get('minute'));\n        dateTimeComponent.assign('second', timeComponent.get('second'));\n    } else {\n        dateTimeComponent.imply('hour', timeComponent.get('hour'));\n        dateTimeComponent.imply('minute', timeComponent.get('minute'));\n        dateTimeComponent.imply('second', timeComponent.get('second'));\n    }\n\n\n    if (timeComponent.isCertain('meridiem')) {\n        dateTimeComponent.assign('meridiem', timeComponent.get('meridiem'));\n    } else if (\n        timeComponent.get('meridiem') !== undefined &&\n        dateTimeComponent.get('meridiem') === undefined\n    ) {\n        dateTimeComponent.imply('meridiem', timeComponent.get('meridiem'));\n    }\n\n    if (dateTimeComponent.get('meridiem') == 1 && dateTimeComponent.get('hour') < 12) {\n        if (timeComponent.isCertain('hour')) {\n            dateTimeComponent.assign('hour', dateTimeComponent.get('hour') + 12);\n        } else {\n            dateTimeComponent.imply('hour', dateTimeComponent.get('hour') + 12);\n        }\n    }\n\n    return dateTimeComponent;\n}\n\n\nfunction mergeResult(text, dateResult, timeResult){\n\n    var beginDate = dateResult.start;\n    var beginTime = timeResult.start;\n    var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\n    \n    if (dateResult.end != null || timeResult.end != null) {\n        \n        var endDate   = dateResult.end == null ? dateResult.start : dateResult.end;            \n        var endTime   = timeResult.end == null ? timeResult.start : timeResult.end;\n        var endDateTime = mergeDateTimeComponent(endDate, endTime);\n        \n        if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\n            // Ex. 9pm - 1am\n            if (endDateTime.isCertain('day')) {\n                endDateTime.assign('day', endDateTime.get('day') + 1);\n            } else {\n                endDateTime.imply('day', endDateTime.get('day') + 1);\n            }\n        }\n\n        dateResult.end = endDateTime;\n    }\n\n    dateResult.start = beginDateTime;    \n\n    var startIndex = Math.min(dateResult.index, timeResult.index);\n    var endIndex = Math.max(\n            dateResult.index + dateResult.text.length, \n            timeResult.index + timeResult.text.length);\n    \n    dateResult.index = startIndex;\n    dateResult.text  = text.substring(startIndex, endIndex);\n\n    for (var tag in timeResult.tags) {\n        dateResult.tags[tag] = true;\n    }\n    dateResult.tags['ENMergeDateAndTimeRefiner'] = true;\n    return dateResult;\n}\n\nexports.Refiner = function ENMergeDateTimeRefiner() {\n    Refiner.call(this);\n\n\n    this.refine = function(text, results, opt) { \n\n        if (results.length < 2) return results;\n\n        var mergedResult = [];\n        var currResult = null;\n        var prevResult = null;\n\n        for (var i = 1; i < results.length; i++) {\n\n            currResult = results[i];\n            prevResult = results[i-1];\n            \n            if (isDateOnly(prevResult) && isTimeOnly(currResult) \n                    && isAbleToMerge(text, prevResult, currResult)) {\n                \n                prevResult = mergeResult(text, prevResult, currResult);\n                currResult = results[i + 1];\n                i += 1;\n                \n            } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\n                    && isAbleToMerge(text, prevResult, currResult)) {\n                \n                prevResult = mergeResult(text, currResult, prevResult);\n                currResult = results[i + 1];\n                i += 1;\n            }\n            \n            mergedResult.push(prevResult);\n        }\n\n        if (currResult != null) {\n            mergedResult.push(currResult);\n        }\n\n        return mergedResult;\n    }\n}","/*\n  \n*/\nvar Refiner = require('../refiner').Refiner;\n\nexports.Refiner = function ENMergeDateRangeRefiner() {\n    Refiner.call(this);\n\n    this.pattern = function () { return /^\\s*(to|\\-)\\s*$/i };\n\n    this.refine = function(text, results, opt) {\n\n        if (results.length < 2) return results;\n        \n        var mergedResult = [];\n        var currResult = null;\n        var prevResult = null;\n        \n        for (var i=1; i<results.length; i++){\n            \n            currResult = results[i];\n            prevResult = results[i-1];\n            \n            if (!prevResult.end && !currResult.end \n                && this.isAbleToMerge(text, prevResult, currResult)) {\n              \n                prevResult = this.mergeResult(text, prevResult, currResult);\n                currResult = null;\n                i += 1;\n            }\n            \n            mergedResult.push(prevResult);\n        }\n        \n        if (currResult != null) {\n            mergedResult.push(currResult);\n        }\n\n\n        return mergedResult;\n    };\n\n    this.isAbleToMerge = function(text, result1, result2) {\n        var begin = result1.index + result1.text.length;\n        var end   = result2.index;\n        var textBetween = text.substring(begin,end);\n\n        return textBetween.match(this.pattern());\n    };\n\n    this.isWeekdayResult = function (result) {\n        return result.start.isCertain('weekday') && !result.start.isCertain('day');\n    };\n\n    this.mergeResult = function(text, fromResult, toResult) {\n\n        if (!this.isWeekdayResult(fromResult) && !this.isWeekdayResult(toResult)) {\n            \n            var timeKeys = {'hour': true, 'minute': true, 'second': true};\n\n            for (var key in toResult.start.knownValues) {\n                if (!fromResult.start.isCertain(key)) {\n                    fromResult.start.assign(key, toResult.start.get(key));\n                }\n            }\n\n            for (var key in fromResult.start.knownValues) {\n                if (!toResult.start.isCertain(key)) {\n                    toResult.start.assign(key, fromResult.start.get(key));\n                }\n            }\n        }\n\n        if (fromResult.start.date().getTime() > toResult.start.date().getTime()) {\n            \n            var fromMoment = fromResult.start.moment();\n            var toMoment = toResult.start.moment();\n\n            if (this.isWeekdayResult(fromResult) && fromMoment.clone().add(-7, 'days').isBefore(toMoment)) {\n                fromMoment = fromMoment.add(-7, 'days');\n                fromResult.start.imply('day', fromMoment.date());\n                fromResult.start.imply('month', fromMoment.month() + 1);\n                fromResult.start.imply('year', fromMoment.year());\n            } else if (this.isWeekdayResult(toResult) && toMoment.clone().add(7, 'days').isAfter(fromMoment)) {\n                toMoment = toMoment.add(7, 'days');\n                toResult.start.imply('day', toMoment.date());\n                toResult.start.imply('month', toMoment.month() + 1);\n                toResult.start.imply('year', toMoment.year());\n            } else {\n                var tmp = toResult;\n                toResult = fromResult;\n                fromResult = tmp;\n            }\n        }\n        \n        fromResult.end = toResult.start;\n\n        \n\n        for (var tag in toResult.tags) {\n            fromResult.tags[tag] = true;\n        }\n\n            \n        var startIndex = Math.min(fromResult.index, toResult.index);\n        var endIndex = Math.max(\n            fromResult.index + fromResult.text.length, \n            toResult.index + toResult.text.length);\n            \n        fromResult.index = startIndex;\n        fromResult.text  = text.substring(startIndex, endIndex);\n        fromResult.tags[this.constructor.name] = true;\n        return fromResult;\n    }\n};\n\n","/*\n\n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\n\nvar PATTERN = new RegExp(\"^\\\\s*(at|after|before|on|,|-|\\\\(|\\\\))?\\\\s*$\");\n\nfunction isMoreSpecific(prevResult, currResult) {\n    var moreSpecific = false;\n\n    if (prevResult.start.isCertain('year')) {\n        if (!currResult.start.isCertain('year')) {\n            moreSpecific = true;\n        } else {\n            if (prevResult.start.isCertain('month')) {\n                if (!currResult.start.isCertain('month')) {\n                    moreSpecific = true;\n                } else {\n                    if (prevResult.start.isCertain('day') && !currResult.start.isCertain('day')) {\n                        moreSpecific = true;\n                    }\n                }\n            }\n        }\n    }\n\n    return moreSpecific;\n}\n\n\nfunction isAbleToMerge(text, prevResult, currResult) {\n    var textBetween = text.substring(prevResult.index + prevResult.text.length, currResult.index);\n\n    // Only accepts merge if one of them comes from casual relative date\n    var includesRelativeResult = (prevResult.tags['ENRelativeDateFormatParser'] || currResult.tags['ENRelativeDateFormatParser']);\n\n    // We assume they refer to the same date if all date fields are implied\n    var referToSameDate = !prevResult.start.isCertain('day') && !prevResult.start.isCertain('month') && !prevResult.start.isCertain('year');\n\n    // If both years are certain, that determines if they refer to the same date\n    // but with one more specific than the other\n    if (prevResult.start.isCertain('year') && currResult.start.isCertain('year'))\n        referToSameDate = (prevResult.start.get('year') === currResult.start.get('year'));\n\n    // We now test with the next level (month) if they refer to the same date\n    if (prevResult.start.isCertain('month') && currResult.start.isCertain('month'))\n        referToSameDate = (prevResult.start.get('month') === currResult.start.get('month')) && referToSameDate;\n\n    return includesRelativeResult && textBetween.match(PATTERN) && referToSameDate;\n}\n\nfunction mergeResult(text, specificResult, nonSpecificResult){\n\n    var specificDate = specificResult.start;\n    var nonSpecificDate = nonSpecificResult.start;\n\n    var startIndex = Math.min(specificResult.index, nonSpecificResult.index);\n    var endIndex = Math.max(\n            specificResult.index + specificResult.text.length,\n            nonSpecificResult.index + nonSpecificResult.text.length);\n\n    specificResult.index = startIndex;\n    specificResult.text  = text.substring(startIndex, endIndex);\n\n    for (var tag in nonSpecificResult.tags) {\n        specificResult.tags[tag] = true;\n    }\n    specificResult.tags['ENPrioritizeSpecificDateRefiner'] = true;\n    return specificResult;\n}\n\nexports.Refiner = function ENPrioritizeSpecificDateRefiner() {\n    Refiner.call(this);\n\n    this.refine = function(text, results, opt) {\n\n        if (results.length < 2) return results;\n\n        var mergedResult = [];\n        var currResult = null;\n        var prevResult = null;\n\n        for (var i = 1; i < results.length; i++) {\n\n            currResult = results[i];\n            prevResult = results[i-1];\n\n            if (isMoreSpecific(prevResult, currResult)\n                    && isAbleToMerge(text, prevResult, currResult)) {\n\n                prevResult = mergeResult(text, prevResult, currResult);\n                currResult = null;\n                i += 1;\n\n            } else if (isMoreSpecific(currResult, prevResult)\n                    && isAbleToMerge(text, prevResult, currResult)) {\n\n                prevResult = mergeResult(text, currResult, prevResult);\n                currResult = null;\n                i += 1;\n            }\n\n            mergedResult.push(prevResult);\n        }\n\n        if (currResult != null) {\n            mergedResult.push(currResult);\n        }\n\n        return mergedResult;\n    }\n}\n","/*\n  \n*/\nvar ENMergeDateRangeRefiner = require('../EN/ENMergeDateRangeRefiner').Refiner;\n\nexports.Refiner = function JPMergeDateRangeRefiner() {\n    ENMergeDateRangeRefiner.call(this);\n\n    this.pattern = function () { return /^\\s*(から|ー)\\s*$/i };\n}\n\n","/*\r\n  \r\n*/\r\nvar Refiner = require('../refiner').Refiner;\r\n\r\nexports.Refiner = function FRMergeDateRangeRefiner() {\r\n    Refiner.call(this);\r\n\r\n    this.pattern = function () { return /^\\s*(à|a|\\-)\\s*$/i };\r\n\r\n    this.refine = function(text, results, opt) {\r\n\r\n        if (results.length < 2) return results;\r\n        \r\n        var mergedResult = [];\r\n        var currResult = null;\r\n        var prevResult = null;\r\n        \r\n        for (var i=1; i<results.length; i++){\r\n            \r\n            currResult = results[i];\r\n            prevResult = results[i-1];\r\n            \r\n            if (!prevResult.end && !currResult.end \r\n                && this.isAbleToMerge(text, prevResult, currResult)) {\r\n              \r\n                prevResult = this.mergeResult(text, prevResult, currResult);\r\n                currResult = null;\r\n                i += 1;\r\n            }\r\n            \r\n            mergedResult.push(prevResult);\r\n        }\r\n        \r\n        if (currResult != null) {\r\n            mergedResult.push(currResult);\r\n        }\r\n\r\n\r\n        return mergedResult;\r\n    };\r\n\r\n    this.isAbleToMerge = function(text, result1, result2) {\r\n        var begin = result1.index + result1.text.length;\r\n        var end   = result2.index;\r\n        var textBetween = text.substring(begin,end);\r\n\r\n        return textBetween.match(this.pattern());\r\n    };\r\n\r\n    this.isWeekdayResult = function (result) {\r\n        return result.start.isCertain('weekday') && !result.start.isCertain('day');\r\n    };\r\n\r\n    this.mergeResult = function(text, fromResult, toResult) {\r\n\r\n        if (!this.isWeekdayResult(fromResult) && !this.isWeekdayResult(toResult)) {\r\n\r\n            for (var key in toResult.start.knownValues) {\r\n                if (!fromResult.start.isCertain(key)) {\r\n                    fromResult.start.assign(key, toResult.start.get(key));\r\n                }\r\n            }\r\n\r\n            for (var key in fromResult.start.knownValues) {\r\n                if (!toResult.start.isCertain(key)) {\r\n                    toResult.start.assign(key, fromResult.start.get(key));\r\n                }\r\n            }\r\n        }\r\n\r\n        if (fromResult.start.date().getTime() > toResult.start.date()) {\r\n            var tmp = toResult;\r\n            toResult = fromResult;\r\n            fromResult = tmp;\r\n        }\r\n        \r\n        fromResult.end = toResult.start;\r\n\r\n        \r\n\r\n        for (var tag in toResult.tags) {\r\n            fromResult.tags[tag] = true;\r\n        }\r\n\r\n            \r\n        var startIndex = Math.min(fromResult.index, toResult.index);\r\n        var endIndex = Math.max(\r\n            fromResult.index + fromResult.text.length, \r\n            toResult.index + toResult.text.length);\r\n            \r\n        fromResult.index = startIndex;\r\n        fromResult.text  = text.substring(startIndex, endIndex);\r\n        fromResult.tags[this.constructor.name] = true;\r\n        return fromResult;\r\n    }\r\n};\r\n\r\n","/*\r\n    \r\n*/\r\nvar ParsedComponents = require('../../result').ParsedComponents;\r\nvar Refiner = require('../refiner').Refiner;\r\nvar mergeDateTimeComponent = require('../EN/ENMergeDateTimeRefiner').mergeDateTimeComponent;\r\n\r\nvar PATTERN = new RegExp(\"^\\\\s*(T|à|a|vers|de|,|-)?\\\\s*$\");\r\n\r\nfunction isDateOnly(result) {\r\n    return !result.start.isCertain('hour') || result.tags['FRCasualDateParser'];\r\n}\r\n    \r\nfunction isTimeOnly(result) {\r\n    return !result.start.isCertain('month') && !result.start.isCertain('weekday');\r\n}\r\n\r\n\r\nfunction isAbleToMerge(text, prevResult, curResult) {\r\n    var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\r\n    return textBetween.match(PATTERN);\r\n}\r\n\r\nfunction mergeResult(text, dateResult, timeResult){\r\n\r\n    var beginDate = dateResult.start;\r\n    var beginTime = timeResult.start;\r\n    var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\r\n\r\n    if (dateResult.end != null || timeResult.end != null) {\r\n        \r\n        var endDate   = dateResult.end == null ? dateResult.start : dateResult.end;            \r\n        var endTime   = timeResult.end == null ? timeResult.start : timeResult.end;\r\n        var endDateTime = mergeDateTimeComponent(endDate, endTime);\r\n        \r\n        if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\r\n            // Ex. 9pm - 1am\r\n            if (endDateTime.isCertain('day')) {\r\n                endDateTime.assign('day', endDateTime.get('day') + 1);\r\n            } else {\r\n                endDateTime.imply('day', endDateTime.get('day') + 1);\r\n            }\r\n        }\r\n\r\n        dateResult.end = endDateTime;\r\n    }\r\n\r\n    dateResult.start = beginDateTime;    \r\n\r\n    var startIndex = Math.min(dateResult.index, timeResult.index);\r\n    var endIndex = Math.max(\r\n            dateResult.index + dateResult.text.length, \r\n            timeResult.index + timeResult.text.length);\r\n    \r\n    dateResult.index = startIndex;\r\n    dateResult.text  = text.substring(startIndex, endIndex);\r\n\r\n    for (var tag in timeResult.tags) {\r\n        dateResult.tags[tag] = true;\r\n    }\r\n    dateResult.tags['FRMergeDateAndTimeRefiner'] = true;\r\n    return dateResult;\r\n}\r\n\r\nexports.Refiner = function FRMergeDateTimeRefiner() {\r\n    Refiner.call(this);\r\n\r\n\r\n    this.refine = function(text, results, opt) { \r\n\r\n        if (results.length < 2) return results;\r\n\r\n        var mergedResult = [];\r\n        var currResult = null;\r\n        var prevResult = null;\r\n\r\n        for (var i = 1; i < results.length; i++) {\r\n\r\n            currResult = results[i];\r\n            prevResult = results[i-1];\r\n            \r\n            if (isDateOnly(prevResult) && isTimeOnly(currResult) \r\n                    && isAbleToMerge(text, prevResult, currResult)) {\r\n                \r\n                prevResult = mergeResult(text, prevResult, currResult);\r\n                currResult = null;\r\n                i += 1;\r\n                \r\n            } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\r\n                    && isAbleToMerge(text, prevResult, currResult)) {\r\n                \r\n                prevResult = mergeResult(text, currResult, prevResult);\r\n                currResult = null;\r\n                i += 1;\r\n            }\r\n            \r\n            mergedResult.push(prevResult);\r\n        }\r\n\r\n        if (currResult != null) {\r\n            mergedResult.push(currResult);\r\n        }\r\n\r\n        return mergedResult;\r\n    }\r\n}","/*\n  \n*/\nvar ENMergeDateRangeRefiner = require('../EN/ENMergeDateRangeRefiner').Refiner;\n\nexports.Refiner = function DEMergeDateRangeRefiner() {\n    ENMergeDateRangeRefiner.call(this);\n\n    this.pattern = function () {\n        return /^\\s*(bis(?:\\s*(?:am|zum))?|\\-)\\s*$/i\n    };\n};\n","/*\n    \n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\nvar mergeDateTimeComponent = require('../EN/ENMergeDateTimeRefiner').mergeDateTimeComponent;\nvar isDateOnly = require('../EN/ENMergeDateTimeRefiner').isDateOnly;\nvar isTimeOnly = require('../EN/ENMergeDateTimeRefiner').isTimeOnly;\n\nvar PATTERN = new RegExp(\"^\\\\s*(T|um|am|,|-)?\\\\s*$\");\n\nfunction isAbleToMerge(text, prevResult, curResult) {\n    var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\n    return textBetween.match(PATTERN);\n}\n\nfunction mergeResult(text, dateResult, timeResult){\n\n    var beginDate = dateResult.start;\n    var beginTime = timeResult.start;    \n    var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\n\n    if (dateResult.end != null || timeResult.end != null) {\n        \n        var endDate   = dateResult.end == null ? dateResult.start : dateResult.end;            \n        var endTime   = timeResult.end == null ? timeResult.start : timeResult.end;\n        var endDateTime = mergeDateTimeComponent(endDate, endTime);\n        \n        if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\n            // Ex. 9pm - 1am\n            if (endDateTime.isCertain('day')) {\n                endDateTime.assign('day', endDateTime.get('day') + 1);\n            } else {\n                endDateTime.imply('day', endDateTime.get('day') + 1);\n            }\n        }\n\n        dateResult.end = endDateTime;\n    }\n\n    dateResult.start = beginDateTime;    \n\n    var startIndex = Math.min(dateResult.index, timeResult.index);\n    var endIndex = Math.max(\n            dateResult.index + dateResult.text.length, \n            timeResult.index + timeResult.text.length);\n    \n    dateResult.index = startIndex;\n    dateResult.text  = text.substring(startIndex, endIndex);\n\n    for (var tag in timeResult.tags) {\n        dateResult.tags[tag] = true;\n    }\n    dateResult.tags['DEMergeDateAndTimeRefiner'] = true;\n    return dateResult;\n}\n\nexports.Refiner = function DEMergeDateTimeRefiner() {\n    Refiner.call(this);\n\n\n    this.refine = function(text, results, opt) { \n\n        if (results.length < 2) return results;\n\n        var mergedResult = [];\n        var currResult = null;\n        var prevResult = null;\n\n        for (var i = 1; i < results.length; i++) {\n\n            currResult = results[i];\n            prevResult = results[i-1];\n            \n            if (isDateOnly(prevResult) && isTimeOnly(currResult) \n                    && isAbleToMerge(text, prevResult, currResult)) {\n                \n                prevResult = mergeResult(text, prevResult, currResult);\n                currResult = null;\n                i += 1;\n                \n            } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\n                    && isAbleToMerge(text, prevResult, currResult)) {\n                \n                prevResult = mergeResult(text, currResult, prevResult);\n                currResult = null;\n                i += 1;\n            }\n            \n            mergedResult.push(prevResult);\n        }\n\n        if (currResult != null) {\n            mergedResult.push(currResult);\n        }\n\n        return mergedResult;\n    }\n}","\nexports.Refiner = function Refiner() { \n\n    this.refine = function(text, results, opt) { return results; };\n}\n\nexports.Filter = function Filter() { \n    \n    exports.Refiner.call(this);\n\n    this.isValid = function(text, result, opt) { return true; }\n    this.refine = function(text, results, opt) { \n\n        var filteredResult = [];\n        for (var i=0; i < results.length; i++) {\n\n            var result = results[i];\n            if (this.isValid(text, result, opt)) {\n                filteredResult.push(result);\n            }\n        }\n\n        return filteredResult;\n    }\n}\n\n\n// Common refiners\nexports.OverlapRemovalRefiner = require('./OverlapRemovalRefiner').Refiner;\nexports.ExtractTimezoneOffsetRefiner = require('./ExtractTimezoneOffsetRefiner').Refiner;\nexports.ExtractTimezoneAbbrRefiner = require('./ExtractTimezoneAbbrRefiner').Refiner;\nexports.ForwardDateRefiner = require('./ForwardDateRefiner').Refiner;\nexports.UnlikelyFormatFilter = require('./UnlikelyFormatFilter').Refiner;\n\n// EN refiners\nexports.ENMergeDateTimeRefiner = require('./EN/ENMergeDateTimeRefiner').Refiner;\nexports.ENMergeDateRangeRefiner = require('./EN/ENMergeDateRangeRefiner').Refiner;\nexports.ENPrioritizeSpecificDateRefiner = require('./EN/ENPrioritizeSpecificDateRefiner').Refiner;\n\n// JP refiners\nexports.JPMergeDateRangeRefiner = require('./JP/JPMergeDateRangeRefiner').Refiner;\n\n// FR refiners\nexports.FRMergeDateRangeRefiner = require('./FR/FRMergeDateRangeRefiner').Refiner;\nexports.FRMergeDateTimeRefiner = require('./FR/FRMergeDateTimeRefiner').Refiner;\n\n// DE refiners\nexports.DEMergeDateRangeRefiner = require('./DE/DEMergeDateRangeRefiner').Refiner;\nexports.DEMergeDateTimeRefiner = require('./DE/DEMergeDateTimeRefiner').Refiner;\n","var parser = require('./parsers/parser');\nvar refiner = require('./refiners/refiner');\n\n\nexports.mergeOptions = function(options) {\n\n    var addedTypes = {};\n    var mergedOption = {\n        parsers: [],\n        refiners: []\n    };\n\n    options.forEach(function (option) {\n\n        if (option.call) {\n            option = option.call();\n        }\n\n        if (option.parsers) {\n            option.parsers.forEach(function (p) {\n                if (!addedTypes[p.constructor]) {\n                    mergedOption.parsers.push(p);\n                    addedTypes[p.constructor] = true;\n                }\n            });\n        }\n\n        if (option.refiners) {\n            option.refiners.forEach(function (r) {\n                if (!addedTypes[r.constructor]) {\n                    mergedOption.refiners.push(r);\n                    addedTypes[r.constructor] = true;\n                }\n            });\n        }\n    });\n\n    return mergedOption;\n};\n\n\nexports.commonPostProcessing = function() {\n    return {\n        refiners: [\n            // These should be after all other refiners\n            new refiner.ExtractTimezoneOffsetRefiner(),\n            new refiner.ExtractTimezoneAbbrRefiner(),\n            new refiner.UnlikelyFormatFilter()\n        ]\n    }\n};\n\n\n// -------------------------------------------------------------\n\nexports.strictOption = function () {\n    var strictConfig = {\n        strict: true\n    }\n\n    return exports.mergeOptions([\n        exports.en(strictConfig),\n        exports.de(strictConfig),\n        exports.es(strictConfig),\n        exports.fr(strictConfig),\n        exports.ja(strictConfig),\n        exports.zh,\n        exports.commonPostProcessing\n    ]);\n};\n\nexports.casualOption = function () {\n    return exports.mergeOptions([\n        exports.en.casual,\n        // Some German abbriviate overlap with common English\n        exports.de({ strict: true }), \n        exports.es.casual,\n        exports.fr.casual,\n        exports.ja.casual,\n        exports.zh,\n        exports.commonPostProcessing\n    ]);\n};\n\n// -------------------------------------------------------------\n\nexports.de = function(config) {\n    return {\n        parsers: [\n            new parser.DEDeadlineFormatParser(config),\n            new parser.DEMonthNameLittleEndianParser(config),\n            new parser.DEMonthNameParser(config),\n            new parser.DESlashDateFormatParser(config),\n            new parser.DETimeAgoFormatParser(config),\n            new parser.DETimeExpressionParser(config)\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner(),\n            new refiner.DEMergeDateTimeRefiner(),\n            new refiner.DEMergeDateRangeRefiner()\n        ]\n    }\n};\n\nexports.de.casual = function() {\n    var option = exports.de({\n        strict: false\n    });\n    option.parsers.unshift(new parser.DECasualDateParser());\n    option.parsers.unshift(new parser.DEWeekdayParser());\n    return option;\n};\n\n\n\n// -------------------------------------------------------------\n\n\nexports.en = function(config) {\n    return {\n        parsers: [\n            new parser.ENISOFormatParser(config),\n            new parser.ENDeadlineFormatParser(config),\n            new parser.ENMonthNameLittleEndianParser(config),\n            new parser.ENMonthNameMiddleEndianParser(config),\n            new parser.ENMonthNameParser(config),\n            new parser.ENSlashDateFormatParser(config),\n            new parser.ENSlashDateFormatStartWithYearParser(config),\n            new parser.ENSlashMonthFormatParser(config),\n            new parser.ENTimeAgoFormatParser(config),\n            new parser.ENTimeFromNowFormatParser(config),\n            new parser.ENTimeExpressionParser(config)\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner(),\n\n            // English\n            new refiner.ENMergeDateTimeRefiner(),\n            new refiner.ENMergeDateRangeRefiner(),\n            new refiner.ENPrioritizeSpecificDateRefiner()\n        ]\n    }\n};\n\nexports.en.casual = function(config) {\n    config = config || {};\n    config.strict = false;\n    var option = exports.en(config);\n\n    // EN\n    option.parsers.unshift(new parser.ENCasualDateParser());\n    option.parsers.unshift(new parser.ENCasualTimeParser());\n    option.parsers.unshift(new parser.ENWeekdayParser());\n    option.parsers.unshift(new parser.ENRelativeDateFormatParser());\n    return option;\n};\n\n\nexports.en_GB = function(config) {\n    config = config || {};\n    config.littleEndian = true;\n    return exports.en(config);\n}\n\nexports.en_GB.casual = function(config) {\n    config = config || {};\n    config.littleEndian = true;\n    return exports.en.casual(config);\n}\n\n// -------------------------------------------------------------\n\nexports.ja = function() {\n    return {\n        parsers: [\n            new parser.JPStandardParser()\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner(),\n            new refiner.JPMergeDateRangeRefiner()\n        ]\n    }\n};\n\nexports.ja.casual = function() {\n    var option = exports.ja();\n    option.parsers.unshift(new parser.JPCasualDateParser());\n    return option;\n};\n\n\n// -------------------------------------------------------------\n\n\nexports.es = function(config) {\n    return {\n        parsers: [\n            new parser.ESTimeAgoFormatParser(config),\n            new parser.ESDeadlineFormatParser(config),\n            new parser.ESTimeExpressionParser(config),\n            new parser.ESMonthNameLittleEndianParser(config),\n            new parser.ESSlashDateFormatParser(config)\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner()\n        ]\n    }\n};\n\nexports.es.casual = function() {\n    var option = exports.es({ \n        strict: false \n    });\n\n    option.parsers.unshift(new parser.ESCasualDateParser());\n    option.parsers.unshift(new parser.ESWeekdayParser());\n    return option;\n};\n\n\n// -------------------------------------------------------------\n\nexports.fr = function(config) {\n    return {\n        parsers: [\n            new parser.FRDeadlineFormatParser(config),\n            new parser.FRMonthNameLittleEndianParser(config),\n            new parser.FRSlashDateFormatParser(config),\n            new parser.FRTimeAgoFormatParser(config),\n            new parser.FRTimeExpressionParser(config)\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner(),\n            new refiner.FRMergeDateRangeRefiner(),\n            new refiner.FRMergeDateTimeRefiner()\n        ]\n    }\n};\n\nexports.fr.casual = function() {\n    var option = exports.fr({\n        strict: false\n    });\n\n    option.parsers.unshift(new parser.FRCasualDateParser());\n    option.parsers.unshift(new parser.FRWeekdayParser());\n    option.parsers.unshift(new parser.FRRelativeDateFormatParser());\n    return option;\n};\n\n\n// -------------------------------------------------------------\n\nexports.zh = function() {\n    return {\n        parsers: [\n            new parser.ZHHantDateParser(),\n            new parser.ZHHantWeekdayParser(),\n            new parser.ZHHantTimeExpressionParser(),\n            new parser.ZHHantCasualDateParser(),\n            new parser.ZHHantDeadlineFormatParser()\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner()\n        ]\n    }\n};","\nvar options = exports.options = require('./options');\n\nexports.parser = require('./parsers/parser');\nexports.refiner = require('./refiners/refiner');\n\nexports.Parser = exports.parser.Parser;\nexports.Refiner = exports.refiner.Refiner;\nexports.Filter = exports.refiner.Filter;\n\nexports.ParsedResult = require('./result').ParsedResult;\nexports.ParsedComponents = require('./result').ParsedComponents;\n\nvar Chrono = function(option) {\n\n    option = option || exports.options.casualOption();\n\n    this.option = option;\n    this.parsers = new Object(option.parsers);\n    this.refiners = new Object(option.refiners);\n};\n\n\nChrono.prototype.parse = function(text, refDate, opt) {\n\n    refDate = refDate || new Date();\n    opt = opt || {};\n\n    var allResults = [];\n\n    this.parsers.forEach(function (parser) {\n        var results = parser.execute(text, refDate, opt);\n        allResults = allResults.concat(results);\n    });\n\n    allResults.sort(function(a, b) {\n        return a.index - b.index;\n    });\n\n    this.refiners.forEach(function (refiner) {\n        allResults = refiner.refine(text, allResults, opt);\n    });\n    \n    return allResults;\n};\n\n\nChrono.prototype.parseDate = function(text, refDate, opt) {\n    var results = this.parse(text, refDate, opt);\n    if (results.length > 0) {\n        return results[0].start.date();\n    }\n    return null;\n};\n\nexports.Chrono = Chrono;\nexports.strict = new Chrono( options.strictOption() );\nexports.casual = new Chrono( options.casualOption() );\n\nexports.en = new Chrono( options.mergeOptions([\n    options.en.casual, options.commonPostProcessing]));\n\nexports.en_GB = new Chrono( options.mergeOptions([\n    options.en_GB.casual, options.commonPostProcessing]));\n\nexports.de = new Chrono( options.mergeOptions([\n    options.de.casual, options.en, options.commonPostProcessing]));\n\nexports.es = new Chrono( options.mergeOptions([\n    options.es.casual, options.en, options.commonPostProcessing]));\n\nexports.fr = new Chrono( options.mergeOptions([\n    options.fr.casual, options.en, options.commonPostProcessing]));\n\nexports.ja = new Chrono( options.mergeOptions([ \n    options.ja.casual, options.en, options.commonPostProcessing]));\n\n\nexports.parse = function () {\n    return exports.casual.parse.apply(exports.casual, arguments);\n};\n\nexports.parseDate = function () {\n    return exports.casual.parseDate.apply(exports.casual, arguments);\n};\n\n\n\n\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      } else {\n        // At least give some kind of context to the user\n        var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n        err.context = er;\n        throw err;\n      }\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        args = Array.prototype.slice.call(arguments, 1);\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    args = Array.prototype.slice.call(arguments, 1);\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else if (listeners) {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n  if (this._events) {\n    var evlistener = this._events[type];\n\n    if (isFunction(evlistener))\n      return 1;\n    else if (evlistener)\n      return evlistener.length;\n  }\n  return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n","if (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    var TempCtor = function () {}\n    TempCtor.prototype = superCtor.prototype\n    ctor.prototype = new TempCtor()\n    ctor.prototype.constructor = ctor\n  }\n}\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","'use strict';\n\nif (!process.version ||\n    process.version.indexOf('v0.') === 0 ||\n    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {\n  module.exports = { nextTick: nextTick };\n} else {\n  module.exports = process\n}\n\nfunction nextTick(fn, arg1, arg2, arg3) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('\"callback\" argument must be a function');\n  }\n  var len = arguments.length;\n  var args, i;\n  switch (len) {\n  case 0:\n  case 1:\n    return process.nextTick(fn);\n  case 2:\n    return process.nextTick(function afterTickOne() {\n      fn.call(null, arg1);\n    });\n  case 3:\n    return process.nextTick(function afterTickTwo() {\n      fn.call(null, arg1, arg2);\n    });\n  case 4:\n    return process.nextTick(function afterTickThree() {\n      fn.call(null, arg1, arg2, arg3);\n    });\n  default:\n    args = new Array(len - 1);\n    i = 0;\n    while (i < args.length) {\n      args[i++] = arguments[i];\n    }\n    return process.nextTick(function afterTick() {\n      fn.apply(null, args);\n    });\n  }\n}\n\n","module.exports = require('stream');\n","/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n  for (var key in src) {\n    dst[key] = src[key]\n  }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n  module.exports = buffer\n} else {\n  // Copy properties from require('buffer')\n  copyProps(buffer, exports)\n  exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n  return Buffer(arg, encodingOrOffset, length)\n}\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n  if (typeof arg === 'number') {\n    throw new TypeError('Argument must not be a number')\n  }\n  return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  var buf = Buffer(size)\n  if (fill !== undefined) {\n    if (typeof encoding === 'string') {\n      buf.fill(fill, encoding)\n    } else {\n      buf.fill(fill)\n    }\n  } else {\n    buf.fill(0)\n  }\n  return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return buffer.SlowBuffer(size)\n}\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n\nfunction isArray(arg) {\n  if (Array.isArray) {\n    return Array.isArray(arg);\n  }\n  return objectToString(arg) === '[object Array]';\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = Buffer.isBuffer;\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n","'use strict';\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Buffer = require('safe-buffer').Buffer;\nvar util = require('util');\n\nfunction copyBuffer(src, target, offset) {\n  src.copy(target, offset);\n}\n\nmodule.exports = function () {\n  function BufferList() {\n    _classCallCheck(this, BufferList);\n\n    this.head = null;\n    this.tail = null;\n    this.length = 0;\n  }\n\n  BufferList.prototype.push = function push(v) {\n    var entry = { data: v, next: null };\n    if (this.length > 0) this.tail.next = entry;else this.head = entry;\n    this.tail = entry;\n    ++this.length;\n  };\n\n  BufferList.prototype.unshift = function unshift(v) {\n    var entry = { data: v, next: this.head };\n    if (this.length === 0) this.tail = entry;\n    this.head = entry;\n    ++this.length;\n  };\n\n  BufferList.prototype.shift = function shift() {\n    if (this.length === 0) return;\n    var ret = this.head.data;\n    if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n    --this.length;\n    return ret;\n  };\n\n  BufferList.prototype.clear = function clear() {\n    this.head = this.tail = null;\n    this.length = 0;\n  };\n\n  BufferList.prototype.join = function join(s) {\n    if (this.length === 0) return '';\n    var p = this.head;\n    var ret = '' + p.data;\n    while (p = p.next) {\n      ret += s + p.data;\n    }return ret;\n  };\n\n  BufferList.prototype.concat = function concat(n) {\n    if (this.length === 0) return Buffer.alloc(0);\n    if (this.length === 1) return this.head.data;\n    var ret = Buffer.allocUnsafe(n >>> 0);\n    var p = this.head;\n    var i = 0;\n    while (p) {\n      copyBuffer(p.data, ret, i);\n      i += p.data.length;\n      p = p.next;\n    }\n    return ret;\n  };\n\n  return BufferList;\n}();\n\nif (util && util.inspect && util.inspect.custom) {\n  module.exports.prototype[util.inspect.custom] = function () {\n    var obj = util.inspect({ length: this.length });\n    return this.constructor.name + ' ' + obj;\n  };\n}","'use strict';\n\n/*<replacement>*/\n\nvar pna = require('process-nextick-args');\n/*</replacement>*/\n\n// undocumented cb() API, needed for core, not for public API\nfunction destroy(err, cb) {\n  var _this = this;\n\n  var readableDestroyed = this._readableState && this._readableState.destroyed;\n  var writableDestroyed = this._writableState && this._writableState.destroyed;\n\n  if (readableDestroyed || writableDestroyed) {\n    if (cb) {\n      cb(err);\n    } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {\n      pna.nextTick(emitErrorNT, this, err);\n    }\n    return this;\n  }\n\n  // we set destroyed to true before firing error callbacks in order\n  // to make it re-entrance safe in case destroy() is called within callbacks\n\n  if (this._readableState) {\n    this._readableState.destroyed = true;\n  }\n\n  // if this is a duplex stream mark the writable part as destroyed as well\n  if (this._writableState) {\n    this._writableState.destroyed = true;\n  }\n\n  this._destroy(err || null, function (err) {\n    if (!cb && err) {\n      pna.nextTick(emitErrorNT, _this, err);\n      if (_this._writableState) {\n        _this._writableState.errorEmitted = true;\n      }\n    } else if (cb) {\n      cb(err);\n    }\n  });\n\n  return this;\n}\n\nfunction undestroy() {\n  if (this._readableState) {\n    this._readableState.destroyed = false;\n    this._readableState.reading = false;\n    this._readableState.ended = false;\n    this._readableState.endEmitted = false;\n  }\n\n  if (this._writableState) {\n    this._writableState.destroyed = false;\n    this._writableState.ended = false;\n    this._writableState.ending = false;\n    this._writableState.finished = false;\n    this._writableState.errorEmitted = false;\n  }\n}\n\nfunction emitErrorNT(self, err) {\n  self.emit('error', err);\n}\n\nmodule.exports = {\n  destroy: destroy,\n  undestroy: undestroy\n};","\n/**\n * Module exports.\n */\n\nmodule.exports = deprecate;\n\n/**\n * Mark that a method should not be used.\n * Returns a modified function which warns once by default.\n *\n * If `localStorage.noDeprecation = true` is set, then it is a no-op.\n *\n * If `localStorage.throwDeprecation = true` is set, then deprecated functions\n * will throw an Error when invoked.\n *\n * If `localStorage.traceDeprecation = true` is set, then deprecated functions\n * will invoke `console.trace()` instead of `console.error()`.\n *\n * @param {Function} fn - the function to deprecate\n * @param {String} msg - the string to print to the console when `fn` is invoked\n * @returns {Function} a new \"deprecated\" version of `fn`\n * @api public\n */\n\nfunction deprecate (fn, msg) {\n  if (config('noDeprecation')) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (config('throwDeprecation')) {\n        throw new Error(msg);\n      } else if (config('traceDeprecation')) {\n        console.trace(msg);\n      } else {\n        console.warn(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n}\n\n/**\n * Checks `localStorage` for boolean values for the given `name`.\n *\n * @param {String} name\n * @returns {Boolean}\n * @api private\n */\n\nfunction config (name) {\n  // accessing global.localStorage can trigger a DOMException in sandboxed iframes\n  try {\n    if (!global.localStorage) return false;\n  } catch (_) {\n    return false;\n  }\n  var val = global.localStorage[name];\n  if (null == val) return false;\n  return String(val).toLowerCase() === 'true';\n}\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n'use strict';\n\n/*<replacement>*/\n\nvar pna = require('process-nextick-args');\n/*</replacement>*/\n\nmodule.exports = Writable;\n\n/* <replacement> */\nfunction WriteReq(chunk, encoding, cb) {\n  this.chunk = chunk;\n  this.encoding = encoding;\n  this.callback = cb;\n  this.next = null;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n  var _this = this;\n\n  this.next = null;\n  this.entry = null;\n  this.finish = function () {\n    onCorkedFinish(_this, state);\n  };\n}\n/* </replacement> */\n\n/*<replacement>*/\nvar asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nWritable.WritableState = WritableState;\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\n/*<replacement>*/\nvar internalUtil = {\n  deprecate: require('util-deprecate')\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream = require('./internal/streams/stream');\n/*</replacement>*/\n\n/*<replacement>*/\n\nvar Buffer = require('safe-buffer').Buffer;\nvar OurUint8Array = global.Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n  return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/*</replacement>*/\n\nvar destroyImpl = require('./internal/streams/destroy');\n\nutil.inherits(Writable, Stream);\n\nfunction nop() {}\n\nfunction WritableState(options, stream) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  options = options || {};\n\n  // Duplex streams are both readable and writable, but share\n  // the same options object.\n  // However, some cases require setting options to different\n  // values for the readable and the writable sides of the duplex stream.\n  // These options can be provided separately as readableXXX and writableXXX.\n  var isDuplex = stream instanceof Duplex;\n\n  // object stream flag to indicate whether or not this stream\n  // contains buffers or objects.\n  this.objectMode = !!options.objectMode;\n\n  if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n  // the point at which write() starts returning false\n  // Note: 0 is a valid value, means that we always return false if\n  // the entire buffer is not flushed immediately on write()\n  var hwm = options.highWaterMark;\n  var writableHwm = options.writableHighWaterMark;\n  var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = Math.floor(this.highWaterMark);\n\n  // if _final has been called\n  this.finalCalled = false;\n\n  // drain event flag.\n  this.needDrain = false;\n  // at the start of calling end()\n  this.ending = false;\n  // when end() has been called, and returned\n  this.ended = false;\n  // when 'finish' is emitted\n  this.finished = false;\n\n  // has it been destroyed\n  this.destroyed = false;\n\n  // should we decode strings into buffers before passing to _write?\n  // this is here so that some node-core streams can optimize string\n  // handling at a lower level.\n  var noDecode = options.decodeStrings === false;\n  this.decodeStrings = !noDecode;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // not an actual buffer we keep track of, but a measurement\n  // of how much we're waiting to get pushed to some underlying\n  // socket or file.\n  this.length = 0;\n\n  // a flag to see when we're in the middle of a write.\n  this.writing = false;\n\n  // when true all writes will be buffered until .uncork() call\n  this.corked = 0;\n\n  // a flag to be able to tell if the onwrite cb is called immediately,\n  // or on a later tick.  We set this to true at first, because any\n  // actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first write call.\n  this.sync = true;\n\n  // a flag to know if we're processing previously buffered items, which\n  // may call the _write() callback in the same tick, so that we don't\n  // end up in an overlapped onwrite situation.\n  this.bufferProcessing = false;\n\n  // the callback that's passed to _write(chunk,cb)\n  this.onwrite = function (er) {\n    onwrite(stream, er);\n  };\n\n  // the callback that the user supplies to write(chunk,encoding,cb)\n  this.writecb = null;\n\n  // the amount that is being written when _write is called.\n  this.writelen = 0;\n\n  this.bufferedRequest = null;\n  this.lastBufferedRequest = null;\n\n  // number of pending user-supplied write callbacks\n  // this must be 0 before 'finish' can be emitted\n  this.pendingcb = 0;\n\n  // emit prefinish if the only thing we're waiting for is _write cbs\n  // This is relevant for synchronous Transform streams\n  this.prefinished = false;\n\n  // True if the error was already emitted and should not be thrown again\n  this.errorEmitted = false;\n\n  // count buffered requests\n  this.bufferedRequestCount = 0;\n\n  // allocate the first CorkedRequest, there is always\n  // one allocated and free to use, and we maintain at most two\n  this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n  var current = this.bufferedRequest;\n  var out = [];\n  while (current) {\n    out.push(current);\n    current = current.next;\n  }\n  return out;\n};\n\n(function () {\n  try {\n    Object.defineProperty(WritableState.prototype, 'buffer', {\n      get: internalUtil.deprecate(function () {\n        return this.getBuffer();\n      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')\n    });\n  } catch (_) {}\n})();\n\n// Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\nvar realHasInstance;\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n  realHasInstance = Function.prototype[Symbol.hasInstance];\n  Object.defineProperty(Writable, Symbol.hasInstance, {\n    value: function (object) {\n      if (realHasInstance.call(this, object)) return true;\n      if (this !== Writable) return false;\n\n      return object && object._writableState instanceof WritableState;\n    }\n  });\n} else {\n  realHasInstance = function (object) {\n    return object instanceof this;\n  };\n}\n\nfunction Writable(options) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  // Writable ctor is applied to Duplexes, too.\n  // `realHasInstance` is necessary because using plain `instanceof`\n  // would return false, as no `_writableState` property is attached.\n\n  // Trying to use the custom `instanceof` for Writable here will also break the\n  // Node.js LazyTransform implementation, which has a non-trivial getter for\n  // `_writableState` that would lead to infinite recursion.\n  if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {\n    return new Writable(options);\n  }\n\n  this._writableState = new WritableState(options, this);\n\n  // legacy.\n  this.writable = true;\n\n  if (options) {\n    if (typeof options.write === 'function') this._write = options.write;\n\n    if (typeof options.writev === 'function') this._writev = options.writev;\n\n    if (typeof options.destroy === 'function') this._destroy = options.destroy;\n\n    if (typeof options.final === 'function') this._final = options.final;\n  }\n\n  Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n  this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n  var er = new Error('write after end');\n  // TODO: defer error events consistently everywhere, not just the cb\n  stream.emit('error', er);\n  pna.nextTick(cb, er);\n}\n\n// Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\nfunction validChunk(stream, state, chunk, cb) {\n  var valid = true;\n  var er = false;\n\n  if (chunk === null) {\n    er = new TypeError('May not write null values to stream');\n  } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  if (er) {\n    stream.emit('error', er);\n    pna.nextTick(cb, er);\n    valid = false;\n  }\n  return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n  var state = this._writableState;\n  var ret = false;\n  var isBuf = !state.objectMode && _isUint8Array(chunk);\n\n  if (isBuf && !Buffer.isBuffer(chunk)) {\n    chunk = _uint8ArrayToBuffer(chunk);\n  }\n\n  if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n\n  if (typeof cb !== 'function') cb = nop;\n\n  if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n    state.pendingcb++;\n    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n  }\n\n  return ret;\n};\n\nWritable.prototype.cork = function () {\n  var state = this._writableState;\n\n  state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n  var state = this._writableState;\n\n  if (state.corked) {\n    state.corked--;\n\n    if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n  }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n  // node::ParseEncoding() requires lower case.\n  if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n  this._writableState.defaultEncoding = encoding;\n  return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n    chunk = Buffer.from(chunk, encoding);\n  }\n  return chunk;\n}\n\nObject.defineProperty(Writable.prototype, 'writableHighWaterMark', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function () {\n    return this._writableState.highWaterMark;\n  }\n});\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn.  Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n  if (!isBuf) {\n    var newChunk = decodeChunk(state, chunk, encoding);\n    if (chunk !== newChunk) {\n      isBuf = true;\n      encoding = 'buffer';\n      chunk = newChunk;\n    }\n  }\n  var len = state.objectMode ? 1 : chunk.length;\n\n  state.length += len;\n\n  var ret = state.length < state.highWaterMark;\n  // we must ensure that previous needDrain will not be reset to false.\n  if (!ret) state.needDrain = true;\n\n  if (state.writing || state.corked) {\n    var last = state.lastBufferedRequest;\n    state.lastBufferedRequest = {\n      chunk: chunk,\n      encoding: encoding,\n      isBuf: isBuf,\n      callback: cb,\n      next: null\n    };\n    if (last) {\n      last.next = state.lastBufferedRequest;\n    } else {\n      state.bufferedRequest = state.lastBufferedRequest;\n    }\n    state.bufferedRequestCount += 1;\n  } else {\n    doWrite(stream, state, false, len, chunk, encoding, cb);\n  }\n\n  return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n  state.writelen = len;\n  state.writecb = cb;\n  state.writing = true;\n  state.sync = true;\n  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n  state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n  --state.pendingcb;\n\n  if (sync) {\n    // defer the callback if we are being called synchronously\n    // to avoid piling up things on the stack\n    pna.nextTick(cb, er);\n    // this can emit finish, and it will always happen\n    // after error\n    pna.nextTick(finishMaybe, stream, state);\n    stream._writableState.errorEmitted = true;\n    stream.emit('error', er);\n  } else {\n    // the caller expect this to happen before if\n    // it is async\n    cb(er);\n    stream._writableState.errorEmitted = true;\n    stream.emit('error', er);\n    // this can emit finish, but finish must\n    // always follow error\n    finishMaybe(stream, state);\n  }\n}\n\nfunction onwriteStateUpdate(state) {\n  state.writing = false;\n  state.writecb = null;\n  state.length -= state.writelen;\n  state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n  var state = stream._writableState;\n  var sync = state.sync;\n  var cb = state.writecb;\n\n  onwriteStateUpdate(state);\n\n  if (er) onwriteError(stream, state, sync, er, cb);else {\n    // Check if we're actually ready to finish, but don't emit yet\n    var finished = needFinish(state);\n\n    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n      clearBuffer(stream, state);\n    }\n\n    if (sync) {\n      /*<replacement>*/\n      asyncWrite(afterWrite, stream, state, finished, cb);\n      /*</replacement>*/\n    } else {\n      afterWrite(stream, state, finished, cb);\n    }\n  }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n  if (!finished) onwriteDrain(stream, state);\n  state.pendingcb--;\n  cb();\n  finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n  if (state.length === 0 && state.needDrain) {\n    state.needDrain = false;\n    stream.emit('drain');\n  }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n  state.bufferProcessing = true;\n  var entry = state.bufferedRequest;\n\n  if (stream._writev && entry && entry.next) {\n    // Fast case, write everything using _writev()\n    var l = state.bufferedRequestCount;\n    var buffer = new Array(l);\n    var holder = state.corkedRequestsFree;\n    holder.entry = entry;\n\n    var count = 0;\n    var allBuffers = true;\n    while (entry) {\n      buffer[count] = entry;\n      if (!entry.isBuf) allBuffers = false;\n      entry = entry.next;\n      count += 1;\n    }\n    buffer.allBuffers = allBuffers;\n\n    doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n    // doWrite is almost always async, defer these to save a bit of time\n    // as the hot path ends with doWrite\n    state.pendingcb++;\n    state.lastBufferedRequest = null;\n    if (holder.next) {\n      state.corkedRequestsFree = holder.next;\n      holder.next = null;\n    } else {\n      state.corkedRequestsFree = new CorkedRequest(state);\n    }\n    state.bufferedRequestCount = 0;\n  } else {\n    // Slow case, write chunks one-by-one\n    while (entry) {\n      var chunk = entry.chunk;\n      var encoding = entry.encoding;\n      var cb = entry.callback;\n      var len = state.objectMode ? 1 : chunk.length;\n\n      doWrite(stream, state, false, len, chunk, encoding, cb);\n      entry = entry.next;\n      state.bufferedRequestCount--;\n      // if we didn't call the onwrite immediately, then\n      // it means that we need to wait until it does.\n      // also, that means that the chunk and cb are currently\n      // being processed, so move the buffer counter past them.\n      if (state.writing) {\n        break;\n      }\n    }\n\n    if (entry === null) state.lastBufferedRequest = null;\n  }\n\n  state.bufferedRequest = entry;\n  state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n  cb(new Error('_write() is not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n  var state = this._writableState;\n\n  if (typeof chunk === 'function') {\n    cb = chunk;\n    chunk = null;\n    encoding = null;\n  } else if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n  // .end() fully uncorks\n  if (state.corked) {\n    state.corked = 1;\n    this.uncork();\n  }\n\n  // ignore unnecessary end() calls.\n  if (!state.ending && !state.finished) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\nfunction callFinal(stream, state) {\n  stream._final(function (err) {\n    state.pendingcb--;\n    if (err) {\n      stream.emit('error', err);\n    }\n    state.prefinished = true;\n    stream.emit('prefinish');\n    finishMaybe(stream, state);\n  });\n}\nfunction prefinish(stream, state) {\n  if (!state.prefinished && !state.finalCalled) {\n    if (typeof stream._final === 'function') {\n      state.pendingcb++;\n      state.finalCalled = true;\n      pna.nextTick(callFinal, stream, state);\n    } else {\n      state.prefinished = true;\n      stream.emit('prefinish');\n    }\n  }\n}\n\nfunction finishMaybe(stream, state) {\n  var need = needFinish(state);\n  if (need) {\n    prefinish(stream, state);\n    if (state.pendingcb === 0) {\n      state.finished = true;\n      stream.emit('finish');\n    }\n  }\n  return need;\n}\n\nfunction endWritable(stream, state, cb) {\n  state.ending = true;\n  finishMaybe(stream, state);\n  if (cb) {\n    if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);\n  }\n  state.ended = true;\n  stream.writable = false;\n}\n\nfunction onCorkedFinish(corkReq, state, err) {\n  var entry = corkReq.entry;\n  corkReq.entry = null;\n  while (entry) {\n    var cb = entry.callback;\n    state.pendingcb--;\n    cb(err);\n    entry = entry.next;\n  }\n  if (state.corkedRequestsFree) {\n    state.corkedRequestsFree.next = corkReq;\n  } else {\n    state.corkedRequestsFree = corkReq;\n  }\n}\n\nObject.defineProperty(Writable.prototype, 'destroyed', {\n  get: function () {\n    if (this._writableState === undefined) {\n      return false;\n    }\n    return this._writableState.destroyed;\n  },\n  set: function (value) {\n    // we ignore the value if the stream\n    // has not been initialized yet\n    if (!this._writableState) {\n      return;\n    }\n\n    // backward compatibility, the user is explicitly\n    // managing destroyed\n    this._writableState.destroyed = value;\n  }\n});\n\nWritable.prototype.destroy = destroyImpl.destroy;\nWritable.prototype._undestroy = destroyImpl.undestroy;\nWritable.prototype._destroy = function (err, cb) {\n  this.end();\n  cb(err);\n};","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\n'use strict';\n\n/*<replacement>*/\n\nvar pna = require('process-nextick-args');\n/*</replacement>*/\n\n/*<replacement>*/\nvar objectKeys = Object.keys || function (obj) {\n  var keys = [];\n  for (var key in obj) {\n    keys.push(key);\n  }return keys;\n};\n/*</replacement>*/\n\nmodule.exports = Duplex;\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nvar Readable = require('./_stream_readable');\nvar Writable = require('./_stream_writable');\n\nutil.inherits(Duplex, Readable);\n\n{\n  // avoid scope creep, the keys array can then be collected\n  var keys = objectKeys(Writable.prototype);\n  for (var v = 0; v < keys.length; v++) {\n    var method = keys[v];\n    if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n  }\n}\n\nfunction Duplex(options) {\n  if (!(this instanceof Duplex)) return new Duplex(options);\n\n  Readable.call(this, options);\n  Writable.call(this, options);\n\n  if (options && options.readable === false) this.readable = false;\n\n  if (options && options.writable === false) this.writable = false;\n\n  this.allowHalfOpen = true;\n  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n\n  this.once('end', onend);\n}\n\nObject.defineProperty(Duplex.prototype, 'writableHighWaterMark', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function () {\n    return this._writableState.highWaterMark;\n  }\n});\n\n// the no-half-open enforcer\nfunction onend() {\n  // if we allow half-open state, or if the writable side ended,\n  // then we're ok.\n  if (this.allowHalfOpen || this._writableState.ended) return;\n\n  // no more data can be written.\n  // But allow more writes to happen in this tick.\n  pna.nextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n  self.end();\n}\n\nObject.defineProperty(Duplex.prototype, 'destroyed', {\n  get: function () {\n    if (this._readableState === undefined || this._writableState === undefined) {\n      return false;\n    }\n    return this._readableState.destroyed && this._writableState.destroyed;\n  },\n  set: function (value) {\n    // we ignore the value if the stream\n    // has not been initialized yet\n    if (this._readableState === undefined || this._writableState === undefined) {\n      return;\n    }\n\n    // backward compatibility, the user is explicitly\n    // managing destroyed\n    this._readableState.destroyed = value;\n    this._writableState.destroyed = value;\n  }\n});\n\nDuplex.prototype._destroy = function (err, cb) {\n  this.push(null);\n  this.end();\n\n  pna.nextTick(cb, err);\n};","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n/*<replacement>*/\n\nvar Buffer = require('safe-buffer').Buffer;\n/*</replacement>*/\n\nvar isEncoding = Buffer.isEncoding || function (encoding) {\n  encoding = '' + encoding;\n  switch (encoding && encoding.toLowerCase()) {\n    case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':\n      return true;\n    default:\n      return false;\n  }\n};\n\nfunction _normalizeEncoding(enc) {\n  if (!enc) return 'utf8';\n  var retried;\n  while (true) {\n    switch (enc) {\n      case 'utf8':\n      case 'utf-8':\n        return 'utf8';\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return 'utf16le';\n      case 'latin1':\n      case 'binary':\n        return 'latin1';\n      case 'base64':\n      case 'ascii':\n      case 'hex':\n        return enc;\n      default:\n        if (retried) return; // undefined\n        enc = ('' + enc).toLowerCase();\n        retried = true;\n    }\n  }\n};\n\n// Do not cache `Buffer.isEncoding` when checking encoding names as some\n// modules monkey-patch it to support additional encodings\nfunction normalizeEncoding(enc) {\n  var nenc = _normalizeEncoding(enc);\n  if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);\n  return nenc || enc;\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters.\nexports.StringDecoder = StringDecoder;\nfunction StringDecoder(encoding) {\n  this.encoding = normalizeEncoding(encoding);\n  var nb;\n  switch (this.encoding) {\n    case 'utf16le':\n      this.text = utf16Text;\n      this.end = utf16End;\n      nb = 4;\n      break;\n    case 'utf8':\n      this.fillLast = utf8FillLast;\n      nb = 4;\n      break;\n    case 'base64':\n      this.text = base64Text;\n      this.end = base64End;\n      nb = 3;\n      break;\n    default:\n      this.write = simpleWrite;\n      this.end = simpleEnd;\n      return;\n  }\n  this.lastNeed = 0;\n  this.lastTotal = 0;\n  this.lastChar = Buffer.allocUnsafe(nb);\n}\n\nStringDecoder.prototype.write = function (buf) {\n  if (buf.length === 0) return '';\n  var r;\n  var i;\n  if (this.lastNeed) {\n    r = this.fillLast(buf);\n    if (r === undefined) return '';\n    i = this.lastNeed;\n    this.lastNeed = 0;\n  } else {\n    i = 0;\n  }\n  if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);\n  return r || '';\n};\n\nStringDecoder.prototype.end = utf8End;\n\n// Returns only complete characters in a Buffer\nStringDecoder.prototype.text = utf8Text;\n\n// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer\nStringDecoder.prototype.fillLast = function (buf) {\n  if (this.lastNeed <= buf.length) {\n    buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);\n    return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n  }\n  buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);\n  this.lastNeed -= buf.length;\n};\n\n// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a\n// continuation byte. If an invalid byte is detected, -2 is returned.\nfunction utf8CheckByte(byte) {\n  if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;\n  return byte >> 6 === 0x02 ? -1 : -2;\n}\n\n// Checks at most 3 bytes at the end of a Buffer in order to detect an\n// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)\n// needed to complete the UTF-8 character (if applicable) are returned.\nfunction utf8CheckIncomplete(self, buf, i) {\n  var j = buf.length - 1;\n  if (j < i) return 0;\n  var nb = utf8CheckByte(buf[j]);\n  if (nb >= 0) {\n    if (nb > 0) self.lastNeed = nb - 1;\n    return nb;\n  }\n  if (--j < i || nb === -2) return 0;\n  nb = utf8CheckByte(buf[j]);\n  if (nb >= 0) {\n    if (nb > 0) self.lastNeed = nb - 2;\n    return nb;\n  }\n  if (--j < i || nb === -2) return 0;\n  nb = utf8CheckByte(buf[j]);\n  if (nb >= 0) {\n    if (nb > 0) {\n      if (nb === 2) nb = 0;else self.lastNeed = nb - 3;\n    }\n    return nb;\n  }\n  return 0;\n}\n\n// Validates as many continuation bytes for a multi-byte UTF-8 character as\n// needed or are available. If we see a non-continuation byte where we expect\n// one, we \"replace\" the validated continuation bytes we've seen so far with\n// a single UTF-8 replacement character ('\\ufffd'), to match v8's UTF-8 decoding\n// behavior. The continuation byte check is included three times in the case\n// where all of the continuation bytes for a character exist in the same buffer.\n// It is also done this way as a slight performance increase instead of using a\n// loop.\nfunction utf8CheckExtraBytes(self, buf, p) {\n  if ((buf[0] & 0xC0) !== 0x80) {\n    self.lastNeed = 0;\n    return '\\ufffd';\n  }\n  if (self.lastNeed > 1 && buf.length > 1) {\n    if ((buf[1] & 0xC0) !== 0x80) {\n      self.lastNeed = 1;\n      return '\\ufffd';\n    }\n    if (self.lastNeed > 2 && buf.length > 2) {\n      if ((buf[2] & 0xC0) !== 0x80) {\n        self.lastNeed = 2;\n        return '\\ufffd';\n      }\n    }\n  }\n}\n\n// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.\nfunction utf8FillLast(buf) {\n  var p = this.lastTotal - this.lastNeed;\n  var r = utf8CheckExtraBytes(this, buf, p);\n  if (r !== undefined) return r;\n  if (this.lastNeed <= buf.length) {\n    buf.copy(this.lastChar, p, 0, this.lastNeed);\n    return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n  }\n  buf.copy(this.lastChar, p, 0, buf.length);\n  this.lastNeed -= buf.length;\n}\n\n// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a\n// partial character, the character's bytes are buffered until the required\n// number of bytes are available.\nfunction utf8Text(buf, i) {\n  var total = utf8CheckIncomplete(this, buf, i);\n  if (!this.lastNeed) return buf.toString('utf8', i);\n  this.lastTotal = total;\n  var end = buf.length - (total - this.lastNeed);\n  buf.copy(this.lastChar, 0, end);\n  return buf.toString('utf8', i, end);\n}\n\n// For UTF-8, a replacement character is added when ending on a partial\n// character.\nfunction utf8End(buf) {\n  var r = buf && buf.length ? this.write(buf) : '';\n  if (this.lastNeed) return r + '\\ufffd';\n  return r;\n}\n\n// UTF-16LE typically needs two bytes per character, but even if we have an even\n// number of bytes available, we need to check if we end on a leading/high\n// surrogate. In that case, we need to wait for the next two bytes in order to\n// decode the last character properly.\nfunction utf16Text(buf, i) {\n  if ((buf.length - i) % 2 === 0) {\n    var r = buf.toString('utf16le', i);\n    if (r) {\n      var c = r.charCodeAt(r.length - 1);\n      if (c >= 0xD800 && c <= 0xDBFF) {\n        this.lastNeed = 2;\n        this.lastTotal = 4;\n        this.lastChar[0] = buf[buf.length - 2];\n        this.lastChar[1] = buf[buf.length - 1];\n        return r.slice(0, -1);\n      }\n    }\n    return r;\n  }\n  this.lastNeed = 1;\n  this.lastTotal = 2;\n  this.lastChar[0] = buf[buf.length - 1];\n  return buf.toString('utf16le', i, buf.length - 1);\n}\n\n// For UTF-16LE we do not explicitly append special replacement characters if we\n// end on a partial character, we simply let v8 handle that.\nfunction utf16End(buf) {\n  var r = buf && buf.length ? this.write(buf) : '';\n  if (this.lastNeed) {\n    var end = this.lastTotal - this.lastNeed;\n    return r + this.lastChar.toString('utf16le', 0, end);\n  }\n  return r;\n}\n\nfunction base64Text(buf, i) {\n  var n = (buf.length - i) % 3;\n  if (n === 0) return buf.toString('base64', i);\n  this.lastNeed = 3 - n;\n  this.lastTotal = 3;\n  if (n === 1) {\n    this.lastChar[0] = buf[buf.length - 1];\n  } else {\n    this.lastChar[0] = buf[buf.length - 2];\n    this.lastChar[1] = buf[buf.length - 1];\n  }\n  return buf.toString('base64', i, buf.length - n);\n}\n\nfunction base64End(buf) {\n  var r = buf && buf.length ? this.write(buf) : '';\n  if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);\n  return r;\n}\n\n// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)\nfunction simpleWrite(buf) {\n  return buf.toString(this.encoding);\n}\n\nfunction simpleEnd(buf) {\n  return buf && buf.length ? this.write(buf) : '';\n}","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n/*<replacement>*/\n\nvar pna = require('process-nextick-args');\n/*</replacement>*/\n\nmodule.exports = Readable;\n\n/*<replacement>*/\nvar isArray = require('isarray');\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nReadable.ReadableState = ReadableState;\n\n/*<replacement>*/\nvar EE = require('events').EventEmitter;\n\nvar EElistenerCount = function (emitter, type) {\n  return emitter.listeners(type).length;\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream = require('./internal/streams/stream');\n/*</replacement>*/\n\n/*<replacement>*/\n\nvar Buffer = require('safe-buffer').Buffer;\nvar OurUint8Array = global.Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n  return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/*</replacement>*/\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\n/*<replacement>*/\nvar debugUtil = require('util');\nvar debug = void 0;\nif (debugUtil && debugUtil.debuglog) {\n  debug = debugUtil.debuglog('stream');\n} else {\n  debug = function () {};\n}\n/*</replacement>*/\n\nvar BufferList = require('./internal/streams/BufferList');\nvar destroyImpl = require('./internal/streams/destroy');\nvar StringDecoder;\n\nutil.inherits(Readable, Stream);\n\nvar kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];\n\nfunction prependListener(emitter, event, fn) {\n  // Sadly this is not cacheable as some libraries bundle their own\n  // event emitter implementation with them.\n  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);\n\n  // This is a hack to make sure that our error handler is attached before any\n  // userland ones.  NEVER DO THIS. This is here only because this code needs\n  // to continue to work with older versions of Node.js that do not include\n  // the prependListener() method. The goal is to eventually remove this hack.\n  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n}\n\nfunction ReadableState(options, stream) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  options = options || {};\n\n  // Duplex streams are both readable and writable, but share\n  // the same options object.\n  // However, some cases require setting options to different\n  // values for the readable and the writable sides of the duplex stream.\n  // These options can be provided separately as readableXXX and writableXXX.\n  var isDuplex = stream instanceof Duplex;\n\n  // object stream flag. Used to make read(n) ignore n and to\n  // make all the buffer merging and length checks go away\n  this.objectMode = !!options.objectMode;\n\n  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n  // the point at which it stops calling _read() to fill the buffer\n  // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n  var hwm = options.highWaterMark;\n  var readableHwm = options.readableHighWaterMark;\n  var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = Math.floor(this.highWaterMark);\n\n  // A linked list is used to store data chunks instead of an array because the\n  // linked list can remove elements from the beginning faster than\n  // array.shift()\n  this.buffer = new BufferList();\n  this.length = 0;\n  this.pipes = null;\n  this.pipesCount = 0;\n  this.flowing = null;\n  this.ended = false;\n  this.endEmitted = false;\n  this.reading = false;\n\n  // a flag to be able to tell if the event 'readable'/'data' is emitted\n  // immediately, or on a later tick.  We set this to true at first, because\n  // any actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first read call.\n  this.sync = true;\n\n  // whenever we return null, then we set a flag to say\n  // that we're awaiting a 'readable' event emission.\n  this.needReadable = false;\n  this.emittedReadable = false;\n  this.readableListening = false;\n  this.resumeScheduled = false;\n\n  // has it been destroyed\n  this.destroyed = false;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // the number of writers that are awaiting a drain event in .pipe()s\n  this.awaitDrain = 0;\n\n  // if true, a maybeReadMore has been scheduled\n  this.readingMore = false;\n\n  this.decoder = null;\n  this.encoding = null;\n  if (options.encoding) {\n    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n    this.decoder = new StringDecoder(options.encoding);\n    this.encoding = options.encoding;\n  }\n}\n\nfunction Readable(options) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  if (!(this instanceof Readable)) return new Readable(options);\n\n  this._readableState = new ReadableState(options, this);\n\n  // legacy\n  this.readable = true;\n\n  if (options) {\n    if (typeof options.read === 'function') this._read = options.read;\n\n    if (typeof options.destroy === 'function') this._destroy = options.destroy;\n  }\n\n  Stream.call(this);\n}\n\nObject.defineProperty(Readable.prototype, 'destroyed', {\n  get: function () {\n    if (this._readableState === undefined) {\n      return false;\n    }\n    return this._readableState.destroyed;\n  },\n  set: function (value) {\n    // we ignore the value if the stream\n    // has not been initialized yet\n    if (!this._readableState) {\n      return;\n    }\n\n    // backward compatibility, the user is explicitly\n    // managing destroyed\n    this._readableState.destroyed = value;\n  }\n});\n\nReadable.prototype.destroy = destroyImpl.destroy;\nReadable.prototype._undestroy = destroyImpl.undestroy;\nReadable.prototype._destroy = function (err, cb) {\n  this.push(null);\n  cb(err);\n};\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n  var state = this._readableState;\n  var skipChunkCheck;\n\n  if (!state.objectMode) {\n    if (typeof chunk === 'string') {\n      encoding = encoding || state.defaultEncoding;\n      if (encoding !== state.encoding) {\n        chunk = Buffer.from(chunk, encoding);\n        encoding = '';\n      }\n      skipChunkCheck = true;\n    }\n  } else {\n    skipChunkCheck = true;\n  }\n\n  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n  return readableAddChunk(this, chunk, null, true, false);\n};\n\nfunction readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {\n  var state = stream._readableState;\n  if (chunk === null) {\n    state.reading = false;\n    onEofChunk(stream, state);\n  } else {\n    var er;\n    if (!skipChunkCheck) er = chunkInvalid(state, chunk);\n    if (er) {\n      stream.emit('error', er);\n    } else if (state.objectMode || chunk && chunk.length > 0) {\n      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {\n        chunk = _uint8ArrayToBuffer(chunk);\n      }\n\n      if (addToFront) {\n        if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);\n      } else if (state.ended) {\n        stream.emit('error', new Error('stream.push() after EOF'));\n      } else {\n        state.reading = false;\n        if (state.decoder && !encoding) {\n          chunk = state.decoder.write(chunk);\n          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);\n        } else {\n          addChunk(stream, state, chunk, false);\n        }\n      }\n    } else if (!addToFront) {\n      state.reading = false;\n    }\n  }\n\n  return needMoreData(state);\n}\n\nfunction addChunk(stream, state, chunk, addToFront) {\n  if (state.flowing && state.length === 0 && !state.sync) {\n    stream.emit('data', chunk);\n    stream.read(0);\n  } else {\n    // update the buffer info.\n    state.length += state.objectMode ? 1 : chunk.length;\n    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n\n    if (state.needReadable) emitReadable(stream);\n  }\n  maybeReadMore(stream, state);\n}\n\nfunction chunkInvalid(state, chunk) {\n  var er;\n  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  return er;\n}\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes.  This is to work around cases where hwm=0,\n// such as the repl.  Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\nReadable.prototype.isPaused = function () {\n  return this._readableState.flowing === false;\n};\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n  this._readableState.decoder = new StringDecoder(enc);\n  this._readableState.encoding = enc;\n  return this;\n};\n\n// Don't raise the hwm > 8MB\nvar MAX_HWM = 0x800000;\nfunction computeNewHighWaterMark(n) {\n  if (n >= MAX_HWM) {\n    n = MAX_HWM;\n  } else {\n    // Get the next highest power of 2 to prevent increasing hwm excessively in\n    // tiny amounts\n    n--;\n    n |= n >>> 1;\n    n |= n >>> 2;\n    n |= n >>> 4;\n    n |= n >>> 8;\n    n |= n >>> 16;\n    n++;\n  }\n  return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n  if (n <= 0 || state.length === 0 && state.ended) return 0;\n  if (state.objectMode) return 1;\n  if (n !== n) {\n    // Only flow one buffer at a time\n    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n  }\n  // If we're asking for more than the current hwm, then raise the hwm.\n  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n  if (n <= state.length) return n;\n  // Don't have enough\n  if (!state.ended) {\n    state.needReadable = true;\n    return 0;\n  }\n  return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n  debug('read', n);\n  n = parseInt(n, 10);\n  var state = this._readableState;\n  var nOrig = n;\n\n  if (n !== 0) state.emittedReadable = false;\n\n  // if we're doing read(0) to trigger a readable event, but we\n  // already have a bunch of data in the buffer, then just trigger\n  // the 'readable' event and move on.\n  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n    debug('read: emitReadable', state.length, state.ended);\n    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n    return null;\n  }\n\n  n = howMuchToRead(n, state);\n\n  // if we've ended, and we're now clear, then finish it up.\n  if (n === 0 && state.ended) {\n    if (state.length === 0) endReadable(this);\n    return null;\n  }\n\n  // All the actual chunk generation logic needs to be\n  // *below* the call to _read.  The reason is that in certain\n  // synthetic stream cases, such as passthrough streams, _read\n  // may be a completely synchronous operation which may change\n  // the state of the read buffer, providing enough data when\n  // before there was *not* enough.\n  //\n  // So, the steps are:\n  // 1. Figure out what the state of things will be after we do\n  // a read from the buffer.\n  //\n  // 2. If that resulting state will trigger a _read, then call _read.\n  // Note that this may be asynchronous, or synchronous.  Yes, it is\n  // deeply ugly to write APIs this way, but that still doesn't mean\n  // that the Readable class should behave improperly, as streams are\n  // designed to be sync/async agnostic.\n  // Take note if the _read call is sync or async (ie, if the read call\n  // has returned yet), so that we know whether or not it's safe to emit\n  // 'readable' etc.\n  //\n  // 3. Actually pull the requested chunks out of the buffer and return.\n\n  // if we need a readable event, then we need to do some reading.\n  var doRead = state.needReadable;\n  debug('need readable', doRead);\n\n  // if we currently have less than the highWaterMark, then also read some\n  if (state.length === 0 || state.length - n < state.highWaterMark) {\n    doRead = true;\n    debug('length less than watermark', doRead);\n  }\n\n  // however, if we've ended, then there's no point, and if we're already\n  // reading, then it's unnecessary.\n  if (state.ended || state.reading) {\n    doRead = false;\n    debug('reading or ended', doRead);\n  } else if (doRead) {\n    debug('do read');\n    state.reading = true;\n    state.sync = true;\n    // if the length is currently zero, then we *need* a readable event.\n    if (state.length === 0) state.needReadable = true;\n    // call internal read method\n    this._read(state.highWaterMark);\n    state.sync = false;\n    // If _read pushed data synchronously, then `reading` will be false,\n    // and we need to re-evaluate how much data we can return to the user.\n    if (!state.reading) n = howMuchToRead(nOrig, state);\n  }\n\n  var ret;\n  if (n > 0) ret = fromList(n, state);else ret = null;\n\n  if (ret === null) {\n    state.needReadable = true;\n    n = 0;\n  } else {\n    state.length -= n;\n  }\n\n  if (state.length === 0) {\n    // If we have nothing in the buffer, then we want to know\n    // as soon as we *do* get something into the buffer.\n    if (!state.ended) state.needReadable = true;\n\n    // If we tried to read() past the EOF, then emit end on the next tick.\n    if (nOrig !== n && state.ended) endReadable(this);\n  }\n\n  if (ret !== null) this.emit('data', ret);\n\n  return ret;\n};\n\nfunction onEofChunk(stream, state) {\n  if (state.ended) return;\n  if (state.decoder) {\n    var chunk = state.decoder.end();\n    if (chunk && chunk.length) {\n      state.buffer.push(chunk);\n      state.length += state.objectMode ? 1 : chunk.length;\n    }\n  }\n  state.ended = true;\n\n  // emit 'readable' now to make sure it gets picked up.\n  emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow.  This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n  var state = stream._readableState;\n  state.needReadable = false;\n  if (!state.emittedReadable) {\n    debug('emitReadable', state.flowing);\n    state.emittedReadable = true;\n    if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);\n  }\n}\n\nfunction emitReadable_(stream) {\n  debug('emit readable');\n  stream.emit('readable');\n  flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data.  that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n  if (!state.readingMore) {\n    state.readingMore = true;\n    pna.nextTick(maybeReadMore_, stream, state);\n  }\n}\n\nfunction maybeReadMore_(stream, state) {\n  var len = state.length;\n  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n    debug('maybeReadMore read 0');\n    stream.read(0);\n    if (len === state.length)\n      // didn't get any data, stop spinning.\n      break;else len = state.length;\n  }\n  state.readingMore = false;\n}\n\n// abstract method.  to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n  this.emit('error', new Error('_read() is not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n  var src = this;\n  var state = this._readableState;\n\n  switch (state.pipesCount) {\n    case 0:\n      state.pipes = dest;\n      break;\n    case 1:\n      state.pipes = [state.pipes, dest];\n      break;\n    default:\n      state.pipes.push(dest);\n      break;\n  }\n  state.pipesCount += 1;\n  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n\n  var endFn = doEnd ? onend : unpipe;\n  if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);\n\n  dest.on('unpipe', onunpipe);\n  function onunpipe(readable, unpipeInfo) {\n    debug('onunpipe');\n    if (readable === src) {\n      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {\n        unpipeInfo.hasUnpiped = true;\n        cleanup();\n      }\n    }\n  }\n\n  function onend() {\n    debug('onend');\n    dest.end();\n  }\n\n  // when the dest drains, it reduces the awaitDrain counter\n  // on the source.  This would be more elegant with a .once()\n  // handler in flow(), but adding and removing repeatedly is\n  // too slow.\n  var ondrain = pipeOnDrain(src);\n  dest.on('drain', ondrain);\n\n  var cleanedUp = false;\n  function cleanup() {\n    debug('cleanup');\n    // cleanup event handlers once the pipe is broken\n    dest.removeListener('close', onclose);\n    dest.removeListener('finish', onfinish);\n    dest.removeListener('drain', ondrain);\n    dest.removeListener('error', onerror);\n    dest.removeListener('unpipe', onunpipe);\n    src.removeListener('end', onend);\n    src.removeListener('end', unpipe);\n    src.removeListener('data', ondata);\n\n    cleanedUp = true;\n\n    // if the reader is waiting for a drain event from this\n    // specific writer, then it would cause it to never start\n    // flowing again.\n    // So, if this is awaiting a drain, then we just call it now.\n    // If we don't know, then assume that we are waiting for one.\n    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n  }\n\n  // If the user pushes more data while we're writing to dest then we'll end up\n  // in ondata again. However, we only want to increase awaitDrain once because\n  // dest will only emit one 'drain' event for the multiple writes.\n  // => Introduce a guard on increasing awaitDrain.\n  var increasedAwaitDrain = false;\n  src.on('data', ondata);\n  function ondata(chunk) {\n    debug('ondata');\n    increasedAwaitDrain = false;\n    var ret = dest.write(chunk);\n    if (false === ret && !increasedAwaitDrain) {\n      // If the user unpiped during `dest.write()`, it is possible\n      // to get stuck in a permanently paused state if that write\n      // also returned false.\n      // => Check whether `dest` is still a piping destination.\n      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n        debug('false write response, pause', src._readableState.awaitDrain);\n        src._readableState.awaitDrain++;\n        increasedAwaitDrain = true;\n      }\n      src.pause();\n    }\n  }\n\n  // if the dest has an error, then stop piping into it.\n  // however, don't suppress the throwing behavior for this.\n  function onerror(er) {\n    debug('onerror', er);\n    unpipe();\n    dest.removeListener('error', onerror);\n    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);\n  }\n\n  // Make sure our error handler is attached before userland ones.\n  prependListener(dest, 'error', onerror);\n\n  // Both close and finish should trigger unpipe, but only once.\n  function onclose() {\n    dest.removeListener('finish', onfinish);\n    unpipe();\n  }\n  dest.once('close', onclose);\n  function onfinish() {\n    debug('onfinish');\n    dest.removeListener('close', onclose);\n    unpipe();\n  }\n  dest.once('finish', onfinish);\n\n  function unpipe() {\n    debug('unpipe');\n    src.unpipe(dest);\n  }\n\n  // tell the dest that it's being piped to\n  dest.emit('pipe', src);\n\n  // start the flow if it hasn't been started already.\n  if (!state.flowing) {\n    debug('pipe resume');\n    src.resume();\n  }\n\n  return dest;\n};\n\nfunction pipeOnDrain(src) {\n  return function () {\n    var state = src._readableState;\n    debug('pipeOnDrain', state.awaitDrain);\n    if (state.awaitDrain) state.awaitDrain--;\n    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n      state.flowing = true;\n      flow(src);\n    }\n  };\n}\n\nReadable.prototype.unpipe = function (dest) {\n  var state = this._readableState;\n  var unpipeInfo = { hasUnpiped: false };\n\n  // if we're not piping anywhere, then do nothing.\n  if (state.pipesCount === 0) return this;\n\n  // just one destination.  most common case.\n  if (state.pipesCount === 1) {\n    // passed in one, but it's not the right one.\n    if (dest && dest !== state.pipes) return this;\n\n    if (!dest) dest = state.pipes;\n\n    // got a match.\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n    if (dest) dest.emit('unpipe', this, unpipeInfo);\n    return this;\n  }\n\n  // slow case. multiple pipe destinations.\n\n  if (!dest) {\n    // remove all.\n    var dests = state.pipes;\n    var len = state.pipesCount;\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n\n    for (var i = 0; i < len; i++) {\n      dests[i].emit('unpipe', this, unpipeInfo);\n    }return this;\n  }\n\n  // try to find the right one.\n  var index = indexOf(state.pipes, dest);\n  if (index === -1) return this;\n\n  state.pipes.splice(index, 1);\n  state.pipesCount -= 1;\n  if (state.pipesCount === 1) state.pipes = state.pipes[0];\n\n  dest.emit('unpipe', this, unpipeInfo);\n\n  return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n  var res = Stream.prototype.on.call(this, ev, fn);\n\n  if (ev === 'data') {\n    // Start flowing on next tick if stream isn't explicitly paused\n    if (this._readableState.flowing !== false) this.resume();\n  } else if (ev === 'readable') {\n    var state = this._readableState;\n    if (!state.endEmitted && !state.readableListening) {\n      state.readableListening = state.needReadable = true;\n      state.emittedReadable = false;\n      if (!state.reading) {\n        pna.nextTick(nReadingNextTick, this);\n      } else if (state.length) {\n        emitReadable(this);\n      }\n    }\n  }\n\n  return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n  debug('readable nexttick read 0');\n  self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n  var state = this._readableState;\n  if (!state.flowing) {\n    debug('resume');\n    state.flowing = true;\n    resume(this, state);\n  }\n  return this;\n};\n\nfunction resume(stream, state) {\n  if (!state.resumeScheduled) {\n    state.resumeScheduled = true;\n    pna.nextTick(resume_, stream, state);\n  }\n}\n\nfunction resume_(stream, state) {\n  if (!state.reading) {\n    debug('resume read 0');\n    stream.read(0);\n  }\n\n  state.resumeScheduled = false;\n  state.awaitDrain = 0;\n  stream.emit('resume');\n  flow(stream);\n  if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n  debug('call pause flowing=%j', this._readableState.flowing);\n  if (false !== this._readableState.flowing) {\n    debug('pause');\n    this._readableState.flowing = false;\n    this.emit('pause');\n  }\n  return this;\n};\n\nfunction flow(stream) {\n  var state = stream._readableState;\n  debug('flow', state.flowing);\n  while (state.flowing && stream.read() !== null) {}\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n  var _this = this;\n\n  var state = this._readableState;\n  var paused = false;\n\n  stream.on('end', function () {\n    debug('wrapped end');\n    if (state.decoder && !state.ended) {\n      var chunk = state.decoder.end();\n      if (chunk && chunk.length) _this.push(chunk);\n    }\n\n    _this.push(null);\n  });\n\n  stream.on('data', function (chunk) {\n    debug('wrapped data');\n    if (state.decoder) chunk = state.decoder.write(chunk);\n\n    // don't skip over falsy values in objectMode\n    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n    var ret = _this.push(chunk);\n    if (!ret) {\n      paused = true;\n      stream.pause();\n    }\n  });\n\n  // proxy all the other methods.\n  // important when wrapping filters and duplexes.\n  for (var i in stream) {\n    if (this[i] === undefined && typeof stream[i] === 'function') {\n      this[i] = function (method) {\n        return function () {\n          return stream[method].apply(stream, arguments);\n        };\n      }(i);\n    }\n  }\n\n  // proxy certain important events.\n  for (var n = 0; n < kProxyEvents.length; n++) {\n    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));\n  }\n\n  // when we try to consume some more bytes, simply unpause the\n  // underlying stream.\n  this._read = function (n) {\n    debug('wrapped _read', n);\n    if (paused) {\n      paused = false;\n      stream.resume();\n    }\n  };\n\n  return this;\n};\n\nObject.defineProperty(Readable.prototype, 'readableHighWaterMark', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function () {\n    return this._readableState.highWaterMark;\n  }\n});\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n  // nothing buffered\n  if (state.length === 0) return null;\n\n  var ret;\n  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n    // read it all, truncate the list\n    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n    state.buffer.clear();\n  } else {\n    // read part of list\n    ret = fromListPartial(n, state.buffer, state.decoder);\n  }\n\n  return ret;\n}\n\n// Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromListPartial(n, list, hasStrings) {\n  var ret;\n  if (n < list.head.data.length) {\n    // slice is the same for buffers and strings\n    ret = list.head.data.slice(0, n);\n    list.head.data = list.head.data.slice(n);\n  } else if (n === list.head.data.length) {\n    // first chunk is a perfect match\n    ret = list.shift();\n  } else {\n    // result spans more than one buffer\n    ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n  }\n  return ret;\n}\n\n// Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBufferString(n, list) {\n  var p = list.head;\n  var c = 1;\n  var ret = p.data;\n  n -= ret.length;\n  while (p = p.next) {\n    var str = p.data;\n    var nb = n > str.length ? str.length : n;\n    if (nb === str.length) ret += str;else ret += str.slice(0, n);\n    n -= nb;\n    if (n === 0) {\n      if (nb === str.length) {\n        ++c;\n        if (p.next) list.head = p.next;else list.head = list.tail = null;\n      } else {\n        list.head = p;\n        p.data = str.slice(nb);\n      }\n      break;\n    }\n    ++c;\n  }\n  list.length -= c;\n  return ret;\n}\n\n// Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBuffer(n, list) {\n  var ret = Buffer.allocUnsafe(n);\n  var p = list.head;\n  var c = 1;\n  p.data.copy(ret);\n  n -= p.data.length;\n  while (p = p.next) {\n    var buf = p.data;\n    var nb = n > buf.length ? buf.length : n;\n    buf.copy(ret, ret.length - n, 0, nb);\n    n -= nb;\n    if (n === 0) {\n      if (nb === buf.length) {\n        ++c;\n        if (p.next) list.head = p.next;else list.head = list.tail = null;\n      } else {\n        list.head = p;\n        p.data = buf.slice(nb);\n      }\n      break;\n    }\n    ++c;\n  }\n  list.length -= c;\n  return ret;\n}\n\nfunction endReadable(stream) {\n  var state = stream._readableState;\n\n  // If we get here before consuming all the bytes, then that is a\n  // bug in node.  Should never happen.\n  if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n  if (!state.endEmitted) {\n    state.ended = true;\n    pna.nextTick(endReadableNT, state, stream);\n  }\n}\n\nfunction endReadableNT(state, stream) {\n  // Check that we didn't get one last unshift.\n  if (!state.endEmitted && state.length === 0) {\n    state.endEmitted = true;\n    stream.readable = false;\n    stream.emit('end');\n  }\n}\n\nfunction indexOf(xs, x) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    if (xs[i] === x) return i;\n  }\n  return -1;\n}","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a transform stream is a readable/writable stream where you do\n// something with the data.  Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored.  (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation.  For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes.  When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up.  When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer.  When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks.  If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk.  However,\n// a pathological inflate type of transform can cause excessive buffering\n// here.  For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output.  In this case, you could write a very small\n// amount of input, and end up with a very large amount of output.  In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform.  A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n'use strict';\n\nmodule.exports = Transform;\n\nvar Duplex = require('./_stream_duplex');\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nutil.inherits(Transform, Duplex);\n\nfunction afterTransform(er, data) {\n  var ts = this._transformState;\n  ts.transforming = false;\n\n  var cb = ts.writecb;\n\n  if (!cb) {\n    return this.emit('error', new Error('write callback called multiple times'));\n  }\n\n  ts.writechunk = null;\n  ts.writecb = null;\n\n  if (data != null) // single equals check for both `null` and `undefined`\n    this.push(data);\n\n  cb(er);\n\n  var rs = this._readableState;\n  rs.reading = false;\n  if (rs.needReadable || rs.length < rs.highWaterMark) {\n    this._read(rs.highWaterMark);\n  }\n}\n\nfunction Transform(options) {\n  if (!(this instanceof Transform)) return new Transform(options);\n\n  Duplex.call(this, options);\n\n  this._transformState = {\n    afterTransform: afterTransform.bind(this),\n    needTransform: false,\n    transforming: false,\n    writecb: null,\n    writechunk: null,\n    writeencoding: null\n  };\n\n  // start out asking for a readable event once data is transformed.\n  this._readableState.needReadable = true;\n\n  // we have implemented the _read method, and done the other things\n  // that Readable wants before the first _read call, so unset the\n  // sync guard flag.\n  this._readableState.sync = false;\n\n  if (options) {\n    if (typeof options.transform === 'function') this._transform = options.transform;\n\n    if (typeof options.flush === 'function') this._flush = options.flush;\n  }\n\n  // When the writable side finishes, then flush out anything remaining.\n  this.on('prefinish', prefinish);\n}\n\nfunction prefinish() {\n  var _this = this;\n\n  if (typeof this._flush === 'function') {\n    this._flush(function (er, data) {\n      done(_this, er, data);\n    });\n  } else {\n    done(this, null, null);\n  }\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n  this._transformState.needTransform = false;\n  return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side.  You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk.  If you pass\n// an error, then that'll put the hurt on the whole operation.  If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n  throw new Error('_transform() is not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n  var ts = this._transformState;\n  ts.writecb = cb;\n  ts.writechunk = chunk;\n  ts.writeencoding = encoding;\n  if (!ts.transforming) {\n    var rs = this._readableState;\n    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n  }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n  var ts = this._transformState;\n\n  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n    ts.transforming = true;\n    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n  } else {\n    // mark that we need a transform, so that any data that comes in\n    // will get processed, now that we've asked for it.\n    ts.needTransform = true;\n  }\n};\n\nTransform.prototype._destroy = function (err, cb) {\n  var _this2 = this;\n\n  Duplex.prototype._destroy.call(this, err, function (err2) {\n    cb(err2);\n    _this2.emit('close');\n  });\n};\n\nfunction done(stream, er, data) {\n  if (er) return stream.emit('error', er);\n\n  if (data != null) // single equals check for both `null` and `undefined`\n    stream.push(data);\n\n  // if there's nothing in the write buffer, then that means\n  // that nothing more will ever be provided\n  if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');\n\n  if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');\n\n  return stream.push(null);\n}","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n'use strict';\n\nmodule.exports = PassThrough;\n\nvar Transform = require('./_stream_transform');\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nutil.inherits(PassThrough, Transform);\n\nfunction PassThrough(options) {\n  if (!(this instanceof PassThrough)) return new PassThrough(options);\n\n  Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n  cb(null, chunk);\n};","exports = module.exports = require('./lib/_stream_readable.js');\nexports.Stream = exports;\nexports.Readable = exports;\nexports.Writable = require('./lib/_stream_writable.js');\nexports.Duplex = require('./lib/_stream_duplex.js');\nexports.Transform = require('./lib/_stream_transform.js');\nexports.PassThrough = require('./lib/_stream_passthrough.js');\n","module.exports = require('./lib/_stream_writable.js');\n","module.exports = require('./lib/_stream_duplex.js');\n","module.exports = require('./readable').Transform\n","module.exports = require('./readable').PassThrough\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = Stream;\n\nvar EE = require('events').EventEmitter;\nvar inherits = require('inherits');\n\ninherits(Stream, EE);\nStream.Readable = require('readable-stream/readable.js');\nStream.Writable = require('readable-stream/writable.js');\nStream.Duplex = require('readable-stream/duplex.js');\nStream.Transform = require('readable-stream/transform.js');\nStream.PassThrough = require('readable-stream/passthrough.js');\n\n// Backwards-compat with node 0.4.x\nStream.Stream = Stream;\n\n\n\n// old-style streams.  Note that the pipe method (the only relevant\n// part of this class) is overridden in the Readable class.\n\nfunction Stream() {\n  EE.call(this);\n}\n\nStream.prototype.pipe = function(dest, options) {\n  var source = this;\n\n  function ondata(chunk) {\n    if (dest.writable) {\n      if (false === dest.write(chunk) && source.pause) {\n        source.pause();\n      }\n    }\n  }\n\n  source.on('data', ondata);\n\n  function ondrain() {\n    if (source.readable && source.resume) {\n      source.resume();\n    }\n  }\n\n  dest.on('drain', ondrain);\n\n  // If the 'end' option is not supplied, dest.end() will be called when\n  // source gets the 'end' or 'close' events.  Only dest.end() once.\n  if (!dest._isStdio && (!options || options.end !== false)) {\n    source.on('end', onend);\n    source.on('close', onclose);\n  }\n\n  var didOnEnd = false;\n  function onend() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    dest.end();\n  }\n\n\n  function onclose() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    if (typeof dest.destroy === 'function') dest.destroy();\n  }\n\n  // don't leave dangling pipes when there are errors.\n  function onerror(er) {\n    cleanup();\n    if (EE.listenerCount(this, 'error') === 0) {\n      throw er; // Unhandled stream error in pipe.\n    }\n  }\n\n  source.on('error', onerror);\n  dest.on('error', onerror);\n\n  // remove all the event listeners that were added.\n  function cleanup() {\n    source.removeListener('data', ondata);\n    dest.removeListener('drain', ondrain);\n\n    source.removeListener('end', onend);\n    source.removeListener('close', onclose);\n\n    source.removeListener('error', onerror);\n    dest.removeListener('error', onerror);\n\n    source.removeListener('end', cleanup);\n    source.removeListener('close', cleanup);\n\n    dest.removeListener('close', cleanup);\n  }\n\n  source.on('end', cleanup);\n  source.on('close', cleanup);\n\n  dest.on('close', cleanup);\n\n  dest.emit('pipe', source);\n\n  // Allow for unix-like usage: A.pipe(B).pipe(C)\n  return dest;\n};\n","/*@license\n\tPapa Parse\n\tv4.6.0\n\thttps://github.com/mholt/PapaParse\n\tLicense: MIT\n*/\n(function(root, factory)\n{\n\t/* globals define */\n\tif (typeof define === 'function' && define.amd)\n\t{\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([], factory);\n\t}\n\telse if (typeof module === 'object' && typeof exports !== 'undefined')\n\t{\n\t\t// Node. Does not work with strict CommonJS, but\n\t\t// only CommonJS-like environments that support module.exports,\n\t\t// like Node.\n\t\tmodule.exports = factory();\n\t}\n\telse\n\t{\n\t\t// Browser globals (root is window)\n\t\troot.Papa = factory();\n\t}\n}(this, function()\n{\n\t'use strict';\n\n\tvar global = (function() {\n\t\t// alternative method, similar to `Function('return this')()`\n\t\t// but without using `eval` (which is disabled when\n\t\t// using Content Security Policy).\n\n\t\tif (typeof self !== 'undefined') { return self; }\n\t\tif (typeof window !== 'undefined') { return window; }\n\t\tif (typeof global !== 'undefined') { return global; }\n\n\t\t// When running tests none of the above have been defined\n\t\treturn {};\n\t})();\n\n\n\tvar IS_WORKER = !global.document && !!global.postMessage,\n\t\tIS_PAPA_WORKER = IS_WORKER && /(\\?|&)papaworker(=|&|$)/.test(global.location.search),\n\t\tLOADED_SYNC = false, AUTO_SCRIPT_PATH;\n\tvar workers = {}, workerIdCounter = 0;\n\n\tvar Papa = {};\n\n\tPapa.parse = CsvToJson;\n\tPapa.unparse = JsonToCsv;\n\n\tPapa.RECORD_SEP = String.fromCharCode(30);\n\tPapa.UNIT_SEP = String.fromCharCode(31);\n\tPapa.BYTE_ORDER_MARK = '\\ufeff';\n\tPapa.BAD_DELIMITERS = ['\\r', '\\n', '\"', Papa.BYTE_ORDER_MARK];\n\tPapa.WORKERS_SUPPORTED = !IS_WORKER && !!global.Worker;\n\tPapa.SCRIPT_PATH = null;\t// Must be set by your code if you use workers and this lib is loaded asynchronously\n\tPapa.NODE_STREAM_INPUT = 1;\n\n\t// Configurable chunk sizes for local and remote files, respectively\n\tPapa.LocalChunkSize = 1024 * 1024 * 10;\t// 10 MB\n\tPapa.RemoteChunkSize = 1024 * 1024 * 5;\t// 5 MB\n\tPapa.DefaultDelimiter = ',';\t\t\t// Used if not specified and detection fails\n\n\t// Exposed for testing and development only\n\tPapa.Parser = Parser;\n\tPapa.ParserHandle = ParserHandle;\n\tPapa.NetworkStreamer = NetworkStreamer;\n\tPapa.FileStreamer = FileStreamer;\n\tPapa.StringStreamer = StringStreamer;\n\tPapa.ReadableStreamStreamer = ReadableStreamStreamer;\n\tPapa.DuplexStreamStreamer = DuplexStreamStreamer;\n\n\tif (global.jQuery)\n\t{\n\t\tvar $ = global.jQuery;\n\t\t$.fn.parse = function(options)\n\t\t{\n\t\t\tvar config = options.config || {};\n\t\t\tvar queue = [];\n\n\t\t\tthis.each(function(idx)\n\t\t\t{\n\t\t\t\tvar supported = $(this).prop('tagName').toUpperCase() === 'INPUT'\n\t\t\t\t\t\t\t\t&& $(this).attr('type').toLowerCase() === 'file'\n\t\t\t\t\t\t\t\t&& global.FileReader;\n\n\t\t\t\tif (!supported || !this.files || this.files.length === 0)\n\t\t\t\t\treturn true;\t// continue to next input element\n\n\t\t\t\tfor (var i = 0; i < this.files.length; i++)\n\t\t\t\t{\n\t\t\t\t\tqueue.push({\n\t\t\t\t\t\tfile: this.files[i],\n\t\t\t\t\t\tinputElem: this,\n\t\t\t\t\t\tinstanceConfig: $.extend({}, config)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tparseNextFile();\t// begin parsing\n\t\t\treturn this;\t\t// maintains chainability\n\n\n\t\t\tfunction parseNextFile()\n\t\t\t{\n\t\t\t\tif (queue.length === 0)\n\t\t\t\t{\n\t\t\t\t\tif (isFunction(options.complete))\n\t\t\t\t\t\toptions.complete();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar f = queue[0];\n\n\t\t\t\tif (isFunction(options.before))\n\t\t\t\t{\n\t\t\t\t\tvar returned = options.before(f.file, f.inputElem);\n\n\t\t\t\t\tif (typeof returned === 'object')\n\t\t\t\t\t{\n\t\t\t\t\t\tif (returned.action === 'abort')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\terror('AbortError', f.file, f.inputElem, returned.reason);\n\t\t\t\t\t\t\treturn;\t// Aborts all queued files immediately\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (returned.action === 'skip')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfileComplete();\t// parse the next file in the queue, if any\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (typeof returned.config === 'object')\n\t\t\t\t\t\t\tf.instanceConfig = $.extend(f.instanceConfig, returned.config);\n\t\t\t\t\t}\n\t\t\t\t\telse if (returned === 'skip')\n\t\t\t\t\t{\n\t\t\t\t\t\tfileComplete();\t// parse the next file in the queue, if any\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Wrap up the user's complete callback, if any, so that ours also gets executed\n\t\t\t\tvar userCompleteFunc = f.instanceConfig.complete;\n\t\t\t\tf.instanceConfig.complete = function(results)\n\t\t\t\t{\n\t\t\t\t\tif (isFunction(userCompleteFunc))\n\t\t\t\t\t\tuserCompleteFunc(results, f.file, f.inputElem);\n\t\t\t\t\tfileComplete();\n\t\t\t\t};\n\n\t\t\t\tPapa.parse(f.file, f.instanceConfig);\n\t\t\t}\n\n\t\t\tfunction error(name, file, elem, reason)\n\t\t\t{\n\t\t\t\tif (isFunction(options.error))\n\t\t\t\t\toptions.error({name: name}, file, elem, reason);\n\t\t\t}\n\n\t\t\tfunction fileComplete()\n\t\t\t{\n\t\t\t\tqueue.splice(0, 1);\n\t\t\t\tparseNextFile();\n\t\t\t}\n\t\t};\n\t}\n\n\n\tif (IS_PAPA_WORKER)\n\t{\n\t\tglobal.onmessage = workerThreadReceivedMessage;\n\t}\n\telse if (Papa.WORKERS_SUPPORTED)\n\t{\n\t\tAUTO_SCRIPT_PATH = getScriptPath();\n\n\t\t// Check if the script was loaded synchronously\n\t\tif (!document.body)\n\t\t{\n\t\t\t// Body doesn't exist yet, must be synchronous\n\t\t\tLOADED_SYNC = true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdocument.addEventListener('DOMContentLoaded', function() {\n\t\t\t\tLOADED_SYNC = true;\n\t\t\t}, true);\n\t\t}\n\t}\n\n\n\n\n\tfunction CsvToJson(_input, _config)\n\t{\n\t\t_config = _config || {};\n\t\tvar dynamicTyping = _config.dynamicTyping || false;\n\t\tif (isFunction(dynamicTyping)) {\n\t\t\t_config.dynamicTypingFunction = dynamicTyping;\n\t\t\t// Will be filled on first row call\n\t\t\tdynamicTyping = {};\n\t\t}\n\t\t_config.dynamicTyping = dynamicTyping;\n\n\t\t_config.transform = isFunction(_config.transform) ? _config.transform : false;\n\n\t\tif (_config.worker && Papa.WORKERS_SUPPORTED)\n\t\t{\n\t\t\tvar w = newWorker();\n\n\t\t\tw.userStep = _config.step;\n\t\t\tw.userChunk = _config.chunk;\n\t\t\tw.userComplete = _config.complete;\n\t\t\tw.userError = _config.error;\n\n\t\t\t_config.step = isFunction(_config.step);\n\t\t\t_config.chunk = isFunction(_config.chunk);\n\t\t\t_config.complete = isFunction(_config.complete);\n\t\t\t_config.error = isFunction(_config.error);\n\t\t\tdelete _config.worker;\t// prevent infinite loop\n\n\t\t\tw.postMessage({\n\t\t\t\tinput: _input,\n\t\t\t\tconfig: _config,\n\t\t\t\tworkerId: w.id\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tvar streamer = null;\n\t\tif (_input === Papa.NODE_STREAM_INPUT)\n\t\t{\n\t\t\t// create a node Duplex stream for use\n\t\t\t// with .pipe\n\t\t\tstreamer = new DuplexStreamStreamer(_config);\n\t\t\treturn streamer.getStream();\n\t\t}\n\t\telse if (typeof _input === 'string')\n\t\t{\n\t\t\tif (_config.download)\n\t\t\t\tstreamer = new NetworkStreamer(_config);\n\t\t\telse\n\t\t\t\tstreamer = new StringStreamer(_config);\n\t\t}\n\t\telse if (_input.readable === true && isFunction(_input.read) && isFunction(_input.on))\n\t\t{\n\t\t\tstreamer = new ReadableStreamStreamer(_config);\n\t\t}\n\t\telse if ((global.File && _input instanceof File) || _input instanceof Object)\t// ...Safari. (see issue #106)\n\t\t\tstreamer = new FileStreamer(_config);\n\n\t\treturn streamer.stream(_input);\n\t}\n\n\n\n\n\n\n\tfunction JsonToCsv(_input, _config)\n\t{\n\t\t// Default configuration\n\n\t\t/** whether to surround every datum with quotes */\n\t\tvar _quotes = false;\n\n\t\t/** whether to write headers */\n\t\tvar _writeHeader = true;\n\n\t\t/** delimiting character(s) */\n\t\tvar _delimiter = ',';\n\n\t\t/** newline character(s) */\n\t\tvar _newline = '\\r\\n';\n\n\t\t/** quote character */\n\t\tvar _quoteChar = '\"';\n\n\t\tunpackConfig();\n\n\t\tvar quoteCharRegex = new RegExp(_quoteChar, 'g');\n\n\t\tif (typeof _input === 'string')\n\t\t\t_input = JSON.parse(_input);\n\n\t\tif (_input instanceof Array)\n\t\t{\n\t\t\tif (!_input.length || _input[0] instanceof Array)\n\t\t\t\treturn serialize(null, _input);\n\t\t\telse if (typeof _input[0] === 'object')\n\t\t\t\treturn serialize(objectKeys(_input[0]), _input);\n\t\t}\n\t\telse if (typeof _input === 'object')\n\t\t{\n\t\t\tif (typeof _input.data === 'string')\n\t\t\t\t_input.data = JSON.parse(_input.data);\n\n\t\t\tif (_input.data instanceof Array)\n\t\t\t{\n\t\t\t\tif (!_input.fields)\n\t\t\t\t\t_input.fields =  _input.meta && _input.meta.fields;\n\n\t\t\t\tif (!_input.fields)\n\t\t\t\t\t_input.fields =  _input.data[0] instanceof Array\n\t\t\t\t\t\t? _input.fields\n\t\t\t\t\t\t: objectKeys(_input.data[0]);\n\n\t\t\t\tif (!(_input.data[0] instanceof Array) && typeof _input.data[0] !== 'object')\n\t\t\t\t\t_input.data = [_input.data];\t// handles input like [1,2,3] or ['asdf']\n\t\t\t}\n\n\t\t\treturn serialize(_input.fields || [], _input.data || []);\n\t\t}\n\n\t\t// Default (any valid paths should return before this)\n\t\tthrow 'exception: Unable to serialize unrecognized input';\n\n\n\t\tfunction unpackConfig()\n\t\t{\n\t\t\tif (typeof _config !== 'object')\n\t\t\t\treturn;\n\n\t\t\tif (typeof _config.delimiter === 'string'\n                && !Papa.BAD_DELIMITERS.filter(function(value) { return _config.delimiter.indexOf(value) !== -1; }).length)\n\t\t\t{\n\t\t\t\t_delimiter = _config.delimiter;\n\t\t\t}\n\n\t\t\tif (typeof _config.quotes === 'boolean'\n\t\t\t\t|| _config.quotes instanceof Array)\n\t\t\t\t_quotes = _config.quotes;\n\n\t\t\tif (typeof _config.newline === 'string')\n\t\t\t\t_newline = _config.newline;\n\n\t\t\tif (typeof _config.quoteChar === 'string')\n\t\t\t\t_quoteChar = _config.quoteChar;\n\n\t\t\tif (typeof _config.header === 'boolean')\n\t\t\t\t_writeHeader = _config.header;\n\t\t}\n\n\n\t\t/** Turns an object's keys into an array */\n\t\tfunction objectKeys(obj)\n\t\t{\n\t\t\tif (typeof obj !== 'object')\n\t\t\t\treturn [];\n\t\t\tvar keys = [];\n\t\t\tfor (var key in obj)\n\t\t\t\tkeys.push(key);\n\t\t\treturn keys;\n\t\t}\n\n\t\t/** The double for loop that iterates the data and writes out a CSV string including header row */\n\t\tfunction serialize(fields, data)\n\t\t{\n\t\t\tvar csv = '';\n\n\t\t\tif (typeof fields === 'string')\n\t\t\t\tfields = JSON.parse(fields);\n\t\t\tif (typeof data === 'string')\n\t\t\t\tdata = JSON.parse(data);\n\n\t\t\tvar hasHeader = fields instanceof Array && fields.length > 0;\n\t\t\tvar dataKeyedByField = !(data[0] instanceof Array);\n\n\t\t\t// If there a header row, write it first\n\t\t\tif (hasHeader && _writeHeader)\n\t\t\t{\n\t\t\t\tfor (var i = 0; i < fields.length; i++)\n\t\t\t\t{\n\t\t\t\t\tif (i > 0)\n\t\t\t\t\t\tcsv += _delimiter;\n\t\t\t\t\tcsv += safe(fields[i], i);\n\t\t\t\t}\n\t\t\t\tif (data.length > 0)\n\t\t\t\t\tcsv += _newline;\n\t\t\t}\n\n\t\t\t// Then write out the data\n\t\t\tfor (var row = 0; row < data.length; row++)\n\t\t\t{\n\t\t\t\tvar maxCol = hasHeader ? fields.length : data[row].length;\n\n\t\t\t\tfor (var col = 0; col < maxCol; col++)\n\t\t\t\t{\n\t\t\t\t\tif (col > 0)\n\t\t\t\t\t\tcsv += _delimiter;\n\t\t\t\t\tvar colIdx = hasHeader && dataKeyedByField ? fields[col] : col;\n\t\t\t\t\tcsv += safe(data[row][colIdx], col);\n\t\t\t\t}\n\n\t\t\t\tif (row < data.length - 1)\n\t\t\t\t\tcsv += _newline;\n\t\t\t}\n\n\t\t\treturn csv;\n\t\t}\n\n\t\t/** Encloses a value around quotes if needed (makes a value safe for CSV insertion) */\n\t\tfunction safe(str, col)\n\t\t{\n\t\t\tif (typeof str === 'undefined' || str === null)\n\t\t\t\treturn '';\n\n\t\t\tif (str.constructor === Date)\n\t\t\t\treturn JSON.stringify(str).slice(1, 25);\n\n\t\t\tstr = str.toString().replace(quoteCharRegex, _quoteChar + _quoteChar);\n\n\t\t\tvar needsQuotes = (typeof _quotes === 'boolean' && _quotes)\n\t\t\t\t\t\t\t|| (_quotes instanceof Array && _quotes[col])\n\t\t\t\t\t\t\t|| hasAny(str, Papa.BAD_DELIMITERS)\n\t\t\t\t\t\t\t|| str.indexOf(_delimiter) > -1\n\t\t\t\t\t\t\t|| str.charAt(0) === ' '\n\t\t\t\t\t\t\t|| str.charAt(str.length - 1) === ' ';\n\n\t\t\treturn needsQuotes ? _quoteChar + str + _quoteChar : str;\n\t\t}\n\n\t\tfunction hasAny(str, substrings)\n\t\t{\n\t\t\tfor (var i = 0; i < substrings.length; i++)\n\t\t\t\tif (str.indexOf(substrings[i]) > -1)\n\t\t\t\t\treturn true;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/** ChunkStreamer is the base prototype for various streamer implementations. */\n\tfunction ChunkStreamer(config)\n\t{\n\t\tthis._handle = null;\n\t\tthis._finished = false;\n\t\tthis._completed = false;\n\t\tthis._input = null;\n\t\tthis._baseIndex = 0;\n\t\tthis._partialLine = '';\n\t\tthis._rowCount = 0;\n\t\tthis._start = 0;\n\t\tthis._nextChunk = null;\n\t\tthis.isFirstChunk = true;\n\t\tthis._completeResults = {\n\t\t\tdata: [],\n\t\t\terrors: [],\n\t\t\tmeta: {}\n\t\t};\n\t\treplaceConfig.call(this, config);\n\n\t\tthis.parseChunk = function(chunk, isFakeChunk)\n\t\t{\n\t\t\t// First chunk pre-processing\n\t\t\tif (this.isFirstChunk && isFunction(this._config.beforeFirstChunk))\n\t\t\t{\n\t\t\t\tvar modifiedChunk = this._config.beforeFirstChunk(chunk);\n\t\t\t\tif (modifiedChunk !== undefined)\n\t\t\t\t\tchunk = modifiedChunk;\n\t\t\t}\n\t\t\tthis.isFirstChunk = false;\n\n\t\t\t// Rejoin the line we likely just split in two by chunking the file\n\t\t\tvar aggregate = this._partialLine + chunk;\n\t\t\tthis._partialLine = '';\n\n\t\t\tvar results = this._handle.parse(aggregate, this._baseIndex, !this._finished);\n\n\t\t\tif (this._handle.paused() || this._handle.aborted())\n\t\t\t\treturn;\n\n\t\t\tvar lastIndex = results.meta.cursor;\n\n\t\t\tif (!this._finished)\n\t\t\t{\n\t\t\t\tthis._partialLine = aggregate.substring(lastIndex - this._baseIndex);\n\t\t\t\tthis._baseIndex = lastIndex;\n\t\t\t}\n\n\t\t\tif (results && results.data)\n\t\t\t\tthis._rowCount += results.data.length;\n\n\t\t\tvar finishedIncludingPreview = this._finished || (this._config.preview && this._rowCount >= this._config.preview);\n\n\t\t\tif (IS_PAPA_WORKER)\n\t\t\t{\n\t\t\t\tglobal.postMessage({\n\t\t\t\t\tresults: results,\n\t\t\t\t\tworkerId: Papa.WORKER_ID,\n\t\t\t\t\tfinished: finishedIncludingPreview\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (isFunction(this._config.chunk) && !isFakeChunk)\n\t\t\t{\n\t\t\t\tthis._config.chunk(results, this._handle);\n\t\t\t\tif (this._handle.paused() || this._handle.aborted())\n\t\t\t\t\treturn;\n\t\t\t\tresults = undefined;\n\t\t\t\tthis._completeResults = undefined;\n\t\t\t}\n\n\t\t\tif (!this._config.step && !this._config.chunk) {\n\t\t\t\tthis._completeResults.data = this._completeResults.data.concat(results.data);\n\t\t\t\tthis._completeResults.errors = this._completeResults.errors.concat(results.errors);\n\t\t\t\tthis._completeResults.meta = results.meta;\n\t\t\t}\n\n\t\t\tif (!this._completed && finishedIncludingPreview && isFunction(this._config.complete) && (!results || !results.meta.aborted)) {\n\t\t\t\tthis._config.complete(this._completeResults, this._input);\n\t\t\t\tthis._completed = true;\n\t\t\t}\n\n\t\t\tif (!finishedIncludingPreview && (!results || !results.meta.paused))\n\t\t\t\tthis._nextChunk();\n\n\t\t\treturn results;\n\t\t};\n\n\t\tthis._sendError = function(error)\n\t\t{\n\t\t\tif (isFunction(this._config.error))\n\t\t\t\tthis._config.error(error);\n\t\t\telse if (IS_PAPA_WORKER && this._config.error)\n\t\t\t{\n\t\t\t\tglobal.postMessage({\n\t\t\t\t\tworkerId: Papa.WORKER_ID,\n\t\t\t\t\terror: error,\n\t\t\t\t\tfinished: false\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tfunction replaceConfig(config)\n\t\t{\n\t\t\t// Deep-copy the config so we can edit it\n\t\t\tvar configCopy = copy(config);\n\t\t\tconfigCopy.chunkSize = parseInt(configCopy.chunkSize);\t// parseInt VERY important so we don't concatenate strings!\n\t\t\tif (!config.step && !config.chunk)\n\t\t\t\tconfigCopy.chunkSize = null;  // disable Range header if not streaming; bad values break IIS - see issue #196\n\t\t\tthis._handle = new ParserHandle(configCopy);\n\t\t\tthis._handle.streamer = this;\n\t\t\tthis._config = configCopy;\t// persist the copy to the caller\n\t\t}\n\t}\n\n\n\tfunction NetworkStreamer(config)\n\t{\n\t\tconfig = config || {};\n\t\tif (!config.chunkSize)\n\t\t\tconfig.chunkSize = Papa.RemoteChunkSize;\n\t\tChunkStreamer.call(this, config);\n\n\t\tvar xhr;\n\n\t\tif (IS_WORKER)\n\t\t{\n\t\t\tthis._nextChunk = function()\n\t\t\t{\n\t\t\t\tthis._readChunk();\n\t\t\t\tthis._chunkLoaded();\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._nextChunk = function()\n\t\t\t{\n\t\t\t\tthis._readChunk();\n\t\t\t};\n\t\t}\n\n\t\tthis.stream = function(url)\n\t\t{\n\t\t\tthis._input = url;\n\t\t\tthis._nextChunk();\t// Starts streaming\n\t\t};\n\n\t\tthis._readChunk = function()\n\t\t{\n\t\t\tif (this._finished)\n\t\t\t{\n\t\t\t\tthis._chunkLoaded();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\txhr = new XMLHttpRequest();\n\n\t\t\tif (this._config.withCredentials)\n\t\t\t{\n\t\t\t\txhr.withCredentials = this._config.withCredentials;\n\t\t\t}\n\n\t\t\tif (!IS_WORKER)\n\t\t\t{\n\t\t\t\txhr.onload = bindFunction(this._chunkLoaded, this);\n\t\t\t\txhr.onerror = bindFunction(this._chunkError, this);\n\t\t\t}\n\n\t\t\txhr.open('GET', this._input, !IS_WORKER);\n\t\t\t// Headers can only be set when once the request state is OPENED\n\t\t\tif (this._config.downloadRequestHeaders)\n\t\t\t{\n\t\t\t\tvar headers = this._config.downloadRequestHeaders;\n\n\t\t\t\tfor (var headerName in headers)\n\t\t\t\t{\n\t\t\t\t\txhr.setRequestHeader(headerName, headers[headerName]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this._config.chunkSize)\n\t\t\t{\n\t\t\t\tvar end = this._start + this._config.chunkSize - 1;\t// minus one because byte range is inclusive\n\t\t\t\txhr.setRequestHeader('Range', 'bytes=' + this._start + '-' + end);\n\t\t\t\txhr.setRequestHeader('If-None-Match', 'webkit-no-cache'); // https://bugs.webkit.org/show_bug.cgi?id=82672\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\txhr.send();\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tthis._chunkError(err.message);\n\t\t\t}\n\n\t\t\tif (IS_WORKER && xhr.status === 0)\n\t\t\t\tthis._chunkError();\n\t\t\telse\n\t\t\t\tthis._start += this._config.chunkSize;\n\t\t};\n\n\t\tthis._chunkLoaded = function()\n\t\t{\n\t\t\tif (xhr.readyState !== 4)\n\t\t\t\treturn;\n\n\t\t\tif (xhr.status < 200 || xhr.status >= 400)\n\t\t\t{\n\t\t\t\tthis._chunkError();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._finished = !this._config.chunkSize || this._start > getFileSize(xhr);\n\t\t\tthis.parseChunk(xhr.responseText);\n\t\t};\n\n\t\tthis._chunkError = function(errorMessage)\n\t\t{\n\t\t\tvar errorText = xhr.statusText || errorMessage;\n\t\t\tthis._sendError(new Error(errorText));\n\t\t};\n\n\t\tfunction getFileSize(xhr)\n\t\t{\n\t\t\tvar contentRange = xhr.getResponseHeader('Content-Range');\n\t\t\tif (contentRange === null) { // no content range, then finish!\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\treturn parseInt(contentRange.substr(contentRange.lastIndexOf('/') + 1));\n\t\t}\n\t}\n\tNetworkStreamer.prototype = Object.create(ChunkStreamer.prototype);\n\tNetworkStreamer.prototype.constructor = NetworkStreamer;\n\n\n\tfunction FileStreamer(config)\n\t{\n\t\tconfig = config || {};\n\t\tif (!config.chunkSize)\n\t\t\tconfig.chunkSize = Papa.LocalChunkSize;\n\t\tChunkStreamer.call(this, config);\n\n\t\tvar reader, slice;\n\n\t\t// FileReader is better than FileReaderSync (even in worker) - see http://stackoverflow.com/q/24708649/1048862\n\t\t// But Firefox is a pill, too - see issue #76: https://github.com/mholt/PapaParse/issues/76\n\t\tvar usingAsyncReader = typeof FileReader !== 'undefined';\t// Safari doesn't consider it a function - see issue #105\n\n\t\tthis.stream = function(file)\n\t\t{\n\t\t\tthis._input = file;\n\t\t\tslice = file.slice || file.webkitSlice || file.mozSlice;\n\n\t\t\tif (usingAsyncReader)\n\t\t\t{\n\t\t\t\treader = new FileReader();\t\t// Preferred method of reading files, even in workers\n\t\t\t\treader.onload = bindFunction(this._chunkLoaded, this);\n\t\t\t\treader.onerror = bindFunction(this._chunkError, this);\n\t\t\t}\n\t\t\telse\n\t\t\t\treader = new FileReaderSync();\t// Hack for running in a web worker in Firefox\n\n\t\t\tthis._nextChunk();\t// Starts streaming\n\t\t};\n\n\t\tthis._nextChunk = function()\n\t\t{\n\t\t\tif (!this._finished && (!this._config.preview || this._rowCount < this._config.preview))\n\t\t\t\tthis._readChunk();\n\t\t};\n\n\t\tthis._readChunk = function()\n\t\t{\n\t\t\tvar input = this._input;\n\t\t\tif (this._config.chunkSize)\n\t\t\t{\n\t\t\t\tvar end = Math.min(this._start + this._config.chunkSize, this._input.size);\n\t\t\t\tinput = slice.call(input, this._start, end);\n\t\t\t}\n\t\t\tvar txt = reader.readAsText(input, this._config.encoding);\n\t\t\tif (!usingAsyncReader)\n\t\t\t\tthis._chunkLoaded({ target: { result: txt } });\t// mimic the async signature\n\t\t};\n\n\t\tthis._chunkLoaded = function(event)\n\t\t{\n\t\t\t// Very important to increment start each time before handling results\n\t\t\tthis._start += this._config.chunkSize;\n\t\t\tthis._finished = !this._config.chunkSize || this._start >= this._input.size;\n\t\t\tthis.parseChunk(event.target.result);\n\t\t};\n\n\t\tthis._chunkError = function()\n\t\t{\n\t\t\tthis._sendError(reader.error);\n\t\t};\n\n\t}\n\tFileStreamer.prototype = Object.create(ChunkStreamer.prototype);\n\tFileStreamer.prototype.constructor = FileStreamer;\n\n\n\tfunction StringStreamer(config)\n\t{\n\t\tconfig = config || {};\n\t\tChunkStreamer.call(this, config);\n\n\t\tvar remaining;\n\t\tthis.stream = function(s)\n\t\t{\n\t\t\tremaining = s;\n\t\t\treturn this._nextChunk();\n\t\t};\n\t\tthis._nextChunk = function()\n\t\t{\n\t\t\tif (this._finished) return;\n\t\t\tvar size = this._config.chunkSize;\n\t\t\tvar chunk = size ? remaining.substr(0, size) : remaining;\n\t\t\tremaining = size ? remaining.substr(size) : '';\n\t\t\tthis._finished = !remaining;\n\t\t\treturn this.parseChunk(chunk);\n\t\t};\n\t}\n\tStringStreamer.prototype = Object.create(StringStreamer.prototype);\n\tStringStreamer.prototype.constructor = StringStreamer;\n\n\n\tfunction ReadableStreamStreamer(config)\n\t{\n\t\tconfig = config || {};\n\n\t\tChunkStreamer.call(this, config);\n\n\t\tvar queue = [];\n\t\tvar parseOnData = true;\n\t\tvar streamHasEnded = false;\n\n\t\tthis.pause = function()\n\t\t{\n\t\t\tChunkStreamer.prototype.pause.apply(this, arguments);\n\t\t\tthis._input.pause();\n\t\t};\n\n\t\tthis.resume = function()\n\t\t{\n\t\t\tChunkStreamer.prototype.resume.apply(this, arguments);\n\t\t\tthis._input.resume();\n\t\t};\n\n\t\tthis.stream = function(stream)\n\t\t{\n\t\t\tthis._input = stream;\n\n\t\t\tthis._input.on('data', this._streamData);\n\t\t\tthis._input.on('end', this._streamEnd);\n\t\t\tthis._input.on('error', this._streamError);\n\t\t};\n\n\t\tthis._checkIsFinished = function()\n\t\t{\n\t\t\tif (streamHasEnded && queue.length === 1) {\n\t\t\t\tthis._finished = true;\n\t\t\t}\n\t\t};\n\n\t\tthis._nextChunk = function()\n\t\t{\n\t\t\tthis._checkIsFinished();\n\t\t\tif (queue.length)\n\t\t\t{\n\t\t\t\tthis.parseChunk(queue.shift());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tparseOnData = true;\n\t\t\t}\n\t\t};\n\n\t\tthis._streamData = bindFunction(function(chunk)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tqueue.push(typeof chunk === 'string' ? chunk : chunk.toString(this._config.encoding));\n\n\t\t\t\tif (parseOnData)\n\t\t\t\t{\n\t\t\t\t\tparseOnData = false;\n\t\t\t\t\tthis._checkIsFinished();\n\t\t\t\t\tthis.parseChunk(queue.shift());\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{\n\t\t\t\tthis._streamError(error);\n\t\t\t}\n\t\t}, this);\n\n\t\tthis._streamError = bindFunction(function(error)\n\t\t{\n\t\t\tthis._streamCleanUp();\n\t\t\tthis._sendError(error);\n\t\t}, this);\n\n\t\tthis._streamEnd = bindFunction(function()\n\t\t{\n\t\t\tthis._streamCleanUp();\n\t\t\tstreamHasEnded = true;\n\t\t\tthis._streamData('');\n\t\t}, this);\n\n\t\tthis._streamCleanUp = bindFunction(function()\n\t\t{\n\t\t\tthis._input.removeListener('data', this._streamData);\n\t\t\tthis._input.removeListener('end', this._streamEnd);\n\t\t\tthis._input.removeListener('error', this._streamError);\n\t\t}, this);\n\t}\n\tReadableStreamStreamer.prototype = Object.create(ChunkStreamer.prototype);\n\tReadableStreamStreamer.prototype.constructor = ReadableStreamStreamer;\n\n\n\tfunction DuplexStreamStreamer(_config) {\n\t\tvar Duplex = require('stream').Duplex;\n\t\tvar config = copy(_config);\n\t\tvar parseOnWrite = true;\n\t\tvar writeStreamHasFinished = false;\n\t\tvar parseCallbackQueue = [];\n\t\tvar stream = null;\n\n\t\tthis._onCsvData = function(results)\n\t\t{\n\t\t\tvar data = results.data;\n\t\t\tfor (var i = 0; i < data.length; i++) {\n\t\t\t\tif (!stream.push(data[i]) && !this._handle.paused()) {\n\t\t\t\t\t// the writeable consumer buffer has filled up\n\t\t\t\t\t// so we need to pause until more items\n\t\t\t\t\t// can be processed\n\t\t\t\t\tthis._handle.pause();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tthis._onCsvComplete = function()\n\t\t{\n\t\t\t// node will finish the read stream when\n\t\t\t// null is pushed\n\t\t\tstream.push(null);\n\t\t};\n\n\t\tconfig.step = bindFunction(this._onCsvData, this);\n\t\tconfig.complete = bindFunction(this._onCsvComplete, this);\n\t\tChunkStreamer.call(this, config);\n\n\t\tthis._nextChunk = function()\n\t\t{\n\t\t\tif (writeStreamHasFinished && parseCallbackQueue.length === 1) {\n\t\t\t\tthis._finished = true;\n\t\t\t}\n\t\t\tif (parseCallbackQueue.length) {\n\t\t\t\tparseCallbackQueue.shift()();\n\t\t\t} else {\n\t\t\t\tparseOnWrite = true;\n\t\t\t}\n\t\t};\n\n\t\tthis._addToParseQueue = function(chunk, callback)\n\t\t{\n\t\t\t// add to queue so that we can indicate\n\t\t\t// completion via callback\n\t\t\t// node will automatically pause the incoming stream\n\t\t\t// when too many items have been added without their\n\t\t\t// callback being invoked\n\t\t\tparseCallbackQueue.push(bindFunction(function() {\n\t\t\t\tthis.parseChunk(typeof chunk === 'string' ? chunk : chunk.toString(config.encoding));\n\t\t\t\tif (isFunction(callback)) {\n\t\t\t\t\treturn callback();\n\t\t\t\t}\n\t\t\t}, this));\n\t\t\tif (parseOnWrite) {\n\t\t\t\tparseOnWrite = false;\n\t\t\t\tthis._nextChunk();\n\t\t\t}\n\t\t};\n\n\t\tthis._onRead = function()\n\t\t{\n\t\t\tif (this._handle.paused()) {\n\t\t\t\t// the writeable consumer can handle more data\n\t\t\t\t// so resume the chunk parsing\n\t\t\t\tthis._handle.resume();\n\t\t\t}\n\t\t};\n\n\t\tthis._onWrite = function(chunk, encoding, callback)\n\t\t{\n\t\t\tthis._addToParseQueue(chunk, callback);\n\t\t};\n\n\t\tthis._onWriteComplete = function()\n\t\t{\n\t\t\twriteStreamHasFinished = true;\n\t\t\t// have to write empty string\n\t\t\t// so parser knows its done\n\t\t\tthis._addToParseQueue('');\n\t\t};\n\n\t\tthis.getStream = function()\n\t\t{\n\t\t\treturn stream;\n\t\t};\n\t\tstream = new Duplex({\n\t\t\treadableObjectMode: true,\n\t\t\tdecodeStrings: false,\n\t\t\tread: bindFunction(this._onRead, this),\n\t\t\twrite: bindFunction(this._onWrite, this)\n\t\t});\n\t\tstream.once('finish', bindFunction(this._onWriteComplete, this));\n\t}\n\tDuplexStreamStreamer.prototype = Object.create(ChunkStreamer.prototype);\n\tDuplexStreamStreamer.prototype.constructor = DuplexStreamStreamer;\n\n\n\t// Use one ParserHandle per entire CSV file or string\n\tfunction ParserHandle(_config)\n\t{\n\t\t// One goal is to minimize the use of regular expressions...\n\t\tvar FLOAT = /^\\s*-?(\\d*\\.?\\d+|\\d+\\.?\\d*)(e[-+]?\\d+)?\\s*$/i;\n\t\tvar ISO_DATE = /(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))/;\n\n\t\tvar self = this;\n\t\tvar _stepCounter = 0;\t// Number of times step was called (number of rows parsed)\n\t\tvar _rowCounter = 0;\t// Number of rows that have been parsed so far\n\t\tvar _input;\t\t\t\t// The input being parsed\n\t\tvar _parser;\t\t\t// The core parser being used\n\t\tvar _paused = false;\t// Whether we are paused or not\n\t\tvar _aborted = false;\t// Whether the parser has aborted or not\n\t\tvar _delimiterError;\t// Temporary state between delimiter detection and processing results\n\t\tvar _fields = [];\t\t// Fields are from the header row of the input, if there is one\n\t\tvar _results = {\t\t// The last results returned from the parser\n\t\t\tdata: [],\n\t\t\terrors: [],\n\t\t\tmeta: {}\n\t\t};\n\n\t\tif (isFunction(_config.step))\n\t\t{\n\t\t\tvar userStep = _config.step;\n\t\t\t_config.step = function(results)\n\t\t\t{\n\t\t\t\t_results = results;\n\n\t\t\t\tif (needsHeaderRow())\n\t\t\t\t\tprocessResults();\n\t\t\t\telse\t// only call user's step function after header row\n\t\t\t\t{\n\t\t\t\t\tprocessResults();\n\n\t\t\t\t\t// It's possbile that this line was empty and there's no row here after all\n\t\t\t\t\tif (_results.data.length === 0)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t_stepCounter += results.data.length;\n\t\t\t\t\tif (_config.preview && _stepCounter > _config.preview)\n\t\t\t\t\t\t_parser.abort();\n\t\t\t\t\telse\n\t\t\t\t\t\tuserStep(_results, self);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t/**\n\t\t * Parses input. Most users won't need, and shouldn't mess with, the baseIndex\n\t\t * and ignoreLastRow parameters. They are used by streamers (wrapper functions)\n\t\t * when an input comes in multiple chunks, like from a file.\n\t\t */\n\t\tthis.parse = function(input, baseIndex, ignoreLastRow)\n\t\t{\n\t\t\tvar quoteChar = _config.quoteChar || '\"';\n\t\t\tif (!_config.newline)\n\t\t\t\t_config.newline = guessLineEndings(input, quoteChar);\n\n\t\t\t_delimiterError = false;\n\t\t\tif (!_config.delimiter)\n\t\t\t{\n\t\t\t\tvar delimGuess = guessDelimiter(input, _config.newline, _config.skipEmptyLines, _config.comments);\n\t\t\t\tif (delimGuess.successful)\n\t\t\t\t\t_config.delimiter = delimGuess.bestDelimiter;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_delimiterError = true;\t// add error after parsing (otherwise it would be overwritten)\n\t\t\t\t\t_config.delimiter = Papa.DefaultDelimiter;\n\t\t\t\t}\n\t\t\t\t_results.meta.delimiter = _config.delimiter;\n\t\t\t}\n\t\t\telse if(isFunction(_config.delimiter))\n\t\t\t{\n\t\t\t\t_config.delimiter = _config.delimiter(input);\n\t\t\t\t_results.meta.delimiter = _config.delimiter;\n\t\t\t}\n\n\t\t\tvar parserConfig = copy(_config);\n\t\t\tif (_config.preview && _config.header)\n\t\t\t\tparserConfig.preview++;\t// to compensate for header row\n\n\t\t\t_input = input;\n\t\t\t_parser = new Parser(parserConfig);\n\t\t\t_results = _parser.parse(_input, baseIndex, ignoreLastRow);\n\t\t\tprocessResults();\n\t\t\treturn _paused ? { meta: { paused: true } } : (_results || { meta: { paused: false } });\n\t\t};\n\n\t\tthis.paused = function()\n\t\t{\n\t\t\treturn _paused;\n\t\t};\n\n\t\tthis.pause = function()\n\t\t{\n\t\t\t_paused = true;\n\t\t\t_parser.abort();\n\t\t\t_input = _input.substr(_parser.getCharIndex());\n\t\t};\n\n\t\tthis.resume = function()\n\t\t{\n\t\t\t_paused = false;\n\t\t\tself.streamer.parseChunk(_input, true);\n\t\t};\n\n\t\tthis.aborted = function()\n\t\t{\n\t\t\treturn _aborted;\n\t\t};\n\n\t\tthis.abort = function()\n\t\t{\n\t\t\t_aborted = true;\n\t\t\t_parser.abort();\n\t\t\t_results.meta.aborted = true;\n\t\t\tif (isFunction(_config.complete))\n\t\t\t\t_config.complete(_results);\n\t\t\t_input = '';\n\t\t};\n\n\t\tfunction testEmptyLine(s) {\n\t\t\treturn _config.skipEmptyLines === 'greedy' ? s.join('').trim() === '' : s.length === 1 && s[0].length === 0;\n\t\t}\n\n\t\tfunction processResults()\n\t\t{\n\t\t\tif (_results && _delimiterError)\n\t\t\t{\n\t\t\t\taddError('Delimiter', 'UndetectableDelimiter', 'Unable to auto-detect delimiting character; defaulted to \\'' + Papa.DefaultDelimiter + '\\'');\n\t\t\t\t_delimiterError = false;\n\t\t\t}\n\n\t\t\tif (_config.skipEmptyLines)\n\t\t\t{\n\t\t\t\tfor (var i = 0; i < _results.data.length; i++)\n\t\t\t\t\tif (testEmptyLine(_results.data[i]))\n\t\t\t\t\t\t_results.data.splice(i--, 1);\n\t\t\t}\n\n\t\t\tif (needsHeaderRow())\n\t\t\t\tfillHeaderFields();\n\n\t\t\treturn applyHeaderAndDynamicTypingAndTransformation();\n\t\t}\n\n\t\tfunction needsHeaderRow()\n\t\t{\n\t\t\treturn _config.header && _fields.length === 0;\n\t\t}\n\n\t\tfunction fillHeaderFields()\n\t\t{\n\t\t\tif (!_results)\n\t\t\t\treturn;\n\t\t\tfor (var i = 0; needsHeaderRow() && i < _results.data.length; i++)\n\t\t\t\tfor (var j = 0; j < _results.data[i].length; j++)\n\t\t\t\t{\n\t\t\t\t\tvar header = _results.data[i][j];\n\n\t\t\t\t\tif (_config.trimHeaders) {\n\t\t\t\t\t\theader = header.trim();\n\t\t\t\t\t}\n\n\t\t\t\t\t_fields.push(header);\n\t\t\t\t}\n\t\t\t_results.data.splice(0, 1);\n\t\t}\n\n\t\tfunction shouldApplyDynamicTyping(field) {\n\t\t\t// Cache function values to avoid calling it for each row\n\t\t\tif (_config.dynamicTypingFunction && _config.dynamicTyping[field] === undefined) {\n\t\t\t\t_config.dynamicTyping[field] = _config.dynamicTypingFunction(field);\n\t\t\t}\n\t\t\treturn (_config.dynamicTyping[field] || _config.dynamicTyping) === true;\n\t\t}\n\n\t\tfunction parseDynamic(field, value)\n\t\t{\n\t\t\tif (shouldApplyDynamicTyping(field))\n\t\t\t{\n\t\t\t\tif (value === 'true' || value === 'TRUE')\n\t\t\t\t\treturn true;\n\t\t\t\telse if (value === 'false' || value === 'FALSE')\n\t\t\t\t\treturn false;\n\t\t\t\telse if (FLOAT.test(value))\n\t\t\t\t\treturn parseFloat(value);\n\t\t\t\telse if (ISO_DATE.test(value))\n\t\t\t\t\treturn new Date(value);\n\t\t\t\telse\n\t\t\t\t\treturn (value === '' ? null : value);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\n\t\tfunction applyHeaderAndDynamicTypingAndTransformation()\n\t\t{\n\t\t\tif (!_results || (!_config.header && !_config.dynamicTyping && !_config.transform))\n\t\t\t\treturn _results;\n\n\t\t\tfor (var i = 0; i < _results.data.length; i++)\n\t\t\t{\n\t\t\t\tvar row = _config.header ? {} : [];\n\n\t\t\t\tvar j;\n\t\t\t\tfor (j = 0; j < _results.data[i].length; j++)\n\t\t\t\t{\n\t\t\t\t\tvar field = j;\n\t\t\t\t\tvar value = _results.data[i][j];\n\n\t\t\t\t\tif (_config.header)\n\t\t\t\t\t\tfield = j >= _fields.length ? '__parsed_extra' : _fields[j];\n\n\t\t\t\t\tif (_config.transform)\n\t\t\t\t\t\tvalue = _config.transform(value,field);\n\n\t\t\t\t\tvalue = parseDynamic(field, value);\n\n\t\t\t\t\tif (field === '__parsed_extra')\n\t\t\t\t\t{\n\t\t\t\t\t\trow[field] = row[field] || [];\n\t\t\t\t\t\trow[field].push(value);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\trow[field] = value;\n\t\t\t\t}\n\n\t\t\t\t_results.data[i] = row;\n\n\t\t\t\tif (_config.header)\n\t\t\t\t{\n\t\t\t\t\tif (j > _fields.length)\n\t\t\t\t\t\taddError('FieldMismatch', 'TooManyFields', 'Too many fields: expected ' + _fields.length + ' fields but parsed ' + j, _rowCounter + i);\n\t\t\t\t\telse if (j < _fields.length)\n\t\t\t\t\t\taddError('FieldMismatch', 'TooFewFields', 'Too few fields: expected ' + _fields.length + ' fields but parsed ' + j, _rowCounter + i);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (_config.header && _results.meta)\n\t\t\t\t_results.meta.fields = _fields;\n\n\t\t\t_rowCounter += _results.data.length;\n\t\t\treturn _results;\n\t\t}\n\n\t\tfunction guessDelimiter(input, newline, skipEmptyLines, comments)\n\t\t{\n\t\t\tvar delimChoices = [',', '\\t', '|', ';', Papa.RECORD_SEP, Papa.UNIT_SEP];\n\t\t\tvar bestDelim, bestDelta, fieldCountPrevRow;\n\n\t\t\tfor (var i = 0; i < delimChoices.length; i++)\n\t\t\t{\n\t\t\t\tvar delim = delimChoices[i];\n\t\t\t\tvar delta = 0, avgFieldCount = 0, emptyLinesCount = 0;\n\t\t\t\tfieldCountPrevRow = undefined;\n\n\t\t\t\tvar preview = new Parser({\n\t\t\t\t\tcomments: comments,\n\t\t\t\t\tdelimiter: delim,\n\t\t\t\t\tnewline: newline,\n\t\t\t\t\tpreview: 10\n\t\t\t\t}).parse(input);\n\n\t\t\t\tfor (var j = 0; j < preview.data.length; j++)\n\t\t\t\t{\n\t\t\t\t\tif (skipEmptyLines && testEmptyLine(preview.data[j]))\n\t\t\t\t\t{\n\t\t\t\t\t\temptyLinesCount++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tvar fieldCount = preview.data[j].length;\n\t\t\t\t\tavgFieldCount += fieldCount;\n\n\t\t\t\t\tif (typeof fieldCountPrevRow === 'undefined')\n\t\t\t\t\t{\n\t\t\t\t\t\tfieldCountPrevRow = fieldCount;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\telse if (fieldCount > 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tdelta += Math.abs(fieldCount - fieldCountPrevRow);\n\t\t\t\t\t\tfieldCountPrevRow = fieldCount;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (preview.data.length > 0)\n\t\t\t\t\tavgFieldCount /= (preview.data.length - emptyLinesCount);\n\n\t\t\t\tif ((typeof bestDelta === 'undefined' || delta < bestDelta)\n\t\t\t\t\t&& avgFieldCount > 1.99)\n\t\t\t\t{\n\t\t\t\t\tbestDelta = delta;\n\t\t\t\t\tbestDelim = delim;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_config.delimiter = bestDelim;\n\n\t\t\treturn {\n\t\t\t\tsuccessful: !!bestDelim,\n\t\t\t\tbestDelimiter: bestDelim\n\t\t\t};\n\t\t}\n\n\t\tfunction guessLineEndings(input, quoteChar)\n\t\t{\n\t\t\tinput = input.substr(0, 1024 * 1024);\t// max length 1 MB\n\t\t\t// Replace all the text inside quotes\n\t\t\tvar re = new RegExp(escapeRegExp(quoteChar) + '([^]*?)' + escapeRegExp(quoteChar), 'gm');\n\t\t\tinput = input.replace(re, '');\n\n\t\t\tvar r = input.split('\\r');\n\n\t\t\tvar n = input.split('\\n');\n\n\t\t\tvar nAppearsFirst = (n.length > 1 && n[0].length < r[0].length);\n\n\t\t\tif (r.length === 1 || nAppearsFirst)\n\t\t\t\treturn '\\n';\n\n\t\t\tvar numWithN = 0;\n\t\t\tfor (var i = 0; i < r.length; i++)\n\t\t\t{\n\t\t\t\tif (r[i][0] === '\\n')\n\t\t\t\t\tnumWithN++;\n\t\t\t}\n\n\t\t\treturn numWithN >= r.length / 2 ? '\\r\\n' : '\\r';\n\t\t}\n\n\t\tfunction addError(type, code, msg, row)\n\t\t{\n\t\t\t_results.errors.push({\n\t\t\t\ttype: type,\n\t\t\t\tcode: code,\n\t\t\t\tmessage: msg,\n\t\t\t\trow: row\n\t\t\t});\n\t\t}\n\t}\n\n\t/** https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions */\n\tfunction escapeRegExp(string)\n\t{\n\t\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n\t}\n\n\t/** The core parser implements speedy and correct CSV parsing */\n\tfunction Parser(config)\n\t{\n\t\t// Unpack the config object\n\t\tconfig = config || {};\n\t\tvar delim = config.delimiter;\n\t\tvar newline = config.newline;\n\t\tvar comments = config.comments;\n\t\tvar step = config.step;\n\t\tvar preview = config.preview;\n\t\tvar fastMode = config.fastMode;\n\t\tvar quoteChar;\n\t\t/** Allows for no quoteChar by setting quoteChar to undefined in config */\n\t\tif (config.quoteChar === undefined) {\n\t\t\tquoteChar = '\"';\n\t\t} else {\n\t\t\tquoteChar = config.quoteChar;\n\t\t}\n\t\tvar escapeChar = quoteChar;\n\t\tif (config.escapeChar !== undefined) {\n\t\t\tescapeChar = config.escapeChar;\n\t\t}\n\n\t\t// Delimiter must be valid\n\t\tif (typeof delim !== 'string'\n\t\t\t|| Papa.BAD_DELIMITERS.indexOf(delim) > -1)\n\t\t\tdelim = ',';\n\n\t\t// Comment character must be valid\n\t\tif (comments === delim)\n\t\t\tthrow 'Comment character same as delimiter';\n\t\telse if (comments === true)\n\t\t\tcomments = '#';\n\t\telse if (typeof comments !== 'string'\n\t\t\t|| Papa.BAD_DELIMITERS.indexOf(comments) > -1)\n\t\t\tcomments = false;\n\n\t\t// Newline must be valid: \\r, \\n, or \\r\\n\n\t\tif (newline !== '\\n' && newline !== '\\r' && newline !== '\\r\\n')\n\t\t\tnewline = '\\n';\n\n\t\t// We're gonna need these at the Parser scope\n\t\tvar cursor = 0;\n\t\tvar aborted = false;\n\n\t\tthis.parse = function(input, baseIndex, ignoreLastRow)\n\t\t{\n\t\t\t// For some reason, in Chrome, this speeds things up (!?)\n\t\t\tif (typeof input !== 'string')\n\t\t\t\tthrow 'Input must be a string';\n\n\t\t\t// We don't need to compute some of these every time parse() is called,\n\t\t\t// but having them in a more local scope seems to perform better\n\t\t\tvar inputLen = input.length,\n\t\t\t\tdelimLen = delim.length,\n\t\t\t\tnewlineLen = newline.length,\n\t\t\t\tcommentsLen = comments.length;\n\t\t\tvar stepIsFunction = isFunction(step);\n\n\t\t\t// Establish starting state\n\t\t\tcursor = 0;\n\t\t\tvar data = [], errors = [], row = [], lastCursor = 0;\n\n\t\t\tif (!input)\n\t\t\t\treturn returnable();\n\n\t\t\tif (fastMode || (fastMode !== false && input.indexOf(quoteChar) === -1))\n\t\t\t{\n\t\t\t\tvar rows = input.split(newline);\n\t\t\t\tfor (var i = 0; i < rows.length; i++)\n\t\t\t\t{\n\t\t\t\t\trow = rows[i];\n\t\t\t\t\tcursor += row.length;\n\t\t\t\t\tif (i !== rows.length - 1)\n\t\t\t\t\t\tcursor += newline.length;\n\t\t\t\t\telse if (ignoreLastRow)\n\t\t\t\t\t\treturn returnable();\n\t\t\t\t\tif (comments && row.substr(0, commentsLen) === comments)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tif (stepIsFunction)\n\t\t\t\t\t{\n\t\t\t\t\t\tdata = [];\n\t\t\t\t\t\tpushRow(row.split(delim));\n\t\t\t\t\t\tdoStep();\n\t\t\t\t\t\tif (aborted)\n\t\t\t\t\t\t\treturn returnable();\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tpushRow(row.split(delim));\n\t\t\t\t\tif (preview && i >= preview)\n\t\t\t\t\t{\n\t\t\t\t\t\tdata = data.slice(0, preview);\n\t\t\t\t\t\treturn returnable(true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn returnable();\n\t\t\t}\n\n\t\t\tvar nextDelim = input.indexOf(delim, cursor);\n\t\t\tvar nextNewline = input.indexOf(newline, cursor);\n\t\t\tvar quoteCharRegex = new RegExp(escapeChar.replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&') + quoteChar, 'g');\n\t\t\tvar quoteSearch;\n\n\t\t\t// Parser loop\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\t// Field has opening quote\n\t\t\t\tif (input[cursor] === quoteChar)\n\t\t\t\t{\n\t\t\t\t\t// Start our search for the closing quote where the cursor is\n\t\t\t\t\tquoteSearch = cursor;\n\n\t\t\t\t\t// Skip the opening quote\n\t\t\t\t\tcursor++;\n\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Find closing quote\n\t\t\t\t\t\tquoteSearch = input.indexOf(quoteChar, quoteSearch + 1);\n\n\t\t\t\t\t\t//No other quotes are found - no other delimiters\n\t\t\t\t\t\tif (quoteSearch === -1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (!ignoreLastRow) {\n\t\t\t\t\t\t\t\t// No closing quote... what a pity\n\t\t\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\t\t\ttype: 'Quotes',\n\t\t\t\t\t\t\t\t\tcode: 'MissingQuotes',\n\t\t\t\t\t\t\t\t\tmessage: 'Quoted field unterminated',\n\t\t\t\t\t\t\t\t\trow: data.length,\t// row has yet to be inserted\n\t\t\t\t\t\t\t\t\tindex: cursor\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn finish();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Closing quote at EOF\n\t\t\t\t\t\tif (quoteSearch === inputLen - 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar value = input.substring(cursor, quoteSearch).replace(quoteCharRegex, quoteChar);\n\t\t\t\t\t\t\treturn finish(value);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If this quote is escaped, it's part of the data; skip it\n\t\t\t\t\t\t// If the quote character is the escape character, then check if the next character is the escape character\n\t\t\t\t\t\tif (quoteChar === escapeChar &&  input[quoteSearch + 1] === escapeChar)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tquoteSearch++;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If the quote character is not the escape character, then check if the previous character was the escape character\n\t\t\t\t\t\tif (quoteChar !== escapeChar && quoteSearch !== 0 && input[quoteSearch - 1] === escapeChar)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check up to nextDelim or nextNewline, whichever is closest\n\t\t\t\t\t\tvar checkUpTo = nextNewline === -1 ? nextDelim : Math.min(nextDelim, nextNewline);\n\t\t\t\t\t\tvar spacesBetweenQuoteAndDelimiter = extraSpaces(checkUpTo);\n\n\t\t\t\t\t\t// Closing quote followed by delimiter or 'unnecessary spaces + delimiter'\n\t\t\t\t\t\tif (input[quoteSearch + 1 + spacesBetweenQuoteAndDelimiter] === delim)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trow.push(input.substring(cursor, quoteSearch).replace(quoteCharRegex, quoteChar));\n\t\t\t\t\t\t\tcursor = quoteSearch + 1 + spacesBetweenQuoteAndDelimiter + delimLen;\n\t\t\t\t\t\t\tnextDelim = input.indexOf(delim, cursor);\n\t\t\t\t\t\t\tnextNewline = input.indexOf(newline, cursor);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar spacesBetweenQuoteAndNewLine = extraSpaces(nextNewline);\n\n\t\t\t\t\t\t// Closing quote followed by newline or 'unnecessary spaces + newLine'\n\t\t\t\t\t\tif (input.substr(quoteSearch + 1 + spacesBetweenQuoteAndNewLine, newlineLen) === newline)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trow.push(input.substring(cursor, quoteSearch).replace(quoteCharRegex, quoteChar));\n\t\t\t\t\t\t\tsaveRow(quoteSearch + 1 + spacesBetweenQuoteAndNewLine + newlineLen);\n\t\t\t\t\t\t\tnextDelim = input.indexOf(delim, cursor);\t// because we may have skipped the nextDelim in the quoted field\n\n\t\t\t\t\t\t\tif (stepIsFunction)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdoStep();\n\t\t\t\t\t\t\t\tif (aborted)\n\t\t\t\t\t\t\t\t\treturn returnable();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (preview && data.length >= preview)\n\t\t\t\t\t\t\t\treturn returnable(true);\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t// Checks for valid closing quotes are complete (escaped quotes or quote followed by EOF/delimiter/newline) -- assume these quotes are part of an invalid text string\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\ttype: 'Quotes',\n\t\t\t\t\t\t\tcode: 'InvalidQuotes',\n\t\t\t\t\t\t\tmessage: 'Trailing quote on quoted field is malformed',\n\t\t\t\t\t\t\trow: data.length,\t// row has yet to be inserted\n\t\t\t\t\t\t\tindex: cursor\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tquoteSearch++;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Comment found at start of new line\n\t\t\t\tif (comments && row.length === 0 && input.substr(cursor, commentsLen) === comments)\n\t\t\t\t{\n\t\t\t\t\tif (nextNewline === -1)\t// Comment ends at EOF\n\t\t\t\t\t\treturn returnable();\n\t\t\t\t\tcursor = nextNewline + newlineLen;\n\t\t\t\t\tnextNewline = input.indexOf(newline, cursor);\n\t\t\t\t\tnextDelim = input.indexOf(delim, cursor);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Next delimiter comes before next newline, so we've reached end of field\n\t\t\t\tif (nextDelim !== -1 && (nextDelim < nextNewline || nextNewline === -1))\n\t\t\t\t{\n\t\t\t\t\trow.push(input.substring(cursor, nextDelim));\n\t\t\t\t\tcursor = nextDelim + delimLen;\n\t\t\t\t\tnextDelim = input.indexOf(delim, cursor);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// End of row\n\t\t\t\tif (nextNewline !== -1)\n\t\t\t\t{\n\t\t\t\t\trow.push(input.substring(cursor, nextNewline));\n\t\t\t\t\tsaveRow(nextNewline + newlineLen);\n\n\t\t\t\t\tif (stepIsFunction)\n\t\t\t\t\t{\n\t\t\t\t\t\tdoStep();\n\t\t\t\t\t\tif (aborted)\n\t\t\t\t\t\t\treturn returnable();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (preview && data.length >= preview)\n\t\t\t\t\t\treturn returnable(true);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\n\t\t\treturn finish();\n\n\n\t\t\tfunction pushRow(row)\n\t\t\t{\n\t\t\t\tdata.push(row);\n\t\t\t\tlastCursor = cursor;\n\t\t\t}\n\n\t\t\t/**\n             * checks if there are extra spaces after closing quote and given index without any text\n             * if Yes, returns the number of spaces\n             */\n\t\t\tfunction extraSpaces(index) {\n\t\t\t\tvar spaceLength = 0;\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\tvar textBetweenClosingQuoteAndIndex = input.substring(quoteSearch + 1, index);\n\t\t\t\t\tif (textBetweenClosingQuoteAndIndex && textBetweenClosingQuoteAndIndex.trim() === '') {\n\t\t\t\t\t\tspaceLength = textBetweenClosingQuoteAndIndex.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn spaceLength;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Appends the remaining input from cursor to the end into\n\t\t\t * row, saves the row, calls step, and returns the results.\n\t\t\t */\n\t\t\tfunction finish(value)\n\t\t\t{\n\t\t\t\tif (ignoreLastRow)\n\t\t\t\t\treturn returnable();\n\t\t\t\tif (typeof value === 'undefined')\n\t\t\t\t\tvalue = input.substr(cursor);\n\t\t\t\trow.push(value);\n\t\t\t\tcursor = inputLen;\t// important in case parsing is paused\n\t\t\t\tpushRow(row);\n\t\t\t\tif (stepIsFunction)\n\t\t\t\t\tdoStep();\n\t\t\t\treturn returnable();\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Appends the current row to the results. It sets the cursor\n\t\t\t * to newCursor and finds the nextNewline. The caller should\n\t\t\t * take care to execute user's step function and check for\n\t\t\t * preview and end parsing if necessary.\n\t\t\t */\n\t\t\tfunction saveRow(newCursor)\n\t\t\t{\n\t\t\t\tcursor = newCursor;\n\t\t\t\tpushRow(row);\n\t\t\t\trow = [];\n\t\t\t\tnextNewline = input.indexOf(newline, cursor);\n\t\t\t}\n\n\t\t\t/** Returns an object with the results, errors, and meta. */\n\t\t\tfunction returnable(stopped)\n\t\t\t{\n\t\t\t\treturn {\n\t\t\t\t\tdata: data,\n\t\t\t\t\terrors: errors,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tdelimiter: delim,\n\t\t\t\t\t\tlinebreak: newline,\n\t\t\t\t\t\taborted: aborted,\n\t\t\t\t\t\ttruncated: !!stopped,\n\t\t\t\t\t\tcursor: lastCursor + (baseIndex || 0)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/** Executes the user's step function and resets data & errors. */\n\t\t\tfunction doStep()\n\t\t\t{\n\t\t\t\tstep(returnable());\n\t\t\t\tdata = [];\n\t\t\t\terrors = [];\n\t\t\t}\n\t\t};\n\n\t\t/** Sets the abort flag */\n\t\tthis.abort = function()\n\t\t{\n\t\t\taborted = true;\n\t\t};\n\n\t\t/** Gets the cursor position */\n\t\tthis.getCharIndex = function()\n\t\t{\n\t\t\treturn cursor;\n\t\t};\n\t}\n\n\n\t// If you need to load Papa Parse asynchronously and you also need worker threads, hard-code\n\t// the script path here. See: https://github.com/mholt/PapaParse/issues/87#issuecomment-57885358\n\tfunction getScriptPath()\n\t{\n\t\tvar scripts = document.getElementsByTagName('script');\n\t\treturn scripts.length ? scripts[scripts.length - 1].src : '';\n\t}\n\n\tfunction newWorker()\n\t{\n\t\tif (!Papa.WORKERS_SUPPORTED)\n\t\t\treturn false;\n\t\tif (!LOADED_SYNC && Papa.SCRIPT_PATH === null)\n\t\t\tthrow new Error(\n\t\t\t\t'Script path cannot be determined automatically when Papa Parse is loaded asynchronously. ' +\n\t\t\t\t'You need to set Papa.SCRIPT_PATH manually.'\n\t\t\t);\n\t\tvar workerUrl = Papa.SCRIPT_PATH || AUTO_SCRIPT_PATH;\n\t\t// Append 'papaworker' to the search string to tell papaparse that this is our worker.\n\t\tworkerUrl += (workerUrl.indexOf('?') !== -1 ? '&' : '?') + 'papaworker';\n\t\tvar w = new global.Worker(workerUrl);\n\t\tw.onmessage = mainThreadReceivedMessage;\n\t\tw.id = workerIdCounter++;\n\t\tworkers[w.id] = w;\n\t\treturn w;\n\t}\n\n\t/** Callback when main thread receives a message */\n\tfunction mainThreadReceivedMessage(e)\n\t{\n\t\tvar msg = e.data;\n\t\tvar worker = workers[msg.workerId];\n\t\tvar aborted = false;\n\n\t\tif (msg.error)\n\t\t\tworker.userError(msg.error, msg.file);\n\t\telse if (msg.results && msg.results.data)\n\t\t{\n\t\t\tvar abort = function() {\n\t\t\t\taborted = true;\n\t\t\t\tcompleteWorker(msg.workerId, { data: [], errors: [], meta: { aborted: true } });\n\t\t\t};\n\n\t\t\tvar handle = {\n\t\t\t\tabort: abort,\n\t\t\t\tpause: notImplemented,\n\t\t\t\tresume: notImplemented\n\t\t\t};\n\n\t\t\tif (isFunction(worker.userStep))\n\t\t\t{\n\t\t\t\tfor (var i = 0; i < msg.results.data.length; i++)\n\t\t\t\t{\n\t\t\t\t\tworker.userStep({\n\t\t\t\t\t\tdata: [msg.results.data[i]],\n\t\t\t\t\t\terrors: msg.results.errors,\n\t\t\t\t\t\tmeta: msg.results.meta\n\t\t\t\t\t}, handle);\n\t\t\t\t\tif (aborted)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdelete msg.results;\t// free memory ASAP\n\t\t\t}\n\t\t\telse if (isFunction(worker.userChunk))\n\t\t\t{\n\t\t\t\tworker.userChunk(msg.results, handle, msg.file);\n\t\t\t\tdelete msg.results;\n\t\t\t}\n\t\t}\n\n\t\tif (msg.finished && !aborted)\n\t\t\tcompleteWorker(msg.workerId, msg.results);\n\t}\n\n\tfunction completeWorker(workerId, results) {\n\t\tvar worker = workers[workerId];\n\t\tif (isFunction(worker.userComplete))\n\t\t\tworker.userComplete(results);\n\t\tworker.terminate();\n\t\tdelete workers[workerId];\n\t}\n\n\tfunction notImplemented() {\n\t\tthrow 'Not implemented.';\n\t}\n\n\t/** Callback when worker thread receives a message */\n\tfunction workerThreadReceivedMessage(e)\n\t{\n\t\tvar msg = e.data;\n\n\t\tif (typeof Papa.WORKER_ID === 'undefined' && msg)\n\t\t\tPapa.WORKER_ID = msg.workerId;\n\n\t\tif (typeof msg.input === 'string')\n\t\t{\n\t\t\tglobal.postMessage({\n\t\t\t\tworkerId: Papa.WORKER_ID,\n\t\t\t\tresults: Papa.parse(msg.input, msg.config),\n\t\t\t\tfinished: true\n\t\t\t});\n\t\t}\n\t\telse if ((global.File && msg.input instanceof File) || msg.input instanceof Object)\t// thank you, Safari (see issue #106)\n\t\t{\n\t\t\tvar results = Papa.parse(msg.input, msg.config);\n\t\t\tif (results)\n\t\t\t\tglobal.postMessage({\n\t\t\t\t\tworkerId: Papa.WORKER_ID,\n\t\t\t\t\tresults: results,\n\t\t\t\t\tfinished: true\n\t\t\t\t});\n\t\t}\n\t}\n\n\t/** Makes a deep copy of an array or object (mostly) */\n\tfunction copy(obj)\n\t{\n\t\tif (typeof obj !== 'object' || obj === null)\n\t\t\treturn obj;\n\t\tvar cpy = obj instanceof Array ? [] : {};\n\t\tfor (var key in obj)\n\t\t\tcpy[key] = copy(obj[key]);\n\t\treturn cpy;\n\t}\n\n\tfunction bindFunction(f, self)\n\t{\n\t\treturn function() { f.apply(self, arguments); };\n\t}\n\n\tfunction isFunction(func)\n\t{\n\t\treturn typeof func === 'function';\n\t}\n\n\treturn Papa;\n}));\n","\"use strict\";\n\nmodule.exports = exports = self.fetch;\n\n// Needed for TypeScript and Webpack.\nexports.default = self.fetch.bind(self);\n\nexports.Headers = self.Headers;\nexports.Request = self.Request;\nexports.Response = self.Response;\n","const NetCDFReader = require('netcdfjs');\r\nconst merge = require('deepmerge').default || require('deepmerge');\r\nconst chrono = require('chrono-node');\r\nconst moment = require(\"moment\");\r\nconst Papa = require('papaparse');\r\nconst TIME_CLOSEST_PLACEHOLDER = \"TIME_CLOSEST_PLACEHOLDER\";\r\nconst fetch = require('node-fetch');\r\n\r\nif (!Date.prototype.toISOString2) {\r\n  (function() {\r\n\r\n    function pad(number) {\r\n      if (number < 10) {\r\n        return '0' + number;\r\n      }\r\n      return number;\r\n    }\r\n\r\n    Date.prototype.toISOString2 = function() {\r\n      return this.getUTCFullYear() +\r\n        '-' + pad(this.getUTCMonth() + 1) +\r\n        '-' + pad(this.getUTCDate()) +\r\n        'T' + pad(this.getUTCHours()) +\r\n        ':' + pad(this.getUTCMinutes()) +\r\n        ':' + pad(this.getUTCSeconds()) +\r\n        'Z';\r\n    };\r\n\r\n  }());\r\n}\r\n\r\nfunction time_encoder(value,istabledap) {\r\n  if(value instanceof Date){\r\n    return istabledap ? value.toISOString2() : (\"(\"+value.toISOString2()+\")\");\r\n  }\r\n  if(value == \"closest\"){\r\n    return TIME_CLOSEST_PLACEHOLDER;\r\n  }\r\n  if(value == \"first\"){\r\n    return 0;\r\n  }\r\n  if(value == \"last\"){\r\n    return value;\r\n  }\r\n  try {\r\n    var m = moment(chrono.parseDate(value));\r\n    if (m.isValid()) {\r\n      m = m.toDate().toISOString2();\r\n      if (m) {\r\n        return istabledap? m : (\"(\"+m+\")\");\r\n      }\r\n    }\r\n    return value;\r\n  } catch (e) {\r\n    console.log(e);\r\n    return value;\r\n  }\r\n}\r\nvar parse_floats = function(parts,err_msg,expected_length){\r\n\tif(parts.length != expected_length){\r\n\t\tthrow(err_msg);\r\n\t}\r\n\tvar results = [];\r\n\ttry{\r\n\t\tfor(var p=0;p<parts.length;p++){\r\n\t\t\tresults.push(parseFloat(parts[p]));\r\n\t\t}\r\n\t}catch(e){\r\n\t\tthrow(err_msg);\r\n\t}\r\n\treturn results;\r\n}\r\nvar parse_point = function(value){\r\n\tvar parts = value.split(/[ ,]+/);\r\n\tvar err_msg = \"Expected point to be a string with point coordinates in a 'lng,lat' format, but got '\"+value+\"'\";\r\n\tparts = parse_floats(parts,err_msg,2);\r\n\treturn { lat: parts[1], lon: parts[0]};\r\n}\r\nvar parse_bbox = function(value){\r\n\tvar parts = value.split(/[ ,]+/);\r\n\tvar err_msg = \"Expected bbox to be a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format, but got '\"+value+\"'\";\r\n\tparts = parse_floats(parts,err_msg,4);\r\n\treturn {\r\n\t\tlat: {\r\n\t\t\tmin: (parts[1]<parts[3]?parts[1]:parts[3]),\r\n\t\t\tmax: (parts[1]<parts[3]?parts[3]:parts[1])\r\n\t\t},\r\n\t\tlon: {\r\n\t\t\tmin: (parts[0]<parts[2]?parts[0]:parts[2]),\r\n\t\t\tmax: (parts[0]<parts[2]?parts[2]:parts[0])\r\n\t\t}\r\n\t}\r\n}\r\nvar griddap_url = function(dataset,args,wanted,extents,extension){\r\n\tvar data_wanted = [];\r\n\tvar dimensions = {};\r\n\twanted.forEach(function(field){\r\n\t\tif(dataset.dimensions[field]){\r\n\t\t\tdata_wanted.push(field);\r\n\t\t\tfor(var j=0;j<dataset.dimensions[field].length; j++){\r\n\t\t\t\tdimensions[dataset.dimensions[field][j]] = dimensions[dataset.dimensions[field][j]] || {min:0,max:\"last\",stride:1};\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\tfor(var arg in args){\r\n\t\tif( (arg == \"since\" || arg == \"until\") && dataset.param_encoder[arg] === time_encoder){\r\n\t\t\tif(!dimensions[dataset.time_dimension]){\r\n\t\t\t\tthrow(\"filtering of time without data not implemented - \"+dataset.time_dimension);\r\n\t\t\t}\r\n\t\t\tvar when = arg == \"since\" ? \"min\":\"max\";\r\n\t\t\tdimensions[dataset.time_dimension][when] = time_encoder(args[arg]);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif(arg == \"bbox\"){ //TODO: what if bbox is in the data.\r\n\t\t\tvar bbox = parse_bbox(args[arg]);\r\n\t\t\tdimensions[dataset.lon_dimension].min = \"(\"+(extents.geospatial_lon_min===undefined?bbox.lon.min:Math.max(extents.geospatial_lon_min,bbox.lon.min))+\")\";\r\n\t\t\tdimensions[dataset.lon_dimension].max = \"(\"+(extents.geospatial_lon_max===undefined?bbox.lon.max:Math.min(extents.geospatial_lon_max,bbox.lon.max))+\")\";\r\n\t\t\tdimensions[dataset.lat_dimension].min = \"(\"+(extents.geospatial_lat_min===undefined?bbox.lat.min:Math.max(extents.geospatial_lat_min,bbox.lat.min))+\")\";\r\n\t\t\tdimensions[dataset.lat_dimension].max = \"(\"+(extents.geospatial_lat_max===undefined?bbox.lat.max:Math.min(extents.geospatial_lat_max,bbox.lat.max))+\")\";\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif(arg == \"point\"){ //TODO: what if bbox is in the data.\r\n\t\t\tvar point = parse_point(args[arg]);\r\n\t\t\tdimensions[dataset.lon_dimension].min = \"(\"+point.lon+\")\";\r\n\t\t\tdimensions[dataset.lon_dimension].max = \"(\"+point.lon+\")\";\r\n\t\t\tdimensions[dataset.lat_dimension].min = \"(\"+point.lat+\")\";\r\n\t\t\tdimensions[dataset.lat_dimension].max = \"(\"+point.lat+\")\";\r\n\t\t\tcontinue;\r\n\t\t}\r\n    if(args[arg] instanceof Date || typeof args[arg] !== 'object'){\r\n      var value = args[arg];\r\n\t\t\tif(value instanceof Date || arg == \"time\"){\r\n\t\t\t\tvalue = time_encoder(value);\r\n\t\t\t}\r\n      if(dimensions[arg]){\r\n        dimensions[arg].min = value;\r\n        dimensions[arg].max = value;\r\n      }else{\r\n        //local_accepts not implemnted\r\n      }\r\n      continue;\r\n    }\r\n\t\tfor(var constraint in args[arg]){\r\n\t\t\tvar value = args[arg][constraint];\r\n\t\t\tif(arg == \"time\"){\r\n\t\t\t\tvalue = time_encoder(value);\r\n\t\t\t}\r\n      var field = arg;\r\n\r\n\t\t\tif(dimensions[field]){\r\n\t\t\t\tswitch(constraint){\r\n\t\t\t\t\tcase 'min':\r\n\t\t\t\t\tcase 'max':\r\n\t\t\t\t\t\tdimensions[field][constraint] = value;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'eq':\r\n\t\t\t\t\t\tdimensions[field].min = value;\r\n\t\t\t\t\t\tdimensions[field].max = value;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'stride':\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tthrow \"constraint '\"+constraint+\"' not recognised for \"+field;\r\n\t\t\t\t}\r\n\t\t\t}else{\r\n\t\t\t\tvar accepts = null;\r\n\t\t\t\tvar constrained_value = value;\r\n\t\t\t\tif(dataset.param_encoder[field]){\r\n\t\t\t\t\tconstrained_value = dataset.param_encoder[field](value);\r\n\t\t\t\t}\r\n\t\t\t\tswitch(constraint){\r\n\t\t\t\t\tcase 'min':\r\n\t\t\t\t\t\taccepts = function(field,value,obj){\r\n\t\t\t\t\t\t\treturn obj[field] >= value;\r\n\t\t\t\t\t\t}.bind(null,arg,constrained_value)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'max':\r\n\t\t\t\t\t\taccepts = function(field,value,obj){\r\n\t\t\t\t\t\t\treturn obj[field] <= value;\r\n\t\t\t\t\t\t}.bind(null,arg,constrained_value)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'eq':\r\n\t\t\t\t\t\taccepts = function(field,value,obj){\r\n\t\t\t\t\t\t\treturn obj[field] == value;\r\n\t\t\t\t\t\t}.bind(null,arg,constrained_value)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tthrow \"constraint '\"+constraint+\"' not recognised\";\r\n\t\t\t\t}\r\n\t\t\t\tlocal_accepts.push(accepts);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tvar erddap_params = [];\r\n\tif(data_wanted.length){\r\n\t\tvar constraints = [];\r\n\t\tfor(var i=0;i<data_wanted.length;i++){\r\n\t\t\tvar constraint = data_wanted[i];\r\n\t\t\tvar param = constraint;\r\n\t\t\tif(i == 0){\r\n\t\t\t\twanted = [];\r\n\t\t\t\tfor(var j=0;j<dataset.dimensions[constraint].length;j++){\r\n\t\t\t\t\twanted.push(dataset.dimensions[constraint][j]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\twanted.push(constraint);\r\n\t\t\tfor(var j=0;j<dataset.dimensions[constraint].length;j++){\r\n\t\t\t\tvar dimension = dimensions[dataset.dimensions[constraint][j]];\r\n\t\t\t\tparam = param + \"[\"+dimension.min+\":\"+dimension.stride+\":\"+dimension.max+\"]\";\r\n\t\t\t}\r\n\t\t\tconstraints.push(param);\r\n\t\t}\r\n\t\terddap_params.push(constraints.join(\",\"));\r\n\t}else{\r\n\t\terddap_params.push(wanted.join(\",\"));\r\n\t}\r\n\t\treturn url = dataset.base_url+\"/griddap/\"+dataset.id+(extension.startsWith('.')?\"\":\".\")+extension+'?'+erddap_params.join(\"&\");\r\n}\r\n\r\n\r\nvar tabledap_url = function(dataset,args,wanted,extents,extension){\r\n\tvar argstr = {\r\n\t\tmin: \">=\",\r\n\t\tmax: \"<=\",\r\n\t\teq: \"=\"\r\n\t}\r\n\tvar first = false;\r\n\tvar last = false;\r\n\r\n\tvar erddap_params = [];\r\n\terddap_params.push(wanted.join(\",\"));\r\n\tfor(var arg in args){\r\n\t\tif( (arg == \"since\" || arg == \"until\") && dataset.param_encoder[arg] === time_encoder){\r\n\t\t\tvar when = arg == \"since\" ? \">=\":\"<=\";\r\n\t\t\tvar component = dataset.time_dimension+when+time_encoder(args[arg],true);\r\n\t\t\terddap_params.push(encodeURIComponent(component));\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif(arg == \"point\"){ //TODO: what if bbox is in the data.\r\n\t\t\tvar point = parse_point(args[arg]);\r\n\t\t\terddap_params.push(dataset.lon_dimension+\"=\"+point.lon);\r\n\t\t\terddap_params.push(dataset.lat_dimension+\"=\"+point.lat);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif(arg == \"bbox\"){ //TODO: what if bbox is in the data.\r\n\t\t\tvar bbox = parse_bbox(args[arg]);\r\n\t\t\terddap_params.push(dataset.lon_dimension+\">=\"+bbox.lon.min);\r\n\t\t\terddap_params.push(dataset.lon_dimension+\"<=\"+bbox.lon.max);\r\n\t\t\terddap_params.push(dataset.lat_dimension+\">=\"+bbox.lat.min);\r\n\t\t\terddap_params.push(dataset.lat_dimension+\"<=\"+bbox.lat.max);\r\n\t\t\tcontinue;\r\n\t\t}\r\n    if(typeof args[arg] !== 'object'){\r\n      var component = arg+\"=\"+dataset.param_encoder[arg](args[arg],true);\r\n      erddap_params.push(encodeURIComponent(component));\r\n      continue;\r\n    }\r\n\t\tfor(var constraint in args[arg]){\r\n      var value = args[arg][constraint];\r\n      if(arg == \"time\"){\r\n        value = time_encoder(value,true);\r\n      }\r\n      var field = arg;\r\n\r\n\t\t\tif(dataset.param_encoder[field]){\r\n\t\t\t\tvar component = field+argstr[constraint]+dataset.param_encoder[field](value,true);\r\n\t\t\t\terddap_params.push(encodeURIComponent(component));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n\treturn dataset.base_url+\"/tabledap/\"+dataset.id+(extension.startsWith('.')?\"\":\".\")+extension+'?'+erddap_params.join(\"&\");\r\n}\r\n\r\nvar Erddap = function(base_url) {\r\n  this.base_url = base_url || 'https://upwell.pfeg.noaa.gov/erddap';\r\n  this._datasets = {};\r\n}\r\n\r\nErddap.prototype.search = function(query){\r\n  var search_url = this.base_url + \"/search/index.csv?searchFor=\"+query;\r\n  return fetch(search_url).then(function(response){\r\n    if(response.ok){\r\n      return response.text();\r\n    }else{\r\n      throw new Error(\"Error fetching \"+search_url);\r\n    }\r\n  }).then(function(csv){\r\n      return Papa.parse(csv,{header: true}).data;\r\n  }.bind(this));\r\n}\r\n\r\nvar Dataset = function(erddap, dataset_id) {\r\n  this.erddap = erddap;\r\n  this.dataset_id = dataset_id;\r\n  this._dimensions = {};\r\n  this._summary = undefined;\r\n  this._fetchMetadata =   this.erddap.search(\"datasetID=\" + this.dataset_id).then(function(data){\r\n      for(var i=0;i<data.length;i++){\r\n        if(data[i][\"Dataset ID\"] == this.dataset_id){\r\n          return data[i];\r\n        }\r\n      }\r\n      throw new Error(\"Unknown dataset: [\"+dataset_id+\"]\");\r\n    }.bind(this)).then(function(summary){\r\n      this._summary = summary;\r\n      var url = this.erddap.base_url + \"/info/\" + this.dataset_id + \"/index.json\";\r\n      return fetch(url).then(function(response) {\r\n    if(response.ok){\r\n      return response.json();\r\n    }else{\r\n      throw new Error(\"Error fetching \"+url);\r\n    }\r\n  }).then(function(response) {\r\n    var obj = {};\r\n    for (var i = 0; i < response.table.rows.length; i++) {\r\n      var row = response.table.rows[i];\r\n      obj[row[0]] = obj[row[0]] || {};\r\n      obj[row[0]][row[1]] = obj[row[0]][row[1]] || {};\r\n      obj[row[0]][row[1]][row[2]] = obj[row[0]][row[1]][row[2]] || {};\r\n      obj[row[0]][row[1]][row[2]].type = row[3];\r\n      obj[row[0]][row[1]][row[2]].value = row[4];\r\n    };\r\n    return (obj);\r\n  }).then(function(info) {\r\n    var param_encoder = {};\r\n    var dataset = {\r\n      _fieldnames: []\r\n    };\r\n    var wanted = [\"dimension\", \"variable\"];\r\n    for (var x = 0; x < wanted.length; x++) {\r\n      var dimvar = wanted[x];\r\n      if (!info[dimvar]) {\r\n        continue;\r\n      }\r\n\r\n      if (dimvar == \"dimension\") {\r\n        dataset.dimensions = {};\r\n      }\r\n\r\n      for (var key in info[dimvar]) {\r\n        dataset._fieldnames.push(key);\r\n        var etype = info[dimvar][key][\"\"][\"type\"];\r\n        var evalue = \"\" + info[dimvar][key][\"\"][\"value\"];\r\n        var gtype = null;\r\n        var atype = null\r\n        switch (etype) {\r\n          case 'float':\r\n          case 'double':\r\n            param_encoder[key] = function(v) {\r\n              return isNaN(v) ? null : v\r\n            };\r\n            break;\r\n          case 'int':\r\n          case 'long':\r\n          case 'short':\r\n          case 'byte':\r\n            param_encoder[key] = function(v) {\r\n              return isNaN(v) ? null : v\r\n            };\r\n            break;\r\n          case 'String':\r\n            param_encoder[key] = function(v) {\r\n              return '\"' + v + '\"'\r\n            };\r\n            break;\r\n          default:\r\n            throw 'Unknown type [' + etype + '] for ' + dataset.id + '.' + key;\r\n        }\r\n\r\n        var isTimeField = false;\r\n        if (info.attribute[key] && info.attribute[key][\"_CoordinateAxisType\"]) {\r\n          var axisType = info.attribute[key][\"_CoordinateAxisType\"].value;\r\n          switch (axisType) {\r\n            case \"Time\":\r\n              dataset.time_dimension = key;\r\n              param_encoder[key] = time_encoder;\r\n              param_encoder['since'] = time_encoder;\r\n              param_encoder['until'] = time_encoder;\r\n              break;\r\n            case \"Lat\":\r\n              dataset.lat_dimension = key;\r\n              break;\r\n            case \"Lon\":\r\n              dataset.lon_dimension = key;\r\n              break;\r\n          }\r\n        }\r\n\r\n        if (dimvar != \"dimension\" && info.dimension && evalue) {\r\n          dataset.dimensions[key] = evalue.split(/[ ,]+/);\r\n        }\r\n/*\r\n        if (info.attribute[key]) {\r\n          if (info.attribute[key][\"ioos_category\"] && info.attribute[key][\"ioos_category\"].value == \"Time\") {\r\n            dataset.time_dimension = key;\r\n            param_encoder[key] = time_encoder;\r\n          }\r\n        }\r\n        */\r\n\r\n      }\r\n\r\n    }\r\n    dataset.param_encoder = param_encoder;\r\n    dataset.base_url = this.erddap.base_url;\r\n    dataset.id = this.dataset_id;\r\n    dataset.info = info;\r\n    this._meta = dataset;\r\n    return dataset;\r\n  }.bind(this));\r\n  }.bind(this));\r\n}\r\n\r\nDataset.prototype.fetchMetadata = function() {\r\n  return this._fetchMetadata;\r\n}\r\nDataset.prototype.fetchExtents = function(){\r\n  this._fetchExtents = this._fetchExtents || this._fetchMetadata.then(function(metadata){\r\n\t\tvar extents = {\r\n    \"time_coverage_start\": undefined,\r\n    \"time_coverage_end\": undefined,\r\n    \"geospatial_lat_min\": undefined,\r\n    \"geospatial_lon_min\": undefined,\r\n    \"geospatial_lat_max\": undefined,\r\n    \"geospatial_lon_max\": undefined\r\n    }\r\n\t\tObject.keys(extents).forEach(key => {\r\n\t\t\tif(metadata.info.attribute.NC_GLOBAL[key]){\r\n\t\t\t\textents[key] = metadata.info.attribute.NC_GLOBAL[key].value;\r\n\t\t\t}\r\n\t\t});\r\n    return extents;\r\n  }.bind(this));\r\n  return this._fetchExtents;\r\n}\r\nDataset.prototype.generateUrl = function(extension){\r\n  return new DatasetDelegate(this).generateUrl(extension);\r\n}\r\nDataset.prototype._generateUrl = function(constraints, variables, extension) {\r\n  return this.fetchExtents().then(function(constraints, variables, extension,extents){\r\n    // only done for griddap so far..\r\n    var urlfn = this._summary.tabledap? tabledap_url : griddap_url;\r\n    var url = urlfn(this._meta,constraints,variables?variables:this._meta._fieldnames.slice(0), extents ,extension);\r\n    if(url.indexOf(TIME_CLOSEST_PLACEHOLDER)>=0){\r\n      return this._resolve_griddap_time_closest(this._meta,url);\r\n    }\r\n    return url;\r\n  }.bind(this,constraints,variables,extension));\r\n}\r\nDataset.prototype.fetchLocationDimensions = function(useCached){\r\n  useCached = useCached === undefined? true : useCached;\r\n  if(useCached && this._locationDimensions){\r\n    return this._locationDimensions;\r\n  }\r\n  this._locationDimensions = this.fetchMetadata().then(function(dataset){\r\n    var url = dataset.base_url+\"/griddap/\"+dataset.id+\".nc?\"+dataset.lat_dimension+\",\"+dataset.lon_dimension;\r\n    return fetch(url).then(function(response) {\r\n    if(response.ok){\r\n      return response.arrayBuffer();\r\n    }else{\r\n      throw new Error(\"Error fetching \"+url);\r\n    }\r\n  }).then(function(buffer) {\r\n    var reader = new NetCDFReader(buffer);\r\n    return {\r\n      lats: reader.getDataVariable(reader.variables[0].name),\r\n      lons: reader.getDataVariable(reader.variables[1].name)\r\n    }\r\n  });\r\n}.bind(this));\r\n  return this._locationDimensions;\r\n}\r\nDataset.prototype.fetchTimeDimension = function(useCached){\r\n  useCached = useCached === undefined? true : useCached;\r\n  if(useCached && this._timeDimension){\r\n    return this._timeDimension;\r\n  }\r\n  this._timeDimension = this.fetchMetadata().then(function(dataset){\r\n    var time_url = dataset.base_url+\"/griddap/\"+dataset.id+\".csv0?\"+dataset.time_dimension;\r\n    return fetch(time_url).then(function(response) {\r\n      if(response.ok){\r\n        return response.text();\r\n      }else{\r\n        throw new Error(\"Error fetching \"+time_url);\r\n      }\r\n    }).then(function(text) {\r\n      var times = text.split(\"\\n\");\r\n      return times.filter(function(t){return t && t.length > 0});\r\n    });\r\n  }.bind(this));\r\n  return this._timeDimension;\r\n}\r\nDataset.prototype._resolve_griddap_time_closest = function(dataset,url){\r\n  return this.fetchTimeDimension(dataset,true).then(function(times) {\r\n    var now = new Date().toISOString2();\r\n    var closest = 0;\r\n    times.forEach(function(time){\r\n      if(time<now){\r\n        closest = time;\r\n      }\r\n    });\r\n    if(closest){\r\n      closest = \"(\"+closest+\")\";\r\n    }else{\r\n      closest = \"0\";\r\n    }\r\n    var re = new RegExp(TIME_CLOSEST_PLACEHOLDER,\"g\");\r\n    return url.replace(re,closest);\r\n  });\r\n}\r\nDataset.prototype.fetchJSON = function(){\r\n  return new DatasetDelegate(this).fetchJSON();\r\n}\r\nDataset.prototype.constrain = function(constraints) {\r\n  return new DatasetDelegate(this).constrain(constraints);\r\n}\r\nDataset.prototype.variables = function(variables) {\r\n  return new DatasetDelegate(this).variables(variables);\r\n}\r\n\r\nvar DatasetDelegate = function(dataset) {\r\n  this.erddap = dataset.erddap;\r\n  this.dataset_id = dataset.dataset_id;\r\n  this._designate = dataset._designate ? dataset._designate : dataset;\r\n  this._constraints = dataset._constraints ? JSON.parse(JSON.stringify(dataset._constraints)) : {};\r\n  this._variables = dataset._variables;\r\n}\r\n\r\nDatasetDelegate.prototype.fetchMetadata = function() {\r\n  return this._designate.fetchMetadata();\r\n}\r\nDatasetDelegate.prototype.fetchTimeDimension = function(useCached){\r\n  return this._designate.fetchTimeDimension(useCached);\r\n}\r\nDatasetDelegate.prototype.fetchLocationDimensions = function(useCached){\r\n  return this._designate.fetchLocationDimensions(useCached);\r\n}\r\nDatasetDelegate.prototype._constrain = function(constraints) {\r\n  this._constraints = merge(this._constraints, constraints);\r\n  return this;\r\n}\r\nDatasetDelegate.prototype.constrain = function(constraints) {\r\n  return new DatasetDelegate(this)._constrain(constraints);\r\n}\r\nDatasetDelegate.prototype.variables = function() {\r\n  var variables = Array.prototype.slice.call(arguments);\r\n  if(variables.length == 1){\r\n    if(variables[0].constructor === Array){\r\n      variables = variables[0];\r\n    }else if (typeof variables[0] === 'string' || variables[0] instanceof String){\r\n      variables = variables[0].split(/[ ,]+/)\r\n    }\r\n  }\r\n  this._variables = variables;\r\n  return this;\r\n}\r\nDatasetDelegate.prototype.fetchJSON = function(){\r\n  if(arguments && arguments.length){\r\n    this.variables.apply(this,arguments);\r\n  }\r\n  var delegate = this;\r\n  return this.generateUrl(\".jsonlCSV\").then(function(url){\r\n    return fetch(url)\r\n    .then(function(response) {\r\n      return response.text();\r\n    })\r\n    .then(function(text){\r\n     var lines = text.split(\"\\n\");\r\n     var data = [];\r\n     var vars = delegate._variables || delegate._designate._meta._fieldnames.slice(0);\r\n     lines.forEach(function(line){\r\n        if(!line.trim().length) return;\r\n        var a = JSON.parse(line);\r\n        var o = {};\r\n        for(var i=0;i<vars.length;i++){\r\n          o[vars[i]] = a[i];\r\n        }\r\n        data.push(o);\r\n     });\r\n     return data;\r\n   });\r\n });\r\n}\r\n\r\nDatasetDelegate.prototype.generateUrl = function(extension){\r\n  extension = extension || '.htmlTable';\r\n  return this._designate._generateUrl(this._constraints,this._variables,extension);\r\n}\r\n\r\nDatasetDelegate.prototype.vectors = function(ux, uy) {\r\n  return new Vectors(this.variables(ux,uy), ux, uy);\r\n}\r\n\r\nvar Vectors = function(grid, ux, uy, default_time) {\r\n  this.grid = grid;\r\n  this.ux = ux;\r\n  this.uy = uy;\r\n  this.default_time = default_time;\r\n}\r\n\r\nDataset.prototype.vectors = function(ux, uy) {\r\n  return new DatasetDelegate(this).vectors(ux, uy);\r\n}\r\n\r\nVectors.prototype.generateUrl = function(){\r\n  this.grid._constraints.time = this.grid._constraints.time || \"closest\";\r\n  return this.grid.generateUrl(\"nc\");\r\n}\r\n/*\r\n * Returns a promise of fetching the data in the\r\n * form of an object { time:[time]. lat:[lat],lon:[lon], xvel:[u],yvel:[v] }\r\n * params are all optional\r\n * time: {min:, max:, stride:1}, lat: {min:, max:,stride:1}, lon: {min:, max:,stride:1}\r\n */\r\nVectors.prototype.fetch = function(params) {\r\n  return this.generateUrl().then(function(url) {\r\n    var ux = this.ux;\r\n    var uy = this.uy;\r\n    var nullx = this.grid._designate._meta.info.attribute[ux].missing_value.value\r\n    var nully = this.grid._designate._meta.info.attribute[uy].missing_value.value\r\n    return fetch(url).then(function(response) {\r\n      if(response.ok){\r\n        return response.arrayBuffer();\r\n      }else{\r\n        throw new Error(\"Error fetching \"+url);\r\n      }\r\n    }).then(function(buffer) {\r\n      var reader = new NetCDFReader(buffer);\r\n      var vars = Array();\r\n      for (var i = 0; i < reader.variables.length; i++) {\r\n        vars.push(reader.getDataVariable(reader.variables[i].name));\r\n      }\r\n      for (var i = 0; i < vars[3].length; i++) {\r\n        if (vars[3][i] == nullx) {\r\n          vars[3][i] = null;\r\n        }\r\n      }\r\n      for (var i = 0; i < vars[4].length; i++) {\r\n        if (vars[4][i] == nully) {\r\n          vars[4][i] = null;\r\n        }\r\n      }\r\n      return {\r\n        time: vars[0],\r\n        lat: vars[1],\r\n        lon: vars[2],\r\n        xvel: vars[3],\r\n        yvel: vars[4]\r\n      };\r\n    });\r\n  }.bind(this));\r\n}\r\n\r\nVectors.prototype.fetchGrib2 = function(params) {\r\n  return this.fetch(params).then(function(data) {\r\n    var atime = data.time,\r\n      alat = data.lat,\r\n      alon = data.lon,\r\n      xvel = data.xvel,\r\n      yvel = data.yvel;\r\n    var results = Array();\r\n    var stride = alat.length * alon.length;\r\n    for (var itime = 0; itime < atime.length; itime++) {\r\n      var time = atime[itime];\r\n      var date = new Date();\r\n      date.setTime(time * 1000);\r\n      var u = {\r\n        header: {\r\n          \"parameterCategory\": 2,\r\n          \"parameterNumber\": 2,\r\n          \"forecastTime\": 0,\r\n          \"refTime\": date.toISOString2(),\r\n          \"nx\": alon.length,\r\n          \"ny\": alat.length,\r\n          \"la2\": alat[0],\r\n          \"lo1\": alon[0],\r\n          \"la1\": alat[alat.length - 1],\r\n          \"lo2\": alon[alon.length - 1],\r\n        },\r\n        \"data\": Array(),\r\n      };\r\n      var v = {\r\n        \"header\": {\r\n          \"parameterCategory\": 2,\r\n          \"parameterNumber\": 3,\r\n          \"forecastTime\": 0,\r\n          \"refTime\": date.toISOString2(),\r\n          \"nx\": alon.length,\r\n          \"ny\": alat.length,\r\n          \"la2\": alat[0],\r\n          \"lo1\": alon[0],\r\n          \"la1\": alat[alat.length - 1],\r\n          \"lo2\": alon[alon.length - 1],\r\n        },\r\n        \"data\": Array()\r\n      };\r\n      for (var ilat = 0; ilat < alat.length; ilat++) {\r\n        var slice = itime * (alat.length * alon.length) + ilat * alon.length;\r\n        v.data.unshift(yvel.slice(slice, slice + alon.length));\r\n        u.data.unshift(xvel.slice(slice, slice + alon.length));\r\n      }\r\n      v.data = flatten(v.data);\r\n      u.data = flatten(u.data);\r\n      results.push(u);\r\n      results.push(v);\r\n    }\r\n    for (var i = 0; i < results.length; i++) {\r\n      var header = results[i].header;\r\n      header.dx = Math.abs((header.lo1 - header.lo2) / (header.nx - 1));\r\n      header.dy = Math.abs((header.la1 - header.la2) / (header.ny - 1));\r\n    }\r\n    return results;\r\n  });\r\n}\r\n\r\nErddap.prototype.dataset = function(dataset_id) {\r\n  this._datasets[dataset_id] = this._datasets[dataset_id] || new Dataset(this, dataset_id);\r\n  return this._datasets[dataset_id];\r\n}\r\n\r\nfunction flatten(a) {\r\n  return [].concat.apply([], a);\r\n}\r\n\r\nmodule.exports = Erddap;\r\n"]}