chrono-node 1.3.2 → 1.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -67
- package/bower.json +1 -1
- package/chrono.js +1340 -1003
- package/chrono.map.json +1 -1
- package/chrono.min.js +108 -106
- package/package.json +11 -15
- package/src/chrono.js +2 -3
- package/src/options.js +3 -2
- package/src/parsers/{DE → de}/DECasualDateParser.js +0 -0
- package/src/parsers/{DE → de}/DEDeadlineFormatParser.js +0 -0
- package/src/parsers/{DE → de}/DEMonthNameLittleEndianParser.js +0 -0
- package/src/parsers/{DE → de}/DEMonthNameParser.js +0 -0
- package/src/parsers/{DE → de}/DESlashDateFormatParser.js +0 -0
- package/src/parsers/{DE → de}/DETimeAgoFormatParser.js +0 -0
- package/src/parsers/{DE → de}/DETimeExpressionParser.js +0 -0
- package/src/parsers/{DE → de}/DEWeekdayParser.js +4 -4
- package/src/parsers/{EN → en}/ENCasualDateParser.js +4 -4
- package/src/parsers/en/ENCasualTimeParser.js +60 -0
- package/src/parsers/{EN → en}/ENDeadlineFormatParser.js +6 -6
- package/src/parsers/{EN → en}/ENISOFormatParser.js +0 -0
- package/src/parsers/{EN → en}/ENMonthNameLittleEndianParser.js +24 -24
- package/src/parsers/{EN → en}/ENMonthNameMiddleEndianParser.js +5 -4
- package/src/parsers/{EN → en}/ENMonthNameParser.js +1 -1
- package/src/parsers/{EN → en}/ENRelativeDateFormatParser.js +40 -2
- package/src/parsers/{EN → en}/ENSlashDateFormatParser.js +5 -1
- package/src/parsers/{EN → en}/ENSlashDateFormatStartWithYearParser.js +8 -2
- package/src/parsers/{EN → en}/ENSlashMonthFormatParser.js +0 -0
- package/src/parsers/en/ENTimeAgoFormatParser.js +69 -0
- package/src/parsers/{EN → en}/ENTimeExpressionParser.js +24 -11
- package/src/parsers/en/ENTimeLaterFormatParser.js +77 -0
- package/src/parsers/{EN → en}/ENWeekdayParser.js +0 -0
- package/src/parsers/{ES → es}/ESCasualDateParser.js +0 -0
- package/src/parsers/{ES → es}/ESDeadlineFormatParser.js +0 -0
- package/src/parsers/{ES → es}/ESMonthNameLittleEndianParser.js +2 -2
- package/src/parsers/{ES → es}/ESSlashDateFormatParser.js +0 -0
- package/src/parsers/{ES → es}/ESTimeAgoFormatParser.js +0 -0
- package/src/parsers/{ES → es}/ESTimeExpressionParser.js +0 -0
- package/src/parsers/{ES → es}/ESWeekdayParser.js +1 -1
- package/src/parsers/{FR → fr}/FRCasualDateParser.js +0 -0
- package/src/parsers/{FR → fr}/FRDeadlineFormatParser.js +0 -0
- package/src/parsers/{FR → fr}/FRMonthNameLittleEndianParser.js +0 -0
- package/src/parsers/{FR → fr}/FRRelativeDateFormatParser.js +5 -1
- package/src/parsers/{FR → fr}/FRSlashDateFormatParser.js +41 -11
- package/src/parsers/{FR → fr}/FRTimeAgoFormatParser.js +0 -0
- package/src/parsers/{FR → fr}/FRTimeExpressionParser.js +0 -0
- package/src/parsers/{FR → fr}/FRWeekdayParser.js +1 -1
- package/src/parsers/{JP → ja}/JPCasualDateParser.js +0 -0
- package/src/parsers/{JP → ja}/JPStandardParser.js +0 -0
- package/src/parsers/parser.js +50 -49
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantCasualDateParser.js +18 -2
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantDateParser.js +0 -0
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantDeadlineFormatParser.js +0 -0
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantTimeExpressionParser.js +36 -4
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantWeekdayParser.js +1 -1
- package/src/refiners/ExtractTimezoneAbbrRefiner.js +19 -10
- package/src/refiners/ForwardDateRefiner.js +1 -1
- package/src/refiners/{DE → de}/DEMergeDateRangeRefiner.js +1 -1
- package/src/refiners/{DE → de}/DEMergeDateTimeRefiner.js +3 -3
- package/src/refiners/{EN → en}/ENMergeDateRangeRefiner.js +21 -3
- package/src/refiners/{EN → en}/ENMergeDateTimeRefiner.js +15 -2
- package/src/refiners/{EN → en}/ENMergeWeekdayRefiner.js +0 -0
- package/src/refiners/{EN → en}/ENPrioritizeSpecificDateRefiner.js +0 -0
- package/src/refiners/{FR → fr}/FRMergeDateRangeRefiner.js +0 -0
- package/src/refiners/{FR → fr}/FRMergeDateTimeRefiner.js +1 -1
- package/src/refiners/{JP → ja}/JPMergeDateRangeRefiner.js +1 -1
- package/src/refiners/refiner.js +12 -12
- package/src/result.js +3 -1
- package/src/timezone.js +2 -0
- package/src/utils/EN.js +68 -2
- package/test/de/de.test.js +51 -0
- package/test/de/de_casual.test.js +432 -0
- package/test/de/de_dash.test.js +6 -0
- package/test/de/de_deadline.test.js +244 -0
- package/test/de/de_little_endian.test.js +459 -0
- package/test/de/de_time_ago.test.js +313 -0
- package/test/de/de_time_exp.test.js +166 -0
- package/test/de/de_weekday.test.js +235 -0
- package/test/en/en.test.js +250 -0
- package/test/en/en_casual.test.js +461 -0
- package/test/en/en_dash.test.js +31 -0
- package/test/en/en_deadline.test.js +366 -0
- package/test/{test_example.js → en/en_example.test.js} +7 -18
- package/test/en/en_inter_std.test.js +269 -0
- package/test/en/en_little_endian.test.js +566 -0
- package/test/en/en_middle_endian.test.js +552 -0
- package/test/en/en_month.test.js +113 -0
- package/test/en/en_option_forward.test.js +156 -0
- package/test/en/en_relative.test.js +228 -0
- package/test/en/en_slash.test.js +450 -0
- package/test/en/en_time_ago.test.js +374 -0
- package/test/en/en_time_exp.test.js +722 -0
- package/test/en/en_time_from_now.test.js +371 -0
- package/test/en/en_time_later.test.js +95 -0
- package/test/en/en_weekday.test.js +301 -0
- package/test/es/es_casual.test.js +258 -0
- package/test/es/es_dash.test.js +13 -0
- package/test/es/es_deadline.test.js +85 -0
- package/test/es/es_little_endian.test.js +350 -0
- package/test/es/es_slash.test.js +24 -0
- package/test/es/es_time_ago.test.js +137 -0
- package/test/es/es_time_exp.test.js +240 -0
- package/test/fr/fr_casual.test.js +454 -0
- package/test/fr/fr_dash.test.js +26 -0
- package/test/fr/fr_deadline.test.js +244 -0
- package/test/fr/fr_little_endian.test.js +576 -0
- package/test/fr/fr_relative.test.js +198 -0
- package/test/fr/fr_slash.test.js +62 -0
- package/test/fr/fr_time_ago.test.js +194 -0
- package/test/fr/fr_time_exp.test.js +960 -0
- package/test/fr/fr_weekday.test.js +200 -0
- package/test/ja/ja_casual.test.js +51 -0
- package/test/ja/ja_standard.test.js +170 -0
- package/test/system.test.js +207 -0
- package/test/zh/zh_hant_casual.test.js +340 -0
- package/test/zh/zh_hant_date.test.js +118 -0
- package/test/zh/zh_hant_deadline.test.js +213 -0
- package/test/zh/zh_hant_time_exp.test.js +226 -0
- package/test/zh/zh_hant_weekday.test.js +160 -0
- package/.npmignore +0 -11
- package/src/parsers/EN/ENCasualTimeParser.js +0 -53
- package/src/parsers/EN/ENTimeAgoFormatParser.js +0 -114
- package/test/test_de.js +0 -62
- package/test/test_de_casual.js +0 -443
- package/test/test_de_dash.js +0 -17
- package/test/test_de_deadline.js +0 -255
- package/test/test_de_little_endian.js +0 -470
- package/test/test_de_time_ago.js +0 -324
- package/test/test_de_time_exp.js +0 -177
- package/test/test_de_weekday.js +0 -246
- package/test/test_en.js +0 -217
- package/test/test_en_casual.js +0 -448
- package/test/test_en_dash.js +0 -42
- package/test/test_en_deadline.js +0 -311
- package/test/test_en_inter_std.js +0 -272
- package/test/test_en_little_endian.js +0 -505
- package/test/test_en_middle_endian.js +0 -524
- package/test/test_en_month.js +0 -124
- package/test/test_en_option_forward.js +0 -167
- package/test/test_en_relative.js +0 -206
- package/test/test_en_slash.js +0 -370
- package/test/test_en_time_ago.js +0 -356
- package/test/test_en_time_exp.js +0 -663
- package/test/test_en_weekday.js +0 -312
- package/test/test_es_casual.js +0 -269
- package/test/test_es_dash.js +0 -24
- package/test/test_es_deadline.js +0 -96
- package/test/test_es_little_endian.js +0 -361
- package/test/test_es_slash.js +0 -35
- package/test/test_es_time_ago.js +0 -148
- package/test/test_es_time_exp.js +0 -251
- package/test/test_fr_casual.js +0 -465
- package/test/test_fr_dash.js +0 -37
- package/test/test_fr_deadline.js +0 -255
- package/test/test_fr_little_endian.js +0 -568
- package/test/test_fr_relative.js +0 -209
- package/test/test_fr_slash.js +0 -54
- package/test/test_fr_time_ago.js +0 -205
- package/test/test_fr_time_exp.js +0 -971
- package/test/test_fr_weekday.js +0 -211
- package/test/test_jp_casual.js +0 -62
- package/test/test_jp_standard.js +0 -181
- package/test/test_system.js +0 -178
- package/test/test_zh_hant_casual.js +0 -329
- package/test/test_zh_hant_date.js +0 -129
- package/test/test_zh_hant_deadline.js +0 -224
- package/test/test_zh_hant_time_exp.js +0 -210
- package/test/test_zh_hant_weekday.js +0 -171
package/chrono.map.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/moment/locale/fr.js","node_modules/moment/moment.js","src/chrono.js","src/options.js","src/parsers/DE/DECasualDateParser.js","src/parsers/DE/DEDeadlineFormatParser.js","src/parsers/DE/DEMonthNameLittleEndianParser.js","src/parsers/DE/DEMonthNameParser.js","src/parsers/DE/DESlashDateFormatParser.js","src/parsers/DE/DETimeAgoFormatParser.js","src/parsers/DE/DETimeExpressionParser.js","src/parsers/DE/DEWeekdayParser.js","src/parsers/EN/ENCasualDateParser.js","src/parsers/EN/ENCasualTimeParser.js","src/parsers/EN/ENDeadlineFormatParser.js","src/parsers/EN/ENISOFormatParser.js","src/parsers/EN/ENMonthNameLittleEndianParser.js","src/parsers/EN/ENMonthNameMiddleEndianParser.js","src/parsers/EN/ENMonthNameParser.js","src/parsers/EN/ENRelativeDateFormatParser.js","src/parsers/EN/ENSlashDateFormatParser.js","src/parsers/EN/ENSlashDateFormatStartWithYearParser.js","src/parsers/EN/ENSlashMonthFormatParser.js","src/parsers/EN/ENTimeAgoFormatParser.js","src/parsers/EN/ENTimeExpressionParser.js","src/parsers/EN/ENWeekdayParser.js","src/parsers/ES/ESCasualDateParser.js","src/parsers/ES/ESDeadlineFormatParser.js","src/parsers/ES/ESMonthNameLittleEndianParser.js","src/parsers/ES/ESSlashDateFormatParser.js","src/parsers/ES/ESTimeAgoFormatParser.js","src/parsers/ES/ESTimeExpressionParser.js","src/parsers/ES/ESWeekdayParser.js","src/parsers/FR/FRCasualDateParser.js","src/parsers/FR/FRDeadlineFormatParser.js","src/parsers/FR/FRMonthNameLittleEndianParser.js","src/parsers/FR/FRRelativeDateFormatParser.js","src/parsers/FR/FRSlashDateFormatParser.js","src/parsers/FR/FRTimeAgoFormatParser.js","src/parsers/FR/FRTimeExpressionParser.js","src/parsers/FR/FRWeekdayParser.js","src/parsers/JP/JPCasualDateParser.js","src/parsers/JP/JPStandardParser.js","src/parsers/ZH-Hant/ZHHantCasualDateParser.js","src/parsers/ZH-Hant/ZHHantDateParser.js","src/parsers/ZH-Hant/ZHHantDeadlineFormatParser.js","src/parsers/ZH-Hant/ZHHantTimeExpressionParser.js","src/parsers/ZH-Hant/ZHHantWeekdayParser.js","src/parsers/parser.js","src/refiners/DE/DEMergeDateRangeRefiner.js","src/refiners/DE/DEMergeDateTimeRefiner.js","src/refiners/EN/ENMergeDateRangeRefiner.js","src/refiners/EN/ENMergeDateTimeRefiner.js","src/refiners/EN/ENPrioritizeSpecificDateRefiner.js","src/refiners/ExtractTimezoneAbbrRefiner.js","src/refiners/ExtractTimezoneOffsetRefiner.js","src/refiners/FR/FRMergeDateRangeRefiner.js","src/refiners/FR/FRMergeDateTimeRefiner.js","src/refiners/ForwardDateRefiner.js","src/refiners/JP/JPMergeDateRangeRefiner.js","src/refiners/OverlapRemovalRefiner.js","src/refiners/UnlikelyFormatFilter.js","src/refiners/refiner.js","src/result.js","src/utils/DE.js","src/utils/EN.js","src/utils/ES.js","src/utils/FR.js","src/utils/JP.js","src/utils/ZH-Hant.js"],"names":["global","factory","exports","module","require","define","amd","moment","this","defineLocale","months","split","monthsShort","monthsParseExact","weekdays","weekdaysShort","weekdaysMin","weekdaysParseExact","longDateFormat","LT","LTS","L","LL","LLL","LLLL","calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","relativeTime","future","past","s","m","mm","h","hh","d","dd","M","MM","y","yy","dayOfMonthOrdinalParse","ordinal","number","period","week","dow","doy","hooks","hookCallback","apply","arguments","isArray","input","Array","Object","prototype","toString","call","isObject","isObjectEmpty","obj","k","isUndefined","isNumber","isDate","Date","map","arr","fn","i","res","length","push","hasOwnProp","a","b","hasOwnProperty","extend","valueOf","createUTC","format","locale","strict","createLocalOrUTC","utc","defaultParsingFlags","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","parsedDateParts","meridiem","rfc2822","weekdayMismatch","getParsingFlags","_pf","isValid","_isValid","flags","parsedParts","some$1","isNowValid","isNaN","_d","getTime","invalidWeekday","_strict","undefined","bigHour","isFrozen","createInvalid","NaN","copyConfig","to","from","prop","val","_isAMomentObject","_i","_f","_l","_tzm","_isUTC","_offset","_locale","momentProperties","Moment","config","updateInProgress","updateOffset","isMoment","absFloor","Math","ceil","floor","toInt","argumentForCoercion","coercedNumber","value","isFinite","compareArrays","array1","array2","dontConvert","len","min","lengthDiff","abs","diffs","warn","msg","suppressDeprecationWarnings","console","deprecate","firstTime","deprecationHandler","arg","args","key","slice","join","Error","stack","deprecateSimple","name","deprecations","isFunction","Function","set","_config","_dayOfMonthOrdinalParseLenient","RegExp","_dayOfMonthOrdinalParse","source","_ordinalParse","mergeConfigs","parentConfig","childConfig","Locale","mom","now","output","_calendar","_longDateFormat","formatUpper","toUpperCase","replace","invalidDate","_invalidDate","_ordinal","withoutSuffix","string","isFuture","_relativeTime","pastFuture","diff","addUnitAlias","unit","shorthand","lowerCase","toLowerCase","aliases","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","addUnitPriority","priority","priorities","getPrioritizedUnits","unitsObj","u","sort","makeGetSet","keepTime","set$1","get","stringGet","stringSet","prioritized","zeroFill","targetLength","forceSign","absNumber","zerosToFill","pow","max","substr","addFormatToken","token","padded","callback","func","formatTokenFunctions","localeData","removeFormattingTokens","match","makeFormatFunction","array","formattingTokens","formatMoment","expandFormat","formatFunctions","replaceLongDateFormatTokens","localFormattingTokens","lastIndex","test","addRegexToken","regex","strictRegex","regexes","isStrict","getParseRegexForToken","unescapeFormat","regexEscape","matched","p1","p2","p3","p4","addParseToken","tokens","addWeekParseToken","_w","addTimeToArrayFromToken","_a","daysInMonth","year","month","UTC","getUTCDate","localeMonths","_months","isFormat","MONTHS_IN_FORMAT","localeMonthsShort","_monthsShort","handleStrictParse","monthName","ii","llc","toLocaleLowerCase","_monthsParse","_longMonthsParse","_shortMonthsParse","indexOf$1","localeMonthsParse","_monthsParseExact","setMonth","dayOfMonth","monthsParse","date","getSetMonth","getDaysInMonth","monthsShortRegex","computeMonthsParse","_monthsShortStrictRegex","_monthsShortRegex","defaultMonthsShortRegex","monthsRegex","_monthsStrictRegex","_monthsRegex","defaultMonthsRegex","cmpLenRev","shortPieces","longPieces","mixedPieces","daysInYear","isLeapYear","getIsLeapYear","createDate","ms","getFullYear","setFullYear","createUTCDate","getUTCFullYear","setUTCFullYear","firstWeekOffset","fwd","getUTCDay","dayOfYearFromWeeks","weekday","resYear","resDayOfYear","localWeekday","weekOffset","dayOfYear","weekOfYear","resWeek","weeksInYear","weekOffsetNext","localeWeek","_week","localeFirstDayOfWeek","localeFirstDayOfYear","getSetWeek","add","getSetISOWeek","parseWeekday","weekdaysParse","parseInt","parseIsoWeekday","localeWeekdays","_weekdays","day","localeWeekdaysShort","_weekdaysShort","localeWeekdaysMin","_weekdaysMin","handleStrictParse$1","weekdayName","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","localeWeekdaysParse","_weekdaysParseExact","_fullWeekdaysParse","getSetDayOfWeek","getDay","getSetLocaleDayOfWeek","getSetISODayOfWeek","weekdaysRegex","computeWeekdaysParse","_weekdaysStrictRegex","_weekdaysRegex","defaultWeekdaysRegex","weekdaysShortRegex","_weekdaysShortStrictRegex","_weekdaysShortRegex","defaultWeekdaysShortRegex","weekdaysMinRegex","_weekdaysMinStrictRegex","_weekdaysMinRegex","defaultWeekdaysMinRegex","minp","shortp","longp","minPieces","hFormat","hours","kFormat","lowercase","minutes","matchMeridiem","_meridiemParse","localeIsPM","charAt","localeMeridiem","isLower","normalizeLocale","chooseLocale","names","j","next","loadLocale","oldLocale","locales","globalLocale","_abbr","getSetGlobalLocale","e","values","data","getLocale","baseConfig","abbr","parentLocale","localeFamilies","forEach","x","updateLocale","listLocales","keys$1","checkOverflow","MONTH","DATE","YEAR","HOUR","MINUTE","SECOND","MILLISECOND","_overflowDayOfYear","_overflowWeeks","WEEK","_overflowWeekday","WEEKDAY","configFromISO","l","allowTime","dateFormat","timeFormat","tzFormat","extendedIsoRegex","exec","basicIsoRegex","isoDates","isoTimes","tzRegex","configFromStringAndFormat","configFromRFC2822","dayFormat","timezone","timezoneIndex","timezones"," GMT"," EDT"," EST"," CDT"," CST"," MDT"," MST"," PDT"," PST","military","basicRfcRegex","momentDate","momentDay","indexOf","splice","configFromString","aspNetJsonRegex","createFromInputFallback","defaults","c","currentDateArray","nowValue","_useUTC","getUTCMonth","getMonth","getDate","configFromArray","currentDate","yearToUse","dayOfYearFromWeekInfo","_dayOfYear","_nextDay","setUTCMinutes","getUTCMinutes","w","weekYear","temp","weekdayOverflow","GG","W","E","createLocal","curWeek","gg","ISO_8601","RFC_2822","parsedInput","skipped","stringLength","totalParsedInputLength","_meridiem","meridiemFixWrap","hour","isPm","meridiemHour","isPM","configFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","score","configFromObject","minute","second","millisecond","createFromConfig","prepareConfig","preparse","configFromInput","isUTC","pickBy","moments","isDurationValid","ordering","unitHasDecimal","parseFloat","isValid$1","createInvalid$1","createDuration","Duration","duration","years","quarters","quarter","weeks","days","seconds","milliseconds","_milliseconds","_days","_data","_bubble","isDuration","absRound","round","offset","separator","utcOffset","sign","offsetFromString","matcher","matches","chunk","parts","chunkOffset","cloneWithOffset","model","clone","setTime","local","getDateOffset","getTimezoneOffset","getSetOffset","keepLocalTime","keepMinutes","localAdjust","matchShortOffset","_changeInProgress","addSubtract","getSetZone","setOffsetToUTC","setOffsetToLocal","subtract","setOffsetToParsedOffset","tZone","matchOffset","hasAlignedHourOffset","isDaylightSavingTime","isDaylightSavingTimeShifted","_isDSTShifted","other","toArray","isLocal","isUtcOffset","isUtc","ret","diffRes","aspNetRegex","isoRegex","parseIso","momentsDifference","inp","positiveMomentsDifference","base","isAfter","isBefore","createAdder","direction","dur","tmp","isAdding","getCalendarFormat","myMoment","calendar$1","time","formats","sod","startOf","calendarFormat","localInput","endOf","isBetween","inclusivity","isSame","inputMs","isSameOrAfter","isSameOrBefore","asFloat","that","zoneDelta","delta","monthDiff","anchor2","adjust","wholeMonthDiff","anchor","toISOString","toDate","inspect","zone","prefix","suffix","inputString","defaultFormatUtc","defaultFormat","postformat","humanize","fromNow","toNow","newLocaleData","isoWeekday","unix","toObject","toJSON","isValid$2","parsingFlags","invalidAt","creationData","addWeekYearFormatToken","getter","getSetWeekYear","getSetWeekYearHelper","getSetISOWeekYear","isoWeek","getISOWeeksInYear","getWeeksInYear","weekInfo","weeksTarget","setWeekAll","dayOfYearData","getSetQuarter","getSetDayOfYear","parseMs","getZoneAbbr","getZoneName","createUnix","createInZone","parseZone","preParsePostFormat","get$1","index","field","setter","listMonthsImpl","out","listWeekdaysImpl","localeSorted","shift","listMonths","listMonthsShort","listWeekdays","listWeekdaysShort","listWeekdaysMin","mathAbs","addSubtract$1","add$1","subtract$1","absCeil","bubble","monthsFromDays","monthsToDays","daysToMonths","as","valueOf$1","makeAs","alias","get$2","makeGetter","substituteTimeAgo","relativeTime$1","posNegDuration","thresholds","ss","getSetRelativeTimeRounding","roundingFunction","getSetRelativeTimeThreshold","threshold","limit","withSuffix","toISOString$1","abs$1","Y","D","total","asSeconds","some","fun","t","keys","defaultCalendar","defaultLongDateFormat","defaultDayOfMonthOrdinalParse","defaultRelativeTime","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchTimestamp","matchWord","o","defaultLocaleMonths","defaultLocaleMonthsShort","parseTwoDigitYear","getSetYear","defaultLocaleWeek","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","kInput","_isPm","pos","pos1","pos2","defaultLocaleMeridiemParse","getSetHour","meridiemParse","prototypeMin","prototypeMax","invalid","lang","isoWeekYear","getSetDayOfMonth","getSetMinute","getSetSecond","getSetMillisecond","proto","isoWeeks","isoWeeksInYear","isDST","zoneAbbr","zoneName","dates","isDSTShifted","proto$1","firstDayOfYear","firstDayOfWeek","langData","asMilliseconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","proto$2","toIsoString","version","relativeTimeRounding","relativeTimeThreshold","options","parser","refiner","Parser","Refiner","Filter","ParsedResult","ParsedComponents","Chrono","option","casualOption","parsers","refiners","parse","text","refDate","opt","allResults","results","execute","concat","refine","parseDate","start","strictOption","casual","en","mergeOptions","commonPostProcessing","en_GB","de","es","fr","ja","addedTypes","mergedOption","p","constructor","r","ExtractTimezoneOffsetRefiner","ExtractTimezoneAbbrRefiner","UnlikelyFormatFilter","strictConfig","zh","DEDeadlineFormatParser","DEMonthNameLittleEndianParser","DEMonthNameParser","DESlashDateFormatParser","DETimeAgoFormatParser","DETimeExpressionParser","OverlapRemovalRefiner","ForwardDateRefiner","DEMergeDateTimeRefiner","DEMergeDateRangeRefiner","unshift","DECasualDateParser","DEWeekdayParser","ENISOFormatParser","ENDeadlineFormatParser","ENMonthNameLittleEndianParser","ENMonthNameMiddleEndianParser","ENMonthNameParser","ENSlashDateFormatParser","ENSlashDateFormatStartWithYearParser","ENSlashMonthFormatParser","ENTimeAgoFormatParser","ENTimeExpressionParser","ENMergeDateTimeRefiner","ENMergeDateRangeRefiner","ENPrioritizeSpecificDateRefiner","ENCasualDateParser","ENCasualTimeParser","ENWeekdayParser","ENRelativeDateFormatParser","littleEndian","JPStandardParser","JPMergeDateRangeRefiner","JPCasualDateParser","ESTimeAgoFormatParser","ESDeadlineFormatParser","ESTimeExpressionParser","ESMonthNameLittleEndianParser","ESSlashDateFormatParser","ESCasualDateParser","ESWeekdayParser","FRDeadlineFormatParser","FRMonthNameLittleEndianParser","FRSlashDateFormatParser","FRTimeAgoFormatParser","FRTimeExpressionParser","FRMergeDateRangeRefiner","FRMergeDateTimeRefiner","FRCasualDateParser","FRWeekdayParser","FRRelativeDateFormatParser","ZHHantDateParser","ZHHantWeekdayParser","ZHHantTimeExpressionParser","ZHHantCasualDateParser","ZHHantDeadlineFormatParser","PATTERN","pattern","extract","ref","result","refMoment","startMoment","lowerText","imply","secondMatch","assign","tags","util","INTEGER_WORDS_PATTERN","STRICT_PATTERN","isStrictMode","num","INTEGER_WORDS","WEEKDAY_GROUP","DATE_GROUP","DATE_TO_GROUP","MONTH_NAME_GROUP","YEAR_GROUP","YEAR_BE_GROUP","MONTH_OFFSET","nextYear","lastYear","WEEKDAY_OFFSET","end","YEAR_GROUP2","YEAR_BE_GROUP2","DAYS_OFFSET","sonntag","so","montag","mo","dienstag","di","mittwoch","mi","donnerstag","do","freitag","samstag","sa","OPENNING_GROUP","ENDING_GROUP","DAY_GROUP","MONTH_GROUP","argument","FIRST_REG_PATTERN","SECOND_REG_PATTERN","HOUR_GROUP","MINUTE_GROUP","SECOND_GROUP","AM_PM_HOUR_GROUP","substring","ampm","isCertain","PREFIX_GROUP","POSTFIX_GROUP","dayOfWeek","postfix","refOffset","norm","forwardDatesOnly","TIME_MATCH","YEAR_NUMBER_GROUP","MONTH_NUMBER_GROUP","DATE_NUMBER_GROUP","HOUR_NUMBER_GROUP","MINUTE_NUMBER_GROUP","SECOND_NUMBER_GROUP","MILLISECOND_NUMBER_GROUP","TZD_HOUR_OFFSET_GROUP","TZD_MINUTE_OFFSET_GROUP","minuteOffset","hourOffset","ORDINAL_WORDS_PATTERN","DATE_NUM_GROUP","DATE_TO_NUM_GROUP","ORDINAL_WORDS","trim","endDate","yearBE","MODIFIER_WORD_GROUP","MULTIPLIER_WORD_GROUP","RELATIVE_WORD_GROUP","modifier","sunday","sun","monday","mon","tuesday","wednesday","wed","thursday","thur","friday","fri","saturday","sat","FIRST_NUMBERS_GROUP","SECOND_NUMBERS_GROUP","tday","tues","tue","thurs","thu","updateParsedComponent","startMomentFixed","firstMatch","domingo","dom","lunes","lun","martes","mar","miercoles","miércoles","mie","jueves","jue","viernes","vier","sábado","sabado","sab","MULTIPLIER_GROUP","MODIFIER_1_GROUP","MODIFIER_2_GROUP","multiplier","modifierFactor","dateFrom","dateTo","relative","dateTmp","dimanche","dim","lundi","mardi","mercredi","mer","jeudi","jeu","vendredi","ven","samedi","sam","ERA_GROUP","toHankaku","NOW_GROUP","DAY_GROUP_1","TIME_GROUP_1","TIME_GROUP_2","DAY_GROUP_3","TIME_GROUP_3","day1","time1","timeString2","time2","day3","timeString3","time3","NUMBER","zhStringToNumber","zhStringToYear","NUMBER_GROUP","UNIT_GROUP","unitAbbr","patternString1","patternString2","ZH_AM_PM_HOUR_GROUP_1","ZH_AM_PM_HOUR_GROUP_2","ZH_AM_PM_HOUR_GROUP_3","ZHTimeExpressionParser","zhAMPMString1","zhAMPM1","zhAMPMString2","zhAMPM2","zhAMPMString3","zhAMPM3","endMoment","strictMode","remainingText","hasPossibleDates","isAbleToMerge","prevResult","curResult","mergeResult","dateResult","timeResult","beginDate","beginTime","beginDateTime","mergeDateTimeComponent","endTime","endDateTime","startIndex","endIndex","tag","isDateOnly","isTimeOnly","mergedResult","currResult","result1","result2","begin","isWeekdayResult","fromResult","toResult","knownValues","dateComponent","timeComponent","dateTimeComponent","isMoreSpecific","moreSpecific","textBetween","includesRelativeResult","referToSameDate","specificResult","nonSpecificResult","TIMEZONE_ABBR_MAP","TIMEZONE_NAME_PATTERN","timezoneAbbr","timezoneOffset","ACDT","ACST","ADT","AEDT","AEST","AFT","AKDT","AKST","ALMT","AMST","AMT","ANAST","ANAT","AQTT","ART","AST","AWDT","AWST","AZOST","AZOT","AZST","AZT","BNT","BOT","BRST","BRT","BST","BTT","CAST","CAT","CCT","CDT","CEST","CET","CHADT","CHAST","CKT","CLST","CLT","COT","CST","CVT","CXT","ChST","DAVT","EASST","EAST","EAT","ECT","EDT","EEST","EET","EGST","EGT","EST","ET","FJST","FJT","FKST","FKT","FNT","GALT","GAMT","GET","GFT","GILT","GMT","GST","GYT","HAA","HAC","HADT","HAE","HAP","HAR","HAST","HAT","HAY","HKT","HLV","HNA","HNC","HNE","HNP","HNR","HNT","HNY","HOVT","ICT","IDT","IOT","IRDT","IRKST","IRKT","IRST","IST","JST","KGT","KRAST","KRAT","KST","KUYT","LHDT","LHST","LINT","MAGST","MAGT","MART","MAWT","MDT","MESZ","MEZ","MHT","MMT","MSD","MSK","MST","MUT","MVT","MYT","NCT","NDT","NFT","NOVST","NOVT","NPT","NST","NUT","NZDT","NZST","OMSST","OMST","PDT","PET","PETST","PETT","PGT","PHOT","PHT","PKT","PMDT","PMST","PONT","PST","PT","PWT","PYST","PYT","RET","SAMT","SAST","SBT","SCT","SGT","SRT","SST","TAHT","TFT","TJT","TKT","TLT","TMT","TVT","ULAT","UYST","UYT","UZT","VET","VLAST","VLAT","VUT","WAST","WAT","WEST","WESZ","WET","WEZ","WFT","WGST","WGT","WIB","WIT","WITA","WST","WT","YAKST","YAKT","YAPT","YEKST","YEKT","TIMEZONE_OFFSET_PATTERN","TIMEZONE_OFFSET_SIGN_GROUP","TIMEZONE_OFFSET_HOUR_OFFSET_GROUP","TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP","filteredResults","filteredResult","components","impliedValues","JSON","stringify","isPossibleDate","component","dateMoment","currentTimezoneOffset","targetTimezoneOffset","adjustTimezoneOffset","januar","jan","jan.","februar","feb","feb.","märz","maerz","mär","mär.","mrz","mrz.","april","apr","apr.","mai","juni","jun","jun.","juli","jul","jul.","august","aug","aug.","september","sep","sep.","sept","sept.","oktober","okt","okt.","november","nov","nov.","dezember","dez","dez.","eins","zwei","drei","fünf","fuenf","sechs","sieben","acht","neun","zehn","elf","zwölf","zwoelf","january","february","march","mar.","may","june","july","october","oct","oct.","december","dec","dec.","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","first","third","fourth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh","twelfth","thirteenth","fourteenth","fifteenth","sixteenth","seventeenth","eighteenth","nineteenth","twentieth","twenty first","twenty second","twenty third","twenty fourth","twenty fifth","twenty sixth","twenty seventh","twenty eighth","twenty ninth","thirtieth","thirty first","vie","enero","ene","ene.","febrero","marzo","abril","abr","abr.","mayo","may.","junio","julio","agosto","ago","ago.","septiembre","octubre","noviembre","diciembre","dic","dic.","janvier","février","fév","fév.","fevrier","fev","fev.","mars","avril","avr","avr.","juin","juillet","août","aout","septembre","octobre","novembre","décembre","decembre","un","deux","trois","quatre","cinq","huit","neuf","dix","onze","douze","treize","String","fromCharCode","alphaNum","charCodeAt","toZenkaku","零","一","二","兩","三","四","五","六","七","八","九","十","廿","卅","天","日","char"],"mappings":"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IAAIC,KAAO,IAAIC,IAAM,IAAIC,MAAQ,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,EAAEC,MAAQ,GAAGC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,IAAM,GAAGC,IAAM,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,GAAGC,MAAQ,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,GAAGC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,OAAS,IAAIC,MAAQ,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,EAAEC,KAAO,GAAGC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,IAAM,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,MAAQ,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,EAAEC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,GAAGC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,GAAGC,IAAM,IAAIC,IAAM,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,GAAGC,IAAM,I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","file":"bundle.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})","//! moment.js locale configuration\n//! locale : French [fr]\n//! author : John Fischer : https://github.com/jfroffice\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\nvar 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 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\nreturn fr;\n\n})));\n","//! moment.js\n//! version : 2.18.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\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\nvar hookCallback;\n\nfunction 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.\nfunction setHookCallback (callback) {\n hookCallback = callback;\n}\n\nfunction isArray(input) {\n return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n}\n\nfunction 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\nfunction isObjectEmpty(obj) {\n var k;\n for (k in obj) {\n // even if its not own property I'd still call it non-empty\n return false;\n }\n return true;\n}\n\nfunction isUndefined(input) {\n return input === void 0;\n}\n\nfunction isNumber(input) {\n return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n}\n\nfunction isDate(input) {\n return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n}\n\nfunction 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\nfunction hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\n}\n\nfunction 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\nfunction createUTC (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, true).utc();\n}\n\nfunction 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\nfunction getParsingFlags(m) {\n if (m._pf == null) {\n m._pf = defaultParsingFlags();\n }\n return m._pf;\n}\n\nvar some;\nif (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\nvar some$1 = some;\n\nfunction isValid(m) {\n if (m._isValid == null) {\n var flags = getParsingFlags(m);\n var parsedParts = some$1.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.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\nfunction 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.\nvar momentProperties = hooks.momentProperties = [];\n\nfunction 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\nvar updateInProgress = false;\n\n// Moment prototype object\nfunction 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\nfunction isMoment (obj) {\n return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction warn(msg) {\n if (hooks.suppressDeprecationWarnings === false &&\n (typeof console !== 'undefined') && console.warn) {\n console.warn('Deprecation warning: ' + msg);\n }\n}\n\nfunction 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\nvar deprecations = {};\n\nfunction 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\nhooks.suppressDeprecationWarnings = false;\nhooks.deprecationHandler = null;\n\nfunction isFunction(input) {\n return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n}\n\nfunction 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\nfunction 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\nfunction Locale(config) {\n if (config != null) {\n this.set(config);\n }\n}\n\nvar keys;\n\nif (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\nvar keys$1 = keys;\n\nvar 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\nfunction calendar (key, mom, now) {\n var output = this._calendar[key] || this._calendar['sameElse'];\n return isFunction(output) ? output.call(mom, now) : output;\n}\n\nvar 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\nfunction 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\nvar defaultInvalidDate = 'Invalid date';\n\nfunction invalidDate () {\n return this._invalidDate;\n}\n\nvar defaultOrdinal = '%d';\nvar defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\nfunction ordinal (number) {\n return this._ordinal.replace('%d', number);\n}\n\nvar 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\nfunction 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\nfunction 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\nvar aliases = {};\n\nfunction addUnitAlias (unit, shorthand) {\n var lowerCase = unit.toLowerCase();\n aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n}\n\nfunction normalizeUnits(units) {\n return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n}\n\nfunction 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\nvar priorities = {};\n\nfunction addUnitPriority(unit, priority) {\n priorities[unit] = priority;\n}\n\nfunction 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\nfunction 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\nfunction get (mom, unit) {\n return mom.isValid() ?\n mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n}\n\nfunction set$1 (mom, unit, value) {\n if (mom.isValid()) {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n }\n}\n\n// MOMENTS\n\nfunction stringGet (units) {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units]();\n }\n return this;\n}\n\n\nfunction 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\nfunction 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\nvar 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\nvar localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\nvar formatFunctions = {};\n\nvar formatTokenFunctions = {};\n\n// token: 'M'\n// padded: ['MM', 2]\n// ordinal: 'Mo'\n// callback: function () { this.month() + 1 }\nfunction 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\nfunction removeFormattingTokens(input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|\\]$/g, '');\n }\n return input.replace(/\\\\/g, '');\n}\n\nfunction 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\nfunction 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\nfunction 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\nvar match1 = /\\d/; // 0 - 9\nvar match2 = /\\d\\d/; // 00 - 99\nvar match3 = /\\d{3}/; // 000 - 999\nvar match4 = /\\d{4}/; // 0000 - 9999\nvar match6 = /[+-]?\\d{6}/; // -999999 - 999999\nvar match1to2 = /\\d\\d?/; // 0 - 99\nvar match3to4 = /\\d\\d\\d\\d?/; // 999 - 9999\nvar match5to6 = /\\d\\d\\d\\d\\d\\d?/; // 99999 - 999999\nvar match1to3 = /\\d{1,3}/; // 0 - 999\nvar match1to4 = /\\d{1,4}/; // 0 - 9999\nvar match1to6 = /[+-]?\\d{1,6}/; // -999999 - 999999\n\nvar matchUnsigned = /\\d+/; // 0 - inf\nvar matchSigned = /[+-]?\\d+/; // -inf - inf\n\nvar matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\nvar matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\nvar 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\nvar matchWord = /[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i;\n\n\nvar regexes = {};\n\nfunction addRegexToken (token, regex, strictRegex) {\n regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n return (isStrict && strictRegex) ? strictRegex : regex;\n };\n}\n\nfunction 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\nfunction unescapeFormat(s) {\n return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n return p1 || p2 || p3 || p4;\n }));\n}\n\nfunction regexEscape(s) {\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nvar tokens = {};\n\nfunction 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\nfunction 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\nfunction addTimeToArrayFromToken(token, input, config) {\n if (input != null && hasOwnProp(tokens, token)) {\n tokens[token](input, config._a, config, token);\n }\n}\n\nvar YEAR = 0;\nvar MONTH = 1;\nvar DATE = 2;\nvar HOUR = 3;\nvar MINUTE = 4;\nvar SECOND = 5;\nvar MILLISECOND = 6;\nvar WEEK = 7;\nvar WEEKDAY = 8;\n\nvar indexOf;\n\nif (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\nvar indexOf$1 = indexOf;\n\nfunction daysInMonth(year, month) {\n return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n}\n\n// FORMATTING\n\naddFormatToken('M', ['MM', 2], 'Mo', function () {\n return this.month() + 1;\n});\n\naddFormatToken('MMM', 0, 0, function (format) {\n return this.localeData().monthsShort(this, format);\n});\n\naddFormatToken('MMMM', 0, 0, function (format) {\n return this.localeData().months(this, format);\n});\n\n// ALIASES\n\naddUnitAlias('month', 'M');\n\n// PRIORITY\n\naddUnitPriority('month', 8);\n\n// PARSING\n\naddRegexToken('M', match1to2);\naddRegexToken('MM', match1to2, match2);\naddRegexToken('MMM', function (isStrict, locale) {\n return locale.monthsShortRegex(isStrict);\n});\naddRegexToken('MMMM', function (isStrict, locale) {\n return locale.monthsRegex(isStrict);\n});\n\naddParseToken(['M', 'MM'], function (input, array) {\n array[MONTH] = toInt(input) - 1;\n});\n\naddParseToken(['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\nvar MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\nvar defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\nfunction 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\nvar defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\nfunction 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\nfunction 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$1.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'MMM') {\n ii = indexOf$1.call(this._shortMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._longMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction getDaysInMonth () {\n return daysInMonth(this.year(), this.month());\n}\n\nvar defaultMonthsShortRegex = matchWord;\nfunction 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\nvar defaultMonthsRegex = matchWord;\nfunction 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\nfunction 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// FORMATTING\n\naddFormatToken('Y', 0, 0, function () {\n var y = this.year();\n return y <= 9999 ? '' + y : '+' + y;\n});\n\naddFormatToken(0, ['YY', 2], 0, function () {\n return this.year() % 100;\n});\n\naddFormatToken(0, ['YYYY', 4], 0, 'year');\naddFormatToken(0, ['YYYYY', 5], 0, 'year');\naddFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\naddUnitAlias('year', 'y');\n\n// PRIORITIES\n\naddUnitPriority('year', 1);\n\n// PARSING\n\naddRegexToken('Y', matchSigned);\naddRegexToken('YY', match1to2, match2);\naddRegexToken('YYYY', match1to4, match4);\naddRegexToken('YYYYY', match1to6, match6);\naddRegexToken('YYYYYY', match1to6, match6);\n\naddParseToken(['YYYYY', 'YYYYYY'], YEAR);\naddParseToken('YYYY', function (input, array) {\n array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n});\naddParseToken('YY', function (input, array) {\n array[YEAR] = hooks.parseTwoDigitYear(input);\n});\naddParseToken('Y', function (input, array) {\n array[YEAR] = parseInt(input, 10);\n});\n\n// HELPERS\n\nfunction daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n}\n\nfunction isLeapYear(year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n// HOOKS\n\nhooks.parseTwoDigitYear = function (input) {\n return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n};\n\n// MOMENTS\n\nvar getSetYear = makeGetSet('FullYear', true);\n\nfunction getIsLeapYear () {\n return isLeapYear(this.year());\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\naddFormatToken('w', ['ww', 2], 'wo', 'week');\naddFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\naddUnitAlias('week', 'w');\naddUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\naddUnitPriority('week', 5);\naddUnitPriority('isoWeek', 5);\n\n// PARSING\n\naddRegexToken('w', match1to2);\naddRegexToken('ww', match1to2, match2);\naddRegexToken('W', match1to2);\naddRegexToken('WW', match1to2, match2);\n\naddWeekParseToken(['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\nfunction localeWeek (mom) {\n return weekOfYear(mom, this._week.dow, this._week.doy).week;\n}\n\nvar 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\nfunction localeFirstDayOfWeek () {\n return this._week.dow;\n}\n\nfunction localeFirstDayOfYear () {\n return this._week.doy;\n}\n\n// MOMENTS\n\nfunction getSetWeek (input) {\n var week = this.localeData().week(this);\n return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\nfunction 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\naddFormatToken('d', 0, 'do', 'day');\n\naddFormatToken('dd', 0, 0, function (format) {\n return this.localeData().weekdaysMin(this, format);\n});\n\naddFormatToken('ddd', 0, 0, function (format) {\n return this.localeData().weekdaysShort(this, format);\n});\n\naddFormatToken('dddd', 0, 0, function (format) {\n return this.localeData().weekdays(this, format);\n});\n\naddFormatToken('e', 0, 0, 'weekday');\naddFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\naddUnitAlias('day', 'd');\naddUnitAlias('weekday', 'e');\naddUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\naddUnitPriority('day', 11);\naddUnitPriority('weekday', 11);\naddUnitPriority('isoWeekday', 11);\n\n// PARSING\n\naddRegexToken('d', match1to2);\naddRegexToken('e', match1to2);\naddRegexToken('E', match1to2);\naddRegexToken('dd', function (isStrict, locale) {\n return locale.weekdaysMinRegex(isStrict);\n});\naddRegexToken('ddd', function (isStrict, locale) {\n return locale.weekdaysShortRegex(isStrict);\n});\naddRegexToken('dddd', function (isStrict, locale) {\n return locale.weekdaysRegex(isStrict);\n});\n\naddWeekParseToken(['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\naddWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n week[token] = toInt(input);\n});\n\n// HELPERS\n\nfunction 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\nfunction 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\nvar defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\nfunction 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\nvar defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\nfunction localeWeekdaysShort (m) {\n return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n}\n\nvar defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\nfunction localeWeekdaysMin (m) {\n return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n}\n\nfunction 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$1.call(this._weekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'dddd') {\n ii = indexOf$1.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nvar defaultWeekdaysRegex = matchWord;\nfunction 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\nvar defaultWeekdaysShortRegex = matchWord;\nfunction 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\nvar defaultWeekdaysMinRegex = matchWord;\nfunction 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\nfunction 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\nfunction hFormat() {\n return this.hours() % 12 || 12;\n}\n\nfunction kFormat() {\n return this.hours() || 24;\n}\n\naddFormatToken('H', ['HH', 2], 0, 'hour');\naddFormatToken('h', ['hh', 2], 0, hFormat);\naddFormatToken('k', ['kk', 2], 0, kFormat);\n\naddFormatToken('hmm', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('hmmss', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n});\n\naddFormatToken('Hmm', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('Hmmss', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n});\n\nfunction meridiem (token, lowercase) {\n addFormatToken(token, 0, 0, function () {\n return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n });\n}\n\nmeridiem('a', true);\nmeridiem('A', false);\n\n// ALIASES\n\naddUnitAlias('hour', 'h');\n\n// PRIORITY\naddUnitPriority('hour', 13);\n\n// PARSING\n\nfunction matchMeridiem (isStrict, locale) {\n return locale._meridiemParse;\n}\n\naddRegexToken('a', matchMeridiem);\naddRegexToken('A', matchMeridiem);\naddRegexToken('H', match1to2);\naddRegexToken('h', match1to2);\naddRegexToken('k', match1to2);\naddRegexToken('HH', match1to2, match2);\naddRegexToken('hh', match1to2, match2);\naddRegexToken('kk', match1to2, match2);\n\naddRegexToken('hmm', match3to4);\naddRegexToken('hmmss', match5to6);\naddRegexToken('Hmm', match3to4);\naddRegexToken('Hmmss', match5to6);\n\naddParseToken(['H', 'HH'], HOUR);\naddParseToken(['k', 'kk'], function (input, array, config) {\n var kInput = toInt(input);\n array[HOUR] = kInput === 24 ? 0 : kInput;\n});\naddParseToken(['a', 'A'], function (input, array, config) {\n config._isPm = config._locale.isPM(input);\n config._meridiem = input;\n});\naddParseToken(['h', 'hh'], function (input, array, config) {\n array[HOUR] = toInt(input);\n getParsingFlags(config).bigHour = true;\n});\naddParseToken('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});\naddParseToken('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});\naddParseToken('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});\naddParseToken('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\nfunction 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\nvar defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\nfunction 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 he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\nvar getSetHour = makeGetSet('Hours', true);\n\n// months\n// week\n// weekdays\n// meridiem\nvar 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\nvar locales = {};\nvar localeFamilies = {};\nvar globalLocale;\n\nfunction 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\nfunction 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 null;\n}\n\nfunction 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 require('./locale/' + name);\n // because defineLocale currently also sets the global locale, we\n // want to undo that for lazy loaded locales\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.\nfunction 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 }\n\n return globalLocale._abbr;\n}\n\nfunction defineLocale (name, config) {\n if (config !== null) {\n var 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 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 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\nfunction updateLocale(name, config) {\n if (config != null) {\n var locale, parentConfig = baseConfig;\n // MERGE\n if (locales[name] != null) {\n parentConfig = locales[name]._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\nfunction 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\nfunction listLocales() {\n return keys$1(locales);\n}\n\nfunction 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// 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)\nvar 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)?)?$/;\nvar 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\nvar tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\nvar 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\nvar 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\nvar aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\nfunction 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\nvar basicRfcRegex = /^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d?\\d\\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(?:\\d\\d)?\\d\\d\\s)(\\d\\d:\\d\\d)(\\:\\d\\d)?(\\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\\d{4}))$/;\n\n// date and time from ref 2822 format\nfunction configFromRFC2822(config) {\n var string, match, dayFormat,\n dateFormat, timeFormat, tzFormat;\n var timezones = {\n ' GMT': ' +0000',\n ' EDT': ' -0400',\n ' EST': ' -0500',\n ' CDT': ' -0500',\n ' CST': ' -0600',\n ' MDT': ' -0600',\n ' MST': ' -0700',\n ' PDT': ' -0700',\n ' PST': ' -0800'\n };\n var military = 'YXWVUTSRQPONZABCDEFGHIKLM';\n var timezone, timezoneIndex;\n\n string = config._i\n .replace(/\\([^\\)]*\\)|[\\n\\t]/g, ' ') // Remove comments and folding whitespace\n .replace(/(\\s\\s+)/g, ' ') // Replace multiple-spaces with a single space\n .replace(/^\\s|\\s$/g, ''); // Remove leading and trailing spaces\n match = basicRfcRegex.exec(string);\n\n if (match) {\n dayFormat = match[1] ? 'ddd' + ((match[1].length === 5) ? ', ' : ' ') : '';\n dateFormat = 'D MMM ' + ((match[2].length > 10) ? 'YYYY ' : 'YY ');\n timeFormat = 'HH:mm' + (match[4] ? ':ss' : '');\n\n // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n if (match[1]) { // day of week given\n var momentDate = new Date(match[2]);\n var momentDay = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'][momentDate.getDay()];\n\n if (match[1].substr(0,3) !== momentDay) {\n getParsingFlags(config).weekdayMismatch = true;\n config._isValid = false;\n return;\n }\n }\n\n switch (match[5].length) {\n case 2: // military\n if (timezoneIndex === 0) {\n timezone = ' +0000';\n } else {\n timezoneIndex = military.indexOf(match[5][1].toUpperCase()) - 12;\n timezone = ((timezoneIndex < 0) ? ' -' : ' +') +\n (('' + timezoneIndex).replace(/^-?/, '0')).match(/..$/)[0] + '00';\n }\n break;\n case 4: // Zone\n timezone = timezones[match[5]];\n break;\n default: // UT or +/-9999\n timezone = timezones[' GMT'];\n }\n match[5] = timezone;\n config._i = match.splice(1).join('');\n tzFormat = ' ZZ';\n config._f = dayFormat + dateFormat + timeFormat + tzFormat;\n configFromStringAndFormat(config);\n getParsingFlags(config).rfc2822 = true;\n } else {\n config._isValid = false;\n }\n}\n\n// date from iso format or fallback\nfunction 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\nhooks.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// Pick the first defined of two or three arguments.\nfunction 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\nfunction 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]\nfunction configFromArray (config) {\n var i, date, input = [], currentDate, 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 // 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\nfunction 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// constant that refers to the ISO standard\nhooks.ISO_8601 = function () {};\n\n// constant that refers to the RFC 2822 form\nhooks.RFC_2822 = function () {};\n\n// date from string and format string\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction createLocal (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, false);\n}\n\nvar 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\nvar 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.\nfunction 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?\nfunction min () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isBefore', args);\n}\n\nfunction max () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isAfter', args);\n}\n\nvar now = function () {\n return Date.now ? Date.now() : +(new Date());\n};\n\nvar ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\nfunction isDurationValid(m) {\n for (var key in m) {\n if (!(ordering.indexOf(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\nfunction isValid$1() {\n return this._isValid;\n}\n\nfunction createInvalid$1() {\n return createDuration(NaN);\n}\n\nfunction 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 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\nfunction isDuration (obj) {\n return obj instanceof Duration;\n}\n\nfunction 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\nfunction 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\noffset('Z', ':');\noffset('ZZ', '');\n\n// PARSING\n\naddRegexToken('Z', matchShortOffset);\naddRegexToken('ZZ', matchShortOffset);\naddParseToken(['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']\nvar chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\nfunction 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.\nfunction 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\nfunction 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.\nhooks.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.\nfunction 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\nfunction 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\nfunction setOffsetToUTC (keepLocalTime) {\n return this.utcOffset(0, keepLocalTime);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction isDaylightSavingTime () {\n return (\n this.utcOffset() > this.clone().month(0).utcOffset() ||\n this.utcOffset() > this.clone().month(5).utcOffset()\n );\n}\n\nfunction 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\nfunction isLocal () {\n return this.isValid() ? !this._isUTC : false;\n}\n\nfunction isUtcOffset () {\n return this.isValid() ? this._isUTC : false;\n}\n\nfunction isUtc () {\n return this.isValid() ? this._isUTC && this._offset === 0 : false;\n}\n\n// ASP.NET json date format regex\nvar 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\nvar 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\nfunction 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 : 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\ncreateDuration.fn = Duration.prototype;\ncreateDuration.invalid = createInvalid$1;\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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 (milliseconds) {\n mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n }\n if (days) {\n set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n }\n if (months) {\n setMonth(mom, get(mom, 'Month') + months * isAdding);\n }\n if (updateOffset) {\n hooks.updateOffset(mom, days || months);\n }\n}\n\nvar add = createAdder(1, 'add');\nvar subtract = createAdder(-1, 'subtract');\n\nfunction 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\nfunction 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\nfunction clone () {\n return new Moment(this);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction isSameOrAfter (input, units) {\n return this.isSame(input, units) || this.isAfter(input,units);\n}\n\nfunction isSameOrBefore (input, units) {\n return this.isSame(input, units) || this.isBefore(input,units);\n}\n\nfunction diff (input, units, asFloat) {\n var that,\n zoneDelta,\n delta, 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 if (units === 'year' || units === 'month' || units === 'quarter') {\n output = monthDiff(this, that);\n if (units === 'quarter') {\n output = output / 3;\n } else if (units === 'year') {\n output = output / 12;\n }\n } else {\n delta = this - that;\n output = units === 'second' ? delta / 1e3 : // 1000\n units === 'minute' ? delta / 6e4 : // 1000 * 60\n units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60\n units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst\n units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst\n delta;\n }\n return asFloat ? output : absFloor(output);\n}\n\nfunction 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\nhooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\nhooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\nfunction toString () {\n return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n}\n\nfunction toISOString() {\n if (!this.isValid()) {\n return null;\n }\n var m = this.clone().utc();\n if (m.year() < 0 || m.year() > 9999) {\n return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n }\n if (isFunction(Date.prototype.toISOString)) {\n // native implementation is ~50x faster, use it when we can\n return this.toDate().toISOString();\n }\n return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\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 */\nfunction 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\nfunction 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\nfunction 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\nfunction fromNow (withoutSuffix) {\n return this.from(createLocal(), withoutSuffix);\n}\n\nfunction 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\nfunction 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.\nfunction 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\nvar 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\nfunction localeData () {\n return this._locale;\n}\n\nfunction 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\nfunction 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\nfunction valueOf () {\n return this._d.valueOf() - ((this._offset || 0) * 60000);\n}\n\nfunction unix () {\n return Math.floor(this.valueOf() / 1000);\n}\n\nfunction toDate () {\n return new Date(this.valueOf());\n}\n\nfunction toArray () {\n var m = this;\n return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n}\n\nfunction 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\nfunction toJSON () {\n // new Date(NaN).toJSON() === null\n return this.isValid() ? this.toISOString() : null;\n}\n\nfunction isValid$2 () {\n return isValid(this);\n}\n\nfunction parsingFlags () {\n return extend({}, getParsingFlags(this));\n}\n\nfunction invalidAt () {\n return getParsingFlags(this).overflow;\n}\n\nfunction 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\naddFormatToken(0, ['gg', 2], 0, function () {\n return this.weekYear() % 100;\n});\n\naddFormatToken(0, ['GG', 2], 0, function () {\n return this.isoWeekYear() % 100;\n});\n\nfunction addWeekYearFormatToken (token, getter) {\n addFormatToken(0, [token, token.length], 0, getter);\n}\n\naddWeekYearFormatToken('gggg', 'weekYear');\naddWeekYearFormatToken('ggggg', 'weekYear');\naddWeekYearFormatToken('GGGG', 'isoWeekYear');\naddWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\naddUnitAlias('weekYear', 'gg');\naddUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\naddUnitPriority('weekYear', 1);\naddUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\naddRegexToken('G', matchSigned);\naddRegexToken('g', matchSigned);\naddRegexToken('GG', match1to2, match2);\naddRegexToken('gg', match1to2, match2);\naddRegexToken('GGGG', match1to4, match4);\naddRegexToken('gggg', match1to4, match4);\naddRegexToken('GGGGG', match1to6, match6);\naddRegexToken('ggggg', match1to6, match6);\n\naddWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n week[token.substr(0, 2)] = toInt(input);\n});\n\naddWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n week[token] = hooks.parseTwoDigitYear(input);\n});\n\n// MOMENTS\n\nfunction 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\nfunction getSetISOWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input, this.isoWeek(), this.isoWeekday(), 1, 4);\n}\n\nfunction getISOWeeksInYear () {\n return weeksInYear(this.year(), 1, 4);\n}\n\nfunction getWeeksInYear () {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n}\n\nfunction 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\nfunction 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\naddFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\naddUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\naddUnitPriority('quarter', 7);\n\n// PARSING\n\naddRegexToken('Q', match1);\naddParseToken('Q', function (input, array) {\n array[MONTH] = (toInt(input) - 1) * 3;\n});\n\n// MOMENTS\n\nfunction 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\naddFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\naddUnitAlias('date', 'D');\n\n// PRIOROITY\naddUnitPriority('date', 9);\n\n// PARSING\n\naddRegexToken('D', match1to2);\naddRegexToken('DD', match1to2, match2);\naddRegexToken('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\naddParseToken(['D', 'DD'], DATE);\naddParseToken('Do', function (input, array) {\n array[DATE] = toInt(input.match(match1to2)[0], 10);\n});\n\n// MOMENTS\n\nvar getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\naddFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\naddUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\naddUnitPriority('dayOfYear', 4);\n\n// PARSING\n\naddRegexToken('DDD', match1to3);\naddRegexToken('DDDD', match3);\naddParseToken(['DDD', 'DDDD'], function (input, array, config) {\n config._dayOfYear = toInt(input);\n});\n\n// HELPERS\n\n// MOMENTS\n\nfunction 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\naddFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\naddUnitAlias('minute', 'm');\n\n// PRIORITY\n\naddUnitPriority('minute', 14);\n\n// PARSING\n\naddRegexToken('m', match1to2);\naddRegexToken('mm', match1to2, match2);\naddParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\nvar getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\naddFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\naddUnitAlias('second', 's');\n\n// PRIORITY\n\naddUnitPriority('second', 15);\n\n// PARSING\n\naddRegexToken('s', match1to2);\naddRegexToken('ss', match1to2, match2);\naddParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\nvar getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\naddFormatToken('S', 0, 0, function () {\n return ~~(this.millisecond() / 100);\n});\n\naddFormatToken(0, ['SS', 2], 0, function () {\n return ~~(this.millisecond() / 10);\n});\n\naddFormatToken(0, ['SSS', 3], 0, 'millisecond');\naddFormatToken(0, ['SSSS', 4], 0, function () {\n return this.millisecond() * 10;\n});\naddFormatToken(0, ['SSSSS', 5], 0, function () {\n return this.millisecond() * 100;\n});\naddFormatToken(0, ['SSSSSS', 6], 0, function () {\n return this.millisecond() * 1000;\n});\naddFormatToken(0, ['SSSSSSS', 7], 0, function () {\n return this.millisecond() * 10000;\n});\naddFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n return this.millisecond() * 100000;\n});\naddFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n return this.millisecond() * 1000000;\n});\n\n\n// ALIASES\n\naddUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\naddUnitPriority('millisecond', 16);\n\n// PARSING\n\naddRegexToken('S', match1to3, match1);\naddRegexToken('SS', match1to3, match2);\naddRegexToken('SSS', match1to3, match3);\n\nvar token;\nfor (token = 'SSSS'; token.length <= 9; token += 'S') {\n addRegexToken(token, matchUnsigned);\n}\n\nfunction parseMs(input, array) {\n array[MILLISECOND] = toInt(('0.' + input) * 1000);\n}\n\nfor (token = 'S'; token.length <= 9; token += 'S') {\n addParseToken(token, parseMs);\n}\n// MOMENTS\n\nvar getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\naddFormatToken('z', 0, 0, 'zoneAbbr');\naddFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\nfunction getZoneAbbr () {\n return this._isUTC ? 'UTC' : '';\n}\n\nfunction getZoneName () {\n return this._isUTC ? 'Coordinated Universal Time' : '';\n}\n\nvar proto = Moment.prototype;\n\nproto.add = add;\nproto.calendar = calendar$1;\nproto.clone = clone;\nproto.diff = diff;\nproto.endOf = endOf;\nproto.format = format;\nproto.from = from;\nproto.fromNow = fromNow;\nproto.to = to;\nproto.toNow = toNow;\nproto.get = stringGet;\nproto.invalidAt = invalidAt;\nproto.isAfter = isAfter;\nproto.isBefore = isBefore;\nproto.isBetween = isBetween;\nproto.isSame = isSame;\nproto.isSameOrAfter = isSameOrAfter;\nproto.isSameOrBefore = isSameOrBefore;\nproto.isValid = isValid$2;\nproto.lang = lang;\nproto.locale = locale;\nproto.localeData = localeData;\nproto.max = prototypeMax;\nproto.min = prototypeMin;\nproto.parsingFlags = parsingFlags;\nproto.set = stringSet;\nproto.startOf = startOf;\nproto.subtract = subtract;\nproto.toArray = toArray;\nproto.toObject = toObject;\nproto.toDate = toDate;\nproto.toISOString = toISOString;\nproto.inspect = inspect;\nproto.toJSON = toJSON;\nproto.toString = toString;\nproto.unix = unix;\nproto.valueOf = valueOf;\nproto.creationData = creationData;\n\n// Year\nproto.year = getSetYear;\nproto.isLeapYear = getIsLeapYear;\n\n// Week Year\nproto.weekYear = getSetWeekYear;\nproto.isoWeekYear = getSetISOWeekYear;\n\n// Quarter\nproto.quarter = proto.quarters = getSetQuarter;\n\n// Month\nproto.month = getSetMonth;\nproto.daysInMonth = getDaysInMonth;\n\n// Week\nproto.week = proto.weeks = getSetWeek;\nproto.isoWeek = proto.isoWeeks = getSetISOWeek;\nproto.weeksInYear = getWeeksInYear;\nproto.isoWeeksInYear = getISOWeeksInYear;\n\n// Day\nproto.date = getSetDayOfMonth;\nproto.day = proto.days = getSetDayOfWeek;\nproto.weekday = getSetLocaleDayOfWeek;\nproto.isoWeekday = getSetISODayOfWeek;\nproto.dayOfYear = getSetDayOfYear;\n\n// Hour\nproto.hour = proto.hours = getSetHour;\n\n// Minute\nproto.minute = proto.minutes = getSetMinute;\n\n// Second\nproto.second = proto.seconds = getSetSecond;\n\n// Millisecond\nproto.millisecond = proto.milliseconds = getSetMillisecond;\n\n// Offset\nproto.utcOffset = getSetOffset;\nproto.utc = setOffsetToUTC;\nproto.local = setOffsetToLocal;\nproto.parseZone = setOffsetToParsedOffset;\nproto.hasAlignedHourOffset = hasAlignedHourOffset;\nproto.isDST = isDaylightSavingTime;\nproto.isLocal = isLocal;\nproto.isUtcOffset = isUtcOffset;\nproto.isUtc = isUtc;\nproto.isUTC = isUtc;\n\n// Timezone\nproto.zoneAbbr = getZoneAbbr;\nproto.zoneName = getZoneName;\n\n// Deprecations\nproto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\nproto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\nproto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\nproto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\nproto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\nfunction createUnix (input) {\n return createLocal(input * 1000);\n}\n\nfunction createInZone () {\n return createLocal.apply(null, arguments).parseZone();\n}\n\nfunction preParsePostFormat (string) {\n return string;\n}\n\nvar proto$1 = Locale.prototype;\n\nproto$1.calendar = calendar;\nproto$1.longDateFormat = longDateFormat;\nproto$1.invalidDate = invalidDate;\nproto$1.ordinal = ordinal;\nproto$1.preparse = preParsePostFormat;\nproto$1.postformat = preParsePostFormat;\nproto$1.relativeTime = relativeTime;\nproto$1.pastFuture = pastFuture;\nproto$1.set = set;\n\n// Month\nproto$1.months = localeMonths;\nproto$1.monthsShort = localeMonthsShort;\nproto$1.monthsParse = localeMonthsParse;\nproto$1.monthsRegex = monthsRegex;\nproto$1.monthsShortRegex = monthsShortRegex;\n\n// Week\nproto$1.week = localeWeek;\nproto$1.firstDayOfYear = localeFirstDayOfYear;\nproto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n// Day of Week\nproto$1.weekdays = localeWeekdays;\nproto$1.weekdaysMin = localeWeekdaysMin;\nproto$1.weekdaysShort = localeWeekdaysShort;\nproto$1.weekdaysParse = localeWeekdaysParse;\n\nproto$1.weekdaysRegex = weekdaysRegex;\nproto$1.weekdaysShortRegex = weekdaysShortRegex;\nproto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n// Hours\nproto$1.isPM = localeIsPM;\nproto$1.meridiem = localeMeridiem;\n\nfunction 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\nfunction 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)\nfunction 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\nfunction listMonths (format, index) {\n return listMonthsImpl(format, index, 'months');\n}\n\nfunction listMonthsShort (format, index) {\n return listMonthsImpl(format, index, 'monthsShort');\n}\n\nfunction listWeekdays (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n}\n\nfunction listWeekdaysShort (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n}\n\nfunction listWeekdaysMin (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n}\n\ngetSetGlobalLocale('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\nhooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\nhooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\nvar mathAbs = Math.abs;\n\nfunction 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\nfunction 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)\nfunction 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)\nfunction subtract$1 (input, value) {\n return addSubtract$1(this, input, value, -1);\n}\n\nfunction absCeil (number) {\n if (number < 0) {\n return Math.floor(number);\n } else {\n return Math.ceil(number);\n }\n}\n\nfunction 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\nfunction 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\nfunction monthsToDays (months) {\n // the reverse of daysToMonths\n return months * 146097 / 4800;\n}\n\nfunction 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')?\nfunction 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\nfunction makeAs (alias) {\n return function () {\n return this.as(alias);\n };\n}\n\nvar asMilliseconds = makeAs('ms');\nvar asSeconds = makeAs('s');\nvar asMinutes = makeAs('m');\nvar asHours = makeAs('h');\nvar asDays = makeAs('d');\nvar asWeeks = makeAs('w');\nvar asMonths = makeAs('M');\nvar asYears = makeAs('y');\n\nfunction get$2 (units) {\n units = normalizeUnits(units);\n return this.isValid() ? this[units + 's']() : NaN;\n}\n\nfunction makeGetter(name) {\n return function () {\n return this.isValid() ? this._data[name] : NaN;\n };\n}\n\nvar milliseconds = makeGetter('milliseconds');\nvar seconds = makeGetter('seconds');\nvar minutes = makeGetter('minutes');\nvar hours = makeGetter('hours');\nvar days = makeGetter('days');\nvar months = makeGetter('months');\nvar years = makeGetter('years');\n\nfunction weeks () {\n return absFloor(this.days() / 7);\n}\n\nvar round = Math.round;\nvar 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\nfunction substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nvar abs$1 = Math.abs;\n\nfunction 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;\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 return (total < 0 ? '-' : '') +\n 'P' +\n (Y ? Y + 'Y' : '') +\n (M ? M + 'M' : '') +\n (D ? D + 'D' : '') +\n ((h || m || s) ? 'T' : '') +\n (h ? h + 'H' : '') +\n (m ? m + 'M' : '') +\n (s ? s + 'S' : '');\n}\n\nvar proto$2 = Duration.prototype;\n\nproto$2.isValid = isValid$1;\nproto$2.abs = abs;\nproto$2.add = add$1;\nproto$2.subtract = subtract$1;\nproto$2.as = as;\nproto$2.asMilliseconds = asMilliseconds;\nproto$2.asSeconds = asSeconds;\nproto$2.asMinutes = asMinutes;\nproto$2.asHours = asHours;\nproto$2.asDays = asDays;\nproto$2.asWeeks = asWeeks;\nproto$2.asMonths = asMonths;\nproto$2.asYears = asYears;\nproto$2.valueOf = valueOf$1;\nproto$2._bubble = bubble;\nproto$2.get = get$2;\nproto$2.milliseconds = milliseconds;\nproto$2.seconds = seconds;\nproto$2.minutes = minutes;\nproto$2.hours = hours;\nproto$2.days = days;\nproto$2.weeks = weeks;\nproto$2.months = months;\nproto$2.years = years;\nproto$2.humanize = humanize;\nproto$2.toISOString = toISOString$1;\nproto$2.toString = toISOString$1;\nproto$2.toJSON = toISOString$1;\nproto$2.locale = locale;\nproto$2.localeData = localeData;\n\n// Deprecations\nproto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\nproto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\naddFormatToken('X', 0, 0, 'unix');\naddFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\naddRegexToken('x', matchSigned);\naddRegexToken('X', matchTimestamp);\naddParseToken('X', function (input, array, config) {\n config._d = new Date(parseFloat(input, 10) * 1000);\n});\naddParseToken('x', function (input, array, config) {\n config._d = new Date(toInt(input));\n});\n\n// Side effect imports\n\n\nhooks.version = '2.18.1';\n\nsetHookCallback(createLocal);\n\nhooks.fn = proto;\nhooks.min = min;\nhooks.max = max;\nhooks.now = now;\nhooks.utc = createUTC;\nhooks.unix = createUnix;\nhooks.months = listMonths;\nhooks.isDate = isDate;\nhooks.locale = getSetGlobalLocale;\nhooks.invalid = createInvalid;\nhooks.duration = createDuration;\nhooks.isMoment = isMoment;\nhooks.weekdays = listWeekdays;\nhooks.parseZone = createInZone;\nhooks.localeData = getLocale;\nhooks.isDuration = isDuration;\nhooks.monthsShort = listMonthsShort;\nhooks.weekdaysMin = listWeekdaysMin;\nhooks.defineLocale = defineLocale;\nhooks.updateLocale = updateLocale;\nhooks.locales = listLocales;\nhooks.weekdaysShort = listWeekdaysShort;\nhooks.normalizeUnits = normalizeUnits;\nhooks.relativeTimeRounding = getSetRelativeTimeRounding;\nhooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\nhooks.calendarFormat = getCalendarFormat;\nhooks.prototype = proto;\n\nreturn hooks;\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","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.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};","/*\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","/*\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 = /(\\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.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['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*/\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 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","/*\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 ')?\\\\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*([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*' +\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*(?:([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\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 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 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 '(?:ago|before|earlier)(?=(?:\\\\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 '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 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['ENTimeAgoFormatParser'] = 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;\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\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\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');\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};","/*\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","/*\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","/*\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","/*\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// Load fr localization data from moment\nrequire('moment/locale/fr');\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","/*\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","/*\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');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/JP'); \nvar PATTERN = /(?:(同|((昭和|平成)?([0-90-9]{2,4})))年\\s*)?([0-90-9]{1,2})月\\s*([0-90-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 = 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{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;\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","/*\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;\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","\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.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 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}","/*\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 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 var tmp = toResult;\n toResult = fromResult;\n fromResult = tmp;\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\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 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 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 \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","/*\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 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 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","/*\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 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}","\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 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","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","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, '[ -]') + ')';","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","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","\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);","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"]}
|
|
1
|
+
{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/moment/locale/fr.js","node_modules/moment/moment.js","src/chrono.js","src/options.js","src/parsers/de/DECasualDateParser.js","src/parsers/de/DEDeadlineFormatParser.js","src/parsers/de/DEMonthNameLittleEndianParser.js","src/parsers/de/DEMonthNameParser.js","src/parsers/de/DESlashDateFormatParser.js","src/parsers/de/DETimeAgoFormatParser.js","src/parsers/de/DETimeExpressionParser.js","src/parsers/de/DEWeekdayParser.js","src/parsers/en/ENCasualDateParser.js","src/parsers/en/ENCasualTimeParser.js","src/parsers/en/ENDeadlineFormatParser.js","src/parsers/en/ENISOFormatParser.js","src/parsers/en/ENMonthNameLittleEndianParser.js","src/parsers/en/ENMonthNameMiddleEndianParser.js","src/parsers/en/ENMonthNameParser.js","src/parsers/en/ENRelativeDateFormatParser.js","src/parsers/en/ENSlashDateFormatParser.js","src/parsers/en/ENSlashDateFormatStartWithYearParser.js","src/parsers/en/ENSlashMonthFormatParser.js","src/parsers/en/ENTimeAgoFormatParser.js","src/parsers/en/ENTimeExpressionParser.js","src/parsers/en/ENTimeLaterFormatParser.js","src/parsers/en/ENWeekdayParser.js","src/parsers/es/ESCasualDateParser.js","src/parsers/es/ESDeadlineFormatParser.js","src/parsers/es/ESMonthNameLittleEndianParser.js","src/parsers/es/ESSlashDateFormatParser.js","src/parsers/es/ESTimeAgoFormatParser.js","src/parsers/es/ESTimeExpressionParser.js","src/parsers/es/ESWeekdayParser.js","src/parsers/fr/FRCasualDateParser.js","src/parsers/fr/FRDeadlineFormatParser.js","src/parsers/fr/FRMonthNameLittleEndianParser.js","src/parsers/fr/FRRelativeDateFormatParser.js","src/parsers/fr/FRSlashDateFormatParser.js","src/parsers/fr/FRTimeAgoFormatParser.js","src/parsers/fr/FRTimeExpressionParser.js","src/parsers/fr/FRWeekdayParser.js","src/parsers/ja/JPCasualDateParser.js","src/parsers/ja/JPStandardParser.js","src/parsers/parser.js","src/parsers/zh-Hant/ZHHantCasualDateParser.js","src/parsers/zh-Hant/ZHHantDateParser.js","src/parsers/zh-Hant/ZHHantDeadlineFormatParser.js","src/parsers/zh-Hant/ZHHantTimeExpressionParser.js","src/parsers/zh-Hant/ZHHantWeekdayParser.js","src/refiners/ExtractTimezoneAbbrRefiner.js","src/refiners/ExtractTimezoneOffsetRefiner.js","src/refiners/ForwardDateRefiner.js","src/refiners/OverlapRemovalRefiner.js","src/refiners/UnlikelyFormatFilter.js","src/refiners/de/DEMergeDateRangeRefiner.js","src/refiners/de/DEMergeDateTimeRefiner.js","src/refiners/en/ENMergeDateRangeRefiner.js","src/refiners/en/ENMergeDateTimeRefiner.js","src/refiners/en/ENPrioritizeSpecificDateRefiner.js","src/refiners/fr/FRMergeDateRangeRefiner.js","src/refiners/fr/FRMergeDateTimeRefiner.js","src/refiners/ja/JPMergeDateRangeRefiner.js","src/refiners/refiner.js","src/result.js","src/utils/DE.js","src/utils/EN.js","src/utils/ES.js","src/utils/FR.js","src/utils/JP.js","src/utils/ZH-Hant.js"],"names":["global","factory","exports","module","require","define","amd","moment","this","defineLocale","months","split","monthsShort","monthsParseExact","weekdays","weekdaysShort","weekdaysMin","weekdaysParseExact","longDateFormat","LT","LTS","L","LL","LLL","LLLL","calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","relativeTime","future","past","s","ss","m","mm","h","hh","d","dd","M","MM","y","yy","dayOfMonthOrdinalParse","ordinal","number","period","week","dow","doy","hooks","hookCallback","apply","arguments","isArray","input","Array","Object","prototype","toString","call","isObject","isObjectEmpty","obj","getOwnPropertyNames","length","k","hasOwnProperty","isUndefined","isNumber","isDate","Date","map","arr","fn","i","res","push","hasOwnProp","a","b","extend","valueOf","createUTC","format","locale","strict","createLocalOrUTC","utc","defaultParsingFlags","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","parsedDateParts","meridiem","rfc2822","weekdayMismatch","getParsingFlags","_pf","isValid","_isValid","flags","parsedParts","some","isNowValid","isNaN","_d","getTime","invalidWeekday","_strict","undefined","bigHour","isFrozen","createInvalid","NaN","copyConfig","to","from","prop","val","_isAMomentObject","_i","_f","_l","_tzm","_isUTC","_offset","_locale","momentProperties","Moment","config","updateInProgress","updateOffset","isMoment","absFloor","Math","ceil","floor","toInt","argumentForCoercion","coercedNumber","value","isFinite","compareArrays","array1","array2","dontConvert","len","min","lengthDiff","abs","diffs","warn","msg","suppressDeprecationWarnings","console","deprecate","firstTime","deprecationHandler","arg","args","key","slice","join","Error","stack","deprecateSimple","name","deprecations","isFunction","Function","set","_config","_dayOfMonthOrdinalParseLenient","RegExp","_dayOfMonthOrdinalParse","source","_ordinalParse","mergeConfigs","parentConfig","childConfig","Locale","mom","now","output","_calendar","_longDateFormat","formatUpper","toUpperCase","replace","invalidDate","_invalidDate","_ordinal","withoutSuffix","string","isFuture","_relativeTime","pastFuture","diff","addUnitAlias","unit","shorthand","lowerCase","toLowerCase","aliases","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","addUnitPriority","priority","priorities","getPrioritizedUnits","unitsObj","u","sort","zeroFill","targetLength","forceSign","absNumber","zerosToFill","pow","max","substr","addFormatToken","token","padded","callback","func","formatTokenFunctions","localeData","removeFormattingTokens","match","makeFormatFunction","array","formattingTokens","formatMoment","expandFormat","formatFunctions","replaceLongDateFormatTokens","localFormattingTokens","lastIndex","test","addRegexToken","regex","strictRegex","regexes","isStrict","getParseRegexForToken","unescapeFormat","regexEscape","matched","p1","p2","p3","p4","addParseToken","tokens","addWeekParseToken","_w","addTimeToArrayFromToken","_a","daysInYear","year","isLeapYear","getIsLeapYear","makeGetSet","keepTime","set$1","get","month","date","daysInMonth","stringGet","stringSet","prioritized","mod","n","x","modMonth","localeMonths","_months","isFormat","MONTHS_IN_FORMAT","localeMonthsShort","_monthsShort","handleStrictParse","monthName","ii","llc","toLocaleLowerCase","_monthsParse","_longMonthsParse","_shortMonthsParse","indexOf","localeMonthsParse","_monthsParseExact","setMonth","dayOfMonth","monthsParse","getSetMonth","getDaysInMonth","monthsShortRegex","computeMonthsParse","_monthsShortStrictRegex","_monthsShortRegex","defaultMonthsShortRegex","monthsRegex","_monthsStrictRegex","_monthsRegex","defaultMonthsRegex","cmpLenRev","shortPieces","longPieces","mixedPieces","createDate","ms","getFullYear","setFullYear","createUTCDate","UTC","getUTCFullYear","setUTCFullYear","firstWeekOffset","fwd","getUTCDay","dayOfYearFromWeeks","weekday","resYear","resDayOfYear","localWeekday","weekOffset","dayOfYear","weekOfYear","resWeek","weeksInYear","weekOffsetNext","localeWeek","_week","localeFirstDayOfWeek","localeFirstDayOfYear","getSetWeek","add","getSetISOWeek","parseWeekday","weekdaysParse","parseInt","parseIsoWeekday","localeWeekdays","_weekdays","day","localeWeekdaysShort","_weekdaysShort","localeWeekdaysMin","_weekdaysMin","handleStrictParse$1","weekdayName","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","localeWeekdaysParse","_weekdaysParseExact","_fullWeekdaysParse","getSetDayOfWeek","getDay","getSetLocaleDayOfWeek","getSetISODayOfWeek","weekdaysRegex","computeWeekdaysParse","_weekdaysStrictRegex","_weekdaysRegex","defaultWeekdaysRegex","weekdaysShortRegex","_weekdaysShortStrictRegex","_weekdaysShortRegex","defaultWeekdaysShortRegex","weekdaysMinRegex","_weekdaysMinStrictRegex","_weekdaysMinRegex","defaultWeekdaysMinRegex","minp","shortp","longp","minPieces","hFormat","hours","kFormat","lowercase","minutes","matchMeridiem","_meridiemParse","localeIsPM","charAt","localeMeridiem","isLower","normalizeLocale","chooseLocale","names","j","next","loadLocale","globalLocale","oldLocale","locales","_abbr","getSetGlobalLocale","e","values","data","getLocale","baseConfig","abbr","parentLocale","localeFamilies","forEach","updateLocale","tmpLocale","listLocales","keys","checkOverflow","MONTH","DATE","YEAR","HOUR","MINUTE","SECOND","MILLISECOND","_overflowDayOfYear","_overflowWeeks","WEEK","_overflowWeekday","WEEKDAY","defaults","c","currentDateArray","nowValue","_useUTC","getUTCMonth","getUTCDate","getMonth","getDate","configFromArray","currentDate","expectedWeekday","yearToUse","dayOfYearFromWeekInfo","_dayOfYear","_nextDay","setUTCMinutes","getUTCMinutes","w","weekYear","temp","weekdayOverflow","GG","W","E","createLocal","curWeek","gg","configFromISO","l","allowTime","dateFormat","timeFormat","tzFormat","extendedIsoRegex","exec","basicIsoRegex","isoDates","isoTimes","tzRegex","configFromStringAndFormat","extractFromRFC2822Strings","yearStr","monthStr","dayStr","hourStr","minuteStr","secondStr","result","untruncateYear","defaultLocaleMonthsShort","preprocessRFC2822","trim","checkWeekday","weekdayStr","parsedInput","defaultLocaleWeekdaysShort","calculateOffset","obsOffset","militaryOffset","numOffset","obsOffsets","hm","configFromRFC2822","parsedArray","configFromString","aspNetJsonRegex","createFromInputFallback","ISO_8601","RFC_2822","skipped","stringLength","totalParsedInputLength","_meridiem","meridiemFixWrap","hour","isPm","meridiemHour","isPM","configFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","score","configFromObject","minute","second","millisecond","createFromConfig","prepareConfig","preparse","configFromInput","isUTC","pickBy","moments","isDurationValid","ordering","unitHasDecimal","parseFloat","isValid$1","createInvalid$1","createDuration","Duration","duration","years","quarters","quarter","weeks","days","seconds","milliseconds","_milliseconds","_days","_data","_bubble","isDuration","absRound","round","offset","separator","utcOffset","sign","offsetFromString","matcher","matches","chunk","parts","chunkOffset","cloneWithOffset","model","clone","setTime","local","getDateOffset","getTimezoneOffset","getSetOffset","keepLocalTime","keepMinutes","localAdjust","matchShortOffset","_changeInProgress","addSubtract","getSetZone","setOffsetToUTC","setOffsetToLocal","subtract","setOffsetToParsedOffset","tZone","matchOffset","hasAlignedHourOffset","isDaylightSavingTime","isDaylightSavingTimeShifted","_isDSTShifted","other","toArray","isLocal","isUtcOffset","isUtc","ret","diffRes","aspNetRegex","isoRegex","parseIso","momentsDifference","inp","positiveMomentsDifference","base","isAfter","isBefore","createAdder","direction","dur","tmp","isAdding","getCalendarFormat","myMoment","calendar$1","time","formats","sod","startOf","calendarFormat","localInput","endOf","isBetween","inclusivity","isSame","inputMs","isSameOrAfter","isSameOrBefore","asFloat","that","zoneDelta","monthDiff","anchor2","adjust","wholeMonthDiff","anchor","toISOString","keepOffset","toDate","inspect","zone","prefix","suffix","inputString","defaultFormatUtc","defaultFormat","postformat","humanize","fromNow","toNow","newLocaleData","isoWeekday","unix","toObject","toJSON","isValid$2","parsingFlags","invalidAt","creationData","addWeekYearFormatToken","getter","getSetWeekYear","getSetWeekYearHelper","getSetISOWeekYear","isoWeek","getISOWeeksInYear","getWeeksInYear","weekInfo","weeksTarget","setWeekAll","dayOfYearData","getSetQuarter","getSetDayOfYear","parseMs","getZoneAbbr","getZoneName","createUnix","createInZone","parseZone","preParsePostFormat","get$1","index","field","setter","listMonthsImpl","out","listWeekdaysImpl","localeSorted","shift","listMonths","listMonthsShort","listWeekdays","listWeekdaysShort","listWeekdaysMin","mathAbs","addSubtract$1","add$1","subtract$1","absCeil","bubble","monthsFromDays","monthsToDays","daysToMonths","as","valueOf$1","makeAs","alias","clone$1","get$2","makeGetter","substituteTimeAgo","relativeTime$1","posNegDuration","thresholds","getSetRelativeTimeRounding","roundingFunction","getSetRelativeTimeThreshold","threshold","limit","withSuffix","toISOString$1","abs$1","Y","D","toFixed","total","asSeconds","totalSign","ymSign","daysSign","hmsSign","fun","t","defaultCalendar","defaultLongDateFormat","defaultDayOfMonthOrdinalParse","defaultRelativeTime","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchTimestamp","matchWord","parseTwoDigitYear","getSetYear","o","defaultLocaleMonths","defaultLocaleWeek","defaultLocaleWeekdays","defaultLocaleWeekdaysMin","kInput","_isPm","pos","pos1","pos2","defaultLocaleMeridiemParse","getSetHour","meridiemParse","UT","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","prototypeMin","prototypeMax","invalid","lang","isoWeekYear","getSetDayOfMonth","getSetMinute","getSetSecond","getSetMillisecond","proto","isoWeeks","isoWeeksInYear","isDST","zoneAbbr","zoneName","dates","isDSTShifted","proto$1","firstDayOfYear","firstDayOfWeek","langData","asMilliseconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","proto$2","toIsoString","version","relativeTimeRounding","relativeTimeThreshold","HTML5_FMT","DATETIME_LOCAL","DATETIME_LOCAL_SECONDS","DATETIME_LOCAL_MS","TIME","TIME_SECONDS","TIME_MS","options","parser","refiner","Parser","Refiner","Filter","ParsedResult","ParsedComponents","Chrono","option","casualOption","parsers","refiners","parse","text","refDate","opt","forwardDate","allResults","results","execute","concat","refine","parseDate","start","strictOption","casual","en","mergeOptions","commonPostProcessing","en_GB","de","es","fr","ja","addedTypes","mergedOption","p","constructor","r","ExtractTimezoneOffsetRefiner","ExtractTimezoneAbbrRefiner","UnlikelyFormatFilter","strictConfig","zh","DEDeadlineFormatParser","DEMonthNameLittleEndianParser","DEMonthNameParser","DESlashDateFormatParser","DETimeAgoFormatParser","DETimeExpressionParser","OverlapRemovalRefiner","ForwardDateRefiner","DEMergeDateTimeRefiner","DEMergeDateRangeRefiner","unshift","DECasualDateParser","DEWeekdayParser","ENISOFormatParser","ENDeadlineFormatParser","ENMonthNameLittleEndianParser","ENMonthNameMiddleEndianParser","ENMonthNameParser","ENSlashDateFormatParser","ENSlashDateFormatStartWithYearParser","ENSlashMonthFormatParser","ENTimeAgoFormatParser","ENTimeLaterFormatParser","ENTimeExpressionParser","ENMergeDateTimeRefiner","ENMergeDateRangeRefiner","ENPrioritizeSpecificDateRefiner","ENCasualDateParser","ENCasualTimeParser","ENWeekdayParser","ENRelativeDateFormatParser","littleEndian","JPStandardParser","JPMergeDateRangeRefiner","JPCasualDateParser","ESTimeAgoFormatParser","ESDeadlineFormatParser","ESTimeExpressionParser","ESMonthNameLittleEndianParser","ESSlashDateFormatParser","ESCasualDateParser","ESWeekdayParser","FRDeadlineFormatParser","FRMonthNameLittleEndianParser","FRSlashDateFormatParser","FRTimeAgoFormatParser","FRTimeExpressionParser","FRMergeDateRangeRefiner","FRMergeDateTimeRefiner","FRCasualDateParser","FRWeekdayParser","FRRelativeDateFormatParser","ZHHantDateParser","ZHHantWeekdayParser","ZHHantTimeExpressionParser","ZHHantCasualDateParser","ZHHantDeadlineFormatParser","PATTERN","pattern","extract","ref","refMoment","startMoment","lowerText","imply","secondMatch","assign","tags","util","INTEGER_WORDS_PATTERN","STRICT_PATTERN","isStrictMode","num","INTEGER_WORDS","WEEKDAY_GROUP","DATE_GROUP","DATE_TO_GROUP","MONTH_NAME_GROUP","YEAR_GROUP","YEAR_BE_GROUP","MONTH_OFFSET","nextYear","lastYear","WEEKDAY_OFFSET","end","YEAR_GROUP2","YEAR_BE_GROUP2","DAYS_OFFSET","sonntag","so","montag","mo","dienstag","di","mittwoch","mi","donnerstag","do","freitag","samstag","sa","OPENNING_GROUP","ENDING_GROUP","DAY_GROUP","MONTH_GROUP","argument","FIRST_REG_PATTERN","SECOND_REG_PATTERN","HOUR_GROUP","MINUTE_GROUP","SECOND_GROUP","AM_PM_HOUR_GROUP","substring","ampm","isCertain","PREFIX_GROUP","POSTFIX_GROUP","dayOfWeek","postfix","refOffset","norm","TIME_MATCH","YEAR_NUMBER_GROUP","MONTH_NUMBER_GROUP","DATE_NUMBER_GROUP","HOUR_NUMBER_GROUP","MINUTE_NUMBER_GROUP","SECOND_NUMBER_GROUP","MILLISECOND_NUMBER_GROUP","TZD_HOUR_OFFSET_GROUP","TZD_MINUTE_OFFSET_GROUP","minuteOffset","hourOffset","ORDINAL_WORDS_PATTERN","MONTH_PATTERN","DATE_NUM_GROUP","DATE_TO_NUM_GROUP","ORDINAL_WORDS","endDate","yearBE","MODIFIER_WORD_GROUP","MULTIPLIER_WORD_GROUP","RELATIVE_WORD_GROUP","modifier","sunday","sun","monday","mon","tuesday","wednesday","wed","thursday","thur","friday","fri","saturday","sat","FIRST_NUMBERS_GROUP","SECOND_NUMBERS_GROUP","tday","TIME_UNIT_PATTERN","TIME_UNIT_STRICT_PATTERN","fragments","extractDateTimeUnitFragments","MILLI_SECOND_GROUP","preamble","tues","tue","thurs","thu","updateParsedComponent","startMomentFixed","firstMatch","domingo","dom","lunes","lun","martes","mar","miercoles","miércoles","mie","jueves","jue","viernes","vier","sábado","sabado","sab","originalLocale","MULTIPLIER_GROUP","MODIFIER_1_GROUP","MODIFIER_2_GROUP","multiplier","modifierFactor","dateFrom","dateTo","relative","dateTmp","dimanche","dim","lundi","mardi","mercredi","mer","jeudi","jeu","vendredi","ven","samedi","sam","ERA_GROUP","toHankaku","strictMode","remainingText","hasPossibleDates","NOW_GROUP","DAY_GROUP_1","TIME_GROUP_1","TIME_GROUP_2","DAY_GROUP_3","TIME_GROUP_3","day1","time1","timeString2","time2","day3","timeString3","time3","NUMBER","zhStringToNumber","zhStringToYear","NUMBER_GROUP","UNIT_GROUP","unitAbbr","patternString1","patternString2","ZH_AM_PM_HOUR_GROUP_1","ZH_AM_PM_HOUR_GROUP_2","ZH_AM_PM_HOUR_GROUP_3","ZHTimeExpressionParser","zhAMPMString1","zhAMPM1","zhAMPMString2","zhAMPM2","zhAMPMString3","zhAMPM3","endMoment","TIMEZONE_NAME_PATTERN","DEFAULT_TIMEZONE_ABBR_MAP","ACDT","ACST","ADT","AEDT","AEST","AFT","AKDT","AKST","ALMT","AMST","AMT","ANAST","ANAT","AQTT","ART","AST","AWDT","AWST","AZOST","AZOT","AZST","AZT","BNT","BOT","BRST","BRT","BST","BTT","CAST","CAT","CCT","CEST","CET","CHADT","CHAST","CKT","CLST","CLT","COT","CVT","CXT","ChST","DAVT","EASST","EAST","EAT","ECT","EEST","EET","EGST","EGT","ET","FJST","FJT","FKST","FKT","FNT","GALT","GAMT","GET","GFT","GILT","GST","GYT","HAA","HAC","HADT","HAE","HAP","HAR","HAST","HAT","HAY","HKT","HLV","HNA","HNC","HNE","HNP","HNR","HNT","HNY","HOVT","ICT","IDT","IOT","IRDT","IRKST","IRKT","IRST","IST","JST","KGT","KRAST","KRAT","KST","KUYT","LHDT","LHST","LINT","MAGST","MAGT","MART","MAWT","MESZ","MEZ","MHT","MMT","MSD","MSK","MUT","MVT","MYT","NCT","NDT","NFT","NOVST","NOVT","NPT","NST","NUT","NZDT","NZST","OMSST","OMST","PET","PETST","PETT","PGT","PHOT","PHT","PKT","PMDT","PMST","PONT","PT","PWT","PYST","PYT","RET","SAMT","SAST","SBT","SCT","SGT","SRT","SST","TAHT","TFT","TJT","TKT","TLT","TMT","TVT","ULAT","UYST","UYT","UZT","VET","VLAST","VLAT","VUT","WAST","WAT","WEST","WESZ","WET","WEZ","WFT","WGST","WGT","WIB","WIT","WITA","WST","WT","YAKST","YAKT","YAPT","YEKST","YEKT","timezones","timezoneAbbr","timezoneOffset","TIMEZONE_OFFSET_PATTERN","TIMEZONE_OFFSET_SIGN_GROUP","TIMEZONE_OFFSET_HOUR_OFFSET_GROUP","TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP","filteredResults","prevResult","isAbleToMerge","curResult","mergeResult","dateResult","timeResult","beginDate","beginTime","beginDateTime","mergeDateTimeComponent","endTime","endDateTime","startIndex","endIndex","tag","isDateOnly","isTimeOnly","mergedResult","currResult","result1","result2","begin","isWeekdayResult","fromResult","toResult","knownValues","fromMoment","toMoment","dateComponent","timeComponent","dateTimeComponent","isMoreSpecific","moreSpecific","textBetween","includesRelativeResult","referToSameDate","specificResult","nonSpecificResult","filteredResult","components","impliedValues","JSON","stringify","isPossibleDate","component","dateMoment","currentTimezoneOffset","targetTimezoneOffset","adjustTimezoneOffset","januar","jan","jan.","februar","feb","feb.","märz","maerz","mär","mär.","mrz","mrz.","april","apr","apr.","mai","juni","jun","jun.","juli","jul","jul.","august","aug","aug.","september","sep","sep.","sept","sept.","oktober","okt","okt.","november","nov","nov.","dezember","dez","dez.","eins","zwei","drei","fünf","fuenf","sechs","sieben","acht","neun","zehn","elf","zwölf","zwoelf","collectDateTimeFragment","january","february","march","mar.","may","june","july","october","oct","oct.","december","dec","dec.","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","first","third","fourth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh","twelfth","thirteenth","fourteenth","fifteenth","sixteenth","seventeenth","eighteenth","nineteenth","twentieth","twenty first","twenty second","twenty third","twenty fourth","twenty fifth","twenty sixth","twenty seventh","twenty eighth","twenty ninth","thirtieth","thirty first","TIME_UNIT","TIME_UNIT_STRICT","PATTERN_TIME_UNIT","timeunitText","vie","enero","ene","ene.","febrero","marzo","abril","abr","abr.","mayo","may.","junio","julio","agosto","ago","ago.","septiembre","octubre","noviembre","diciembre","dic","dic.","janvier","février","fév","fév.","fevrier","fev","fev.","mars","avril","avr","avr.","juin","juillet","août","aout","septembre","octobre","novembre","décembre","decembre","un","deux","trois","quatre","cinq","huit","neuf","dix","onze","douze","treize","String","fromCharCode","alphaNum","charCodeAt","toZenkaku","零","一","二","兩","三","四","五","六","七","八","九","十","廿","卅","天","日","char"],"mappings":"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","file":"bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()","//! 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\nvar 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\nreturn fr;\n\n})));\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\nvar hookCallback;\n\nfunction 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.\nfunction setHookCallback (callback) {\n hookCallback = callback;\n}\n\nfunction isArray(input) {\n return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n}\n\nfunction 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\nfunction 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\nfunction isUndefined(input) {\n return input === void 0;\n}\n\nfunction isNumber(input) {\n return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n}\n\nfunction isDate(input) {\n return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n}\n\nfunction 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\nfunction hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\n}\n\nfunction 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\nfunction createUTC (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, true).utc();\n}\n\nfunction 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\nfunction getParsingFlags(m) {\n if (m._pf == null) {\n m._pf = defaultParsingFlags();\n }\n return m._pf;\n}\n\nvar some;\nif (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\nfunction 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\nfunction 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.\nvar momentProperties = hooks.momentProperties = [];\n\nfunction 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\nvar updateInProgress = false;\n\n// Moment prototype object\nfunction 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\nfunction isMoment (obj) {\n return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction warn(msg) {\n if (hooks.suppressDeprecationWarnings === false &&\n (typeof console !== 'undefined') && console.warn) {\n console.warn('Deprecation warning: ' + msg);\n }\n}\n\nfunction 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\nvar deprecations = {};\n\nfunction 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\nhooks.suppressDeprecationWarnings = false;\nhooks.deprecationHandler = null;\n\nfunction isFunction(input) {\n return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n}\n\nfunction 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\nfunction 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\nfunction Locale(config) {\n if (config != null) {\n this.set(config);\n }\n}\n\nvar keys;\n\nif (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\nvar 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\nfunction calendar (key, mom, now) {\n var output = this._calendar[key] || this._calendar['sameElse'];\n return isFunction(output) ? output.call(mom, now) : output;\n}\n\nvar 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\nfunction 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\nvar defaultInvalidDate = 'Invalid date';\n\nfunction invalidDate () {\n return this._invalidDate;\n}\n\nvar defaultOrdinal = '%d';\nvar defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\nfunction ordinal (number) {\n return this._ordinal.replace('%d', number);\n}\n\nvar 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\nfunction 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\nfunction 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\nvar aliases = {};\n\nfunction addUnitAlias (unit, shorthand) {\n var lowerCase = unit.toLowerCase();\n aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n}\n\nfunction normalizeUnits(units) {\n return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n}\n\nfunction 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\nvar priorities = {};\n\nfunction addUnitPriority(unit, priority) {\n priorities[unit] = priority;\n}\n\nfunction 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\nfunction 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\nvar 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\nvar localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\nvar formatFunctions = {};\n\nvar formatTokenFunctions = {};\n\n// token: 'M'\n// padded: ['MM', 2]\n// ordinal: 'Mo'\n// callback: function () { this.month() + 1 }\nfunction 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\nfunction removeFormattingTokens(input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|\\]$/g, '');\n }\n return input.replace(/\\\\/g, '');\n}\n\nfunction 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\nfunction 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\nfunction 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\nvar match1 = /\\d/; // 0 - 9\nvar match2 = /\\d\\d/; // 00 - 99\nvar match3 = /\\d{3}/; // 000 - 999\nvar match4 = /\\d{4}/; // 0000 - 9999\nvar match6 = /[+-]?\\d{6}/; // -999999 - 999999\nvar match1to2 = /\\d\\d?/; // 0 - 99\nvar match3to4 = /\\d\\d\\d\\d?/; // 999 - 9999\nvar match5to6 = /\\d\\d\\d\\d\\d\\d?/; // 99999 - 999999\nvar match1to3 = /\\d{1,3}/; // 0 - 999\nvar match1to4 = /\\d{1,4}/; // 0 - 9999\nvar match1to6 = /[+-]?\\d{1,6}/; // -999999 - 999999\n\nvar matchUnsigned = /\\d+/; // 0 - inf\nvar matchSigned = /[+-]?\\d+/; // -inf - inf\n\nvar matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\nvar matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\nvar 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\nvar 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\nvar regexes = {};\n\nfunction addRegexToken (token, regex, strictRegex) {\n regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n return (isStrict && strictRegex) ? strictRegex : regex;\n };\n}\n\nfunction 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\nfunction unescapeFormat(s) {\n return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n return p1 || p2 || p3 || p4;\n }));\n}\n\nfunction regexEscape(s) {\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nvar tokens = {};\n\nfunction 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\nfunction 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\nfunction addTimeToArrayFromToken(token, input, config) {\n if (input != null && hasOwnProp(tokens, token)) {\n tokens[token](input, config._a, config, token);\n }\n}\n\nvar YEAR = 0;\nvar MONTH = 1;\nvar DATE = 2;\nvar HOUR = 3;\nvar MINUTE = 4;\nvar SECOND = 5;\nvar MILLISECOND = 6;\nvar WEEK = 7;\nvar WEEKDAY = 8;\n\n// FORMATTING\n\naddFormatToken('Y', 0, 0, function () {\n var y = this.year();\n return y <= 9999 ? '' + y : '+' + y;\n});\n\naddFormatToken(0, ['YY', 2], 0, function () {\n return this.year() % 100;\n});\n\naddFormatToken(0, ['YYYY', 4], 0, 'year');\naddFormatToken(0, ['YYYYY', 5], 0, 'year');\naddFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\naddUnitAlias('year', 'y');\n\n// PRIORITIES\n\naddUnitPriority('year', 1);\n\n// PARSING\n\naddRegexToken('Y', matchSigned);\naddRegexToken('YY', match1to2, match2);\naddRegexToken('YYYY', match1to4, match4);\naddRegexToken('YYYYY', match1to6, match6);\naddRegexToken('YYYYYY', match1to6, match6);\n\naddParseToken(['YYYYY', 'YYYYYY'], YEAR);\naddParseToken('YYYY', function (input, array) {\n array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n});\naddParseToken('YY', function (input, array) {\n array[YEAR] = hooks.parseTwoDigitYear(input);\n});\naddParseToken('Y', function (input, array) {\n array[YEAR] = parseInt(input, 10);\n});\n\n// HELPERS\n\nfunction daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n}\n\nfunction isLeapYear(year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n// HOOKS\n\nhooks.parseTwoDigitYear = function (input) {\n return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n};\n\n// MOMENTS\n\nvar getSetYear = makeGetSet('FullYear', true);\n\nfunction getIsLeapYear () {\n return isLeapYear(this.year());\n}\n\nfunction 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\nfunction get (mom, unit) {\n return mom.isValid() ?\n mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n}\n\nfunction 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\nfunction stringGet (units) {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units]();\n }\n return this;\n}\n\n\nfunction 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\nfunction mod(n, x) {\n return ((n % x) + x) % x;\n}\n\nvar indexOf;\n\nif (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\nfunction 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\naddFormatToken('M', ['MM', 2], 'Mo', function () {\n return this.month() + 1;\n});\n\naddFormatToken('MMM', 0, 0, function (format) {\n return this.localeData().monthsShort(this, format);\n});\n\naddFormatToken('MMMM', 0, 0, function (format) {\n return this.localeData().months(this, format);\n});\n\n// ALIASES\n\naddUnitAlias('month', 'M');\n\n// PRIORITY\n\naddUnitPriority('month', 8);\n\n// PARSING\n\naddRegexToken('M', match1to2);\naddRegexToken('MM', match1to2, match2);\naddRegexToken('MMM', function (isStrict, locale) {\n return locale.monthsShortRegex(isStrict);\n});\naddRegexToken('MMMM', function (isStrict, locale) {\n return locale.monthsRegex(isStrict);\n});\n\naddParseToken(['M', 'MM'], function (input, array) {\n array[MONTH] = toInt(input) - 1;\n});\n\naddParseToken(['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\nvar MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\nvar defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\nfunction 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\nvar defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction getDaysInMonth () {\n return daysInMonth(this.year(), this.month());\n}\n\nvar defaultMonthsShortRegex = matchWord;\nfunction 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\nvar defaultMonthsRegex = matchWord;\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\naddFormatToken('w', ['ww', 2], 'wo', 'week');\naddFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\naddUnitAlias('week', 'w');\naddUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\naddUnitPriority('week', 5);\naddUnitPriority('isoWeek', 5);\n\n// PARSING\n\naddRegexToken('w', match1to2);\naddRegexToken('ww', match1to2, match2);\naddRegexToken('W', match1to2);\naddRegexToken('WW', match1to2, match2);\n\naddWeekParseToken(['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\nfunction localeWeek (mom) {\n return weekOfYear(mom, this._week.dow, this._week.doy).week;\n}\n\nvar 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\nfunction localeFirstDayOfWeek () {\n return this._week.dow;\n}\n\nfunction localeFirstDayOfYear () {\n return this._week.doy;\n}\n\n// MOMENTS\n\nfunction getSetWeek (input) {\n var week = this.localeData().week(this);\n return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\nfunction 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\naddFormatToken('d', 0, 'do', 'day');\n\naddFormatToken('dd', 0, 0, function (format) {\n return this.localeData().weekdaysMin(this, format);\n});\n\naddFormatToken('ddd', 0, 0, function (format) {\n return this.localeData().weekdaysShort(this, format);\n});\n\naddFormatToken('dddd', 0, 0, function (format) {\n return this.localeData().weekdays(this, format);\n});\n\naddFormatToken('e', 0, 0, 'weekday');\naddFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\naddUnitAlias('day', 'd');\naddUnitAlias('weekday', 'e');\naddUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\naddUnitPriority('day', 11);\naddUnitPriority('weekday', 11);\naddUnitPriority('isoWeekday', 11);\n\n// PARSING\n\naddRegexToken('d', match1to2);\naddRegexToken('e', match1to2);\naddRegexToken('E', match1to2);\naddRegexToken('dd', function (isStrict, locale) {\n return locale.weekdaysMinRegex(isStrict);\n});\naddRegexToken('ddd', function (isStrict, locale) {\n return locale.weekdaysShortRegex(isStrict);\n});\naddRegexToken('dddd', function (isStrict, locale) {\n return locale.weekdaysRegex(isStrict);\n});\n\naddWeekParseToken(['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\naddWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n week[token] = toInt(input);\n});\n\n// HELPERS\n\nfunction 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\nfunction 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\nvar defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\nfunction 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\nvar defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\nfunction localeWeekdaysShort (m) {\n return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n}\n\nvar defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\nfunction localeWeekdaysMin (m) {\n return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nvar defaultWeekdaysRegex = matchWord;\nfunction 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\nvar defaultWeekdaysShortRegex = matchWord;\nfunction 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\nvar defaultWeekdaysMinRegex = matchWord;\nfunction 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\nfunction 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\nfunction hFormat() {\n return this.hours() % 12 || 12;\n}\n\nfunction kFormat() {\n return this.hours() || 24;\n}\n\naddFormatToken('H', ['HH', 2], 0, 'hour');\naddFormatToken('h', ['hh', 2], 0, hFormat);\naddFormatToken('k', ['kk', 2], 0, kFormat);\n\naddFormatToken('hmm', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('hmmss', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n});\n\naddFormatToken('Hmm', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('Hmmss', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n});\n\nfunction meridiem (token, lowercase) {\n addFormatToken(token, 0, 0, function () {\n return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n });\n}\n\nmeridiem('a', true);\nmeridiem('A', false);\n\n// ALIASES\n\naddUnitAlias('hour', 'h');\n\n// PRIORITY\naddUnitPriority('hour', 13);\n\n// PARSING\n\nfunction matchMeridiem (isStrict, locale) {\n return locale._meridiemParse;\n}\n\naddRegexToken('a', matchMeridiem);\naddRegexToken('A', matchMeridiem);\naddRegexToken('H', match1to2);\naddRegexToken('h', match1to2);\naddRegexToken('k', match1to2);\naddRegexToken('HH', match1to2, match2);\naddRegexToken('hh', match1to2, match2);\naddRegexToken('kk', match1to2, match2);\n\naddRegexToken('hmm', match3to4);\naddRegexToken('hmmss', match5to6);\naddRegexToken('Hmm', match3to4);\naddRegexToken('Hmmss', match5to6);\n\naddParseToken(['H', 'HH'], HOUR);\naddParseToken(['k', 'kk'], function (input, array, config) {\n var kInput = toInt(input);\n array[HOUR] = kInput === 24 ? 0 : kInput;\n});\naddParseToken(['a', 'A'], function (input, array, config) {\n config._isPm = config._locale.isPM(input);\n config._meridiem = input;\n});\naddParseToken(['h', 'hh'], function (input, array, config) {\n array[HOUR] = toInt(input);\n getParsingFlags(config).bigHour = true;\n});\naddParseToken('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});\naddParseToken('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});\naddParseToken('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});\naddParseToken('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\nfunction 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\nvar defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\nfunction 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 he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\nvar getSetHour = makeGetSet('Hours', true);\n\nvar 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\nvar locales = {};\nvar localeFamilies = {};\nvar globalLocale;\n\nfunction 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\nfunction 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\nfunction 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.\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction listLocales() {\n return keys(locales);\n}\n\nfunction 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.\nfunction 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\nfunction 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]\nfunction 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\nfunction 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)\nvar 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)?)?$/;\nvar 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\nvar tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\nvar 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\nvar 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\nvar aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\nfunction 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\nvar 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\nfunction 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\nfunction 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\nfunction 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, ' ').trim();\n}\n\nfunction 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\nvar 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\nfunction 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\nfunction 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\nfunction 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\nhooks.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\nhooks.ISO_8601 = function () {};\n\n// constant that refers to the RFC 2822 form\nhooks.RFC_2822 = function () {};\n\n// date from string and format string\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction createLocal (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, false);\n}\n\nvar 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\nvar 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.\nfunction 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?\nfunction min () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isBefore', args);\n}\n\nfunction max () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isAfter', args);\n}\n\nvar now = function () {\n return Date.now ? Date.now() : +(new Date());\n};\n\nvar ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\nfunction 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\nfunction isValid$1() {\n return this._isValid;\n}\n\nfunction createInvalid$1() {\n return createDuration(NaN);\n}\n\nfunction 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\nfunction isDuration (obj) {\n return obj instanceof Duration;\n}\n\nfunction 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\nfunction 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\noffset('Z', ':');\noffset('ZZ', '');\n\n// PARSING\n\naddRegexToken('Z', matchShortOffset);\naddRegexToken('ZZ', matchShortOffset);\naddParseToken(['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']\nvar chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\nfunction 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.\nfunction 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\nfunction 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.\nhooks.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.\nfunction 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\nfunction 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\nfunction setOffsetToUTC (keepLocalTime) {\n return this.utcOffset(0, keepLocalTime);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction isDaylightSavingTime () {\n return (\n this.utcOffset() > this.clone().month(0).utcOffset() ||\n this.utcOffset() > this.clone().month(5).utcOffset()\n );\n}\n\nfunction 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\nfunction isLocal () {\n return this.isValid() ? !this._isUTC : false;\n}\n\nfunction isUtcOffset () {\n return this.isValid() ? this._isUTC : false;\n}\n\nfunction isUtc () {\n return this.isValid() ? this._isUTC && this._offset === 0 : false;\n}\n\n// ASP.NET json date format regex\nvar 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\nvar 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\nfunction 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\ncreateDuration.fn = Duration.prototype;\ncreateDuration.invalid = createInvalid$1;\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nvar add = createAdder(1, 'add');\nvar subtract = createAdder(-1, 'subtract');\n\nfunction 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\nfunction 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\nfunction clone () {\n return new Moment(this);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction isSameOrAfter (input, units) {\n return this.isSame(input, units) || this.isAfter(input,units);\n}\n\nfunction isSameOrBefore (input, units) {\n return this.isSame(input, units) || this.isBefore(input,units);\n}\n\nfunction 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\nfunction 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\nhooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\nhooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\nfunction toString () {\n return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n}\n\nfunction 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 */\nfunction 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\nfunction 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\nfunction 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\nfunction fromNow (withoutSuffix) {\n return this.from(createLocal(), withoutSuffix);\n}\n\nfunction 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\nfunction 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.\nfunction 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\nvar 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\nfunction localeData () {\n return this._locale;\n}\n\nfunction 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\nfunction 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\nfunction valueOf () {\n return this._d.valueOf() - ((this._offset || 0) * 60000);\n}\n\nfunction unix () {\n return Math.floor(this.valueOf() / 1000);\n}\n\nfunction toDate () {\n return new Date(this.valueOf());\n}\n\nfunction toArray () {\n var m = this;\n return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n}\n\nfunction 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\nfunction toJSON () {\n // new Date(NaN).toJSON() === null\n return this.isValid() ? this.toISOString() : null;\n}\n\nfunction isValid$2 () {\n return isValid(this);\n}\n\nfunction parsingFlags () {\n return extend({}, getParsingFlags(this));\n}\n\nfunction invalidAt () {\n return getParsingFlags(this).overflow;\n}\n\nfunction 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\naddFormatToken(0, ['gg', 2], 0, function () {\n return this.weekYear() % 100;\n});\n\naddFormatToken(0, ['GG', 2], 0, function () {\n return this.isoWeekYear() % 100;\n});\n\nfunction addWeekYearFormatToken (token, getter) {\n addFormatToken(0, [token, token.length], 0, getter);\n}\n\naddWeekYearFormatToken('gggg', 'weekYear');\naddWeekYearFormatToken('ggggg', 'weekYear');\naddWeekYearFormatToken('GGGG', 'isoWeekYear');\naddWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\naddUnitAlias('weekYear', 'gg');\naddUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\naddUnitPriority('weekYear', 1);\naddUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\naddRegexToken('G', matchSigned);\naddRegexToken('g', matchSigned);\naddRegexToken('GG', match1to2, match2);\naddRegexToken('gg', match1to2, match2);\naddRegexToken('GGGG', match1to4, match4);\naddRegexToken('gggg', match1to4, match4);\naddRegexToken('GGGGG', match1to6, match6);\naddRegexToken('ggggg', match1to6, match6);\n\naddWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n week[token.substr(0, 2)] = toInt(input);\n});\n\naddWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n week[token] = hooks.parseTwoDigitYear(input);\n});\n\n// MOMENTS\n\nfunction 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\nfunction getSetISOWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input, this.isoWeek(), this.isoWeekday(), 1, 4);\n}\n\nfunction getISOWeeksInYear () {\n return weeksInYear(this.year(), 1, 4);\n}\n\nfunction getWeeksInYear () {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n}\n\nfunction 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\nfunction 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\naddFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\naddUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\naddUnitPriority('quarter', 7);\n\n// PARSING\n\naddRegexToken('Q', match1);\naddParseToken('Q', function (input, array) {\n array[MONTH] = (toInt(input) - 1) * 3;\n});\n\n// MOMENTS\n\nfunction 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\naddFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\naddUnitAlias('date', 'D');\n\n// PRIOROITY\naddUnitPriority('date', 9);\n\n// PARSING\n\naddRegexToken('D', match1to2);\naddRegexToken('DD', match1to2, match2);\naddRegexToken('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\naddParseToken(['D', 'DD'], DATE);\naddParseToken('Do', function (input, array) {\n array[DATE] = toInt(input.match(match1to2)[0]);\n});\n\n// MOMENTS\n\nvar getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\naddFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\naddUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\naddUnitPriority('dayOfYear', 4);\n\n// PARSING\n\naddRegexToken('DDD', match1to3);\naddRegexToken('DDDD', match3);\naddParseToken(['DDD', 'DDDD'], function (input, array, config) {\n config._dayOfYear = toInt(input);\n});\n\n// HELPERS\n\n// MOMENTS\n\nfunction 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\naddFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\naddUnitAlias('minute', 'm');\n\n// PRIORITY\n\naddUnitPriority('minute', 14);\n\n// PARSING\n\naddRegexToken('m', match1to2);\naddRegexToken('mm', match1to2, match2);\naddParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\nvar getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\naddFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\naddUnitAlias('second', 's');\n\n// PRIORITY\n\naddUnitPriority('second', 15);\n\n// PARSING\n\naddRegexToken('s', match1to2);\naddRegexToken('ss', match1to2, match2);\naddParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\nvar getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\naddFormatToken('S', 0, 0, function () {\n return ~~(this.millisecond() / 100);\n});\n\naddFormatToken(0, ['SS', 2], 0, function () {\n return ~~(this.millisecond() / 10);\n});\n\naddFormatToken(0, ['SSS', 3], 0, 'millisecond');\naddFormatToken(0, ['SSSS', 4], 0, function () {\n return this.millisecond() * 10;\n});\naddFormatToken(0, ['SSSSS', 5], 0, function () {\n return this.millisecond() * 100;\n});\naddFormatToken(0, ['SSSSSS', 6], 0, function () {\n return this.millisecond() * 1000;\n});\naddFormatToken(0, ['SSSSSSS', 7], 0, function () {\n return this.millisecond() * 10000;\n});\naddFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n return this.millisecond() * 100000;\n});\naddFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n return this.millisecond() * 1000000;\n});\n\n\n// ALIASES\n\naddUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\naddUnitPriority('millisecond', 16);\n\n// PARSING\n\naddRegexToken('S', match1to3, match1);\naddRegexToken('SS', match1to3, match2);\naddRegexToken('SSS', match1to3, match3);\n\nvar token;\nfor (token = 'SSSS'; token.length <= 9; token += 'S') {\n addRegexToken(token, matchUnsigned);\n}\n\nfunction parseMs(input, array) {\n array[MILLISECOND] = toInt(('0.' + input) * 1000);\n}\n\nfor (token = 'S'; token.length <= 9; token += 'S') {\n addParseToken(token, parseMs);\n}\n// MOMENTS\n\nvar getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\naddFormatToken('z', 0, 0, 'zoneAbbr');\naddFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\nfunction getZoneAbbr () {\n return this._isUTC ? 'UTC' : '';\n}\n\nfunction getZoneName () {\n return this._isUTC ? 'Coordinated Universal Time' : '';\n}\n\nvar proto = Moment.prototype;\n\nproto.add = add;\nproto.calendar = calendar$1;\nproto.clone = clone;\nproto.diff = diff;\nproto.endOf = endOf;\nproto.format = format;\nproto.from = from;\nproto.fromNow = fromNow;\nproto.to = to;\nproto.toNow = toNow;\nproto.get = stringGet;\nproto.invalidAt = invalidAt;\nproto.isAfter = isAfter;\nproto.isBefore = isBefore;\nproto.isBetween = isBetween;\nproto.isSame = isSame;\nproto.isSameOrAfter = isSameOrAfter;\nproto.isSameOrBefore = isSameOrBefore;\nproto.isValid = isValid$2;\nproto.lang = lang;\nproto.locale = locale;\nproto.localeData = localeData;\nproto.max = prototypeMax;\nproto.min = prototypeMin;\nproto.parsingFlags = parsingFlags;\nproto.set = stringSet;\nproto.startOf = startOf;\nproto.subtract = subtract;\nproto.toArray = toArray;\nproto.toObject = toObject;\nproto.toDate = toDate;\nproto.toISOString = toISOString;\nproto.inspect = inspect;\nproto.toJSON = toJSON;\nproto.toString = toString;\nproto.unix = unix;\nproto.valueOf = valueOf;\nproto.creationData = creationData;\nproto.year = getSetYear;\nproto.isLeapYear = getIsLeapYear;\nproto.weekYear = getSetWeekYear;\nproto.isoWeekYear = getSetISOWeekYear;\nproto.quarter = proto.quarters = getSetQuarter;\nproto.month = getSetMonth;\nproto.daysInMonth = getDaysInMonth;\nproto.week = proto.weeks = getSetWeek;\nproto.isoWeek = proto.isoWeeks = getSetISOWeek;\nproto.weeksInYear = getWeeksInYear;\nproto.isoWeeksInYear = getISOWeeksInYear;\nproto.date = getSetDayOfMonth;\nproto.day = proto.days = getSetDayOfWeek;\nproto.weekday = getSetLocaleDayOfWeek;\nproto.isoWeekday = getSetISODayOfWeek;\nproto.dayOfYear = getSetDayOfYear;\nproto.hour = proto.hours = getSetHour;\nproto.minute = proto.minutes = getSetMinute;\nproto.second = proto.seconds = getSetSecond;\nproto.millisecond = proto.milliseconds = getSetMillisecond;\nproto.utcOffset = getSetOffset;\nproto.utc = setOffsetToUTC;\nproto.local = setOffsetToLocal;\nproto.parseZone = setOffsetToParsedOffset;\nproto.hasAlignedHourOffset = hasAlignedHourOffset;\nproto.isDST = isDaylightSavingTime;\nproto.isLocal = isLocal;\nproto.isUtcOffset = isUtcOffset;\nproto.isUtc = isUtc;\nproto.isUTC = isUtc;\nproto.zoneAbbr = getZoneAbbr;\nproto.zoneName = getZoneName;\nproto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\nproto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\nproto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\nproto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\nproto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\nfunction createUnix (input) {\n return createLocal(input * 1000);\n}\n\nfunction createInZone () {\n return createLocal.apply(null, arguments).parseZone();\n}\n\nfunction preParsePostFormat (string) {\n return string;\n}\n\nvar proto$1 = Locale.prototype;\n\nproto$1.calendar = calendar;\nproto$1.longDateFormat = longDateFormat;\nproto$1.invalidDate = invalidDate;\nproto$1.ordinal = ordinal;\nproto$1.preparse = preParsePostFormat;\nproto$1.postformat = preParsePostFormat;\nproto$1.relativeTime = relativeTime;\nproto$1.pastFuture = pastFuture;\nproto$1.set = set;\n\nproto$1.months = localeMonths;\nproto$1.monthsShort = localeMonthsShort;\nproto$1.monthsParse = localeMonthsParse;\nproto$1.monthsRegex = monthsRegex;\nproto$1.monthsShortRegex = monthsShortRegex;\nproto$1.week = localeWeek;\nproto$1.firstDayOfYear = localeFirstDayOfYear;\nproto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\nproto$1.weekdays = localeWeekdays;\nproto$1.weekdaysMin = localeWeekdaysMin;\nproto$1.weekdaysShort = localeWeekdaysShort;\nproto$1.weekdaysParse = localeWeekdaysParse;\n\nproto$1.weekdaysRegex = weekdaysRegex;\nproto$1.weekdaysShortRegex = weekdaysShortRegex;\nproto$1.weekdaysMinRegex = weekdaysMinRegex;\n\nproto$1.isPM = localeIsPM;\nproto$1.meridiem = localeMeridiem;\n\nfunction 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\nfunction 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)\nfunction 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\nfunction listMonths (format, index) {\n return listMonthsImpl(format, index, 'months');\n}\n\nfunction listMonthsShort (format, index) {\n return listMonthsImpl(format, index, 'monthsShort');\n}\n\nfunction listWeekdays (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n}\n\nfunction listWeekdaysShort (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n}\n\nfunction listWeekdaysMin (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n}\n\ngetSetGlobalLocale('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\nhooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\nhooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\nvar mathAbs = Math.abs;\n\nfunction 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\nfunction 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)\nfunction 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)\nfunction subtract$1 (input, value) {\n return addSubtract$1(this, input, value, -1);\n}\n\nfunction absCeil (number) {\n if (number < 0) {\n return Math.floor(number);\n } else {\n return Math.ceil(number);\n }\n}\n\nfunction 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\nfunction 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\nfunction monthsToDays (months) {\n // the reverse of daysToMonths\n return months * 146097 / 4800;\n}\n\nfunction 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')?\nfunction 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\nfunction makeAs (alias) {\n return function () {\n return this.as(alias);\n };\n}\n\nvar asMilliseconds = makeAs('ms');\nvar asSeconds = makeAs('s');\nvar asMinutes = makeAs('m');\nvar asHours = makeAs('h');\nvar asDays = makeAs('d');\nvar asWeeks = makeAs('w');\nvar asMonths = makeAs('M');\nvar asYears = makeAs('y');\n\nfunction clone$1 () {\n return createDuration(this);\n}\n\nfunction get$2 (units) {\n units = normalizeUnits(units);\n return this.isValid() ? this[units + 's']() : NaN;\n}\n\nfunction makeGetter(name) {\n return function () {\n return this.isValid() ? this._data[name] : NaN;\n };\n}\n\nvar milliseconds = makeGetter('milliseconds');\nvar seconds = makeGetter('seconds');\nvar minutes = makeGetter('minutes');\nvar hours = makeGetter('hours');\nvar days = makeGetter('days');\nvar months = makeGetter('months');\nvar years = makeGetter('years');\n\nfunction weeks () {\n return absFloor(this.days() / 7);\n}\n\nvar round = Math.round;\nvar 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\nfunction substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nvar abs$1 = Math.abs;\n\nfunction sign(x) {\n return ((x > 0) - (x < 0)) || +x;\n}\n\nfunction 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\nvar proto$2 = Duration.prototype;\n\nproto$2.isValid = isValid$1;\nproto$2.abs = abs;\nproto$2.add = add$1;\nproto$2.subtract = subtract$1;\nproto$2.as = as;\nproto$2.asMilliseconds = asMilliseconds;\nproto$2.asSeconds = asSeconds;\nproto$2.asMinutes = asMinutes;\nproto$2.asHours = asHours;\nproto$2.asDays = asDays;\nproto$2.asWeeks = asWeeks;\nproto$2.asMonths = asMonths;\nproto$2.asYears = asYears;\nproto$2.valueOf = valueOf$1;\nproto$2._bubble = bubble;\nproto$2.clone = clone$1;\nproto$2.get = get$2;\nproto$2.milliseconds = milliseconds;\nproto$2.seconds = seconds;\nproto$2.minutes = minutes;\nproto$2.hours = hours;\nproto$2.days = days;\nproto$2.weeks = weeks;\nproto$2.months = months;\nproto$2.years = years;\nproto$2.humanize = humanize;\nproto$2.toISOString = toISOString$1;\nproto$2.toString = toISOString$1;\nproto$2.toJSON = toISOString$1;\nproto$2.locale = locale;\nproto$2.localeData = localeData;\n\nproto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\nproto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\naddFormatToken('X', 0, 0, 'unix');\naddFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\naddRegexToken('x', matchSigned);\naddRegexToken('X', matchTimestamp);\naddParseToken('X', function (input, array, config) {\n config._d = new Date(parseFloat(input, 10) * 1000);\n});\naddParseToken('x', function (input, array, config) {\n config._d = new Date(toInt(input));\n});\n\n// Side effect imports\n\n\nhooks.version = '2.21.0';\n\nsetHookCallback(createLocal);\n\nhooks.fn = proto;\nhooks.min = min;\nhooks.max = max;\nhooks.now = now;\nhooks.utc = createUTC;\nhooks.unix = createUnix;\nhooks.months = listMonths;\nhooks.isDate = isDate;\nhooks.locale = getSetGlobalLocale;\nhooks.invalid = createInvalid;\nhooks.duration = createDuration;\nhooks.isMoment = isMoment;\nhooks.weekdays = listWeekdays;\nhooks.parseZone = createInZone;\nhooks.localeData = getLocale;\nhooks.isDuration = isDuration;\nhooks.monthsShort = listMonthsShort;\nhooks.weekdaysMin = listWeekdaysMin;\nhooks.defineLocale = defineLocale;\nhooks.updateLocale = updateLocale;\nhooks.locales = listLocales;\nhooks.weekdaysShort = listWeekdaysShort;\nhooks.normalizeUnits = normalizeUnits;\nhooks.relativeTimeRounding = getSetRelativeTimeRounding;\nhooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\nhooks.calendarFormat = getCalendarFormat;\nhooks.prototype = proto;\n\n// currently HTML5 input type only supports 24-hour formats\nhooks.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\nreturn hooks;\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 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 opt.forwardDate = opt.forwardDate || opt.forwardDate;\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","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.ENTimeLaterFormatParser(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};","/*\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","/*\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.forwardDate && refOffset > offset ) {\n startMoment.day(offset + 7);\n } else {\n startMoment.day(offset);\n }\n } else {\n if ( opt.forwardDate && refOffset > offset ) {\n startMoment.day(offset + 7);\n } else if (!opt.forwardDate && Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) {\n startMoment.day(offset - 7);\n } else if (!opt.forwardDate && 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 = /(\\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|night))/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 switch (match[TIME_MATCH].toLowerCase()) {\n\n case 'afternoon':\n result.start.imply('meridiem', 1);\n result.start.imply('hour', 15);\n break;\n\n case 'evening':\n case 'night':\n result.start.imply('meridiem', 1);\n result.start.imply('hour', 20);\n break;\n\n case 'morning':\n result.start.imply('meridiem', 0);\n result.start.imply('hour', 6);\n break;\n\n case 'noon':\n result.start.imply('meridiem', 0);\n result.start.imply('hour', 12);\n break;\n }\n \n result.tags['ENCasualTimeParser'] = 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 '(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.imply('year', date.year());\n result.start.imply('month', date.month() + 1);\n result.start.imply('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.imply('hour', date.hour());\n result.start.imply('minute', date.minute());\n result.start.imply('second', date.second());\n result.tags['ENDeadlineFormatParser'] = true;\n return result;\n };\n};\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","/*\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 '(' + util.MONTH_PATTERN + ')' +\n '(?:' +\n '(?:-|\\/|,?\\\\s*)' +\n '((?:' + \n '[1-9][0-9]{0,3}\\\\s*(?:BE|AD|BC)|' +\n '[1-2][0-9]{3}' + \n ')(?![^\\\\s]\\\\d))' +\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;\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 \n if (/BE/i.test(year)) {\n // Buddhist Era\n year = year.replace(/BE/i, '');\n year = parseInt(year) - 543;\n } else if (/BC/i.test(year)){\n // Before Christ\n year = year.replace(/BC/i, '');\n year = -parseInt(year);\n } else if (/AD/i.test(year)){\n year = year.replace(/AD/i, '');\n year = parseInt(year);\n } else {\n year = parseInt(year);\n if (year < 100){\n year = year + 2000;\n }\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 '(' + util.MONTH_PATTERN + ')' +\n '(?:-|\\/|\\\\s*,?\\\\s*)' +\n '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN +')(?!\\\\s*(?:am|pm))\\\\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 '('+ util.MONTH_PATTERN +')' + \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\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 '(this|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 var date = moment(ref);\n\n if (match[MODIFIER_WORD_GROUP].toLowerCase().match(/^this/)) {\n\n if (match[MULTIPLIER_WORD_GROUP]) {\n return null;\n }\n\n if (match[RELATIVE_WORD_GROUP].match(/day|week|month|year/i)) {\n \n // This week\n if (match[RELATIVE_WORD_GROUP].match(/week/i)) {\n date.add(-date.get('d'), 'd');\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 // This month\n else if (match[RELATIVE_WORD_GROUP].match(/month/i)) {\n date.add(-date.date() + 1, 'd');\n result.start.imply('day', date.date());\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n } \n\n // This year\n else if (match[RELATIVE_WORD_GROUP].match(/year/i)) {\n date.add(-date.date() + 1, 'd');\n date.add(-date.month(), 'month');\n\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 \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 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 if (match[YEAR_GROUP]) {\n result.start.assign('year', year);\n } else {\n result.start.imply('year', year);\n }\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;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' \n + '([0-9]{4})[\\\\-\\\\.\\\\/]'\n + '((?:' + util.MONTH_PATTERN + '|[0-9]{1,2}))[\\\\-\\\\.\\\\/]'\n + '([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 var month = match[MONTH_NUMBER_GROUP].toLowerCase();\n month = util.MONTH_OFFSET[month] | month;\n\n result.start.assign('year', parseInt(match[YEAR_NUMBER_GROUP]));\n result.start.assign('month', parseInt(month));\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","var 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.TIME_UNIT_PATTERN + ')' +\n '(?:ago|before|earlier)(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n '(\\\\W|^)' +\n '(?:within\\\\s*)?' +\n '(' + util.TIME_UNIT_STRICT_PATTERN + ')' +\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 var 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 = util.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","/*\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})(?:\\\\.(\\\\d{1,6}))?\" + \n \")?\" + \n \")?\" + \n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?|O\\\\W*CLOCK))?\" + \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})(?:\\\\.(\\\\d{1,6}))?\" + \n \")?\" + \n \")?\" + \n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?|O\\\\W*CLOCK))?\" + \n \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP = 2;\nvar MINUTE_GROUP = 3;\nvar SECOND_GROUP = 4;\nvar MILLI_SECOND_GROUP = 5;\nvar AM_PM_HOUR_GROUP = 6;\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 overlapped 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 // ----- Millisecond\n if(match[MILLI_SECOND_GROUP] != null){ \n var millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));\n if(millisecond >= 1000) return null;\n \n result.start.assign('millisecond', millisecond);\n }\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 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 // ----- Millisecond\n if(match[MILLI_SECOND_GROUP] != null){ \n var millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));\n if(millisecond >= 1000) return null;\n \n result.end.assign('millisecond', millisecond);\n }\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","var moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('' +\n /*match[1]*/ '(\\\\W|^)' +\n /*match[2]*/ '(in )?' +\n /*match[3]*/ '(' + util.TIME_UNIT_PATTERN + ')' +\n /*match[4]*/ '(later|after|from now|henceforth|forward|out)?' +\n /*match[5]*/ '(?=(?:\\\\W|$))',\n'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n /*match[1]*/ '(\\\\W|^)' +\n /*match[2]*/ '(in )?' +\n /*match[3]*/ '(' + util.TIME_UNIT_STRICT_PATTERN + ')' +\n /*match[4]*/ '(later|from now)?' +\n /*match[5]*/ '(?=(?:\\\\W|$))',\n'i');\n\nexports.Parser = function ENTimeLaterFormatParser(){\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 if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n var prefix = match[2];\n var suffix = match[4];\n if (!prefix && !suffix) return null;\n\n var preamble = match[1];\n \n var text = match[0];\n text = match[0].substr(preamble.length, match[0].length - preamble.length);\n index = match.index + preamble.length;\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var fragments = util.extractDateTimeUnitFragments(match[3]);\n var date = moment(ref);\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","/*\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\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');\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|\\\\.)?|Set(?:iembre|\\\\.)?|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","/*\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};","/*\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","/*\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","/*\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","/*\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","/*\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\nvar YEAR_BE_GROUP = 6;\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 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\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(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\r\n if(day < 1 || day > 31) return null;\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 // 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","/*\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');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/JP'); \nvar PATTERN = /(?:(同|((昭和|平成)?([0-90-9]{2,4})))年\\s*)?([0-90-9]{1,2})月\\s*([0-90-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","\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.ENTimeLaterFormatParser = require('./en/ENTimeLaterFormatParser').Parser;\nexports.ENWeekdayParser = require('./en/ENWeekdayParser').Parser;\nexports.ENCasualDateParser = require('./en/ENCasualDateParser').Parser;\nexports.ENCasualTimeParser = require('./en/ENCasualTimeParser').Parser;\n\nexports.JPStandardParser = require('./ja/JPStandardParser').Parser;\nexports.JPCasualDateParser = require('./ja/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\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 } else if (day1 == \"前\"){\n startMoment.add(-2, 'day');\n } else if (day1 == \"大前\"){\n startMoment.add(-3, 'day');\n } else if ( day1 == \"後\"){\n startMoment.add(2, 'day');\n } else if (day1 == \"大後\"){\n startMoment.add(3, '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 } else if (day3 == \"前\"){\n startMoment.add(-2, 'day');\n } else if (day3 == \"大前\"){\n startMoment.add(-3, 'day');\n } else if (day3 == \"後\"){\n startMoment.add(2, 'day');\n } else if (day3 == \"大後\"){\n startMoment.add(3, '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{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;\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","/*\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 } else if (day1 == \"前\"){\n startMoment.add(-2, 'day');\n } else if (day1 == \"大前\"){\n startMoment.add(-3, 'day');\n } else if (day1 == \"後\"){\n startMoment.add(2, 'day');\n } else if (day1 == \"大後\"){\n startMoment.add(3, '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 } else if (day3 == \"前\"){\n startMoment.add(-2, 'day');\n } else if (day3 == \"大前\"){\n startMoment.add(-3, 'day');\n } else if (day3 == \"後\"){\n startMoment.add(2, 'day');\n } else if (day3 == \"大後\"){\n startMoment.add(3, '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 } else if (day1 == \"前\"){\n endMoment.add(-2, 'day');\n } else if (day1 == \"大前\"){\n endMoment.add(-3, 'day');\n } else if (day1 == \"後\"){\n endMoment.add(2, 'day');\n } else if (day1 == \"大後\"){\n endMoment.add(3, '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 } else if (day3 == \"前\"){\n endMoment.add(-2, 'day');\n } else if (day3 == \"大前\"){\n endMoment.add(-3, 'day');\n } else if (day3 == \"後\"){\n endMoment.add(2, 'day');\n } else if (day3 == \"大後\"){\n endMoment.add(3, '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;\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*/\nvar Refiner = require('./refiner').Refiner;\n\n// Map ABBR -> Offset in minute\nvar TIMEZONE_NAME_PATTERN = new RegExp(\"^\\\\s*\\\\(?([A-Z]{2,4})\\\\)?(?=\\\\W|$)\", 'i');\nvar DEFAULT_TIMEZONE_ABBR_MAP = {\n \"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\":330,\"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\nexports.Refiner = function ExtractTimezoneAbbrRefiner(config) {\n\tRefiner.call(this, arguments);\n\n\tthis.refine = function(text, results, opt) {\n\n\t var timezones = new Object(DEFAULT_TIMEZONE_ABBR_MAP);\n\t if (opt.timezones) {\n\t for (var name in opt.timezones) {\n timezones[name] = opt.timezones[name];\n }\n }\n\n\t\tresults.forEach(function(result) {\n\n if (!result.tags['ENTimeExpressionParser'] &&\n !result.tags['ZHTimeExpressionParser'] &&\n !result.tags['FRTimeExpressionParser'] &&\n !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 (timezones[timezoneAbbr] === undefined) {\n return;\n }\n\n var timezoneOffset = timezones[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*/\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 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']) {\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 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 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 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}","/*\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\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\n if (timeComponent.isCertain('second')) {\n dateTimeComponent.assign('second', timeComponent.get('second'));\n\n if (timeComponent.isCertain('millisecond')) {\n dateTimeComponent.assign('millisecond', timeComponent.get('millisecond'));\n } else {\n dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\n }\n } else {\n dateTimeComponent.imply('second', timeComponent.get('second'));\n dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\n }\n \n } else {\n dateTimeComponent.imply('hour', timeComponent.get('hour'));\n dateTimeComponent.imply('minute', timeComponent.get('minute'));\n dateTimeComponent.imply('second', timeComponent.get('second'));\n dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\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 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","/*\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 JPMergeDateRangeRefiner() {\n ENMergeDateRangeRefiner.call(this);\n\n this.pattern = function () { return /^\\s*(から|ー)\\s*$/i };\n}\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// ja refiners\nexports.JPMergeDateRangeRefiner = require('./ja/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 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 return result\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.get('timezoneOffset') !== undefined ? \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","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","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.MONTH_PATTERN = '(?:' \n + Object.keys(exports.MONTH_OFFSET).join('|').replace(/\\./g, '\\\\.')\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 = '(?:' \n + Object.keys(exports.INTEGER_WORDS).join('|') \n +')';\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 = '(?:' \n + Object.keys(exports.ORDINAL_WORDS).join('|').replace(/ /g, '[ -]') \n + ')';\n\nvar TIME_UNIT = \n '(' + exports.INTEGER_WORDS_PATTERN + '|[0-9]+|[0-9]+\\.[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');\n\nexports.TIME_UNIT_PATTERN = '(?:' + TIME_UNIT + ')+';\nexports.TIME_UNIT_STRICT_PATTERN = '(?:' + TIME_UNIT_STRICT + ')+';\n\nexports.extractDateTimeUnitFragments = function (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\nfunction collectDateTimeFragment(match, fragments) {\n var num = match[1].toLowerCase() ;\n if (exports.INTEGER_WORDS[num] !== undefined) {\n num = exports.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 = parseFloat(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}","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","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","\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);","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"]}
|