@openmrs/esm-app-shell 11.0.1-pre.5906 → 11.0.1-pre.5908

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5081,7 +5081,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webp
5081
5081
  },
5082
5082
  "../../framework/esm-utils/dist/dates/date-util.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
5083
5083
  "use strict";
5084
- eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n convertToLocaleCalendar: () => (convertToLocaleCalendar),\n duration: () => (duration),\n formatDate: () => (formatDate),\n formatDatetime: () => (formatDatetime),\n formatDuration: () => (formatDuration),\n formatDurationBetween: () => (formatDurationBetween),\n formatPartialDate: () => (formatPartialDate),\n formatTime: () => (formatTime),\n getDefaultCalendar: () => (getDefaultCalendar),\n isOmrsDateStrict: () => (isOmrsDateStrict),\n isOmrsDateToday: () => (isOmrsDateToday),\n parseDate: () => (parseDate),\n parseDateInput: () => (parseDateInput),\n registerDefaultCalendar: () => (registerDefaultCalendar),\n toDateObjectStrict: () => (toDateObjectStrict),\n toOmrsIsoString: () => (toOmrsIsoString)\n});\n/* import */ var _internationalized_date__rspack_import_8 = __webpack_require__(\"../../../node_modules/@internationalized/date/dist/conversion.mjs\");\n/* import */ var _internationalized_date__rspack_import_9 = __webpack_require__(\"../../../node_modules/@internationalized/date/dist/createCalendar.mjs\");\n/* import */ var any_date_parser__rspack_import_5 = __webpack_require__(\"../../../node_modules/any-date-parser/dist/index.mjs\");\n/* import */ var dayjs__rspack_import_0 = __webpack_require__(\"webpack/sharing/consume/default/dayjs/dayjs\");\n/* import */ var dayjs__rspack_import_0_default = /*#__PURE__*/__webpack_require__.n(dayjs__rspack_import_0);\n/* import */ var dayjs_plugin_isToday_js__rspack_import_1 = __webpack_require__(\"../../../node_modules/dayjs/plugin/isToday.js\");\n/* import */ var dayjs_plugin_objectSupport_js__rspack_import_2 = __webpack_require__(\"../../../node_modules/dayjs/plugin/objectSupport.js\");\n/* import */ var dayjs_plugin_utc_js__rspack_import_3 = __webpack_require__(\"../../../node_modules/dayjs/plugin/utc.js\");\n/* import */ var lodash_es__rspack_import_6 = __webpack_require__(\"../../../node_modules/lodash-es/isNil.js\");\n/* import */ var lodash_es__rspack_import_7 = __webpack_require__(\"../../../node_modules/lodash-es/omit.js\");\n/* import */ var _index_js__rspack_import_4 = __webpack_require__(\"../../framework/esm-utils/dist/get-locale.js\");\nfunction _check_private_redeclaration(obj, privateCollection) {\n if (privateCollection.has(obj)) {\n throw new TypeError(\"Cannot initialize the same private elements twice on an object\");\n }\n}\nfunction _class_apply_descriptor_get(receiver, descriptor) {\n if (descriptor.get) {\n return descriptor.get.call(receiver);\n }\n return descriptor.value;\n}\nfunction _class_extract_field_descriptor(receiver, privateMap, action) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to \" + action + \" private field on non-instance\");\n }\n return privateMap.get(receiver);\n}\nfunction _class_private_field_get(receiver, privateMap) {\n var descriptor = _class_extract_field_descriptor(receiver, privateMap, \"get\");\n return _class_apply_descriptor_get(receiver, descriptor);\n}\nfunction _class_private_field_init(obj, privateMap, value) {\n _check_private_redeclaration(obj, privateMap);\n privateMap.set(obj, value);\n}\n/**\n * @module\n * @category Date and Time\n */ \n\n\n\n\n\n\n\ndayjs__rspack_import_0_default().extend(dayjs_plugin_isToday_js__rspack_import_1);\ndayjs__rspack_import_0_default().extend(dayjs_plugin_utc_js__rspack_import_3);\ndayjs__rspack_import_0_default().extend(dayjs_plugin_objectSupport_js__rspack_import_2);\nconst isoFormat = 'YYYY-MM-DDTHH:mm:ss.SSSZZ';\n/**\n * This function checks whether a date string is the OpenMRS ISO format.\n * The format should be YYYY-MM-DDTHH:mm:ss.SSSZZ\n */ function isOmrsDateStrict(omrsPayloadString) {\n // omrs format 2018-03-19T00:00:00.000+0300\n if (omrsPayloadString === null || omrsPayloadString === undefined || omrsPayloadString.trim().length !== 28) {\n return false;\n }\n omrsPayloadString = omrsPayloadString.trim();\n // 11th character will always be T\n if (omrsPayloadString[10] !== 'T') {\n return false;\n }\n // checking time format\n if (omrsPayloadString[13] !== ':' || omrsPayloadString[16] !== ':' || omrsPayloadString[19] !== '.') {\n return false;\n }\n // checking UTC offset format\n if (!(omrsPayloadString[23] === '+' || omrsPayloadString[23] === '-')) {\n return false;\n }\n return dayjs__rspack_import_0_default()(omrsPayloadString, isoFormat).isValid();\n}\n/**\n * Checks if the provided date is today.\n *\n * @param date The date to check.\n * @returns `true` if the date is today, `false` otherwise.\n */ function isOmrsDateToday(date) {\n return dayjs__rspack_import_0_default()(date).isToday();\n}\n/**\n * Converts the object to a date object if it is an OpenMRS ISO date time string.\n * Otherwise returns null.\n */ function toDateObjectStrict(omrsDateString) {\n if (!isOmrsDateStrict(omrsDateString)) {\n return null;\n }\n return dayjs__rspack_import_0_default()(omrsDateString, isoFormat).toDate();\n}\n/**\n * Formats the input to OpenMRS ISO format: \"YYYY-MM-DDTHH:mm:ss.SSSZZ\".\n */ function toOmrsIsoString(date, toUTC = false) {\n let d = dayjs__rspack_import_0_default()(date);\n if (toUTC) {\n d = d.utc();\n }\n return d.format(isoFormat);\n}\n/**\n * Utility function to parse an arbitrary string into a date.\n * Uses `dayjs(dateString)`.\n */ function parseDate(dateString) {\n return dayjs__rspack_import_0_default()(dateString).toDate();\n}\nvar _registry = /*#__PURE__*/ new WeakMap();\n/**\n * Internal cache for per-locale calendars\n */ class LocaleCalendars {\n register(locale, calendar) {\n _class_private_field_get(this, _registry).set(locale, calendar);\n }\n getCalendar(locale) {\n if (!Boolean(locale)) {\n return undefined;\n }\n if (locale.calendar) {\n return locale.calendar;\n }\n if (locale.region) {\n const key = `${locale.language}-${locale.region}`;\n if (_class_private_field_get(this, _registry).has(key)) {\n return _class_private_field_get(this, _registry).get(key);\n }\n }\n if (locale.language && _class_private_field_get(this, _registry).has(locale.language)) {\n return _class_private_field_get(this, _registry).get(locale.language);\n }\n const defaultCalendar = new Intl.DateTimeFormat(locale.toString()).resolvedOptions().calendar;\n // cache this result\n _class_private_field_get(this, _registry).set(`${locale.language}${locale.region ? `-${locale.region}` : ''}`, defaultCalendar);\n return defaultCalendar;\n }\n constructor(){\n _class_private_field_init(this, _registry, {\n writable: true,\n value: new Map()\n });\n }\n}\nconst registeredLocaleCalendars = new LocaleCalendars();\n/**\n * Provides the name of the calendar to associate, as a default, with the given base locale.\n *\n * @example\n * ```\n * registerDefaultCalendar('en', 'buddhist') // sets the default calendar for the 'en' locale to Buddhist.\n * ```\n *\n * @param locale the locale to register this calendar for\n * @param calendar the calendar to use for this registration\n */ function registerDefaultCalendar(locale, calendar) {\n registeredLocaleCalendars.register(locale, calendar);\n}\n/**\n * Retrieves the default calendar for the specified locale if any.\n *\n * @param locale the locale to look-up\n */ function getDefaultCalendar(locale) {\n const locale_ = locale ?? (0,_index_js__rspack_import_4.getLocale)();\n return registeredLocaleCalendars.getCalendar(locale_ instanceof Intl.Locale ? locale_ : new Intl.Locale(locale_));\n}\nconst defaultOptions = {\n mode: 'standard',\n time: 'for today',\n day: true,\n month: true,\n year: true,\n noToday: false\n};\n/**\n * Formats the string representing a date, including partial representations of dates, according to the current\n * locale and the given options.\n *\n * Default options:\n * - mode: \"standard\",\n * - time: \"for today\",\n * - day: true,\n * - month: true,\n * - year: true\n * - noToday: false\n *\n * If the date is today then \"Today\" is produced (in the locale language).\n * This behavior can be disabled with `noToday: true`.\n *\n * When time is included, it is appended with a comma and a space. This\n * agrees with the output of `Date.prototype.toLocaleString` for *most*\n * locales.\n *\n * @param dateString The date string to parse and format.\n * @param options Optional formatting options.\n * @returns The formatted date string, or `null` if the input cannot be parsed.\n */ // TODO: Shouldn't throw on null input\nfunction formatPartialDate(dateString, options = {}) {\n const locale = (0,_index_js__rspack_import_4.getLocale)();\n let parsed = (0,any_date_parser__rspack_import_5.attempt)(dateString, locale);\n if (parsed.invalid) {\n console.warn(`Could not parse invalid date '${dateString}'`);\n return null;\n }\n // hack here but any date interprets 2000-01, etc. as yyyy-dd rather than yyyy-mm\n if (!(0,lodash_es__rspack_import_6[\"default\"])(parsed.day) && (0,lodash_es__rspack_import_6[\"default\"])(parsed.month)) {\n parsed = Object.assign({}, (0,lodash_es__rspack_import_7[\"default\"])(parsed, 'day'), {\n month: parsed.day\n });\n }\n // dayjs' object support uses 0-based months, whereas any-date-parser uses 1-based months\n if (parsed.month) {\n parsed.month -= 1;\n }\n // in dayjs day is day of week; in any-date-parser, its day of month, so we need to convert them\n if (parsed.day) {\n parsed = Object.assign({}, (0,lodash_es__rspack_import_7[\"default\"])(parsed, 'day'), {\n date: parsed.day\n });\n }\n const date = dayjs__rspack_import_0_default()().set(parsed).toDate();\n if ((0,lodash_es__rspack_import_6[\"default\"])(parsed.year)) {\n options.year = false;\n }\n if ((0,lodash_es__rspack_import_6[\"default\"])(parsed.month)) {\n options.month = false;\n }\n if ((0,lodash_es__rspack_import_6[\"default\"])(parsed.date)) {\n options.day = false;\n }\n return formatDate(date, options);\n}\n/**\n * Formats the input date according to the current locale and the\n * given options.\n *\n * Default options:\n * - mode: \"standard\",\n * - time: \"for today\",\n * - day: true,\n * - month: true,\n * - year: true\n * - noToday: false\n *\n * If the date is today then \"Today\" is produced (in the locale language).\n * This behavior can be disabled with `noToday: true`.\n *\n * When time is included, it is appended with a comma and a space. This\n * agrees with the output of `Date.prototype.toLocaleString` for *most*\n * locales.\n *\n * @param date The date to format.\n * @param options Optional formatting options.\n * @returns The formatted date string.\n */ // TODO: Shouldn't throw on null input\nfunction formatDate(date, options) {\n let locale = options?.locale ?? (0,_index_js__rspack_import_4.getLocale)();\n const _locale = new Intl.Locale(locale);\n const { calendar, mode, time, day, month, year, noToday, numberingSystem } = {\n ...defaultOptions,\n ...{\n noToday: _locale.language === 'am' ? true : false\n },\n ...options\n };\n const formatCalendar = calendar ?? getDefaultCalendar(_locale);\n const formatterOptions = {\n calendar: formatCalendar,\n year: year ? 'numeric' : undefined,\n month: month ? 'short' : undefined,\n day: day ? '2-digit' : undefined,\n numberingSystem\n };\n let localeString;\n const isToday = dayjs__rspack_import_0_default()(date).isToday();\n if (isToday && !noToday) {\n // This produces the word \"Today\" in the language of `locale`\n const rtf = new Intl.RelativeTimeFormat(locale, {\n numeric: 'auto'\n });\n localeString = rtf.format(0, 'day');\n localeString = localeString[0].toLocaleUpperCase(locale) + localeString.slice(1);\n } else {\n if (_locale.language === 'en') {\n // This locale override is here rather than in `getLocale`\n // because Americans should see AM/PM for times.\n locale = 'en-GB';\n }\n const formatter = new Intl.DateTimeFormat(locale, formatterOptions);\n let parts = formatter.formatToParts(date);\n if ((_locale.language === 'en' || _locale.language === 'am') && mode == 'standard' && year && day) {\n // Custom formatting for English and Amharic. Use hyphens instead of spaces.\n parts = parts.map(formatParts('-'));\n }\n if (mode == 'wide') {\n parts = parts.map(formatParts(' — ')); // space-emdash-space\n }\n // omit the era when using the Ethiopic calendar\n if (formatterOptions.calendar === 'ethiopic') {\n parts = parts.filter((part, idx, values)=>{\n if (part.type === 'era' || part.type === 'literal' && idx < values.length - 1 && values[idx + 1].type === 'era') {\n return false;\n }\n return true;\n });\n }\n localeString = parts.map((p)=>p.value).join('');\n }\n if (time === true || isToday && time === 'for today') {\n localeString += `, ${formatTime(date)}`;\n }\n return localeString;\n}\n// Internal curried call-back for map()\nconst formatParts = (separator)=>{\n return (part, idx, values)=>{\n if (part.type !== 'literal' || part.value !== ' ') {\n return part;\n }\n if (idx < values.length - 1 && values[idx + 1].type === 'era') {\n return part;\n }\n return {\n type: 'literal',\n value: separator\n };\n };\n};\n/**\n * Formats the input as a time, according to the current locale.\n * 12-hour or 24-hour clock depends on locale.\n *\n * @param date The date whose time portion should be formatted.\n * @returns The formatted time string (e.g., \"2:30 PM\" or \"14:30\").\n */ function formatTime(date) {\n return date.toLocaleTimeString((0,_index_js__rspack_import_4.getLocale)(), {\n hour: '2-digit',\n minute: '2-digit'\n });\n}\n/**\n * Formats the input into a string showing the date and time, according\n * to the current locale. The `mode` parameter is as described for\n * `formatDate`.\n *\n * This is created by concatenating the results of `formatDate`\n * and `formatTime` with a comma and space. This agrees with the\n * output of `Date.prototype.toLocaleString` for *most* locales.\n *\n * @param date The date to format.\n * @param options Optional formatting options (same as formatDate, except time is always included).\n * @returns The formatted date and time string.\n */ function formatDatetime(date, options) {\n return formatDate(date, {\n ...options,\n time: true\n });\n}\n/**\n * Converts a calendar date to the equivalent locale calendar date.\n * @returns CalendarDate\n */ function convertToLocaleCalendar(date, locale) {\n let locale_ = typeof locale === 'string' ? new Intl.Locale(locale) : locale;\n const localCalendarName = getDefaultCalendar(locale_);\n return localCalendarName ? (0,_internationalized_date__rspack_import_8.toCalendar)(date, (0,_internationalized_date__rspack_import_9.createCalendar)(localCalendarName)) : date;\n}\n/**\n * Formats the input duration according to the current locale.\n *\n * @param duration The duration to format (DurationInput object).\n * @param options Optional options for formatting.\n * @returns The formatted duration string.\n */ function formatDuration(duration, options) {\n const formatter = new Intl.DurationFormat((0,_index_js__rspack_import_4.getLocale)(), options);\n return formatter.format(duration);\n}\n/**\n * Parses a date input into a dayjs object. String inputs are interpreted using\n * any-date-parser with corrections for its month/day representation differences\n * with dayjs. Non-string inputs are passed directly to dayjs.\n *\n * @param dateInput The date to parse.\n * @param referenceDate Used as the base when resolving partial string dates (e.g., '2000' resolves missing fields from this date).\n * @returns A dayjs object, or null if the string could not be parsed.\n */ function parseDateInput(dateInput, referenceDate) {\n if (dateInput == null) {\n return null;\n }\n if (typeof dateInput === 'string') {\n const locale = (0,_index_js__rspack_import_4.getLocale)();\n let parsedDate = (0,any_date_parser__rspack_import_5.attempt)(dateInput, locale);\n if (parsedDate.invalid) {\n console.warn(`Could not interpret '${dateInput}' as a date`);\n return null;\n }\n // hack here but any date interprets 2000-01, etc. as yyyy-dd rather than yyyy-mm\n if (parsedDate.day && !parsedDate.month) {\n parsedDate = {\n ...(0,lodash_es__rspack_import_7[\"default\"])(parsedDate, 'day'),\n ...{\n month: parsedDate.day\n }\n };\n }\n // dayjs' object support uses 0-based months, whereas any-date-parser uses 1-based months\n if (parsedDate.month) {\n parsedDate.month -= 1;\n }\n // in dayjs day is day of week; in any-date-parser, its day of month, so we need to convert them\n if (parsedDate.day) {\n parsedDate = {\n ...(0,lodash_es__rspack_import_7[\"default\"])(parsedDate, 'day'),\n ...{\n date: parsedDate.day\n }\n };\n }\n return dayjs__rspack_import_0_default()(referenceDate).set(parsedDate);\n }\n return dayjs__rspack_import_0_default()(dateInput);\n}\nconst UNIT_ORDER = [\n 'years',\n 'months',\n 'days',\n 'hours',\n 'minutes',\n 'seconds'\n];\nconst SINGULAR_TO_PLURAL = {\n second: 'seconds',\n minute: 'minutes',\n hour: 'hours',\n day: 'days',\n month: 'months',\n year: 'years'\n};\nfunction normalizeUnit(unit) {\n return SINGULAR_TO_PLURAL[unit] ?? unit;\n}\n/**\n * Normalizes threshold keys from singular/plural to plural, then merges with defaults.\n */ function normalizeThresholds(thresholds) {\n const result = {\n ...DEFAULT_THRESHOLDS\n };\n if (thresholds) {\n for (const [key, value] of Object.entries(thresholds)){\n if (value !== undefined) {\n result[normalizeUnit(key)] = value;\n }\n }\n }\n return result;\n}\nconst DEFAULT_THRESHOLDS = {\n seconds: 45,\n minutes: 45,\n hours: 22,\n days: 26,\n months: 11,\n years: Infinity\n};\n/**\n * Auto-selects the appropriate unit based on the magnitude of the duration,\n * using the provided thresholds (or defaults).\n */ function autoSelectUnit(from, to, thresholds) {\n const t = normalizeThresholds(thresholds);\n if (to.diff(from, 'seconds') < t.seconds) return 'seconds';\n if (to.diff(from, 'minutes') < t.minutes) return 'minutes';\n if (to.diff(from, 'hours') < t.hours) return 'hours';\n if (to.diff(from, 'days') < t.days) return 'days';\n if (to.diff(from, 'months') < t.months) return 'months';\n return 'years';\n}\n/**\n * Finds the largest unit with a non-zero diff, or falls back to smallestUnit.\n * Mirrors the Temporal.Duration.round() 'auto' behavior for largestUnit.\n */ function autoLargestUnit(from, to, smallestUnit) {\n const smallestIdx = UNIT_ORDER.indexOf(smallestUnit);\n for(let i = 0; i < UNIT_ORDER.length; i++){\n const unit = UNIT_ORDER[i];\n if (to.diff(from, unit) > 0) {\n // Return this unit or smallestUnit, whichever is coarser (lower index)\n return i <= smallestIdx ? unit : smallestUnit;\n }\n }\n return smallestUnit;\n}\n/**\n * Decomposes the duration between two dates across a range of units, from\n * largestUnit down to smallestUnit. Each unit's value is the remainder after\n * subtracting all larger units.\n */ function decompose(from, to, largestUnit, smallestUnit) {\n const startIdx = UNIT_ORDER.indexOf(largestUnit);\n const endIdx = UNIT_ORDER.indexOf(smallestUnit);\n const units = UNIT_ORDER.slice(startIdx, endIdx + 1);\n const result = {};\n let current = from;\n for (const unit of units){\n const diff = to.diff(current, unit);\n result[unit] = diff;\n current = current.add(diff, unit);\n }\n return result;\n}\n/**\n * Calculates the duration between two dates as a structured duration object.\n *\n * When called with no options or a single unit string, the unit is auto-selected\n * using dayjs relativeTime thresholds:\n * - < 45 seconds → seconds\n * - < 45 minutes → minutes\n * - < 22 hours → hours\n * - < 26 days → days\n * - < 11 months → months\n * - otherwise → years\n *\n * With a {@link DurationOptions} object, you can override thresholds and/or request\n * a multi-unit decomposition via largestUnit/smallestUnit.\n *\n * @param startDate The start date. If null, returns null.\n * @param endDate Optional. Defaults to now.\n * @param options A unit string for single-unit output, or a DurationOptions object.\n * @returns A DurationInput object, or null if either date is null or unparseable.\n *\n * @example\n * // Auto-selects the appropriate unit\n * duration('2022-01-01', '2024-07-30') // => { years: 2 }\n *\n * @example\n * // Multi-unit decomposition\n * duration('2022-01-01', '2024-07-30', { largestUnit: 'year', smallestUnit: 'day' })\n * // => { years: 2, months: 6, days: 29 }\n */ function duration(startDate, endDate = dayjs__rspack_import_0_default()(), options) {\n const to = dayjs__rspack_import_0_default()(endDate);\n const from = parseDateInput(startDate, to);\n if (from == null) {\n return null;\n }\n if (typeof options === 'string') {\n const normalized = normalizeUnit(options);\n return {\n [normalized]: to.diff(from, normalized)\n };\n }\n const { thresholds, largestUnit: rawLargest, smallestUnit: rawSmallest } = options ?? {};\n if (rawLargest !== undefined || rawSmallest !== undefined) {\n const smallest = rawSmallest ? normalizeUnit(rawSmallest) : undefined;\n let largest;\n if (rawLargest === 'auto' || rawLargest === undefined) {\n // 'auto' or omitted: resolve to the largest non-zero unit, or smallestUnit, whichever is coarser\n const effectiveSmallest = smallest ?? 'seconds';\n largest = autoLargestUnit(from, to, effectiveSmallest);\n } else {\n largest = normalizeUnit(rawLargest);\n }\n return decompose(from, to, largest, smallest ?? largest);\n }\n const selected = autoSelectUnit(from, to, thresholds);\n return {\n [selected]: to.diff(from, selected)\n };\n}\nconst DEFAULT_FORMAT_OPTIONS = {\n style: 'short',\n localeMatcher: 'lookup'\n};\n/**\n * Calculates the duration between two dates and formats it as a locale-aware string.\n * Uses the same unit-selection logic as {@link duration} and delegates formatting\n * to {@link formatDuration}.\n *\n * @param startDate The start date. If null, returns null.\n * @param endDate Optional. Defaults to now.\n * @param options A unit string for single-unit output, or a {@link DurationOptionsWithFormat} object.\n * The `formatOptions` field is passed to Intl.DurationFormat (defaults to short style).\n * @returns A formatted duration string, or null if either date is null or unparseable.\n *\n * @example\n * formatDurationBetween('2022-01-01', '2024-07-30') // => '2 yrs'\n *\n * @example\n * // Multi-unit with long-form formatting\n * formatDurationBetween('2022-01-01', '2024-07-30', {\n * largestUnit: 'year',\n * smallestUnit: 'day',\n * formatOptions: { style: 'long' },\n * }) // => '2 years, 6 months, 29 days'\n */ function formatDurationBetween(startDate, endDate = dayjs__rspack_import_0_default()(), options) {\n const durationInput = duration(startDate, endDate, options);\n if (durationInput == null) {\n return null;\n }\n const formatOpts = typeof options === 'object' && options.formatOptions ? {\n ...DEFAULT_FORMAT_OPTIONS,\n ...options.formatOptions\n } : DEFAULT_FORMAT_OPTIONS;\n return formatDuration(durationInput, formatOpts);\n}\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC9lc218YnVpbHRpbjpzd2MtbG9hZGVyPz9ydWxlU2V0WzFdLnJ1bGVzWzVdLnVzZVswXSEvaG9tZS9ydW5uZXIvd29yay9vcGVubXJzLWVzbS1jb3JlL29wZW5tcnMtZXNtLWNvcmUvcGFja2FnZXMvZnJhbWV3b3JrL2VzbS11dGlscy9kaXN0L2RhdGVzL2RhdGUtdXRpbC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS11dGlscy9kaXN0L2RhdGVzL2RhdGUtdXRpbC5qcz9lMzYwIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9jaGVja19wcml2YXRlX3JlZGVjbGFyYXRpb24ob2JqLCBwcml2YXRlQ29sbGVjdGlvbikge1xuICAgIGlmIChwcml2YXRlQ29sbGVjdGlvbi5oYXMob2JqKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGluaXRpYWxpemUgdGhlIHNhbWUgcHJpdmF0ZSBlbGVtZW50cyB0d2ljZSBvbiBhbiBvYmplY3RcIik7XG4gICAgfVxufVxuZnVuY3Rpb24gX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZ2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yKSB7XG4gICAgaWYgKGRlc2NyaXB0b3IuZ2V0KSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldC5jYWxsKHJlY2VpdmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IudmFsdWU7XG59XG5mdW5jdGlvbiBfY2xhc3NfZXh0cmFjdF9maWVsZF9kZXNjcmlwdG9yKHJlY2VpdmVyLCBwcml2YXRlTWFwLCBhY3Rpb24pIHtcbiAgICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIFwiICsgYWN0aW9uICsgXCIgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XG4gICAgfVxuICAgIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XG59XG5mdW5jdGlvbiBfY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXQocmVjZWl2ZXIsIHByaXZhdGVNYXApIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IF9jbGFzc19leHRyYWN0X2ZpZWxkX2Rlc2NyaXB0b3IocmVjZWl2ZXIsIHByaXZhdGVNYXAsIFwiZ2V0XCIpO1xuICAgIHJldHVybiBfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9nZXQocmVjZWl2ZXIsIGRlc2NyaXB0b3IpO1xufVxuZnVuY3Rpb24gX2NsYXNzX3ByaXZhdGVfZmllbGRfaW5pdChvYmosIHByaXZhdGVNYXAsIHZhbHVlKSB7XG4gICAgX2NoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbihvYmosIHByaXZhdGVNYXApO1xuICAgIHByaXZhdGVNYXAuc2V0KG9iaiwgdmFsdWUpO1xufVxuLyoqXG4gKiBAbW9kdWxlXG4gKiBAY2F0ZWdvcnkgRGF0ZSBhbmQgVGltZVxuICovIGltcG9ydCB7IGNyZWF0ZUNhbGVuZGFyLCB0b0NhbGVuZGFyIH0gZnJvbSBcIkBpbnRlcm5hdGlvbmFsaXplZC9kYXRlXCI7XG5pbXBvcnQgeyBhdHRlbXB0IH0gZnJvbSBcImFueS1kYXRlLXBhcnNlclwiO1xuaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiO1xuaW1wb3J0IGlzVG9kYXkgZnJvbSBcImRheWpzL3BsdWdpbi9pc1RvZGF5LmpzXCI7XG5pbXBvcnQgb2JqZWN0U3VwcG9ydCBmcm9tIFwiZGF5anMvcGx1Z2luL29iamVjdFN1cHBvcnQuanNcIjtcbmltcG9ydCB1dGMgZnJvbSBcImRheWpzL3BsdWdpbi91dGMuanNcIjtcbmltcG9ydCB7IGlzTmlsLCBvbWl0IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgZ2V0TG9jYWxlIH0gZnJvbSBcIi4uL2luZGV4LmpzXCI7XG5kYXlqcy5leHRlbmQoaXNUb2RheSk7XG5kYXlqcy5leHRlbmQodXRjKTtcbmRheWpzLmV4dGVuZChvYmplY3RTdXBwb3J0KTtcbmNvbnN0IGlzb0Zvcm1hdCA9ICdZWVlZLU1NLUREVEhIOm1tOnNzLlNTU1paJztcbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciBhIGRhdGUgc3RyaW5nIGlzIHRoZSBPcGVuTVJTIElTTyBmb3JtYXQuXG4gKiBUaGUgZm9ybWF0IHNob3VsZCBiZSBZWVlZLU1NLUREVEhIOm1tOnNzLlNTU1paXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGlzT21yc0RhdGVTdHJpY3Qob21yc1BheWxvYWRTdHJpbmcpIHtcbiAgICAvLyBvbXJzIGZvcm1hdCAyMDE4LTAzLTE5VDAwOjAwOjAwLjAwMCswMzAwXG4gICAgaWYgKG9tcnNQYXlsb2FkU3RyaW5nID09PSBudWxsIHx8IG9tcnNQYXlsb2FkU3RyaW5nID09PSB1bmRlZmluZWQgfHwgb21yc1BheWxvYWRTdHJpbmcudHJpbSgpLmxlbmd0aCAhPT0gMjgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvbXJzUGF5bG9hZFN0cmluZyA9IG9tcnNQYXlsb2FkU3RyaW5nLnRyaW0oKTtcbiAgICAvLyAxMXRoIGNoYXJhY3RlciB3aWxsIGFsd2F5cyBiZSBUXG4gICAgaWYgKG9tcnNQYXlsb2FkU3RyaW5nWzEwXSAhPT0gJ1QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gY2hlY2tpbmcgdGltZSBmb3JtYXRcbiAgICBpZiAob21yc1BheWxvYWRTdHJpbmdbMTNdICE9PSAnOicgfHwgb21yc1BheWxvYWRTdHJpbmdbMTZdICE9PSAnOicgfHwgb21yc1BheWxvYWRTdHJpbmdbMTldICE9PSAnLicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBjaGVja2luZyBVVEMgb2Zmc2V0IGZvcm1hdFxuICAgIGlmICghKG9tcnNQYXlsb2FkU3RyaW5nWzIzXSA9PT0gJysnIHx8IG9tcnNQYXlsb2FkU3RyaW5nWzIzXSA9PT0gJy0nKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBkYXlqcyhvbXJzUGF5bG9hZFN0cmluZywgaXNvRm9ybWF0KS5pc1ZhbGlkKCk7XG59XG4vKipcbiAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgZGF0ZSBpcyB0b2RheS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZGF0ZSBpcyB0b2RheSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGlzT21yc0RhdGVUb2RheShkYXRlKSB7XG4gICAgcmV0dXJuIGRheWpzKGRhdGUpLmlzVG9kYXkoKTtcbn1cbi8qKlxuICogQ29udmVydHMgdGhlIG9iamVjdCB0byBhIGRhdGUgb2JqZWN0IGlmIGl0IGlzIGFuIE9wZW5NUlMgSVNPIGRhdGUgdGltZSBzdHJpbmcuXG4gKiBPdGhlcndpc2UgcmV0dXJucyBudWxsLlxuICovIGV4cG9ydCBmdW5jdGlvbiB0b0RhdGVPYmplY3RTdHJpY3Qob21yc0RhdGVTdHJpbmcpIHtcbiAgICBpZiAoIWlzT21yc0RhdGVTdHJpY3Qob21yc0RhdGVTdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZGF5anMob21yc0RhdGVTdHJpbmcsIGlzb0Zvcm1hdCkudG9EYXRlKCk7XG59XG4vKipcbiAqIEZvcm1hdHMgdGhlIGlucHV0IHRvIE9wZW5NUlMgSVNPIGZvcm1hdDogXCJZWVlZLU1NLUREVEhIOm1tOnNzLlNTU1paXCIuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHRvT21yc0lzb1N0cmluZyhkYXRlLCB0b1VUQyA9IGZhbHNlKSB7XG4gICAgbGV0IGQgPSBkYXlqcyhkYXRlKTtcbiAgICBpZiAodG9VVEMpIHtcbiAgICAgICAgZCA9IGQudXRjKCk7XG4gICAgfVxuICAgIHJldHVybiBkLmZvcm1hdChpc29Gb3JtYXQpO1xufVxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHBhcnNlIGFuIGFyYml0cmFyeSBzdHJpbmcgaW50byBhIGRhdGUuXG4gKiBVc2VzIGBkYXlqcyhkYXRlU3RyaW5nKWAuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGF0ZShkYXRlU3RyaW5nKSB7XG4gICAgcmV0dXJuIGRheWpzKGRhdGVTdHJpbmcpLnRvRGF0ZSgpO1xufVxudmFyIF9yZWdpc3RyeSA9IC8qI19fUFVSRV9fKi8gbmV3IFdlYWtNYXAoKTtcbi8qKlxuICogSW50ZXJuYWwgY2FjaGUgZm9yIHBlci1sb2NhbGUgY2FsZW5kYXJzXG4gKi8gY2xhc3MgTG9jYWxlQ2FsZW5kYXJzIHtcbiAgICByZWdpc3Rlcihsb2NhbGUsIGNhbGVuZGFyKSB7XG4gICAgICAgIF9jbGFzc19wcml2YXRlX2ZpZWxkX2dldCh0aGlzLCBfcmVnaXN0cnkpLnNldChsb2NhbGUsIGNhbGVuZGFyKTtcbiAgICB9XG4gICAgZ2V0Q2FsZW5kYXIobG9jYWxlKSB7XG4gICAgICAgIGlmICghQm9vbGVhbihsb2NhbGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbGUuY2FsZW5kYXIpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUuY2FsZW5kYXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsZS5yZWdpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGAke2xvY2FsZS5sYW5ndWFnZX0tJHtsb2NhbGUucmVnaW9ufWA7XG4gICAgICAgICAgICBpZiAoX2NsYXNzX3ByaXZhdGVfZmllbGRfZ2V0KHRoaXMsIF9yZWdpc3RyeSkuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NsYXNzX3ByaXZhdGVfZmllbGRfZ2V0KHRoaXMsIF9yZWdpc3RyeSkuZ2V0KGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsZS5sYW5ndWFnZSAmJiBfY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXQodGhpcywgX3JlZ2lzdHJ5KS5oYXMobG9jYWxlLmxhbmd1YWdlKSkge1xuICAgICAgICAgICAgcmV0dXJuIF9jbGFzc19wcml2YXRlX2ZpZWxkX2dldCh0aGlzLCBfcmVnaXN0cnkpLmdldChsb2NhbGUubGFuZ3VhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlZmF1bHRDYWxlbmRhciA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZS50b1N0cmluZygpKS5yZXNvbHZlZE9wdGlvbnMoKS5jYWxlbmRhcjtcbiAgICAgICAgLy8gY2FjaGUgdGhpcyByZXN1bHRcbiAgICAgICAgX2NsYXNzX3ByaXZhdGVfZmllbGRfZ2V0KHRoaXMsIF9yZWdpc3RyeSkuc2V0KGAke2xvY2FsZS5sYW5ndWFnZX0ke2xvY2FsZS5yZWdpb24gPyBgLSR7bG9jYWxlLnJlZ2lvbn1gIDogJyd9YCwgZGVmYXVsdENhbGVuZGFyKTtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRDYWxlbmRhcjtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgX2NsYXNzX3ByaXZhdGVfZmllbGRfaW5pdCh0aGlzLCBfcmVnaXN0cnksIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBNYXAoKVxuICAgICAgICB9KTtcbiAgICB9XG59XG5jb25zdCByZWdpc3RlcmVkTG9jYWxlQ2FsZW5kYXJzID0gbmV3IExvY2FsZUNhbGVuZGFycygpO1xuLyoqXG4gKiBQcm92aWRlcyB0aGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIgdG8gYXNzb2NpYXRlLCBhcyBhIGRlZmF1bHQsIHdpdGggdGhlIGdpdmVuIGJhc2UgbG9jYWxlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIHJlZ2lzdGVyRGVmYXVsdENhbGVuZGFyKCdlbicsICdidWRkaGlzdCcpIC8vIHNldHMgdGhlIGRlZmF1bHQgY2FsZW5kYXIgZm9yIHRoZSAnZW4nIGxvY2FsZSB0byBCdWRkaGlzdC5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBsb2NhbGUgdGhlIGxvY2FsZSB0byByZWdpc3RlciB0aGlzIGNhbGVuZGFyIGZvclxuICogQHBhcmFtIGNhbGVuZGFyIHRoZSBjYWxlbmRhciB0byB1c2UgZm9yIHRoaXMgcmVnaXN0cmF0aW9uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdENhbGVuZGFyKGxvY2FsZSwgY2FsZW5kYXIpIHtcbiAgICByZWdpc3RlcmVkTG9jYWxlQ2FsZW5kYXJzLnJlZ2lzdGVyKGxvY2FsZSwgY2FsZW5kYXIpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGRlZmF1bHQgY2FsZW5kYXIgZm9yIHRoZSBzcGVjaWZpZWQgbG9jYWxlIGlmIGFueS5cbiAqXG4gKiBAcGFyYW0gbG9jYWxlIHRoZSBsb2NhbGUgdG8gbG9vay11cFxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0Q2FsZW5kYXIobG9jYWxlKSB7XG4gICAgY29uc3QgbG9jYWxlXyA9IGxvY2FsZSA/PyBnZXRMb2NhbGUoKTtcbiAgICByZXR1cm4gcmVnaXN0ZXJlZExvY2FsZUNhbGVuZGFycy5nZXRDYWxlbmRhcihsb2NhbGVfIGluc3RhbmNlb2YgSW50bC5Mb2NhbGUgPyBsb2NhbGVfIDogbmV3IEludGwuTG9jYWxlKGxvY2FsZV8pKTtcbn1cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIG1vZGU6ICdzdGFuZGFyZCcsXG4gICAgdGltZTogJ2ZvciB0b2RheScsXG4gICAgZGF5OiB0cnVlLFxuICAgIG1vbnRoOiB0cnVlLFxuICAgIHllYXI6IHRydWUsXG4gICAgbm9Ub2RheTogZmFsc2Vcbn07XG4vKipcbiAqIEZvcm1hdHMgdGhlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkYXRlLCBpbmNsdWRpbmcgcGFydGlhbCByZXByZXNlbnRhdGlvbnMgb2YgZGF0ZXMsIGFjY29yZGluZyB0byB0aGUgY3VycmVudFxuICogbG9jYWxlIGFuZCB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBEZWZhdWx0IG9wdGlvbnM6XG4gKiAgLSBtb2RlOiBcInN0YW5kYXJkXCIsXG4gKiAgLSB0aW1lOiBcImZvciB0b2RheVwiLFxuICogIC0gZGF5OiB0cnVlLFxuICogIC0gbW9udGg6IHRydWUsXG4gKiAgLSB5ZWFyOiB0cnVlXG4gKiAgLSBub1RvZGF5OiBmYWxzZVxuICpcbiAqIElmIHRoZSBkYXRlIGlzIHRvZGF5IHRoZW4gXCJUb2RheVwiIGlzIHByb2R1Y2VkIChpbiB0aGUgbG9jYWxlIGxhbmd1YWdlKS5cbiAqIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGRpc2FibGVkIHdpdGggYG5vVG9kYXk6IHRydWVgLlxuICpcbiAqIFdoZW4gdGltZSBpcyBpbmNsdWRlZCwgaXQgaXMgYXBwZW5kZWQgd2l0aCBhIGNvbW1hIGFuZCBhIHNwYWNlLiBUaGlzXG4gKiBhZ3JlZXMgd2l0aCB0aGUgb3V0cHV0IG9mIGBEYXRlLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZ2AgZm9yICptb3N0KlxuICogbG9jYWxlcy5cbiAqXG4gKiBAcGFyYW0gZGF0ZVN0cmluZyBUaGUgZGF0ZSBzdHJpbmcgdG8gcGFyc2UgYW5kIGZvcm1hdC5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGZvcm1hdHRpbmcgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcsIG9yIGBudWxsYCBpZiB0aGUgaW5wdXQgY2Fubm90IGJlIHBhcnNlZC5cbiAqLyAvLyBUT0RPOiBTaG91bGRuJ3QgdGhyb3cgb24gbnVsbCBpbnB1dFxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFBhcnRpYWxEYXRlKGRhdGVTdHJpbmcsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGxvY2FsZSA9IGdldExvY2FsZSgpO1xuICAgIGxldCBwYXJzZWQgPSBhdHRlbXB0KGRhdGVTdHJpbmcsIGxvY2FsZSk7XG4gICAgaWYgKHBhcnNlZC5pbnZhbGlkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IHBhcnNlIGludmFsaWQgZGF0ZSAnJHtkYXRlU3RyaW5nfSdgKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIGhhY2sgaGVyZSBidXQgYW55IGRhdGUgaW50ZXJwcmV0cyAyMDAwLTAxLCBldGMuIGFzIHl5eXktZGQgcmF0aGVyIHRoYW4geXl5eS1tbVxuICAgIGlmICghaXNOaWwocGFyc2VkLmRheSkgJiYgaXNOaWwocGFyc2VkLm1vbnRoKSkge1xuICAgICAgICBwYXJzZWQgPSBPYmplY3QuYXNzaWduKHt9LCBvbWl0KHBhcnNlZCwgJ2RheScpLCB7XG4gICAgICAgICAgICBtb250aDogcGFyc2VkLmRheVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gZGF5anMnIG9iamVjdCBzdXBwb3J0IHVzZXMgMC1iYXNlZCBtb250aHMsIHdoZXJlYXMgYW55LWRhdGUtcGFyc2VyIHVzZXMgMS1iYXNlZCBtb250aHNcbiAgICBpZiAocGFyc2VkLm1vbnRoKSB7XG4gICAgICAgIHBhcnNlZC5tb250aCAtPSAxO1xuICAgIH1cbiAgICAvLyBpbiBkYXlqcyBkYXkgaXMgZGF5IG9mIHdlZWs7IGluIGFueS1kYXRlLXBhcnNlciwgaXRzIGRheSBvZiBtb250aCwgc28gd2UgbmVlZCB0byBjb252ZXJ0IHRoZW1cbiAgICBpZiAocGFyc2VkLmRheSkge1xuICAgICAgICBwYXJzZWQgPSBPYmplY3QuYXNzaWduKHt9LCBvbWl0KHBhcnNlZCwgJ2RheScpLCB7XG4gICAgICAgICAgICBkYXRlOiBwYXJzZWQuZGF5XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBkYXRlID0gZGF5anMoKS5zZXQocGFyc2VkKS50b0RhdGUoKTtcbiAgICBpZiAoaXNOaWwocGFyc2VkLnllYXIpKSB7XG4gICAgICAgIG9wdGlvbnMueWVhciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaXNOaWwocGFyc2VkLm1vbnRoKSkge1xuICAgICAgICBvcHRpb25zLm1vbnRoID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc05pbChwYXJzZWQuZGF0ZSkpIHtcbiAgICAgICAgb3B0aW9ucy5kYXkgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1hdERhdGUoZGF0ZSwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEZvcm1hdHMgdGhlIGlucHV0IGRhdGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZSBhbmQgdGhlXG4gKiBnaXZlbiBvcHRpb25zLlxuICpcbiAqIERlZmF1bHQgb3B0aW9uczpcbiAqICAtIG1vZGU6IFwic3RhbmRhcmRcIixcbiAqICAtIHRpbWU6IFwiZm9yIHRvZGF5XCIsXG4gKiAgLSBkYXk6IHRydWUsXG4gKiAgLSBtb250aDogdHJ1ZSxcbiAqICAtIHllYXI6IHRydWVcbiAqICAtIG5vVG9kYXk6IGZhbHNlXG4gKlxuICogSWYgdGhlIGRhdGUgaXMgdG9kYXkgdGhlbiBcIlRvZGF5XCIgaXMgcHJvZHVjZWQgKGluIHRoZSBsb2NhbGUgbGFuZ3VhZ2UpLlxuICogVGhpcyBiZWhhdmlvciBjYW4gYmUgZGlzYWJsZWQgd2l0aCBgbm9Ub2RheTogdHJ1ZWAuXG4gKlxuICogV2hlbiB0aW1lIGlzIGluY2x1ZGVkLCBpdCBpcyBhcHBlbmRlZCB3aXRoIGEgY29tbWEgYW5kIGEgc3BhY2UuIFRoaXNcbiAqIGFncmVlcyB3aXRoIHRoZSBvdXRwdXQgb2YgYERhdGUucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nYCBmb3IgKm1vc3QqXG4gKiBsb2NhbGVzLlxuICpcbiAqIEBwYXJhbSBkYXRlIFRoZSBkYXRlIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGZvcm1hdHRpbmcgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcuXG4gKi8gLy8gVE9ETzogU2hvdWxkbid0IHRocm93IG9uIG51bGwgaW5wdXRcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGUsIG9wdGlvbnMpIHtcbiAgICBsZXQgbG9jYWxlID0gb3B0aW9ucz8ubG9jYWxlID8/IGdldExvY2FsZSgpO1xuICAgIGNvbnN0IF9sb2NhbGUgPSBuZXcgSW50bC5Mb2NhbGUobG9jYWxlKTtcbiAgICBjb25zdCB7IGNhbGVuZGFyLCBtb2RlLCB0aW1lLCBkYXksIG1vbnRoLCB5ZWFyLCBub1RvZGF5LCBudW1iZXJpbmdTeXN0ZW0gfSA9IHtcbiAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgIC4uLntcbiAgICAgICAgICAgIG5vVG9kYXk6IF9sb2NhbGUubGFuZ3VhZ2UgPT09ICdhbScgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG4gICAgY29uc3QgZm9ybWF0Q2FsZW5kYXIgPSBjYWxlbmRhciA/PyBnZXREZWZhdWx0Q2FsZW5kYXIoX2xvY2FsZSk7XG4gICAgY29uc3QgZm9ybWF0dGVyT3B0aW9ucyA9IHtcbiAgICAgICAgY2FsZW5kYXI6IGZvcm1hdENhbGVuZGFyLFxuICAgICAgICB5ZWFyOiB5ZWFyID8gJ251bWVyaWMnIDogdW5kZWZpbmVkLFxuICAgICAgICBtb250aDogbW9udGggPyAnc2hvcnQnIDogdW5kZWZpbmVkLFxuICAgICAgICBkYXk6IGRheSA/ICcyLWRpZ2l0JyA6IHVuZGVmaW5lZCxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtXG4gICAgfTtcbiAgICBsZXQgbG9jYWxlU3RyaW5nO1xuICAgIGNvbnN0IGlzVG9kYXkgPSBkYXlqcyhkYXRlKS5pc1RvZGF5KCk7XG4gICAgaWYgKGlzVG9kYXkgJiYgIW5vVG9kYXkpIHtcbiAgICAgICAgLy8gVGhpcyBwcm9kdWNlcyB0aGUgd29yZCBcIlRvZGF5XCIgaW4gdGhlIGxhbmd1YWdlIG9mIGBsb2NhbGVgXG4gICAgICAgIGNvbnN0IHJ0ZiA9IG5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdChsb2NhbGUsIHtcbiAgICAgICAgICAgIG51bWVyaWM6ICdhdXRvJ1xuICAgICAgICB9KTtcbiAgICAgICAgbG9jYWxlU3RyaW5nID0gcnRmLmZvcm1hdCgwLCAnZGF5Jyk7XG4gICAgICAgIGxvY2FsZVN0cmluZyA9IGxvY2FsZVN0cmluZ1swXS50b0xvY2FsZVVwcGVyQ2FzZShsb2NhbGUpICsgbG9jYWxlU3RyaW5nLnNsaWNlKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfbG9jYWxlLmxhbmd1YWdlID09PSAnZW4nKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGxvY2FsZSBvdmVycmlkZSBpcyBoZXJlIHJhdGhlciB0aGFuIGluIGBnZXRMb2NhbGVgXG4gICAgICAgICAgICAvLyBiZWNhdXNlIEFtZXJpY2FucyBzaG91bGQgc2VlIEFNL1BNIGZvciB0aW1lcy5cbiAgICAgICAgICAgIGxvY2FsZSA9ICdlbi1HQic7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBmb3JtYXR0ZXJPcHRpb25zKTtcbiAgICAgICAgbGV0IHBhcnRzID0gZm9ybWF0dGVyLmZvcm1hdFRvUGFydHMoZGF0ZSk7XG4gICAgICAgIGlmICgoX2xvY2FsZS5sYW5ndWFnZSA9PT0gJ2VuJyB8fCBfbG9jYWxlLmxhbmd1YWdlID09PSAnYW0nKSAmJiBtb2RlID09ICdzdGFuZGFyZCcgJiYgeWVhciAmJiBkYXkpIHtcbiAgICAgICAgICAgIC8vIEN1c3RvbSBmb3JtYXR0aW5nIGZvciBFbmdsaXNoIGFuZCBBbWhhcmljLiBVc2UgaHlwaGVucyBpbnN0ZWFkIG9mIHNwYWNlcy5cbiAgICAgICAgICAgIHBhcnRzID0gcGFydHMubWFwKGZvcm1hdFBhcnRzKCctJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2RlID09ICd3aWRlJykge1xuICAgICAgICAgICAgcGFydHMgPSBwYXJ0cy5tYXAoZm9ybWF0UGFydHMoJyDigJQgJykpOyAvLyBzcGFjZS1lbWRhc2gtc3BhY2VcbiAgICAgICAgfVxuICAgICAgICAvLyBvbWl0IHRoZSBlcmEgd2hlbiB1c2luZyB0aGUgRXRoaW9waWMgY2FsZW5kYXJcbiAgICAgICAgaWYgKGZvcm1hdHRlck9wdGlvbnMuY2FsZW5kYXIgPT09ICdldGhpb3BpYycpIHtcbiAgICAgICAgICAgIHBhcnRzID0gcGFydHMuZmlsdGVyKChwYXJ0LCBpZHgsIHZhbHVlcyk9PntcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAnZXJhJyB8fCBwYXJ0LnR5cGUgPT09ICdsaXRlcmFsJyAmJiBpZHggPCB2YWx1ZXMubGVuZ3RoIC0gMSAmJiB2YWx1ZXNbaWR4ICsgMV0udHlwZSA9PT0gJ2VyYScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxvY2FsZVN0cmluZyA9IHBhcnRzLm1hcCgocCk9PnAudmFsdWUpLmpvaW4oJycpO1xuICAgIH1cbiAgICBpZiAodGltZSA9PT0gdHJ1ZSB8fCBpc1RvZGF5ICYmIHRpbWUgPT09ICdmb3IgdG9kYXknKSB7XG4gICAgICAgIGxvY2FsZVN0cmluZyArPSBgLCAke2Zvcm1hdFRpbWUoZGF0ZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsZVN0cmluZztcbn1cbi8vIEludGVybmFsIGN1cnJpZWQgY2FsbC1iYWNrIGZvciBtYXAoKVxuY29uc3QgZm9ybWF0UGFydHMgPSAoc2VwYXJhdG9yKT0+e1xuICAgIHJldHVybiAocGFydCwgaWR4LCB2YWx1ZXMpPT57XG4gICAgICAgIGlmIChwYXJ0LnR5cGUgIT09ICdsaXRlcmFsJyB8fCBwYXJ0LnZhbHVlICE9PSAnICcpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpZHggPCB2YWx1ZXMubGVuZ3RoIC0gMSAmJiB2YWx1ZXNbaWR4ICsgMV0udHlwZSA9PT0gJ2VyYScpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnbGl0ZXJhbCcsXG4gICAgICAgICAgICB2YWx1ZTogc2VwYXJhdG9yXG4gICAgICAgIH07XG4gICAgfTtcbn07XG4vKipcbiAqIEZvcm1hdHMgdGhlIGlucHV0IGFzIGEgdGltZSwgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS5cbiAqIDEyLWhvdXIgb3IgMjQtaG91ciBjbG9jayBkZXBlbmRzIG9uIGxvY2FsZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSB3aG9zZSB0aW1lIHBvcnRpb24gc2hvdWxkIGJlIGZvcm1hdHRlZC5cbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgdGltZSBzdHJpbmcgKGUuZy4sIFwiMjozMCBQTVwiIG9yIFwiMTQ6MzBcIikuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWUoZGF0ZSkge1xuICAgIHJldHVybiBkYXRlLnRvTG9jYWxlVGltZVN0cmluZyhnZXRMb2NhbGUoKSwge1xuICAgICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICAgIG1pbnV0ZTogJzItZGlnaXQnXG4gICAgfSk7XG59XG4vKipcbiAqIEZvcm1hdHMgdGhlIGlucHV0IGludG8gYSBzdHJpbmcgc2hvd2luZyB0aGUgZGF0ZSBhbmQgdGltZSwgYWNjb3JkaW5nXG4gKiB0byB0aGUgY3VycmVudCBsb2NhbGUuIFRoZSBgbW9kZWAgcGFyYW1ldGVyIGlzIGFzIGRlc2NyaWJlZCBmb3JcbiAqIGBmb3JtYXREYXRlYC5cbiAqXG4gKiBUaGlzIGlzIGNyZWF0ZWQgYnkgY29uY2F0ZW5hdGluZyB0aGUgcmVzdWx0cyBvZiBgZm9ybWF0RGF0ZWBcbiAqIGFuZCBgZm9ybWF0VGltZWAgd2l0aCBhIGNvbW1hIGFuZCBzcGFjZS4gVGhpcyBhZ3JlZXMgd2l0aCB0aGVcbiAqIG91dHB1dCBvZiBgRGF0ZS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmdgIGZvciAqbW9zdCogbG9jYWxlcy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSB0byBmb3JtYXQuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBmb3JtYXR0aW5nIG9wdGlvbnMgKHNhbWUgYXMgZm9ybWF0RGF0ZSwgZXhjZXB0IHRpbWUgaXMgYWx3YXlzIGluY2x1ZGVkKS5cbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgZGF0ZSBhbmQgdGltZSBzdHJpbmcuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGV0aW1lKGRhdGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZm9ybWF0RGF0ZShkYXRlLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHRpbWU6IHRydWVcbiAgICB9KTtcbn1cbi8qKlxuICogQ29udmVydHMgYSBjYWxlbmRhciBkYXRlIHRvIHRoZSBlcXVpdmFsZW50IGxvY2FsZSBjYWxlbmRhciBkYXRlLlxuICogQHJldHVybnMgQ2FsZW5kYXJEYXRlXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0xvY2FsZUNhbGVuZGFyKGRhdGUsIGxvY2FsZSkge1xuICAgIGxldCBsb2NhbGVfID0gdHlwZW9mIGxvY2FsZSA9PT0gJ3N0cmluZycgPyBuZXcgSW50bC5Mb2NhbGUobG9jYWxlKSA6IGxvY2FsZTtcbiAgICBjb25zdCBsb2NhbENhbGVuZGFyTmFtZSA9IGdldERlZmF1bHRDYWxlbmRhcihsb2NhbGVfKTtcbiAgICByZXR1cm4gbG9jYWxDYWxlbmRhck5hbWUgPyB0b0NhbGVuZGFyKGRhdGUsIGNyZWF0ZUNhbGVuZGFyKGxvY2FsQ2FsZW5kYXJOYW1lKSkgOiBkYXRlO1xufVxuLyoqXG4gKiBGb3JtYXRzIHRoZSBpbnB1dCBkdXJhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlLlxuICpcbiAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gdG8gZm9ybWF0IChEdXJhdGlvbklucHV0IG9iamVjdCkuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBvcHRpb25zIGZvciBmb3JtYXR0aW5nLlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBkdXJhdGlvbiBzdHJpbmcuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEludGwuRHVyYXRpb25Gb3JtYXQoZ2V0TG9jYWxlKCksIG9wdGlvbnMpO1xuICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGR1cmF0aW9uKTtcbn1cbi8qKlxuICogUGFyc2VzIGEgZGF0ZSBpbnB1dCBpbnRvIGEgZGF5anMgb2JqZWN0LiBTdHJpbmcgaW5wdXRzIGFyZSBpbnRlcnByZXRlZCB1c2luZ1xuICogYW55LWRhdGUtcGFyc2VyIHdpdGggY29ycmVjdGlvbnMgZm9yIGl0cyBtb250aC9kYXkgcmVwcmVzZW50YXRpb24gZGlmZmVyZW5jZXNcbiAqIHdpdGggZGF5anMuIE5vbi1zdHJpbmcgaW5wdXRzIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gZGF5anMuXG4gKlxuICogQHBhcmFtIGRhdGVJbnB1dCBUaGUgZGF0ZSB0byBwYXJzZS5cbiAqIEBwYXJhbSByZWZlcmVuY2VEYXRlIFVzZWQgYXMgdGhlIGJhc2Ugd2hlbiByZXNvbHZpbmcgcGFydGlhbCBzdHJpbmcgZGF0ZXMgKGUuZy4sICcyMDAwJyByZXNvbHZlcyBtaXNzaW5nIGZpZWxkcyBmcm9tIHRoaXMgZGF0ZSkuXG4gKiBAcmV0dXJucyBBIGRheWpzIG9iamVjdCwgb3IgbnVsbCBpZiB0aGUgc3RyaW5nIGNvdWxkIG5vdCBiZSBwYXJzZWQuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGF0ZUlucHV0KGRhdGVJbnB1dCwgcmVmZXJlbmNlRGF0ZSkge1xuICAgIGlmIChkYXRlSW5wdXQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRlSW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9IGdldExvY2FsZSgpO1xuICAgICAgICBsZXQgcGFyc2VkRGF0ZSA9IGF0dGVtcHQoZGF0ZUlucHV0LCBsb2NhbGUpO1xuICAgICAgICBpZiAocGFyc2VkRGF0ZS5pbnZhbGlkKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYENvdWxkIG5vdCBpbnRlcnByZXQgJyR7ZGF0ZUlucHV0fScgYXMgYSBkYXRlYCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBoYWNrIGhlcmUgYnV0IGFueSBkYXRlIGludGVycHJldHMgMjAwMC0wMSwgZXRjLiBhcyB5eXl5LWRkIHJhdGhlciB0aGFuIHl5eXktbW1cbiAgICAgICAgaWYgKHBhcnNlZERhdGUuZGF5ICYmICFwYXJzZWREYXRlLm1vbnRoKSB7XG4gICAgICAgICAgICBwYXJzZWREYXRlID0ge1xuICAgICAgICAgICAgICAgIC4uLm9taXQocGFyc2VkRGF0ZSwgJ2RheScpLFxuICAgICAgICAgICAgICAgIC4uLntcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6IHBhcnNlZERhdGUuZGF5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkYXlqcycgb2JqZWN0IHN1cHBvcnQgdXNlcyAwLWJhc2VkIG1vbnRocywgd2hlcmVhcyBhbnktZGF0ZS1wYXJzZXIgdXNlcyAxLWJhc2VkIG1vbnRoc1xuICAgICAgICBpZiAocGFyc2VkRGF0ZS5tb250aCkge1xuICAgICAgICAgICAgcGFyc2VkRGF0ZS5tb250aCAtPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIGluIGRheWpzIGRheSBpcyBkYXkgb2Ygd2VlazsgaW4gYW55LWRhdGUtcGFyc2VyLCBpdHMgZGF5IG9mIG1vbnRoLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlbVxuICAgICAgICBpZiAocGFyc2VkRGF0ZS5kYXkpIHtcbiAgICAgICAgICAgIHBhcnNlZERhdGUgPSB7XG4gICAgICAgICAgICAgICAgLi4ub21pdChwYXJzZWREYXRlLCAnZGF5JyksXG4gICAgICAgICAgICAgICAgLi4ue1xuICAgICAgICAgICAgICAgICAgICBkYXRlOiBwYXJzZWREYXRlLmRheVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRheWpzKHJlZmVyZW5jZURhdGUpLnNldChwYXJzZWREYXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIGRheWpzKGRhdGVJbnB1dCk7XG59XG5jb25zdCBVTklUX09SREVSID0gW1xuICAgICd5ZWFycycsXG4gICAgJ21vbnRocycsXG4gICAgJ2RheXMnLFxuICAgICdob3VycycsXG4gICAgJ21pbnV0ZXMnLFxuICAgICdzZWNvbmRzJ1xuXTtcbmNvbnN0IFNJTkdVTEFSX1RPX1BMVVJBTCA9IHtcbiAgICBzZWNvbmQ6ICdzZWNvbmRzJyxcbiAgICBtaW51dGU6ICdtaW51dGVzJyxcbiAgICBob3VyOiAnaG91cnMnLFxuICAgIGRheTogJ2RheXMnLFxuICAgIG1vbnRoOiAnbW9udGhzJyxcbiAgICB5ZWFyOiAneWVhcnMnXG59O1xuZnVuY3Rpb24gbm9ybWFsaXplVW5pdCh1bml0KSB7XG4gICAgcmV0dXJuIFNJTkdVTEFSX1RPX1BMVVJBTFt1bml0XSA/PyB1bml0O1xufVxuLyoqXG4gKiBOb3JtYWxpemVzIHRocmVzaG9sZCBrZXlzIGZyb20gc2luZ3VsYXIvcGx1cmFsIHRvIHBsdXJhbCwgdGhlbiBtZXJnZXMgd2l0aCBkZWZhdWx0cy5cbiAqLyBmdW5jdGlvbiBub3JtYWxpemVUaHJlc2hvbGRzKHRocmVzaG9sZHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIC4uLkRFRkFVTFRfVEhSRVNIT0xEU1xuICAgIH07XG4gICAgaWYgKHRocmVzaG9sZHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhyZXNob2xkcykpe1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbbm9ybWFsaXplVW5pdChrZXkpXSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBERUZBVUxUX1RIUkVTSE9MRFMgPSB7XG4gICAgc2Vjb25kczogNDUsXG4gICAgbWludXRlczogNDUsXG4gICAgaG91cnM6IDIyLFxuICAgIGRheXM6IDI2LFxuICAgIG1vbnRoczogMTEsXG4gICAgeWVhcnM6IEluZmluaXR5XG59O1xuLyoqXG4gKiBBdXRvLXNlbGVjdHMgdGhlIGFwcHJvcHJpYXRlIHVuaXQgYmFzZWQgb24gdGhlIG1hZ25pdHVkZSBvZiB0aGUgZHVyYXRpb24sXG4gKiB1c2luZyB0aGUgcHJvdmlkZWQgdGhyZXNob2xkcyAob3IgZGVmYXVsdHMpLlxuICovIGZ1bmN0aW9uIGF1dG9TZWxlY3RVbml0KGZyb20sIHRvLCB0aHJlc2hvbGRzKSB7XG4gICAgY29uc3QgdCA9IG5vcm1hbGl6ZVRocmVzaG9sZHModGhyZXNob2xkcyk7XG4gICAgaWYgKHRvLmRpZmYoZnJvbSwgJ3NlY29uZHMnKSA8IHQuc2Vjb25kcykgcmV0dXJuICdzZWNvbmRzJztcbiAgICBpZiAodG8uZGlmZihmcm9tLCAnbWludXRlcycpIDwgdC5taW51dGVzKSByZXR1cm4gJ21pbnV0ZXMnO1xuICAgIGlmICh0by5kaWZmKGZyb20sICdob3VycycpIDwgdC5ob3VycykgcmV0dXJuICdob3Vycyc7XG4gICAgaWYgKHRvLmRpZmYoZnJvbSwgJ2RheXMnKSA8IHQuZGF5cykgcmV0dXJuICdkYXlzJztcbiAgICBpZiAodG8uZGlmZihmcm9tLCAnbW9udGhzJykgPCB0Lm1vbnRocykgcmV0dXJuICdtb250aHMnO1xuICAgIHJldHVybiAneWVhcnMnO1xufVxuLyoqXG4gKiBGaW5kcyB0aGUgbGFyZ2VzdCB1bml0IHdpdGggYSBub24temVybyBkaWZmLCBvciBmYWxscyBiYWNrIHRvIHNtYWxsZXN0VW5pdC5cbiAqIE1pcnJvcnMgdGhlIFRlbXBvcmFsLkR1cmF0aW9uLnJvdW5kKCkgJ2F1dG8nIGJlaGF2aW9yIGZvciBsYXJnZXN0VW5pdC5cbiAqLyBmdW5jdGlvbiBhdXRvTGFyZ2VzdFVuaXQoZnJvbSwgdG8sIHNtYWxsZXN0VW5pdCkge1xuICAgIGNvbnN0IHNtYWxsZXN0SWR4ID0gVU5JVF9PUkRFUi5pbmRleE9mKHNtYWxsZXN0VW5pdCk7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IFVOSVRfT1JERVIubGVuZ3RoOyBpKyspe1xuICAgICAgICBjb25zdCB1bml0ID0gVU5JVF9PUkRFUltpXTtcbiAgICAgICAgaWYgKHRvLmRpZmYoZnJvbSwgdW5pdCkgPiAwKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhpcyB1bml0IG9yIHNtYWxsZXN0VW5pdCwgd2hpY2hldmVyIGlzIGNvYXJzZXIgKGxvd2VyIGluZGV4KVxuICAgICAgICAgICAgcmV0dXJuIGkgPD0gc21hbGxlc3RJZHggPyB1bml0IDogc21hbGxlc3RVbml0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzbWFsbGVzdFVuaXQ7XG59XG4vKipcbiAqIERlY29tcG9zZXMgdGhlIGR1cmF0aW9uIGJldHdlZW4gdHdvIGRhdGVzIGFjcm9zcyBhIHJhbmdlIG9mIHVuaXRzLCBmcm9tXG4gKiBsYXJnZXN0VW5pdCBkb3duIHRvIHNtYWxsZXN0VW5pdC4gRWFjaCB1bml0J3MgdmFsdWUgaXMgdGhlIHJlbWFpbmRlciBhZnRlclxuICogc3VidHJhY3RpbmcgYWxsIGxhcmdlciB1bml0cy5cbiAqLyBmdW5jdGlvbiBkZWNvbXBvc2UoZnJvbSwgdG8sIGxhcmdlc3RVbml0LCBzbWFsbGVzdFVuaXQpIHtcbiAgICBjb25zdCBzdGFydElkeCA9IFVOSVRfT1JERVIuaW5kZXhPZihsYXJnZXN0VW5pdCk7XG4gICAgY29uc3QgZW5kSWR4ID0gVU5JVF9PUkRFUi5pbmRleE9mKHNtYWxsZXN0VW5pdCk7XG4gICAgY29uc3QgdW5pdHMgPSBVTklUX09SREVSLnNsaWNlKHN0YXJ0SWR4LCBlbmRJZHggKyAxKTtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBsZXQgY3VycmVudCA9IGZyb207XG4gICAgZm9yIChjb25zdCB1bml0IG9mIHVuaXRzKXtcbiAgICAgICAgY29uc3QgZGlmZiA9IHRvLmRpZmYoY3VycmVudCwgdW5pdCk7XG4gICAgICAgIHJlc3VsdFt1bml0XSA9IGRpZmY7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmFkZChkaWZmLCB1bml0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gYmV0d2VlbiB0d28gZGF0ZXMgYXMgYSBzdHJ1Y3R1cmVkIGR1cmF0aW9uIG9iamVjdC5cbiAqXG4gKiBXaGVuIGNhbGxlZCB3aXRoIG5vIG9wdGlvbnMgb3IgYSBzaW5nbGUgdW5pdCBzdHJpbmcsIHRoZSB1bml0IGlzIGF1dG8tc2VsZWN0ZWRcbiAqIHVzaW5nIGRheWpzIHJlbGF0aXZlVGltZSB0aHJlc2hvbGRzOlxuICogLSA8IDQ1IHNlY29uZHMg4oaSIHNlY29uZHNcbiAqIC0gPCA0NSBtaW51dGVzIOKGkiBtaW51dGVzXG4gKiAtIDwgMjIgaG91cnMg4oaSIGhvdXJzXG4gKiAtIDwgMjYgZGF5cyDihpIgZGF5c1xuICogLSA8IDExIG1vbnRocyDihpIgbW9udGhzXG4gKiAtIG90aGVyd2lzZSDihpIgeWVhcnNcbiAqXG4gKiBXaXRoIGEge0BsaW5rIER1cmF0aW9uT3B0aW9uc30gb2JqZWN0LCB5b3UgY2FuIG92ZXJyaWRlIHRocmVzaG9sZHMgYW5kL29yIHJlcXVlc3RcbiAqIGEgbXVsdGktdW5pdCBkZWNvbXBvc2l0aW9uIHZpYSBsYXJnZXN0VW5pdC9zbWFsbGVzdFVuaXQuXG4gKlxuICogQHBhcmFtIHN0YXJ0RGF0ZSBUaGUgc3RhcnQgZGF0ZS4gSWYgbnVsbCwgcmV0dXJucyBudWxsLlxuICogQHBhcmFtIGVuZERhdGUgT3B0aW9uYWwuIERlZmF1bHRzIHRvIG5vdy5cbiAqIEBwYXJhbSBvcHRpb25zIEEgdW5pdCBzdHJpbmcgZm9yIHNpbmdsZS11bml0IG91dHB1dCwgb3IgYSBEdXJhdGlvbk9wdGlvbnMgb2JqZWN0LlxuICogQHJldHVybnMgQSBEdXJhdGlvbklucHV0IG9iamVjdCwgb3IgbnVsbCBpZiBlaXRoZXIgZGF0ZSBpcyBudWxsIG9yIHVucGFyc2VhYmxlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBdXRvLXNlbGVjdHMgdGhlIGFwcHJvcHJpYXRlIHVuaXRcbiAqIGR1cmF0aW9uKCcyMDIyLTAxLTAxJywgJzIwMjQtMDctMzAnKSAvLyA9PiB7IHllYXJzOiAyIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTXVsdGktdW5pdCBkZWNvbXBvc2l0aW9uXG4gKiBkdXJhdGlvbignMjAyMi0wMS0wMScsICcyMDI0LTA3LTMwJywgeyBsYXJnZXN0VW5pdDogJ3llYXInLCBzbWFsbGVzdFVuaXQ6ICdkYXknIH0pXG4gKiAvLyA9PiB7IHllYXJzOiAyLCBtb250aHM6IDYsIGRheXM6IDI5IH1cbiAqLyBleHBvcnQgZnVuY3Rpb24gZHVyYXRpb24oc3RhcnREYXRlLCBlbmREYXRlID0gZGF5anMoKSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHRvID0gZGF5anMoZW5kRGF0ZSk7XG4gICAgY29uc3QgZnJvbSA9IHBhcnNlRGF0ZUlucHV0KHN0YXJ0RGF0ZSwgdG8pO1xuICAgIGlmIChmcm9tID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVVuaXQob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBbbm9ybWFsaXplZF06IHRvLmRpZmYoZnJvbSwgbm9ybWFsaXplZClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgeyB0aHJlc2hvbGRzLCBsYXJnZXN0VW5pdDogcmF3TGFyZ2VzdCwgc21hbGxlc3RVbml0OiByYXdTbWFsbGVzdCB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICBpZiAocmF3TGFyZ2VzdCAhPT0gdW5kZWZpbmVkIHx8IHJhd1NtYWxsZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc21hbGxlc3QgPSByYXdTbWFsbGVzdCA/IG5vcm1hbGl6ZVVuaXQocmF3U21hbGxlc3QpIDogdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbGFyZ2VzdDtcbiAgICAgICAgaWYgKHJhd0xhcmdlc3QgPT09ICdhdXRvJyB8fCByYXdMYXJnZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vICdhdXRvJyBvciBvbWl0dGVkOiByZXNvbHZlIHRvIHRoZSBsYXJnZXN0IG5vbi16ZXJvIHVuaXQsIG9yIHNtYWxsZXN0VW5pdCwgd2hpY2hldmVyIGlzIGNvYXJzZXJcbiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVNtYWxsZXN0ID0gc21hbGxlc3QgPz8gJ3NlY29uZHMnO1xuICAgICAgICAgICAgbGFyZ2VzdCA9IGF1dG9MYXJnZXN0VW5pdChmcm9tLCB0bywgZWZmZWN0aXZlU21hbGxlc3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFyZ2VzdCA9IG5vcm1hbGl6ZVVuaXQocmF3TGFyZ2VzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlY29tcG9zZShmcm9tLCB0bywgbGFyZ2VzdCwgc21hbGxlc3QgPz8gbGFyZ2VzdCk7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkID0gYXV0b1NlbGVjdFVuaXQoZnJvbSwgdG8sIHRocmVzaG9sZHMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIFtzZWxlY3RlZF06IHRvLmRpZmYoZnJvbSwgc2VsZWN0ZWQpXG4gICAgfTtcbn1cbmNvbnN0IERFRkFVTFRfRk9STUFUX09QVElPTlMgPSB7XG4gICAgc3R5bGU6ICdzaG9ydCcsXG4gICAgbG9jYWxlTWF0Y2hlcjogJ2xvb2t1cCdcbn07XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIGJldHdlZW4gdHdvIGRhdGVzIGFuZCBmb3JtYXRzIGl0IGFzIGEgbG9jYWxlLWF3YXJlIHN0cmluZy5cbiAqIFVzZXMgdGhlIHNhbWUgdW5pdC1zZWxlY3Rpb24gbG9naWMgYXMge0BsaW5rIGR1cmF0aW9ufSBhbmQgZGVsZWdhdGVzIGZvcm1hdHRpbmdcbiAqIHRvIHtAbGluayBmb3JtYXREdXJhdGlvbn0uXG4gKlxuICogQHBhcmFtIHN0YXJ0RGF0ZSBUaGUgc3RhcnQgZGF0ZS4gSWYgbnVsbCwgcmV0dXJucyBudWxsLlxuICogQHBhcmFtIGVuZERhdGUgT3B0aW9uYWwuIERlZmF1bHRzIHRvIG5vdy5cbiAqIEBwYXJhbSBvcHRpb25zIEEgdW5pdCBzdHJpbmcgZm9yIHNpbmdsZS11bml0IG91dHB1dCwgb3IgYSB7QGxpbmsgRHVyYXRpb25PcHRpb25zV2l0aEZvcm1hdH0gb2JqZWN0LlxuICogICBUaGUgYGZvcm1hdE9wdGlvbnNgIGZpZWxkIGlzIHBhc3NlZCB0byBJbnRsLkR1cmF0aW9uRm9ybWF0IChkZWZhdWx0cyB0byBzaG9ydCBzdHlsZSkuXG4gKiBAcmV0dXJucyBBIGZvcm1hdHRlZCBkdXJhdGlvbiBzdHJpbmcsIG9yIG51bGwgaWYgZWl0aGVyIGRhdGUgaXMgbnVsbCBvciB1bnBhcnNlYWJsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogZm9ybWF0RHVyYXRpb25CZXR3ZWVuKCcyMDIyLTAxLTAxJywgJzIwMjQtMDctMzAnKSAvLyA9PiAnMiB5cnMnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE11bHRpLXVuaXQgd2l0aCBsb25nLWZvcm0gZm9ybWF0dGluZ1xuICogZm9ybWF0RHVyYXRpb25CZXR3ZWVuKCcyMDIyLTAxLTAxJywgJzIwMjQtMDctMzAnLCB7XG4gKiAgIGxhcmdlc3RVbml0OiAneWVhcicsXG4gKiAgIHNtYWxsZXN0VW5pdDogJ2RheScsXG4gKiAgIGZvcm1hdE9wdGlvbnM6IHsgc3R5bGU6ICdsb25nJyB9LFxuICogfSkgLy8gPT4gJzIgeWVhcnMsIDYgbW9udGhzLCAyOSBkYXlzJ1xuICovIGV4cG9ydCBmdW5jdGlvbiBmb3JtYXREdXJhdGlvbkJldHdlZW4oc3RhcnREYXRlLCBlbmREYXRlID0gZGF5anMoKSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGR1cmF0aW9uSW5wdXQgPSBkdXJhdGlvbihzdGFydERhdGUsIGVuZERhdGUsIG9wdGlvbnMpO1xuICAgIGlmIChkdXJhdGlvbklucHV0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGZvcm1hdE9wdHMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5mb3JtYXRPcHRpb25zID8ge1xuICAgICAgICAuLi5ERUZBVUxUX0ZPUk1BVF9PUFRJT05TLFxuICAgICAgICAuLi5vcHRpb25zLmZvcm1hdE9wdGlvbnNcbiAgICB9IDogREVGQVVMVF9GT1JNQVRfT1BUSU9OUztcbiAgICByZXR1cm4gZm9ybWF0RHVyYXRpb24oZHVyYXRpb25JbnB1dCwgZm9ybWF0T3B0cyk7XG59XG4iXSwibmFtZXMiOlsiX2NoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbiIsIm9iaiIsInByaXZhdGVDb2xsZWN0aW9uIiwiVHlwZUVycm9yIiwiX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZ2V0IiwicmVjZWl2ZXIiLCJkZXNjcmlwdG9yIiwiX2NsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvciIsInByaXZhdGVNYXAiLCJhY3Rpb24iLCJfY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXQiLCJfY2xhc3NfcHJpdmF0ZV9maWVsZF9pbml0IiwidmFsdWUiLCJjcmVhdGVDYWxlbmRhciIsInRvQ2FsZW5kYXIiLCJhdHRlbXB0IiwiZGF5anMiLCJpc1RvZGF5Iiwib2JqZWN0U3VwcG9ydCIsInV0YyIsImlzTmlsIiwib21pdCIsImdldExvY2FsZSIsImlzb0Zvcm1hdCIsImlzT21yc0RhdGVTdHJpY3QiLCJvbXJzUGF5bG9hZFN0cmluZyIsInVuZGVmaW5lZCIsImlzT21yc0RhdGVUb2RheSIsImRhdGUiLCJ0b0RhdGVPYmplY3RTdHJpY3QiLCJvbXJzRGF0ZVN0cmluZyIsInRvT21yc0lzb1N0cmluZyIsInRvVVRDIiwiZCIsInBhcnNlRGF0ZSIsImRhdGVTdHJpbmciLCJfcmVnaXN0cnkiLCJXZWFrTWFwIiwiTG9jYWxlQ2FsZW5kYXJzIiwibG9jYWxlIiwiY2FsZW5kYXIiLCJCb29sZWFuIiwia2V5IiwiZGVmYXVsdENhbGVuZGFyIiwiSW50bCIsIk1hcCIsInJlZ2lzdGVyZWRMb2NhbGVDYWxlbmRhcnMiLCJyZWdpc3RlckRlZmF1bHRDYWxlbmRhciIsImdldERlZmF1bHRDYWxlbmRhciIsImxvY2FsZV8iLCJkZWZhdWx0T3B0aW9ucyIsImZvcm1hdFBhcnRpYWxEYXRlIiwib3B0aW9ucyIsInBhcnNlZCIsImNvbnNvbGUiLCJPYmplY3QiLCJmb3JtYXREYXRlIiwiX2xvY2FsZSIsIm1vZGUiLCJ0aW1lIiwiZGF5IiwibW9udGgiLCJ5ZWFyIiwibm9Ub2RheSIsIm51bWJlcmluZ1N5c3RlbSIsImZvcm1hdENhbGVuZGFyIiwiZm9ybWF0dGVyT3B0aW9ucyIsImxvY2FsZVN0cmluZyIsInJ0ZiIsImZvcm1hdHRlciIsInBhcnRzIiwiZm9ybWF0UGFydHMiLCJwYXJ0IiwiaWR4IiwidmFsdWVzIiwicCIsImZvcm1hdFRpbWUiLCJzZXBhcmF0b3IiLCJmb3JtYXREYXRldGltZSIsImNvbnZlcnRUb0xvY2FsZUNhbGVuZGFyIiwibG9jYWxDYWxlbmRhck5hbWUiLCJmb3JtYXREdXJhdGlvbiIsImR1cmF0aW9uIiwicGFyc2VEYXRlSW5wdXQiLCJkYXRlSW5wdXQiLCJyZWZlcmVuY2VEYXRlIiwicGFyc2VkRGF0ZSIsIlVOSVRfT1JERVIiLCJTSU5HVUxBUl9UT19QTFVSQUwiLCJub3JtYWxpemVVbml0IiwidW5pdCIsIm5vcm1hbGl6ZVRocmVzaG9sZHMiLCJ0aHJlc2hvbGRzIiwicmVzdWx0IiwiREVGQVVMVF9USFJFU0hPTERTIiwiSW5maW5pdHkiLCJhdXRvU2VsZWN0VW5pdCIsImZyb20iLCJ0byIsInQiLCJhdXRvTGFyZ2VzdFVuaXQiLCJzbWFsbGVzdFVuaXQiLCJzbWFsbGVzdElkeCIsImkiLCJkZWNvbXBvc2UiLCJsYXJnZXN0VW5pdCIsInN0YXJ0SWR4IiwiZW5kSWR4IiwidW5pdHMiLCJjdXJyZW50IiwiZGlmZiIsInN0YXJ0RGF0ZSIsImVuZERhdGUiLCJub3JtYWxpemVkIiwicmF3TGFyZ2VzdCIsInJhd1NtYWxsZXN0Iiwic21hbGxlc3QiLCJsYXJnZXN0IiwiZWZmZWN0aXZlU21hbGxlc3QiLCJzZWxlY3RlZCIsIkRFRkFVTFRfRk9STUFUX09QVElPTlMiLCJmb3JtYXREdXJhdGlvbkJldHdlZW4iLCJkdXJhdGlvbklucHV0IiwiZm9ybWF0T3B0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBU0EsNkJBQTZCQyxHQUFHLEVBQUVDLGlCQUFpQjtJQUN4RCxJQUFJQSxrQkFBa0IsR0FBRyxDQUFDRCxNQUFNO1FBQzVCLE1BQU0sSUFBSUUsVUFBVTtJQUN4QjtBQUNKO0FBQ0EsU0FBU0MsNEJBQTRCQyxRQUFRLEVBQUVDLFVBQVU7SUFDckQsSUFBSUEsV0FBVyxHQUFHLEVBQUU7UUFDaEIsT0FBT0EsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDRDtJQUMvQjtJQUNBLE9BQU9DLFdBQVcsS0FBSztBQUMzQjtBQUNBLFNBQVNDLGdDQUFnQ0YsUUFBUSxFQUFFRyxVQUFVLEVBQUVDLE1BQU07SUFDakUsSUFBSSxDQUFDRCxXQUFXLEdBQUcsQ0FBQ0gsV0FBVztRQUMzQixNQUFNLElBQUlGLFVBQVUsa0JBQWtCTSxTQUFTO0lBQ25EO0lBQ0EsT0FBT0QsV0FBVyxHQUFHLENBQUNIO0FBQzFCO0FBQ0EsU0FBU0sseUJBQXlCTCxRQUFRLEVBQUVHLFVBQVU7SUFDbEQsSUFBSUYsYUFBYUMsZ0NBQWdDRixVQUFVRyxZQUFZO0lBQ3ZFLE9BQU9KLDRCQUE0QkMsVUFB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\n//# sourceURL=webpack-internal:///../../framework/esm-utils/dist/dates/date-util.js\n\n}");
5084
+ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n convertToLocaleCalendar: () => (convertToLocaleCalendar),\n duration: () => (duration),\n formatDate: () => (formatDate),\n formatDatetime: () => (formatDatetime),\n formatDuration: () => (formatDuration),\n formatDurationBetween: () => (formatDurationBetween),\n formatPartialDate: () => (formatPartialDate),\n formatTime: () => (formatTime),\n getDefaultCalendar: () => (getDefaultCalendar),\n isOmrsDateStrict: () => (isOmrsDateStrict),\n isOmrsDateToday: () => (isOmrsDateToday),\n parseDate: () => (parseDate),\n parseDateInput: () => (parseDateInput),\n registerDefaultCalendar: () => (registerDefaultCalendar),\n toDateObjectStrict: () => (toDateObjectStrict),\n toOmrsIsoString: () => (toOmrsIsoString)\n});\n/* import */ var _internationalized_date__rspack_import_8 = __webpack_require__(\"../../../node_modules/@internationalized/date/dist/conversion.mjs\");\n/* import */ var _internationalized_date__rspack_import_9 = __webpack_require__(\"../../../node_modules/@internationalized/date/dist/createCalendar.mjs\");\n/* import */ var any_date_parser__rspack_import_4 = __webpack_require__(\"../../../node_modules/any-date-parser/dist/index.mjs\");\n/* import */ var dayjs__rspack_import_0 = __webpack_require__(\"webpack/sharing/consume/default/dayjs/dayjs\");\n/* import */ var dayjs__rspack_import_0_default = /*#__PURE__*/__webpack_require__.n(dayjs__rspack_import_0);\n/* import */ var dayjs_plugin_isToday_js__rspack_import_1 = __webpack_require__(\"../../../node_modules/dayjs/plugin/isToday.js\");\n/* import */ var dayjs_plugin_objectSupport_js__rspack_import_2 = __webpack_require__(\"../../../node_modules/dayjs/plugin/objectSupport.js\");\n/* import */ var dayjs_plugin_utc_js__rspack_import_3 = __webpack_require__(\"../../../node_modules/dayjs/plugin/utc.js\");\n/* import */ var lodash_es__rspack_import_6 = __webpack_require__(\"../../../node_modules/lodash-es/isNil.js\");\n/* import */ var lodash_es__rspack_import_7 = __webpack_require__(\"../../../node_modules/lodash-es/omit.js\");\n/* import */ var _index_js__rspack_import_5 = __webpack_require__(\"../../framework/esm-utils/dist/get-locale.js\");\nfunction _check_private_redeclaration(obj, privateCollection) {\n if (privateCollection.has(obj)) {\n throw new TypeError(\"Cannot initialize the same private elements twice on an object\");\n }\n}\nfunction _class_apply_descriptor_get(receiver, descriptor) {\n if (descriptor.get) {\n return descriptor.get.call(receiver);\n }\n return descriptor.value;\n}\nfunction _class_extract_field_descriptor(receiver, privateMap, action) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to \" + action + \" private field on non-instance\");\n }\n return privateMap.get(receiver);\n}\nfunction _class_private_field_get(receiver, privateMap) {\n var descriptor = _class_extract_field_descriptor(receiver, privateMap, \"get\");\n return _class_apply_descriptor_get(receiver, descriptor);\n}\nfunction _class_private_field_init(obj, privateMap, value) {\n _check_private_redeclaration(obj, privateMap);\n privateMap.set(obj, value);\n}\n/**\n * @module\n * @category Date and Time\n */ \n\n\n\n\n\n\n\ndayjs__rspack_import_0_default().extend(dayjs_plugin_isToday_js__rspack_import_1);\ndayjs__rspack_import_0_default().extend(dayjs_plugin_utc_js__rspack_import_3);\ndayjs__rspack_import_0_default().extend(dayjs_plugin_objectSupport_js__rspack_import_2);\nconst isoFormat = 'YYYY-MM-DDTHH:mm:ss.SSSZZ';\nconst isoCalendarDate = /^(\\d{4})(?:-(\\d{2})(?:-(\\d{2}))?)?$/;\n/**\n * Parses ISO calendar dates independently of the display locale, preserving missing fields.\n * Invalid ISO dates must not fall back to a parser that may reinterpret or normalize them.\n */ function parseDateString(dateString, locale) {\n const match = isoCalendarDate.exec(dateString);\n if (!match) {\n return (0,any_date_parser__rspack_import_4.attempt)(dateString, locale);\n }\n const year = Number(match[1]);\n const month = match[2] === undefined ? undefined : Number(match[2]);\n const day = match[3] === undefined ? undefined : Number(match[3]);\n // Check for calendar overflow in UTC. setUTCFullYear also preserves years below 100.\n const date = new Date(0);\n date.setUTCFullYear(year, (month ?? 1) - 1, day ?? 1);\n if (date.getUTCFullYear() !== year || date.getUTCMonth() !== (month ?? 1) - 1 || date.getUTCDate() !== (day ?? 1)) {\n return {\n invalid: `Invalid ISO calendar date '${dateString}'`\n };\n }\n return {\n year,\n ...month !== undefined && {\n month\n },\n ...day !== undefined && {\n day\n }\n };\n}\n/**\n * This function checks whether a date string is the OpenMRS ISO format.\n * The format should be YYYY-MM-DDTHH:mm:ss.SSSZZ\n */ function isOmrsDateStrict(omrsPayloadString) {\n // omrs format 2018-03-19T00:00:00.000+0300\n if (omrsPayloadString === null || omrsPayloadString === undefined || omrsPayloadString.trim().length !== 28) {\n return false;\n }\n omrsPayloadString = omrsPayloadString.trim();\n // 11th character will always be T\n if (omrsPayloadString[10] !== 'T') {\n return false;\n }\n // checking time format\n if (omrsPayloadString[13] !== ':' || omrsPayloadString[16] !== ':' || omrsPayloadString[19] !== '.') {\n return false;\n }\n // checking UTC offset format\n if (!(omrsPayloadString[23] === '+' || omrsPayloadString[23] === '-')) {\n return false;\n }\n return dayjs__rspack_import_0_default()(omrsPayloadString, isoFormat).isValid();\n}\n/**\n * Checks if the provided date is today.\n *\n * @param date The date to check.\n * @returns `true` if the date is today, `false` otherwise.\n */ function isOmrsDateToday(date) {\n return dayjs__rspack_import_0_default()(date).isToday();\n}\n/**\n * Converts the object to a date object if it is an OpenMRS ISO date time string.\n * Otherwise returns null.\n */ function toDateObjectStrict(omrsDateString) {\n if (!isOmrsDateStrict(omrsDateString)) {\n return null;\n }\n return dayjs__rspack_import_0_default()(omrsDateString, isoFormat).toDate();\n}\n/**\n * Formats the input to OpenMRS ISO format: \"YYYY-MM-DDTHH:mm:ss.SSSZZ\".\n */ function toOmrsIsoString(date, toUTC = false) {\n let d = dayjs__rspack_import_0_default()(date);\n if (toUTC) {\n d = d.utc();\n }\n return d.format(isoFormat);\n}\n/**\n * Utility function to parse an arbitrary string into a date.\n * Uses `dayjs(dateString)`.\n */ function parseDate(dateString) {\n return dayjs__rspack_import_0_default()(dateString).toDate();\n}\nvar _registry = /*#__PURE__*/ new WeakMap();\n/**\n * Internal cache for per-locale calendars\n */ class LocaleCalendars {\n register(locale, calendar) {\n _class_private_field_get(this, _registry).set(locale, calendar);\n }\n getCalendar(locale) {\n if (!Boolean(locale)) {\n return undefined;\n }\n if (locale.calendar) {\n return locale.calendar;\n }\n if (locale.region) {\n const key = `${locale.language}-${locale.region}`;\n if (_class_private_field_get(this, _registry).has(key)) {\n return _class_private_field_get(this, _registry).get(key);\n }\n }\n if (locale.language && _class_private_field_get(this, _registry).has(locale.language)) {\n return _class_private_field_get(this, _registry).get(locale.language);\n }\n const defaultCalendar = new Intl.DateTimeFormat(locale.toString()).resolvedOptions().calendar;\n // cache this result\n _class_private_field_get(this, _registry).set(`${locale.language}${locale.region ? `-${locale.region}` : ''}`, defaultCalendar);\n return defaultCalendar;\n }\n constructor(){\n _class_private_field_init(this, _registry, {\n writable: true,\n value: new Map()\n });\n }\n}\nconst registeredLocaleCalendars = new LocaleCalendars();\n/**\n * Provides the name of the calendar to associate, as a default, with the given base locale.\n *\n * @example\n * ```\n * registerDefaultCalendar('en', 'buddhist') // sets the default calendar for the 'en' locale to Buddhist.\n * ```\n *\n * @param locale the locale to register this calendar for\n * @param calendar the calendar to use for this registration\n */ function registerDefaultCalendar(locale, calendar) {\n registeredLocaleCalendars.register(locale, calendar);\n}\n/**\n * Retrieves the default calendar for the specified locale if any.\n *\n * @param locale the locale to look-up\n */ function getDefaultCalendar(locale) {\n const locale_ = locale ?? (0,_index_js__rspack_import_5.getLocale)();\n return registeredLocaleCalendars.getCalendar(locale_ instanceof Intl.Locale ? locale_ : new Intl.Locale(locale_));\n}\nconst defaultOptions = {\n mode: 'standard',\n time: 'for today',\n day: true,\n month: true,\n year: true,\n noToday: false\n};\n/**\n * Formats the string representing a date, including partial representations of dates, according to the current\n * locale and the given options.\n *\n * Default options:\n * - mode: \"standard\",\n * - time: \"for today\",\n * - day: true,\n * - month: true,\n * - year: true\n * - noToday: false\n *\n * If the date is today then \"Today\" is produced (in the locale language).\n * This behavior can be disabled with `noToday: true`.\n *\n * When time is included, it is appended with a comma and a space. This\n * agrees with the output of `Date.prototype.toLocaleString` for *most*\n * locales.\n *\n * @param dateString The date string to parse and format.\n * @param options Optional formatting options.\n * @returns The formatted date string, or `null` if the input cannot be parsed.\n */ // TODO: Shouldn't throw on null input\nfunction formatPartialDate(dateString, options = {}) {\n const locale = (0,_index_js__rspack_import_5.getLocale)();\n let parsed = parseDateString(dateString, locale);\n if (parsed.invalid) {\n console.warn(`Could not parse invalid date '${dateString}'`);\n return null;\n }\n // hack here but any date interprets 2000-01, etc. as yyyy-dd rather than yyyy-mm\n if (!(0,lodash_es__rspack_import_6[\"default\"])(parsed.day) && (0,lodash_es__rspack_import_6[\"default\"])(parsed.month)) {\n parsed = Object.assign({}, (0,lodash_es__rspack_import_7[\"default\"])(parsed, 'day'), {\n month: parsed.day\n });\n }\n // dayjs' object support uses 0-based months, whereas any-date-parser uses 1-based months\n if (parsed.month) {\n parsed.month -= 1;\n }\n // in dayjs day is day of week; in any-date-parser, its day of month, so we need to convert them\n if (parsed.day) {\n parsed = Object.assign({}, (0,lodash_es__rspack_import_7[\"default\"])(parsed, 'day'), {\n date: parsed.day\n });\n }\n const date = dayjs__rspack_import_0_default()().set(parsed).toDate();\n if ((0,lodash_es__rspack_import_6[\"default\"])(parsed.year)) {\n options.year = false;\n }\n if ((0,lodash_es__rspack_import_6[\"default\"])(parsed.month)) {\n options.month = false;\n }\n if ((0,lodash_es__rspack_import_6[\"default\"])(parsed.date)) {\n options.day = false;\n }\n return formatDate(date, options);\n}\n/**\n * Formats the input date according to the current locale and the\n * given options.\n *\n * Default options:\n * - mode: \"standard\",\n * - time: \"for today\",\n * - day: true,\n * - month: true,\n * - year: true\n * - noToday: false\n *\n * If the date is today then \"Today\" is produced (in the locale language).\n * This behavior can be disabled with `noToday: true`.\n *\n * When time is included, it is appended with a comma and a space. This\n * agrees with the output of `Date.prototype.toLocaleString` for *most*\n * locales.\n *\n * @param date The date to format.\n * @param options Optional formatting options.\n * @returns The formatted date string.\n */ // TODO: Shouldn't throw on null input\nfunction formatDate(date, options) {\n let locale = options?.locale ?? (0,_index_js__rspack_import_5.getLocale)();\n const _locale = new Intl.Locale(locale);\n const { calendar, mode, time, day, month, year, noToday, numberingSystem } = {\n ...defaultOptions,\n ...{\n noToday: _locale.language === 'am' ? true : false\n },\n ...options\n };\n const formatCalendar = calendar ?? getDefaultCalendar(_locale);\n const formatterOptions = {\n calendar: formatCalendar,\n year: year ? 'numeric' : undefined,\n month: month ? 'short' : undefined,\n day: day ? '2-digit' : undefined,\n numberingSystem\n };\n let localeString;\n const isToday = dayjs__rspack_import_0_default()(date).isToday();\n if (isToday && !noToday) {\n // This produces the word \"Today\" in the language of `locale`\n const rtf = new Intl.RelativeTimeFormat(locale, {\n numeric: 'auto'\n });\n localeString = rtf.format(0, 'day');\n localeString = localeString[0].toLocaleUpperCase(locale) + localeString.slice(1);\n } else {\n if (_locale.language === 'en') {\n // This locale override is here rather than in `getLocale`\n // because Americans should see AM/PM for times.\n locale = 'en-GB';\n }\n const formatter = new Intl.DateTimeFormat(locale, formatterOptions);\n let parts = formatter.formatToParts(date);\n if ((_locale.language === 'en' || _locale.language === 'am') && mode == 'standard' && year && day) {\n // Custom formatting for English and Amharic. Use hyphens instead of spaces.\n parts = parts.map(formatParts('-'));\n }\n if (mode == 'wide') {\n parts = parts.map(formatParts(' — ')); // space-emdash-space\n }\n // omit the era when using the Ethiopic calendar\n if (formatterOptions.calendar === 'ethiopic') {\n parts = parts.filter((part, idx, values)=>{\n if (part.type === 'era' || part.type === 'literal' && idx < values.length - 1 && values[idx + 1].type === 'era') {\n return false;\n }\n return true;\n });\n }\n localeString = parts.map((p)=>p.value).join('');\n }\n if (time === true || isToday && time === 'for today') {\n localeString += `, ${formatTime(date)}`;\n }\n return localeString;\n}\n// Internal curried call-back for map()\nconst formatParts = (separator)=>{\n return (part, idx, values)=>{\n if (part.type !== 'literal' || part.value !== ' ') {\n return part;\n }\n if (idx < values.length - 1 && values[idx + 1].type === 'era') {\n return part;\n }\n return {\n type: 'literal',\n value: separator\n };\n };\n};\n/**\n * Formats the input as a time, according to the current locale.\n * 12-hour or 24-hour clock depends on locale.\n *\n * @param date The date whose time portion should be formatted.\n * @returns The formatted time string (e.g., \"2:30 PM\" or \"14:30\").\n */ function formatTime(date) {\n return date.toLocaleTimeString((0,_index_js__rspack_import_5.getLocale)(), {\n hour: '2-digit',\n minute: '2-digit'\n });\n}\n/**\n * Formats the input into a string showing the date and time, according\n * to the current locale. The `mode` parameter is as described for\n * `formatDate`.\n *\n * This is created by concatenating the results of `formatDate`\n * and `formatTime` with a comma and space. This agrees with the\n * output of `Date.prototype.toLocaleString` for *most* locales.\n *\n * @param date The date to format.\n * @param options Optional formatting options (same as formatDate, except time is always included).\n * @returns The formatted date and time string.\n */ function formatDatetime(date, options) {\n return formatDate(date, {\n ...options,\n time: true\n });\n}\n/**\n * Converts a calendar date to the equivalent locale calendar date.\n * @returns CalendarDate\n */ function convertToLocaleCalendar(date, locale) {\n let locale_ = typeof locale === 'string' ? new Intl.Locale(locale) : locale;\n const localCalendarName = getDefaultCalendar(locale_);\n return localCalendarName ? (0,_internationalized_date__rspack_import_8.toCalendar)(date, (0,_internationalized_date__rspack_import_9.createCalendar)(localCalendarName)) : date;\n}\n/**\n * Formats the input duration according to the current locale.\n *\n * @param duration The duration to format (DurationInput object).\n * @param options Optional options for formatting.\n * @returns The formatted duration string.\n */ function formatDuration(duration, options) {\n const formatter = new Intl.DurationFormat((0,_index_js__rspack_import_5.getLocale)(), options);\n return formatter.format(duration);\n}\n/**\n * Parses a date input into a dayjs object. ISO calendar dates are parsed independently of locale;\n * other strings use any-date-parser with corrections for its month/day representation differences\n * with dayjs. Non-string inputs are passed directly to dayjs.\n *\n * @param dateInput The date to parse.\n * @param referenceDate Used as the base when resolving partial string dates (e.g., '2000' resolves missing fields from this date).\n * @returns A dayjs object, or null if the string could not be parsed.\n */ function parseDateInput(dateInput, referenceDate) {\n if (dateInput == null) {\n return null;\n }\n if (typeof dateInput === 'string') {\n const locale = (0,_index_js__rspack_import_5.getLocale)();\n let parsedDate = parseDateString(dateInput, locale);\n if (parsedDate.invalid) {\n console.warn(`Could not interpret '${dateInput}' as a date`);\n return null;\n }\n // hack here but any date interprets 2000-01, etc. as yyyy-dd rather than yyyy-mm\n if (parsedDate.day && !parsedDate.month) {\n parsedDate = {\n ...(0,lodash_es__rspack_import_7[\"default\"])(parsedDate, 'day'),\n ...{\n month: parsedDate.day\n }\n };\n }\n // dayjs' object support uses 0-based months, whereas any-date-parser uses 1-based months\n if (parsedDate.month) {\n parsedDate.month -= 1;\n }\n // in dayjs day is day of week; in any-date-parser, its day of month, so we need to convert them\n if (parsedDate.day) {\n parsedDate = {\n ...(0,lodash_es__rspack_import_7[\"default\"])(parsedDate, 'day'),\n ...{\n date: parsedDate.day\n }\n };\n }\n return dayjs__rspack_import_0_default()(referenceDate).set(parsedDate);\n }\n return dayjs__rspack_import_0_default()(dateInput);\n}\nconst UNIT_ORDER = [\n 'years',\n 'months',\n 'days',\n 'hours',\n 'minutes',\n 'seconds'\n];\nconst SINGULAR_TO_PLURAL = {\n second: 'seconds',\n minute: 'minutes',\n hour: 'hours',\n day: 'days',\n month: 'months',\n year: 'years'\n};\nfunction normalizeUnit(unit) {\n return SINGULAR_TO_PLURAL[unit] ?? unit;\n}\n/**\n * Normalizes threshold keys from singular/plural to plural, then merges with defaults.\n */ function normalizeThresholds(thresholds) {\n const result = {\n ...DEFAULT_THRESHOLDS\n };\n if (thresholds) {\n for (const [key, value] of Object.entries(thresholds)){\n if (value !== undefined) {\n result[normalizeUnit(key)] = value;\n }\n }\n }\n return result;\n}\nconst DEFAULT_THRESHOLDS = {\n seconds: 45,\n minutes: 45,\n hours: 22,\n days: 26,\n months: 11,\n years: Infinity\n};\n/**\n * Auto-selects the appropriate unit based on the magnitude of the duration,\n * using the provided thresholds (or defaults).\n */ function autoSelectUnit(from, to, thresholds) {\n const t = normalizeThresholds(thresholds);\n if (to.diff(from, 'seconds') < t.seconds) return 'seconds';\n if (to.diff(from, 'minutes') < t.minutes) return 'minutes';\n if (to.diff(from, 'hours') < t.hours) return 'hours';\n if (to.diff(from, 'days') < t.days) return 'days';\n if (to.diff(from, 'months') < t.months) return 'months';\n return 'years';\n}\n/**\n * Finds the largest unit with a non-zero diff, or falls back to smallestUnit.\n * Mirrors the Temporal.Duration.round() 'auto' behavior for largestUnit.\n */ function autoLargestUnit(from, to, smallestUnit) {\n const smallestIdx = UNIT_ORDER.indexOf(smallestUnit);\n for(let i = 0; i < UNIT_ORDER.length; i++){\n const unit = UNIT_ORDER[i];\n if (to.diff(from, unit) > 0) {\n // Return this unit or smallestUnit, whichever is coarser (lower index)\n return i <= smallestIdx ? unit : smallestUnit;\n }\n }\n return smallestUnit;\n}\n/**\n * Decomposes the duration between two dates across a range of units, from\n * largestUnit down to smallestUnit. Each unit's value is the remainder after\n * subtracting all larger units.\n */ function decompose(from, to, largestUnit, smallestUnit) {\n const startIdx = UNIT_ORDER.indexOf(largestUnit);\n const endIdx = UNIT_ORDER.indexOf(smallestUnit);\n const units = UNIT_ORDER.slice(startIdx, endIdx + 1);\n const result = {};\n let current = from;\n for (const unit of units){\n const diff = to.diff(current, unit);\n result[unit] = diff;\n current = current.add(diff, unit);\n }\n return result;\n}\n/**\n * Calculates the duration between two dates as a structured duration object.\n *\n * When called with no options or a single unit string, the unit is auto-selected\n * using dayjs relativeTime thresholds:\n * - < 45 seconds → seconds\n * - < 45 minutes → minutes\n * - < 22 hours → hours\n * - < 26 days → days\n * - < 11 months → months\n * - otherwise → years\n *\n * With a {@link DurationOptions} object, you can override thresholds and/or request\n * a multi-unit decomposition via largestUnit/smallestUnit.\n *\n * @param startDate The start date. If null, returns null.\n * @param endDate Optional. Defaults to now.\n * @param options A unit string for single-unit output, or a DurationOptions object.\n * @returns A DurationInput object, or null if either date is null or unparseable.\n *\n * @example\n * // Auto-selects the appropriate unit\n * duration('2022-01-01', '2024-07-30') // => { years: 2 }\n *\n * @example\n * // Multi-unit decomposition\n * duration('2022-01-01', '2024-07-30', { largestUnit: 'year', smallestUnit: 'day' })\n * // => { years: 2, months: 6, days: 29 }\n */ function duration(startDate, endDate = dayjs__rspack_import_0_default()(), options) {\n const to = dayjs__rspack_import_0_default()(endDate);\n const from = parseDateInput(startDate, to);\n if (from == null) {\n return null;\n }\n if (typeof options === 'string') {\n const normalized = normalizeUnit(options);\n return {\n [normalized]: to.diff(from, normalized)\n };\n }\n const { thresholds, largestUnit: rawLargest, smallestUnit: rawSmallest } = options ?? {};\n if (rawLargest !== undefined || rawSmallest !== undefined) {\n const smallest = rawSmallest ? normalizeUnit(rawSmallest) : undefined;\n let largest;\n if (rawLargest === 'auto' || rawLargest === undefined) {\n // 'auto' or omitted: resolve to the largest non-zero unit, or smallestUnit, whichever is coarser\n const effectiveSmallest = smallest ?? 'seconds';\n largest = autoLargestUnit(from, to, effectiveSmallest);\n } else {\n largest = normalizeUnit(rawLargest);\n }\n return decompose(from, to, largest, smallest ?? largest);\n }\n const selected = autoSelectUnit(from, to, thresholds);\n return {\n [selected]: to.diff(from, selected)\n };\n}\nconst DEFAULT_FORMAT_OPTIONS = {\n style: 'short',\n localeMatcher: 'lookup'\n};\n/**\n * Calculates the duration between two dates and formats it as a locale-aware string.\n * Uses the same unit-selection logic as {@link duration} and delegates formatting\n * to {@link formatDuration}.\n *\n * @param startDate The start date. If null, returns null.\n * @param endDate Optional. Defaults to now.\n * @param options A unit string for single-unit output, or a {@link DurationOptionsWithFormat} object.\n * The `formatOptions` field is passed to Intl.DurationFormat (defaults to short style).\n * @returns A formatted duration string, or null if either date is null or unparseable.\n *\n * @example\n * formatDurationBetween('2022-01-01', '2024-07-30') // => '2 yrs'\n *\n * @example\n * // Multi-unit with long-form formatting\n * formatDurationBetween('2022-01-01', '2024-07-30', {\n * largestUnit: 'year',\n * smallestUnit: 'day',\n * formatOptions: { style: 'long' },\n * }) // => '2 years, 6 months, 29 days'\n */ function formatDurationBetween(startDate, endDate = dayjs__rspack_import_0_default()(), options) {\n const durationInput = duration(startDate, endDate, options);\n if (durationInput == null) {\n return null;\n }\n const formatOpts = typeof options === 'object' && options.formatOptions ? {\n ...DEFAULT_FORMAT_OPTIONS,\n ...options.formatOptions\n } : DEFAULT_FORMAT_OPTIONS;\n return formatDuration(durationInput, formatOpts);\n}\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC9lc218YnVpbHRpbjpzd2MtbG9hZGVyPz9ydWxlU2V0WzFdLnJ1bGVzWzVdLnVzZVswXSEvaG9tZS9ydW5uZXIvd29yay9vcGVubXJzLWVzbS1jb3JlL29wZW5tcnMtZXNtLWNvcmUvcGFja2FnZXMvZnJhbWV3b3JrL2VzbS11dGlscy9kaXN0L2RhdGVzL2RhdGUtdXRpbC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS11dGlscy9kaXN0L2RhdGVzL2RhdGUtdXRpbC5qcz9lMzYwIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9jaGVja19wcml2YXRlX3JlZGVjbGFyYXRpb24ob2JqLCBwcml2YXRlQ29sbGVjdGlvbikge1xuICAgIGlmIChwcml2YXRlQ29sbGVjdGlvbi5oYXMob2JqKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGluaXRpYWxpemUgdGhlIHNhbWUgcHJpdmF0ZSBlbGVtZW50cyB0d2ljZSBvbiBhbiBvYmplY3RcIik7XG4gICAgfVxufVxuZnVuY3Rpb24gX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZ2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yKSB7XG4gICAgaWYgKGRlc2NyaXB0b3IuZ2V0KSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldC5jYWxsKHJlY2VpdmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IudmFsdWU7XG59XG5mdW5jdGlvbiBfY2xhc3NfZXh0cmFjdF9maWVsZF9kZXNjcmlwdG9yKHJlY2VpdmVyLCBwcml2YXRlTWFwLCBhY3Rpb24pIHtcbiAgICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIFwiICsgYWN0aW9uICsgXCIgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XG4gICAgfVxuICAgIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XG59XG5mdW5jdGlvbiBfY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXQocmVjZWl2ZXIsIHByaXZhdGVNYXApIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IF9jbGFzc19leHRyYWN0X2ZpZWxkX2Rlc2NyaXB0b3IocmVjZWl2ZXIsIHByaXZhdGVNYXAsIFwiZ2V0XCIpO1xuICAgIHJldHVybiBfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9nZXQocmVjZWl2ZXIsIGRlc2NyaXB0b3IpO1xufVxuZnVuY3Rpb24gX2NsYXNzX3ByaXZhdGVfZmllbGRfaW5pdChvYmosIHByaXZhdGVNYXAsIHZhbHVlKSB7XG4gICAgX2NoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbihvYmosIHByaXZhdGVNYXApO1xuICAgIHByaXZhdGVNYXAuc2V0KG9iaiwgdmFsdWUpO1xufVxuLyoqXG4gKiBAbW9kdWxlXG4gKiBAY2F0ZWdvcnkgRGF0ZSBhbmQgVGltZVxuICovIGltcG9ydCB7IGNyZWF0ZUNhbGVuZGFyLCB0b0NhbGVuZGFyIH0gZnJvbSBcIkBpbnRlcm5hdGlvbmFsaXplZC9kYXRlXCI7XG5pbXBvcnQgeyBhdHRlbXB0IH0gZnJvbSBcImFueS1kYXRlLXBhcnNlclwiO1xuaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiO1xuaW1wb3J0IGlzVG9kYXkgZnJvbSBcImRheWpzL3BsdWdpbi9pc1RvZGF5LmpzXCI7XG5pbXBvcnQgb2JqZWN0U3VwcG9ydCBmcm9tIFwiZGF5anMvcGx1Z2luL29iamVjdFN1cHBvcnQuanNcIjtcbmltcG9ydCB1dGMgZnJvbSBcImRheWpzL3BsdWdpbi91dGMuanNcIjtcbmltcG9ydCB7IGlzTmlsLCBvbWl0IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgZ2V0TG9jYWxlIH0gZnJvbSBcIi4uL2luZGV4LmpzXCI7XG5kYXlqcy5leHRlbmQoaXNUb2RheSk7XG5kYXlqcy5leHRlbmQodXRjKTtcbmRheWpzLmV4dGVuZChvYmplY3RTdXBwb3J0KTtcbmNvbnN0IGlzb0Zvcm1hdCA9ICdZWVlZLU1NLUREVEhIOm1tOnNzLlNTU1paJztcbmNvbnN0IGlzb0NhbGVuZGFyRGF0ZSA9IC9eKFxcZHs0fSkoPzotKFxcZHsyfSkoPzotKFxcZHsyfSkpPyk/JC87XG4vKipcbiAqIFBhcnNlcyBJU08gY2FsZW5kYXIgZGF0ZXMgaW5kZXBlbmRlbnRseSBvZiB0aGUgZGlzcGxheSBsb2NhbGUsIHByZXNlcnZpbmcgbWlzc2luZyBmaWVsZHMuXG4gKiBJbnZhbGlkIElTTyBkYXRlcyBtdXN0IG5vdCBmYWxsIGJhY2sgdG8gYSBwYXJzZXIgdGhhdCBtYXkgcmVpbnRlcnByZXQgb3Igbm9ybWFsaXplIHRoZW0uXG4gKi8gZnVuY3Rpb24gcGFyc2VEYXRlU3RyaW5nKGRhdGVTdHJpbmcsIGxvY2FsZSkge1xuICAgIGNvbnN0IG1hdGNoID0gaXNvQ2FsZW5kYXJEYXRlLmV4ZWMoZGF0ZVN0cmluZyk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gYXR0ZW1wdChkYXRlU3RyaW5nLCBsb2NhbGUpO1xuICAgIH1cbiAgICBjb25zdCB5ZWFyID0gTnVtYmVyKG1hdGNoWzFdKTtcbiAgICBjb25zdCBtb250aCA9IG1hdGNoWzJdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBOdW1iZXIobWF0Y2hbMl0pO1xuICAgIGNvbnN0IGRheSA9IG1hdGNoWzNdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBOdW1iZXIobWF0Y2hbM10pO1xuICAgIC8vIENoZWNrIGZvciBjYWxlbmRhciBvdmVyZmxvdyBpbiBVVEMuIHNldFVUQ0Z1bGxZZWFyIGFsc28gcHJlc2VydmVzIHllYXJzIGJlbG93IDEwMC5cbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5ZWFyLCAobW9udGggPz8gMSkgLSAxLCBkYXkgPz8gMSk7XG4gICAgaWYgKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSAhPT0geWVhciB8fCBkYXRlLmdldFVUQ01vbnRoKCkgIT09IChtb250aCA/PyAxKSAtIDEgfHwgZGF0ZS5nZXRVVENEYXRlKCkgIT09IChkYXkgPz8gMSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGludmFsaWQ6IGBJbnZhbGlkIElTTyBjYWxlbmRhciBkYXRlICcke2RhdGVTdHJpbmd9J2BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeWVhcixcbiAgICAgICAgLi4ubW9udGggIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgICAgICBtb250aFxuICAgICAgICB9LFxuICAgICAgICAuLi5kYXkgIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgICAgICBkYXlcbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgYSBkYXRlIHN0cmluZyBpcyB0aGUgT3Blbk1SUyBJU08gZm9ybWF0LlxuICogVGhlIGZvcm1hdCBzaG91bGQgYmUgWVlZWS1NTS1ERFRISDptbTpzcy5TU1NaWlxuICovIGV4cG9ydCBmdW5jdGlvbiBpc09tcnNEYXRlU3RyaWN0KG9tcnNQYXlsb2FkU3RyaW5nKSB7XG4gICAgLy8gb21ycyBmb3JtYXQgMjAxOC0wMy0xOVQwMDowMDowMC4wMDArMDMwMFxuICAgIGlmIChvbXJzUGF5bG9hZFN0cmluZyA9PT0gbnVsbCB8fCBvbXJzUGF5bG9hZFN0cmluZyA9PT0gdW5kZWZpbmVkIHx8IG9tcnNQYXlsb2FkU3RyaW5nLnRyaW0oKS5sZW5ndGggIT09IDI4KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgb21yc1BheWxvYWRTdHJpbmcgPSBvbXJzUGF5bG9hZFN0cmluZy50cmltKCk7XG4gICAgLy8gMTF0aCBjaGFyYWN0ZXIgd2lsbCBhbHdheXMgYmUgVFxuICAgIGlmIChvbXJzUGF5bG9hZFN0cmluZ1sxMF0gIT09ICdUJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIGNoZWNraW5nIHRpbWUgZm9ybWF0XG4gICAgaWYgKG9tcnNQYXlsb2FkU3RyaW5nWzEzXSAhPT0gJzonIHx8IG9tcnNQYXlsb2FkU3RyaW5nWzE2XSAhPT0gJzonIHx8IG9tcnNQYXlsb2FkU3RyaW5nWzE5XSAhPT0gJy4nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gY2hlY2tpbmcgVVRDIG9mZnNldCBmb3JtYXRcbiAgICBpZiAoIShvbXJzUGF5bG9hZFN0cmluZ1syM10gPT09ICcrJyB8fCBvbXJzUGF5bG9hZFN0cmluZ1syM10gPT09ICctJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZGF5anMob21yc1BheWxvYWRTdHJpbmcsIGlzb0Zvcm1hdCkuaXNWYWxpZCgpO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIGRhdGUgaXMgdG9kYXkuXG4gKlxuICogQHBhcmFtIGRhdGUgVGhlIGRhdGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGRhdGUgaXMgdG9kYXksIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovIGV4cG9ydCBmdW5jdGlvbiBpc09tcnNEYXRlVG9kYXkoZGF0ZSkge1xuICAgIHJldHVybiBkYXlqcyhkYXRlKS5pc1RvZGF5KCk7XG59XG4vKipcbiAqIENvbnZlcnRzIHRoZSBvYmplY3QgdG8gYSBkYXRlIG9iamVjdCBpZiBpdCBpcyBhbiBPcGVuTVJTIElTTyBkYXRlIHRpbWUgc3RyaW5nLlxuICogT3RoZXJ3aXNlIHJldHVybnMgbnVsbC5cbiAqLyBleHBvcnQgZnVuY3Rpb24gdG9EYXRlT2JqZWN0U3RyaWN0KG9tcnNEYXRlU3RyaW5nKSB7XG4gICAgaWYgKCFpc09tcnNEYXRlU3RyaWN0KG9tcnNEYXRlU3RyaW5nKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGRheWpzKG9tcnNEYXRlU3RyaW5nLCBpc29Gb3JtYXQpLnRvRGF0ZSgpO1xufVxuLyoqXG4gKiBGb3JtYXRzIHRoZSBpbnB1dCB0byBPcGVuTVJTIElTTyBmb3JtYXQ6IFwiWVlZWS1NTS1ERFRISDptbTpzcy5TU1NaWlwiLlxuICovIGV4cG9ydCBmdW5jdGlvbiB0b09tcnNJc29TdHJpbmcoZGF0ZSwgdG9VVEMgPSBmYWxzZSkge1xuICAgIGxldCBkID0gZGF5anMoZGF0ZSk7XG4gICAgaWYgKHRvVVRDKSB7XG4gICAgICAgIGQgPSBkLnV0YygpO1xuICAgIH1cbiAgICByZXR1cm4gZC5mb3JtYXQoaXNvRm9ybWF0KTtcbn1cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBwYXJzZSBhbiBhcmJpdHJhcnkgc3RyaW5nIGludG8gYSBkYXRlLlxuICogVXNlcyBgZGF5anMoZGF0ZVN0cmluZylgLlxuICovIGV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGUoZGF0ZVN0cmluZykge1xuICAgIHJldHVybiBkYXlqcyhkYXRlU3RyaW5nKS50b0RhdGUoKTtcbn1cbnZhciBfcmVnaXN0cnkgPSAvKiNfX1BVUkVfXyovIG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEludGVybmFsIGNhY2hlIGZvciBwZXItbG9jYWxlIGNhbGVuZGFyc1xuICovIGNsYXNzIExvY2FsZUNhbGVuZGFycyB7XG4gICAgcmVnaXN0ZXIobG9jYWxlLCBjYWxlbmRhcikge1xuICAgICAgICBfY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXQodGhpcywgX3JlZ2lzdHJ5KS5zZXQobG9jYWxlLCBjYWxlbmRhcik7XG4gICAgfVxuICAgIGdldENhbGVuZGFyKGxvY2FsZSkge1xuICAgICAgICBpZiAoIUJvb2xlYW4obG9jYWxlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxlLmNhbGVuZGFyKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLmNhbGVuZGFyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbGUucmVnaW9uKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBgJHtsb2NhbGUubGFuZ3VhZ2V9LSR7bG9jYWxlLnJlZ2lvbn1gO1xuICAgICAgICAgICAgaWYgKF9jbGFzc19wcml2YXRlX2ZpZWxkX2dldCh0aGlzLCBfcmVnaXN0cnkpLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jbGFzc19wcml2YXRlX2ZpZWxkX2dldCh0aGlzLCBfcmVnaXN0cnkpLmdldChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbGUubGFuZ3VhZ2UgJiYgX2NsYXNzX3ByaXZhdGVfZmllbGRfZ2V0KHRoaXMsIF9yZWdpc3RyeSkuaGFzKGxvY2FsZS5sYW5ndWFnZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBfY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXQodGhpcywgX3JlZ2lzdHJ5KS5nZXQobG9jYWxlLmxhbmd1YWdlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZhdWx0Q2FsZW5kYXIgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUudG9TdHJpbmcoKSkucmVzb2x2ZWRPcHRpb25zKCkuY2FsZW5kYXI7XG4gICAgICAgIC8vIGNhY2hlIHRoaXMgcmVzdWx0XG4gICAgICAgIF9jbGFzc19wcml2YXRlX2ZpZWxkX2dldCh0aGlzLCBfcmVnaXN0cnkpLnNldChgJHtsb2NhbGUubGFuZ3VhZ2V9JHtsb2NhbGUucmVnaW9uID8gYC0ke2xvY2FsZS5yZWdpb259YCA6ICcnfWAsIGRlZmF1bHRDYWxlbmRhcik7XG4gICAgICAgIHJldHVybiBkZWZhdWx0Q2FsZW5kYXI7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIF9jbGFzc19wcml2YXRlX2ZpZWxkX2luaXQodGhpcywgX3JlZ2lzdHJ5LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgTWFwKClcbiAgICAgICAgfSk7XG4gICAgfVxufVxuY29uc3QgcmVnaXN0ZXJlZExvY2FsZUNhbGVuZGFycyA9IG5ldyBMb2NhbGVDYWxlbmRhcnMoKTtcbi8qKlxuICogUHJvdmlkZXMgdGhlIG5hbWUgb2YgdGhlIGNhbGVuZGFyIHRvIGFzc29jaWF0ZSwgYXMgYSBkZWZhdWx0LCB3aXRoIHRoZSBnaXZlbiBiYXNlIGxvY2FsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgXG4gKiByZWdpc3RlckRlZmF1bHRDYWxlbmRhcignZW4nLCAnYnVkZGhpc3QnKSAvLyBzZXRzIHRoZSBkZWZhdWx0IGNhbGVuZGFyIGZvciB0aGUgJ2VuJyBsb2NhbGUgdG8gQnVkZGhpc3QuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbG9jYWxlIHRoZSBsb2NhbGUgdG8gcmVnaXN0ZXIgdGhpcyBjYWxlbmRhciBmb3JcbiAqIEBwYXJhbSBjYWxlbmRhciB0aGUgY2FsZW5kYXIgdG8gdXNlIGZvciB0aGlzIHJlZ2lzdHJhdGlvblxuICovIGV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHRDYWxlbmRhcihsb2NhbGUsIGNhbGVuZGFyKSB7XG4gICAgcmVnaXN0ZXJlZExvY2FsZUNhbGVuZGFycy5yZWdpc3Rlcihsb2NhbGUsIGNhbGVuZGFyKTtcbn1cbi8qKlxuICogUmV0cmlldmVzIHRoZSBkZWZhdWx0IGNhbGVuZGFyIGZvciB0aGUgc3BlY2lmaWVkIGxvY2FsZSBpZiBhbnkuXG4gKlxuICogQHBhcmFtIGxvY2FsZSB0aGUgbG9jYWxlIHRvIGxvb2stdXBcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdENhbGVuZGFyKGxvY2FsZSkge1xuICAgIGNvbnN0IGxvY2FsZV8gPSBsb2NhbGUgPz8gZ2V0TG9jYWxlKCk7XG4gICAgcmV0dXJuIHJlZ2lzdGVyZWRMb2NhbGVDYWxlbmRhcnMuZ2V0Q2FsZW5kYXIobG9jYWxlXyBpbnN0YW5jZW9mIEludGwuTG9jYWxlID8gbG9jYWxlXyA6IG5ldyBJbnRsLkxvY2FsZShsb2NhbGVfKSk7XG59XG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBtb2RlOiAnc3RhbmRhcmQnLFxuICAgIHRpbWU6ICdmb3IgdG9kYXknLFxuICAgIGRheTogdHJ1ZSxcbiAgICBtb250aDogdHJ1ZSxcbiAgICB5ZWFyOiB0cnVlLFxuICAgIG5vVG9kYXk6IGZhbHNlXG59O1xuLyoqXG4gKiBGb3JtYXRzIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZGF0ZSwgaW5jbHVkaW5nIHBhcnRpYWwgcmVwcmVzZW50YXRpb25zIG9mIGRhdGVzLCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnRcbiAqIGxvY2FsZSBhbmQgdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogRGVmYXVsdCBvcHRpb25zOlxuICogIC0gbW9kZTogXCJzdGFuZGFyZFwiLFxuICogIC0gdGltZTogXCJmb3IgdG9kYXlcIixcbiAqICAtIGRheTogdHJ1ZSxcbiAqICAtIG1vbnRoOiB0cnVlLFxuICogIC0geWVhcjogdHJ1ZVxuICogIC0gbm9Ub2RheTogZmFsc2VcbiAqXG4gKiBJZiB0aGUgZGF0ZSBpcyB0b2RheSB0aGVuIFwiVG9kYXlcIiBpcyBwcm9kdWNlZCAoaW4gdGhlIGxvY2FsZSBsYW5ndWFnZSkuXG4gKiBUaGlzIGJlaGF2aW9yIGNhbiBiZSBkaXNhYmxlZCB3aXRoIGBub1RvZGF5OiB0cnVlYC5cbiAqXG4gKiBXaGVuIHRpbWUgaXMgaW5jbHVkZWQsIGl0IGlzIGFwcGVuZGVkIHdpdGggYSBjb21tYSBhbmQgYSBzcGFjZS4gVGhpc1xuICogYWdyZWVzIHdpdGggdGhlIG91dHB1dCBvZiBgRGF0ZS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmdgIGZvciAqbW9zdCpcbiAqIGxvY2FsZXMuXG4gKlxuICogQHBhcmFtIGRhdGVTdHJpbmcgVGhlIGRhdGUgc3RyaW5nIHRvIHBhcnNlIGFuZCBmb3JtYXQuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBmb3JtYXR0aW5nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nLCBvciBgbnVsbGAgaWYgdGhlIGlucHV0IGNhbm5vdCBiZSBwYXJzZWQuXG4gKi8gLy8gVE9ETzogU2hvdWxkbid0IHRocm93IG9uIG51bGwgaW5wdXRcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQYXJ0aWFsRGF0ZShkYXRlU3RyaW5nLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBsb2NhbGUgPSBnZXRMb2NhbGUoKTtcbiAgICBsZXQgcGFyc2VkID0gcGFyc2VEYXRlU3RyaW5nKGRhdGVTdHJpbmcsIGxvY2FsZSk7XG4gICAgaWYgKHBhcnNlZC5pbnZhbGlkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IHBhcnNlIGludmFsaWQgZGF0ZSAnJHtkYXRlU3RyaW5nfSdgKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIGhhY2sgaGVyZSBidXQgYW55IGRhdGUgaW50ZXJwcmV0cyAyMDAwLTAxLCBldGMuIGFzIHl5eXktZGQgcmF0aGVyIHRoYW4geXl5eS1tbVxuICAgIGlmICghaXNOaWwocGFyc2VkLmRheSkgJiYgaXNOaWwocGFyc2VkLm1vbnRoKSkge1xuICAgICAgICBwYXJzZWQgPSBPYmplY3QuYXNzaWduKHt9LCBvbWl0KHBhcnNlZCwgJ2RheScpLCB7XG4gICAgICAgICAgICBtb250aDogcGFyc2VkLmRheVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gZGF5anMnIG9iamVjdCBzdXBwb3J0IHVzZXMgMC1iYXNlZCBtb250aHMsIHdoZXJlYXMgYW55LWRhdGUtcGFyc2VyIHVzZXMgMS1iYXNlZCBtb250aHNcbiAgICBpZiAocGFyc2VkLm1vbnRoKSB7XG4gICAgICAgIHBhcnNlZC5tb250aCAtPSAxO1xuICAgIH1cbiAgICAvLyBpbiBkYXlqcyBkYXkgaXMgZGF5IG9mIHdlZWs7IGluIGFueS1kYXRlLXBhcnNlciwgaXRzIGRheSBvZiBtb250aCwgc28gd2UgbmVlZCB0byBjb252ZXJ0IHRoZW1cbiAgICBpZiAocGFyc2VkLmRheSkge1xuICAgICAgICBwYXJzZWQgPSBPYmplY3QuYXNzaWduKHt9LCBvbWl0KHBhcnNlZCwgJ2RheScpLCB7XG4gICAgICAgICAgICBkYXRlOiBwYXJzZWQuZGF5XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBkYXRlID0gZGF5anMoKS5zZXQocGFyc2VkKS50b0RhdGUoKTtcbiAgICBpZiAoaXNOaWwocGFyc2VkLnllYXIpKSB7XG4gICAgICAgIG9wdGlvbnMueWVhciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaXNOaWwocGFyc2VkLm1vbnRoKSkge1xuICAgICAgICBvcHRpb25zLm1vbnRoID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc05pbChwYXJzZWQuZGF0ZSkpIHtcbiAgICAgICAgb3B0aW9ucy5kYXkgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1hdERhdGUoZGF0ZSwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEZvcm1hdHMgdGhlIGlucHV0IGRhdGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZSBhbmQgdGhlXG4gKiBnaXZlbiBvcHRpb25zLlxuICpcbiAqIERlZmF1bHQgb3B0aW9uczpcbiAqICAtIG1vZGU6IFwic3RhbmRhcmRcIixcbiAqICAtIHRpbWU6IFwiZm9yIHRvZGF5XCIsXG4gKiAgLSBkYXk6IHRydWUsXG4gKiAgLSBtb250aDogdHJ1ZSxcbiAqICAtIHllYXI6IHRydWVcbiAqICAtIG5vVG9kYXk6IGZhbHNlXG4gKlxuICogSWYgdGhlIGRhdGUgaXMgdG9kYXkgdGhlbiBcIlRvZGF5XCIgaXMgcHJvZHVjZWQgKGluIHRoZSBsb2NhbGUgbGFuZ3VhZ2UpLlxuICogVGhpcyBiZWhhdmlvciBjYW4gYmUgZGlzYWJsZWQgd2l0aCBgbm9Ub2RheTogdHJ1ZWAuXG4gKlxuICogV2hlbiB0aW1lIGlzIGluY2x1ZGVkLCBpdCBpcyBhcHBlbmRlZCB3aXRoIGEgY29tbWEgYW5kIGEgc3BhY2UuIFRoaXNcbiAqIGFncmVlcyB3aXRoIHRoZSBvdXRwdXQgb2YgYERhdGUucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nYCBmb3IgKm1vc3QqXG4gKiBsb2NhbGVzLlxuICpcbiAqIEBwYXJhbSBkYXRlIFRoZSBkYXRlIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGZvcm1hdHRpbmcgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcuXG4gKi8gLy8gVE9ETzogU2hvdWxkbid0IHRocm93IG9uIG51bGwgaW5wdXRcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGUsIG9wdGlvbnMpIHtcbiAgICBsZXQgbG9jYWxlID0gb3B0aW9ucz8ubG9jYWxlID8/IGdldExvY2FsZSgpO1xuICAgIGNvbnN0IF9sb2NhbGUgPSBuZXcgSW50bC5Mb2NhbGUobG9jYWxlKTtcbiAgICBjb25zdCB7IGNhbGVuZGFyLCBtb2RlLCB0aW1lLCBkYXksIG1vbnRoLCB5ZWFyLCBub1RvZGF5LCBudW1iZXJpbmdTeXN0ZW0gfSA9IHtcbiAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgIC4uLntcbiAgICAgICAgICAgIG5vVG9kYXk6IF9sb2NhbGUubGFuZ3VhZ2UgPT09ICdhbScgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG4gICAgY29uc3QgZm9ybWF0Q2FsZW5kYXIgPSBjYWxlbmRhciA/PyBnZXREZWZhdWx0Q2FsZW5kYXIoX2xvY2FsZSk7XG4gICAgY29uc3QgZm9ybWF0dGVyT3B0aW9ucyA9IHtcbiAgICAgICAgY2FsZW5kYXI6IGZvcm1hdENhbGVuZGFyLFxuICAgICAgICB5ZWFyOiB5ZWFyID8gJ251bWVyaWMnIDogdW5kZWZpbmVkLFxuICAgICAgICBtb250aDogbW9udGggPyAnc2hvcnQnIDogdW5kZWZpbmVkLFxuICAgICAgICBkYXk6IGRheSA/ICcyLWRpZ2l0JyA6IHVuZGVmaW5lZCxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtXG4gICAgfTtcbiAgICBsZXQgbG9jYWxlU3RyaW5nO1xuICAgIGNvbnN0IGlzVG9kYXkgPSBkYXlqcyhkYXRlKS5pc1RvZGF5KCk7XG4gICAgaWYgKGlzVG9kYXkgJiYgIW5vVG9kYXkpIHtcbiAgICAgICAgLy8gVGhpcyBwcm9kdWNlcyB0aGUgd29yZCBcIlRvZGF5XCIgaW4gdGhlIGxhbmd1YWdlIG9mIGBsb2NhbGVgXG4gICAgICAgIGNvbnN0IHJ0ZiA9IG5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdChsb2NhbGUsIHtcbiAgICAgICAgICAgIG51bWVyaWM6ICdhdXRvJ1xuICAgICAgICB9KTtcbiAgICAgICAgbG9jYWxlU3RyaW5nID0gcnRmLmZvcm1hdCgwLCAnZGF5Jyk7XG4gICAgICAgIGxvY2FsZVN0cmluZyA9IGxvY2FsZVN0cmluZ1swXS50b0xvY2FsZVVwcGVyQ2FzZShsb2NhbGUpICsgbG9jYWxlU3RyaW5nLnNsaWNlKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfbG9jYWxlLmxhbmd1YWdlID09PSAnZW4nKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGxvY2FsZSBvdmVycmlkZSBpcyBoZXJlIHJhdGhlciB0aGFuIGluIGBnZXRMb2NhbGVgXG4gICAgICAgICAgICAvLyBiZWNhdXNlIEFtZXJpY2FucyBzaG91bGQgc2VlIEFNL1BNIGZvciB0aW1lcy5cbiAgICAgICAgICAgIGxvY2FsZSA9ICdlbi1HQic7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBmb3JtYXR0ZXJPcHRpb25zKTtcbiAgICAgICAgbGV0IHBhcnRzID0gZm9ybWF0dGVyLmZvcm1hdFRvUGFydHMoZGF0ZSk7XG4gICAgICAgIGlmICgoX2xvY2FsZS5sYW5ndWFnZSA9PT0gJ2VuJyB8fCBfbG9jYWxlLmxhbmd1YWdlID09PSAnYW0nKSAmJiBtb2RlID09ICdzdGFuZGFyZCcgJiYgeWVhciAmJiBkYXkpIHtcbiAgICAgICAgICAgIC8vIEN1c3RvbSBmb3JtYXR0aW5nIGZvciBFbmdsaXNoIGFuZCBBbWhhcmljLiBVc2UgaHlwaGVucyBpbnN0ZWFkIG9mIHNwYWNlcy5cbiAgICAgICAgICAgIHBhcnRzID0gcGFydHMubWFwKGZvcm1hdFBhcnRzKCctJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2RlID09ICd3aWRlJykge1xuICAgICAgICAgICAgcGFydHMgPSBwYXJ0cy5tYXAoZm9ybWF0UGFydHMoJyDigJQgJykpOyAvLyBzcGFjZS1lbWRhc2gtc3BhY2VcbiAgICAgICAgfVxuICAgICAgICAvLyBvbWl0IHRoZSBlcmEgd2hlbiB1c2luZyB0aGUgRXRoaW9waWMgY2FsZW5kYXJcbiAgICAgICAgaWYgKGZvcm1hdHRlck9wdGlvbnMuY2FsZW5kYXIgPT09ICdldGhpb3BpYycpIHtcbiAgICAgICAgICAgIHBhcnRzID0gcGFydHMuZmlsdGVyKChwYXJ0LCBpZHgsIHZhbHVlcyk9PntcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAnZXJhJyB8fCBwYXJ0LnR5cGUgPT09ICdsaXRlcmFsJyAmJiBpZHggPCB2YWx1ZXMubGVuZ3RoIC0gMSAmJiB2YWx1ZXNbaWR4ICsgMV0udHlwZSA9PT0gJ2VyYScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxvY2FsZVN0cmluZyA9IHBhcnRzLm1hcCgocCk9PnAudmFsdWUpLmpvaW4oJycpO1xuICAgIH1cbiAgICBpZiAodGltZSA9PT0gdHJ1ZSB8fCBpc1RvZGF5ICYmIHRpbWUgPT09ICdmb3IgdG9kYXknKSB7XG4gICAgICAgIGxvY2FsZVN0cmluZyArPSBgLCAke2Zvcm1hdFRpbWUoZGF0ZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsZVN0cmluZztcbn1cbi8vIEludGVybmFsIGN1cnJpZWQgY2FsbC1iYWNrIGZvciBtYXAoKVxuY29uc3QgZm9ybWF0UGFydHMgPSAoc2VwYXJhdG9yKT0+e1xuICAgIHJldHVybiAocGFydCwgaWR4LCB2YWx1ZXMpPT57XG4gICAgICAgIGlmIChwYXJ0LnR5cGUgIT09ICdsaXRlcmFsJyB8fCBwYXJ0LnZhbHVlICE9PSAnICcpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpZHggPCB2YWx1ZXMubGVuZ3RoIC0gMSAmJiB2YWx1ZXNbaWR4ICsgMV0udHlwZSA9PT0gJ2VyYScpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnbGl0ZXJhbCcsXG4gICAgICAgICAgICB2YWx1ZTogc2VwYXJhdG9yXG4gICAgICAgIH07XG4gICAgfTtcbn07XG4vKipcbiAqIEZvcm1hdHMgdGhlIGlucHV0IGFzIGEgdGltZSwgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS5cbiAqIDEyLWhvdXIgb3IgMjQtaG91ciBjbG9jayBkZXBlbmRzIG9uIGxvY2FsZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSB3aG9zZSB0aW1lIHBvcnRpb24gc2hvdWxkIGJlIGZvcm1hdHRlZC5cbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgdGltZSBzdHJpbmcgKGUuZy4sIFwiMjozMCBQTVwiIG9yIFwiMTQ6MzBcIikuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWUoZGF0ZSkge1xuICAgIHJldHVybiBkYXRlLnRvTG9jYWxlVGltZVN0cmluZyhnZXRMb2NhbGUoKSwge1xuICAgICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICAgIG1pbnV0ZTogJzItZGlnaXQnXG4gICAgfSk7XG59XG4vKipcbiAqIEZvcm1hdHMgdGhlIGlucHV0IGludG8gYSBzdHJpbmcgc2hvd2luZyB0aGUgZGF0ZSBhbmQgdGltZSwgYWNjb3JkaW5nXG4gKiB0byB0aGUgY3VycmVudCBsb2NhbGUuIFRoZSBgbW9kZWAgcGFyYW1ldGVyIGlzIGFzIGRlc2NyaWJlZCBmb3JcbiAqIGBmb3JtYXREYXRlYC5cbiAqXG4gKiBUaGlzIGlzIGNyZWF0ZWQgYnkgY29uY2F0ZW5hdGluZyB0aGUgcmVzdWx0cyBvZiBgZm9ybWF0RGF0ZWBcbiAqIGFuZCBgZm9ybWF0VGltZWAgd2l0aCBhIGNvbW1hIGFuZCBzcGFjZS4gVGhpcyBhZ3JlZXMgd2l0aCB0aGVcbiAqIG91dHB1dCBvZiBgRGF0ZS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmdgIGZvciAqbW9zdCogbG9jYWxlcy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSB0byBmb3JtYXQuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBmb3JtYXR0aW5nIG9wdGlvbnMgKHNhbWUgYXMgZm9ybWF0RGF0ZSwgZXhjZXB0IHRpbWUgaXMgYWx3YXlzIGluY2x1ZGVkKS5cbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgZGF0ZSBhbmQgdGltZSBzdHJpbmcuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGV0aW1lKGRhdGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZm9ybWF0RGF0ZShkYXRlLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHRpbWU6IHRydWVcbiAgICB9KTtcbn1cbi8qKlxuICogQ29udmVydHMgYSBjYWxlbmRhciBkYXRlIHRvIHRoZSBlcXVpdmFsZW50IGxvY2FsZSBjYWxlbmRhciBkYXRlLlxuICogQHJldHVybnMgQ2FsZW5kYXJEYXRlXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0xvY2FsZUNhbGVuZGFyKGRhdGUsIGxvY2FsZSkge1xuICAgIGxldCBsb2NhbGVfID0gdHlwZW9mIGxvY2FsZSA9PT0gJ3N0cmluZycgPyBuZXcgSW50bC5Mb2NhbGUobG9jYWxlKSA6IGxvY2FsZTtcbiAgICBjb25zdCBsb2NhbENhbGVuZGFyTmFtZSA9IGdldERlZmF1bHRDYWxlbmRhcihsb2NhbGVfKTtcbiAgICByZXR1cm4gbG9jYWxDYWxlbmRhck5hbWUgPyB0b0NhbGVuZGFyKGRhdGUsIGNyZWF0ZUNhbGVuZGFyKGxvY2FsQ2FsZW5kYXJOYW1lKSkgOiBkYXRlO1xufVxuLyoqXG4gKiBGb3JtYXRzIHRoZSBpbnB1dCBkdXJhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlLlxuICpcbiAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gdG8gZm9ybWF0IChEdXJhdGlvbklucHV0IG9iamVjdCkuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBvcHRpb25zIGZvciBmb3JtYXR0aW5nLlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBkdXJhdGlvbiBzdHJpbmcuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEludGwuRHVyYXRpb25Gb3JtYXQoZ2V0TG9jYWxlKCksIG9wdGlvbnMpO1xuICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGR1cmF0aW9uKTtcbn1cbi8qKlxuICogUGFyc2VzIGEgZGF0ZSBpbnB1dCBpbnRvIGEgZGF5anMgb2JqZWN0LiBJU08gY2FsZW5kYXIgZGF0ZXMgYXJlIHBhcnNlZCBpbmRlcGVuZGVudGx5IG9mIGxvY2FsZTtcbiAqIG90aGVyIHN0cmluZ3MgdXNlIGFueS1kYXRlLXBhcnNlciB3aXRoIGNvcnJlY3Rpb25zIGZvciBpdHMgbW9udGgvZGF5IHJlcHJlc2VudGF0aW9uIGRpZmZlcmVuY2VzXG4gKiB3aXRoIGRheWpzLiBOb24tc3RyaW5nIGlucHV0cyBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIGRheWpzLlxuICpcbiAqIEBwYXJhbSBkYXRlSW5wdXQgVGhlIGRhdGUgdG8gcGFyc2UuXG4gKiBAcGFyYW0gcmVmZXJlbmNlRGF0ZSBVc2VkIGFzIHRoZSBiYXNlIHdoZW4gcmVzb2x2aW5nIHBhcnRpYWwgc3RyaW5nIGRhdGVzIChlLmcuLCAnMjAwMCcgcmVzb2x2ZXMgbWlzc2luZyBmaWVsZHMgZnJvbSB0aGlzIGRhdGUpLlxuICogQHJldHVybnMgQSBkYXlqcyBvYmplY3QsIG9yIG51bGwgaWYgdGhlIHN0cmluZyBjb3VsZCBub3QgYmUgcGFyc2VkLlxuICovIGV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGVJbnB1dChkYXRlSW5wdXQsIHJlZmVyZW5jZURhdGUpIHtcbiAgICBpZiAoZGF0ZUlucHV0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0ZUlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBsb2NhbGUgPSBnZXRMb2NhbGUoKTtcbiAgICAgICAgbGV0IHBhcnNlZERhdGUgPSBwYXJzZURhdGVTdHJpbmcoZGF0ZUlucHV0LCBsb2NhbGUpO1xuICAgICAgICBpZiAocGFyc2VkRGF0ZS5pbnZhbGlkKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYENvdWxkIG5vdCBpbnRlcnByZXQgJyR7ZGF0ZUlucHV0fScgYXMgYSBkYXRlYCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBoYWNrIGhlcmUgYnV0IGFueSBkYXRlIGludGVycHJldHMgMjAwMC0wMSwgZXRjLiBhcyB5eXl5LWRkIHJhdGhlciB0aGFuIHl5eXktbW1cbiAgICAgICAgaWYgKHBhcnNlZERhdGUuZGF5ICYmICFwYXJzZWREYXRlLm1vbnRoKSB7XG4gICAgICAgICAgICBwYXJzZWREYXRlID0ge1xuICAgICAgICAgICAgICAgIC4uLm9taXQocGFyc2VkRGF0ZSwgJ2RheScpLFxuICAgICAgICAgICAgICAgIC4uLntcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6IHBhcnNlZERhdGUuZGF5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkYXlqcycgb2JqZWN0IHN1cHBvcnQgdXNlcyAwLWJhc2VkIG1vbnRocywgd2hlcmVhcyBhbnktZGF0ZS1wYXJzZXIgdXNlcyAxLWJhc2VkIG1vbnRoc1xuICAgICAgICBpZiAocGFyc2VkRGF0ZS5tb250aCkge1xuICAgICAgICAgICAgcGFyc2VkRGF0ZS5tb250aCAtPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIGluIGRheWpzIGRheSBpcyBkYXkgb2Ygd2VlazsgaW4gYW55LWRhdGUtcGFyc2VyLCBpdHMgZGF5IG9mIG1vbnRoLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlbVxuICAgICAgICBpZiAocGFyc2VkRGF0ZS5kYXkpIHtcbiAgICAgICAgICAgIHBhcnNlZERhdGUgPSB7XG4gICAgICAgICAgICAgICAgLi4ub21pdChwYXJzZWREYXRlLCAnZGF5JyksXG4gICAgICAgICAgICAgICAgLi4ue1xuICAgICAgICAgICAgICAgICAgICBkYXRlOiBwYXJzZWREYXRlLmRheVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRheWpzKHJlZmVyZW5jZURhdGUpLnNldChwYXJzZWREYXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIGRheWpzKGRhdGVJbnB1dCk7XG59XG5jb25zdCBVTklUX09SREVSID0gW1xuICAgICd5ZWFycycsXG4gICAgJ21vbnRocycsXG4gICAgJ2RheXMnLFxuICAgICdob3VycycsXG4gICAgJ21pbnV0ZXMnLFxuICAgICdzZWNvbmRzJ1xuXTtcbmNvbnN0IFNJTkdVTEFSX1RPX1BMVVJBTCA9IHtcbiAgICBzZWNvbmQ6ICdzZWNvbmRzJyxcbiAgICBtaW51dGU6ICdtaW51dGVzJyxcbiAgICBob3VyOiAnaG91cnMnLFxuICAgIGRheTogJ2RheXMnLFxuICAgIG1vbnRoOiAnbW9udGhzJyxcbiAgICB5ZWFyOiAneWVhcnMnXG59O1xuZnVuY3Rpb24gbm9ybWFsaXplVW5pdCh1bml0KSB7XG4gICAgcmV0dXJuIFNJTkdVTEFSX1RPX1BMVVJBTFt1bml0XSA/PyB1bml0O1xufVxuLyoqXG4gKiBOb3JtYWxpemVzIHRocmVzaG9sZCBrZXlzIGZyb20gc2luZ3VsYXIvcGx1cmFsIHRvIHBsdXJhbCwgdGhlbiBtZXJnZXMgd2l0aCBkZWZhdWx0cy5cbiAqLyBmdW5jdGlvbiBub3JtYWxpemVUaHJlc2hvbGRzKHRocmVzaG9sZHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIC4uLkRFRkFVTFRfVEhSRVNIT0xEU1xuICAgIH07XG4gICAgaWYgKHRocmVzaG9sZHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhyZXNob2xkcykpe1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbbm9ybWFsaXplVW5pdChrZXkpXSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBERUZBVUxUX1RIUkVTSE9MRFMgPSB7XG4gICAgc2Vjb25kczogNDUsXG4gICAgbWludXRlczogNDUsXG4gICAgaG91cnM6IDIyLFxuICAgIGRheXM6IDI2LFxuICAgIG1vbnRoczogMTEsXG4gICAgeWVhcnM6IEluZmluaXR5XG59O1xuLyoqXG4gKiBBdXRvLXNlbGVjdHMgdGhlIGFwcHJvcHJpYXRlIHVuaXQgYmFzZWQgb24gdGhlIG1hZ25pdHVkZSBvZiB0aGUgZHVyYXRpb24sXG4gKiB1c2luZyB0aGUgcHJvdmlkZWQgdGhyZXNob2xkcyAob3IgZGVmYXVsdHMpLlxuICovIGZ1bmN0aW9uIGF1dG9TZWxlY3RVbml0KGZyb20sIHRvLCB0aHJlc2hvbGRzKSB7XG4gICAgY29uc3QgdCA9IG5vcm1hbGl6ZVRocmVzaG9sZHModGhyZXNob2xkcyk7XG4gICAgaWYgKHRvLmRpZmYoZnJvbSwgJ3NlY29uZHMnKSA8IHQuc2Vjb25kcykgcmV0dXJuICdzZWNvbmRzJztcbiAgICBpZiAodG8uZGlmZihmcm9tLCAnbWludXRlcycpIDwgdC5taW51dGVzKSByZXR1cm4gJ21pbnV0ZXMnO1xuICAgIGlmICh0by5kaWZmKGZyb20sICdob3VycycpIDwgdC5ob3VycykgcmV0dXJuICdob3Vycyc7XG4gICAgaWYgKHRvLmRpZmYoZnJvbSwgJ2RheXMnKSA8IHQuZGF5cykgcmV0dXJuICdkYXlzJztcbiAgICBpZiAodG8uZGlmZihmcm9tLCAnbW9udGhzJykgPCB0Lm1vbnRocykgcmV0dXJuICdtb250aHMnO1xuICAgIHJldHVybiAneWVhcnMnO1xufVxuLyoqXG4gKiBGaW5kcyB0aGUgbGFyZ2VzdCB1bml0IHdpdGggYSBub24temVybyBkaWZmLCBvciBmYWxscyBiYWNrIHRvIHNtYWxsZXN0VW5pdC5cbiAqIE1pcnJvcnMgdGhlIFRlbXBvcmFsLkR1cmF0aW9uLnJvdW5kKCkgJ2F1dG8nIGJlaGF2aW9yIGZvciBsYXJnZXN0VW5pdC5cbiAqLyBmdW5jdGlvbiBhdXRvTGFyZ2VzdFVuaXQoZnJvbSwgdG8sIHNtYWxsZXN0VW5pdCkge1xuICAgIGNvbnN0IHNtYWxsZXN0SWR4ID0gVU5JVF9PUkRFUi5pbmRleE9mKHNtYWxsZXN0VW5pdCk7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IFVOSVRfT1JERVIubGVuZ3RoOyBpKyspe1xuICAgICAgICBjb25zdCB1bml0ID0gVU5JVF9PUkRFUltpXTtcbiAgICAgICAgaWYgKHRvLmRpZmYoZnJvbSwgdW5pdCkgPiAwKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhpcyB1bml0IG9yIHNtYWxsZXN0VW5pdCwgd2hpY2hldmVyIGlzIGNvYXJzZXIgKGxvd2VyIGluZGV4KVxuICAgICAgICAgICAgcmV0dXJuIGkgPD0gc21hbGxlc3RJZHggPyB1bml0IDogc21hbGxlc3RVbml0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzbWFsbGVzdFVuaXQ7XG59XG4vKipcbiAqIERlY29tcG9zZXMgdGhlIGR1cmF0aW9uIGJldHdlZW4gdHdvIGRhdGVzIGFjcm9zcyBhIHJhbmdlIG9mIHVuaXRzLCBmcm9tXG4gKiBsYXJnZXN0VW5pdCBkb3duIHRvIHNtYWxsZXN0VW5pdC4gRWFjaCB1bml0J3MgdmFsdWUgaXMgdGhlIHJlbWFpbmRlciBhZnRlclxuICogc3VidHJhY3RpbmcgYWxsIGxhcmdlciB1bml0cy5cbiAqLyBmdW5jdGlvbiBkZWNvbXBvc2UoZnJvbSwgdG8sIGxhcmdlc3RVbml0LCBzbWFsbGVzdFVuaXQpIHtcbiAgICBjb25zdCBzdGFydElkeCA9IFVOSVRfT1JERVIuaW5kZXhPZihsYXJnZXN0VW5pdCk7XG4gICAgY29uc3QgZW5kSWR4ID0gVU5JVF9PUkRFUi5pbmRleE9mKHNtYWxsZXN0VW5pdCk7XG4gICAgY29uc3QgdW5pdHMgPSBVTklUX09SREVSLnNsaWNlKHN0YXJ0SWR4LCBlbmRJZHggKyAxKTtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBsZXQgY3VycmVudCA9IGZyb207XG4gICAgZm9yIChjb25zdCB1bml0IG9mIHVuaXRzKXtcbiAgICAgICAgY29uc3QgZGlmZiA9IHRvLmRpZmYoY3VycmVudCwgdW5pdCk7XG4gICAgICAgIHJlc3VsdFt1bml0XSA9IGRpZmY7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmFkZChkaWZmLCB1bml0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gYmV0d2VlbiB0d28gZGF0ZXMgYXMgYSBzdHJ1Y3R1cmVkIGR1cmF0aW9uIG9iamVjdC5cbiAqXG4gKiBXaGVuIGNhbGxlZCB3aXRoIG5vIG9wdGlvbnMgb3IgYSBzaW5nbGUgdW5pdCBzdHJpbmcsIHRoZSB1bml0IGlzIGF1dG8tc2VsZWN0ZWRcbiAqIHVzaW5nIGRheWpzIHJlbGF0aXZlVGltZSB0aHJlc2hvbGRzOlxuICogLSA8IDQ1IHNlY29uZHMg4oaSIHNlY29uZHNcbiAqIC0gPCA0NSBtaW51dGVzIOKGkiBtaW51dGVzXG4gKiAtIDwgMjIgaG91cnMg4oaSIGhvdXJzXG4gKiAtIDwgMjYgZGF5cyDihpIgZGF5c1xuICogLSA8IDExIG1vbnRocyDihpIgbW9udGhzXG4gKiAtIG90aGVyd2lzZSDihpIgeWVhcnNcbiAqXG4gKiBXaXRoIGEge0BsaW5rIER1cmF0aW9uT3B0aW9uc30gb2JqZWN0LCB5b3UgY2FuIG92ZXJyaWRlIHRocmVzaG9sZHMgYW5kL29yIHJlcXVlc3RcbiAqIGEgbXVsdGktdW5pdCBkZWNvbXBvc2l0aW9uIHZpYSBsYXJnZXN0VW5pdC9zbWFsbGVzdFVuaXQuXG4gKlxuICogQHBhcmFtIHN0YXJ0RGF0ZSBUaGUgc3RhcnQgZGF0ZS4gSWYgbnVsbCwgcmV0dXJucyBudWxsLlxuICogQHBhcmFtIGVuZERhdGUgT3B0aW9uYWwuIERlZmF1bHRzIHRvIG5vdy5cbiAqIEBwYXJhbSBvcHRpb25zIEEgdW5pdCBzdHJpbmcgZm9yIHNpbmdsZS11bml0IG91dHB1dCwgb3IgYSBEdXJhdGlvbk9wdGlvbnMgb2JqZWN0LlxuICogQHJldHVybnMgQSBEdXJhdGlvbklucHV0IG9iamVjdCwgb3IgbnVsbCBpZiBlaXRoZXIgZGF0ZSBpcyBudWxsIG9yIHVucGFyc2VhYmxlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBdXRvLXNlbGVjdHMgdGhlIGFwcHJvcHJpYXRlIHVuaXRcbiAqIGR1cmF0aW9uKCcyMDIyLTAxLTAxJywgJzIwMjQtMDctMzAnKSAvLyA9PiB7IHllYXJzOiAyIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTXVsdGktdW5pdCBkZWNvbXBvc2l0aW9uXG4gKiBkdXJhdGlvbignMjAyMi0wMS0wMScsICcyMDI0LTA3LTMwJywgeyBsYXJnZXN0VW5pdDogJ3llYXInLCBzbWFsbGVzdFVuaXQ6ICdkYXknIH0pXG4gKiAvLyA9PiB7IHllYXJzOiAyLCBtb250aHM6IDYsIGRheXM6IDI5IH1cbiAqLyBleHBvcnQgZnVuY3Rpb24gZHVyYXRpb24oc3RhcnREYXRlLCBlbmREYXRlID0gZGF5anMoKSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHRvID0gZGF5anMoZW5kRGF0ZSk7XG4gICAgY29uc3QgZnJvbSA9IHBhcnNlRGF0ZUlucHV0KHN0YXJ0RGF0ZSwgdG8pO1xuICAgIGlmIChmcm9tID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVVuaXQob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBbbm9ybWFsaXplZF06IHRvLmRpZmYoZnJvbSwgbm9ybWFsaXplZClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgeyB0aHJlc2hvbGRzLCBsYXJnZXN0VW5pdDogcmF3TGFyZ2VzdCwgc21hbGxlc3RVbml0OiByYXdTbWFsbGVzdCB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICBpZiAocmF3TGFyZ2VzdCAhPT0gdW5kZWZpbmVkIHx8IHJhd1NtYWxsZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc21hbGxlc3QgPSByYXdTbWFsbGVzdCA/IG5vcm1hbGl6ZVVuaXQocmF3U21hbGxlc3QpIDogdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbGFyZ2VzdDtcbiAgICAgICAgaWYgKHJhd0xhcmdlc3QgPT09ICdhdXRvJyB8fCByYXdMYXJnZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vICdhdXRvJyBvciBvbWl0dGVkOiByZXNvbHZlIHRvIHRoZSBsYXJnZXN0IG5vbi16ZXJvIHVuaXQsIG9yIHNtYWxsZXN0VW5pdCwgd2hpY2hldmVyIGlzIGNvYXJzZXJcbiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZVNtYWxsZXN0ID0gc21hbGxlc3QgPz8gJ3NlY29uZHMnO1xuICAgICAgICAgICAgbGFyZ2VzdCA9IGF1dG9MYXJnZXN0VW5pdChmcm9tLCB0bywgZWZmZWN0aXZlU21hbGxlc3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFyZ2VzdCA9IG5vcm1hbGl6ZVVuaXQocmF3TGFyZ2VzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlY29tcG9zZShmcm9tLCB0bywgbGFyZ2VzdCwgc21hbGxlc3QgPz8gbGFyZ2VzdCk7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkID0gYXV0b1NlbGVjdFVuaXQoZnJvbSwgdG8sIHRocmVzaG9sZHMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIFtzZWxlY3RlZF06IHRvLmRpZmYoZnJvbSwgc2VsZWN0ZWQpXG4gICAgfTtcbn1cbmNvbnN0IERFRkFVTFRfRk9STUFUX09QVElPTlMgPSB7XG4gICAgc3R5bGU6ICdzaG9ydCcsXG4gICAgbG9jYWxlTWF0Y2hlcjogJ2xvb2t1cCdcbn07XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIGJldHdlZW4gdHdvIGRhdGVzIGFuZCBmb3JtYXRzIGl0IGFzIGEgbG9jYWxlLWF3YXJlIHN0cmluZy5cbiAqIFVzZXMgdGhlIHNhbWUgdW5pdC1zZWxlY3Rpb24gbG9naWMgYXMge0BsaW5rIGR1cmF0aW9ufSBhbmQgZGVsZWdhdGVzIGZvcm1hdHRpbmdcbiAqIHRvIHtAbGluayBmb3JtYXREdXJhdGlvbn0uXG4gKlxuICogQHBhcmFtIHN0YXJ0RGF0ZSBUaGUgc3RhcnQgZGF0ZS4gSWYgbnVsbCwgcmV0dXJucyBudWxsLlxuICogQHBhcmFtIGVuZERhdGUgT3B0aW9uYWwuIERlZmF1bHRzIHRvIG5vdy5cbiAqIEBwYXJhbSBvcHRpb25zIEEgdW5pdCBzdHJpbmcgZm9yIHNpbmdsZS11bml0IG91dHB1dCwgb3IgYSB7QGxpbmsgRHVyYXRpb25PcHRpb25zV2l0aEZvcm1hdH0gb2JqZWN0LlxuICogICBUaGUgYGZvcm1hdE9wdGlvbnNgIGZpZWxkIGlzIHBhc3NlZCB0byBJbnRsLkR1cmF0aW9uRm9ybWF0IChkZWZhdWx0cyB0byBzaG9ydCBzdHlsZSkuXG4gKiBAcmV0dXJucyBBIGZvcm1hdHRlZCBkdXJhdGlvbiBzdHJpbmcsIG9yIG51bGwgaWYgZWl0aGVyIGRhdGUgaXMgbnVsbCBvciB1bnBhcnNlYWJsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogZm9ybWF0RHVyYXRpb25CZXR3ZWVuKCcyMDIyLTAxLTAxJywgJzIwMjQtMDctMzAnKSAvLyA9PiAnMiB5cnMnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE11bHRpLXVuaXQgd2l0aCBsb25nLWZvcm0gZm9ybWF0dGluZ1xuICogZm9ybWF0RHVyYXRpb25CZXR3ZWVuKCcyMDIyLTAxLTAxJywgJzIwMjQtMDctMzAnLCB7XG4gKiAgIGxhcmdlc3RVbml0OiAneWVhcicsXG4gKiAgIHNtYWxsZXN0VW5pdDogJ2RheScsXG4gKiAgIGZvcm1hdE9wdGlvbnM6IHsgc3R5bGU6ICdsb25nJyB9LFxuICogfSkgLy8gPT4gJzIgeWVhcnMsIDYgbW9udGhzLCAyOSBkYXlzJ1xuICovIGV4cG9ydCBmdW5jdGlvbiBmb3JtYXREdXJhdGlvbkJldHdlZW4oc3RhcnREYXRlLCBlbmREYXRlID0gZGF5anMoKSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGR1cmF0aW9uSW5wdXQgPSBkdXJhdGlvbihzdGFydERhdGUsIGVuZERhdGUsIG9wdGlvbnMpO1xuICAgIGlmIChkdXJhdGlvbklucHV0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGZvcm1hdE9wdHMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5mb3JtYXRPcHRpb25zID8ge1xuICAgICAgICAuLi5ERUZBVUxUX0ZPUk1BVF9PUFRJT05TLFxuICAgICAgICAuLi5vcHRpb25zLmZvcm1hdE9wdGlvbnNcbiAgICB9IDogREVGQVVMVF9GT1JNQVRfT1BUSU9OUztcbiAgICByZXR1cm4gZm9ybWF0RHVyYXRpb24oZHVyYXRpb25JbnB1dCwgZm9ybWF0T3B0cyk7XG59XG4iXSwibmFtZXMiOlsiX2NoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbiIsIm9iaiIsInByaXZhdGVDb2xsZWN0aW9uIiwiVHlwZUVycm9yIiwiX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZ2V0IiwicmVjZWl2ZXIiLCJkZXNjcmlwdG9yIiwiX2NsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvciIsInByaXZhdGVNYXAiLCJhY3Rpb24iLCJfY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXQiLCJfY2xhc3NfcHJpdmF0ZV9maWVsZF9pbml0IiwidmFsdWUiLCJjcmVhdGVDYWxlbmRhciIsInRvQ2FsZW5kYXIiLCJhdHRlbXB0IiwiZGF5anMiLCJpc1RvZGF5Iiwib2JqZWN0U3VwcG9ydCIsInV0YyIsImlzTmlsIiwib21pdCIsImdldExvY2FsZSIsImlzb0Zvcm1hdCIsImlzb0NhbGVuZGFyRGF0ZSIsInBhcnNlRGF0ZVN0cmluZyIsImRhdGVTdHJpbmciLCJsb2NhbGUiLCJtYXRjaCIsInllYXIiLCJOdW1iZXIiLCJtb250aCIsInVuZGVmaW5lZCIsImRheSIsImRhdGUiLCJEYXRlIiwiaXNPbXJzRGF0ZVN0cmljdCIsIm9tcnNQYXlsb2FkU3RyaW5nIiwiaXNPbXJzRGF0ZVRvZGF5IiwidG9EYXRlT2JqZWN0U3RyaWN0Iiwib21yc0RhdGVTdHJpbmciLCJ0b09tcnNJc29TdHJpbmciLCJ0b1VUQyIsImQiLCJwYXJzZURhdGUiLCJfcmVnaXN0cnkiLCJXZWFrTWFwIiwiTG9jYWxlQ2FsZW5kYXJzIiwiY2FsZW5kYXIiLCJCb29sZWFuIiwia2V5IiwiZGVmYXVsdENhbGVuZGFyIiwiSW50bCIsIk1hcCIsInJlZ2lzdGVyZWRMb2NhbGVDYWxlbmRhcnMiLCJyZWdpc3RlckRlZmF1bHRDYWxlbmRhciIsImdldERlZmF1bHRDYWxlbmRhciIsImxvY2FsZV8iLCJkZWZhdWx0T3B0aW9ucyIsImZvcm1hdFBhcnRpYWxEYXRlIiwib3B0aW9ucyIsInBhcnNlZCIsImNvbnNvbGUiLCJPYmplY3QiLCJmb3JtYXREYXRlIiwiX2xvY2FsZSIsIm1vZGUiLCJ0aW1lIiwibm9Ub2RheSIsIm51bWJlcmluZ1N5c3RlbSIsImZvcm1hdENhbGVuZGFyIiwiZm9ybWF0dGVyT3B0aW9ucyIsImxvY2FsZVN0cmluZyIsInJ0ZiIsImZvcm1hdHRlciIsInBhcnRzIiwiZm9ybWF0UGFydHMiLCJwYXJ0IiwiaWR4IiwidmFsdWVzIiwicCIsImZvcm1hdFRpbWUiLCJzZXBhcmF0b3IiLCJmb3JtYXREYXRldGltZSIsImNvbnZlcnRUb0xvY2FsZUNhbGVuZGFyIiwibG9jYWxDYWxlbmRhck5hbWUiLCJmb3JtYXREdXJhdGlvbiIsImR1cmF0aW9uIiwicGFyc2VEYXRlSW5wdXQiLCJkYXRlSW5wdXQiLCJyZWZlcmVuY2VEYXRlIiwicGFyc2VkRGF0ZSIsIlVOSVRfT1JERVIiLCJTSU5HVUxBUl9UT19QTFVSQUwiLCJub3JtYWxpemVVbml0IiwidW5pdCIsIm5vcm1hbGl6ZVRocmVzaG9sZHMiLCJ0aHJlc2hvbGRzIiwicmVzdWx0IiwiREVGQVVMVF9USFJFU0hPTERTIiwiSW5maW5pdHkiLCJhdXRvU2VsZWN0VW5pdCIsImZyb20iLCJ0byIsInQiLCJhdXRvTGFyZ2VzdFVuaXQiLCJzbWFsbGVzdFVuaXQiLCJzbWFsbGVzdElkeCIsImkiLCJkZWNvbXBvc2UiLCJsYXJnZXN0VW5pdCIsInN0YXJ0SWR4IiwiZW5kSWR4IiwidW5pdHMiLCJjdXJyZW50IiwiZGlmZiIsInN0YXJ0RGF0ZSIsImVuZERhdGUiLCJub3JtYWxpemVkIiwicmF3TGFyZ2VzdCIsInJhd1NtYWxsZXN0Iiwic21hbGxlc3QiLCJsYXJnZXN0IiwiZWZmZWN0aXZlU21hbGxlc3QiLCJzZWxlY3RlZCIsIkRFRkFVTFRfRk9STUFUX09QVElPTlMiLCJmb3JtYXREdXJhdGlvbkJldHdlZW4iLCJkdXJhdGlvbklucHV0IiwiZm9ybWF0T3B0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBU0EsNkJBQTZCQyxHQUFHLEVBQUVDLGlCQUFpQjtJQUN4RCxJQUFJQSxrQkFBa0IsR0FBRyxDQUFDRCxNQUFNO1FBQzVCLE1BQU0s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\n//# sourceURL=webpack-internal:///../../framework/esm-utils/dist/dates/date-util.js\n\n}");
5085
5085
 
5086
5086
  },
5087
5087
  "../../framework/esm-utils/dist/dates/index.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
package/lib/index.html CHANGED
@@ -33,7 +33,7 @@
33
33
  <script type="openmrs-routes" src="/openmrs/spa/routes.registry.json"></script>
34
34
 
35
35
 
36
- <link rel="preload" href="/openmrs/spa/5534cc37564f19d5.js" as="script"><link rel="preload" href="/openmrs/spa/a63512181bf7b3b3.js" as="script"><link rel="preload" href="/openmrs/spa/813d7bf7cf53fee8.js" as="script"><link rel="preload" href="/openmrs/spa/c6d69a0ca26da571.js" as="script"><link rel="preload" href="/openmrs/spa/6a07d9edae91d64a.js" as="script"><link rel="preload" href="/openmrs/spa/29eb002ac8b08df5.js" as="script"><link rel="preload" href="/openmrs/spa/2b18050c552ba37b.js" as="script"><link rel="preload" href="/openmrs/spa/c33c18fc27e1597a.js" as="script"><link rel="preload" href="/openmrs/spa/0114e2ab04d37ef3.js" as="script"><link rel="preload" href="/openmrs/spa/dba37f937b9fef08.js" as="script"><link rel="preload" href="/openmrs/spa/9728df55a98ebbd2.js" as="script"><link rel="preload" href="/openmrs/spa/dcee9941dbf0fcae.js" as="script"><link rel="preload" href="/openmrs/spa/e0650e8f5bc5a5f0.js" as="script"><link rel="preload" href="/openmrs/spa/965c2ea7ad36f9b9.js" as="script"><link rel="preload" href="/openmrs/spa/18ec06b4e1782343.js" as="script"><link rel="preload" href="/openmrs/spa/c912d57aa96a2320.js" as="script"><link rel="preload" href="/openmrs/spa/ab4148a466ebd6ef.js" as="script"><link rel="preload" href="/openmrs/spa/a2ed0a758d2afe95.js" as="script"><link rel="preload" href="/openmrs/spa/45b02f9c93df63a2.js" as="script"><link rel="preload" href="/openmrs/spa/6c72dcc37b6da71c.js" as="script"><link rel="preload" href="/openmrs/spa/258c11567d1269c4.js" as="script"><link rel="preload" href="/openmrs/spa/41084f226b2f0007.js" as="script"><link rel="preload" href="/openmrs/spa/5b9ac61b7d510be5.js" as="script">
36
+ <link rel="preload" href="/openmrs/spa/5534cc37564f19d5.js" as="script"><link rel="preload" href="/openmrs/spa/8d6476a2d6aa58e1.js" as="script"><link rel="preload" href="/openmrs/spa/813d7bf7cf53fee8.js" as="script"><link rel="preload" href="/openmrs/spa/c6d69a0ca26da571.js" as="script"><link rel="preload" href="/openmrs/spa/6a07d9edae91d64a.js" as="script"><link rel="preload" href="/openmrs/spa/29eb002ac8b08df5.js" as="script"><link rel="preload" href="/openmrs/spa/2b18050c552ba37b.js" as="script"><link rel="preload" href="/openmrs/spa/c33c18fc27e1597a.js" as="script"><link rel="preload" href="/openmrs/spa/0114e2ab04d37ef3.js" as="script"><link rel="preload" href="/openmrs/spa/dba37f937b9fef08.js" as="script"><link rel="preload" href="/openmrs/spa/9728df55a98ebbd2.js" as="script"><link rel="preload" href="/openmrs/spa/dcee9941dbf0fcae.js" as="script"><link rel="preload" href="/openmrs/spa/e0650e8f5bc5a5f0.js" as="script"><link rel="preload" href="/openmrs/spa/965c2ea7ad36f9b9.js" as="script"><link rel="preload" href="/openmrs/spa/18ec06b4e1782343.js" as="script"><link rel="preload" href="/openmrs/spa/c912d57aa96a2320.js" as="script"><link rel="preload" href="/openmrs/spa/ab4148a466ebd6ef.js" as="script"><link rel="preload" href="/openmrs/spa/a2ed0a758d2afe95.js" as="script"><link rel="preload" href="/openmrs/spa/45b02f9c93df63a2.js" as="script"><link rel="preload" href="/openmrs/spa/6c72dcc37b6da71c.js" as="script"><link rel="preload" href="/openmrs/spa/258c11567d1269c4.js" as="script"><link rel="preload" href="/openmrs/spa/41084f226b2f0007.js" as="script"><link rel="preload" href="/openmrs/spa/5b9ac61b7d510be5.js" as="script">
37
37
  <meta name="theme-color" content="#005d5d" /><link rel="manifest" href="/openmrs/spa/manifest.8bf1757a96431f7a7b87baad8f950c48.json" /></head>
38
38
  <body>
39
39
  <script src="/openmrs/spa/openmrs.js"></script>