forked from wanasit/chrono
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchrono.map.json
1 lines (1 loc) · 557 KB
/
chrono.map.json
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/ENTimeFromNowFormatParser.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","ENTimeFromNowFormatParser","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","TIME_UNIT","TIME_UNIT_STRICT","PATTERN_TIME_UNIT","extractDateTimeUnitFragments","timeunitText","fragments","remainingText","collectDateTimeFragment","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","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","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","fromMoment","toMoment","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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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,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,KAAO,GAAGC,IAAM,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,MAAQ,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,KAAO,IAAIt/B,IAAM,EAAEu/B,MAAQ,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,IAAM,GAAGC,KAAO,GAAGC,KAAO,GAAGC,IAAM,EAA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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.ENTimeFromNowFormatParser(config),\n new parser.ENTimeExpressionParser(config)\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner(),\n\n // English\n new refiner.ENMergeDateTimeRefiner(),\n new refiner.ENMergeDateRangeRefiner(),\n new refiner.ENPrioritizeSpecificDateRefiner()\n ]\n }\n};\n\nexports.en.casual = function(config) {\n config = config || {};\n config.strict = false;\n var option = exports.en(config);\n\n // EN\n option.parsers.unshift(new parser.ENCasualDateParser());\n option.parsers.unshift(new parser.ENCasualTimeParser());\n option.parsers.unshift(new parser.ENWeekdayParser());\n option.parsers.unshift(new parser.ENRelativeDateFormatParser());\n return option;\n};\n\n\nexports.en_GB = function(config) {\n config = config || {};\n config.littleEndian = true;\n return exports.en(config);\n}\n\nexports.en_GB.casual = function(config) {\n config = config || {};\n config.littleEndian = true;\n return exports.en.casual(config);\n}\n\n// -------------------------------------------------------------\n\nexports.ja = function() {\n return {\n parsers: [\n new parser.JPStandardParser()\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner(),\n new refiner.JPMergeDateRangeRefiner()\n ]\n }\n};\n\nexports.ja.casual = function() {\n var option = exports.ja();\n option.parsers.unshift(new parser.JPCasualDateParser());\n return option;\n};\n\n\n// -------------------------------------------------------------\n\n\nexports.es = function(config) {\n return {\n parsers: [\n new parser.ESTimeAgoFormatParser(config),\n new parser.ESDeadlineFormatParser(config),\n new parser.ESTimeExpressionParser(config),\n new parser.ESMonthNameLittleEndianParser(config),\n new parser.ESSlashDateFormatParser(config)\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner()\n ]\n }\n};\n\nexports.es.casual = function() {\n var option = exports.es({ \n strict: false \n });\n\n option.parsers.unshift(new parser.ESCasualDateParser());\n option.parsers.unshift(new parser.ESWeekdayParser());\n return option;\n};\n\n\n// -------------------------------------------------------------\n\nexports.fr = function(config) {\n return {\n parsers: [\n new parser.FRDeadlineFormatParser(config),\n new parser.FRMonthNameLittleEndianParser(config),\n new parser.FRSlashDateFormatParser(config),\n new parser.FRTimeAgoFormatParser(config),\n new parser.FRTimeExpressionParser(config)\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner(),\n new refiner.FRMergeDateRangeRefiner(),\n new refiner.FRMergeDateTimeRefiner()\n ]\n }\n};\n\nexports.fr.casual = function() {\n var option = exports.fr({\n strict: false\n });\n\n option.parsers.unshift(new parser.FRCasualDateParser());\n option.parsers.unshift(new parser.FRWeekdayParser());\n option.parsers.unshift(new parser.FRRelativeDateFormatParser());\n return option;\n};\n\n\n// -------------------------------------------------------------\n\nexports.zh = function() {\n return {\n parsers: [\n new parser.ZHHantDateParser(),\n new parser.ZHHantWeekdayParser(),\n new parser.ZHHantTimeExpressionParser(),\n new parser.ZHHantCasualDateParser(),\n new parser.ZHHantDeadlineFormatParser()\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner()\n ]\n }\n};","/*\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.assign('hour', refMoment.hour());\n result.start.assign('minute', refMoment.minute());\n result.start.assign('second', refMoment.second());\n result.start.assign('millisecond', refMoment.millisecond());\n\n }\n\n result.start.assign('day', startMoment.date())\n result.start.assign('month', startMoment.month() + 1)\n result.start.assign('year', startMoment.year())\n result.tags['ENCasualDateParser'] = true;\n return result;\n }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)((this)?\\s*(morning|afternoon|evening|noon))/i;\n\nvar TIME_MATCH = 4;\n\nexports.Parser = function ENCasualTimeParser(){\n\n Parser.apply(this, arguments);\n\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var text = match[0].substr(match[1].length);\n var index = match.index + match[1].length;\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n if(!match[TIME_MATCH]) TIME_MATCH = 3;\n\n if (match[TIME_MATCH] == \"afternoon\") {\n\n result.start.imply('hour', opt['afternoon'] ? opt['afternoon'] : 15);\n\n } else if (match[TIME_MATCH] == \"evening\") {\n\n result.start.imply('hour', opt['evening'] ? opt['evening'] : 18);\n\n } else if (match[TIME_MATCH] == \"morning\") {\n\n result.start.imply('hour', opt['morning'] ? opt['morning'] : 6);\n\n } else if (match[TIME_MATCH] == \"noon\") {\n\n result.start.imply('hour', opt['noon'] ? opt['noon'] : 12);\n }\n\n result.tags['ENCasualTimeParser'] = true;\n return result;\n };\n};\n","/*\n\n\n*/\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 ')?' + \n '(?:-|\\/|\\\\s*(?:of)?\\\\s*)' +\n '(Jan(?:uary|\\\\.)?|Feb(?:ruary|\\\\.)?|Mar(?:ch|\\\\.)?|Apr(?:il|\\\\.)?|May|Jun(?:e|\\\\.)?|Jul(?:y|\\\\.)?|Aug(?:ust|\\\\.)?|Sep(?:tember|\\\\.)?|Oct(?:ober|\\\\.)?|Nov(?:ember|\\\\.)?|Dec(?:ember|\\\\.)?)' +\n '(?:' +\n '(?:-|\\/|,?\\\\s*)' +\n '([0-9]{1,4}(?![^\\\\s]\\\\d))' +\n '(\\\\s*(?:BE|AD|BC))?' +\n ')?' +\n '(?=\\\\W|$)', 'i'\n );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_NUM_GROUP = 4;\nvar DATE_TO_GROUP = 5;\nvar DATE_TO_NUM_GROUP = 6;\nvar MONTH_NAME_GROUP = 7;\nvar YEAR_GROUP = 8;\nvar YEAR_BE_GROUP = 9;\n\nexports.Parser = function ENMonthNameLittleEndianParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref\n });\n\n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n\n var day = match[DATE_NUM_GROUP] ?\n parseInt(match[DATE_NUM_GROUP]):\n util.ORDINAL_WORDS[match[DATE_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n var year = null;\n if (match[YEAR_GROUP]) {\n year = match[YEAR_GROUP];\n year = parseInt(year);\n\n if(match[YEAR_BE_GROUP]){\n\n if (/BE/i.test(match[YEAR_BE_GROUP])) {\n // Buddhist Era\n year = year - 543;\n } else if (/BC/i.test(match[YEAR_BE_GROUP])) {\n // Before Christ\n year = -year;\n }\n\n } else if (year < 10) {\n\n // require single digit years to always have BC/AD\n return null;\n\n } else if (year < 100){\n\n year = year + 2000;\n }\n }\n\n if(year){\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n\n //Find the most appropriated year\n var refMoment = moment(ref);\n refMoment.month(month - 1);\n refMoment.date(day);\n refMoment.year(moment(ref).year());\n\n var nextYear = refMoment.clone().add(1, 'y');\n var lastYear = refMoment.clone().add(-1, 'y');\n if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n refMoment = nextYear;\n }\n else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n refMoment = lastYear;\n }\n\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.imply('year', refMoment.year());\n }\n\n // Weekday component\n if (match[WEEKDAY_GROUP]) {\n var weekday = match[WEEKDAY_GROUP];\n weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n result.start.assign('weekday', weekday);\n }\n\n // Text can be 'range' value. Such as '12 - 13 January 2012'\n if (match[DATE_TO_GROUP]) {\n var endDate = match[DATE_TO_NUM_GROUP] ?\n parseInt(match[DATE_TO_NUM_GROUP]):\n util.ORDINAL_WORDS[match[DATE_TO_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n result.end = result.start.clone();\n result.end.assign('day', endDate);\n }\n\n result.tags['ENMonthNameLittleEndianParser'] = true;\n return result;\n };\n};\n","/*\n\n The parser for parsing US's date format that begin with month's name.\n\n EX.\n - January 13\n - January 13, 2012\n - January 13 - 15, 2012\n - Tuesday, January 13, 2012\n\n Watch out for:\n - January 12:00\n - January 12.44\n - January 1222344\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:' +\n '(?:on\\\\s*?)?' +\n '(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sun\\\\.?|Mon\\\\.?|Tue\\\\.?|Wed\\\\.?|Thu\\\\.?|Fri\\\\.?|Sat\\\\.?)' +\n '\\\\s*,?\\\\s*)?' +\n '(Jan\\\\.?|January|Feb\\\\.?|February|Mar\\\\.?|March|Apr\\\\.?|April|May\\\\.?|Jun\\\\.?|June|Jul\\\\.?|July|Aug\\\\.?|August|Sep\\\\.?|Sept\\\\.?|September|Oct\\\\.?|October|Nov\\\\.?|November|Dec\\\\.?|December)' +\n '(?:-|\\/|\\\\s*,?\\\\s*)' +\n '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN +')\\\\s*' +\n '(?:' +\n '(?:to|\\\\-)\\\\s*' +\n '(([0-9]{1,2})(?:st|nd|rd|th)?| ' + util.ORDINAL_WORDS_PATTERN + ')\\\\s*' +\n ')?' +\n '(?:' +\n '(?:-|\\/|\\\\s*,?\\\\s*)' +\n '(?:([0-9]{4})\\\\s*(BE|AD|BC)?|([0-9]{1,4})\\\\s*(AD|BC))\\\\s*' +\n ')?' +\n '(?=\\\\W|$)(?!\\\\:\\\\d)', 'i');\n\nvar WEEKDAY_GROUP = 2;\nvar MONTH_NAME_GROUP = 3;\nvar DATE_GROUP = 4;\nvar DATE_NUM_GROUP = 5;\nvar DATE_TO_GROUP = 6;\nvar DATE_TO_NUM_GROUP = 7;\nvar YEAR_GROUP = 8;\nvar YEAR_BE_GROUP = 9;\nvar YEAR_GROUP2 = 10;\nvar YEAR_BE_GROUP2 = 11;\n\nexports.Parser = function ENMonthNameMiddleEndianParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref,\n });\n\n\n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n var day = match[DATE_NUM_GROUP] ?\n parseInt(match[DATE_NUM_GROUP]) :\n util.ORDINAL_WORDS[match[DATE_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n var year = null;\n if (match[YEAR_GROUP] || match[YEAR_GROUP2]) {\n year = match[YEAR_GROUP] || match[YEAR_GROUP2];\n year = parseInt(year);\n\n var yearBE = match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2];\n if (yearBE) {\n if (/BE/i.test(yearBE)) {\n // Buddhist Era\n year = year - 543;\n } else if (/BC/i.test(yearBE)) {\n // Before Christ\n year = -year;\n }\n } else if (year < 100){\n\n year = year + 2000;\n }\n }\n\n if(year){\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n\n //Find the most appropriated year\n var refMoment = moment(ref);\n refMoment.month(month - 1);\n refMoment.date(day);\n\n var nextYear = refMoment.clone().add(1, 'y');\n var lastYear = refMoment.clone().add(-1, 'y');\n if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n refMoment = nextYear;\n }\n else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n refMoment = lastYear;\n }\n\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.imply('year', refMoment.year());\n }\n\n // Weekday component\n if (match[WEEKDAY_GROUP]) {\n var weekday = match[WEEKDAY_GROUP];\n weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n result.start.assign('weekday', weekday);\n }\n\n // Text can be 'range' value. Such as 'January 12 - 13, 2012'\n if (match[DATE_TO_GROUP]) {\n var endDate = match[DATE_TO_NUM_GROUP] ?\n endDate = parseInt(match[DATE_TO_NUM_GROUP]) :\n util.ORDINAL_WORDS[match[DATE_TO_GROUP].replace('-', ' ').trim().toLowerCase()];\n\n result.end = result.start.clone();\n result.end.assign('day', endDate);\n }\n\n result.tags['ENMonthNameMiddleEndianParser'] = true;\n return result;\n }\n};","/*\n \n The parser for parsing month name and year.\n \n EX. \n - January\n - January 2012\n - January, 2012\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(^|\\\\D\\\\s+|[^\\\\w\\\\s])' +\n '(Jan\\\\.?|January|Feb\\\\.?|February|Mar\\\\.?|March|Apr\\\\.?|April|May\\\\.?|Jun\\\\.?|June|Jul\\\\.?|July|Aug\\\\.?|August|Sep\\\\.?|Sept\\\\.?|September|Oct\\\\.?|October|Nov\\\\.?|November|Dec\\\\.?|December)' + \n '\\\\s*' +\n '(?:' +\n '[,-]?\\\\s*([0-9]{4})(\\\\s*BE|AD|BC)?' +\n ')?' +\n '(?=[^\\\\s\\\\w]|\\\\s+[^0-9]|\\\\s+$|$)', 'i');\n\nvar MONTH_NAME_GROUP = 2;\nvar YEAR_GROUP = 3;\nvar YEAR_BE_GROUP = 4;\n\nexports.Parser = function ENMonthNameParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n \n this.extract = function(text, ref, match, opt){\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref,\n });\n\n \n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n\n var day = 1;\n\n var year = null;\n if (match[YEAR_GROUP]) {\n year = match[YEAR_GROUP];\n year = parseInt(year);\n\n if(match[YEAR_BE_GROUP]){\n if (match[YEAR_BE_GROUP].match(/BE/)) {\n // Buddhist Era\n year = year - 543;\n } else if (match[YEAR_BE_GROUP].match(/BC/)) {\n // Before Christ\n year = -year;\n }\n\n } else if (year < 100){ \n\n year = year + 2000;\n }\n }\n\n if(year){\n result.start.imply('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n \n //Find the most appropriated year\n var refMoment = moment(ref);\n refMoment.month(month - 1);\n refMoment.date(day);\n\n var nextYear = refMoment.clone().add(1, 'y');\n var lastYear = refMoment.clone().add(-1, 'y');\n if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){ \n refMoment = nextYear;\n }\n else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){ \n refMoment = lastYear;\n }\n\n result.start.imply('day', day);\n result.start.assign('month', month);\n result.start.imply('year', refMoment.year());\n }\n\n result.tags['ENMonthNameParser'] = true;\n return result;\n }\n}\n","/*\n\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 TIME_UNIT = \n '(' + util.INTEGER_WORDS_PATTERN + '|[0-9]+|an?(?:\\\\s*few)?|half(?:\\\\s*an?)?)\\\\s*' +\n '(sec(?:onds?)?|min(?:ute)?s?|hours?|weeks?|days?|months?|years?)\\\\s*';\n\nvar TIME_UNIT_STRICT = \n '([0-9]+|an?)\\\\s*' +\n '(seconds?|minutes?|hours?|days?)\\\\s*';\n\nvar PATTERN_TIME_UNIT = new RegExp(TIME_UNIT, 'i');\nvar PATTERN = new RegExp('' +\n '(\\\\W|^)' +\n '(?:within\\\\s*)?' +\n '((?:' + TIME_UNIT + ')+)' +\n '(?:ago|before|earlier)(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n '(\\\\W|^)' +\n '(?:within\\\\s*)?' +\n '((?:' + TIME_UNIT_STRICT + ')+)' +\n 'ago(?=(?:\\\\W|$))', 'i');\n\nexports.Parser = function ENTimeAgoFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n };\n\n this.extract = function(text, ref, match, opt){\n\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n index = match.index + match[1].length;\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var fragments = extractDateTimeUnitFragments(match[2]);\n var date = moment(ref);\n\n for (var key in fragments) {\n date.add(-fragments[key], key);\n }\n\n if (fragments['hour'] > 0 || fragments['minute'] > 0 || fragments['second'] > 0) {\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.start.assign('second', date.second());\n result.tags['ENTimeAgoFormatParser'] = true;\n } \n \n if (fragments['d'] > 0 || fragments['month'] > 0 || fragments['year'] > 0) {\n result.start.assign('day', date.date());\n result.start.assign('month', date.month() + 1);\n result.start.assign('year', date.year());\n } else {\n if (fragments['week'] > 0) {\n result.start.imply('weekday', date.day());\n }\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n }\n\n return result;\n };\n\n function extractDateTimeUnitFragments(timeunitText) {\n var fragments = {};\n var remainingText = timeunitText;\n var match = PATTERN_TIME_UNIT.exec(remainingText);\n while (match) {\n collectDateTimeFragment(match, fragments);\n remainingText = remainingText.substring(match[0].length);\n match = PATTERN_TIME_UNIT.exec(remainingText);\n }\n return fragments;\n };\n\n function collectDateTimeFragment(match, fragments) {\n\n var num = match[1].toLowerCase() ;\n if (util.INTEGER_WORDS[num] !== undefined) {\n num = util.INTEGER_WORDS[num];\n } else if(num === 'a' || num === 'an'){\n num = 1;\n } else if (num.match(/few/)) {\n num = 3;\n } else if (num.match(/half/)) {\n num = 0.5;\n } else {\n num = parseInt(num);\n }\n\n if (match[2].match(/hour/i)) {\n fragments['hour'] = num;\n } else if (match[2].match(/min/i)) {\n fragments['minute'] = num;\n } else if (match[2].match(/sec/i)) {\n fragments['second'] = num;\n } else if (match[2].match(/week/i)) {\n fragments['week'] = num;\n } else if (match[2].match(/day/i)) {\n fragments['d'] = num;\n } else if (match[2].match(/month/i)) {\n fragments['month'] = num;\n } else if (match[2].match(/year/i)) {\n fragments['year'] = num;\n }\n\n return fragments;\n }\n\n}\n","/*\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN = new RegExp(\"(^|\\\\s|T)\" +\n \"(?:(?:at|from)\\\\s*)??\" + \n \"(\\\\d{1,4}|noon|midnight)\" + \n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n \"(?:\" + \n \"(?:\\\\:|\\\\:)(\\\\d{2})\" + \n \")?\" + \n \")?\" + \n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" + \n \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" + \n \"(\\\\-|\\\\–|\\\\~|\\\\〜|to|\\\\?)\\\\s*\" + \n \"(\\\\d{1,4})\" +\n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n \")?\" + \n \")?\" + \n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" + \n \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP = 2;\nvar MINUTE_GROUP = 3;\nvar SECOND_GROUP = 4;\nvar AM_PM_HOUR_GROUP = 5;\n\n\nexports.Parser = function ENTimeExpressionParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return FIRST_REG_PATTERN; }\n \n this.extract = function(text, ref, match, opt){ \n \n // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n var refMoment = moment(ref);\n var result = new ParsedResult();\n result.ref = ref;\n result.index = match.index + match[1].length;\n result.text = match[0].substring(match[1].length);\n result.tags['ENTimeExpressionParser'] = true;\n\n result.start.imply('day', refMoment.date());\n result.start.imply('month', refMoment.month()+1);\n result.start.imply('year', refMoment.year());\n \n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Second\n if(match[SECOND_GROUP] != null){ \n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.start.assign('second', second);\n }\n \n // ----- Hours\n if (match[HOUR_GROUP].toLowerCase() == \"noon\"){\n meridiem = 1; \n hour = 12;\n } else if (match[HOUR_GROUP].toLowerCase() == \"midnight\") {\n meridiem = 0; \n hour = 0;\n } else {\n hour = parseInt(match[HOUR_GROUP]);\n }\n \n // ----- Minutes\n if(match[MINUTE_GROUP] != null){ \n minute = parseInt(match[MINUTE_GROUP]);\n } else if(hour > 100) { \n minute = hour%100;\n hour = parseInt(hour/100);\n } \n \n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) { \n meridiem = 1;\n }\n\n // ----- AM & PM \n if(match[AM_PM_HOUR_GROUP] != null) {\n if(hour > 12) return null;\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if(ampm == \"a\"){\n meridiem = 0; \n if(hour == 12) hour = 0;\n }\n \n if(ampm == \"p\"){\n meridiem = 1; \n if(hour != 12) hour += 12;\n }\n } \n\n result.start.assign('hour', hour);\n result.start.assign('minute', minute);\n\n if (meridiem >= 0) {\n result.start.assign('meridiem', meridiem);\n } else {\n if (hour < 12) {\n result.start.imply('meridiem', 0);\n } else {\n result.start.imply('meridiem', 1);\n }\n }\n \n // ==============================================================\n // Extracting the 'to' chunk\n // ==============================================================\n match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n if (!match) {\n // Not accept number only result\n if (result.text.match(/^\\d+$/)) { \n return null;\n }\n return result;\n }\n\n\n\n // Pattern \"YY.YY -XXXX\" is more like timezone offset\n if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n return result;\n }\n\n if(result.end == null){\n result.end = new ParsedComponents(null, result.start.date());\n }\n\n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Second\n if(match[SECOND_GROUP] != null){ \n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.end.assign('second', second);\n }\n\n hour = parseInt(match[2]);\n \n // ----- Minute\n if (match[MINUTE_GROUP]!= null) {\n \n minute = parseInt(match[MINUTE_GROUP]);\n if(minute >= 60) return result;\n \n } else if (hour > 100) {\n\n minute = hour%100;\n hour = parseInt(hour/100);\n }\n\n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) { \n meridiem = 1;\n }\n \n // ----- AM & PM \n if (match[AM_PM_HOUR_GROUP] != null){\n\n if (hour > 12) return null;\n\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if(ampm == \"a\"){\n meridiem = 0; \n if(hour == 12) {\n hour = 0;\n if (!result.end.isCertain('day')) {\n result.end.imply('day', result.end.get('day') + 1);\n }\n }\n }\n \n if(ampm == \"p\"){\n meridiem = 1; \n if(hour != 12) hour += 12;\n }\n \n if (!result.start.isCertain('meridiem')) {\n if (meridiem == 0) {\n \n result.start.imply('meridiem', 0);\n \n if (result.start.get('hour') == 12) {\n result.start.assign('hour', 0);\n }\n\n } else {\n\n result.start.imply('meridiem', 1);\n \n if (result.start.get('hour') != 12) {\n result.start.assign('hour', result.start.get('hour') + 12); \n }\n }\n }\n }\n\n result.text = result.text + match[0];\n result.end.assign('hour', hour);\n result.end.assign('minute', minute);\n if (meridiem >= 0) {\n result.end.assign('meridiem', meridiem);\n } else {\n var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n if (startAtPM && result.start.get('hour') > hour) {\n // 10pm - 1 (am)\n result.end.imply('meridiem', 0);\n\n } else if (hour > 12) {\n result.end.imply('meridiem', 1);\n }\n }\n\n if (result.end.date().getTime() < result.start.date().getTime()) {\n result.end.imply('day', result.end.get('day') + 1)\n }\n \n return result;\n }\n}\n","/*\n Allows future dates according to 'days from now'\n eg:\n 90 days from now\n 90 days forward\n 90 days out\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('' +\n '(\\\\W|^)' +\n '(?:within\\\\s*)?' +\n '(' + util.INTEGER_WORDS_PATTERN + '|[0-9]+|an?(?:\\\\s*few)?|half(?:\\\\s*an?)?)\\\\s*' +\n '(seconds?|min(?:ute)?s?|hours?|weeks?|days?|months?|years?)\\\\s*' +\n '(?:from now|henceforth|forward|out)(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n '(\\\\W|^)' +\n '(?:within\\\\s*)?' +\n '([0-9]+|an?)\\\\s*' +\n '(seconds?|minutes?|hours?|days?)\\\\s*' +\n 'from now(?=(?:\\\\W|$))', 'i');\n\nexports.Parser = function ENTimeFromNowFormatParser() {\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return this.isStrictMode() ? STRICT_PATTERN : PATTERN;\n };\n\n this.extract = function(text, ref, match, opt) {\n\n if (match.index > 0 && text[match.index-1].match(/\\w/)) {\n return null;\n }\n\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n index = match.index + match[1].length;\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var num = match[2].toLowerCase() ;\n if (util.INTEGER_WORDS[num] !== undefined) {\n num = util.INTEGER_WORDS[num];\n } else if(num === 'a' || num === 'an'){\n num = 1;\n } else if (num.match(/few/)) {\n num = 3;\n } else if (num.match(/half/)) {\n num = 0.5;\n } else {\n num = parseInt(num);\n }\n\n var date = moment(ref);\n\n if (match[3].match(/hour|min|second/i)) {\n if (match[3].match(/hour/i)) {\n\n date.add(+num, 'hour');\n\n } else if (match[3].match(/min/i)) {\n\n date.add(+num, 'minute');\n\n } else if (match[3].match(/second/i)) {\n\n date.add(+num, 'second');\n }\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.start.assign('second', date.second());\n result.tags['ENTimeFromNowFormatParser'] = true;\n return result;\n }\n\n if (match[3].match(/week/i)) {\n date.add(+num, 'week');\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n result.start.imply('weekday', date.day());\n return result;\n }\n\n if (match[3].match(/day/i)) {\n date.add(+num, 'd');\n }\n\n if (match[3].match(/month/i)) {\n date.add(+num, 'month');\n }\n\n if (match[3].match(/year/i)) {\n\n date.add(+num, 'year');\n }\n\n result.start.assign('day', date.date());\n result.start.assign('month', date.month() + 1);\n result.start.assign('year', date.year());\n return result;\n\n };\n}\n","/*\n\n\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar DAYS_OFFSET = { 'sunday': 0, 'sun': 0, 'monday': 1, 'mon': 1,'tuesday': 2, 'tues':2, 'tue':2, 'wednesday': 3, 'wed': 3,\n 'thursday': 4, 'thurs':4, 'thur': 4, 'thu': 4,'friday': 5, 'fri': 5,'saturday': 6, 'sat': 6};\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:(?:\\\\,|\\\\(|\\\\()\\\\s*)?' +\n '(?:on\\\\s*?)?' +\n '(?:(this|last|past|next)\\\\s*)?' +\n '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n '(?:\\\\s*(?:\\\\,|\\\\)|\\\\)))?' +\n '(?:\\\\s*(this|last|past|next)\\\\s*week)?' +\n '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\n\nexports.updateParsedComponent = function updateParsedComponent(result, ref, offset, modifier) {\n\n var startMoment = moment(ref);\n var startMomentFixed = false;\n var refOffset = startMoment.day();\n\n if(modifier == 'last' || modifier == 'past') {\n startMoment.day(offset - 7);\n startMomentFixed = true;\n } else if(modifier == 'next') {\n startMoment.day(offset + 7);\n startMomentFixed = true;\n } else if(modifier == 'this') {\n startMoment.day(offset);\n } else {\n if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) {\n startMoment.day(offset - 7);\n } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) {\n startMoment.day(offset + 7);\n } else {\n startMoment.day(offset);\n }\n }\n\n result.start.assign('weekday', offset);\n if (startMomentFixed) {\n result.start.assign('day', startMoment.date());\n result.start.assign('month', startMoment.month() + 1);\n result.start.assign('year', startMoment.year());\n } else {\n result.start.imply('day', startMoment.date());\n result.start.imply('month', startMoment.month() + 1);\n result.start.imply('year', startMoment.year());\n }\n\n return result;\n};\n\n\nexports.Parser = function ENWeekdayParser() {\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; };\n\n this.extract = function(text, ref, match, opt){\n var index = match.index + match[1].length;\n var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n var offset = DAYS_OFFSET[dayOfWeek];\n if(offset === undefined) {\n return null;\n }\n\n var prefix = match[PREFIX_GROUP];\n var postfix = match[POSTFIX_GROUP];\n var norm = prefix || postfix;\n norm = norm || '';\n norm = norm.toLowerCase();\n\n exports.updateParsedComponent(result, ref, offset, norm);\n result.tags['ENWeekdayParser'] = true;\n\n return result;\n }\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\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// 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\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.ENTimeFromNowFormatParser = require('./EN/ENTimeFromNowFormatParser').Parser;\nexports.ENWeekdayParser = require('./EN/ENWeekdayParser').Parser;\nexports.ENCasualDateParser = require('./EN/ENCasualDateParser').Parser;\nexports.ENCasualTimeParser = require('./EN/ENCasualTimeParser').Parser;\n\nexports.JPStandardParser = require('./JP/JPStandardParser').Parser;\nexports.JPCasualDateParser = require('./JP/JPCasualDateParser').Parser;\n\nexports.ESCasualDateParser = require('./ES/ESCasualDateParser').Parser;\nexports.ESDeadlineFormatParser = require('./ES/ESDeadlineFormatParser').Parser;\nexports.ESTimeAgoFormatParser = require('./ES/ESTimeAgoFormatParser').Parser;\nexports.ESTimeExpressionParser = require('./ES/ESTimeExpressionParser').Parser;\nexports.ESWeekdayParser = require('./ES/ESWeekdayParser').Parser;\nexports.ESMonthNameLittleEndianParser = require('./ES/ESMonthNameLittleEndianParser').Parser;\nexports.ESSlashDateFormatParser = require('./ES/ESSlashDateFormatParser').Parser;\n\nexports.FRCasualDateParser = require('./FR/FRCasualDateParser').Parser;\nexports.FRDeadlineFormatParser = require('./FR/FRDeadlineFormatParser').Parser;\nexports.FRMonthNameLittleEndianParser = require('./FR/FRMonthNameLittleEndianParser').Parser;\nexports.FRSlashDateFormatParser = require('./FR/FRSlashDateFormatParser').Parser;\nexports.FRTimeAgoFormatParser = require('./FR/FRTimeAgoFormatParser').Parser;\nexports.FRTimeExpressionParser = require('./FR/FRTimeExpressionParser').Parser;\nexports.FRWeekdayParser = require('./FR/FRWeekdayParser').Parser;\nexports.FRRelativeDateFormatParser = require('./FR/FRRelativeDateFormatParser').Parser;\n\nexports.ZHHantDateParser = require('./ZH-Hant/ZHHantDateParser').Parser;\nexports.ZHHantWeekdayParser = require('./ZH-Hant/ZHHantWeekdayParser').Parser;\nexports.ZHHantTimeExpressionParser = require('./ZH-Hant/ZHHantTimeExpressionParser').Parser;\nexports.ZHHantCasualDateParser = require('./ZH-Hant/ZHHantCasualDateParser').Parser;\nexports.ZHHantDeadlineFormatParser = require('./ZH-Hant/ZHHantDeadlineFormatParser').Parser;\n\nexports.DEDeadlineFormatParser = require('./DE/DEDeadlineFormatParser').Parser;\nexports.DEMonthNameLittleEndianParser = require('./DE/DEMonthNameLittleEndianParser').Parser;\nexports.DEMonthNameParser = require('./DE/DEMonthNameParser').Parser;\nexports.DESlashDateFormatParser = require('./DE/DESlashDateFormatParser').Parser;\nexports.DETimeAgoFormatParser = require('./DE/DETimeAgoFormatParser').Parser;\nexports.DETimeExpressionParser = require('./DE/DETimeExpressionParser').Parser;\nexports.DEWeekdayParser = require('./DE/DEWeekdayParser').Parser;\nexports.DECasualDateParser = require('./DE/DECasualDateParser').Parser;\n","/*\n \n*/\nvar 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 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"]}